zenml-nightly 0.75.0.dev20250312__py3-none-any.whl → 0.75.0.dev20250314__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. zenml/VERSION +1 -1
  2. zenml/__init__.py +2 -0
  3. zenml/analytics/context.py +7 -0
  4. zenml/analytics/enums.py +2 -2
  5. zenml/artifacts/utils.py +2 -4
  6. zenml/cli/__init__.py +8 -9
  7. zenml/cli/base.py +2 -2
  8. zenml/cli/code_repository.py +1 -1
  9. zenml/cli/login.py +6 -0
  10. zenml/cli/model.py +7 -15
  11. zenml/cli/pipeline.py +3 -3
  12. zenml/cli/project.py +172 -0
  13. zenml/cli/secret.py +47 -44
  14. zenml/cli/service_accounts.py +0 -1
  15. zenml/cli/service_connectors.py +15 -17
  16. zenml/cli/stack.py +0 -3
  17. zenml/cli/stack_components.py +2 -2
  18. zenml/cli/tag.py +3 -5
  19. zenml/cli/utils.py +25 -23
  20. zenml/client.py +749 -475
  21. zenml/config/global_config.py +48 -37
  22. zenml/config/pipeline_configurations.py +3 -2
  23. zenml/config/pipeline_run_configuration.py +2 -1
  24. zenml/config/secret_reference_mixin.py +1 -1
  25. zenml/constants.py +6 -6
  26. zenml/enums.py +0 -7
  27. zenml/event_hub/event_hub.py +3 -1
  28. zenml/exceptions.py +0 -24
  29. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +5 -3
  30. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -4
  31. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
  32. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -4
  33. zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
  34. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
  35. zenml/integrations/wandb/__init__.py +1 -1
  36. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
  37. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +5 -3
  38. zenml/model/model.py +10 -10
  39. zenml/model_registries/base_model_registry.py +1 -1
  40. zenml/models/__init__.py +45 -28
  41. zenml/models/v2/base/base.py +0 -5
  42. zenml/models/v2/base/filter.py +2 -2
  43. zenml/models/v2/base/scoped.py +135 -156
  44. zenml/models/v2/core/action.py +12 -12
  45. zenml/models/v2/core/api_key.py +1 -1
  46. zenml/models/v2/core/artifact.py +31 -18
  47. zenml/models/v2/core/artifact_version.py +57 -40
  48. zenml/models/v2/core/code_repository.py +12 -12
  49. zenml/models/v2/core/component.py +22 -33
  50. zenml/models/v2/core/device.py +3 -2
  51. zenml/models/v2/core/event_source.py +14 -14
  52. zenml/models/v2/core/flavor.py +19 -47
  53. zenml/models/v2/core/logs.py +1 -2
  54. zenml/models/v2/core/model.py +23 -20
  55. zenml/models/v2/core/model_version.py +51 -42
  56. zenml/models/v2/core/pipeline.py +16 -16
  57. zenml/models/v2/core/pipeline_build.py +14 -14
  58. zenml/models/v2/core/pipeline_deployment.py +12 -14
  59. zenml/models/v2/core/pipeline_run.py +21 -29
  60. zenml/models/v2/core/project.py +203 -0
  61. zenml/models/v2/core/run_metadata.py +2 -2
  62. zenml/models/v2/core/run_template.py +16 -17
  63. zenml/models/v2/core/schedule.py +12 -21
  64. zenml/models/v2/core/secret.py +94 -128
  65. zenml/models/v2/core/server_settings.py +2 -2
  66. zenml/models/v2/core/service.py +57 -26
  67. zenml/models/v2/core/service_connector.py +14 -16
  68. zenml/models/v2/core/stack.py +24 -26
  69. zenml/models/v2/core/step_run.py +16 -28
  70. zenml/models/v2/core/tag.py +41 -15
  71. zenml/models/v2/core/trigger.py +13 -13
  72. zenml/models/v2/core/trigger_execution.py +2 -2
  73. zenml/models/v2/core/user.py +2 -2
  74. zenml/models/v2/misc/statistics.py +45 -0
  75. zenml/models/v2/misc/tag.py +27 -0
  76. zenml/orchestrators/cache_utils.py +7 -7
  77. zenml/orchestrators/input_utils.py +1 -0
  78. zenml/orchestrators/step_launcher.py +1 -2
  79. zenml/orchestrators/step_run_utils.py +2 -4
  80. zenml/orchestrators/step_runner.py +10 -1
  81. zenml/orchestrators/utils.py +4 -4
  82. zenml/pipelines/build_utils.py +2 -4
  83. zenml/pipelines/pipeline_decorator.py +3 -2
  84. zenml/pipelines/pipeline_definition.py +8 -9
  85. zenml/pipelines/run_utils.py +4 -4
  86. zenml/service_connectors/service_connector.py +0 -10
  87. zenml/service_connectors/service_connector_utils.py +0 -2
  88. zenml/stack/authentication_mixin.py +1 -1
  89. zenml/stack/flavor.py +3 -14
  90. zenml/stack/stack.py +0 -1
  91. zenml/stack/stack_component.py +1 -5
  92. zenml/steps/base_step.py +10 -2
  93. zenml/steps/step_context.py +19 -0
  94. zenml/utils/string_utils.py +1 -1
  95. zenml/utils/tag_utils.py +642 -0
  96. zenml/zen_server/cloud_utils.py +21 -0
  97. zenml/zen_server/exceptions.py +0 -6
  98. zenml/zen_server/rbac/endpoint_utils.py +134 -46
  99. zenml/zen_server/rbac/models.py +65 -3
  100. zenml/zen_server/rbac/rbac_interface.py +9 -0
  101. zenml/zen_server/rbac/rbac_sql_zen_store.py +15 -7
  102. zenml/zen_server/rbac/utils.py +155 -30
  103. zenml/zen_server/rbac/zenml_cloud_rbac.py +39 -11
  104. zenml/zen_server/routers/actions_endpoints.py +3 -5
  105. zenml/zen_server/routers/artifact_endpoint.py +0 -5
  106. zenml/zen_server/routers/artifact_version_endpoints.py +15 -9
  107. zenml/zen_server/routers/auth_endpoints.py +22 -7
  108. zenml/zen_server/routers/code_repositories_endpoints.py +54 -3
  109. zenml/zen_server/routers/devices_endpoints.py +0 -4
  110. zenml/zen_server/routers/event_source_endpoints.py +0 -5
  111. zenml/zen_server/routers/flavors_endpoints.py +0 -5
  112. zenml/zen_server/routers/logs_endpoints.py +0 -1
  113. zenml/zen_server/routers/model_versions_endpoints.py +100 -23
  114. zenml/zen_server/routers/models_endpoints.py +50 -69
  115. zenml/zen_server/routers/pipeline_builds_endpoints.py +55 -3
  116. zenml/zen_server/routers/pipeline_deployments_endpoints.py +56 -4
  117. zenml/zen_server/routers/pipelines_endpoints.py +70 -3
  118. zenml/zen_server/routers/plugin_endpoints.py +0 -1
  119. zenml/zen_server/routers/projects_endpoints.py +283 -0
  120. zenml/zen_server/routers/run_metadata_endpoints.py +97 -0
  121. zenml/zen_server/routers/run_templates_endpoints.py +64 -3
  122. zenml/zen_server/routers/runs_endpoints.py +58 -8
  123. zenml/zen_server/routers/schedule_endpoints.py +67 -6
  124. zenml/zen_server/routers/secrets_endpoints.py +38 -4
  125. zenml/zen_server/routers/server_endpoints.py +53 -1
  126. zenml/zen_server/routers/service_accounts_endpoints.py +14 -15
  127. zenml/zen_server/routers/service_connectors_endpoints.py +94 -14
  128. zenml/zen_server/routers/service_endpoints.py +18 -7
  129. zenml/zen_server/routers/stack_components_endpoints.py +66 -7
  130. zenml/zen_server/routers/stacks_endpoints.py +95 -6
  131. zenml/zen_server/routers/steps_endpoints.py +17 -11
  132. zenml/zen_server/routers/tag_resource_endpoints.py +115 -0
  133. zenml/zen_server/routers/tags_endpoints.py +6 -17
  134. zenml/zen_server/routers/triggers_endpoints.py +5 -8
  135. zenml/zen_server/routers/users_endpoints.py +9 -12
  136. zenml/zen_server/template_execution/utils.py +8 -7
  137. zenml/zen_server/utils.py +21 -0
  138. zenml/zen_server/zen_server_api.py +7 -2
  139. zenml/zen_stores/base_zen_store.py +50 -69
  140. zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
  141. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +20 -10
  142. zenml/zen_stores/migrations/versions/1f9d1cd00b90_add_unique_name_constraints.py +231 -0
  143. zenml/zen_stores/migrations/versions/288f4fb6e112_make_tags_user_scoped.py +74 -0
  144. zenml/zen_stores/migrations/versions/2e695a26fe7a_add_user_default_workspace.py +45 -0
  145. zenml/zen_stores/migrations/versions/3b1776345020_remove_workspace_from_globals.py +81 -0
  146. zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +136 -0
  147. zenml/zen_stores/migrations/versions/9e7bf0970266_adding_exclusive_attribute_to_tags.py +47 -0
  148. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +8 -4
  149. zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
  150. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +12 -6
  151. zenml/zen_stores/migrations/versions/f1d723fd723b_add_secret_private_attr.py +61 -0
  152. zenml/zen_stores/migrations/versions/f76a368a25a5_add_stack_description.py +35 -0
  153. zenml/zen_stores/rest_zen_store.py +223 -230
  154. zenml/zen_stores/schemas/__init__.py +2 -2
  155. zenml/zen_stores/schemas/action_schemas.py +15 -8
  156. zenml/zen_stores/schemas/api_key_schemas.py +8 -1
  157. zenml/zen_stores/schemas/artifact_schemas.py +35 -10
  158. zenml/zen_stores/schemas/code_repository_schemas.py +22 -17
  159. zenml/zen_stores/schemas/component_schemas.py +9 -14
  160. zenml/zen_stores/schemas/event_source_schemas.py +15 -8
  161. zenml/zen_stores/schemas/flavor_schemas.py +14 -20
  162. zenml/zen_stores/schemas/model_schemas.py +18 -17
  163. zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
  164. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +10 -8
  165. zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -12
  166. zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
  167. zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +53 -65
  168. zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
  169. zenml/zen_stores/schemas/run_template_schemas.py +17 -13
  170. zenml/zen_stores/schemas/schedule_schema.py +16 -21
  171. zenml/zen_stores/schemas/secret_schemas.py +15 -25
  172. zenml/zen_stores/schemas/service_connector_schemas.py +8 -17
  173. zenml/zen_stores/schemas/service_schemas.py +7 -8
  174. zenml/zen_stores/schemas/stack_schemas.py +12 -15
  175. zenml/zen_stores/schemas/step_run_schemas.py +14 -15
  176. zenml/zen_stores/schemas/tag_schemas.py +30 -2
  177. zenml/zen_stores/schemas/trigger_schemas.py +15 -8
  178. zenml/zen_stores/schemas/user_schemas.py +12 -2
  179. zenml/zen_stores/schemas/utils.py +16 -0
  180. zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
  181. zenml/zen_stores/sql_zen_store.py +2984 -2369
  182. zenml/zen_stores/template_utils.py +1 -1
  183. zenml/zen_stores/zen_store_interface.py +136 -126
  184. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
  185. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +188 -173
  186. zenml/cli/workspace.py +0 -86
  187. zenml/models/v2/core/workspace.py +0 -131
  188. zenml/zen_server/routers/workspaces_endpoints.py +0 -1469
  189. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/LICENSE +0 -0
  190. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
  191. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/entry_points.txt +0 -0
