Project

General

Profile

Actions

Bug #18177

closed

An error occurs when running RSpec with Ruby 3.1.0-dev

Added by koic (Koichi ITO) about 1 month ago. Updated about 1 month ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 3.1.0dev (2021-09-17T11:46:18Z master b45fe48fbb) [x86_64-darwin19]
[ruby-core:105334]

Description

Reproduction context

The following code causes an ArgumentError error when using Ruby 3.1.0-dev.

# foo_spec.rb
RSpec.shared_context 'config', :config do
end

RSpec.describe 'foo', :config do
end

RSpec version is as follows.

% gem i rspec
% rspec -v
RSpec 3.10
  - rspec-core 3.10.1
  - rspec-expectations 3.10.1
  - rspec-mocks 3.10.2
  - rspec-rails 5.0.1
  - rspec-support 3.10.2

Expected Behavior (Ruby 3.0.2)

No errors.

% ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin19]
% rspec foo_spec.rb
No examples found.


Finished in 0.00023 seconds (files took 0.11432 seconds to load)
0 examples, 0 failures

Actual Behavior (Ruby 3.1.0-dev)

ArgumentError: uninitialized module exception is raised.

% ruby -v
ruby 3.1.0dev (2021-09-17T11:46:18Z master b45fe48fbb) [x86_64-darwin19]
% rspec foo_spec.rb

An error occurred while loading ./foo_spec.rb.
Failure/Error: host.__send__(:include, mod) unless host < mod

ArgumentError:
  uninitialized module
# ./foo_spec.rb:5:in `<top (required)>'
No examples found.


Finished in 0.00003 seconds (files took 0.18197 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

Perhaps the following commits have changed the behavior.
https://github.com/ruby/ruby/commit/178ee1e#diff-ddea6b44375166521cc45b79d4c54b08594c13872acc5ec279f07d2eda8c32baR920

I encountered this error in the following build error of RuboCop Rails.
https://app.circleci.com/pipelines/github/rubocop/rubocop-rails/1323/workflows/5a4fc5af-448c-46d7-a723-ee1c119fc2f2/jobs/8579

I opened this issue because I'm not sure what an expected behavior is. Thank you.

Updated by nobu (Nobuyoshi Nakada) about 1 month ago

As I'm not sure where the uninitialized module came from, can't make a simple test code.

Does this fix it?

diff --git a/class.c b/class.c
index 0b075a9abb8..c56a149afc7 100644
--- a/class.c
+++ b/class.c
@@ -917,7 +917,8 @@ ensure_includable(VALUE klass, VALUE module)
     rb_class_modify_check(klass);
     Check_Type(module, T_MODULE);
     if (RMODULE_UNINITIALIZED(module)) {
-        rb_raise(rb_eArgError, "uninitialized module");
+        RB_OBJ_WRITE(module, &RCLASS(module)->super, 0);
+        /* no more re-initialization */
     }
     if (!NIL_P(rb_refinement_module_get_refined_class(module))) {
    rb_raise(rb_eArgError, "refinement module is not allowed");

Updated by nobu (Nobuyoshi Nakada) about 1 month ago

Maybe, like this?

m = Class.new(Module) {def initialize_copy(other);end}.new.dup
Class.new.include(m)
Actions #4

Updated by nobu (Nobuyoshi Nakada) about 1 month ago

  • Status changed from Open to Closed

Applied in changeset git|2e3d43e5775799d1b4d6672a3a18b3fc5777c52b.


Allow to include uninitialized modules [Bug #18177]

The module that is about to be included is considered initialized.

Updated by koic (Koichi ITO) about 1 month ago

I have confirmed that the issue has been resolved that was raising ArgumentError when running RSpec. Thanks a lot for the quick fix!

Actions

Also available in: Atom PDF