zenml-nightly 0.60.0.dev20240627__py3-none-any.whl → 0.61.0.dev20240711__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 (210) hide show
  1. README.md +30 -9
  2. RELEASE_NOTES.md +34 -0
  3. zenml/VERSION +1 -1
  4. zenml/analytics/enums.py +3 -0
  5. zenml/cli/__init__.py +28 -0
  6. zenml/cli/artifact.py +1 -2
  7. zenml/cli/integration.py +9 -8
  8. zenml/cli/server.py +6 -0
  9. zenml/cli/stack.py +797 -39
  10. zenml/cli/stack_components.py +7 -0
  11. zenml/cli/text_utils.py +35 -1
  12. zenml/cli/utils.py +127 -10
  13. zenml/client.py +23 -14
  14. zenml/config/docker_settings.py +8 -5
  15. zenml/constants.py +5 -1
  16. zenml/container_registries/base_container_registry.py +1 -0
  17. zenml/enums.py +6 -0
  18. zenml/event_hub/event_hub.py +5 -8
  19. zenml/integrations/aws/__init__.py +1 -0
  20. zenml/integrations/azure/__init__.py +1 -0
  21. zenml/integrations/deepchecks/__init__.py +1 -0
  22. zenml/integrations/discord/__init__.py +1 -0
  23. zenml/integrations/evidently/__init__.py +1 -0
  24. zenml/integrations/facets/__init__.py +1 -0
  25. zenml/integrations/feast/__init__.py +1 -0
  26. zenml/integrations/gcp/__init__.py +3 -1
  27. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +203 -44
  28. zenml/integrations/huggingface/__init__.py +1 -0
  29. zenml/integrations/integration.py +24 -0
  30. zenml/integrations/kubeflow/__init__.py +3 -0
  31. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +1 -1
  32. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +0 -1
  33. zenml/integrations/kubernetes/__init__.py +3 -1
  34. zenml/integrations/kubernetes/orchestrators/kube_utils.py +4 -1
  35. zenml/integrations/label_studio/annotators/label_studio_annotator.py +1 -0
  36. zenml/integrations/langchain/__init__.py +1 -0
  37. zenml/integrations/mlflow/__init__.py +3 -1
  38. zenml/integrations/neural_prophet/__init__.py +1 -0
  39. zenml/integrations/polars/__init__.py +1 -0
  40. zenml/integrations/prodigy/__init__.py +1 -0
  41. zenml/integrations/pycaret/__init__.py +6 -0
  42. zenml/integrations/registry.py +37 -0
  43. zenml/integrations/s3/artifact_stores/s3_artifact_store.py +17 -6
  44. zenml/integrations/seldon/__init__.py +1 -0
  45. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -0
  46. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +2 -2
  47. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +1 -1
  48. zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
  49. zenml/integrations/skypilot_aws/__init__.py +2 -1
  50. zenml/integrations/skypilot_azure/__init__.py +1 -1
  51. zenml/integrations/skypilot_gcp/__init__.py +1 -1
  52. zenml/integrations/skypilot_lambda/__init__.py +1 -1
  53. zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +1 -1
  54. zenml/integrations/slack/__init__.py +1 -0
  55. zenml/integrations/tekton/__init__.py +1 -0
  56. zenml/integrations/tensorboard/__init__.py +0 -1
  57. zenml/integrations/tensorflow/__init__.py +18 -6
  58. zenml/integrations/wandb/__init__.py +1 -0
  59. zenml/models/__init__.py +9 -0
  60. zenml/models/v2/core/component.py +18 -0
  61. zenml/models/v2/core/model.py +1 -2
  62. zenml/models/v2/core/service_connector.py +17 -0
  63. zenml/models/v2/core/stack.py +31 -0
  64. zenml/models/v2/misc/full_stack.py +97 -0
  65. zenml/models/v2/misc/stack_deployment.py +66 -0
  66. zenml/new/pipelines/pipeline.py +1 -1
  67. zenml/orchestrators/input_utils.py +3 -6
  68. zenml/stack/stack.py +3 -6
  69. zenml/stack_deployments/__init__.py +14 -0
  70. zenml/stack_deployments/aws_stack_deployment.py +289 -0
  71. zenml/stack_deployments/stack_deployment.py +130 -0
  72. zenml/stack_deployments/utils.py +40 -0
  73. zenml/utils/function_utils.py +1 -1
  74. zenml/utils/pagination_utils.py +7 -5
  75. zenml/utils/pipeline_docker_image_builder.py +97 -68
  76. zenml/utils/pydantic_utils.py +6 -5
  77. zenml/zen_server/cloud_utils.py +18 -3
  78. zenml/zen_server/dashboard/assets/{404-C1mcUujL.js → 404-DpJaNHKF.js} +1 -1
  79. zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +85 -0
  80. zenml/zen_server/dashboard/assets/{@react-router-DYovave8.js → @react-router-CO-OsFwI.js} +2 -2
  81. zenml/zen_server/dashboard/assets/{@reactflow-DYIyhCfd.js → @reactflow-DJfzkHO1.js} +2 -2
  82. zenml/zen_server/dashboard/assets/@tanstack-DYiOyJUL.js +22 -0
  83. zenml/zen_server/dashboard/assets/AwarenessChannel-BYDLT2xC.js +1 -0
  84. zenml/zen_server/dashboard/assets/{CodeSnippet-WEzpO0az.js → CodeSnippet-BkOuRmyq.js} +2 -2
  85. zenml/zen_server/dashboard/assets/Commands-ZvWR1BRs.js +1 -0
  86. zenml/zen_server/dashboard/assets/CopyButton-DVwLkafa.js +2 -0
  87. zenml/zen_server/dashboard/assets/{CsvVizualization-Bx931j4U.js → CsvVizualization-C2IiqX4I.js} +7 -7
  88. zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +1 -0
  89. zenml/zen_server/dashboard/assets/EmptyState-BMLnFVlB.js +1 -0
  90. zenml/zen_server/dashboard/assets/Error-CqX0VqW_.js +1 -0
  91. zenml/zen_server/dashboard/assets/ExecutionStatus-BoLUXR9t.js +1 -0
  92. zenml/zen_server/dashboard/assets/Helpbox-LFydyVwh.js +1 -0
  93. zenml/zen_server/dashboard/assets/Infobox-DnENC0sh.js +1 -0
  94. zenml/zen_server/dashboard/assets/InlineAvatar-CbJtYr0t.js +1 -0
  95. zenml/zen_server/dashboard/assets/{MarkdownVisualization-DsB2QZiK.js → MarkdownVisualization-xp3hhULl.js} +2 -2
  96. zenml/zen_server/dashboard/assets/Pagination-DEbVUupy.js +1 -0
  97. zenml/zen_server/dashboard/assets/PasswordChecker-DUveqlva.js +1 -0
  98. zenml/zen_server/dashboard/assets/SetPassword-BYBdbQDo.js +1 -0
  99. zenml/zen_server/dashboard/assets/SuccessStep-Nx743hll.js +1 -0
  100. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-CKrd3UZz.js → UpdatePasswordSchemas-DF9gSzE0.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{aws-t0gKCj_R.js → aws-BgKTfTfx.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{check-circle-BVvhm5dy.js → check-circle-i56092KI.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{chevron-down-zcvCWmyP.js → chevron-down-D_ZlKMqH.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{chevron-right-double-CJ50E9Gr.js → chevron-right-double-BiEMg7rd.js} +1 -1
  105. zenml/zen_server/dashboard/assets/cloud-only-DVbIeckv.js +1 -0
  106. zenml/zen_server/dashboard/assets/{copy-BRhQz3j-.js → copy-BXNk6BjL.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{database-CRRnyFWh.js → database-1xWSgZfO.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{docker-BAonhm6G.js → docker-CQMVm_4d.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{file-text-CbVERUON.js → file-text-CqD_iu6l.js} +1 -1
  110. zenml/zen_server/dashboard/assets/{help-B8rqCvqn.js → help-bu_DgLKI.js} +1 -1
  111. zenml/zen_server/dashboard/assets/index-C_CrU4vI.js +1 -0
  112. zenml/zen_server/dashboard/assets/index-DK1ynKjA.js +55 -0
  113. zenml/zen_server/dashboard/assets/index-inApY3KQ.css +1 -0
  114. zenml/zen_server/dashboard/assets/index-rK_Wuy2W.js +1 -0
  115. zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +1 -0
  116. zenml/zen_server/dashboard/assets/{login-mutation-Bk2tn324.js → login-mutation-BUnVASxp.js} +1 -1
  117. zenml/zen_server/dashboard/assets/not-found-B4VnX8gK.js +1 -0
  118. zenml/zen_server/dashboard/assets/package-CsUhPmou.js +1 -0
  119. zenml/zen_server/dashboard/assets/{page-D12Rvf0j.js → page-3efNCDeb.js} +2 -2
  120. zenml/zen_server/dashboard/assets/page-7zTHbhhI.js +1 -0
  121. zenml/zen_server/dashboard/assets/page-BEs6jK71.js +1 -0
  122. zenml/zen_server/dashboard/assets/page-BpSqIf4B.js +1 -0
  123. zenml/zen_server/dashboard/assets/{page-8vRWJ5b8.js → page-Bx6o0ARS.js} +1 -1
  124. zenml/zen_server/dashboard/assets/page-C43QGHTt.js +9 -0
  125. zenml/zen_server/dashboard/assets/page-CR0OG7ss.js +1 -0
  126. zenml/zen_server/dashboard/assets/{page-CBuSUrE9.js → page-CRTJ0UuR.js} +1 -1
  127. zenml/zen_server/dashboard/assets/page-CUZIGO-3.js +1 -0
  128. zenml/zen_server/dashboard/assets/page-CaopxiU1.js +1 -0
  129. zenml/zen_server/dashboard/assets/{page-CCtCgG-x.js → page-Cx67M0QT.js} +1 -1
  130. zenml/zen_server/dashboard/assets/page-D7Z399xy.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-D93kd7Xj.js +1 -0
  132. zenml/zen_server/dashboard/assets/{page-Dw9-aJV6.js → page-DKlIdAe5.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{page-COafKNbw.js → page-DMOYZppS.js} +1 -1
  134. zenml/zen_server/dashboard/assets/page-DMsSn3dv.js +2 -0
  135. zenml/zen_server/dashboard/assets/{page-C6v3o0Qj.js → page-Dc_7KMQE.js} +1 -1
  136. zenml/zen_server/dashboard/assets/page-DvCvroOM.js +1 -0
  137. zenml/zen_server/dashboard/assets/page-Hus2pr9T.js +1 -0
  138. zenml/zen_server/dashboard/assets/page-JyfeDUfu.js +1 -0
  139. zenml/zen_server/dashboard/assets/{page-CH26py0a.js → page-Sxn82W-5.js} +1 -1
  140. zenml/zen_server/dashboard/assets/page-TKXERe16.js +1 -0
  141. zenml/zen_server/dashboard/assets/page-Xu8JEjSU.js +1 -0
  142. zenml/zen_server/dashboard/assets/{play-circle-DK5QMJyp.js → play-circle-CNtZKDnW.js} +1 -1
  143. zenml/zen_server/dashboard/assets/plus-DOeLmm7C.js +1 -0
  144. zenml/zen_server/dashboard/assets/{terminal-B2ovgWuz.js → terminal-By9cErXc.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-bKxf7U9h.js → update-server-settings-mutation-CR8e3Sir.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{url-CgvM-IVM.js → url-DuQMeqYA.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{zod-DrZvVLjd.js → zod-BhoGpZ63.js} +1 -1
  148. zenml/zen_server/dashboard/index.html +7 -7
  149. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  150. zenml/zen_server/dashboard_legacy/index.html +1 -1
  151. zenml/zen_server/dashboard_legacy/{precache-manifest.e7c29295aae591541ef59d1734d79387.js → precache-manifest.c8c57fb0d2132b1d3c2119e776b7dfb3.js} +4 -4
  152. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  153. zenml/zen_server/dashboard_legacy/static/js/{main.53857d8b.chunk.js → main.382439a7.chunk.js} +2 -2
  154. zenml/zen_server/dashboard_legacy/static/js/{main.53857d8b.chunk.js.map → main.382439a7.chunk.js.map} +1 -1
  155. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  156. zenml/zen_server/deploy/helm/README.md +2 -2
  157. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +11 -5
  158. zenml/zen_server/pipeline_deployment/utils.py +57 -44
  159. zenml/zen_server/rbac/zenml_cloud_rbac.py +11 -5
  160. zenml/zen_server/routers/stack_deployment_endpoints.py +144 -0
  161. zenml/zen_server/routers/workspaces_endpoints.py +64 -0
  162. zenml/zen_server/zen_server_api.py +2 -0
  163. zenml/zen_stores/migrations/utils.py +1 -1
  164. zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
  165. zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
  166. zenml/zen_stores/rest_zen_store.py +117 -0
  167. zenml/zen_stores/schemas/stack_schemas.py +10 -0
  168. zenml/zen_stores/schemas/step_run_schemas.py +27 -11
  169. zenml/zen_stores/sql_zen_store.py +283 -0
  170. zenml/zen_stores/zen_store_interface.py +79 -0
  171. {zenml_nightly-0.60.0.dev20240627.dist-info → zenml_nightly-0.61.0.dev20240711.dist-info}/METADATA +32 -10
  172. {zenml_nightly-0.60.0.dev20240627.dist-info → zenml_nightly-0.61.0.dev20240711.dist-info}/RECORD +175 -161
  173. zenml/zen_server/dashboard/assets/@radix-C9DBgJhe.js +0 -77
  174. zenml/zen_server/dashboard/assets/@tanstack-CEbkxrhX.js +0 -30
  175. zenml/zen_server/dashboard/assets/AwarenessChannel-B2KR83Tr.js +0 -1
  176. zenml/zen_server/dashboard/assets/Cards-DSEdjsk8.js +0 -1
  177. zenml/zen_server/dashboard/assets/Commands-CTlhyic5.js +0 -1
  178. zenml/zen_server/dashboard/assets/CopyButton-CTrzKmUO.js +0 -2
  179. zenml/zen_server/dashboard/assets/DisplayDate-BdguISQF.js +0 -1
  180. zenml/zen_server/dashboard/assets/EmptyState-BkooiGtL.js +0 -1
  181. zenml/zen_server/dashboard/assets/Error-4sKxHad4.js +0 -1
  182. zenml/zen_server/dashboard/assets/Helpbox-DW21i5LD.js +0 -1
  183. zenml/zen_server/dashboard/assets/Infobox-C7bf70VS.js +0 -1
  184. zenml/zen_server/dashboard/assets/InlineAvatar-Dxrtafpg.js +0 -1
  185. zenml/zen_server/dashboard/assets/PageHeader-B0pUife2.js +0 -1
  186. zenml/zen_server/dashboard/assets/Pagination-B9WG_9cJ.js +0 -1
  187. zenml/zen_server/dashboard/assets/PasswordChecker-DSLBp7Vl.js +0 -1
  188. zenml/zen_server/dashboard/assets/SetPassword-CiNhT15a.js +0 -1
  189. zenml/zen_server/dashboard/assets/SuccessStep-CykrFndS.js +0 -1
  190. zenml/zen_server/dashboard/assets/cloud-only-Bkawp7CJ.js +0 -1
  191. zenml/zen_server/dashboard/assets/index-BawkpTlr.js +0 -55
  192. zenml/zen_server/dashboard/assets/index-CRmm7QhS.css +0 -1
  193. zenml/zen_server/dashboard/assets/index.esm-F7nqy9zY.js +0 -1
  194. zenml/zen_server/dashboard/assets/not-found-BAuhP4Jb.js +0 -1
  195. zenml/zen_server/dashboard/assets/page--5YvAHg3.js +0 -1
  196. zenml/zen_server/dashboard/assets/page-B0RAq4s_.js +0 -1
  197. zenml/zen_server/dashboard/assets/page-BePtEPHl.js +0 -1
  198. zenml/zen_server/dashboard/assets/page-C1pra1Bc.js +0 -9
  199. zenml/zen_server/dashboard/assets/page-CSs4C9jL.js +0 -1
  200. zenml/zen_server/dashboard/assets/page-Cf2XSej0.js +0 -1
  201. zenml/zen_server/dashboard/assets/page-ClPUAE_f.js +0 -1
  202. zenml/zen_server/dashboard/assets/page-D8pf2vis.js +0 -1
  203. zenml/zen_server/dashboard/assets/page-DHKMmIQH.js +0 -1
  204. zenml/zen_server/dashboard/assets/page-DMZ0VOda.js +0 -1
  205. zenml/zen_server/dashboard/assets/page-Dcg-yQv_.js +0 -1
  206. zenml/zen_server/dashboard/assets/page-DoAK5FSB.js +0 -1
  207. zenml/zen_server/dashboard/assets/page-iXiDqE0J.js +0 -2
  208. {zenml_nightly-0.60.0.dev20240627.dist-info → zenml_nightly-0.61.0.dev20240711.dist-info}/LICENSE +0 -0
  209. {zenml_nightly-0.60.0.dev20240627.dist-info → zenml_nightly-0.61.0.dev20240711.dist-info}/WHEEL +0 -0
  210. {zenml_nightly-0.60.0.dev20240627.dist-info → zenml_nightly-0.61.0.dev20240711.dist-info}/entry_points.txt +0 -0
@@ -66,6 +66,7 @@ DEFAULT_DOCKER_PARENT_IMAGE = (
66
66
  f"zenmldocker/zenml:{zenml.__version__}-"
67
67
  f"py{sys.version_info.major}.{sys.version_info.minor}"
68
68
  )
69
+ DEFAULT_ZENML_DOCKER_REPOSITORY = "zenml"
69
70
 
70
71
  PIP_DEFAULT_ARGS = {
71
72
  "no-cache-dir": None,
@@ -198,10 +199,15 @@ class PipelineDockerImageBuilder:
198
199
  # We will build an additional image on top of this one later
199
200
  # to include user files and/or install requirements. The image
200
201
  # we build now will be used as the parent for the next build.
201
- user_image_name = (
202
- f"{docker_settings.target_repository}:"
203
- f"{tag}-intermediate-build"
204
- )
202
+ repository = docker_settings.target_repository
203
+ if not repository:
204
+ if container_registry:
205
+ repository = (
206
+ container_registry.config.default_repository
207
+ )
208
+
209
+ repository = repository or DEFAULT_ZENML_DOCKER_REPOSITORY
210
+ user_image_name = f"{repository}:" f"{tag}-intermediate-build"
205
211
  if push and container_registry:
206
212
  user_image_name = (
207
213
  f"{container_registry.config.uri}/{user_image_name}"
@@ -366,7 +372,14 @@ class PipelineDockerImageBuilder:
366
372
  Returns:
367
373
  The docker image name.
368
374
  """
369
- target_image_name = f"{docker_settings.target_repository}:{tag}"
375
+ repository = docker_settings.target_repository
376
+ if not repository:
377
+ if container_registry:
378
+ repository = container_registry.config.default_repository
379
+
380
+ repository = repository or DEFAULT_ZENML_DOCKER_REPOSITORY
381
+
382
+ target_image_name = f"{repository}:{tag}"
370
383
  if container_registry:
371
384
  target_image_name = (
372
385
  f"{container_registry.config.uri}/{target_image_name}"
@@ -460,69 +473,6 @@ class PipelineDockerImageBuilder:
460
473
  "- Including python packages from local environment"
461
474
  )
462
475
 
463
- # Generate/Read requirements file for user-defined requirements
464
- if isinstance(docker_settings.requirements, str):
465
- path = os.path.abspath(docker_settings.requirements)
466
- try:
467
- user_requirements = io_utils.read_file_contents_as_string(path)
468
- except FileNotFoundError as e:
469
- raise FileNotFoundError(
470
- f"Requirements file {path} does not exist."
471
- ) from e
472
- if log:
473
- logger.info(
474
- "- Including user-defined requirements from file `%s`",
475
- path,
476
- )
477
- elif isinstance(docker_settings.requirements, List):
478
- user_requirements = "\n".join(docker_settings.requirements)
479
- if log:
480
- logger.info(
481
- "- Including user-defined requirements: %s",
482
- ", ".join(f"`{r}`" for r in docker_settings.requirements),
483
- )
484
- else:
485
- user_requirements = None
486
-
487
- if user_requirements:
488
- requirements_files.append(
489
- (".zenml_user_requirements", user_requirements, [])
490
- )
491
-
492
- # Generate requirements file for all required integrations
493
- integration_requirements = set(
494
- itertools.chain.from_iterable(
495
- integration_registry.select_integration_requirements(
496
- integration_name=integration,
497
- target_os=OperatingSystemType.LINUX,
498
- )
499
- for integration in docker_settings.required_integrations
500
- )
501
- )
502
-
503
- if docker_settings.install_stack_requirements:
504
- integration_requirements.update(stack.requirements())
505
- if code_repository:
506
- integration_requirements.update(code_repository.requirements)
507
-
508
- if integration_requirements:
509
- integration_requirements_list = sorted(integration_requirements)
510
- integration_requirements_file = "\n".join(
511
- integration_requirements_list
512
- )
513
- requirements_files.append(
514
- (
515
- ".zenml_integration_requirements",
516
- integration_requirements_file,
517
- [],
518
- )
519
- )
520
- if log:
521
- logger.info(
522
- "- Including integration requirements: %s",
523
- ", ".join(f"`{r}`" for r in integration_requirements_list),
524
- )
525
-
526
476
  # Generate requirements files for all ZenML Hub plugins
527
477
  if docker_settings.required_hub_plugins:
528
478
  (
@@ -560,6 +510,85 @@ class PipelineDockerImageBuilder:
560
510
  ", ".join(f"`{r}`" for r in hub_pypi_requirements),
561
511
  )
562
512
 
513
+ if docker_settings.install_stack_requirements:
514
+ stack_requirements = stack.requirements()
515
+ if code_repository:
516
+ stack_requirements.update(code_repository.requirements)
517
+
518
+ if stack_requirements:
519
+ stack_requirements_list = sorted(stack_requirements)
520
+ stack_requirements_file = "\n".join(stack_requirements_list)
521
+ requirements_files.append(
522
+ (
523
+ ".zenml_stack_integration_requirements",
524
+ stack_requirements_file,
525
+ [],
526
+ )
527
+ )
528
+ if log:
529
+ logger.info(
530
+ "- Including stack requirements: %s",
531
+ ", ".join(f"`{r}`" for r in stack_requirements_list),
532
+ )
533
+
534
+ # Generate requirements file for all required integrations
535
+ integration_requirements = set(
536
+ itertools.chain.from_iterable(
537
+ integration_registry.select_integration_requirements(
538
+ integration_name=integration,
539
+ target_os=OperatingSystemType.LINUX,
540
+ )
541
+ for integration in docker_settings.required_integrations
542
+ )
543
+ )
544
+
545
+ if integration_requirements:
546
+ integration_requirements_list = sorted(integration_requirements)
547
+ integration_requirements_file = "\n".join(
548
+ integration_requirements_list
549
+ )
550
+ requirements_files.append(
551
+ (
552
+ ".zenml_integration_requirements",
553
+ integration_requirements_file,
554
+ [],
555
+ )
556
+ )
557
+ if log:
558
+ logger.info(
559
+ "- Including integration requirements: %s",
560
+ ", ".join(f"`{r}`" for r in integration_requirements_list),
561
+ )
562
+
563
+ # Generate/Read requirements file for user-defined requirements
564
+ if isinstance(docker_settings.requirements, str):
565
+ path = os.path.abspath(docker_settings.requirements)
566
+ try:
567
+ user_requirements = io_utils.read_file_contents_as_string(path)
568
+ except FileNotFoundError as e:
569
+ raise FileNotFoundError(
570
+ f"Requirements file {path} does not exist."
571
+ ) from e
572
+ if log:
573
+ logger.info(
574
+ "- Including user-defined requirements from file `%s`",
575
+ path,
576
+ )
577
+ elif isinstance(docker_settings.requirements, List):
578
+ user_requirements = "\n".join(docker_settings.requirements)
579
+ if log:
580
+ logger.info(
581
+ "- Including user-defined requirements: %s",
582
+ ", ".join(f"`{r}`" for r in docker_settings.requirements),
583
+ )
584
+ else:
585
+ user_requirements = None
586
+
587
+ if user_requirements:
588
+ requirements_files.append(
589
+ (".zenml_user_requirements", user_requirements, [])
590
+ )
591
+
563
592
  return requirements_files
564
593
 
565
594
  @staticmethod
@@ -45,7 +45,7 @@ def update_model(
45
45
  original: M,
46
46
  update: Union["BaseModel", Dict[str, Any]],
47
47
  recursive: bool = True,
48
- exclude_none: bool = True,
48
+ exclude_none: bool = False,
49
49
  ) -> M:
50
50
  """Updates a pydantic model.
51
51
 
@@ -53,8 +53,7 @@ def update_model(
53
53
  original: The model to update.
54
54
  update: The update values.
55
55
  recursive: If `True`, dictionary values will be updated recursively.
56
- exclude_none: If `True`, `None` values in the update dictionary
57
- will be removed.
56
+ exclude_none: If `True`, `None` values in the update will be removed.
58
57
 
59
58
  Returns:
60
59
  The updated model.
@@ -67,7 +66,9 @@ def update_model(
67
66
  else:
68
67
  update_dict = update
69
68
  else:
70
- update_dict = update.model_dump(exclude_unset=True)
69
+ update_dict = update.model_dump(
70
+ exclude_unset=True, exclude_none=exclude_none
71
+ )
71
72
 
72
73
  original_dict = original.model_dump(exclude_unset=True)
73
74
  if recursive:
@@ -75,7 +76,7 @@ def update_model(
75
76
  else:
76
77
  values = {**original_dict, **update_dict}
77
78
 
78
- return original.__class__(**values)
79
+ return original.__class__.model_validate(values)
79
80
 
80
81
 
81
82
  class TemplateGenerator:
@@ -12,6 +12,8 @@ from zenml.zen_server.utils import server_config
12
12
 
13
13
  ZENML_CLOUD_RBAC_ENV_PREFIX = "ZENML_CLOUD_"
14
14
 
15
+ _cloud_connection: Optional["ZenMLCloudConnection"] = None
16
+
15
17
 
16
18
  class ZenMLCloudConfiguration(BaseModel):
17
19
  """ZenML Pro RBAC configuration."""
@@ -59,7 +61,7 @@ class ZenMLCloudConfiguration(BaseModel):
59
61
  )
60
62
 
61
63
 
62
- class ZenMLCloudSession:
64
+ class ZenMLCloudConnection:
63
65
  """Class to use for communication between server and control plane."""
64
66
 
65
67
  def __init__(self) -> None:
@@ -67,7 +69,7 @@ class ZenMLCloudSession:
67
69
  self._config = ZenMLCloudConfiguration.from_environment()
68
70
  self._session: Optional[requests.Session] = None
69
71
 
70
- def _get(
72
+ def get(
71
73
  self, endpoint: str, params: Optional[Dict[str, Any]]
72
74
  ) -> requests.Response:
73
75
  """Send a GET request using the active session.
@@ -105,7 +107,7 @@ class ZenMLCloudSession:
105
107
 
106
108
  return response
107
109
 
108
- def _post(
110
+ def post(
109
111
  self,
110
112
  endpoint: str,
111
113
  params: Optional[Dict[str, Any]] = None,
@@ -217,3 +219,16 @@ class ZenMLCloudSession:
217
219
  raise RuntimeError("Could not fetch auth token from auth0.")
218
220
 
219
221
  return str(access_token)
222
+
223
+
224
+ def cloud_connection() -> ZenMLCloudConnection:
225
+ """Return the initialized cloud connection.
226
+
227
+ Returns:
228
+ The cloud connection.
229
+ """
230
+ global _cloud_connection
231
+ if _cloud_connection is None:
232
+ _cloud_connection = ZenMLCloudConnection()
233
+
234
+ return _cloud_connection
@@ -1 +1 @@
1
- import{j as e}from"./@tanstack-CEbkxrhX.js";import{h as s,r as t}from"./index-BawkpTlr.js";import{E as r}from"./EmptyState-BkooiGtL.js";import{H as a}from"./help-B8rqCvqn.js";import{L as o}from"./@react-router-DYovave8.js";import"./@radix-C9DBgJhe.js";import"./@reactflow-DYIyhCfd.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-CFOkMR_E.js";import{h as s,r as t}from"./index-DK1ynKjA.js";import{E as r}from"./EmptyState-BMLnFVlB.js";import{H as a}from"./help-bu_DgLKI.js";import{L as o}from"./@react-router-CO-OsFwI.js";import"./@tanstack-DYiOyJUL.js";import"./@reactflow-DJfzkHO1.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};