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
@@ -0,0 +1,55 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from ..tokens import TOKEN_TAG_END
6
+
7
+ if TYPE_CHECKING:
8
+ from .._context import RenderContext
9
+ from .._io import StringBuffer
10
+ from .._markup import Expression, Markup, Partial
11
+ from .._parser import Parser
12
+ from ..expressions import Name
13
+ from ..tokens import Token
14
+
15
+
16
+ class DecrementTag:
17
+ blank = False
18
+ tag = "decrement"
19
+
20
+ __slots__ = ("name", "token")
21
+
22
+ def __init__(self, token: Token, name: Name) -> None:
23
+ self.token = token
24
+ self.name = name
25
+
26
+ @staticmethod
27
+ def parse(token: Token, parser: Parser) -> Markup:
28
+ name = parser.parse_identifier()
29
+ parser.carry_whitespace_control()
30
+ parser.eat(TOKEN_TAG_END)
31
+ return DecrementTag(token, name)
32
+
33
+ def render(self, context: RenderContext, buffer: StringBuffer) -> None:
34
+ buffer.write(str(context.decrement(self.name.value)))
35
+
36
+ async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
37
+ buffer.write(str(context.decrement(self.name.value)))
38
+
39
+ def children(self) -> list[Markup]:
40
+ return []
41
+
42
+ def expressions(self) -> list[Expression]:
43
+ return []
44
+
45
+ def block_scope(self) -> list[Name]:
46
+ return []
47
+
48
+ def template_scope(self) -> list[Name]:
49
+ return [self.name]
50
+
51
+ def partials(self, context: RenderContext) -> list[Partial]:
52
+ return []
53
+
54
+ async def partials_async(self, context: RenderContext) -> list[Partial]:
55
+ return []
liquid/tags/doc.py ADDED
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from ..tokens import TOKEN_COMMENT, TOKEN_TAG_END, token_value
6
+
7
+ if TYPE_CHECKING:
8
+ from .._context import RenderContext
9
+ from .._io import StringBuffer
10
+ from .._markup import Expression, Markup, Partial
11
+ from .._parser import Parser
12
+ from ..expressions import Name
13
+ from ..tokens import Token
14
+
15
+
16
+ class DocTag:
17
+ blank = True
18
+ tag = "doc"
19
+
20
+ __slots__ = ("text", "token")
21
+
22
+ def __init__(self, token: Token, text: str) -> None:
23
+ self.token = token
24
+ self.text = text
25
+
26
+ @staticmethod
27
+ def parse(token: Token, parser: Parser) -> Markup:
28
+ parser.carry_whitespace_control()
29
+ parser.eat(TOKEN_TAG_END)
30
+ comment = parser.eat(TOKEN_COMMENT)
31
+ parser.eat_tag_prefix("enddoc")
32
+ return DocTag(token, token_value(comment, parser.source))
33
+
34
+ def render(self, context: RenderContext, buffer: StringBuffer) -> None:
35
+ return None
36
+
37
+ async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
38
+ return None
39
+
40
+ def children(self) -> list[Markup]:
41
+ return []
42
+
43
+ def expressions(self) -> list[Expression]:
44
+ return []
45
+
46
+ def block_scope(self) -> list[Name]:
47
+ return []
48
+
49
+ def template_scope(self) -> list[Name]:
50
+ return []
51
+
52
+ def partials(self, context: RenderContext) -> list[Partial]:
53
+ return []
54
+
55
+ async def partials_async(self, context: RenderContext) -> list[Partial]:
56
+ return []
liquid/tags/echo.py ADDED
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from ..tokens import TOKEN_TAG_END
6
+
7
+ if TYPE_CHECKING:
8
+ from .._context import RenderContext
9
+ from .._io import StringBuffer
10
+ from .._markup import Expression, Markup, Partial
11
+ from .._parser import Parser
12
+ from ..expressions import Name
13
+ from ..tokens import Token
14
+
15
+
16
+ class EchoTag:
17
+ blank = False
18
+ tag = "echo"
19
+
20
+ __slots__ = ("expression", "token")
21
+
22
+ def __init__(self, token: Token, expression: Expression) -> None:
23
+ self.token = token
24
+ self.expression = expression
25
+
26
+ @staticmethod
27
+ def parse(token: Token, parser: Parser) -> Markup:
28
+ expr = parser.parse_filtered_expression()
29
+ parser.carry_whitespace_control()
30
+ parser.eat(TOKEN_TAG_END)
31
+ return EchoTag(token, expr)
32
+
33
+ def render(self, context: RenderContext, buffer: StringBuffer) -> None:
34
+ buffer.write(
35
+ context.env.serialize(
36
+ self.expression.evaluate(context), context, self.expression.span
37
+ )
38
+ )
39
+
40
+ async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
41
+ buffer.write(
42
+ context.env.serialize(
43
+ await self.expression.evaluate_async(context),
44
+ context,
45
+ self.expression.span,
46
+ )
47
+ )
48
+
49
+ def children(self) -> list[Markup]:
50
+ return []
51
+
52
+ def expressions(self) -> list[Expression]:
53
+ return [self.expression]
54
+
55
+ def block_scope(self) -> list[Name]:
56
+ return []
57
+
58
+ def template_scope(self) -> list[Name]:
59
+ return []
60
+
61
+ def partials(self, context: RenderContext) -> list[Partial]:
62
+ return []
63
+
64
+ async def partials_async(self, context: RenderContext) -> list[Partial]:
65
+ return []
liquid/tags/else_.py ADDED
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from .._markup import is_blank_block, render_block, render_block_async
6
+ from ..expressions import BooleanLiteral
7
+
8
+ if TYPE_CHECKING:
9
+ from .._context import RenderContext
10
+ from .._io import StringBuffer
11
+ from .._markup import Block, Expression, Markup, Partial
12
+ from ..expressions import Name
13
+ from ..tokens import Token
14
+
15
+
16
+ class ElseBlock:
17
+ tag = "else"
18
+
19
+ __slots__ = ("blank", "block", "expression", "token")
20
+
21
+ def __init__(self, token: Token, block: Block) -> None:
22
+ self.token = token
23
+ self.block = block
24
+ self.blank = is_blank_block(self.block)
25
+ self.expression = BooleanLiteral(token, True)
26
+
27
+ def render(self, context: RenderContext, buffer: StringBuffer) -> None:
28
+ render_block(self.block, context, buffer)
29
+
30
+ async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
31
+ await render_block_async(self.block, context, buffer)
32
+
33
+ def children(self) -> list[Markup]:
34
+ return [node for node in self.block if not isinstance(node, str)]
35
+
36
+ def expressions(self) -> list[Expression]:
37
+ return []
38
+
39
+ def block_scope(self) -> list[Name]:
40
+ return []
41
+
42
+ def template_scope(self) -> list[Name]:
43
+ return []
44
+
45
+ def partials(self, context: RenderContext) -> list[Partial]:
46
+ return []
47
+
48
+ async def partials_async(self, context: RenderContext) -> list[Partial]:
49
+ return []
50
+
51
+ def filter_strings(self) -> None:
52
+ markup: Block = [node for node in self.block if not isinstance(node, str)]
53
+ self.block = markup
liquid/tags/error.py ADDED
@@ -0,0 +1,51 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ from .._context import RenderContext
7
+ from .._io import StringBuffer
8
+ from .._markup import Expression, Markup, Partial
9
+ from ..exceptions import LiquidSyntaxError
10
+ from ..expressions import Name
11
+ from ..tokens import Token
12
+
13
+
14
+ class ErrorNode:
15
+ blank = True
16
+ tag = ""
17
+
18
+ __slots__ = ("error", "token")
19
+
20
+ def __init__(self, token: Token, err: LiquidSyntaxError) -> None:
21
+ self.token = token
22
+ self.error = err
23
+
24
+ def __str__(self) -> str:
25
+ return self.error.detailed_message()
26
+
27
+ def render(self, context: RenderContext, buffer: StringBuffer) -> None:
28
+ if context.capture_errors:
29
+ raise self.error
30
+
31
+ async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
32
+ if context.capture_errors:
33
+ raise self.error
34
+
35
+ def children(self) -> list[Markup]:
36
+ return []
37
+
38
+ def expressions(self) -> list[Expression]:
39
+ return []
40
+
41
+ def block_scope(self) -> list[Name]:
42
+ return []
43
+
44
+ def template_scope(self) -> list[Name]:
45
+ return []
46
+
47
+ def partials(self, context: RenderContext) -> list[Partial]:
48
+ return []
49
+
50
+ async def partials_async(self, context: RenderContext) -> list[Partial]:
51
+ return []