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/models/v2/base/filter.py
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Base filter model definitions."""
|
15
15
|
|
16
|
+
import json
|
16
17
|
from abc import ABC, abstractmethod
|
17
18
|
from datetime import datetime
|
18
19
|
from typing import (
|
@@ -30,8 +31,13 @@ from typing import (
|
|
30
31
|
)
|
31
32
|
from uuid import UUID
|
32
33
|
|
33
|
-
from pydantic import
|
34
|
-
|
34
|
+
from pydantic import (
|
35
|
+
BaseModel,
|
36
|
+
Field,
|
37
|
+
field_validator,
|
38
|
+
model_validator,
|
39
|
+
)
|
40
|
+
from sqlalchemy import Float, and_, asc, cast, desc
|
35
41
|
from sqlmodel import SQLModel
|
36
42
|
|
37
43
|
from zenml.constants import (
|
@@ -43,11 +49,13 @@ from zenml.constants import (
|
|
43
49
|
from zenml.enums import GenericFilterOps, LogicalOperators, SorterOps
|
44
50
|
from zenml.exceptions import ValidationError
|
45
51
|
from zenml.logger import get_logger
|
52
|
+
from zenml.utils.pydantic_utils import before_validator_handler
|
53
|
+
from zenml.utils.typing_utils import get_args
|
46
54
|
|
47
55
|
if TYPE_CHECKING:
|
48
|
-
from sqlalchemy.sql.elements import
|
56
|
+
from sqlalchemy.sql.elements import ColumnElement
|
49
57
|
|
50
|
-
from zenml.zen_stores.schemas import BaseSchema
|
58
|
+
from zenml.zen_stores.schemas import BaseSchema, NamedSchema
|
51
59
|
|
52
60
|
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
53
61
|
|
@@ -56,6 +64,11 @@ logger = get_logger(__name__)
|
|
56
64
|
|
57
65
|
AnyQuery = TypeVar("AnyQuery", bound=Any)
|
58
66
|
|
67
|
+
ONEOF_ERROR = (
|
68
|
+
"When you are using the 'oneof:' filtering make sure that the "
|
69
|
+
"provided value is a json formatted list."
|
70
|
+
)
|
71
|
+
|
59
72
|
|
60
73
|
class Filter(BaseModel, ABC):
|
61
74
|
"""Filter for all fields.
|
@@ -73,14 +86,15 @@ class Filter(BaseModel, ABC):
|
|
73
86
|
|
74
87
|
operation: GenericFilterOps
|
75
88
|
column: str
|
76
|
-
value: Any
|
89
|
+
value: Optional[Any] = None
|
77
90
|
|
78
|
-
@
|
79
|
-
|
91
|
+
@field_validator("operation", mode="before")
|
92
|
+
@classmethod
|
93
|
+
def validate_operation(cls, value: Any) -> Any:
|
80
94
|
"""Validate that the operation is a valid op for the field type.
|
81
95
|
|
82
96
|
Args:
|
83
|
-
|
97
|
+
value: The operation of this filter.
|
84
98
|
|
85
99
|
Returns:
|
86
100
|
The operation if it is valid.
|
@@ -88,18 +102,18 @@ class Filter(BaseModel, ABC):
|
|
88
102
|
Raises:
|
89
103
|
ValueError: If the operation is not valid for this field type.
|
90
104
|
"""
|
91
|
-
if
|
105
|
+
if value not in cls.ALLOWED_OPS:
|
92
106
|
raise ValueError(
|
93
107
|
f"This datatype can not be filtered using this operation: "
|
94
|
-
f"'{
|
108
|
+
f"'{value}'. The allowed operations are: {cls.ALLOWED_OPS}"
|
95
109
|
)
|
96
110
|
else:
|
97
|
-
return
|
111
|
+
return value
|
98
112
|
|
99
113
|
def generate_query_conditions(
|
100
114
|
self,
|
101
115
|
table: Type[SQLModel],
|
102
|
-
) ->
|
116
|
+
) -> "ColumnElement[bool]":
|
103
117
|
"""Generate the query conditions for the database.
|
104
118
|
|
105
119
|
This method converts the Filter class into an appropriate SQLModel
|
@@ -134,7 +148,10 @@ class Filter(BaseModel, ABC):
|
|
134
148
|
class BoolFilter(Filter):
|
135
149
|
"""Filter for all Boolean fields."""
|
136
150
|
|
137
|
-
ALLOWED_OPS: ClassVar[List[str]] = [
|
151
|
+
ALLOWED_OPS: ClassVar[List[str]] = [
|
152
|
+
GenericFilterOps.EQUALS,
|
153
|
+
GenericFilterOps.NOT_EQUALS,
|
154
|
+
]
|
138
155
|
|
139
156
|
def generate_query_conditions_from_column(self, column: Any) -> Any:
|
140
157
|
"""Generate query conditions for a boolean column.
|
@@ -145,6 +162,9 @@ class BoolFilter(Filter):
|
|
145
162
|
Returns:
|
146
163
|
A list of query conditions.
|
147
164
|
"""
|
165
|
+
if self.operation == GenericFilterOps.NOT_EQUALS:
|
166
|
+
return column != self.value
|
167
|
+
|
148
168
|
return column == self.value
|
149
169
|
|
150
170
|
|
@@ -153,11 +173,32 @@ class StrFilter(Filter):
|
|
153
173
|
|
154
174
|
ALLOWED_OPS: ClassVar[List[str]] = [
|
155
175
|
GenericFilterOps.EQUALS,
|
176
|
+
GenericFilterOps.NOT_EQUALS,
|
156
177
|
GenericFilterOps.STARTSWITH,
|
157
178
|
GenericFilterOps.CONTAINS,
|
158
179
|
GenericFilterOps.ENDSWITH,
|
180
|
+
GenericFilterOps.ONEOF,
|
181
|
+
GenericFilterOps.GT,
|
182
|
+
GenericFilterOps.GTE,
|
183
|
+
GenericFilterOps.LT,
|
184
|
+
GenericFilterOps.LTE,
|
159
185
|
]
|
160
186
|
|
187
|
+
@model_validator(mode="after")
|
188
|
+
def check_value_if_operation_oneof(self) -> "StrFilter":
|
189
|
+
"""Validator to check if value is a list if oneof operation is used.
|
190
|
+
|
191
|
+
Raises:
|
192
|
+
ValueError: If the value is not a list
|
193
|
+
|
194
|
+
Returns:
|
195
|
+
self
|
196
|
+
"""
|
197
|
+
if self.operation == GenericFilterOps.ONEOF:
|
198
|
+
if not isinstance(self.value, list):
|
199
|
+
raise ValueError(ONEOF_ERROR)
|
200
|
+
return self
|
201
|
+
|
161
202
|
def generate_query_conditions_from_column(self, column: Any) -> Any:
|
162
203
|
"""Generate query conditions for a string column.
|
163
204
|
|
@@ -166,6 +207,9 @@ class StrFilter(Filter):
|
|
166
207
|
|
167
208
|
Returns:
|
168
209
|
A list of query conditions.
|
210
|
+
|
211
|
+
Raises:
|
212
|
+
ValueError: the comparison of the column to a numeric value fails.
|
169
213
|
"""
|
170
214
|
if self.operation == GenericFilterOps.CONTAINS:
|
171
215
|
return column.like(f"%{self.value}%")
|
@@ -173,12 +217,68 @@ class StrFilter(Filter):
|
|
173
217
|
return column.startswith(f"{self.value}")
|
174
218
|
if self.operation == GenericFilterOps.ENDSWITH:
|
175
219
|
return column.endswith(f"{self.value}")
|
220
|
+
if self.operation == GenericFilterOps.NOT_EQUALS:
|
221
|
+
return column != self.value
|
222
|
+
if self.operation == GenericFilterOps.ONEOF:
|
223
|
+
return column.in_(self.value)
|
224
|
+
if self.operation in {
|
225
|
+
GenericFilterOps.GT,
|
226
|
+
GenericFilterOps.LT,
|
227
|
+
GenericFilterOps.GTE,
|
228
|
+
GenericFilterOps.LTE,
|
229
|
+
}:
|
230
|
+
try:
|
231
|
+
numeric_column = cast(column, Float)
|
232
|
+
|
233
|
+
assert self.value is not None
|
234
|
+
|
235
|
+
if self.operation == GenericFilterOps.GT:
|
236
|
+
return and_(
|
237
|
+
numeric_column, numeric_column > float(self.value)
|
238
|
+
)
|
239
|
+
if self.operation == GenericFilterOps.LT:
|
240
|
+
return and_(
|
241
|
+
numeric_column, numeric_column < float(self.value)
|
242
|
+
)
|
243
|
+
if self.operation == GenericFilterOps.GTE:
|
244
|
+
return and_(
|
245
|
+
numeric_column, numeric_column >= float(self.value)
|
246
|
+
)
|
247
|
+
if self.operation == GenericFilterOps.LTE:
|
248
|
+
return and_(
|
249
|
+
numeric_column, numeric_column <= float(self.value)
|
250
|
+
)
|
251
|
+
except Exception as e:
|
252
|
+
raise ValueError(
|
253
|
+
f"Failed to compare the column '{column}' to the "
|
254
|
+
f"value '{self.value}' (must be numeric): {e}"
|
255
|
+
)
|
256
|
+
|
176
257
|
return column == self.value
|
177
258
|
|
178
259
|
|
179
260
|
class UUIDFilter(StrFilter):
|
180
261
|
"""Filter for all uuid fields which are mostly treated like strings."""
|
181
262
|
|
263
|
+
@field_validator("value", mode="before")
|
264
|
+
@classmethod
|
265
|
+
def _remove_hyphens_from_value(cls, value: Any) -> Any:
|
266
|
+
"""Remove hyphens from the value to enable string comparisons.
|
267
|
+
|
268
|
+
Args:
|
269
|
+
value: The filter value.
|
270
|
+
|
271
|
+
Returns:
|
272
|
+
The filter value with removed hyphens.
|
273
|
+
"""
|
274
|
+
if isinstance(value, str):
|
275
|
+
return value.replace("-", "")
|
276
|
+
|
277
|
+
if isinstance(value, list):
|
278
|
+
return [str(v).replace("-", "") for v in value]
|
279
|
+
|
280
|
+
return value
|
281
|
+
|
182
282
|
def generate_query_conditions_from_column(self, column: Any) -> Any:
|
183
283
|
"""Generate query conditions for a UUID column.
|
184
284
|
|
@@ -191,10 +291,21 @@ class UUIDFilter(StrFilter):
|
|
191
291
|
import sqlalchemy
|
192
292
|
from sqlalchemy_utils.functions import cast_if
|
193
293
|
|
294
|
+
from zenml.utils import uuid_utils
|
295
|
+
|
194
296
|
# For equality checks, compare the UUID directly
|
195
297
|
if self.operation == GenericFilterOps.EQUALS:
|
298
|
+
if not uuid_utils.is_valid_uuid(self.value):
|
299
|
+
return False
|
300
|
+
|
196
301
|
return column == self.value
|
197
302
|
|
303
|
+
if self.operation == GenericFilterOps.NOT_EQUALS:
|
304
|
+
if not uuid_utils.is_valid_uuid(self.value):
|
305
|
+
return True
|
306
|
+
|
307
|
+
return column != self.value
|
308
|
+
|
198
309
|
# For all other operations, cast and handle the column as string
|
199
310
|
return super().generate_query_conditions_from_column(
|
200
311
|
column=cast_if(column, sqlalchemy.String)
|
@@ -204,10 +315,11 @@ class UUIDFilter(StrFilter):
|
|
204
315
|
class NumericFilter(Filter):
|
205
316
|
"""Filter for all numeric fields."""
|
206
317
|
|
207
|
-
value: Union[float, datetime]
|
318
|
+
value: Union[float, datetime] = Field(union_mode="left_to_right")
|
208
319
|
|
209
320
|
ALLOWED_OPS: ClassVar[List[str]] = [
|
210
321
|
GenericFilterOps.EQUALS,
|
322
|
+
GenericFilterOps.NOT_EQUALS,
|
211
323
|
GenericFilterOps.GT,
|
212
324
|
GenericFilterOps.GTE,
|
213
325
|
GenericFilterOps.LT,
|
@@ -215,10 +327,10 @@ class NumericFilter(Filter):
|
|
215
327
|
]
|
216
328
|
|
217
329
|
def generate_query_conditions_from_column(self, column: Any) -> Any:
|
218
|
-
"""Generate query conditions for a
|
330
|
+
"""Generate query conditions for a numeric column.
|
219
331
|
|
220
332
|
Args:
|
221
|
-
column: The
|
333
|
+
column: The numeric column of an SQLModel table on which to filter.
|
222
334
|
|
223
335
|
Returns:
|
224
336
|
A list of query conditions.
|
@@ -231,6 +343,53 @@ class NumericFilter(Filter):
|
|
231
343
|
return column <= self.value
|
232
344
|
if self.operation == GenericFilterOps.LT:
|
233
345
|
return column < self.value
|
346
|
+
if self.operation == GenericFilterOps.NOT_EQUALS:
|
347
|
+
return column != self.value
|
348
|
+
return column == self.value
|
349
|
+
|
350
|
+
|
351
|
+
class DatetimeFilter(Filter):
|
352
|
+
"""Filter for all datetime fields."""
|
353
|
+
|
354
|
+
value: Union[datetime, Tuple[datetime, datetime]] = Field(
|
355
|
+
union_mode="left_to_right"
|
356
|
+
)
|
357
|
+
|
358
|
+
ALLOWED_OPS: ClassVar[List[str]] = [
|
359
|
+
GenericFilterOps.EQUALS,
|
360
|
+
GenericFilterOps.NOT_EQUALS,
|
361
|
+
GenericFilterOps.GT,
|
362
|
+
GenericFilterOps.GTE,
|
363
|
+
GenericFilterOps.LT,
|
364
|
+
GenericFilterOps.LTE,
|
365
|
+
GenericFilterOps.IN,
|
366
|
+
]
|
367
|
+
|
368
|
+
def generate_query_conditions_from_column(self, column: Any) -> Any:
|
369
|
+
"""Generate query conditions for a datetime column.
|
370
|
+
|
371
|
+
Args:
|
372
|
+
column: The datetime column of an SQLModel table on which to filter.
|
373
|
+
|
374
|
+
Returns:
|
375
|
+
A list of query conditions.
|
376
|
+
"""
|
377
|
+
if self.operation == GenericFilterOps.IN:
|
378
|
+
assert isinstance(self.value, tuple)
|
379
|
+
lower_bound, upper_bound = self.value
|
380
|
+
return column.between(lower_bound, upper_bound)
|
381
|
+
|
382
|
+
assert isinstance(self.value, datetime)
|
383
|
+
if self.operation == GenericFilterOps.GTE:
|
384
|
+
return column >= self.value
|
385
|
+
if self.operation == GenericFilterOps.GT:
|
386
|
+
return column > self.value
|
387
|
+
if self.operation == GenericFilterOps.LTE:
|
388
|
+
return column <= self.value
|
389
|
+
if self.operation == GenericFilterOps.LT:
|
390
|
+
return column < self.value
|
391
|
+
if self.operation == GenericFilterOps.NOT_EQUALS:
|
392
|
+
return column != self.value
|
234
393
|
return column == self.value
|
235
394
|
|
236
395
|
|
@@ -260,6 +419,7 @@ class BaseFilter(BaseModel):
|
|
260
419
|
"size",
|
261
420
|
"logical_operator",
|
262
421
|
]
|
422
|
+
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = []
|
263
423
|
|
264
424
|
# List of fields that are not even mentioned as options in the CLI.
|
265
425
|
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = []
|
@@ -284,27 +444,29 @@ class BaseFilter(BaseModel):
|
|
284
444
|
le=PAGE_SIZE_MAXIMUM,
|
285
445
|
description="Page size",
|
286
446
|
)
|
287
|
-
|
288
447
|
id: Optional[Union[UUID, str]] = Field(
|
289
|
-
default=None,
|
448
|
+
default=None,
|
449
|
+
description="Id for this resource",
|
450
|
+
union_mode="left_to_right",
|
290
451
|
)
|
291
452
|
created: Optional[Union[datetime, str]] = Field(
|
292
|
-
default=None, description="Created"
|
453
|
+
default=None, description="Created", union_mode="left_to_right"
|
293
454
|
)
|
294
455
|
updated: Optional[Union[datetime, str]] = Field(
|
295
|
-
default=None, description="Updated"
|
456
|
+
default=None, description="Updated", union_mode="left_to_right"
|
296
457
|
)
|
297
458
|
|
298
459
|
_rbac_configuration: Optional[
|
299
460
|
Tuple[UUID, Dict[str, Optional[Set[UUID]]]]
|
300
461
|
] = None
|
301
462
|
|
302
|
-
@
|
303
|
-
|
463
|
+
@field_validator("sort_by", mode="before")
|
464
|
+
@classmethod
|
465
|
+
def validate_sort_by(cls, value: Any) -> Any:
|
304
466
|
"""Validate that the sort_column is a valid column with a valid operand.
|
305
467
|
|
306
468
|
Args:
|
307
|
-
|
469
|
+
value: The sort_by field value.
|
308
470
|
|
309
471
|
Returns:
|
310
472
|
The validated sort_by field value.
|
@@ -316,13 +478,13 @@ class BaseFilter(BaseModel):
|
|
316
478
|
# Somehow pydantic allows you to pass in int values, which will be
|
317
479
|
# interpreted as string, however within the validator they are still
|
318
480
|
# integers, which don't have a .split() method
|
319
|
-
if not isinstance(
|
481
|
+
if not isinstance(value, str):
|
320
482
|
raise ValidationError(
|
321
483
|
f"str type expected for the sort_by field. "
|
322
|
-
f"Received a {type(
|
484
|
+
f"Received a {type(value)}"
|
323
485
|
)
|
324
|
-
column =
|
325
|
-
split_value =
|
486
|
+
column = value
|
487
|
+
split_value = value.split(":", 1)
|
326
488
|
if len(split_value) == 2:
|
327
489
|
column = split_value[1]
|
328
490
|
|
@@ -334,31 +496,35 @@ class BaseFilter(BaseModel):
|
|
334
496
|
SorterOps.values(),
|
335
497
|
column,
|
336
498
|
)
|
337
|
-
|
499
|
+
value = column
|
338
500
|
|
339
|
-
if column in cls.
|
501
|
+
if column in cls.CUSTOM_SORTING_OPTIONS:
|
502
|
+
return value
|
503
|
+
elif column in cls.FILTER_EXCLUDE_FIELDS:
|
340
504
|
raise ValueError(
|
341
|
-
f"This resource can not be sorted by this field: '{
|
505
|
+
f"This resource can not be sorted by this field: '{value}'"
|
342
506
|
)
|
343
|
-
|
344
|
-
return
|
507
|
+
if column in cls.model_fields:
|
508
|
+
return value
|
345
509
|
else:
|
346
510
|
raise ValueError(
|
347
511
|
"You can only sort by valid fields of this resource"
|
348
512
|
)
|
349
513
|
|
350
|
-
@
|
351
|
-
|
514
|
+
@model_validator(mode="before")
|
515
|
+
@classmethod
|
516
|
+
@before_validator_handler
|
517
|
+
def filter_ops(cls, data: Dict[str, Any]) -> Dict[str, Any]:
|
352
518
|
"""Parse incoming filters to ensure all filters are legal.
|
353
519
|
|
354
520
|
Args:
|
355
|
-
|
521
|
+
data: The values of the class.
|
356
522
|
|
357
523
|
Returns:
|
358
524
|
The values of the class.
|
359
525
|
"""
|
360
|
-
cls._generate_filter_list(
|
361
|
-
return
|
526
|
+
cls._generate_filter_list(data)
|
527
|
+
return data
|
362
528
|
|
363
529
|
@property
|
364
530
|
def list_of_filters(self) -> List[Filter]:
|
@@ -368,7 +534,7 @@ class BaseFilter(BaseModel):
|
|
368
534
|
A list of Filter models.
|
369
535
|
"""
|
370
536
|
return self._generate_filter_list(
|
371
|
-
{key: getattr(self, key) for key in self.
|
537
|
+
{key: getattr(self, key) for key in self.model_fields}
|
372
538
|
)
|
373
539
|
|
374
540
|
@property
|
@@ -403,14 +569,14 @@ class BaseFilter(BaseModel):
|
|
403
569
|
column_allowed_ids: Set of IDs per column to limit the query to.
|
404
570
|
If given, the remaining filters will be applied to entities
|
405
571
|
within this set only. If `None`, the remaining filters will
|
406
|
-
applied to all entries in the table.
|
572
|
+
be applied to all entries in the table.
|
407
573
|
"""
|
408
574
|
self._rbac_configuration = (authenticated_user_id, column_allowed_ids)
|
409
575
|
|
410
576
|
def generate_rbac_filter(
|
411
577
|
self,
|
412
578
|
table: Type["AnySchema"],
|
413
|
-
) -> Optional["
|
579
|
+
) -> Optional["ColumnElement[bool]"]:
|
414
580
|
"""Generates an optional RBAC filter.
|
415
581
|
|
416
582
|
Args:
|
@@ -474,7 +640,7 @@ class BaseFilter(BaseModel):
|
|
474
640
|
value, operator = cls._resolve_operator(value)
|
475
641
|
|
476
642
|
# Define the filter
|
477
|
-
filter = cls.
|
643
|
+
filter = FilterGenerator(cls).define_filter(
|
478
644
|
column=key, value=value, operator=operator
|
479
645
|
)
|
480
646
|
list_of_filters.append(filter)
|
@@ -495,6 +661,10 @@ class BaseFilter(BaseModel):
|
|
495
661
|
|
496
662
|
Returns:
|
497
663
|
A tuple of the filter value and the operator.
|
664
|
+
|
665
|
+
Raises:
|
666
|
+
ValueError: when we try to use the `oneof` operator with the wrong
|
667
|
+
value.
|
498
668
|
"""
|
499
669
|
operator = GenericFilterOps.EQUALS # Default operator
|
500
670
|
if isinstance(value, str):
|
@@ -505,11 +675,204 @@ class BaseFilter(BaseModel):
|
|
505
675
|
):
|
506
676
|
value = split_value[1]
|
507
677
|
operator = GenericFilterOps(split_value[0])
|
678
|
+
|
679
|
+
if operator == operator.ONEOF:
|
680
|
+
try:
|
681
|
+
value = json.loads(value)
|
682
|
+
if not isinstance(value, list):
|
683
|
+
raise ValueError
|
684
|
+
except ValueError:
|
685
|
+
raise ValueError(ONEOF_ERROR)
|
686
|
+
|
508
687
|
return value, operator
|
509
688
|
|
510
|
-
|
511
|
-
|
512
|
-
|
689
|
+
def generate_name_or_id_query_conditions(
|
690
|
+
self,
|
691
|
+
value: Union[UUID, str],
|
692
|
+
table: Type["NamedSchema"],
|
693
|
+
additional_columns: Optional[List[str]] = None,
|
694
|
+
) -> "ColumnElement[bool]":
|
695
|
+
"""Generate filter conditions for name or id of a table.
|
696
|
+
|
697
|
+
Args:
|
698
|
+
value: The filter value.
|
699
|
+
table: The table to filter.
|
700
|
+
additional_columns: Additional table columns that should also
|
701
|
+
filtered for the given value as part of the or condition.
|
702
|
+
|
703
|
+
Returns:
|
704
|
+
The query conditions.
|
705
|
+
"""
|
706
|
+
from sqlmodel import or_
|
707
|
+
|
708
|
+
value, operator = BaseFilter._resolve_operator(value)
|
709
|
+
value = str(value)
|
710
|
+
|
711
|
+
conditions = []
|
712
|
+
|
713
|
+
filter_ = FilterGenerator(table).define_filter(
|
714
|
+
column="id", value=value, operator=operator
|
715
|
+
)
|
716
|
+
conditions.append(filter_.generate_query_conditions(table=table))
|
717
|
+
|
718
|
+
filter_ = FilterGenerator(table).define_filter(
|
719
|
+
column="name", value=value, operator=operator
|
720
|
+
)
|
721
|
+
conditions.append(filter_.generate_query_conditions(table=table))
|
722
|
+
|
723
|
+
for column in additional_columns or []:
|
724
|
+
filter_ = FilterGenerator(table).define_filter(
|
725
|
+
column=column, value=value, operator=operator
|
726
|
+
)
|
727
|
+
conditions.append(filter_.generate_query_conditions(table=table))
|
728
|
+
|
729
|
+
return or_(*conditions)
|
730
|
+
|
731
|
+
@staticmethod
|
732
|
+
def generate_custom_query_conditions_for_column(
|
733
|
+
value: Any,
|
734
|
+
table: Type[SQLModel],
|
735
|
+
column: str,
|
736
|
+
) -> "ColumnElement[bool]":
|
737
|
+
"""Generate custom filter conditions for a column of a table.
|
738
|
+
|
739
|
+
Args:
|
740
|
+
value: The filter value.
|
741
|
+
table: The table which contains the column.
|
742
|
+
column: The column name.
|
743
|
+
|
744
|
+
Returns:
|
745
|
+
The query conditions.
|
746
|
+
"""
|
747
|
+
value, operator = BaseFilter._resolve_operator(value)
|
748
|
+
filter_ = FilterGenerator(table).define_filter(
|
749
|
+
column=column, value=value, operator=operator
|
750
|
+
)
|
751
|
+
return filter_.generate_query_conditions(table=table)
|
752
|
+
|
753
|
+
@property
|
754
|
+
def offset(self) -> int:
|
755
|
+
"""Returns the offset needed for the query on the data persistence layer.
|
756
|
+
|
757
|
+
Returns:
|
758
|
+
The offset for the query.
|
759
|
+
"""
|
760
|
+
return self.size * (self.page - 1)
|
761
|
+
|
762
|
+
def generate_filter(
|
763
|
+
self, table: Type["AnySchema"]
|
764
|
+
) -> Union["ColumnElement[bool]"]:
|
765
|
+
"""Generate the filter for the query.
|
766
|
+
|
767
|
+
Args:
|
768
|
+
table: The Table that is being queried from.
|
769
|
+
|
770
|
+
Returns:
|
771
|
+
The filter expression for the query.
|
772
|
+
|
773
|
+
Raises:
|
774
|
+
RuntimeError: If a valid logical operator is not supplied.
|
775
|
+
"""
|
776
|
+
from sqlmodel import and_, or_
|
777
|
+
|
778
|
+
filters = []
|
779
|
+
for column_filter in self.list_of_filters:
|
780
|
+
filters.append(
|
781
|
+
column_filter.generate_query_conditions(table=table)
|
782
|
+
)
|
783
|
+
for custom_filter in self.get_custom_filters(table):
|
784
|
+
filters.append(custom_filter)
|
785
|
+
if self.logical_operator == LogicalOperators.OR:
|
786
|
+
return or_(False, *filters)
|
787
|
+
elif self.logical_operator == LogicalOperators.AND:
|
788
|
+
return and_(True, *filters)
|
789
|
+
else:
|
790
|
+
raise RuntimeError("No valid logical operator was supplied.")
|
791
|
+
|
792
|
+
def get_custom_filters(
|
793
|
+
self, table: Type["AnySchema"]
|
794
|
+
) -> List["ColumnElement[bool]"]:
|
795
|
+
"""Get custom filters.
|
796
|
+
|
797
|
+
This can be overridden by subclasses to define custom filters that are
|
798
|
+
not based on the columns of the underlying table.
|
799
|
+
|
800
|
+
Args:
|
801
|
+
table: The query table.
|
802
|
+
|
803
|
+
Returns:
|
804
|
+
A list of custom filters.
|
805
|
+
"""
|
806
|
+
return []
|
807
|
+
|
808
|
+
def apply_filter(
|
809
|
+
self,
|
810
|
+
query: AnyQuery,
|
811
|
+
table: Type["AnySchema"],
|
812
|
+
) -> AnyQuery:
|
813
|
+
"""Applies the filter to a query.
|
814
|
+
|
815
|
+
Args:
|
816
|
+
query: The query to which to apply the filter.
|
817
|
+
table: The query table.
|
818
|
+
|
819
|
+
Returns:
|
820
|
+
The query with filter applied.
|
821
|
+
"""
|
822
|
+
rbac_filter = self.generate_rbac_filter(table=table)
|
823
|
+
|
824
|
+
if rbac_filter is not None:
|
825
|
+
query = query.where(rbac_filter)
|
826
|
+
|
827
|
+
filters = self.generate_filter(table=table)
|
828
|
+
|
829
|
+
if filters is not None:
|
830
|
+
query = query.where(filters)
|
831
|
+
|
832
|
+
return query
|
833
|
+
|
834
|
+
def apply_sorting(
|
835
|
+
self,
|
836
|
+
query: AnyQuery,
|
837
|
+
table: Type["AnySchema"],
|
838
|
+
) -> AnyQuery:
|
839
|
+
"""Apply sorting to the query.
|
840
|
+
|
841
|
+
Args:
|
842
|
+
query: The query to which to apply the sorting.
|
843
|
+
table: The query table.
|
844
|
+
|
845
|
+
Returns:
|
846
|
+
The query with sorting applied.
|
847
|
+
"""
|
848
|
+
column, operand = self.sorting_params
|
849
|
+
|
850
|
+
if operand == SorterOps.DESCENDING:
|
851
|
+
sort_clause = desc(getattr(table, column)) # type: ignore[var-annotated]
|
852
|
+
else:
|
853
|
+
sort_clause = asc(getattr(table, column))
|
854
|
+
|
855
|
+
# We always add the `id` column as a tiebreaker to ensure a stable,
|
856
|
+
# repeatable order of items, otherwise subsequent pages might contain
|
857
|
+
# the same items.
|
858
|
+
query = query.order_by(sort_clause, asc(table.id)) # type: ignore[arg-type]
|
859
|
+
|
860
|
+
return query
|
861
|
+
|
862
|
+
|
863
|
+
class FilterGenerator:
|
864
|
+
"""Helper class to define filters for a class."""
|
865
|
+
|
866
|
+
def __init__(self, model_class: Type[BaseModel]) -> None:
|
867
|
+
"""Initialize the object.
|
868
|
+
|
869
|
+
Args:
|
870
|
+
model_class: The model class for which to define filters.
|
871
|
+
"""
|
872
|
+
self._model_class = model_class
|
873
|
+
|
874
|
+
def define_filter(
|
875
|
+
self, column: str, value: Any, operator: GenericFilterOps
|
513
876
|
) -> Filter:
|
514
877
|
"""Define a filter for a given column.
|
515
878
|
|
@@ -522,23 +885,23 @@ class BaseFilter(BaseModel):
|
|
522
885
|
A Filter object.
|
523
886
|
"""
|
524
887
|
# Create datetime filters
|
525
|
-
if
|
526
|
-
return
|
888
|
+
if self.is_datetime_field(column):
|
889
|
+
return self._define_datetime_filter(
|
527
890
|
column=column,
|
528
891
|
value=value,
|
529
892
|
operator=operator,
|
530
893
|
)
|
531
894
|
|
532
895
|
# Create UUID filters
|
533
|
-
if
|
534
|
-
return
|
896
|
+
if self.is_uuid_field(column):
|
897
|
+
return self._define_uuid_filter(
|
535
898
|
column=column,
|
536
899
|
value=value,
|
537
900
|
operator=operator,
|
538
901
|
)
|
539
902
|
|
540
903
|
# Create int filters
|
541
|
-
if
|
904
|
+
if self.is_int_field(column):
|
542
905
|
return NumericFilter(
|
543
906
|
operation=GenericFilterOps(operator),
|
544
907
|
column=column,
|
@@ -546,25 +909,26 @@ class BaseFilter(BaseModel):
|
|
546
909
|
)
|
547
910
|
|
548
911
|
# Create bool filters
|
549
|
-
if
|
550
|
-
return
|
912
|
+
if self.is_bool_field(column):
|
913
|
+
return self._define_bool_filter(
|
551
914
|
column=column,
|
552
915
|
value=value,
|
553
916
|
operator=operator,
|
554
917
|
)
|
555
918
|
|
556
919
|
# Create str filters
|
557
|
-
if
|
558
|
-
return
|
559
|
-
|
920
|
+
if self.is_str_field(column):
|
921
|
+
return self._define_str_filter(
|
922
|
+
operator=GenericFilterOps(operator),
|
560
923
|
column=column,
|
561
924
|
value=value,
|
562
925
|
)
|
563
926
|
|
564
927
|
# Handle unsupported datatypes
|
565
928
|
logger.warning(
|
566
|
-
f"The Datatype {
|
567
|
-
"supported for filtering. Defaulting to a string
|
929
|
+
f"The Datatype {self._model_class.model_fields[column].annotation} "
|
930
|
+
"might not be supported for filtering. Defaulting to a string "
|
931
|
+
"filter."
|
568
932
|
)
|
569
933
|
return StrFilter(
|
570
934
|
operation=GenericFilterOps(operator),
|
@@ -572,8 +936,37 @@ class BaseFilter(BaseModel):
|
|
572
936
|
value=str(value),
|
573
937
|
)
|
574
938
|
|
575
|
-
|
576
|
-
|
939
|
+
def check_field_annotation(self, k: str, type_: Any) -> bool:
|
940
|
+
"""Checks whether a model field has a certain annotation.
|
941
|
+
|
942
|
+
Args:
|
943
|
+
k: The name of the field.
|
944
|
+
type_: The type to check.
|
945
|
+
|
946
|
+
Raises:
|
947
|
+
ValueError: if the model field within does not have an annotation.
|
948
|
+
|
949
|
+
Returns:
|
950
|
+
True if the annotation of the field matches the given type, False
|
951
|
+
otherwise.
|
952
|
+
"""
|
953
|
+
try:
|
954
|
+
annotation = self._model_class.model_fields[k].annotation
|
955
|
+
|
956
|
+
if annotation is not None:
|
957
|
+
return (
|
958
|
+
issubclass(type_, get_args(annotation))
|
959
|
+
or annotation is type_
|
960
|
+
)
|
961
|
+
else:
|
962
|
+
raise ValueError(
|
963
|
+
f"The field '{k}' inside the model {self._model_class.__name__} "
|
964
|
+
"does not have an annotation."
|
965
|
+
)
|
966
|
+
except TypeError:
|
967
|
+
return False
|
968
|
+
|
969
|
+
def is_datetime_field(self, k: str) -> bool:
|
577
970
|
"""Checks if it's a datetime field.
|
578
971
|
|
579
972
|
Args:
|
@@ -582,43 +975,31 @@ class BaseFilter(BaseModel):
|
|
582
975
|
Returns:
|
583
976
|
True if the field is a datetime field, False otherwise.
|
584
977
|
"""
|
585
|
-
return (
|
586
|
-
issubclass(datetime, get_args(cls.__fields__[k].type_))
|
587
|
-
or cls.__fields__[k].type_ is datetime
|
588
|
-
)
|
978
|
+
return self.check_field_annotation(k=k, type_=datetime)
|
589
979
|
|
590
|
-
|
591
|
-
|
592
|
-
"""Checks if it's a uuid field.
|
980
|
+
def is_uuid_field(self, k: str) -> bool:
|
981
|
+
"""Checks if it's a UUID field.
|
593
982
|
|
594
983
|
Args:
|
595
984
|
k: The key to check.
|
596
985
|
|
597
986
|
Returns:
|
598
|
-
True if the field is a
|
987
|
+
True if the field is a UUID field, False otherwise.
|
599
988
|
"""
|
600
|
-
return (
|
601
|
-
issubclass(UUID, get_args(cls.__fields__[k].type_))
|
602
|
-
or cls.__fields__[k].type_ is UUID
|
603
|
-
)
|
989
|
+
return self.check_field_annotation(k=k, type_=UUID)
|
604
990
|
|
605
|
-
|
606
|
-
|
607
|
-
"""Checks if it's a int field.
|
991
|
+
def is_int_field(self, k: str) -> bool:
|
992
|
+
"""Checks if it's an int field.
|
608
993
|
|
609
994
|
Args:
|
610
995
|
k: The key to check.
|
611
996
|
|
612
997
|
Returns:
|
613
|
-
True if the field is
|
998
|
+
True if the field is an int field, False otherwise.
|
614
999
|
"""
|
615
|
-
return (
|
616
|
-
issubclass(int, get_args(cls.__fields__[k].type_))
|
617
|
-
or cls.__fields__[k].type_ is int
|
618
|
-
)
|
1000
|
+
return self.check_field_annotation(k=k, type_=int)
|
619
1001
|
|
620
|
-
|
621
|
-
def is_bool_field(cls, k: str) -> bool:
|
1002
|
+
def is_bool_field(self, k: str) -> bool:
|
622
1003
|
"""Checks if it's a bool field.
|
623
1004
|
|
624
1005
|
Args:
|
@@ -627,13 +1008,9 @@ class BaseFilter(BaseModel):
|
|
627
1008
|
Returns:
|
628
1009
|
True if the field is a bool field, False otherwise.
|
629
1010
|
"""
|
630
|
-
return (
|
631
|
-
issubclass(bool, get_args(cls.__fields__[k].type_))
|
632
|
-
or cls.__fields__[k].type_ is bool
|
633
|
-
)
|
1011
|
+
return self.check_field_annotation(k=k, type_=bool)
|
634
1012
|
|
635
|
-
|
636
|
-
def is_str_field(cls, k: str) -> bool:
|
1013
|
+
def is_str_field(self, k: str) -> bool:
|
637
1014
|
"""Checks if it's a string field.
|
638
1015
|
|
639
1016
|
Args:
|
@@ -642,13 +1019,9 @@ class BaseFilter(BaseModel):
|
|
642
1019
|
Returns:
|
643
1020
|
True if the field is a string field, False otherwise.
|
644
1021
|
"""
|
645
|
-
return (
|
646
|
-
issubclass(str, get_args(cls.__fields__[k].type_))
|
647
|
-
or cls.__fields__[k].type_ is str
|
648
|
-
)
|
1022
|
+
return self.check_field_annotation(k=k, type_=str)
|
649
1023
|
|
650
|
-
|
651
|
-
def is_sort_by_field(cls, k: str) -> bool:
|
1024
|
+
def is_sort_by_field(self, k: str) -> bool:
|
652
1025
|
"""Checks if it's a sort by field.
|
653
1026
|
|
654
1027
|
Args:
|
@@ -657,15 +1030,12 @@ class BaseFilter(BaseModel):
|
|
657
1030
|
Returns:
|
658
1031
|
True if the field is a sort by field, False otherwise.
|
659
1032
|
"""
|
660
|
-
return (
|
661
|
-
issubclass(str, get_args(cls.__fields__[k].type_))
|
662
|
-
or cls.__fields__[k].type_ == str
|
663
|
-
) and k == "sort_by"
|
1033
|
+
return self.check_field_annotation(k=k, type_=str) and k == "sort_by"
|
664
1034
|
|
665
1035
|
@staticmethod
|
666
1036
|
def _define_datetime_filter(
|
667
1037
|
column: str, value: Any, operator: GenericFilterOps
|
668
|
-
) ->
|
1038
|
+
) -> DatetimeFilter:
|
669
1039
|
"""Define a datetime filter for a given column.
|
670
1040
|
|
671
1041
|
Args:
|
@@ -680,10 +1050,17 @@ class BaseFilter(BaseModel):
|
|
680
1050
|
ValueError: If the value is not a valid datetime.
|
681
1051
|
"""
|
682
1052
|
try:
|
1053
|
+
filter_value: Union[datetime, Tuple[datetime, datetime]]
|
683
1054
|
if isinstance(value, datetime):
|
684
|
-
|
1055
|
+
filter_value = value
|
1056
|
+
elif "," in value:
|
1057
|
+
lower_bound, upper_bound = value.split(",", 1)
|
1058
|
+
filter_value = (
|
1059
|
+
datetime.strptime(lower_bound, FILTERING_DATETIME_FORMAT),
|
1060
|
+
datetime.strptime(upper_bound, FILTERING_DATETIME_FORMAT),
|
1061
|
+
)
|
685
1062
|
else:
|
686
|
-
|
1063
|
+
filter_value = datetime.strptime(
|
687
1064
|
value, FILTERING_DATETIME_FORMAT
|
688
1065
|
)
|
689
1066
|
except ValueError as e:
|
@@ -691,10 +1068,27 @@ class BaseFilter(BaseModel):
|
|
691
1068
|
"The datetime filter only works with values in the following "
|
692
1069
|
f"format: {FILTERING_DATETIME_FORMAT}"
|
693
1070
|
) from e
|
694
|
-
|
1071
|
+
|
1072
|
+
if operator == GenericFilterOps.IN and not isinstance(
|
1073
|
+
filter_value, tuple
|
1074
|
+
):
|
1075
|
+
raise ValueError(
|
1076
|
+
"Two comma separated datetime values are required for the `in` "
|
1077
|
+
"operator."
|
1078
|
+
)
|
1079
|
+
|
1080
|
+
if operator != GenericFilterOps.IN and not isinstance(
|
1081
|
+
filter_value, datetime
|
1082
|
+
):
|
1083
|
+
raise ValueError(
|
1084
|
+
"Only a single datetime value is allowed for operator "
|
1085
|
+
f"{operator}."
|
1086
|
+
)
|
1087
|
+
|
1088
|
+
datetime_filter = DatetimeFilter(
|
695
1089
|
operation=GenericFilterOps(operator),
|
696
1090
|
column=column,
|
697
|
-
value=
|
1091
|
+
value=filter_value,
|
698
1092
|
)
|
699
1093
|
return datetime_filter
|
700
1094
|
|
@@ -713,19 +1107,10 @@ class BaseFilter(BaseModel):
|
|
713
1107
|
A Filter object.
|
714
1108
|
|
715
1109
|
Raises:
|
716
|
-
ValueError: If the value is not a
|
1110
|
+
ValueError: If the value for a oneof filter is not a list.
|
717
1111
|
"""
|
718
|
-
|
719
|
-
|
720
|
-
try:
|
721
|
-
UUID(value)
|
722
|
-
except ValueError as e:
|
723
|
-
raise ValueError(
|
724
|
-
"Invalid value passed as UUID query parameter."
|
725
|
-
) from e
|
726
|
-
|
727
|
-
# Cast the value to string for further comparisons.
|
728
|
-
value = str(value)
|
1112
|
+
if operator == GenericFilterOps.ONEOF and not isinstance(value, list):
|
1113
|
+
raise ValueError(ONEOF_ERROR)
|
729
1114
|
|
730
1115
|
# Generate the filter.
|
731
1116
|
uuid_filter = UUIDFilter(
|
@@ -735,6 +1120,38 @@ class BaseFilter(BaseModel):
|
|
735
1120
|
)
|
736
1121
|
return uuid_filter
|
737
1122
|
|
1123
|
+
@staticmethod
|
1124
|
+
def _define_str_filter(
|
1125
|
+
column: str, value: Any, operator: GenericFilterOps
|
1126
|
+
) -> StrFilter:
|
1127
|
+
"""Define a str filter for a given column.
|
1128
|
+
|
1129
|
+
Args:
|
1130
|
+
column: The column to filter on.
|
1131
|
+
value: The UUID value by which to filter.
|
1132
|
+
operator: The operator to use for filtering.
|
1133
|
+
|
1134
|
+
Returns:
|
1135
|
+
A Filter object.
|
1136
|
+
|
1137
|
+
Raises:
|
1138
|
+
ValueError: If the value is not a proper value.
|
1139
|
+
"""
|
1140
|
+
# For equality checks, ensure that the value is a valid UUID.
|
1141
|
+
if operator == GenericFilterOps.ONEOF and not isinstance(value, list):
|
1142
|
+
raise ValueError(
|
1143
|
+
"If you are using `oneof:` as a filtering op, the value needs "
|
1144
|
+
"to be a json formatted list string."
|
1145
|
+
)
|
1146
|
+
|
1147
|
+
# Generate the filter.
|
1148
|
+
str_filter = StrFilter(
|
1149
|
+
operation=GenericFilterOps(operator),
|
1150
|
+
column=column,
|
1151
|
+
value=value,
|
1152
|
+
)
|
1153
|
+
return str_filter
|
1154
|
+
|
738
1155
|
@staticmethod
|
739
1156
|
def _define_bool_filter(
|
740
1157
|
column: str, value: Any, operator: GenericFilterOps
|
@@ -760,89 +1177,3 @@ class BaseFilter(BaseModel):
|
|
760
1177
|
column=column,
|
761
1178
|
value=bool(value),
|
762
1179
|
)
|
763
|
-
|
764
|
-
@property
|
765
|
-
def offset(self) -> int:
|
766
|
-
"""Returns the offset needed for the query on the data persistence layer.
|
767
|
-
|
768
|
-
Returns:
|
769
|
-
The offset for the query.
|
770
|
-
"""
|
771
|
-
return self.size * (self.page - 1)
|
772
|
-
|
773
|
-
def generate_filter(
|
774
|
-
self, table: Type[SQLModel]
|
775
|
-
) -> Union["BinaryExpression[Any]", "BooleanClauseList[Any]"]:
|
776
|
-
"""Generate the filter for the query.
|
777
|
-
|
778
|
-
Args:
|
779
|
-
table: The Table that is being queried from.
|
780
|
-
|
781
|
-
Returns:
|
782
|
-
The filter expression for the query.
|
783
|
-
|
784
|
-
Raises:
|
785
|
-
RuntimeError: If a valid logical operator is not supplied.
|
786
|
-
"""
|
787
|
-
from sqlalchemy import and_
|
788
|
-
from sqlmodel import or_
|
789
|
-
|
790
|
-
filters = []
|
791
|
-
for column_filter in self.list_of_filters:
|
792
|
-
filters.append(
|
793
|
-
column_filter.generate_query_conditions(table=table)
|
794
|
-
)
|
795
|
-
for custom_filter in self.get_custom_filters():
|
796
|
-
filters.append(custom_filter)
|
797
|
-
if self.logical_operator == LogicalOperators.OR:
|
798
|
-
return or_(False, *filters)
|
799
|
-
elif self.logical_operator == LogicalOperators.AND:
|
800
|
-
return and_(True, *filters)
|
801
|
-
else:
|
802
|
-
raise RuntimeError("No valid logical operator was supplied.")
|
803
|
-
|
804
|
-
def get_custom_filters(
|
805
|
-
self,
|
806
|
-
) -> List[Union["BinaryExpression[Any]", "BooleanClauseList[Any]"]]:
|
807
|
-
"""Get custom filters.
|
808
|
-
|
809
|
-
This can be overridden by subclasses to define custom filters that are
|
810
|
-
not based on the columns of the underlying table.
|
811
|
-
|
812
|
-
Returns:
|
813
|
-
A list of custom filters.
|
814
|
-
"""
|
815
|
-
return []
|
816
|
-
|
817
|
-
def apply_filter(
|
818
|
-
self,
|
819
|
-
query: AnyQuery,
|
820
|
-
table: Type["AnySchema"],
|
821
|
-
) -> AnyQuery:
|
822
|
-
"""Applies the filter to a query.
|
823
|
-
|
824
|
-
Args:
|
825
|
-
query: The query to which to apply the filter.
|
826
|
-
table: The query table.
|
827
|
-
|
828
|
-
Returns:
|
829
|
-
The query with filter applied.
|
830
|
-
"""
|
831
|
-
rbac_filter = self.generate_rbac_filter(table=table)
|
832
|
-
|
833
|
-
if rbac_filter is not None:
|
834
|
-
query = query.where(rbac_filter)
|
835
|
-
|
836
|
-
filters = self.generate_filter(table=table)
|
837
|
-
|
838
|
-
if filters is not None:
|
839
|
-
query = query.where(filters)
|
840
|
-
|
841
|
-
return query
|
842
|
-
|
843
|
-
class Config:
|
844
|
-
"""Pydantic configuration class."""
|
845
|
-
|
846
|
-
# all attributes with leading underscore are private and therefore
|
847
|
-
# are mutable and not included in serialization
|
848
|
-
underscore_attrs_are_private = True
|