mirror of
https://github.com/github/rails.git
synced 2026-02-16 17:15:29 -05:00
Raise fully qualified names upon name errors. Closes #5533.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4681 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
*SVN*
|
||||
|
||||
* Raise fully qualified names upon name errors. #5533 [lars@pinds.com, Nicholas Seckar]
|
||||
|
||||
* Add extention to obtain the missing constant from NameError instances. [Nicholas Seckar]
|
||||
|
||||
* Thoroughly document inflections. #5700 [petermichaux@gmail.com]
|
||||
|
||||
@@ -9,7 +9,12 @@ class NameError < StandardError
|
||||
|
||||
# Was this exception raised because the given name was missing?
|
||||
def missing_name?(name)
|
||||
missing_name == name.to_s
|
||||
if name.is_a? Symbol
|
||||
last_name = (missing_name || '').split('::').last
|
||||
last_name == name.to_s
|
||||
else
|
||||
missing_name == name.to_s
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -69,6 +69,11 @@ module Dependencies #:nodoc:
|
||||
history << file_name
|
||||
end
|
||||
|
||||
# Return the a constant path for the provided parent and constant name
|
||||
def constant_path_for(mod, name)
|
||||
([Object, Kernel].include? mod) ? name.to_s : "#{mod}::#{name}"
|
||||
end
|
||||
|
||||
class LoadingModule
|
||||
# Old style environment.rb referenced this method directly. Please note, it doesn't
|
||||
# actualy *do* anything any more.
|
||||
@@ -120,7 +125,8 @@ class Module #:nodoc:
|
||||
end
|
||||
end
|
||||
|
||||
raise NameError.new("uninitialized constant #{class_id}").copy_blame!(e)
|
||||
qualified_name = Dependencies.constant_path_for self, class_id
|
||||
raise NameError.new("uninitialized constant #{qualified_name}").copy_blame!(e)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -130,7 +136,15 @@ class Class
|
||||
if [Object, Kernel].include?(self) || parent == self
|
||||
super
|
||||
else
|
||||
parent.send :const_missing, class_id
|
||||
begin
|
||||
parent.send :const_missing, class_id
|
||||
rescue NameError => e
|
||||
# Make sure that the name we are missing is the one that caused the error
|
||||
parent_qualified_name = Dependencies.constant_path_for parent, class_id
|
||||
raise unless e.missing_name? parent_qualified_name
|
||||
qualified_name = Dependencies.constant_path_for self, class_id
|
||||
raise NameError.new("uninitialized constant #{qualified_name}").copy_blame!(e)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,9 +8,9 @@ class NameErrorTest < Test::Unit::TestCase
|
||||
SomeNameThatNobodyWillUse____Really ? 1 : 0
|
||||
flunk "?!?!"
|
||||
rescue NameError => exc
|
||||
assert_equal "SomeNameThatNobodyWillUse____Really", exc.missing_name
|
||||
assert_equal "NameErrorTest::SomeNameThatNobodyWillUse____Really", exc.missing_name
|
||||
assert exc.missing_name?(:SomeNameThatNobodyWillUse____Really)
|
||||
assert exc.missing_name?("SomeNameThatNobodyWillUse____Really")
|
||||
assert exc.missing_name?("NameErrorTest::SomeNameThatNobodyWillUse____Really")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -155,4 +155,31 @@ class DependenciesTest < Test::Unit::TestCase
|
||||
Object.send :remove_const, :ModuleFolder
|
||||
end
|
||||
end
|
||||
|
||||
def test_non_existing_const_raises_name_error_with_fully_qualified_name
|
||||
with_loading 'autoloading_fixtures' do
|
||||
begin
|
||||
A::DoesNotExist
|
||||
flunk "No raise!!"
|
||||
rescue NameError => e
|
||||
assert_equal "uninitialized constant A::DoesNotExist", e.message
|
||||
end
|
||||
begin
|
||||
A::B::DoesNotExist
|
||||
flunk "No raise!!"
|
||||
rescue NameError => e
|
||||
assert_equal "uninitialized constant A::B::DoesNotExist", e.message
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_smart_name_error_strings
|
||||
begin
|
||||
Object.module_eval "ImaginaryObject"
|
||||
flunk "No raise!!"
|
||||
rescue NameError => e
|
||||
assert e.message.include?("uninitialized constant ImaginaryObject")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user