python-liquid 2.3.6__py3-none-any.whl → 3.0.0__py3-none-any.whl

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.
Files changed (212) hide show
  1. liquid/__about__.py +1 -0
  2. liquid/__init__.py +161 -187
  3. liquid/_base_tag.py +66 -0
  4. liquid/{utils/chain_map.py → _chain_map.py} +18 -19
  5. liquid/_context.py +465 -0
  6. liquid/_drop.py +108 -0
  7. liquid/_filter.py +174 -0
  8. liquid/_io.py +18 -0
  9. liquid/_lax_parser_mixin.py +100 -0
  10. liquid/_lexer.py +93 -0
  11. liquid/_lexer_extended.py +623 -0
  12. liquid/_lexer_legacy.py +536 -0
  13. liquid/_loader.py +84 -0
  14. liquid/{utils/lru_cache.py → _lru_cache.py} +28 -36
  15. liquid/_markup.py +253 -0
  16. liquid/_messages.py +292 -0
  17. liquid/_missing.py +3 -0
  18. liquid/_nothing.py +28 -0
  19. liquid/_parser.py +460 -0
  20. liquid/_parser_extended.py +293 -0
  21. liquid/_parser_legacy.py +819 -0
  22. liquid/_resource_limits.py +50 -0
  23. liquid/_slice.py +41 -0
  24. liquid/_static_analysis.py +503 -0
  25. liquid/_strftime.py +186 -0
  26. liquid/_template.py +536 -0
  27. liquid/drops/__init__.py +20 -0
  28. liquid/drops/forloop.py +78 -0
  29. liquid/drops/iterable.py +25 -0
  30. liquid/drops/range.py +76 -0
  31. liquid/drops/self_.py +45 -0
  32. liquid/drops/tablerowloop.py +142 -0
  33. liquid/drops/undefined.py +228 -0
  34. liquid/environment.py +717 -551
  35. liquid/exceptions.py +67 -214
  36. liquid/expressions.py +1184 -0
  37. liquid/filters/__init__.py +134 -0
  38. liquid/filters/abs.py +7 -0
  39. liquid/filters/append.py +5 -0
  40. liquid/filters/at_least.py +9 -0
  41. liquid/filters/at_most.py +9 -0
  42. liquid/filters/babel.py +560 -0
  43. liquid/filters/base64.py +26 -0
  44. liquid/filters/capitalize.py +5 -0
  45. liquid/filters/ceil.py +8 -0
  46. liquid/filters/compact.py +25 -0
  47. liquid/filters/concat.py +11 -0
  48. liquid/filters/date.py +27 -0
  49. liquid/filters/default.py +25 -0
  50. liquid/filters/divided_by.py +21 -0
  51. liquid/filters/downcase.py +5 -0
  52. liquid/filters/escape.py +56 -0
  53. liquid/filters/find.py +56 -0
  54. liquid/filters/first.py +19 -0
  55. liquid/filters/floor.py +8 -0
  56. liquid/filters/html.py +23 -0
  57. liquid/filters/index.py +12 -0
  58. liquid/filters/join.py +13 -0
  59. liquid/filters/json_.py +30 -0
  60. liquid/filters/last.py +17 -0
  61. liquid/filters/map.py +5 -0
  62. liquid/filters/minus.py +13 -0
  63. liquid/filters/modulo.py +18 -0
  64. liquid/filters/newline_to_br.py +16 -0
  65. liquid/filters/plus.py +13 -0
  66. liquid/filters/prepend.py +5 -0
  67. liquid/filters/reject.py +19 -0
  68. liquid/filters/remove.py +36 -0
  69. liquid/filters/replace.py +32 -0
  70. liquid/filters/reverse.py +5 -0
  71. liquid/filters/round.py +35 -0
  72. liquid/filters/size.py +25 -0
  73. liquid/filters/slice.py +39 -0
  74. liquid/filters/sort.py +148 -0
  75. liquid/filters/split.py +34 -0
  76. liquid/filters/squish.py +9 -0
  77. liquid/filters/strip.py +13 -0
  78. liquid/filters/strip_html.py +19 -0
  79. liquid/filters/strip_newlines.py +17 -0
  80. liquid/filters/sum.py +21 -0
  81. liquid/filters/times.py +13 -0
  82. liquid/filters/translate.py +380 -0
  83. liquid/filters/truncate.py +39 -0
  84. liquid/filters/uniq.py +11 -0
  85. liquid/filters/upcase.py +5 -0
  86. liquid/filters/url.py +18 -0
  87. liquid/filters/where.py +18 -0
  88. liquid/loaders/__init__.py +17 -0
  89. liquid/loaders/caching_file_system_loader.py +64 -0
  90. liquid/loaders/choice_loader.py +93 -0
  91. liquid/loaders/dict_loader.py +56 -0
  92. liquid/{builtin/loaders → loaders}/file_system_loader.py +51 -55
  93. liquid/{builtin/loaders → loaders}/mixins.py +39 -51
  94. liquid/loaders/package_loader.py +110 -0
  95. liquid/tags/__init__.py +61 -0
  96. liquid/tags/assign.py +68 -0
  97. liquid/tags/capture.py +83 -0
  98. liquid/tags/case.py +199 -0
  99. liquid/tags/comment.py +56 -0
  100. liquid/tags/cycle.py +131 -0
  101. liquid/tags/decrement.py +55 -0
  102. liquid/tags/doc.py +56 -0
  103. liquid/tags/echo.py +65 -0
  104. liquid/tags/else_.py +53 -0
  105. liquid/tags/error.py +51 -0
  106. liquid/tags/extends.py +448 -0
  107. liquid/tags/for_.py +421 -0
  108. liquid/tags/if_.py +156 -0
  109. liquid/tags/ifchanged.py +69 -0
  110. liquid/tags/include.py +223 -0
  111. liquid/tags/increment.py +55 -0
  112. liquid/tags/inline_comment.py +70 -0
  113. liquid/tags/liquid.py +56 -0
  114. liquid/tags/macro.py +281 -0
  115. liquid/tags/output.py +58 -0
  116. liquid/tags/raw.py +60 -0
  117. liquid/tags/render.py +245 -0
  118. liquid/tags/tablerow.py +254 -0
  119. liquid/tags/template_comment.py +56 -0
  120. liquid/tags/translate.py +316 -0
  121. liquid/tags/unless.py +121 -0
  122. liquid/tags/with_.py +83 -0
  123. liquid/tokens.py +370 -0
  124. {python_liquid-2.3.6.dist-info → python_liquid-3.0.0.dist-info}/METADATA +32 -39
  125. python_liquid-3.0.0.dist-info/RECORD +128 -0
  126. {python_liquid-2.3.6.dist-info → python_liquid-3.0.0.dist-info}/WHEEL +1 -1
  127. {python_liquid-2.3.6.dist-info → python_liquid-3.0.0.dist-info}/licenses/LICENSE +1 -1
  128. liquid/analyze_tags.py +0 -214
  129. liquid/ast.py +0 -252
  130. liquid/builtin/__init__.py +0 -203
  131. liquid/builtin/content.py +0 -41
  132. liquid/builtin/drops/__init__.py +0 -3
  133. liquid/builtin/drops/drops.py +0 -13
  134. liquid/builtin/expressions/__init__.py +0 -47
  135. liquid/builtin/expressions/_tokenize.py +0 -186
  136. liquid/builtin/expressions/arguments.py +0 -207
  137. liquid/builtin/expressions/filtered.py +0 -387
  138. liquid/builtin/expressions/logical.py +0 -672
  139. liquid/builtin/expressions/loop.py +0 -275
  140. liquid/builtin/expressions/path.py +0 -163
  141. liquid/builtin/expressions/primitive.py +0 -417
  142. liquid/builtin/filters/__init__.py +0 -0
  143. liquid/builtin/filters/array.py +0 -329
  144. liquid/builtin/filters/extra.py +0 -83
  145. liquid/builtin/filters/math.py +0 -129
  146. liquid/builtin/filters/misc.py +0 -137
  147. liquid/builtin/filters/string.py +0 -416
  148. liquid/builtin/illegal.py +0 -28
  149. liquid/builtin/loaders/__init__.py +0 -0
  150. liquid/builtin/loaders/caching_file_system_loader.py +0 -61
  151. liquid/builtin/loaders/choice_loader.py +0 -94
  152. liquid/builtin/loaders/dict_loader.py +0 -64
  153. liquid/builtin/loaders/package_loader.py +0 -132
  154. liquid/builtin/output.py +0 -74
  155. liquid/builtin/tags/__init__.py +0 -0
  156. liquid/builtin/tags/assign_tag.py +0 -75
  157. liquid/builtin/tags/capture_tag.py +0 -98
  158. liquid/builtin/tags/case_tag.py +0 -287
  159. liquid/builtin/tags/comment_tag.py +0 -77
  160. liquid/builtin/tags/cycle_tag.py +0 -132
  161. liquid/builtin/tags/decrement_tag.py +0 -59
  162. liquid/builtin/tags/doc_tag.py +0 -68
  163. liquid/builtin/tags/echo_tag.py +0 -45
  164. liquid/builtin/tags/for_tag.py +0 -337
  165. liquid/builtin/tags/if_tag.py +0 -209
  166. liquid/builtin/tags/ifchanged_tag.py +0 -94
  167. liquid/builtin/tags/include_tag.py +0 -251
  168. liquid/builtin/tags/increment_tag.py +0 -60
  169. liquid/builtin/tags/inline_comment_tag.py +0 -47
  170. liquid/builtin/tags/liquid_tag.py +0 -183
  171. liquid/builtin/tags/render_tag.py +0 -371
  172. liquid/builtin/tags/tablerow_tag.py +0 -320
  173. liquid/builtin/tags/unless_tag.py +0 -218
  174. liquid/context.py +0 -615
  175. liquid/expression.py +0 -41
  176. liquid/extra/__init__.py +0 -98
  177. liquid/extra/filters/__init__.py +0 -33
  178. liquid/extra/filters/_json.py +0 -33
  179. liquid/extra/filters/array.py +0 -60
  180. liquid/extra/filters/babel.py +0 -552
  181. liquid/extra/filters/html.py +0 -32
  182. liquid/extra/filters/translate.py +0 -448
  183. liquid/extra/tags/__init__.py +0 -17
  184. liquid/extra/tags/_with.py +0 -80
  185. liquid/extra/tags/extends_tag.py +0 -576
  186. liquid/extra/tags/macro_tag.py +0 -270
  187. liquid/extra/tags/snippet_tag.py +0 -107
  188. liquid/extra/tags/translate_tag.py +0 -388
  189. liquid/filter.py +0 -230
  190. liquid/future/__init__.py +0 -3
  191. liquid/future/environment.py +0 -30
  192. liquid/future/filters/__init__.py +0 -1
  193. liquid/future/tags/__init__.py +0 -1
  194. liquid/lex.py +0 -260
  195. liquid/limits.py +0 -66
  196. liquid/loader.py +0 -141
  197. liquid/messages.py +0 -357
  198. liquid/mode.py +0 -12
  199. liquid/output.py +0 -35
  200. liquid/parser.py +0 -119
  201. liquid/span.py +0 -35
  202. liquid/static_analysis.py +0 -443
  203. liquid/stream.py +0 -148
  204. liquid/stringify.py +0 -31
  205. liquid/tag.py +0 -47
  206. liquid/template.py +0 -658
  207. liquid/token.py +0 -145
  208. liquid/undefined.py +0 -218
  209. liquid/utils/__init__.py +0 -15
  210. liquid/utils/html.py +0 -57
  211. liquid/utils/text.py +0 -28
  212. python_liquid-2.3.6.dist-info/RECORD +0 -96
