diff --git a/actionpack/lib/action_view/dependency_tracker.rb b/actionpack/lib/action_view/dependency_tracker.rb index 1e31185c260b9cde0986359595ea1bc0ba6d9892..946a8f0fd15d171a9f693076d5644e7633a39a56 100644 --- a/actionpack/lib/action_view/dependency_tracker.rb +++ b/actionpack/lib/action_view/dependency_tracker.rb @@ -1,7 +1,18 @@ module ActionView class DependencyTracker + @trackers = Hash.new + def self.find_dependencies(name, template) - ErbTracker.call(name, template) + handler = template.handler + @trackers.fetch(handler).call(name, template) + end + + def self.register_tracker(handler, tracker) + @trackers[handler] = tracker + end + + def self.remove_tracker(handler) + @trackers.delete(handler) end class ErbTracker @@ -62,5 +73,7 @@ def explicit_dependencies template.source.scan(EXPLICIT_DEPENDENCY).flatten.uniq end end + + register_tracker Template::Handlers::ERB, ErbTracker end end diff --git a/actionpack/test/template/dependency_tracker_test.rb b/actionpack/test/template/dependency_tracker_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..5b2ec0eb2db5b846b1bd556ce31eda317dcc82a6 --- /dev/null +++ b/actionpack/test/template/dependency_tracker_test.rb @@ -0,0 +1,38 @@ +require 'abstract_unit' +require 'action_view/dependency_tracker' + +class DependencyTrackerTest < ActionView::TestCase + Neckbeard = Class.new + + class NeckbeardTracker + def self.call(name, template) + ["foo/#{name}"] + end + end + + class FakeTemplate + attr_reader :source, :handler + + def initialize(source) + @source, @handler = source, Neckbeard + end + end + + def tracker + ActionView::DependencyTracker + end + + def setup + tracker.register_tracker(Neckbeard, NeckbeardTracker) + end + + def teardown + tracker.remove_tracker(Neckbeard) + end + + def test_finds_tracker_by_template_handler + template = FakeTemplate.new("boo/hoo") + dependencies = tracker.find_dependencies("boo/hoo", template) + assert_equal ["foo/boo/hoo"], dependencies + end +end diff --git a/actionpack/test/template/digestor_test.rb b/actionpack/test/template/digestor_test.rb index 849e2981a6cab0932cee64bc06af5e4becf2c020..272ffec26e408ebc713821fed1e09adf1125b30a 100644 --- a/actionpack/test/template/digestor_test.rb +++ b/actionpack/test/template/digestor_test.rb @@ -2,10 +2,11 @@ require 'fileutils' class FixtureTemplate - attr_reader :source + attr_reader :source, :handler def initialize(template_path) @source = File.read(template_path) + @handler = ActionView::Template::Handlers::ERB rescue Errno::ENOENT raise ActionView::MissingTemplate.new([], "", [], true, []) end