zenml-nightly 0.65.0.dev20240906__py3-none-any.whl → 0.66.0.dev20240913__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 (126) hide show
  1. README.md +1 -1
  2. RELEASE_NOTES.md +58 -0
  3. zenml/VERSION +1 -1
  4. zenml/cli/service_accounts.py +54 -14
  5. zenml/config/compiler.py +34 -0
  6. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +2 -1
  7. zenml/integrations/feast/__init__.py +1 -1
  8. zenml/integrations/tensorflow/materializers/tf_dataset_materializer.py +2 -2
  9. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +1 -1
  10. zenml/stack/stack_component.py +50 -17
  11. zenml/utils/settings_utils.py +1 -1
  12. zenml/zen_server/dashboard/assets/{404-nKxQ4QDX.js → 404-iO8vpun1.js} +1 -1
  13. zenml/zen_server/dashboard/assets/{@reactflow-IuMOnBUC.js → @reactflow-B6kq9fJZ.js} +1 -1
  14. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BXeSvmMY.js +1 -0
  15. zenml/zen_server/dashboard/assets/{CodeSnippet-i_WEOWw9.js → CodeSnippet-DNWdQmbo.js} +2 -2
  16. zenml/zen_server/dashboard/assets/CollapsibleCard-B2OVjWYE.js +1 -0
  17. zenml/zen_server/dashboard/assets/{Commands-m9HMl-eh.js → Commands-DsoaVElZ.js} +1 -1
  18. zenml/zen_server/dashboard/assets/CopyButton-BqE_-PHO.js +2 -0
  19. zenml/zen_server/dashboard/assets/{CsvVizualization-Bbzv7VEL.js → CsvVizualization-Dyasr2jU.js} +6 -6
  20. zenml/zen_server/dashboard/assets/{DialogItem-B576Svvy.js → DialogItem-Cz1VLRwa.js} +1 -1
  21. zenml/zen_server/dashboard/assets/EditSecretDialog-Du423_3U.js +1 -0
  22. zenml/zen_server/dashboard/assets/{Error-QMgFNDTs.js → Error-DorJD_va.js} +1 -1
  23. zenml/zen_server/dashboard/assets/ExecutionStatus-CIfQTutR.js +1 -0
  24. zenml/zen_server/dashboard/assets/{Helpbox-C96LeSX9.js → Helpbox-CmfvtNeq.js} +1 -1
  25. zenml/zen_server/dashboard/assets/Infobox-BL9NOS37.js +1 -0
  26. zenml/zen_server/dashboard/assets/{InlineAvatar-C2ZECnGP.js → InlineAvatar-Ds2ZFHPc.js} +1 -1
  27. zenml/zen_server/dashboard/assets/Partials-DX-8iEa1.js +1 -0
  28. zenml/zen_server/dashboard/assets/{ProviderIcon-wA4qBOv1.js → ProviderIcon-BOQJgapd.js} +1 -1
  29. zenml/zen_server/dashboard/assets/ProviderRadio-BsYBw9YA.js +1 -0
  30. zenml/zen_server/dashboard/assets/{SearchField-BPNazO4G.js → SearchField-W3GXpLlI.js} +1 -1
  31. zenml/zen_server/dashboard/assets/{SetPassword-kA6Bi_Kp.js → SetPassword-B-0a8UCj.js} +1 -1
  32. zenml/zen_server/dashboard/assets/{Tick-DEACFydX.js → Tick-i1DYsVcX.js} +1 -1
  33. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-BKyR7Eqi.js → UpdatePasswordSchemas-C6Zb7ASL.js} +1 -1
  34. zenml/zen_server/dashboard/assets/UsageReason-CCnzmwS8.js +1 -0
  35. zenml/zen_server/dashboard/assets/{WizardFooter-sUnbJ70r.js → WizardFooter-BHbO7zOa.js} +1 -1
  36. zenml/zen_server/dashboard/assets/all-pipeline-runs-query-BBEe6I9-.js +1 -0
  37. zenml/zen_server/dashboard/assets/{cloud-only-DrdxC8NV.js → cloud-only-BuP4Kt_7.js} +1 -1
  38. zenml/zen_server/dashboard/assets/codespaces-BitYDX9d.gif +0 -0
  39. zenml/zen_server/dashboard/assets/create-stack-B2x2d4r1.js +1 -0
  40. zenml/zen_server/dashboard/assets/{form-schemas-DD4OppNK.js → form-schemas-Bap0f854.js} +1 -1
  41. zenml/zen_server/dashboard/assets/index-6DYjZgDn.css +1 -0
  42. zenml/zen_server/dashboard/assets/{index-Davdjm1d.js → index-B9wVwe7u.js} +6 -6
  43. zenml/zen_server/dashboard/assets/{index-CnqMjIZT.js → index-DFi8BroH.js} +1 -1
  44. zenml/zen_server/dashboard/assets/link-external-BT2L8hAQ.js +1 -0
  45. zenml/zen_server/dashboard/assets/{login-mutation-TIWnZoJ7.js → login-mutation-DwxUz8VA.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{not-found-C_bW_Kkr.js → not-found-D5i9DunU.js} +1 -1
  47. zenml/zen_server/dashboard/assets/page-BFuJICXM.js +9 -0
  48. zenml/zen_server/dashboard/assets/{page-Dvr6lpJm.js → page-BiF8hLbO.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{page-BN7n3Dsp.js → page-BitfWsiW.js} +1 -1
  50. zenml/zen_server/dashboard/assets/page-CDOQLrPC.js +1 -0
  51. zenml/zen_server/dashboard/assets/page-CEJWu1YO.js +1 -0
  52. zenml/zen_server/dashboard/assets/page-CIbehp7V.js +1 -0
  53. zenml/zen_server/dashboard/assets/page-CLiRGfWo.js +1 -0
  54. zenml/zen_server/dashboard/assets/page-CV44mQn9.js +1 -0
  55. zenml/zen_server/dashboard/assets/page-CrSdkteO.js +2 -0
  56. zenml/zen_server/dashboard/assets/page-D5F3DJjm.js +1 -0
  57. zenml/zen_server/dashboard/assets/page-DE03uZZR.js +1 -0
  58. zenml/zen_server/dashboard/assets/{page-BxPQz4Q8.js → page-DFCK65G9.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{page-XReFLy-1.js → page-DGMa3ZQL.js} +1 -1
  60. zenml/zen_server/dashboard/assets/page-DI-qTWrm.js +1 -0
  61. zenml/zen_server/dashboard/assets/page-DQGCHKrQ.js +1 -0
  62. zenml/zen_server/dashboard/assets/{page-BhqIV8mu.js → page-DQdwZZ9x.js} +1 -1
  63. zenml/zen_server/dashboard/assets/page-DgM-N9RL.js +1 -0
  64. zenml/zen_server/dashboard/assets/page-Dt8VgzbE.js +1 -0
  65. zenml/zen_server/dashboard/assets/{page-CDG9uQT9.js → page-J0s8Sq3N.js} +1 -1
  66. zenml/zen_server/dashboard/assets/page-WCQ659by.js +1 -0
  67. zenml/zen_server/dashboard/assets/{page-BSkbj719.js → page-bimkItOg.js} +1 -1
  68. zenml/zen_server/dashboard/assets/{page-Dy0EbJQD.js → page-iwoJnwPv.js} +1 -1
  69. zenml/zen_server/dashboard/assets/{page-Bg5X2mLz.js → page-oS4hqS8M.js} +1 -1
  70. zenml/zen_server/dashboard/assets/page-oSqx9dkH.js +1 -0
  71. zenml/zen_server/dashboard/assets/page-p3GqEAUW.js +1 -0
  72. zenml/zen_server/dashboard/assets/page-qvcUVPE-.js +1 -0
  73. zenml/zen_server/dashboard/assets/{page-HXZtxyWq.js → page-xQG6GmFJ.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{persist-g4uRK-v-.js → persist-mEZN_fgH.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{persist-CnMMI8ls.js → persist-xsYgVtR1.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{refresh-CtPKdk2G.js → refresh-hfgWPeto.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{sharedSchema-Dbpe2oAO.js → sharedSchema-BfZcy7aP.js} +2 -2
  78. zenml/zen_server/dashboard/assets/stack-detail-query-CU4egfhp.js +1 -0
  79. zenml/zen_server/dashboard/assets/templates-1S_8WeSK.webp +0 -0
  80. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-YhoZKgC9.js → update-server-settings-mutation-DNqmQXDM.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{url-DNHuFfYx.js → url-DwbuKk1b.js} +1 -1
  82. zenml/zen_server/dashboard/index.html +4 -4
  83. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  84. zenml/zen_server/dashboard_legacy/index.html +1 -1
  85. zenml/zen_server/dashboard_legacy/{precache-manifest.123c8e8fafecee40f30294ab26484cf1.js → precache-manifest.290b95d5b43efa3368b3dc63d20c4782.js} +4 -4
  86. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  87. zenml/zen_server/dashboard_legacy/static/js/{main.a98a73cf.chunk.js → main.840d1bf0.chunk.js} +2 -2
  88. zenml/zen_server/dashboard_legacy/static/js/{main.a98a73cf.chunk.js.map → main.840d1bf0.chunk.js.map} +1 -1
  89. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  90. zenml/zen_server/deploy/helm/README.md +2 -2
  91. zenml/zen_stores/migrations/versions/0.66.0_release.py +23 -0
  92. {zenml_nightly-0.65.0.dev20240906.dist-info → zenml_nightly-0.66.0.dev20240913.dist-info}/METADATA +3 -3
  93. {zenml_nightly-0.65.0.dev20240906.dist-info → zenml_nightly-0.66.0.dev20240913.dist-info}/RECORD +96 -92
  94. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CO2rOw5M.js +0 -1
  95. zenml/zen_server/dashboard/assets/CollapsibleCard-C9BzoY6q.js +0 -1
  96. zenml/zen_server/dashboard/assets/CopyButton-BAYaQlWF.js +0 -2
  97. zenml/zen_server/dashboard/assets/EditSecretDialog-CmY9fiM0.js +0 -1
  98. zenml/zen_server/dashboard/assets/ExecutionStatus-BSQgMpzk.js +0 -1
  99. zenml/zen_server/dashboard/assets/Infobox-BB7dfbrO.js +0 -1
  100. zenml/zen_server/dashboard/assets/Partials-RDhJ8Ci7.js +0 -1
  101. zenml/zen_server/dashboard/assets/ProviderRadio-DkPE6alG.js +0 -1
  102. zenml/zen_server/dashboard/assets/UsageReason-DbgUeRkI.js +0 -1
  103. zenml/zen_server/dashboard/assets/create-stack-u6VyIXZP.js +0 -1
  104. zenml/zen_server/dashboard/assets/index-CsIuf3i6.css +0 -1
  105. zenml/zen_server/dashboard/assets/page-0eecLRNs.js +0 -1
  106. zenml/zen_server/dashboard/assets/page-BPFkP_IB.js +0 -1
  107. zenml/zen_server/dashboard/assets/page-CUOBhxxU.js +0 -1
  108. zenml/zen_server/dashboard/assets/page-CrjI9mjm.js +0 -1
  109. zenml/zen_server/dashboard/assets/page-D4J2Oy-I.js +0 -1
  110. zenml/zen_server/dashboard/assets/page-D5I0-LSs.js +0 -1
  111. zenml/zen_server/dashboard/assets/page-D7bwpJvV.js +0 -1
  112. zenml/zen_server/dashboard/assets/page-DCnizFO_.js +0 -9
  113. zenml/zen_server/dashboard/assets/page-DQBv3t8t.js +0 -1
  114. zenml/zen_server/dashboard/assets/page-DYNlbmas.js +0 -1
  115. zenml/zen_server/dashboard/assets/page-DsKroTLH.js +0 -1
  116. zenml/zen_server/dashboard/assets/page-DsQOL6ZL.js +0 -1
  117. zenml/zen_server/dashboard/assets/page-DyM2M_wT.js +0 -1
  118. zenml/zen_server/dashboard/assets/page-OmVfClGH.js +0 -2
  119. zenml/zen_server/dashboard/assets/page-t1VWIy6W.js +0 -1
  120. zenml/zen_server/dashboard/assets/page-wPiJkPp6.js +0 -1
  121. zenml/zen_server/dashboard/assets/page-wQ8_y5mW.js +0 -1
  122. zenml/zen_server/dashboard/assets/stack-detail-query-fuuoot1D.js +0 -1
  123. zenml/zen_server/dashboard/assets/terminal-DRIPb4oF.js +0 -1
  124. {zenml_nightly-0.65.0.dev20240906.dist-info → zenml_nightly-0.66.0.dev20240913.dist-info}/LICENSE +0 -0
  125. {zenml_nightly-0.65.0.dev20240906.dist-info → zenml_nightly-0.66.0.dev20240913.dist-info}/WHEEL +0 -0
  126. {zenml_nightly-0.65.0.dev20240906.dist-info → zenml_nightly-0.66.0.dev20240913.dist-info}/entry_points.txt +0 -0
README.md CHANGED
@@ -327,7 +327,7 @@ the Apache License Version 2.0.
327
327
  <a href="https://github.com/zenml-io/zenml-projects">Projects Showcase</a>
328
328
  <br />
329
329
  <br />
330
- 🎉 Version 0.65.0 is out. Check out the release notes
330
+ 🎉 Version 0.66.0 is out. Check out the release notes
331
331
  <a href="https://github.com/zenml-io/zenml/releases">here</a>.
332
332
  <br />
333
333
  🖥️ Download our VS Code Extension <a href="https://marketplace.visualstudio.com/items?itemName=ZenML.zenml-vscode">here</a>.
RELEASE_NOTES.md CHANGED
@@ -1,5 +1,63 @@
1
1
  <!-- markdown-link-check-disable -->
2
2
 
3
+ # 0.66.0
4
+
5
+ ## New Features and Improvements
6
+
7
+ ### Python 3.12 support
8
+
9
+ This release adds support for Python 3.12, which means you can now develop your ZenML pipelines
10
+ with the latest python features.
11
+
12
+ ### Easier way to specify component settings
13
+
14
+ Before this release, settings for stack components had to be specified with both the component type
15
+ as well as the flavor. We simplified this and it is now possible to specify settings just using the
16
+ component type:
17
+ ```python
18
+ # Before
19
+ @pipeline(settings={"orchestrator.sagemaker": SagemakerOrchestratorSettings(...)})
20
+ def my_pipeline():
21
+ ...
22
+
23
+ # Now
24
+ @pipeline(settings={"orchestrator": SagemakerOrchestratorSettings(...)})
25
+ def my_pipeline():
26
+ ...
27
+ ```
28
+
29
+ ## Breaking changes
30
+
31
+ * In order to slim down the ZenML library, we removed the `numpy` and `pandas` libraries as dependencies of ZenML. If your
32
+ code uses these libraries, you have to make sure they're installed in your local environment as well as the Docker images that
33
+ get built to run your pipelines (Use `DockerSettings.requirements` or `DockerSettings.required_integrations`).
34
+
35
+ ## What's Changed
36
+ * Add 0.65.0 to migration testing by @avishniakov in https://github.com/zenml-io/zenml/pull/2963
37
+ * Hotfix for release flow by @avishniakov in https://github.com/zenml-io/zenml/pull/2961
38
+ * Fix the one-click AWS and GCP stack deployments by @stefannica in https://github.com/zenml-io/zenml/pull/2964
39
+ * Fix wandb mypy error by @strickvl in https://github.com/zenml-io/zenml/pull/2967
40
+ * Fix accelerate docs for 0.65.0+ by @avishniakov in https://github.com/zenml-io/zenml/pull/2968
41
+ * Dynamic model version names docs by @avishniakov in https://github.com/zenml-io/zenml/pull/2970
42
+ * Logging nits by @avishniakov in https://github.com/zenml-io/zenml/pull/2972
43
+ * Fix excess Azure logging by @strickvl in https://github.com/zenml-io/zenml/pull/2965
44
+ * Fix typo in docs by @strickvl in https://github.com/zenml-io/zenml/pull/2976
45
+ * Pass code path to template run by @schustmi in https://github.com/zenml-io/zenml/pull/2973
46
+ * Prevent extra attributes in component configs by @schustmi in https://github.com/zenml-io/zenml/pull/2978
47
+ * Dependency cleanup and Python 3.12 support by @bcdurak in https://github.com/zenml-io/zenml/pull/2953
48
+ * Few nits in docs based on integrations review by @avishniakov in https://github.com/zenml-io/zenml/pull/2983
49
+ * Update slack alerter docs by @stefannica in https://github.com/zenml-io/zenml/pull/2981
50
+ * Update Kubeflow orchestrator docs by @stefannica in https://github.com/zenml-io/zenml/pull/2985
51
+ * Build docker images for python 3.12 by @schustmi in https://github.com/zenml-io/zenml/pull/2988
52
+ * Allow shortcut keys for component settings by @schustmi in https://github.com/zenml-io/zenml/pull/2957
53
+ * Remove references to workspaces from docs by @strickvl in https://github.com/zenml-io/zenml/pull/2991
54
+ * Added some adjustments for colab by @AlexejPenner in https://github.com/zenml-io/zenml/pull/2966
55
+ * Reverting the installation of `mlstacks` after its new release by @bcdurak in https://github.com/zenml-io/zenml/pull/2980
56
+ * Small dependency and docs updates by @strickvl in https://github.com/zenml-io/zenml/pull/2982
57
+
58
+
59
+ **Full Changelog**: https://github.com/zenml-io/zenml/compare/0.65.0...0.66.0
60
+
3
61
  # 0.65.0
4
62
 
5
63
  ## New Features and Improvements
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.65.0.dev20240906
1
+ 0.66.0.dev20240913
@@ -35,6 +35,7 @@ def _create_api_key(
35
35
  name: str,
36
36
  description: Optional[str],
37
37
  set_key: bool = False,
38
+ output_file: Optional[str] = None,
38
39
  ) -> None:
39
40
  """Create an API key.
40
41
 
@@ -44,6 +45,7 @@ def _create_api_key(
44
45
  name: Name of the API key
45
46
  description: The API key description.
46
47
  set_key: Configure the local client with the generated key.
48
+ output_file: Output file to write the API key to.
47
49
  """
48
50
  client = Client()
49
51
  zen_store = client.zen_store
@@ -74,13 +76,19 @@ def _create_api_key(
74
76
  )
75
77
  return
76
78
 
77
- cli_utils.declare(
78
- f"The API key value is: '{api_key.key}'\nPlease store it safely as "
79
- "it will not be shown again.\nTo configure a ZenML client to use "
80
- "this API key, run:\n\n"
81
- f"zenml connect --url {zen_store.config.url} --api-key \\\n"
82
- f" '{api_key.key}'\n"
83
- )
79
+ if output_file and api_key.key:
80
+ with open(output_file, "w") as f:
81
+ f.write(api_key.key)
82
+
83
+ cli_utils.declare(f"Wrote API key value to {output_file}")
84
+ else:
85
+ cli_utils.declare(
86
+ f"The API key value is: '{api_key.key}'\nPlease store it safely as "
87
+ "it will not be shown again.\nTo configure a ZenML client to use "
88
+ "this API key, run:\n\n"
89
+ f"zenml connect --url {zen_store.config.url} --api-key \\\n"
90
+ f" '{api_key.key}'\n"
91
+ )
84
92
 
85
93
 
86
94
  @cli.group(cls=TagGroup, tag=CliCategories.IDENTITY_AND_SECURITY)
@@ -111,11 +119,18 @@ def service_account() -> None:
111
119
  help=("Configure the local client to use the generated API key."),
112
120
  is_flag=True,
113
121
  )
122
+ @click.option(
123
+ "--output-file",
124
+ type=str,
125
+ required=False,
126
+ help="File to write the API key to.",
127
+ )
114
128
  def create_service_account(
115
129
  service_account_name: str,
116
130
  description: str = "",
117
131
  create_api_key: bool = True,
118
132
  set_api_key: bool = False,
133
+ output_file: Optional[str] = None,
119
134
  ) -> None:
120
135
  """Create a new service account.
121
136
 
@@ -124,6 +139,7 @@ def create_service_account(
124
139
  description: The API key description.
125
140
  create_api_key: Create an API key for the service account.
126
141
  set_api_key: Configure the local client to use the generated API key.
142
+ output_file: Output file to write the API key to.
127
143
  """
128
144
  client = Client()
129
145
  try:
@@ -142,6 +158,7 @@ def create_service_account(
142
158
  name="default",
143
159
  description="Default API key.",
144
160
  set_key=set_api_key,
161
+ output_file=output_file,
145
162
  )
146
163
 
147
164
 
@@ -302,12 +319,19 @@ def api_key(
302
319
  is_flag=True,
303
320
  help="Configure the local client with the generated key.",
304
321
  )
322
+ @click.option(
323
+ "--output-file",
324
+ type=str,
325
+ required=False,
326
+ help="File to write the API key to.",
327
+ )
305
328
  @click.pass_obj
306
329
  def create_api_key(
307
330
  service_account_name_or_id: str,
308
331
  name: str,
309
332
  description: Optional[str],
310
333
  set_key: bool = False,
334
+ output_file: Optional[str] = None,
311
335
  ) -> None:
312
336
  """Create an API key.
313
337
 
@@ -317,12 +341,14 @@ def create_api_key(
317
341
  name: Name of the API key
318
342
  description: The API key description.
319
343
  set_key: Configure the local client with the generated key.
344
+ output_file: Output file to write the API key to.
320
345
  """
321
346
  _create_api_key(
322
347
  service_account_name_or_id=service_account_name_or_id,
323
348
  name=name,
324
349
  description=description,
325
350
  set_key=set_key,
351
+ output_file=output_file,
326
352
  )
327
353
 
328
354
 
@@ -450,12 +476,19 @@ def update_api_key(
450
476
  is_flag=True,
451
477
  help="Configure the local client with the generated key.",
452
478
  )
479
+ @click.option(
480
+ "--output-file",
481
+ type=str,
482
+ required=False,
483
+ help="File to write the API key to.",
484
+ )
453
485
  @click.pass_obj
454
486
  def rotate_api_key(
455
487
  service_account_name_or_id: str,
456
488
  name_or_id: str,
457
489
  retain: int = 0,
458
490
  set_key: bool = False,
491
+ output_file: Optional[str] = None,
459
492
  ) -> None:
460
493
  """Rotate an API key.
461
494
 
@@ -466,6 +499,7 @@ def rotate_api_key(
466
499
  retain: Number of minutes for which the previous key is still valid
467
500
  after it has been rotated.
468
501
  set_key: Configure the local client with the newly generated key.
502
+ output_file: Output file to write the API key to.
469
503
  """
470
504
  client = Client()
471
505
  zen_store = client.zen_store
@@ -499,13 +533,19 @@ def rotate_api_key(
499
533
  )
500
534
  return
501
535
 
502
- cli_utils.declare(
503
- f"The new API key value is: '{api_key.key}'\nPlease store it "
504
- "safely as it will not be shown again.\nTo configure a ZenML "
505
- "client to use this API key, run:\n\n"
506
- f"zenml connect --url {zen_store.config.url} --api-key \\\n"
507
- f" '{api_key.key}'\n"
508
- )
536
+ if output_file and api_key.key:
537
+ with open(output_file, "w") as f:
538
+ f.write(api_key.key)
539
+
540
+ cli_utils.declare(f"Wrote API key value to {output_file}")
541
+ else:
542
+ cli_utils.declare(
543
+ f"The new API key value is: '{api_key.key}'\nPlease store it "
544
+ "safely as it will not be shown again.\nTo configure a ZenML "
545
+ "client to use this API key, run:\n\n"
546
+ f"zenml connect --url {zen_store.config.url} --api-key \\\n"
547
+ f" '{api_key.key}'\n"
548
+ )
509
549
 
510
550
 
511
551
  @api_key.command("delete")
zenml/config/compiler.py CHANGED
@@ -93,6 +93,10 @@ class Compiler:
93
93
  self._apply_run_configuration(
94
94
  pipeline=pipeline, config=run_configuration
95
95
  )
96
+ convert_component_shortcut_settings_keys(
97
+ pipeline.configuration.settings, stack=stack
98
+ )
99
+
96
100
  self._apply_stack_default_settings(pipeline=pipeline, stack=stack)
97
101
  if run_configuration.run_name:
98
102
  self._verify_run_name(run_configuration.run_name)
@@ -445,6 +449,9 @@ class Compiler:
445
449
  step_config, runtime_parameters=invocation.parameters
446
450
  )
447
451
 
452
+ convert_component_shortcut_settings_keys(
453
+ step.configuration.settings, stack=stack
454
+ )
448
455
  step_spec = self._get_step_spec(invocation=invocation)
449
456
  step_settings = self._filter_and_validate_settings(
450
457
  settings=step.configuration.settings,
@@ -596,3 +603,30 @@ class Compiler:
596
603
  additional_spec_args["parameters"] = pipeline._parameters
597
604
 
598
605
  return PipelineSpec(steps=step_specs, **additional_spec_args)
606
+
607
+
608
+ def convert_component_shortcut_settings_keys(
609
+ settings: Dict[str, "BaseSettings"], stack: "Stack"
610
+ ) -> None:
611
+ """Convert component shortcut settings keys.
612
+
613
+ Args:
614
+ settings: Dictionary of settings.
615
+ stack: The stack that the pipeline will run on.
616
+
617
+ Raises:
618
+ ValueError: If stack component settings were defined both using the
619
+ full and the shortcut key.
620
+ """
621
+ for component in stack.components.values():
622
+ shortcut_key = str(component.type)
623
+ if component_settings := settings.pop(shortcut_key, None):
624
+ key = settings_utils.get_stack_component_setting_key(component)
625
+ if key in settings:
626
+ raise ValueError(
627
+ f"Duplicate settings provided for your {shortcut_key} "
628
+ f"using the keys {shortcut_key} and {key}. Remove settings "
629
+ "for one of them to fix this error."
630
+ )
631
+
632
+ settings[key] = component_settings
@@ -372,7 +372,8 @@ class SagemakerOrchestrator(ContainerizedOrchestrator):
372
372
  # mainly for testing purposes, we wait for the pipeline to finish
373
373
  if self.config.synchronous:
374
374
  logger.info(
375
- "Executing synchronously. Waiting for pipeline to finish..."
375
+ "Executing synchronously. Waiting for pipeline to finish... \n"
376
+ "At this point you can `Ctrl-C` out without cancelling the execution."
376
377
  )
377
378
  try:
378
379
  pipeline_execution.wait(
@@ -31,7 +31,7 @@ class FeastIntegration(Integration):
31
31
 
32
32
  NAME = FEAST
33
33
  # click is added to keep the feast click version in sync with ZenML's click
34
- REQUIREMENTS = ["feast<=0.37.1", "click>=8.0.1,<8.1.4"]
34
+ REQUIREMENTS = ["feast", "click>=8.0.1,<8.1.4"]
35
35
  REQUIREMENTS_IGNORED_ON_UNINSTALL = ["click", "pandas"]
36
36
 
37
37
  @classmethod
@@ -48,7 +48,7 @@ class TensorflowDatasetMaterializer(BaseMaterializer):
48
48
  temp_dir = tempfile.mkdtemp()
49
49
  io_utils.copy_dir(self.uri, temp_dir)
50
50
  path = os.path.join(temp_dir, DEFAULT_FILENAME)
51
- dataset = tf.data.experimental.load(path)
51
+ dataset = tf.data.Dataset.load(path)
52
52
  # Don't delete the temporary directory here as the dataset is lazily
53
53
  # loaded and needs to read it when the object gets used
54
54
  return dataset
@@ -62,7 +62,7 @@ class TensorflowDatasetMaterializer(BaseMaterializer):
62
62
  temp_dir = tempfile.TemporaryDirectory()
63
63
  path = os.path.join(temp_dir.name, DEFAULT_FILENAME)
64
64
  try:
65
- tf.data.experimental.save(
65
+ tf.data.Dataset.save(
66
66
  dataset, path, compression=None, shard_func=None
67
67
  )
68
68
  io_utils.copy_dir(temp_dir.name, self.uri)
@@ -126,7 +126,7 @@ class WandbExperimentTracker(BaseExperimentTracker):
126
126
  info: Info about the step that was executed.
127
127
  step_failed: Whether the step failed or not.
128
128
  """
129
- wandb.finish(exit_code=1) if step_failed else wandb.finish() # type: ignore
129
+ wandb.finish(exit_code=1) if step_failed else wandb.finish()
130
130
  os.environ.pop(WANDB_API_KEY, None)
131
131
 
132
132
  def _initialize_wandb(
@@ -421,23 +421,56 @@ class StackComponent:
421
421
  else:
422
422
  user_id = None
423
423
 
424
- return flavor.implementation_class(
425
- user=user_id,
426
- workspace=component_model.workspace.id,
427
- name=component_model.name,
428
- id=component_model.id,
429
- config=configuration,
430
- labels=component_model.labels,
431
- flavor=component_model.flavor,
432
- type=component_model.type,
433
- created=component_model.created,
434
- updated=component_model.updated,
435
- connector_requirements=flavor.service_connector_requirements,
436
- connector=component_model.connector.id
437
- if component_model.connector
438
- else None,
439
- connector_resource_id=component_model.connector_resource_id,
440
- )
424
+ try:
425
+ return flavor.implementation_class(
426
+ user=user_id,
427
+ workspace=component_model.workspace.id,
428
+ name=component_model.name,
429
+ id=component_model.id,
430
+ config=configuration,
431
+ labels=component_model.labels,
432
+ flavor=component_model.flavor,
433
+ type=component_model.type,
434
+ created=component_model.created,
435
+ updated=component_model.updated,
436
+ connector_requirements=flavor.service_connector_requirements,
437
+ connector=component_model.connector.id
438
+ if component_model.connector
439
+ else None,
440
+ connector_resource_id=component_model.connector_resource_id,
441
+ )
442
+ except ImportError as e:
443
+ from zenml.integrations.registry import integration_registry
444
+
445
+ integration_requirements = " ".join(
446
+ integration_registry.select_integration_requirements(
447
+ flavor_model.integration
448
+ )
449
+ )
450
+
451
+ if integration_registry.is_installed(flavor_model.integration):
452
+ raise ImportError(
453
+ f"{e}\n\n"
454
+ f"Something went wrong while trying to import from the "
455
+ f"`{flavor_model.integration}` integration. Please make "
456
+ "sure that all its requirements are installed properly by "
457
+ "reinstalling the integration either through our CLI: "
458
+ f"`zenml integration install {flavor_model.integration} "
459
+ "-y` or by manually installing its requirements: "
460
+ f"`pip install {integration_requirements}`. If the error"
461
+ "persists, please contact the ZenML team."
462
+ ) from e
463
+ else:
464
+ raise ImportError(
465
+ f"{e}\n\n"
466
+ f"The `{flavor_model.integration}` integration that you "
467
+ "are trying to use is not installed in your current "
468
+ "environment. Please make sure that it is installed by "
469
+ "either using our CLI: `zenml integration install "
470
+ f"{flavor_model.integration}` or by manually installing "
471
+ f"its requirements: `pip install "
472
+ f"{integration_requirements}`"
473
+ ) from e
441
474
 
442
475
  @property
443
476
  def config(self) -> StackComponentConfig:
@@ -25,7 +25,7 @@ if TYPE_CHECKING:
25
25
  from zenml.stack.flavor import Flavor
26
26
 
27
27
  STACK_COMPONENT_REGEX = re.compile(
28
- "(" + "|".join(StackComponentType.values()) + r")\..*"
28
+ "(" + "|".join(StackComponentType.values()) + r")(\..*)?"
29
29
  )
30
30
 
31
31
 
@@ -1 +1 @@
1
- import{j as e}from"./@radix-DnFH_oo1.js";import{h as s,r as t}from"./index-Davdjm1d.js";import{E as r}from"./EmptyState-Cs3DEmso.js";import{H as a}from"./help-CwN931fX.js";import{L as o}from"./@react-router-APVeuk-U.js";import"./@tanstack-QbMbTrh5.js";import"./@reactflow-IuMOnBUC.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
1
+ import{j as e}from"./@radix-DnFH_oo1.js";import{f as s,r as t}from"./index-B9wVwe7u.js";import{E as r}from"./EmptyState-Cs3DEmso.js";import{H as a}from"./help-CwN931fX.js";import{L as o}from"./@react-router-APVeuk-U.js";import"./@tanstack-QbMbTrh5.js";import"./@reactflow-B6kq9fJZ.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};