ya-tagscript 1.4.2__tar.gz → 1.4.3__tar.gz

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 (194) hide show
  1. ya_tagscript-1.4.3/.github/dependabot.yml +14 -0
  2. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.github/workflows/black.yml +1 -1
  3. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.github/workflows/publish.yml +3 -3
  4. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.github/workflows/test.yml +2 -2
  5. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.pre-commit-config.yaml +7 -1
  6. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/CHANGELOG.md +8 -0
  7. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/PKG-INFO +6 -3
  8. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/README.md +2 -2
  9. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/_ext/glossary_backlink_checker.py +2 -2
  10. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/conf.py +1 -1
  11. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/make_release.py +6 -6
  12. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/pyproject.toml +10 -7
  13. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/discord/cooldown_block.py +2 -1
  14. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/discord/embed_block.py +2 -2
  15. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/math/math_block.py +3 -3
  16. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/urlencode_block.py +2 -2
  17. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interfaces/blockabc.py +1 -1
  18. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/interpreter.py +3 -1
  19. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/parse_state.py +2 -2
  20. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/util/conditionals.py +3 -1
  21. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/.coveragerc +0 -1
  22. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/discord_adapters/test_guild_adapter.py +4 -4
  23. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/test_int_adapter.py +1 -1
  24. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/test_string_adapter.py +4 -4
  25. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/actions/test_command_block.py +12 -22
  26. ya_tagscript-1.4.3/tests/ya_tagscript/blocks/actions/test_override_block.py +87 -0
  27. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/actions/test_react_block.py +111 -144
  28. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/conditional/test_all_block.py +1 -1
  29. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/conditional/test_if_block.py +18 -67
  30. ya_tagscript-1.4.3/tests/ya_tagscript/blocks/discord/test_embed_block.py +1010 -0
  31. ya_tagscript-1.4.3/tests/ya_tagscript/blocks/math/test_math_block.py +404 -0
  32. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/rng/test_random_block.py +32 -45
  33. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_substring_block.py +24 -51
  34. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_urlencode_block.py +2 -2
  35. ya_tagscript-1.4.3/tests/ya_tagscript/blocks/time/test_timedelta_block.py +502 -0
  36. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/interpreter/test_ts_parser.py +5 -5
  37. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/uv.lock +86 -65
  38. ya_tagscript-1.4.2/tests/ya_tagscript/blocks/actions/test_override_block.py +0 -100
  39. ya_tagscript-1.4.2/tests/ya_tagscript/blocks/discord/test_embed_block.py +0 -2129
  40. ya_tagscript-1.4.2/tests/ya_tagscript/blocks/math/test_math_block.py +0 -1366
  41. ya_tagscript-1.4.2/tests/ya_tagscript/blocks/time/test_timedelta_block.py +0 -598
  42. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.gitignore +0 -0
  43. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.python-version +0 -0
  44. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/.readthedocs.yaml +0 -0
  45. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/LICENSE.md +0 -0
  46. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/Makefile +0 -0
  47. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/_ext/styled_list_directive.py +0 -0
  48. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/adapters.rst +0 -0
  49. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/blocks.rst +0 -0
  50. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/changelog.rst +0 -0
  51. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/code_examples/adapters/int_adapter_example.py +0 -0
  52. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/code_examples/adapters/member_adapter_example.py +0 -0
  53. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/code_examples/nested_blocks_example.py +0 -0
  54. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/code_examples/quickstart_example.py +0 -0
  55. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/credits.rst +0 -0
  56. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/exceptions.rst +0 -0
  57. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/glossary.rst +0 -0
  58. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/index.rst +0 -0
  59. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/interfaces.rst +0 -0
  60. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/interpreter.rst +0 -0
  61. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/intro.rst +0 -0
  62. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/make.bat +0 -0
  63. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/numeric_parser.rst +0 -0
  64. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/quickstart.rst +0 -0
  65. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/docs/requirements.txt +0 -0
  66. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/__init__.py +0 -0
  67. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/__init__.py +0 -0
  68. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/__init__.py +0 -0
  69. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/discord_adapters/__init__.py +0 -0
  70. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/discord_adapters/attribute_adapter.py +0 -0
  71. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/discord_adapters/channel_adapter.py +0 -0
  72. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/discord_adapters/guild_adapter.py +0 -0
  73. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/discord_adapters/member_adapter.py +0 -0
  74. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/function_adapter.py +0 -0
  75. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/int_adapter.py +0 -0
  76. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/object_adapter.py +0 -0
  77. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/adapters/string_adapter.py +0 -0
  78. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/__init__.py +0 -0
  79. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/__init__.py +0 -0
  80. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/command_block.py +0 -0
  81. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/delete_block.py +0 -0
  82. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/override_block.py +0 -0
  83. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/react_block.py +0 -0
  84. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/redirect_block.py +0 -0
  85. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/actions/silence_block.py +0 -0
  86. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/conditional/__init__.py +0 -0
  87. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/conditional/all_block.py +0 -0
  88. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/conditional/any_block.py +0 -0
  89. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/conditional/if_block.py +0 -0
  90. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/discord/__init__.py +0 -0
  91. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/flow/__init__.py +0 -0
  92. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/flow/break_block.py +0 -0
  93. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/flow/shortcutredirect_block.py +0 -0
  94. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/flow/stop_block.py +0 -0
  95. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/limiters/__init__.py +0 -0
  96. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/limiters/blacklist_block.py +0 -0
  97. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/limiters/require_block.py +0 -0
  98. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/lists/__init__.py +0 -0
  99. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/lists/cycle_block.py +0 -0
  100. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/lists/list_block.py +0 -0
  101. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/math/__init__.py +0 -0
  102. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/math/ordinal_block.py +0 -0
  103. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/meta/__init__.py +0 -0
  104. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/meta/comment_block.py +0 -0
  105. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/meta/debug_block.py +0 -0
  106. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/rng/__init__.py +0 -0
  107. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/rng/fiftyfifty_block.py +0 -0
  108. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/rng/random_block.py +0 -0
  109. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/rng/range_block.py +0 -0
  110. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/__init__.py +0 -0
  111. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/case_block.py +0 -0
  112. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/join_block.py +0 -0
  113. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/python_block.py +0 -0
  114. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/replace_block.py +0 -0
  115. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/substring_block.py +0 -0
  116. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/strings/urldecode_block.py +0 -0
  117. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/time/__init__.py +0 -0
  118. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/time/strf_block.py +0 -0
  119. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/time/timedelta_block.py +0 -0
  120. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/variables/__init__.py +0 -0
  121. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/variables/assign_block.py +0 -0
  122. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/variables/loose_variable_getter_block.py +0 -0
  123. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/blocks/variables/strict_variable_getter_block.py +0 -0
  124. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/exceptions/__init__.py +0 -0
  125. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/exceptions/exceptions.py +0 -0
  126. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interfaces/__init__.py +0 -0
  127. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interfaces/adapterabc.py +0 -0
  128. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interfaces/interpreterabc.py +0 -0
  129. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interfaces/nodeabc.py +0 -0
  130. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/__init__.py +0 -0
  131. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/context.py +0 -0
  132. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/node.py +0 -0
  133. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/response.py +0 -0
  134. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/interpreter/ts_parser.py +0 -0
  135. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/py.typed +0 -0
  136. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/util/__init__.py +0 -0
  137. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/util/escaping.py +0 -0
  138. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/src/ya_tagscript/util/splitter.py +0 -0
  139. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/__init__.py +0 -0
  140. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/__init__.py +0 -0
  141. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/__init__.py +0 -0
  142. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/discord_adapters/__init__.py +0 -0
  143. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/discord_adapters/test_attribute_adapter.py +0 -0
  144. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/discord_adapters/test_channel_adapter.py +0 -0
  145. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/discord_adapters/test_member_adapter.py +0 -0
  146. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/test_function_adapter.py +0 -0
  147. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/adapters/test_object_adapter.py +0 -0
  148. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/__init__.py +0 -0
  149. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/actions/__init__.py +0 -0
  150. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/actions/test_delete_block.py +0 -0
  151. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/actions/test_redirect_block.py +0 -0
  152. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/actions/test_silence_block.py +0 -0
  153. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/conditional/__init__.py +0 -0
  154. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/conditional/test_any_block.py +0 -0
  155. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/discord/__init__.py +0 -0
  156. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/discord/test_cooldown_block.py +0 -0
  157. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/flow/__init__.py +0 -0
  158. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/flow/test_break_block.py +0 -0
  159. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/flow/test_shortcutredirect_block.py +0 -0
  160. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/flow/test_stop_block.py +0 -0
  161. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/limiters/__init__.py +0 -0
  162. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/limiters/test_blacklist_block.py +0 -0
  163. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/limiters/test_require_block.py +0 -0
  164. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/lists/__init__.py +0 -0
  165. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/lists/test_cycle_block.py +0 -0
  166. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/lists/test_list_block.py +0 -0
  167. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/math/__init__.py +0 -0
  168. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/math/test_ordinal_block.py +0 -0
  169. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/meta/__init__.py +0 -0
  170. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/meta/test_comment_block.py +0 -0
  171. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/meta/test_debug_block.py +0 -0
  172. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/rng/__init__.py +0 -0
  173. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/rng/test_fiftyfifty_block.py +0 -0
  174. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/rng/test_range_block.py +0 -0
  175. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/__init__.py +0 -0
  176. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_case_block.py +0 -0
  177. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_join_block.py +0 -0
  178. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_python_block.py +0 -0
  179. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_replace_block.py +0 -0
  180. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/strings/test_urldecode_block.py +0 -0
  181. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/time/__init__.py +0 -0
  182. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/time/test_strf_block.py +0 -0
  183. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/variables/__init__.py +0 -0
  184. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/variables/test_assign_block.py +0 -0
  185. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/variables/test_loose_variable_getter_block.py +0 -0
  186. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/blocks/variables/test_strict_variable_getter_block.py +0 -0
  187. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/interpreter/__init__.py +0 -0
  188. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/interpreter/test_interpreter.py +0 -0
  189. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/interpreter/test_node.py +0 -0
  190. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/interpreter/test_parse_state.py +0 -0
  191. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/util/__init__.py +0 -0
  192. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/util/test_conditionals.py +0 -0
  193. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/util/test_escaping.py +0 -0
  194. {ya_tagscript-1.4.2 → ya_tagscript-1.4.3}/tests/ya_tagscript/util/test_splitter.py +0 -0
