metaflow-stubs 2.12.30__py2.py3-none-any.whl → 2.12.31__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. metaflow-stubs/__init__.pyi +253 -253
  2. metaflow-stubs/cards.pyi +2 -2
  3. metaflow-stubs/cli.pyi +2 -2
  4. metaflow-stubs/client/__init__.pyi +2 -2
  5. metaflow-stubs/client/core.pyi +4 -4
  6. metaflow-stubs/client/filecache.pyi +3 -3
  7. metaflow-stubs/clone_util.pyi +2 -2
  8. metaflow-stubs/events.pyi +2 -2
  9. metaflow-stubs/exception.pyi +2 -2
  10. metaflow-stubs/flowspec.pyi +5 -5
  11. metaflow-stubs/generated_for.txt +1 -1
  12. metaflow-stubs/includefile.pyi +2 -2
  13. metaflow-stubs/info_file.pyi +2 -2
  14. metaflow-stubs/metadata_provider/__init__.pyi +2 -2
  15. metaflow-stubs/metadata_provider/heartbeat.pyi +2 -2
  16. metaflow-stubs/metadata_provider/metadata.pyi +2 -2
  17. metaflow-stubs/metadata_provider/util.pyi +2 -2
  18. metaflow-stubs/metaflow_config.pyi +2 -2
  19. metaflow-stubs/metaflow_current.pyi +6 -6
  20. metaflow-stubs/mflog/__init__.pyi +2 -2
  21. metaflow-stubs/mflog/mflog.pyi +2 -2
  22. metaflow-stubs/multicore_utils.pyi +2 -2
  23. metaflow-stubs/parameters.pyi +2 -2
  24. metaflow-stubs/plugins/__init__.pyi +14 -14
  25. metaflow-stubs/plugins/airflow/__init__.pyi +2 -2
  26. metaflow-stubs/plugins/airflow/airflow.pyi +2 -2
  27. metaflow-stubs/plugins/airflow/airflow_cli.pyi +2 -2
  28. metaflow-stubs/plugins/airflow/airflow_decorator.pyi +2 -2
  29. metaflow-stubs/plugins/airflow/airflow_utils.pyi +2 -2
  30. metaflow-stubs/plugins/airflow/exception.pyi +2 -2
  31. metaflow-stubs/plugins/airflow/sensors/__init__.pyi +2 -2
  32. metaflow-stubs/plugins/airflow/sensors/base_sensor.pyi +2 -2
  33. metaflow-stubs/plugins/airflow/sensors/external_task_sensor.pyi +2 -2
  34. metaflow-stubs/plugins/airflow/sensors/s3_sensor.pyi +2 -2
  35. metaflow-stubs/plugins/argo/__init__.pyi +2 -2
  36. metaflow-stubs/plugins/argo/argo_client.pyi +2 -2
  37. metaflow-stubs/plugins/argo/argo_events.pyi +2 -2
  38. metaflow-stubs/plugins/argo/argo_workflows.pyi +3 -3
  39. metaflow-stubs/plugins/argo/argo_workflows_cli.pyi +2 -2
  40. metaflow-stubs/plugins/argo/argo_workflows_decorator.pyi +4 -4
  41. metaflow-stubs/plugins/argo/argo_workflows_deployer.pyi +3 -3
  42. metaflow-stubs/plugins/argo/argo_workflows_deployer_objects.pyi +3 -3
  43. metaflow-stubs/plugins/aws/__init__.pyi +4 -4
  44. metaflow-stubs/plugins/aws/aws_client.pyi +2 -2
  45. metaflow-stubs/plugins/aws/aws_utils.pyi +2 -2
  46. metaflow-stubs/plugins/aws/batch/__init__.pyi +2 -2
  47. metaflow-stubs/plugins/aws/batch/batch.pyi +2 -2
  48. metaflow-stubs/plugins/aws/batch/batch_cli.pyi +2 -2
  49. metaflow-stubs/plugins/aws/batch/batch_client.pyi +2 -2
  50. metaflow-stubs/plugins/aws/batch/batch_decorator.pyi +2 -2
  51. metaflow-stubs/plugins/aws/secrets_manager/__init__.pyi +2 -2
  52. metaflow-stubs/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.pyi +4 -4
  53. metaflow-stubs/plugins/aws/step_functions/__init__.pyi +2 -2
  54. metaflow-stubs/plugins/aws/step_functions/dynamo_db_client.pyi +2 -2
  55. metaflow-stubs/plugins/aws/step_functions/event_bridge_client.pyi +2 -2
  56. metaflow-stubs/plugins/aws/step_functions/production_token.pyi +2 -2
  57. metaflow-stubs/plugins/aws/step_functions/schedule_decorator.pyi +2 -2
  58. metaflow-stubs/plugins/aws/step_functions/step_functions.pyi +2 -2
  59. metaflow-stubs/plugins/aws/step_functions/step_functions_cli.pyi +2 -2
  60. metaflow-stubs/plugins/aws/step_functions/step_functions_client.pyi +2 -2
  61. metaflow-stubs/plugins/aws/step_functions/step_functions_decorator.pyi +2 -2
  62. metaflow-stubs/plugins/aws/step_functions/step_functions_deployer.pyi +4 -4
  63. metaflow-stubs/plugins/aws/step_functions/step_functions_deployer_objects.pyi +2 -2
  64. metaflow-stubs/plugins/azure/__init__.pyi +2 -2
  65. metaflow-stubs/plugins/azure/azure_credential.pyi +2 -2
  66. metaflow-stubs/plugins/azure/azure_exceptions.pyi +2 -2
  67. metaflow-stubs/plugins/azure/azure_secret_manager_secrets_provider.pyi +4 -4
  68. metaflow-stubs/plugins/azure/azure_utils.pyi +2 -2
  69. metaflow-stubs/plugins/azure/blob_service_client_factory.pyi +2 -2
  70. metaflow-stubs/plugins/azure/includefile_support.pyi +2 -2
  71. metaflow-stubs/plugins/cards/__init__.pyi +2 -2
  72. metaflow-stubs/plugins/cards/card_cli.pyi +2 -2
  73. metaflow-stubs/plugins/cards/card_client.pyi +2 -2
  74. metaflow-stubs/plugins/cards/card_creator.pyi +2 -2
  75. metaflow-stubs/plugins/cards/card_datastore.pyi +2 -2
  76. metaflow-stubs/plugins/cards/card_decorator.pyi +2 -2
  77. metaflow-stubs/plugins/cards/card_modules/__init__.pyi +2 -2
  78. metaflow-stubs/plugins/cards/card_modules/basic.pyi +2 -2
  79. metaflow-stubs/plugins/cards/card_modules/card.pyi +2 -2
  80. metaflow-stubs/plugins/cards/card_modules/chevron/__init__.pyi +2 -2
  81. metaflow-stubs/plugins/cards/card_modules/chevron/main.pyi +2 -2
  82. metaflow-stubs/plugins/cards/card_modules/chevron/metadata.pyi +2 -2
  83. metaflow-stubs/plugins/cards/card_modules/chevron/renderer.pyi +2 -2
  84. metaflow-stubs/plugins/cards/card_modules/chevron/tokenizer.pyi +2 -2
  85. metaflow-stubs/plugins/cards/card_modules/components.pyi +4 -4
  86. metaflow-stubs/plugins/cards/card_modules/convert_to_native_type.pyi +2 -2
  87. metaflow-stubs/plugins/cards/card_modules/renderer_tools.pyi +2 -2
  88. metaflow-stubs/plugins/cards/card_modules/test_cards.pyi +2 -2
  89. metaflow-stubs/plugins/cards/card_resolver.pyi +2 -2
  90. metaflow-stubs/plugins/cards/component_serializer.pyi +2 -2
  91. metaflow-stubs/plugins/cards/exception.pyi +2 -2
  92. metaflow-stubs/plugins/catch_decorator.pyi +3 -3
  93. metaflow-stubs/plugins/datatools/__init__.pyi +2 -2
  94. metaflow-stubs/plugins/datatools/local.pyi +2 -2
  95. metaflow-stubs/plugins/datatools/s3/__init__.pyi +2 -2
  96. metaflow-stubs/plugins/datatools/s3/s3.pyi +3 -3
  97. metaflow-stubs/plugins/datatools/s3/s3tail.pyi +2 -2
  98. metaflow-stubs/plugins/datatools/s3/s3util.pyi +2 -2
  99. metaflow-stubs/plugins/debug_logger.pyi +2 -2
  100. metaflow-stubs/plugins/debug_monitor.pyi +2 -2
  101. metaflow-stubs/plugins/environment_decorator.pyi +2 -2
  102. metaflow-stubs/plugins/events_decorator.pyi +12 -2
  103. metaflow-stubs/plugins/frameworks/__init__.pyi +2 -2
  104. metaflow-stubs/plugins/frameworks/pytorch.pyi +2 -2
  105. metaflow-stubs/plugins/gcp/__init__.pyi +2 -2
  106. metaflow-stubs/plugins/gcp/gcp_secret_manager_secrets_provider.pyi +4 -4
  107. metaflow-stubs/plugins/gcp/gs_exceptions.pyi +2 -2
  108. metaflow-stubs/plugins/gcp/gs_storage_client_factory.pyi +2 -2
  109. metaflow-stubs/plugins/gcp/gs_utils.pyi +2 -2
  110. metaflow-stubs/plugins/gcp/includefile_support.pyi +2 -2
  111. metaflow-stubs/plugins/kubernetes/__init__.pyi +2 -2
  112. metaflow-stubs/plugins/kubernetes/kube_utils.pyi +2 -2
  113. metaflow-stubs/plugins/kubernetes/kubernetes.pyi +2 -2
  114. metaflow-stubs/plugins/kubernetes/kubernetes_cli.pyi +2 -2
  115. metaflow-stubs/plugins/kubernetes/kubernetes_client.pyi +2 -2
  116. metaflow-stubs/plugins/kubernetes/kubernetes_decorator.pyi +2 -2
  117. metaflow-stubs/plugins/kubernetes/kubernetes_job.pyi +2 -2
  118. metaflow-stubs/plugins/kubernetes/kubernetes_jobsets.pyi +2 -2
  119. metaflow-stubs/plugins/logs_cli.pyi +3 -3
  120. metaflow-stubs/plugins/package_cli.pyi +2 -2
  121. metaflow-stubs/plugins/parallel_decorator.pyi +2 -2
  122. metaflow-stubs/plugins/project_decorator.pyi +2 -2
  123. metaflow-stubs/plugins/pypi/__init__.pyi +2 -2
  124. metaflow-stubs/plugins/pypi/conda_decorator.pyi +2 -2
  125. metaflow-stubs/plugins/pypi/conda_environment.pyi +6 -6
  126. metaflow-stubs/plugins/pypi/pypi_decorator.pyi +2 -2
  127. metaflow-stubs/plugins/pypi/pypi_environment.pyi +2 -2
  128. metaflow-stubs/plugins/pypi/utils.pyi +2 -2
  129. metaflow-stubs/plugins/resources_decorator.pyi +2 -2
  130. metaflow-stubs/plugins/retry_decorator.pyi +2 -2
  131. metaflow-stubs/plugins/secrets/__init__.pyi +2 -2
  132. metaflow-stubs/plugins/secrets/inline_secrets_provider.pyi +3 -3
  133. metaflow-stubs/plugins/secrets/secrets_decorator.pyi +2 -2
  134. metaflow-stubs/plugins/storage_executor.pyi +2 -2
  135. metaflow-stubs/plugins/tag_cli.pyi +2 -2
  136. metaflow-stubs/plugins/test_unbounded_foreach_decorator.pyi +2 -2
  137. metaflow-stubs/plugins/timeout_decorator.pyi +3 -3
  138. metaflow-stubs/procpoll.pyi +2 -2
  139. metaflow-stubs/pylint_wrapper.pyi +2 -2
  140. metaflow-stubs/runner/__init__.pyi +2 -2
  141. metaflow-stubs/runner/deployer.pyi +28 -28
  142. metaflow-stubs/runner/deployer_impl.pyi +2 -2
  143. metaflow-stubs/runner/metaflow_runner.pyi +3 -3
  144. metaflow-stubs/runner/nbdeploy.pyi +2 -2
  145. metaflow-stubs/runner/nbrun.pyi +2 -2
  146. metaflow-stubs/runner/subprocess_manager.pyi +2 -2
  147. metaflow-stubs/runner/utils.pyi +3 -3
  148. metaflow-stubs/system/__init__.pyi +2 -2
  149. metaflow-stubs/system/system_logger.pyi +2 -2
  150. metaflow-stubs/system/system_monitor.pyi +2 -2
  151. metaflow-stubs/tagging_util.pyi +2 -2
  152. metaflow-stubs/tuple_util.pyi +2 -2
  153. metaflow-stubs/version.pyi +2 -2
  154. {metaflow_stubs-2.12.30.dist-info → metaflow_stubs-2.12.31.dist-info}/METADATA +2 -2
  155. metaflow_stubs-2.12.31.dist-info/RECORD +158 -0
  156. {metaflow_stubs-2.12.30.dist-info → metaflow_stubs-2.12.31.dist-info}/WHEEL +1 -1
  157. metaflow_stubs-2.12.30.dist-info/RECORD +0 -158
  158. {metaflow_stubs-2.12.30.dist-info → metaflow_stubs-2.12.31.dist-info}/top_level.txt +0 -0
