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.
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/PKG-INFO +1 -1
- wandelbots_nova-2.3.0/novax/api/programs.py +78 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/program_manager.py +25 -20
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/pyproject.toml +1 -1
- wandelbots_nova-2.3.0/tests/novax/api/test_programs.py +136 -0
- wandelbots_nova-2.3.0/tests/novax/serve.py +46 -0
- wandelbots_nova-2.2.2/novax/api/programs.py +0 -94
- wandelbots_nova-2.2.2/tests/novax/api/test_programs.py +0 -177
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/.gitignore +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/LICENSE +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/base.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/container.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/io.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/mock.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/actions/motions.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/api.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/auth/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/auth/auth_config.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/auth/authorization.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/cell.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/controllers.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/cell/robot_cell.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/controller.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/env_handler.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/exceptions.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/gateway.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/io.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/logging.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/motion_group.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/movement_controller.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/core/nova.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/events/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/events/nats.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/opcua/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/opcua/client.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/extentions/opcua/functions.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/exceptions.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/function.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/runner.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/program/utils.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/collision_scene.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/motion_settings.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/pose.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/state.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/types/vector3d.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/utils.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/version.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/base.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/manager.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/protocol.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/rerun.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova/viewers/utils.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/LICENSE +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/benchmark_base.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/demo_set.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/mb_set.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/dataset/mpinets_set.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/datasets.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/log_successful_planning.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/robometrics_helper.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/run_collision_free_benchmark.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/run_collision_free_magma.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/benchmark/run_ptp_benchmark.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/blueprint.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/collision_scene.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/colors.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/consts.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/conversion_helpers.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/dh_robot.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/Welding_Benchmark_USA_01.stl +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/bin_everything_05.ply +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/colliders.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/source.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/tool.stl +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/example_data/yaskawa_ar1440_rif_with_safety_zones.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/collison_world.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/import_ply.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/reachability_check.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/robocore.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/stream_robot.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/use_nova_rerun_bridge.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/visualize_tool.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/wait_action.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/welding_example.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/yaskawa-ar1440-16-mounting.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/examples/yaskawa-ar1440-with-external-axis.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/code_server_helpers.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/download_models.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/helper_scripts/plan_with_collisions.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/hull_visualizer.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/.gitignore +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/main.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/poetry.toml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/pyproject.toml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/ruff.toml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/minimal_example/uv.lock +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/motion_recorder.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/motion_storage.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/.dockerignore +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/.nova +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/Dockerfile +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/app.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/build.sh +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/data/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/deployment.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/ingress.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/kustomization.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/k8s/namespace.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/nginx.conf +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/nginx.http.conf.template +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/skaffold.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/start.sh +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/nova_rerun_bridge_app/static/app_icon.png +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/polling/populate.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/.dockerignore +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/.nova +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/Dockerfile +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/app.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/build.sh +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/deployment.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/ingress.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/kustomization.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/k8s/namespace.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/nginx.conf +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/nginx.http.conf.template +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/skaffold.yaml +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/start.sh +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/rerun_app/static/app_icon.png +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/robot_visualizer.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/safety_zones.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/stream_state.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/nova_rerun_bridge/trajectory.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/api/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/api/dependencies.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/novax/novax.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_blueprint.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_log_motion.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_nova_rerun_bridge.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/nova_rerun_bridge/test_trajectory.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/novax/conftest.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/novax/test_novax.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/tests/novax/test_program_sources.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/CHANGELOG.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/README.md +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/__main__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/antlrvisitor.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/array.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/assoc.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/controller.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/fetch.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/fs.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/math.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/pose.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/string.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins/wait.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/builtins.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/cli.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/datatypes.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/and_or.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/and_or.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/array.config +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/array.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/array.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/assignment.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/assignment.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/async_write.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/async_write.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/blending.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/blending.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/bool_negation.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/bool_negation.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/builtins.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/builtins.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/comments.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/comments.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/context.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/context.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/controller.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/controller.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/controller.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/coordinate_systems.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/coordinate_systems.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/default.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/default.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/default.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_line.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_line.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_manhattan.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/edge_pattern_manhattan.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/empty.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/empty.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/expressions.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/expressions.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/fetch.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/fetch.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/find_edge_from_4_poses.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/find_edge_from_4_poses.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame2.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame2.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame3.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame3.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/frame3.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/function.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/function.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/functional_pose.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/functional_pose.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/get_pose.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/get_pose.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/ifelse.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/ifelse.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interpolation.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interpolation.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interrupt.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/interrupt.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/io.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/io.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/loops.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/loops.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_via_expression.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_via_expression.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_with_velocity.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/move_with_velocity.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots2.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots2.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots2.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots3.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots3.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/multiple_robots3.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/not.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/not.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/operator_precedence.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/operator_precedence.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/pose.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/pose.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/poses2.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/poses2.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/print.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/print.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/record.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/record.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/scope.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/scope.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/spline.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/spline.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/switch.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/switch.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tcps.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tcps.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tcps.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tower_of_hanoi.cell.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tower_of_hanoi.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/tower_of_hanoi.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/try.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/try.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/vision_move.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/vision_move.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wait.config +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wait.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wait.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat2.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat2.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat3.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wandelchat3.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/whitespaces.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/whitespaces.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp393.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp393.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp469.json +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples/wp469.ws +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/examples.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/exception.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/ffi.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/ffi_loader.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/frames.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/WandelscriptLexerBase.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.g4 +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.interp +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptLexer.tokens +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.g4 +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.interp +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParser.tokens +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParserListener.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/grammar/wandelscriptParserVisitor.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/metamodel.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/migration.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/models.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/motions.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/operators.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/runner.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/runtime.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/scripts/generate_parser.sh +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/simulation.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_builtins.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_examples.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_executor.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_ffi.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_migration.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_motion.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_move.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_multirobot.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_parser.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_programs.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_run_twice.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_runner.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_runtime.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_simulation.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_stepwise.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_store.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_two_step_execution.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/tests/test_types.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/__init__.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/pose.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/runtime.py +0 -0
- {wandelbots_nova-2.2.2 → wandelbots_nova-2.3.0}/wandelscript/utils/serializer.py +0 -0
- {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.
|
|
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.
|
|
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:
|
|
157
|
+
self, program_id: str, parameters: dict[str, Any] | None = None
|
|
158
158
|
) -> ProgramRun:
|
|
159
159
|
"""Run a registered program with given parameters"""
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
self.
|
|
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
|
|
167
|
+
async def stop_program(self, program_id: str):
|
|
168
168
|
"""Stop a running program"""
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
|
@@ -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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|