@@ -0,0 +1,14 @@
1
+ # Set update schedule for GitHub Actions
2
+
3
+ version: 2
4
+ updates:
5
+
6
+ - package-ecosystem: github-actions
7
+ directory: /
8
+ groups:
9
+ github-actions:
10
+ patterns:
11
+ - "*"
12
+ schedule:
13
+ # Check for updates to GitHub Actions every week
14
+ interval: weekly
@@ -12,7 +12,7 @@ jobs:
12
12
  python-version: [ "3.11", "3.12", "3.13" ]
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v4
15
+ - uses: actions/checkout@v5
16
16
 
17
17
  - name: Lint with black
18
18
  uses: psf/black@stable
@@ -8,7 +8,7 @@ jobs:
8
8
  runs-on: ubuntu-latest
9
9
 
10
10
  steps:
11
- - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
11
+ - uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493
12
12
  with:
13
13
  persist-credentials: false
14
14
 
@@ -47,7 +47,7 @@ jobs:
47
47
 
48
48
  steps:
49
49
  - name: Download all the dists
50
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
50
+ uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0
51
51
  with:
52
52
  name: python-package-distributions
53
53
  path: dist/
@@ -67,7 +67,7 @@ jobs:
67
67
 
68
68
  steps:
69
69
  - name: Download all the dists
