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) 9 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) 9 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 _) 4 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) 4 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) 4 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) 4 days ago
I want to let Matz determine how to handle this problem :D