mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Merge remote branch 'rolftimmermans/desc_tracker'
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
require 'active_support/dependencies'
|
||||
|
||||
module ActiveSupport
|
||||
# This module provides an internal implementation to track descendants
|
||||
# which is faster than iterating through ObjectSpace.
|
||||
@@ -18,12 +16,16 @@ module ActiveSupport
|
||||
end
|
||||
|
||||
def self.clear
|
||||
@@direct_descendants.each do |klass, descendants|
|
||||
if ActiveSupport::Dependencies.autoloaded?(klass)
|
||||
@@direct_descendants.delete(klass)
|
||||
else
|
||||
descendants.reject! { |v| ActiveSupport::Dependencies.autoloaded?(v) }
|
||||
if defined? ActiveSupport::Dependencies
|
||||
@@direct_descendants.each do |klass, descendants|
|
||||
if ActiveSupport::Dependencies.autoloaded?(klass)
|
||||
@@direct_descendants.delete(klass)
|
||||
else
|
||||
descendants.reject! { |v| ActiveSupport::Dependencies.autoloaded?(v) }
|
||||
end
|
||||
end
|
||||
else
|
||||
@@direct_descendants.clear
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
require 'abstract_unit'
|
||||
require 'active_support/inflector'
|
||||
require 'active_support/time'
|
||||
require 'active_support/json'
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ require 'date'
|
||||
require 'abstract_unit'
|
||||
require 'inflector_test_cases'
|
||||
|
||||
require 'active_support/inflector'
|
||||
require 'active_support/core_ext/string'
|
||||
require 'active_support/time'
|
||||
require 'active_support/core_ext/kernel/reporting'
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
require 'abstract_unit'
|
||||
require 'test/unit'
|
||||
require 'active_support'
|
||||
require 'active_support/core_ext/hash/slice'
|
||||
|
||||
class DescendantsTrackerTest < Test::Unit::TestCase
|
||||
module DescendantsTrackerTestCases
|
||||
class Parent
|
||||
extend ActiveSupport::DescendantsTracker
|
||||
end
|
||||
@@ -34,7 +29,7 @@ class DescendantsTrackerTest < Test::Unit::TestCase
|
||||
assert_equal [], Child2.direct_descendants
|
||||
end
|
||||
|
||||
def test_clear_with_autoloaded_parent_children_and_granchildren
|
||||
def test_clear
|
||||
mark_as_autoloaded(*ALL) do
|
||||
ActiveSupport::DescendantsTracker.clear
|
||||
ALL.each do |k|
|
||||
@@ -43,35 +38,22 @@ class DescendantsTrackerTest < Test::Unit::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
def test_clear_with_autoloaded_children_and_granchildren
|
||||
mark_as_autoloaded Child1, Grandchild1, Grandchild2 do
|
||||
ActiveSupport::DescendantsTracker.clear
|
||||
assert_equal [Child2], Parent.descendants
|
||||
assert_equal [], Child2.descendants
|
||||
end
|
||||
end
|
||||
|
||||
def test_clear_with_autoloaded_granchildren
|
||||
mark_as_autoloaded Grandchild1, Grandchild2 do
|
||||
ActiveSupport::DescendantsTracker.clear
|
||||
assert_equal [Child1, Child2], Parent.descendants
|
||||
assert_equal [], Child1.descendants
|
||||
assert_equal [], Child2.descendants
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def mark_as_autoloaded(*klasses)
|
||||
old_autoloaded = ActiveSupport::Dependencies.autoloaded_constants.dup
|
||||
ActiveSupport::Dependencies.autoloaded_constants = klasses.map(&:name)
|
||||
# If ActiveSupport::Dependencies is not loaded, forget about autoloading.
|
||||
# This allows using AS::DescendantsTracker without AS::Dependencies.
|
||||
if defined? ActiveSupport::Dependencies
|
||||
old_autoloaded = ActiveSupport::Dependencies.autoloaded_constants.dup
|
||||
ActiveSupport::Dependencies.autoloaded_constants = klasses.map(&:name)
|
||||
end
|
||||
|
||||
old_descendants = ActiveSupport::DescendantsTracker.class_eval("@@direct_descendants").dup
|
||||
old_descendants.each { |k, v| old_descendants[k] = v.dup }
|
||||
|
||||
yield
|
||||
ensure
|
||||
ActiveSupport::Dependencies.autoloaded_constants = old_autoloaded
|
||||
ActiveSupport::Dependencies.autoloaded_constants = old_autoloaded if defined? ActiveSupport::Dependencies
|
||||
ActiveSupport::DescendantsTracker.class_eval("@@direct_descendants").replace(old_descendants)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,35 @@
|
||||
require 'abstract_unit'
|
||||
require 'test/unit'
|
||||
require 'active_support/descendants_tracker'
|
||||
require 'active_support/dependencies'
|
||||
require 'descendants_tracker_test_cases'
|
||||
|
||||
class DescendantsTrackerWithAutoloadingTest < Test::Unit::TestCase
|
||||
include DescendantsTrackerTestCases
|
||||
|
||||
def test_clear_with_autoloaded_parent_children_and_granchildren
|
||||
mark_as_autoloaded(*ALL) do
|
||||
ActiveSupport::DescendantsTracker.clear
|
||||
ALL.each do |k|
|
||||
assert ActiveSupport::DescendantsTracker.descendants(k).empty?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_clear_with_autoloaded_children_and_granchildren
|
||||
mark_as_autoloaded Child1, Grandchild1, Grandchild2 do
|
||||
ActiveSupport::DescendantsTracker.clear
|
||||
assert_equal [Child2], Parent.descendants
|
||||
assert_equal [], Child2.descendants
|
||||
end
|
||||
end
|
||||
|
||||
def test_clear_with_autoloaded_granchildren
|
||||
mark_as_autoloaded Grandchild1, Grandchild2 do
|
||||
ActiveSupport::DescendantsTracker.clear
|
||||
assert_equal [Child1, Child2], Parent.descendants
|
||||
assert_equal [], Child1.descendants
|
||||
assert_equal [], Child2.descendants
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
require 'abstract_unit'
|
||||
require 'test/unit'
|
||||
require 'active_support/descendants_tracker'
|
||||
require 'descendants_tracker_test_cases'
|
||||
|
||||
class DescendantsTrackerWithoutAutoloadingTest < Test::Unit::TestCase
|
||||
include DescendantsTrackerTestCases
|
||||
end
|
||||
@@ -1,6 +1,7 @@
|
||||
# encoding: utf-8
|
||||
require 'abstract_unit'
|
||||
require 'multibyte_test_helpers'
|
||||
require 'active_support/core_ext/string/multibyte'
|
||||
|
||||
class String
|
||||
def __method_for_multibyte_testing_with_integer_result; 1; end
|
||||
|
||||
Reference in New Issue
Block a user