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.
Files changed (250) hide show
  1. {runnable-0.14.0 → runnable-0.17.0}/.dockerignore +2 -0
  2. {runnable-0.14.0 → runnable-0.17.0}/.github/workflows/release.yaml +1 -1
  3. {runnable-0.14.0 → runnable-0.17.0}/.gitignore +2 -0
  4. runnable-0.17.0/.python-version +1 -0
  5. runnable-0.17.0/Dockerfile +22 -0
  6. {runnable-0.14.0 → runnable-0.17.0}/PKG-INFO +6 -3
  7. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/python_tasks.py +0 -1
  8. runnable-0.17.0/examples/11-jobs/catalog.py +23 -0
  9. runnable-0.17.0/examples/11-jobs/catalog.yaml +5 -0
  10. runnable-0.17.0/examples/11-jobs/k8s-job.yaml +41 -0
  11. runnable-0.17.0/examples/11-jobs/local-container.yaml +4 -0
  12. runnable-0.17.0/examples/11-jobs/notebook.yaml +3 -0
  13. runnable-0.17.0/examples/11-jobs/passing_parameters_python.py +47 -0
  14. runnable-0.17.0/examples/11-jobs/python_parameters.yaml +11 -0
  15. runnable-0.17.0/examples/11-jobs/python_tasks.py +44 -0
  16. runnable-0.17.0/examples/11-jobs/python_tasks.yaml +2 -0
  17. runnable-0.17.0/examples/11-jobs/scripts.yaml +20 -0
  18. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/argo-config.yaml +6 -6
  19. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/chunked-fs-run_log.yaml +1 -1
  20. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/default.yaml +2 -2
  21. runnable-0.17.0/examples/configs/in-memory.yaml +14 -0
  22. runnable-0.17.0/examples/configs/local-container.yaml +7 -0
  23. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config-debug.yaml +2 -2
  24. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config-simple.yaml +2 -2
  25. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config-unittest.yaml +2 -2
  26. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked-config.yaml +2 -2
  27. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/retry-config.yaml +2 -2
  28. runnable-0.17.0/extensions/job_executor/__init__.py +160 -0
  29. runnable-0.17.0/extensions/job_executor/k8s.py +362 -0
  30. runnable-0.17.0/extensions/job_executor/k8s_job_spec.yaml +37 -0
  31. runnable-0.17.0/extensions/job_executor/local.py +61 -0
  32. runnable-0.17.0/extensions/job_executor/local_container.py +192 -0
  33. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/job_executor}/pyproject.toml +1 -1
  34. {runnable-0.14.0 → runnable-0.17.0}/extensions/nodes/nodes.py +1 -1
  35. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/__init__.py +9 -66
  36. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/argo.py +45 -70
  37. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/local.py +17 -34
  38. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/local_container.py +93 -186
  39. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/mocked.py +3 -6
  40. runnable-0.17.0/extensions/pipeline_executor/pyproject.toml +7 -0
  41. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/retry.py +3 -7
  42. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/file_system.py +6 -3
  43. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/generic_chunked.py +11 -9
  44. {runnable-0.14.0 → runnable-0.17.0}/pyproject.toml +25 -13
  45. {runnable-0.14.0 → runnable-0.17.0}/runnable/__init__.py +1 -1
  46. {runnable-0.14.0 → runnable-0.17.0}/runnable/catalog.py +2 -0
  47. runnable-0.17.0/runnable/cli.py +324 -0
  48. {runnable-0.14.0 → runnable-0.17.0}/runnable/context.py +12 -3
  49. {runnable-0.14.0 → runnable-0.17.0}/runnable/datastore.py +159 -25
  50. {runnable-0.14.0 → runnable-0.17.0}/runnable/defaults.py +13 -54
  51. {runnable-0.14.0 → runnable-0.17.0}/runnable/entrypoints.py +197 -185
  52. {runnable-0.14.0 → runnable-0.17.0}/runnable/exceptions.py +22 -0
  53. {runnable-0.14.0 → runnable-0.17.0}/runnable/executor.py +114 -88
  54. {runnable-0.14.0 → runnable-0.17.0}/runnable/graph.py +0 -1
  55. {runnable-0.14.0 → runnable-0.17.0}/runnable/nodes.py +36 -6
  56. {runnable-0.14.0 → runnable-0.17.0}/runnable/sdk.py +132 -36
  57. {runnable-0.14.0 → runnable-0.17.0}/runnable/tasks.py +6 -15
  58. {runnable-0.14.0 → runnable-0.17.0}/runnable/utils.py +22 -30
  59. {runnable-0.14.0/tests/extensions/executor → runnable-0.17.0/tests/extensions/pipeline_executor}/test_argo_executor.py +1 -1
  60. {runnable-0.14.0/tests/extensions/executor → runnable-0.17.0/tests/extensions/pipeline_executor}/test_generic_executor.py +2 -47
  61. {runnable-0.14.0/tests/extensions/executor → runnable-0.17.0/tests/extensions/pipeline_executor}/test_local_executor.py +1 -1
  62. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_nodes.py +20 -7
  63. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_utils.py +4 -5
  64. {runnable-0.14.0 → runnable-0.17.0}/tests/test_examples.py +70 -36
  65. {runnable-0.14.0 → runnable-0.17.0}/uv.lock +161 -246
  66. runnable-0.14.0/.python-version +0 -1
  67. runnable-0.14.0/examples/configs/local-container.yaml +0 -7
  68. runnable-0.14.0/extensions/executor/k8s_job/implementation_FF.py +0 -259
  69. runnable-0.14.0/extensions/executor/k8s_job/integration_FF.py +0 -70
  70. runnable-0.14.0/runnable/cli.py +0 -367
  71. runnable-0.14.0/runnable/integration.py +0 -197
  72. runnable-0.14.0/tests/extensions/executor/test_local_container_integration.py +0 -51
  73. runnable-0.14.0/tests/runnable/test_integration.py +0 -153
  74. {runnable-0.14.0 → runnable-0.17.0}/.github/workflows/docs.yaml +0 -0
  75. {runnable-0.14.0 → runnable-0.17.0}/.github/workflows/pr.yaml +0 -0
  76. {runnable-0.14.0 → runnable-0.17.0}/.mypy.ini +0 -0
  77. {runnable-0.14.0 → runnable-0.17.0}/.pre-commit-config.yaml +0 -0
  78. {runnable-0.14.0 → runnable-0.17.0}/CHANGELOG.md +0 -0
  79. {runnable-0.14.0 → runnable-0.17.0}/CONTRIBUTING.md +0 -0
  80. {runnable-0.14.0 → runnable-0.17.0}/LICENSE +0 -0
  81. {runnable-0.14.0 → runnable-0.17.0}/README.md +0 -0
  82. /runnable-0.14.0/docs/configurations/executors/retry.md → /runnable-0.17.0/docs/architecture/yaml.md +0 -0
  83. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/cropped.png +0 -0
  84. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-expose-parameters.png +0 -0
  85. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-kubeflow-exec.png +0 -0
  86. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-kubeflow-ui.png +0 -0
  87. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-nested.png +0 -0
  88. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-parallel-map.png +0 -0
  89. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-sequential-map.png +0 -0
  90. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-workflows-gant.png +0 -0
  91. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/argo-workflows-logs.png +0 -0
  92. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/mlflow.png +0 -0
  93. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/mlflow_example.png +0 -0
  94. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/mlflow_step.png +0 -0
  95. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_api_parameters.png +0 -0
  96. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_env_parameters.png +0 -0
  97. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_input_parameters.png +0 -0
  98. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/notebook_native_parameters.png +0 -0
  99. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/screenshots/simple_notebook.png +0 -0
  100. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/speed.png +0 -0
  101. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/sport.png +0 -0
  102. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/work_dark.png +0 -0
  103. {runnable-0.14.0 → runnable-0.17.0}/docs/assets/work_light.png +0 -0
  104. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/catalog.md +0 -0
  105. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/index.md +0 -0
  106. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/map.md +0 -0
  107. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/nesting.md +0 -0
  108. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/parallel.md +0 -0
  109. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/parameters.md +0 -0
  110. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/pipeline.md +0 -0
  111. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/run-log.md +0 -0
  112. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/secrets.md +0 -0
  113. {runnable-0.14.0 → runnable-0.17.0}/docs/concepts/task.md +0 -0
  114. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/catalog.md +0 -0
  115. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/argo.md +0 -0
  116. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/container-environments.md +0 -0
  117. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/local-container.md +0 -0
  118. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/local.md +0 -0
  119. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/executors/mocked.md +0 -0
  120. /runnable-0.14.0/docs/tutorial/dynamic-looping.md → /runnable-0.17.0/docs/configurations/executors/retry.md +0 -0
  121. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/overview.md +0 -0
  122. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/run-log.md +0 -0
  123. {runnable-0.14.0 → runnable-0.17.0}/docs/configurations/secrets.md +0 -0
  124. {runnable-0.14.0 → runnable-0.17.0}/docs/css/extra.css +0 -0
  125. {runnable-0.14.0 → runnable-0.17.0}/docs/index.md +0 -0
  126. {runnable-0.14.0 → runnable-0.17.0}/docs/iterative.md +0 -0
  127. {runnable-0.14.0 → runnable-0.17.0}/docs/reference.md +0 -0
  128. /runnable-0.14.0/docs/tutorial/modular-dags.md → /runnable-0.17.0/docs/tutorial/dynamic-looping.md +0 -0
  129. /runnable-0.14.0/docs/tutorial/modular-notebooks.md → /runnable-0.17.0/docs/tutorial/modular-dags.md +0 -0
  130. /runnable-0.14.0/docs/tutorial/overview.md → /runnable-0.17.0/docs/tutorial/modular-notebooks.md +0 -0
  131. /runnable-0.14.0/docs/tutorial/script-based.md → /runnable-0.17.0/docs/tutorial/overview.md +0 -0
  132. /runnable-0.14.0/docs/tutorial/single-notebook.md → /runnable-0.17.0/docs/tutorial/script-based.md +0 -0
  133. /runnable-0.14.0/docs/tutorial/switching-configs.md → /runnable-0.17.0/docs/tutorial/single-notebook.md +0 -0
  134. /runnable-0.14.0/docs/tutorial/using-parallel.md → /runnable-0.17.0/docs/tutorial/switching-configs.md +0 -0
  135. /runnable-0.14.0/docs/tutorial/wrap-up.md → /runnable-0.17.0/docs/tutorial/using-parallel.md +0 -0
  136. /runnable-0.14.0/extensions/README.md → /runnable-0.17.0/docs/tutorial/wrap-up.md +0 -0
  137. {runnable-0.14.0 → runnable-0.17.0}/docs/usage.md +0 -0
  138. {runnable-0.14.0 → runnable-0.17.0}/docs/why-runnable.md +0 -0
  139. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/notebook.py +0 -0
  140. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/notebook.yaml +0 -0
  141. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/python_tasks.yaml +0 -0
  142. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/scripts.py +0 -0
  143. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/scripts.yaml +0 -0
  144. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/stub.py +0 -0
  145. {runnable-0.14.0 → runnable-0.17.0}/examples/01-tasks/stub.yaml +0 -0
  146. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/default_fail.py +0 -0
  147. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/default_fail.yaml +0 -0
  148. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_fail.py +0 -0
  149. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_fail.yaml +0 -0
  150. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_succeed.py +0 -0
  151. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/on_failure_succeed.yaml +0 -0
  152. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/traversal.py +0 -0
  153. {runnable-0.14.0 → runnable-0.17.0}/examples/02-sequential/traversal.yaml +0 -0
  154. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_notebook.py +0 -0
  155. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_notebook.yaml +0 -0
  156. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_python.py +0 -0
  157. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_python.yaml +0 -0
  158. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_shell.py +0 -0
  159. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/passing_parameters_shell.yaml +0 -0
  160. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_non_python.py +0 -0
  161. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_non_python.yaml +0 -0
  162. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_python.py +0 -0
  163. {runnable-0.14.0 → runnable-0.17.0}/examples/03-parameters/static_parameters_python.yaml +0 -0
  164. {runnable-0.14.0 → runnable-0.17.0}/examples/04-catalog/catalog.py +0 -0
  165. {runnable-0.14.0 → runnable-0.17.0}/examples/04-catalog/catalog.yaml +0 -0
  166. {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/nesting.py +0 -0
  167. {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/nesting.yaml +0 -0
  168. {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/parallel.py +0 -0
  169. {runnable-0.14.0 → runnable-0.17.0}/examples/06-parallel/parallel.yaml +0 -0
  170. {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/custom_reducer.py +0 -0
  171. {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/custom_reducer.yaml +0 -0
  172. {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/map.py +0 -0
  173. {runnable-0.14.0 → runnable-0.17.0}/examples/07-map/map.yaml +0 -0
  174. {runnable-0.14.0 → runnable-0.17.0}/examples/08-mocking/default.yaml +0 -0
  175. {runnable-0.14.0 → runnable-0.17.0}/examples/08-mocking/patching.yaml +0 -0
  176. {runnable-0.14.0 → runnable-0.17.0}/examples/09-retry/config.yaml +0 -0
  177. {runnable-0.14.0 → runnable-0.17.0}/examples/09-retry/python_tasks.py +0 -0
  178. {runnable-0.14.0 → runnable-0.17.0}/examples/09-retry/python_tasks.yaml +0 -0
  179. {runnable-0.14.0 → runnable-0.17.0}/examples/Dockerfile.39 +0 -0
  180. {runnable-0.14.0 → runnable-0.17.0}/examples/README.md +0 -0
  181. {runnable-0.14.0 → runnable-0.17.0}/examples/common/functions.py +0 -0
  182. {runnable-0.14.0 → runnable-0.17.0}/examples/common/initial_parameters.yaml +0 -0
  183. {runnable-0.14.0 → runnable-0.17.0}/examples/common/process_chunk.ipynb +0 -0
  184. {runnable-0.14.0 → runnable-0.17.0}/examples/common/read_files.ipynb +0 -0
  185. {runnable-0.14.0 → runnable-0.17.0}/examples/common/read_parameters.ipynb +0 -0
  186. {runnable-0.14.0 → runnable-0.17.0}/examples/common/simple_notebook.ipynb +0 -0
  187. {runnable-0.14.0 → runnable-0.17.0}/examples/common/simple_notebook_mocked.ipynb +0 -0
  188. {runnable-0.14.0 → runnable-0.17.0}/examples/common/write_parameters.ipynb +0 -0
  189. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/README.md +0 -0
  190. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/kedro/README.md +0 -0
  191. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/kfp/README.md +0 -0
  192. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/metaflow/main.py +0 -0
  193. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/metaflow/parameters.json +0 -0
  194. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/runnable/main.py +0 -0
  195. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/runnable/runnable_params.yaml +0 -0
  196. {runnable-0.14.0 → runnable-0.17.0}/examples/comparisons/source.py +0 -0
  197. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/argo-config-full.yaml +0 -0
  198. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/dotenv.yaml +0 -0
  199. {runnable-0.14.0 → runnable-0.17.0}/examples/configs/mocked_map_parameters.yaml +0 -0
  200. {runnable-0.14.0 → runnable-0.17.0}/examples/executors/argo-map-sequential.yaml +0 -0
  201. {runnable-0.14.0 → runnable-0.17.0}/examples/executors/local-container-override.yaml +0 -0
  202. {runnable-0.14.0 → runnable-0.17.0}/examples/executors/step_overrides_container.py +0 -0
  203. {runnable-0.14.0 → runnable-0.17.0}/examples/executors/step_overrides_container.yaml +0 -0
  204. {runnable-0.14.0 → runnable-0.17.0}/examples/generated-argo-pipeline.yaml +0 -0
  205. {runnable-0.14.0 → runnable-0.17.0}/examples/iris_demo.py +0 -0
  206. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/baseline_comparison.py +0 -0
  207. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/hyper_parameter_tuning.py +0 -0
  208. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/modular_source.py +0 -0
  209. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/parameters.yaml +0 -0
  210. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/parameters_source.py +0 -0
  211. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/mnist/source.py +0 -0
  212. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/reddit_text_classification/parameters.yaml +0 -0
  213. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/reddit_text_classification/pipeline.py +0 -0
  214. {runnable-0.14.0 → runnable-0.17.0}/examples/tutorials/reddit_text_classification/steps.py +0 -0
  215. /runnable-0.14.0/extensions/__init__.py → /runnable-0.17.0/extensions/README.md +0 -0
  216. {runnable-0.14.0/extensions/executor/k8s_job → runnable-0.17.0/extensions}/__init__.py +0 -0
  217. {runnable-0.14.0 → runnable-0.17.0}/extensions/catalog/file_system.py +0 -0
  218. {runnable-0.14.0 → runnable-0.17.0}/extensions/catalog/pyproject.toml +0 -0
  219. {runnable-0.14.0 → runnable-0.17.0}/extensions/nodes/pyproject.toml +0 -0
  220. {runnable-0.14.0/extensions/executor → runnable-0.17.0/extensions/pipeline_executor}/argo_specification.yaml +0 -0
  221. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/__init__.py +0 -0
  222. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/chunked_fs.py +0 -0
  223. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/db/implementation_FF.py +0 -0
  224. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/db/integration_FF.py +0 -0
  225. {runnable-0.14.0 → runnable-0.17.0}/extensions/run_log_store/pyproject.toml +0 -0
  226. {runnable-0.14.0 → runnable-0.17.0}/extensions/secrets/__init__.py +0 -0
  227. {runnable-0.14.0 → runnable-0.17.0}/extensions/secrets/dotenv.py +0 -0
  228. {runnable-0.14.0 → runnable-0.17.0}/extensions/secrets/pyproject.toml +0 -0
  229. {runnable-0.14.0 → runnable-0.17.0}/mkdocs.yml +0 -0
  230. {runnable-0.14.0 → runnable-0.17.0}/runnable/names.py +0 -0
  231. {runnable-0.14.0 → runnable-0.17.0}/runnable/parameters.py +0 -0
  232. {runnable-0.14.0 → runnable-0.17.0}/runnable/pickler.py +0 -0
  233. {runnable-0.14.0 → runnable-0.17.0}/runnable/secrets.py +0 -0
  234. {runnable-0.14.0 → runnable-0.17.0}/tests/__init__.py +0 -0
  235. {runnable-0.14.0 → runnable-0.17.0}/tests/conftest.py +0 -0
  236. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/__init__.py +0 -0
  237. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/catalog/test_catalog_extension.py +0 -0
  238. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/catalog/test_file_system.py +0 -0
  239. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/run_log_store/__init__.py +0 -0
  240. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/run_log_store/test_file_system.py +0 -0
  241. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/secrets/test_dotenv.py +0 -0
  242. {runnable-0.14.0 → runnable-0.17.0}/tests/extensions/test_node_extensions.py +0 -0
  243. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_catalog.py +0 -0
  244. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_datastore.py +0 -0
  245. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_executor.py +0 -0
  246. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_graph.py +0 -0
  247. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_parmeters.py +0 -0
  248. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_sdk.py +0 -0
  249. {runnable-0.14.0 → runnable-0.17.0}/tests/runnable/test_secrets.py +0 -0
  250. {runnable-0.14.0 → runnable-0.17.0}/tox.ini +0 -0
@@ -6,3 +6,5 @@ docs/
6
6
  .tox/
7
7
  .scripts/
8
8
  .tests/
9
+ .venv/
10
+ minikube/
@@ -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: |
@@ -155,3 +155,5 @@ cov.xml
155
155
  .DS_Store
156
156
 
157
157
  data/
158
+
159
+ minikube/
@@ -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.14.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.9
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
@@ -36,7 +36,6 @@ def main():
36
36
  pipeline = Pipeline(steps=[hello_task])
37
37
 
38
38
  pipeline.execute()
39
-
40
39
  return pipeline
41
40
 
42
41
 
@@ -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,5 @@
1
+ type: python
2
+ command: examples.common.functions.write_files
3
+ catalog:
4
+ - "*"
5
+ - data_folder/data.txt
@@ -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,4 @@
1
+ job-executor:
2
+ type: "local-container" # (1)
3
+ config:
4
+ docker_image: runnable-m1:latest # (2)
@@ -0,0 +1,3 @@
1
+ # name: notebook job
2
+ type: notebook
3
+ command: examples/common/simple_notebook.ipynb # The path is relative to the root of the project.
@@ -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,11 @@
1
+ type: python
2
+ command: examples.common.functions.write_parameter
3
+ returns:
4
+ - name: df
5
+ kind: object
6
+ - name: integer
7
+ - name: floater
8
+ - name: stringer
9
+ - name: pydantic_param
10
+ - name: score
11
+ kind: metric
@@ -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,2 @@
1
+ type: python
2
+ command: examples.common.functions.hello # dotted path to the function.
@@ -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
- run_log_store: # (4)
10
+ run-log-store: # (4)
11
11
  type: chunked-fs
12
- config:
13
- log_folder: /mnt/run_log_store
12
+ # config:
13
+ # log_folder: /mnt/run_log_store
14
14
 
15
15
  catalog:
16
16
  type: file-system
17
- config:
18
- catalog_location: /mnt/catalog
17
+ # config:
18
+ # catalog_location: /mnt/catalog
@@ -1,2 +1,2 @@
1
- run_log_store:
1
+ run-log-store:
2
2
  type: chunked-fs
@@ -1,7 +1,7 @@
1
- executor:
1
+ pipeline-executor:
2
2
  type: local # (1)
3
3
 
4
- run_log_store:
4
+ run-log-store:
5
5
  type: buffered # (2)
6
6
 
7
7
  catalog:
@@ -0,0 +1,14 @@
1
+ pipeline-executor:
2
+ type: local # (1)
3
+ config:
4
+ object_serialisation: false
5
+
6
+
7
+ run-log-store:
8
+ type: buffered # (2)
9
+
10
+ catalog:
11
+ type: do-nothing # (3)
12
+
13
+ secrets:
14
+ type: do-nothing # (4)
@@ -0,0 +1,7 @@
1
+ pipeline-executor:
2
+ type: "local-container" # (1)
3
+ config:
4
+ docker_image: runnable-m1:latest # (2)
5
+
6
+ run-log-store: # (4)
7
+ type: chunked-fs
@@ -1,10 +1,10 @@
1
1
  catalog:
2
2
  type: file-system # (1)
3
3
 
4
- run_log_store:
4
+ run-log-store:
5
5
  type: file-system # (1)
6
6
 
7
- executor:
7
+ pipeline-executor:
8
8
  type: mocked
9
9
  config:
10
10
  patches:
@@ -1,8 +1,8 @@
1
1
  catalog:
2
2
  type: file-system # (1)
3
3
 
4
- run_log_store:
4
+ run-log-store:
5
5
  type: file-system # (1)
6
6
 
7
- executor:
7
+ pipeline-executor:
8
8
  type: mocked
@@ -1,10 +1,10 @@
1
1
  catalog:
2
2
  type: file-system # (1)
3
3
 
4
- run_log_store:
4
+ run-log-store:
5
5
  type: file-system # (1)
6
6
 
7
- executor:
7
+ pipeline-executor:
8
8
  type: mocked
9
9
  config:
10
10
  patches:
@@ -1,10 +1,10 @@
1
1
  catalog:
2
2
  type: file-system # (1)
3
3
 
4
- run_log_store:
4
+ run-log-store:
5
5
  type: file-system # (1)
6
6
 
7
- executor:
7
+ pipeline-executor:
8
8
  type: mocked
9
9
  config:
10
10
  patches:
@@ -1,4 +1,4 @@
1
- executor:
1
+ pipeline-executor:
2
2
  type: retry
3
3
  config:
4
4
  run_id: parallel-fail
@@ -6,5 +6,5 @@ executor:
6
6
  catalog:
7
7
  type: file-system # (1)
8
8
 
9
- run_log_store:
9
+ run-log-store:
10
10
  type: file-system # (1)
@@ -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