Bug #21341
open`Namespace is not a module (TypeError)` without enabling the namespace
Description
Ruby on Rails test case has the module Namespace
.
https://github.com/rails/rails/blob/main/activemodel/test/validators/namespace/email_validator.rb#L5
module Namespace
class EmailValidator < ::EmailValidator
end
end
This code fails against Ruby 3.5.0dev without enabling the namespace feature.
Steps to reproduce¶
$ ruby -ve 'module Namespace; end'
Expected behavior¶
It should run without errors.
Actual behavior¶
It raises the TypeError.
$ ruby -ve 'module Namespace; end'
ruby 3.5.0dev (2025-05-15T08:25:56Z master 427ede2dde) +PRISM [x86_64-linux]
-e:1:in '<main>': Namespace is not a module (TypeError)
ruby:0: previous definition of Namespace was here
Raising this TypeError with RUBY_NAMESPACE=1 looks expected to me.
$ RUBY_NAMESPACE=1 ruby -ve 'module Namespace; end'
ruby 3.5.0dev (2025-05-15T08:25:56Z master 427ede2dde) +PRISM [x86_64-linux]
ruby: warning: Namespace is experimental, and the behavior may change in the future!
See doc/namespace.md for known issues, etc.
-e:1:in '<main>': Namespace is not a module (TypeError)
ruby:0: previous definition of Namespace was here
Updated by yahonda (Yasuo Honda) 22 days ago
This code comes from a Rails test case, so we can change it if needed. However, there might be other cases to consider.
Updated by yahonda (Yasuo Honda) 22 days ago
This only triggers the TypeError for the top-level module Namespace, not when it’s nested inside another module.
$ ruby -ve 'module Foo; module Namespace; end; end'
ruby 3.5.0dev (2025-05-15T08:25:56Z master 427ede2dde) +PRISM [x86_64-linux]
$ RUBY_NAMESPACE=1 ruby -ve 'module Foo; module Namespace; end; end'
ruby 3.5.0dev (2025-05-15T08:25:56Z master 427ede2dde) +PRISM [x86_64-linux]
ruby: warning: Namespace is experimental, and the behavior may change in the future!
See doc/namespace.md for known issues, etc.
$
Updated by Earlopain (Earlopain _) 17 days ago
It looks intentional to me:
Namespace.new
(irb):1:in 'Namespace#initialize': Namespace is disabled. Set RUBY_NAMESPACE=1 environment variable to use Namespace. (RuntimeError)
But the incompatibility may not have been considered since toplevel Ruby
used to warn in 3.4 for Ruby::VERSION
and others.
Updated by byroot (Jean Boussier) 17 days ago
But the incompatibility may not have been considered since toplevel Ruby used to warn in 3.4 for Ruby::VERSION and others.
Yes, we likely need to emit a deprecation warning when a top-level Namespace
constant is defined.
Updated by matsuda (Akira Matsuda) 17 days ago
· Edited
I guess I found a widely used real-world app that defines a toplevel Namespace
class, and it seems very difficult for them to resolve this conflict...
https://github.com/gitlabhq/gitlabhq/blob/master/app/models/namespace.rb
Perhaps we should better rename our namespace to Ruby::Namespace
or something?
Updated by tagomoris (Satoshi Tagomori) 17 days ago
I want to let Matz determine how to handle this problem :D
Updated by hsbt (Hiroshi SHIBATA) 3 days ago
- Related to Misc #21385: Namespace: Suggesting a rename added