70
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
70
+ uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0
71
71
  with:
72
72
  name: python-package-distributions
73
73
  path: dist/
@@ -9,10 +9,10 @@ jobs:
9
9
  strategy:
10
10
  fail-fast: false
11
11
  matrix:
12
- python-version: [ "3.11", "3.12", "3.13" ]
12
+ python-version: [ "3.11", "3.12", "3.13", "3.14" ]
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v4
15
+ - uses: actions/checkout@v5
16
16
 
17
17
  - name: Install uv
18
18
  uses: astral-sh/setup-uv@v6
@@ -3,9 +3,10 @@ default_language_version:
3
3
  fail_fast: false
4
4
  repos:
5
5
  - repo: https://github.com/astral-sh/uv-pre-commit
6
- rev: 0.7.5
6
+ rev: 0.8.8
7
7
  hooks:
8
8
  - id: uv-lock
9
+ require_serial: true
9
10
 
10
11
  - repo: https://github.com/pre-commit/pre-commit-hooks
11
12
  rev: v5.0.0
@@ -24,6 +25,11 @@ repos:
24
25
  - id: mixed-line-ending
25
26
  args: [ --fix=crlf ]
26
27
 
28
+ - repo: https://github.com/asottile/add-trailing-comma
29
+ rev: v3.2.0
30
+ hooks:
31
+ - id: add-trailing-comma
32
+
27
33
  - repo: https://github.com/psf/black
28
34
  rev: 25.1.0
29
35
  hooks:
@@ -2,6 +2,14 @@
2
2
 
3
3
  *Currently none*
4
4
 
5
+ # v1.4.3
6
+
7
+ - Refactor tests to use pytest.parametrize
8
+
9
+ - Fix accidental dict literal instead of empty set constructor in `BlockABC.will_accept`
10
+ - Should not have had any user-facing consequences since it is just an empty
11
+ fallback
12
+
5
13
  # v1.4.2
6
14
 
7
15
  - Catch `ParseBaseException` in `MathBlock` instead of `ParseSyntaxException`
@@ -1,7 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ya_tagscript
3
- Version: 1.4.2
3
+ Version: 1.4.3
4
4
  Summary: Yet Another TagScript fork. An easy drop in user-provided Templating system.
