mover 0.3.2__tar.gz → 0.3.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 (109) hide show
  1. {mover-0.3.2 → mover-0.3.3}/PKG-INFO +1 -1
  2. {mover-0.3.2 → mover-0.3.3}/pyproject.toml +1 -1
  3. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/convert.js +9 -6
  4. {mover-0.3.2 → mover-0.3.3}/src/mover.egg-info/PKG-INFO +1 -1
  5. {mover-0.3.2 → mover-0.3.3}/tests/test_converter_timeline.py +27 -0
  6. {mover-0.3.2 → mover-0.3.3}/LICENSE +0 -0
  7. {mover-0.3.2 → mover-0.3.3}/README.md +0 -0
  8. {mover-0.3.2 → mover-0.3.3}/setup.cfg +0 -0
  9. {mover-0.3.2 → mover-0.3.3}/src/mover/__init__.py +0 -0
  10. {mover-0.3.2 → mover-0.3.3}/src/mover/_optional.py +0 -0
  11. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/__init__.py +0 -0
  12. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/LICENSE +0 -0
  13. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/VENDORED.md +0 -0
  14. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/__init__.py +0 -0
  15. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/__init__.py +0 -0
  16. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/all.py +0 -0
  17. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/constraint.py +0 -0
  18. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/dsl_domain.py +0 -0
  19. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/dsl_functions.py +0 -0
  20. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/dsl_types.py +0 -0
  21. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/executors/__init__.py +0 -0
  22. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/executors/executor_base.py +0 -0
  23. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/executors/function_domain_executor.py +0 -0
  24. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/executors/tensor_value_eager_executor.py +0 -0
  25. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/executors/tensor_value_executor.py +0 -0
  26. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/executors/value_quantizers.py +0 -0
  27. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/expression.py +0 -0
  28. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/expression_utils.py +0 -0
  29. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/expression_visitor.py +0 -0
  30. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/function_domain.py +0 -0
  31. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/learning/__init__.py +0 -0
  32. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/learning/function_domain_search.py +0 -0
  33. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/parsers/__init__.py +0 -0
  34. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/parsers/fol_python_parser.py +0 -0
  35. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/parsers/function_expression_parser.py +0 -0
  36. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/parsers/parser_base.py +0 -0
  37. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/tensor_state.py +0 -0
  38. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/tensor_value.py +0 -0
  39. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/tensor_value_utils.py +0 -0
  40. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/concepts/dsl/value.py +0 -0
  41. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/LICENSE +0 -0
  42. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/VENDORED.md +0 -0
  43. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/__init__.py +0 -0
  44. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/basic_functional.py +0 -0
  45. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/batched_functional.py +0 -0
  46. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/torch_utils.py +0 -0
  47. {mover-0.3.2 → mover-0.3.3}/src/mover/_vendor/torch_index/utils.py +0 -0
  48. {mover-0.3.2 → mover-0.3.3}/src/mover/config.py +0 -0
  49. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/__init__.py +0 -0
  50. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/EasePack.min.js +0 -0
  51. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/MotionPathPlugin.min.js +0 -0
  52. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/api.js +0 -0
  53. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/grid.svg +0 -0
  54. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/gsap.min.js +0 -0
  55. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/index.css +0 -0
  56. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/property_registry.json +0 -0
  57. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/assets/vis.js +0 -0
  58. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/mover_converter.py +0 -0
  59. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/mover_querier.py +0 -0
  60. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/raster_capture.py +0 -0
  61. {mover-0.3.2 → mover-0.3.3}/src/mover/converter/render_session.py +0 -0
  62. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/__init__.py +0 -0
  63. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/assets/correction_msg_template.md +0 -0
  64. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/fol_domain.py +0 -0
  65. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/fol_executor.py +0 -0
  66. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/fol_parser.py +0 -0
  67. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/mover_verifier.py +0 -0
  68. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/transform_types.py +0 -0
  69. {mover-0.3.2 → mover-0.3.3}/src/mover/dsl/utils.py +0 -0
  70. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/__init__.py +0 -0
  71. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/assets/sentence_patterns.json +0 -0
  72. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/assets/vocab.json +0 -0
  73. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/data_classes.py +0 -0
  74. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/mover_fol_generator.py +0 -0
  75. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/prompt_generator.py +0 -0
  76. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/sentence_generation/__init__.py +0 -0
  77. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/sentence_generation/sentence_composer.py +0 -0
  78. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/sentence_generation/sentence_unit.py +0 -0
  79. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/sentence_generation/vocab.py +0 -0
  80. {mover-0.3.2 → mover-0.3.3}/src/mover/nlg/utils.py +0 -0
  81. {mover-0.3.2 → mover-0.3.3}/src/mover/pipeline.py +0 -0
  82. {mover-0.3.2 → mover-0.3.3}/src/mover/stats.py +0 -0
  83. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/__init__.py +0 -0
  84. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/animation_synthesizer.py +0 -0
  85. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/assets/sys_msg_animation_synthesizer.md +0 -0
  86. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/assets/sys_msg_animation_synthesizer_with_implementation.md +0 -0
  87. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/assets/sys_msg_mover_synthesizer.md +0 -0
  88. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/assets/sys_msg_prompt_rewriter.md +0 -0
  89. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/assets/template.html +0 -0
  90. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/base_synthesizer.py +0 -0
  91. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/llm_client.py +0 -0
  92. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/mover_synthesizer.py +0 -0
  93. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/prompt_rewriter.py +0 -0
  94. {mover-0.3.2 → mover-0.3.3}/src/mover/synthesizers/utils.py +0 -0
  95. {mover-0.3.2 → mover-0.3.3}/src/mover.egg-info/SOURCES.txt +0 -0
  96. {mover-0.3.2 → mover-0.3.3}/src/mover.egg-info/dependency_links.txt +0 -0
  97. {mover-0.3.2 → mover-0.3.3}/src/mover.egg-info/entry_points.txt +0 -0
  98. {mover-0.3.2 → mover-0.3.3}/src/mover.egg-info/requires.txt +0 -0
  99. {mover-0.3.2 → mover-0.3.3}/src/mover.egg-info/top_level.txt +0 -0
  100. {mover-0.3.2 → mover-0.3.3}/tests/test_animation_prompt_assets.py +0 -0
  101. {mover-0.3.2 → mover-0.3.3}/tests/test_converter_capture.py +0 -0
  102. {mover-0.3.2 → mover-0.3.3}/tests/test_converter_dom.py +0 -0
  103. {mover-0.3.2 → mover-0.3.3}/tests/test_mover_fol_generator.py +0 -0
  104. {mover-0.3.2 → mover-0.3.3}/tests/test_mover_querier.py +0 -0
  105. {mover-0.3.2 → mover-0.3.3}/tests/test_mover_synthesizer.py +0 -0
  106. {mover-0.3.2 → mover-0.3.3}/tests/test_prompt_generation.py +0 -0
  107. {mover-0.3.2 → mover-0.3.3}/tests/test_render_session.py +0 -0
  108. {mover-0.3.2 → mover-0.3.3}/tests/test_svgpt_keyframes.py +0 -0
  109. {mover-0.3.2 → mover-0.3.3}/tests/test_transform_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mover
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Official implementation of MoVer: Motion Verification for Motion Graphics Animations
5
5
  Author-email: Jiaju Ma <jiajuma@stanford.edu>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mover"
