liquid 3.0.1 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +10 -2
- data/lib/liquid/context.rb +2 -15
- data/lib/liquid/strainer.rb +23 -27
- data/lib/liquid/tags/unless.rb +1 -1
- data/lib/liquid/variable_lookup.rb +2 -0
- data/lib/liquid/version.rb +1 -1
- data/test/integration/filter_test.rb +13 -0
- data/test/test_helper.rb +9 -2
- data/test/unit/strainer_unit_test.rb +6 -8
- data/test/unit/variable_unit_test.rb +6 -0
- metadata +15 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a34ea9118594ad84171322f5dbb0b07e5e7b148
|
4
|
+
data.tar.gz: e4b170c02fd107b8fa6210554d5a3b647e65a4be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b09f3628e0002d6193fa3c7e0629e0c0c075a50e9d96561dc5a40e8f461793b04c948e4a4aebf4885afe738d58ace2e5ec149b0956fd6f5be1448dbe9b3fa02d
|
7
|
+
data.tar.gz: b9a76c51a795058d2b447b95c85a689b6e628b99ada9e0a4db97aebd3a2dda3cc29d790bcef72bb0b86c3fe49b45da9e8fba6eb63ac6e081178542f6dd79b63e
|
data/History.md
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
# Liquid Version History
|
2
2
|
|
3
|
-
## 3.0.
|
3
|
+
## 3.0.2 / 2015-04-24 / branch "3-0-stable"
|
4
|
+
|
5
|
+
* Expose VariableLookup private members (#551) [Justin Li, pushrax]
|
6
|
+
* Documentation fixes
|
7
|
+
|
8
|
+
## 3.0.1 / 2015-01-23
|
9
|
+
|
10
|
+
* Remove duplicate `index0` key in TableRow tag (#502) [Alfred Xing]
|
11
|
+
|
12
|
+
## 3.0.0 / 2014-11-12
|
4
13
|
|
5
|
-
* ...
|
6
14
|
* Removed Block#end_tag. Instead, override parse with `super` followed by your code. See #446 [Dylan Thacker-Smith, dylanahsmith]
|
7
15
|
* Fixed condition with wrong data types, see #423 [Bogdan Gusiev]
|
8
16
|
* Add url_encode to standard filters, see #421 [Derrick Reimer, djreimer]
|
data/lib/liquid/context.rb
CHANGED
@@ -61,21 +61,8 @@ module Liquid
|
|
61
61
|
# for that
|
62
62
|
def add_filters(filters)
|
63
63
|
filters = [filters].flatten.compact
|
64
|
-
filters
|
65
|
-
|
66
|
-
Strainer.add_known_filter(f)
|
67
|
-
end
|
68
|
-
|
69
|
-
# If strainer is already setup then there's no choice but to use a runtime
|
70
|
-
# extend call. If strainer is not yet created, we can utilize strainers
|
71
|
-
# cached class based API, which avoids busting the method cache.
|
72
|
-
if @strainer
|
73
|
-
filters.each do |f|
|
74
|
-
strainer.extend(f)
|
75
|
-
end
|
76
|
-
else
|
77
|
-
@filters.concat filters
|
78
|
-
end
|
64
|
+
@filters += filters
|
65
|
+
@strainer = nil
|
79
66
|
end
|
80
67
|
|
81
68
|
# are there any not handled interrupts?
|
data/lib/liquid/strainer.rb
CHANGED
@@ -8,12 +8,13 @@ module Liquid
|
|
8
8
|
# The Strainer only allows method calls defined in filters given to it via Strainer.global_filter,
|
9
9
|
# Context#add_filters or Template.register_filter
|
10
10
|
class Strainer #:nodoc:
|
11
|
-
@@
|
12
|
-
|
13
|
-
|
11
|
+
@@global_strainer = Class.new(Strainer) do
|
12
|
+
@filter_methods = Set.new
|
13
|
+
end
|
14
14
|
@@strainer_class_cache = Hash.new do |hash, filters|
|
15
|
-
hash[filters] = Class.new(
|
16
|
-
|
15
|
+
hash[filters] = Class.new(@@global_strainer) do
|
16
|
+
@filter_methods = @@global_strainer.filter_methods.dup
|
17
|
+
filters.each { |f| add_filter(f) }
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
@@ -21,33 +22,32 @@ module Liquid
|
|
21
22
|
@context = context
|
22
23
|
end
|
23
24
|
|
24
|
-
def self.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
new_methods = filter.instance_methods.map(&:to_s)
|
34
|
-
new_methods.reject!{ |m| @@method_blacklist.include?(m) }
|
35
|
-
@@known_methods.merge(new_methods)
|
36
|
-
@@known_filters.add(filter)
|
25
|
+
def self.filter_methods
|
26
|
+
@filter_methods
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.add_filter(filter)
|
30
|
+
raise ArgumentError, "Expected module but got: #{f.class}" unless filter.is_a?(Module)
|
31
|
+
unless self.class.include?(filter)
|
32
|
+
self.send(:include, filter)
|
33
|
+
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
|
37
34
|
end
|
38
35
|
end
|
39
36
|
|
40
|
-
def self.
|
41
|
-
@@
|
37
|
+
def self.global_filter(filter)
|
38
|
+
@@global_strainer.add_filter(filter)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.invokable?(method)
|
42
|
+
@filter_methods.include?(method.to_s)
|
42
43
|
end
|
43
44
|
|
44
45
|
def self.create(context, filters = [])
|
45
|
-
|
46
|
-
strainer_class_cache[filters].new(context)
|
46
|
+
@@strainer_class_cache[filters].new(context)
|
47
47
|
end
|
48
48
|
|
49
49
|
def invoke(method, *args)
|
50
|
-
if invokable?(method)
|
50
|
+
if self.class.invokable?(method)
|
51
51
|
send(method, *args)
|
52
52
|
else
|
53
53
|
args.first
|
@@ -55,9 +55,5 @@ module Liquid
|
|
55
55
|
rescue ::ArgumentError => e
|
56
56
|
raise Liquid::ArgumentError.new(e.message)
|
57
57
|
end
|
58
|
-
|
59
|
-
def invokable?(method)
|
60
|
-
@@known_methods.include?(method.to_s) && respond_to?(method)
|
61
|
-
end
|
62
58
|
end
|
63
59
|
end
|
data/lib/liquid/tags/unless.rb
CHANGED
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/if'
|
|
3
3
|
module Liquid
|
4
4
|
# Unless is a conditional just like 'if' but works on the inverse logic.
|
5
5
|
#
|
6
|
-
# {% unless x < 0 %} x is greater than zero {%
|
6
|
+
# {% unless x < 0 %} x is greater than zero {% endunless %}
|
7
7
|
#
|
8
8
|
class Unless < If
|
9
9
|
def render(context)
|
data/lib/liquid/version.rb
CHANGED
@@ -25,6 +25,12 @@ end
|
|
25
25
|
class FiltersTest < Minitest::Test
|
26
26
|
include Liquid
|
27
27
|
|
28
|
+
module OverrideObjectMethodFilter
|
29
|
+
def tap(input)
|
30
|
+
"tap overridden"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
28
34
|
def setup
|
29
35
|
@context = Context.new
|
30
36
|
end
|
@@ -105,6 +111,13 @@ class FiltersTest < Minitest::Test
|
|
105
111
|
output = Variable.new(%! 'hello %{first_name}, %{last_name}' | substitute: first_name: surname, last_name: 'doe' !).render(@context)
|
106
112
|
assert_equal 'hello john, doe', output
|
107
113
|
end
|
114
|
+
|
115
|
+
def test_override_object_method_in_filter
|
116
|
+
assert_equal "tap overridden", Template.parse("{{var | tap}}").render!({ 'var' => 1000 }, :filters => [OverrideObjectMethodFilter])
|
117
|
+
|
118
|
+
# tap still treated as a non-existent filter
|
119
|
+
assert_equal "1000", Template.parse("{{var | tap}}").render!({ 'var' => 1000 })
|
120
|
+
end
|
108
121
|
end
|
109
122
|
|
110
123
|
class FiltersInTemplate < Minitest::Test
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
ENV["MT_NO_EXPECTATIONS"] = "1"
|
3
4
|
require 'minitest/autorun'
|
4
5
|
require 'spy/integration'
|
5
6
|
|
@@ -48,13 +49,19 @@ module Minitest
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def with_global_filter(*globals)
|
51
|
-
|
52
|
+
original_global_strainer = Liquid::Strainer.class_variable_get(:@@global_strainer)
|
53
|
+
Liquid::Strainer.class_variable_set(:@@global_strainer, Class.new(Liquid::Strainer) do
|
54
|
+
@filter_methods = Set.new
|
55
|
+
end)
|
56
|
+
Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
|
57
|
+
|
52
58
|
globals.each do |global|
|
53
59
|
Liquid::Template.register_filter(global)
|
54
60
|
end
|
55
61
|
yield
|
56
62
|
ensure
|
57
|
-
Liquid::Strainer.
|
63
|
+
Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
|
64
|
+
Liquid::Strainer.class_variable_set(:@@global_strainer, original_global_strainer)
|
58
65
|
end
|
59
66
|
|
60
67
|
def with_taint_mode(mode)
|
@@ -31,11 +31,11 @@ class StrainerUnitTest < Minitest::Test
|
|
31
31
|
|
32
32
|
def test_strainer_only_invokes_public_filter_methods
|
33
33
|
strainer = Strainer.create(nil)
|
34
|
-
assert_equal false, strainer.invokable?('__test__')
|
35
|
-
assert_equal false, strainer.invokable?('test')
|
36
|
-
assert_equal false, strainer.invokable?('instance_eval')
|
37
|
-
assert_equal false, strainer.invokable?('__send__')
|
38
|
-
assert_equal true, strainer.invokable?('size') # from the standard lib
|
34
|
+
assert_equal false, strainer.class.invokable?('__test__')
|
35
|
+
assert_equal false, strainer.class.invokable?('test')
|
36
|
+
assert_equal false, strainer.class.invokable?('instance_eval')
|
37
|
+
assert_equal false, strainer.class.invokable?('__send__')
|
38
|
+
assert_equal true, strainer.class.invokable?('size') # from the standard lib
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_strainer_returns_nil_if_no_filter_method_found
|
@@ -63,9 +63,7 @@ class StrainerUnitTest < Minitest::Test
|
|
63
63
|
assert_kind_of Strainer, strainer
|
64
64
|
assert_kind_of a, strainer
|
65
65
|
assert_kind_of b, strainer
|
66
|
-
|
67
|
-
assert_kind_of m, strainer
|
68
|
-
end
|
66
|
+
assert_kind_of Liquid::StandardFilters, strainer
|
69
67
|
end
|
70
68
|
|
71
69
|
end # StrainerTest
|
@@ -136,4 +136,10 @@ class VariableUnitTest < Minitest::Test
|
|
136
136
|
var = Variable.new(%! name_of_variable | upcase !)
|
137
137
|
assert_equal " name_of_variable | upcase ", var.raw
|
138
138
|
end
|
139
|
+
|
140
|
+
def test_variable_lookup_interface
|
141
|
+
lookup = VariableLookup.new('a.b.c')
|
142
|
+
assert_equal 'a', lookup.name
|
143
|
+
assert_equal ['b', 'c'], lookup.lookups
|
144
|
+
end
|
139
145
|
end
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liquid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Luetke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description:
|
@@ -47,10 +47,6 @@ extra_rdoc_files:
|
|
47
47
|
- History.md
|
48
48
|
- README.md
|
49
49
|
files:
|
50
|
-
- History.md
|
51
|
-
- MIT-LICENSE
|
52
|
-
- README.md
|
53
|
-
- lib/liquid.rb
|
54
50
|
- lib/liquid/block.rb
|
55
51
|
- lib/liquid/block_body.rb
|
56
52
|
- lib/liquid/condition.rb
|
@@ -68,8 +64,8 @@ files:
|
|
68
64
|
- lib/liquid/module_ex.rb
|
69
65
|
- lib/liquid/parser.rb
|
70
66
|
- lib/liquid/parser_switching.rb
|
71
|
-
- lib/liquid/profiler.rb
|
72
67
|
- lib/liquid/profiler/hooks.rb
|
68
|
+
- lib/liquid/profiler.rb
|
73
69
|
- lib/liquid/range_lookup.rb
|
74
70
|
- lib/liquid/standardfilters.rb
|
75
71
|
- lib/liquid/strainer.rb
|
@@ -96,6 +92,10 @@ files:
|
|
96
92
|
- lib/liquid/variable.rb
|
97
93
|
- lib/liquid/variable_lookup.rb
|
98
94
|
- lib/liquid/version.rb
|
95
|
+
- lib/liquid.rb
|
96
|
+
- MIT-LICENSE
|
97
|
+
- README.md
|
98
|
+
- History.md
|
99
99
|
- test/fixtures/en_locale.yml
|
100
100
|
- test/integration/assign_test.rb
|
101
101
|
- test/integration/blank_test.rb
|
@@ -151,17 +151,17 @@ require_paths:
|
|
151
151
|
- lib
|
152
152
|
required_ruby_version: !ruby/object:Gem::Requirement
|
153
153
|
requirements:
|
154
|
-
- -
|
154
|
+
- - '>='
|
155
155
|
- !ruby/object:Gem::Version
|
156
156
|
version: '0'
|
157
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
158
|
requirements:
|
159
|
-
- -
|
159
|
+
- - '>='
|
160
160
|
- !ruby/object:Gem::Version
|
161
161
|
version: 1.3.7
|
162
162
|
requirements: []
|
163
163
|
rubyforge_project:
|
164
|
-
rubygems_version: 2.
|
164
|
+
rubygems_version: 2.0.3
|
165
165
|
signing_key:
|
166
166
|
specification_version: 4
|
167
167
|
summary: A secure, non-evaling end user template engine with aesthetic markup.
|
@@ -211,3 +211,4 @@ test_files:
|
|
211
211
|
- test/unit/template_unit_test.rb
|
212
212
|
- test/unit/tokenizer_unit_test.rb
|
213
213
|
- test/unit/variable_unit_test.rb
|
214
|
+
has_rdoc:
|