zenml-nightly 0.72.0.dev20250120__py3-none-any.whl → 0.73.0.dev20250123__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 (165) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/service_connectors.py +8 -4
  3. zenml/cli/stack.py +2 -2
  4. zenml/config/pipeline_configurations.py +2 -2
  5. zenml/config/server_config.py +20 -0
  6. zenml/constants.py +5 -0
  7. zenml/event_hub/base_event_hub.py +2 -2
  8. zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +4 -2
  9. zenml/integrations/airflow/orchestrators/dag_generator.py +16 -0
  10. zenml/integrations/gcp/__init__.py +3 -0
  11. zenml/integrations/gcp/experiment_trackers/__init__.py +18 -0
  12. zenml/integrations/gcp/experiment_trackers/vertex_experiment_tracker.py +214 -0
  13. zenml/integrations/gcp/flavors/__init__.py +6 -0
  14. zenml/integrations/gcp/flavors/vertex_experiment_tracker_flavor.py +199 -0
  15. zenml/integrations/kubernetes/orchestrators/kube_utils.py +2 -2
  16. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +0 -1
  17. zenml/integrations/slack/__init__.py +1 -2
  18. zenml/integrations/slack/alerters/slack_alerter.py +119 -61
  19. zenml/integrations/slack/flavors/slack_alerter_flavor.py +18 -8
  20. zenml/integrations/whylogs/data_validators/whylogs_data_validator.py +3 -1
  21. zenml/materializers/built_in_materializer.py +17 -2
  22. zenml/models/v2/core/api_key.py +2 -2
  23. zenml/orchestrators/publish_utils.py +4 -4
  24. zenml/orchestrators/step_launcher.py +3 -3
  25. zenml/orchestrators/step_run_utils.py +2 -2
  26. zenml/pipelines/pipeline_definition.py +1 -1
  27. zenml/pipelines/run_utils.py +2 -2
  28. zenml/service_connectors/service_connector.py +2 -2
  29. zenml/stack/stack.py +3 -3
  30. zenml/stack_deployments/stack_deployment.py +5 -0
  31. zenml/utils/git_utils.py +1 -1
  32. zenml/utils/string_utils.py +2 -2
  33. zenml/utils/yaml_utils.py +3 -4
  34. zenml/zen_server/auth.py +13 -6
  35. zenml/zen_server/dashboard/assets/{404-Dfq64Boz.js → 404-c8OuXDAT.js} +1 -1
  36. zenml/zen_server/dashboard/assets/{@reactflow-BUNIMFeC.js → @reactflow-6JPoencd.js} +1 -1
  37. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-B73Vs10T.js → AlertDialogDropdownItem-8yPFDxEI.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{CodeSnippet-DIJRT2NT.js → CodeSnippet-Qh1ae_DJ.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{CollapsibleCard-BzUHGZOU.js → CollapsibleCard-TiI4lId1.js} +1 -1
  40. zenml/zen_server/dashboard/assets/{Commands-BEGyld4c.js → Commands-BcR2Arie.js} +1 -1
  41. zenml/zen_server/dashboard/assets/{ComponentBadge-xyKiek1s.js → ComponentBadge-BqQNUZgb.js} +1 -1
  42. zenml/zen_server/dashboard/assets/{CopyButton-DhW-mapu.js → CopyButton-DCiXO3JC.js} +1 -1
  43. zenml/zen_server/dashboard/assets/{CsvVizualization-D8oazBiE.js → CsvVizualization-O9cVIaL8.js} +1 -1
  44. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-WkSIIgfy.js → DeleteAlertDialog-DrPjHtXX.js} +1 -1
  45. zenml/zen_server/dashboard/assets/{DialogItem-Bgroeg29.js → DialogItem-BYG7d_M2.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{Error-CY5tlu17.js → Error-C1zbWr19.js} +1 -1
  47. zenml/zen_server/dashboard/assets/{ExecutionStatus-G8mjIaeA.js → ExecutionStatus-Ct9srgHC.js} +1 -1
  48. zenml/zen_server/dashboard/assets/{Helpbox-Bb1ed--O.js → Helpbox-Bm_1Zx9f.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{Infobox-Da6-76M2.js → Infobox-OQdkCLSP.js} +1 -1
  50. zenml/zen_server/dashboard/assets/{InlineAvatar-DqnZaBNq.js → InlineAvatar-CQNjKoEQ.js} +1 -1
  51. zenml/zen_server/dashboard/assets/{NestedCollapsible-aK5ojKoF.js → NestedCollapsible-DDgd2SGb.js} +1 -1
  52. zenml/zen_server/dashboard/assets/Partials-MD3e95Dk.js +1 -0
  53. zenml/zen_server/dashboard/assets/{ProBadge-B4tRUYve.js → ProBadge-D784iVNC.js} +1 -1
  54. zenml/zen_server/dashboard/assets/{ProCta-CZuP29Qz.js → ProCta-W2PEvNow.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{ProviderIcon-Bd7GUQ1_.js → ProviderIcon-DfDUOeAy.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{ProviderRadio-mstdqzsS.js → ProviderRadio-B81Elxrc.js} +1 -1
  57. zenml/zen_server/dashboard/assets/{RunSelector-CsruSB4i.js → RunSelector-DOXgdry5.js} +1 -1
  58. zenml/zen_server/dashboard/assets/{RunsBody-DxxtWVYz.js → RunsBody-Bnx2fxub.js} +1 -1
  59. zenml/zen_server/dashboard/assets/SearchField-Yjv-KRW4.js +1 -0
  60. zenml/zen_server/dashboard/assets/{SecretTooltip-CLzJIYW_.js → SecretTooltip-EKpMlG2f.js} +1 -1
  61. zenml/zen_server/dashboard/assets/{SetPassword-Yn50ooBC.js → SetPassword-CDLy57PZ.js} +1 -1
  62. zenml/zen_server/dashboard/assets/StackList-DKQaLDo4.js +1 -0
  63. zenml/zen_server/dashboard/assets/{Tabs-CNv-eTYM.js → Tabs-B5E-o_h6.js} +1 -1
  64. zenml/zen_server/dashboard/assets/{Tick-jEIevzVf.js → Tick-DSYBiuXU.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-C16GW-kX.js → UpdatePasswordSchemas-HBNOeyoP.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{UsageReason-Bf2tzhv1.js → UsageReason-DXtPS5nE.js} +1 -1
  67. zenml/zen_server/dashboard/assets/{WizardFooter-D6i-AP1K.js → WizardFooter-_1VSMZ_c.js} +1 -1
  68. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-DUti43aF.js → all-pipeline-runs-query-D0qDLdKB.js} +1 -1
  69. zenml/zen_server/dashboard/assets/{create-stack-Ch2WPs9U.js → create-stack-7JzgAYAm.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{delete-run-Byf9hTjA.js → delete-run-CUdtYFLl.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{form-schemas-BZqKBPBF.js → form-schemas-B6PCV3Y4.js} +1 -1
  72. zenml/zen_server/dashboard/assets/index-B6U0OkEN.css +1 -0
  73. zenml/zen_server/dashboard/assets/{index-CyBKZcpO.js → index-CJ5IfeAl.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{index-CtdYkjUi.js → index-Ceyzb1yI.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{index-CE0aQlv8.js → index-CxO6541P.js} +3 -3
  76. zenml/zen_server/dashboard/assets/{index-v6gQjDEo.js → index-D4yoZ_gH.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{login-mutation-DNDVp_2H.js → login-mutation-BaeJ7MAg.js} +1 -1
  78. zenml/zen_server/dashboard/assets/{not-found-Bmup4ctE.js → not-found-MGptrNBk.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{page-DGlm1RVc.js → page-Aeu3v0MQ.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{page-CltCNL0T.js → page-BCgEdmhP.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{page-Hn8q9iJZ.js → page-BKwwfTNy.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{page-BNxYrN0q.js → page-BUjw8Tp1.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{page-BYJfqgLN.js → page-BXgXP-Qj.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{page-DN4BVIOL.js → page-BXrtxEbw.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{page-CHRn1fQm.js → page-BaUDR9Ri.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{page-DlIi5ThM.js → page-BbljjC-k.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{page-BrmJp1Wt.js → page-BhOXn-s9.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{page-Cc8ZEuj4.js → page-C37IDa-Q.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{page-Dif8CWyZ.js → page-C4JpDeUM.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{page-BC27C_OI.js → page-CB2_GdBA.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{page-B5Sr8pib.js → page-CBiT2Ox9.js} +1 -1
  92. zenml/zen_server/dashboard/assets/{page-IhckKFnD.js → page-CXPc-HN1.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{page-Dth9X1Ih.js → page-CbwI6emp.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{page-DweqqCkF.js → page-CeNL9JWi.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{page-LyZ_l8vR.js → page-CkPwPmLZ.js} +1 -1
  96. zenml/zen_server/dashboard/assets/{page-C70wZtV2.js → page-CmJU3Gqo.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{page-D9Oh05fl.js → page-CoFVtzhG.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{page-PamGpk0j.js → page-D-KPzeQb.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{page-DoW7YxTu.js → page-DKQ3wZgr.js} +1 -1
  100. zenml/zen_server/dashboard/assets/page-DWWhxCoF.js +1 -0
  101. zenml/zen_server/dashboard/assets/{page-CmlYj7Nl.js → page-DbW8MfQ4.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{page-CWr96ZKN.js → page-Dv5lN2w7.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{page-ANYGfEUL.js → page-Dvbq1BoF.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{page-D6Ev5P8V.js → page-DyAuja95.js} +1 -1
  105. zenml/zen_server/dashboard/assets/{page-DyOJ_pq3.js → page-DzrdL2v1.js} +1 -1
  106. zenml/zen_server/dashboard/assets/{page-CXAbSyp9.js → page-I2B4Ocv8.js} +1 -1
  107. zenml/zen_server/dashboard/assets/page-OdjGauvw.js +2 -0
  108. zenml/zen_server/dashboard/assets/{page-CaeI9ptC.js → page-Ox-eC1ik.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{page-B_0XkV48.js → page-khp8QJ6b.js} +1 -1
  110. zenml/zen_server/dashboard/assets/{page--XLMzHrn.js → page-yNh6PQKt.js} +1 -1
  111. zenml/zen_server/dashboard/assets/{persist-vP0-Xl4f.js → persist-DBTFy--v.js} +1 -1
  112. zenml/zen_server/dashboard/assets/{persist-DeXRG61d.js → persist-K7AY0ju4.js} +1 -1
  113. zenml/zen_server/dashboard/assets/{service-DH_oUqQj.js → service-BvOYLH5b.js} +1 -1
  114. zenml/zen_server/dashboard/assets/{sharedSchema-Bw1_Wa7l.js → sharedSchema-xJDsJNgJ.js} +1 -1
  115. zenml/zen_server/dashboard/assets/{stack-detail-query-B_0R_fd6.js → stack-detail-query-DMJoxwgv.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-D9qYhfaN.js → update-server-settings-mutation-ATZDNNZk.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{url-Dh93fvh0.js → url-BWJXzuI4.js} +1 -1
  118. zenml/zen_server/dashboard/index.html +4 -4
  119. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  120. zenml/zen_server/deploy/helm/README.md +2 -2
  121. zenml/zen_server/deploy/helm/templates/server-db-job.yaml +5 -3
  122. zenml/zen_server/deploy/helm/values.yaml +4 -0
  123. zenml/zen_server/routers/devices_endpoints.py +4 -2
  124. zenml/zen_stores/migrations/versions/0.73.0_release.py +23 -0
  125. zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +2 -2
  126. zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +2 -2
  127. zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +6 -6
  128. zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +2 -2
  129. zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +3 -3
  130. zenml/zen_stores/schemas/action_schemas.py +2 -2
  131. zenml/zen_stores/schemas/api_key_schemas.py +4 -4
  132. zenml/zen_stores/schemas/artifact_schemas.py +3 -3
  133. zenml/zen_stores/schemas/base_schemas.py +7 -3
  134. zenml/zen_stores/schemas/code_repository_schemas.py +2 -2
  135. zenml/zen_stores/schemas/component_schemas.py +2 -2
  136. zenml/zen_stores/schemas/device_schemas.py +4 -4
  137. zenml/zen_stores/schemas/event_source_schemas.py +2 -2
  138. zenml/zen_stores/schemas/flavor_schemas.py +2 -2
  139. zenml/zen_stores/schemas/model_schemas.py +3 -3
  140. zenml/zen_stores/schemas/pipeline_run_schemas.py +3 -3
  141. zenml/zen_stores/schemas/pipeline_schemas.py +2 -2
  142. zenml/zen_stores/schemas/run_template_schemas.py +2 -2
  143. zenml/zen_stores/schemas/schedule_schema.py +2 -2
  144. zenml/zen_stores/schemas/secret_schemas.py +2 -2
  145. zenml/zen_stores/schemas/server_settings_schemas.py +9 -5
  146. zenml/zen_stores/schemas/service_connector_schemas.py +2 -2
  147. zenml/zen_stores/schemas/service_schemas.py +2 -2
  148. zenml/zen_stores/schemas/stack_schemas.py +2 -2
  149. zenml/zen_stores/schemas/step_run_schemas.py +2 -2
  150. zenml/zen_stores/schemas/tag_schemas.py +2 -2
  151. zenml/zen_stores/schemas/trigger_schemas.py +2 -2
  152. zenml/zen_stores/schemas/user_schemas.py +3 -3
  153. zenml/zen_stores/schemas/workspace_schemas.py +2 -2
  154. zenml/zen_stores/sql_zen_store.py +10 -1
  155. {zenml_nightly-0.72.0.dev20250120.dist-info → zenml_nightly-0.73.0.dev20250123.dist-info}/METADATA +2 -2
  156. {zenml_nightly-0.72.0.dev20250120.dist-info → zenml_nightly-0.73.0.dev20250123.dist-info}/RECORD +159 -155
  157. zenml/zen_server/dashboard/assets/Partials-CqZp5NMX.js +0 -1
  158. zenml/zen_server/dashboard/assets/SearchField-D6tPxyqw.js +0 -1
  159. zenml/zen_server/dashboard/assets/StackList-U537qoYd.js +0 -1
  160. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +0 -1
  161. zenml/zen_server/dashboard/assets/page-C2nU3Gxn.js +0 -1
  162. zenml/zen_server/dashboard/assets/page-PxOWfKgF.js +0 -2
  163. {zenml_nightly-0.72.0.dev20250120.dist-info → zenml_nightly-0.73.0.dev20250123.dist-info}/LICENSE +0 -0
  164. {zenml_nightly-0.72.0.dev20250120.dist-info → zenml_nightly-0.73.0.dev20250123.dist-info}/WHEEL +0 -0
  165. {zenml_nightly-0.72.0.dev20250120.dist-info → zenml_nightly-0.73.0.dev20250123.dist-info}/entry_points.txt +0 -0
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation for authorized OAuth2 devices."""
15
15
 
16
- from datetime import datetime, timedelta
16
+ from datetime import datetime, timedelta, timezone
17
17
  from secrets import token_hex
18
18
  from typing import Any, Optional, Tuple
19
19
  from uuid import UUID
@@ -115,7 +115,7 @@ class OAuthDeviceSchema(BaseSchema, table=True):
115
115
  device_code = cls._generate_device_code()
116
116
  hashed_user_code = cls._get_hashed_code(user_code)
117
117
  hashed_device_code = cls._get_hashed_code(device_code)
118
- now = datetime.utcnow()
118
+ now = datetime.now(timezone.utc)
119
119
  return (
120
120
  cls(
121
121
  client_id=request.client_id,
@@ -159,7 +159,7 @@ class OAuthDeviceSchema(BaseSchema, table=True):
159
159
  elif device_update.locked is False:
160
160
  self.status = OAuthDeviceStatus.ACTIVE.value
161
161
 
162
- self.updated = datetime.utcnow()
162
+ self.updated = datetime.now(timezone.utc)
163
163
  return self
164
164
 
165
165
  def internal_update(
@@ -174,7 +174,7 @@ class OAuthDeviceSchema(BaseSchema, table=True):
174
174
  The updated `OAuthDeviceSchema` and the new user code and device
175
175
  code, if they were generated.
176
176
  """
177
- now = datetime.utcnow()
177
+ now = datetime.now(timezone.utc)
178
178
  user_code: Optional[str] = None
179
179
  device_code: Optional[str] = None
180
180
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from datetime import datetime
18
+ from datetime import datetime, timezone
19
19
  from typing import TYPE_CHECKING, Any, List, Optional, cast
20
20
  from uuid import UUID
21
21
 
@@ -184,5 +184,5 @@ class EventSourceSchema(NamedSchema, table=True):
184
184
  )
185
185
  else:
186
186
  setattr(self, field, value)
187
- self.updated = datetime.utcnow()
187
+ self.updated = datetime.now(timezone.utc)
188
188
  return self
@@ -14,7 +14,7 @@
14
14
  """SQL Model Implementations for Flavors."""
15
15
 
16
16
  import json
17
- from datetime import datetime
17
+ from datetime import datetime, timezone
18
18
  from typing import Any, Optional
19
19
  from uuid import UUID
20
20
 
@@ -103,7 +103,7 @@ class FlavorSchema(NamedSchema, table=True):
103
103
  else:
104
104
  setattr(self, field, value)
105
105
 
106
- self.updated = datetime.utcnow()
106
+ self.updated = datetime.now(timezone.utc)
107
107
  return self
108
108
 
109
109
  def to_model(
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of model tables."""
15
15
 
16
- from datetime import datetime
16
+ from datetime import datetime, timezone
17
17
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, cast
18
18
  from uuid import UUID, uuid4
19
19
 
@@ -224,7 +224,7 @@ class ModelSchema(NamedSchema, table=True):
224
224
  exclude_unset=True, exclude_none=True
225
225
  ).items():
226
226
  setattr(self, field, value)
227
- self.updated = datetime.utcnow()
227
+ self.updated = datetime.now(timezone.utc)
228
228
  return self
229
229
 
230
230
 
@@ -504,7 +504,7 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
504
504
  self.name = target_name
505
505
  if target_description is not None:
506
506
  self.description = target_description
507
- self.updated = datetime.utcnow()
507
+ self.updated = datetime.now(timezone.utc)
508
508
  return self
509
509
 
510
510
 
@@ -14,7 +14,7 @@
14
14
  """SQLModel implementation of pipeline run tables."""
15
15
 
16
16
  import json
17
- from datetime import datetime
17
+ from datetime import datetime, timezone
18
18
  from typing import TYPE_CHECKING, Any, Dict, List, Optional
19
19
  from uuid import UUID
20
20
 
@@ -430,7 +430,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
430
430
  if run_update.model_version_id and self.model_version_id is None:
431
431
  self.model_version_id = run_update.model_version_id
432
432
 
433
- self.updated = datetime.utcnow()
433
+ self.updated = datetime.now(timezone.utc)
434
434
  return self
435
435
 
436
436
  def update_placeholder(
@@ -471,7 +471,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
471
471
  self.orchestrator_environment = orchestrator_environment
472
472
  self.status = request.status.value
473
473
 
474
- self.updated = datetime.utcnow()
474
+ self.updated = datetime.now(timezone.utc)
475
475
 
476
476
  return self
477
477
 
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQL Model Implementations for Pipelines and Pipeline Runs."""
15
15
 
16
- from datetime import datetime
16
+ from datetime import datetime, timezone
17
17
  from typing import TYPE_CHECKING, Any, List, Optional
18
18
  from uuid import UUID
19
19
 
@@ -185,5 +185,5 @@ class PipelineSchema(NamedSchema, table=True):
185
185
  The updated `PipelineSchema`.
186
186
  """
187
187
  self.description = pipeline_update.description
188
- self.updated = datetime.utcnow()
188
+ self.updated = datetime.now(timezone.utc)
189
189
  return self
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of run template tables."""
15
15
 
16
- from datetime import datetime
16
+ from datetime import datetime, timezone
17
17
  from typing import TYPE_CHECKING, Any, List, Optional
18
18
  from uuid import UUID
19
19
 
@@ -156,7 +156,7 @@ class RunTemplateSchema(BaseSchema, table=True):
156
156
  ).items():
157
157
  setattr(self, field, value)
158
158
 
159
- self.updated = datetime.utcnow()
159
+ self.updated = datetime.now(timezone.utc)
160
160
  return self
161
161
 
162
162
  def to_model(
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQL Model Implementations for Pipeline Schedules."""
15
15
 
16
- from datetime import datetime, timedelta
16
+ from datetime import datetime, timedelta, timezone
17
17
  from typing import TYPE_CHECKING, Any, Optional
18
18
  from uuid import UUID
19
19
 
@@ -153,7 +153,7 @@ class ScheduleSchema(NamedSchema, table=True):
153
153
  )
154
154
  if schedule_update.catchup is not None:
155
155
  self.catchup = schedule_update.catchup
156
- self.updated = datetime.utcnow()
156
+ self.updated = datetime.now(timezone.utc)
157
157
  return self
158
158
 
159
159
  def to_model(
@@ -15,7 +15,7 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from datetime import datetime
18
+ from datetime import datetime, timezone
19
19
  from typing import Any, Dict, Optional, cast
20
20
  from uuid import UUID
21
21
 
@@ -209,7 +209,7 @@ class SecretSchema(NamedSchema, table=True):
209
209
  else:
210
210
  setattr(self, field, value)
211
211
 
212
- self.updated = datetime.utcnow()
212
+ self.updated = datetime.now(timezone.utc)
213
213
  return self
214
214
 
215
215
  def to_model(
@@ -14,7 +14,7 @@
14
14
  """SQLModel implementation for the server settings table."""
15
15
 
16
16
  import json
17
- from datetime import datetime
17
+ from datetime import datetime, timezone
18
18
  from typing import Any, Optional, Set
19
19
  from uuid import UUID
20
20
 
@@ -42,8 +42,12 @@ class ServerSettingsSchema(SQLModel, table=True):
42
42
  display_announcements: Optional[bool] = Field(nullable=True)
43
43
  display_updates: Optional[bool] = Field(nullable=True)
44
44
  onboarding_state: Optional[str] = Field(nullable=True)
45
- last_user_activity: datetime = Field(default_factory=datetime.utcnow)
46
- updated: datetime = Field(default_factory=datetime.utcnow)
45
+ last_user_activity: datetime = Field(
46
+ default_factory=lambda: datetime.now(timezone.utc)
47
+ )
48
+ updated: datetime = Field(
49
+ default_factory=lambda: datetime.now(timezone.utc)
50
+ )
47
51
 
48
52
  def update(
49
53
  self, settings_update: ServerSettingsUpdate
@@ -63,7 +67,7 @@ class ServerSettingsSchema(SQLModel, table=True):
63
67
  if hasattr(self, field):
64
68
  setattr(self, field, value)
65
69
 
66
- self.updated = datetime.utcnow()
70
+ self.updated = datetime.now(timezone.utc)
67
71
 
68
72
  return self
69
73
 
@@ -83,7 +87,7 @@ class ServerSettingsSchema(SQLModel, table=True):
83
87
  )
84
88
  new_state = old_state.union(completed_steps)
85
89
  self.onboarding_state = json.dumps(list(new_state))
86
- self.updated = datetime.utcnow()
90
+ self.updated = datetime.now(timezone.utc)
87
91
 
88
92
  return self
89
93
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from datetime import datetime
18
+ from datetime import datetime, timezone
19
19
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, cast
20
20
  from uuid import UUID
21
21
 
@@ -227,7 +227,7 @@ class ServiceConnectorSchema(NamedSchema, table=True):
227
227
  else:
228
228
  setattr(self, field, value)
229
229
  self.secret_id = secret_id
230
- self.updated = datetime.utcnow()
230
+ self.updated = datetime.now(timezone.utc)
231
231
  return self
232
232
 
233
233
  def to_model(
@@ -15,7 +15,7 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from datetime import datetime
18
+ from datetime import datetime, timezone
19
19
  from typing import Any, Optional
20
20
  from uuid import UUID
21
21
 
@@ -210,7 +210,7 @@ class ServiceSchema(NamedSchema, table=True):
210
210
  )
211
211
  else:
212
212
  setattr(self, field, value)
213
- self.updated = datetime.utcnow()
213
+ self.updated = datetime.now(timezone.utc)
214
214
  return self
215
215
 
216
216
  @classmethod
@@ -15,7 +15,7 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from datetime import datetime
18
+ from datetime import datetime, timezone
19
19
  from typing import TYPE_CHECKING, Any, List, Optional
20
20
  from uuid import UUID
21
21
 
@@ -134,7 +134,7 @@ class StackSchema(NamedSchema, table=True):
134
134
  else:
135
135
  setattr(self, field, value)
136
136
 
137
- self.updated = datetime.utcnow()
137
+ self.updated = datetime.now(timezone.utc)
138
138
  return self
139
139
 
140
140
  def to_model(
@@ -14,7 +14,7 @@
14
14
  """SQLModel implementation of step run tables."""
15
15
 
16
16
  import json
17
- from datetime import datetime
17
+ from datetime import datetime, timezone
18
18
  from typing import TYPE_CHECKING, Any, Dict, List, Optional
19
19
  from uuid import UUID
20
20
 
@@ -358,7 +358,7 @@ class StepRunSchema(NamedSchema, RunMetadataInterface, table=True):
358
358
  if value and self.model_version_id is None:
359
359
  self.model_version_id = value
360
360
 
361
- self.updated = datetime.utcnow()
361
+ self.updated = datetime.now(timezone.utc)
362
362
 
363
363
  return self
364
364
 
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of tag tables."""
15
15
 
16
- from datetime import datetime
16
+ from datetime import datetime, timezone
17
17
  from typing import Any, List
18
18
  from uuid import UUID
19
19
 
@@ -103,7 +103,7 @@ class TagSchema(NamedSchema, table=True):
103
103
  else:
104
104
  setattr(self, field, value)
105
105
 
106
- self.updated = datetime.utcnow()
106
+ self.updated = datetime.now(timezone.utc)
107
107
  return self
108
108
 
109
109
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  import base64
17
17
  import json
18
- from datetime import datetime
18
+ from datetime import datetime, timezone
19
19
  from typing import Any, List, Optional, cast
20
20
  from uuid import UUID
21
21
 
@@ -133,7 +133,7 @@ class TriggerSchema(NamedSchema, table=True):
133
133
  else:
134
134
  setattr(self, field, value)
135
135
 
136
- self.updated = datetime.utcnow()
136
+ self.updated = datetime.now(timezone.utc)
137
137
  return self
138
138
 
139
139
  @classmethod
@@ -14,7 +14,7 @@
14
14
  """SQLModel implementation of user tables."""
15
15
 
16
16
  import json
17
- from datetime import datetime
17
+ from datetime import datetime, timezone
18
18
  from typing import TYPE_CHECKING, Any, List, Optional
19
19
  from uuid import UUID
20
20
 
@@ -225,7 +225,7 @@ class UserSchema(NamedSchema, table=True):
225
225
  else:
226
226
  setattr(self, field, value)
227
227
 
228
- self.updated = datetime.utcnow()
228
+ self.updated = datetime.now(timezone.utc)
229
229
  return self
230
230
 
231
231
  def update_service_account(
@@ -245,7 +245,7 @@ class UserSchema(NamedSchema, table=True):
245
245
  ).items():
246
246
  setattr(self, field, value)
247
247
 
248
- self.updated = datetime.utcnow()
248
+ self.updated = datetime.now(timezone.utc)
249
249
  return self
250
250
 
251
251
  def to_model(
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQL Model Implementations for Workspaces."""
15
15
 
16
- from datetime import datetime
16
+ from datetime import datetime, timezone
17
17
  from typing import TYPE_CHECKING, Any, List
18
18
 
19
19
  from sqlmodel import Relationship
@@ -168,7 +168,7 @@ class WorkspaceSchema(NamedSchema, table=True):
168
168
  ).items():
169
169
  setattr(self, field, value)
170
170
 
171
- self.updated = datetime.utcnow()
171
+ self.updated = datetime.now(timezone.utc)
172
172
  return self
173
173
 
174
174
  def to_model(
@@ -8634,10 +8634,19 @@ class SqlZenStore(BaseZenStore):
8634
8634
  ExecutionStatus.COMPLETED,
8635
8635
  ExecutionStatus.FAILED,
8636
8636
  }:
8637
- run_update.end_time = datetime.utcnow()
8637
+ run_update.end_time = datetime.now(timezone.utc)
8638
8638
  if pipeline_run.start_time and isinstance(
8639
8639
  pipeline_run.start_time, datetime
8640
8640
  ):
8641
+ # We need to ensure both datetimes are timezone-aware to avoid TypeError when subtracting
8642
+ # Now calculate the duration time
8643
+ if pipeline_run.start_time.tzinfo is None:
8644
+ pipeline_run.start_time = (
8645
+ pipeline_run.start_time.replace(
8646
+ tzinfo=timezone.utc
8647
+ )
8648
+ )
8649
+
8641
8650
  duration_time = (
8642
8651
  run_update.end_time - pipeline_run.start_time
8643
8652
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.72.0.dev20250120
3
+ Version: 0.73.0.dev20250123
4
4
  Summary: ZenML: Write production-ready ML code.
5
5
  License: Apache-2.0
6
6
  Keywords: machine learning,production,pipeline,mlops,devops
@@ -476,7 +476,7 @@ the Apache License Version 2.0.
476
476
  <a href="https://github.com/zenml-io/zenml-projects">Projects Showcase</a>
477
477
  <br />
478
478
  <br />
479
- 🎉 Version 0.72.0 is out. Check out the release notes
479
+ 🎉 Version 0.73.0 is out. Check out the release notes
480
480
  <a href="https://github.com/zenml-io/zenml/releases">here</a>.
481
481
  <br />
482
482
  🖥️ Download our VS Code Extension <a href="https://marketplace.visualstudio.com/items?itemName=ZenML.zenml-vscode">here</a>.