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) 10 months 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) 10 months 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) 10 months ago
Maybe, like this?
m = Class.new(Module) {def initialize_copy(other);end}.new.dup
Class.new.include(m)
Updated by nobu (Nobuyoshi Nakada) 10 months 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) 10 months ago
I have confirmed that the issue has been resolved that was raising ArgumentError
when running RSpec. Thanks a lot for the quick fix!