simcord 3.0.0__tar.gz → 3.0.2__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 (377) hide show
  1. simcord-3.0.2/.github/workflows/verify.yml +131 -0
  2. {simcord-3.0.0 → simcord-3.0.2}/.gitignore +1 -0
  3. simcord-3.0.2/CHANGELOG.md +457 -0
  4. {simcord-3.0.0 → simcord-3.0.2}/CONTRIBUTING.md +10 -0
  5. {simcord-3.0.0 → simcord-3.0.2}/PKG-INFO +42 -11
  6. {simcord-3.0.0 → simcord-3.0.2}/README.md +33 -8
  7. {simcord-3.0.0 → simcord-3.0.2}/docs/api.md +56 -2
  8. {simcord-3.0.0 → simcord-3.0.2}/docs/architecture.md +10 -0
  9. simcord-3.0.2/docs/assets/adventure/alpine.png +0 -0
  10. simcord-3.0.2/docs/assets/adventure/canyon.png +0 -0
  11. simcord-3.0.2/docs/assets/preview/attachments.png +0 -0
  12. simcord-3.0.2/docs/assets/preview/buttons.png +0 -0
  13. simcord-3.0.2/docs/assets/preview/embeds.png +0 -0
  14. simcord-3.0.2/docs/assets/preview/entities.png +0 -0
  15. simcord-3.0.2/docs/assets/preview/layouts.png +0 -0
  16. simcord-3.0.2/docs/assets/preview/markdown.png +0 -0
  17. simcord-3.0.2/docs/assets/preview/modals.png +0 -0
  18. simcord-3.0.2/docs/assets/preview/polls.png +0 -0
  19. simcord-3.0.2/docs/assets/preview/replies.png +0 -0
  20. simcord-3.0.2/docs/assets/preview/selects.png +0 -0
  21. simcord-3.0.2/docs/assets/preview/slash-commands.png +0 -0
  22. simcord-3.0.2/docs/assets/simcord-showcase-poll-refresh.gif +0 -0
  23. {simcord-3.0.0 → simcord-3.0.2}/docs/concepts.md +13 -1
  24. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/ai-coding-agents.md +3 -1
  25. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/components.md +4 -0
  26. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/diagnostics.md +25 -9
  27. simcord-3.0.2/docs/guides/discord-visual-calibration.md +184 -0
  28. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/fixtures.md +12 -1
  29. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/intents.md +43 -6
  30. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/interactions.md +16 -0
  31. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/messages.md +64 -4
  32. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/permissions.md +4 -0
  33. simcord-3.0.2/docs/guides/preview.md +935 -0
  34. simcord-3.0.2/docs/guides/testing-slash-commands.md +161 -0
  35. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/threads-reactions-dms.md +20 -1
  36. {simcord-3.0.0 → simcord-3.0.2}/docs/llms.txt +11 -2
  37. {simcord-3.0.0 → simcord-3.0.2}/docs/parity-matrix.md +37 -9
  38. simcord-3.0.2/docs/preview-attestation.md +90 -0
  39. {simcord-3.0.0 → simcord-3.0.2}/docs/stability.md +41 -5
  40. {simcord-3.0.0 → simcord-3.0.2}/examples/README.md +21 -4
  41. {simcord-3.0.0 → simcord-3.0.2}/examples/preview_example.py +3 -2
  42. {simcord-3.0.0 → simcord-3.0.2}/mkdocs.yml +5 -0
  43. {simcord-3.0.0 → simcord-3.0.2}/pyproject.toml +6 -3
  44. simcord-3.0.2/scripts/capture_discord_reference.py +424 -0
  45. {simcord-3.0.0 → simcord-3.0.2}/scripts/capture_visual_reference.py +215 -84
  46. simcord-3.0.2/scripts/check_package.py +103 -0
  47. simcord-3.0.2/scripts/check_reference_modal_offline.py +55 -0
  48. {simcord-3.0.0 → simcord-3.0.2}/scripts/discord_reference_bot.py +120 -68
  49. simcord-3.0.2/scripts/preview_dogfood.py +228 -0
  50. simcord-3.0.2/scripts/record_readme_demo.py +452 -0
  51. simcord-3.0.2/scripts/replay_visual_reference.py +871 -0
  52. simcord-3.0.2/scripts/validate_discord_reference_pack.py +241 -0
  53. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/__init__.py +2 -1
  54. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/_dpy_internals.py +40 -7
  55. simcord-3.0.2/src/simcord/_modal.py +315 -0
  56. simcord-3.0.2/src/simcord/_runtime.py +313 -0
  57. simcord-3.0.2/src/simcord/_settlement.py +265 -0
  58. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/actors.py +269 -410
  59. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/asserts.py +2 -2
  60. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/cdn.py +10 -0
  61. simcord-3.0.2/src/simcord/backend/command_access.py +141 -0
  62. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/errors.py +9 -0
  63. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/__init__.py +13 -1
  64. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/channel.py +0 -1
  65. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/expression.py +5 -1
  66. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/interaction.py +5 -0
  67. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/member.py +2 -0
  68. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/message.py +44 -0
  69. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/channels.py +37 -4
  70. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/commands.py +37 -3
  71. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/expressions.py +20 -2
  72. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/guilds.py +16 -2
  73. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/messages.py +233 -32
  74. simcord-3.0.2/src/simcord/backend/ops/polls.py +105 -0
  75. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/reactions.py +21 -11
  76. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/serializers.py +27 -7
  77. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/builders.py +156 -11
  78. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/components.py +68 -17
  79. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/enums.py +38 -0
  80. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/env.py +125 -589
  81. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/gateway.py +21 -2
  82. simcord-3.0.2/src/simcord/http/_helpers.py +496 -0
  83. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/client.py +8 -2
  84. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/router.py +3 -0
  85. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/channels.py +14 -6
  86. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/commands.py +16 -2
  87. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/expressions.py +37 -6
  88. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/guilds.py +5 -2
  89. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/interactions.py +35 -23
  90. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/messages.py +5 -5
  91. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/intents.py +55 -14
  92. simcord-3.0.2/src/simcord/interactions.py +487 -0
  93. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/__init__.py +198 -42
  94. simcord-3.0.2/src/simcord/preview/_action_plans.py +595 -0
  95. simcord-3.0.2/src/simcord/preview/_actions.py +840 -0
  96. simcord-3.0.2/src/simcord/preview/_assets.py +502 -0
  97. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/_capture.py +186 -109
  98. simcord-3.0.2/src/simcord/preview/_commands.py +214 -0
  99. simcord-3.0.2/src/simcord/preview/_component_projection.py +381 -0
  100. simcord-3.0.2/src/simcord/preview/_diagnostics.py +284 -0
  101. simcord-3.0.2/src/simcord/preview/_identity.py +146 -0
  102. simcord-3.0.2/src/simcord/preview/_markdown.py +545 -0
  103. simcord-3.0.2/src/simcord/preview/_media.py +832 -0
  104. simcord-3.0.2/src/simcord/preview/_media_worker.py +64 -0
  105. simcord-3.0.2/src/simcord/preview/_messages.py +653 -0
  106. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/_pages.py +254 -44
  107. simcord-3.0.2/src/simcord/preview/_queries.py +797 -0
  108. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/_server.py +169 -23
  109. simcord-3.0.2/src/simcord/preview/_snapshot.py +372 -0
  110. simcord-3.0.2/src/simcord/preview/protocol.schema.json +453 -0
  111. simcord-3.0.2/src/simcord/preview/static/app.js +2280 -0
  112. simcord-3.0.2/src/simcord/preview/static/commands.js +999 -0
  113. simcord-3.0.2/src/simcord/preview/static/components.js +695 -0
  114. simcord-3.0.2/src/simcord/preview/static/composer.js +226 -0
  115. simcord-3.0.2/src/simcord/preview/static/dom.js +106 -0
  116. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/manifest.json +4 -3
  117. simcord-3.0.2/src/simcord/preview/static/fonts/noto-color-emoji-v2.051.ttf +0 -0
  118. simcord-3.0.2/src/simcord/preview/static/index.html +186 -0
  119. simcord-3.0.2/src/simcord/preview/static/listbox.js +155 -0
  120. simcord-3.0.2/src/simcord/preview/static/media.js +713 -0
  121. simcord-3.0.2/src/simcord/preview/static/messages.js +484 -0
  122. simcord-3.0.2/src/simcord/preview/static/preview.css +1817 -0
  123. simcord-3.0.2/src/simcord/preview/static/select-drafts.js +284 -0
  124. simcord-3.0.2/src/simcord/preview/static/selects.js +395 -0
  125. simcord-3.0.2/src/simcord/preview/static/text.js +357 -0
  126. simcord-3.0.2/src/simcord/preview/static/timeline.js +142 -0
  127. simcord-3.0.2/src/simcord/preview/static/transport.js +167 -0
  128. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/LICENSE +29 -0
  129. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/SHA256SUMS +20 -0
  130. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/core.min.js +306 -0
  131. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/bash.min.js +21 -0
  132. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/cpp.min.js +46 -0
  133. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/csharp.min.js +49 -0
  134. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/css.min.js +31 -0
  135. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/diff.min.js +9 -0
  136. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/dockerfile.min.js +8 -0
  137. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/go.min.js +19 -0
  138. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/ini.min.js +16 -0
  139. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/java.min.js +38 -0
  140. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/javascript.min.js +81 -0
  141. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/json.min.js +8 -0
  142. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/markdown.min.js +32 -0
  143. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/python.min.js +42 -0
  144. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/rust.min.js +27 -0
  145. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/sql.min.js +21 -0
  146. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/typescript.min.js +99 -0
  147. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/xml.min.js +29 -0
  148. simcord-3.0.2/src/simcord/preview/static/vendor/highlight/es/languages/yaml.min.js +28 -0
  149. simcord-3.0.2/src/simcord/preview/static/vendor/lottie/5.12.2/lottie_light_canvas.min.js +1 -0
  150. simcord-3.0.2/src/simcord/preview/static/vendor/lottie/LICENSE +21 -0
  151. simcord-3.0.2/src/simcord/preview/static/vendor/lottie/SHA256SUMS +2 -0
  152. simcord-3.0.2/src/simcord/preview/static/workbench.js +130 -0
  153. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/results.py +7 -6
  154. {simcord-3.0.0 → simcord-3.0.2}/tests/conformance/test_field_honesty.py +110 -7
  155. simcord-3.0.2/tests/fixtures/commands/option_cases.json +42 -0
  156. simcord-3.0.2/tests/fixtures/preview/catalog.py +1293 -0
  157. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/preview/coverage.json +346 -4
  158. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/preview/measurements.json +80 -0
  159. simcord-3.0.2/tests/fixtures/preview/moving-square.json +1 -0
  160. simcord-3.0.2/tests/fixtures/preview/profiles.json +176 -0
  161. simcord-3.0.2/tests/fixtures/preview/states.json +331 -0
  162. simcord-3.0.2/tests/fixtures/preview/video.mp4 +0 -0
  163. simcord-3.0.2/tests/fixtures/preview/voice.ogg +0 -0
  164. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/sample_bot/__init__.py +1 -0
  165. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/sample_bot/interactions.py +52 -0
  166. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/sample_bot/moderation.py +1 -0
  167. simcord-3.0.2/tests/fixtures/sample_bot/picker.py +97 -0
  168. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/preview_helpers.py +34 -8
  169. simcord-3.0.2/tests/integration/test_app_commands.py +127 -0
  170. simcord-3.0.2/tests/integration/test_command_visibility.py +340 -0
  171. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_components_v2_interactions.py +121 -1
  172. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_components_v2_messages.py +27 -0
  173. simcord-3.0.2/tests/integration/test_forum.py +201 -0
  174. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_intents.py +25 -0
  175. simcord-3.0.2/tests/integration/test_interaction_followups.py +264 -0
  176. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_lifecycle.py +2 -2
  177. simcord-3.0.2/tests/integration/test_message_content_rest.py +293 -0
  178. simcord-3.0.2/tests/integration/test_message_routes.py +249 -0
  179. simcord-3.0.2/tests/integration/test_messages.py +353 -0
  180. simcord-3.0.2/tests/integration/test_observation_contracts.py +264 -0
  181. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_preview.py +104 -6
  182. simcord-3.0.2/tests/integration/test_preview_additional.py +1214 -0
  183. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_preview_capture.py +267 -12
  184. simcord-3.0.2/tests/integration/test_preview_capture_dx.py +1739 -0
  185. simcord-3.0.2/tests/integration/test_preview_channel.py +721 -0
  186. simcord-3.0.2/tests/integration/test_preview_command_picker.py +1026 -0
  187. simcord-3.0.2/tests/integration/test_preview_commands.py +663 -0
  188. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_preview_coverage.py +54 -45
  189. simcord-3.0.2/tests/integration/test_preview_dx.py +1053 -0
  190. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_preview_edges.py +15 -15
  191. simcord-3.0.2/tests/integration/test_preview_fixes.py +1196 -0
  192. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_preview_fonts.py +101 -4
  193. simcord-3.0.2/tests/integration/test_preview_identity.py +210 -0
  194. simcord-3.0.2/tests/integration/test_preview_message_actions.py +379 -0
  195. simcord-3.0.2/tests/integration/test_preview_security.py +884 -0
  196. simcord-3.0.2/tests/integration/test_reference_replay.py +96 -0
  197. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_settlement_contract.py +47 -0
  198. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_threads.py +33 -0
  199. simcord-3.0.2/tests/unit/test_command_access.py +282 -0
  200. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_components_v2_validation.py +53 -0
  201. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_dpy_internals.py +100 -28
  202. simcord-3.0.2/tests/unit/test_intent_rules.py +229 -0
  203. simcord-3.0.2/tests/unit/test_option_validation.py +110 -0
  204. simcord-3.0.2/tests/unit/test_preview_action_specs.py +52 -0
  205. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_pytest_plugin.py +5 -7
  206. {simcord-3.0.0 → simcord-3.0.2}/uv.lock +194 -3
  207. simcord-3.0.0/.github/workflows/verify.yml +0 -99
  208. simcord-3.0.0/CHANGELOG.md +0 -291
  209. simcord-3.0.0/docs/guides/preview.md +0 -398
  210. simcord-3.0.0/docs/guides/testing-slash-commands.md +0 -104
  211. simcord-3.0.0/scripts/check_package.py +0 -47
  212. simcord-3.0.0/src/simcord/backend/ops/polls.py +0 -69
  213. simcord-3.0.0/src/simcord/http/_helpers.py +0 -282
  214. simcord-3.0.0/src/simcord/interactions.py +0 -217
  215. simcord-3.0.0/src/simcord/preview/_actions.py +0 -673
  216. simcord-3.0.0/src/simcord/preview/_assets.py +0 -209
  217. simcord-3.0.0/src/simcord/preview/_markdown.py +0 -145
  218. simcord-3.0.0/src/simcord/preview/_media.py +0 -167
  219. simcord-3.0.0/src/simcord/preview/_snapshot.py +0 -750
  220. simcord-3.0.0/src/simcord/preview/protocol.schema.json +0 -59
  221. simcord-3.0.0/src/simcord/preview/static/app.js +0 -885
  222. simcord-3.0.0/src/simcord/preview/static/components.js +0 -859
  223. simcord-3.0.0/src/simcord/preview/static/fonts/noto-color-emoji-v2.051.ttf +0 -0
  224. simcord-3.0.0/src/simcord/preview/static/index.html +0 -27
  225. simcord-3.0.0/src/simcord/preview/static/preview.css +0 -993
  226. simcord-3.0.0/tests/fixtures/preview/catalog.py +0 -483
  227. simcord-3.0.0/tests/fixtures/preview/profiles.json +0 -87
  228. simcord-3.0.0/tests/fixtures/preview/states.json +0 -137
  229. simcord-3.0.0/tests/integration/test_app_commands.py +0 -58
  230. simcord-3.0.0/tests/integration/test_forum.py +0 -79
  231. simcord-3.0.0/tests/integration/test_interaction_followups.py +0 -119
  232. simcord-3.0.0/tests/integration/test_message_routes.py +0 -94
  233. simcord-3.0.0/tests/integration/test_messages.py +0 -161
  234. simcord-3.0.0/tests/integration/test_preview_additional.py +0 -673
  235. simcord-3.0.0/tests/integration/test_preview_capture_dx.py +0 -296
  236. simcord-3.0.0/tests/integration/test_preview_dx.py +0 -177
  237. simcord-3.0.0/tests/integration/test_preview_fixes.py +0 -638
  238. simcord-3.0.0/tests/integration/test_preview_security.py +0 -208
  239. simcord-3.0.0/tests/unit/test_intent_rules.py +0 -94
  240. simcord-3.0.0/tests/unit/test_version.py +0 -13
  241. {simcord-3.0.0 → simcord-3.0.2}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  242. {simcord-3.0.0 → simcord-3.0.2}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  243. {simcord-3.0.0 → simcord-3.0.2}/.github/ISSUE_TEMPLATE/parity-gap.md +0 -0
  244. {simcord-3.0.0 → simcord-3.0.2}/.github/dependabot.yml +0 -0
  245. {simcord-3.0.0 → simcord-3.0.2}/.github/workflows/ci.yml +0 -0
  246. {simcord-3.0.0 → simcord-3.0.2}/.github/workflows/dpy-master.yml +0 -0
  247. {simcord-3.0.0 → simcord-3.0.2}/.github/workflows/release.yml +0 -0
  248. {simcord-3.0.0 → simcord-3.0.2}/.pre-commit-config.yaml +0 -0
  249. {simcord-3.0.0 → simcord-3.0.2}/.python-version +0 -0
  250. {simcord-3.0.0 → simcord-3.0.2}/.readthedocs.yaml +0 -0
  251. {simcord-3.0.0 → simcord-3.0.2}/CODE_OF_CONDUCT.md +0 -0
  252. {simcord-3.0.0 → simcord-3.0.2}/LICENSE +0 -0
  253. {simcord-3.0.0 → simcord-3.0.2}/SECURITY.md +0 -0
  254. {simcord-3.0.0 → simcord-3.0.2}/benchmarks/_helpers.py +0 -0
  255. {simcord-3.0.0 → simcord-3.0.2}/benchmarks/test_dispatch_benchmarks.py +0 -0
  256. {simcord-3.0.0 → simcord-3.0.2}/benchmarks/test_perf_guards.py +0 -0
  257. {simcord-3.0.0 → simcord-3.0.2}/changes/README.md +0 -0
  258. {simcord-3.0.0 → simcord-3.0.2}/docs/assets/simcord-terminal-demo.gif +0 -0
  259. {simcord-3.0.0 → simcord-3.0.2}/docs/assets/simcord-transparent.webp +0 -0
  260. {simcord-3.0.0 → simcord-3.0.2}/docs/assets/social-card.png +0 -0
  261. {simcord-3.0.0 → simcord-3.0.2}/docs/changelog.md +0 -0
  262. {simcord-3.0.0 → simcord-3.0.2}/docs/cookbook.md +0 -0
  263. {simcord-3.0.0 → simcord-3.0.2}/docs/faq.md +0 -0
  264. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/mocks-vs-simulation.md +0 -0
  265. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/moderation-and-guild.md +0 -0
  266. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/test-without-token.md +0 -0
  267. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/testing-discord-py-bots.md +0 -0
  268. {simcord-3.0.0 → simcord-3.0.2}/docs/guides/time-control.md +0 -0
  269. {simcord-3.0.0 → simcord-3.0.2}/docs/index.md +0 -0
  270. {simcord-3.0.0 → simcord-3.0.2}/docs/installation.md +0 -0
  271. {simcord-3.0.0 → simcord-3.0.2}/docs/performance.md +0 -0
  272. {simcord-3.0.0 → simcord-3.0.2}/docs/quickstart.md +0 -0
  273. {simcord-3.0.0 → simcord-3.0.2}/docs/robots.txt +0 -0
  274. {simcord-3.0.0 → simcord-3.0.2}/examples/__init__.py +0 -0
  275. {simcord-3.0.0 → simcord-3.0.2}/examples/bot.py +0 -0
  276. {simcord-3.0.0 → simcord-3.0.2}/examples/conftest.py +0 -0
  277. {simcord-3.0.0 → simcord-3.0.2}/examples/test_bot.py +0 -0
  278. {simcord-3.0.0 → simcord-3.0.2}/overrides/main.html +0 -0
  279. {simcord-3.0.0 → simcord-3.0.2}/scripts/check_discoverability.py +0 -0
  280. {simcord-3.0.0 → simcord-3.0.2}/scripts/compare_visual_reference.py +0 -0
  281. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/__init__.py +0 -0
  282. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/access.py +0 -0
  283. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/auditlog.py +0 -0
  284. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/automod.py +0 -0
  285. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/guild.py +0 -0
  286. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/invite.py +0 -0
  287. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/role.py +0 -0
  288. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/scheduled_event.py +0 -0
  289. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/stage_instance.py +0 -0
  290. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/user.py +0 -0
  291. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/voice.py +0 -0
  292. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/models/webhook.py +0 -0
  293. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/__init__.py +0 -0
  294. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/audit.py +0 -0
  295. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/base.py +0 -0
  296. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/invites.py +0 -0
  297. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/permissions.py +0 -0
  298. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/scheduled_events.py +0 -0
  299. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/voice.py +0 -0
  300. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/ops/webhooks.py +0 -0
  301. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/permissions.py +0 -0
  302. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/backend/state.py +0 -0
  303. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/__init__.py +0 -0
  304. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/__init__.py +0 -0
  305. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/application.py +0 -0
  306. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/auditlogs.py +0 -0
  307. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/automod.py +0 -0
  308. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/invites.py +0 -0
  309. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/reactions.py +0 -0
  310. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/scheduled_events.py +0 -0
  311. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/http/routes/stage_instances.py +0 -0
  312. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/parity.py +0 -0
  313. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Arabic.txt +0 -0
  314. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-CJK.txt +0 -0
  315. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Devanagari.txt +0 -0
  316. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Emoji.txt +0 -0
  317. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Hebrew.txt +0 -0
  318. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto.txt +0 -0
  319. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-arabic-v2.012.ttf +0 -0
  320. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-devanagari-v2.007.ttf +0 -0
  321. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-hebrew-v3.001.ttf +0 -0
  322. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-latin-italic-v2.015.ttf +0 -0
  323. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-latin-v2.015.ttf +0 -0
  324. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-mono-v2.014.ttf +0 -0
  325. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/preview/static/fonts/noto-sans-sc-v2.004.ttf +0 -0
  326. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/py.typed +0 -0
  327. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/pytest_plugin.py +0 -0
  328. {simcord-3.0.0 → simcord-3.0.2}/src/simcord/types.py +0 -0
  329. {simcord-3.0.0 → simcord-3.0.2}/tests/conformance/_world.py +0 -0
  330. {simcord-3.0.0 → simcord-3.0.2}/tests/conformance/test_field_honesty_fuzz.py +0 -0
  331. {simcord-3.0.0 → simcord-3.0.2}/tests/conformance/test_route_coverage.py +0 -0
  332. {simcord-3.0.0 → simcord-3.0.2}/tests/conformance/test_serializers.py +0 -0
  333. {simcord-3.0.0 → simcord-3.0.2}/tests/conftest.py +0 -0
  334. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/__init__.py +0 -0
  335. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/preview/__init__.py +0 -0
  336. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/sample_bot/events.py +0 -0
  337. {simcord-3.0.0 → simcord-3.0.2}/tests/fixtures/sample_bot/general.py +0 -0
  338. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_application_emojis.py +0 -0
  339. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_asserts.py +0 -0
  340. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_audit_logs.py +0 -0
  341. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_automod.py +0 -0
  342. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_bot_users_and_webhooks.py +0 -0
  343. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_channels.py +0 -0
  344. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_command_permissions.py +0 -0
  345. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_common_bot_sweep.py +0 -0
  346. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_coverage_sweep.py +0 -0
  347. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_diagnostics.py +0 -0
  348. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_edge_cases.py +0 -0
  349. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_error_capture_and_edits.py +0 -0
  350. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_expressions.py +0 -0
  351. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_gateway_and_automod_exempt.py +0 -0
  352. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_guilds.py +0 -0
  353. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_interactions.py +0 -0
  354. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_invites.py +0 -0
  355. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_members.py +0 -0
  356. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_misc_branches.py +0 -0
  357. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_moderation.py +0 -0
  358. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_polls.py +0 -0
  359. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_reactions.py +0 -0
  360. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_roles_and_ordering.py +0 -0
  361. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_scheduled_events.py +0 -0
  362. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_setup_hook_suspension.py +0 -0
  363. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_sharding.py +0 -0
  364. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_stage_instances.py +0 -0
  365. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_time.py +0 -0
  366. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_transport_edges.py +0 -0
  367. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_voice_state.py +0 -0
  368. {simcord-3.0.0 → simcord-3.0.2}/tests/integration/test_world_helpers.py +0 -0
  369. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_assert_helpers.py +0 -0
  370. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_backend_lookup_errors.py +0 -0
  371. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_errors.py +0 -0
  372. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_lazy_import.py +0 -0
  373. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_parity.py +0 -0
  374. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_parity_tooling.py +0 -0
  375. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_permission_validators.py +0 -0
  376. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_permissions.py +0 -0
  377. {simcord-3.0.0 → simcord-3.0.2}/tests/unit/test_router.py +0 -0