@@ -1,218 +0,0 @@
1
- """The built-in _unless_ tag."""
2
-
3
- from __future__ import annotations
4
-
5
- import sys
6
- from typing import TYPE_CHECKING
7
- from typing import Iterable
8
- from typing import Optional
9
- from typing import TextIO
10
-
11
- from liquid.ast import BlockNode
12
- from liquid.ast import ConditionalBlockNode
13
- from liquid.ast import IllegalNode
14
- from liquid.ast import Node
15
- from liquid.builtin.expressions import BooleanExpression
16
- from liquid.exceptions import LiquidSyntaxError
17
- from liquid.mode import Mode
18
- from liquid.parser import eat_block
19
- from liquid.parser import get_parser
20
- from liquid.tag import Tag
21
- from liquid.token import TOKEN_EOF
22
- from liquid.token import TOKEN_EXPRESSION
23
- from liquid.token import TOKEN_TAG
24
- from liquid.token import Token
25
-
26
- if TYPE_CHECKING:
27
- from liquid import Environment
28
- from liquid.context import RenderContext
29
- from liquid.expression import Expression
30
- from liquid.stream import TokenStream
31
-
32
-
33
- TAG_UNLESS = sys.intern("unless")
34
- TAG_ENDUNLESS = sys.intern("endunless")
35
- TAG_ELSIF = sys.intern("elsif")
36
- TAG_ELSE = sys.intern("else")
37
-
38
- ENDUNLESSBLOCK = frozenset((TAG_ENDUNLESS, TAG_ELSIF, TAG_ELSE, TOKEN_EOF))
39
- ENDELSIFBLOCK = frozenset((TAG_ENDUNLESS, TAG_ELSIF, TAG_ELSE))
40
- ENDUNLESSELSEBLOCK = frozenset((TAG_ENDUNLESS, TAG_ELSIF, TAG_ELSE))
41
-
42
-
43
- class UnlessNode(Node):
44
- """The built-in _unless_ tag."""
45
-
46
- __slots__ = (
47
- "condition",
48
- "consequence",
49
- "alternatives",
50
- "default",
51
- )
52
-
53
- def __init__(
54
- self,
55
- token: Token,
56
- condition: Expression,
57
- consequence: BlockNode,
58
- alternatives: Optional[list[ConditionalBlockNode]] = None,
59
- default: Optional[BlockNode] = None,
60
- ):
61
- super().__init__(token)
62
- self.condition = condition
63
- self.consequence = consequence
64
- self.alternatives = alternatives or []
65
- self.default = default
66
-
67
- self.blank = (
68
- consequence.blank
69
- and all(node.blank for node in self.alternatives)
70
- and (not default or default.blank)
71
- )
72
-
73
- self.consequence.blank = self.blank
74
-
75
- for node in self.alternatives:
76
- node.blank = self.blank
77
-
78
- if self.default:
79
- self.default.blank = self.blank
80
-
81
- def __str__(self) -> str:
82
- alts = "".join(str(alt) for alt in self.alternatives)
83
- default = ""
84
-
85
- if self.default:
86
- default = f"{{% else %}}{self.default}"
87
-
88
- return (
89
- f"{{% unless {self.condition} %}}"
90
- f"{self.consequence}"
91
- f"{alts}"
92
- f"{default}"
93
- f"{{% endunless %}}"
94
- )
95
-
96
- def render_to_output(self, context: RenderContext, buffer: TextIO) -> int:
97
- """Render the node to the output buffer."""
98
- if not self.condition.evaluate(context):
99
- return self.consequence.render(context, buffer)
100
-
101
- for alternative in self.alternatives:
102
- if alternative.expression.evaluate(context):
103
- return alternative.block.render(context, buffer)
104
-
105
- if self.default:
106
- return self.default.render(context, buffer)
107
-
108
- return 0
109
-
110
- async def render_to_output_async(
111
- self, context: RenderContext, buffer: TextIO
112
- ) -> int:
113
- """Render the node to the output buffer."""
114
- if not await self.condition.evaluate_async(context):
115
- return await self.consequence.render_async(context, buffer)
116
-
117
- for alternative in self.alternatives:
118
- if await alternative.expression.evaluate_async(context):
119
- return await alternative.block.render_async(context, buffer)
120
-
121
- if self.default:
122
- return await self.default.render_async(context, buffer)
123
-
124
- return 0
125
-
126
- def children(
127
- self,
128
- static_context: RenderContext, # noqa: ARG002
129
- *,
130
- include_partials: bool = True, # noqa: ARG002
131
- ) -> Iterable[Node]:
132
- """Return this node's children."""
133
- yield self.consequence
134
- yield from self.alternatives
135
- if self.default:
136
- yield self.default
137
-
138
- def expressions(self) -> Iterable[Expression]:
139
- """Return this node's expressions."""
140
- yield self.condition
141
-
142
-
143
- class UnlessTag(Tag):
144
- """The built-in "unless" tag."""
145
-
146
- name = TAG_UNLESS
147
- end = TAG_ENDUNLESS
148
- node_class = UnlessNode
149
-
150
- mode = Mode.LAX
151
- """Tag specific parsing mode, independent from environment tolerance mode."""
152
-
153
- def __init__(self, env: Environment):
154
- super().__init__(env)
155
- self.parser = get_parser(self.env)
156
-
157
- def parse(self, stream: TokenStream) -> Node:
158
- """Parse tokens from _stream_ into an AST node."""
159
- token = stream.eat(TOKEN_TAG)
160
- tokens = stream.into_inner(tag=token)
161
- condition = BooleanExpression.parse(self.env, tokens)
162
- parse_block = get_parser(self.env).parse_block
163
- consequence = parse_block(stream, ENDUNLESSBLOCK)
164
- alternatives = []
165
-
166
- while stream.current.is_tag(TAG_ELSIF):
167
- # If the expression can't be parsed, eat the "elsif" block and
168
- # continue to parse more "elsif" expression, if any.
169
- try:
170
- expr = BooleanExpression.parse(
171
- self.env, stream.into_inner(tag=next(stream))
172
- )
173
- except LiquidSyntaxError as err:
174
- self.env.error(err)
175
- eat_block(stream, ENDELSIFBLOCK)
176
- return IllegalNode(token)
177
-
178
- alt_tok = stream.current
179
- alt_block = parse_block(stream, ENDELSIFBLOCK)
180
-
181
- alternatives.append(
182
- ConditionalBlockNode(alt_tok, expression=expr, block=alt_block)
183
- )
184
-
185
- alternative: Optional[BlockNode] = None
186
-
187
- if stream.current.is_tag(TAG_ELSE):
188
- next(stream)
189
- if stream.current.kind == TOKEN_EXPRESSION:
190
- if self.mode == Mode.LAX:
191
- # Superfluous expressions inside an `else` tag are ignored.
192
- next(stream)
193
- else:
194
- raise LiquidSyntaxError(
195
- "found an 'else' tag expression, did you mean 'elsif'?",
196
- token=stream.current,
197
- )
198
- alternative = parse_block(stream, ENDUNLESSELSEBLOCK)
199
-
200
- # Extraneous `else` and `elsif` blocks are ignored.
201
- if not stream.current.is_tag(TAG_ENDUNLESS) and self.mode == Mode.LAX:
202
- while stream.current.kind != TOKEN_EOF:
203
- if (
204
- stream.current.kind == TOKEN_TAG
205
- and stream.current.value == TAG_ENDUNLESS
206
- ):
207
- break
208
- next(stream)
209
-
210
- stream.expect(TOKEN_TAG, value=TAG_ENDUNLESS)
211
-
212
- return self.node_class(
213
- token=token,
214
- condition=condition,
215
- consequence=consequence,
216
- alternatives=alternatives,
217
- default=alternative,
218
- )