prefect-client 3.4.1.dev4__py3-none-any.whl → 3.4.2__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.
- prefect/_build_info.py +3 -3
- prefect/_internal/compatibility/blocks.py +27 -0
- prefect/_internal/schemas/bases.py +11 -1
- prefect/_internal/schemas/validators.py +0 -102
- prefect/_internal/uuid7.py +119 -0
- prefect/blocks/webhook.py +15 -7
- prefect/client/schemas/actions.py +13 -35
- prefect/client/schemas/objects.py +26 -22
- prefect/deployments/runner.py +3 -1
- prefect/events/filters.py +25 -11
- prefect/events/schemas/automations.py +3 -1
- prefect/events/schemas/events.py +3 -2
- prefect/flows.py +1 -1
- prefect/results.py +24 -35
- prefect/runner/runner.py +3 -10
- prefect/serializers.py +9 -0
- prefect/server/api/workers.py +3 -2
- prefect/settings/models/tasks.py +3 -2
- prefect/task_runners.py +2 -1
- prefect/task_worker.py +95 -14
- prefect/tasks.py +8 -3
- prefect/types/__init__.py +70 -36
- prefect/types/names.py +139 -0
- prefect/utilities/callables.py +4 -0
- prefect/workers/base.py +32 -10
- {prefect_client-3.4.1.dev4.dist-info → prefect_client-3.4.2.dist-info}/METADATA +2 -2
- {prefect_client-3.4.1.dev4.dist-info → prefect_client-3.4.2.dist-info}/RECORD +29 -26
- {prefect_client-3.4.1.dev4.dist-info → prefect_client-3.4.2.dist-info}/WHEEL +0 -0
- {prefect_client-3.4.1.dev4.dist-info → prefect_client-3.4.2.dist-info}/licenses/LICENSE +0 -0
prefect/types/__init__.py
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from functools import partial
|
4
|
-
from typing import Annotated, Any,
|
4
|
+
from typing import Annotated, Any, Optional, TypeVar, Union
|
5
5
|
from typing_extensions import Literal
|
6
6
|
import orjson
|
7
7
|
import pydantic
|
8
8
|
|
9
|
-
|
10
9
|
from ._datetime import DateTime, Date
|
10
|
+
from .names import (
|
11
|
+
Name,
|
12
|
+
NameOrEmpty,
|
13
|
+
NonEmptyishName,
|
14
|
+
BANNED_CHARACTERS,
|
15
|
+
WITHOUT_BANNED_CHARACTERS,
|
16
|
+
MAX_VARIABLE_NAME_LENGTH,
|
17
|
+
)
|
11
18
|
from pydantic import (
|
12
19
|
BeforeValidator,
|
13
20
|
Field,
|
@@ -21,7 +28,6 @@ from zoneinfo import available_timezones
|
|
21
28
|
|
22
29
|
T = TypeVar("T")
|
23
30
|
|
24
|
-
MAX_VARIABLE_NAME_LENGTH = 255
|
25
31
|
MAX_VARIABLE_VALUE_LENGTH = 5000
|
26
32
|
|
27
33
|
NonNegativeInteger = Annotated[int, Field(ge=0)]
|
@@ -39,37 +45,14 @@ TimeZone = Annotated[
|
|
39
45
|
]
|
40
46
|
|
41
47
|
|
42
|
-
BANNED_CHARACTERS = ["/", "%", "&", ">", "<"]
|
43
|
-
|
44
|
-
WITHOUT_BANNED_CHARACTERS = r"^[^" + "".join(BANNED_CHARACTERS) + "]+$"
|
45
|
-
Name = Annotated[str, Field(pattern=WITHOUT_BANNED_CHARACTERS)]
|
46
|
-
|
47
|
-
WITHOUT_BANNED_CHARACTERS_EMPTY_OK = r"^[^" + "".join(BANNED_CHARACTERS) + "]*$"
|
48
|
-
NameOrEmpty = Annotated[str, Field(pattern=WITHOUT_BANNED_CHARACTERS_EMPTY_OK)]
|
49
|
-
|
50
|
-
|
51
|
-
def non_emptyish(value: str) -> str:
|
52
|
-
if not value.strip("' \""):
|
53
|
-
raise ValueError("name cannot be an empty string")
|
54
|
-
|
55
|
-
return value
|
56
|
-
|
57
|
-
|
58
|
-
NonEmptyishName = Annotated[
|
59
|
-
str,
|
60
|
-
Field(pattern=WITHOUT_BANNED_CHARACTERS),
|
61
|
-
BeforeValidator(non_emptyish),
|
62
|
-
]
|
63
|
-
|
64
|
-
|
65
48
|
VariableValue = Union[
|
66
49
|
StrictStr,
|
67
50
|
StrictInt,
|
68
51
|
StrictBool,
|
69
52
|
StrictFloat,
|
70
53
|
None,
|
71
|
-
|
72
|
-
|
54
|
+
dict[str, Any],
|
55
|
+
list[Any],
|
73
56
|
]
|
74
57
|
|
75
58
|
|
@@ -100,24 +83,24 @@ def cast_none_to_empty_dict(value: Any) -> dict[str, Any]:
|
|
100
83
|
|
101
84
|
|
102
85
|
KeyValueLabels = Annotated[
|
103
|
-
|
86
|
+
dict[str, Union[StrictBool, StrictInt, StrictFloat, str]],
|
104
87
|
BeforeValidator(cast_none_to_empty_dict),
|
105
88
|
]
|
106
89
|
|
107
90
|
|
108
91
|
ListOfNonEmptyStrings = Annotated[
|
109
|
-
|
92
|
+
list[str],
|
110
93
|
BeforeValidator(lambda x: [str(s) for s in x if str(s).strip()]),
|
111
94
|
]
|
112
95
|
|
113
96
|
|
114
|
-
class SecretDict(pydantic.Secret[
|
97
|
+
class SecretDict(pydantic.Secret[dict[str, Any]]):
|
115
98
|
pass
|
116
99
|
|
117
100
|
|
118
101
|
def validate_set_T_from_delim_string(
|
119
|
-
value: Union[str, T,
|
120
|
-
) ->
|
102
|
+
value: Union[str, T, set[T], None], type_: Any, delim: str | None = None
|
103
|
+
) -> set[T]:
|
121
104
|
"""
|
122
105
|
"no-info" before validator useful in scooping env vars
|
123
106
|
|
@@ -131,23 +114,69 @@ def validate_set_T_from_delim_string(
|
|
131
114
|
delim = delim or ","
|
132
115
|
if isinstance(value, str):
|
133
116
|
return {T_adapter.validate_strings(s.strip()) for s in value.split(delim)}
|
134
|
-
errors = []
|
117
|
+
errors: list[pydantic.ValidationError] = []
|
135
118
|
try:
|
136
119
|
return {T_adapter.validate_python(value)}
|
137
120
|
except pydantic.ValidationError as e:
|
138
121
|
errors.append(e)
|
139
122
|
try:
|
140
|
-
return TypeAdapter(
|
123
|
+
return TypeAdapter(set[type_]).validate_python(value)
|
141
124
|
except pydantic.ValidationError as e:
|
142
125
|
errors.append(e)
|
143
126
|
raise ValueError(f"Invalid set[{type_}]: {errors}")
|
144
127
|
|
145
128
|
|
146
129
|
ClientRetryExtraCodes = Annotated[
|
147
|
-
Union[str, StatusCode,
|
130
|
+
Union[str, StatusCode, set[StatusCode], None],
|
148
131
|
BeforeValidator(partial(validate_set_T_from_delim_string, type_=StatusCode)),
|
149
132
|
]
|
150
133
|
|
134
|
+
|
135
|
+
def parse_retry_delay_input(value: Any) -> Any:
|
136
|
+
"""
|
137
|
+
Parses various inputs (string, int, float, list) into a format suitable
|
138
|
+
for TaskRetryDelaySeconds (int, float, list[float], or None).
|
139
|
+
Handles comma-separated strings for lists of delays.
|
140
|
+
"""
|
141
|
+
if isinstance(value, str):
|
142
|
+
stripped_value = value.strip()
|
143
|
+
if not stripped_value:
|
144
|
+
return None # Treat empty or whitespace-only string as None
|
145
|
+
|
146
|
+
delim = ","
|
147
|
+
# Split and filter empty strings that result from multiple commas (e.g., "10,,20")
|
148
|
+
parts = [s.strip() for s in stripped_value.split(delim) if s.strip()]
|
149
|
+
|
150
|
+
if not parts: # e.g., value was just "," or " , "
|
151
|
+
return None
|
152
|
+
|
153
|
+
def _parse_num_part(part_str: str) -> Union[float, int]:
|
154
|
+
try:
|
155
|
+
# Prefer float to align with list[float] in TaskRetryDelaySeconds
|
156
|
+
return TypeAdapter(float).validate_strings(part_str)
|
157
|
+
except pydantic.ValidationError:
|
158
|
+
try:
|
159
|
+
return TypeAdapter(int).validate_strings(part_str)
|
160
|
+
except pydantic.ValidationError as e_int:
|
161
|
+
raise ValueError(
|
162
|
+
f"Invalid number format '{part_str}' for retry delay."
|
163
|
+
) from e_int
|
164
|
+
|
165
|
+
if len(parts) == 1:
|
166
|
+
return _parse_num_part(parts[0])
|
167
|
+
else:
|
168
|
+
return [_parse_num_part(p) for p in parts]
|
169
|
+
|
170
|
+
# For non-string inputs (int, float, list, None, etc.), pass them through.
|
171
|
+
# Pydantic will then validate them against Union[int, float, list[float], None].
|
172
|
+
return value
|
173
|
+
|
174
|
+
|
175
|
+
TaskRetryDelaySeconds = Annotated[
|
176
|
+
Union[str, int, float, list[float], None],
|
177
|
+
BeforeValidator(parse_retry_delay_input),
|
178
|
+
]
|
179
|
+
|
151
180
|
LogLevel = Annotated[
|
152
181
|
Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
|
153
182
|
BeforeValidator(lambda x: x.upper()),
|
@@ -170,11 +199,15 @@ KeyValueLabelsField = Annotated[
|
|
170
199
|
|
171
200
|
|
172
201
|
__all__ = [
|
202
|
+
"BANNED_CHARACTERS",
|
203
|
+
"WITHOUT_BANNED_CHARACTERS",
|
173
204
|
"ClientRetryExtraCodes",
|
174
205
|
"Date",
|
175
206
|
"DateTime",
|
176
207
|
"LogLevel",
|
177
208
|
"KeyValueLabelsField",
|
209
|
+
"MAX_VARIABLE_NAME_LENGTH",
|
210
|
+
"MAX_VARIABLE_VALUE_LENGTH",
|
178
211
|
"NonNegativeInteger",
|
179
212
|
"PositiveInteger",
|
180
213
|
"ListOfNonEmptyStrings",
|
@@ -185,4 +218,5 @@ __all__ = [
|
|
185
218
|
"SecretDict",
|
186
219
|
"StatusCode",
|
187
220
|
"StrictVariableValue",
|
221
|
+
"TaskRetryDelaySeconds",
|
188
222
|
]
|
prefect/types/names.py
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import re
|
4
|
+
from functools import partial
|
5
|
+
from typing import Annotated, overload
|
6
|
+
|
7
|
+
from pydantic import AfterValidator, BeforeValidator, Field
|
8
|
+
|
9
|
+
LOWERCASE_LETTERS_NUMBERS_AND_DASHES_ONLY_REGEX = "^[a-z0-9-]*$"
|
10
|
+
LOWERCASE_LETTERS_NUMBERS_AND_UNDERSCORES_REGEX = "^[a-z0-9_]*$"
|
11
|
+
LOWERCASE_LETTERS_NUMBERS_AND_DASHES_OR_UNDERSCORES_REGEX = "^[a-z0-9-_]*$"
|
12
|
+
|
13
|
+
|
14
|
+
@overload
|
15
|
+
def raise_on_name_alphanumeric_dashes_only(
|
16
|
+
value: str, field_name: str = ...
|
17
|
+
) -> str: ...
|
18
|
+
|
19
|
+
|
20
|
+
@overload
|
21
|
+
def raise_on_name_alphanumeric_dashes_only(
|
22
|
+
value: None, field_name: str = ...
|
23
|
+
) -> None: ...
|
24
|
+
|
25
|
+
|
26
|
+
def raise_on_name_alphanumeric_dashes_only(
|
27
|
+
value: str | None, field_name: str = "value"
|
28
|
+
) -> str | None:
|
29
|
+
if value is not None and not bool(
|
30
|
+
re.match(LOWERCASE_LETTERS_NUMBERS_AND_DASHES_ONLY_REGEX, value)
|
31
|
+
):
|
32
|
+
raise ValueError(
|
33
|
+
f"{field_name} must only contain lowercase letters, numbers, and dashes."
|
34
|
+
)
|
35
|
+
return value
|
36
|
+
|
37
|
+
|
38
|
+
@overload
|
39
|
+
def raise_on_name_alphanumeric_underscores_only(
|
40
|
+
value: str, field_name: str = ...
|
41
|
+
) -> str: ...
|
42
|
+
|
43
|
+
|
44
|
+
@overload
|
45
|
+
def raise_on_name_alphanumeric_underscores_only(
|
46
|
+
value: None, field_name: str = ...
|
47
|
+
) -> None: ...
|
48
|
+
|
49
|
+
|
50
|
+
def raise_on_name_alphanumeric_underscores_only(
|
51
|
+
value: str | None, field_name: str = "value"
|
52
|
+
) -> str | None:
|
53
|
+
if value is not None and not re.match(
|
54
|
+
LOWERCASE_LETTERS_NUMBERS_AND_UNDERSCORES_REGEX, value
|
55
|
+
):
|
56
|
+
raise ValueError(
|
57
|
+
f"{field_name} must only contain lowercase letters, numbers, and"
|
58
|
+
" underscores."
|
59
|
+
)
|
60
|
+
return value
|
61
|
+
|
62
|
+
|
63
|
+
def raise_on_name_alphanumeric_dashes_underscores_only(
|
64
|
+
value: str, field_name: str = "value"
|
65
|
+
) -> str:
|
66
|
+
if not re.match(LOWERCASE_LETTERS_NUMBERS_AND_DASHES_OR_UNDERSCORES_REGEX, value):
|
67
|
+
raise ValueError(
|
68
|
+
f"{field_name} must only contain lowercase letters, numbers, and"
|
69
|
+
" dashes or underscores."
|
70
|
+
)
|
71
|
+
return value
|
72
|
+
|
73
|
+
|
74
|
+
BANNED_CHARACTERS = ["/", "%", "&", ">", "<"]
|
75
|
+
|
76
|
+
WITHOUT_BANNED_CHARACTERS = r"^[^" + "".join(BANNED_CHARACTERS) + "]+$"
|
77
|
+
Name = Annotated[str, Field(pattern=WITHOUT_BANNED_CHARACTERS)]
|
78
|
+
|
79
|
+
WITHOUT_BANNED_CHARACTERS_EMPTY_OK = r"^[^" + "".join(BANNED_CHARACTERS) + "]*$"
|
80
|
+
NameOrEmpty = Annotated[str, Field(pattern=WITHOUT_BANNED_CHARACTERS_EMPTY_OK)]
|
81
|
+
|
82
|
+
|
83
|
+
def non_emptyish(value: str) -> str:
|
84
|
+
if not value.strip("' \""):
|
85
|
+
raise ValueError("name cannot be an empty string")
|
86
|
+
|
87
|
+
return value
|
88
|
+
|
89
|
+
|
90
|
+
NonEmptyishName = Annotated[
|
91
|
+
str,
|
92
|
+
Field(pattern=WITHOUT_BANNED_CHARACTERS),
|
93
|
+
BeforeValidator(non_emptyish),
|
94
|
+
]
|
95
|
+
|
96
|
+
|
97
|
+
### specific names
|
98
|
+
|
99
|
+
BlockDocumentName = Annotated[
|
100
|
+
Name,
|
101
|
+
AfterValidator(
|
102
|
+
partial(
|
103
|
+
raise_on_name_alphanumeric_dashes_only, field_name="Block document name"
|
104
|
+
)
|
105
|
+
),
|
106
|
+
]
|
107
|
+
|
108
|
+
|
109
|
+
BlockTypeSlug = Annotated[
|
110
|
+
str,
|
111
|
+
AfterValidator(
|
112
|
+
partial(raise_on_name_alphanumeric_dashes_only, field_name="Block type slug")
|
113
|
+
),
|
114
|
+
]
|
115
|
+
|
116
|
+
ArtifactKey = Annotated[
|
117
|
+
str,
|
118
|
+
AfterValidator(
|
119
|
+
partial(raise_on_name_alphanumeric_dashes_only, field_name="Artifact key")
|
120
|
+
),
|
121
|
+
]
|
122
|
+
|
123
|
+
MAX_VARIABLE_NAME_LENGTH = 255
|
124
|
+
|
125
|
+
|
126
|
+
VariableName = Annotated[
|
127
|
+
str,
|
128
|
+
AfterValidator(
|
129
|
+
partial(
|
130
|
+
raise_on_name_alphanumeric_dashes_underscores_only,
|
131
|
+
field_name="Variable name",
|
132
|
+
)
|
133
|
+
),
|
134
|
+
Field(
|
135
|
+
max_length=MAX_VARIABLE_NAME_LENGTH,
|
136
|
+
description="The name of the variable",
|
137
|
+
examples=["my_variable"],
|
138
|
+
),
|
139
|
+
]
|
prefect/utilities/callables.py
CHANGED
@@ -424,6 +424,10 @@ def generate_parameter_schema(
|
|
424
424
|
name, type_, field = process_params(
|
425
425
|
param, position=position, docstrings=docstrings, aliases=aliases
|
426
426
|
)
|
427
|
+
|
428
|
+
if name == "cls":
|
429
|
+
continue # Exclude 'cls' as it's implicitly passed to @classmethod and not a real flow parameter
|
430
|
+
|
427
431
|
# Generate a Pydantic model at each step so we can check if this parameter
|
428
432
|
# type supports schema generation
|
429
433
|
try:
|
prefect/workers/base.py
CHANGED
@@ -697,6 +697,25 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
697
697
|
"Workers must implement a method for running submitted flow runs"
|
698
698
|
)
|
699
699
|
|
700
|
+
async def _initiate_run(
|
701
|
+
self,
|
702
|
+
flow_run: "FlowRun",
|
703
|
+
configuration: C,
|
704
|
+
) -> None:
|
705
|
+
"""
|
706
|
+
This method is called by the worker to initiate a flow run and should return as
|
707
|
+
soon as possible.
|
708
|
+
|
709
|
+
This method is used in `.submit` to allow non-blocking submission of flows. For
|
710
|
+
workers that wait for completion in their `run` method, this method should be
|
711
|
+
implemented to return immediately.
|
712
|
+
|
713
|
+
If this method is not implemented, `.submit` will fall back to the `.run` method.
|
714
|
+
"""
|
715
|
+
raise NotImplementedError(
|
716
|
+
"This worker has not implemented `_initiate_run`. Please use `run` instead."
|
717
|
+
)
|
718
|
+
|
700
719
|
async def submit(
|
701
720
|
self,
|
702
721
|
flow: "Flow[..., FR]",
|
@@ -866,16 +885,19 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
866
885
|
try:
|
867
886
|
# Call the implementation-specific run method with the constructed configuration. This is where the
|
868
887
|
# rubber meets the road.
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
await self.
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
888
|
+
try:
|
889
|
+
await self._initiate_run(flow_run, configuration)
|
890
|
+
except NotImplementedError:
|
891
|
+
result = await self.run(flow_run, configuration)
|
892
|
+
|
893
|
+
if result.status_code != 0:
|
894
|
+
await self._propose_crashed_state(
|
895
|
+
flow_run,
|
896
|
+
(
|
897
|
+
"Flow run infrastructure exited with non-zero status code"
|
898
|
+
f" {result.status_code}."
|
899
|
+
),
|
900
|
+
)
|
879
901
|
except Exception as exc:
|
880
902
|
# This flow run was being submitted and did not start successfully
|
881
903
|
logger.exception(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: prefect-client
|
3
|
-
Version: 3.4.
|
3
|
+
Version: 3.4.2
|
4
4
|
Summary: Workflow orchestration and management.
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
6
6
|
Project-URL: Documentation, https://docs.prefect.io
|
@@ -37,7 +37,7 @@ Requires-Dist: httpx[http2]!=0.23.2,>=0.23
|
|
37
37
|
Requires-Dist: humanize<5.0.0,>=4.9.0
|
38
38
|
Requires-Dist: importlib-metadata>=4.4; python_version < '3.10'
|
39
39
|
Requires-Dist: jsonpatch<2.0,>=1.32
|
40
|
-
Requires-Dist: jsonschema<5.0.0,>=4.
|
40
|
+
Requires-Dist: jsonschema<5.0.0,>=4.18.0
|
41
41
|
Requires-Dist: opentelemetry-api<2.0.0,>=1.27.0
|
42
42
|
Requires-Dist: orjson<4.0,>=3.7
|
43
43
|
Requires-Dist: packaging<25.1,>=21.3
|
@@ -1,7 +1,7 @@
|
|
1
1
|
prefect/.prefectignore,sha256=awSprvKT0vI8a64mEOLrMxhxqcO-b0ERQeYpA2rNKVQ,390
|
2
2
|
prefect/__init__.py,sha256=iCdcC5ZmeewikCdnPEP6YBAjPNV5dvfxpYCTpw30Hkw,3685
|
3
3
|
prefect/__main__.py,sha256=WFjw3kaYJY6pOTA7WDOgqjsz8zUEUZHCcj3P5wyVa-g,66
|
4
|
-
prefect/_build_info.py,sha256=
|
4
|
+
prefect/_build_info.py,sha256=nRi1aDgEHkF5uZhl9UznZ20giBPmyTQ_au6f4eJTQXM,180
|
5
5
|
prefect/_result_records.py,sha256=S6QmsODkehGVSzbMm6ig022PYbI6gNKz671p_8kBYx4,7789
|
6
6
|
prefect/_versioning.py,sha256=YqR5cxXrY4P6LM1Pmhd8iMo7v_G2KJpGNdsf4EvDFQ0,14132
|
7
7
|
prefect/_waiters.py,sha256=Ia2ITaXdHzevtyWIgJoOg95lrEXQqNEOquHvw3T33UQ,9026
|
@@ -15,20 +15,20 @@ prefect/exceptions.py,sha256=wZLQQMRB_DyiYkeEdIC5OKwbba5A94Dlnics-lrWI7A,11581
|
|
15
15
|
prefect/filesystems.py,sha256=v5YqGB4uXf9Ew2VuB9VCSkawvYMMVvEtZf7w1VmAmr8,18036
|
16
16
|
prefect/flow_engine.py,sha256=hZpTYEtwTPMtwVoTCrfD93igN7rlKeG_0kyCvdU4aYE,58876
|
17
17
|
prefect/flow_runs.py,sha256=d3jfmrIPP3C19IJREvpkuN6fxksX3Lzo-LlHOB-_E2I,17419
|
18
|
-
prefect/flows.py,sha256=
|
18
|
+
prefect/flows.py,sha256=xJKlXgVVdlZh45uE73PjA90qqmArVM2hzHgsniu02CY,120945
|
19
19
|
prefect/futures.py,sha256=5wVHLtniwG2au0zuxM-ucqo08x0B5l6e8Z1Swbe8R9s,23720
|
20
20
|
prefect/main.py,sha256=8V-qLB4GjEVCkGRgGXeaIk-JIXY8Z9FozcNluj4Sm9E,2589
|
21
21
|
prefect/plugins.py,sha256=FPRLR2mWVBMuOnlzeiTD9krlHONZH2rtYLD753JQDNQ,2516
|
22
22
|
prefect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
|
-
prefect/results.py,sha256=
|
23
|
+
prefect/results.py,sha256=Amm3TQu8U_oakSn__tCogIJ5DsTj0w_kLzuENWsxK6A,36824
|
24
24
|
prefect/schedules.py,sha256=dhq4OhImRvcmtxF7UH1m8RbwYdHT5RQsp_FrxVXfODE,7289
|
25
|
-
prefect/serializers.py,sha256=
|
25
|
+
prefect/serializers.py,sha256=lU9A1rGEfAfhr8nTl3rf-K7ED78QNShXOrmRBhgNk3Y,9566
|
26
26
|
prefect/states.py,sha256=rh7l1bnIYpTXdlXt5nnpz66y9KLjBWAJrN9Eo5RwgQs,26023
|
27
27
|
prefect/task_engine.py,sha256=j0rr8IyBinJmKPD-486RYWKZakhifkEE9ppPCJ9Es-U,62463
|
28
|
-
prefect/task_runners.py,sha256=
|
28
|
+
prefect/task_runners.py,sha256=PozMYXXjiy5pMStifjdBTnLRTtP9uRuBa86KgafpPkQ,16243
|
29
29
|
prefect/task_runs.py,sha256=7LIzfo3fondCyEUpU05sYFN5IfpZigBDXrhG5yc-8t0,9039
|
30
|
-
prefect/task_worker.py,sha256=
|
31
|
-
prefect/tasks.py,sha256=
|
30
|
+
prefect/task_worker.py,sha256=RifZ3bOl6ppoYPiOAd4TQp2_GEw9eDQoW483rq1q52Q,20805
|
31
|
+
prefect/tasks.py,sha256=s8z5k_3KUC0FXzE10-VWH17Uc36a1GKbMOn3jYGbbjk,74954
|
32
32
|
prefect/transactions.py,sha256=uIoPNudzJzH6NrMJhrgr5lyh6JxOJQqT1GvrXt69yNw,26068
|
33
33
|
prefect/variables.py,sha256=dCK3vX7TbkqXZhnNT_v7rcGh3ISRqoR6pJVLpoll3Js,8342
|
34
34
|
prefect/_experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -43,8 +43,10 @@ prefect/_internal/_logging.py,sha256=Igy2tCM2Hv9wNiDPcee0s5N1fTc6oRP7OffCJBqAekY
|
|
43
43
|
prefect/_internal/integrations.py,sha256=U4cZMDbnilzZSKaMxvzZcSL27a1tzRMjDoTfr2ul_eY,231
|
44
44
|
prefect/_internal/pytz.py,sha256=Sy_cD-Hkmo_Yrhx2Jucy7DgTRhvO8ZD0whW1ywbSg_U,13765
|
45
45
|
prefect/_internal/retries.py,sha256=pMHofrTQPDSxbVWclDwXbfhFKaDC6sxe1DkUOWugV6k,3040
|
46
|
+
prefect/_internal/uuid7.py,sha256=yvndhibNDrqnYrG-qUncas4XQp8bKVbmM8XfF7JrjJI,4203
|
46
47
|
prefect/_internal/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
47
48
|
prefect/_internal/compatibility/async_dispatch.py,sha256=cUXOqSeseMUaje9oYUzasVPtNttyiHvrqfJl0zK66XI,2949
|
49
|
+
prefect/_internal/compatibility/blocks.py,sha256=SSZXoWVuCMYu1EzjqmTa4lKjDCyxvOFK47XMj6s4hsk,984
|
48
50
|
prefect/_internal/compatibility/deprecated.py,sha256=YUK1IGOgZrDh6dYRez-9IYTB1eqNC19QiSKbBDl88Qs,9305
|
49
51
|
prefect/_internal/compatibility/migration.py,sha256=Z_r28B90ZQkSngXjr4I_9zA6P74_u48mtp2jYWB9zGg,6797
|
50
52
|
prefect/_internal/concurrency/__init__.py,sha256=YlTwU9ryjPNwbJa45adLJY00t_DGCh1QrdtY9WdVFfw,2140
|
@@ -63,10 +65,10 @@ prefect/_internal/pydantic/v1_schema.py,sha256=wSyQr3LUbIh0R9LsZ6ItmLnQeAS8dxVMN
|
|
63
65
|
prefect/_internal/pydantic/v2_schema.py,sha256=n56GUlGSUeNZLpMphHliN5ksryVdE9OQHoVir2hGXoA,3224
|
64
66
|
prefect/_internal/pydantic/v2_validated_func.py,sha256=Ld8OtPFF7Ci-gHHmKhSMizBxzuIBOQ6kuIFNRh0vRVY,3731
|
65
67
|
prefect/_internal/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
66
|
-
prefect/_internal/schemas/bases.py,sha256=
|
68
|
+
prefect/_internal/schemas/bases.py,sha256=wYBIa5f5BwiKid7Rwp90gqxs7mt4qGBURdtv5dgWJxk,4583
|
67
69
|
prefect/_internal/schemas/fields.py,sha256=m4LrFNz8rA9uBhMk9VyQT6FIXmV_EVAW92hdXeSvHbY,837
|
68
70
|
prefect/_internal/schemas/serializers.py,sha256=G_RGHfObjisUiRvd29p-zc6W4bwt5rE1OdR6TXNrRhQ,825
|
69
|
-
prefect/_internal/schemas/validators.py,sha256=
|
71
|
+
prefect/_internal/schemas/validators.py,sha256=bOtuOYHWfRo-i6zqkE-wvCMXQ3Yww-itj86QLp3yu3Y,16681
|
70
72
|
prefect/_vendor/croniter/__init__.py,sha256=NUFzdbyPcTQhIOFtzmFM0nbClAvBbKh2mlnTBa6NfHU,523
|
71
73
|
prefect/_vendor/croniter/croniter.py,sha256=eJ2HzStNAYV-vNiLOgDXl4sYWWHOsSA0dgwbkQoguhY,53009
|
72
74
|
prefect/blocks/__init__.py,sha256=D0hB72qMfgqnBB2EMZRxUxlX9yLfkab5zDChOwJZmkY,220
|
@@ -76,7 +78,7 @@ prefect/blocks/fields.py,sha256=1m507VVmkpOnMF_7N-qboRjtw4_ceIuDneX3jZ3Jm54,63
|
|
76
78
|
prefect/blocks/notifications.py,sha256=UpNNxc4Bwx0nSlDj-vZQOv2XyUCUB2PaO4uBPO1Y6XM,34162
|
77
79
|
prefect/blocks/redis.py,sha256=lt_f1SIcS5OVvthCY6KRWiy5DyUZNRlHqkKhKF25P8c,5770
|
78
80
|
prefect/blocks/system.py,sha256=4KiUIy5zizMqfGJrxvi9GLRLcMj4BjAXARxCUEmgbKI,5041
|
79
|
-
prefect/blocks/webhook.py,sha256=
|
81
|
+
prefect/blocks/webhook.py,sha256=xylFigbDOsn-YzxahkTzNqYwrIA7wwS6204P0goLY3A,2907
|
80
82
|
prefect/client/__init__.py,sha256=bDeOC_I8_la5dwCAfxKzYSTSAr2tlq5HpxJgVoCCdAs,675
|
81
83
|
prefect/client/base.py,sha256=7VAMyoy8KtmtI-H8KYsI16_uw9TlrXSrcxChFuMp65Q,26269
|
82
84
|
prefect/client/cloud.py,sha256=jnFgg0osMVDGbLjdWkDX3rQg_0pI_zvfSlU480XCWGQ,6523
|
@@ -112,9 +114,9 @@ prefect/client/orchestration/_variables/client.py,sha256=wKBbZBLGgs5feDCil-xxKt3
|
|
112
114
|
prefect/client/orchestration/_work_pools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
113
115
|
prefect/client/orchestration/_work_pools/client.py,sha256=s1DfUQQBgB2sLiVVPhLNTlkueUDE6uFsh4mAzcSA1OE,19881
|
114
116
|
prefect/client/schemas/__init__.py,sha256=InZcDzdeWA2oaV0TlyvoMcyLcbi_aaqU1U9D6Gx-eoU,2747
|
115
|
-
prefect/client/schemas/actions.py,sha256=
|
117
|
+
prefect/client/schemas/actions.py,sha256=E46Mdq7vAq8hhYmMj6zqUF20uAPXZricViZcIYmgEf0,32443
|
116
118
|
prefect/client/schemas/filters.py,sha256=qa--NNZduuSOcL1xw-YMd4FVIKMrDnBwPPY4m5Di0GA,35963
|
117
|
-
prefect/client/schemas/objects.py,sha256=
|
119
|
+
prefect/client/schemas/objects.py,sha256=e5CMS6FhuYqTmxXK1U80eH5zEC0YkZ_vS_aJdr0VA5o,57912
|
118
120
|
prefect/client/schemas/responses.py,sha256=Zdcx7jlIaluEa2uYIOE5mK1HsJvWPErRAcaWM20oY_I,17336
|
119
121
|
prefect/client/schemas/schedules.py,sha256=sxLFk0SmFY7X1Y9R9HyGDqOS3U5NINBWTciUU7vTTic,14836
|
120
122
|
prefect/client/schemas/sorting.py,sha256=L-2Mx-igZPtsUoRUguTcG3nIEstMEMPD97NwPM2Ox5s,2579
|
@@ -138,7 +140,7 @@ prefect/deployments/__init__.py,sha256=_wb7NxDKhq11z9MjYsPckmT3o6MRhGLRgCV9TmvYt
|
|
138
140
|
prefect/deployments/base.py,sha256=YY7g8MN6qzjNEjEA8wQXPxCrd47WnACIUeSRtI4nrEk,11849
|
139
141
|
prefect/deployments/deployments.py,sha256=K3Rgnpjxo_T8I8LMwlq24OKqZiZBTE8-YnPg-YGUStM,171
|
140
142
|
prefect/deployments/flow_runs.py,sha256=NYe-Bphsy6ENLqSSfywQuX5cRZt-uVgzqGmOsf3Sqw4,7643
|
141
|
-
prefect/deployments/runner.py,sha256=
|
143
|
+
prefect/deployments/runner.py,sha256=kNEPRbcMMtJi4ahtMwqL5SZto63Mfl8UIW3Omp8VKVY,56696
|
142
144
|
prefect/deployments/schedules.py,sha256=2eL1-w8qXtwKVkgfUK7cuamwpKK3X6tN1QYTDa_gWxU,2190
|
143
145
|
prefect/deployments/steps/__init__.py,sha256=Dlz9VqMRyG1Gal8dj8vfGpPr0LyQhZdvcciozkK8WoY,206
|
144
146
|
prefect/deployments/steps/core.py,sha256=ulSgBFSx1lhBt1fP-UxebrernkumBDlympR6IPffV1g,6900
|
@@ -149,16 +151,16 @@ prefect/docker/docker_image.py,sha256=bR_pEq5-FDxlwTj8CP_7nwZ_MiGK6KxIi8v7DRjy1K
|
|
149
151
|
prefect/events/__init__.py,sha256=GtKl2bE--pJduTxelH2xy7SadlLJmmis8WR1EYixhuA,2094
|
150
152
|
prefect/events/actions.py,sha256=A7jS8bo4zWGnrt3QfSoQs0uYC1xfKXio3IfU0XtTb5s,9129
|
151
153
|
prefect/events/clients.py,sha256=e3A6cKxi-fG2TkFedaRuC472hIM3VgaVxI6mcPP41kY,27613
|
152
|
-
prefect/events/filters.py,sha256=
|
154
|
+
prefect/events/filters.py,sha256=tnAbA4Z0Npem8Jbin-qqe38K_4a-4YdpU-Oc4u8Y95Q,8697
|
153
155
|
prefect/events/related.py,sha256=CTeexYUmmA93V4gsR33GIFmw-SS-X_ouOpRg-oeq-BU,6672
|
154
156
|
prefect/events/utilities.py,sha256=ww34bTMENCNwcp6RhhgzG0KgXOvKGe0MKmBdSJ8NpZY,3043
|
155
157
|
prefect/events/worker.py,sha256=HjbibR0_J1W1nnNMZDFTXAbB0cl_cFGaFI87DvNGcnI,4557
|
156
158
|
prefect/events/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
157
159
|
prefect/events/cli/automations.py,sha256=uCX3NnypoI25TmyAoyL6qYhanWjZbJ2watwv1nfQMxs,11513
|
158
160
|
prefect/events/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
159
|
-
prefect/events/schemas/automations.py,sha256=
|
161
|
+
prefect/events/schemas/automations.py,sha256=UHrV572HB5Icb1LuOUkMIdDrMDsxW1GhIiST-qzUlFs,14640
|
160
162
|
prefect/events/schemas/deployment_triggers.py,sha256=OX9g9eHe0nqJ3PtVEzqs9Ub2LaOHMA4afLZSvSukKGU,3191
|
161
|
-
prefect/events/schemas/events.py,sha256=
|
163
|
+
prefect/events/schemas/events.py,sha256=r8sSx2Q1A0KIofnZR_Bri7YT1wzXKV3YS-LnxpeIXHE,9270
|
162
164
|
prefect/events/schemas/labelling.py,sha256=bU-XYaHXhI2MEBIHngth96R9D02m8HHb85KNcHZ_1Gc,3073
|
163
165
|
prefect/infrastructure/__init__.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
164
166
|
prefect/infrastructure/base.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
@@ -185,7 +187,7 @@ prefect/logging/loggers.py,sha256=rwFJv0i3dhdKr25XX-xUkQy4Vv4dy18bTy366jrC0OQ,12
|
|
185
187
|
prefect/logging/logging.yml,sha256=tT7gTyC4NmngFSqFkCdHaw7R0GPNPDDsTCGZQByiJAQ,3169
|
186
188
|
prefect/runner/__init__.py,sha256=pQBd9wVrUVUDUFJlgiweKSnbahoBZwqnd2O2jkhrULY,158
|
187
189
|
prefect/runner/_observers.py,sha256=PpyXQL5bjp86AnDFEzcFPS5ayL6ExqcYgyuBMMQCO9Q,2183
|
188
|
-
prefect/runner/runner.py,sha256=
|
190
|
+
prefect/runner/runner.py,sha256=q_3l2awvZATTTgVW3MYiElWHRWw5_ZIliUN9Ltt9d9M,59591
|
189
191
|
prefect/runner/server.py,sha256=YRYFNoYddA9XfiTIYtudxrnD1vCX-PaOLhvyGUOb9AQ,11966
|
190
192
|
prefect/runner/storage.py,sha256=n-65YoEf7KNVInnmMPeP5TVFJOa2zOS8w9en9MHi6uo,31328
|
191
193
|
prefect/runner/submit.py,sha256=qOEj-NChQ6RYFV35hHEVMTklrNmKwaGs2mR78ku9H0o,9474
|
@@ -226,7 +228,7 @@ prefect/server/api/templates.py,sha256=92bLFfcahZUp5PVNTZPjl8uJSDj4ZYRTVdmTzZXkE
|
|
226
228
|
prefect/server/api/validation.py,sha256=HxSNyH8yb_tI-kOfjXESRjJp6WQK6hYWBJsaBxUvY34,14490
|
227
229
|
prefect/server/api/variables.py,sha256=SJaKuqInfQIEdMlJOemptBDN43KLFhlf_u9QwupDu7A,6185
|
228
230
|
prefect/server/api/work_queues.py,sha256=wBcbmkZDaQ5Ddi9wc8tNs6kYG_FdNtYwTCR0VkhPj2o,7588
|
229
|
-
prefect/server/api/workers.py,sha256
|
231
|
+
prefect/server/api/workers.py,sha256=8EVPnGv9wAC3YBWIoUx70OS7zfhRKjoXAAECFWKBMg0,24121
|
230
232
|
prefect/server/api/collections_data/views/aggregate-worker-metadata.json,sha256=f6t13GRkIcLqGYB3OnXluAHEFoSqZM2SQP22vpcu0Mk,79793
|
231
233
|
prefect/server/api/static/prefect-logo-mark-gradient.png,sha256=ylRjJkI_JHCw8VbQasNnXQHwZW-sH-IQiUGSD3aWP1E,73430
|
232
234
|
prefect/server/api/ui/__init__.py,sha256=TCXO4ZUZCqCbm2QoNvWNTErkzWiX2nSACuO-0Tiomvg,93
|
@@ -255,7 +257,7 @@ prefect/settings/models/logging.py,sha256=Sj9GDNr5QMFaP6CN0WJyfpwhpOk4p1yhv45dyQ
|
|
255
257
|
prefect/settings/models/results.py,sha256=VWFplQSSJyc0LXnziw1H5b3N_PDS32QBe_q2MWwYni0,1484
|
256
258
|
prefect/settings/models/root.py,sha256=HpXt_I6T_kJw6QAxez4pCZl8p058etihzJbBNRylN3c,16767
|
257
259
|
prefect/settings/models/runner.py,sha256=rD8OmNLwILmqnGe9YkM1dWKsulx3clYm4LI5N9vD5yM,1991
|
258
|
-
prefect/settings/models/tasks.py,sha256=
|
260
|
+
prefect/settings/models/tasks.py,sha256=Rj3Tl8S04swCZIWgBCdn8sHct0B2IVgfPmM370Muj3E,3672
|
259
261
|
prefect/settings/models/testing.py,sha256=j9YH_WkB14iEzOjUtTmvY978qRSbgCypFSEi_cOs8no,1820
|
260
262
|
prefect/settings/models/worker.py,sha256=zeDU71aR4CEvEOKyH-1jgEyol8XYe29PExjIC6a8Wv0,1378
|
261
263
|
prefect/settings/models/server/__init__.py,sha256=KJmffmlHb8GYnClaeYcerae-IaeNsNMucKKRRS_zG9Q,33
|
@@ -276,9 +278,10 @@ prefect/telemetry/logging.py,sha256=ktIVTXbdZ46v6fUhoHNidFrpvpNJR-Pj-hQ4V9b40W4,
|
|
276
278
|
prefect/telemetry/processors.py,sha256=jw6j6LviOVxw3IBJe7cSjsxFk0zzY43jUmy6C9pcfCE,2272
|
277
279
|
prefect/telemetry/run_telemetry.py,sha256=_FbjiPqPemu4xvZuI2YBPwXeRJ2BcKRJ6qgO4UMzKKE,8571
|
278
280
|
prefect/telemetry/services.py,sha256=DxgNNDTeWNtHBtioX8cjua4IrCbTiJJdYecx-gugg-w,2358
|
279
|
-
prefect/types/__init__.py,sha256=
|
281
|
+
prefect/types/__init__.py,sha256=uZyu9xcaxoNg4T3_GHVyE_dlEXSetCjXpco9oKiJb80,6038
|
280
282
|
prefect/types/_datetime.py,sha256=ZE-4YK5XJuyxnp5pqldZwtIjkxCpxDGnCSfZiTl7-TU,7566
|
281
283
|
prefect/types/entrypoint.py,sha256=2FF03-wLPgtnqR_bKJDB2BsXXINPdu8ptY9ZYEZnXg8,328
|
284
|
+
prefect/types/names.py,sha256=CMMZD928iiod2UvB0qrsfXEBC5jj_bO0ge1fFXcrtgM,3450
|
282
285
|
prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
283
286
|
prefect/utilities/_ast.py,sha256=sgEPUWElih-3cp4PoAy1IOyPtu8E27lL0Dldf3ijnYY,4905
|
284
287
|
prefect/utilities/_deprecated.py,sha256=b3pqRSoFANdVJAc8TJkygBcP-VjZtLJUxVIWC7kwspI,1303
|
@@ -286,7 +289,7 @@ prefect/utilities/_engine.py,sha256=9GW4X1lyAbmPwCuXXIubVJ7Z0DMT3dykkEUtp9tm5hI,
|
|
286
289
|
prefect/utilities/_git.py,sha256=bPYWQdr9xvH0BqxR1ll1RkaSb3x0vhwylhYD5EilkKU,863
|
287
290
|
prefect/utilities/annotations.py,sha256=0Elqgq6LR7pQqezNqT5wb6U_0e2pDO_zx6VseVL6kL8,4396
|
288
291
|
prefect/utilities/asyncutils.py,sha256=xcfeNym2j3WH4gKXznON2hI1PpUTcwr_BGc16IQS3C4,19789
|
289
|
-
prefect/utilities/callables.py,sha256=
|
292
|
+
prefect/utilities/callables.py,sha256=IaL-RBlrxmP7_zwwLNb2-F_Ht3o4KXUr6Pi2eVCH4rk,25973
|
290
293
|
prefect/utilities/collections.py,sha256=c3nPLPWqIZQQdNuHs_nrbQJwuhQSX4ivUl-h9LtzXto,23243
|
291
294
|
prefect/utilities/compat.py,sha256=nnPA3lf2f4Y-l645tYFFNmj5NDPaYvjqa9pbGKZ3WKE,582
|
292
295
|
prefect/utilities/context.py,sha256=23SDMgdt07SjmB1qShiykHfGgiv55NBzdbMXM3fE9CI,1447
|
@@ -313,13 +316,13 @@ prefect/utilities/schema_tools/__init__.py,sha256=At3rMHd2g_Em2P3_dFQlFgqR_EpBwr
|
|
313
316
|
prefect/utilities/schema_tools/hydration.py,sha256=NkRhWkNfxxFmVGhNDfmxdK_xeKaEhs3a42q83Sg9cT4,9436
|
314
317
|
prefect/utilities/schema_tools/validation.py,sha256=Wix26IVR-ZJ32-6MX2pHhrwm3reB-Q4iB6_phn85OKE,10743
|
315
318
|
prefect/workers/__init__.py,sha256=EaM1F0RZ-XIJaGeTKLsXDnfOPHzVWk5bk0_c4BVS44M,64
|
316
|
-
prefect/workers/base.py,sha256=
|
319
|
+
prefect/workers/base.py,sha256=_Puzm_f2Q7YLI89G_u9oM3esvwUWIKZ3fpfPqi-KMQk,62358
|
317
320
|
prefect/workers/block.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
318
321
|
prefect/workers/cloud.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
319
322
|
prefect/workers/process.py,sha256=Yi5D0U5AQ51wHT86GdwtImXSefe0gJf3LGq4r4z9zwM,11090
|
320
323
|
prefect/workers/server.py,sha256=2pmVeJZiVbEK02SO6BEZaBIvHMsn6G8LzjW8BXyiTtk,1952
|
321
324
|
prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
|
322
|
-
prefect_client-3.4.
|
323
|
-
prefect_client-3.4.
|
324
|
-
prefect_client-3.4.
|
325
|
-
prefect_client-3.4.
|
325
|
+
prefect_client-3.4.2.dist-info/METADATA,sha256=BNT5egaQL0_QtUJMF2NUHOKAA7tQAavX84sq1_ex694,7467
|
326
|
+
prefect_client-3.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
327
|
+
prefect_client-3.4.2.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
|
328
|
+
prefect_client-3.4.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|