ob-metaflow 2.15.6.1__py2.py3-none-any.whl → 2.15.7.2__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.

Potentially problematic release.


This version of ob-metaflow might be problematic. Click here for more details.

@@ -7,6 +7,7 @@ import sys
7
7
  from collections import defaultdict
8
8
  from hashlib import sha1
9
9
  from math import inf
10
+ from typing import List
10
11
 
11
12
  from metaflow import JSONType, current
12
13
  from metaflow.decorators import flow_decorators
@@ -111,6 +112,7 @@ class ArgoWorkflows(object):
111
112
  notify_pager_duty_integration_key=None,
112
113
  notify_incident_io_api_key=None,
113
114
  incident_io_alert_source_config_id=None,
115
+ incident_io_metadata: List[str] = None,
114
116
  enable_heartbeat_daemon=True,
115
117
  enable_error_msg_capture=False,
116
118
  ):
@@ -162,6 +164,9 @@ class ArgoWorkflows(object):
162
164
  self.notify_pager_duty_integration_key = notify_pager_duty_integration_key
163
165
  self.notify_incident_io_api_key = notify_incident_io_api_key
164
166
  self.incident_io_alert_source_config_id = incident_io_alert_source_config_id
167
+ self.incident_io_metadata = self.parse_incident_io_metadata(
168
+ incident_io_metadata
169
+ )
165
170
  self.enable_heartbeat_daemon = enable_heartbeat_daemon
166
171
  self.enable_error_msg_capture = enable_error_msg_capture
167
172
  self.parameters = self._process_parameters()
@@ -288,6 +293,21 @@ class ArgoWorkflows(object):
288
293
 
289
294
  return True
290
295
 
296
+ @staticmethod
297
+ def parse_incident_io_metadata(metadata: List[str] = None):
298
+ "parse key value pairs into a dict for incident.io metadata if given"
299
+ parsed_metadata = None
300
+ if metadata is not None:
301
+ parsed_metadata = {}
302
+ for kv in metadata:
303
+ key, value = kv.split("=", 1)
304
+ if key in parsed_metadata:
305
+ raise MetaflowException(
306
+ "Incident.io Metadata *%s* provided multiple times" % key
307
+ )
308
+ parsed_metadata[key] = value
309
+ return parsed_metadata
310
+
291
311
  @classmethod
292
312
  def trigger(cls, name, parameters=None):
293
313
  if parameters is None:
@@ -525,6 +545,7 @@ class ArgoWorkflows(object):
525
545
  default_value = json.dumps(default_value)
526
546
 
527
547
  parameters[param.name] = dict(
548
+ python_var_name=var,
528
549
  name=param.name,
529
550
  value=default_value,
530
551
  type=param_type,
@@ -839,7 +860,11 @@ class ArgoWorkflows(object):
839
860
  Arguments().parameters(
840
861
  [
841
862
  Parameter(parameter["name"])
842
- .value(parameter["value"])
863
+ .value(
864
+ "'%s'" % parameter["value"]
865
+ if parameter["type"] == "JSON"
866
+ else parameter["value"]
867
+ )
843
868
  .description(parameter.get("description"))
844
869
  # TODO: Better handle IncludeFile in Argo Workflows UI.
845
870
  for parameter in self.parameters.values()
@@ -1595,11 +1620,7 @@ class ArgoWorkflows(object):
1595
1620
  # {{foo.bar['param_name']}}.
1596
1621
  # https://argoproj.github.io/argo-events/tutorials/02-parameterization/
1597
1622
  # http://masterminds.github.io/sprig/strings.html
1598
- (
1599
- "--%s='{{workflow.parameters.%s}}'"
1600
- if parameter["type"] == "JSON"
1601
- else "--%s={{workflow.parameters.%s}}"
1602
- )
1623
+ "--%s={{workflow.parameters.%s}}"
1603
1624
  % (parameter["name"], parameter["name"])
1604
1625
  for parameter in self.parameters.values()
1605
1626
  ]
@@ -2574,9 +2595,12 @@ class ArgoWorkflows(object):
2574
2595
  else None
2575
2596
  ),
2576
2597
  "metadata": {
2577
- "run_status": "failed",
2578
- "flow_name": self.flow.name,
2579
- "run_id": "argo-{{workflow.name}}",
2598
+ **(self.incident_io_metadata or {}),
2599
+ **{
2600
+ "run_status": "failed",
2601
+ "flow_name": self.flow.name,
2602
+ "run_id": "argo-{{workflow.name}}",
2603
+ },
2580
2604
  },
2581
2605
  }