@@ -31,12 +31,12 @@ from pydantic import Field
31
31
 
32
32
  from zenml.models.v2.base.base import BaseZenModel
33
33
  from zenml.models.v2.base.scoped import (
34
- WorkspaceScopedFilter,
35
- WorkspaceScopedRequest,
36
- WorkspaceScopedResponse,
37
- WorkspaceScopedResponseBody,
38
- WorkspaceScopedResponseMetadata,
39
- WorkspaceScopedResponseResources,
34
+ ProjectScopedFilter,
35
+ ProjectScopedRequest,
36
+ ProjectScopedResponse,
37
+ ProjectScopedResponseBody,
38
+ ProjectScopedResponseMetadata,
39
+ ProjectScopedResponseResources,
40
40
  )
41
41
  from zenml.models.v2.misc.build_item import BuildItem
42
42
 
@@ -171,7 +171,7 @@ class PipelineBuildBase(BaseZenModel):
171
171
  )
172
172
 
173
173
 
174
- class PipelineBuildRequest(PipelineBuildBase, WorkspaceScopedRequest):
174
+ class PipelineBuildRequest(PipelineBuildBase, ProjectScopedRequest):
175
175
  """Request model for pipelines builds."""
176
176
 
177
177
  checksum: Optional[str] = Field(title="The build checksum.", default=None)
