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,10 +31,10 @@ from zenml.models import (
31
31
  from zenml.utils.json_utils import pydantic_encoder
32
32
  from zenml.zen_stores.schemas.base_schemas import BaseSchema
33
33
  from zenml.zen_stores.schemas.pipeline_schemas import PipelineSchema
34
+ from zenml.zen_stores.schemas.project_schemas import ProjectSchema
34
35
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
35
36
  from zenml.zen_stores.schemas.stack_schemas import StackSchema
36
37
  from zenml.zen_stores.schemas.user_schemas import UserSchema
37
- from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
38
38
 
39
39
 
40
40
  class PipelineBuildSchema(BaseSchema, table=True):
@@ -52,15 +52,15 @@ class PipelineBuildSchema(BaseSchema, table=True):
52
52
  )
53
53
  user: Optional["UserSchema"] = Relationship(back_populates="builds")
54
54
 
55
- workspace_id: UUID = build_foreign_key_field(
55
+ project_id: UUID = build_foreign_key_field(
56
56
  source=__tablename__,
57
- target=WorkspaceSchema.__tablename__,
58
- source_column="workspace_id",
57
+ target=ProjectSchema.__tablename__,
58
+ source_column="project_id",
59
59
  target_column="id",
60
60
  ondelete="CASCADE",
61
61
  nullable=False,
62
62
  )
63
- workspace: "WorkspaceSchema" = Relationship(back_populates="builds")
63
+ project: "ProjectSchema" = Relationship(back_populates="builds")
64
64
 
65
65
  stack_id: Optional[UUID] = build_foreign_key_field(
66
66
  source=__tablename__,
@@ -117,7 +117,7 @@ class PipelineBuildSchema(BaseSchema, table=True):
117
117
  """
118
118
  return cls(
119
119
  stack_id=request.stack,
120
- workspace_id=request.workspace,
120
+ project_id=request.project,
121
121
  user_id=request.user,
122
122
  pipeline_id=request.pipeline,
123
123
  images=json.dumps(request.images, default=pydantic_encoder),
@@ -155,7 +155,7 @@ class PipelineBuildSchema(BaseSchema, table=True):
155
155
  metadata = None
156
156
  if include_metadata:
157
157
  metadata = PipelineBuildResponseMetadata(
158
- workspace=self.workspace.to_model(),
158
+ project=self.project.to_model(),
159
159
  pipeline=self.pipeline.to_model() if self.pipeline else None,
160
160
  stack=self.stack.to_model() if self.stack else None,
161
161
  images=json.loads(self.images),
@@ -38,11 +38,11 @@ from zenml.zen_stores.schemas.code_repository_schemas import (
38
38
  )
39
39
  from zenml.zen_stores.schemas.pipeline_build_schemas import PipelineBuildSchema
40
40
  from zenml.zen_stores.schemas.pipeline_schemas import PipelineSchema
41
+ from zenml.zen_stores.schemas.project_schemas import ProjectSchema
41
42
  from zenml.zen_stores.schemas.schedule_schema import ScheduleSchema
42
43
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
43
44
  from zenml.zen_stores.schemas.stack_schemas import StackSchema
44
45
  from zenml.zen_stores.schemas.user_schemas import UserSchema
45
- from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
46
46
 
47
47
  if TYPE_CHECKING:
48
48
  from zenml.zen_stores.schemas.pipeline_run_schemas import PipelineRunSchema
@@ -95,10 +95,10 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
95
95
  ondelete="SET NULL",
96
96
  nullable=True,
97
97
  )
98
- workspace_id: UUID = build_foreign_key_field(
98
+ project_id: UUID = build_foreign_key_field(
99
99
  source=__tablename__,
100
- target=WorkspaceSchema.__tablename__,
101
- source_column="workspace_id",
100
+ target=ProjectSchema.__tablename__,
101
+ source_column="project_id",
102
102
  target_column="id",
103
103
  ondelete="CASCADE",
104
104
  nullable=False,
@@ -148,8 +148,10 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
148
148
  template_id: Optional[UUID] = None
149
149
 
150
150
  # SQLModel Relationships
151
- user: Optional["UserSchema"] = Relationship()
152
- workspace: "WorkspaceSchema" = Relationship()
151
+ user: Optional["UserSchema"] = Relationship(
152
+ back_populates="deployments",
153
+ )
154
+ project: "ProjectSchema" = Relationship()
153
155
  stack: Optional["StackSchema"] = Relationship()
154
156
  pipeline: Optional["PipelineSchema"] = Relationship()
155
157
  schedule: Optional["ScheduleSchema"] = Relationship()
@@ -185,7 +187,7 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
185
187
  """
186
188
  return cls(
187
189
  stack_id=request.stack,
188
- workspace_id=request.workspace,
190
+ project_id=request.project,
189
191
  pipeline_id=request.pipeline,
190
192
  build_id=request.build,
191
193
  user_id=request.user,
@@ -243,7 +245,7 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
243
245
  step_configurations[s] = Step.model_validate(c)
244
246
 
245
247
  metadata = PipelineDeploymentResponseMetadata(
246
- workspace=self.workspace.to_model(),
248
+ project=self.project.to_model(),
247
249
  run_name_template=self.run_name_template,
248
250
  pipeline_configuration=pipeline_configuration,
249
251
  step_configurations=step_configurations,
@@ -45,13 +45,13 @@ from zenml.zen_stores.schemas.pipeline_deployment_schemas import (
45
45
  PipelineDeploymentSchema,
46
46
  )
47
47
  from zenml.zen_stores.schemas.pipeline_schemas import PipelineSchema
48
+ from zenml.zen_stores.schemas.project_schemas import ProjectSchema
48
49
  from zenml.zen_stores.schemas.schedule_schema import ScheduleSchema
49
50
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
50
51
  from zenml.zen_stores.schemas.stack_schemas import StackSchema
51
52
  from zenml.zen_stores.schemas.trigger_schemas import TriggerExecutionSchema
52
53
  from zenml.zen_stores.schemas.user_schemas import UserSchema
53
54
  from zenml.zen_stores.schemas.utils import RunMetadataInterface
54
- from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
55
55
 
56
56
  if TYPE_CHECKING:
57
57
  from zenml.zen_stores.schemas.logs_schemas import LogsSchema
@@ -77,8 +77,8 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
77
77
  ),
78
78
  UniqueConstraint(
79
79
  "name",
80
- "workspace_id",
81
- name="unique_run_name_in_workspace",
80
+ "project_id",
81
+ name="unique_run_name_in_project",
82
82
  ),
83
83
  )
84
84
 
@@ -108,10 +108,10 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
108
108
  ondelete="SET NULL",
109
109
  nullable=True,
110
110
  )
111
- workspace_id: UUID = build_foreign_key_field(
111
+ project_id: UUID = build_foreign_key_field(
112
112
  source=__tablename__,
113
- target=WorkspaceSchema.__tablename__,
114
- source_column="workspace_id",
113
+ target=ProjectSchema.__tablename__,
114
+ source_column="project_id",
115
115
  target_column="id",
116
116
  ondelete="CASCADE",
117
117
  nullable=False,
@@ -137,7 +137,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
137
137
  deployment: Optional["PipelineDeploymentSchema"] = Relationship(
138
138
  back_populates="pipeline_runs"
139
139
  )
140
- workspace: "WorkspaceSchema" = Relationship(back_populates="runs")
140
+ project: "ProjectSchema" = Relationship(back_populates="runs")
141
141
  user: Optional["UserSchema"] = Relationship(back_populates="runs")
142
142
  run_metadata: List["RunMetadataSchema"] = Relationship(
143
143
  sa_relationship_kwargs=dict(
@@ -241,7 +241,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
241
241
  orchestrator_environment = json.dumps(request.orchestrator_environment)
242
242
 
243
243
  return cls(
244
- workspace_id=request.workspace,
244
+ project_id=request.project,
245
245
  user_id=request.user,
246
246
  name=request.name,
247
247
  orchestrator_run_id=request.orchestrator_run_id,
@@ -251,7 +251,6 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
251
251
  pipeline_id=request.pipeline,
252
252
  deployment_id=request.deployment,
253
253
  trigger_execution_id=request.trigger_execution_id,
254
- model_version_id=request.model_version_id,
255
254
  )
256
255
 
257
256
  def fetch_metadata_collection(self) -> Dict[str, List[RunMetadataEntry]]:
@@ -385,7 +384,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
385
384
  else {}
386
385
  )
387
386
  metadata = PipelineRunResponseMetadata(
388
- workspace=self.workspace.to_model(),
387
+ project=self.project.to_model(),
389
388
  run_metadata=self.fetch_metadata(),
390
389
  config=config,
391
390
  steps=steps,
@@ -435,8 +434,6 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
435
434
  if run_update.status:
436
435
  self.status = run_update.status.value
437
436
  self.end_time = run_update.end_time
438
- if run_update.model_version_id and self.model_version_id is None:
439
- self.model_version_id = run_update.model_version_id
440
437
 
441
438
  self.updated = utc_now()
442
439
  return self
@@ -31,9 +31,9 @@ from zenml.models import (
31
31
  )
32
32
  from zenml.utils.time_utils import utc_now
33
33
  from zenml.zen_stores.schemas.base_schemas import NamedSchema
34
+ from zenml.zen_stores.schemas.project_schemas import ProjectSchema
34
35
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
35
36
  from zenml.zen_stores.schemas.user_schemas import UserSchema
36
- from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
37
37
 
38
38
  if TYPE_CHECKING:
39
39
  from zenml.zen_stores.schemas.pipeline_build_schemas import (
@@ -54,18 +54,18 @@ class PipelineSchema(NamedSchema, table=True):
54
54
  __table_args__ = (
55
55
  UniqueConstraint(
56
56
  "name",
57
- "workspace_id",
58
- name="unique_pipeline_name_in_workspace",
57
+ "project_id",
58
+ name="unique_pipeline_name_in_project",
59
59
  ),
60
60
  )
61
61
  # Fields
62
62
  description: Optional[str] = Field(sa_column=Column(TEXT, nullable=True))
63
63
 
64
64
  # Foreign keys
65
- workspace_id: UUID = build_foreign_key_field(
65
+ project_id: UUID = build_foreign_key_field(
66
66
  source=__tablename__,
67
- target=WorkspaceSchema.__tablename__,
68
- source_column="workspace_id",
67
+ target=ProjectSchema.__tablename__,
68
+ source_column="project_id",
69
69
  target_column="id",
70
70
  ondelete="CASCADE",
71
71
  nullable=False,
@@ -81,7 +81,7 @@ class PipelineSchema(NamedSchema, table=True):
81
81
 
82
82
  # Relationships
83
83
  user: Optional["UserSchema"] = Relationship(back_populates="pipelines")
84
- workspace: "WorkspaceSchema" = Relationship(back_populates="pipelines")
84
+ project: "ProjectSchema" = Relationship(back_populates="pipelines")
85
85
 
86
86
  schedules: List["ScheduleSchema"] = Relationship(
87
87
  back_populates="pipeline",
@@ -146,7 +146,7 @@ class PipelineSchema(NamedSchema, table=True):
146
146
  return cls(
147
147
  name=pipeline_request.name,
148
148
  description=pipeline_request.description,
149
- workspace_id=pipeline_request.workspace,
149
+ project_id=pipeline_request.project,
150
150
  user_id=pipeline_request.user,
151
151
  )
152
152
 
@@ -179,7 +179,7 @@ class PipelineSchema(NamedSchema, table=True):
179
179
  metadata = None
180
180
  if include_metadata:
181
181
  metadata = PipelineResponseMetadata(
182
- workspace=self.workspace.to_model(),
182
+ project=self.project.to_model(),
183
183
  description=self.description,
184
184
  )
185
185
 
@@ -11,18 +11,19 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
12
  # or implied. See the License for the specific language governing
13
13
  # permissions and limitations under the License.
14
- """SQL Model Implementations for Workspaces."""
14
+ """SQL Model Implementations for projects."""
15
15
 
16
16
  from typing import TYPE_CHECKING, Any, List
17
17
 
18
+ from sqlalchemy import UniqueConstraint
18
19
  from sqlmodel import Relationship
19
20
 
20
21
  from zenml.models import (
21
- WorkspaceRequest,
22
- WorkspaceResponse,
23
- WorkspaceResponseBody,
24
- WorkspaceResponseMetadata,
25
- WorkspaceUpdate,
22
+ ProjectRequest,
23
+ ProjectResponse,
24
+ ProjectResponseBody,
25
+ ProjectResponseMetadata,
26
+ ProjectUpdate,
26
27
  )
27
28
  from zenml.utils.time_utils import utc_now
28
29
  from zenml.zen_stores.schemas.base_schemas import NamedSchema
@@ -33,7 +34,6 @@ if TYPE_CHECKING:
33
34
  ArtifactVersionSchema,
34
35
  CodeRepositorySchema,
35
36
  EventSourceSchema,
36
- FlavorSchema,
37
37
  ModelSchema,
38
38
  ModelVersionSchema,
39
39
  PipelineBuildSchema,
@@ -42,128 +42,115 @@ if TYPE_CHECKING:
42
42
  PipelineSchema,
43
43
  RunMetadataSchema,
44
44
  ScheduleSchema,
45
- SecretSchema,
46
- ServiceConnectorSchema,
47
45
  ServiceSchema,
48
- StackComponentSchema,
49
- StackSchema,
50
46
  StepRunSchema,
51
47
  TriggerSchema,
52
48
  )
53
49
 
54
50
 
55
- class WorkspaceSchema(NamedSchema, table=True):
56
- """SQL Model for workspaces."""
51
+ class ProjectSchema(NamedSchema, table=True):
52
+ """SQL Model for projects."""
57
53
 
58
- __tablename__ = "workspace"
54
+ __tablename__ = "project"
55
+ __table_args__ = (
56
+ UniqueConstraint(
57
+ "name",
58
+ name="unique_project_name",
59
+ ),
60
+ )
59
61
 
62
+ display_name: str
60
63
  description: str
61
64
 
62
- stacks: List["StackSchema"] = Relationship(
63
- back_populates="workspace",
64
- sa_relationship_kwargs={"cascade": "delete"},
65
- )
66
- components: List["StackComponentSchema"] = Relationship(
67
- back_populates="workspace",
68
- sa_relationship_kwargs={"cascade": "delete"},
69
- )
70
- flavors: List["FlavorSchema"] = Relationship(
71
- back_populates="workspace",
72
- sa_relationship_kwargs={"cascade": "delete"},
73
- )
74
65
  pipelines: List["PipelineSchema"] = Relationship(
75
- back_populates="workspace",
66
+ back_populates="project",
76
67
  sa_relationship_kwargs={"cascade": "delete"},
77
68
  )
78
69
  schedules: List["ScheduleSchema"] = Relationship(
79
- back_populates="workspace",
70
+ back_populates="project",
80
71
  sa_relationship_kwargs={"cascade": "delete"},
81
72
  )
82
73
  runs: List["PipelineRunSchema"] = Relationship(
83
- back_populates="workspace",
74
+ back_populates="project",
84
75
  sa_relationship_kwargs={"cascade": "delete"},
85
76
  )
86
77
  step_runs: List["StepRunSchema"] = Relationship(
87
- back_populates="workspace",
78
+ back_populates="project",
88
79
  sa_relationship_kwargs={"cascade": "delete"},
89
80
  )
90
81
  builds: List["PipelineBuildSchema"] = Relationship(
91
- back_populates="workspace",
82
+ back_populates="project",
92
83
  sa_relationship_kwargs={"cascade": "delete"},
93
84
  )
94
85
  artifact_versions: List["ArtifactVersionSchema"] = Relationship(
95
- back_populates="workspace",
86
+ back_populates="project",
96
87
  sa_relationship_kwargs={"cascade": "delete"},
97
88
  )
98
89
  run_metadata: List["RunMetadataSchema"] = Relationship(
99
- back_populates="workspace",
100
- sa_relationship_kwargs={"cascade": "delete"},
101
- )
102
- secrets: List["SecretSchema"] = Relationship(
103
- back_populates="workspace",
90
+ back_populates="project",
104
91
  sa_relationship_kwargs={"cascade": "delete"},
105
92
  )
106
93
  actions: List["ActionSchema"] = Relationship(
107
- back_populates="workspace",
94
+ back_populates="project",
108
95
  sa_relationship_kwargs={"cascade": "delete"},
109
96
  )
110
97
  triggers: List["TriggerSchema"] = Relationship(
111
- back_populates="workspace",
98
+ back_populates="project",
112
99
  sa_relationship_kwargs={"cascade": "delete"},
113
100
  )
114
101
  event_sources: List["EventSourceSchema"] = Relationship(
115
- back_populates="workspace",
102
+ back_populates="project",
116
103
  sa_relationship_kwargs={"cascade": "delete"},
117
104
  )
118
105
 
119
106
  deployments: List["PipelineDeploymentSchema"] = Relationship(
120
- back_populates="workspace",
107
+ back_populates="project",
121
108
  sa_relationship_kwargs={"cascade": "delete"},
122
109
  )
123
110
  code_repositories: List["CodeRepositorySchema"] = Relationship(
124
- back_populates="workspace",
111
+ back_populates="project",
125
112
  sa_relationship_kwargs={"cascade": "delete"},
126
113
  )
127
114
  services: List["ServiceSchema"] = Relationship(
128
- back_populates="workspace",
129
- sa_relationship_kwargs={"cascade": "delete"},
130
- )
131
- service_connectors: List["ServiceConnectorSchema"] = Relationship(
132
- back_populates="workspace",
115
+ back_populates="project",
133
116
  sa_relationship_kwargs={"cascade": "delete"},
134
117
  )
135
118
  models: List["ModelSchema"] = Relationship(
136
- back_populates="workspace",
119
+ back_populates="project",
137
120
  sa_relationship_kwargs={"cascade": "delete"},
138
121
  )
139
122
  model_versions: List["ModelVersionSchema"] = Relationship(
140
- back_populates="workspace",
123
+ back_populates="project",
141
124
  sa_relationship_kwargs={"cascade": "delete"},
142
125
  )
143
126
 
144
127
  @classmethod
145
- def from_request(cls, workspace: WorkspaceRequest) -> "WorkspaceSchema":
146
- """Create a `WorkspaceSchema` from a `WorkspaceResponse`.
128
+ def from_request(cls, project: ProjectRequest) -> "ProjectSchema":
129
+ """Create a `ProjectSchema` from a `ProjectResponse`.
147
130
 
148
131
  Args:
149
- workspace: The `WorkspaceResponse` from which to create the schema.
132
+ project: The `ProjectResponse` from which to create the schema.
150
133
 
151
134
  Returns:
152
- The created `WorkspaceSchema`.
135
+ The created `ProjectSchema`.
153
136
  """
154
- return cls(name=workspace.name, description=workspace.description)
137
+ return cls(
138
+ name=project.name,
139
+ description=project.description,
140
+ display_name=project.display_name,
141
+ )
155
142
 
156
- def update(self, workspace_update: WorkspaceUpdate) -> "WorkspaceSchema":
157
- """Update a `WorkspaceSchema` from a `WorkspaceUpdate`.
143
+ def update(self, project_update: ProjectUpdate) -> "ProjectSchema":
144
+ """Update a `ProjectSchema` from a `ProjectUpdate`.
158
145
 
159
146
  Args:
160
- workspace_update: The `WorkspaceUpdate` from which to update the
147
+ project_update: The `ProjectUpdate` from which to update the
161
148
  schema.
162
149
 
163
150
  Returns:
164
- The updated `WorkspaceSchema`.
151
+ The updated `ProjectSchema`.
165
152
  """
166
- for field, value in workspace_update.model_dump(
153
+ for field, value in project_update.model_dump(
167
154
  exclude_unset=True
168
155
  ).items():
169
156
  setattr(self, field, value)
@@ -176,8 +163,8 @@ class WorkspaceSchema(NamedSchema, table=True):
176
163
  include_metadata: bool = False,
177
164
  include_resources: bool = False,
178
165
  **kwargs: Any,
179
- ) -> WorkspaceResponse:
180
- """Convert a `WorkspaceSchema` to a `WorkspaceResponse`.
166
+ ) -> ProjectResponse:
167
+ """Convert a `ProjectSchema` to a `ProjectResponse`.
181
168
 
182
169
  Args:
183
170
  include_metadata: Whether the metadata will be filled.
@@ -186,17 +173,18 @@ class WorkspaceSchema(NamedSchema, table=True):
186
173
 
187
174
 
188
175
  Returns:
189
- The converted `WorkspaceResponseModel`.
176
+ The converted `ProjectResponseModel`.
190
177
  """
191
178
  metadata = None
192
179
  if include_metadata:
193
- metadata = WorkspaceResponseMetadata(
180
+ metadata = ProjectResponseMetadata(
194
181
  description=self.description,
195
182
  )
196
- return WorkspaceResponse(
183
+ return ProjectResponse(
197
184
  id=self.id,
198
185
  name=self.name,
199
- body=WorkspaceResponseBody(
186
+ body=ProjectResponseBody(
187
+ display_name=self.display_name,
200
188
  created=self.created,
201
189
  updated=self.updated,
202
190
  ),
@@ -21,13 +21,13 @@ from sqlmodel import Field, Relationship, SQLModel
21
21
 
22
22
  from zenml.zen_stores.schemas.base_schemas import BaseSchema
23
23
  from zenml.zen_stores.schemas.component_schemas import StackComponentSchema
24
+ from zenml.zen_stores.schemas.project_schemas import ProjectSchema
24
25
  from zenml.zen_stores.schemas.schema_utils import (
25
26
  build_foreign_key_field,
26
27
  build_index,
27
28
  )
28
29
  from zenml.zen_stores.schemas.step_run_schemas import StepRunSchema
29
30
  from zenml.zen_stores.schemas.user_schemas import UserSchema
30
- from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
31
31
 
32
32
 
33
33
  class RunMetadataSchema(BaseSchema, table=True):
@@ -57,15 +57,15 @@ class RunMetadataSchema(BaseSchema, table=True):
57
57
  )
58
58
  user: Optional["UserSchema"] = Relationship(back_populates="run_metadata")
59
59
 
60
- workspace_id: UUID = build_foreign_key_field(
60
+ project_id: UUID = build_foreign_key_field(
61
61
  source=__tablename__,
62
- target=WorkspaceSchema.__tablename__,
63
- source_column="workspace_id",
62
+ target=ProjectSchema.__tablename__,
63
+ source_column="project_id",
64
64
  target_column="id",
65
65
  ondelete="CASCADE",
66
66
  nullable=False,
67
67
  )
68
- workspace: "WorkspaceSchema" = Relationship(back_populates="run_metadata")
68
+ project: "ProjectSchema" = Relationship(back_populates="run_metadata")
69
69
 
70
70
  key: str
71
71
  value: str = Field(sa_column=Column(TEXT, nullable=False))
@@ -32,10 +32,10 @@ from zenml.models import (
32
32
  RunTemplateUpdate,
33
33
  )
34
34
  from zenml.utils.time_utils import utc_now
35
- from zenml.zen_stores.schemas.base_schemas import BaseSchema
35
+ from zenml.zen_stores.schemas.base_schemas import NamedSchema
36
+ from zenml.zen_stores.schemas.project_schemas import ProjectSchema
36
37
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
37
38
  from zenml.zen_stores.schemas.user_schemas import UserSchema
38
- from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
39
39
 
40
40
  if TYPE_CHECKING:
41
41
  from zenml.zen_stores.schemas.pipeline_deployment_schemas import (
@@ -45,19 +45,18 @@ if TYPE_CHECKING:
45
45
  from zenml.zen_stores.schemas.tag_schemas import TagSchema
46
46
 
47
47
 
48
- class RunTemplateSchema(BaseSchema, table=True):
48
+ class RunTemplateSchema(NamedSchema, table=True):
49
49
  """SQL Model for run templates."""
50
50
 
51
51
  __tablename__ = "run_template"
52
52
  __table_args__ = (
53
53
  UniqueConstraint(
54
54
  "name",
55
- "workspace_id",
56
- name="unique_template_name_in_workspace",
55
+ "project_id",
56
+ name="unique_template_name_in_project",
57
57
  ),
58
58
  )
59
59
 
60
- name: str = Field(nullable=False)
61
60
  description: Optional[str] = Field(
62
61
  sa_column=Column(
63
62
  String(length=MEDIUMTEXT_MAX_LENGTH).with_variant(
@@ -75,10 +74,10 @@ class RunTemplateSchema(BaseSchema, table=True):
75
74
  ondelete="SET NULL",
76
75
  nullable=True,
77
76
  )
78
- workspace_id: UUID = build_foreign_key_field(
77
+ project_id: UUID = build_foreign_key_field(
79
78
  source=__tablename__,
80
- target=WorkspaceSchema.__tablename__,
81
- source_column="workspace_id",
79
+ target=ProjectSchema.__tablename__,
80
+ source_column="project_id",
82
81
  target_column="id",
83
82
  ondelete="CASCADE",
84
83
  nullable=False,
@@ -92,8 +91,10 @@ class RunTemplateSchema(BaseSchema, table=True):
92
91
  nullable=True,
93
92
  )
94
93
 
95
- user: Optional["UserSchema"] = Relationship()
96
- workspace: "WorkspaceSchema" = Relationship()
94
+ user: Optional["UserSchema"] = Relationship(
95
+ back_populates="run_templates",
96
+ )
97
+ project: "ProjectSchema" = Relationship()
97
98
  source_deployment: Optional["PipelineDeploymentSchema"] = Relationship(
98
99
  sa_relationship_kwargs={
99
100
  "foreign_keys": "RunTemplateSchema.source_deployment_id",
@@ -162,7 +163,7 @@ class RunTemplateSchema(BaseSchema, table=True):
162
163
  """
163
164
  return cls(
164
165
  user_id=request.user,
165
- workspace_id=request.workspace,
166
+ project_id=request.project,
166
167
  name=request.name,
167
168
  description=request.description,
168
169
  source_deployment_id=request.source_deployment_id,
@@ -180,6 +181,9 @@ class RunTemplateSchema(BaseSchema, table=True):
180
181
  for field, value in update.model_dump(
181
182
  exclude_unset=True, exclude_none=True
182
183
  ).items():
184
+ if field in ["add_tags", "remove_tags"]:
185
+ # Tags are handled separately
186
+ continue
183
187
  setattr(self, field, value)
184
188
 
185
189
  self.updated = utc_now()
@@ -246,7 +250,7 @@ class RunTemplateSchema(BaseSchema, table=True):
246
250
  )
247
251
 
248
252
  metadata = RunTemplateResponseMetadata(
249
- workspace=self.workspace.to_model(),
253
+ project=self.project.to_model(),
250
254
  description=self.description,
251
255
  pipeline_spec=pipeline_spec,
252
256
  config_template=config_template,