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
liquid/extra/__init__.py DELETED
@@ -1,98 +0,0 @@
1
- from __future__ import annotations # noqa: D104
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- from .filters import JSON
6
- from .filters import BaseTranslateFilter
7
- from .filters import Currency
8
- from .filters import DateTime
9
- from .filters import GetText
10
- from .filters import NGetText
11
- from .filters import NPGetText
12
- from .filters import Number
13
- from .filters import PGetText
14
- from .filters import Translate
15
- from .filters import Unit
16
- from .filters import index
17
- from .filters import script_tag
18
- from .filters import sort_numeric
19
- from .filters import stylesheet_tag
20
- from .tags import BlockTag
21
- from .tags import CallTag
22
- from .tags import ExtendsTag
23
- from .tags import MacroTag
24
- from .tags import SnippetTag
25
- from .tags import TranslateTag
26
- from .tags import WithTag
27
-
28
- if TYPE_CHECKING:
29
- from liquid import Environment
30
-
31
- __all__ = (
32
- "add_filters",
33
- "add_tags_and_filters",
34
- "add_tags",
35
- "BaseTranslateFilter",
36
- "BlockTag",
37
- "CallTag",
38
- "Currency",
39
- "DateTime",
40
- "ExtendsTag",
41
- "GetText",
42
- "index",
43
- "JSON",
44
- "MacroTag",
45
- "NGetText",
46
- "NPGetText",
47
- "Number",
48
- "PGetText",
49
- "script_tag",
50
- "sort_numeric",
51
- "stylesheet_tag",
52
- "SnippetTag",
53
- "Translate",
54
- "Unit",
55
- "WithTag",
56
- )
57
-
58
-
59
- def add_tags(env: Environment) -> None:
60
- """Register all extra tags with the given environment."""
61
- env.add_tag(ExtendsTag)
62
- env.add_tag(BlockTag)
63
- env.add_tag(MacroTag)
64
- env.add_tag(CallTag)
65
- env.add_tag(WithTag)
66
- env.add_tag(TranslateTag)
67
-
68
-
69
- def add_filters(env: Environment) -> None:
70
- """Register all extra filters with an environment with their default options."""
71
- env.add_filter("index", index)
72
- env.add_filter("json", JSON())
73
- env.add_filter("script_tag", script_tag)
74
- env.add_filter("sort_numeric", sort_numeric)
75
- env.add_filter("stylesheet_tag", stylesheet_tag)
76
-
77
- env.filters[GetText.name] = GetText(autoescape_message=env.autoescape)
78
- env.filters[NGetText.name] = NGetText(autoescape_message=env.autoescape)
79
- env.filters[NPGetText.name] = NPGetText(autoescape_message=env.autoescape)
80
- env.filters[PGetText.name] = PGetText(autoescape_message=env.autoescape)
81
- env.filters[Translate.name] = Translate(autoescape_message=env.autoescape)
82
- env.filters["currency"] = Currency()
83
- env.filters["money"] = Currency()
84
- env.filters["money_with_currency"] = Currency(default_format="¤#,##0.00 ¤¤")
85
- env.filters["money_without_currency"] = Currency(default_format="#,##0.00")
86
- env.filters["money_without_trailing_zeros"] = Currency(
87
- default_format="¤#,###",
88
- currency_digits=False,
89
- )
90
- env.filters["datetime"] = DateTime()
91
- env.filters["decimal"] = Number()
92
- env.filters["unit"] = Unit()
93
-
94
-
95
- def add_tags_and_filters(env: Environment) -> None: # pragma: no cover
96
- """Register all extra tags and filters with an environment."""
97
- add_tags(env)
98
- add_filters(env)
@@ -1,33 +0,0 @@
1
- from ._json import JSON # noqa: D104
2
- from .array import index
3
- from .array import sort_numeric
4
- from .babel import Currency
5
- from .babel import DateTime
6
- from .babel import Number
7
- from .babel import Unit
8
- from .html import script_tag
9
- from .html import stylesheet_tag
10
- from .translate import BaseTranslateFilter
11
- from .translate import GetText
12
- from .translate import NGetText
13
- from .translate import NPGetText
14
- from .translate import PGetText
15
- from .translate import Translate
16
-
17
- __all__ = (
18
- "index",
19
- "JSON",
20
- "script_tag",
21
- "sort_numeric",
22
- "stylesheet_tag",
23
- "Currency",
24
- "DateTime",
25
- "Number",
26
- "Unit",
27
- "BaseTranslateFilter",
28
- "GetText",
29
- "NGetText",
30
- "NPGetText",
31
- "PGetText",
32
- "Translate",
33
- )
@@ -1,33 +0,0 @@
1
- """A JSON filter."""
2
-
3
- import json
4
- from typing import Any
5
- from typing import Callable
6
- from typing import Optional
7
-
8
- from liquid.filter import int_arg
9
- from liquid.filter import liquid_filter
10
-
11
-
12
- class JSON:
13
- """Serialize an object to a JSON formatted string.
14
-
15
- Args:
16
- default: A function passed to `json.dumps`. This function is called
17
- in the event that the JSONEncoder does not know how to serialize an
18
- object. Defaults to `None`.
19
- """
20
-
21
- name = "json"
22
-
23
- def __init__(self, default: Optional[Callable[[Any], Any]] = None):
24
- self.default = default
25
-
26
- @liquid_filter
27
- def __call__(
28
- self,
29
- obj: object,
30
- indent: Optional[object] = None,
31
- ) -> str:
32
- indent = int_arg(indent) if indent else None
33
- return json.dumps(obj, default=self.default, indent=indent)
@@ -1,60 +0,0 @@
1
- """Extra array filters."""
2
-
3
- import math
4
- import re
5
- from decimal import Decimal
6
- from operator import getitem
7
- from typing import Any
8
- from typing import Sequence
9
- from typing import Union
10
-
11
- from liquid.filter import array_filter
12
- from liquid.filter import sequence_filter
13
- from liquid.limits import to_int
14
-
15
-
16
- @array_filter
17
- def index(left: Sequence[object], obj: object) -> object:
18
- """Return the zero-based index of an array item.
19
-
20
- `None` is returned if `obj` is not in `left`.
21
- """
22
- try:
23
- return left.index(obj)
24
- except ValueError:
25
- return None
26
-
27
-
28
- RE_NUMERIC = re.compile(r"-?\d+")
29
-
30
-
31
- @sequence_filter
32
- def sort_numeric(left: Sequence[object], key: object = None) -> list[object]:
33
- """Return a copy of `left` sorted by numeric values found in `left`'s items."""
34
- if key:
35
- _key = str(key)
36
- return sorted(left, key=lambda item: _ints(_getitem(item, _key)))
37
- return sorted(left, key=_ints)
38
-
39
-
40
- def _getitem(sequence: Any, key: object, default: object = None) -> Any:
41
- """Item getter for the `sort_numeric` filter."""
42
- try:
43
- return getitem(sequence, key)
44
- except (KeyError, IndexError, TypeError):
45
- return default
46
-
47
-
48
- def _ints(obj: object) -> tuple[Union[int, float, Decimal], ...]:
49
- """Key function for the `sort_numeric` filter."""
50
- if isinstance(obj, bool):
51
- # isinstance(False, int) == True
52
- return (math.inf,)
53
- if isinstance(obj, (int, float, Decimal)):
54
- return (obj,)
55
-
56
- ints = tuple(to_int(n) for n in RE_NUMERIC.findall(str(obj)))
57
-
58
- if not ints:
59
- return (math.inf,)
60
- return ints