zenml-nightly 0.73.0.dev20250127__py3-none-any.whl → 0.73.0.dev20250128__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.73.0.dev20250127
1
+ 0.73.0.dev20250128
@@ -42,7 +42,7 @@ def code_repository() -> None:
42
42
  context_settings={"ignore_unknown_options": True},
43
43
  help="Register a code repository.",
44
44
  )
45
- @click.argument("name", type=click.STRING)
45
+ @click.argument("name", type=str)
46
46
  @click.option(
47
47
  "--type",
48
48
  "-t",
@@ -183,6 +183,74 @@ def list_code_repositories(**kwargs: Any) -> None:
183
183
  )
184
184
 
185
185
 
186
+ @code_repository.command(
187
+ "update",
188
+ help="Update a code repository.",
189
+ context_settings={"ignore_unknown_options": True},
190
+ )
191
+ @click.argument("name_or_id", type=str, required=True)
192
+ @click.option(
193
+ "--name",
194
+ "-n",
195
+ type=str,
196
+ required=False,
197
+ help="The new code repository name.",
198
+ )
199
+ @click.option(
200
+ "--description",
201
+ "-d",
202
+ type=str,
203
+ required=False,
204
+ help="The new code repository description.",
205
+ )
206
+ @click.option(
207
+ "--logo-url",
208
+ "-l",
209
+ type=str,
210
+ required=False,
211
+ help="New URL of a logo (png, jpg or svg) for the code repository.",
212
+ )
213
+ @click.argument(
214
+ "args",
215
+ nargs=-1,
216
+ type=click.UNPROCESSED,
217
+ )
218
+ def update_code_repository(
219
+ name_or_id: str,
220
+ name: Optional[str],
221
+ description: Optional[str],
222
+ logo_url: Optional[str],
223
+ args: List[str],
224
+ ) -> None:
225
+ """Update a code repository.
226
+
227
+ Args:
228
+ name_or_id: Name or ID of the code repository to update.
229
+ name: New name of the code repository.
230
+ description: New description of the code repository.
231
+ logo_url: New logo URL of the code repository.
232
+ args: Code repository configurations.
233
+ """
234
+ parsed_name_or_id, parsed_args = cli_utils.parse_name_and_extra_arguments(
235
+ list(args) + [name_or_id], expand_args=True, name_mandatory=True
236
+ )
237
+ assert parsed_name_or_id
238
+
239
+ with console.status(
240
+ f"Updating code repository '{parsed_name_or_id}'...\n"
241
+ ):
242
+ Client().update_code_repository(
243
+ name_id_or_prefix=parsed_name_or_id,
244
+ name=name,
245
+ description=description,
246
+ logo_url=logo_url,
247
+ config=parsed_args,
248
+ )
249
+ cli_utils.declare(
250
+ f"Successfully updated code repository `{parsed_name_or_id}`."
251
+ )
252
+
253
+
186
254
  @code_repository.command("delete")
187
255
  @click.argument("name_or_id", type=str, required=True)
188
256
  @click.option(
zenml/client.py CHANGED
@@ -4952,25 +4952,15 @@ class Client(metaclass=ClientMetaClass):
4952
4952
 
4953
4953
  # --------------------------- Code repositories ---------------------------
4954
4954
 
4955
- def create_code_repository(
4956
- self,
4957
- name: str,
4958
- config: Dict[str, Any],
4959
- source: Source,
4960
- description: Optional[str] = None,
4961
- logo_url: Optional[str] = None,
4962
- ) -> CodeRepositoryResponse:
4963
- """Create a new code repository.
4955
+ @staticmethod
4956
+ def _validate_code_repository_config(
4957
+ source: Source, config: Dict[str, Any]
4958
+ ) -> None:
4959
+ """Validate a code repository config.
4964
4960
 
4965
4961
  Args:
4966
- name: Name of the code repository.
4967
- config: The configuration for the code repository.
4968
- source: The code repository implementation source.
4969
- description: The code repository description.
4970
- logo_url: URL of a logo (png, jpg or svg) for the code repository.
4971
-
4972
- Returns:
4973
- The created code repository.
4962
+ source: The code repository source.
4963
+ config: The code repository config.
4974
4964
 
4975
4965
  Raises:
4976
4966
  RuntimeError: If the provided config is invalid.
@@ -4983,13 +4973,38 @@ class Client(metaclass=ClientMetaClass):
4983
4973
  )
4984
4974
  )
4985
4975
  try:
4986
- # Validate the repo config
4976
+ # This does a login to verify the credentials
4987
4977
  code_repo_class(id=uuid4(), config=config)
4978
+
4979
+ # Explicitly access the config for pydantic validation, in case
4980
+ # the login for some reason did not do that.
4981
+ _ = code_repo_class.config
4988
4982
  except Exception as e:
4989
4983
  raise RuntimeError(
4990
4984
  "Failed to validate code repository config."
4991
4985
  ) from e
4992
4986
 
4987
+ def create_code_repository(
4988
+ self,
4989
+ name: str,
4990
+ config: Dict[str, Any],
4991
+ source: Source,
4992
+ description: Optional[str] = None,
4993
+ logo_url: Optional[str] = None,
4994
+ ) -> CodeRepositoryResponse:
4995
+ """Create a new code repository.
4996
+
4997
+ Args:
4998
+ name: Name of the code repository.
4999
+ config: The configuration for the code repository.
5000
+ source: The code repository implementation source.
5001
+ description: The code repository description.
5002
+ logo_url: URL of a logo (png, jpg or svg) for the code repository.
5003
+
5004
+ Returns:
5005
+ The created code repository.
5006
+ """
5007
+ self._validate_code_repository_config(source=source, config=config)
4993
5008
  repo_request = CodeRepositoryRequest(
4994
5009
  user=self.active_user.id,
4995
5010
  workspace=self.active_workspace.id,
@@ -5088,6 +5103,7 @@ class Client(metaclass=ClientMetaClass):
5088
5103
  name: Optional[str] = None,
5089
5104
  description: Optional[str] = None,
5090
5105
  logo_url: Optional[str] = None,
5106
+ config: Optional[Dict[str, Any]] = None,
5091
5107
  ) -> CodeRepositoryResponse:
