aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorDaniel Schierbeck <dasch@zendesk.com>2012-12-16 23:38:46 +0100
committerDaniel Schierbeck <dasch@zendesk.com>2013-02-20 16:17:55 +0100
commit1879a338655aba393726de1fc5ba0d8cb4cb26d5 (patch)
treeadba83cabd745885851a3d09faff8efee64e592a /actionpack
parent889bf198577fd914e2814b9e402b49f972cf9551 (diff)
downloadrails-1879a338655aba393726de1fc5ba0d8cb4cb26d5.tar.gz
rails-1879a338655aba393726de1fc5ba0d8cb4cb26d5.tar.bz2
rails-1879a338655aba393726de1fc5ba0d8cb4cb26d5.zip
Allow registering custom dependency trackers
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_view/dependency_tracker.rb15
-rw-r--r--actionpack/test/template/dependency_tracker_test.rb38
-rw-r--r--actionpack/test/template/digestor_test.rb3
3 files changed, 54 insertions, 2 deletions
diff --git a/actionpack/lib/action_view/dependency_tracker.rb b/actionpack/lib/action_view/dependency_tracker.rb
index 1e31185c26..946a8f0fd1 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 @@ module ActionView
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 0000000000..5b2ec0eb2d
--- /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 849e2981a6..272ffec26e 100644
--- a/actionpack/test/template/digestor_test.rb
+++ b/actionpack/test/template/digestor_test.rb
@@ -2,10 +2,11 @@ require 'abstract_unit'
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