@@ -1,15 +1,15 @@
1
1
  ######################################################################################################
2
2
  # Auto-generated Metaflow stub file #
3
- # MF version: 2.12.30 #
4
- # Generated on 2024-11-13T13:50:31.391188 #
3
+ # MF version: 2.12.31 #
4
+ # Generated on 2024-11-22T20:12:01.558412 #
5
5
  ######################################################################################################
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
9
  import typing
10
10
  if typing.TYPE_CHECKING:
11
- import typing
12
11
  import datetime
12
+ import typing
13
13
  FlowSpecDerived = typing.TypeVar("FlowSpecDerived", bound="FlowSpec", contravariant=False, covariant=False)
14
14
  StepFlag = typing.NewType("StepFlag", bool)
15
15
 
@@ -29,8 +29,8 @@ from .flowspec import FlowSpec as FlowSpec
29
29
  from .parameters import Parameter as Parameter
30
30
  from .parameters import JSONTypeClass as JSONTypeClass
31
31
  from .parameters import JSONType as JSONType
32
- from . import tuple_util as tuple_util
33
32
  from . import events as events
33
+ from . import tuple_util as tuple_util
34
34
  from . import runner as runner
35
35
  from . import plugins as plugins
36
36
  from .plugins.datatools.s3.s3 import S3 as S3
