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.
- zenml/VERSION +1 -1
- zenml/cli/code_repository.py +26 -0
- zenml/client.py +2 -7
- zenml/code_repositories/base_code_repository.py +30 -2
- zenml/code_repositories/git/local_git_repository_context.py +26 -10
- zenml/code_repositories/local_repository_context.py +11 -8
- zenml/constants.py +3 -0
- zenml/integrations/github/code_repositories/github_code_repository.py +17 -2
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +17 -2
- zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +1 -1
- zenml/pipelines/build_utils.py +42 -35
- zenml/pipelines/pipeline_definition.py +5 -2
- zenml/utils/code_repository_utils.py +11 -2
- zenml/utils/downloaded_repository_context.py +3 -5
- zenml/utils/source_utils.py +3 -3
- zenml/zen_stores/migrations/utils.py +48 -1
- zenml/zen_stores/migrations/versions/4d5524b92a30_add_run_metadata_tag_index.py +67 -0
- zenml/zen_stores/schemas/run_metadata_schemas.py +15 -2
- zenml/zen_stores/schemas/schema_utils.py +34 -2
- zenml/zen_stores/schemas/tag_schemas.py +14 -1
- {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/METADATA +1 -1
- {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/RECORD +25 -24
- {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/WHEEL +0 -0
- {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.
|
1
|
+
0.73.0.dev20250131
|
zenml/cli/code_repository.py
CHANGED
@@ -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
|
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
|
-
|
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,
|
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
|
-
|
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__(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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,
|
36
|
+
def __init__(self, code_repository: "BaseCodeRepository") -> None:
|
34
37
|
"""Initializes a local repository context.
|
35
38
|
|
36
39
|
Args:
|
37
|
-
|
40
|
+
code_repository: The code repository.
|
38
41
|
"""
|
39
|
-
self.
|
42
|
+
self._code_repository = code_repository
|
40
43
|
|
41
44
|
@property
|
42
|
-
def
|
43
|
-
"""Returns the
|
45
|
+
def code_repository(self) -> "BaseCodeRepository":
|
46
|
+
"""Returns the code repository.
|
44
47
|
|
45
48
|
Returns:
|
46
|
-
The
|
49
|
+
The code repository.
|
47
50
|
"""
|
48
|
-
return self.
|
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
|
-
|
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
|
-
|
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.
|
zenml/pipelines/build_utils.py
CHANGED
@@ -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
|
-
|
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
|
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
|
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
|
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.
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
28
|
+
code_repository: BaseCodeRepository,
|
31
29
|
root: str,
|
32
30
|
commit: str,
|
33
31
|
):
|
34
|
-
super().__init__(
|
32
|
+
super().__init__(code_repository=code_repository)
|
35
33
|
self._root = root
|
36
34
|
self._commit = commit
|
37
35
|
|
zenml/utils/source_utils.py
CHANGED
@@ -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.
|
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.
|
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.
|
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
|
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
|
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
|
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__,
|
{zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/RECORD
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
|
2
|
-
zenml/VERSION,sha256=
|
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=
|
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=
|
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=
|
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=
|
64
|
-
zenml/code_repositories/local_repository_context.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
1296
|
-
zenml_nightly-0.73.0.
|
1297
|
-
zenml_nightly-0.73.0.
|
1298
|
-
zenml_nightly-0.73.0.
|
1299
|
-
zenml_nightly-0.73.0.
|
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,,
|
{zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/LICENSE
RENAMED
File without changes
|
{zenml_nightly-0.73.0.dev20250130.dist-info → zenml_nightly-0.73.0.dev20250131.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|