5
+ Project-URL: Changelog, https://ya-tagscript.readthedocs.io/en/latest/changelog.html
6
+ Project-URL: Documentation, https://ya-tagscript.readthedocs.io
5
7
  Project-URL: GitHub, https://github.com/MajorTanya/ya_tagscript
6
8
  Project-URL: Issues, https://github.com/MajorTanya/ya_tagscript/issues
7
9
  Author-email: MajorTanya <tanya@majortanya.eu>
@@ -14,6 +16,7 @@ Classifier: Operating System :: OS Independent
14
16
  Classifier: Programming Language :: Python :: 3.11
15
17
  Classifier: Programming Language :: Python :: 3.12
16
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
17
20
  Requires-Python: >=3.11
18
21
  Requires-Dist: discord-py>=2.5.0
19
22
  Requires-Dist: pyparsing>=3.2.0
@@ -22,7 +25,7 @@ Description-Content-Type: text/markdown
22
25
 
23
26
  # ya_tagscript - Yet Another TagScript fork
24
27
 
25
- Current stable version: v1.4.2
28
+ Current stable version: v1.4.3
26
29
 
27
30
  ## Information
28
31
 
@@ -84,7 +87,7 @@ or
84
87
  <!--VERSIONED TAG SECTION START-->
85
88
 
86
89
  ```
87
- pip install git+https://github.com/MajorTanya/ya_tagscript.git@v1.4.2
90
+ pip install git+https://github.com/MajorTanya/ya_tagscript.git@v1.4.3
88
91
  ```
89
92
 
90
93
  <!--VERSIONED TAG SECTION END-->
@@ -1,6 +1,6 @@
1
1
  # ya_tagscript - Yet Another TagScript fork
2
2
 
3
- Current stable version: v1.4.2
3
+ Current stable version: v1.4.3
4
4
 
5
5
  ## Information
6
6
 
@@ -62,7 +62,7 @@ or
62
62
  <!--VERSIONED TAG SECTION START-->
63
63
 
64
64
  ```
65
- pip install git+https://github.com/MajorTanya/ya_tagscript.git@v1.4.2
65
+ pip install git+https://github.com/MajorTanya/ya_tagscript.git@v1.4.3
66
66
  ```
67
67
 
68
68
  <!--VERSIONED TAG SECTION END-->
@@ -48,7 +48,7 @@ class GlossaryRefChecker:
48
48
  app.env.glossary_term_refs = {} # type: ignore
49
49
 
50
50
  for node in doctree.findall(
51
- lambda n: isinstance(n, (pending_xref, nodes.reference))
51
+ lambda n: isinstance(n, (pending_xref, nodes.reference)),
52
52
  ):
53
53
  if node.get("reftype") != "term":
54
54
  continue
@@ -169,5 +169,5 @@ class GlossaryRefChecker:
169
169
  )
170
170
  else:
171
171
  _logger.info(
172
- "[GlossaryRefCheck] All glossary term references back-referenced correctly!"
172
+ "[GlossaryRefCheck] All glossary term references back-referenced correctly!",
173
173
  )
@@ -21,7 +21,7 @@ project_copyright = "2025, MajorTanya"
21
21
  author = "MajorTanya"
22
22
 
23
23
  ### VERSION SECTION START
24
- version = "1.4.2"
24
+ version = "1.4.3"
25
25
  ### VERSION SECTION END
26
26
  release = version
27
27
 
@@ -137,7 +137,7 @@ def update_changelog(project_version: str, *, dry_run: bool, verbose: bool):
137
137
  if already_released_version is not None:
138
138
  raise RuntimeError(
139
139
  f"v{project_version} already has a CHANGELOG entry. Aborting "
140
- f"docs update process without changes..."
140
+ f"docs update process without changes...",
141
141
  )
142
142
 
143
143
  match = re.match(
@@ -147,7 +147,7 @@ def update_changelog(project_version: str, *, dry_run: bool, verbose: bool):
147
147
  )
148
148
  if match is None or (release_content := match.group(2)) == "":
149
149
  raise RuntimeError(
150
- "Nothing to update in CHANGELOG.md — Did something go wrong?"
150
+ "Nothing to update in CHANGELOG.md — Did something go wrong?",
151
151
  )
152
152
 
153
153
  updated_changelog_text = (
@@ -159,7 +159,7 @@ def update_changelog(project_version: str, *, dry_run: bool, verbose: bool):
159
159
 
160
160
  # v{project_version}
161
161
 
162
- """
162
+ """,
163
163
  )
164
164
  + release_content
165
165
  + old_changelog_text[len(match.group(1)) :]