@@ -0,0 +1,131 @@
1
+ name: Verify
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v7
14
+ - uses: astral-sh/setup-uv@v7
15
+ # screenshot extra pulls in playwright/PIL/markdown-it so pyright resolves
16
+ # the lazy optional imports in simcord.preview with real type info.
17
+ - run: uv sync --locked --extra dev --extra screenshot
18
+ - run: uv run ruff check src tests examples benchmarks scripts
19
+ - run: uv run ruff format --check src tests examples benchmarks scripts
20
+ - run: uv run pyright src
21
+
22
+ test:
23
+ runs-on: ubuntu-latest
24
+ strategy:
25
+ fail-fast: false
26
+ matrix:
27
+ python-version: ["3.11", "3.12", "3.13", "3.14"]
28
+ steps:
29
+ - uses: actions/checkout@v7
30
+ - uses: astral-sh/setup-uv@v7
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+ # The complete 3.0 suite includes real browser checks on every supported Python.
34
+ - run: uv sync --locked --extra dev --extra screenshot
35
+ - run: uv run python -m playwright install --with-deps chromium
36
+ - run: uv run coverage run -m pytest tests examples -q
37
+ - run: uv run coverage report
38
+
39
+ docs:
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v7
43
+ - uses: astral-sh/setup-uv@v7
44
+ - run: uv sync --locked --extra docs
45
+ - run: uv run mkdocs build --strict
46
+ - run: uv run python scripts/check_discoverability.py site
47
+
48
+ preview-package:
49
+ name: Preview package + locked Linux Chromium
50
+ runs-on: ubuntu-22.04
51
+ timeout-minutes: 30
52
+ steps:
53
+ - uses: actions/checkout@v7
54
+ - run: echo "PLAYWRIGHT_BROWSERS_PATH=${{ runner.temp }}/playwright-browsers" >> "$GITHUB_ENV"
55
+ - uses: astral-sh/setup-uv@v7
56
+ with:
57
+ python-version: "3.12"
58
+ - run: uv sync --locked --extra screenshot --extra pytest
59
+ - run: uv run python -m playwright install --with-deps chromium
60
+ - run: uv run python scripts/compare_visual_reference.py --check-manifest tests/fixtures/preview/coverage.json
61
+ - run: uv run python scripts/compare_visual_reference.py --check
62
+ - run: uv run python scripts/capture_visual_reference.py --check
63
+ - run: uv run pytest tests/integration/test_preview*.py -q
64
+ - run: uv build
65
+ - run: uv run python scripts/check_package.py dist
66
+ - name: Smoke-test installed wheel with a sparse system-font set
67
+ shell: bash
68
+ run: |
69
+ set -euo pipefail
70
+ tmp="$(mktemp -d)"
71
+ trap 'rm -rf "$tmp"' EXIT
72
+ mkdir -p "$tmp/sparse-fonts" "$tmp/font-cache"
73
+ # Chromium's Skia font manager requires one fallback even when the
74
+ # bundled Preview fonts supply every tested face.
75
+ cp "$(fc-match -f '%{file}' sans-serif)" "$tmp/sparse-fonts/fallback.ttf"
76
+ cat > "$tmp/fonts.conf" <<EOF
77
+ <?xml version="1.0"?>
78
+ <fontconfig>
79
+ <dir>$tmp/sparse-fonts</dir>
80
+ <cachedir>$tmp/font-cache</cachedir>
81
+ </fontconfig>
82
+ EOF
83
+ uv export --locked --no-dev --extra screenshot --no-emit-project \
84
+ --format requirements-txt --output-file "$tmp/requirements.txt"
85
+ uv venv --python 3.12 "$tmp/venv"
86
+ uv pip install --python "$tmp/venv/bin/python" -r "$tmp/requirements.txt"
87
+ wheel="$(printf '%s\n' "$GITHUB_WORKSPACE"/dist/*.whl)"
88
+ uv pip install --python "$tmp/venv/bin/python" --no-deps \
89
+ "simcord[screenshot] @ file://$wheel"
90
+ uv pip check --python "$tmp/venv/bin/python"
91
+ "$tmp/venv/bin/python" -m playwright install --with-deps chromium
92
+ cp examples/bot.py examples/preview_example.py "$tmp/"
93
+ (
94
+ cd "$tmp"
95
+ FONTCONFIG_FILE="$tmp/fonts.conf" \
96
+ "$tmp/venv/bin/python" preview_example.py > "$tmp/preview-report.json"
97
+ )
98
+ "$tmp/venv/bin/python" - "$tmp/preview-report.json" <<'PY'
99
+ import json
100
+ import sys
101
+
102
+ report = json.loads(open(sys.argv[1], encoding="utf-8").read())
103
+ capture = report["capture"]
104
+ assert capture["complete"], capture["diagnostics"]
105
+ loaded = {face["family"] for face in capture["profile"]["fontResolution"]["loaded"]}
106
+ required = {
107
+ "Noto Sans",
108
+ "Noto Sans Mono",
109
+ "Noto Color Emoji",
110
+ "Noto Sans Arabic",
111
+ "Noto Sans Hebrew",
112
+ "Noto Sans Devanagari",
113
+ "Noto Sans SC",
114
+ }
115
+ assert required <= loaded, f"wheel missed packaged font faces: {sorted(required - loaded)}"
116
+ PY
117
+
118
+ benchmark:
119
+ runs-on: ubuntu-latest
120
+ steps:
121
+ - uses: actions/checkout@v7
122
+ - uses: astral-sh/setup-uv@v7
123
+ # The perf guards (absolute budget + same-run scaling ratio) fail the build
124
+ # on a catastrophic regression; the JSON is uploaded as a non-gating trend.
125
+ - run: uv sync --locked --extra bench
126
+ - run: uv run pytest benchmarks --benchmark-json=benchmark.json
127
+ - uses: actions/upload-artifact@v7
128
+ if: always()
129
+ with:
130
+ name: benchmark-results
131
+ path: benchmark.json
@@ -26,6 +26,7 @@ PLAN.md
26
26
  site/
27
27
 
28
28
  docs/plans/
29
+ docs/reviews/
29
30
 
30
31
  # Local Discord visual references (never committed or packaged)
31
32
  .discord-reference-captures/