wandelbots-nova 2.2.2__tar.gz → 2.3.0__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 (348) hide show
  1. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/PKG-INFO +1 -1
  2. wandelbots_nova-2.3.0/novax/api/programs.py +78 -0
  3. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/program_manager.py +25 -20
  4. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/pyproject.toml +1 -1
  5. wandelbots_nova-2.3.0/tests/novax/api/test_programs.py +136 -0
  6. wandelbots_nova-2.3.0/tests/novax/serve.py +46 -0
  7. wandelbots_nova-2.2.2/novax/api/programs.py +0 -94
  8. wandelbots_nova-2.2.2/tests/novax/api/test_programs.py +0 -177
  9. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/.gitignore +0 -0
  10. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/LICENSE +0 -0
  11. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/README.md +0 -0
  12. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/__init__.py +0 -0
  13. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/__init__.py +0 -0
  14. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/base.py +0 -0
  15. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/container.py +0 -0
  16. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/io.py +0 -0
  17. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/mock.py +0 -0
  18. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/motions.py +0 -0
  19. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/api.py +0 -0
  20. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/auth/__init__.py +0 -0
  21. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/auth/auth_config.py +0 -0
  22. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/auth/authorization.py +0 -0
  23. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/__init__.py +0 -0
  24. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/cell.py +0 -0
  25. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/controllers.py +0 -0
  26. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/robot_cell.py +0 -0
  27. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/__init__.py +0 -0
  28. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/controller.py +0 -0
  29. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/env_handler.py +0 -0
  30. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/exceptions.py +0 -0
  31. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/gateway.py +0 -0
  32. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/io.py +0 -0
  33. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/logging.py +0 -0
  34. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/motion_group.py +0 -0
  35. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/movement_controller.py +0 -0
  36. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/nova.py +0 -0
  37. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/events/__init__.py +0 -0
  38. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/events/nats.py +0 -0
  39. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/__init__.py +0 -0
  40. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/opcua/__init__.py +0 -0
  41. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/opcua/client.py +0 -0
  42. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/opcua/functions.py +0 -0
  43. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/__init__.py +0 -0
  44. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/exceptions.py +0 -0
  45. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/function.py +0 -0
  46. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/runner.py +0 -0
  47. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/utils.py +0 -0
  48. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/__init__.py +0 -0
  49. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/collision_scene.py +0 -0
  50. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/motion_settings.py +0 -0
  51. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/pose.py +0 -0
  52. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/state.py +0 -0
  53. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/vector3d.py +0 -0
  54. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/utils.py +0 -0
  55. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/version.py +0 -0
  56. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/__init__.py +0 -0
  57. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/base.py +0 -0
  58. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/manager.py +0 -0
  59. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/protocol.py +0 -0
  60. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/rerun.py +0 -0
  61. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/utils.py +0 -0
  62. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/LICENSE +0 -0
  63. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/README.md +0 -0
  64. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/__init__.py +0 -0
  65. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/README.md +0 -0
  66. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/benchmark_base.py +0 -0
  67. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/README.md +0 -0
  68. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/demo_set.yaml +0 -0
  69. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/mb_set.yaml +0 -0
  70. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/mpinets_set.yaml +0 -0
  71. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/datasets.py +0 -0
  72. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/log_successful_planning.py +0 -0
  73. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/robometrics_helper.py +0 -0
  74. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/run_collision_free_benchmark.py +0 -0
  75. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/run_collision_free_magma.py +0 -0
  76. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/run_ptp_benchmark.py +0 -0
  77. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/blueprint.py +0 -0
  78. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/collision_scene.py +0 -0
  79. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/colors.py +0 -0
  80. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/consts.py +0 -0
  81. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/conversion_helpers.py +0 -0
  82. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/dh_robot.py +0 -0
  83. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/Welding_Benchmark_USA_01.stl +0 -0
  84. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/bin_everything_05.ply +0 -0
  85. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/colliders.json +0 -0
  86. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/source.md +0 -0
  87. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/tool.stl +0 -0
  88. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/yaskawa_ar1440_rif_with_safety_zones.json +0 -0
  89. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/collison_world.py +0 -0
  90. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/import_ply.py +0 -0
  91. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/reachability_check.py +0 -0
  92. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/robocore.py +0 -0
  93. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/stream_robot.py +0 -0
  94. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/use_nova_rerun_bridge.py +0 -0
  95. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/visualize_tool.py +0 -0
  96. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/wait_action.py +0 -0
  97. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/welding_example.py +0 -0
  98. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/yaskawa-ar1440-16-mounting.json +0 -0
  99. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/yaskawa-ar1440-with-external-axis.json +0 -0
  100. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/README.md +0 -0
  101. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/__init__.py +0 -0
  102. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/code_server_helpers.py +0 -0
  103. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/download_models.py +0 -0
  104. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/plan_with_collisions.py +0 -0
  105. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/hull_visualizer.py +0 -0
  106. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/.gitignore +0 -0
  107. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/README.md +0 -0
  108. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/main.py +0 -0
  109. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/poetry.toml +0 -0
  110. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/pyproject.toml +0 -0
  111. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/ruff.toml +0 -0
  112. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/uv.lock +0 -0
  113. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/motion_recorder.py +0 -0
  114. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/motion_storage.py +0 -0
  115. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge.py +0 -0
  116. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/.dockerignore +0 -0
  117. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/.nova +0 -0
  118. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/Dockerfile +0 -0
  119. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/app.yaml +0 -0
  120. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/build.sh +0 -0
  121. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/data/README.md +0 -0
  122. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/deployment.yaml +0 -0
  123. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/ingress.yaml +0 -0
  124. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/kustomization.yaml +0 -0
  125. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/namespace.yaml +0 -0
  126. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/nginx.conf +0 -0
  127. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/nginx.http.conf.template +0 -0
  128. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/skaffold.yaml +0 -0
  129. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/start.sh +0 -0
  130. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/static/app_icon.png +0 -0
  131. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/polling/populate.py +0 -0
  132. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/.dockerignore +0 -0
  133. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/.nova +0 -0
  134. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/Dockerfile +0 -0
  135. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/app.yaml +0 -0
  136. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/build.sh +0 -0
  137. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/deployment.yaml +0 -0
  138. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/ingress.yaml +0 -0
  139. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/kustomization.yaml +0 -0
  140. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/namespace.yaml +0 -0
  141. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/nginx.conf +0 -0
  142. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/nginx.http.conf.template +0 -0
  143. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/skaffold.yaml +0 -0
  144. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/start.sh +0 -0
  145. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/static/app_icon.png +0 -0
  146. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/robot_visualizer.py +0 -0
  147. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/safety_zones.py +0 -0
  148. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/stream_state.py +0 -0
  149. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/trajectory.py +0 -0
  150. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/__init__.py +0 -0
  151. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/api/__init__.py +0 -0
  152. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/api/dependencies.py +0 -0
  153. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/novax.py +0 -0
  154. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_blueprint.py +0 -0
  155. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_log_motion.py +0 -0
  156. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_nova_rerun_bridge.py +0 -0
  157. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_trajectory.py +0 -0
  158. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/novax/conftest.py +0 -0
  159. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/novax/test_novax.py +0 -0
  160. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/novax/test_program_sources.py +0 -0
  161. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/CHANGELOG.md +0 -0
  162. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/README.md +0 -0
  163. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/__init__.py +0 -0
  164. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/__main__.py +0 -0
  165. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/antlrvisitor.py +0 -0
  166. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/__init__.py +0 -0
  167. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/array.py +0 -0
  168. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/assoc.py +0 -0
  169. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/controller.py +0 -0
  170. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/fetch.py +0 -0
  171. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/fs.py +0 -0
  172. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/math.py +0 -0
  173. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/pose.py +0 -0
  174. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/string.py +0 -0
  175. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/wait.py +0 -0
  176. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins.ws +0 -0
  177. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/cli.py +0 -0
  178. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/datatypes.py +0 -0
  179. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/and_or.json +0 -0
  180. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/and_or.ws +0 -0
  181. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/array.config +0 -0
  182. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/array.json +0 -0
  183. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/array.ws +0 -0
  184. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/assignment.json +0 -0
  185. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/assignment.ws +0 -0
  186. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/async_write.json +0 -0
  187. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/async_write.ws +0 -0
  188. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/blending.json +0 -0
  189. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/blending.ws +0 -0
  190. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/bool_negation.json +0 -0
  191. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/bool_negation.ws +0 -0
  192. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/builtins.json +0 -0
  193. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/builtins.ws +0 -0
  194. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/comments.json +0 -0
  195. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/comments.ws +0 -0
  196. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/context.json +0 -0
  197. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/context.ws +0 -0
  198. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/controller.cell.json +0 -0
  199. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/controller.json +0 -0
  200. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/controller.ws +0 -0
  201. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/coordinate_systems.json +0 -0
  202. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/coordinate_systems.ws +0 -0
  203. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/default.cell.json +0 -0
  204. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/default.json +0 -0
  205. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/default.ws +0 -0
  206. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern.json +0 -0
  207. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern.ws +0 -0
  208. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_line.json +0 -0
  209. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_line.ws +0 -0
  210. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_manhattan.json +0 -0
  211. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_manhattan.ws +0 -0
  212. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/empty.json +0 -0
  213. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/empty.ws +0 -0
  214. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/expressions.json +0 -0
  215. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/expressions.ws +0 -0
  216. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/fetch.json +0 -0
  217. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/fetch.ws +0 -0
  218. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/find_edge_from_4_poses.json +0 -0
  219. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/find_edge_from_4_poses.ws +0 -0
  220. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame.json +0 -0
  221. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame.ws +0 -0
  222. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame2.json +0 -0
  223. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame2.ws +0 -0
  224. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame3.cell.json +0 -0
  225. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame3.json +0 -0
  226. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame3.ws +0 -0
  227. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/function.json +0 -0
  228. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/function.ws +0 -0
  229. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/functional_pose.json +0 -0
  230. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/functional_pose.ws +0 -0
  231. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/get_pose.json +0 -0
  232. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/get_pose.ws +0 -0
  233. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/ifelse.json +0 -0
  234. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/ifelse.ws +0 -0
  235. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interpolation.json +0 -0
  236. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interpolation.ws +0 -0
  237. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interrupt.json +0 -0
  238. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interrupt.ws +0 -0
  239. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/io.json +0 -0
  240. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/io.ws +0 -0
  241. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/loops.json +0 -0
  242. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/loops.ws +0 -0
  243. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move.json +0 -0
  244. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move.ws +0 -0
  245. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_via_expression.json +0 -0
  246. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_via_expression.ws +0 -0
  247. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_with_velocity.json +0 -0
  248. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_with_velocity.ws +0 -0
  249. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots.cell.json +0 -0
  250. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots.json +0 -0
  251. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots.ws +0 -0
  252. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots2.cell.json +0 -0
  253. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots2.json +0 -0
  254. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots2.ws +0 -0
  255. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots3.cell.json +0 -0
  256. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots3.json +0 -0
  257. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots3.ws +0 -0
  258. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/not.json +0 -0
  259. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/not.ws +0 -0
  260. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/operator_precedence.json +0 -0
  261. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/operator_precedence.ws +0 -0
  262. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/pose.json +0 -0
  263. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/pose.ws +0 -0
  264. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/poses2.json +0 -0
  265. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/poses2.ws +0 -0
  266. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/print.json +0 -0
  267. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/print.ws +0 -0
  268. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/record.json +0 -0
  269. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/record.ws +0 -0
  270. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/scope.json +0 -0
  271. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/scope.ws +0 -0
  272. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/spline.json +0 -0
  273. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/spline.ws +0 -0
  274. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/switch.json +0 -0
  275. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/switch.ws +0 -0
  276. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tcps.cell.json +0 -0
  277. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tcps.json +0 -0
  278. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tcps.ws +0 -0
  279. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tower_of_hanoi.cell.json +0 -0
  280. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tower_of_hanoi.json +0 -0
  281. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tower_of_hanoi.ws +0 -0
  282. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/try.json +0 -0
  283. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/try.ws +0 -0
  284. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/vision_move.json +0 -0
  285. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/vision_move.ws +0 -0
  286. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wait.config +0 -0
  287. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wait.json +0 -0
  288. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wait.ws +0 -0
  289. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat2.json +0 -0
  290. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat2.ws +0 -0
  291. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat3.json +0 -0
  292. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat3.ws +0 -0
  293. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/whitespaces.json +0 -0
  294. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/whitespaces.ws +0 -0
  295. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp393.json +0 -0
  296. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp393.ws +0 -0
  297. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp469.json +0 -0
  298. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp469.ws +0 -0
  299. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples.py +0 -0
  300. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/exception.py +0 -0
  301. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/ffi.py +0 -0
  302. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/ffi_loader.py +0 -0
  303. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/frames.py +0 -0
  304. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/WandelscriptLexerBase.py +0 -0
  305. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/__init__.py +0 -0
  306. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.g4 +0 -0
  307. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.interp +0 -0
  308. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.py +0 -0
  309. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.tokens +0 -0
  310. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.g4 +0 -0
  311. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.interp +0 -0
  312. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.py +0 -0
  313. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.tokens +0 -0
  314. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParserListener.py +0 -0
  315. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParserVisitor.py +0 -0
  316. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/metamodel.py +0 -0
  317. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/migration.py +0 -0
  318. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/models.py +0 -0
  319. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/motions.py +0 -0
  320. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/operators.py +0 -0
  321. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/runner.py +0 -0
  322. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/runtime.py +0 -0
  323. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/scripts/generate_parser.sh +0 -0
  324. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/simulation.py +0 -0
  325. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/__init__.py +0 -0
  326. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_builtins.py +0 -0
  327. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_examples.py +0 -0
  328. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_executor.py +0 -0
  329. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_ffi.py +0 -0
  330. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_migration.py +0 -0
  331. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_motion.py +0 -0
  332. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_move.py +0 -0
  333. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_multirobot.py +0 -0
  334. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_parser.py +0 -0
  335. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_programs.py +0 -0
  336. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_run_twice.py +0 -0
  337. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_runner.py +0 -0
  338. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_runtime.py +0 -0
  339. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_simulation.py +0 -0
  340. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_stepwise.py +0 -0
  341. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_store.py +0 -0
  342. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_two_step_execution.py +0 -0
  343. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_types.py +0 -0
  344. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/__init__.py +0 -0
  345. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/pose.py +0 -0
  346. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/runtime.py +0 -0
  347. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/serializer.py +0 -0
  348. {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wandelbots-nova
3
- Version: 2.2.2
3
+ Version: 2.3.0
4
4
  Summary: Official Python SDK for the Wandelbots Nova
5
5
  Author: Wandelbots GmbH
6
6
  Author-email: Christoph Biering <christoph.biering@wandelbots.com>, Mahsum Demir <mahsum.demir@wandelbots.com>, Dirk Sonnemann <dirk.sonnemann@wandelbots.com>, Andreas Langenhagen <andreas.langenhagen@wandelbots.com>, Stefan Wagner <stefan.wagner@wandelbots.com>, André Kühnert <andre.kuhnert@wandelbots.com>
@@ -0,0 +1,78 @@
1
+ from typing import Any
2
+
3
+ from fastapi import APIRouter, Body, Depends, HTTPException, Path
4
+
5
+ from novax.api.dependencies import get_program_manager
6
+ from novax.program_manager import ProgramDetails, ProgramManager, ProgramRun, RunProgramRequest
7
+
8
+ router = APIRouter(prefix="/programs", tags=["programs"])
9
+
10
+
11
+ class ProgramResponse(ProgramDetails):
12
+ input_schema: dict[str, Any]
13
+
14
+
15
+ @router.get("", operation_id="getPrograms", response_model=list[ProgramResponse])
16
+ async def get_programs(program_manager: ProgramManager = Depends(get_program_manager)):
17
+ """List all programs"""
18
+ programs = await program_manager.get_programs()
19
+ return [
20
+ ProgramResponse(
21
+ **program_details.model_dump(),
22
+ input_schema=program_manager._program_functions[program].json_schema,
23
+ )
24
+ for program, program_details in programs.items()
25
+ ]
26
+
27
+
28
+ @router.get("/{program}", operation_id="getProgram", response_model=ProgramResponse)
29
+ async def get_program(
30
+ program: str = Path(..., description="The ID of the program"),
31
+ program_manager: ProgramManager = Depends(get_program_manager),
32
+ ):
33
+ """Get program details"""
34
+ program_details = await program_manager.get_program(program)
35
+ if not program_details:
36
+ raise HTTPException(status_code=404, detail="Program not found")
37
+
38
+ program_fn = program_manager._program_functions[program]
39
+
40
+ return ProgramResponse(**program_details.model_dump(), input_schema=program_fn.json_schema)
41
+
42
+
43
+ @router.post("/{program}/start", operation_id="startProgram", response_model=ProgramRun)
44
+ async def start_program(
45
+ program: str = Path(..., description="The ID of the program"),
46
+ request: RunProgramRequest = Body(...),
47
+ program_manager: ProgramManager = Depends(get_program_manager),
48
+ ):
49
+ """Run a program"""
50
+ if not await program_manager.get_program(program):
51
+ raise HTTPException(status_code=404, detail="Program not found")
52
+
53
+ if program_manager.running_program:
54
+ raise HTTPException(status_code=400, detail="A program is already running")
55
+
56
+ return await program_manager.run_program(program, request.parameters)
57
+
58
+
59
+ @router.post("/{program}/stop", operation_id="stopProgram")
60
+ async def stop_program(
61
+ program: str = Path(..., description="The ID of the program"),
62
+ program_manager: ProgramManager = Depends(get_program_manager),
63
+ ):
64
+ """Stop the run"""
65
+ if not await program_manager.get_program(program):
66
+ raise HTTPException(status_code=404, detail="Program not found")
67
+
68
+ if not program_manager.running_program:
69
+ raise HTTPException(status_code=400, detail="No program is running")
70
+
71
+ if program_manager.running_program != program:
72
+ raise HTTPException(
73
+ status_code=400,
74
+ detail="Program is not running. Currently running: {program_manager.running_program}",
75
+ )
76
+
77
+ await program_manager.stop_program(program)
78
+ return None
@@ -84,12 +84,20 @@ class ProgramManager:
84
84
  def __init__(self):
85
85
  self._programs: dict[str, ProgramDetails] = {}
86
86
  self._program_functions: dict[str, Program] = {}
87
- self._runners: dict[str, dict[str, NovaxProgramRunner]] = {}
87
+ self._runner: NovaxProgramRunner | None = None
88
88
  self._program_sources: list[ProgramSource] = []
89
89
 
90
90
  def has_program(self, program_id: str) -> bool:
91
91
  return program_id in self._programs
92
92
 
93
+ @property
94
+ def is_any_program_running(self) -> bool:
95
+ return self._runner is not None and self._runner.is_running()
96
+
97
+ @property
98
+ def running_program(self) -> Optional[str]:
99
+ return self._runner.program_id if self.is_any_program_running and self._runner else None
100
+
93
101
  def register_program_source(self, program_source: ProgramSource) -> None:
94
102
  """
95
103
  Register a program source with the program manager.
@@ -145,32 +153,29 @@ class ProgramManager:
145
153
  """Get a specific program by ID"""
146
154
  return self._programs.get(program_id)
147
155
 
148
- async def get_program_runs(self, program_id: str) -> list[ProgramRun]:
149
- """Get all runs for a specific program"""
150
- return [runner.program_run for runner in self._runners.get(program_id, {}).values()]
151
-
152
- async def get_program_run(self, program_id: str, run_id: str) -> ProgramRun:
153
- """Get a specific run for a program"""
154
- return self._runners[program_id][run_id].program_run
155
-
156
156
  async def run_program(
157
- self, program_id: str, parameters: Optional[dict[str, Any]] = None
157
+ self, program_id: str, parameters: dict[str, Any] | None = None
158
158
  ) -> ProgramRun:
159
159
  """Run a registered program with given parameters"""
160
- runner = NovaxProgramRunner(program_id, self._program_functions, parameters)
161
- if program_id not in self._runners:
162
- self._runners[program_id] = {}
163
- self._runners[program_id][runner.run_id] = runner
160
+ if self.is_any_program_running:
161
+ raise RuntimeError("A program is already running")
162
+
163
+ runner = self._runner = NovaxProgramRunner(program_id, self._program_functions, parameters)
164
164
  runner.start(sync=False)
165
165
  return runner.program_run
166
166
 
167
- async def stop_program(self, program_id: str, run_id: str):
167
+ async def stop_program(self, program_id: str):
168
168
  """Stop a running program"""
169
- runner = self._runners[program_id][run_id]
170
- if not runner:
171
- raise ValueError(f"Runner {run_id} not found")
172
- runner.stop(sync=True)
173
- del self._runners[program_id][run_id]
169
+ if not self.is_any_program_running or self._runner is None:
170
+ raise RuntimeError("No program is running")
171
+
172
+ if self.running_program != program_id:
173
+ raise RuntimeError(
174
+ f"Program {program_id} is not running. Currently running: {self.running_program}"
175
+ )
176
+
177
+ self._runner.stop(sync=True)
178
+ self._runner = None
174
179
 
175
180
 
176
181
  # Example implementations of ProgramSource
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "wandelbots-nova"
3
- version = "2.2.2"
3
+ version = "2.3.0"
4
4
  description = "Official Python SDK for the Wandelbots Nova"
5
5
  authors = [
6
6
  { name = "Wandelbots GmbH" },
@@ -0,0 +1,136 @@
1
+ import asyncio
2
+
3
+ import pytest
4
+ from fastapi.testclient import TestClient
5
+
6
+
7
+ def test_get_programs(novax_app):
8
+ client = TestClient(novax_app)
9
+ response = client.get("/programs")
10
+
11
+ assert response.status_code == 200
12
+ programs = response.json()
13
+ assert isinstance(programs, list)
14
+ assert len(programs) >= 1
15
+
16
+ # Check that simple_program is in the list
17
+ program_ids = [p["program_id"] for p in programs]
18
+ assert "simple_program" in program_ids
19
+
20
+ # Check program structure
21
+ simple_program = next(p for p in programs if p["program_id"] == "simple_program")
22
+ assert "program_id" in simple_program
23
+ assert "created_at" in simple_program
24
+ assert "updated_at" in simple_program
25
+
26
+
27
+ def test_get_program_success(novax_app):
28
+ client = TestClient(novax_app)
29
+ response = client.get("/programs/simple_program")
30
+
31
+ assert response.status_code == 200
32
+ program = response.json()
33
+
34
+ assert program["program_id"] == "simple_program"
35
+ assert "created_at" in program
36
+ assert "updated_at" in program
37
+ assert "input_schema" in program
38
+
39
+
40
+ def test_get_program_not_found(novax_app):
41
+ client = TestClient(novax_app)
42
+ response = client.get("/programs/nonexistent_program")
43
+
44
+ assert response.status_code == 404
45
+ assert response.json()["detail"] == "Program not found"
46
+
47
+
48
+ def test_start_program_success(novax_app):
49
+ client = TestClient(novax_app)
50
+ response = client.post(
51
+ "/programs/simple_program/start", json={"parameters": {"number_of_steps": 5}}
52
+ )
53
+
54
+ assert response.status_code == 200
55
+ run = response.json()
56
+
57
+ assert "run_id" in run
58
+ assert "program_id" in run
59
+ assert "state" in run
60
+
61
+
62
+ def test_start_program_without_parameters(novax_app):
63
+ client = TestClient(novax_app)
64
+ response = client.post("/programs/simple_program/start", json={})
65
+
66
+ assert response.status_code == 200
67
+ run = response.json()
68
+
69
+ assert "run_id" in run
70
+ assert "program_id" in run
71
+ assert "state" in run
72
+
73
+
74
+ def test_start_program_not_found(novax_app):
75
+ client = TestClient(novax_app)
76
+ response = client.post("/programs/nonexistent_program/start", json={"parameters": {}})
77
+
78
+ assert response.status_code == 404
79
+ assert response.json()["detail"] == "Program not found"
80
+
81
+
82
+ def test_start_program(novax_app):
83
+ client = TestClient(novax_app)
84
+
85
+ # Start first program
86
+ response1 = client.post(
87
+ "/programs/simple_program/start", json={"parameters": {"number_of_steps": 10}}
88
+ )
89
+ assert response1.status_code == 200
90
+
91
+
92
+ @pytest.mark.integration
93
+ @pytest.mark.asyncio
94
+ async def test_stop_program_success(novax_app):
95
+ client = TestClient(novax_app)
96
+
97
+ # First start a program
98
+ start_response = client.post(
99
+ "/programs/simple_program/start", json={"parameters": {"number_of_steps": 30}}
100
+ )
101
+ assert start_response.status_code == 200
102
+ await asyncio.sleep(3)
103
+
104
+ # Then stop the program
105
+ response = client.post("/programs/simple_program/stop")
106
+ assert response.status_code == 200, response.json()
107
+
108
+
109
+ def test_stop_program_not_found(novax_app):
110
+ client = TestClient(novax_app)
111
+ response = client.post("/programs/nonexistent_program/stop")
112
+
113
+ assert response.status_code == 404
114
+ assert response.json()["detail"] == "Program not found"
115
+
116
+
117
+ def test_stop_program_not_running(novax_app):
118
+ client = TestClient(novax_app)
119
+ response = client.post("/programs/simple_program/stop")
120
+
121
+ assert response.status_code == 400
122
+ assert response.json()["detail"] == "No program is running"
123
+
124
+
125
+ def test_stop_program_wrong_program(novax_app):
126
+ client = TestClient(novax_app)
127
+
128
+ # Start a program
129
+ start_response = client.post(
130
+ "/programs/simple_program/start", json={"parameters": {"number_of_steps": 10}}
131
+ )
132
+ assert start_response.status_code == 200
133
+
134
+ # Try to stop a non existing program
135
+ response = client.post("/programs/different_program/stop")
136
+ assert response.status_code == 404
@@ -0,0 +1,46 @@
1
+ import asyncio
2
+
3
+ import dotenv
4
+
5
+ import nova
6
+
7
+ dotenv.load_dotenv()
8
+
9
+
10
+ @nova.program(name="test")
11
+ async def test():
12
+ print("Hello, world!")
13
+
14
+
15
+ @nova.program(name="simple_program")
16
+ async def simple_program(number_of_steps: int = 30):
17
+ print("Hello World!")
18
+
19
+ for i in range(number_of_steps):
20
+ print(f"Step: {i}")
21
+ await asyncio.sleep(1)
22
+
23
+ print("Finished Hello World!")
24
+
25
+
26
+ if __name__ == "__main__":
27
+ import uvicorn
28
+
29
+ from novax import Novax
30
+
31
+ novax = Novax()
32
+ app = novax.create_app()
33
+ novax.include_programs_router(app)
34
+
35
+ novax.register_program(test)
36
+ novax.register_program(simple_program)
37
+
38
+ uvicorn.run(
39
+ app,
40
+ host="0.0.0.0",
41
+ port=8000,
42
+ reload=False,
43
+ log_level="info",
44
+ proxy_headers=True,
45
+ forwarded_allow_ips="*",
46
+ )
@@ -1,94 +0,0 @@
1
- from fastapi import APIRouter, Body, Depends, HTTPException, Path
2
-
3
- from novax.api.dependencies import get_program_manager
4
- from novax.program_manager import ProgramDetails, ProgramManager, ProgramRun, RunProgramRequest
5
-
6
- router = APIRouter(prefix="/programs", tags=["programs"])
7
-
8
-
9
- @router.get("", operation_id="getPrograms", response_model=list[ProgramDetails])
10
- async def get_programs(program_manager: ProgramManager = Depends(get_program_manager)):
11
- """List all programs"""
12
- programs = await program_manager.get_programs()
13
- return list(programs.values())
14
-
15
-
16
- @router.get("/{program}", operation_id="getProgram")
17
- async def get_program(
18
- program: str = Path(..., description="The ID of the program"),
19
- program_manager: ProgramManager = Depends(get_program_manager),
20
- ):
21
- """Get program details"""
22
- program_details = await program_manager.get_program(program)
23
- if not program_details:
24
- raise HTTPException(status_code=404, detail="Program not found")
25
-
26
- program_fn = program_manager._program_functions[program]
27
-
28
- return {
29
- **program_details.model_dump(),
30
- "input_schema": program_fn.json_schema,
31
- "_links": {
32
- "self": {"href": f"/programs/{program}", "method": "GET"},
33
- "runs": {"href": f"/programs/{program}/runs", "method": "POST"},
34
- },
35
- }
36
-
37
-
38
- @router.get("/{program}/runs", operation_id="getProgramRuns", response_model=list[ProgramRun])
39
- async def get_program_runs(
40
- program: str = Path(..., description="The ID of the program"),
41
- program_manager: ProgramManager = Depends(get_program_manager),
42
- ):
43
- """List all program runs"""
44
- if not await program_manager.get_program(program):
45
- raise HTTPException(status_code=404, detail="Program not found")
46
-
47
- return await program_manager.get_program_runs(program)
48
-
49
-
50
- @router.post("/{program}/runs", operation_id="runProgram", response_model=ProgramRun)
51
- async def run_program(
52
- program: str = Path(..., description="The ID of the program"),
53
- request: RunProgramRequest = Body(...),
54
- program_manager: ProgramManager = Depends(get_program_manager),
55
- ):
56
- """Run a program"""
57
- if not await program_manager.get_program(program):
58
- raise HTTPException(status_code=404, detail="Program not found")
59
-
60
- return await program_manager.run_program(program, request.parameters)
61
-
62
-
63
- @router.get("/{program}/runs/{run}", operation_id="getProgramRun")
64
- async def get_program_run(
65
- program: str = Path(..., description="The ID of the program"),
66
- run: str = Path(..., description="The ID of the run"),
67
- program_manager: ProgramManager = Depends(get_program_manager),
68
- ):
69
- """Get state of the run"""
70
- if not await program_manager.get_program(program):
71
- raise HTTPException(status_code=404, detail="Program not found")
72
-
73
- program_run = await program_manager.get_program_run(program, run)
74
- return {
75
- **program_run.model_dump(),
76
- "_links": {
77
- "self": {"href": f"/programs/{program}/runs/{run}", "method": "GET"},
78
- "stop": {"href": f"/programs/{program}/runs/{run}/stop", "method": "POST"},
79
- },
80
- }
81
-
82
-
83
- @router.post("/{program}/runs/{run}/stop", operation_id="stopProgramRun", status_code=204)
84
- async def stop_program_run(
85
- program: str = Path(..., description="The ID of the program"),
86
- run: str = Path(..., description="The ID of the run"),
87
- program_manager: ProgramManager = Depends(get_program_manager),
88
- ):
89
- """Stop the run"""
90
- if not await program_manager.get_program(program):
91
- raise HTTPException(status_code=404, detail="Program not found")
92
-
93
- await program_manager.stop_program(program, run)
94
- return None
@@ -1,177 +0,0 @@
1
- import asyncio
2
-
3
- import pytest
4
- from fastapi.testclient import TestClient
5
-
6
-
7
- def test_get_programs(novax_app):
8
- """Test GET /programs - list all programs"""
9
- client = TestClient(novax_app)
10
- response = client.get("/programs")
11
-
12
- assert response.status_code == 200
13
- programs = response.json()
14
- assert isinstance(programs, list)
15
- assert len(programs) >= 1
16
-
17
- # Check that simple_program is in the list
18
- program_ids = [p["program_id"] for p in programs]
19
- assert "simple_program" in program_ids
20
-
21
- # Check program structure
22
- simple_program = next(p for p in programs if p["program_id"] == "simple_program")
23
- assert "program_id" in simple_program
24
- assert "created_at" in simple_program
25
- assert "updated_at" in simple_program
26
-
27
-
28
- def test_get_program_success(novax_app):
29
- """Test GET /programs/{program} - get program details"""
30
- client = TestClient(novax_app)
31
- response = client.get("/programs/simple_program")
32
-
33
- assert response.status_code == 200
34
- program = response.json()
35
-
36
- assert program["program_id"] == "simple_program"
37
- assert "created_at" in program
38
- assert "updated_at" in program
39
- assert "input_schema" in program
40
- assert "_links" in program
41
- assert "self" in program["_links"]
42
- assert "runs" in program["_links"]
43
-
44
-
45
- def test_get_program_not_found(novax_app):
46
- """Test GET /programs/{program} - program not found"""
47
- client = TestClient(novax_app)
48
- response = client.get("/programs/nonexistent_program")
49
-
50
- assert response.status_code == 404
51
- assert response.json()["detail"] == "Program not found"
52
-
53
-
54
- def test_list_program_runs_empty(novax_app):
55
- """Test GET /programs/{program}/runs - list runs (empty)"""
56
- client = TestClient(novax_app)
57
- response = client.get("/programs/simple_program/runs")
58
-
59
- assert response.status_code == 200
60
- runs = response.json()
61
- assert isinstance(runs, list)
62
- assert len(runs) == 0
63
-
64
-
65
- def test_list_program_runs_program_not_found(novax_app):
66
- """Test GET /programs/{program}/runs - program not found"""
67
- client = TestClient(novax_app)
68
- response = client.get("/programs/nonexistent_program/runs")
69
-
70
- assert response.status_code == 404
71
- assert response.json()["detail"] == "Program not found"
72
-
73
-
74
- def test_run_program_success(novax_app):
75
- """Test POST /programs/{program}/runs - run program"""
76
- client = TestClient(novax_app)
77
- response = client.post(
78
- "/programs/simple_program/runs", json={"parameters": {"number_of_steps": 5}}
79
- )
80
-
81
- assert response.status_code == 200
82
- run = response.json()
83
-
84
- assert "run_id" in run
85
- assert "program_id" in run
86
- assert "state" in run
87
-
88
-
89
- def test_run_program_without_parameters(novax_app):
90
- """Test POST /programs/{program}/runs - run program without parameters"""
91
- client = TestClient(novax_app)
92
- response = client.post("/programs/simple_program/runs", json={})
93
-
94
- assert response.status_code == 200
95
- run = response.json()
96
-
97
- assert "run_id" in run
98
- assert "program_id" in run
99
- assert "state" in run
100
-
101
-
102
- def test_run_program_not_found(novax_app):
103
- """Test POST /programs/{program}/runs - program not found"""
104
- client = TestClient(novax_app)
105
- response = client.post("/programs/nonexistent_program/runs", json={"parameters": {}})
106
-
107
- assert response.status_code == 404
108
- assert response.json()["detail"] == "Program not found"
109
-
110
-
111
- def test_get_program_run_success(novax_app):
112
- """Test GET /programs/{program}/runs/{run} - get run details"""
113
- client = TestClient(novax_app)
114
-
115
- # First create a run
116
- run_response = client.post(
117
- "/programs/simple_program/runs", json={"parameters": {"number_of_steps": 1}}
118
- )
119
- assert run_response.status_code == 200
120
- run_id = run_response.json()["run_id"]
121
-
122
- # Then get the run details
123
- response = client.get(f"/programs/simple_program/runs/{run_id}")
124
-
125
- assert response.status_code == 200
126
- run = response.json()
127
-
128
- assert run["run_id"] == run_id
129
- assert run["program_id"] == "simple_program"
130
- assert "state" in run
131
- assert "_links" in run
132
- assert "self" in run["_links"]
133
- assert "stop" in run["_links"]
134
-
135
-
136
- def test_get_program_run_program_not_found(novax_app):
137
- """Test GET /programs/{program}/runs/{run} - program not found"""
138
- client = TestClient(novax_app)
139
- response = client.get("/programs/nonexistent_program/runs/some_run_id")
140
-
141
- assert response.status_code == 404
142
- assert response.json()["detail"] == "Program not found"
143
-
144
-
145
- @pytest.mark.integration
146
- @pytest.mark.asyncio
147
- async def test_stop_program_run_success(novax_app):
148
- """Test POST /programs/{program}/runs/{run}/stop - stop run"""
149
- client = TestClient(novax_app)
150
-
151
- # First create a run
152
- run_response = client.post(
153
- "/programs/simple_program/runs", json={"parameters": {"number_of_steps": 10}}
154
- )
155
- assert run_response.status_code == 200
156
- print(run_response.json())
157
- run_id = run_response.json()["run_id"]
158
- print(run_id)
159
-
160
- await asyncio.sleep(4)
161
-
162
- r = client.get(f"/programs/simple_program/runs/{run_id}")
163
- print(r.json())
164
-
165
- # Then stop the run
166
- response = client.post(f"/programs/simple_program/runs/{run_id}/stop")
167
-
168
- assert response.status_code == 204
169
-
170
-
171
- def test_stop_program_run_program_not_found(novax_app):
172
- """Test POST /programs/{program}/runs/{run}/stop - program not found"""
173
- client = TestClient(novax_app)
174
- response = client.post("/programs/nonexistent_program/runs/some_run_id/stop")
175
-
176
- assert response.status_code == 404
177
- assert response.json()["detail"] == "Program not found"
File without changes