liquid 5.7.2 → 5.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eedf7295997cbab7b8d526eb516c8c34aa4a73c8b943d69ee4363cb1684a9d12
4
- data.tar.gz: 335b1d05b70f581e05730e6a21f71a22a83283ac6135e4f29dbab962063e9e90
3
+ metadata.gz: d27b4c9417e479c5eec775f4ec1e5dd6165a2fb5fe76a8b769b31bc5acaff334
4
+ data.tar.gz: 77aef473425cf804dd4dfe1a17f00a424e70e30143952c9670c20d947fa038aa
5
5
  SHA512:
6
- metadata.gz: e62a54477a5e5c1baba527b412d5009e892bf082c085de5416a88073fffc488576d6842615b1f7f7332d2bd02ccb1ff73bb3e2add22ec57be732d74e5178b389
7
- data.tar.gz: aacf9a3490e2739a7a2ff738fee2d610dd833c5a2a763830c63de2972420687bb4989934d438ee4635d6251b1c0d8ac9eeb4a28a358255b7eeef40b49e30c340
6
+ metadata.gz: 40f39337b8767db07e12beb2aa2a155a3bfb975752e02a09626b7fe3d53ef73c0c79252f29f2cb4a6edc63b8f0afff06d0df663d9a74d27a1f9507efd5db4a2c
7
+ data.tar.gz: 350ee158bdd4dabfb8781c937ca6426ee06cbaaedaffa469aa324fe717d7b7fbbf1f7a82aebd61a0bd9f96bc0ae4a94e887115385d1ca1f9c76aa2613ef88881
data/History.md CHANGED
@@ -1,22 +1,30 @@
1
1
  # Liquid Change Log
2
2
 
3
- ## 5.8.0 (unreleased)
3
+ ## 5.8.1 (unreleased)
4
+
5
+ ## 5.8.0
6
+
7
+ * Introduce the new `{% doc %}` tag [Guilherme Carreiro]
8
+
9
+ ## 5.7.3
10
+
11
+ * Raise Liquid::SyntaxError when parsing invalidly encoded strings [Chris AtLee]
4
12
 
5
13
  ## 5.7.2 2025-01-31
6
14
 
7
- * Fix array filters to not support nested properties
15
+ * Fix array filters to not support nested properties [Guilherme Carreiro]
8
16
 
9
17
  ## 5.7.1 2025-01-24
10
18
 
11
- * Fix the `find` and `find_index`filters to return `nil` when filtering empty arrays
12
- * Fix the `has` filter to return `false` when filtering empty arrays
19
+ * Fix the `find` and `find_index`filters to return `nil` when filtering empty arrays [Guilherme Carreiro]
20
+ * Fix the `has` filter to return `false` when filtering empty arrays [Guilherme Carreiro]
13
21
 
14
22
  ## 5.7.0 2025-01-16
15
23
 
16
24
  ### Features
17
25
 
18
- * Add `find`, `find_index`, `has`, and `reject` filters to arrays
19
- * Compatibility with Ruby 3.4
26
+ * Add `find`, `find_index`, `has`, and `reject` filters to arrays [Guilherme Carreiro]
27
+ * Compatibility with Ruby 3.4 [Ian Ker-Seymer]
20
28
 
21
29
  ## 5.6.4 2025-01-14
22
30
 
data/lib/liquid/lexer.rb CHANGED
@@ -161,6 +161,12 @@ module Liquid
161
161
  end
162
162
  # rubocop:enable Metrics/BlockNesting
163
163
  output << EOS
164
+ rescue ::ArgumentError => e
165
+ if e.message == "invalid byte sequence in #{ss.string.encoding}"
166
+ raise SyntaxError, "Invalid byte sequence in #{ss.string.encoding}"
167
+ else
168
+ raise
169
+ end
164
170
  end
165
171
 
166
172
  def raise_syntax_error(start_pos, ss)
@@ -2,12 +2,14 @@
2
2
  errors:
3
3
  syntax:
4
4
  tag_unexpected_args: "Syntax Error in '%{tag}' - Valid syntax: %{tag}"
5
+ block_tag_unexpected_args: "Syntax Error in '%{tag}' - Valid syntax: {% %{tag} %}{% end%{tag} %}"
5
6
  assign: "Syntax Error in 'assign' - Valid syntax: assign [var] = [source]"
6
7
  capture: "Syntax Error in 'capture' - Valid syntax: capture [var]"
7
8
  case: "Syntax Error in 'case' - Valid syntax: case [condition]"
8
9
  case_invalid_when: "Syntax Error in tag 'case' - Valid when condition: {% when [condition] [or condition2...] %}"
9
10
  case_invalid_else: "Syntax Error in tag 'case' - Valid else condition: {% else %} (no parameters) "
10
11
  cycle: "Syntax Error in 'cycle' - Valid syntax: cycle [name :] var [, var2, var3 ...]"
12
+ doc_invalid_nested: "Syntax Error in 'doc' - Nested doc tags are not allowed"
11
13
  for: "Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]"
12
14
  for_invalid_in: "For loops require an 'in' clause"
13
15
  for_invalid_attribute: "Invalid attribute in for loop. Valid attributes are limit and offset"
@@ -456,7 +456,7 @@ module Liquid
456
456
  # Tests if any item in an array has a specific property value.
457
457
  # @liquid_description
458
458
  # This requires you to provide both the property name and the associated value.
459
- # @liquid_syntax array | some: string, string
459
+ # @liquid_syntax array | has: string, string
460
460
  # @liquid_return [boolean]
461
461
  def has(input, property, target_value = nil)
462
462
  filter_array(input, property, target_value, false) { |ary, &block| ary.any?(&block) }
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Liquid
4
+ # @liquid_public_docs
5
+ # @liquid_type tag
6
+ # @liquid_category syntax
7
+ # @liquid_name doc
8
+ # @liquid_summary
9
+ # Documents template elements with annotations.
10
+ # @liquid_description
11
+ # The `doc` tag allows developers to include documentation within Liquid
12
+ # templates. Any content inside `doc` tags is not rendered or outputted.
13
+ # Liquid code inside will be parsed but not executed. This facilitates
14
+ # tooling support for features like code completion, linting, and inline
15
+ # documentation.
16
+ # @liquid_syntax
17
+ # {% doc %}
18
+ # Renders a message.
19
+ #
20
+ # @param {string} foo - A foo value.
21
+ # @param {string} [bar] - An optional bar value.
22
+ #
23
+ # @example
24
+ # {% render 'message', foo: 'Hello', bar: 'World' %}
25
+ # {% enddoc %}
26
+ # {{ foo }}, {{ bar }}!
27
+ class Doc < Block
28
+ NO_UNEXPECTED_ARGS = /\A\s*\z/
29
+
30
+ def initialize(tag_name, markup, parse_context)
31
+ super
32
+ ensure_valid_markup(tag_name, markup, parse_context)
33
+ end
34
+
35
+ def parse(tokens)
36
+ while (token = tokens.shift)
37
+ tag_name = token =~ BlockBody::FullTokenPossiblyInvalid && Regexp.last_match(2)
38
+
39
+ raise_nested_doc_error if tag_name == @tag_name
40
+
41
+ if tag_name == block_delimiter
42
+ parse_context.trim_whitespace = (token[-3] == WhitespaceControl)
43
+ return
44
+ end
45
+ end
46
+
47
+ raise_tag_never_closed(block_name)
48
+ end
49
+
50
+ def render_to_output_buffer(_context, output)
51
+ output
52
+ end
53
+
54
+ def blank?
55
+ true
56
+ end
57
+
58
+ private
59
+
60
+ def ensure_valid_markup(tag_name, markup, parse_context)
61
+ unless NO_UNEXPECTED_ARGS.match?(markup)
62
+ raise SyntaxError, parse_context.locale.t("errors.syntax.block_tag_unexpected_args", tag: tag_name)
63
+ end
64
+ end
65
+
66
+ def raise_nested_doc_error
67
+ raise SyntaxError, parse_context.locale.t("errors.syntax.doc_invalid_nested")
68
+ end
69
+ end
70
+ end
data/lib/liquid/tags.rb CHANGED
@@ -19,6 +19,7 @@ require_relative "tags/comment"
19
19
  require_relative "tags/raw"
20
20
  require_relative "tags/render"
21
21
  require_relative "tags/cycle"
22
+ require_relative "tags/doc"
22
23
 
23
24
  module Liquid
24
25
  module Tags
@@ -42,6 +43,7 @@ module Liquid
42
43
  'if' => If,
43
44
  'echo' => Echo,
44
45
  'tablerow' => TableRow,
46
+ 'doc' => Doc,
45
47
  }.freeze
46
48
  end
47
49
  end
@@ -103,6 +103,12 @@ module Liquid
103
103
 
104
104
  pos = @ss.pos -= 2
105
105
  @source.byteslice(start, pos - start)
106
+ rescue ::ArgumentError => e
107
+ if e.message == "invalid byte sequence in #{@ss.string.encoding}"
108
+ raise SyntaxError, "Invalid byte sequence in #{@ss.string.encoding}"
109
+ else
110
+ raise
111
+ end
106
112
  end
107
113
 
108
114
  def next_variable_token
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Liquid
5
- VERSION = "5.7.2"
5
+ VERSION = "5.8.0"
6
6
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liquid
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.7.2
4
+ version: 5.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Lütke
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-01-31 00:00:00.000000000 Z
10
+ date: 2025-02-25 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: strscan
@@ -120,6 +120,7 @@ files:
120
120
  - lib/liquid/tags/continue.rb
121
121
  - lib/liquid/tags/cycle.rb
122
122
  - lib/liquid/tags/decrement.rb
123
+ - lib/liquid/tags/doc.rb
123
124
  - lib/liquid/tags/echo.rb
124
125
  - lib/liquid/tags/for.rb
125
126
  - lib/liquid/tags/if.rb