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/hub.py
DELETED
@@ -1,1115 +0,0 @@
|
|
1
|
-
# Copyright (c) ZenML GmbH 2023. All Rights Reserved.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at:
|
6
|
-
#
|
7
|
-
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
12
|
-
# or implied. See the License for the specific language governing
|
13
|
-
# permissions and limitations under the License.
|
14
|
-
"""CLI functionality to interact with the ZenML Hub."""
|
15
|
-
import os
|
16
|
-
import shutil
|
17
|
-
import subprocess
|
18
|
-
import sys
|
19
|
-
import tempfile
|
20
|
-
from importlib.util import find_spec
|
21
|
-
from typing import Any, Dict, List, Optional, Tuple
|
22
|
-
|
23
|
-
import click
|
24
|
-
|
25
|
-
from zenml._hub.client import HubAPIError, HubClient
|
26
|
-
from zenml._hub.constants import (
|
27
|
-
ZENML_HUB_ADMIN_USERNAME,
|
28
|
-
ZENML_HUB_INTERNAL_TAG_PREFIX,
|
29
|
-
ZENML_HUB_VERIFIED_TAG,
|
30
|
-
)
|
31
|
-
from zenml._hub.utils import parse_plugin_name, plugin_display_name
|
32
|
-
from zenml.analytics.enums import AnalyticsEvent
|
33
|
-
from zenml.analytics.utils import track_handler
|
34
|
-
from zenml.cli.cli import TagGroup, cli
|
35
|
-
from zenml.cli.utils import declare, error, print_table, warning
|
36
|
-
from zenml.enums import CliCategories
|
37
|
-
from zenml.logger import get_logger
|
38
|
-
from zenml.models import (
|
39
|
-
HubPluginRequestModel,
|
40
|
-
HubPluginResponseModel,
|
41
|
-
PluginStatus,
|
42
|
-
)
|
43
|
-
|
44
|
-
logger = get_logger(__name__)
|
45
|
-
|
46
|
-
|
47
|
-
@cli.group(cls=TagGroup, tag=CliCategories.HUB)
|
48
|
-
def hub() -> None:
|
49
|
-
"""Interact with the ZenML Hub."""
|
50
|
-
|
51
|
-
|
52
|
-
@hub.command("list")
|
53
|
-
@click.option(
|
54
|
-
"--all",
|
55
|
-
"-a",
|
56
|
-
is_flag=True,
|
57
|
-
help="List all plugins, including those that are not available.",
|
58
|
-
)
|
59
|
-
@click.option(
|
60
|
-
"--mine",
|
61
|
-
"-m",
|
62
|
-
is_flag=True,
|
63
|
-
help="List only plugins that you own.",
|
64
|
-
)
|
65
|
-
@click.option(
|
66
|
-
"--installed",
|
67
|
-
"-i",
|
68
|
-
is_flag=True,
|
69
|
-
help="List only plugins that are installed.",
|
70
|
-
)
|
71
|
-
def list_plugins(
|
72
|
-
all: bool = False, mine: bool = False, installed: bool = False
|
73
|
-
) -> None:
|
74
|
-
"""List all plugins available on the ZenML Hub.
|
75
|
-
|
76
|
-
Args:
|
77
|
-
all: Whether to list all plugins, including ones that are not available.
|
78
|
-
mine: Whether to list only plugins that you own.
|
79
|
-
installed: Whether to list only plugins that are installed.
|
80
|
-
"""
|
81
|
-
client = HubClient()
|
82
|
-
if mine and not client.auth_token:
|
83
|
-
error(
|
84
|
-
"You must be logged in to list your own plugins via --mine. "
|
85
|
-
"Please run `zenml hub login` to login."
|
86
|
-
)
|
87
|
-
list_params: Dict[str, Any] = {"mine": mine}
|
88
|
-
if not all:
|
89
|
-
list_params["status"] = PluginStatus.AVAILABLE
|
90
|
-
plugins = client.list_plugins(**list_params)
|
91
|
-
if not plugins:
|
92
|
-
declare("No plugins found.")
|
93
|
-
if installed:
|
94
|
-
plugins = [
|
95
|
-
plugin
|
96
|
-
for plugin in plugins
|
97
|
-
if _is_plugin_installed(
|
98
|
-
author=plugin.author, plugin_name=plugin.name
|
99
|
-
)
|
100
|
-
]
|
101
|
-
plugins_table = _format_plugins_table(plugins)
|
102
|
-
print_table(plugins_table)
|
103
|
-
|
104
|
-
|
105
|
-
def _format_plugins_table(
|
106
|
-
plugins: List[HubPluginResponseModel],
|
107
|
-
) -> List[Dict[str, str]]:
|
108
|
-
"""Helper function to format a list of plugins into a table.
|
109
|
-
|
110
|
-
Args:
|
111
|
-
plugins: The list of plugins.
|
112
|
-
|
113
|
-
Returns:
|
114
|
-
The formatted table.
|
115
|
-
"""
|
116
|
-
plugins_table = []
|
117
|
-
for plugin in sorted(plugins, key=_sort_plugin_key_fn):
|
118
|
-
if _is_plugin_installed(author=plugin.author, plugin_name=plugin.name):
|
119
|
-
installed_icon = ":white_check_mark:"
|
120
|
-
else:
|
121
|
-
installed_icon = ":x:"
|
122
|
-
if plugin.status == PluginStatus.AVAILABLE:
|
123
|
-
status_icon = ":white_check_mark:"
|
124
|
-
elif plugin.status == PluginStatus.PENDING:
|
125
|
-
status_icon = ":hourglass:"
|
126
|
-
else:
|
127
|
-
status_icon = ":x:"
|
128
|
-
|
129
|
-
display_name = plugin_display_name(
|
130
|
-
name=plugin.name,
|
131
|
-
version=plugin.version,
|
132
|
-
author=plugin.author,
|
133
|
-
)
|
134
|
-
display_data: Dict[str, str] = {
|
135
|
-
"PLUGIN": display_name,
|
136
|
-
"STATUS": status_icon,
|
137
|
-
"INSTALLED": installed_icon,
|
138
|
-
"MODULE": _get_plugin_module(
|
139
|
-
author=plugin.author, plugin_name=plugin.name
|
140
|
-
),
|
141
|
-
"PACKAGE NAME": plugin.package_name or "",
|
142
|
-
"REPOSITORY URL": plugin.repository_url,
|
143
|
-
}
|
144
|
-
plugins_table.append(display_data)
|
145
|
-
return plugins_table
|
146
|
-
|
147
|
-
|
148
|
-
def _sort_plugin_key_fn(
|
149
|
-
plugin: HubPluginResponseModel,
|
150
|
-
) -> Tuple[str, str, str]:
|
151
|
-
"""Helper function to sort plugins by name, version and author.
|
152
|
-
|
153
|
-
Args:
|
154
|
-
plugin: The plugin to sort.
|
155
|
-
|
156
|
-
Returns:
|
157
|
-
A tuple of the plugin's author, name and version.
|
158
|
-
"""
|
159
|
-
if plugin.author == ZENML_HUB_ADMIN_USERNAME:
|
160
|
-
return "0", plugin.name, plugin.version # Sort admin plugins first
|
161
|
-
return plugin.author, plugin.name, plugin.version
|
162
|
-
|
163
|
-
|
164
|
-
@hub.command("install")
|
165
|
-
@click.argument("plugin_name", type=str, required=True)
|
166
|
-
@click.option(
|
167
|
-
"--upgrade",
|
168
|
-
"-u",
|
169
|
-
is_flag=True,
|
170
|
-
help="Upgrade the plugin if it is already installed.",
|
171
|
-
)
|
172
|
-
@click.option(
|
173
|
-
"--no-deps",
|
174
|
-
"--no-dependencies",
|
175
|
-
is_flag=True,
|
176
|
-
help="Do not install dependencies of the plugin.",
|
177
|
-
)
|
178
|
-
@click.option(
|
179
|
-
"--yes",
|
180
|
-
"-y",
|
181
|
-
is_flag=True,
|
182
|
-
help="Do not ask for confirmation before installing.",
|
183
|
-
)
|
184
|
-
def install_plugin(
|
185
|
-
plugin_name: str,
|
186
|
-
upgrade: bool = False,
|
187
|
-
no_deps: bool = False,
|
188
|
-
yes: bool = False,
|
189
|
-
) -> None:
|
190
|
-
"""Install a plugin from the ZenML Hub.
|
191
|
-
|
192
|
-
Args:
|
193
|
-
plugin_name: Name of the plugin.
|
194
|
-
upgrade: Whether to upgrade the plugin if it is already installed.
|
195
|
-
no_deps: If set, dependencies of the plugin will not be installed.
|
196
|
-
yes: If set, no confirmation will be asked for before installing.
|
197
|
-
"""
|
198
|
-
with track_handler(
|
199
|
-
event=AnalyticsEvent.ZENML_HUB_PLUGIN_INSTALL,
|
200
|
-
) as analytics_handler:
|
201
|
-
client = HubClient()
|
202
|
-
analytics_handler.metadata["hub_url"] = client.url
|
203
|
-
author, plugin_name, plugin_version = parse_plugin_name(plugin_name)
|
204
|
-
analytics_handler.metadata["plugin_name"] = plugin_name
|
205
|
-
analytics_handler.metadata["plugin_author"] = author
|
206
|
-
display_name = plugin_display_name(plugin_name, plugin_version, author)
|
207
|
-
|
208
|
-
# Get plugin from hub
|
209
|
-
plugin = client.get_plugin(
|
210
|
-
name=plugin_name,
|
211
|
-
version=plugin_version,
|
212
|
-
author=author,
|
213
|
-
)
|
214
|
-
if not plugin:
|
215
|
-
error(f"Could not find plugin '{display_name}' on the hub.")
|
216
|
-
analytics_handler.metadata["plugin_version"] = plugin.version
|
217
|
-
|
218
|
-
# Check if plugin can be installed
|
219
|
-
index_url = plugin.index_url
|
220
|
-
package_name = plugin.package_name
|
221
|
-
if not index_url or not package_name:
|
222
|
-
error(
|
223
|
-
f"Plugin '{display_name}' is not available for installation."
|
224
|
-
)
|
225
|
-
|
226
|
-
# Check if plugin is already installed
|
227
|
-
if (
|
228
|
-
_is_plugin_installed(author=plugin.author, plugin_name=plugin.name)
|
229
|
-
and not upgrade
|
230
|
-
):
|
231
|
-
declare(f"Plugin '{plugin_name}' is already installed.")
|
232
|
-
return
|
233
|
-
|
234
|
-
# Show a warning if the plugin is not official or verified
|
235
|
-
_is_zenml_plugin = plugin.author == ZENML_HUB_ADMIN_USERNAME
|
236
|
-
_is_verified = plugin.tags and ZENML_HUB_VERIFIED_TAG in plugin.tags
|
237
|
-
if not _is_zenml_plugin and not _is_verified:
|
238
|
-
warning(
|
239
|
-
f"Plugin '{display_name}' was not verified by ZenML and may "
|
240
|
-
"contain arbitrary code. Please check the source code before "
|
241
|
-
"installing to make sure it does what you expect."
|
242
|
-
)
|
243
|
-
|
244
|
-
# Install plugin requirements
|
245
|
-
if plugin.requirements:
|
246
|
-
requirements_str = " ".join(f"'{r}'" for r in plugin.requirements)
|
247
|
-
install_requirements = False
|
248
|
-
if not no_deps and not yes:
|
249
|
-
install_requirements = click.confirm(
|
250
|
-
f"Plugin '{display_name}' requires the following "
|
251
|
-
f"packages to be installed: {requirements_str}. "
|
252
|
-
f"Do you want to install them now?"
|
253
|
-
)
|
254
|
-
if yes or install_requirements:
|
255
|
-
declare(
|
256
|
-
f"Installing requirements for plugin '{display_name}': "
|
257
|
-
f"{requirements_str}..."
|
258
|
-
)
|
259
|
-
requirements_install_call = [
|
260
|
-
sys.executable,
|
261
|
-
"-m",
|
262
|
-
"pip",
|
263
|
-
"install",
|
264
|
-
*list(plugin.requirements),
|
265
|
-
"--upgrade",
|
266
|
-
]
|
267
|
-
subprocess.check_call(requirements_install_call)
|
268
|
-
declare(
|
269
|
-
f"Successfully installed requirements for plugin "
|
270
|
-
f"'{display_name}'."
|
271
|
-
)
|
272
|
-
else:
|
273
|
-
warning(
|
274
|
-
f"Requirements for plugin '{display_name}' were not "
|
275
|
-
"installed. This might lead to errors in the future if the "
|
276
|
-
"requirements are not installed manually."
|
277
|
-
)
|
278
|
-
|
279
|
-
# pip install the wheel
|
280
|
-
declare(
|
281
|
-
f"Installing plugin '{display_name}' from "
|
282
|
-
f"{index_url}{package_name}..."
|
283
|
-
)
|
284
|
-
plugin_install_call = [
|
285
|
-
sys.executable,
|
286
|
-
"-m",
|
287
|
-
"pip",
|
288
|
-
"install",
|
289
|
-
"--index-url",
|
290
|
-
index_url,
|
291
|
-
package_name,
|
292
|
-
"--no-deps", # we already installed the requirements above
|
293
|
-
"--upgrade", # we already checked if the plugin is installed above
|
294
|
-
]
|
295
|
-
subprocess.check_call(plugin_install_call)
|
296
|
-
declare(f"Successfully installed plugin '{display_name}'.")
|
297
|
-
|
298
|
-
|
299
|
-
@hub.command("uninstall")
|
300
|
-
@click.argument("plugin_name", type=str, required=True)
|
301
|
-
def uninstall_plugin(plugin_name: str) -> None:
|
302
|
-
"""Uninstall a ZenML Hub plugin.
|
303
|
-
|
304
|
-
Args:
|
305
|
-
plugin_name: Name of the plugin.
|
306
|
-
"""
|
307
|
-
with track_handler(
|
308
|
-
event=AnalyticsEvent.ZENML_HUB_PLUGIN_UNINSTALL,
|
309
|
-
) as analytics_handler:
|
310
|
-
client = HubClient()
|
311
|
-
analytics_handler.metadata["hub_url"] = client.url
|
312
|
-
author, plugin_name, plugin_version = parse_plugin_name(plugin_name)
|
313
|
-
analytics_handler.metadata["plugin_name"] = plugin_name
|
314
|
-
analytics_handler.metadata["plugin_author"] = author
|
315
|
-
display_name = plugin_display_name(plugin_name, plugin_version, author)
|
316
|
-
|
317
|
-
# Get plugin from hub
|
318
|
-
plugin = client.get_plugin(
|
319
|
-
name=plugin_name,
|
320
|
-
version=plugin_version,
|
321
|
-
author=author,
|
322
|
-
)
|
323
|
-
if not plugin:
|
324
|
-
error(f"Could not find plugin '{display_name}' on the hub.")
|
325
|
-
analytics_handler.metadata["plugin_version"] = plugin.version
|
326
|
-
|
327
|
-
# Check if plugin can be uninstalled
|
328
|
-
package_name = plugin.package_name
|
329
|
-
if not package_name:
|
330
|
-
error(
|
331
|
-
f"Plugin '{display_name}' is not available for uninstallation."
|
332
|
-
)
|
333
|
-
|
334
|
-
# pip uninstall the wheel
|
335
|
-
declare(f"Uninstalling plugin '{display_name}'...")
|
336
|
-
subprocess.check_call(
|
337
|
-
[sys.executable, "-m", "pip", "uninstall", package_name, "-y"]
|
338
|
-
)
|
339
|
-
declare(f"Successfully uninstalled plugin '{display_name}'.")
|
340
|
-
|
341
|
-
|
342
|
-
@hub.command("clone")
|
343
|
-
@click.argument("plugin_name", type=str, required=True)
|
344
|
-
@click.option(
|
345
|
-
"--output_dir",
|
346
|
-
"-o",
|
347
|
-
type=str,
|
348
|
-
help="Output directory to clone the plugin to.",
|
349
|
-
)
|
350
|
-
def clone_plugin(
|
351
|
-
plugin_name: str,
|
352
|
-
output_dir: Optional[str] = None,
|
353
|
-
) -> None:
|
354
|
-
"""Clone the source code of a ZenML Hub plugin.
|
355
|
-
|
356
|
-
Args:
|
357
|
-
plugin_name: Name of the plugin.
|
358
|
-
output_dir: Output directory to clone the plugin to. If not specified,
|
359
|
-
the plugin will be cloned to a directory with the same name as the
|
360
|
-
plugin in the current working directory.
|
361
|
-
"""
|
362
|
-
from zenml.utils.git_utils import clone_git_repository
|
363
|
-
|
364
|
-
with track_handler(
|
365
|
-
event=AnalyticsEvent.ZENML_HUB_PLUGIN_CLONE,
|
366
|
-
) as analytics_handler:
|
367
|
-
client = HubClient()
|
368
|
-
analytics_handler.metadata["hub_url"] = client.url
|
369
|
-
author, plugin_name, plugin_version = parse_plugin_name(plugin_name)
|
370
|
-
analytics_handler.metadata["plugin_name"] = plugin_name
|
371
|
-
analytics_handler.metadata["plugin_author"] = author
|
372
|
-
display_name = plugin_display_name(plugin_name, plugin_version, author)
|
373
|
-
|
374
|
-
# Get plugin from hub
|
375
|
-
plugin = client.get_plugin(
|
376
|
-
name=plugin_name,
|
377
|
-
version=plugin_version,
|
378
|
-
author=author,
|
379
|
-
)
|
380
|
-
if not plugin:
|
381
|
-
error(f"Could not find plugin '{display_name}' on the hub.")
|
382
|
-
analytics_handler.metadata["plugin_version"] = plugin.version
|
383
|
-
|
384
|
-
# Clone the source repo to a temp dir, then move the plugin subdir out
|
385
|
-
repo_url = plugin.repository_url
|
386
|
-
subdir = plugin.repository_subdirectory
|
387
|
-
commit = plugin.repository_commit
|
388
|
-
if output_dir is None:
|
389
|
-
output_dir = os.path.join(os.getcwd(), plugin_name)
|
390
|
-
declare(f"Cloning plugin '{display_name}' to {output_dir}...")
|
391
|
-
with tempfile.TemporaryDirectory() as tmp_dir:
|
392
|
-
try:
|
393
|
-
clone_git_repository(
|
394
|
-
url=repo_url, to_path=tmp_dir, commit=commit
|
395
|
-
)
|
396
|
-
except RuntimeError:
|
397
|
-
error(
|
398
|
-
f"Could not find commit '{commit}' in repository "
|
399
|
-
f"'{repo_url}' of plugin '{display_name}'. This might "
|
400
|
-
"happen if the owner of the plugin has force-pushed to the "
|
401
|
-
"plugin repository or taken it down. Please report this "
|
402
|
-
"plugin version in the ZenML Hub or via Slack."
|
403
|
-
)
|
404
|
-
plugin_dir = os.path.join(tmp_dir, subdir or "")
|
405
|
-
shutil.move(plugin_dir, output_dir)
|
406
|
-
declare(f"Successfully Cloned plugin '{display_name}'.")
|
407
|
-
|
408
|
-
|
409
|
-
@hub.command("login")
|
410
|
-
@click.option(
|
411
|
-
"--github",
|
412
|
-
"-g",
|
413
|
-
is_flag=True,
|
414
|
-
help="Login via GitHub.",
|
415
|
-
)
|
416
|
-
@click.option(
|
417
|
-
"--email",
|
418
|
-
"-e",
|
419
|
-
type=str,
|
420
|
-
help="Login via ZenML Hub account using this email address.",
|
421
|
-
)
|
422
|
-
@click.option(
|
423
|
-
"--password",
|
424
|
-
"-p",
|
425
|
-
type=str,
|
426
|
-
help="Password of the ZenML Hub account.",
|
427
|
-
)
|
428
|
-
def login(
|
429
|
-
github: bool = False,
|
430
|
-
email: Optional[str] = None,
|
431
|
-
password: Optional[str] = None,
|
432
|
-
) -> None:
|
433
|
-
"""Login to the ZenML Hub.
|
434
|
-
|
435
|
-
Args:
|
436
|
-
github: Login via GitHub.
|
437
|
-
email: Login via ZenML Hub account using this email address.
|
438
|
-
password: Password of the ZenML Hub account. Only used if `email` is
|
439
|
-
specified.
|
440
|
-
"""
|
441
|
-
if github:
|
442
|
-
_login_via_github()
|
443
|
-
elif email:
|
444
|
-
if not password:
|
445
|
-
password = click.prompt("Password", type=str, hide_input=True)
|
446
|
-
_login_via_zenml_hub(email, password)
|
447
|
-
else:
|
448
|
-
declare(
|
449
|
-
"You can either login via your ZenML Hub account or via GitHub."
|
450
|
-
)
|
451
|
-
confirmation = click.confirm("Login via ZenML Hub account?")
|
452
|
-
if confirmation:
|
453
|
-
_login_via_zenml_hub()
|
454
|
-
else:
|
455
|
-
_login_via_github()
|
456
|
-
|
457
|
-
|
458
|
-
def _login_via_zenml_hub(
|
459
|
-
email: Optional[str] = None, password: Optional[str] = None
|
460
|
-
) -> None:
|
461
|
-
"""Login via ZenML Hub email and password.
|
462
|
-
|
463
|
-
Args:
|
464
|
-
email: Login via ZenML Hub account using this email address.
|
465
|
-
password: Password of the ZenML Hub account. Only used if `email` is
|
466
|
-
specified.
|
467
|
-
"""
|
468
|
-
client = HubClient()
|
469
|
-
if not email or not password:
|
470
|
-
declare("Please enter your ZenML Hub credentials.")
|
471
|
-
while not email:
|
472
|
-
email = click.prompt("Email", type=str)
|
473
|
-
while not password:
|
474
|
-
password = click.prompt("Password", type=str, hide_input=True)
|
475
|
-
try:
|
476
|
-
client.login(email, password)
|
477
|
-
me = client.get_me()
|
478
|
-
if me:
|
479
|
-
declare(f"Successfully logged in as: {me.username} ({me.email})!")
|
480
|
-
return
|
481
|
-
error("Could not retrieve user information from the ZenML Hub.")
|
482
|
-
except HubAPIError as e:
|
483
|
-
error(f"Could not login to the ZenML Hub: {e}")
|
484
|
-
|
485
|
-
|
486
|
-
def _login_via_github() -> None:
|
487
|
-
"""Login via GitHub."""
|
488
|
-
client = HubClient()
|
489
|
-
try:
|
490
|
-
login_url = client.get_github_login_url()
|
491
|
-
except HubAPIError as e:
|
492
|
-
error(f"Could not retrieve GitHub login URL: {e}")
|
493
|
-
declare(f"Please open the following URL in your browser: {login_url}")
|
494
|
-
auth_token = click.prompt("Please enter your auth token", type=str)
|
495
|
-
client.set_auth_token(auth_token)
|
496
|
-
declare("Successfully logged in to the ZenML Hub.")
|
497
|
-
|
498
|
-
|
499
|
-
@hub.command("logout")
|
500
|
-
def logout() -> None:
|
501
|
-
"""Logout from the ZenML Hub."""
|
502
|
-
client = HubClient()
|
503
|
-
client.set_auth_token(None)
|
504
|
-
declare("Successfully logged out from the ZenML Hub.")
|
505
|
-
|
506
|
-
|
507
|
-
@hub.command("submit")
|
508
|
-
@click.option(
|
509
|
-
"--plugin_name",
|
510
|
-
"-n",
|
511
|
-
type=str,
|
512
|
-
help=(
|
513
|
-
"Name of the plugin to submit. If not provided, the name will be asked "
|
514
|
-
"for interactively."
|
515
|
-
),
|
516
|
-
)
|
517
|
-
@click.option(
|
518
|
-
"--version",
|
519
|
-
"-v",
|
520
|
-
type=str,
|
521
|
-
help=(
|
522
|
-
"Version of the plugin to submit. Can only be set if the plugin "
|
523
|
-
"already exists. If not provided, the version will be auto-incremented."
|
524
|
-
),
|
525
|
-
)
|
526
|
-
@click.option(
|
527
|
-
"--release_notes",
|
528
|
-
"-r",
|
529
|
-
type=str,
|
530
|
-
help="Release notes for the plugin version.",
|
531
|
-
)
|
532
|
-
@click.option(
|
533
|
-
"--description",
|
534
|
-
"-d",
|
535
|
-
type=str,
|
536
|
-
help="Description of the plugin.",
|
537
|
-
)
|
538
|
-
@click.option(
|
539
|
-
"--repository_url",
|
540
|
-
"-u",
|
541
|
-
type=str,
|
542
|
-
help="URL to the public Git repository containing the plugin source code.",
|
543
|
-
)
|
544
|
-
@click.option(
|
545
|
-
"--repository_subdir",
|
546
|
-
"-s",
|
547
|
-
type=str,
|
548
|
-
help="Subdirectory of the repository containing the plugin source code.",
|
549
|
-
)
|
550
|
-
@click.option(
|
551
|
-
"--repository_branch",
|
552
|
-
"-b",
|
553
|
-
type=str,
|
554
|
-
help="Branch to checkout from the repository.",
|
555
|
-
)
|
556
|
-
@click.option(
|
557
|
-
"--repository_commit",
|
558
|
-
"-c",
|
559
|
-
type=str,
|
560
|
-
help="Commit to checkout from the repository. Overrides --branch.",
|
561
|
-
)
|
562
|
-
@click.option(
|
563
|
-
"tags",
|
564
|
-
"--tag",
|
565
|
-
"-t",
|
566
|
-
type=str,
|
567
|
-
multiple=True,
|
568
|
-
)
|
569
|
-
@click.option(
|
570
|
-
"--interactive",
|
571
|
-
"-i",
|
572
|
-
is_flag=True,
|
573
|
-
help="Run the command in interactive mode.",
|
574
|
-
)
|
575
|
-
def submit_plugin(
|
576
|
-
plugin_name: Optional[str] = None,
|
577
|
-
version: Optional[str] = None,
|
578
|
-
release_notes: Optional[str] = None,
|
579
|
-
description: Optional[str] = None,
|
580
|
-
repository_url: Optional[str] = None,
|
581
|
-
repository_subdir: Optional[str] = None,
|
582
|
-
repository_branch: Optional[str] = None,
|
583
|
-
repository_commit: Optional[str] = None,
|
584
|
-
tags: Optional[List[str]] = None,
|
585
|
-
interactive: bool = False,
|
586
|
-
) -> None:
|
587
|
-
"""Submit a plugin to the ZenML Hub.
|
588
|
-
|
589
|
-
Args:
|
590
|
-
plugin_name: Name of the plugin to submit. Needs to be set unless
|
591
|
-
interactive mode is enabled.
|
592
|
-
version: Version of the plugin to submit. Can only be set if the plugin
|
593
|
-
already exists. If not provided, the version will be
|
594
|
-
auto-incremented.
|
595
|
-
release_notes: Release notes for the plugin version.
|
596
|
-
description: Description of the plugin.
|
597
|
-
repository_url: URL to the public Git repository containing the plugin
|
598
|
-
source code. Needs to be set unless interactive mode is enabled.
|
599
|
-
repository_subdir: Subdirectory of the repository containing the plugin
|
600
|
-
source code.
|
601
|
-
repository_branch: Branch to checkout from the repository.
|
602
|
-
repository_commit: Commit to checkout from the repository. Overrides
|
603
|
-
`repository_branch`.
|
604
|
-
tags: Tags to add to the plugin.
|
605
|
-
interactive: Whether to run the command in interactive mode, asking for
|
606
|
-
missing or invalid parameters.
|
607
|
-
"""
|
608
|
-
with track_handler(
|
609
|
-
event=AnalyticsEvent.ZENML_HUB_PLUGIN_SUBMIT,
|
610
|
-
) as analytics_handler:
|
611
|
-
client = HubClient()
|
612
|
-
analytics_handler.metadata["hub_url"] = client.url
|
613
|
-
|
614
|
-
# Validate that the user is logged in
|
615
|
-
if not client.auth_token:
|
616
|
-
error(
|
617
|
-
"You must be logged in to contribute a plugin to the Hub. "
|
618
|
-
"Please run `zenml hub login` to login."
|
619
|
-
)
|
620
|
-
me = client.get_me()
|
621
|
-
if not me:
|
622
|
-
error("Could not retrieve user information from the ZenML Hub.")
|
623
|
-
if not me.username:
|
624
|
-
error(
|
625
|
-
"Your ZenML Hub account does not have a username yet. Please "
|
626
|
-
"set a username in your account settings and try again."
|
627
|
-
)
|
628
|
-
username = me.username
|
629
|
-
|
630
|
-
# Validate the plugin name and check if it exists
|
631
|
-
plugin_name, plugin_exists = _validate_plugin_name(
|
632
|
-
client=client,
|
633
|
-
plugin_name=plugin_name,
|
634
|
-
username=username,
|
635
|
-
interactive=interactive,
|
636
|
-
)
|
637
|
-
|
638
|
-
# If the plugin exists, ask for version and release notes in
|
639
|
-
# interactive mode.
|
640
|
-
if plugin_exists and interactive:
|
641
|
-
if not version:
|
642
|
-
declare(
|
643
|
-
"You are about to create a new version of plugin "
|
644
|
-
f"'{plugin_name}'. By default, this will increment the "
|
645
|
-
"minor version of the plugin. If you want to specify a "
|
646
|
-
"different version, you can do so below. In that case, "
|
647
|
-
"make sure that the version is of shape '<int>.<int>' and "
|
648
|
-
"is higher than the current latest version of the plugin."
|
649
|
-
)
|
650
|
-
version = click.prompt("(Optional) plugin version", default="")
|
651
|
-
if not release_notes:
|
652
|
-
declare(
|
653
|
-
f"You are about to create a new version of plugin "
|
654
|
-
f"'{plugin_name}'. You can optionally provide release "
|
655
|
-
"notes for this version below."
|
656
|
-
)
|
657
|
-
release_notes = click.prompt(
|
658
|
-
"(Optional) release notes", default=""
|
659
|
-
)
|
660
|
-
|
661
|
-
# Clone the repo and validate the commit / branch / subdir / structure
|
662
|
-
(
|
663
|
-
repository_url,
|
664
|
-
repository_commit,
|
665
|
-
repository_branch,
|
666
|
-
repository_subdir,
|
667
|
-
) = _validate_repository(
|
668
|
-
url=repository_url,
|
669
|
-
commit=repository_commit,
|
670
|
-
branch=repository_branch,
|
671
|
-
subdir=repository_subdir,
|
672
|
-
interactive=interactive,
|
673
|
-
)
|
674
|
-
|
675
|
-
# In interactive mode, ask for a description if none is provided
|
676
|
-
if interactive and not description:
|
677
|
-
declare(
|
678
|
-
"You can optionally provide a description for your plugin "
|
679
|
-
"below. If not set, the first line of your README.md will "
|
680
|
-
"be used."
|
681
|
-
)
|
682
|
-
description = click.prompt(
|
683
|
-
"(Optional) plugin description", default=""
|
684
|
-
)
|
685
|
-
|
686
|
-
# Validate the tags
|
687
|
-
if tags:
|
688
|
-
tags = _validate_tags(tags=tags, interactive=interactive)
|
689
|
-
else:
|
690
|
-
tags = []
|
691
|
-
|
692
|
-
# Make a create request to the hub
|
693
|
-
plugin_request = HubPluginRequestModel(
|
694
|
-
name=plugin_name,
|
695
|
-
description=description,
|
696
|
-
version=version,
|
697
|
-
release_notes=release_notes,
|
698
|
-
repository_url=repository_url,
|
699
|
-
repository_subdirectory=repository_subdir,
|
700
|
-
repository_branch=repository_branch,
|
701
|
-
repository_commit=repository_commit,
|
702
|
-
tags=tags,
|
703
|
-
)
|
704
|
-
plugin_response = client.create_plugin(
|
705
|
-
plugin_request=plugin_request,
|
706
|
-
)
|
707
|
-
|
708
|
-
# Stream the build logs
|
709
|
-
plugin_name = plugin_response.name
|
710
|
-
plugin_version = plugin_response.version
|
711
|
-
declare(
|
712
|
-
"Thanks for submitting your plugin to the ZenML Hub. The plugin is "
|
713
|
-
"now being built into an installable package. This may take a few "
|
714
|
-
"minutes. To view the build logs, run "
|
715
|
-
f"`zenml hub logs {username}/{plugin_name}:{plugin_version}`."
|
716
|
-
)
|
717
|
-
|
718
|
-
|
719
|
-
def _validate_plugin_name(
|
720
|
-
client: HubClient,
|
721
|
-
plugin_name: Optional[str],
|
722
|
-
username: str,
|
723
|
-
interactive: bool,
|
724
|
-
) -> Tuple[str, bool]:
|
725
|
-
"""Validate that the plugin name is provided and available.
|
726
|
-
|
727
|
-
Args:
|
728
|
-
client: The Hub client used to check if the plugin name is available.
|
729
|
-
plugin_name: The plugin name to validate.
|
730
|
-
username: The username of the current user.
|
731
|
-
interactive: Whether to run in interactive mode.
|
732
|
-
|
733
|
-
Returns:
|
734
|
-
The validated plugin name, and whether the plugin already exists.
|
735
|
-
"""
|
736
|
-
# Make sure the plugin name is provided.
|
737
|
-
while not plugin_name:
|
738
|
-
if not interactive:
|
739
|
-
error("Plugin name not provided.")
|
740
|
-
declare("Please enter a name for the plugin.")
|
741
|
-
plugin_name = click.prompt("Plugin name")
|
742
|
-
|
743
|
-
existing_plugin = client.get_plugin(name=plugin_name, author=username)
|
744
|
-
return plugin_name, bool(existing_plugin)
|
745
|
-
|
746
|
-
|
747
|
-
def _validate_repository(
|
748
|
-
url: Optional[str],
|
749
|
-
commit: Optional[str],
|
750
|
-
branch: Optional[str],
|
751
|
-
subdir: Optional[str],
|
752
|
-
interactive: bool,
|
753
|
-
) -> Tuple[str, Optional[str], Optional[str], Optional[str]]:
|
754
|
-
"""Validate the provided repository arguments.
|
755
|
-
|
756
|
-
Args:
|
757
|
-
url: The URL to the repository to clone.
|
758
|
-
commit: The commit to checkout.
|
759
|
-
branch: The branch to checkout. Will be ignored if commit is provided.
|
760
|
-
subdir: The subdirectory in which the plugin is located.
|
761
|
-
interactive: Whether to run in interactive mode.
|
762
|
-
|
763
|
-
Returns:
|
764
|
-
The validated URL, commit, branch, and subdirectory.
|
765
|
-
"""
|
766
|
-
from zenml.utils.git_utils import clone_git_repository
|
767
|
-
|
768
|
-
while True:
|
769
|
-
# Make sure the repository URL is provided.
|
770
|
-
if not url:
|
771
|
-
if not interactive:
|
772
|
-
error("Repository URL not provided.")
|
773
|
-
declare(
|
774
|
-
"Please enter the URL to the public Git repository containing "
|
775
|
-
"the plugin source code."
|
776
|
-
)
|
777
|
-
url = click.prompt("Repository URL")
|
778
|
-
assert url is not None
|
779
|
-
|
780
|
-
# In interactive mode, ask for the branch and commit if not provided
|
781
|
-
if interactive and not branch and not commit:
|
782
|
-
confirmation = click.confirm(
|
783
|
-
"Do you want to use the latest commit from the 'main' branch "
|
784
|
-
"of the repository?"
|
785
|
-
)
|
786
|
-
if not confirmation:
|
787
|
-
confirmation = click.confirm(
|
788
|
-
"You can either use a specific commit or the latest commit "
|
789
|
-
"from one of your branches. Do you want to use a specific "
|
790
|
-
"commit?"
|
791
|
-
)
|
792
|
-
if confirmation:
|
793
|
-
declare("Please enter the SHA of the commit.")
|
794
|
-
commit = click.prompt("Repository commit")
|
795
|
-
branch = None
|
796
|
-
else:
|
797
|
-
declare("Please enter the name of a branch.")
|
798
|
-
branch = click.prompt("Repository branch")
|
799
|
-
commit = None
|
800
|
-
|
801
|
-
try:
|
802
|
-
# Check if the URL/branch/commit are valid.
|
803
|
-
with tempfile.TemporaryDirectory() as tmp_dir:
|
804
|
-
clone_git_repository(
|
805
|
-
url=url,
|
806
|
-
commit=commit,
|
807
|
-
branch=branch,
|
808
|
-
to_path=tmp_dir,
|
809
|
-
)
|
810
|
-
|
811
|
-
# Check if the subdir exists and has the correct structure.
|
812
|
-
subdir = _validate_repository_subdir(
|
813
|
-
repository_subdir=subdir,
|
814
|
-
repo_path=tmp_dir,
|
815
|
-
interactive=interactive,
|
816
|
-
)
|
817
|
-
|
818
|
-
return url, commit, branch, subdir
|
819
|
-
|
820
|
-
except RuntimeError:
|
821
|
-
repo_display_name = f"'{url}'"
|
822
|
-
suggestion = "Please enter a valid repository URL"
|
823
|
-
if commit:
|
824
|
-
repo_display_name += f" (commit '{commit}')"
|
825
|
-
suggestion += " and make sure the commit exists."
|
826
|
-
elif branch:
|
827
|
-
repo_display_name += f" (branch '{branch}')"
|
828
|
-
suggestion += " and make sure the branch exists."
|
829
|
-
else:
|
830
|
-
suggestion += " and make sure the 'main' branch exists."
|
831
|
-
msg = f"Could not clone repository from URL {repo_display_name}. "
|
832
|
-
if not interactive:
|
833
|
-
error(msg + suggestion)
|
834
|
-
declare(msg + suggestion)
|
835
|
-
url, branch, commit = None, None, None
|
836
|
-
|
837
|
-
|
838
|
-
def _validate_repository_subdir(
|
839
|
-
repository_subdir: Optional[str], repo_path: str, interactive: bool
|
840
|
-
) -> Optional[str]:
|
841
|
-
"""Validate the provided repository subdirectory.
|
842
|
-
|
843
|
-
Args:
|
844
|
-
repository_subdir: The subdirectory to validate.
|
845
|
-
repo_path: The path to the repository to validate the subdirectory in.
|
846
|
-
interactive: Whether to run in interactive mode.
|
847
|
-
|
848
|
-
Returns:
|
849
|
-
The validated subdirectory.
|
850
|
-
"""
|
851
|
-
while True:
|
852
|
-
# In interactive mode, ask for the subdirectory if not provided
|
853
|
-
if interactive and not repository_subdir:
|
854
|
-
confirmation = click.confirm(
|
855
|
-
"Is the plugin source code in the root of the repository?"
|
856
|
-
)
|
857
|
-
if not confirmation:
|
858
|
-
declare(
|
859
|
-
"Please enter the subdirectory of the repository "
|
860
|
-
"containing the plugin source code."
|
861
|
-
)
|
862
|
-
repository_subdir = click.prompt("Repository subdirectory")
|
863
|
-
|
864
|
-
# If a subdir was provided, make sure it exists
|
865
|
-
if repository_subdir:
|
866
|
-
subdir_path = os.path.join(repo_path, repository_subdir)
|
867
|
-
if not os.path.exists(subdir_path):
|
868
|
-
if not interactive:
|
869
|
-
error("Repository subdirectory does not exist.")
|
870
|
-
declare(
|
871
|
-
f"Subdirectory '{repository_subdir}' does not exist in the "
|
872
|
-
f"repository."
|
873
|
-
)
|
874
|
-
declare("Please enter a valid subdirectory.")
|
875
|
-
repository_subdir = click.prompt(
|
876
|
-
"Repository subdirectory", default=""
|
877
|
-
)
|
878
|
-
continue
|
879
|
-
|
880
|
-
# Check if the plugin structure is valid.
|
881
|
-
if repository_subdir:
|
882
|
-
plugin_path = os.path.join(repo_path, repository_subdir)
|
883
|
-
else:
|
884
|
-
plugin_path = repo_path
|
885
|
-
try:
|
886
|
-
_validate_repository_structure(plugin_path)
|
887
|
-
return repository_subdir
|
888
|
-
except ValueError as e:
|
889
|
-
msg = (
|
890
|
-
f"Plugin code structure at {repository_subdir} is invalid: "
|
891
|
-
f"{str(e)}"
|
892
|
-
)
|
893
|
-
if not interactive:
|
894
|
-
error(str(e))
|
895
|
-
declare(msg)
|
896
|
-
declare("Please enter a valid subdirectory.")
|
897
|
-
repository_subdir = click.prompt("Repository subdirectory")
|
898
|
-
|
899
|
-
|
900
|
-
def _validate_repository_structure(plugin_root: str) -> None:
|
901
|
-
"""Validate the repository structure of a submitted ZenML Hub plugin.
|
902
|
-
|
903
|
-
We expect the following structure:
|
904
|
-
- src/__init__.py
|
905
|
-
- README.md
|
906
|
-
- requirements.txt
|
907
|
-
- (Optional) logo.png
|
908
|
-
|
909
|
-
Args:
|
910
|
-
plugin_root: Root directory of the plugin.
|
911
|
-
|
912
|
-
Raises:
|
913
|
-
ValueError: If the repo does not have the correct structure.
|
914
|
-
"""
|
915
|
-
# src/__init__.py exists.
|
916
|
-
src_path = os.path.join(plugin_root, "src")
|
917
|
-
if not os.path.exists(src_path):
|
918
|
-
raise ValueError("src/ not found")
|
919
|
-
init_path = os.path.join(src_path, "__init__.py")
|
920
|
-
if not os.path.exists(init_path):
|
921
|
-
raise ValueError("src/__init__.py not found")
|
922
|
-
|
923
|
-
# README.md exists.
|
924
|
-
readme_path = os.path.join(plugin_root, "README.md")
|
925
|
-
if not os.path.exists(readme_path):
|
926
|
-
raise ValueError("README.md not found")
|
927
|
-
|
928
|
-
# requirements.txt exists.
|
929
|
-
requirements_path = os.path.join(plugin_root, "requirements.txt")
|
930
|
-
if not os.path.exists(requirements_path):
|
931
|
-
raise ValueError("requirements.txt not found")
|
932
|
-
|
933
|
-
|
934
|
-
def _validate_tags(tags: List[str], interactive: bool) -> List[str]:
|
935
|
-
"""Validate the provided tags.
|
936
|
-
|
937
|
-
Args:
|
938
|
-
tags: The tags to validate.
|
939
|
-
interactive: Whether to run in interactive mode.
|
940
|
-
|
941
|
-
Returns:
|
942
|
-
The validated tags.
|
943
|
-
"""
|
944
|
-
if not tags:
|
945
|
-
if not interactive:
|
946
|
-
return []
|
947
|
-
|
948
|
-
# In interactive mode, ask for tags if none were provided.
|
949
|
-
return _ask_for_tags()
|
950
|
-
|
951
|
-
# If tags were provided, print a warning if any of them is invalid.
|
952
|
-
for tag in tags:
|
953
|
-
if tag.startswith(ZENML_HUB_INTERNAL_TAG_PREFIX):
|
954
|
-
warning(
|
955
|
-
f"Tag '{tag}' will be ignored because it starts with "
|
956
|
-
f"disallowed prefix '{ZENML_HUB_INTERNAL_TAG_PREFIX}'."
|
957
|
-
)
|
958
|
-
return tags
|
959
|
-
|
960
|
-
|
961
|
-
def _ask_for_tags() -> List[str]:
|
962
|
-
"""Repeatedly ask the user for tags to assign to the plugin.
|
963
|
-
|
964
|
-
Returns:
|
965
|
-
A list of tags.
|
966
|
-
"""
|
967
|
-
tags: List[str] = []
|
968
|
-
while True:
|
969
|
-
tag = click.prompt(
|
970
|
-
"(Optional) enter tags you want to assign to the plugin.",
|
971
|
-
default="",
|
972
|
-
)
|
973
|
-
if not tag:
|
974
|
-
return tags
|
975
|
-
if tag.startswith(ZENML_HUB_INTERNAL_TAG_PREFIX):
|
976
|
-
warning(
|
977
|
-
"User-defined tags may not start with "
|
978
|
-
f"'{ZENML_HUB_INTERNAL_TAG_PREFIX}'."
|
979
|
-
)
|
980
|
-
else:
|
981
|
-
tags.append(tag)
|
982
|
-
|
983
|
-
|
984
|
-
@hub.command("submit-batch")
|
985
|
-
@click.argument(
|
986
|
-
"config", type=click.Path(exists=True, dir_okay=False), required=True
|
987
|
-
)
|
988
|
-
def batch_submit(config: str) -> None:
|
989
|
-
"""Batch submit plugins to the ZenML Hub.
|
990
|
-
|
991
|
-
WARNING: This command is intended for advanced users only. It does not
|
992
|
-
perform any client-side validation which might lead to server-side HTTP
|
993
|
-
errors that are hard to debug if the config file you specify is invalid or
|
994
|
-
contains invalid plugin definitions. When in doubt, use the
|
995
|
-
`zenml hub submit` command instead.
|
996
|
-
|
997
|
-
Args:
|
998
|
-
config: Path to the config file. The config file is expected to be a
|
999
|
-
list of plugin definitions. Each plugin definition must be a dict
|
1000
|
-
with keys and values matching the fields of `HubPluginRequestModel`:
|
1001
|
-
```yaml
|
1002
|
-
- name: str
|
1003
|
-
version: str
|
1004
|
-
release_notes: str
|
1005
|
-
description: str
|
1006
|
-
repository_url: str
|
1007
|
-
repository_subdirectory: str
|
1008
|
-
repository_branch: str
|
1009
|
-
repository_commit: str
|
1010
|
-
logo_url: str
|
1011
|
-
tags:
|
1012
|
-
- str
|
1013
|
-
- ...
|
1014
|
-
- ...
|
1015
|
-
```
|
1016
|
-
"""
|
1017
|
-
from pydantic import ValidationError
|
1018
|
-
|
1019
|
-
from zenml.utils.yaml_utils import read_yaml
|
1020
|
-
|
1021
|
-
client = HubClient()
|
1022
|
-
config = read_yaml(config)
|
1023
|
-
if not isinstance(config, list):
|
1024
|
-
error("Config file must be a list of plugin definitions.")
|
1025
|
-
declare(f"Submitting {len(config)} plugins to the hub...")
|
1026
|
-
for plugin_dict in config:
|
1027
|
-
try:
|
1028
|
-
assert isinstance(plugin_dict, dict)
|
1029
|
-
plugin_request = HubPluginRequestModel(**plugin_dict)
|
1030
|
-
plugin = client.create_plugin(plugin_request=plugin_request)
|
1031
|
-
except (AssertionError, ValidationError, HubAPIError) as e:
|
1032
|
-
warning(f"Could not submit plugin: {str(e)}")
|
1033
|
-
continue
|
1034
|
-
display_name = plugin_display_name(
|
1035
|
-
name=plugin.name,
|
1036
|
-
version=plugin.version,
|
1037
|
-
author=plugin.author,
|
1038
|
-
)
|
1039
|
-
declare(f"Submitted plugin '{display_name}' to the hub.")
|
1040
|
-
|
1041
|
-
|
1042
|
-
@hub.command("logs")
|
1043
|
-
@click.argument("plugin_name", type=str, required=True)
|
1044
|
-
def get_logs(plugin_name: str) -> None:
|
1045
|
-
"""Get the build logs of a ZenML Hub plugin.
|
1046
|
-
|
1047
|
-
Args:
|
1048
|
-
plugin_name: Name of the plugin.
|
1049
|
-
"""
|
1050
|
-
client = HubClient()
|
1051
|
-
author, plugin_name, plugin_version = parse_plugin_name(plugin_name)
|
1052
|
-
display_name = plugin_display_name(plugin_name, plugin_version, author)
|
1053
|
-
|
1054
|
-
# Get the plugin from the hub
|
1055
|
-
plugin = client.get_plugin(
|
1056
|
-
name=plugin_name,
|
1057
|
-
version=plugin_version,
|
1058
|
-
author=author,
|
1059
|
-
)
|
1060
|
-
if not plugin:
|
1061
|
-
error(f"Could not find plugin '{display_name}' on the hub.")
|
1062
|
-
|
1063
|
-
if plugin.status == PluginStatus.PENDING:
|
1064
|
-
error(
|
1065
|
-
f"Plugin '{display_name}' is still being built. Please try "
|
1066
|
-
"again later."
|
1067
|
-
)
|
1068
|
-
|
1069
|
-
if not plugin.build_logs:
|
1070
|
-
declare(
|
1071
|
-
f"Plugin '{display_name}' finished building, but no logs "
|
1072
|
-
"were found."
|
1073
|
-
)
|
1074
|
-
return
|
1075
|
-
|
1076
|
-
for line in plugin.build_logs.splitlines():
|
1077
|
-
declare(line)
|
1078
|
-
|
1079
|
-
|
1080
|
-
# GENERAL HELPER FUNCTIONS
|
1081
|
-
|
1082
|
-
|
1083
|
-
def _is_plugin_installed(author: str, plugin_name: str) -> bool:
|
1084
|
-
"""Helper function to check if a plugin is installed.
|
1085
|
-
|
1086
|
-
Args:
|
1087
|
-
author: The author of the plugin.
|
1088
|
-
plugin_name: The name of the plugin.
|
1089
|
-
|
1090
|
-
Returns:
|
1091
|
-
Whether the plugin is installed.
|
1092
|
-
"""
|
1093
|
-
module_name = _get_plugin_module(author=author, plugin_name=plugin_name)
|
1094
|
-
try:
|
1095
|
-
spec = find_spec(module_name)
|
1096
|
-
return spec is not None
|
1097
|
-
except ModuleNotFoundError:
|
1098
|
-
return False
|
1099
|
-
|
1100
|
-
|
1101
|
-
def _get_plugin_module(author: str, plugin_name: str) -> str:
|
1102
|
-
"""Helper function to get the module name of a plugin.
|
1103
|
-
|
1104
|
-
Args:
|
1105
|
-
author: The author of the plugin.
|
1106
|
-
plugin_name: The name of the plugin.
|
1107
|
-
|
1108
|
-
Returns:
|
1109
|
-
The module name of the plugin.
|
1110
|
-
"""
|
1111
|
-
module_name = "zenml.hub"
|
1112
|
-
if author != ZENML_HUB_ADMIN_USERNAME:
|
1113
|
-
module_name += f".{author}"
|
1114
|
-
module_name += f".{plugin_name}"
|
1115
|
-
return module_name
|