@@ -199,7 +199,7 @@ def update_pyproject(project_version: str, *, dry_run: bool, verbose: bool):
199
199
  f'''\
200
200
  [project]
201
201
  name = "ya_tagscript"
202
- version = "{project_version}"'''
202
+ version = "{project_version}"''',
203
203
  )
204
204
  + old_pyproject_content[len(match.group(1)) + len(match.group(2)) :]
205
205
  )
@@ -239,7 +239,7 @@ def update_readme(project_version: str, *, dry_run: bool, verbose: bool):
239
239
  pip install git+https://github.com/MajorTanya/ya_tagscript.git@v{project_version}
240
240
  ```
241
241
 
242
- <!--VERSIONED TAG SECTION END-->"""
242
+ <!--VERSIONED TAG SECTION END-->""",
243
243
  )
244
244
  new_readme_text = re.sub(
245
245
  r"^<!--VERSIONED TAG SECTION START-->$.+?^<!--VERSIONED TAG SECTION END-->$",
@@ -272,7 +272,7 @@ def update_sphinx_conf(project_version: str, *, dry_run: bool, verbose: bool):
272
272
  f"""\
273
273
  ### VERSION SECTION START
274
274
  version = "{project_version}"
275
- ### VERSION SECTION END"""
275
+ ### VERSION SECTION END""",
276
276
  )
277
277
  new_sphinx_conf = re.sub(
278
278
  r"^### VERSION SECTION START$\n^version = .+?$\n^### VERSION SECTION END$",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ya_tagscript"
7
- version = "1.4.2"
7
+ version = "1.4.3"
8
8
  description = "Yet Another TagScript fork. An easy drop in user-provided Templating system."
9
9
  readme = "README.md"
10
10
  license = "CC-BY-4.0"
@@ -18,6 +18,7 @@ classifiers = [
18
18
  "Programming Language :: Python :: 3.11",
19
19
  "Programming Language :: Python :: 3.12",
20
20
  "Programming Language :: Python :: 3.13",
21
+ "Programming Language :: Python :: 3.14",
21
22
  "Operating System :: OS Independent",
22
23
  ]
23
24
  requires-python = ">=3.11"
@@ -29,26 +30,28 @@ dependencies = [
29
30
  keywords = ["tagscript"]
30
31
 
31
32
  [project.urls]
33
+ Changelog = "https://ya-tagscript.readthedocs.io/en/latest/changelog.html"
34
+ Documentation = "https://ya-tagscript.readthedocs.io"
32
35
  GitHub = "https://github.com/MajorTanya/ya_tagscript"
33
36
  Issues = "https://github.com/MajorTanya/ya_tagscript/issues"
34
37
 
35
38
  [dependency-groups]
36
39
  dev = [
37
40
  "black>=25.1.0",
38
- "coverage>=7.9.1",
41
+ "coverage>=7.10.4",
39
42
  "docutils-stubs>=0.0.22",
40
43
  "enum-tools[sphinx]>=0.13.0",
41
44
  "hatchling>=1.27.0",
42
45
  "isort>=6.0.1",
43
46
  "jinja2>=3.1.6",
44
47
  "myst-parser>=4.0.1",
45
- "pre-commit>=4.2.0",
46
- "pyright>=1.1.402",
48
+ "pre-commit>=4.3.0",
49
+ "pyright>=1.1.404",
47
50
  "pytest>=8.4.1",
48
51
  "sphinx>=8.2.3",
49
52
  "sphinx-autobuild>=2024.10.3",
50
53
  "sphinx-rtd-theme>=3.0.2",
51
- "types-python-dateutil>=2.9.0.20250516",
54
+ "types-python-dateutil>=2.9.0.20250822",
52
55
  ]
53
56
 
54
57
  [tool.black]
@@ -58,7 +61,6 @@ target-version = ["py311", "py312", "py313"]
58
61
  fail_under = 98
59
62
  show_missing = true
60
63
  exclude_also = [
61
- 'if TYPE_CHECKING:',
62
64
  '@(abc\.)?abstractmethod',
63
65
  'def __repr__',
64
66
  '(?:case _|else):\n\s*assert_never',
@@ -87,7 +89,7 @@ filterwarnings = [
87
89
 
88
90
  [tool.tox]
89
91
  requires = ["tox>=4"]
90
- env_list = ["3.13", "3.12", "3.11", "type"]
92
+ env_list = ["3.14", "3.13", "3.12", "3.11", "type"]
91
93
 
92
94
  [tool.tox.env_run_base]
93
95
  description = "Run tests under {base_python}"
@@ -100,6 +102,7 @@ deps = ["pyright>=1.1.402", "pytest>=8"]
100
102
  commands = [["pyright", "src", "tests", { replace = "posargs", extend = true }]]
101
103
 
102
104
  [tool.tox.gh.python]
105
+ "3.14" = ["3.14"]
103
106
  "3.13" = ["3.13", "type"]
104
107
  "3.12" = ["3.12"]
105
108
  "3.11" = ["3.11"]
@@ -112,7 +112,8 @@ class CooldownBlock(BlockABC):
112
112
  retry_after = round(retry_after, 2)
113
113
  if message is not None:
114
114
  message = message.replace("{key}", str(key)).replace(
115
- "{retry_after}", str(retry_after)
115
+ "{retry_after}",
116
+ str(retry_after),
116
117
  )
117
118
  else:
118
119
  message = (
@@ -40,7 +40,7 @@ def _add_field(embed: Embed, _: str, value: str | None) -> None:
40
40
  if inline is None:
41
41
  raise EmbedParseError(
42
42
  f"`inline` argument for `add_field` is not a boolean value "
43
- f"(was `{data[2]}`)."
43
+ f"(was `{data[2]}`).",
44
44
  )
45
45
  embed.add_field(name=name, value=value, inline=inline)
46
46
 
@@ -144,7 +144,7 @@ def _value_to_colour(value: Any) -> Colour | None:
144
144
  else:
145
145
  raise EmbedParseError(
146
146
  f"Received invalid type for colour key (expected Colour | str | int"
147
- f" | None, got {type(value).__qualname__})."
147
+ f" | None, got {type(value).__qualname__}).",
148
148
  )
149
149
 
150
150
 
@@ -137,14 +137,14 @@ class NumericStringParser:
137
137
  expr_list = DelimitedList(Group(expr))
138
138
 
139
139
  fn_call = (ident + lpar - Group(expr_list) + rpar).set_parse_action(
140
- self._insert_fn_arg_count_tuple
140
+ self._insert_fn_arg_count_tuple,
141
141
  )
142
142
 
143
143
  atom = (
144
144
  addop[...]
145
145
  + (
146
146
  (consts | fn_call | float_num | ident).set_parse_action(
147
- self._push_first
147
+ self._push_first,
148
148
  )
149
149
  | Group(lpar + expr + rpar)
150
150
  )
@@ -175,7 +175,7 @@ class NumericStringParser:
175
175
  return self._operations[op](op1, op2)
176
176
  elif op in self._functions:
177
177
  args = list(
178
- reversed([self._evaluate_stack(stack) for _ in range(num_args)])
178
+ reversed([self._evaluate_stack(stack) for _ in range(num_args)]),
179
179
  )
180
180
  if op == "round" and num_args == 2: # round needs the second arg to be int
181
181
  args[1] = int(args[1])
@@ -31,8 +31,8 @@ class URLEncodeBlock(BlockABC):
31
31
 
32
32
  # the following tagscript can be used to search up tag blocks
33
33
  # assume {args} = "command block"
34
- <https://phen-cogs.readthedocs.io/en/latest/search.html?q={urlencode(+):{args}}&check_keywords=yes&area=default>
35
- # <https://phen-cogs.readthedocs.io/en/latest/search.html?q=command+block&check_keywords=yes&area=default>
34
+ <https://ya-tagscript.readthedocs.io/en/latest/search.html?q={urlencode(+):{args}}&check_keywords=yes&area=default>
35
+ # <https://ya-tagscript.readthedocs.io/en/latest/search.html?q=command+block&check_keywords=yes&area=default>
36
36
  """
37
37
 
38
38
  requires_any_payload = True
@@ -133,7 +133,7 @@ class BlockABC(ABC):
133
133
  bool
134
134
  Whether the block will accept processing of the Context
135
135
  """
136
- names = self._accepted_names if self._accepted_names is not None else {}
136
+ names = self._accepted_names if self._accepted_names is not None else set()
137
137
  node = ctx.node
138
138
  declaration = node.declaration
139
139
 
@@ -56,7 +56,9 @@ class TagScriptInterpreter(InterpreterABC):
56
56
  response.body = self._interpret(output, response, input_string).strip()
57
57
  else:
58
58
  response.body = self._interpret(
59
- response.body, response, input_string
59
+ response.body,
60
+ response,
61
+ input_string,
60
62
  ).strip()
61
63
  self.total_work = 0
62
64
  return response
@@ -22,11 +22,11 @@ class ParseState(Enum):
22
22
  VALID_TRANSITIONS: dict[int, frozenset[ParseState]] = {
23
23
  ParseState.EXPECTING_DECLARATION.value: frozenset({ParseState.IN_DECLARATION}),
24
24
  ParseState.IN_DECLARATION.value: frozenset(
25
- {ParseState.IN_PARAMETER, ParseState.IN_PAYLOAD}
25
+ {ParseState.IN_PARAMETER, ParseState.IN_PAYLOAD},
26
26
  ),
27
27
  ParseState.IN_PARAMETER.value: frozenset({ParseState.POST_PARAMETER}),
28
28
  ParseState.POST_PARAMETER.value: frozenset(
29
- {ParseState.IN_PAYLOAD}
29
+ {ParseState.IN_PAYLOAD},
30
30
  ), # Or pop (not a state)
31
31
  ParseState.IN_PAYLOAD.value: frozenset(), # Only pop gets out of payload
32
32
  }
@@ -36,7 +36,9 @@ def parse_condition(ctx: Context, condition: str) -> bool | None:
36
36
  right_parsed = ctx.interpret_segment(right_cond)
37
37
 
38
38
  condition_fulfilled = _execute_operator(
39
- left_parsed, found_op.operator, right_parsed
39
+ left_parsed,
40
+ found_op.operator,
41
+ right_parsed,
40
42
  )
41
43
 
42
44
  return condition_fulfilled
@@ -5,7 +5,6 @@ source = ..
5
5
  [report]
6
6
  omit = make_release.py
7
7
  exclude_also =
8
- if TYPE_CHECKING:
9
8
  @(abc\.)?abstractmethod
10
9
  def __repr__
11
10
  (?:case _|else):\n\s*assert_never
@@ -143,7 +143,7 @@ def test_bots_attr_is_supported(
143
143
  MagicMock(discord.Member, id=1, bot=True),
144
144
  MagicMock(discord.Member, id=2, bot=False),
145
145
  MagicMock(discord.Member, id=3, bot=False),
146
- ]
146
+ ],
147
147
  )
148
148
  data = {"my_guild": adapters.GuildAdapter(obj)}
149
149
  result = ts_interpreter.process(script, data).body
@@ -159,7 +159,7 @@ def test_bots_attr_is_supported_oops_all_human(
159
159
  MagicMock(discord.Member, id=1, bot=False),
160
160
  MagicMock(discord.Member, id=2, bot=False),
161
161
  MagicMock(discord.Member, id=3, bot=False),
162
- ]
162
+ ],
163
163
  )
164
164
  data = {"my_guild": adapters.GuildAdapter(obj)}
165
165
  result = ts_interpreter.process(script, data).body
@@ -175,7 +175,7 @@ def test_humans_attr_is_supported(
175
175
  MagicMock(discord.Member, id=1, bot=True),
176
176
  MagicMock(discord.Member, id=2, bot=True),
177
177
  MagicMock(discord.Member, id=3, bot=False),
178
- ]
178
+ ],
179
179
  )
180
180
  data = {"my_guild": adapters.GuildAdapter(obj)}
181
181
  result = ts_interpreter.process(script, data).body
@@ -191,7 +191,7 @@ def test_humans_attr_is_supported_oops_all_bots(
191
191
  MagicMock(discord.Member, id=1, bot=True),
192
192
  MagicMock(discord.Member, id=2, bot=True),
193
193
  MagicMock(discord.Member, id=3, bot=True),
194
- ]
194
+ ],
195
195
  )
196
196
  data = {"my_guild": adapters.GuildAdapter(obj)}
197
197
  result = ts_interpreter.process(script, data).body
@@ -35,7 +35,7 @@ def test_failed_int_conversion_raises():
35
35
  with pytest.raises(
36
36
  ValueError,
37
37
  match=re.escape(
38
- "invalid literal for int() with base 10: 'really broken input'"
38
+ "invalid literal for int() with base 10: 'really broken input'",
39
39
  ),
40
40
  ):
41
41
  adapters.IntAdapter("really broken input") # type: ignore
@@ -90,8 +90,8 @@ def test_parameter_plus_in_middle_removed(
90
90
  script = "{my_str(1+1)}" # plus is removed -> "1+1" into "11" into 11 (int) into index 10 (int)
91
91
  data = {
92
92
  "my_str": adapters.StringAdapter(
93
- "my secret message is actually very long if you think about it"
94
- )
93
+ "my secret message is actually very long if you think about it",
94
+ ),
95
95
  }
96
96
  result = ts_interpreter.process(script, data).body
97
97
  assert result == "about"
@@ -103,8 +103,8 @@ def test_parameter_plus_in_middle_removed_with_payload(
103
103
  script = "{my_str(1+1):,}" # plus is removed -> "1+1" into "11" into 11 (int) into index 10 (int)
104
104
  data = {
105
105
  "my_str": adapters.StringAdapter(
106
- "my,secret,message,is,actually,very,long,if,you,think,about it"
107
- )
106
+ "my,secret,message,is,actually,very,long,if,you,think,about it",
107
+ ),
108
108
  }
109
109
  result = ts_interpreter.process(script, data).body
110
110
  assert result == "about it"
@@ -19,30 +19,20 @@ def test_accepted_names():
19
19
  assert block._accepted_names == {"c", "com", "cmd", "command"}
20
20
 
21
21
 
22
- def test_process_method_rejects_missing_payload():
23
- mock_ctx = MagicMock(spec=interpreter.Context)
24
- mock_ctx.node = MagicMock(spec=interfaces.NodeABC)
25
- mock_ctx.node.payload = None
26
-
27
- block = blocks.CommandBlock()
28
- returned = block.process(mock_ctx)
29
- assert returned is None
30
-
31
-
32
- def test_process_method_rejects_empty_payload():
33
- mock_ctx = MagicMock(spec=interpreter.Context)
34
- mock_ctx.node = MagicMock(spec=interfaces.NodeABC)
35
- mock_ctx.node.payload = ""
36
-
37
- block = blocks.CommandBlock()
38
- returned = block.process(mock_ctx)
39
- assert returned is None
40
-
41
-
42
- def test_process_method_rejects_whitespace_only_payload():
22
+ @pytest.mark.parametrize(
23
+ "payload",
24
+ (
25
+ pytest.param(None, id="missing"),
26
+ pytest.param("", id="empty"),
27
+ pytest.param(" ", id="whitespace"),
28
+ ),
29
+ )
30
+ def test_process_method_rejects_invalid_payloads(
31
+ payload: str | None,
32
+ ):
43
33
  mock_ctx = MagicMock(spec=interpreter.Context)
44
34
  mock_ctx.node = MagicMock(spec=interfaces.NodeABC)
45
- mock_ctx.node.payload = " "
35
+ mock_ctx.node.payload = payload
46
36
 
47
37
  block = blocks.CommandBlock()
48
38
  returned = block.process(mock_ctx)
@@ -0,0 +1,87 @@
1
+ import pytest
2
+
3
+ from ya_tagscript import TagScriptInterpreter, adapters, blocks
4
+
5
+
6
+ @pytest.fixture
7
+ def ts_interpreter():
8
+ b = [
9
+ blocks.OverrideBlock(),
10
+ blocks.StrictVariableGetterBlock(),
11
+ ]
12
+ return TagScriptInterpreter(b)
13
+
14
+
15
+ def test_accepted_names():
16
+ block = blocks.OverrideBlock()
17
+ assert block._accepted_names == {"override"}
18
+
19
+
20
+ @pytest.mark.parametrize(
21
+ ("script", "overrides_out"),
22
+ (
23
+ pytest.param(
24
+ "{override}",
25
+ {"admin": True, "mod": True, "permissions": True},
26
+ id="no_parameter_sets_all_overrides",
27
+ ),
28
+ pytest.param(
29
+ "{override(admin)}",
30
+ {"admin": True, "mod": False, "permissions": False},
31
+ id="admin_parameter_only_sets_admin_override",
32
+ ),
33
+ pytest.param(
34
+ "{override(mod)}",
35
+ {"admin": False, "mod": True, "permissions": False},
36
+ id="mod_parameter_only_sets_mod_override",
37
+ ),
38
+ pytest.param(
39
+ "{override(permissions)}",
40
+ {"admin": False, "mod": False, "permissions": True},
41
+ id="permissions_parameter_only_sets_permissions_override",
42
+ ),
43
+ pytest.param(
44
+ "{override(admin)}{override(mod)}",
45
+ {"admin": True, "mod": True, "permissions": False},
46
+ id="multiple_overrides_are_combined",
47
+ ),
48
+ ),
49
+ )
50
+ def test_dec_override_valid_settings(
51
+ script: str,
52
+ overrides_out: dict[str, bool],
53
+ ts_interpreter: TagScriptInterpreter,
54
+ ):
55
+ response = ts_interpreter.process(script)
56
+ assert response.body == ""
57
+ overrides = response.actions.get("overrides")
58
+ assert overrides is not None
59
+ assert overrides == overrides_out
60
+
61
+
62
+ def test_dec_override_other_parameter_is_rejected(
63
+ ts_interpreter: TagScriptInterpreter,
64
+ ):
65
+ script = "{override(parameter)}"
66
+ result = ts_interpreter.process(script).body
67
+ assert result == script
68
+
69
+
70
+ def test_dec_override_cannot_set_multiple_overrides_in_one_block(
71
+ ts_interpreter: TagScriptInterpreter,
72
+ ):
73
+ script = "{override(admin,mod)}"
74
+ result = ts_interpreter.process(script).body
75
+ assert result == script
76
+
77
+
78
+ def test_dec_override_parameter_is_interpreted(
79
+ ts_interpreter: TagScriptInterpreter,
80
+ ):
81
+ script = "{override({my_var})}"
82
+ data = {"my_var": adapters.StringAdapter("admin")}
83
+ response = ts_interpreter.process(script, data)
84
+ assert response.body == ""
85
+ overrides = response.actions.get("overrides")
86
+ assert overrides is not None
87
+ assert overrides == {"admin": True, "mod": False, "permissions": False}