runnable 0.14.0__tar.gz → 0.17.0__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {runnable-0.14.0 → runnable-0.17.0}/.dockerignore +2 -0
- {runnable-0.14.0 → runnable-0.17.0}/.github/workflows/release.yaml +1 -1
- {runnable-0.14.0 → runnable-0.17.0}/.gitignore +2 -0
- runnable-0.17.0/.python-version +1 -0
- runnable-0.17.0/Dockerfile +22 -0
- {runnable-0.14.0 → runnable-0.17.0}/PKG-INFO +6 -3
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/python_tasks.py +0 -1
- runnable-0.17.0/examples/11-jobs/catalog.py +23 -0
- runnable-0.17.0/examples/11-jobs/catalog.yaml +5 -0
- runnable-0.17.0/examples/11-jobs/k8s-job.yaml +41 -0
- runnable-0.17.0/examples/11-jobs/local-container.yaml +4 -0
- runnable-0.17.0/examples/11-jobs/notebook.yaml +3 -0
- runnable-0.17.0/examples/11-jobs/passing_parameters_python.py +47 -0
- runnable-0.17.0/examples/11-jobs/python_parameters.yaml +11 -0
- runnable-0.17.0/examples/11-jobs/python_tasks.py +44 -0
- runnable-0.17.0/examples/11-jobs/python_tasks.yaml +2 -0
- runnable-0.17.0/examples/11-jobs/scripts.yaml +20 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/argo-config.yaml +6 -6
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/chunked-fs-run_log.yaml +1 -1
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/default.yaml +2 -2
- runnable-0.17.0/examples/configs/in-memory.yaml +14 -0
- runnable-0.17.0/examples/configs/local-container.yaml +7 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config-debug.yaml +2 -2
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config-simple.yaml +2 -2
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config-unittest.yaml +2 -2
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config.yaml +2 -2
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/retry-config.yaml +2 -2
- runnable-0.17.0/extensions/job_executor/__init__.py +160 -0
- runnable-0.17.0/extensions/job_executor/k8s.py +362 -0
- runnable-0.17.0/extensions/job_executor/k8s_job_spec.yaml +37 -0
- runnable-0.17.0/extensions/job_executor/local.py +61 -0
- runnable-0.17.0/extensions/job_executor/local_container.py +192 -0
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/job_executor}/pyproject.toml +1 -1
- {runnable-0.14.0 → runnable-0.17.0}/extensions/nodes/nodes.py +1 -1
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/__init__.py +9 -66
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/argo.py +45 -70
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/local.py +17 -34
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/local_container.py +93 -186
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/mocked.py +3 -6
- runnable-0.17.0/extensions/pipeline_executor/pyproject.toml +7 -0
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/retry.py +3 -7
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/file_system.py +6 -3
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/generic_chunked.py +11 -9
- {runnable-0.14.0 → runnable-0.17.0}/pyproject.toml +25 -13
- {runnable-0.14.0 → runnable-0.17.0}/runnable/__init__.py +1 -1
- {runnable-0.14.0 → runnable-0.17.0}/runnable/catalog.py +2 -0
- runnable-0.17.0/runnable/cli.py +324 -0
- {runnable-0.14.0 → runnable-0.17.0}/runnable/context.py +12 -3
- {runnable-0.14.0 → runnable-0.17.0}/runnable/datastore.py +159 -25
- {runnable-0.14.0 → runnable-0.17.0}/runnable/defaults.py +13 -54
- {runnable-0.14.0 → runnable-0.17.0}/runnable/entrypoints.py +197 -185
- {runnable-0.14.0 → runnable-0.17.0}/runnable/exceptions.py +22 -0
- {runnable-0.14.0 → runnable-0.17.0}/runnable/executor.py +114 -88
- {runnable-0.14.0 → runnable-0.17.0}/runnable/graph.py +0 -1
- {runnable-0.14.0 → runnable-0.17.0}/runnable/nodes.py +36 -6
- {runnable-0.14.0 → runnable-0.17.0}/runnable/sdk.py +132 -36
- {runnable-0.14.0 → runnable-0.17.0}/runnable/tasks.py +6 -15
- {runnable-0.14.0 → runnable-0.17.0}/runnable/utils.py +22 -30
- {runnable-0.14.0/tests/extensions/executor → runnable-0.17.0/tests/extensions/pipeline_executor}/test_argo_executor.py +1 -1
- {runnable-0.14.0/tests/extensions/executor → runnable-0.17.0/tests/extensions/pipeline_executor}/test_generic_executor.py +2 -47
- {runnable-0.14.0/tests/extensions/executor → runnable-0.17.0/tests/extensions/pipeline_executor}/test_local_executor.py +1 -1
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_nodes.py +20 -7
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_utils.py +4 -5
- {runnable-0.14.0 → runnable-0.17.0}/tests/test_examples.py +70 -36
- {runnable-0.14.0 → runnable-0.17.0}/uv.lock +161 -246
- runnable-0.14.0/.python-version +0 -1
- runnable-0.14.0/examples/configs/local-container.yaml +0 -7
- runnable-0.14.0/extensions/executor/k8s_job/implementation_FF.py +0 -259
- runnable-0.14.0/extensions/executor/k8s_job/integration_FF.py +0 -70
- runnable-0.14.0/runnable/cli.py +0 -367
- runnable-0.14.0/runnable/integration.py +0 -197
- runnable-0.14.0/tests/extensions/executor/test_local_container_integration.py +0 -51
- runnable-0.14.0/tests/runnable/test_integration.py +0 -153
- {runnable-0.14.0 → runnable-0.17.0}/.github/workflows/docs.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/.github/workflows/pr.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/.mypy.ini +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/.pre-commit-config.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/CHANGELOG.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/CONTRIBUTING.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/LICENSE +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/README.md +0 -0
- /runnable-0.14.0/docs/configurations/executors/retry.md → /runnable-0.17.0/docs/architecture/yaml.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/cropped.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-expose-parameters.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-kubeflow-exec.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-kubeflow-ui.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-nested.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-parallel-map.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-sequential-map.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-workflows-gant.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-workflows-logs.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/mlflow.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/mlflow_example.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/mlflow_step.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_api_parameters.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_env_parameters.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_input_parameters.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_native_parameters.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/simple_notebook.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/speed.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/sport.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/work_dark.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/assets/work_light.png +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/catalog.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/index.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/map.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/nesting.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/parallel.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/parameters.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/pipeline.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/run-log.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/secrets.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/task.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/catalog.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/argo.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/container-environments.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/local-container.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/local.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/mocked.md +0 -0
- /runnable-0.14.0/docs/tutorial/dynamic-looping.md → /runnable-0.17.0/docs/configurations/executors/retry.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/overview.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/run-log.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/secrets.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/css/extra.css +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/index.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/iterative.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/reference.md +0 -0
- /runnable-0.14.0/docs/tutorial/modular-dags.md → /runnable-0.17.0/docs/tutorial/dynamic-looping.md +0 -0
- /runnable-0.14.0/docs/tutorial/modular-notebooks.md → /runnable-0.17.0/docs/tutorial/modular-dags.md +0 -0
- /runnable-0.14.0/docs/tutorial/overview.md → /runnable-0.17.0/docs/tutorial/modular-notebooks.md +0 -0
- /runnable-0.14.0/docs/tutorial/script-based.md → /runnable-0.17.0/docs/tutorial/overview.md +0 -0
- /runnable-0.14.0/docs/tutorial/single-notebook.md → /runnable-0.17.0/docs/tutorial/script-based.md +0 -0
- /runnable-0.14.0/docs/tutorial/switching-configs.md → /runnable-0.17.0/docs/tutorial/single-notebook.md +0 -0
- /runnable-0.14.0/docs/tutorial/using-parallel.md → /runnable-0.17.0/docs/tutorial/switching-configs.md +0 -0
- /runnable-0.14.0/docs/tutorial/wrap-up.md → /runnable-0.17.0/docs/tutorial/using-parallel.md +0 -0
- /runnable-0.14.0/extensions/README.md → /runnable-0.17.0/docs/tutorial/wrap-up.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/usage.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/docs/why-runnable.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/notebook.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/notebook.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/python_tasks.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/scripts.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/scripts.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/stub.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/stub.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/default_fail.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/default_fail.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_fail.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_fail.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_succeed.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_succeed.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/traversal.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/traversal.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_notebook.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_notebook.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_python.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_python.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_shell.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_shell.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_non_python.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_non_python.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_python.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_python.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/04-catalog/catalog.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/04-catalog/catalog.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/nesting.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/nesting.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/parallel.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/parallel.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/custom_reducer.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/custom_reducer.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/map.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/map.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/08-mocking/default.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/08-mocking/patching.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/09-retry/config.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/09-retry/python_tasks.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/09-retry/python_tasks.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/Dockerfile.39 +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/README.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/functions.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/initial_parameters.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/process_chunk.ipynb +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/read_files.ipynb +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/read_parameters.ipynb +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/simple_notebook.ipynb +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/simple_notebook_mocked.ipynb +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/common/write_parameters.ipynb +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/README.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/kedro/README.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/kfp/README.md +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/metaflow/main.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/metaflow/parameters.json +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/runnable/main.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/runnable/runnable_params.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/source.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/argo-config-full.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/dotenv.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked_map_parameters.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/executors/argo-map-sequential.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/executors/local-container-override.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/executors/step_overrides_container.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/executors/step_overrides_container.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/generated-argo-pipeline.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/iris_demo.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/baseline_comparison.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/hyper_parameter_tuning.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/modular_source.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/parameters.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/parameters_source.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/source.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/reddit_text_classification/parameters.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/reddit_text_classification/pipeline.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/reddit_text_classification/steps.py +0 -0
- /runnable-0.14.0/extensions/__init__.py → /runnable-0.17.0/extensions/README.md +0 -0
- {runnable-0.14.0/extensions/executor/k8s_job → runnable-0.17.0/extensions}/__init__.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/catalog/file_system.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/catalog/pyproject.toml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/nodes/pyproject.toml +0 -0
- {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/argo_specification.yaml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/__init__.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/chunked_fs.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/db/implementation_FF.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/db/integration_FF.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/pyproject.toml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/secrets/__init__.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/secrets/dotenv.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/extensions/secrets/pyproject.toml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/mkdocs.yml +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/runnable/names.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/runnable/parameters.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/runnable/pickler.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/runnable/secrets.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/__init__.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/conftest.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/__init__.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/catalog/test_catalog_extension.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/catalog/test_file_system.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/run_log_store/__init__.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/run_log_store/test_file_system.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/secrets/test_dotenv.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/test_node_extensions.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_catalog.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_datastore.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_executor.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_graph.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_parmeters.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_sdk.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_secrets.py +0 -0
- {runnable-0.14.0 → runnable-0.17.0}/tox.ini +0 -0
@@ -6,7 +6,6 @@ on:
|
|
6
6
|
- "examples/**"
|
7
7
|
branches:
|
8
8
|
- "main"
|
9
|
-
- "release-fix*"
|
10
9
|
|
11
10
|
|
12
11
|
jobs:
|
@@ -22,6 +21,7 @@ jobs:
|
|
22
21
|
fetch-depth: 0
|
23
22
|
- name: Install uv
|
24
23
|
run: curl -LsSf https://astral.sh/uv/install.sh | sh
|
24
|
+
|
25
25
|
- name: "Set up Python"
|
26
26
|
run: uv python install
|
27
27
|
- run: |
|
@@ -0,0 +1 @@
|
|
1
|
+
3.10
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Python 3.8 Image without Dependecies
|
2
|
+
FROM ubuntu:24.04
|
3
|
+
|
4
|
+
LABEL maintainer="vijay.vammi@astrazeneca.com"
|
5
|
+
|
6
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
7
|
+
git \
|
8
|
+
ca-certificates \
|
9
|
+
curl \
|
10
|
+
&& rm -rf /var/lib/apt/lists/*
|
11
|
+
|
12
|
+
ADD https://astral.sh/uv/0.5.12/install.sh /uv-installer.sh
|
13
|
+
RUN sh /uv-installer.sh && rm /uv-installer.sh
|
14
|
+
ENV PATH="/root/.local/bin/:$PATH"
|
15
|
+
|
16
|
+
COPY . /app
|
17
|
+
WORKDIR /app
|
18
|
+
|
19
|
+
RUN uv python install && \
|
20
|
+
uv sync --index https://artifactory.astrazeneca.net/api/pypi/pypi-virtual/simple/ --frozen --all-extras
|
21
|
+
|
22
|
+
ENV PATH="/app/.venv/bin:$PATH"
|
@@ -1,16 +1,17 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: runnable
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.17.0
|
4
4
|
Summary: Add your description here
|
5
5
|
Author-email: "Vammi, Vijay" <vijay.vammi@astrazeneca.com>
|
6
6
|
License-File: LICENSE
|
7
|
-
Requires-Python: >=3.
|
7
|
+
Requires-Python: >=3.10
|
8
8
|
Requires-Dist: catalog
|
9
9
|
Requires-Dist: click-plugins>=1.1.1
|
10
10
|
Requires-Dist: click<=8.1.3
|
11
11
|
Requires-Dist: dill>=0.3.9
|
12
|
-
Requires-Dist: executor
|
12
|
+
Requires-Dist: job-executor
|
13
13
|
Requires-Dist: nodes
|
14
|
+
Requires-Dist: pipeline-executor
|
14
15
|
Requires-Dist: pydantic>=2.10.3
|
15
16
|
Requires-Dist: python-dotenv>=1.0.1
|
16
17
|
Requires-Dist: rich>=13.9.4
|
@@ -24,6 +25,8 @@ Provides-Extra: docker
|
|
24
25
|
Requires-Dist: docker>=7.1.0; extra == 'docker'
|
25
26
|
Provides-Extra: examples
|
26
27
|
Requires-Dist: pandas>=2.2.3; extra == 'examples'
|
28
|
+
Provides-Extra: k8s
|
29
|
+
Requires-Dist: kubernetes>=31.0.0; extra == 'k8s'
|
27
30
|
Provides-Extra: notebook
|
28
31
|
Requires-Dist: ploomber-engine>=0.0.33; extra == 'notebook'
|
29
32
|
Description-Content-Type: text/markdown
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from examples.common.functions import write_files
|
2
|
+
from runnable import Catalog, Job, PythonTask
|
3
|
+
|
4
|
+
print("Running catalog.py")
|
5
|
+
|
6
|
+
|
7
|
+
def main():
|
8
|
+
write_catalog = Catalog(put=["df.csv", "data_folder/data.txt"])
|
9
|
+
generate_data = PythonTask(
|
10
|
+
name="generate_data",
|
11
|
+
function=write_files,
|
12
|
+
catalog=write_catalog,
|
13
|
+
)
|
14
|
+
|
15
|
+
job = Job(name="catalog", task=generate_data)
|
16
|
+
|
17
|
+
_ = job.execute()
|
18
|
+
|
19
|
+
return job
|
20
|
+
|
21
|
+
|
22
|
+
if __name__ == "__main__":
|
23
|
+
main()
|
@@ -0,0 +1,41 @@
|
|
1
|
+
job-executor:
|
2
|
+
type: "k8s-job"
|
3
|
+
config:
|
4
|
+
jobSpec:
|
5
|
+
# activeDeadlineSeconds: Optional[int]
|
6
|
+
# selector: Optional[LabelSelector]
|
7
|
+
# ttlSecondsAfterFinished: Optional[int]
|
8
|
+
template:
|
9
|
+
# metadata:
|
10
|
+
# annotations: Optional[Dict[str, str]]
|
11
|
+
# generate_name: Optional[str] = run_id
|
12
|
+
# namespace: Optional[str] = "default"
|
13
|
+
spec:
|
14
|
+
# activeDeadlineSeconds: Optional[int]
|
15
|
+
# nodeSelector: Optional[Dict[str, str]]
|
16
|
+
# tolerations: Optional[List[Toleration]]
|
17
|
+
# volumes:
|
18
|
+
# - name: str
|
19
|
+
# hostPath:
|
20
|
+
# path: str
|
21
|
+
# serviceAccountName: Optional[str]
|
22
|
+
# restartPolicy: Optional[str] = Choose from [Always, OnFailure, Never]
|
23
|
+
container:
|
24
|
+
# command: List[str]
|
25
|
+
# env:
|
26
|
+
# - name: str
|
27
|
+
# value: str
|
28
|
+
image: runnable-m1
|
29
|
+
# imagePullPolicy: Optional[str] = choose from [Always, Never, IfNotPresent]
|
30
|
+
# resources:
|
31
|
+
# limits:
|
32
|
+
# cpu: str
|
33
|
+
# memory: str
|
34
|
+
# gpu: str
|
35
|
+
# requests:
|
36
|
+
# cpu: str
|
37
|
+
# memory: str
|
38
|
+
# gpu: str
|
39
|
+
# volumeMounts:
|
40
|
+
# - name: str
|
41
|
+
# mountPath: str
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"""
|
2
|
+
The below example shows how to set/get parameters in python
|
3
|
+
tasks of the pipeline.
|
4
|
+
|
5
|
+
The function, set_parameter, returns
|
6
|
+
- JSON serializable types
|
7
|
+
- pydantic models
|
8
|
+
- pandas dataframe, any "object" type
|
9
|
+
|
10
|
+
pydantic models are implicitly handled by runnable
|
11
|
+
but "object" types should be marked as "pickled".
|
12
|
+
|
13
|
+
Use pickled even for python data types is advised for
|
14
|
+
reasonably large collections.
|
15
|
+
|
16
|
+
Run the below example as:
|
17
|
+
python examples/03-parameters/passing_parameters_python.py
|
18
|
+
|
19
|
+
"""
|
20
|
+
|
21
|
+
from examples.common.functions import write_parameter
|
22
|
+
from runnable import Job, PythonTask, metric, pickled
|
23
|
+
|
24
|
+
|
25
|
+
def main():
|
26
|
+
write_parameters = PythonTask(
|
27
|
+
function=write_parameter,
|
28
|
+
returns=[
|
29
|
+
pickled("df"),
|
30
|
+
"integer",
|
31
|
+
"floater",
|
32
|
+
"stringer",
|
33
|
+
"pydantic_param",
|
34
|
+
metric("score"),
|
35
|
+
],
|
36
|
+
name="set_parameter",
|
37
|
+
)
|
38
|
+
|
39
|
+
job = Job(name="set_parameters", task=write_parameters)
|
40
|
+
|
41
|
+
job.execute()
|
42
|
+
|
43
|
+
return job
|
44
|
+
|
45
|
+
|
46
|
+
if __name__ == "__main__":
|
47
|
+
main()
|
@@ -0,0 +1,44 @@
|
|
1
|
+
"""
|
2
|
+
You can execute this pipeline by:
|
3
|
+
|
4
|
+
python examples/01-tasks/python_tasks.py
|
5
|
+
|
6
|
+
The stdout of "Hello World!" would be captured as execution
|
7
|
+
log and stored in the catalog.
|
8
|
+
|
9
|
+
An example of the catalog structure:
|
10
|
+
|
11
|
+
.catalog
|
12
|
+
└── baked-heyrovsky-0602
|
13
|
+
└── hello.execution.log
|
14
|
+
|
15
|
+
2 directories, 1 file
|
16
|
+
|
17
|
+
|
18
|
+
The hello.execution.log has the captured stdout of "Hello World!".
|
19
|
+
"""
|
20
|
+
|
21
|
+
from examples.common.functions import hello
|
22
|
+
from runnable import Job, PythonTask
|
23
|
+
|
24
|
+
|
25
|
+
def main():
|
26
|
+
# Create a tasks which calls the function "hello"
|
27
|
+
# If this step executes successfully,
|
28
|
+
# the pipeline will terminate with success
|
29
|
+
hello_task = PythonTask(
|
30
|
+
name="hello",
|
31
|
+
function=hello,
|
32
|
+
terminate_with_success=True,
|
33
|
+
)
|
34
|
+
|
35
|
+
# The pipeline has only one step.
|
36
|
+
job = Job(name="hello", task=hello_task)
|
37
|
+
|
38
|
+
job.execute()
|
39
|
+
|
40
|
+
return job
|
41
|
+
|
42
|
+
|
43
|
+
if __name__ == "__main__":
|
44
|
+
main()
|
@@ -0,0 +1,20 @@
|
|
1
|
+
dag:
|
2
|
+
description: |
|
3
|
+
This is a sample pipeline with one step that
|
4
|
+
executes a shell command.
|
5
|
+
|
6
|
+
You can run this pipeline by:
|
7
|
+
runnable execute -f examples/01-tasks/scripts.yaml
|
8
|
+
|
9
|
+
For example:
|
10
|
+
.catalog
|
11
|
+
└── seasoned-perlman-1355
|
12
|
+
└── hello.execution.log
|
13
|
+
|
14
|
+
start_at: shell
|
15
|
+
steps:
|
16
|
+
shell:
|
17
|
+
type: task
|
18
|
+
command_type: shell
|
19
|
+
command: echo "hello world!!" # The path is relative to the root of the project.
|
20
|
+
next: success
|
@@ -1,4 +1,4 @@
|
|
1
|
-
executor:
|
1
|
+
pipeline-executor:
|
2
2
|
type: "argo" # (1)
|
3
3
|
config:
|
4
4
|
image: harbor.csis.astrazeneca.net/mlops/runnable:latest # (2)
|
@@ -7,12 +7,12 @@ executor:
|
|
7
7
|
- name: magnus-volume
|
8
8
|
mount_path: /mnt
|
9
9
|
|
10
|
-
|
10
|
+
run-log-store: # (4)
|
11
11
|
type: chunked-fs
|
12
|
-
config:
|
13
|
-
|
12
|
+
# config:
|
13
|
+
# log_folder: /mnt/run_log_store
|
14
14
|
|
15
15
|
catalog:
|
16
16
|
type: file-system
|
17
|
-
config:
|
18
|
-
|
17
|
+
# config:
|
18
|
+
# catalog_location: /mnt/catalog
|
@@ -1,2 +1,2 @@
|
|
1
|
-
|
1
|
+
run-log-store:
|
2
2
|
type: chunked-fs
|
@@ -0,0 +1,160 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
from typing import Dict, List, Optional
|
4
|
+
|
5
|
+
from runnable import context, defaults, exceptions, parameters, utils
|
6
|
+
from runnable.datastore import DataCatalog, JobLog, JsonParameter
|
7
|
+
from runnable.executor import BaseJobExecutor
|
8
|
+
|
9
|
+
logger = logging.getLogger(defaults.LOGGER_NAME)
|
10
|
+
|
11
|
+
|
12
|
+
class GenericJobExecutor(BaseJobExecutor):
|
13
|
+
"""
|
14
|
+
The skeleton of an executor class.
|
15
|
+
Any implementation of an executor should inherit this class and over-ride accordingly.
|
16
|
+
|
17
|
+
This is a loaded base class which has a lot of methods already implemented for "typical" executions.
|
18
|
+
Look at the function docs to understand how to use them appropriately.
|
19
|
+
|
20
|
+
For any implementation:
|
21
|
+
1). Who/when should the run log be set up?
|
22
|
+
2). Who/When should the step log be set up?
|
23
|
+
|
24
|
+
"""
|
25
|
+
|
26
|
+
service_name: str = ""
|
27
|
+
service_type: str = "job_executor"
|
28
|
+
|
29
|
+
@property
|
30
|
+
def _context(self):
|
31
|
+
assert context.run_context
|
32
|
+
return context.run_context
|
33
|
+
|
34
|
+
def _get_parameters(self) -> Dict[str, JsonParameter]:
|
35
|
+
"""
|
36
|
+
Consolidate the parameters from the environment variables
|
37
|
+
and the parameters file.
|
38
|
+
|
39
|
+
The parameters defined in the environment variables take precedence over the parameters file.
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
_type_: _description_
|
43
|
+
"""
|
44
|
+
params: Dict[str, JsonParameter] = {}
|
45
|
+
if self._context.parameters_file:
|
46
|
+
user_defined = utils.load_yaml(self._context.parameters_file) or {}
|
47
|
+
|
48
|
+
for key, value in user_defined.items():
|
49
|
+
params[key] = JsonParameter(value=value, kind="json")
|
50
|
+
|
51
|
+
# Update these with some from the environment variables
|
52
|
+
params.update(parameters.get_user_set_parameters())
|
53
|
+
logger.debug(f"parameters as seen by executor: {params}")
|
54
|
+
return params
|
55
|
+
|
56
|
+
def _set_up_run_log(self, exists_ok=False):
|
57
|
+
"""
|
58
|
+
Create a run log and put that in the run log store
|
59
|
+
|
60
|
+
If exists_ok, we allow the run log to be already present in the run log store.
|
61
|
+
"""
|
62
|
+
try:
|
63
|
+
attempt_run_log = self._context.run_log_store.get_run_log_by_id(
|
64
|
+
run_id=self._context.run_id, full=False
|
65
|
+
)
|
66
|
+
|
67
|
+
logger.warning(
|
68
|
+
f"The run log by id: {self._context.run_id} already exists, is this designed?"
|
69
|
+
)
|
70
|
+
raise exceptions.RunLogExistsError(
|
71
|
+
f"The run log by id: {self._context.run_id} already exists and is {attempt_run_log.status}"
|
72
|
+
)
|
73
|
+
except exceptions.RunLogNotFoundError:
|
74
|
+
pass
|
75
|
+
except exceptions.RunLogExistsError:
|
76
|
+
if exists_ok:
|
77
|
+
return
|
78
|
+
raise
|
79
|
+
|
80
|
+
# Consolidate and get the parameters
|
81
|
+
params = self._get_parameters()
|
82
|
+
|
83
|
+
self._context.run_log_store.create_run_log(
|
84
|
+
run_id=self._context.run_id,
|
85
|
+
tag=self._context.tag,
|
86
|
+
status=defaults.PROCESSING,
|
87
|
+
dag_hash=self._context.dag_hash,
|
88
|
+
)
|
89
|
+
# Any interaction with run log store attributes should happen via API if available.
|
90
|
+
self._context.run_log_store.set_parameters(
|
91
|
+
run_id=self._context.run_id, parameters=params
|
92
|
+
)
|
93
|
+
|
94
|
+
# Update run_config
|
95
|
+
run_config = utils.get_run_config()
|
96
|
+
logger.debug(f"run_config as seen by executor: {run_config}")
|
97
|
+
self._context.run_log_store.set_run_config(
|
98
|
+
run_id=self._context.run_id, run_config=run_config
|
99
|
+
)
|
100
|
+
|
101
|
+
@property
|
102
|
+
def step_attempt_number(self) -> int:
|
103
|
+
"""
|
104
|
+
The attempt number of the current step.
|
105
|
+
Orchestrators should use this step to submit multiple attempts of the job.
|
106
|
+
|
107
|
+
Returns:
|
108
|
+
int: The attempt number of the current step. Defaults to 1.
|
109
|
+
"""
|
110
|
+
return int(os.environ.get(defaults.ATTEMPT_NUMBER, 1))
|
111
|
+
|
112
|
+
def add_code_identities(self, job_log: JobLog, **kwargs):
|
113
|
+
"""
|
114
|
+
Add code identities specific to the implementation.
|
115
|
+
|
116
|
+
The Base class has an implementation of adding git code identities.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
step_log (object): The step log object
|
120
|
+
node (BaseNode): The node we are adding the step log for
|
121
|
+
"""
|
122
|
+
job_log.code_identities.append(utils.get_git_code_identity())
|
123
|
+
|
124
|
+
def send_return_code(self, stage="traversal"):
|
125
|
+
"""
|
126
|
+
Convenience function used by pipeline to send return code to the caller of the cli
|
127
|
+
|
128
|
+
Raises:
|
129
|
+
Exception: If the pipeline execution failed
|
130
|
+
"""
|
131
|
+
run_id = self._context.run_id
|
132
|
+
|
133
|
+
run_log = self._context.run_log_store.get_run_log_by_id(
|
134
|
+
run_id=run_id, full=False
|
135
|
+
)
|
136
|
+
if run_log.status == defaults.FAIL:
|
137
|
+
raise exceptions.ExecutionFailedError(run_id=run_id)
|
138
|
+
|
139
|
+
def _sync_catalog(
|
140
|
+
self,
|
141
|
+
catalog_settings=Optional[List[str]],
|
142
|
+
) -> List[DataCatalog] | None:
|
143
|
+
if not catalog_settings:
|
144
|
+
logger.info("No catalog settings found")
|
145
|
+
return None
|
146
|
+
|
147
|
+
compute_data_folder = self._context.catalog_handler.compute_data_folder
|
148
|
+
|
149
|
+
data_catalogs = []
|
150
|
+
for name_pattern in catalog_settings:
|
151
|
+
data_catalog = self._context.catalog_handler.put(
|
152
|
+
name=name_pattern,
|
153
|
+
run_id=self._context.run_id,
|
154
|
+
compute_data_folder=compute_data_folder,
|
155
|
+
)
|
156
|
+
|
157
|
+
logger.debug(f"Added data catalog: {data_catalog} to job log")
|
158
|
+
data_catalogs.extend(data_catalog)
|
159
|
+
|
160
|
+
return data_catalogs
|