Bug #21341
closed`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) 10 months 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) 10 months 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 _) 10 months 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) 10 months 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) 10 months 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) 10 months ago
I want to let Matz determine how to handle this problem :D
Updated by hsbt (Hiroshi SHIBATA) 10 months ago
- Related to Misc #21385: Namespace: Suggesting a rename added
Updated by hsbt (Hiroshi SHIBATA) 10 months ago
- Tags set to namespace
Updated by tagomoris (Satoshi Tagomori) 3 months ago
- Assignee set to tagomoris (Satoshi Tagomori)
Updated by tagomoris (Satoshi Tagomori) 3 months ago
- Status changed from Open to Closed
The top level Namespace doesn't exist now.