Bug #18177
closedAn error occurs when running RSpec with Ruby 3.1.0-dev
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 yahonda (Yasuo Honda) about 3 years ago
Rails CI against Ruby master is also affected by this commit. https://github.com/ruby/ruby/pull/4858/commits/178ee1e801acb33d13b3e8a630f6ca4926c68fbc
Updated by nobu (Nobuyoshi Nakada) about 3 years 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 3 years ago
Maybe, like this?
m = Class.new(Module) {def initialize_copy(other);end}.new.dup
Class.new.include(m)
Updated by nobu (Nobuyoshi Nakada) about 3 years 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 3 years ago
I have confirmed that the issue has been resolved that was raising ArgumentError
when running RSpec. Thanks a lot for the quick fix!