2582
2606
  )
@@ -2625,9 +2649,12 @@ class ArgoWorkflows(object):
2625
2649
  else None
2626
2650
  ),
2627
2651
  "metadata": {
2628
- "run_status": "succeeded",
2629
- "flow_name": self.flow.name,
2630
- "run_id": "argo-{{workflow.name}}",
2652
+ **(self.incident_io_metadata or {}),
2653
+ **{
2654
+ "run_status": "succeeded",
2655
+ "flow_name": self.flow.name,
2656
+ "run_id": "argo-{{workflow.name}}",
2657
+ },
2631
2658
  },
2632
2659
  }
2633
2660
  )
@@ -3197,15 +3224,37 @@ class ArgoWorkflows(object):
3197
3224
  # NOTE: We need the conditional logic in order to successfully fall back to the default value
3198
3225
  # when the event payload does not contain a key for a parameter.
3199
3226
  # NOTE: Keys might contain dashes, so use the safer 'get' for fetching the value
3200
- data_template='{{ if (hasKey $.Input.body.payload "%s") }}{{- (get $.Input.body.payload "%s" | toRawJson) -}}{{- else -}}{{ (fail "use-default-instead") }}{{- end -}}'
3201
- % (v, v),
3227
+ data_template='{{ if (hasKey $.Input.body.payload "%s") }}{{- (get $.Input.body.payload "%s" %s) -}}{{- else -}}{{ (fail "use-default-instead") }}{{- end -}}'
3228
+ % (
3229
+ v,
3230
+ v,
3231
+ (
3232
+ "| toRawJson | squote"
3233
+ if self.parameters[
3234
+ parameter_name
3235
+ ]["type"]
3236
+ == "JSON"
3237
+ else "| toRawJson"
3238
+ ),
3239
+ ),
3202
3240
  # Unfortunately the sensor needs to
3203
3241
  # record the default values for
3204
3242
  # the parameters - there doesn't seem
3205
3243
  # to be any way for us to skip
3206
- value=self.parameters[parameter_name][
3207
- "value"
3208
- ],
3244
+ value=(
3245
+ json.dumps(
3246
+ self.parameters[parameter_name][
3247
+ "value"
3248
+ ]
3249
+ )
3250
+ if self.parameters[parameter_name][
3251
+ "type"
3252
+ ]
3253
+ == "JSON"
3254
+ else self.parameters[
3255
+ parameter_name
3256
+ ]["value"]
3257
+ ),
3209
3258
  )
3210
3259
  .dest(
3211
3260
  # this undocumented (mis?)feature in
@@ -187,6 +187,13 @@ def argo_workflows(obj, name=None):
187
187
  default=None,
188
188
  help="Incident.io Alert source config ID. Example '01GW2G3V0S59R238FAHPDS1R66'",
189
189
  )
