From 80f1597942dbfdc24d532d9ebd555969deea12fe Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Wed, 16 Aug 2006 09:18:17 +0000 Subject: [PATCH] Dependencies can autoload directories of nested classes. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4769 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activesupport/CHANGELOG | 5 +++ .../lib/active_support/dependencies.rb | 6 +++- .../test/autoloading_fixtures/class_folder.rb | 2 ++ .../class_folder/inline_class.rb | 2 ++ .../class_folder/nested_class.rb | 4 +++ .../module_folder/inline_class.rb | 2 ++ .../module_folder/nested_class.rb | 6 ++-- activesupport/test/dependencies_test.rb | 32 +++++++++++++++++-- 8 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 activesupport/test/autoloading_fixtures/class_folder.rb create mode 100644 activesupport/test/autoloading_fixtures/class_folder/inline_class.rb create mode 100644 activesupport/test/autoloading_fixtures/class_folder/nested_class.rb create mode 100644 activesupport/test/autoloading_fixtures/module_folder/inline_class.rb diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG index 48bcd264c5..90b476f667 100644 --- a/activesupport/CHANGELOG +++ b/activesupport/CHANGELOG @@ -1,5 +1,10 @@ *SVN* +* Dependencies can autoload directories of nested classes. [Jeremy Kemper] + Example: + invoice.rb class Invoice + invoice/lineitem.rb class Invoice::Lineitem + * Add Deprecation.silence so that Reloadable does not scold itself. [Nicholas Seckar] * Add debugging logging to Dependencies. Currently can be enabled with Dependencies.log_activity = true; adding to Initializer and documenting is forthcoming. [Nicholas Seckar] diff --git a/activesupport/lib/active_support/dependencies.rb b/activesupport/lib/active_support/dependencies.rb index 333532ee01..6241a822a4 100644 --- a/activesupport/lib/active_support/dependencies.rb +++ b/activesupport/lib/active_support/dependencies.rb @@ -282,7 +282,11 @@ def const_missing(class_id) super else begin - parent.send :const_missing, class_id + begin + Dependencies.load_missing_constant self, class_id + rescue NameError + parent.send :const_missing, class_id + end rescue NameError => e # Make sure that the name we are missing is the one that caused the error parent_qualified_name = Dependencies.qualified_name_for parent, class_id diff --git a/activesupport/test/autoloading_fixtures/class_folder.rb b/activesupport/test/autoloading_fixtures/class_folder.rb new file mode 100644 index 0000000000..42933acf28 --- /dev/null +++ b/activesupport/test/autoloading_fixtures/class_folder.rb @@ -0,0 +1,2 @@ +class ClassFolder +end diff --git a/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb b/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb new file mode 100644 index 0000000000..8235e90724 --- /dev/null +++ b/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb @@ -0,0 +1,2 @@ +class ClassFolder::InlineClass +end diff --git a/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb b/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb new file mode 100644 index 0000000000..08bed842cf --- /dev/null +++ b/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb @@ -0,0 +1,4 @@ +class ClassFolder + class NestedClass + end +end diff --git a/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb b/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb new file mode 100644 index 0000000000..ca83437046 --- /dev/null +++ b/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb @@ -0,0 +1,2 @@ +class ModuleFolder::InlineClass +end diff --git a/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb b/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb index 39ee0e50d5..fc4076bd0a 100644 --- a/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb +++ b/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb @@ -1,2 +1,4 @@ -class ModuleFolder::NestedClass -end \ No newline at end of file +module ModuleFolder + class NestedClass + end +end diff --git a/activesupport/test/dependencies_test.rb b/activesupport/test/dependencies_test.rb index fe823a9e52..92f3e63e1a 100644 --- a/activesupport/test/dependencies_test.rb +++ b/activesupport/test/dependencies_test.rb @@ -125,20 +125,48 @@ def test_non_existing_const_raises_name_error end end - def test_directories_should_manifest_as_modules + def test_directories_manifest_as_modules_unless_const_defined with_loading 'autoloading_fixtures' do assert_kind_of Module, ModuleFolder Object.send :remove_const, :ModuleFolder end end - def test_nested_class_access + def test_module_with_nested_class with_loading 'autoloading_fixtures' do assert_kind_of Class, ModuleFolder::NestedClass Object.send :remove_const, :ModuleFolder end end + def test_module_with_nested_inline_class + with_loading 'autoloading_fixtures' do + assert_kind_of Class, ModuleFolder::InlineClass + Object.send :remove_const, :ModuleFolder + end + end + + def test_directories_may_manifest_as_nested_classes + with_loading 'autoloading_fixtures' do + assert_kind_of Class, ClassFolder + Object.send :remove_const, :ClassFolder + end + end + + def test_class_with_nested_class + with_loading 'autoloading_fixtures' do + assert_kind_of Class, ClassFolder::NestedClass + Object.send :remove_const, :ClassFolder + end + end + + def test_class_with_nested_inline_class + with_loading 'autoloading_fixtures' do + assert_kind_of Class, ClassFolder::InlineClass + Object.send :remove_const, :ClassFolder + end + end + def test_nested_class_can_access_sibling with_loading 'autoloading_fixtures' do sibling = ModuleFolder::NestedClass.class_eval "NestedSibling" -- GitLab