zenml-nightly 0.55.0.dev20240124__py3-none-any.whl → 0.72.0.dev20250116__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.
- zenml/VERSION +1 -1
- zenml/__init__.py +9 -12
- zenml/actions/__init__.py +14 -0
- zenml/actions/base_action.py +682 -0
- zenml/actions/pipeline_run/__init__.py +0 -0
- zenml/actions/pipeline_run/pipeline_run_action.py +223 -0
- zenml/analytics/context.py +70 -15
- zenml/analytics/enums.py +21 -17
- zenml/analytics/models.py +1 -0
- zenml/analytics/utils.py +19 -7
- zenml/annotators/base_annotator.py +4 -3
- zenml/artifact_stores/base_artifact_store.py +155 -72
- zenml/artifact_stores/local_artifact_store.py +3 -2
- zenml/artifacts/artifact_config.py +67 -58
- zenml/artifacts/external_artifact.py +24 -39
- zenml/artifacts/external_artifact_config.py +27 -37
- zenml/artifacts/preexisting_data_materializer.py +90 -0
- zenml/artifacts/unmaterialized_artifact.py +2 -12
- zenml/artifacts/utils.py +521 -220
- zenml/cli/__init__.py +1511 -456
- zenml/cli/annotator.py +48 -14
- zenml/cli/artifact.py +22 -4
- zenml/cli/authorized_device.py +1 -0
- zenml/cli/base.py +185 -22
- zenml/cli/code_repository.py +1 -0
- zenml/cli/formatter.py +1 -1
- zenml/cli/integration.py +119 -24
- zenml/cli/login.py +1053 -0
- zenml/cli/model.py +42 -15
- zenml/cli/model_registry.py +1 -2
- zenml/cli/pipeline.py +168 -82
- zenml/cli/secret.py +1 -2
- zenml/cli/served_model.py +56 -26
- zenml/cli/server.py +486 -619
- zenml/cli/service_accounts.py +55 -14
- zenml/cli/service_connectors.py +97 -6
- zenml/cli/stack.py +821 -531
- zenml/cli/stack_components.py +15 -598
- zenml/cli/tag.py +1 -0
- zenml/cli/text_utils.py +36 -2
- zenml/cli/user_management.py +204 -6
- zenml/cli/utils.py +411 -290
- zenml/client.py +1742 -298
- zenml/client_lazy_loader.py +224 -0
- zenml/code_repositories/base_code_repository.py +5 -4
- zenml/code_repositories/git/local_git_repository_context.py +1 -0
- zenml/code_repositories/local_repository_context.py +1 -0
- zenml/config/__init__.py +2 -0
- zenml/config/base_settings.py +6 -6
- zenml/config/build_configuration.py +43 -17
- zenml/config/compiler.py +82 -49
- zenml/config/docker_settings.py +139 -83
- zenml/config/global_config.py +260 -234
- zenml/config/pipeline_configurations.py +32 -11
- zenml/config/pipeline_run_configuration.py +15 -3
- zenml/config/pipeline_spec.py +6 -6
- zenml/config/resource_settings.py +8 -9
- zenml/config/retry_config.py +27 -0
- zenml/config/schedule.py +27 -18
- zenml/config/secret_reference_mixin.py +8 -4
- zenml/config/secrets_store_config.py +16 -24
- zenml/config/server_config.py +434 -51
- zenml/config/settings_resolver.py +2 -1
- zenml/config/source.py +97 -31
- zenml/config/step_configurations.py +83 -39
- zenml/config/step_run_info.py +3 -0
- zenml/config/store_config.py +20 -54
- zenml/config/strict_base_model.py +2 -6
- zenml/console.py +0 -1
- zenml/constants.py +232 -74
- zenml/container_registries/azure_container_registry.py +1 -0
- zenml/container_registries/base_container_registry.py +7 -3
- zenml/container_registries/default_container_registry.py +4 -3
- zenml/container_registries/dockerhub_container_registry.py +1 -0
- zenml/container_registries/gcp_container_registry.py +1 -0
- zenml/container_registries/github_container_registry.py +2 -10
- zenml/data_validators/base_data_validator.py +2 -2
- zenml/entrypoints/base_entrypoint_configuration.py +76 -17
- zenml/entrypoints/pipeline_entrypoint_configuration.py +1 -0
- zenml/entrypoints/step_entrypoint_configuration.py +21 -2
- zenml/enums.py +91 -9
- zenml/environment.py +52 -319
- zenml/{steps/base_parameters.py → event_hub/__init__.py} +5 -7
- zenml/event_hub/base_event_hub.py +196 -0
- zenml/event_hub/event_hub.py +181 -0
- zenml/event_sources/__init__.py +14 -0
- zenml/{lineage_graph/edge.py → event_sources/base_event.py} +5 -7
- zenml/event_sources/base_event_source.py +695 -0
- zenml/event_sources/webhooks/__init__.py +14 -0
- zenml/event_sources/webhooks/base_webhook_event_source.py +231 -0
- zenml/exceptions.py +40 -41
- zenml/feature_stores/base_feature_store.py +4 -6
- zenml/hooks/hook_validators.py +3 -11
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +24 -80
- zenml/image_builders/local_image_builder.py +14 -6
- zenml/integrations/__init__.py +16 -4
- zenml/integrations/airflow/__init__.py +3 -5
- zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +15 -7
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +15 -252
- zenml/integrations/airflow/orchestrators/dag_generator.py +5 -3
- zenml/integrations/argilla/__init__.py +46 -0
- zenml/integrations/argilla/annotators/__init__.py +20 -0
- zenml/integrations/argilla/annotators/argilla_annotator.py +443 -0
- zenml/{post_execution → integrations/argilla/flavors}/__init__.py +9 -13
- zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +150 -0
- zenml/integrations/aws/__init__.py +7 -3
- zenml/integrations/aws/container_registries/aws_container_registry.py +44 -8
- zenml/integrations/aws/flavors/__init__.py +6 -0
- zenml/integrations/aws/flavors/aws_container_registry_flavor.py +3 -2
- zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
- zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +104 -16
- zenml/integrations/aws/flavors/sagemaker_step_operator_flavor.py +6 -2
- zenml/integrations/aws/image_builders/__init__.py +20 -0
- zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +421 -133
- zenml/integrations/aws/service_connectors/aws_service_connector.py +175 -48
- zenml/integrations/aws/step_operators/sagemaker_step_operator.py +1 -1
- zenml/integrations/azure/__init__.py +14 -5
- zenml/integrations/azure/azureml_utils.py +201 -0
- zenml/integrations/azure/flavors/__init__.py +11 -0
- zenml/integrations/azure/flavors/azureml.py +139 -0
- zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +166 -0
- zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +71 -18
- zenml/integrations/azure/orchestrators/__init__.py +19 -0
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +583 -0
- zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +82 -0
- zenml/integrations/azure/service_connectors/azure_service_connector.py +15 -6
- zenml/integrations/azure/step_operators/azureml_step_operator.py +78 -173
- zenml/integrations/bentoml/__init__.py +1 -1
- zenml/integrations/bentoml/constants.py +1 -1
- zenml/integrations/bentoml/materializers/bentoml_bento_materializer.py +19 -31
- zenml/integrations/bentoml/model_deployers/bentoml_model_deployer.py +128 -239
- zenml/integrations/bentoml/services/__init__.py +15 -4
- zenml/integrations/bentoml/services/bentoml_container_deployment.py +399 -0
- zenml/integrations/bentoml/services/{bentoml_deployment.py → bentoml_local_deployment.py} +85 -43
- zenml/integrations/bentoml/services/deployment_type.py +23 -0
- zenml/integrations/bentoml/steps/bento_builder.py +2 -0
- zenml/integrations/bentoml/steps/bentoml_deployer.py +97 -47
- zenml/integrations/bitbucket/__init__.py +42 -0
- zenml/integrations/bitbucket/plugins/__init__.py +20 -0
- zenml/integrations/bitbucket/plugins/bitbucket_webhook_event_source_flavor.py +43 -0
- zenml/integrations/bitbucket/plugins/event_sources/__init__.py +0 -0
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +486 -0
- zenml/integrations/comet/__init__.py +49 -0
- zenml/integrations/{kserve/services → comet/experiment_trackers}/__init__.py +5 -6
- zenml/integrations/comet/experiment_trackers/comet_experiment_tracker.py +175 -0
- zenml/integrations/comet/flavors/__init__.py +24 -0
- zenml/integrations/comet/flavors/comet_experiment_tracker_flavor.py +129 -0
- zenml/integrations/constants.py +14 -2
- zenml/integrations/databricks/__init__.py +70 -0
- zenml/{lineage_graph → integrations/databricks/flavors}/__init__.py +14 -18
- zenml/integrations/databricks/flavors/databricks_model_deployer_flavor.py +118 -0
- zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +174 -0
- zenml/integrations/{kserve → databricks}/model_deployers/__init__.py +5 -5
- zenml/integrations/databricks/model_deployers/databricks_model_deployer.py +249 -0
- zenml/integrations/databricks/orchestrators/__init__.py +20 -0
- zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +501 -0
- zenml/integrations/databricks/orchestrators/databricks_orchestrator_entrypoint_config.py +97 -0
- zenml/integrations/databricks/services/__init__.py +19 -0
- zenml/integrations/databricks/services/databricks_deployment.py +407 -0
- zenml/integrations/{gcp/orchestrators/vertex_scheduler → databricks/utils}/__init__.py +2 -2
- zenml/integrations/databricks/utils/databricks_utils.py +87 -0
- zenml/integrations/deepchecks/__init__.py +30 -10
- zenml/integrations/deepchecks/data_validators/deepchecks_data_validator.py +59 -18
- zenml/integrations/deepchecks/materializers/deepchecks_dataset_materializer.py +3 -1
- zenml/integrations/deepchecks/materializers/deepchecks_results_materializer.py +3 -3
- zenml/integrations/deepchecks/validation_checks.py +62 -35
- zenml/integrations/discord/__init__.py +1 -0
- zenml/integrations/discord/steps/discord_alerter_ask_step.py +1 -0
- zenml/integrations/discord/steps/discord_alerter_post_step.py +1 -0
- zenml/integrations/evidently/__init__.py +22 -4
- zenml/integrations/evidently/column_mapping.py +11 -3
- zenml/integrations/evidently/data_validators/evidently_data_validator.py +24 -6
- zenml/integrations/evidently/metrics.py +7 -8
- zenml/integrations/evidently/tests.py +7 -8
- zenml/integrations/facets/__init__.py +22 -5
- zenml/integrations/facets/models.py +2 -7
- zenml/integrations/feast/__init__.py +19 -3
- zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -32
- zenml/integrations/gcp/__init__.py +6 -6
- zenml/integrations/gcp/artifact_stores/gcp_artifact_store.py +6 -0
- zenml/integrations/gcp/flavors/gcp_artifact_store_flavor.py +1 -0
- zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +24 -2
- zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +14 -1
- zenml/integrations/gcp/google_credentials_mixin.py +1 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +519 -296
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +788 -113
- zenml/integrations/gcp/step_operators/vertex_step_operator.py +9 -1
- zenml/integrations/github/__init__.py +15 -0
- zenml/integrations/github/code_repositories/github_code_repository.py +3 -2
- zenml/integrations/github/plugins/__init__.py +19 -0
- zenml/integrations/github/plugins/event_sources/__init__.py +0 -0
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +510 -0
- zenml/integrations/github/plugins/github_webhook_event_source_flavor.py +43 -0
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +7 -1
- zenml/integrations/great_expectations/__init__.py +22 -10
- zenml/integrations/great_expectations/data_validators/ge_data_validator.py +61 -57
- zenml/integrations/great_expectations/flavors/great_expectations_data_validator_flavor.py +35 -2
- zenml/integrations/great_expectations/ge_store_backend.py +24 -11
- zenml/integrations/great_expectations/materializers/ge_materializer.py +9 -9
- zenml/integrations/great_expectations/utils.py +5 -5
- zenml/integrations/huggingface/__init__.py +52 -1
- zenml/integrations/huggingface/flavors/__init__.py +26 -0
- zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py +130 -0
- zenml/integrations/huggingface/materializers/__init__.py +3 -0
- zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +102 -19
- zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +18 -19
- zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +104 -0
- zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +18 -19
- zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +13 -15
- zenml/integrations/huggingface/model_deployers/__init__.py +20 -0
- zenml/integrations/huggingface/model_deployers/huggingface_model_deployer.py +247 -0
- zenml/integrations/huggingface/services/__init__.py +19 -0
- zenml/integrations/huggingface/services/huggingface_deployment.py +292 -0
- zenml/integrations/huggingface/steps/__init__.py +21 -0
- zenml/integrations/huggingface/steps/accelerate_runner.py +166 -0
- zenml/integrations/huggingface/steps/huggingface_deployer.py +110 -0
- zenml/integrations/hyperai/__init__.py +53 -0
- zenml/integrations/hyperai/flavors/__init__.py +20 -0
- zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +170 -0
- zenml/integrations/hyperai/orchestrators/__init__.py +21 -0
- zenml/integrations/hyperai/orchestrators/hyperai_orchestrator.py +510 -0
- zenml/integrations/hyperai/service_connectors/__init__.py +20 -0
- zenml/integrations/hyperai/service_connectors/hyperai_service_connector.py +375 -0
- zenml/integrations/integration.py +101 -47
- zenml/integrations/kaniko/flavors/kaniko_image_builder_flavor.py +6 -44
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +9 -6
- zenml/integrations/kubeflow/__init__.py +4 -1
- zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +67 -82
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +306 -248
- zenml/integrations/kubernetes/__init__.py +6 -3
- zenml/integrations/kubernetes/flavors/__init__.py +8 -0
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +43 -2
- zenml/integrations/kubernetes/flavors/kubernetes_step_operator_flavor.py +166 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +67 -12
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +89 -21
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +39 -7
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +42 -19
- zenml/integrations/kubernetes/pod_settings.py +21 -31
- zenml/integrations/kubernetes/serialization_utils.py +3 -3
- zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +14 -11
- zenml/integrations/kubernetes/step_operators/__init__.py +22 -0
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +236 -0
- zenml/integrations/label_studio/__init__.py +1 -3
- zenml/integrations/label_studio/annotators/label_studio_annotator.py +46 -14
- zenml/integrations/label_studio/flavors/__init__.py +2 -0
- zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py +20 -5
- zenml/integrations/langchain/__init__.py +7 -1
- zenml/integrations/langchain/materializers/document_materializer.py +44 -8
- zenml/integrations/langchain/materializers/openai_embedding_materializer.py +28 -2
- zenml/integrations/lightgbm/__init__.py +1 -0
- zenml/integrations/lightgbm/materializers/lightgbm_booster_materializer.py +8 -15
- zenml/integrations/lightgbm/materializers/lightgbm_dataset_materializer.py +11 -16
- zenml/integrations/lightning/__init__.py +48 -0
- zenml/integrations/lightning/flavors/__init__.py +23 -0
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +168 -0
- zenml/integrations/lightning/orchestrators/__init__.py +23 -0
- zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +617 -0
- zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +303 -0
- zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint_configuration.py +77 -0
- zenml/integrations/lightning/orchestrators/utils.py +67 -0
- zenml/integrations/mlflow/__init__.py +55 -8
- zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +31 -13
- zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +32 -37
- zenml/integrations/mlflow/model_deployers/mlflow_model_deployer.py +42 -233
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +42 -49
- zenml/integrations/mlflow/services/mlflow_deployment.py +30 -5
- zenml/integrations/mlflow/steps/mlflow_deployer.py +25 -27
- zenml/integrations/mlflow/steps/mlflow_registry.py +3 -1
- zenml/integrations/modal/__init__.py +46 -0
- zenml/integrations/modal/flavors/__init__.py +26 -0
- zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
- zenml/integrations/modal/step_operators/__init__.py +22 -0
- zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
- zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
- zenml/integrations/neptune/experiment_trackers/run_state.py +71 -55
- zenml/integrations/neptune/flavors/neptune_experiment_tracker_flavor.py +1 -1
- zenml/integrations/neural_prophet/__init__.py +6 -1
- zenml/integrations/numpy/__init__.py +32 -0
- zenml/integrations/{kserve/constants.py → numpy/materializers/__init__.py} +5 -4
- zenml/integrations/numpy/materializers/numpy_materializer.py +246 -0
- zenml/integrations/openai/__init__.py +1 -1
- zenml/integrations/openai/hooks/open_ai_failure_hook.py +39 -14
- zenml/{steps/external_artifact.py → integrations/pandas/__init__.py} +17 -11
- zenml/integrations/{kserve/custom_deployer → pandas/materializers}/__init__.py +5 -5
- zenml/integrations/pandas/materializers/pandas_materializer.py +192 -0
- zenml/integrations/pigeon/__init__.py +44 -0
- zenml/integrations/pigeon/annotators/__init__.py +20 -0
- zenml/integrations/pigeon/annotators/pigeon_annotator.py +330 -0
- zenml/integrations/{kserve → pigeon}/flavors/__init__.py +7 -7
- zenml/integrations/pigeon/flavors/pigeon_annotator_flavor.py +104 -0
- zenml/integrations/pillow/materializers/pillow_image_materializer.py +17 -20
- zenml/integrations/polars/__init__.py +1 -0
- zenml/integrations/polars/materializers/dataframe_materializer.py +26 -39
- zenml/integrations/prodigy/__init__.py +48 -0
- zenml/integrations/prodigy/annotators/__init__.py +20 -0
- zenml/integrations/prodigy/annotators/prodigy_annotator.py +275 -0
- zenml/integrations/prodigy/flavors/__init__.py +24 -0
- zenml/integrations/prodigy/flavors/prodigy_annotator_flavor.py +101 -0
- zenml/integrations/pycaret/__init__.py +6 -0
- zenml/integrations/pycaret/materializers/model_materializer.py +7 -22
- zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +8 -2
- zenml/integrations/pytorch/materializers/pytorch_module_materializer.py +4 -1
- zenml/integrations/registry.py +38 -1
- zenml/integrations/s3/__init__.py +2 -3
- zenml/integrations/s3/artifact_stores/s3_artifact_store.py +191 -9
- zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +22 -45
- zenml/integrations/s3/utils.py +39 -0
- zenml/integrations/seldon/__init__.py +18 -2
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +19 -141
- zenml/integrations/seldon/secret_schemas/secret_schemas.py +2 -2
- zenml/integrations/seldon/seldon_client.py +55 -70
- zenml/integrations/seldon/services/seldon_deployment.py +4 -5
- zenml/integrations/seldon/steps/seldon_deployer.py +21 -20
- zenml/integrations/sklearn/__init__.py +1 -1
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +29 -7
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +47 -28
- zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
- zenml/integrations/skypilot_aws/__init__.py +3 -2
- zenml/integrations/skypilot_aws/flavors/skypilot_orchestrator_aws_vm_flavor.py +1 -1
- zenml/integrations/skypilot_azure/__init__.py +2 -4
- zenml/integrations/skypilot_azure/flavors/skypilot_orchestrator_azure_vm_flavor.py +1 -1
- zenml/integrations/skypilot_gcp/__init__.py +3 -2
- zenml/integrations/skypilot_gcp/flavors/skypilot_orchestrator_gcp_vm_flavor.py +1 -1
- zenml/integrations/skypilot_kubernetes/__init__.py +52 -0
- zenml/integrations/skypilot_kubernetes/flavors/__init__.py +26 -0
- zenml/integrations/skypilot_kubernetes/flavors/skypilot_orchestrator_kubernetes_vm_flavor.py +125 -0
- zenml/integrations/skypilot_kubernetes/orchestrators/__init__.py +25 -0
- zenml/integrations/skypilot_kubernetes/orchestrators/skypilot_kubernetes_vm_orchestrator.py +74 -0
- zenml/integrations/skypilot_lambda/__init__.py +50 -0
- zenml/integrations/{kserve/secret_schemas → skypilot_lambda/flavors}/__init__.py +9 -12
- zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +130 -0
- zenml/{lineage_graph/node → integrations/skypilot_lambda/orchestrators}/__init__.py +8 -15
- zenml/integrations/skypilot_lambda/orchestrators/skypilot_lambda_vm_orchestrator.py +92 -0
- zenml/integrations/slack/__init__.py +1 -0
- zenml/integrations/slack/alerters/slack_alerter.py +22 -2
- zenml/integrations/slack/flavors/__init__.py +2 -0
- zenml/integrations/slack/flavors/slack_alerter_flavor.py +13 -4
- zenml/integrations/slack/steps/slack_alerter_ask_step.py +1 -0
- zenml/integrations/slack/steps/slack_alerter_post_step.py +1 -0
- zenml/integrations/spark/flavors/spark_step_operator_flavor.py +2 -39
- zenml/integrations/spark/step_operators/kubernetes_step_operator.py +1 -0
- zenml/integrations/spark/step_operators/spark_entrypoint_configuration.py +1 -0
- zenml/integrations/spark/step_operators/spark_step_operator.py +2 -0
- zenml/integrations/tekton/__init__.py +2 -1
- zenml/integrations/tekton/flavors/tekton_orchestrator_flavor.py +66 -23
- zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +549 -235
- zenml/integrations/tensorboard/__init__.py +1 -13
- zenml/integrations/tensorboard/services/tensorboard_service.py +3 -4
- zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +66 -59
- zenml/integrations/tensorflow/__init__.py +10 -15
- zenml/integrations/tensorflow/materializers/keras_materializer.py +24 -27
- zenml/integrations/tensorflow/materializers/tf_dataset_materializer.py +9 -16
- zenml/integrations/vllm/__init__.py +50 -0
- zenml/integrations/vllm/flavors/__init__.py +21 -0
- zenml/integrations/vllm/flavors/vllm_model_deployer_flavor.py +91 -0
- zenml/integrations/vllm/model_deployers/__init__.py +19 -0
- zenml/integrations/vllm/model_deployers/vllm_model_deployer.py +263 -0
- zenml/integrations/vllm/services/__init__.py +19 -0
- zenml/integrations/vllm/services/vllm_deployment.py +206 -0
- zenml/integrations/wandb/__init__.py +1 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +21 -18
- zenml/integrations/whylogs/__init__.py +18 -2
- zenml/integrations/whylogs/data_validators/whylogs_data_validator.py +3 -3
- zenml/integrations/whylogs/flavors/whylogs_data_validator_flavor.py +1 -1
- zenml/integrations/whylogs/materializers/whylogs_materializer.py +14 -21
- zenml/integrations/xgboost/materializers/xgboost_booster_materializer.py +11 -22
- zenml/integrations/xgboost/materializers/xgboost_dmatrix_materializer.py +10 -19
- zenml/io/fileio.py +1 -0
- zenml/io/filesystem.py +2 -2
- zenml/io/local_filesystem.py +3 -3
- zenml/logger.py +41 -17
- zenml/logging/__init__.py +5 -0
- zenml/logging/step_logging.py +280 -32
- zenml/{new/steps → login}/__init__.py +4 -1
- zenml/login/credentials.py +370 -0
- zenml/login/credentials_store.py +638 -0
- zenml/{new/pipelines → login/pro}/__init__.py +4 -1
- zenml/login/pro/client.py +492 -0
- zenml/login/pro/constants.py +28 -0
- zenml/{zen_stores/schemas/identity_schemas.py → login/pro/models.py} +9 -11
- zenml/login/pro/organization/__init__.py +14 -0
- zenml/login/pro/organization/client.py +79 -0
- zenml/{lineage_graph/node/base_node.py → login/pro/organization/models.py} +13 -12
- zenml/{_hub → login/pro/tenant}/__init__.py +2 -2
- zenml/login/pro/tenant/client.py +92 -0
- zenml/login/pro/tenant/models.py +176 -0
- zenml/login/pro/utils.py +107 -0
- zenml/login/server_info.py +52 -0
- zenml/{cli → login}/web_login.py +71 -21
- zenml/materializers/__init__.py +2 -4
- zenml/materializers/base_materializer.py +180 -51
- zenml/materializers/built_in_materializer.py +50 -23
- zenml/materializers/cloudpickle_materializer.py +4 -5
- zenml/materializers/numpy_materializer.py +23 -233
- zenml/materializers/pandas_materializer.py +22 -174
- zenml/materializers/pydantic_materializer.py +2 -2
- zenml/materializers/service_materializer.py +12 -10
- zenml/materializers/structured_string_materializer.py +12 -6
- zenml/materializers/uuid_materializer.py +79 -0
- zenml/metadata/lazy_load.py +33 -17
- zenml/metadata/metadata_types.py +112 -3
- zenml/model/lazy_load.py +85 -4
- zenml/model/model.py +236 -226
- zenml/model/utils.py +99 -141
- zenml/model_deployers/base_model_deployer.py +319 -47
- zenml/model_registries/base_model_registry.py +17 -15
- zenml/models/__init__.py +254 -175
- zenml/models/v2/base/base.py +254 -112
- zenml/models/v2/base/base_plugin_flavor.py +76 -0
- zenml/models/v2/base/filter.py +530 -199
- zenml/models/v2/base/page.py +2 -12
- zenml/models/v2/base/scoped.py +292 -22
- zenml/models/v2/core/action.py +276 -0
- zenml/models/v2/core/action_flavor.py +57 -0
- zenml/models/v2/core/api_key.py +35 -12
- zenml/models/v2/core/artifact.py +126 -6
- zenml/models/v2/core/artifact_version.py +289 -65
- zenml/models/v2/core/artifact_visualization.py +10 -4
- zenml/models/v2/core/code_reference.py +13 -4
- zenml/models/v2/core/code_repository.py +39 -16
- zenml/models/v2/core/component.py +113 -61
- zenml/models/v2/core/device.py +25 -5
- zenml/models/v2/core/event_source.py +244 -0
- zenml/models/v2/core/event_source_flavor.py +67 -0
- zenml/models/v2/core/flavor.py +90 -27
- zenml/models/v2/core/logs.py +81 -12
- zenml/models/v2/core/model.py +91 -42
- zenml/models/v2/core/model_version.py +100 -55
- zenml/models/v2/core/model_version_artifact.py +96 -89
- zenml/models/v2/core/model_version_pipeline_run.py +86 -53
- zenml/models/v2/core/pipeline.py +205 -80
- zenml/models/v2/core/pipeline_build.py +110 -21
- zenml/models/v2/core/pipeline_deployment.py +101 -36
- zenml/models/v2/core/pipeline_run.py +545 -33
- zenml/models/v2/core/run_metadata.py +23 -181
- zenml/models/v2/core/run_template.py +439 -0
- zenml/models/v2/core/schedule.py +66 -29
- zenml/models/v2/core/secret.py +33 -21
- zenml/models/v2/core/server_settings.py +224 -0
- zenml/models/v2/core/service.py +500 -0
- zenml/models/v2/core/service_account.py +40 -15
- zenml/models/v2/core/service_connector.py +247 -49
- zenml/models/v2/core/stack.py +163 -70
- zenml/models/v2/core/step_run.py +210 -48
- zenml/models/v2/core/tag.py +21 -8
- zenml/models/v2/core/tag_resource.py +13 -4
- zenml/models/v2/core/trigger.py +422 -0
- zenml/models/v2/core/trigger_execution.py +119 -0
- zenml/models/v2/core/user.py +136 -69
- zenml/models/v2/core/workspace.py +26 -7
- zenml/models/v2/misc/auth_models.py +11 -2
- zenml/models/v2/misc/build_item.py +3 -3
- zenml/models/v2/misc/external_user.py +3 -6
- zenml/models/v2/misc/info_models.py +78 -0
- zenml/models/v2/misc/loaded_visualization.py +2 -2
- zenml/models/v2/misc/run_metadata.py +38 -0
- zenml/models/v2/misc/server_models.py +100 -0
- zenml/models/v2/misc/service_connector_type.py +9 -17
- zenml/models/v2/misc/stack_deployment.py +96 -0
- zenml/models/v2/misc/user_auth.py +7 -9
- zenml/orchestrators/__init__.py +4 -0
- zenml/orchestrators/base_orchestrator.py +136 -25
- zenml/orchestrators/containerized_orchestrator.py +1 -0
- zenml/orchestrators/dag_runner.py +18 -3
- zenml/orchestrators/input_utils.py +109 -48
- zenml/orchestrators/local/local_orchestrator.py +10 -0
- zenml/orchestrators/local_docker/local_docker_orchestrator.py +14 -42
- zenml/orchestrators/output_utils.py +16 -6
- zenml/orchestrators/publish_utils.py +12 -5
- zenml/orchestrators/step_launcher.py +142 -194
- zenml/orchestrators/step_run_utils.py +386 -0
- zenml/orchestrators/step_runner.py +181 -270
- zenml/orchestrators/utils.py +219 -84
- zenml/orchestrators/wheeled_orchestrator.py +147 -0
- zenml/pipelines/__init__.py +3 -16
- zenml/{new/pipelines → pipelines}/build_utils.py +287 -47
- zenml/{new/pipelines → pipelines}/pipeline_context.py +6 -2
- zenml/pipelines/pipeline_decorator.py +40 -64
- zenml/{new/pipelines/pipeline.py → pipelines/pipeline_definition.py} +376 -440
- zenml/pipelines/run_utils.py +358 -0
- zenml/plugins/__init__.py +0 -0
- zenml/plugins/base_plugin_flavor.py +88 -0
- zenml/plugins/plugin_flavor_registry.py +342 -0
- zenml/secret/base_secret.py +7 -8
- zenml/secret/schemas/basic_auth_secret_schema.py +0 -1
- zenml/service_connectors/docker_service_connector.py +19 -4
- zenml/service_connectors/service_connector.py +12 -14
- zenml/service_connectors/service_connector_registry.py +71 -55
- zenml/service_connectors/service_connector_utils.py +418 -0
- zenml/services/__init__.py +0 -2
- zenml/services/container/container_service.py +9 -6
- zenml/services/container/container_service_endpoint.py +1 -1
- zenml/services/container/entrypoint.py +3 -2
- zenml/services/local/local_daemon_entrypoint.py +9 -6
- zenml/services/local/local_service.py +1 -1
- zenml/services/local/local_service_endpoint.py +1 -1
- zenml/services/service.py +222 -130
- zenml/services/service_status.py +2 -1
- zenml/services/service_type.py +6 -5
- zenml/stack/flavor.py +25 -18
- zenml/stack/flavor_registry.py +4 -4
- zenml/stack/stack.py +20 -131
- zenml/stack/stack_component.py +136 -110
- zenml/stack/utils.py +36 -15
- zenml/stack_deployments/__init__.py +14 -0
- zenml/stack_deployments/aws_stack_deployment.py +320 -0
- zenml/stack_deployments/azure_stack_deployment.py +315 -0
- zenml/stack_deployments/gcp_stack_deployment.py +315 -0
- zenml/stack_deployments/stack_deployment.py +232 -0
- zenml/stack_deployments/utils.py +48 -0
- zenml/step_operators/step_operator_entrypoint_configuration.py +2 -1
- zenml/steps/__init__.py +3 -9
- zenml/steps/base_step.py +172 -315
- zenml/{new/steps → steps}/decorated_step.py +1 -0
- zenml/steps/entrypoint_function_utils.py +33 -93
- zenml/{new/steps → steps}/step_context.py +70 -50
- zenml/steps/step_decorator.py +47 -93
- zenml/steps/step_invocation.py +22 -60
- zenml/steps/utils.py +161 -48
- zenml/types.py +14 -1
- zenml/utils/archivable.py +178 -0
- zenml/utils/callback_registry.py +71 -0
- zenml/utils/code_repository_utils.py +1 -0
- zenml/utils/code_utils.py +346 -0
- zenml/utils/cuda_utils.py +50 -0
- zenml/utils/dashboard_utils.py +67 -21
- zenml/utils/deprecation_utils.py +22 -24
- zenml/utils/dict_utils.py +22 -0
- zenml/utils/docker_utils.py +34 -5
- zenml/utils/downloaded_repository_context.py +1 -0
- zenml/utils/env_utils.py +55 -1
- zenml/utils/filesync_model.py +65 -28
- zenml/utils/function_utils.py +260 -0
- zenml/utils/integration_utils.py +1 -0
- zenml/utils/json_utils.py +131 -0
- zenml/utils/materializer_utils.py +1 -1
- zenml/utils/metadata_utils.py +368 -0
- zenml/utils/notebook_utils.py +136 -0
- zenml/utils/package_utils.py +89 -0
- zenml/utils/pagination_utils.py +9 -7
- zenml/utils/pipeline_docker_image_builder.py +152 -149
- zenml/utils/pydantic_utils.py +276 -66
- zenml/utils/requirements_utils.py +71 -0
- zenml/utils/secret_utils.py +66 -12
- zenml/utils/settings_utils.py +2 -1
- zenml/utils/singleton.py +15 -3
- zenml/utils/source_code_utils.py +1 -0
- zenml/utils/source_utils.py +236 -14
- zenml/utils/string_utils.py +140 -0
- zenml/utils/typed_model.py +5 -3
- zenml/utils/typing_utils.py +223 -0
- zenml/utils/visualization_utils.py +5 -3
- zenml/utils/yaml_utils.py +1 -1
- zenml/zen_server/auth.py +387 -55
- zenml/zen_server/cache.py +208 -0
- zenml/zen_server/cloud_utils.py +253 -0
- zenml/zen_server/csrf.py +91 -0
- zenml/zen_server/dashboard/assets/404-Dfq64Boz.js +1 -0
- zenml/zen_server/dashboard/assets/@radix-DeK6qiuw.js +85 -0
- zenml/zen_server/dashboard/assets/@react-router-B3Z5rLr2.js +29 -0
- zenml/zen_server/dashboard/assets/@reactflow-BUNIMFeC.js +17 -0
- zenml/zen_server/dashboard/assets/@reactflow-C26Olbza.css +1 -0
- zenml/zen_server/dashboard/assets/@tanstack-DT5WLu9C.js +22 -0
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-B73Vs10T.js +1 -0
- zenml/zen_server/dashboard/assets/CodeSnippet-Bbx6fIb6.css +1 -0
- zenml/zen_server/dashboard/assets/CodeSnippet-DIJRT2NT.js +9 -0
- zenml/zen_server/dashboard/assets/CollapsibleCard-BzUHGZOU.js +1 -0
- zenml/zen_server/dashboard/assets/Commands-BEGyld4c.js +1 -0
- zenml/zen_server/dashboard/assets/ComponentBadge-xyKiek1s.js +1 -0
- zenml/zen_server/dashboard/assets/CopyButton-DhW-mapu.js +2 -0
- zenml/zen_server/dashboard/assets/CsvVizualization-D8oazBiE.js +15 -0
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-WkSIIgfy.js +1 -0
- zenml/zen_server/dashboard/assets/DialogItem-Bgroeg29.js +1 -0
- zenml/zen_server/dashboard/assets/DisplayDate-CDMUcQHS.js +1 -0
- zenml/zen_server/dashboard/assets/EmptyState-BzdlCwp3.js +1 -0
- zenml/zen_server/dashboard/assets/Error-CY5tlu17.js +1 -0
- zenml/zen_server/dashboard/assets/ExecutionStatus-G8mjIaeA.js +1 -0
- zenml/zen_server/dashboard/assets/Helpbox-Bb1ed--O.js +1 -0
- zenml/zen_server/dashboard/assets/Infobox-Da6-76M2.js +1 -0
- zenml/zen_server/dashboard/assets/InlineAvatar-DqnZaBNq.js +1 -0
- zenml/zen_server/dashboard/assets/Lock-CYYy18Mm.js +1 -0
- zenml/zen_server/dashboard/assets/MarkdownVisualization-ylXaAxev.js +14 -0
- zenml/zen_server/dashboard/assets/NestedCollapsible-aK5ojKoF.js +1 -0
- zenml/zen_server/dashboard/assets/NumberBox-Dtp3J6g5.js +1 -0
- zenml/zen_server/dashboard/assets/Partials-CqZp5NMX.js +1 -0
- zenml/zen_server/dashboard/assets/PasswordChecker-B0nadgh6.js +1 -0
- zenml/zen_server/dashboard/assets/ProBadge-B4tRUYve.js +1 -0
- zenml/zen_server/dashboard/assets/ProCta-CZuP29Qz.js +1 -0
- zenml/zen_server/dashboard/assets/ProviderIcon-Bd7GUQ1_.js +1 -0
- zenml/zen_server/dashboard/assets/ProviderRadio-mstdqzsS.js +1 -0
- zenml/zen_server/dashboard/assets/RunSelector-CsruSB4i.js +1 -0
- zenml/zen_server/dashboard/assets/RunsBody-DxxtWVYz.js +1 -0
- zenml/zen_server/dashboard/assets/SearchField-D6tPxyqw.js +1 -0
- zenml/zen_server/dashboard/assets/SecretTooltip-CLzJIYW_.js +1 -0
- zenml/zen_server/dashboard/assets/SetPassword-Yn50ooBC.js +1 -0
- zenml/zen_server/dashboard/assets/StackList-U537qoYd.js +1 -0
- zenml/zen_server/dashboard/assets/Tabs-CNv-eTYM.js +1 -0
- zenml/zen_server/dashboard/assets/Tick-jEIevzVf.js +1 -0
- zenml/zen_server/dashboard/assets/UpdatePasswordSchemas-C16GW-kX.js +1 -0
- zenml/zen_server/dashboard/assets/UsageReason-Bf2tzhv1.js +1 -0
- zenml/zen_server/dashboard/assets/WizardFooter-D6i-AP1K.js +1 -0
- zenml/zen_server/dashboard/assets/acp-DOsXjFc7.webp +0 -0
- zenml/zen_server/dashboard/assets/adam-e-y0WnB_.webp +0 -0
- zenml/zen_server/dashboard/assets/alex-DcCuDHPg.webp +0 -0
- zenml/zen_server/dashboard/assets/all-pipeline-runs-query-DUti43aF.js +1 -0
- zenml/zen_server/dashboard/assets/baris-C0ZrZ10g.webp +0 -0
- zenml/zen_server/dashboard/assets/check-DloQpStc.js +1 -0
- zenml/zen_server/dashboard/assets/check-circle-jNbX5-sR.js +1 -0
- zenml/zen_server/dashboard/assets/chevron-down-6JyMkfjR.js +1 -0
- zenml/zen_server/dashboard/assets/chevron-right-double-D7ojK9Co.js +1 -0
- zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +43 -0
- zenml/zen_server/dashboard/assets/code-browser-CUFUIHfp.js +1 -0
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/components-Br2ezRib.js +1 -0
- zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +21 -0
- zenml/zen_server/dashboard/assets/copy-C8XQA2Ug.js +1 -0
- zenml/zen_server/dashboard/assets/create-stack-Ch2WPs9U.js +1 -0
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-Byf9hTjA.js +1 -0
- zenml/zen_server/dashboard/assets/docker-BdA9vrnW.js +1 -0
- zenml/zen_server/dashboard/assets/dots-horizontal-otGBOSDJ.js +1 -0
- zenml/zen_server/dashboard/assets/flyte-Cj-xy_8I.svg +10 -0
- zenml/zen_server/dashboard/assets/form-schemas-BZqKBPBF.js +1 -0
- zenml/zen_server/dashboard/assets/gcp-CFtm4BA7.js +1 -0
- zenml/zen_server/dashboard/assets/hamza-NKKOZz1I.webp +0 -0
- zenml/zen_server/dashboard/assets/help-Cc9bBIJH.js +1 -0
- zenml/zen_server/dashboard/assets/index-CE0aQlv8.js +55 -0
- zenml/zen_server/dashboard/assets/index-CtdYkjUi.js +1 -0
- zenml/zen_server/dashboard/assets/index-CyBKZcpO.js +1 -0
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/index-Uu49AX48.js +1 -0
- zenml/zen_server/dashboard/assets/index-v6gQjDEo.js +1 -0
- zenml/zen_server/dashboard/assets/index.esm-Dy6Z9Ung.js +1 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DH2hs3aW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BGBWG807.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BuzJQFbW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-BZzXV7-1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DxZsaF_h.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-CeQXL5ds.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-d_eO-yCQ.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-CwicyhtI.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-Dhlb-90d.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-Bput3-QP.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-DCpCPQOf.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-B6guLgqG.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-M2hEX8vc.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-C9WLioJ8.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-BOOGhInR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-gitzw0hO.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-D2bGa7uu.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-deR1Tlfd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-B5cFAncS.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-D273HNI0.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-C1t-h-pH.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-hnt3BR84.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-UMdmhHu2.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-BnYJhD27.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-CAF0vJDd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-BUNmGMP1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff +0 -0
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/kubernetes-B2wmAJ1d.js +1 -0
- zenml/zen_server/dashboard/assets/layout-BtHBmE4w.js +1 -0
- zenml/zen_server/dashboard/assets/link-external-b9AXw_sW.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/login-mutation-DNDVp_2H.js +1 -0
- zenml/zen_server/dashboard/assets/logs-WMSM52RF.js +1 -0
- zenml/zen_server/dashboard/assets/mcp-Cb1aMeoq.webp +0 -0
- zenml/zen_server/dashboard/assets/metaflow-weOkWNyT.svg +10 -0
- zenml/zen_server/dashboard/assets/not-found-Bmup4ctE.js +1 -0
- zenml/zen_server/dashboard/assets/package-C6uypY4h.js +1 -0
- zenml/zen_server/dashboard/assets/page--XLMzHrn.js +1 -0
- zenml/zen_server/dashboard/assets/page-ANYGfEUL.js +1 -0
- zenml/zen_server/dashboard/assets/page-B5Sr8pib.js +1 -0
- zenml/zen_server/dashboard/assets/page-BC27C_OI.js +2 -0
- zenml/zen_server/dashboard/assets/page-BNxYrN0q.js +1 -0
- zenml/zen_server/dashboard/assets/page-BYJfqgLN.js +1 -0
- zenml/zen_server/dashboard/assets/page-B_0XkV48.js +1 -0
- zenml/zen_server/dashboard/assets/page-BrmJp1Wt.js +1 -0
- zenml/zen_server/dashboard/assets/page-C2nU3Gxn.js +1 -0
- zenml/zen_server/dashboard/assets/page-C70wZtV2.js +1 -0
- zenml/zen_server/dashboard/assets/page-CHRn1fQm.js +1 -0
- zenml/zen_server/dashboard/assets/page-CWr96ZKN.js +1 -0
- zenml/zen_server/dashboard/assets/page-CXAbSyp9.js +1 -0
- zenml/zen_server/dashboard/assets/page-CaeI9ptC.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cc8ZEuj4.js +1 -0
- zenml/zen_server/dashboard/assets/page-CltCNL0T.js +1 -0
- zenml/zen_server/dashboard/assets/page-CmlYj7Nl.js +1 -0
- zenml/zen_server/dashboard/assets/page-D6Ev5P8V.js +1 -0
- zenml/zen_server/dashboard/assets/page-D9Oh05fl.js +1 -0
- zenml/zen_server/dashboard/assets/page-DGlm1RVc.js +1 -0
- zenml/zen_server/dashboard/assets/page-DN4BVIOL.js +1 -0
- zenml/zen_server/dashboard/assets/page-Dif8CWyZ.js +1 -0
- zenml/zen_server/dashboard/assets/page-DlIi5ThM.js +1 -0
- zenml/zen_server/dashboard/assets/page-DoW7YxTu.js +1 -0
- zenml/zen_server/dashboard/assets/page-Dth9X1Ih.js +1 -0
- zenml/zen_server/dashboard/assets/page-DweqqCkF.js +1 -0
- zenml/zen_server/dashboard/assets/page-DyOJ_pq3.js +1 -0
- zenml/zen_server/dashboard/assets/page-Hn8q9iJZ.js +1 -0
- zenml/zen_server/dashboard/assets/page-IhckKFnD.js +6 -0
- zenml/zen_server/dashboard/assets/page-LyZ_l8vR.js +1 -0
- zenml/zen_server/dashboard/assets/page-PamGpk0j.js +1 -0
- zenml/zen_server/dashboard/assets/page-PxOWfKgF.js +2 -0
- zenml/zen_server/dashboard/assets/persist-DeXRG61d.js +1 -0
- zenml/zen_server/dashboard/assets/persist-vP0-Xl4f.js +1 -0
- zenml/zen_server/dashboard/assets/plus-tf1V2hTJ.js +1 -0
- zenml/zen_server/dashboard/assets/refresh-BjOeWlEq.js +1 -0
- zenml/zen_server/dashboard/assets/repos-video-D8kpu60k.svg +9 -0
- zenml/zen_server/dashboard/assets/rocket-DjT2cDvG.js +1 -0
- zenml/zen_server/dashboard/assets/service-DH_oUqQj.js +2 -0
- zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
- zenml/zen_server/dashboard/assets/sharedSchema-Bw1_Wa7l.js +14 -0
- zenml/zen_server/dashboard/assets/stack-detail-query-B_0R_fd6.js +1 -0
- zenml/zen_server/dashboard/assets/stefan-B08Ftbba.webp +0 -0
- zenml/zen_server/dashboard/assets/templates-1S_8WeSK.webp +0 -0
- zenml/zen_server/dashboard/assets/tick-circle-BEX_Tp4v.js +1 -0
- zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
- zenml/zen_server/dashboard/assets/trash-arLUMWMS.js +1 -0
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-D9qYhfaN.js +1 -0
- zenml/zen_server/dashboard/assets/upgrade-form-CwRHBuXB.webp +0 -0
- zenml/zen_server/dashboard/assets/url-Dh93fvh0.js +1 -0
- zenml/zen_server/dashboard/assets/zod-BwEbpOxH.js +1 -0
- zenml/zen_server/dashboard/index.html +19 -1
- zenml/zen_server/deploy/__init__.py +7 -16
- zenml/zen_server/deploy/base_provider.py +49 -78
- zenml/zen_server/deploy/{local → daemon}/__init__.py +3 -3
- zenml/zen_server/deploy/{local/local_provider.py → daemon/daemon_provider.py} +48 -66
- zenml/zen_server/deploy/{local/local_zen_server.py → daemon/daemon_zen_server.py} +78 -62
- zenml/zen_server/deploy/deployer.py +94 -175
- zenml/zen_server/deploy/deployment.py +23 -17
- zenml/zen_server/deploy/docker/docker_provider.py +15 -31
- zenml/zen_server/deploy/docker/docker_zen_server.py +30 -35
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +3 -13
- zenml/zen_server/deploy/helm/templates/NOTES.txt +23 -7
- zenml/zen_server/deploy/helm/templates/_environment.tpl +175 -23
- zenml/zen_server/deploy/helm/templates/server-db-job.yaml +45 -18
- zenml/zen_server/deploy/helm/templates/server-db-pvc.yaml +25 -0
- zenml/zen_server/deploy/helm/templates/server-deployment.yaml +22 -6
- zenml/zen_server/deploy/helm/templates/server-secret.yaml +11 -10
- zenml/zen_server/deploy/helm/values.yaml +210 -28
- zenml/zen_server/exceptions.py +20 -1
- zenml/zen_server/feature_gate/__init__.py +13 -0
- zenml/zen_server/feature_gate/endpoint_utils.py +61 -0
- zenml/zen_server/feature_gate/feature_gate_interface.py +49 -0
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +125 -0
- zenml/zen_server/jwt.py +64 -32
- zenml/zen_server/rate_limit.py +200 -0
- zenml/zen_server/rbac/endpoint_utils.py +92 -9
- zenml/zen_server/rbac/models.py +21 -17
- zenml/zen_server/rbac/rbac_sql_zen_store.py +175 -0
- zenml/zen_server/rbac/utils.py +71 -30
- zenml/zen_server/rbac/zenml_cloud_rbac.py +13 -188
- zenml/zen_server/routers/actions_endpoints.py +324 -0
- zenml/zen_server/routers/artifact_version_endpoints.py +28 -2
- zenml/zen_server/routers/auth_endpoints.py +249 -131
- zenml/zen_server/routers/code_repositories_endpoints.py +1 -0
- zenml/zen_server/routers/devices_endpoints.py +56 -49
- zenml/zen_server/routers/event_source_endpoints.py +327 -0
- zenml/zen_server/routers/logs_endpoints.py +66 -0
- zenml/zen_server/routers/model_versions_endpoints.py +59 -0
- zenml/zen_server/routers/models_endpoints.py +7 -1
- zenml/zen_server/routers/pipeline_builds_endpoints.py +6 -1
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +35 -0
- zenml/zen_server/routers/pipelines_endpoints.py +19 -32
- zenml/zen_server/routers/plugin_endpoints.py +107 -0
- zenml/zen_server/routers/run_templates_endpoints.py +212 -0
- zenml/zen_server/routers/runs_endpoints.py +91 -32
- zenml/zen_server/routers/schedule_endpoints.py +1 -0
- zenml/zen_server/routers/secrets_endpoints.py +4 -2
- zenml/zen_server/routers/server_endpoints.py +186 -4
- zenml/zen_server/routers/service_connectors_endpoints.py +56 -0
- zenml/zen_server/routers/service_endpoints.py +180 -0
- zenml/zen_server/routers/stack_components_endpoints.py +2 -1
- zenml/zen_server/routers/stack_deployment_endpoints.py +164 -0
- zenml/zen_server/routers/steps_endpoints.py +21 -12
- zenml/zen_server/routers/triggers_endpoints.py +336 -0
- zenml/zen_server/routers/users_endpoints.py +280 -45
- zenml/zen_server/routers/webhook_endpoints.py +127 -0
- zenml/zen_server/routers/workspaces_endpoints.py +220 -185
- zenml/zen_server/secure_headers.py +120 -0
- zenml/{new → zen_server/template_execution}/__init__.py +1 -1
- zenml/zen_server/template_execution/runner_entrypoint_configuration.py +42 -0
- zenml/zen_server/template_execution/utils.py +474 -0
- zenml/zen_server/template_execution/workload_manager_interface.py +92 -0
- zenml/zen_server/utils.py +374 -74
- zenml/zen_server/zen_server_api.py +299 -52
- zenml/zen_stores/base_zen_store.py +90 -58
- zenml/zen_stores/migrations/alembic.py +22 -9
- zenml/zen_stores/migrations/env.py +2 -2
- zenml/zen_stores/migrations/utils.py +731 -0
- zenml/zen_stores/migrations/versions/0.21.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.21.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.22.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.23.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.30.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.31.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.31.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.32.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.32.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.33.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.34.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.35.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.35.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.36.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.36.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.37.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.38.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.39.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.39.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.2_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.3_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.41.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.42.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.42.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.43.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.2_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.3_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.1_release_0_45_1.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.2_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.3_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.4_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.5_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.6_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.46.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.46.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.47.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.50.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.51.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.52.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.53.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.53.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.54.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.54.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.55.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.55.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.3_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.4_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.5_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.3_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.4_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.0.rc1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.0.rc2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.58.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.58.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.58.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.60.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.62.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.63.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.64.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.65.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.66.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.67.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.70.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.72.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py +39 -0
- zenml/zen_stores/migrations/versions/03742aa7fdd7_add_secrets.py +1 -0
- zenml/zen_stores/migrations/versions/0701da9951a0_added_service_table.py +94 -0
- zenml/zen_stores/migrations/versions/0b06faa59c93_add_service_connectors.py +1 -0
- zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
- zenml/zen_stores/migrations/versions/0e4735b23577_increase_pipeline_spec_field_length.py +1 -0
- zenml/zen_stores/migrations/versions/1041bc644e0d_remove_secrets_manager.py +6 -3
- zenml/zen_stores/migrations/versions/10a907dad202_delete_mlmd_tables.py +2 -1
- zenml/zen_stores/migrations/versions/14d687c8fa1c_rename_model_config_to_model_version.py +1 -0
- zenml/zen_stores/migrations/versions/19f27d5b234e_add_build_and_deployment_tables.py +1 -0
- zenml/zen_stores/migrations/versions/1a9a9d2a836d_admin_users.py +56 -0
- zenml/zen_stores/migrations/versions/1ac1b9c04da1_make_secrets_values_optional.py +1 -0
- zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +99 -0
- zenml/zen_stores/migrations/versions/1d74e596abb8_add_run_once_start_time_to_schedule.py +36 -0
- zenml/zen_stores/migrations/versions/1d8f30c54477_migrate_to_new_.py +124 -0
- zenml/zen_stores/migrations/versions/248dfd320b68_update_size_of_flavor_config_schema.py +1 -0
- zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +228 -0
- zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
- zenml/zen_stores/migrations/versions/26b776ad583e_redesign_artifacts.py +9 -10
- zenml/zen_stores/migrations/versions/2d201872e23c_remove_db_dependency_loop.py +29 -0
- zenml/zen_stores/migrations/versions/37835ce041d2_optimizing_database.py +4 -3
- zenml/zen_stores/migrations/versions/389046140cad_data_versioning.py +1 -0
- zenml/zen_stores/migrations/versions/3944116bbd56_rename_project_to_workspace.py +1 -0
- zenml/zen_stores/migrations/versions/3b68abe58f44_add_model_watchtower_entities.py +1 -0
- zenml/zen_stores/migrations/versions/3c5a367730c2_add_environment_info_to_runs.py +1 -0
- zenml/zen_stores/migrations/versions/3dcc5d20e82f_add_last_user_activity.py +51 -0
- zenml/zen_stores/migrations/versions/43a86093b60e_add_labels_for_stack_components.py +1 -0
- zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +123 -0
- zenml/zen_stores/migrations/versions/479103df60b6_add_triggers.py +162 -0
- zenml/zen_stores/migrations/versions/4a3087070f4e_add_step_source_code.py +1 -0
- zenml/zen_stores/migrations/versions/4c41c0ca42db_add_code_repository_table.py +1 -0
- zenml/zen_stores/migrations/versions/4d688d8f7aff_rename_model_version_to_model.py +1 -0
- zenml/zen_stores/migrations/versions/4e1972485075_endpoint_artifact_deployment_artifact.py +1 -0
- zenml/zen_stores/migrations/versions/4f66af55fbb9_rename_model_config_model_to_model_.py +1 -0
- zenml/zen_stores/migrations/versions/5330ba58bf20_rename_tables_and_foreign_keys.py +8 -9
- zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +4 -2
- zenml/zen_stores/migrations/versions/5cc3f41cf048_add_save_models_to_registry.py +1 -0
- zenml/zen_stores/migrations/versions/6119cd9b93c2_tags_table.py +1 -0
- zenml/zen_stores/migrations/versions/623a234c11f5_add_sdk_docs_url_to_flavors.py +1 -0
- zenml/zen_stores/migrations/versions/6917bce75069_add_pipeline_run_unique_constraint.py +5 -4
- zenml/zen_stores/migrations/versions/6a28c4fd0ef2_add_caching_info.py +1 -0
- zenml/zen_stores/migrations/versions/6f707b385dc1_fix_model_artifacts.py +1 -0
- zenml/zen_stores/migrations/versions/722392c91006_make_is_service_account_mandatory.py +1 -0
- zenml/zen_stores/migrations/versions/72675226b2de_unique_users.py +31 -0
- zenml/zen_stores/migrations/versions/72722dee4686_track_server_version.py +1 -0
- zenml/zen_stores/migrations/versions/7280c14811d6_use_text_type.py +1 -0
- zenml/zen_stores/migrations/versions/728c6369cfaa_add_name_column_to_input_artifact_pk.py +4 -2
- zenml/zen_stores/migrations/versions/729263e47b55_fix_external_input_artifacts.py +1 -0
- zenml/zen_stores/migrations/versions/743ec82b1b3c_update_size_of_build_images.py +3 -2
- zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +4 -2
- zenml/zen_stores/migrations/versions/76a7b9451ccd_add_build_template_deployment_id.py +52 -0
- zenml/zen_stores/migrations/versions/7834208cc3f6_artifact_project_scoping.py +9 -7
- zenml/zen_stores/migrations/versions/7b651bf6822e_track_secrets_in_db.py +7 -7
- zenml/zen_stores/migrations/versions/7d1919bb1ef0_add_run_templates.py +100 -0
- zenml/zen_stores/migrations/versions/7e4a481d17f7_add_identity_table.py +3 -2
- zenml/zen_stores/migrations/versions/7f603e583dd7_fixed_migration.py +2 -1
- zenml/zen_stores/migrations/versions/86fa52918b54_remove_teams_and_roles.py +1 -0
- zenml/zen_stores/migrations/versions/8a64fbfecda0_add_num_outputs_to_run_step.py +1 -0
- zenml/zen_stores/migrations/versions/8ed03137cacc_polymorthic_run_metadata.py +1 -0
- zenml/zen_stores/migrations/versions/904464ea4041_add_pipeline_model_run_unique_constraints.py +192 -0
- zenml/zen_stores/migrations/versions/909550c7c4da_remove_user_hub_token.py +36 -0
- zenml/zen_stores/migrations/versions/93cbda80a732_add_service_accounts.py +1 -0
- zenml/zen_stores/migrations/versions/979eff8fc4b1_add_code_repo_description_and_logo_url.py +1 -0
- zenml/zen_stores/migrations/versions/9971237fa937_artifact_visualizations.py +1 -0
- zenml/zen_stores/migrations/versions/9d8020441014_increase_step_configuration_length.py +1 -0
- zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
- zenml/zen_stores/migrations/versions/a39c4184c8ce_remove_secrets_manager_flavors.py +3 -2
- zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +5 -4
- zenml/zen_stores/migrations/versions/ade72effebaf_added_logs_table.py +1 -0
- zenml/zen_stores/migrations/versions/alembic_start.py +2 -1
- zenml/zen_stores/migrations/versions/b4eccf34dfa3_add_hub_token_to_user_model.py +1 -0
- zenml/zen_stores/migrations/versions/b4fca5241eea_migrate_onboarding_state.py +167 -0
- zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +33 -0
- zenml/zen_stores/migrations/versions/b59aa68fdb1f_simplify_pipelines.py +139 -0
- zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
- zenml/zen_stores/migrations/versions/bf2120261b5a_add_configured_model_version_id.py +74 -0
- zenml/zen_stores/migrations/versions/c1b18cec3a48_increase_length_on_flavor_config_schema.py +1 -0
- zenml/zen_stores/migrations/versions/c22561cbb3a9_add_artifact_unique_constraints.py +86 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
- zenml/zen_stores/migrations/versions/cc9894cb58aa_add_user_metadata.py +41 -0
- zenml/zen_stores/migrations/versions/ccd68b7825ae_add_status_to_pipeline_and_step_run.py +1 -0
- zenml/zen_stores/migrations/versions/d02b3d3464cf_add_orchestrator_run_id_column.py +1 -0
- zenml/zen_stores/migrations/versions/d26471b6fe8f_update_build_filtering.py +1 -0
- zenml/zen_stores/migrations/versions/d7b3acf9aa46_create_schedule_table.py +1 -0
- zenml/zen_stores/migrations/versions/e1d66d91a099_add_stack_and_component_spec_paths_to_.py +1 -0
- zenml/zen_stores/migrations/versions/e5225281b4d3_add_connector_skew_tolerance.py +1 -0
- zenml/zen_stores/migrations/versions/e65aa6708ff7_pipeline_versioning.py +1 -0
- zenml/zen_stores/migrations/versions/ec0d785ca296_create_run_metadata_table.py +1 -0
- zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +119 -0
- zenml/zen_stores/migrations/versions/f3b3964e3a0f_add_oauth_devices.py +1 -0
- zenml/zen_stores/migrations/versions/f49904a80aa7_increase_length_of_artifact_table_sources.py +1 -0
- zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py +5 -4
- zenml/zen_stores/rest_zen_store.py +1326 -305
- zenml/zen_stores/schemas/__init__.py +22 -3
- zenml/zen_stores/schemas/action_schemas.py +192 -0
- zenml/zen_stores/schemas/api_key_schemas.py +23 -10
- zenml/zen_stores/schemas/artifact_schemas.py +112 -49
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +17 -8
- zenml/zen_stores/schemas/base_schemas.py +27 -0
- zenml/zen_stores/schemas/code_repository_schemas.py +25 -10
- zenml/zen_stores/schemas/component_schemas.py +74 -11
- zenml/zen_stores/schemas/constants.py +16 -0
- zenml/zen_stores/schemas/device_schemas.py +29 -15
- zenml/zen_stores/schemas/event_source_schemas.py +188 -0
- zenml/zen_stores/schemas/flavor_schemas.py +19 -9
- zenml/zen_stores/schemas/logs_schemas.py +12 -6
- zenml/zen_stores/schemas/model_schemas.py +192 -139
- zenml/zen_stores/schemas/pipeline_build_schemas.py +16 -16
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +58 -17
- zenml/zen_stores/schemas/pipeline_run_schemas.py +170 -35
- zenml/zen_stores/schemas/pipeline_schemas.py +51 -33
- zenml/zen_stores/schemas/run_metadata_schemas.py +28 -78
- zenml/zen_stores/schemas/run_template_schemas.py +267 -0
- zenml/zen_stores/schemas/schedule_schema.py +15 -5
- zenml/zen_stores/schemas/secret_schemas.py +18 -10
- zenml/zen_stores/schemas/server_settings_schemas.py +129 -0
- zenml/zen_stores/schemas/service_connector_schemas.py +13 -6
- zenml/zen_stores/schemas/service_schemas.py +258 -0
- zenml/zen_stores/schemas/stack_schemas.py +23 -6
- zenml/zen_stores/schemas/step_run_schemas.py +132 -41
- zenml/zen_stores/schemas/tag_schemas.py +31 -50
- zenml/zen_stores/schemas/trigger_schemas.py +316 -0
- zenml/zen_stores/schemas/user_schemas.py +66 -23
- zenml/zen_stores/schemas/utils.py +112 -0
- zenml/zen_stores/schemas/workspace_schemas.py +36 -19
- zenml/zen_stores/secrets_stores/aws_secrets_store.py +41 -32
- zenml/zen_stores/secrets_stores/azure_secrets_store.py +20 -23
- zenml/zen_stores/secrets_stores/base_secrets_store.py +80 -12
- zenml/zen_stores/secrets_stores/gcp_secrets_store.py +42 -33
- zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +7 -11
- zenml/zen_stores/secrets_stores/secrets_store_interface.py +1 -0
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +15 -8
- zenml/zen_stores/secrets_stores/sql_secrets_store.py +8 -9
- zenml/zen_stores/sql_zen_store.py +4062 -799
- zenml/zen_stores/template_utils.py +263 -0
- zenml/zen_stores/zen_store_interface.py +614 -44
- zenml_nightly-0.72.0.dev20250116.dist-info/METADATA +486 -0
- zenml_nightly-0.72.0.dev20250116.dist-info/RECORD +1294 -0
- {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/WHEEL +1 -1
- CLA.md +0 -110
- CODE-OF-CONDUCT.md +0 -132
- CONTRIBUTING.md +0 -260
- README.md +0 -304
- RELEASE_NOTES.md +0 -3919
- ROADMAP.md +0 -5
- SECURITY.md +0 -15
- zenml/_hub/client.py +0 -285
- zenml/_hub/constants.py +0 -21
- zenml/_hub/utils.py +0 -80
- zenml/api.py +0 -61
- zenml/cli/hub.py +0 -1115
- zenml/cli/stack_recipes.py +0 -469
- zenml/integrations/gcp/google_cloud_function.py +0 -187
- zenml/integrations/gcp/google_cloud_scheduler.py +0 -83
- zenml/integrations/gcp/orchestrators/vertex_scheduler/main.py +0 -91
- zenml/integrations/gcp/orchestrators/vertex_scheduler/requirements.txt +0 -2
- zenml/integrations/kserve/__init__.py +0 -57
- zenml/integrations/kserve/custom_deployer/zenml_custom_model.py +0 -175
- zenml/integrations/kserve/flavors/kserve_model_deployer_flavor.py +0 -137
- zenml/integrations/kserve/model_deployers/kserve_model_deployer.py +0 -1003
- zenml/integrations/kserve/secret_schemas/secret_schemas.py +0 -65
- zenml/integrations/kserve/services/kserve_deployment.py +0 -596
- zenml/integrations/kserve/steps/__init__.py +0 -22
- zenml/integrations/kserve/steps/kserve_deployer.py +0 -472
- zenml/integrations/kserve/steps/kserve_step_utils.py +0 -293
- zenml/integrations/kubeflow/utils.py +0 -96
- zenml/lineage_graph/lineage_graph.py +0 -244
- zenml/lineage_graph/node/artifact_node.py +0 -52
- zenml/lineage_graph/node/step_node.py +0 -41
- zenml/models/v2/base/internal.py +0 -37
- zenml/models/v2/base/update.py +0 -40
- zenml/models/v2/misc/hub_plugin_models.py +0 -79
- zenml/new/pipelines/deserialization_utils.py +0 -291
- zenml/new/pipelines/model_utils.py +0 -72
- zenml/new/pipelines/pipeline_decorator.py +0 -109
- zenml/new/steps/step_decorator.py +0 -160
- zenml/pipelines/base_pipeline.py +0 -274
- zenml/post_execution/pipeline.py +0 -58
- zenml/post_execution/pipeline_run.py +0 -55
- zenml/services/service_registry.py +0 -214
- zenml/services/terraform/__init__.py +0 -14
- zenml/services/terraform/terraform_service.py +0 -441
- zenml/steps/step_environment.py +0 -108
- zenml/steps/step_output.py +0 -36
- zenml/utils/mlstacks_utils.py +0 -635
- zenml/utils/terraform_utils.py +0 -42
- zenml/zen_server/dashboard/_redirects +0 -1
- zenml/zen_server/dashboard/asset-manifest.json +0 -131
- zenml/zen_server/dashboard/manifest.json +0 -25
- zenml/zen_server/dashboard/precache-manifest.c139638dcc4d9d3425353266447a2fad.js +0 -462
- zenml/zen_server/dashboard/robots.txt +0 -2
- zenml/zen_server/dashboard/service-worker.js +0 -39
- zenml/zen_server/dashboard/static/css/2.5b37d44a.chunk.css +0 -16
- zenml/zen_server/dashboard/static/css/2.5b37d44a.chunk.css.map +0 -1
- zenml/zen_server/dashboard/static/css/main.77e46c35.chunk.css +0 -2
- zenml/zen_server/dashboard/static/css/main.77e46c35.chunk.css.map +0 -1
- zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js +0 -3
- zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js.LICENSE.txt +0 -95
- zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js.map +0 -1
- zenml/zen_server/dashboard/static/js/main.270838b4.chunk.js +0 -2
- zenml/zen_server/dashboard/static/js/main.270838b4.chunk.js.map +0 -1
- zenml/zen_server/dashboard/static/js/runtime-main.bfca2edd.js +0 -2
- zenml/zen_server/dashboard/static/js/runtime-main.bfca2edd.js.map +0 -1
- zenml/zen_server/dashboard/static/media/AlertTriangle.28aee535.svg +0 -5
- zenml/zen_server/dashboard/static/media/ArrowSquareOut.abfb9bc7.svg +0 -5
- zenml/zen_server/dashboard/static/media/Back.86c23a22.svg +0 -4
- zenml/zen_server/dashboard/static/media/BookOpen.5cb101ff.svg +0 -4
- zenml/zen_server/dashboard/static/media/BoundingBox.1eb98717.svg +0 -10
- zenml/zen_server/dashboard/static/media/Burger.9b1c67d7.svg +0 -3
- zenml/zen_server/dashboard/static/media/Cached.2381fb8d.svg +0 -1
- zenml/zen_server/dashboard/static/media/Calendar.356e11c7.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChartBarHorizontal.0247447b.svg +0 -6
- zenml/zen_server/dashboard/static/media/ChartLine.0d79e18d.svg +0 -4
- zenml/zen_server/dashboard/static/media/ChatDots.2e1c9211.svg +0 -6
- zenml/zen_server/dashboard/static/media/Check.dad6beb2.svg +0 -3
- zenml/zen_server/dashboard/static/media/CheckCircleFilled.c19566d0.svg +0 -3
- zenml/zen_server/dashboard/static/media/Checkbox.af50e31e.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChevronDown.f860ce32.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChevronDownLight.6642d756.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChevronLeft.f6edfcdb.svg +0 -3
- zenml/zen_server/dashboard/static/media/CircleCheck.f98fd6ca.svg +0 -1
- zenml/zen_server/dashboard/static/media/Clock.ffc9de95.svg +0 -3
- zenml/zen_server/dashboard/static/media/Close.74e9efbc.svg +0 -5
- zenml/zen_server/dashboard/static/media/CloseWithBorder.6960930a.svg +0 -3
- zenml/zen_server/dashboard/static/media/CloseWithoutBorder.cd6f71df.svg +0 -3
- zenml/zen_server/dashboard/static/media/CloudArrowUp.0aecb235.svg +0 -6
- zenml/zen_server/dashboard/static/media/Code.ef0f33b5.svg +0 -3
- zenml/zen_server/dashboard/static/media/Config.0be63f8a.svg +0 -1
- zenml/zen_server/dashboard/static/media/Connector.9fd46ef1.svg +0 -10
- zenml/zen_server/dashboard/static/media/Copy.36e2112a.svg +0 -1
- zenml/zen_server/dashboard/static/media/Dashboard.d05787e0.svg +0 -3
- zenml/zen_server/dashboard/static/media/Data.b1c3b5f8.svg +0 -3
- zenml/zen_server/dashboard/static/media/Delete.3c361b28.svg +0 -8
- zenml/zen_server/dashboard/static/media/Docs.7541d478.svg +0 -7
- zenml/zen_server/dashboard/static/media/Download.fba04d87.svg +0 -5
- zenml/zen_server/dashboard/static/media/Edit.490eb294.svg +0 -6
- zenml/zen_server/dashboard/static/media/EmptyRightArrow.23749d01.svg +0 -3
- zenml/zen_server/dashboard/static/media/Example.6396cd37.svg +0 -5
- zenml/zen_server/dashboard/static/media/Extension.1394cd4a.svg +0 -3
- zenml/zen_server/dashboard/static/media/Eye.d9e4ee62.svg +0 -4
- zenml/zen_server/dashboard/static/media/Failed.0213c1a0.svg +0 -1
- zenml/zen_server/dashboard/static/media/FileText.1f15bacd.svg +0 -7
- zenml/zen_server/dashboard/static/media/Filter.ab6b9c0d.svg +0 -3
- zenml/zen_server/dashboard/static/media/Folders.12b29887.svg +0 -5
- zenml/zen_server/dashboard/static/media/FunnelFill.6df4c143.svg +0 -3
- zenml/zen_server/dashboard/static/media/GitCommit.7dd9c2aa.svg +0 -5
- zenml/zen_server/dashboard/static/media/GitHub_Logo.cefc2023.png +0 -0
- zenml/zen_server/dashboard/static/media/Graph.2c63a892.svg +0 -11
- zenml/zen_server/dashboard/static/media/History.08329240.svg +0 -3
- zenml/zen_server/dashboard/static/media/Home.0843b0d5.svg +0 -3
- zenml/zen_server/dashboard/static/media/ImageBuilder.ea762d9c.svg +0 -6
- zenml/zen_server/dashboard/static/media/InProgress.304a0edc.svg +0 -1
- zenml/zen_server/dashboard/static/media/Info.9fe10c5c.svg +0 -3
- zenml/zen_server/dashboard/static/media/KeyboardReturn.491afbe3.svg +0 -3
- zenml/zen_server/dashboard/static/media/Link.72bbb55d.svg +0 -4
- zenml/zen_server/dashboard/static/media/Lock.30f5e1fe.svg +0 -5
- zenml/zen_server/dashboard/static/media/Lock2.a769ea52.svg +0 -3
- zenml/zen_server/dashboard/static/media/LockKey.92f21621.svg +0 -6
- zenml/zen_server/dashboard/static/media/Logs.8bf4d005.svg +0 -5
- zenml/zen_server/dashboard/static/media/MinusCircle.4188f418.svg +0 -4
- zenml/zen_server/dashboard/static/media/ModelRegistry.f0de050a.svg +0 -6
- zenml/zen_server/dashboard/static/media/MultiUser.a2ba7c67.svg +0 -10
- zenml/zen_server/dashboard/static/media/PaginationFirst.92628634.svg +0 -4
- zenml/zen_server/dashboard/static/media/PaginationLast.00d3c732.svg +0 -4
- zenml/zen_server/dashboard/static/media/PaginationNext.86158845.svg +0 -3
- zenml/zen_server/dashboard/static/media/PaginationPrev.60c18a88.svg +0 -3
- zenml/zen_server/dashboard/static/media/Pen.f2d831d4.svg +0 -6
- zenml/zen_server/dashboard/static/media/PhotoCamera.179d6d4c.svg +0 -3
- zenml/zen_server/dashboard/static/media/Pipeline.30d298b0.svg +0 -7
- zenml/zen_server/dashboard/static/media/Plus.5aa1c16b.svg +0 -3
- zenml/zen_server/dashboard/static/media/PlusCircle.92d860dd.svg +0 -5
- zenml/zen_server/dashboard/static/media/Repositories.71a36b8c.svg +0 -3
- zenml/zen_server/dashboard/static/media/RightArrow.f30d3871.svg +0 -29
- zenml/zen_server/dashboard/static/media/Rocket.63bf7b9d.svg +0 -3
- zenml/zen_server/dashboard/static/media/RocketLaunch.1bff2b59.svg +0 -6
- zenml/zen_server/dashboard/static/media/Rubik-Medium.c87313aa.ttf +0 -0
- zenml/zen_server/dashboard/static/media/Rubik-Regular.b3d0902b.ttf +0 -0
- zenml/zen_server/dashboard/static/media/Run.daec4fb2.svg +0 -6
- zenml/zen_server/dashboard/static/media/Search.d1afcce5.svg +0 -4
- zenml/zen_server/dashboard/static/media/Settings.59ca73ae.svg +0 -4
- zenml/zen_server/dashboard/static/media/Share2.46c3ff66.svg +0 -3
- zenml/zen_server/dashboard/static/media/SignOut.6aa718c5.svg +0 -3
- zenml/zen_server/dashboard/static/media/SimplePlus.5cf7ec20.svg +0 -3
- zenml/zen_server/dashboard/static/media/SingleUser.bef3a095.svg +0 -4
- zenml/zen_server/dashboard/static/media/SourceCodePro-Regular.b484b32f.ttf +0 -0
- zenml/zen_server/dashboard/static/media/Stack.19b604ac.svg +0 -5
- zenml/zen_server/dashboard/static/media/StackComponent.b1ba90b5.svg +0 -4
- zenml/zen_server/dashboard/static/media/Star.f0c25022.svg +0 -9
- zenml/zen_server/dashboard/static/media/StarOutline.94ca8cd9.svg +0 -3
- zenml/zen_server/dashboard/static/media/Storefront.4b4796fe.svg +0 -3
- zenml/zen_server/dashboard/static/media/Stream.543e3039.svg +0 -3
- zenml/zen_server/dashboard/static/media/SupportAgent.510ddf1f.svg +0 -8
- zenml/zen_server/dashboard/static/media/Table.77033750.svg +0 -6
- zenml/zen_server/dashboard/static/media/Tool.d5785486.svg +0 -3
- zenml/zen_server/dashboard/static/media/UserPlus.741a99d7.svg +0 -6
- zenml/zen_server/dashboard/static/media/Verified.0625b2a0.svg +0 -3
- zenml/zen_server/dashboard/static/media/addNew.4fb6c939.svg +0 -8
- zenml/zen_server/dashboard/static/media/arrowClose.cbd53f3f.svg +0 -3
- zenml/zen_server/dashboard/static/media/arrowOpen.6ceef0af.svg +0 -3
- zenml/zen_server/dashboard/static/media/check_small.30bc0138.svg +0 -3
- zenml/zen_server/dashboard/static/media/circleArrowSideClose.98d6013e.svg +0 -18
- zenml/zen_server/dashboard/static/media/circleArrowSideOpen.63653df6.svg +0 -18
- zenml/zen_server/dashboard/static/media/image.104fd14b.png +0 -0
- zenml/zen_server/dashboard/static/media/imageAddIcon.e83004a9.svg +0 -7
- zenml/zen_server/dashboard/static/media/logo.93333e5c.svg +0 -1
- zenml/zen_server/dashboard/static/media/logo_small.4204397d.svg +0 -3
- zenml/zen_server/dashboard/static/media/logo_white.d4b4414e.svg +0 -20
- zenml/zen_server/dashboard/static/media/notConnected.5e2c8ea7.svg +0 -8
- zenml/zen_server/dashboard/static/media/plugin-fallback.72c294e6.svg +0 -6
- zenml/zen_server/dashboard/static/media/share.bcd998b0.svg +0 -5
- zenml/zen_server/dashboard/static/media/stars.08a9b19a.svg +0 -8
- zenml/zen_server/deploy/terraform/__init__.py +0 -41
- zenml/zen_server/deploy/terraform/providers/__init__.py +0 -14
- zenml/zen_server/deploy/terraform/providers/aws_provider.py +0 -61
- zenml/zen_server/deploy/terraform/providers/azure_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/gcp_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/terraform_provider.py +0 -332
- zenml/zen_server/deploy/terraform/recipes/aws/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/aws/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/aws/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/aws/outputs.tf +0 -14
- zenml/zen_server/deploy/terraform/recipes/aws/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/aws/sql.tf +0 -62
- zenml/zen_server/deploy/terraform/recipes/aws/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/aws/variables.tf +0 -179
- zenml/zen_server/deploy/terraform/recipes/aws/vpc.tf +0 -47
- zenml/zen_server/deploy/terraform/recipes/aws/zen_server.tf +0 -111
- zenml/zen_server/deploy/terraform/recipes/azure/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/azure/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/azure/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/azure/key_vault.tf +0 -73
- zenml/zen_server/deploy/terraform/recipes/azure/outputs.tf +0 -14
- zenml/zen_server/deploy/terraform/recipes/azure/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/azure/rg.tf +0 -36
- zenml/zen_server/deploy/terraform/recipes/azure/sql.tf +0 -65
- zenml/zen_server/deploy/terraform/recipes/azure/terraform.tf +0 -52
- zenml/zen_server/deploy/terraform/recipes/azure/variables.tf +0 -188
- zenml/zen_server/deploy/terraform/recipes/azure/zen_server.tf +0 -111
- zenml/zen_server/deploy/terraform/recipes/gcp/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/gcp/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/gcp/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/gcp/outputs.tf +0 -14
- zenml/zen_server/deploy/terraform/recipes/gcp/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/gcp/sql.tf +0 -64
- zenml/zen_server/deploy/terraform/recipes/gcp/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/gcp/variables.tf +0 -183
- zenml/zen_server/deploy/terraform/recipes/gcp/zen_server.tf +0 -122
- zenml/zen_server/deploy/terraform/terraform_zen_server.py +0 -255
- zenml/zen_server/routers/run_metadata_endpoints.py +0 -97
- zenml_nightly-0.55.0.dev20240124.dist-info/METADATA +0 -438
- zenml_nightly-0.55.0.dev20240124.dist-info/RECORD +0 -1072
- {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/entry_points.txt +0 -0
zenml/cli/utils.py
CHANGED
@@ -12,10 +12,12 @@
|
|
12
12
|
# or implied. See the License for the specific language governing
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Utility functions for the CLI."""
|
15
|
+
|
15
16
|
import contextlib
|
16
17
|
import datetime
|
17
18
|
import json
|
18
19
|
import os
|
20
|
+
import platform
|
19
21
|
import re
|
20
22
|
import subprocess
|
21
23
|
import sys
|
@@ -38,22 +40,23 @@ from typing import (
|
|
38
40
|
)
|
39
41
|
|
40
42
|
import click
|
43
|
+
import pkg_resources
|
41
44
|
import yaml
|
42
45
|
from pydantic import BaseModel, SecretStr
|
43
46
|
from rich import box, table
|
47
|
+
from rich.console import Console
|
44
48
|
from rich.emoji import Emoji, NoEmoji
|
45
49
|
from rich.markdown import Markdown
|
46
50
|
from rich.markup import escape
|
47
|
-
from rich.prompt import Confirm
|
51
|
+
from rich.prompt import Confirm, Prompt
|
48
52
|
from rich.style import Style
|
53
|
+
from rich.table import Table
|
49
54
|
|
50
55
|
from zenml.client import Client
|
51
56
|
from zenml.console import console, zenml_style_defaults
|
52
57
|
from zenml.constants import (
|
53
58
|
FILTERING_DATETIME_FORMAT,
|
54
59
|
IS_DEBUG_ENV,
|
55
|
-
NOT_INSTALLED_MESSAGE,
|
56
|
-
TERRAFORM_NOT_INSTALLED_MESSAGE,
|
57
60
|
)
|
58
61
|
from zenml.enums import GenericFilterOps, StackComponentType
|
59
62
|
from zenml.logger import get_logger
|
@@ -63,18 +66,19 @@ from zenml.model_registries.base_model_registry import (
|
|
63
66
|
)
|
64
67
|
from zenml.models import (
|
65
68
|
BaseFilter,
|
66
|
-
|
69
|
+
BaseIdentifiedResponse,
|
67
70
|
BoolFilter,
|
68
71
|
NumericFilter,
|
69
72
|
Page,
|
73
|
+
ServiceConnectorRequirements,
|
70
74
|
StrFilter,
|
71
75
|
UUIDFilter,
|
72
76
|
)
|
77
|
+
from zenml.models.v2.base.filter import FilterGenerator
|
73
78
|
from zenml.services import BaseService, ServiceState
|
74
79
|
from zenml.stack import StackComponent
|
75
80
|
from zenml.stack.stack_component import StackComponentConfig
|
76
81
|
from zenml.utils import secret_utils
|
77
|
-
from zenml.zen_server.deploy import ServerDeployment
|
78
82
|
|
79
83
|
if TYPE_CHECKING:
|
80
84
|
from uuid import UUID
|
@@ -103,7 +107,7 @@ logger = get_logger(__name__)
|
|
103
107
|
MAX_ARGUMENT_VALUE_SIZE = 10240
|
104
108
|
|
105
109
|
|
106
|
-
T = TypeVar("T", bound=
|
110
|
+
T = TypeVar("T", bound=BaseIdentifiedResponse) # type: ignore[type-arg]
|
107
111
|
|
108
112
|
|
109
113
|
def title(text: str) -> None:
|
@@ -218,6 +222,8 @@ def print_table(
|
|
218
222
|
caption: Caption of the table.
|
219
223
|
columns: Optional column configurations to be used in the table.
|
220
224
|
"""
|
225
|
+
from rich.text import Text
|
226
|
+
|
221
227
|
column_keys = {key: None for dict_ in obj for key in dict_}
|
222
228
|
column_names = [columns.get(key, key.upper()) for key in column_keys]
|
223
229
|
rich_table = table.Table(
|
@@ -236,10 +242,19 @@ def print_table(
|
|
236
242
|
if key is None:
|
237
243
|
values.append(None)
|
238
244
|
else:
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
245
|
+
v = dict_.get(key) or " "
|
246
|
+
if isinstance(v, str) and (
|
247
|
+
v.startswith("http://") or v.startswith("https://")
|
248
|
+
):
|
249
|
+
# Display the URL as a hyperlink in a way that doesn't break
|
250
|
+
# the URL when it needs to be wrapped over multiple lines
|
251
|
+
value: Union[str, Text] = Text(v, style=f"link {v}")
|
252
|
+
else:
|
253
|
+
value = str(v)
|
254
|
+
# Escape text when square brackets are used, but allow
|
255
|
+
# links to be decorated as rich style links
|
256
|
+
if "[" in value and "[link=" not in value:
|
257
|
+
value = escape(value)
|
243
258
|
values.append(value)
|
244
259
|
rich_table.add_row(*values)
|
245
260
|
if len(rich_table.columns) > 1:
|
@@ -253,6 +268,7 @@ def print_pydantic_models(
|
|
253
268
|
exclude_columns: Optional[List[str]] = None,
|
254
269
|
active_models: Optional[List[T]] = None,
|
255
270
|
show_active: bool = False,
|
271
|
+
rename_columns: Dict[str, str] = {},
|
256
272
|
) -> None:
|
257
273
|
"""Prints the list of Pydantic models in a table.
|
258
274
|
|
@@ -265,6 +281,7 @@ def print_pydantic_models(
|
|
265
281
|
active_models: Optional list of active models of the given type T.
|
266
282
|
show_active: Flag to decide whether to append the active model on the
|
267
283
|
top of the list.
|
284
|
+
rename_columns: Optional dictionary to rename columns.
|
268
285
|
"""
|
269
286
|
if exclude_columns is None:
|
270
287
|
exclude_columns = list()
|
@@ -285,32 +302,34 @@ def print_pydantic_models(
|
|
285
302
|
"""
|
286
303
|
# Explicitly defined columns take precedence over exclude columns
|
287
304
|
if not columns:
|
288
|
-
if isinstance(model,
|
305
|
+
if isinstance(model, BaseIdentifiedResponse):
|
289
306
|
include_columns = ["id"]
|
290
307
|
|
291
|
-
if "name" in model.
|
308
|
+
if "name" in model.model_fields:
|
292
309
|
include_columns.append("name")
|
293
310
|
|
294
311
|
include_columns.extend(
|
295
312
|
[
|
296
313
|
k
|
297
|
-
for k in model.
|
298
|
-
"body"
|
299
|
-
].type_.__fields__.keys()
|
300
|
-
if k not in exclude_columns
|
301
|
-
]
|
302
|
-
+ [
|
303
|
-
k
|
304
|
-
for k in model.__fields__[
|
305
|
-
"metadata"
|
306
|
-
].type_.__fields__.keys()
|
314
|
+
for k in model.get_body().model_fields.keys()
|
307
315
|
if k not in exclude_columns
|
308
316
|
]
|
309
317
|
)
|
310
318
|
|
319
|
+
if model.metadata is not None:
|
320
|
+
include_columns.extend(
|
321
|
+
[
|
322
|
+
k
|
323
|
+
for k in model.get_metadata().model_fields.keys()
|
324
|
+
if k not in exclude_columns
|
325
|
+
]
|
326
|
+
)
|
327
|
+
|
311
328
|
else:
|
312
329
|
include_columns = [
|
313
|
-
k
|
330
|
+
k
|
331
|
+
for k in model.model_dump().keys()
|
332
|
+
if k not in exclude_columns
|
314
333
|
]
|
315
334
|
else:
|
316
335
|
include_columns = columns
|
@@ -319,11 +338,13 @@ def print_pydantic_models(
|
|
319
338
|
|
320
339
|
for k in include_columns:
|
321
340
|
value = getattr(model, k)
|
341
|
+
if k in rename_columns:
|
342
|
+
k = rename_columns[k]
|
322
343
|
# In case the response model contains nested `BaseResponse`s
|
323
344
|
# we want to attempt to represent them by name, if they contain
|
324
345
|
# such a field, else the id is used
|
325
|
-
if isinstance(value,
|
326
|
-
if "name" in value.
|
346
|
+
if isinstance(value, BaseIdentifiedResponse):
|
347
|
+
if "name" in value.model_fields:
|
327
348
|
items[k] = str(getattr(value, "name"))
|
328
349
|
else:
|
329
350
|
items[k] = str(value.id)
|
@@ -332,8 +353,8 @@ def print_pydantic_models(
|
|
332
353
|
# the list and extract either name or id
|
333
354
|
elif isinstance(value, list):
|
334
355
|
for v in value:
|
335
|
-
if isinstance(v,
|
336
|
-
if "name" in v.
|
356
|
+
if isinstance(v, BaseIdentifiedResponse):
|
357
|
+
if "name" in v.model_fields:
|
337
358
|
items.setdefault(k, []).append(
|
338
359
|
str(getattr(v, "name"))
|
339
360
|
)
|
@@ -343,6 +364,7 @@ def print_pydantic_models(
|
|
343
364
|
items[k] = [str(v) for v in value]
|
344
365
|
else:
|
345
366
|
items[k] = str(value)
|
367
|
+
|
346
368
|
# prepend an active marker if a function to mark active was passed
|
347
369
|
if not active_models and not show_active:
|
348
370
|
return items
|
@@ -352,9 +374,11 @@ def print_pydantic_models(
|
|
352
374
|
marker = "current"
|
353
375
|
if active_models is not None and show_active_column:
|
354
376
|
return {
|
355
|
-
marker:
|
356
|
-
|
357
|
-
|
377
|
+
marker: (
|
378
|
+
":point_right:"
|
379
|
+
if any(model.id == a.id for a in active_models)
|
380
|
+
else ""
|
381
|
+
),
|
358
382
|
**items,
|
359
383
|
}
|
360
384
|
|
@@ -418,30 +442,34 @@ def print_pydantic_model(
|
|
418
442
|
exclude_columns = set()
|
419
443
|
|
420
444
|
if not columns:
|
421
|
-
if isinstance(model,
|
445
|
+
if isinstance(model, BaseIdentifiedResponse):
|
422
446
|
include_columns = ["id"]
|
423
447
|
|
424
|
-
if "name" in model.
|
448
|
+
if "name" in model.model_fields:
|
425
449
|
include_columns.append("name")
|
426
450
|
|
427
451
|
include_columns.extend(
|
428
452
|
[
|
429
453
|
k
|
430
|
-
for k in model.
|
431
|
-
if k not in exclude_columns
|
432
|
-
]
|
433
|
-
+ [
|
434
|
-
k
|
435
|
-
for k in model.__fields__[
|
436
|
-
"metadata"
|
437
|
-
].type_.__fields__.keys()
|
454
|
+
for k in model.get_body().model_fields.keys()
|
438
455
|
if k not in exclude_columns
|
439
456
|
]
|
440
457
|
)
|
441
458
|
|
459
|
+
if model.metadata is not None:
|
460
|
+
include_columns.extend(
|
461
|
+
[
|
462
|
+
k
|
463
|
+
for k in model.get_metadata().model_fields.keys()
|
464
|
+
if k not in exclude_columns
|
465
|
+
]
|
466
|
+
)
|
467
|
+
|
442
468
|
else:
|
443
469
|
include_columns = [
|
444
|
-
k
|
470
|
+
k
|
471
|
+
for k in model.model_dump().keys()
|
472
|
+
if k not in exclude_columns
|
445
473
|
]
|
446
474
|
else:
|
447
475
|
include_columns = list(columns)
|
@@ -450,8 +478,8 @@ def print_pydantic_model(
|
|
450
478
|
|
451
479
|
for k in include_columns:
|
452
480
|
value = getattr(model, k)
|
453
|
-
if isinstance(value,
|
454
|
-
if "name" in value.
|
481
|
+
if isinstance(value, BaseIdentifiedResponse):
|
482
|
+
if "name" in value.model_fields:
|
455
483
|
items[k] = str(getattr(value, "name"))
|
456
484
|
else:
|
457
485
|
items[k] = str(value.id)
|
@@ -460,8 +488,8 @@ def print_pydantic_model(
|
|
460
488
|
# the list and extract either name or id
|
461
489
|
elif isinstance(value, list):
|
462
490
|
for v in value:
|
463
|
-
if isinstance(v,
|
464
|
-
if "name" in v.
|
491
|
+
if isinstance(v, BaseIdentifiedResponse):
|
492
|
+
if "name" in v.model_fields:
|
465
493
|
items.setdefault(k, []).append(str(getattr(v, "name")))
|
466
494
|
else:
|
467
495
|
items.setdefault(k, []).append(str(v.id))
|
@@ -508,43 +536,6 @@ def format_integration_list(
|
|
508
536
|
return list_of_dicts
|
509
537
|
|
510
538
|
|
511
|
-
def print_stack_outputs(stack: "StackResponse") -> None:
|
512
|
-
"""Prints outputs for stacks deployed with mlstacks.
|
513
|
-
|
514
|
-
Args:
|
515
|
-
stack: Instance of a stack model.
|
516
|
-
"""
|
517
|
-
verify_mlstacks_prerequisites_installation()
|
518
|
-
|
519
|
-
if not stack.stack_spec_path:
|
520
|
-
declare("No stack spec path is set for this stack.")
|
521
|
-
return
|
522
|
-
stack_caption = f"'{stack.name}' stack"
|
523
|
-
rich_table = table.Table(
|
524
|
-
box=box.HEAVY_EDGE,
|
525
|
-
title="MLStacks Outputs",
|
526
|
-
caption=stack_caption,
|
527
|
-
show_lines=True,
|
528
|
-
)
|
529
|
-
rich_table.add_column("OUTPUT_KEY", overflow="fold")
|
530
|
-
rich_table.add_column("OUTPUT_VALUE", overflow="fold")
|
531
|
-
|
532
|
-
from mlstacks.utils.terraform_utils import get_stack_outputs
|
533
|
-
|
534
|
-
stack_spec_file = stack.stack_spec_path
|
535
|
-
stack_outputs = get_stack_outputs(stack_path=stack_spec_file)
|
536
|
-
|
537
|
-
for output_key, output_value in stack_outputs.items():
|
538
|
-
rich_table.add_row(output_key, output_value)
|
539
|
-
|
540
|
-
# capitalize entries in first column
|
541
|
-
rich_table.columns[0]._cells = [
|
542
|
-
component.upper() # type: ignore[union-attr]
|
543
|
-
for component in rich_table.columns[0]._cells
|
544
|
-
]
|
545
|
-
console.print(rich_table)
|
546
|
-
|
547
|
-
|
548
539
|
def print_stack_configuration(stack: "StackResponse", active: bool) -> None:
|
549
540
|
"""Prints the configuration options of a stack.
|
550
541
|
|
@@ -572,14 +563,28 @@ def print_stack_configuration(stack: "StackResponse", active: bool) -> None:
|
|
572
563
|
for component in rich_table.columns[0]._cells
|
573
564
|
]
|
574
565
|
console.print(rich_table)
|
566
|
+
|
567
|
+
if not stack.labels:
|
568
|
+
declare("No labels are set for this stack.")
|
569
|
+
else:
|
570
|
+
rich_table = table.Table(
|
571
|
+
box=box.HEAVY_EDGE,
|
572
|
+
title="Labels",
|
573
|
+
show_lines=True,
|
574
|
+
)
|
575
|
+
rich_table.add_column("LABEL")
|
576
|
+
rich_table.add_column("VALUE", overflow="fold")
|
577
|
+
|
578
|
+
for label, value in stack.labels.items():
|
579
|
+
rich_table.add_row(label, str(value))
|
580
|
+
|
581
|
+
console.print(rich_table)
|
582
|
+
|
575
583
|
declare(
|
576
584
|
f"Stack '{stack.name}' with id '{stack.id}' is "
|
577
585
|
f"{f'owned by user {stack.user.name}.' if stack.user else 'unowned.'}"
|
578
586
|
)
|
579
587
|
|
580
|
-
if stack.stack_spec_path:
|
581
|
-
declare(f"Stack spec path for `mlstacks`: '{stack.stack_spec_path}'")
|
582
|
-
|
583
588
|
|
584
589
|
def print_flavor_list(flavors: Page["FlavorResponse"]) -> None:
|
585
590
|
"""Prints the list of flavors.
|
@@ -603,13 +608,18 @@ def print_flavor_list(flavors: Page["FlavorResponse"]) -> None:
|
|
603
608
|
|
604
609
|
|
605
610
|
def print_stack_component_configuration(
|
606
|
-
component: "ComponentResponse",
|
611
|
+
component: "ComponentResponse",
|
612
|
+
active_status: bool,
|
613
|
+
connector_requirements: Optional[ServiceConnectorRequirements] = None,
|
607
614
|
) -> None:
|
608
615
|
"""Prints the configuration options of a stack component.
|
609
616
|
|
610
617
|
Args:
|
611
618
|
component: The stack component to print.
|
612
619
|
active_status: Whether the stack component is active.
|
620
|
+
connector_requirements: Connector requirements for the component, taken
|
621
|
+
from the component flavor. Only needed if the component has a
|
622
|
+
connector.
|
613
623
|
"""
|
614
624
|
if component.user:
|
615
625
|
user_name = component.user.name
|
@@ -618,7 +628,7 @@ def print_stack_component_configuration(
|
|
618
628
|
|
619
629
|
declare(
|
620
630
|
f"{component.type.value.title()} '{component.name}' of flavor "
|
621
|
-
f"'{component.
|
631
|
+
f"'{component.flavor_name}' with id '{component.id}' is owned by "
|
622
632
|
f"user '{user_name}'."
|
623
633
|
)
|
624
634
|
|
@@ -665,7 +675,7 @@ def print_stack_component_configuration(
|
|
665
675
|
rich_table.add_column("VALUE", overflow="fold")
|
666
676
|
|
667
677
|
for label, value in component.labels.items():
|
668
|
-
rich_table.add_row(label, value)
|
678
|
+
rich_table.add_row(label, str(value))
|
669
679
|
|
670
680
|
console.print(rich_table)
|
671
681
|
|
@@ -680,11 +690,17 @@ def print_stack_component_configuration(
|
|
680
690
|
rich_table.add_column("PROPERTY")
|
681
691
|
rich_table.add_column("VALUE", overflow="fold")
|
682
692
|
|
693
|
+
resource_type = (
|
694
|
+
connector_requirements.resource_type
|
695
|
+
if connector_requirements
|
696
|
+
else component.connector.resource_types[0]
|
697
|
+
)
|
698
|
+
|
683
699
|
connector_dict = {
|
684
700
|
"ID": str(component.connector.id),
|
685
701
|
"NAME": component.connector.name,
|
686
702
|
"TYPE": component.connector.type,
|
687
|
-
"RESOURCE TYPE":
|
703
|
+
"RESOURCE TYPE": resource_type,
|
688
704
|
"RESOURCE NAME": component.connector_resource_id
|
689
705
|
or component.connector.resource_id
|
690
706
|
or "N/A",
|
@@ -695,11 +711,6 @@ def print_stack_component_configuration(
|
|
695
711
|
|
696
712
|
console.print(rich_table)
|
697
713
|
|
698
|
-
if component.component_spec_path:
|
699
|
-
declare(
|
700
|
-
f"Component spec path for `mlstacks`: {component.component_spec_path}"
|
701
|
-
)
|
702
|
-
|
703
714
|
|
704
715
|
def expand_argument_value_from_file(name: str, value: str) -> str:
|
705
716
|
"""Expands the value of an argument pointing to a file into the contents of that file.
|
@@ -915,12 +926,14 @@ def prompt_configuration(
|
|
915
926
|
config_dict = {}
|
916
927
|
for attr_name, attr_schema in config_schema.get("properties", {}).items():
|
917
928
|
title = attr_schema.get("title", attr_name)
|
918
|
-
attr_type = attr_schema.get("type", "string")
|
929
|
+
attr_type_name = attr_type = attr_schema.get("type", "string")
|
930
|
+
if attr_type == "array":
|
931
|
+
attr_type_name = "list (CSV or JSON)"
|
919
932
|
title = f"[{attr_name}] {title}"
|
920
933
|
required = attr_name in config_schema.get("required", [])
|
921
934
|
hidden = attr_schema.get("format", "") == "password"
|
922
935
|
subtitles: List[str] = []
|
923
|
-
subtitles.append(
|
936
|
+
subtitles.append(attr_type_name)
|
924
937
|
if hidden:
|
925
938
|
subtitles.append("secret")
|
926
939
|
if required:
|
@@ -938,6 +951,8 @@ def prompt_configuration(
|
|
938
951
|
if hidden and not show_secrets:
|
939
952
|
title += " is currently set to: [HIDDEN]"
|
940
953
|
else:
|
954
|
+
if attr_type == "array":
|
955
|
+
existing_value = json.dumps(existing_value)
|
941
956
|
title += f" is currently set to: '{existing_value}'"
|
942
957
|
else:
|
943
958
|
title += " is not currently set"
|
@@ -999,12 +1014,19 @@ def prompt_configuration(
|
|
999
1014
|
def install_packages(
|
1000
1015
|
packages: List[str],
|
1001
1016
|
upgrade: bool = False,
|
1017
|
+
use_uv: bool = False,
|
1002
1018
|
) -> None:
|
1003
|
-
"""Installs pypi packages into the current environment with pip.
|
1019
|
+
"""Installs pypi packages into the current environment with pip or uv.
|
1020
|
+
|
1021
|
+
When using with `uv`, a virtual environment is required.
|
1004
1022
|
|
1005
1023
|
Args:
|
1006
1024
|
packages: List of packages to install.
|
1007
1025
|
upgrade: Whether to upgrade the packages if they are already installed.
|
1026
|
+
use_uv: Whether to use uv for package installation.
|
1027
|
+
|
1028
|
+
Raises:
|
1029
|
+
e: If the package installation fails.
|
1008
1030
|
"""
|
1009
1031
|
if "neptune" in packages:
|
1010
1032
|
declare(
|
@@ -1013,53 +1035,120 @@ def install_packages(
|
|
1013
1035
|
)
|
1014
1036
|
uninstall_package("neptune-client")
|
1015
1037
|
|
1038
|
+
if "prodigy" in packages:
|
1039
|
+
packages.remove("prodigy")
|
1040
|
+
declare(
|
1041
|
+
"The `prodigy` package should be installed manually using your "
|
1042
|
+
"license key. Please visit https://prodi.gy/docs/install for more "
|
1043
|
+
"information."
|
1044
|
+
)
|
1045
|
+
if not packages:
|
1046
|
+
# if user only tried to install prodigy, we can
|
1047
|
+
# just return without doing anything
|
1048
|
+
return
|
1049
|
+
|
1050
|
+
pip_command = ["uv", "pip"] if use_uv else ["pip"]
|
1016
1051
|
if upgrade:
|
1017
|
-
command =
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1052
|
+
command = (
|
1053
|
+
[
|
1054
|
+
sys.executable,
|
1055
|
+
"-m",
|
1056
|
+
]
|
1057
|
+
+ pip_command
|
1058
|
+
+ [
|
1059
|
+
"install",
|
1060
|
+
"--upgrade",
|
1061
|
+
]
|
1062
|
+
+ packages
|
1063
|
+
)
|
1024
1064
|
else:
|
1025
|
-
command = [sys.executable, "-m"
|
1065
|
+
command = [sys.executable, "-m"] + pip_command + ["install"] + packages
|
1026
1066
|
|
1027
1067
|
if not IS_DEBUG_ENV:
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
subprocess.check_call(command)
|
1068
|
+
quiet_flag = "-q" if use_uv else "-qqq"
|
1069
|
+
command.append(quiet_flag)
|
1070
|
+
if not use_uv:
|
1071
|
+
command.append("--no-warn-conflicts")
|
1034
1072
|
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
"
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1073
|
+
try:
|
1074
|
+
subprocess.check_call(command)
|
1075
|
+
except subprocess.CalledProcessError as e:
|
1076
|
+
if (
|
1077
|
+
use_uv
|
1078
|
+
and "Failed to locate a virtualenv or Conda environment" in str(e)
|
1079
|
+
):
|
1080
|
+
error(
|
1081
|
+
"Failed to locate a virtualenv or Conda environment. "
|
1082
|
+
"When using uv, a virtual environment is required. "
|
1083
|
+
"Run `uv venv` to create a virtualenv and retry."
|
1084
|
+
)
|
1085
|
+
else:
|
1086
|
+
raise e
|
1044
1087
|
|
1045
1088
|
|
1046
|
-
def uninstall_package(package: str) -> None:
|
1047
|
-
"""Uninstalls pypi package from the current environment with pip.
|
1089
|
+
def uninstall_package(package: str, use_uv: bool = False) -> None:
|
1090
|
+
"""Uninstalls pypi package from the current environment with pip or uv.
|
1048
1091
|
|
1049
1092
|
Args:
|
1050
1093
|
package: The package to uninstall.
|
1094
|
+
use_uv: Whether to use uv for package uninstallation.
|
1051
1095
|
"""
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1096
|
+
pip_command = ["uv", "pip"] if use_uv else ["pip"]
|
1097
|
+
quiet_flag = "-q" if use_uv else "-qqq"
|
1098
|
+
|
1099
|
+
if use_uv:
|
1100
|
+
subprocess.check_call(
|
1101
|
+
[
|
1102
|
+
sys.executable,
|
1103
|
+
"-m",
|
1104
|
+
]
|
1105
|
+
+ pip_command
|
1106
|
+
+ [
|
1107
|
+
"uninstall",
|
1108
|
+
quiet_flag,
|
1109
|
+
package,
|
1110
|
+
]
|
1111
|
+
)
|
1112
|
+
else:
|
1113
|
+
subprocess.check_call(
|
1114
|
+
[
|
1115
|
+
sys.executable,
|
1116
|
+
"-m",
|
1117
|
+
]
|
1118
|
+
+ pip_command
|
1119
|
+
+ [
|
1120
|
+
"uninstall",
|
1121
|
+
quiet_flag,
|
1122
|
+
"-y",
|
1123
|
+
package,
|
1124
|
+
]
|
1125
|
+
)
|
1126
|
+
|
1127
|
+
|
1128
|
+
def is_uv_installed() -> bool:
|
1129
|
+
"""Check if uv is installed in the current environment.
|
1130
|
+
|
1131
|
+
Returns:
|
1132
|
+
True if uv is installed, False otherwise.
|
1133
|
+
"""
|
1134
|
+
try:
|
1135
|
+
pkg_resources.get_distribution("uv")
|
1136
|
+
return True
|
1137
|
+
except pkg_resources.DistributionNotFound:
|
1138
|
+
return False
|
1139
|
+
|
1140
|
+
|
1141
|
+
def is_pip_installed() -> bool:
|
1142
|
+
"""Check if pip is installed in the current environment.
|
1143
|
+
|
1144
|
+
Returns:
|
1145
|
+
True if pip is installed, False otherwise.
|
1146
|
+
"""
|
1147
|
+
try:
|
1148
|
+
pkg_resources.get_distribution("pip")
|
1149
|
+
return True
|
1150
|
+
except pkg_resources.DistributionNotFound:
|
1151
|
+
return False
|
1063
1152
|
|
1064
1153
|
|
1065
1154
|
def pretty_print_secret(
|
@@ -1127,6 +1216,10 @@ def get_service_state_emoji(state: "ServiceState") -> str:
|
|
1127
1216
|
return ":pause_button:"
|
1128
1217
|
if state == ServiceState.ERROR:
|
1129
1218
|
return ":heavy_exclamation_mark:"
|
1219
|
+
if state == ServiceState.PENDING_STARTUP:
|
1220
|
+
return ":hourglass:"
|
1221
|
+
if state == ServiceState.SCALED_TO_ZERO:
|
1222
|
+
return ":chart_decreasing:"
|
1130
1223
|
return ":hourglass_not_done:"
|
1131
1224
|
|
1132
1225
|
|
@@ -1141,15 +1234,18 @@ def pretty_print_model_deployer(
|
|
1141
1234
|
"""
|
1142
1235
|
model_service_dicts = []
|
1143
1236
|
for model_service in model_services:
|
1144
|
-
served_model_info = model_deployer.get_model_server_info(model_service)
|
1145
1237
|
dict_uuid = str(model_service.uuid)
|
1146
1238
|
dict_pl_name = model_service.config.pipeline_name
|
1147
1239
|
dict_pl_stp_name = model_service.config.pipeline_step_name
|
1148
|
-
dict_model_name =
|
1240
|
+
dict_model_name = model_service.config.model_name
|
1241
|
+
type = model_service.SERVICE_TYPE.type
|
1242
|
+
flavor = model_service.SERVICE_TYPE.flavor
|
1149
1243
|
model_service_dicts.append(
|
1150
1244
|
{
|
1151
1245
|
"STATUS": get_service_state_emoji(model_service.status.state),
|
1152
1246
|
"UUID": dict_uuid,
|
1247
|
+
"TYPE": type,
|
1248
|
+
"FLAVOR": flavor,
|
1153
1249
|
"PIPELINE_NAME": dict_pl_name,
|
1154
1250
|
"PIPELINE_STEP_NAME": dict_pl_stp_name,
|
1155
1251
|
"MODEL_NAME": dict_model_name,
|
@@ -1194,9 +1290,11 @@ def pretty_print_model_version_table(
|
|
1194
1290
|
"NAME": model_version.registered_model.name,
|
1195
1291
|
"MODEL_VERSION": model_version.version,
|
1196
1292
|
"VERSION_DESCRIPTION": model_version.description,
|
1197
|
-
"METADATA":
|
1198
|
-
|
1199
|
-
|
1293
|
+
"METADATA": (
|
1294
|
+
model_version.metadata.model_dump()
|
1295
|
+
if model_version.metadata
|
1296
|
+
else {}
|
1297
|
+
),
|
1200
1298
|
}
|
1201
1299
|
for model_version in model_versions
|
1202
1300
|
]
|
@@ -1226,15 +1324,21 @@ def pretty_print_model_version_details(
|
|
1226
1324
|
"REGISTERED_MODEL_NAME": model_version.registered_model.name,
|
1227
1325
|
"VERSION": model_version.version,
|
1228
1326
|
"VERSION_DESCRIPTION": model_version.description,
|
1229
|
-
"CREATED_AT":
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1327
|
+
"CREATED_AT": (
|
1328
|
+
str(model_version.created_at)
|
1329
|
+
if model_version.created_at
|
1330
|
+
else "N/A"
|
1331
|
+
),
|
1332
|
+
"UPDATED_AT": (
|
1333
|
+
str(model_version.last_updated_at)
|
1334
|
+
if model_version.last_updated_at
|
1335
|
+
else "N/A"
|
1336
|
+
),
|
1337
|
+
"METADATA": (
|
1338
|
+
model_version.metadata.model_dump()
|
1339
|
+
if model_version.metadata
|
1340
|
+
else {}
|
1341
|
+
),
|
1238
1342
|
"MODEL_SOURCE_URI": model_version.model_source_uri,
|
1239
1343
|
"STAGE": model_version.stage.value,
|
1240
1344
|
}
|
@@ -1276,9 +1380,10 @@ def print_served_model_configuration(
|
|
1276
1380
|
**served_model_info,
|
1277
1381
|
"UUID": str(model_service.uuid),
|
1278
1382
|
"STATUS": get_service_state_emoji(model_service.status.state),
|
1383
|
+
"TYPE": model_service.SERVICE_TYPE.type,
|
1384
|
+
"FLAVOR": model_service.SERVICE_TYPE.flavor,
|
1279
1385
|
"STATUS_MESSAGE": model_service.status.last_error,
|
1280
1386
|
"PIPELINE_NAME": model_service.config.pipeline_name,
|
1281
|
-
"RUN_NAME": model_service.config.run_name,
|
1282
1387
|
"PIPELINE_STEP_NAME": model_service.config.pipeline_step_name,
|
1283
1388
|
}
|
1284
1389
|
|
@@ -1296,74 +1401,6 @@ def print_served_model_configuration(
|
|
1296
1401
|
console.print(rich_table)
|
1297
1402
|
|
1298
1403
|
|
1299
|
-
def print_server_deployment_list(servers: List["ServerDeployment"]) -> None:
|
1300
|
-
"""Print a table with a list of ZenML server deployments.
|
1301
|
-
|
1302
|
-
Args:
|
1303
|
-
servers: list of ZenML server deployments
|
1304
|
-
"""
|
1305
|
-
server_dicts = []
|
1306
|
-
for server in servers:
|
1307
|
-
status = ""
|
1308
|
-
url = ""
|
1309
|
-
connected = ""
|
1310
|
-
if server.status:
|
1311
|
-
status = get_service_state_emoji(server.status.status)
|
1312
|
-
if server.status.url:
|
1313
|
-
url = server.status.url
|
1314
|
-
if server.status.connected:
|
1315
|
-
connected = ":point_left:"
|
1316
|
-
server_dicts.append(
|
1317
|
-
{
|
1318
|
-
"STATUS": status,
|
1319
|
-
"NAME": server.config.name,
|
1320
|
-
"PROVIDER": server.config.provider.value,
|
1321
|
-
"URL": url,
|
1322
|
-
"CONNECTED": connected,
|
1323
|
-
}
|
1324
|
-
)
|
1325
|
-
print_table(server_dicts)
|
1326
|
-
|
1327
|
-
|
1328
|
-
def print_server_deployment(server: "ServerDeployment") -> None:
|
1329
|
-
"""Prints the configuration and status of a ZenML server deployment.
|
1330
|
-
|
1331
|
-
Args:
|
1332
|
-
server: Server deployment to print
|
1333
|
-
"""
|
1334
|
-
server_name = server.config.name
|
1335
|
-
title_ = f"ZenML server '{server_name}'"
|
1336
|
-
|
1337
|
-
rich_table = table.Table(
|
1338
|
-
box=box.HEAVY_EDGE,
|
1339
|
-
title=title_,
|
1340
|
-
show_header=False,
|
1341
|
-
show_lines=True,
|
1342
|
-
)
|
1343
|
-
rich_table.add_column("", overflow="fold")
|
1344
|
-
rich_table.add_column("", overflow="fold")
|
1345
|
-
|
1346
|
-
server_info = []
|
1347
|
-
|
1348
|
-
if server.status:
|
1349
|
-
server_info.extend(
|
1350
|
-
[
|
1351
|
-
("URL", server.status.url or ""),
|
1352
|
-
("STATUS", get_service_state_emoji(server.status.status)),
|
1353
|
-
("STATUS_MESSAGE", server.status.status_message or ""),
|
1354
|
-
(
|
1355
|
-
"CONNECTED",
|
1356
|
-
":white_check_mark:" if server.status.connected else "",
|
1357
|
-
),
|
1358
|
-
]
|
1359
|
-
)
|
1360
|
-
|
1361
|
-
for item in server_info:
|
1362
|
-
rich_table.add_row(*item)
|
1363
|
-
|
1364
|
-
console.print(rich_table)
|
1365
|
-
|
1366
|
-
|
1367
1404
|
def describe_pydantic_object(schema_json: Dict[str, Any]) -> None:
|
1368
1405
|
"""Describes a Pydantic object based on the dict-representation of its schema.
|
1369
1406
|
|
@@ -1537,7 +1574,7 @@ def print_components_table(
|
|
1537
1574
|
"ACTIVE": ":point_right:" if is_active else "",
|
1538
1575
|
"NAME": component.name,
|
1539
1576
|
"COMPONENT ID": component.id,
|
1540
|
-
"FLAVOR": component.
|
1577
|
+
"FLAVOR": component.flavor_name,
|
1541
1578
|
"OWNER": f"{component.user.name if component.user else '-'}",
|
1542
1579
|
}
|
1543
1580
|
configurations.append(component_config)
|
@@ -1593,7 +1630,7 @@ def expires_in(
|
|
1593
1630
|
expires_at -= datetime.timedelta(seconds=skew_tolerance)
|
1594
1631
|
if expires_at < now:
|
1595
1632
|
return expired_str
|
1596
|
-
return seconds_to_human_readable((expires_at - now).
|
1633
|
+
return seconds_to_human_readable(int((expires_at - now).total_seconds()))
|
1597
1634
|
|
1598
1635
|
|
1599
1636
|
def print_service_connectors_table(
|
@@ -1656,13 +1693,15 @@ def print_service_connectors_table(
|
|
1656
1693
|
"RESOURCE TYPES": "\n".join(connector.emojified_resource_types),
|
1657
1694
|
"RESOURCE NAME": resource_name,
|
1658
1695
|
"OWNER": f"{connector.user.name if connector.user else '-'}",
|
1659
|
-
"EXPIRES IN":
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1664
|
-
|
1665
|
-
|
1696
|
+
"EXPIRES IN": (
|
1697
|
+
expires_in(
|
1698
|
+
connector.expires_at,
|
1699
|
+
":name_badge: Expired!",
|
1700
|
+
connector.expires_skew_tolerance,
|
1701
|
+
)
|
1702
|
+
if connector.expires_at
|
1703
|
+
else ""
|
1704
|
+
),
|
1666
1705
|
"LABELS": "\n".join(labels),
|
1667
1706
|
}
|
1668
1707
|
configurations.append(connector_config)
|
@@ -1718,15 +1757,17 @@ def print_service_connector_resource_table(
|
|
1718
1757
|
resource_row = {}
|
1719
1758
|
if not show_resources_only:
|
1720
1759
|
resource_row = {
|
1721
|
-
"CONNECTOR ID":
|
1722
|
-
|
1723
|
-
|
1724
|
-
"CONNECTOR NAME":
|
1725
|
-
|
1726
|
-
|
1727
|
-
"CONNECTOR TYPE":
|
1728
|
-
|
1729
|
-
|
1760
|
+
"CONNECTOR ID": (
|
1761
|
+
str(resource_model.id) if not printed_connector else ""
|
1762
|
+
),
|
1763
|
+
"CONNECTOR NAME": (
|
1764
|
+
resource_model.name if not printed_connector else ""
|
1765
|
+
),
|
1766
|
+
"CONNECTOR TYPE": (
|
1767
|
+
resource_model.emojified_connector_type
|
1768
|
+
if not printed_connector
|
1769
|
+
else ""
|
1770
|
+
),
|
1730
1771
|
}
|
1731
1772
|
resource_row.update(
|
1732
1773
|
{
|
@@ -1771,8 +1812,7 @@ def print_service_connector_configuration(
|
|
1771
1812
|
)
|
1772
1813
|
else:
|
1773
1814
|
declare(
|
1774
|
-
f"Service connector '{connector.name}' of type "
|
1775
|
-
f"'{connector.type}'."
|
1815
|
+
f"Service connector '{connector.name}' of type '{connector.type}'."
|
1776
1816
|
)
|
1777
1817
|
|
1778
1818
|
title_ = f"'{connector.name}' {connector.type} Service Connector Details"
|
@@ -1802,16 +1842,20 @@ def print_service_connector_configuration(
|
|
1802
1842
|
"RESOURCE NAME": connector.resource_id or "<multiple>",
|
1803
1843
|
"SECRET ID": connector.secret_id or "",
|
1804
1844
|
"SESSION DURATION": expiration,
|
1805
|
-
"EXPIRES IN":
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
1812
|
-
|
1813
|
-
|
1814
|
-
|
1845
|
+
"EXPIRES IN": (
|
1846
|
+
expires_in(
|
1847
|
+
connector.expires_at,
|
1848
|
+
":name_badge: Expired!",
|
1849
|
+
connector.expires_skew_tolerance,
|
1850
|
+
)
|
1851
|
+
if connector.expires_at
|
1852
|
+
else "N/A"
|
1853
|
+
),
|
1854
|
+
"EXPIRES_SKEW_TOLERANCE": (
|
1855
|
+
connector.expires_skew_tolerance
|
1856
|
+
if connector.expires_skew_tolerance
|
1857
|
+
else "N/A"
|
1858
|
+
),
|
1815
1859
|
"OWNER": user_name,
|
1816
1860
|
"WORKSPACE": connector.workspace.name,
|
1817
1861
|
"CREATED_AT": connector.created,
|
@@ -1825,16 +1869,20 @@ def print_service_connector_configuration(
|
|
1825
1869
|
"RESOURCE TYPES": ", ".join(connector.emojified_resource_types),
|
1826
1870
|
"RESOURCE NAME": connector.resource_id or "<multiple>",
|
1827
1871
|
"SESSION DURATION": expiration,
|
1828
|
-
"EXPIRES IN":
|
1829
|
-
|
1830
|
-
|
1831
|
-
|
1832
|
-
|
1833
|
-
|
1834
|
-
|
1835
|
-
|
1836
|
-
|
1837
|
-
|
1872
|
+
"EXPIRES IN": (
|
1873
|
+
expires_in(
|
1874
|
+
connector.expires_at,
|
1875
|
+
":name_badge: Expired!",
|
1876
|
+
connector.expires_skew_tolerance,
|
1877
|
+
)
|
1878
|
+
if connector.expires_at
|
1879
|
+
else "N/A"
|
1880
|
+
),
|
1881
|
+
"EXPIRES_SKEW_TOLERANCE": (
|
1882
|
+
connector.expires_skew_tolerance
|
1883
|
+
if connector.expires_skew_tolerance
|
1884
|
+
else "N/A"
|
1885
|
+
),
|
1838
1886
|
}
|
1839
1887
|
|
1840
1888
|
for item in properties.items():
|
@@ -1944,7 +1992,7 @@ def print_service_connector_resource_type(
|
|
1944
1992
|
message = f"{title}\n" if title else ""
|
1945
1993
|
emoji = replace_emojis(resource_type.emoji) if resource_type.emoji else ""
|
1946
1994
|
supported_auth_methods = [
|
1947
|
-
f
|
1995
|
+
f"{Emoji('lock')} {a}" for a in resource_type.auth_methods
|
1948
1996
|
]
|
1949
1997
|
message += (
|
1950
1998
|
f"{heading} {emoji} {resource_type.name} "
|
@@ -2068,7 +2116,7 @@ def print_service_connector_type(
|
|
2068
2116
|
"""
|
2069
2117
|
message = f"{title}\n" if title else ""
|
2070
2118
|
supported_auth_methods = [
|
2071
|
-
f
|
2119
|
+
f"{Emoji('lock')} {a.auth_method}" for a in connector_type.auth_methods
|
2072
2120
|
]
|
2073
2121
|
supported_resource_types = [
|
2074
2122
|
f"{replace_emojis(r.emoji)} {r.resource_type}"
|
@@ -2153,7 +2201,7 @@ def _scrub_secret(config: StackComponentConfig) -> Dict[str, Any]:
|
|
2153
2201
|
A configuration with secret values removed.
|
2154
2202
|
"""
|
2155
2203
|
config_dict = {}
|
2156
|
-
config_fields =
|
2204
|
+
config_fields = config.__class__.model_fields
|
2157
2205
|
for key, value in config_fields.items():
|
2158
2206
|
if secret_utils.is_secret_field(value):
|
2159
2207
|
config_dict[key] = "********"
|
@@ -2329,12 +2377,13 @@ def create_filter_help_text(filter_model: Type[BaseFilter], field: str) -> str:
|
|
2329
2377
|
Returns:
|
2330
2378
|
The help text.
|
2331
2379
|
"""
|
2332
|
-
|
2380
|
+
filter_generator = FilterGenerator(filter_model)
|
2381
|
+
if filter_generator.is_sort_by_field(field):
|
2333
2382
|
return (
|
2334
2383
|
"[STRING] Example: --sort_by='desc:name' to sort by name in "
|
2335
2384
|
"descending order. "
|
2336
2385
|
)
|
2337
|
-
if
|
2386
|
+
if filter_generator.is_datetime_field(field):
|
2338
2387
|
return (
|
2339
2388
|
f"[DATETIME] The following datetime format is supported: "
|
2340
2389
|
f"'{FILTERING_DATETIME_FORMAT}'. Make sure to keep it in "
|
@@ -2343,23 +2392,23 @@ def create_filter_help_text(filter_model: Type[BaseFilter], field: str) -> str:
|
|
2343
2392
|
f"'{GenericFilterOps.GTE}:{FILTERING_DATETIME_FORMAT}' to "
|
2344
2393
|
f"filter for everything created on or after the given date."
|
2345
2394
|
)
|
2346
|
-
elif
|
2395
|
+
elif filter_generator.is_uuid_field(field):
|
2347
2396
|
return (
|
2348
2397
|
f"[UUID] Example: --{field}='{GenericFilterOps.STARTSWITH}:ab53ca' "
|
2349
2398
|
f"to filter for all UUIDs starting with that prefix."
|
2350
2399
|
)
|
2351
|
-
elif
|
2400
|
+
elif filter_generator.is_int_field(field):
|
2352
2401
|
return (
|
2353
2402
|
f"[INTEGER] Example: --{field}='{GenericFilterOps.GTE}:25' to "
|
2354
2403
|
f"filter for all entities where this field has a value greater than "
|
2355
2404
|
f"or equal to the value."
|
2356
2405
|
)
|
2357
|
-
elif
|
2406
|
+
elif filter_generator.is_bool_field(field):
|
2358
2407
|
return (
|
2359
2408
|
f"[BOOL] Example: --{field}='True' to "
|
2360
2409
|
f"filter for all instances where this field is true."
|
2361
2410
|
)
|
2362
|
-
elif
|
2411
|
+
elif filter_generator.is_str_field(field):
|
2363
2412
|
return (
|
2364
2413
|
f"[STRING] Example: --{field}='{GenericFilterOps.CONTAINS}:example' "
|
2365
2414
|
f"to filter everything that contains the query string somewhere in "
|
@@ -2381,27 +2430,28 @@ def create_data_type_help_text(
|
|
2381
2430
|
Returns:
|
2382
2431
|
The help text.
|
2383
2432
|
"""
|
2384
|
-
|
2433
|
+
filter_generator = FilterGenerator(filter_model)
|
2434
|
+
if filter_generator.is_datetime_field(field):
|
2385
2435
|
return (
|
2386
2436
|
f"[DATETIME] supported filter operators: "
|
2387
2437
|
f"{[str(op) for op in NumericFilter.ALLOWED_OPS]}"
|
2388
2438
|
)
|
2389
|
-
elif
|
2439
|
+
elif filter_generator.is_uuid_field(field):
|
2390
2440
|
return (
|
2391
2441
|
f"[UUID] supported filter operators: "
|
2392
2442
|
f"{[str(op) for op in UUIDFilter.ALLOWED_OPS]}"
|
2393
2443
|
)
|
2394
|
-
elif
|
2444
|
+
elif filter_generator.is_int_field(field):
|
2395
2445
|
return (
|
2396
2446
|
f"[INTEGER] supported filter operators: "
|
2397
2447
|
f"{[str(op) for op in NumericFilter.ALLOWED_OPS]}"
|
2398
2448
|
)
|
2399
|
-
elif
|
2449
|
+
elif filter_generator.is_bool_field(field):
|
2400
2450
|
return (
|
2401
2451
|
f"[BOOL] supported filter operators: "
|
2402
2452
|
f"{[str(op) for op in BoolFilter.ALLOWED_OPS]}"
|
2403
2453
|
)
|
2404
|
-
elif
|
2454
|
+
elif filter_generator.is_str_field(field):
|
2405
2455
|
return (
|
2406
2456
|
f"[STRING] supported filter operators: "
|
2407
2457
|
f"{[str(op) for op in StrFilter.ALLOWED_OPS]}"
|
@@ -2430,7 +2480,7 @@ def list_options(filter_model: Type[BaseFilter]) -> Callable[[F], F]:
|
|
2430
2480
|
def inner_decorator(func: F) -> F:
|
2431
2481
|
options = []
|
2432
2482
|
data_type_descriptors = set()
|
2433
|
-
for k, v in filter_model.
|
2483
|
+
for k, v in filter_model.model_fields.items():
|
2434
2484
|
if k not in filter_model.CLI_EXCLUDE_FIELDS:
|
2435
2485
|
options.append(
|
2436
2486
|
click.option(
|
@@ -2610,29 +2660,100 @@ def print_model_url(url: Optional[str]) -> None:
|
|
2610
2660
|
warning(
|
2611
2661
|
"You can display various ZenML entities including pipelines, "
|
2612
2662
|
"runs, stacks and much more on the ZenML Dashboard. "
|
2613
|
-
"You can try it locally, by running `zenml
|
2614
|
-
"by deploying ZenML on the infrastructure of your choice."
|
2663
|
+
"You can try it locally, by running `zenml local --local`, or "
|
2664
|
+
"remotely, by deploying ZenML on the infrastructure of your choice."
|
2615
2665
|
)
|
2616
2666
|
|
2617
2667
|
|
2618
|
-
def
|
2619
|
-
"""
|
2620
|
-
warning(
|
2621
|
-
"The `example` CLI subcommand has been deprecated and will be removed "
|
2622
|
-
"in a future release."
|
2623
|
-
)
|
2624
|
-
|
2668
|
+
def is_jupyter_installed() -> bool:
|
2669
|
+
"""Checks if Jupyter notebook is installed.
|
2625
2670
|
|
2626
|
-
|
2627
|
-
|
2671
|
+
Returns:
|
2672
|
+
bool: True if Jupyter notebook is installed, False otherwise.
|
2673
|
+
"""
|
2628
2674
|
try:
|
2629
|
-
|
2630
|
-
|
2675
|
+
pkg_resources.get_distribution("notebook")
|
2676
|
+
return True
|
2677
|
+
except pkg_resources.DistributionNotFound:
|
2678
|
+
return False
|
2679
|
+
|
2680
|
+
|
2681
|
+
def multi_choice_prompt(
|
2682
|
+
object_type: str,
|
2683
|
+
choices: List[List[Any]],
|
2684
|
+
headers: List[str],
|
2685
|
+
prompt_text: str,
|
2686
|
+
allow_zero_be_a_new_object: bool = False,
|
2687
|
+
default_choice: Optional[str] = None,
|
2688
|
+
) -> Optional[int]:
|
2689
|
+
"""Prompts the user to select a choice from a list of choices.
|
2690
|
+
|
2691
|
+
Args:
|
2692
|
+
object_type: The type of the object
|
2693
|
+
choices: The list of choices
|
2694
|
+
prompt_text: The prompt text
|
2695
|
+
headers: The list of headers.
|
2696
|
+
allow_zero_be_a_new_object: Whether to allow zero as a new object
|
2697
|
+
default_choice: The default choice
|
2631
2698
|
|
2632
|
-
|
2633
|
-
|
2699
|
+
Returns:
|
2700
|
+
The selected choice index or None for new object
|
2701
|
+
|
2702
|
+
Raises:
|
2703
|
+
RuntimeError: If no choice is made.
|
2704
|
+
"""
|
2705
|
+
table = Table(
|
2706
|
+
title=f"Available {object_type}",
|
2707
|
+
show_header=True,
|
2708
|
+
border_style=None,
|
2709
|
+
expand=True,
|
2710
|
+
show_lines=True,
|
2711
|
+
)
|
2712
|
+
table.add_column("Choice", justify="left", width=1)
|
2713
|
+
for h in headers:
|
2714
|
+
table.add_column(
|
2715
|
+
h.replace("_", " ").capitalize(), justify="left", width=10
|
2634
2716
|
)
|
2635
|
-
|
2636
|
-
|
2637
|
-
|
2638
|
-
|
2717
|
+
|
2718
|
+
i_shift = 0
|
2719
|
+
if allow_zero_be_a_new_object:
|
2720
|
+
i_shift = 1
|
2721
|
+
table.add_row(
|
2722
|
+
"[0]",
|
2723
|
+
*([f"Create a new {object_type}"] * len(headers)),
|
2724
|
+
)
|
2725
|
+
for i, one_choice in enumerate(choices):
|
2726
|
+
table.add_row(f"[{i + i_shift}]", *[str(x) for x in one_choice])
|
2727
|
+
Console().print(table)
|
2728
|
+
|
2729
|
+
selected = Prompt.ask(
|
2730
|
+
prompt_text,
|
2731
|
+
choices=[str(i) for i in range(0, len(choices) + 1)],
|
2732
|
+
default=default_choice,
|
2733
|
+
show_choices=False,
|
2734
|
+
)
|
2735
|
+
if selected is None:
|
2736
|
+
raise RuntimeError(f"No {object_type} was selected")
|
2737
|
+
|
2738
|
+
if selected == "0" and allow_zero_be_a_new_object:
|
2739
|
+
return None
|
2740
|
+
else:
|
2741
|
+
return int(selected) - i_shift
|
2742
|
+
|
2743
|
+
|
2744
|
+
def requires_mac_env_var_warning() -> bool:
|
2745
|
+
"""Checks if a warning needs to be shown for a local Mac server.
|
2746
|
+
|
2747
|
+
This is for the case where a user is on a macOS system, trying to run a
|
2748
|
+
local server but is missing the `OBJC_DISABLE_INITIALIZE_FORK_SAFETY`
|
2749
|
+
environment variable.
|
2750
|
+
|
2751
|
+
Returns:
|
2752
|
+
bool: True if a warning needs to be shown, False otherwise.
|
2753
|
+
"""
|
2754
|
+
if sys.platform == "darwin":
|
2755
|
+
mac_version_tuple = tuple(map(int, platform.release().split(".")[:2]))
|
2756
|
+
return not os.getenv(
|
2757
|
+
"OBJC_DISABLE_INITIALIZE_FORK_SAFETY"
|
2758
|
+
) and mac_version_tuple >= (10, 13)
|
2759
|
+
return False
|