@@ -138,206 +138,169 @@ def step(f: typing.Union[typing.Callable[[FlowSpecDerived], None], typing.Callab
138
138
  ...
139
139
 
140
140
  @typing.overload
141
- def catch(*, var: typing.Optional[str] = None, print_exception: bool = True) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
141
+ def conda(*, packages: typing.Dict[str, str] = {}, libraries: typing.Dict[str, str] = {}, python: typing.Optional[str] = None, disabled: bool = False) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
142
142
  """
143
- Specifies that the step will success under all circumstances.
143
+ Specifies the Conda environment for the step.
144
144
 
145
- The decorator will create an optional artifact, specified by `var`, which
146
- contains the exception raised. You can use it to detect the presence
147
- of errors, indicating that all happy-path artifacts produced by the step
148
- are missing.
145
+ Information in this decorator will augment any
146
+ attributes set in the `@conda_base` flow-level decorator. Hence,
147
+ you can use `@conda_base` to set packages required by all
148
+ steps and use `@conda` to specify step-specific overrides.
149
149
  """
150
150
  ...
151
151
 
152
152
  @typing.overload
153
- def catch(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
153
+ def conda(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
154
154
  ...
155
155
 
156
156
  @typing.overload
157
- def catch(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
157
+ def conda(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
158
158
  ...
159
159
 
160
- def catch(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, var: typing.Optional[str] = None, print_exception: bool = True):
160
+ def conda(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, packages: typing.Dict[str, str] = {}, libraries: typing.Dict[str, str] = {}, python: typing.Optional[str] = None, disabled: bool = False):
161
161
  """
162
- Specifies that the step will success under all circumstances.
162
+ Specifies the Conda environment for the step.
163
163
 
164
- The decorator will create an optional artifact, specified by `var`, which
165
- contains the exception raised. You can use it to detect the presence
166
- of errors, indicating that all happy-path artifacts produced by the step
167
- are missing.
164
+ Information in this decorator will augment any
165
+ attributes set in the `@conda_base` flow-level decorator. Hence,
166
+ you can use `@conda_base` to set packages required by all
167
+ steps and use `@conda` to specify step-specific overrides.
168
168
  """
169
169
  ...
170
170
 
171
171
  @typing.overload
172
- def retry(*, times: int = 3, minutes_between_retries: int = 2) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
172
+ def batch(*, cpu: int = 1, gpu: int = 0, memory: int = 4096, image: typing.Optional[str] = None, queue: str = 'METAFLOW_BATCH_JOB_QUEUE', iam_role: str = 'METAFLOW_ECS_S3_ACCESS_IAM_ROLE', execution_role: str = 'METAFLOW_ECS_FARGATE_EXECUTION_ROLE', shared_memory: typing.Optional[int] = None, max_swap: typing.Optional[int] = None, swappiness: typing.Optional[int] = None, use_tmpfs: bool = False, tmpfs_tempdir: bool = True, tmpfs_size: typing.Optional[int] = None, tmpfs_path: typing.Optional[str] = None, inferentia: int = 0, trainium: int = None, efa: int = 0, ephemeral_storage: int = None, log_driver: typing.Optional[str] = None, log_options: typing.Optional[typing.List[str]] = None) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
173
173
  """
174
- Specifies the number of times the task corresponding
175
- to a step needs to be retried.
176
-
177
- This decorator is useful for handling transient errors, such as networking issues.
178
- If your task contains operations that can't be retried safely, e.g. database updates,
179
- it is advisable to annotate it with `@retry(times=0)`.
180
-
181
- This can be used in conjunction with the `@catch` decorator. The `@catch`
182
- decorator will execute a no-op task after all retries have been exhausted,
183
- ensuring that the flow execution can continue.
174
+ Specifies that this step should execute on [AWS Batch](https://aws.amazon.com/batch/).
184
175
  """
185
176
  ...
186
177
 
187
178
  @typing.overload
188
- def retry(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
179
+ def batch(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
189
180
  ...
190
181
 
191
182
  @typing.overload
192
- def retry(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
183
+ def batch(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
193
184
  ...
194
185
 
195
- def retry(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, times: int = 3, minutes_between_retries: int = 2):
186
+ def batch(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, cpu: int = 1, gpu: int = 0, memory: int = 4096, image: typing.Optional[str] = None, queue: str = 'METAFLOW_BATCH_JOB_QUEUE', iam_role: str = 'METAFLOW_ECS_S3_ACCESS_IAM_ROLE', execution_role: str = 'METAFLOW_ECS_FARGATE_EXECUTION_ROLE', shared_memory: typing.Optional[int] = None, max_swap: typing.Optional[int] = None, swappiness: typing.Optional[int] = None, use_tmpfs: bool = False, tmpfs_tempdir: bool = True, tmpfs_size: typing.Optional[int] = None, tmpfs_path: typing.Optional[str] = None, inferentia: int = 0, trainium: int = None, efa: int = 0, ephemeral_storage: int = None, log_driver: typing.Optional[str] = None, log_options: typing.Optional[typing.List[str]] = None):
196
187
  """
197
- Specifies the number of times the task corresponding
198
- to a step needs to be retried.
199
-
200
- This decorator is useful for handling transient errors, such as networking issues.
201
- If your task contains operations that can't be retried safely, e.g. database updates,
202
- it is advisable to annotate it with `@retry(times=0)`.
203
-
204
- This can be used in conjunction with the `@catch` decorator. The `@catch`
205
- decorator will execute a no-op task after all retries have been exhausted,
206
- ensuring that the flow execution can continue.
188
+ Specifies that this step should execute on [AWS Batch](https://aws.amazon.com/batch/).
207
189
  """
208
190
  ...
209
191
 
210
- @typing.overload
211
- def card(*, type: str = 'default', id: typing.Optional[str] = None, options: typing.Dict[str, typing.Any] = {}, timeout: int = 45) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
192
+ def kubernetes(*, cpu: int = 1, memory: int = 4096, disk: int = 10240, image: typing.Optional[str] = None, image_pull_policy: str = 'KUBERNETES_IMAGE_PULL_POLICY', service_account: str = 'METAFLOW_KUBERNETES_SERVICE_ACCOUNT', secrets: typing.Optional[typing.List[str]] = None, node_selector: typing.Union[typing.Dict[str, str], str, None] = None, namespace: str = 'METAFLOW_KUBERNETES_NAMESPACE', gpu: typing.Optional[int] = None, gpu_vendor: str = 'KUBERNETES_GPU_VENDOR', tolerations: typing.List[str] = [], use_tmpfs: bool = False, tmpfs_tempdir: bool = True, tmpfs_size: typing.Optional[int] = None, tmpfs_path: typing.Optional[str] = '/metaflow_temp', persistent_volume_claims: typing.Optional[typing.Dict[str, str]] = None, shared_memory: typing.Optional[int] = None, port: typing.Optional[int] = None, compute_pool: typing.Optional[str] = None, hostname_resolution_timeout: int = 600) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
212
193
  """
213
- Creates a human-readable report, a Metaflow Card, after this step completes.
214
-
215
- Note that you may add multiple `@card` decorators in a step with different parameters.
194
+ Specifies that this step should execute on Kubernetes.
216
195
  """
217
196
  ...
218
197
 
219
198
  @typing.overload
220
- def card(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
221
- ...
222
-
223
- @typing.overload
224
- def card(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
225
- ...
226
-
227
- def card(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, type: str = 'default', id: typing.Optional[str] = None, options: typing.Dict[str, typing.Any] = {}, timeout: int = 45):
199
+ def catch(*, var: typing.Optional[str] = None, print_exception: bool = True) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
228
200
  """
229
- Creates a human-readable report, a Metaflow Card, after this step completes.
201
+ Specifies that the step will success under all circumstances.
230
202
 
231
- Note that you may add multiple `@card` decorators in a step with different parameters.
232
- """
233
- ...
234
-
235
- @typing.overload
236
- def secrets(*, sources: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = []) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
237
- """
238
- Specifies secrets to be retrieved and injected as environment variables prior to
239
- the execution of a step.
203
+ The decorator will create an optional artifact, specified by `var`, which
204
+ contains the exception raised. You can use it to detect the presence
205
+ of errors, indicating that all happy-path artifacts produced by the step
206
+ are missing.
240
207
  """
241
208
  ...
242
209
 
243
210
  @typing.overload
244
- def secrets(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
211
+ def catch(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
245
212
  ...
246
213
 
247
214
  @typing.overload
248
- def secrets(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
249
- ...
250
-
251
- def secrets(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, sources: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = []):
252
- """
253
- Specifies secrets to be retrieved and injected as environment variables prior to
254
- the execution of a step.
255
- """
215
+ def catch(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
256
216
  ...
257
217
 
258
- def kubernetes(*, cpu: int = 1, memory: int = 4096, disk: int = 10240, image: typing.Optional[str] = None, image_pull_policy: str = 'KUBERNETES_IMAGE_PULL_POLICY', service_account: str = 'METAFLOW_KUBERNETES_SERVICE_ACCOUNT', secrets: typing.Optional[typing.List[str]] = None, node_selector: typing.Union[typing.Dict[str, str], str, None] = None, namespace: str = 'METAFLOW_KUBERNETES_NAMESPACE', gpu: typing.Optional[int] = None, gpu_vendor: str = 'KUBERNETES_GPU_VENDOR', tolerations: typing.List[str] = [], use_tmpfs: bool = False, tmpfs_tempdir: bool = True, tmpfs_size: typing.Optional[int] = None, tmpfs_path: typing.Optional[str] = '/metaflow_temp', persistent_volume_claims: typing.Optional[typing.Dict[str, str]] = None, shared_memory: typing.Optional[int] = None, port: typing.Optional[int] = None, compute_pool: typing.Optional[str] = None, hostname_resolution_timeout: int = 600) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
218
+ def catch(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, var: typing.Optional[str] = None, print_exception: bool = True):
259
219
  """
260
- Specifies that this step should execute on Kubernetes.
220
+ Specifies that the step will success under all circumstances.
221
+
222
+ The decorator will create an optional artifact, specified by `var`, which
223
+ contains the exception raised. You can use it to detect the presence
224
+ of errors, indicating that all happy-path artifacts produced by the step
225
+ are missing.
261
226
  """
262
227
  ...
263
228
 
264
229
  @typing.overload
265
- def resources(*, cpu: int = 1, gpu: typing.Optional[int] = None, disk: typing.Optional[int] = None, memory: int = 4096, shared_memory: typing.Optional[int] = None) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
230
+ def timeout(*, seconds: int = 0, minutes: int = 0, hours: int = 0) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
266
231
  """
267
- Specifies the resources needed when executing this step.
232
+ Specifies a timeout for your step.
268
233
 
269
- Use `@resources` to specify the resource requirements
270
- independently of the specific compute layer (`@batch`, `@kubernetes`).
234
+ This decorator is useful if this step may hang indefinitely.
271
235
 
272
- You can choose the compute layer on the command line by executing e.g.
273
- ```
274
- python myflow.py run --with batch
275
- ```
276
- or
277
- ```
278
- python myflow.py run --with kubernetes
279
- ```
280
- which executes the flow on the desired system using the
281
- requirements specified in `@resources`.
236
+ This can be used in conjunction with the `@retry` decorator as well as the `@catch` decorator.
237
+ A timeout is considered to be an exception thrown by the step. It will cause the step to be
238
+ retried if needed and the exception will be caught by the `@catch` decorator, if present.
239
+
240
+ Note that all the values specified in parameters are added together so if you specify
241
+ 60 seconds and 1 hour, the decorator will have an effective timeout of 1 hour and 1 minute.
282
242
  """
283
243
  ...
284
244
 
285
245
  @typing.overload
286
- def resources(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
246
+ def timeout(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
287
247
  ...
288
248
 
289
249
  @typing.overload
290
- def resources(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
250
+ def timeout(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
291
251
  ...
292
252
 
293
- def resources(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, cpu: int = 1, gpu: typing.Optional[int] = None, disk: typing.Optional[int] = None, memory: int = 4096, shared_memory: typing.Optional[int] = None):
253
+ def timeout(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, seconds: int = 0, minutes: int = 0, hours: int = 0):
294
254
  """
295
- Specifies the resources needed when executing this step.
255
+ Specifies a timeout for your step.
296
256
 
297
- Use `@resources` to specify the resource requirements
298
- independently of the specific compute layer (`@batch`, `@kubernetes`).
257
+ This decorator is useful if this step may hang indefinitely.
299
258
 
300
- You can choose the compute layer on the command line by executing e.g.
301
- ```
302
- python myflow.py run --with batch
303
- ```
304
- or
305
- ```
306
- python myflow.py run --with kubernetes
307
- ```
308
- which executes the flow on the desired system using the
309
- requirements specified in `@resources`.
259
+ This can be used in conjunction with the `@retry` decorator as well as the `@catch` decorator.
260
+ A timeout is considered to be an exception thrown by the step. It will cause the step to be
261
+ retried if needed and the exception will be caught by the `@catch` decorator, if present.
262
+
263
+ Note that all the values specified in parameters are added together so if you specify
264
+ 60 seconds and 1 hour, the decorator will have an effective timeout of 1 hour and 1 minute.
310
265
  """
311
266
  ...
312
267
 
313
268
  @typing.overload
314
- def conda(*, packages: typing.Dict[str, str] = {}, libraries: typing.Dict[str, str] = {}, python: typing.Optional[str] = None, disabled: bool = False) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
269
+ def retry(*, times: int = 3, minutes_between_retries: int = 2) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
315
270
  """
316
- Specifies the Conda environment for the step.
271
+ Specifies the number of times the task corresponding
272
+ to a step needs to be retried.
317
273
 
318
- Information in this decorator will augment any
319
- attributes set in the `@conda_base` flow-level decorator. Hence,
320
- you can use `@conda_base` to set packages required by all
321
- steps and use `@conda` to specify step-specific overrides.
274
+ This decorator is useful for handling transient errors, such as networking issues.
275
+ If your task contains operations that can't be retried safely, e.g. database updates,
276
+ it is advisable to annotate it with `@retry(times=0)`.
277
+
278
+ This can be used in conjunction with the `@catch` decorator. The `@catch`
279
+ decorator will execute a no-op task after all retries have been exhausted,
280
+ ensuring that the flow execution can continue.
322
281
  """
323
282
  ...
324
283
 
325
284
  @typing.overload
326
- def conda(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
285
+ def retry(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
327
286
  ...
328
287
 
329
288
  @typing.overload
330
- def conda(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
289
+ def retry(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
331
290
  ...
332
291
 
333
- def conda(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, packages: typing.Dict[str, str] = {}, libraries: typing.Dict[str, str] = {}, python: typing.Optional[str] = None, disabled: bool = False):
292
+ def retry(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, times: int = 3, minutes_between_retries: int = 2):
334
293
  """
335
- Specifies the Conda environment for the step.
294
+ Specifies the number of times the task corresponding
295
+ to a step needs to be retried.
336
296
 
337
- Information in this decorator will augment any
338
- attributes set in the `@conda_base` flow-level decorator. Hence,
339
- you can use `@conda_base` to set packages required by all
340
- steps and use `@conda` to specify step-specific overrides.
297
+ This decorator is useful for handling transient errors, such as networking issues.
298
+ If your task contains operations that can't be retried safely, e.g. database updates,
299
+ it is advisable to annotate it with `@retry(times=0)`.
300
+
301
+ This can be used in conjunction with the `@catch` decorator. The `@catch`
302
+ decorator will execute a no-op task after all retries have been exhausted,
303
+ ensuring that the flow execution can continue.
341
304
  """
342
305
  ...
343
306
 
@@ -363,54 +326,50 @@ def environment(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], Non
363
326
  ...
364
327
 
365
328
  @typing.overload
366
- def batch(*, cpu: int = 1, gpu: int = 0, memory: int = 4096, image: typing.Optional[str] = None, queue: str = 'METAFLOW_BATCH_JOB_QUEUE', iam_role: str = 'METAFLOW_ECS_S3_ACCESS_IAM_ROLE', execution_role: str = 'METAFLOW_ECS_FARGATE_EXECUTION_ROLE', shared_memory: typing.Optional[int] = None, max_swap: typing.Optional[int] = None, swappiness: typing.Optional[int] = None, use_tmpfs: bool = False, tmpfs_tempdir: bool = True, tmpfs_size: typing.Optional[int] = None, tmpfs_path: typing.Optional[str] = None, inferentia: int = 0, trainium: int = None, efa: int = 0, ephemeral_storage: int = None, log_driver: typing.Optional[str] = None, log_options: typing.Optional[typing.List[str]] = None) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
329
+ def secrets(*, sources: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = []) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
367
330
  """
368
- Specifies that this step should execute on [AWS Batch](https://aws.amazon.com/batch/).
331
+ Specifies secrets to be retrieved and injected as environment variables prior to
332
+ the execution of a step.
369
333
  """
370
334
  ...
371
335
 
372
336
  @typing.overload
373
- def batch(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
337
+ def secrets(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
374
338
  ...
375
339
 
376
340
  @typing.overload
377
- def batch(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
341
+ def secrets(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
378
342
  ...
379
343
 
380
- def batch(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, cpu: int = 1, gpu: int = 0, memory: int = 4096, image: typing.Optional[str] = None, queue: str = 'METAFLOW_BATCH_JOB_QUEUE', iam_role: str = 'METAFLOW_ECS_S3_ACCESS_IAM_ROLE', execution_role: str = 'METAFLOW_ECS_FARGATE_EXECUTION_ROLE', shared_memory: typing.Optional[int] = None, max_swap: typing.Optional[int] = None, swappiness: typing.Optional[int] = None, use_tmpfs: bool = False, tmpfs_tempdir: bool = True, tmpfs_size: typing.Optional[int] = None, tmpfs_path: typing.Optional[str] = None, inferentia: int = 0, trainium: int = None, efa: int = 0, ephemeral_storage: int = None, log_driver: typing.Optional[str] = None, log_options: typing.Optional[typing.List[str]] = None):
344
+ def secrets(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, sources: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = []):
381
345
  """
382
- Specifies that this step should execute on [AWS Batch](https://aws.amazon.com/batch/).
346
+ Specifies secrets to be retrieved and injected as environment variables prior to
347
+ the execution of a step.
383
348
  """
384
349
  ...
385
350
 
386
351
  @typing.overload
387
- def pypi(*, packages: typing.Dict[str, str] = {}, python: typing.Optional[str] = None) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
352
+ def card(*, type: str = 'default', id: typing.Optional[str] = None, options: typing.Dict[str, typing.Any] = {}, timeout: int = 45) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
388
353
  """
389
- Specifies the PyPI packages for the step.
354
+ Creates a human-readable report, a Metaflow Card, after this step completes.
390
355
 
391
- Information in this decorator will augment any
392
- attributes set in the `@pyi_base` flow-level decorator. Hence,
393
- you can use `@pypi_base` to set packages required by all
394
- steps and use `@pypi` to specify step-specific overrides.
356
+ Note that you may add multiple `@card` decorators in a step with different parameters.
395
357
  """
396
358
  ...
397
359
 
398
360
  @typing.overload
399
- def pypi(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
361
+ def card(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
400
362
  ...
401
363
 
402
364
  @typing.overload
403
- def pypi(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
365
+ def card(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
404
366
  ...
405
367
 
406
- def pypi(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, packages: typing.Dict[str, str] = {}, python: typing.Optional[str] = None):
368
+ def card(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, type: str = 'default', id: typing.Optional[str] = None, options: typing.Dict[str, typing.Any] = {}, timeout: int = 45):
407
369
  """
408
- Specifies the PyPI packages for the step.
370
+ Creates a human-readable report, a Metaflow Card, after this step completes.
409
371
 
410
- Information in this decorator will augment any
411
- attributes set in the `@pyi_base` flow-level decorator. Hence,
412
- you can use `@pypi_base` to set packages required by all
413
- steps and use `@pypi` to specify step-specific overrides.
372
+ Note that you may add multiple `@card` decorators in a step with different parameters.
414
373
  """
415
374
  ...
416
375
 
@@ -434,70 +393,82 @@ def parallel(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None],
434
393
  ...
435
394
 
436
395
  @typing.overload
437
- def timeout(*, seconds: int = 0, minutes: int = 0, hours: int = 0) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
396
+ def resources(*, cpu: int = 1, gpu: typing.Optional[int] = None, disk: typing.Optional[int] = None, memory: int = 4096, shared_memory: typing.Optional[int] = None) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
438
397
  """
439
- Specifies a timeout for your step.
440
-
441
- This decorator is useful if this step may hang indefinitely.
398
+ Specifies the resources needed when executing this step.
442
399
 
443
- This can be used in conjunction with the `@retry` decorator as well as the `@catch` decorator.
444
- A timeout is considered to be an exception thrown by the step. It will cause the step to be
445
- retried if needed and the exception will be caught by the `@catch` decorator, if present.
400
+ Use `@resources` to specify the resource requirements
401
+ independently of the specific compute layer (`@batch`, `@kubernetes`).
446
402
 
447
- Note that all the values specified in parameters are added together so if you specify
448
- 60 seconds and 1 hour, the decorator will have an effective timeout of 1 hour and 1 minute.
403
+ You can choose the compute layer on the command line by executing e.g.
404
+ ```
405
+ python myflow.py run --with batch
406
+ ```
407
+ or
408
+ ```
409
+ python myflow.py run --with kubernetes
410
+ ```
411
+ which executes the flow on the desired system using the
412
+ requirements specified in `@resources`.
449
413
  """
450
414
  ...
451
415
 
452
416
  @typing.overload
453
- def timeout(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
417
+ def resources(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
454
418
  ...
455
419
 
456
420
  @typing.overload
457
- def timeout(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
421
+ def resources(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
458
422
  ...
459
423
 
460
- def timeout(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, seconds: int = 0, minutes: int = 0, hours: int = 0):
424
+ def resources(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, cpu: int = 1, gpu: typing.Optional[int] = None, disk: typing.Optional[int] = None, memory: int = 4096, shared_memory: typing.Optional[int] = None):
461
425
  """
462
- Specifies a timeout for your step.
463
-
464
- This decorator is useful if this step may hang indefinitely.
426
+ Specifies the resources needed when executing this step.
465
427
 
466
- This can be used in conjunction with the `@retry` decorator as well as the `@catch` decorator.
467
- A timeout is considered to be an exception thrown by the step. It will cause the step to be
468
- retried if needed and the exception will be caught by the `@catch` decorator, if present.
428
+ Use `@resources` to specify the resource requirements
429
+ independently of the specific compute layer (`@batch`, `@kubernetes`).
469
430
 
470
- Note that all the values specified in parameters are added together so if you specify
471
- 60 seconds and 1 hour, the decorator will have an effective timeout of 1 hour and 1 minute.
431
+ You can choose the compute layer on the command line by executing e.g.
432
+ ```
433
+ python myflow.py run --with batch
434
+ ```
435
+ or
436
+ ```
437
+ python myflow.py run --with kubernetes
438
+ ```
439
+ which executes the flow on the desired system using the
440
+ requirements specified in `@resources`.
472
441
  """
473
442
  ...
474
443
 
475
- def airflow_s3_key_sensor(*, timeout: int, poke_interval: int, mode: str, exponential_backoff: bool, pool: str, soft_fail: bool, name: str, description: str, bucket_key: typing.Union[str, typing.List[str]], bucket_name: str, wildcard_match: bool, aws_conn_id: str, verify: bool) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
444
+ @typing.overload
445
+ def pypi(*, packages: typing.Dict[str, str] = {}, python: typing.Optional[str] = None) -> typing.Callable[[typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]], typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]]]:
476
446
  """
477
- The `@airflow_s3_key_sensor` decorator attaches a Airflow [S3KeySensor](https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/_api/airflow/providers/amazon/aws/sensors/s3/index.html#airflow.providers.amazon.aws.sensors.s3.S3KeySensor)
478
- before the start step of the flow. This decorator only works when a flow is scheduled on Airflow
479
- and is compiled using `airflow create`. More than one `@airflow_s3_key_sensor` can be
480
- added as a flow decorators. Adding more than one decorator will ensure that `start` step
481
- starts only after all sensors finish.
447
+ Specifies the PyPI packages for the step.
448
+
449
+ Information in this decorator will augment any
450
+ attributes set in the `@pyi_base` flow-level decorator. Hence,
451
+ you can use `@pypi_base` to set packages required by all
452
+ steps and use `@pypi` to specify step-specific overrides.
482
453
  """
483
454
  ...
484
455
 
485
456
  @typing.overload
486
- def schedule(*, hourly: bool = False, daily: bool = True, weekly: bool = False, cron: typing.Optional[str] = None, timezone: typing.Optional[str] = None) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
487
- """
488
- Specifies the times when the flow should be run when running on a
489
- production scheduler.
490
- """
457
+ def pypi(f: typing.Callable[[FlowSpecDerived, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, StepFlag], None]:
491
458
  ...
492
459
 
493
460
  @typing.overload
494
- def schedule(f: typing.Type[FlowSpecDerived]) -> typing.Type[FlowSpecDerived]:
461
+ def pypi(f: typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]) -> typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None]:
495
462
  ...
496
463
 
497
- def schedule(f: typing.Optional[typing.Type[FlowSpecDerived]] = None, *, hourly: bool = False, daily: bool = True, weekly: bool = False, cron: typing.Optional[str] = None, timezone: typing.Optional[str] = None):
464
+ def pypi(f: typing.Union[typing.Callable[[FlowSpecDerived, StepFlag], None], typing.Callable[[FlowSpecDerived, typing.Any, StepFlag], None], None] = None, *, packages: typing.Dict[str, str] = {}, python: typing.Optional[str] = None):
498
465
  """
499
- Specifies the times when the flow should be run when running on a
500
- production scheduler.
466
+ Specifies the PyPI packages for the step.
467
+
468
+ Information in this decorator will augment any
469
+ attributes set in the `@pyi_base` flow-level decorator. Hence,
470
+ you can use `@pypi_base` to set packages required by all
471
+ steps and use `@pypi` to specify step-specific overrides.
501
472
  """
502
473
  ...
503
474
 
@@ -524,76 +495,13 @@ def conda_base(f: typing.Optional[typing.Type[FlowSpecDerived]] = None, *, packa
524
495
  """
525
496
  ...
526
497
 
527
- @typing.overload
528
- def trigger(*, event: typing.Union[str, typing.Dict[str, typing.Any], None] = None, events: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = [], options: typing.Dict[str, typing.Any] = {}) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
529
- """
530
- Specifies the event(s) that this flow depends on.
531
-
532
- ```
533
- @trigger(event='foo')
534
- ```
535
- or
536
- ```
537
- @trigger(events=['foo', 'bar'])
538
- ```
539
-
540
- Additionally, you can specify the parameter mappings
541
- to map event payload to Metaflow parameters for the flow.
542
- ```
543
- @trigger(event={'name':'foo', 'parameters':{'flow_param': 'event_field'}})
544
- ```
545
- or
546
- ```
547
- @trigger(events=[{'name':'foo', 'parameters':{'flow_param_1': 'event_field_1'},
548
- {'name':'bar', 'parameters':{'flow_param_2': 'event_field_2'}])
549
- ```
550
-
551
- 'parameters' can also be a list of strings and tuples like so:
552
- ```
553
- @trigger(event={'name':'foo', 'parameters':['common_name', ('flow_param', 'event_field')]})
554
- ```
555
- This is equivalent to:
556
- ```
557
- @trigger(event={'name':'foo', 'parameters':{'common_name': 'common_name', 'flow_param': 'event_field'}})
558
- ```
559
- """
560
- ...
561
-
562
- @typing.overload
563
- def trigger(f: typing.Type[FlowSpecDerived]) -> typing.Type[FlowSpecDerived]:
564
- ...
565
-
566
- def trigger(f: typing.Optional[typing.Type[FlowSpecDerived]] = None, *, event: typing.Union[str, typing.Dict[str, typing.Any], None] = None, events: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = [], options: typing.Dict[str, typing.Any] = {}):
498
+ def airflow_s3_key_sensor(*, timeout: int, poke_interval: int, mode: str, exponential_backoff: bool, pool: str, soft_fail: bool, name: str, description: str, bucket_key: typing.Union[str, typing.List[str]], bucket_name: str, wildcard_match: bool, aws_conn_id: str, verify: bool) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
567
499
  """
568
- Specifies the event(s) that this flow depends on.
569
-
570
- ```
571
- @trigger(event='foo')
572
- ```
573
- or
574
- ```
575
- @trigger(events=['foo', 'bar'])
576
- ```
577
-
578
- Additionally, you can specify the parameter mappings
579
- to map event payload to Metaflow parameters for the flow.
580
- ```
581
- @trigger(event={'name':'foo', 'parameters':{'flow_param': 'event_field'}})
582
- ```
583
- or
584
- ```
585
- @trigger(events=[{'name':'foo', 'parameters':{'flow_param_1': 'event_field_1'},
586
- {'name':'bar', 'parameters':{'flow_param_2': 'event_field_2'}])
587
- ```
588
-
589
- 'parameters' can also be a list of strings and tuples like so:
590
- ```
591
- @trigger(event={'name':'foo', 'parameters':['common_name', ('flow_param', 'event_field')]})
592
- ```
593
- This is equivalent to:
594
- ```
595
- @trigger(event={'name':'foo', 'parameters':{'common_name': 'common_name', 'flow_param': 'event_field'}})
596
- ```
500
+ The `@airflow_s3_key_sensor` decorator attaches a Airflow [S3KeySensor](https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/_api/airflow/providers/amazon/aws/sensors/s3/index.html#airflow.providers.amazon.aws.sensors.s3.S3KeySensor)
501
+ before the start step of the flow. This decorator only works when a flow is scheduled on Airflow
502
+ and is compiled using `airflow create`. More than one `@airflow_s3_key_sensor` can be
503
+ added as a flow decorators. Adding more than one decorator will ensure that `start` step
504
+ starts only after all sensors finish.
597
505
  """
598
506
  ...
599
507
 
@@ -620,15 +528,6 @@ def pypi_base(f: typing.Optional[typing.Type[FlowSpecDerived]] = None, *, packag
620
528
  """
621
529
  ...
622
530
 
623
- def project(*, name: str) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
624
- """
625
- Specifies what flows belong to the same project.
626
-
627
- A project-specific namespace is created for all flows that
628
- use the same `@project(name)`.
629
- """
630
- ...
631
-
632
531
  @typing.overload
633
532
  def trigger_on_finish(*, flow: typing.Union[typing.Dict[str, str], str, None] = None, flows: typing.List[typing.Union[str, typing.Dict[str, str]]] = [], options: typing.Dict[str, typing.Any] = {}) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
634
533
  """
@@ -717,3 +616,104 @@ def airflow_external_task_sensor(*, timeout: int, poke_interval: int, mode: str,
717
616
  """
718
617
  ...
719
618
 
619
+ def project(*, name: str) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
620
+ """
621
+ Specifies what flows belong to the same project.
622
+
623
+ A project-specific namespace is created for all flows that
624
+ use the same `@project(name)`.
625
+ """
626
+ ...
627
+
628
+ @typing.overload
629
+ def schedule(*, hourly: bool = False, daily: bool = True, weekly: bool = False, cron: typing.Optional[str] = None, timezone: typing.Optional[str] = None) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
630
+ """
631
+ Specifies the times when the flow should be run when running on a
632
+ production scheduler.
633
+ """
634
+ ...
635
+
636
+ @typing.overload
637
+ def schedule(f: typing.Type[FlowSpecDerived]) -> typing.Type[FlowSpecDerived]:
638
+ ...
639
+
640
+ def schedule(f: typing.Optional[typing.Type[FlowSpecDerived]] = None, *, hourly: bool = False, daily: bool = True, weekly: bool = False, cron: typing.Optional[str] = None, timezone: typing.Optional[str] = None):
641
+ """
642
+ Specifies the times when the flow should be run when running on a
643
+ production scheduler.
644
+ """
645
+ ...
646
+
647
+ @typing.overload
648
+ def trigger(*, event: typing.Union[str, typing.Dict[str, typing.Any], None] = None, events: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = [], options: typing.Dict[str, typing.Any] = {}) -> typing.Callable[[typing.Type[FlowSpecDerived]], typing.Type[FlowSpecDerived]]:
649
+ """
650
+ Specifies the event(s) that this flow depends on.
651
+
652
+ ```
653
+ @trigger(event='foo')
654
+ ```
655
+ or
656
+ ```
657
+ @trigger(events=['foo', 'bar'])
658
+ ```
659
+
660
+ Additionally, you can specify the parameter mappings
661
+ to map event payload to Metaflow parameters for the flow.
662
+ ```
663
+ @trigger(event={'name':'foo', 'parameters':{'flow_param': 'event_field'}})
664
+ ```
665
+ or
666
+ ```
667
+ @trigger(events=[{'name':'foo', 'parameters':{'flow_param_1': 'event_field_1'},
668
+ {'name':'bar', 'parameters':{'flow_param_2': 'event_field_2'}])
669
+ ```
670
+
671
+ 'parameters' can also be a list of strings and tuples like so:
672
+ ```
673
+ @trigger(event={'name':'foo', 'parameters':['common_name', ('flow_param', 'event_field')]})
674
+ ```
675
+ This is equivalent to:
676
+ ```
677
+ @trigger(event={'name':'foo', 'parameters':{'common_name': 'common_name', 'flow_param': 'event_field'}})
678
+ ```
679
+ """
680
+ ...
681
+
682
+ @typing.overload
683
+ def trigger(f: typing.Type[FlowSpecDerived]) -> typing.Type[FlowSpecDerived]:
684
+ ...
685
+
686
+ def trigger(f: typing.Optional[typing.Type[FlowSpecDerived]] = None, *, event: typing.Union[str, typing.Dict[str, typing.Any], None] = None, events: typing.List[typing.Union[str, typing.Dict[str, typing.Any]]] = [], options: typing.Dict[str, typing.Any] = {}):
687
+ """
688
+ Specifies the event(s) that this flow depends on.
689
+
690
+ ```
691
+ @trigger(event='foo')
692
+ ```
693
+ or
694
+ ```
695
+ @trigger(events=['foo', 'bar'])
696
+ ```
697
+
698
+ Additionally, you can specify the parameter mappings
699
+ to map event payload to Metaflow parameters for the flow.
700
+ ```
701
+ @trigger(event={'name':'foo', 'parameters':{'flow_param': 'event_field'}})
702
+ ```
703
+ or
704
+ ```
705
+ @trigger(events=[{'name':'foo', 'parameters':{'flow_param_1': 'event_field_1'},
706
+ {'name':'bar', 'parameters':{'flow_param_2': 'event_field_2'}])
707
+ ```
708
+
709
+ 'parameters' can also be a list of strings and tuples like so:
710
+ ```
711
+ @trigger(event={'name':'foo', 'parameters':['common_name', ('flow_param', 'event_field')]})
712
+ ```
713
+ This is equivalent to:
714
+ ```
715
+ @trigger(event={'name':'foo', 'parameters':{'common_name': 'common_name', 'flow_param': 'event_field'}})
716
+ ```
717
+ """
718
+ ...
719
+