5092
5108
  """Update a code repository.
5093
5109
 
@@ -5097,6 +5113,10 @@ class Client(metaclass=ClientMetaClass):
5097
5113
  name: New name of the code repository.
5098
5114
  description: New description of the code repository.
5099
5115
  logo_url: New logo URL of the code repository.
5116
+ config: New configuration options for the code repository. Will
5117
+ be used to update the existing configuration values. To remove
5118
+ values from the existing configuration, set the value for that
5119
+ key to `None`.
5100
5120
 
5101
5121
  Returns:
5102
5122
  The updated code repository.
@@ -5107,6 +5127,18 @@ class Client(metaclass=ClientMetaClass):
5107
5127
  update = CodeRepositoryUpdate(
5108
5128
  name=name, description=description, logo_url=logo_url
5109
5129
  )
5130
+ if config is not None:
5131
+ combined_config = repo.config
5132
+ combined_config.update(config)
5133
+ combined_config = {
5134
+ k: v for k, v in combined_config.items() if v is not None
5135
+ }
5136
+
5137
+ self._validate_code_repository_config(
5138
+ source=repo.source, config=combined_config
5139
+ )
5140
+ update.config = combined_config
5141
+
5110
5142
  return self.zen_store.update_code_repository(
5111
5143
  code_repository_id=repo.id, update=update
5112
5144
  )
zenml/config/schedule.py CHANGED
@@ -13,10 +13,15 @@
13
13
  # permissions and limitations under the License.
14
14
  """Class for defining a pipeline schedule."""
15
15
 
16
- import datetime
16
+ from datetime import datetime, timedelta
17
17
  from typing import Optional
18
18
 
19
- from pydantic import BaseModel, model_validator
19
+ from pydantic import (
20
+ BaseModel,
21
+ ValidationInfo,
22
+ field_validator,
23
+ model_validator,
24
+ )
20
25
 
21
26
  from zenml.logger import get_logger
22
27
 
@@ -32,8 +37,12 @@ class Schedule(BaseModel):
32
37
  and time.
33
38
  cron_expression: Cron expression for the pipeline schedule. If a value
34
39
  for this is set it takes precedence over the start time + interval.
35
- start_time: datetime object to indicate when to start the schedule.
36
- end_time: datetime object to indicate when to end the schedule.
40
+ start_time: When the schedule should start. If this is a datetime object
41
+ without any timezone, it is treated as a datetime in the local
42
+ timezone.
43
+ end_time: When the schedule should end. If this is a datetime object
44
+ without any timezone, it is treated as a datetime in the local
45
+ timezone.
37
46
  interval_second: datetime timedelta indicating the seconds between two
38
47
  recurring runs for a periodic schedule.
39
48
  catchup: Whether the recurring run should catch up if behind schedule.
@@ -43,17 +52,45 @@ class Schedule(BaseModel):
43
52
  schedules the latest interval if more than one interval is ready to
44
53
  be scheduled. Usually, if your pipeline handles backfill
45
54
  internally, you should turn catchup off to avoid duplicate backfill.
46
- run_once_start_time: datetime object to indicate when to run the
47
- pipeline once. This is useful for one-off runs.
55
+ run_once_start_time: When to run the pipeline once. If this is a
56
+ datetime object without any timezone, it is treated as a datetime
57
+ in the local timezone.
48
58
  """
49
59
 
50
60
  name: Optional[str] = None
51
61
  cron_expression: Optional[str] = None
52
- start_time: Optional[datetime.datetime] = None
53
- end_time: Optional[datetime.datetime] = None
54
- interval_second: Optional[datetime.timedelta] = None
62
+ start_time: Optional[datetime] = None
63
+ end_time: Optional[datetime] = None
64
+ interval_second: Optional[timedelta] = None
55
65
  catchup: bool = False
56
- run_once_start_time: Optional[datetime.datetime] = None
66
+ run_once_start_time: Optional[datetime] = None
67
+
68
+ @field_validator(
69
+ "start_time", "end_time", "run_once_start_time", mode="after"
70
+ )
71
+ @classmethod
72
+ def _ensure_timezone(
73
+ cls, value: Optional[datetime], info: ValidationInfo
74
+ ) -> Optional[datetime]:
75
+ """Ensures that all datetimes are timezone aware.
76
+
77
+ Args:
78
+ value: The datetime.
79
+ info: The validation info.
80
+
81
+ Returns:
82
+ A timezone aware datetime or None.
83
+ """
84
+ if value and value.tzinfo is None:
85
+ assert info.field_name
86
+ logger.warning(
87
+ "Your schedule `%s` is missing a timezone. It will be treated "
88
+ "as a datetime in your local timezone.",
89
+ info.field_name,
90
+ )
91
+ value = value.astimezone()
92
+
93
+ return value
57
94
 
58
95
  @model_validator(mode="after")
59
96
  def _ensure_cron_or_periodic_schedule_configured(self) -> "Schedule":
@@ -214,12 +214,14 @@ class BaseEntrypointConfiguration(ABC):
214
214
  if not should_download_code:
215
215
  return
216
216
 
217
- if code_reference := deployment.code_reference:
217
+ if code_path := deployment.code_path:
218
+ code_utils.download_code_from_artifact_store(code_path=code_path)
219
+ elif code_reference := deployment.code_reference:
220
+ # TODO: This might fail if the code repository had unpushed changes
221
+ # at the time the pipeline run was started.
218
222
  self.download_code_from_code_repository(
219
223
  code_reference=code_reference
220
224
  )
221
- elif code_path := deployment.code_path:
222
- code_utils.download_code_from_artifact_store(code_path=code_path)
223
225
  else:
