liquid 5.3.0 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.md +16 -1
- data/README.md +2 -2
- data/lib/liquid/block_body.rb +4 -4
- data/lib/liquid/context.rb +6 -2
- data/lib/liquid/forloop_drop.rb +44 -1
- data/lib/liquid/locales/en.yml +6 -5
- data/lib/liquid/partial_cache.rb +3 -3
- data/lib/liquid/{static_registers.rb → registers.rb} +13 -10
- data/lib/liquid/standardfilters.rb +406 -57
- data/lib/liquid/strainer_factory.rb +4 -0
- data/lib/liquid/strainer_template.rb +4 -0
- data/lib/liquid/tablerowloop_drop.rb +58 -1
- data/lib/liquid/tags/assign.rb +12 -8
- data/lib/liquid/tags/break.rb +8 -0
- data/lib/liquid/tags/capture.rb +13 -10
- data/lib/liquid/tags/case.rb +21 -0
- data/lib/liquid/tags/comment.rb +13 -0
- data/lib/liquid/tags/continue.rb +8 -9
- data/lib/liquid/tags/cycle.rb +12 -11
- data/lib/liquid/tags/decrement.rb +16 -17
- data/lib/liquid/tags/echo.rb +16 -9
- data/lib/liquid/tags/for.rb +22 -43
- data/lib/liquid/tags/if.rb +11 -9
- data/lib/liquid/tags/include.rb +15 -13
- data/lib/liquid/tags/increment.rb +16 -14
- data/lib/liquid/tags/inline_comment.rb +43 -0
- data/lib/liquid/tags/raw.rb +11 -0
- data/lib/liquid/tags/render.rb +29 -4
- data/lib/liquid/tags/table_row.rb +22 -0
- data/lib/liquid/tags/unless.rb +15 -4
- data/lib/liquid/template.rb +2 -3
- data/lib/liquid/variable.rb +4 -4
- data/lib/liquid/variable_lookup.rb +10 -7
- data/lib/liquid/version.rb +1 -1
- data/lib/liquid.rb +2 -2
- metadata +7 -123
- data/lib/liquid/register.rb +0 -6
- data/test/fixtures/en_locale.yml +0 -9
- data/test/integration/assign_test.rb +0 -117
- data/test/integration/blank_test.rb +0 -109
- data/test/integration/block_test.rb +0 -58
- data/test/integration/capture_test.rb +0 -58
- data/test/integration/context_test.rb +0 -634
- data/test/integration/document_test.rb +0 -21
- data/test/integration/drop_test.rb +0 -257
- data/test/integration/error_handling_test.rb +0 -272
- data/test/integration/expression_test.rb +0 -46
- data/test/integration/filter_kwarg_test.rb +0 -24
- data/test/integration/filter_test.rb +0 -189
- data/test/integration/hash_ordering_test.rb +0 -25
- data/test/integration/output_test.rb +0 -125
- data/test/integration/parsing_quirks_test.rb +0 -134
- data/test/integration/profiler_test.rb +0 -240
- data/test/integration/security_test.rb +0 -89
- data/test/integration/standard_filter_test.rb +0 -925
- data/test/integration/tag/disableable_test.rb +0 -59
- data/test/integration/tag_test.rb +0 -45
- data/test/integration/tags/break_tag_test.rb +0 -17
- data/test/integration/tags/continue_tag_test.rb +0 -17
- data/test/integration/tags/echo_test.rb +0 -13
- data/test/integration/tags/for_tag_test.rb +0 -466
- data/test/integration/tags/if_else_tag_test.rb +0 -190
- data/test/integration/tags/include_tag_test.rb +0 -269
- data/test/integration/tags/increment_tag_test.rb +0 -25
- data/test/integration/tags/liquid_tag_test.rb +0 -116
- data/test/integration/tags/raw_tag_test.rb +0 -34
- data/test/integration/tags/render_tag_test.rb +0 -213
- data/test/integration/tags/standard_tag_test.rb +0 -303
- data/test/integration/tags/statements_test.rb +0 -113
- data/test/integration/tags/table_row_test.rb +0 -66
- data/test/integration/tags/unless_else_tag_test.rb +0 -28
- data/test/integration/template_test.rb +0 -340
- data/test/integration/trim_mode_test.rb +0 -563
- data/test/integration/variable_test.rb +0 -138
- data/test/test_helper.rb +0 -207
- data/test/unit/block_unit_test.rb +0 -53
- data/test/unit/condition_unit_test.rb +0 -181
- data/test/unit/file_system_unit_test.rb +0 -37
- data/test/unit/i18n_unit_test.rb +0 -39
- data/test/unit/lexer_unit_test.rb +0 -53
- data/test/unit/parse_tree_visitor_test.rb +0 -261
- data/test/unit/parser_unit_test.rb +0 -84
- data/test/unit/partial_cache_unit_test.rb +0 -128
- data/test/unit/regexp_unit_test.rb +0 -46
- data/test/unit/static_registers_unit_test.rb +0 -156
- data/test/unit/strainer_factory_unit_test.rb +0 -101
- data/test/unit/strainer_template_unit_test.rb +0 -82
- data/test/unit/tag_unit_test.rb +0 -23
- data/test/unit/tags/case_tag_unit_test.rb +0 -12
- data/test/unit/tags/for_tag_unit_test.rb +0 -15
- data/test/unit/tags/if_tag_unit_test.rb +0 -10
- data/test/unit/template_factory_unit_test.rb +0 -12
- data/test/unit/template_unit_test.rb +0 -87
- data/test/unit/tokenizer_unit_test.rb +0 -62
- data/test/unit/variable_unit_test.rb +0 -164
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8408df245a1cc22ee1154fe5387e3e41eb3c740f7277e7d3736c1863d387e47
|
4
|
+
data.tar.gz: 64549a58828fd7e9e0eb7310cb4371e75e64a7c3249fe9ebd021039e3334bba1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29aaff16e3bc464712cdcac3aa205df943132198ef9568d46f4a123d327849f7ead7bd669a095eae0425581eb59ea08874ac38664bf9d8df00b0aa99917c7768
|
7
|
+
data.tar.gz: 9f6070c39733b7f4064f70676b1f886fc61070f3ba8921360b9c5fcdb09c217b3e58c3d59d8293b24b6c18e55899ed17552a2f867ea8eb95e7dee9a7deb29ae5
|
data/History.md
CHANGED
@@ -1,10 +1,25 @@
|
|
1
1
|
# Liquid Change Log
|
2
2
|
|
3
|
+
## 5.4.0 2022-07-29
|
4
|
+
|
5
|
+
### Breaking Changes
|
6
|
+
* Drop support for end-of-life Ruby versions (2.5 and 2.6) (#1578) [Andy Waite]
|
7
|
+
|
8
|
+
### Features
|
9
|
+
* Allow `#` to be used as an inline comment tag (#1498) [CP Clermont]
|
10
|
+
|
11
|
+
### Fixes
|
12
|
+
* `PartialCache` now shares snippet cache with subcontexts by default (#1553) [Chris AtLee]
|
13
|
+
* Hash registers no longer leak into subcontexts as static registers (#1564) [Chris AtLee]
|
14
|
+
* Fix `ParseTreeVisitor` for `with` variable expressions in `Render` tag (#1596) [CP Clermont]
|
15
|
+
|
16
|
+
### Changed
|
17
|
+
* Liquid::Context#registers now always returns a Liquid::Registers object, though supports the most used Hash functions for compatibility (#1553)
|
18
|
+
|
3
19
|
## 5.3.0 2022-03-22
|
4
20
|
|
5
21
|
### Fixes
|
6
22
|
* StandardFilter: Fix missing @context on iterations (#1525) [Thierry Joyal]
|
7
|
-
* Test under Ruby 3.1 (#1533) [petergoldstein]
|
8
23
|
* Fix warning about block and default value in `static_registers.rb` (#1531) [Peter Zhu]
|
9
24
|
|
10
25
|
### Deprecation
|
data/README.md
CHANGED
@@ -63,13 +63,13 @@ when templates are invalid. You can enable this new parser like this:
|
|
63
63
|
|
64
64
|
```ruby
|
65
65
|
Liquid::Template.error_mode = :strict # Raises a SyntaxError when invalid syntax is used
|
66
|
-
Liquid::Template.error_mode = :warn # Adds errors to template.errors but continues as normal
|
66
|
+
Liquid::Template.error_mode = :warn # Adds strict errors to template.errors but continues as normal
|
67
67
|
Liquid::Template.error_mode = :lax # The default mode, accepts almost anything.
|
68
68
|
```
|
69
69
|
|
70
70
|
If you want to set the error mode only on specific templates you can pass `:error_mode` as an option to `parse`:
|
71
71
|
```ruby
|
72
|
-
Liquid::Template.parse(source, :
|
72
|
+
Liquid::Template.parse(source, error_mode: :strict)
|
73
73
|
```
|
74
74
|
This is useful for doing things like enabling strict mode only in the theme editor.
|
75
75
|
|
data/lib/liquid/block_body.rb
CHANGED
@@ -4,8 +4,8 @@ require 'English'
|
|
4
4
|
|
5
5
|
module Liquid
|
6
6
|
class BlockBody
|
7
|
-
LiquidTagToken = /\A\s*(
|
8
|
-
FullToken = /\A#{TagStart}#{WhitespaceControl}?(\s*)(
|
7
|
+
LiquidTagToken = /\A\s*(#{TagName})\s*(.*?)\z/o
|
8
|
+
FullToken = /\A#{TagStart}#{WhitespaceControl}?(\s*)(#{TagName})(\s*)(.*?)#{WhitespaceControl}?#{TagEnd}\z/om
|
9
9
|
ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om
|
10
10
|
WhitespaceOrNothing = /\A\s*\z/
|
11
11
|
TAGSTART = "{%"
|
@@ -37,7 +37,7 @@ module Liquid
|
|
37
37
|
|
38
38
|
private def parse_for_liquid_tag(tokenizer, parse_context)
|
39
39
|
while (token = tokenizer.shift)
|
40
|
-
unless token.empty? || token
|
40
|
+
unless token.empty? || token.match?(WhitespaceOrNothing)
|
41
41
|
unless token =~ LiquidTagToken
|
42
42
|
# line isn't empty but didn't match tag syntax, yield and let the
|
43
43
|
# caller raise a syntax error
|
@@ -150,7 +150,7 @@ module Liquid
|
|
150
150
|
end
|
151
151
|
parse_context.trim_whitespace = false
|
152
152
|
@nodelist << token
|
153
|
-
@blank &&=
|
153
|
+
@blank &&= token.match?(WhitespaceOrNothing)
|
154
154
|
end
|
155
155
|
parse_context.line_number = tokenizer.line_number
|
156
156
|
end
|
data/lib/liquid/context.rb
CHANGED
@@ -28,7 +28,7 @@ module Liquid
|
|
28
28
|
|
29
29
|
@static_environments = [static_environments].flat_map(&:freeze).freeze
|
30
30
|
@scopes = [(outer_scope || {})]
|
31
|
-
@registers = registers
|
31
|
+
@registers = registers.is_a?(Registers) ? registers : Registers.new(registers)
|
32
32
|
@errors = []
|
33
33
|
@partial = false
|
34
34
|
@strict_variables = false
|
@@ -39,6 +39,10 @@ module Liquid
|
|
39
39
|
@global_filter = nil
|
40
40
|
@disabled_tags = {}
|
41
41
|
|
42
|
+
@registers.static[:cached_partials] ||= {}
|
43
|
+
@registers.static[:file_system] ||= Liquid::Template.file_system
|
44
|
+
@registers.static[:template_factory] ||= Liquid::TemplateFactory.new
|
45
|
+
|
42
46
|
self.exception_renderer = Template.default_exception_renderer
|
43
47
|
if rethrow_errors
|
44
48
|
self.exception_renderer = Liquid::RAISE_EXCEPTION_LAMBDA
|
@@ -140,7 +144,7 @@ module Liquid
|
|
140
144
|
self.class.build(
|
141
145
|
resource_limits: resource_limits,
|
142
146
|
static_environments: static_environments,
|
143
|
-
registers:
|
147
|
+
registers: Registers.new(registers)
|
144
148
|
).tap do |subcontext|
|
145
149
|
subcontext.base_scope_depth = base_scope_depth + 1
|
146
150
|
subcontext.exception_renderer = exception_renderer
|
data/lib/liquid/forloop_drop.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Liquid
|
4
|
+
# @liquid_public_docs
|
5
|
+
# @liquid_type object
|
6
|
+
# @liquid_name forloop
|
7
|
+
# @liquid_summary
|
8
|
+
# Information about a parent [`for` loop](/api/liquid/tags#for).
|
4
9
|
class ForloopDrop < Drop
|
5
10
|
def initialize(name, length, parentloop)
|
6
11
|
@name = name
|
@@ -9,33 +14,71 @@ module Liquid
|
|
9
14
|
@index = 0
|
10
15
|
end
|
11
16
|
|
12
|
-
|
17
|
+
# @liquid_public_docs
|
18
|
+
# @liquid_name length
|
19
|
+
# @liquid_summary
|
20
|
+
# The total number of iterations in the loop.
|
21
|
+
# @liquid_return [number]
|
22
|
+
attr_reader :length
|
23
|
+
|
24
|
+
# @liquid_public_docs
|
25
|
+
# @liquid_name parentloop
|
26
|
+
# @liquid_summary
|
27
|
+
# The parent `forloop` object.
|
28
|
+
# @liquid_description
|
29
|
+
# If the current `for` loop isn't nested inside another `for` loop, then `nil` is returned.
|
30
|
+
# @liquid_return [forloop]
|
31
|
+
attr_reader :parentloop
|
13
32
|
|
14
33
|
def name
|
15
34
|
Usage.increment('forloop_drop_name')
|
16
35
|
@name
|
17
36
|
end
|
18
37
|
|
38
|
+
# @liquid_public_docs
|
39
|
+
# @liquid_summary
|
40
|
+
# The 1-based index of the current iteration.
|
41
|
+
# @liquid_return [number]
|
19
42
|
def index
|
20
43
|
@index + 1
|
21
44
|
end
|
22
45
|
|
46
|
+
# @liquid_public_docs
|
47
|
+
# @liquid_summary
|
48
|
+
# The 0-based index of the current iteration.
|
49
|
+
# @liquid_return [number]
|
23
50
|
def index0
|
24
51
|
@index
|
25
52
|
end
|
26
53
|
|
54
|
+
# @liquid_public_docs
|
55
|
+
# @liquid_summary
|
56
|
+
# The 1-based index of the current iteration, in reverse order.
|
57
|
+
# @liquid_return [number]
|
27
58
|
def rindex
|
28
59
|
@length - @index
|
29
60
|
end
|
30
61
|
|
62
|
+
# @liquid_public_docs
|
63
|
+
# @liquid_summary
|
64
|
+
# The 0-based index of the current iteration, in reverse order.
|
65
|
+
# @liquid_return [number]
|
31
66
|
def rindex0
|
32
67
|
@length - @index - 1
|
33
68
|
end
|
34
69
|
|
70
|
+
# @liquid_public_docs
|
71
|
+
# @liquid_summary
|
72
|
+
# Returns `true` if the current iteration is the first. Returns `false` if not.
|
73
|
+
# @liquid_return [boolean]
|
35
74
|
def first
|
36
75
|
@index == 0
|
37
76
|
end
|
38
77
|
|
78
|
+
# @liquid_public_docs
|
79
|
+
# @liquid_summary
|
80
|
+
# Returns `true` if the current iteration is the last. Returns `false` if not.
|
81
|
+
# @liquid_return [boolean]
|
39
82
|
def last
|
40
83
|
@index == @length - 1
|
41
84
|
end
|
data/lib/liquid/locales/en.yml
CHANGED
@@ -13,15 +13,16 @@
|
|
13
13
|
for_invalid_attribute: "Invalid attribute in for loop. Valid attributes are limit and offset"
|
14
14
|
if: "Syntax Error in tag 'if' - Valid syntax: if [expression]"
|
15
15
|
include: "Error in tag 'include' - Valid syntax: include '[template]' (with|for) [object|collection]"
|
16
|
-
|
16
|
+
inline_comment_invalid: "Syntax error in tag '#' - Each line of comments must be prefixed by the '#' character"
|
17
17
|
invalid_delimiter: "'%{tag}' is not a valid delimiter for %{block_name} tags. use %{block_delimiter}"
|
18
|
+
render: "Syntax error in tag 'render' - Template name must be a quoted string"
|
19
|
+
table_row: "Syntax Error in 'table_row loop' - Valid syntax: table_row [item] in [collection] cols=3"
|
20
|
+
tag_never_closed: "'%{block_name}' tag was never closed"
|
21
|
+
tag_termination: "Tag '%{token}' was not properly terminated with regexp: %{tag_end}"
|
18
22
|
unexpected_else: "%{block_name} tag does not expect 'else' tag"
|
19
23
|
unexpected_outer_tag: "Unexpected outer '%{tag}' tag"
|
20
|
-
|
24
|
+
unknown_tag: "Unknown tag '%{tag}'"
|
21
25
|
variable_termination: "Variable '%{token}' was not properly terminated with regexp: %{tag_end}"
|
22
|
-
tag_never_closed: "'%{block_name}' tag was never closed"
|
23
|
-
table_row: "Syntax Error in 'table_row loop' - Valid syntax: table_row [item] in [collection] cols=3"
|
24
|
-
render: "Syntax error in tag 'render' - Template name must be a quoted string"
|
25
26
|
argument:
|
26
27
|
include: "Argument error in tag 'include' - Illegal template name"
|
27
28
|
disabled:
|
data/lib/liquid/partial_cache.rb
CHANGED
@@ -3,16 +3,16 @@
|
|
3
3
|
module Liquid
|
4
4
|
class PartialCache
|
5
5
|
def self.load(template_name, context:, parse_context:)
|
6
|
-
cached_partials =
|
6
|
+
cached_partials = context.registers[:cached_partials]
|
7
7
|
cached = cached_partials[template_name]
|
8
8
|
return cached if cached
|
9
9
|
|
10
|
-
file_system =
|
10
|
+
file_system = context.registers[:file_system]
|
11
11
|
source = file_system.read_template_file(template_name)
|
12
12
|
|
13
13
|
parse_context.partial = true
|
14
14
|
|
15
|
-
template_factory =
|
15
|
+
template_factory = context.registers[:template_factory]
|
16
16
|
template = template_factory.for(template_name)
|
17
17
|
|
18
18
|
partial = template.parse(source, parse_context)
|
@@ -1,35 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Liquid
|
4
|
-
class
|
4
|
+
class Registers
|
5
5
|
attr_reader :static
|
6
6
|
|
7
7
|
def initialize(registers = {})
|
8
|
-
@static
|
9
|
-
@
|
8
|
+
@static = registers.is_a?(Registers) ? registers.static : registers
|
9
|
+
@changes = {}
|
10
10
|
end
|
11
11
|
|
12
12
|
def []=(key, value)
|
13
|
-
@
|
13
|
+
@changes[key] = value
|
14
14
|
end
|
15
15
|
|
16
16
|
def [](key)
|
17
|
-
if @
|
18
|
-
@
|
17
|
+
if @changes.key?(key)
|
18
|
+
@changes[key]
|
19
19
|
else
|
20
20
|
@static[key]
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def delete(key)
|
25
|
-
@
|
25
|
+
@changes.delete(key)
|
26
26
|
end
|
27
27
|
|
28
28
|
UNDEFINED = Object.new
|
29
29
|
|
30
30
|
def fetch(key, default = UNDEFINED, &block)
|
31
|
-
if @
|
32
|
-
@
|
31
|
+
if @changes.key?(key)
|
32
|
+
@changes.fetch(key)
|
33
33
|
elsif default != UNDEFINED
|
34
34
|
if block_given?
|
35
35
|
@static.fetch(key, &block)
|
@@ -42,7 +42,10 @@ module Liquid
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def key?(key)
|
45
|
-
@
|
45
|
+
@changes.key?(key) || @static.key?(key)
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
# Alias for backwards compatibility
|
50
|
+
StaticRegisters = Registers
|
48
51
|
end
|