locomotive_plugins 1.0.0.beta4 → 1.0.0.beta5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -1
- data/README.md +40 -15
- data/lib/locomotive/plugin.rb +36 -72
- data/lib/locomotive/plugin/class_tracker.rb +54 -0
- data/lib/locomotive/plugin/config_ui.rb +11 -4
- data/lib/locomotive/plugin/liquid.rb +94 -35
- data/lib/locomotive/plugin/liquid/context_helpers.rb +47 -0
- data/lib/locomotive/plugin/liquid/drop_extension.rb +36 -0
- data/lib/locomotive/plugin/liquid/prefixed_filter_module.rb +22 -15
- data/lib/locomotive/plugin/liquid/tag_subclass_methods.rb +16 -14
- data/lib/locomotive_plugins.rb +0 -36
- data/lib/version.rb +1 -1
- data/spec/lib/locomotive/plugin/class_tracker_spec.rb +48 -0
- data/spec/lib/locomotive/plugin/liquid/context_helpers_spec.rb +75 -0
- data/spec/lib/locomotive/plugin/liquid_spec.rb +70 -77
- data/spec/lib/locomotive/plugin_spec.rb +8 -10
- data/spec/support/plugins/my_plugin.rb +18 -3
- metadata +7 -9
- data/lib/locomotive/plugin/db_model.rb +0 -10
- data/lib/locomotive/plugin/db_model_container.rb +0 -18
- data/lib/locomotive/plugin/db_models.rb +0 -111
- data/spec/lib/locomotive/plugin/db_models_spec.rb +0 -206
- data/spec/lib/locomotive_plugins_spec.rb +0 -29
- data/spec/support/plugins/plugin_with_db_model.rb +0 -19
- data/spec/support/plugins/plugin_with_db_model_relationships.rb +0 -22
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
module Locomotive
|
3
|
+
module Plugin
|
4
|
+
module Liquid
|
5
|
+
# @api internal
|
6
|
+
#
|
7
|
+
# Adds the plugin object to the liquid context.
|
8
|
+
module ContextHelpers
|
9
|
+
|
10
|
+
# Adds the plugin object to the liquid context object to be used by
|
11
|
+
# tags, filters, and drops. This method looks in the +:site+ register
|
12
|
+
# for an object which responds to +#plugin_object_for_id+ in order to
|
13
|
+
# populate the +:plugin_object+ register. If such an object does not
|
14
|
+
# exist, the method simply yields without altering the context object.
|
15
|
+
# Otherwise, after yielding, the context object is reset to its
|
16
|
+
# previous state.
|
17
|
+
#
|
18
|
+
# @param plugin_id [String] the plugin id to use
|
19
|
+
# @param context [Liquid::Context] the liquid context object
|
20
|
+
def self.add_plugin_object_to_context(plugin_id, context)
|
21
|
+
site = self.fetch_site(context)
|
22
|
+
if site
|
23
|
+
old = context.registers[:plugin_object]
|
24
|
+
obj = site.plugin_object_for_id(plugin_id)
|
25
|
+
context.registers[:plugin_object] = obj
|
26
|
+
yield
|
27
|
+
context.registers[:plugin_object] = old
|
28
|
+
else
|
29
|
+
yield
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
# Fetch the site from the context assuming it exists and responds to
|
36
|
+
# the +#plugin_object_for_id+ method.
|
37
|
+
#
|
38
|
+
# @param context [Liquid::Context] the liquid context object
|
39
|
+
# @return the site object or +nil+
|
40
|
+
def self.fetch_site(context)
|
41
|
+
site = context.registers[:site]
|
42
|
+
site if site.respond_to?(:plugin_object_for_id)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
module Locomotive
|
3
|
+
module Plugin
|
4
|
+
module Liquid
|
5
|
+
# @api internal
|
6
|
+
#
|
7
|
+
# Extension to liquid drops added by plugins.
|
8
|
+
module DropExtension
|
9
|
+
|
10
|
+
# Allow setting the plugin_id, but only once.
|
11
|
+
def set_plugin_id(plugin_id)
|
12
|
+
@_plugin_id ||= plugin_id
|
13
|
+
end
|
14
|
+
|
15
|
+
# Add the plugin object to the context when invoked (see
|
16
|
+
# Liquid::Drop#invoke_drop)
|
17
|
+
def invoke_drop(method)
|
18
|
+
value = nil
|
19
|
+
|
20
|
+
ContextHelpers.add_plugin_object_to_context(_plugin_id, @context) do
|
21
|
+
value = super
|
22
|
+
end
|
23
|
+
|
24
|
+
value
|
25
|
+
end
|
26
|
+
alias :[] :invoke_drop
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Plugin ID (see set_plugin_id).
|
31
|
+
attr_reader :_plugin_id
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -2,19 +2,19 @@
|
|
2
2
|
module Locomotive
|
3
3
|
module Plugin
|
4
4
|
module Liquid
|
5
|
-
# @
|
5
|
+
# @api internal
|
6
|
+
#
|
6
7
|
# This module provides functionality for the module which aggregates all
|
7
8
|
# the prefixed filter methods. See
|
8
|
-
# <tt>Locomotive::Plugin::Liquid#prefixed_liquid_filter_module</tt
|
9
|
+
# <tt>Locomotive::Plugin::Liquid#prefixed_liquid_filter_module</tt>.
|
9
10
|
module PrefixedFilterModule
|
10
11
|
|
11
12
|
protected
|
12
13
|
|
13
|
-
#
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
# Build the object to use for passing through the non-prefixed methods.
|
15
|
+
#
|
16
|
+
# @param modules_to_extend [Array] the module for the passthrough object
|
17
|
+
# to extend
|
18
18
|
def _build_passthrough_object(modules_to_extend)
|
19
19
|
obj = ::Liquid::Strainer.new(@context)
|
20
20
|
|
@@ -25,6 +25,10 @@ module Locomotive
|
|
25
25
|
obj
|
26
26
|
end
|
27
27
|
|
28
|
+
# Get the passthrough object for the given prefix.
|
29
|
+
#
|
30
|
+
# @param prefix [String] the prefix to use
|
31
|
+
# @return the passthrough object for +prefix+
|
28
32
|
def _passthrough_object(prefix)
|
29
33
|
@_passthrough_objects ||= {}
|
30
34
|
obj = @_passthrough_objects[prefix]
|
@@ -43,18 +47,21 @@ module Locomotive
|
|
43
47
|
@_passthrough_objects[prefix] = self._build_passthrough_object(modules)
|
44
48
|
end
|
45
49
|
|
50
|
+
# Passthrough method call with the given prefix and input.
|
51
|
+
#
|
52
|
+
# @param prefix [String] the prefix to use
|
53
|
+
# @param meth [Symbol] the method to call
|
54
|
+
# @param input [String] the input to the method
|
55
|
+
# @return the result of calling the method on the passthrough object
|
46
56
|
def _passthrough_filter_call(prefix, meth, input)
|
47
|
-
|
48
|
-
|
49
|
-
end
|
57
|
+
# Setup context object and call the passthrough
|
58
|
+
output = nil
|
50
59
|
|
51
|
-
|
52
|
-
|
53
|
-
self.filter_method_called(prefix, meth) do
|
54
|
-
ret = p.call
|
60
|
+
ContextHelpers.add_plugin_object_to_context(prefix, @context) do
|
61
|
+
output = self._passthrough_object(prefix).__send__(meth, input)
|
55
62
|
end
|
56
63
|
|
57
|
-
|
64
|
+
output
|
58
65
|
end
|
59
66
|
|
60
67
|
end
|
@@ -2,17 +2,25 @@
|
|
2
2
|
module Locomotive
|
3
3
|
module Plugin
|
4
4
|
module Liquid
|
5
|
-
# @
|
5
|
+
# @api internal
|
6
|
+
#
|
7
|
+
# The methods shared by all tag subclasses.
|
6
8
|
module TagSubclassMethods
|
7
9
|
|
8
10
|
# Check to see if this tag is enabled in the liquid context and render
|
9
|
-
# accordingly
|
11
|
+
# accordingly.
|
12
|
+
#
|
13
|
+
# @param context [Liquid::Context] the liquid context object
|
14
|
+
# @return the rendered content of the superclass using +render+ or
|
15
|
+
# +render_disabled+ as appropriate
|
10
16
|
def render(context)
|
11
17
|
enabled_tags = context.registers[:enabled_plugin_tags]
|
12
18
|
enabled = enabled_tags && enabled_tags.include?(self.class)
|
13
19
|
|
14
|
-
|
15
|
-
|
20
|
+
output = nil
|
21
|
+
|
22
|
+
ContextHelpers.add_plugin_object_to_context(self.prefix, context) do
|
23
|
+
output = if enabled
|
16
24
|
super
|
17
25
|
elsif self.respond_to?(:render_disabled)
|
18
26
|
self.render_disabled(context)
|
@@ -21,18 +29,12 @@ module Locomotive
|
|
21
29
|
end
|
22
30
|
end
|
23
31
|
|
24
|
-
|
25
|
-
rendering_tag(self.class.prefix, enabled, context) do
|
26
|
-
ret = p.call
|
27
|
-
end
|
28
|
-
ret || p.call
|
32
|
+
output
|
29
33
|
end
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
# functionality when the tag is rendering
|
35
|
-
def rendering_tag(prefix, enabled, context)
|
35
|
+
# The prefix for this tag.
|
36
|
+
def prefix
|
37
|
+
self.class.prefix
|
36
38
|
end
|
37
39
|
|
38
40
|
end
|
data/lib/locomotive_plugins.rb
CHANGED
@@ -6,39 +6,3 @@ require 'haml'
|
|
6
6
|
require 'mongoid'
|
7
7
|
|
8
8
|
require 'locomotive/plugin'
|
9
|
-
|
10
|
-
# The overall module for registering plugins
|
11
|
-
module LocomotivePlugins
|
12
|
-
|
13
|
-
# Get the default ID for the given plugin class
|
14
|
-
#
|
15
|
-
# @param plugin_class[Class] the class of the plugin object
|
16
|
-
def self.default_id(plugin_class)
|
17
|
-
plugin_class.to_s.split('::').last.underscore
|
18
|
-
end
|
19
|
-
|
20
|
-
# Register a plugin class with a given ID. If no ID is given, the default ID
|
21
|
-
# is obtained by calling <tt>default_id(plugin_class)</tt>
|
22
|
-
#
|
23
|
-
# @param plugin_class[Class] the class pf the plugin to register
|
24
|
-
# @param plugin_id[String] the plugin ID to use
|
25
|
-
def self.register_plugin(plugin_class, plugin_id = nil)
|
26
|
-
@@registered_plugins ||= {}
|
27
|
-
plugin_id ||= self.default_id(plugin_class)
|
28
|
-
@@registered_plugins[plugin_id] = plugin_class
|
29
|
-
end
|
30
|
-
|
31
|
-
# Get the hash of registered plugin classes, where the keys are the IDs which
|
32
|
-
# were used to register the plugins
|
33
|
-
#
|
34
|
-
# @return [Hash<String, Class>] a hash of plugin IDs to plugin classes
|
35
|
-
def self.registered_plugins
|
36
|
-
@@registered_plugins ||= {}
|
37
|
-
end
|
38
|
-
|
39
|
-
# Remove all plugins from the registered list
|
40
|
-
def self.clear_registered_plugins
|
41
|
-
@@registered_plugins = {}
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
data/lib/version.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Locomotive
|
5
|
+
module Plugin
|
6
|
+
describe ClassTracker do
|
7
|
+
|
8
|
+
it 'tracks all the classes which include the module' do
|
9
|
+
classes = Locomotive::Plugin.plugin_classes
|
10
|
+
classes.should include(MyPlugin)
|
11
|
+
classes.should include(UselessPlugin)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'supports custom trackers' do
|
15
|
+
added_classes = []
|
16
|
+
num_added_classes = 0
|
17
|
+
|
18
|
+
Locomotive::Plugin.add_plugin_class_tracker do |plugin_class|
|
19
|
+
added_classes << plugin_class
|
20
|
+
end
|
21
|
+
|
22
|
+
Locomotive::Plugin.add_plugin_class_tracker do |plugin_class|
|
23
|
+
num_added_classes += 1
|
24
|
+
end
|
25
|
+
|
26
|
+
c = Class.new { include Locomotive::Plugin }
|
27
|
+
added_classes.should == [c]
|
28
|
+
num_added_classes.should == 1
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'gives custom trackers access to the default ID' do
|
32
|
+
added_ids = []
|
33
|
+
Locomotive::Plugin.add_plugin_class_tracker do |plugin_class|
|
34
|
+
added_ids << plugin_class.default_plugin_id
|
35
|
+
end
|
36
|
+
|
37
|
+
MyNewPlugin = Class.new
|
38
|
+
MyNewPlugin.class_eval do
|
39
|
+
include Locomotive::Plugin
|
40
|
+
end
|
41
|
+
|
42
|
+
added_ids.count.should == 1
|
43
|
+
added_ids.first.should == 'my_new_plugin'
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Locomotive
|
5
|
+
module Plugin
|
6
|
+
module Liquid
|
7
|
+
describe ContextHelpers do
|
8
|
+
|
9
|
+
context '#add_plugin_object_to_context' do
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
@config = {}
|
13
|
+
@plugin = MyPlugin.new(@config)
|
14
|
+
@context = ::Liquid::Context.new({}, {}, {site: @site}, true)
|
15
|
+
|
16
|
+
plugin = @plugin
|
17
|
+
@context.registers[:site] = stub do
|
18
|
+
stubs(:plugin_object_for_id).with('my_plugin').returns(plugin)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should add the object to the context' do
|
23
|
+
did_yield = false
|
24
|
+
ContextHelpers.add_plugin_object_to_context('my_plugin', @context) do
|
25
|
+
did_yield = true
|
26
|
+
@context.registers[:plugin_object].should == @plugin
|
27
|
+
end
|
28
|
+
did_yield.should be_true
|
29
|
+
@context.registers[:plugin_object].should be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should reset the context object' do
|
33
|
+
initial_object = 'initial'
|
34
|
+
@context.registers[:plugin_object] = initial_object
|
35
|
+
|
36
|
+
did_yield = false
|
37
|
+
ContextHelpers.add_plugin_object_to_context('my_plugin', @context) do
|
38
|
+
did_yield = true
|
39
|
+
@context.registers[:plugin_object].should == @plugin
|
40
|
+
end
|
41
|
+
did_yield.should be_true
|
42
|
+
@context.registers[:plugin_object].should == initial_object
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should do nothing if there is no site object in the context' do
|
46
|
+
@context.registers[:site] = nil
|
47
|
+
|
48
|
+
did_yield = false
|
49
|
+
ContextHelpers.add_plugin_object_to_context('my_plugin', @context) do
|
50
|
+
did_yield = true
|
51
|
+
@context.registers[:plugin_object].should be_nil
|
52
|
+
end
|
53
|
+
did_yield.should be_true
|
54
|
+
@context.registers[:plugin_object].should be_nil
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should do nothing if the site object has no plugin_object_for method' do
|
58
|
+
@context.registers[:site] = Object.new
|
59
|
+
|
60
|
+
did_yield = false
|
61
|
+
ContextHelpers.add_plugin_object_to_context('my_plugin', @context) do
|
62
|
+
did_yield = true
|
63
|
+
@context.registers[:plugin_object].should be_nil
|
64
|
+
end
|
65
|
+
did_yield.should be_true
|
66
|
+
@context.registers[:plugin_object].should be_nil
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -5,73 +5,95 @@ module Locomotive
|
|
5
5
|
module Plugin
|
6
6
|
describe Liquid do
|
7
7
|
|
8
|
+
context '#setup_liquid_context' do
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
@config = {}
|
12
|
+
@plugin = MyPlugin.new(@config)
|
13
|
+
@context = ::Liquid::Context.new({}, {}, {}, true)
|
14
|
+
@plugin.setup_liquid_context('my_plugin', @context)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should add a container for the plugin liquid drops' do
|
18
|
+
@context['plugins.my_plugin'].class.should == MyPlugin::MyDrop
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should add a set of enabled liquid tags' do
|
22
|
+
@context.registers[:enabled_plugin_tags].class.should == Set
|
23
|
+
@context.registers[:enabled_plugin_tags].size.should == 1
|
24
|
+
@context.registers[:enabled_plugin_tags].should include(MyPlugin::MyTag::TagSubclass)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should add liquid filters' do
|
28
|
+
@context.strainer.my_plugin_filter('input').should == 'input'
|
29
|
+
expect { @context.strainer.language_plugin_filter('input') }.to raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should add the plugin object to the context when invoking drops' do
|
33
|
+
ContextHelpers.expects(:add_plugin_object_to_context).with(
|
34
|
+
'my_plugin', @context)
|
35
|
+
::Liquid::Template.parse(
|
36
|
+
'{{ plugins.my_plugin.dummy_method }}').render(@context)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should add the plugin object to the context when calling filters' do
|
40
|
+
ContextHelpers.expects(:add_plugin_object_to_context).with(
|
41
|
+
'my_plugin', @context)
|
42
|
+
::Liquid::Template.parse(
|
43
|
+
'{{ "test" | my_plugin_filter }}').render(@context)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should add the plugin object to the context when rendering tags' do
|
47
|
+
MyPlugin.register_tags('my_plugin')
|
48
|
+
ContextHelpers.expects(:add_plugin_object_to_context).with(
|
49
|
+
'my_plugin', @context)
|
50
|
+
::Liquid::Template.parse('{% my_plugin_my_tag %}').render(@context)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
8
55
|
describe '#prefixed_liquid_filter_module' do
|
9
56
|
|
10
57
|
let(:strainer) { ::Liquid::Strainer.new(::Liquid::Context.new) }
|
11
58
|
|
12
59
|
before(:each) do
|
13
|
-
@
|
60
|
+
@plugin_with_filter_class = PluginWithFilter
|
14
61
|
end
|
15
62
|
|
16
63
|
it 'should contain all prefixed methods for provided filter modules' do
|
17
|
-
mod = @
|
64
|
+
mod = @plugin_with_filter_class.prefixed_liquid_filter_module('prefix')
|
18
65
|
mod.public_instance_methods.should include(:prefix_add_http)
|
19
66
|
end
|
20
67
|
|
21
68
|
it 'should not contain any of the original methods' do
|
22
|
-
mod = @
|
69
|
+
mod = @plugin_with_filter_class.prefixed_liquid_filter_module('prefix')
|
23
70
|
mod.public_instance_methods.should_not include(:add_http)
|
24
71
|
end
|
25
72
|
|
26
73
|
it 'the prefixed methods should pass through to the original methods' do
|
27
|
-
strainer.extend(@
|
74
|
+
strainer.extend(@plugin_with_filter_class.prefixed_liquid_filter_module('prefix'))
|
28
75
|
strainer.prefix_add_http('google.com').should == 'http://google.com'
|
29
76
|
strainer.prefix_add_http('http://google.com').should == 'http://google.com'
|
30
77
|
end
|
31
78
|
|
32
79
|
it 'includes multiple filter modules for one plugin' do
|
33
|
-
@
|
34
|
-
mod = @
|
80
|
+
@plugin_with_many_filter_modules_class = PluginWithManyFilterModules
|
81
|
+
mod = @plugin_with_many_filter_modules_class.prefixed_liquid_filter_module('prefix')
|
35
82
|
mod.public_instance_methods.should include(:prefix_add_newline)
|
36
83
|
mod.public_instance_methods.should include(:prefix_remove_http)
|
37
84
|
end
|
38
85
|
|
39
86
|
it 'works if multiple prefixed modules are mixed into the same object' do
|
40
|
-
@
|
87
|
+
@plugin_with_many_filter_modules_class = PluginWithManyFilterModules
|
41
88
|
|
42
|
-
strainer.extend(@
|
43
|
-
strainer.extend(@
|
89
|
+
strainer.extend(@plugin_with_filter_class.prefixed_liquid_filter_module('prefix1'))
|
90
|
+
strainer.extend(@plugin_with_many_filter_modules_class.prefixed_liquid_filter_module('prefix2'))
|
44
91
|
|
45
92
|
strainer.prefix1_add_http('google.com').should == 'http://google.com'
|
46
93
|
strainer.prefix2_add_newline('google.com').should == "google.com\n"
|
47
94
|
strainer.prefix2_remove_http('http://google.com').should == 'google.com'
|
48
95
|
end
|
49
96
|
|
50
|
-
it 'should call the filter_method_called hook each time a filter is called' do
|
51
|
-
# Keep track of how many times filter_method_called is called
|
52
|
-
Locomotive::Plugin::Liquid::PrefixedFilterModule.module_eval do
|
53
|
-
attr_reader :count, :prefix, :method
|
54
|
-
|
55
|
-
def filter_method_called(prefix, meth)
|
56
|
-
@count ||= 0
|
57
|
-
@count += 1
|
58
|
-
@prefix = prefix
|
59
|
-
@method = meth
|
60
|
-
yield
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Call filter methods
|
65
|
-
strainer.extend(@plugin_with_filter.prefixed_liquid_filter_module('prefix'))
|
66
|
-
strainer.prefix_add_http('google.com').should == 'http://google.com'
|
67
|
-
strainer.prefix_add_http('http://google.com').should == 'http://google.com'
|
68
|
-
|
69
|
-
# Make sure filter_method_called was called as expected
|
70
|
-
strainer.count.should == 2
|
71
|
-
strainer.prefix.should == 'prefix'
|
72
|
-
strainer.method.should == :add_http
|
73
|
-
end
|
74
|
-
|
75
97
|
it 'should give the current liquid context object to the passthrough objects' do
|
76
98
|
Locomotive::Plugin::Liquid::PrefixedFilterModule.module_eval do
|
77
99
|
attr_reader :context
|
@@ -79,7 +101,7 @@ module Locomotive
|
|
79
101
|
end
|
80
102
|
|
81
103
|
# Extend the module and create the passthrough object
|
82
|
-
strainer.extend(@
|
104
|
+
strainer.extend(@plugin_with_filter_class.prefixed_liquid_filter_module('prefix'))
|
83
105
|
strainer.prefix_add_http('google.com').should == 'http://google.com'
|
84
106
|
|
85
107
|
# Find the context of the passthrough object
|
@@ -97,6 +119,11 @@ module Locomotive
|
|
97
119
|
@plugin_class = PluginWithTags
|
98
120
|
@prefixed_tags = @plugin_class.prefixed_liquid_tags('prefix')
|
99
121
|
|
122
|
+
# Clear out existing registered liquid tags and register the ones we
|
123
|
+
# want
|
124
|
+
::Liquid::Template.instance_variable_set(:@tags, nil)
|
125
|
+
PluginWithTags.register_tags('prefix')
|
126
|
+
|
100
127
|
@enabled_tags = []
|
101
128
|
@context = ::Liquid::Context.new
|
102
129
|
@context.registers[:enabled_plugin_tags] = @enabled_tags
|
@@ -113,13 +140,20 @@ module Locomotive
|
|
113
140
|
@prefixed_tags['prefix_newline'].should be < PluginWithTags::Newline
|
114
141
|
end
|
115
142
|
|
143
|
+
it 'should register all prefixed tags in liquid' do
|
144
|
+
::Liquid::Template.tags.size.should == 2
|
145
|
+
::Liquid::Template.tags['prefix_paragraph'].should be \
|
146
|
+
< PluginWithTags::Paragraph
|
147
|
+
::Liquid::Template.tags['prefix_newline'].should be \
|
148
|
+
< PluginWithTags::Newline
|
149
|
+
end
|
150
|
+
|
116
151
|
it 'only renders a tag if it is enabled in the liquid context' do
|
117
152
|
expected_output = <<-TEMPLATE
|
118
153
|
<p>Some Text</p>
|
119
154
|
Some Text<br />
|
120
155
|
TEMPLATE
|
121
156
|
|
122
|
-
register_tags(@prefixed_tags)
|
123
157
|
template = ::Liquid::Template.parse(@raw_template)
|
124
158
|
template.render(@context).should_not == expected_output
|
125
159
|
|
@@ -134,7 +168,6 @@ module Locomotive
|
|
134
168
|
Some Text
|
135
169
|
TEMPLATE
|
136
170
|
|
137
|
-
register_tags(@prefixed_tags)
|
138
171
|
template = ::Liquid::Template.parse(@raw_template)
|
139
172
|
template.render(@context).should == expected_output
|
140
173
|
end
|
@@ -147,48 +180,8 @@ module Locomotive
|
|
147
180
|
Some Text
|
148
181
|
TEMPLATE
|
149
182
|
|
150
|
-
register_tags(@prefixed_tags)
|
151
|
-
template = ::Liquid::Template.parse(@raw_template)
|
152
|
-
template.render(@context).should == expected_output
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'should call the rendering_tag hook each time a tag is rendered' do
|
156
|
-
TagSubclassMethods.module_eval do
|
157
|
-
def rendering_tag(prefix, enabled, context)
|
158
|
-
context.registers[:rendering_tag][self.class] = {
|
159
|
-
prefix: prefix,
|
160
|
-
enabled: enabled
|
161
|
-
}
|
162
|
-
yield
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
expected_output = <<-TEMPLATE
|
167
|
-
<p>Some Text</p>
|
168
|
-
Some Text
|
169
|
-
TEMPLATE
|
170
|
-
|
171
|
-
@context.registers[:rendering_tag] = {}
|
172
|
-
|
173
|
-
register_tags(@prefixed_tags)
|
174
|
-
@enabled_tags << @prefixed_tags['prefix_paragraph']
|
175
183
|
template = ::Liquid::Template.parse(@raw_template)
|
176
184
|
template.render(@context).should == expected_output
|
177
|
-
|
178
|
-
paragraph_class = ::Locomotive::PluginWithTags::Paragraph::TagSubclass
|
179
|
-
newline_class = ::Locomotive::PluginWithTags::Newline::TagSubclass
|
180
|
-
|
181
|
-
hash = @context.registers[:rendering_tag]
|
182
|
-
hash[paragraph_class].should == { prefix: 'prefix', enabled: true }
|
183
|
-
hash[newline_class].should == { prefix: 'prefix', enabled: false }
|
184
|
-
end
|
185
|
-
|
186
|
-
protected
|
187
|
-
|
188
|
-
def register_tags(tags)
|
189
|
-
tags.each do |name, klass|
|
190
|
-
::Liquid::Template.register_tag(name, klass)
|
191
|
-
end
|
192
185
|
end
|
193
186
|
|
194
187
|
end
|