224
226
  raise RuntimeError(
225
227
  "Code download required but no code reference or path provided."
@@ -18,7 +18,7 @@ import re
18
18
  from typing import List, Optional
19
19
 
20
20
  import requests
21
- from github import Github, GithubException
21
+ from github import Consts, Github, GithubException
22
22
  from github.Repository import Repository
23
23
 
24
24
  from zenml.code_repositories import (
@@ -30,6 +30,7 @@ from zenml.code_repositories.base_code_repository import (
30
30
  )
31
31
  from zenml.code_repositories.git import LocalGitRepositoryContext
32
32
  from zenml.logger import get_logger
33
+ from zenml.utils import deprecation_utils
33
34
  from zenml.utils.secret_utils import SecretField
34
35
 
35
36
  logger = get_logger(__name__)
@@ -39,19 +40,24 @@ class GitHubCodeRepositoryConfig(BaseCodeRepositoryConfig):
39
40
  """Config for GitHub code repositories.
40
41
 
41
42
  Args:
42
- url: The URL of the GitHub instance.
43
+ api_url: The GitHub API URL.
43
44
  owner: The owner of the repository.
44
45
  repository: The name of the repository.
45
46
  host: The host of the repository.
46
47
  token: The token to access the repository.
47
48
  """
48
49
 
49
- url: Optional[str]
50
+ api_url: Optional[str] = None
50
51
  owner: str
51
52
  repository: str
52
53
  host: Optional[str] = "github.com"
53
54
  token: Optional[str] = SecretField(default=None)
54
55
 
56
+ url: Optional[str] = None
57
+ _deprecation_validator = deprecation_utils.deprecate_pydantic_attributes(
58
+ ("url", "api_url")
59
+ )
60
+
55
61
 
56
62
  class GitHubCodeRepository(BaseCodeRepository):
57
63
  """GitHub code repository."""
@@ -95,7 +101,7 @@ class GitHubCodeRepository(BaseCodeRepository):
95
101
  Raises:
96
102
  RuntimeError: If the repository is not public.
97
103
  """
98
- url = f"https://api.github.com/repos/{owner}/{repo}"
104
+ url = f"{Consts.DEFAULT_BASE_URL}/repos/{owner}/{repo}"
99
105
  response = requests.get(url, timeout=7)
100
106
 
101
107
  try:
@@ -103,12 +109,15 @@ class GitHubCodeRepository(BaseCodeRepository):
103
109
  pass
104
110
  else:
105
111
  raise RuntimeError(
106
- "It is not possible to access this repository as it does not appear to be public."
107
- "Access to private repositories is only possible when a token is provided. Please provide a token and try again"
112
+ "It is not possible to access this repository as it does "
113
+ "not appear to be public. Access to private repositories "
114
+ "is only possible when a token is provided. Please provide "
115
+ "a token and try again"
108
116
  )
109
117
  except Exception as e:
110
118
  raise RuntimeError(
111
- f"An error occurred while checking if repository is public: {str(e)}"
119
+ "An error occurred while checking if repository is public: "
120
+ f"{str(e)}"
112
121
  )
113
122
 
114
123
  def login(
@@ -120,7 +129,10 @@ class GitHubCodeRepository(BaseCodeRepository):
120
129
  RuntimeError: If the login fails.
121
130
  """
122
131
  try:
123
- self._github_session = Github(self.config.token)
132
+ self._github_session = Github(
133
+ login_or_token=self.config.token,
134
+ base_url=self.config.api_url or Consts.DEFAULT_BASE_URL,
135
+ )
124
136
  if self.config.token:
125
137
  user = self._github_session.get_user().login
126
138
  logger.debug(f"Logged in as {user}")
@@ -31,6 +31,7 @@ from zenml.code_repositories.git.local_git_repository_context import (
31
31
  LocalGitRepositoryContext,
32
32
  )
33
33
  from zenml.logger import get_logger
34
+ from zenml.utils import deprecation_utils
34
35
  from zenml.utils.secret_utils import SecretField
35
36
 
36
37
  logger = get_logger(__name__)
@@ -40,19 +41,24 @@ class GitLabCodeRepositoryConfig(BaseCodeRepositoryConfig):
40
41
  """Config for GitLab code repositories.
41
42
 
42
43
  Args:
43
- url: The full URL of the GitLab project.
44
+ instance_url: The URL of the GitLab instance.
44
45
  group: The group of the project.
45
46
  project: The name of the GitLab project.
46
47
  host: The host of GitLab in case it is self-hosted instance.
47
48
  token: The token to access the repository.
48
49
  """
49
50
 
50
- url: Optional[str]
51
+ instance_url: Optional[str] = None
51
52
  group: str
52
53
  project: str
53
54
  host: Optional[str] = "gitlab.com"
54
55
  token: str = SecretField()
55
56
 
57
+ url: Optional[str] = None
58
+ _deprecation_validator = deprecation_utils.deprecate_pydantic_attributes(
59
+ ("url", "instance_url")
60
+ )
61
+
56
62
 
57
63
  class GitLabCodeRepository(BaseCodeRepository):
58
64
  """GitLab code repository."""
@@ -85,7 +91,7 @@ class GitLabCodeRepository(BaseCodeRepository):
85
91
  """
86
92
  try:
87
93
  self._gitlab_session = Gitlab(
88
- self.config.url, private_token=self.config.token
94
+ url=self.config.instance_url, private_token=self.config.token
89
95
  )
90
96
  self._gitlab_session.auth()
91
97
  user = self._gitlab_session.user or None
@@ -13,11 +13,11 @@
13
13
  # permissions and limitations under the License.
14
14
  """Models representing schedules."""
15
15
 
16
- import datetime
16
+ from datetime import datetime, timedelta, timezone
17
17
  from typing import Dict, Optional, Union
18
18
  from uuid import UUID
19
19
 
20
- from pydantic import Field, model_validator
20
+ from pydantic import Field, field_validator, model_validator
21
21
 
22
22
  from zenml.constants import STR_FIELD_MAX_LENGTH
23
23
  from zenml.logger import get_logger
@@ -46,15 +46,36 @@ class ScheduleRequest(WorkspaceScopedRequest):
46
46
  active: bool
47
47
 
48
48
  cron_expression: Optional[str] = None
49
- start_time: Optional[datetime.datetime] = None
50
- end_time: Optional[datetime.datetime] = None
51
- interval_second: Optional[datetime.timedelta] = None
49
+ start_time: Optional[datetime] = None
50
+ end_time: Optional[datetime] = None
51
+ interval_second: Optional[timedelta] = None
52
52
  catchup: bool = False
53
- run_once_start_time: Optional[datetime.datetime] = None
53
+ run_once_start_time: Optional[datetime] = None
54
54
 
55
55
  orchestrator_id: Optional[UUID]
56
56
  pipeline_id: Optional[UUID]
57
57
 
58
+ @field_validator(
59
+ "start_time", "end_time", "run_once_start_time", mode="after"
60
+ )
61
+ @classmethod
62
+ def _ensure_tzunaware_utc(
63
+ cls, value: Optional[datetime]
64
+ ) -> Optional[datetime]:
65
+ """Ensures that all datetimes are timezone unaware and in UTC time.
66
+
67
+ Args:
68
+ value: The datetime.
69
+
70
+ Returns:
71
+ The datetime in UTC time without timezone.
72
+ """
73
+ if value and value.tzinfo:
74
+ value = value.astimezone(timezone.utc)
75
+ value = value.replace(tzinfo=None)
76
+
77
+ return value
78
+
58
79
  @model_validator(mode="after")
59
80
  def _ensure_cron_or_periodic_schedule_configured(
60
81
  self,
@@ -108,11 +129,11 @@ class ScheduleUpdate(BaseUpdate):
108
129
  name: Optional[str] = None
109
130
  active: Optional[bool] = None
110
131
  cron_expression: Optional[str] = None
111
- start_time: Optional[datetime.datetime] = None
112
- end_time: Optional[datetime.datetime] = None
113
- interval_second: Optional[datetime.timedelta] = None
132
+ start_time: Optional[datetime] = None
133
+ end_time: Optional[datetime] = None
134
+ interval_second: Optional[timedelta] = None
114
135
  catchup: Optional[bool] = None
115
- run_once_start_time: Optional[datetime.datetime] = None
136
+ run_once_start_time: Optional[datetime] = None
116
137
  orchestrator_id: Optional[UUID] = None
117
138
  pipeline_id: Optional[UUID] = None
118
139
 
@@ -125,11 +146,11 @@ class ScheduleResponseBody(WorkspaceScopedResponseBody):
125
146
 
126
147
  active: bool
127
148
  cron_expression: Optional[str] = None
128
- start_time: Optional[datetime.datetime] = None
129
- end_time: Optional[datetime.datetime] = None
130
- interval_second: Optional[datetime.timedelta] = None
149
+ start_time: Optional[datetime] = None
150
+ end_time: Optional[datetime] = None
151
+ interval_second: Optional[timedelta] = None
131
152
  catchup: bool = False
132
- run_once_start_time: Optional[datetime.datetime] = None
153
+ run_once_start_time: Optional[datetime] = None
133
154
 
134
155
 
135
156
  class ScheduleResponseMetadata(WorkspaceScopedResponseMetadata):
@@ -217,7 +238,7 @@ class ScheduleResponse(
217
238
  return self.get_body().cron_expression
218
239
 
219
240
  @property
220
- def start_time(self) -> Optional[datetime.datetime]:
241
+ def start_time(self) -> Optional[datetime]:
221
242
  """The `start_time` property.
222
243
 
223
244
  Returns:
@@ -226,7 +247,7 @@ class ScheduleResponse(
226
247
  return self.get_body().start_time
227
248
 
228
249
  @property
229
- def end_time(self) -> Optional[datetime.datetime]:
250
+ def end_time(self) -> Optional[datetime]:
230
251
  """The `end_time` property.
231
252
 
232
253
  Returns:
@@ -235,7 +256,7 @@ class ScheduleResponse(
235
256
  return self.get_body().end_time
236
257
 
237
258
  @property
238
- def run_once_start_time(self) -> Optional[datetime.datetime]:
259
+ def run_once_start_time(self) -> Optional[datetime]:
239
260
  """The `run_once_start_time` property.
240
261
 
241
262
  Returns:
@@ -244,7 +265,7 @@ class ScheduleResponse(
244
265
  return self.get_body().run_once_start_time
245
266
 
246
267
  @property
247
- def interval_second(self) -> Optional[datetime.timedelta]:
268
+ def interval_second(self) -> Optional[timedelta]:
248
269
  """The `interval_second` property.
249
270
 
250
271
  Returns:
@@ -313,10 +334,10 @@ class ScheduleFilter(WorkspaceScopedFilter):
313
334
  default=None,
314
335
  description="The cron expression, describing the schedule",
315
336
  )
316
- start_time: Optional[Union[datetime.datetime, str]] = Field(
337
+ start_time: Optional[Union[datetime, str]] = Field(
317
338
  default=None, description="Start time", union_mode="left_to_right"
318
339
  )
319
- end_time: Optional[Union[datetime.datetime, str]] = Field(
340
+ end_time: Optional[Union[datetime, str]] = Field(
320
341
  default=None, description="End time", union_mode="left_to_right"
321
342
  )
322
343
  interval_second: Optional[Optional[float]] = Field(
@@ -332,7 +353,7 @@ class ScheduleFilter(WorkspaceScopedFilter):
332
353
  default=None,
333
354
  description="Name of the schedule",
334
355
  )
335
- run_once_start_time: Optional[Union[datetime.datetime, str]] = Field(
356
+ run_once_start_time: Optional[Union[datetime, str]] = Field(
336
357
  default=None,
337
358
  description="The time at which the schedule should run once",
338
359
  union_mode="left_to_right",
@@ -30,7 +30,6 @@ from zenml.code_repositories import BaseCodeRepository
30
30
  from zenml.logger import get_logger
31
31
  from zenml.models import (
32
32
  BuildItem,
33
- CodeReferenceRequest,
34
33
  PipelineBuildBase,
35
34
  PipelineBuildRequest,
36
35
  PipelineBuildResponse,
@@ -362,6 +361,7 @@ def create_pipeline_build(
362
361
  item_key = checksums[checksum]
363
362
  image_name_or_digest = images[item_key].image
364
363
  contains_code = images[item_key].contains_code
364
+ requires_code_download = images[item_key].requires_code_download
365
365
  dockerfile = images[item_key].dockerfile
366
366
  requirements = images[item_key].requirements
367
367
  else:
@@ -373,7 +373,7 @@ def create_pipeline_build(
373
373
  include_files = build_config.should_include_files(
374
374
  code_repository=code_repository,
375
375
  )
376
- download_files = build_config.should_download_files(
376
+ requires_code_download = build_config.should_download_files(
377
377
  code_repository=code_repository,
378
378
  )
379
379
  pass_code_repo = (
@@ -391,7 +391,6 @@ def create_pipeline_build(
391
391
  tag=tag,
392
392
  stack=stack,
393
393
  include_files=include_files,
394
- download_files=download_files,
395
394
  entrypoint=build_config.entrypoint,
396
395
  extra_files=build_config.extra_files,
397
396
  code_repository=code_repository if pass_code_repo else None,
@@ -404,7 +403,7 @@ def create_pipeline_build(
404
403
  requirements=requirements,
405
404
  settings_checksum=checksum,
406
405
  contains_code=contains_code,
407
- requires_code_download=download_files,
406
+ requires_code_download=requires_code_download,
408
407
  )
409
408
  checksums[checksum] = combined_key
410
409
 
@@ -537,6 +536,14 @@ def verify_local_repository_context(
537
536
  )
538
537
  code_repository = BaseCodeRepository.from_model(model)
539
538
 
539
+ if will_download_from_code_repository(
540
+ deployment=deployment, local_repo_context=local_repo_context
541
+ ):
542
+ logger.info(
543
+ "Using code repository `%s` to download code for this run.",
544
+ model.name,
545
+ )
546
+
540
547
  return code_repository
541
548
 
542
549
 
@@ -695,14 +702,15 @@ def compute_stack_checksum(stack: StackResponse) -> str:
695
702
  def should_upload_code(
696
703
  deployment: PipelineDeploymentBase,
697
704
  build: Optional[PipelineBuildResponse],
698
- code_reference: Optional[CodeReferenceRequest],
705
+ can_download_from_code_repository: bool,
699
706
  ) -> bool:
700
707
  """Checks whether the current code should be uploaded for the deployment.
701
708
 
702
709
  Args:
703
710
  deployment: The deployment.
704
711
  build: The build for the deployment.
705
- code_reference: The code reference for the deployment.
712
+ can_download_from_code_repository: Whether the code can be downloaded
713
+ from a code repository.
706
714
 
707
715
  Returns:
708
716
  Whether the current code should be uploaded for the deployment.
@@ -718,7 +726,7 @@ def should_upload_code(
718
726
  docker_settings = step.config.docker_settings
719
727
 
720
728
  if (
721
- code_reference
729
+ can_download_from_code_repository
722
730
  and docker_settings.allow_download_from_code_repository
723
731
  ):
724
732
  # No upload needed for this step
@@ -728,3 +736,31 @@ def should_upload_code(
728
736
  return True
729
737
 
730
738
  return False
739
+
740
+
741
+ def will_download_from_code_repository(
742
+ deployment: PipelineDeploymentBase,
743
+ local_repo_context: "LocalRepositoryContext",
744
+ ) -> bool:
745
+ """Checks whether a code repository will be used to download code.
746
+
747
+ Args:
748
+ deployment: The deployment.
749
+ local_repo_context: The local repository context.
750
+
751
+ Returns:
752
+ Whether a code repository will be used to download code.
753
+ """
754
+ if not build_required(deployment=deployment):
755
+ return False
756
+
757
+ if local_repo_context.has_local_changes:
758
+ return False
759
+
760
+ for step in deployment.step_configurations.values():
761
+ docker_settings = step.config.docker_settings
762
+
763
+ if docker_settings.allow_download_from_code_repository:
764
+ return True
765
+
766
+ return False
@@ -701,6 +701,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
701
701
  code_repository = build_utils.verify_local_repository_context(
702
702
  deployment=deployment, local_repo_context=local_repo_context
703
703
  )
704
+ can_download_from_code_repository = code_repository is not None
704
705
 
705
706
  if prevent_build_reuse:
706
707
  logger.warning(
@@ -737,7 +738,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
737
738
  if build_utils.should_upload_code(
738
739
  deployment=deployment,
739
740
  build=build_model,
740
- code_reference=code_reference,
741
+ can_download_from_code_repository=can_download_from_code_repository,
741
742
  ):
742
743
  code_archive = code_utils.CodeArchive(
743
744
  root=source_utils.get_source_root()
@@ -109,9 +109,16 @@ def find_active_code_repository(
109
109
  for model in depaginate(list_method=Client().list_code_repositories):
110
110
  try:
111
111
  repo = BaseCodeRepository.from_model(model)
112
- except Exception:
112
+ except ImportError:
113
113
  logger.debug(
114
- "Failed to instantiate code repository class.", exc_info=True
114
+ "Failed to import code repository class.", exc_info=True
115
+ )
116
+ continue
117
+ except Exception as e:
118
+ logger.warning(
119
+ "Failed to instantiate or login to code repository `%s`: %s",
120
+ model.name,
121
+ e,
115
122
  )
116
123
  continue
117
124
 
@@ -132,14 +132,16 @@ def deprecate_pydantic_attributes(
132
132
  if replacement_attribute is None:
133
133
  _warn(
134
134
  message=f"The attribute `{deprecated_attribute}` of class "
135
- f"`{cls.__name__}` will be deprecated soon.",
135
+ f"`{cls.__name__}` is deprecated and will be removed in "
136
+ "the future.",
136
137
  attribute=deprecated_attribute,
137
138
  )
138
139
  continue
139
140
 
140
141
  _warn(
141
142
  message=f"The attribute `{deprecated_attribute}` of class "
142
- f"`{cls.__name__}` will be deprecated soon. Use the "
143
+ f"`{cls.__name__}` is deprecated and will be removed in the "
144
+ "future. Use the "
143
145
  f"attribute `{replacement_attribute}` instead.",
144
146
  attribute=deprecated_attribute,
145
147
  )
@@ -78,7 +78,6 @@ class PipelineDockerImageBuilder:
78
78
  tag: str,
79
79
  stack: "Stack",
80
80
  include_files: bool,
81
- download_files: bool,
82
81
  entrypoint: Optional[str] = None,
83
82
  extra_files: Optional[Dict[str, str]] = None,
84
83
  code_repository: Optional["BaseCodeRepository"] = None,
@@ -93,7 +92,6 @@ class PipelineDockerImageBuilder:
93
92
  tag: The tag to use for the image.
94
93
  stack: The stack on which the pipeline will be deployed.
95
94
  include_files: Whether to include files in the build context.
96
- download_files: Whether to download files in the build context.
97
95
  entrypoint: Entrypoint to use for the final image. If left empty,
98
96
  no entrypoint will be included in the image.
99
97
  extra_files: Extra files to add to the build context. Keys are the
@@ -165,7 +163,6 @@ class PipelineDockerImageBuilder:
165
163
  docker_settings.apt_packages,
166
164
  docker_settings.environment,
167
165
  include_files,
168
- download_files,
169
166
  entrypoint,
170
167
  extra_files,
171
168
  ]
@@ -151,6 +151,9 @@ class CodeRepositorySchema(NamedSchema, table=True):
151
151
  if update.logo_url:
152
152
  self.logo_url = update.logo_url
153
153
 
154
+ if update.config:
155
+ self.config = json.dumps(update.config)
156
+
154
157
  self.updated = utc_now()
155
158
  return self
156
159
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.73.0.dev20250127
3
+ Version: 0.73.0.dev20250128
4
4
  Summary: ZenML: Write production-ready ML code.
5
5
  License: Apache-2.0
6
6
  Keywords: machine learning,production,pipeline,mlops,devops
@@ -1,5 +1,5 @@
1
1
  zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
2
- zenml/VERSION,sha256=JkGnFvDvS5Ka0VljyXw-YlBu7Vxd-DgMGHbZytdGcEo,19
2
+ zenml/VERSION,sha256=idxxoPzqv46tqwm3PHoXsGFsEa0kogFk5FNLMlg5-3Y,19
3
3
  zenml/__init__.py,sha256=SkMObQA41ajqdZqGErN00S1Vf3KAxpLvbZ-OBy5uYoo,2130
4
4
  zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
5
5
  zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
@@ -32,7 +32,7 @@ zenml/cli/artifact.py,sha256=7lsAS52DroBTFkFWxkyb-lIDOGP5jPL_Se_RDG_2jgg,9564
32
32
  zenml/cli/authorized_device.py,sha256=_1PzE3BM2SmwtuzRliEMStvbBRKWQmg_lbwCRtn8dBg,4324
33
33
  zenml/cli/base.py,sha256=CGWqHb5A8k4XwzOQ4cdV25zWb9qOZr-xOq46wL3we1M,28243
34
34
  zenml/cli/cli.py,sha256=Pnq468IZ4oqzluA_gZ5PsrdnSPEyHcasIH-xI1_8Y_Q,5454
35
- zenml/cli/code_repository.py,sha256=7DNJMc7RL8GaU8DwX0mDSViLH9oclqhsX2AU-VWOKb8,6979
35
+ zenml/cli/code_repository.py,sha256=UEgiVTzb184AaSrNmO-ylaZ9f_OXXe76EHbf9zrZVc8,8746
36
36
  zenml/cli/config.py,sha256=UI_j0a_zRgEUd2q0zuOi4UgbjiCYjMJ_Y9iSg-wi8Oo,2768
37
37
  zenml/cli/downgrade.py,sha256=eTpXts8y4s3wEUwOlvZGWsTngoMV8Stuzj0K-SAQUGU,1887
38
38
  zenml/cli/feature.py,sha256=Q8tNvWBlRze3FUyn0_VpOdl316ZW87476j7ezJb16GA,4387
@@ -55,7 +55,7 @@ zenml/cli/user_management.py,sha256=fTuRworQahst_j78qPYTtgciUeUOxwo7efiyPwmj2tI,
55
55
  zenml/cli/utils.py,sha256=aCSQFjfaLtBt4OYzYDwO2Rmdmn-b5AVBqpBGvv7OT7E,86420
56
56
  zenml/cli/version.py,sha256=nm1iSU_1V6-MUwpMKeXcwFhLYGUMLswvQL67cEuCpxA,3635
57
57
  zenml/cli/workspace.py,sha256=bp02aXou574ToWPD8OAIB_cg3mvpE011H8aMKegT-nU,2970
58
- zenml/client.py,sha256=OaPYruL6NKMFhp4zRERSpR1xPHKBjiLnDa71Ouxs4TE,282139
58
+ zenml/client.py,sha256=f0ySssFW_m7G5cj9UKEeA0Tm-e8GwfjIvLaVuixHnKM,283418
59
59
  zenml/client_lazy_loader.py,sha256=MOBgS1ITYqGvPUnWQ6edn9s8Hr_72YfWbwEIfHKUr9g,7104
60
60
  zenml/code_repositories/__init__.py,sha256=W5bDfzAG8OXIKZSV1L-VHuzMcSCYa9qzTdPb3jqfyYw,920
61
61
  zenml/code_repositories/base_code_repository.py,sha256=_DbxIBxvJlN0PFhST0vlTIQ26Q6V3Nar0kYdeGaJrk8,4386
@@ -74,7 +74,7 @@ zenml/config/pipeline_run_configuration.py,sha256=RoX2lGjWGm_0aE2ZMfsREjo0QnwWb4
74
74
  zenml/config/pipeline_spec.py,sha256=uWpiIfznJvXAiKs1yMIUDT1h1tYEFNO-RDVTYcIv9CE,2821
75
75
  zenml/config/resource_settings.py,sha256=bl3xahx--XS9p1CsTDSuvkZX9Oxb-Zj85UpefR8WrYs,3899
76
76
  zenml/config/retry_config.py,sha256=4UH1xqw0G6fSEbXSNKfmiFEkwadxQef9BGMe3JBm6NI,929
77
- zenml/config/schedule.py,sha256=aXHoOn0nvUw0YPXIlzS7idosuW2DMMAmkRqVdOEQe2o,4244
77
+ zenml/config/schedule.py,sha256=qtMWa-mEo7jIKvDzQUstMwe57gdbvyWAQ7ggsoddbCA,5349
78
78
  zenml/config/secret_reference_mixin.py,sha256=6DOgOH_w1_coNs1NasMjY8SOv0MqzWQZxwrWsfncsgs,5862
79
79
  zenml/config/secrets_store_config.py,sha256=y05zqyQhr_DGrs3IfBGa_FRoZ043hSYRT5wzrx-zHTU,2818
80
80
  zenml/config/server_config.py,sha256=SR0JerBn-NCQRflQ0WuDWEsjM4wc9VBoqwx4CF59Lpc,31192
@@ -96,7 +96,7 @@ zenml/container_registries/github_container_registry.py,sha256=rbcGkFfPDk-Il0T9F
96
96
  zenml/data_validators/__init__.py,sha256=9Fa0jiUSQ_JsLMHYjqDayWQl4m_uuai9tQjIP60OTk8,886
97
97
  zenml/data_validators/base_data_validator.py,sha256=reGUJ6NEFfd_wocrcYBSU5QHCSBOll-pP_suTP_bfv0,9839
98
98
  zenml/entrypoints/__init__.py,sha256=2CMemOrHIJauxAss6k7dKFtsCFqgYR-JbAx4REoCaE8,946
99
- zenml/entrypoints/base_entrypoint_configuration.py,sha256=7l_AAj3qBPSj1fdjoc712RlhXa262BHyY4IlkDYiwA0,10332
99
+ zenml/entrypoints/base_entrypoint_configuration.py,sha256=-JCuetzQGOPo5R6VmM2q2JVcLaEimrGPikTkXFXuiOI,10468
100
100
  zenml/entrypoints/entrypoint.py,sha256=XNgXBCMKoidmP0_AYgMpqo-neG8Y8jG0rj43ofTDZ9E,2033
101
101
  zenml/entrypoints/pipeline_entrypoint_configuration.py,sha256=To-vTP29qAE36ndJDF1fRw9wL2Nk2bsBuO-ayAwvSmo,1646
102
102
  zenml/entrypoints/step_entrypoint_configuration.py,sha256=fETr5E7eH8QEWYqgaarIrLQzrPrdLEr194xhd3H5yU4,7206
@@ -276,14 +276,14 @@ zenml/integrations/gcp/step_operators/__init__.py,sha256=iPkob2LtPIQ-OHszhbNz_oj
276
276
  zenml/integrations/gcp/step_operators/vertex_step_operator.py,sha256=qPQOSacCFUcXCl0MkuzVkxpewU8NAPjiGQsjBF1N0ro,13492
277
277
  zenml/integrations/github/__init__.py,sha256=A8Yd--BbAG3HEfbWYOIEy_kzyLs2tBiawiLMosXd1Do,1467
278
278
  zenml/integrations/github/code_repositories/__init__.py,sha256=ub_hSE2ks2mZB1aeHRjQYz7QIRQIgOw2s080IIqJaGs,817
279
- zenml/integrations/github/code_repositories/github_code_repository.py,sha256=1SfFLoqF6ye005XhXjhtci-7fZ1Qd3_vzPIf2pmM49s,6658
279
+ zenml/integrations/github/code_repositories/github_code_repository.py,sha256=7s4NjOn_bItAbwcxQQQfo9IlW8vowleUQMiBjjn6iJo,7041
280
280
  zenml/integrations/github/plugins/__init__.py,sha256=yf7xkBs8wEUMP2-nFbDIVeXs1omHtZoyZBgobMYB1l0,804
281
281
  zenml/integrations/github/plugins/event_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
282
282
  zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py,sha256=x5OSiWOsQprrleo8s8oIjgFZ7hz_tw66MLJYlSqONvc,17239
283
283
  zenml/integrations/github/plugins/github_webhook_event_source_flavor.py,sha256=jth8sxrmyg22-wT5Ax0fdsiLhTQwHXxaiTnB3kD97pk,1669
284
284
  zenml/integrations/gitlab/__init__.py,sha256=4Vz6XiPJYDZ9mos6L1FlgWsmueRCck86Sd8KRVj9NWQ,1003
285
285
  zenml/integrations/gitlab/code_repositories/__init__.py,sha256=Ds7NL6tCqLApRsOgvUofEq3Ms2No5_Z095uvi1gLVIk,817
286
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py,sha256=0XJhRBr6Ru31p5NDVbdTG57nXIAgWM630pLAWmJMVrw,5538
286
+ zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py,sha256=P4boNw8ALFWWXrYiI9xG1cXiWhJXmoRoYmT8PQGBBBQ,5761
287
287
  zenml/integrations/great_expectations/__init__.py,sha256=Vp7qJ2iA3BfPK1QZFYEiE8SB8lIM2S8SGmW35dW8A7M,2448
288
288
  zenml/integrations/great_expectations/data_validators/__init__.py,sha256=Z16qmLfUoataEABQ6Ec-HSLM_a9VRALHFa4OoAyozIk,857
289
289
  zenml/integrations/great_expectations/data_validators/ge_data_validator.py,sha256=qp2ZFqQiYPszRc6vGhZhK22GEHhGoTQ0Y9u0trXNQyg,21404
@@ -648,7 +648,7 @@ zenml/models/v2/core/pipeline_deployment.py,sha256=6PbpnEUAbTT-_jPmyNtKuTJHFGdGL
648
648
  zenml/models/v2/core/pipeline_run.py,sha256=41TqY_CzUCWlunnyX6GBJ-OmcRtGIm9sHAXB4pIuwMo,32669
649
649
  zenml/models/v2/core/run_metadata.py,sha256=YDiPVRzTUMVHqW4T_Ke4GJMdscp0aS_g8I4P8n70szc,2436
650
650
  zenml/models/v2/core/run_template.py,sha256=A_dezNA9o1uJW-o1B9fYaSSWHwwglJYP3jvhWhGcJK4,12971
651
- zenml/models/v2/core/schedule.py,sha256=jcZSD-lbKxXxFL1lglQG5nFvY3-bLNarSrnmaxR42jY,10314
651
+ zenml/models/v2/core/schedule.py,sha256=JNYTGPXDPMz7A9OjhnHIXyOLQuoFnrzOwChGibz2xQY,10774
652
652
  zenml/models/v2/core/secret.py,sha256=LoY5BMZIrU6KYa39layHt6cbAnmMR7yXizv_1Qqse6Q,11460
653
653
  zenml/models/v2/core/server_settings.py,sha256=al6LAXhoQHsBiTv2qlwFn1AlI2F8miogGB4xjDE6KeA,6267
654
654
  zenml/models/v2/core/service.py,sha256=lwCDOFk-OXmfhB_bOOJy7rhbkR40tCScQsWnllgL7II,14973
@@ -692,10 +692,10 @@ zenml/orchestrators/topsort.py,sha256=D8evz3X47zwpXd90NMLsJD-_uCeXtV6ClzNfDUrq7c
692
692
  zenml/orchestrators/utils.py,sha256=faRm86Ed_KVFBYbiMriSM0z3NwsydJWDvLYX-7DSrkc,13153
693
693
  zenml/orchestrators/wheeled_orchestrator.py,sha256=eOnMcnd3sCzfhA2l6qRAzF0rOXzaojbjvvYvTkqixQo,4791
694
694
  zenml/pipelines/__init__.py,sha256=hpIX7hN8jsQRHT5R-xSXZL88qrHwkmrvGLQeu1rWt4o,873
695
- zenml/pipelines/build_utils.py,sha256=Jas5D8QnjXzizMtcCrJY4dcddeix7QFXbhoY25R47M4,26133
695
+ zenml/pipelines/build_utils.py,sha256=5eU1__3A37nRzYsNtExvtRfBHYXYOlDtcLS_cVT6zco,27255
696
696
  zenml/pipelines/pipeline_context.py,sha256=V_p-F9W7cBIlTjS0iv5-uJYMzaOj8bAUkc_uNhQgBms,3579
697
697
  zenml/pipelines/pipeline_decorator.py,sha256=FIbflYOMavbuyGmqsx3F5zZgg0oXMTi1eAcGXciljOs,4293
698
- zenml/pipelines/pipeline_definition.py,sha256=ByHnPiQWUdyy6UTMcKPXsbClTyFFO_geOGfOMTsRnt8,55924
698
+ zenml/pipelines/pipeline_definition.py,sha256=bEloeIhfKjaKLG9zXccQ7Pb-KMRgNbVjVXeXC3X50HM,56034
699
699
  zenml/pipelines/run_utils.py,sha256=4KuHIQFtLXTZNQBScTEkIG5pqNtu6xGm6UZT7ptyyKs,11623
700
700
  zenml/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
701
701
  zenml/plugins/base_plugin_flavor.py,sha256=88IxFW91UB_rQ8xPlfRnIhIJh7A308NEq2epMMdlOng,2530
@@ -756,12 +756,12 @@ zenml/types.py,sha256=LhGWJ4t3nybBk1l9Ox3tqqHbTYSuCqhkRsL5FqO6yf4,1206
756
756
  zenml/utils/__init__.py,sha256=jaMTbjm8tLYkaRoxlZ0Em4ye_ZHOHKgP2goPTTiYGUQ,797
757
757
  zenml/utils/archivable.py,sha256=QuLe1IhyABTrE6Y0hAT3tKjaUCpcze5ffZ_RKoKtJwY,6549
758
758
  zenml/utils/callback_registry.py,sha256=QBWdaraLAxBxi8DKbv9X1SUpTKDhhj-XE0JomB2Ax2Y,2411
759
- zenml/utils/code_repository_utils.py,sha256=CobRYMYfP2yNoA0hcu_WRz5oAff_jY95oyLCHz4fDOo,4734
759
+ zenml/utils/code_repository_utils.py,sha256=f_VaN-QaCd66xVJJjM4mIo6Heu96-c9qdWh5XUjGpMY,4950
760
760
  zenml/utils/code_utils.py,sha256=y7_vmqYv_e11xekFjK7Dm4LkFu6SGl73tr2fVxBAK3s,11336
761
761
  zenml/utils/cuda_utils.py,sha256=RR21m__Zs-OnI5n-veFUzWniZjwLSbalHE5QV3jK1Hw,1624
762
762
  zenml/utils/daemon.py,sha256=GZ7Dx6GLHK04SR50wBxpKYmFhxPBfdLWxJiAWzJC6cM,11863
763
763
  zenml/utils/dashboard_utils.py,sha256=JyT-rOsqipazmImXBB-UzCg0GJ3UNzVCFdMcQisInfQ,5379
764
- zenml/utils/deprecation_utils.py,sha256=nianydl7n6DQrs_o5M0VxjYQfySvbGMPkjjdxn6aCvM,6253
764
+ zenml/utils/deprecation_utils.py,sha256=QcWkOnzIRDKPOfkr523n3l2MoY2wE0LIPfbx99t4Gmg,6343
765
765
  zenml/utils/dict_utils.py,sha256=i7KAaKrkaWA_cG5IvVfMnr0CwWlBJ7KAsGvP2wxjZI8,2667
766
766
  zenml/utils/docker_utils.py,sha256=QvkKnvIYSKAhW7mErXwSaQ432-q1LAsLjo2YWSXD8Bk,13889
767
767
  zenml/utils/downloaded_repository_context.py,sha256=S660PSSQ3dsNBA0qAj8ap_Thyw1n6x4VDcRWbCMDP2M,1502
@@ -779,7 +779,7 @@ zenml/utils/networking_utils.py,sha256=zTDbOMkMPRWiWLZ2ccchd37rvvZWIIh0Kr9dZE-VJ
779
779
  zenml/utils/notebook_utils.py,sha256=VBMU9Qnx_NdpB1TQtnej56L0hRr11fwniOva3ltUT90,4113
780
780
  zenml/utils/package_utils.py,sha256=wy0Mh8hHhOX2z1JfGN5lifG9yEsBQGLwNfur0M3J2tQ,2730
781
781
  zenml/utils/pagination_utils.py,sha256=TufckOqOKeDPwE3ySefL05zOzGUUA2Fqx_QFVhE2so0,1445
782
- zenml/utils/pipeline_docker_image_builder.py,sha256=NzHWv0hi2U5d3OsOlTea1fdeA0C4hNMJ3IqUqDsB4r4,25172
782
+ zenml/utils/pipeline_docker_image_builder.py,sha256=5gTY5bf58UYy1p_s7_4odEcunC7Hpe1DbdVnCFyPkiY,25034
783
783
  zenml/utils/proxy_utils.py,sha256=fgRlLa9pfXJDoxtB31_YP7DClOMQLek_nMmM0et6i3w,7241
784
784
  zenml/utils/pydantic_utils.py,sha256=oQcxY4VXuVY3n632atlvdmi12EYcSQ1xZuQJY3Je-sA,16592
785
785
  zenml/utils/requirements_utils.py,sha256=pUVlQpEtLfz7lLJEUN-t7oHKLzdZZdgHoMzv0V5WXZI,2250
@@ -1253,7 +1253,7 @@ zenml/zen_stores/schemas/api_key_schemas.py,sha256=d_ewTrIJpRjLWupOZFpWcPSlRiHxi
1253
1253
  zenml/zen_stores/schemas/artifact_schemas.py,sha256=_hXytHqa0BYrBLgZt8RdAid1n291d8wQ0HxNMIAjlJQ,14317
1254
1254
  zenml/zen_stores/schemas/artifact_visualization_schemas.py,sha256=_gMNjOF0oJ0ruW5Ua86hDocvO4MT3ACAIx_BwFBJFWk,3693
1255
1255
  zenml/zen_stores/schemas/base_schemas.py,sha256=-MDYnS4ZLDe6x75nTXuVrOSbcYOuECLNk-yxjfEdJh4,2043
1256
- zenml/zen_stores/schemas/code_repository_schemas.py,sha256=aDot3lUrcjPVX7yDlCzMuMG9ziX6vDSZwfHKtNbNlIc,7410
1256
+ zenml/zen_stores/schemas/code_repository_schemas.py,sha256=K2EFvu_bkF9-cDAVYpMntNidSu-zb3By7CVq6rLj97c,7489
1257
1257
  zenml/zen_stores/schemas/component_schemas.py,sha256=vQ0GHbtvx-rgJDMPtIIbLs_KM8pRfNnF2EL41CYx48A,8260
1258
1258
  zenml/zen_stores/schemas/constants.py,sha256=bcadtiWEWkpzRzvnj46yuAaC7DE09g2H9L9r398lV00,704
1259
1259
  zenml/zen_stores/schemas/device_schemas.py,sha256=voVBknm14NmFpij1EGb_HhVlUng0cglCMXkYSxDRq1s,9126
@@ -1292,8 +1292,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=Bq1djrUP9saoD7vECjS7
1292
1292
  zenml/zen_stores/sql_zen_store.py,sha256=AaPwO6R_2QVsI_PmDktVTF-Fx6VzR64j-1oU7cJwVxI,416486
1293
1293
  zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
1294
1294
  zenml/zen_stores/zen_store_interface.py,sha256=vf2gKBWfUUPtcGZC35oQB6pPNVzWVyQC8nWxVLjfrxM,92692
1295
- zenml_nightly-0.73.0.dev20250127.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1296
- zenml_nightly-0.73.0.dev20250127.dist-info/METADATA,sha256=hQqzjMYXjxVPekLNRFGO9TI6yCO0KMMPTRR4XZccL6o,21355
1297
- zenml_nightly-0.73.0.dev20250127.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1298
- zenml_nightly-0.73.0.dev20250127.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1299
- zenml_nightly-0.73.0.dev20250127.dist-info/RECORD,,
1295
+ zenml_nightly-0.73.0.dev20250128.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1296
+ zenml_nightly-0.73.0.dev20250128.dist-info/METADATA,sha256=BV3mpMHnzE1NHGrXN1GGMGemkWe14SU-ysUGOXW2kg8,21355
1297
+ zenml_nightly-0.73.0.dev20250128.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1298
+ zenml_nightly-0.73.0.dev20250128.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1299
+ zenml_nightly-0.73.0.dev20250128.dist-info/RECORD,,