@@ -193,11 +193,11 @@ class PipelineBuildRequest(PipelineBuildBase, WorkspaceScopedRequest):
193
193
 
194
194
 
195
195
  # ------------------ Response Model ------------------
196
- class PipelineBuildResponseBody(WorkspaceScopedResponseBody):
196
+ class PipelineBuildResponseBody(ProjectScopedResponseBody):
197
197
  """Response body for pipeline builds."""
198
198
 
199
199
 
200
- class PipelineBuildResponseMetadata(WorkspaceScopedResponseMetadata):
200
+ class PipelineBuildResponseMetadata(ProjectScopedResponseMetadata):
201
201
  """Response metadata for pipeline builds."""
202
202
 
203
203
  pipeline: Optional["PipelineResponse"] = Field(
@@ -231,12 +231,12 @@ class PipelineBuildResponseMetadata(WorkspaceScopedResponseMetadata):
231
231
  )
232
232
 
233
233
 
234
- class PipelineBuildResponseResources(WorkspaceScopedResponseResources):
234
+ class PipelineBuildResponseResources(ProjectScopedResponseResources):
235
235
  """Class for all resource models associated with the pipeline build entity."""
236
236
 
237
237
 
238
238
  class PipelineBuildResponse(
239
- WorkspaceScopedResponse[
239
+ ProjectScopedResponse[
240
240
  PipelineBuildResponseBody,
241
241
  PipelineBuildResponseMetadata,
242
242
  PipelineBuildResponseResources,
@@ -278,7 +278,7 @@ class PipelineBuildResponse(
278
278
  exclude={
279
279
  "pipeline",
280
280
  "stack",
281
- "workspace",
281
+ "project",
282
282
  }
283
283
  )
284
284
  )
@@ -473,11 +473,11 @@ class PipelineBuildResponse(
473
473
  # ------------------ Filter Model ------------------
474
474
 
475
475
 
476
- class PipelineBuildFilter(WorkspaceScopedFilter):
476
+ class PipelineBuildFilter(ProjectScopedFilter):
477
477
  """Model to enable advanced filtering of all pipeline builds."""
478
478
 
479
479
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
480
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
480
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
481
481
  "container_registry_id",
482
482
  ]
483
483
 
@@ -24,12 +24,12 @@ from zenml.config.step_configurations import Step
24
24
  from zenml.models.v2.base.base import BaseZenModel
25
25
  from zenml.models.v2.base.page import Page
26
26
  from zenml.models.v2.base.scoped import (
27
- WorkspaceScopedFilter,
28
- WorkspaceScopedRequest,
29
- WorkspaceScopedResponse,
30
- WorkspaceScopedResponseBody,
31
- WorkspaceScopedResponseMetadata,
32
- WorkspaceScopedResponseResources,
27
+ ProjectScopedFilter,
28
+ ProjectScopedRequest,
29
+ ProjectScopedResponse,
30
+ ProjectScopedResponseBody,
31
+ ProjectScopedResponseMetadata,
32
+ ProjectScopedResponseResources,
33
33
  )
34
34
  from zenml.models.v2.core.code_reference import (
35
35
  CodeReferenceRequest,
@@ -93,9 +93,7 @@ class PipelineDeploymentBase(BaseZenModel):
93
93
  )
94
94
 
95
95
 
96
- class PipelineDeploymentRequest(
97
- PipelineDeploymentBase, WorkspaceScopedRequest
98
- ):
96
+ class PipelineDeploymentRequest(PipelineDeploymentBase, ProjectScopedRequest):
99
97
  """Request model for pipeline deployments."""
100
98
 
101
99
  stack: UUID = Field(title="The stack associated with the deployment.")
@@ -129,11 +127,11 @@ class PipelineDeploymentRequest(
129
127
  # ------------------ Response Model ------------------
130
128
 
131
129
 
132
- class PipelineDeploymentResponseBody(WorkspaceScopedResponseBody):
130
+ class PipelineDeploymentResponseBody(ProjectScopedResponseBody):
133
131
  """Response body for pipeline deployments."""
134
132
 
135
133
 
136
- class PipelineDeploymentResponseMetadata(WorkspaceScopedResponseMetadata):
134
+ class PipelineDeploymentResponseMetadata(ProjectScopedResponseMetadata):
137
135
  """Response metadata for pipeline deployments."""
138
136
 
139
137
  run_name_template: str = Field(
@@ -188,7 +186,7 @@ class PipelineDeploymentResponseMetadata(WorkspaceScopedResponseMetadata):
188
186
  )
189
187
 
190
188
 
191
- class PipelineDeploymentResponseResources(WorkspaceScopedResponseResources):
189
+ class PipelineDeploymentResponseResources(ProjectScopedResponseResources):
192
190
  """Class for all resource models associated with the pipeline deployment entity."""
193
191
 
194
192
  triggers: TriggerPage = Field( # type: ignore[valid-type]
@@ -197,7 +195,7 @@ class PipelineDeploymentResponseResources(WorkspaceScopedResponseResources):
197
195
 
198
196
 
199
197
  class PipelineDeploymentResponse(
200
- WorkspaceScopedResponse[
198
+ ProjectScopedResponse[
201
199
  PipelineDeploymentResponseBody,
202
200
  PipelineDeploymentResponseMetadata,
203
201
  PipelineDeploymentResponseResources,
@@ -355,7 +353,7 @@ class PipelineDeploymentResponse(
355
353
  # ------------------ Filter Model ------------------
356
354
 
357
355
 
358
- class PipelineDeploymentFilter(WorkspaceScopedFilter):
356
+ class PipelineDeploymentFilter(ProjectScopedFilter):
359
357
  """Model to enable advanced filtering of all pipeline deployments."""
360
358
 
361
359
  pipeline_id: Optional[Union[UUID, str]] = Field(
@@ -28,23 +28,25 @@ from typing import (
28
28
  )
29
29
  from uuid import UUID
30
30
 
31
- from pydantic import BaseModel, ConfigDict, Field
31
+ from pydantic import ConfigDict, Field
32
32
 
33
33
  from zenml.config.pipeline_configurations import PipelineConfiguration
34
34
  from zenml.constants import STR_FIELD_MAX_LENGTH
35
35
  from zenml.enums import ExecutionStatus
36
36
  from zenml.metadata.metadata_types import MetadataType
37
+ from zenml.models.v2.base.base import BaseUpdate
37
38
  from zenml.models.v2.base.scoped import (
39
+ ProjectScopedFilter,
40
+ ProjectScopedRequest,
41
+ ProjectScopedResponse,
42
+ ProjectScopedResponseBody,
43
+ ProjectScopedResponseMetadata,
44
+ ProjectScopedResponseResources,
38
45
  TaggableFilter,
39
- WorkspaceScopedFilter,
40
- WorkspaceScopedRequest,
41
- WorkspaceScopedResponse,
42
- WorkspaceScopedResponseBody,
43
- WorkspaceScopedResponseMetadata,
44
- WorkspaceScopedResponseResources,
45
46
  )
46
47
  from zenml.models.v2.core.model_version import ModelVersionResponse
47
48
  from zenml.models.v2.core.tag import TagResponse
49
+ from zenml.utils.tag_utils import Tag
48
50
 
49
51
  if TYPE_CHECKING:
50
52
  from sqlalchemy.sql.elements import ColumnElement
@@ -69,7 +71,7 @@ AnyQuery = TypeVar("AnyQuery", bound=Any)
69
71
  # ------------------ Request Model ------------------
70
72
 
71
73
 
72
- class PipelineRunRequest(WorkspaceScopedRequest):
74
+ class PipelineRunRequest(ProjectScopedRequest):
73
75
  """Request model for pipeline runs."""
74
76
 
75
77
  name: str = Field(
@@ -117,15 +119,10 @@ class PipelineRunRequest(WorkspaceScopedRequest):
117
119
  default=None,
118
120
  title="ID of the trigger execution that triggered this run.",
119
121
  )
120
- tags: Optional[List[str]] = Field(
122
+ tags: Optional[List[Union[str, Tag]]] = Field(
121
123
  default=None,
122
124
  title="Tags of the pipeline run.",
123
125
  )
124
- model_version_id: Optional[UUID] = Field(
125
- title="The ID of the model version that was "
126
- "configured by this pipeline run explicitly.",
127
- default=None,
128
- )
129
126
 
130
127
  model_config = ConfigDict(protected_namespaces=())
131
128
 
@@ -133,16 +130,11 @@ class PipelineRunRequest(WorkspaceScopedRequest):
133
130
  # ------------------ Update Model ------------------
134
131
 
135
132
 
136
- class PipelineRunUpdate(BaseModel):
133
+ class PipelineRunUpdate(BaseUpdate):
137
134
  """Pipeline run update model."""
138
135
 
139
136
  status: Optional[ExecutionStatus] = None
140
137
  end_time: Optional[datetime] = None
141
- model_version_id: Optional[UUID] = Field(
142
- title="The ID of the model version that was "
143
- "configured by this pipeline run explicitly.",
144
- default=None,
145
- )
146
138
  # TODO: we should maybe have a different update model here, the upper
147
139
  # three attributes should only be for internal use
148
140
  add_tags: Optional[List[str]] = Field(
@@ -158,7 +150,7 @@ class PipelineRunUpdate(BaseModel):
158
150
  # ------------------ Response Model ------------------
159
151
 
160
152
 
161
- class PipelineRunResponseBody(WorkspaceScopedResponseBody):
153
+ class PipelineRunResponseBody(ProjectScopedResponseBody):
162
154
  """Response body for pipeline runs."""
163
155
 
164
156
  status: ExecutionStatus = Field(
@@ -194,7 +186,7 @@ class PipelineRunResponseBody(WorkspaceScopedResponseBody):
194
186
  model_config = ConfigDict(protected_namespaces=())
195
187
 
196
188
 
197
- class PipelineRunResponseMetadata(WorkspaceScopedResponseMetadata):
189
+ class PipelineRunResponseMetadata(ProjectScopedResponseMetadata):
198
190
  """Response metadata for pipeline runs."""
199
191
 
200
192
  run_metadata: Dict[str, MetadataType] = Field(
@@ -252,7 +244,7 @@ class PipelineRunResponseMetadata(WorkspaceScopedResponseMetadata):
252
244
  )
253
245
 
254
246
 
255
- class PipelineRunResponseResources(WorkspaceScopedResponseResources):
247
+ class PipelineRunResponseResources(ProjectScopedResponseResources):
256
248
  """Class for all resource models associated with the pipeline run entity."""
257
249
 
258
250
  model_version: Optional[ModelVersionResponse] = None
@@ -270,7 +262,7 @@ class PipelineRunResponseResources(WorkspaceScopedResponseResources):
270
262
 
271
263
 
272
264
  class PipelineRunResponse(
273
- WorkspaceScopedResponse[
265
+ ProjectScopedResponse[
274
266
  PipelineRunResponseBody,
275
267
  PipelineRunResponseMetadata,
276
268
  PipelineRunResponseResources,
@@ -590,11 +582,11 @@ class PipelineRunResponse(
590
582
  # ------------------ Filter Model ------------------
591
583
 
592
584
 
593
- class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
594
- """Model to enable advanced filtering of all Workspaces."""
585
+ class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
586
+ """Model to enable advanced filtering of all pipeline runs."""
595
587
 
596
588
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
597
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
589
+ *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
598
590
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
599
591
  "tag",
600
592
  "stack",
@@ -603,7 +595,7 @@ class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
603
595
  "model_version",
604
596
  ]
605
597
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
606
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
598
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
607
599
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
608
600
  "unlisted",
609
601
  "code_repository_id",
@@ -621,7 +613,7 @@ class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
621
613
  "run_metadata",
622
614
  ]
623
615
  CLI_EXCLUDE_FIELDS = [
624
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
616
+ *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
625
617
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
626
618
  ]
627
619
 
@@ -0,0 +1,203 @@
1
+ # Copyright (c) ZenML GmbH 2023. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at:
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
+ # or implied. See the License for the specific language governing
13
+ # permissions and limitations under the License.
14
+ """Models representing projects."""
15
+
16
+ import re
17
+ from typing import Any, Dict, Optional
18
+
19
+ from pydantic import Field, model_validator
20
+
21
+ from zenml.constants import STR_FIELD_MAX_LENGTH, STR_ID_FIELD_MAX_LENGTH
22
+ from zenml.models.v2.base.base import (
23
+ BaseDatedResponseBody,
24
+ BaseIdentifiedResponse,
25
+ BaseRequest,
26
+ BaseResponseMetadata,
27
+ BaseResponseResources,
28
+ BaseUpdate,
29
+ )
30
+ from zenml.models.v2.base.filter import BaseFilter
31
+ from zenml.utils.pydantic_utils import before_validator_handler
32
+
33
+ # ------------------ Request Model ------------------
34
+
35
+
36
+ class ProjectRequest(BaseRequest):
37
+ """Request model for projects."""
38
+
39
+ name: str = Field(
40
+ title="The unique name of the project. The project name must only "
41
+ "contain only lowercase letters, numbers, underscores, and hyphens and "
42
+ "be at most 50 characters long.",
43
+ min_length=1,
44
+ max_length=STR_ID_FIELD_MAX_LENGTH,
45
+ pattern=r"^[a-z0-9_-]+$",
46
+ )
47
+ display_name: str = Field(
48
+ default="",
49
+ title="The display name of the project.",
50
+ max_length=STR_FIELD_MAX_LENGTH,
51
+ )
52
+ description: str = Field(
53
+ default="",
54
+ title="The description of the project.",
55
+ max_length=STR_FIELD_MAX_LENGTH,
56
+ )
57
+
58
+ @model_validator(mode="before")
59
+ @classmethod
60
+ @before_validator_handler
61
+ def _validate_project_name(cls, data: Dict[str, Any]) -> Dict[str, Any]:
62
+ """Validate the project name.
63
+
64
+ Args:
65
+ data: The values to validate.
66
+
67
+ Returns:
68
+ The validated values.
69
+ """
70
+ name = data.get("name")
71
+ display_name = data.get("display_name")
72
+
73
+ if not name and not display_name:
74
+ return data
75
+
76
+ if not name:
77
+ assert display_name
78
+
79
+ project_name = display_name.lower().replace(" ", "-")
80
+ project_name = re.sub(r"[^a-z0-9_-]", "", project_name)
81
+
82
+ data["name"] = project_name
83
+
84
+ if not display_name:
85
+ # We just use the name as the display name
86
+ data["display_name"] = name
87
+
88
+ return data
89
+
90
+
91
+ # ------------------ Update Model ------------------
92
+
93
+
94
+ class ProjectUpdate(BaseUpdate):
95
+ """Update model for projects."""
96
+
97
+ name: Optional[str] = Field(
98
+ title="The unique name of the project. The project name must only "
99
+ "contain only lowercase letters, numbers, underscores, and hyphens and "
100
+ "be at most 50 characters long.",
101
+ min_length=1,
102
+ max_length=STR_ID_FIELD_MAX_LENGTH,
103
+ pattern=r"^[a-z0-9_-]+$",
104
+ default=None,
105
+ )
106
+ display_name: Optional[str] = Field(
107
+ title="The display name of the project.",
108
+ max_length=STR_FIELD_MAX_LENGTH,
109
+ default=None,
110
+ )
111
+ description: Optional[str] = Field(
112
+ title="The description of the project.",
113
+ max_length=STR_FIELD_MAX_LENGTH,
114
+ default=None,
115
+ )
116
+
117
+
118
+ # ------------------ Response Model ------------------
119
+
120
+
121
+ class ProjectResponseBody(BaseDatedResponseBody):
122
+ """Response body for projects."""
123
+
124
+ display_name: str = Field(
125
+ title="The display name of the project.",
126
+ max_length=STR_FIELD_MAX_LENGTH,
127
+ )
128
+
129
+
130
+ class ProjectResponseMetadata(BaseResponseMetadata):
131
+ """Response metadata for projects."""
132
+
133
+ description: str = Field(
134
+ default="",
135
+ title="The description of the project.",
136
+ max_length=STR_FIELD_MAX_LENGTH,
137
+ )
138
+
139
+
140
+ class ProjectResponseResources(BaseResponseResources):
141
+ """Class for all resource models associated with the project entity."""
142
+
143
+
144
+ class ProjectResponse(
145
+ BaseIdentifiedResponse[
146
+ ProjectResponseBody,
147
+ ProjectResponseMetadata,
148
+ ProjectResponseResources,
149
+ ]
150
+ ):
151
+ """Response model for projects."""
152
+
153
+ name: str = Field(
154
+ title="The unique name of the project.",
155
+ max_length=STR_ID_FIELD_MAX_LENGTH,
156
+ )
157
+
158
+ def get_hydrated_version(self) -> "ProjectResponse":
159
+ """Get the hydrated version of this project.
160
+
161
+ Returns:
162
+ an instance of the same entity with the metadata field attached.
163
+ """
164
+ from zenml.client import Client
165
+
166
+ return Client().zen_store.get_project(self.id)
167
+
168
+ # Body and metadata properties
169
+
170
+ @property
171
+ def display_name(self) -> str:
172
+ """The `display_name` property.
173
+
174
+ Returns:
175
+ the value of the property.
176
+ """
177
+ return self.get_body().display_name
178
+
179
+ @property
180
+ def description(self) -> str:
181
+ """The `description` property.
182
+
183
+ Returns:
184
+ the value of the property.
185
+ """
186
+ return self.get_metadata().description
187
+
188
+
189
+ # ------------------ Filter Model ------------------
190
+
191
+
192
+ class ProjectFilter(BaseFilter):
193
+ """Model to enable advanced filtering of all projects."""
194
+
195
+ name: Optional[str] = Field(
196
+ default=None,
197
+ description="Name of the project",
198
+ )
199
+
200
+ display_name: Optional[str] = Field(
201
+ default=None,
202
+ description="Display name of the project",
203
+ )
@@ -20,14 +20,14 @@ from pydantic import Field, model_validator
20
20
 
21
21
  from zenml.metadata.metadata_types import MetadataType, MetadataTypeEnum
22
22
  from zenml.models.v2.base.scoped import (
23
- WorkspaceScopedRequest,
23
+ ProjectScopedRequest,
24
24
  )
25
25
  from zenml.models.v2.misc.run_metadata import RunMetadataResource
26
26
 
27
27
  # ------------------ Request Model ------------------
28
28
 
29
29
 
30
- class RunMetadataRequest(WorkspaceScopedRequest):
30
+ class RunMetadataRequest(ProjectScopedRequest):
31
31
  """Request model for run metadata."""
32
32
 
33
33
  resources: List[RunMetadataResource] = Field(
@@ -33,13 +33,13 @@ from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
33
33
  from zenml.enums import ExecutionStatus
34
34
  from zenml.models.v2.base.base import BaseUpdate
35
35
  from zenml.models.v2.base.scoped import (
36
+ ProjectScopedFilter,
37
+ ProjectScopedRequest,
38
+ ProjectScopedResponse,
39
+ ProjectScopedResponseBody,
40
+ ProjectScopedResponseMetadata,
41
+ ProjectScopedResponseResources,
36
42
  TaggableFilter,
37
- WorkspaceScopedFilter,
38
- WorkspaceScopedRequest,
39
- WorkspaceScopedResponse,
40
- WorkspaceScopedResponseBody,
41
- WorkspaceScopedResponseMetadata,
42
- WorkspaceScopedResponseResources,
43
43
  )
44
44
  from zenml.models.v2.core.code_reference import (
45
45
  CodeReferenceResponse,
@@ -64,7 +64,7 @@ if TYPE_CHECKING:
64
64
  # ------------------ Request Model ------------------
65
65
 
66
66
 
67
- class RunTemplateRequest(WorkspaceScopedRequest):
67
+ class RunTemplateRequest(ProjectScopedRequest):
68
68
  """Request model for run templates."""
69
69
 
70
70
  name: str = Field(
@@ -112,7 +112,7 @@ class RunTemplateUpdate(BaseUpdate):
112
112
  # ------------------ Response Model ------------------
113
113
 
114
114
 
115
- class RunTemplateResponseBody(WorkspaceScopedResponseBody):
115
+ class RunTemplateResponseBody(ProjectScopedResponseBody):
116
116
  """Response body for run templates."""
117
117
 
118
118
  runnable: bool = Field(
@@ -128,7 +128,7 @@ class RunTemplateResponseBody(WorkspaceScopedResponseBody):
128
128
  )
129
129
 
130
130
 
131
- class RunTemplateResponseMetadata(WorkspaceScopedResponseMetadata):
131
+ class RunTemplateResponseMetadata(ProjectScopedResponseMetadata):
132
132
  """Response metadata for run templates."""
133
133
 
134
134
  description: Optional[str] = Field(
@@ -146,7 +146,7 @@ class RunTemplateResponseMetadata(WorkspaceScopedResponseMetadata):
146
146
  )
147
147
 
148
148
 
149
- class RunTemplateResponseResources(WorkspaceScopedResponseResources):
149
+ class RunTemplateResponseResources(ProjectScopedResponseResources):
150
150
  """All resource models associated with the run template."""
151
151
 
152
152
  source_deployment: Optional[PipelineDeploymentResponse] = Field(
@@ -170,7 +170,7 @@ class RunTemplateResponseResources(WorkspaceScopedResponseResources):
170
170
 
171
171
 
172
172
  class RunTemplateResponse(
173
- WorkspaceScopedResponse[
173
+ ProjectScopedResponse[
174
174
  RunTemplateResponseBody,
175
175
  RunTemplateResponseMetadata,
176
176
  RunTemplateResponseResources,
@@ -308,26 +308,25 @@ class RunTemplateResponse(
308
308
  # ------------------ Filter Model ------------------
309
309
 
310
310
 
311
- class RunTemplateFilter(WorkspaceScopedFilter, TaggableFilter):
311
+ class RunTemplateFilter(ProjectScopedFilter, TaggableFilter):
312
312
  """Model for filtering of run templates."""
313
313
 
314
314
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
315
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
315
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
316
316
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
317
317
  "code_repository_id",
318
318
  "stack_id",
319
319
  "build_id",
320
320
  "pipeline_id",
321
- "user",
322
321
  "pipeline",
323
322
  "stack",
324
323
  ]
325
324
  CUSTOM_SORTING_OPTIONS = [
326
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
325
+ *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
327
326
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
328
327
  ]
329
- CLI_EXCLUDE_FIELDS = [
330
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
328
+ CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
329
+ *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
331
330
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
332
331
  ]
333
332
 
@@ -24,12 +24,12 @@ from zenml.logger import get_logger
24
24
  from zenml.metadata.metadata_types import MetadataType
25
25
  from zenml.models.v2.base.base import BaseUpdate
26
26
  from zenml.models.v2.base.scoped import (
27
- WorkspaceScopedFilter,
28
- WorkspaceScopedRequest,
29
- WorkspaceScopedResponse,
30
- WorkspaceScopedResponseBody,
31
- WorkspaceScopedResponseMetadata,
32
- WorkspaceScopedResponseResources,
27
+ ProjectScopedFilter,
28
+ ProjectScopedRequest,
29
+ ProjectScopedResponse,
30
+ ProjectScopedResponseBody,
31
+ ProjectScopedResponseMetadata,
32
+ ProjectScopedResponseResources,
33
33
  )
34
34
  from zenml.utils.time_utils import to_utc_timezone
35
35
 
@@ -39,7 +39,7 @@ logger = get_logger(__name__)
39
39
  # ------------------ Request Model ------------------
40
40
 
41
41
 
42
- class ScheduleRequest(WorkspaceScopedRequest):
42
+ class ScheduleRequest(ProjectScopedRequest):
43
43
  """Request model for schedules."""
44
44
 
45
45
  name: str
@@ -127,21 +127,12 @@ class ScheduleUpdate(BaseUpdate):
127
127
  """Update model for schedules."""
128
128
 
129
129
  name: Optional[str] = None
130
- active: Optional[bool] = None
131
- cron_expression: Optional[str] = None
132
- start_time: Optional[datetime] = None
133
- end_time: Optional[datetime] = None
134
- interval_second: Optional[timedelta] = None
135
- catchup: Optional[bool] = None
136
- run_once_start_time: Optional[datetime] = None
137
- orchestrator_id: Optional[UUID] = None
138
- pipeline_id: Optional[UUID] = None
139
130
 
140
131
 
141
132
  # ------------------ Response Model ------------------
142
133
 
143
134
 
144
- class ScheduleResponseBody(WorkspaceScopedResponseBody):
135
+ class ScheduleResponseBody(ProjectScopedResponseBody):
145
136
  """Response body for schedules."""
146
137
 
147
138
  active: bool
@@ -153,7 +144,7 @@ class ScheduleResponseBody(WorkspaceScopedResponseBody):
153
144
  run_once_start_time: Optional[datetime] = None
154
145
 
155
146
 
156
- class ScheduleResponseMetadata(WorkspaceScopedResponseMetadata):
147
+ class ScheduleResponseMetadata(ProjectScopedResponseMetadata):
157
148
  """Response metadata for schedules."""
158
149
 
159
150
  orchestrator_id: Optional[UUID]
@@ -165,12 +156,12 @@ class ScheduleResponseMetadata(WorkspaceScopedResponseMetadata):
165
156
  )
166
157
 
167
158
 
168
- class ScheduleResponseResources(WorkspaceScopedResponseResources):
159
+ class ScheduleResponseResources(ProjectScopedResponseResources):
169
160
  """Class for all resource models associated with the schedule entity."""
170
161
 
171
162
 
172
163
  class ScheduleResponse(
173
- WorkspaceScopedResponse[
164
+ ProjectScopedResponse[
174
165
  ScheduleResponseBody,
175
166
  ScheduleResponseMetadata,
176
167
  ScheduleResponseResources,
@@ -313,7 +304,7 @@ class ScheduleResponse(
313
304
  # ------------------ Filter Model ------------------
314
305
 
315
306
 
316
- class ScheduleFilter(WorkspaceScopedFilter):
307
+ class ScheduleFilter(ProjectScopedFilter):
317
308
  """Model to enable advanced filtering of all Users."""
318
309
 
319
310
  pipeline_id: Optional[Union[UUID, str]] = Field(