190
+ @click.option(
191
+ "--incident-io-metadata",
192
+ default=None,
193
+ type=str,
194
+ multiple=True,
195
+ help="Incident.io Alert Custom Metadata field in the form of Key=Value",
196
+ )
190
197
  @click.option(
191
198
  "--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
192
199
  default=False,
@@ -226,6 +233,7 @@ def create(
226
233
  notify_pager_duty_integration_key=None,
227
234
  notify_incident_io_api_key=None,
228
235
  incident_io_alert_source_config_id=None,
236
+ incident_io_metadata=None,
229
237
  enable_heartbeat_daemon=True,
230
238
  deployer_attribute_file=None,
231
239
  enable_error_msg_capture=False,
@@ -283,6 +291,7 @@ def create(
283
291
  notify_pager_duty_integration_key,
284
292
  notify_incident_io_api_key,
285
293
  incident_io_alert_source_config_id,
294
+ incident_io_metadata,
286
295
  enable_heartbeat_daemon,
287
296
  enable_error_msg_capture,
288
297
  )
@@ -459,6 +468,7 @@ def make_flow(
459
468
  notify_pager_duty_integration_key,
460
469
  notify_incident_io_api_key,
461
470
  incident_io_alert_source_config_id,
471
+ incident_io_metadata,
462
472
  enable_heartbeat_daemon,
463
473
  enable_error_msg_capture,
464
474
  ):
@@ -538,6 +548,7 @@ def make_flow(
538
548
  notify_pager_duty_integration_key=notify_pager_duty_integration_key,
539
549
  notify_incident_io_api_key=notify_incident_io_api_key,
540
550
  incident_io_alert_source_config_id=incident_io_alert_source_config_id,
551
+ incident_io_metadata=incident_io_metadata,
541
552
  enable_heartbeat_daemon=enable_heartbeat_daemon,
542
553
  enable_error_msg_capture=enable_error_msg_capture,
543
554
  )
@@ -19,6 +19,7 @@ def generate_fake_flow_file_contents(
19
19
  ):
20
20
  params_code = ""
21
21
  for _, param_details in param_info.items():
22
+ param_python_var_name = param_details["python_var_name"]
22
23
  param_name = param_details["name"]
23
24
  param_type = param_details["type"]
24
25
  param_help = param_details["description"]
@@ -26,21 +27,21 @@ def generate_fake_flow_file_contents(
26
27
 
27
28
  if param_type == "JSON":
28
29
  params_code += (
29
- f" {param_name} = Parameter('{param_name}', "
30
- f"type=JSONType, help='{param_help}', required={param_required})\n"
30
+ f" {param_python_var_name} = Parameter('{param_name}', "
31
+ f"type=JSONType, help='''{param_help}''', required={param_required})\n"
31
32
  )
32
33
  elif param_type == "FilePath":
33
34
  is_text = param_details.get("is_text", True)
34
35
  encoding = param_details.get("encoding", "utf-8")
35
36
  params_code += (
36
- f" {param_name} = IncludeFile('{param_name}', "
37
- f"is_text={is_text}, encoding='{encoding}', help='{param_help}', "
37
+ f" {param_python_var_name} = IncludeFile('{param_name}', "
38
+ f"is_text={is_text}, encoding='{encoding}', help='''{param_help}''', "
38
39
  f"required={param_required})\n"
39
40
  )
40
41
  else:
41
42
  params_code += (
42
- f" {param_name} = Parameter('{param_name}', "
43
- f"type={param_type}, help='{param_help}', required={param_required})\n"
43
+ f" {param_python_var_name} = Parameter('{param_name}', "
44
+ f"type={param_type}, help='''{param_help}''', required={param_required})\n"
44
45
  )
45
46
 
46
47
  project_decorator = f"@project(name='{project_name}')\n" if project_name else ""
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.15.6.1"
1
+ metaflow_version = "2.15.7.2"
@@ -75,7 +75,7 @@ check-docker:
75
75
  @if [ "$(shell uname)" = "Darwin" ]; then \
76
76
  open -a Docker || (echo "❌ Please start Docker Desktop" && exit 1); \
77
77
  else \
78
- systemctl is-active --quiet docker || (echo "❌ Docker daemon is not running. Start with 'sudo systemctl start docker'" && exit 1); \
78
+ docker info >/dev/null 2>&1 || (echo "❌ Docker daemon is not running." && exit 1); \
79
79
  fi
80
80
  @echo "✅ Docker is running"
81
81
 
@@ -339,4 +339,4 @@ ui: setup-tilt
339
339
 
340
340
  .PHONY: install-helm setup-minikube setup-tilt teardown-minikube tunnel up down check-docker install-curl install-gum install-brew up down dashboard shell ui all-up help
341
341
 
342
- .DEFAULT_GOAL := help
342
+ .DEFAULT_GOAL := help
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: ob-metaflow
3
- Version: 2.15.6.1
3
+ Version: 2.15.7.2
4
4
  Summary: Metaflow: More AI and ML, Less Engineering
5
5
  Author: Netflix, Outerbounds & the Metaflow Community
6
6
  Author-email: help@outerbounds.co
@@ -12,12 +12,13 @@ Requires-Dist: boto3
12
12
  Requires-Dist: pylint
13
13
  Requires-Dist: kubernetes
14
14
  Provides-Extra: stubs
15
- Requires-Dist: metaflow-stubs==2.15.6.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.15.7.2; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
19
19
  Dynamic: description-content-type
20
20
  Dynamic: license
21
+ Dynamic: license-file
21
22
  Dynamic: provides-extra
22
23
  Dynamic: requires-dist
23
24
  Dynamic: summary
@@ -36,7 +36,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
36
36
  metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
37
37
  metaflow/util.py,sha256=mJBkV5tShIyCsLDeM1zygQGeciQVMrVPm_qI8Oi33G0,14656
38
38
  metaflow/vendor.py,sha256=LZgXrh7ZSDmD32D1T5jj3OKKpXIqqxKzdMAOc5V0SD4,5162
39
- metaflow/version.py,sha256=aT47A3NJ60Y6Lup495I6-g43o1l-4EmW0dwlt1_RCkk,30
39
+ metaflow/version.py,sha256=lWXJZJA8alH7muroqa5HrAzopiFhE1Yhvcll4mVQb6U,30
40
40
  metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
41
41
  metaflow/_vendor/typing_extensions.py,sha256=q9zxWa6p6CzF1zZvSkygSlklduHf_b3K7MCxGz7MJRc,134519
42
42
  metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
@@ -209,11 +209,11 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
209
209
  metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
210
210
  metaflow/plugins/argo/argo_client.py,sha256=A1kI9rjVjCadDsBscZ2Wk8xRBI6GNgWV6SU7TyrdfrI,16530
211
211
  metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
212
- metaflow/plugins/argo/argo_workflows.py,sha256=TBo6hoFa-XWB8kA4K6rEDVzngFKWbQUkq7z5NFviMzM,185425
213
- metaflow/plugins/argo/argo_workflows_cli.py,sha256=27eLtcp5N5plapP-uIJqR41B0zDfXOV39AGM0nchymo,37952
212
+ metaflow/plugins/argo/argo_workflows.py,sha256=jc08uT7dSliuUrc9WRu6iJc9CpRENme1j78uZ2Os6LQ,187945
213
+ metaflow/plugins/argo/argo_workflows_cli.py,sha256=Ka-ea4x19E6DrYgGm5ZwormxEbTGdun8fyHl-mh0tfc,38265
214
214
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
215
215
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
216
- metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=oumYqwW7CsIsUuCIoP7Eo6VGB5R126CAqcCq2M57Cxw,14072
216
+ metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=lRRHUcpiyJZFltthxZoIp7aJWwy7pcdhaRm0etKN9es,14182
217
217
  metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
218
218
  metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
219
219
  metaflow/plugins/argo/jobset_input_paths.py,sha256=-h0E_e0w6FMiBUod9Rf_XOSCtZv_C0exacw4q1SfIfg,501
@@ -389,12 +389,12 @@ metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
389
389
  metaflow/user_configs/config_decorators.py,sha256=qCKVAvd0NKgaCxQ2OThes5-DYHXq6A1HqURubYNeFdw,20481
390
390
  metaflow/user_configs/config_options.py,sha256=m6jccSpzI4qUJ7vyYkYBIf8G3V0Caunxg_k7zg4Zlqg,21067
391
391
  metaflow/user_configs/config_parameters.py,sha256=oeJGVKu1ao_YQX6Lg6P2FEv5k5-_F4sARLlVpTW9ezM,15502
392
- ob_metaflow-2.15.6.1.data/data/share/metaflow/devtools/Makefile,sha256=l0dYh6E_qdNjda6mwEHm5isoG9wsFh77i3CZQ5P53ZQ,13665
393
- ob_metaflow-2.15.6.1.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
394
- ob_metaflow-2.15.6.1.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
395
- ob_metaflow-2.15.6.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
396
- ob_metaflow-2.15.6.1.dist-info/METADATA,sha256=ZiaiOIKYjktTAPPJJYbK4DhgaAhYpopj_uNmyMphE_I,5913
397
- ob_metaflow-2.15.6.1.dist-info/WHEEL,sha256=SrDKpSbFN1G94qcmBqS9nyHcDMp9cUS9OC06hC0G3G0,109
398
- ob_metaflow-2.15.6.1.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
399
- ob_metaflow-2.15.6.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
400
- ob_metaflow-2.15.6.1.dist-info/RECORD,,
392
+ ob_metaflow-2.15.7.2.data/data/share/metaflow/devtools/Makefile,sha256=kZJDrvY2qRfqkue3mBecZutaGs35zsZR_vNu8WOBcto,13632
393
+ ob_metaflow-2.15.7.2.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
394
+ ob_metaflow-2.15.7.2.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
395
+ ob_metaflow-2.15.7.2.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
396
+ ob_metaflow-2.15.7.2.dist-info/METADATA,sha256=Z8Py18x-ulyAd9q44G4I6lAOR17XpafYHY43fVvDFq4,5935
397
+ ob_metaflow-2.15.7.2.dist-info/WHEEL,sha256=MAQBAzGbXNI3bUmkDsiV_duv8i-gcdnLzw7cfUFwqhU,109
398
+ ob_metaflow-2.15.7.2.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
399
+ ob_metaflow-2.15.7.2.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
400
+ ob_metaflow-2.15.7.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any