7
- version = "0.3.2"
7
+ version = "0.3.3"
8
8
  description = "Official implementation of MoVer: Motion Verification for Motion Graphics Animations"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<3.13"
@@ -183,13 +183,14 @@ function initializeControlledTimelineAtZero(timeline) {
183
183
  return timeline;
184
184
  }
185
185
 
186
- // Zero-duration root animations hold no time-varying state, so they are not unsupported.
187
- // They do not necessarily apply instantly -- see unfreezeAuthoredGsapRootAfterSnapshot.
188
- function isInstantRootAnimation(animation) {
186
+ // Settled means already applied: no time left and no delay. Zero duration alone is not
187
+ // enough -- {delay} applies later, {repeat} reports a non-zero totalDuration.
188
+ function isSettledInstantRootAnimation(animation) {
189
189
  return Boolean(
190
190
  animation
191
- && typeof animation.duration === "function"
192
- && animation.duration() === 0
191
+ && typeof animation.totalDuration === "function"
192
+ && animation.totalDuration() === 0
193
+ && getAnimationDelay(animation) === 0
193
194
  );
194
195
  }
195
196
 
@@ -206,7 +207,9 @@ function getUnexpectedRootAnimations() {
206
207
  .getChildren(false, true, true)
207
208
  .filter(animation => (
208
209
  animation !== tl_to_use
209
- && !isInstantRootAnimation(animation)
210
+ // getInitialRootRecords leaves a delayedCall on the root by design.
211
+ && !isGsapDelayedCall(animation)
212
+ && !isSettledInstantRootAnimation(animation)
210
213
  ));
211
214
  }
212
215
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mover
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Official implementation of MoVer: Motion Verification for Motion Graphics Animations
5
5
  Author-email: Jiaju Ma <jiajuma@stanford.edu>
6
6
  License-Expression: Apache-2.0
@@ -1187,6 +1187,33 @@ class TimelineControlBrowserTest(unittest.IsolatedAsyncioTestCase):
1187
1187
  self.assertGreaterEqual(len(set(seen)), 4, f"x never advanced: {seen}")
1188
1188
  self.assertAlmostEqual(seen[-1], 30, delta=0.5)
1189
1189
 
1190
+ async def test_callback_created_delayed_set_is_rejected(self) -> None:
1191
+ """A delayed gsap.set() from a callback must fail capture, not freeze silently."""
1192
+ page = await self._load_page(
1193
+ """
1194
+ window.delayedSetState = {value: 0};
1195
+ const writeTarget = document.getElementById("selected");
1196
+ const sourceAnimation = gsap.timeline();
1197
+ sourceAnimation.to(delayedSetState, {
1198
+ value: 100,
1199
+ duration: 1,
1200
+ ease: "none",
1201
+ onUpdate: () => gsap.set(writeTarget, {
1202
+ attr: {x: 5 + delayedSetState.value / 4},
1203
+ delay: 0.05,
1204
+ }),
1205
+ });
1206
+ """
1207
+ )
1208
+
1209
+ # The setup render fires the onUpdate, which mints the delayed set on the root,
1210
+ # so the guard trips at initialization rather than part-way through capture.
1211
+ with self.assertRaisesRegex(
1212
+ PlaywrightError,
1213
+ "Unsupported post-snapshot GSAP animation",
1214
+ ):
1215
+ await page.evaluate("initializeTimelineControl()")
1216
+
1190
1217
  async def test_gsdevtools_is_neutralized_before_it_touches_the_root(
1191
1218
  self,
1192
1219
  ) -> None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes