zenml-nightly 0.73.0.dev20250130__py3-none-any.whl → 0.73.0.dev20250131__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 (25) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/code_repository.py +26 -0
  3. zenml/client.py +2 -7
  4. zenml/code_repositories/base_code_repository.py +30 -2
  5. zenml/code_repositories/git/local_git_repository_context.py +26 -10
  6. zenml/code_repositories/local_repository_context.py +11 -8
  7. zenml/constants.py +3 -0
  8. zenml/integrations/github/code_repositories/github_code_repository.py +17 -2
  9. zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +17 -2
  10. zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +1 -1
  11. zenml/pipelines/build_utils.py +42 -35
  12. zenml/pipelines/pipeline_definition.py +5 -2
  13. zenml/utils/code_repository_utils.py +11 -2
  14. zenml/utils/downloaded_repository_context.py +3 -5
  15. zenml/utils/source_utils.py +3 -3
  16. zenml/zen_stores/migrations/utils.py +48 -1
  17. zenml/zen_stores/migrations/versions/4d5524b92a30_add_run_metadata_tag_index.py +67 -0
  18. zenml/zen_stores/schemas/run_metadata_schemas.py +15 -2
  19. zenml/zen_stores/schemas/schema_utils.py +34 -2
  20. zenml/zen_stores/schemas/tag_schemas.py +14 -1
  21. {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/METADATA +1 -1
  22. {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/RECORD +25 -24
  23. {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/LICENSE +0 -0
  24. {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/WHEEL +0 -0
  25. {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/entry_points.txt +0 -0
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.73.0.dev20250130
1
+ 0.73.0.dev20250131
@@ -162,6 +162,32 @@ def register_code_repository(
162
162
  cli_utils.declare(f"Successfully registered code repository `{name}`.")
163
163
 
164
164
 
165
+ @code_repository.command("describe", help="Describe a code repository.")
166
+ @click.argument(
167
+ "name_id_or_prefix",
168
+ type=str,
169
+ required=True,
170
+ )
171
+ def describe_code_repository(name_id_or_prefix: str) -> None:
172
+ """Describe a code repository.
173
+
174
+ Args:
175
+ name_id_or_prefix: Name, ID or prefix of the code repository.
176
+ """
177
+ client = Client()
178
+ try:
179
+ code_repository = client.get_code_repository(
180
+ name_id_or_prefix=name_id_or_prefix,
181
+ )
182
+ except KeyError as err:
183
+ cli_utils.error(str(err))
184
+ else:
185
+ cli_utils.print_pydantic_model(
186
+ title=f"Code repository '{code_repository.name}'",
187
+ model=code_repository,
188
+ )
189
+
190
+
165
191
  @code_repository.command("list", help="List all connected code repositories.")
166
192
  @list_options(CodeRepositoryFilter)
167
193
  def list_code_repositories(**kwargs: Any) -> None:
zenml/client.py CHANGED
@@ -34,7 +34,7 @@ from typing import (
34
34
  Union,
35
35
  cast,
36
36
  )
37
- from uuid import UUID, uuid4
37
+ from uuid import UUID
38
38
 
39
39
  from pydantic import ConfigDict, SecretStr
40
40
 
@@ -4980,12 +4980,7 @@ class Client(metaclass=ClientMetaClass):
4980
4980
  )
4981
4981
  )
4982
4982
  try:
4983
- # This does a login to verify the credentials
4984
- code_repo_class(id=uuid4(), config=config)
4985
-
4986
- # Explicitly access the config for pydantic validation, in case
4987
- # the login for some reason did not do that.
4988
- _ = code_repo_class.config
4983
+ code_repo_class.validate_config(config)
4989
4984
  except Exception as e:
4990
4985
  raise RuntimeError(
4991
4986
  "Failed to validate code repository config."
@@ -15,7 +15,7 @@
15
15
 
16
16
  from abc import ABC, abstractmethod
17
17
  from typing import TYPE_CHECKING, Any, Dict, Optional, Set, Type
18
- from uuid import UUID
18
+ from uuid import UUID, uuid4
19
19
 
20
20
  from zenml.config.secret_reference_mixin import SecretReferenceMixin
21
21
  from zenml.logger import get_logger
@@ -44,15 +44,18 @@ class BaseCodeRepository(ABC):
44
44
  def __init__(
45
45
  self,
46
46
  id: UUID,
47
+ name: str,
47
48
  config: Dict[str, Any],
48
49
  ) -> None:
49
50
  """Initializes a code repository.
50
51
 
51
52
  Args:
52
53
  id: The ID of the code repository.
54
+ name: The name of the code repository.
53
55
  config: The config of the code repository.
54
56
  """
55
57
  self._id = id
58
+ self._name = name
56
59
  self._config = config
57
60
  self.login()
58
61
 
@@ -80,7 +83,23 @@ class BaseCodeRepository(ABC):
80
83
  source=model.source, expected_class=BaseCodeRepository
81
84
  )
82
85
  )
83
- return class_(id=model.id, config=model.config)
86
+ return class_(id=model.id, name=model.name, config=model.config)
87
+
88
+ @classmethod
89
+ def validate_config(cls, config: Dict[str, Any]) -> None:
90
+ """Validate the code repository config.
91
+
92
+ This method should check that the config/credentials are valid and
93
+ the configured repository exists.
94
+
95
+ Args:
96
+ config: The configuration.
97
+ """
98
+ # The initialization calls the login to verify the credentials
99
+ code_repo = cls(id=uuid4(), name="", config=config)
100
+
101
+ # Explicitly access the config for pydantic validation
102
+ _ = code_repo.config
84
103
 
85
104
  @property
86
105
  def id(self) -> UUID:
@@ -91,6 +110,15 @@ class BaseCodeRepository(ABC):
91
110
  """
92
111
  return self._id
93
112
 
113
+ @property
114
+ def name(self) -> str:
115
+ """Name of the code repository.
116
+
117
+ Returns:
118
+ The name of the code repository.
119
+ """
120
+ return self._name
121
+
94
122
  @property
95
123
  def requirements(self) -> Set[str]:
96
124
  """Set of PyPI requirements for the repository.
@@ -14,11 +14,14 @@
14
14
  """Implementation of the Local git repository context."""
15
15
 
16
16
  from typing import TYPE_CHECKING, Callable, Optional, cast
17
- from uuid import UUID
18
17
 
19
18
  from zenml.code_repositories import (
20
19
  LocalRepositoryContext,
21
20
  )
21
+ from zenml.constants import (
22
+ ENV_ZENML_CODE_REPOSITORY_IGNORE_UNTRACKED_FILES,
23
+ handle_bool_env_var,
24
+ )
22
25
  from zenml.logger import get_logger
23
26
 
24
27
  if TYPE_CHECKING:
@@ -26,6 +29,8 @@ if TYPE_CHECKING:
26
29
  from git.remote import Remote
27
30
  from git.repo.base import Repo
28
31
 
32
+ from zenml.code_repositories import BaseCodeRepository
33
+
29
34
  logger = get_logger(__name__)
30
35
 
31
36
 
@@ -33,16 +38,19 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
33
38
  """Local git repository context."""
34
39
 
35
40
  def __init__(
36
- self, code_repository_id: UUID, git_repo: "Repo", remote_name: str
41
+ self,
42
+ code_repository: "BaseCodeRepository",
43
+ git_repo: "Repo",
44
+ remote_name: str,
37
45
  ):
38
46
  """Initializes a local git repository context.
39
47
 
40
48
  Args:
41
- code_repository_id: The ID of the code repository.
49
+ code_repository: The code repository.
42
50
  git_repo: The git repo.
43
51
  remote_name: Name of the remote.
44
52
  """
45
- super().__init__(code_repository_id=code_repository_id)
53
+ super().__init__(code_repository=code_repository)
46
54
  self._git_repo = git_repo
47
55
  self._remote = git_repo.remote(name=remote_name)
48
56
 
@@ -50,14 +58,14 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
50
58
  def at(
51
59
  cls,
52
60
  path: str,
53
- code_repository_id: UUID,
61
+ code_repository: "BaseCodeRepository",
54
62
  remote_url_validation_callback: Callable[[str], bool],
55
63
  ) -> Optional["LocalGitRepositoryContext"]:
56
64
  """Returns a local git repository at the given path.
57
65
 
58
66
  Args:
59
67
  path: The path to the local git repository.
60
- code_repository_id: The ID of the code repository.
68
+ code_repository: The code repository.
61
69
  remote_url_validation_callback: A callback that validates the
62
70
  remote URL of the git repository.
63
71
 
@@ -70,11 +78,13 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
70
78
  from git.exc import InvalidGitRepositoryError
71
79
  from git.repo.base import Repo
72
80
  except ImportError:
81
+ logger.debug("Failed to import git library.")
73
82
  return None
74
83
 
75
84
  try:
76
85
  git_repo = Repo(path=path, search_parent_directories=True)
77
86
  except InvalidGitRepositoryError:
87
+ logger.debug("No git repository exists at path %s.", path)
78
88
  return None
79
89
 
80
90
  remote_name = None
@@ -87,7 +97,7 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
87
97
  return None
88
98
 
89
99
  return LocalGitRepositoryContext(
90
- code_repository_id=code_repository_id,
100
+ code_repository=code_repository,
91
101
  git_repo=git_repo,
92
102
  remote_name=remote_name,
93
103
  )
@@ -124,13 +134,19 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
124
134
  def is_dirty(self) -> bool:
125
135
  """Whether the git repo is dirty.
126
136
 
127
- A repository counts as dirty if it has any untracked or uncommitted
128
- changes.
137
+ By default, a repository counts as dirty if it has any untracked or
138
+ uncommitted changes. Users can use an environment variable to ignore
139
+ untracked files.
129
140
 
130
141
  Returns:
131
142
  True if the git repo is dirty, False otherwise.
132
143
  """
133
- return self.git_repo.is_dirty(untracked_files=True)
144
+ ignore_untracked_files = handle_bool_env_var(
145
+ ENV_ZENML_CODE_REPOSITORY_IGNORE_UNTRACKED_FILES, default=False
146
+ )
147
+ return self.git_repo.is_dirty(
148
+ untracked_files=not ignore_untracked_files
149
+ )
134
150
 
135
151
  @property
136
152
  def has_local_changes(self) -> bool:
@@ -14,10 +14,13 @@
14
14
  """Base class for local code repository contexts."""
15
15
 
16
16
  from abc import ABC, abstractmethod
17
- from uuid import UUID
17
+ from typing import TYPE_CHECKING
18
18
 
19
19
  from zenml.logger import get_logger
20
20
 
21
+ if TYPE_CHECKING:
22
+ from zenml.code_repositories import BaseCodeRepository
23
+
21
24
  logger = get_logger(__name__)
22
25
 
23
26
 
@@ -30,22 +33,22 @@ class LocalRepositoryContext(ABC):
30
33
  commit, and whether the repository is dirty.
31
34
  """
32
35
 
33
- def __init__(self, code_repository_id: UUID) -> None:
36
+ def __init__(self, code_repository: "BaseCodeRepository") -> None:
34
37
  """Initializes a local repository context.
35
38
 
36
39
  Args:
37
- code_repository_id: The ID of the code repository.
40
+ code_repository: The code repository.
38
41
  """
39
- self._code_repository_id = code_repository_id
42
+ self._code_repository = code_repository
40
43
 
41
44
  @property
42
- def code_repository_id(self) -> UUID:
43
- """Returns the ID of the code repository.
45
+ def code_repository(self) -> "BaseCodeRepository":
46
+ """Returns the code repository.
44
47
 
45
48
  Returns:
46
- The ID of the code repository.
49
+ The code repository.
47
50
  """
48
- return self._code_repository_id
51
+ return self._code_repository
49
52
 
50
53
  @property
51
54
  @abstractmethod
zenml/constants.py CHANGED
@@ -175,6 +175,9 @@ ENV_ZENML_WHEEL_PACKAGE_NAME = "ZENML_WHEEL_PACKAGE_NAME"
175
175
  ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
176
176
  "ZENML_PIPELINE_API_TOKEN_EXPIRATION"
177
177
  )
178
+ ENV_ZENML_CODE_REPOSITORY_IGNORE_UNTRACKED_FILES = (
179
+ "ZENML_CODE_REPOSITORY_IGNORE_UNTRACKED_FILES"
180
+ )
178
181
 
179
182
  # Materializer environment variables
180
183
  ENV_ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS = (
@@ -15,7 +15,8 @@
15
15
 
16
16
  import os
17
17
  import re
18
- from typing import List, Optional
18
+ from typing import Any, Dict, List, Optional
19
+ from uuid import uuid4
19
20
 
20
21
  import requests
21
22
  from github import Consts, Github, GithubException
@@ -62,6 +63,20 @@ class GitHubCodeRepositoryConfig(BaseCodeRepositoryConfig):
62
63
  class GitHubCodeRepository(BaseCodeRepository):
63
64
  """GitHub code repository."""
64
65
 
66
+ @classmethod
67
+ def validate_config(cls, config: Dict[str, Any]) -> None:
68
+ """Validate the code repository config.
69
+
70
+ This method should check that the config/credentials are valid and
71
+ the configured repository exists.
72
+
73
+ Args:
74
+ config: The configuration.
75
+ """
76
+ code_repo = cls(id=uuid4(), name="", config=config)
77
+ # Try to access the project to make sure it exists
78
+ _ = code_repo.github_repo
79
+
65
80
  @property
66
81
  def config(self) -> GitHubCodeRepositoryConfig:
67
82
  """Returns the `GitHubCodeRepositoryConfig` config.
@@ -190,7 +205,7 @@ class GitHubCodeRepository(BaseCodeRepository):
190
205
  """
191
206
  return LocalGitRepositoryContext.at(
192
207
  path=path,
193
- code_repository_id=self.id,
208
+ code_repository=self,
194
209
  remote_url_validation_callback=self.check_remote_url,
195
210
  )
196
211
 
@@ -15,7 +15,8 @@
15
15
 
16
16
  import os
17
17
  import re
18
- from typing import Optional
18
+ from typing import Any, Dict, Optional
19
+ from uuid import uuid4
19
20
 
20
21
  from gitlab import Gitlab
21
22
  from gitlab.v4.objects import Project
@@ -63,6 +64,20 @@ class GitLabCodeRepositoryConfig(BaseCodeRepositoryConfig):
63
64
  class GitLabCodeRepository(BaseCodeRepository):
64
65
  """GitLab code repository."""
65
66
 
67
+ @classmethod
68
+ def validate_config(cls, config: Dict[str, Any]) -> None:
69
+ """Validate the code repository config.
70
+
71
+ This method should check that the config/credentials are valid and
72
+ the configured repository exists.
73
+
74
+ Args:
75
+ config: The configuration.
76
+ """
77
+ code_repo = cls(id=uuid4(), name="", config=config)
78
+ # Try to access the project to make sure it exists
79
+ _ = code_repo.gitlab_project
80
+
66
81
  @property
67
82
  def config(self) -> GitLabCodeRepositoryConfig:
68
83
  """Returns the `GitLabCodeRepositoryConfig` config.
@@ -147,7 +162,7 @@ class GitLabCodeRepository(BaseCodeRepository):
147
162
  """
148
163
  return LocalGitRepositoryContext.at(
149
164
  path=path,
150
- code_repository_id=self.id,
165
+ code_repository=self,
151
166
  remote_url_validation_callback=self.check_remote_url,
152
167
  )
153
168
 
@@ -44,7 +44,7 @@ class BasePyTorchMaterializer(BaseMaterializer):
44
44
  # NOTE (security): The `torch.load` function uses `pickle` as
45
45
  # the default unpickler, which is NOT secure. This materializer
46
46
  # is intended for use with trusted data sources.
47
- return torch.load(f) # nosec
47
+ return torch.load(f, weights_only=False) # nosec
48
48
 
49
49
  def save(self, obj: Any) -> None:
50
50
  """Uses `torch.save` to save a PyTorch object.
@@ -517,32 +517,9 @@ def verify_local_repository_context(
517
517
  "changes."
518
518
  )
519
519
 
520
- if local_repo_context:
521
- if local_repo_context.is_dirty:
522
- logger.warning(
523
- "Unable to use code repository to download code for this "
524
- "run as there are uncommitted changes."
525
- )
526
- elif local_repo_context.has_local_changes:
527
- logger.warning(
528
- "Unable to use code repository to download code for this "
529
- "run as there are unpushed changes."
530
- )
531
-
532
520
  code_repository = None
533
521
  if local_repo_context and not local_repo_context.has_local_changes:
534
- model = Client().get_code_repository(
535
- local_repo_context.code_repository_id
536
- )
537
- code_repository = BaseCodeRepository.from_model(model)
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
- )
522
+ code_repository = local_repo_context.code_repository
546
523
 
547
524
  return code_repository
548
525
 
@@ -738,25 +715,17 @@ def should_upload_code(
738
715
  return False
739
716
 
740
717
 
741
- def will_download_from_code_repository(
718
+ def allows_download_from_code_repository(
742
719
  deployment: PipelineDeploymentBase,
743
- local_repo_context: "LocalRepositoryContext",
744
720
  ) -> bool:
745
- """Checks whether a code repository will be used to download code.
721
+ """Checks whether a code repository can be used to download code.
746
722
 
747
723
  Args:
748
724
  deployment: The deployment.
749
- local_repo_context: The local repository context.
750
725
 
751
726
  Returns:
752
- Whether a code repository will be used to download code.
727
+ Whether a code repository can be used to download code.
753
728
  """
754
- if not build_required(deployment=deployment):
755
- return False
756
-
757
- if local_repo_context.has_local_changes:
758
- return False
759
-
760
729
  for step in deployment.step_configurations.values():
761
730
  docker_settings = step.config.docker_settings
762
731
 
@@ -764,3 +733,41 @@ def will_download_from_code_repository(
764
733
  return True
765
734
 
766
735
  return False
736
+
737
+
738
+ def log_code_repository_usage(
739
+ deployment: PipelineDeploymentBase,
740
+ local_repo_context: "LocalRepositoryContext",
741
+ ) -> None:
742
+ """Log what the code repository can (not) be used for given a deployment.
743
+
744
+ Args:
745
+ deployment: The deployment.
746
+ local_repo_context: The local repository context.
747
+ """
748
+ if build_required(deployment) and allows_download_from_code_repository(
749
+ deployment
750
+ ):
751
+ if local_repo_context.is_dirty:
752
+ logger.warning(
753
+ "Unable to use code repository `%s` to download code or track "
754
+ "the commit hash as there are uncommitted or untracked files.",
755
+ local_repo_context.code_repository.name,
756
+ )
757
+ elif local_repo_context.has_local_changes:
758
+ logger.warning(
759
+ "Unable to use code repository `%s` to download code as there "
760
+ "are unpushed commits.",
761
+ local_repo_context.code_repository.name,
762
+ )
763
+ else:
764
+ logger.info(
765
+ "Using code repository `%s` to download code for this run.",
766
+ local_repo_context.code_repository.name,
767
+ )
768
+ elif local_repo_context.is_dirty:
769
+ logger.warning(
770
+ "Unable to use code repository `%s` to track the commit hash as "
771
+ "there are uncommitted or untracked files.",
772
+ local_repo_context.code_repository.name,
773
+ )
@@ -643,7 +643,6 @@ To avoid this consider setting pipeline parameters only in one place (config or
643
643
  pipeline_id = None
644
644
  if register_pipeline:
645
645
  pipeline_id = self._register().id
646
-
647
646
  else:
648
647
  logger.debug(f"Pipeline {self.name} is unlisted.")
649
648
 
@@ -702,6 +701,10 @@ To avoid this consider setting pipeline parameters only in one place (config or
702
701
  deployment=deployment, local_repo_context=local_repo_context
703
702
  )
704
703
  can_download_from_code_repository = code_repository is not None
704
+ if local_repo_context:
705
+ build_utils.log_code_repository_usage(
706
+ deployment=deployment, local_repo_context=local_repo_context
707
+ )
705
708
 
706
709
  if prevent_build_reuse:
707
710
  logger.warning(
@@ -731,7 +734,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
731
734
  code_reference = CodeReferenceRequest(
732
735
  commit=local_repo_context.current_commit,
733
736
  subdirectory=subdirectory.as_posix(),
734
- code_repository=local_repo_context.code_repository_id,
737
+ code_repository=local_repo_context.code_repository.id,
735
738
  )
736
739
 
737
740
  code_path = None
@@ -79,7 +79,7 @@ def set_custom_local_repository(
79
79
 
80
80
  path = os.path.abspath(source_utils.get_source_root())
81
81
  _CODE_REPOSITORY_CACHE[path] = _DownloadedRepositoryContext(
82
- code_repository_id=repo.id, root=root, commit=commit
82
+ code_repository=repo, root=root, commit=commit
83
83
  )
84
84
 
85
85
 
@@ -106,7 +106,8 @@ def find_active_code_repository(
106
106
  return _CODE_REPOSITORY_CACHE[path]
107
107
 
108
108
  local_context: Optional["LocalRepositoryContext"] = None
109
- for model in depaginate(list_method=Client().list_code_repositories):
109
+ code_repositories = depaginate(list_method=Client().list_code_repositories)
110
+ for model in code_repositories:
110
111
  try:
111
112
  repo = BaseCodeRepository.from_model(model)
112
113
  except ImportError:
@@ -125,6 +126,14 @@ def find_active_code_repository(
125
126
  local_context = repo.get_local_context(path)
126
127
  if local_context:
127
128
  break
129
+ else:
130
+ if code_repositories:
131
+ # There are registered code repositories, but none was matching the
132
+ # current path -> We log the path to help in debugging issues
133
+ # related to the source root.
134
+ logger.info(
135
+ "No matching code repository found for path `%s`.", path
136
+ )
128
137
 
129
138
  _CODE_REPOSITORY_CACHE[path] = local_context
130
139
  return local_context
@@ -13,9 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Downloaded code repository."""
15
15
 
16
- from uuid import UUID
17
-
18
- from zenml.code_repositories import LocalRepositoryContext
16
+ from zenml.code_repositories import BaseCodeRepository, LocalRepositoryContext
19
17
 
20
18
 
21
19
  class _DownloadedRepositoryContext(LocalRepositoryContext):
@@ -27,11 +25,11 @@ class _DownloadedRepositoryContext(LocalRepositoryContext):
27
25
 
28
26
  def __init__(
29
27
  self,
30
- code_repository_id: UUID,
28
+ code_repository: BaseCodeRepository,
31
29
  root: str,
32
30
  commit: str,
33
31
  ):
34
- super().__init__(code_repository_id=code_repository_id)
32
+ super().__init__(code_repository=code_repository)
35
33
  self._root = root
36
34
  self._commit = commit
37
35
 
@@ -226,7 +226,7 @@ def resolve(
226
226
  subdir = PurePath(source_root).relative_to(local_repo_context.root)
227
227
 
228
228
  return CodeRepositorySource(
229
- repository_id=local_repo_context.code_repository_id,
229
+ repository_id=local_repo_context.code_repository.id,
230
230
  commit=local_repo_context.current_commit,
231
231
  subdirectory=subdir.as_posix(),
232
232
  module=module_name,
@@ -482,7 +482,7 @@ def _warn_about_potential_source_loading_issues(
482
482
  source.repository_id,
483
483
  get_source_root(),
484
484
  )
485
- elif local_repo.code_repository_id != source.repository_id:
485
+ elif local_repo.code_repository.id != source.repository_id:
486
486
  logger.warning(
487
487
  "Potential issue when loading the source `%s`: The source "
488
488
  "references the code repository `%s` but there is a different "
@@ -492,7 +492,7 @@ def _warn_about_potential_source_loading_issues(
492
492
  "source was originally stored.",
493
493
  source.import_path,
494
494
  source.repository_id,
495
- local_repo.code_repository_id,
495
+ local_repo.code_repository.id,
496
496
  get_source_root(),
497
497
  )
498
498
  elif local_repo.current_commit != source.commit:
@@ -34,7 +34,7 @@ from sqlalchemy.engine import URL, Engine
34
34
  from sqlalchemy.exc import (
35
35
  OperationalError,
36
36
  )
37
- from sqlalchemy.schema import CreateTable
37
+ from sqlalchemy.schema import CreateIndex, CreateTable
38
38
  from sqlmodel import (
39
39
  create_engine,
40
40
  select,
@@ -249,6 +249,7 @@ class MigrationUtils(BaseModel):
249
249
  # them to the create table statement.
250
250
 
251
251
  # Extract the unique constraints from the table schema
252
+ index_create_statements = []
252
253
  unique_constraints = []
253
254
  for index in table.indexes:
254
255
  if index.unique:
@@ -258,6 +259,38 @@ class MigrationUtils(BaseModel):
258
259
  unique_constraints.append(
259
260
  f"UNIQUE KEY `{index.name}` ({', '.join(unique_columns)})"
260
261
  )
262
+ else:
263
+ if index.name in {
264
+ fk.name for fk in table.foreign_key_constraints
265
+ }:
266
+ # Foreign key indices are already handled by the
267
+ # table creation statement.
268
+ continue
269
+
270
+ index_create = str(CreateIndex(index)).strip() # type: ignore[no-untyped-call]
271
+ index_create = index_create.replace(
272
+ f"CREATE INDEX {index.name}",
273
+ f"CREATE INDEX `{index.name}`",
274
+ )
275
+ index_create = index_create.replace(
276
+ f"ON {table.name}", f"ON `{table.name}`"
277
+ )
278
+
279
+ for column_name in index.columns.keys():
280
+ # We need this logic here to avoid the column names
281
+ # inside the index name
282
+ index_create = index_create.replace(
283
+ f"({column_name}", f"(`{column_name}`"
284
+ )
285
+ index_create = index_create.replace(
286
+ f"{column_name},", f"`{column_name}`,"
287
+ )
288
+ index_create = index_create.replace(
289
+ f"{column_name})", f"`{column_name}`)"
290
+ )
291
+
292
+ index_create = index_create.replace('"', "") + ";"
293
+ index_create_statements.append(index_create)
261
294
 
262
295
  # Add the unique constraints to the create table statement
263
296
  if unique_constraints:
@@ -290,6 +323,14 @@ class MigrationUtils(BaseModel):
290
323
  )
291
324
  )
292
325
 
326
+ for stmt in index_create_statements:
327
+ store_db_info(
328
+ dict(
329
+ table=table.name,
330
+ index_create_stmt=stmt,
331
+ )
332
+ )
333
+
293
334
  # 2. extract the table data in batches
294
335
  order_by = [col for col in table.primary_key]
295
336
 
@@ -356,6 +397,12 @@ class MigrationUtils(BaseModel):
356
397
  "self_references", False
357
398
  )
358
399
 
400
+ if "index_create_stmt" in table_dump:
401
+ # execute the index creation statement
402
+ connection.execute(text(table_dump["index_create_stmt"]))
403
+ # Reload the database metadata after creating the index
404
+ metadata.reflect(bind=self.engine)
405
+
359
406
  if "data" in table_dump:
360
407
  # insert the data into the database
361
408
  table = metadata.tables[table_name]
@@ -0,0 +1,67 @@
1
+ """Add run metadata and tag index [4d5524b92a30].
2
+
3
+ Revision ID: 4d5524b92a30
4
+ Revises: 0.73.0
5
+ Create Date: 2025-01-30 11:30:36.736452
6
+
7
+ """
8
+
9
+ from alembic import op
10
+ from sqlalchemy import inspect
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "4d5524b92a30"
14
+ down_revision = "0.73.0"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ """Upgrade database schema and/or data, creating a new revision."""
21
+ connection = op.get_bind()
22
+
23
+ inspector = inspect(connection)
24
+ for index in inspector.get_indexes("run_metadata_resource"):
25
+ # This index was manually added to some databases to improve the
26
+ # speed and cache utilisation. In this case we simply return here and
27
+ # don't continue with the migration.
28
+ if (
29
+ index["name"]
30
+ == "ix_run_metadata_resource_resource_id_resource_type_run_metadata_"
31
+ ):
32
+ return
33
+
34
+ # ### commands auto generated by Alembic - please adjust! ###
35
+ with op.batch_alter_table(
36
+ "run_metadata_resource", schema=None
37
+ ) as batch_op:
38
+ batch_op.create_index(
39
+ "ix_run_metadata_resource_resource_id_resource_type_run_metadata_",
40
+ ["resource_id", "resource_type", "run_metadata_id"],
41
+ unique=False,
42
+ )
43
+
44
+ with op.batch_alter_table("tag_resource", schema=None) as batch_op:
45
+ batch_op.create_index(
46
+ "ix_tag_resource_resource_id_resource_type_tag_id",
47
+ ["resource_id", "resource_type", "tag_id"],
48
+ unique=False,
49
+ )
50
+
51
+ # ### end Alembic commands ###
52
+
53
+
54
+ def downgrade() -> None:
55
+ """Downgrade database schema and/or data back to the previous revision."""
56
+ # ### commands auto generated by Alembic - please adjust! ###
57
+ with op.batch_alter_table("tag_resource", schema=None) as batch_op:
58
+ batch_op.drop_index("ix_tag_resource_resource_id_resource_type_tag_id")
59
+
60
+ with op.batch_alter_table(
61
+ "run_metadata_resource", schema=None
62
+ ) as batch_op:
63
+ batch_op.drop_index(
64
+ "ix_run_metadata_resource_resource_id_resource_type_run_metadata_"
65
+ )
66
+
67
+ # ### end Alembic commands ###
@@ -11,7 +11,7 @@
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
- """SQLModel implementation of pipeline run metadata tables."""
14
+ """SQLModel implementation of run metadata tables."""
15
15
 
16
16
  from typing import Optional
17
17
  from uuid import UUID, uuid4
@@ -21,7 +21,10 @@ 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.schema_utils import build_foreign_key_field
24
+ from zenml.zen_stores.schemas.schema_utils import (
25
+ build_foreign_key_field,
26
+ build_index,
27
+ )
25
28
  from zenml.zen_stores.schemas.step_run_schemas import StepRunSchema
26
29
  from zenml.zen_stores.schemas.user_schemas import UserSchema
27
30
  from zenml.zen_stores.schemas.workspace_schemas import WorkspaceSchema
@@ -82,6 +85,16 @@ class RunMetadataResourceSchema(SQLModel, table=True):
82
85
  """Table for linking resources to run metadata entries."""
83
86
 
84
87
  __tablename__ = "run_metadata_resource"
88
+ __table_args__ = (
89
+ build_index(
90
+ table_name=__tablename__,
91
+ column_names=[
92
+ "resource_id",
93
+ "resource_type",
94
+ "run_metadata_id",
95
+ ],
96
+ ),
97
+ )
85
98
 
86
99
  id: UUID = Field(default_factory=uuid4, primary_key=True)
87
100
  resource_id: UUID
@@ -13,9 +13,9 @@
13
13
  # permissions and limitations under the License.
14
14
  """Utility functions for SQLModel schemas."""
15
15
 
16
- from typing import Any
16
+ from typing import Any, List
17
17
 
18
- from sqlalchemy import Column, ForeignKey
18
+ from sqlalchemy import Column, ForeignKey, Index
19
19
  from sqlmodel import Field
20
20
 
21
21
 
@@ -84,3 +84,35 @@ def build_foreign_key_field(
84
84
  **sa_column_kwargs,
85
85
  ),
86
86
  )
87
+
88
+
89
+ def get_index_name(table_name: str, column_names: List[str]) -> str:
90
+ """Get the name for an index.
91
+
92
+ Args:
93
+ table_name: The name of the table for which the index will be created.
94
+ column_names: Names of the columns on which the index will be created.
95
+
96
+ Returns:
97
+ The index name.
98
+ """
99
+ columns = "_".join(column_names)
100
+ # MySQL allows a maximum of 64 characters in identifiers
101
+ return f"ix_{table_name}_{columns}"[:64]
102
+
103
+
104
+ def build_index(
105
+ table_name: str, column_names: List[str], **kwargs: Any
106
+ ) -> Index:
107
+ """Build an index object.
108
+
109
+ Args:
110
+ table_name: The name of the table for which the index will be created.
111
+ column_names: Names of the columns on which the index will be created.
112
+ **kwargs: Additional keyword arguments to pass to the Index.
113
+
114
+ Returns:
115
+ The index.
116
+ """
117
+ name = get_index_name(table_name=table_name, column_names=column_names)
118
+ return Index(name, *column_names, **kwargs)
@@ -31,7 +31,10 @@ 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 BaseSchema, NamedSchema
34
- from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
34
+ from zenml.zen_stores.schemas.schema_utils import (
35
+ build_foreign_key_field,
36
+ build_index,
37
+ )
35
38
 
36
39
 
37
40
  class TagSchema(NamedSchema, table=True):
@@ -111,6 +114,16 @@ class TagResourceSchema(BaseSchema, table=True):
111
114
  """SQL Model for tag resource relationship."""
112
115
 
113
116
  __tablename__ = "tag_resource"
117
+ __table_args__ = (
118
+ build_index(
119
+ table_name=__tablename__,
120
+ column_names=[
121
+ "resource_id",
122
+ "resource_type",
123
+ "tag_id",
124
+ ],
125
+ ),
126
+ )
114
127
 
115
128
  tag_id: UUID = build_foreign_key_field(
116
129
  source=__tablename__,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.73.0.dev20250130
3
+ Version: 0.73.0.dev20250131
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=wW7R7I2rStFIfLzfJIdNqUBozH4gk7VR6MkRm4Ntduk,19
2
+ zenml/VERSION,sha256=yZ41gV2RoySfmEaBFCUmGXHDN81pnq8bzattD9wYAn4,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=UEgiVTzb184AaSrNmO-ylaZ9f_OXXe76EHbf9zrZVc8,8746
35
+ zenml/cli/code_repository.py,sha256=QbBQgnNzte3lP0x0M-3DOHGZYvHTLGTOsH_qcqinsXc,9448
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,13 +55,13 @@ zenml/cli/user_management.py,sha256=fTuRworQahst_j78qPYTtgciUeUOxwo7efiyPwmj2tI,
55
55
  zenml/cli/utils.py,sha256=kqTFuEyXgx0eP_7mtWwmDwF3JvDSQ7dnOMhlNYSSJfM,86594
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=Aj3-Ofz9t0MltZarqdgb4fSFqhrl6SWC5VjEoHkcCdU,283629
58
+ zenml/client.py,sha256=B2xEX39nePNAl5TcFVyvIMYBQqAba5IQ5BFhLC2enxQ,283388
59
59
  zenml/client_lazy_loader.py,sha256=MOBgS1ITYqGvPUnWQ6edn9s8Hr_72YfWbwEIfHKUr9g,7104
60
60
  zenml/code_repositories/__init__.py,sha256=W5bDfzAG8OXIKZSV1L-VHuzMcSCYa9qzTdPb3jqfyYw,920
61
- zenml/code_repositories/base_code_repository.py,sha256=_DbxIBxvJlN0PFhST0vlTIQ26Q6V3Nar0kYdeGaJrk8,4386
61
+ zenml/code_repositories/base_code_repository.py,sha256=Id6VjbUu8N3ZpNvBGhOgbahtoMiCAtYXed3G7YQ_iAc,5225
62
62
  zenml/code_repositories/git/__init__.py,sha256=vU8UzMp8sv9n-R2r7VKa9LdQcYER6BhO4O-z8Ppa3kM,824
63
- zenml/code_repositories/git/local_git_repository_context.py,sha256=hWP-7Fk_JRZaHFM_6BkGH243XVWRhGENBO5McYAV_Kw,5288
64
- zenml/code_repositories/local_repository_context.py,sha256=N1EagG_gh_BTQ4Z_CC1dHBTQfYvgNjtWnAAANQD_2CA,2743
63
+ zenml/code_repositories/git/local_git_repository_context.py,sha256=hfX7zVDQ27Le0qb4HKoJMcRB8YWfK8_yHPPgfh1SAS0,5848
64
+ zenml/code_repositories/local_repository_context.py,sha256=1VyiYkJBDVg0iGusgRQDToGRPJuu9lx7jTBDpplukDg,2816
65
65
  zenml/config/__init__.py,sha256=DZEic7euSbwI9Yb3FMRQhTgfhqz-C6OdAiYmOb0-opI,1519
66
66
  zenml/config/base_settings.py,sha256=itoLqc1cOwEYhgSGdZmSKSaBevQkvYH7NQh7PUamazc,1700
67
67
  zenml/config/build_configuration.py,sha256=Jsng7ebpeaRbzXlbszU-uYkaVihgQ4OrD839yWwD3ZY,5126
@@ -85,7 +85,7 @@ zenml/config/step_run_info.py,sha256=KiVRSTtKmZ1GbvseDTap2imr7XwMHD3jSFVpyLNEK1I
85
85
  zenml/config/store_config.py,sha256=Cla5p5dTB6nNlo8_OZDs9hod5hspi64vxwtZj882XgU,3559
86
86
  zenml/config/strict_base_model.py,sha256=iHnO9qOmLUP_eiy9IjRr3JjIs1l1I_CsRQ76EyAneYU,860
87
87
  zenml/console.py,sha256=hj_KerPQKwnyKACj0ehSqUQX0mGVCJBKE1QvCt6ik3A,1160
88
- zenml/constants.py,sha256=d6RrpS0nni9bAHa2BR6R8bzXiRe9ELKCYVZcKUAE9tE,15749
88
+ zenml/constants.py,sha256=2YfXhw9VeUCeoMy4coJ8vDQruzdGezrbrurc4eOk6JE,15855
89
89
  zenml/container_registries/__init__.py,sha256=ZSPbBIOnzhg88kQSpYgKe_POLuru14m629665-kAVAA,2200
90
90
  zenml/container_registries/azure_container_registry.py,sha256=t1sfDa94Vzbyqtb1iPFNutJ2EXV5_p9CUNITasoiQ70,2667
91
91
  zenml/container_registries/base_container_registry.py,sha256=6c2e32wuqxYHJXm5OV2LY1MtX9yopB7WZtes9fmTAz0,7625
@@ -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=X8CCniyAo7NHiy3Mv_YSKQ4Hw3UYMXob6B3uWKsCJ-0,13567
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=7s4NjOn_bItAbwcxQQQfo9IlW8vowleUQMiBjjn6iJo,7041
279
+ zenml/integrations/github/code_repositories/github_code_repository.py,sha256=rhX2lRYN-zk9j4GlRj4Jc00aDeg5dt8FI1aWuRoy7Jw,7534
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=P4boNw8ALFWWXrYiI9xG1cXiWhJXmoRoYmT8PQGBBBQ,5761
286
+ zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py,sha256=PEk0v-xVG8TGjpxfcX1nwy6D1ItVUAzQoCaS2nkqX0Q,6257
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
@@ -440,7 +440,7 @@ zenml/integrations/pycaret/materializers/__init__.py,sha256=7I9prC68U3-qE7j5iXSD
440
440
  zenml/integrations/pycaret/materializers/model_materializer.py,sha256=1NYf6m2MF9aQiN_y-Am2Z6xiPlOPBb5HNviDIvIEC90,4383
441
441
  zenml/integrations/pytorch/__init__.py,sha256=B8xtFRfFgUqpC28KY_y_o9BMNWvlxqZlJiaJnw-rUpQ,1163
442
442
  zenml/integrations/pytorch/materializers/__init__.py,sha256=m4laxcEZpP-Po_s6ch9FHHyjLxZ8Ft8TBfU_MpXIy-Q,920
443
- zenml/integrations/pytorch/materializers/base_pytorch_materializer.py,sha256=1mtQQ7j_JyqZn9BbYX9mrpRO27KkG54XUYJBVW-Qt3w,2457
443
+ zenml/integrations/pytorch/materializers/base_pytorch_materializer.py,sha256=eLS_-n_-dodCfa4TBuoHiE6nXoJgAYkq75mUG7hXcJM,2477
444
444
  zenml/integrations/pytorch/materializers/pytorch_dataloader_materializer.py,sha256=XEw4P3VQS8uMKuQ24twR6N_1RA882yOeee8iInV6pUQ,2301
445
445
  zenml/integrations/pytorch/materializers/pytorch_module_materializer.py,sha256=O5V4yUAoK6wZdJT1RVn6Ui2JoH4yaMrIoLDjDKgViGA,2957
446
446
  zenml/integrations/pytorch/utils.py,sha256=IbJTsMb5zYcGlxZj0xKIFQuPHdnizWMd_zmeM6B7v-M,1242
@@ -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=5eU1__3A37nRzYsNtExvtRfBHYXYOlDtcLS_cVT6zco,27255
695
+ zenml/pipelines/build_utils.py,sha256=DkID1YnRYkw569uU-gidpF8WR8E7K55_wn3CzRPQ3Cs,27562
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=bEloeIhfKjaKLG9zXccQ7Pb-KMRgNbVjVXeXC3X50HM,56034
698
+ zenml/pipelines/pipeline_definition.py,sha256=M4r2EqpXzAAPG_asK76fYE855U4nlCkZe1To-D4yDM4,56206
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,7 +756,7 @@ 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=f_VaN-QaCd66xVJJjM4mIo6Heu96-c9qdWh5XUjGpMY,4950
759
+ zenml/utils/code_repository_utils.py,sha256=-Zw8TvCSPfISB30Gmj0Yryk-RYrpzwCkqH7_c7Hq9ZY,5334
760
760
  zenml/utils/code_utils.py,sha256=SsfE4sHcBX3yPyrk3QWZXpXfsTcjycbVIuqVV6zKPDY,11463
761
761
  zenml/utils/cuda_utils.py,sha256=RR21m__Zs-OnI5n-veFUzWniZjwLSbalHE5QV3jK1Hw,1624
762
762
  zenml/utils/daemon.py,sha256=GZ7Dx6GLHK04SR50wBxpKYmFhxPBfdLWxJiAWzJC6cM,11863
@@ -764,7 +764,7 @@ zenml/utils/dashboard_utils.py,sha256=fV1U0KeQEmipVRfrhkgXFVenWiz2qctm0kx7aaI5Aw
764
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
- zenml/utils/downloaded_repository_context.py,sha256=S660PSSQ3dsNBA0qAj8ap_Thyw1n6x4VDcRWbCMDP2M,1502
767
+ zenml/utils/downloaded_repository_context.py,sha256=GyPOzC8M3SaEGnnbPgEgJhUW-m5hx9rLScnCiGw6_PY,1504
768
768
  zenml/utils/enum_utils.py,sha256=0fA0B9v9Wjutuqlu_owUoOit1utIw2UH5J6YHXSqhLU,1368
769
769
  zenml/utils/env_utils.py,sha256=2--2DDUt3gPOvCNVyobBtAciikQ0OEXs5WWp7NvYuKo,5276
770
770
  zenml/utils/filesync_model.py,sha256=9ibsIr2HJfkEQ41upQd4uJ79ZhzB0MHS85GOGOAQ19Y,5470
@@ -787,7 +787,7 @@ zenml/utils/secret_utils.py,sha256=gEvqnhzAZwPO6mdOQWvioeH-xLoSObfaNRzt17N8zyU,5
787
787
  zenml/utils/settings_utils.py,sha256=lAK13CiDCDkcLygizDbWB9q-9ukteVBJPypzFCrne9k,4631
788
788
  zenml/utils/singleton.py,sha256=uFRrUlUdS5VyY9lLJyl_n5kqppsqJLKkBhSj4g5VPkY,2757
789
789
  zenml/utils/source_code_utils.py,sha256=8iyNA2MGIORYVEkSdxNTXfS1ZdFKXTAG1dZRkeQtPL0,3751
790
- zenml/utils/source_utils.py,sha256=eYDw5nYU5vckvBRBFSvYKTmRFDD4-rberOmoBaHQzNU,26736
790
+ zenml/utils/source_utils.py,sha256=ow3fbodjmAfpwmUXBSg3oyibHk065aSvi4UV9uJD6Yk,26736
791
791
  zenml/utils/string_utils.py,sha256=VPuAwFzxwXXo1cKmBWxHnoeTyDX35XPf_lXGiDMXPEw,7254
792
792
  zenml/utils/time_utils.py,sha256=-9Y9zwJ-6Gv7hoZQCoftPyC2LCLo2bYj6OgdyBaE44o,4076
793
793
  zenml/utils/typed_model.py,sha256=00EAo1I1VnOBHG4-ce8dPkyHRPpgi67SRIU-KdewRWs,4757
@@ -1071,7 +1071,7 @@ zenml/zen_stores/migrations/__init__.py,sha256=N9CHfdz0AZ6KniQ450VCIV3H0CuWtx83A
1071
1071
  zenml/zen_stores/migrations/alembic.py,sha256=JDqx7Md6DxnHtP3xrZG1I0cNv6NyTR0oO3tPRUPaS2I,7455
1072
1072
  zenml/zen_stores/migrations/env.py,sha256=hN6GqD2toKL-r9y0FFAf2seJfr79Mzaeqslh5kObcos,1730
1073
1073
  zenml/zen_stores/migrations/script.py.mako,sha256=wTJhgE4DA8I2iVA29sfx74WLfbi3GBnXEwGnH5nNj4s,695
1074
- zenml/zen_stores/migrations/utils.py,sha256=CpRuePiVaBzj2a1-gbExp6gmWA9oKPFIhGvuDnzEmvE,27265
1074
+ zenml/zen_stores/migrations/utils.py,sha256=QsWDm-uQNzD0RvIA54CMFnLrEUgXmXGfdQcTnwTdhYI,29560
1075
1075
  zenml/zen_stores/migrations/versions/0.21.0_release.py,sha256=5FoOdsRLifIC10GQBx3C7cSthPM3wtuzO4heMXgTbcY,444
1076
1076
  zenml/zen_stores/migrations/versions/0.21.1_release.py,sha256=SLWTKX1s6yN2xUEDe2-9_sRMqBjJPr1Je_I7JZTf1r8,432
1077
1077
  zenml/zen_stores/migrations/versions/0.22.0_release.py,sha256=bxpLvwzqSin2RuT-uYK4DWl1D92ldvhJ_QVdRFub8DE,444
@@ -1183,6 +1183,7 @@ zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py,sha256=
1183
1183
  zenml/zen_stores/migrations/versions/479103df60b6_add_triggers.py,sha256=g5hic8at_cYdTE6DwGoMjZGY1mQVNJWyz9huQ86fH9E,5702
1184
1184
  zenml/zen_stores/migrations/versions/4a3087070f4e_add_step_source_code.py,sha256=MLrAvCWHPTyEYADNTBS9LJjDrBxKZGwLjR-zzTxUd04,987
1185
1185
  zenml/zen_stores/migrations/versions/4c41c0ca42db_add_code_repository_table.py,sha256=j7E4jvZq7pCAWp5fL8yt-3YmmIfZTyKoqE7V7jjg42E,3749
1186
+ zenml/zen_stores/migrations/versions/4d5524b92a30_add_run_metadata_tag_index.py,sha256=18dyuaSITN3rui2awW-3qcua7x3neGAX1nF7RyuWf68,2146
1186
1187
  zenml/zen_stores/migrations/versions/4d688d8f7aff_rename_model_version_to_model.py,sha256=cZF0aMxfuPTwcMZRELxsTBMpWGcxwZm95fJlgii9fTs,2386
1187
1188
  zenml/zen_stores/migrations/versions/4e1972485075_endpoint_artifact_deployment_artifact.py,sha256=YWOn0mzuJg5cVF8Mb3ORWVfq7IylsJXrD_TUDnuHMVQ,1138
1188
1189
  zenml/zen_stores/migrations/versions/4f66af55fbb9_rename_model_config_model_to_model_.py,sha256=nNu27CCTNCVUAejFCKa-Xhvu8IGZKTTewBohXKl3tT8,2624
@@ -1265,17 +1266,17 @@ zenml/zen_stores/schemas/pipeline_build_schemas.py,sha256=QK3sVPYhumUx_x-H3YZ-Rf
1265
1266
  zenml/zen_stores/schemas/pipeline_deployment_schemas.py,sha256=fdsROPBE1QrWKvSkaZYz2Sc1MwXogAembs8TfZML3ks,10201
1266
1267
  zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=vGH8-onUSmXwZz-qabZjl2F5bJ06pwVSU5vVr5WtdT8,18067
1267
1268
  zenml/zen_stores/schemas/pipeline_schemas.py,sha256=G8YH5g_kp4QHcijchO5SUNvePXErqoF9qNNzgDg8K_k,6366
1268
- zenml/zen_stores/schemas/run_metadata_schemas.py,sha256=hP3tQ_OyH-ga6Whl6_5Yy8W0BkwBWXT2camu2X6gXL0,3362
1269
+ zenml/zen_stores/schemas/run_metadata_schemas.py,sha256=yDDWEl9q4CExCL47uf72fDEodKNqA60PptBPydCJTwk,3619
1269
1270
  zenml/zen_stores/schemas/run_template_schemas.py,sha256=W3ADwqG6xe9a-zhtvtTREn48onE5uYi6YMI26yU37Xo,8950
1270
1271
  zenml/zen_stores/schemas/schedule_schema.py,sha256=zLh2LlgRWl-m1ANLpUnwh8LEpKykIR8JpJS7angMGW4,8169
1271
- zenml/zen_stores/schemas/schema_utils.py,sha256=2qPNPfasnTmCW1RPeViXoTAp6oO-uRnUpEZ_rugcoNw,2612
1272
+ zenml/zen_stores/schemas/schema_utils.py,sha256=Xahifq2fJ5szXCM00ZZ6461Div9Suatzl6sy9hVhPkk,3612
1272
1273
  zenml/zen_stores/schemas/secret_schemas.py,sha256=H-DGSmVmsH9OPh4BOBC0QXMjV6u-KiKT_KDbfOtkt8M,9889
1273
1274
  zenml/zen_stores/schemas/server_settings_schemas.py,sha256=jhvc-WYmKUlHU4SDdPjm1BLbm2D_Rug-rgXuyY4kzeo,4201
1274
1275
  zenml/zen_stores/schemas/service_connector_schemas.py,sha256=XUy5hESAa1qAbVnpIyelJhDkW3JPtG3dbVyWQU34OIQ,10096
1275
1276
  zenml/zen_stores/schemas/service_schemas.py,sha256=wSGMr0Vea7sgFWwPQ1k-6PA6m4g80mOiFRFUKJMWUZ0,9614
1276
1277
  zenml/zen_stores/schemas/stack_schemas.py,sha256=nZj4J9hcTsq_9mbl1n_yd4VDOdJQv6yqzWBMua1Wy64,5584
1277
1278
  zenml/zen_stores/schemas/step_run_schemas.py,sha256=sF_GX9hKuTrbQDYMRnXorADjOdUXDxYj8Ky0112LdRs,16482
1278
- zenml/zen_stores/schemas/tag_schemas.py,sha256=RZy0TDOT51wzbDxajh1RjD7VhHdwNLrPUOenFGgxG60,5211
1279
+ zenml/zen_stores/schemas/tag_schemas.py,sha256=5GNDl_-PAbsyM5dwAOaXOdcfuEkrnNJ_swnEVdkwOHE,5468
1279
1280
  zenml/zen_stores/schemas/trigger_schemas.py,sha256=fznBKwVzfvK_aIS6fg8XHwn8R_8NsjwpDITXyqLDY1E,10578
1280
1281
  zenml/zen_stores/schemas/user_schemas.py,sha256=t-O1FvRNyWo9mqR85WanodVq_ROGVJ_FgzwMoF-NmwQ,10810
1281
1282
  zenml/zen_stores/schemas/utils.py,sha256=lAhxBn21ljBp4aVol0MiZfRyQrW3RbWAOVfYFcdrxvA,3625
@@ -1292,8 +1293,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=nEO0bAPlULBLxLVk-UTR
1292
1293
  zenml/zen_stores/sql_zen_store.py,sha256=GEBQDPhm52-YyxLBJcebNviwtr-VK_dnaHrg21fzJOw,417086
1293
1294
  zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
1294
1295
  zenml/zen_stores/zen_store_interface.py,sha256=vf2gKBWfUUPtcGZC35oQB6pPNVzWVyQC8nWxVLjfrxM,92692
1295
- zenml_nightly-0.73.0.dev20250130.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1296
- zenml_nightly-0.73.0.dev20250130.dist-info/METADATA,sha256=Iil8YHORJo4k5qoNT03yMS74Osq372zX8vYS7n7ak6k,21355
1297
- zenml_nightly-0.73.0.dev20250130.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1298
- zenml_nightly-0.73.0.dev20250130.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1299
- zenml_nightly-0.73.0.dev20250130.dist-info/RECORD,,
1296
+ zenml_nightly-0.73.0.dev20250131.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1297
+ zenml_nightly-0.73.0.dev20250131.dist-info/METADATA,sha256=n0WxU1eiS-WyTdH9oHEG_eQRzqr7ZMGMLWPJnA6rU4o,21355
1298
+ zenml_nightly-0.73.0.dev20250131.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1299
+ zenml_nightly-0.73.0.dev20250131.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1300
+ zenml_nightly-0.73.0.dev20250131.dist-info/RECORD,,