sqlmesh 0.192.1.dev1__py3-none-any.whl → 0.192.1.dev3__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.
- sqlmesh/_version.py +2 -2
- sqlmesh/core/context.py +20 -2
- sqlmesh/core/plan/builder.py +53 -4
- sqlmesh/core/plan/definition.py +13 -5
- sqlmesh/core/snapshot/definition.py +6 -1
- sqlmesh/utils/date.py +22 -12
- {sqlmesh-0.192.1.dev1.dist-info → sqlmesh-0.192.1.dev3.dist-info}/METADATA +1 -1
- {sqlmesh-0.192.1.dev1.dist-info → sqlmesh-0.192.1.dev3.dist-info}/RECORD +12 -12
- {sqlmesh-0.192.1.dev1.dist-info → sqlmesh-0.192.1.dev3.dist-info}/WHEEL +0 -0
- {sqlmesh-0.192.1.dev1.dist-info → sqlmesh-0.192.1.dev3.dist-info}/entry_points.txt +0 -0
- {sqlmesh-0.192.1.dev1.dist-info → sqlmesh-0.192.1.dev3.dist-info}/licenses/LICENSE +0 -0
- {sqlmesh-0.192.1.dev1.dist-info → sqlmesh-0.192.1.dev3.dist-info}/top_level.txt +0 -0
sqlmesh/_version.py
CHANGED
|
@@ -17,5 +17,5 @@ __version__: str
|
|
|
17
17
|
__version_tuple__: VERSION_TUPLE
|
|
18
18
|
version_tuple: VERSION_TUPLE
|
|
19
19
|
|
|
20
|
-
__version__ = version = '0.192.1.
|
|
21
|
-
__version_tuple__ = version_tuple = (0, 192, 1, '
|
|
20
|
+
__version__ = version = '0.192.1.dev3'
|
|
21
|
+
__version_tuple__ = version_tuple = (0, 192, 1, 'dev3')
|
sqlmesh/core/context.py
CHANGED
|
@@ -120,7 +120,14 @@ from sqlmesh.core.user import User
|
|
|
120
120
|
from sqlmesh.utils import UniqueKeyDict, Verbosity
|
|
121
121
|
from sqlmesh.utils.concurrency import concurrent_apply_to_values
|
|
122
122
|
from sqlmesh.utils.dag import DAG
|
|
123
|
-
from sqlmesh.utils.date import
|
|
123
|
+
from sqlmesh.utils.date import (
|
|
124
|
+
TimeLike,
|
|
125
|
+
now_ds,
|
|
126
|
+
to_timestamp,
|
|
127
|
+
format_tz_datetime,
|
|
128
|
+
now_timestamp,
|
|
129
|
+
now,
|
|
130
|
+
)
|
|
124
131
|
from sqlmesh.utils.errors import (
|
|
125
132
|
CircuitBreakerError,
|
|
126
133
|
ConfigError,
|
|
@@ -1513,7 +1520,11 @@ class GenericContext(BaseContext, t.Generic[C]):
|
|
|
1513
1520
|
# If no end date is specified, use the max interval end from prod
|
|
1514
1521
|
# to prevent unintended evaluation of the entire DAG.
|
|
1515
1522
|
default_start, default_end = self._get_plan_default_start_end(
|
|
1516
|
-
snapshots,
|
|
1523
|
+
snapshots,
|
|
1524
|
+
max_interval_end_per_model,
|
|
1525
|
+
backfill_models,
|
|
1526
|
+
modified_model_names,
|
|
1527
|
+
execution_time or now(),
|
|
1517
1528
|
)
|
|
1518
1529
|
|
|
1519
1530
|
# Refresh snapshot intervals to ensure that they are up to date with values reflected in the max_interval_end_per_model.
|
|
@@ -2818,6 +2829,7 @@ class GenericContext(BaseContext, t.Generic[C]):
|
|
|
2818
2829
|
max_interval_end_per_model: t.Dict[str, int],
|
|
2819
2830
|
backfill_models: t.Optional[t.Set[str]],
|
|
2820
2831
|
modified_model_names: t.Set[str],
|
|
2832
|
+
execution_time: t.Optional[TimeLike] = None,
|
|
2821
2833
|
) -> t.Tuple[t.Optional[int], t.Optional[int]]:
|
|
2822
2834
|
if not max_interval_end_per_model:
|
|
2823
2835
|
return None, None
|
|
@@ -2843,6 +2855,12 @@ class GenericContext(BaseContext, t.Generic[C]):
|
|
|
2843
2855
|
)
|
|
2844
2856
|
),
|
|
2845
2857
|
)
|
|
2858
|
+
|
|
2859
|
+
if execution_time and to_timestamp(default_end) > to_timestamp(execution_time):
|
|
2860
|
+
# the end date can't be in the future, which can happen if a specific `execution_time` is set and prod intervals
|
|
2861
|
+
# are newer than it
|
|
2862
|
+
default_end = to_timestamp(execution_time)
|
|
2863
|
+
|
|
2846
2864
|
return default_start, default_end
|
|
2847
2865
|
|
|
2848
2866
|
def _get_max_interval_end_per_model(
|
sqlmesh/core/plan/builder.py
CHANGED
|
@@ -41,6 +41,8 @@ from sqlmesh.utils.date import (
|
|
|
41
41
|
to_datetime,
|
|
42
42
|
yesterday_ds,
|
|
43
43
|
to_timestamp,
|
|
44
|
+
time_like_to_str,
|
|
45
|
+
is_relative,
|
|
44
46
|
)
|
|
45
47
|
from sqlmesh.utils.errors import NoChangesPlanError, PlanError
|
|
46
48
|
|
|
@@ -55,6 +57,7 @@ class PlanBuilder:
|
|
|
55
57
|
start: The start time to backfill data.
|
|
56
58
|
end: The end time to backfill data.
|
|
57
59
|
execution_time: The date/time time reference to use for execution time. Defaults to now.
|
|
60
|
+
If :start or :end are relative time expressions, they are interpreted as relative to the :execution_time
|
|
58
61
|
apply: The callback to apply the plan.
|
|
59
62
|
restate_models: A list of models for which the data should be restated for the time range
|
|
60
63
|
specified in this plan. Note: models defined outside SQLMesh (external) won't be a part
|
|
@@ -137,7 +140,14 @@ class PlanBuilder:
|
|
|
137
140
|
self._include_unmodified = include_unmodified
|
|
138
141
|
self._restate_models = set(restate_models) if restate_models is not None else None
|
|
139
142
|
self._effective_from = effective_from
|
|
143
|
+
|
|
144
|
+
# note: this deliberately doesnt default to now() here.
|
|
145
|
+
# There may be an significant delay between the PlanBuilder producing a Plan and the Plan actually being run
|
|
146
|
+
# so if execution_time=None is passed to the PlanBuilder, then the resulting Plan should also have execution_time=None
|
|
147
|
+
# in order to prevent the Plan that was intended to run "as at now" from having "now" fixed to some time in the past
|
|
148
|
+
# ref: https://github.com/TobikoData/sqlmesh/pull/4702#discussion_r2140696156
|
|
140
149
|
self._execution_time = execution_time
|
|
150
|
+
|
|
141
151
|
self._backfill_models = backfill_models
|
|
142
152
|
self._end = end or default_end
|
|
143
153
|
self._apply = apply
|
|
@@ -172,6 +182,26 @@ class PlanBuilder:
|
|
|
172
182
|
"""Indicates whether this plan allows to set the start and end dates."""
|
|
173
183
|
return self._is_dev or bool(self._restate_models)
|
|
174
184
|
|
|
185
|
+
@property
|
|
186
|
+
def start(self) -> t.Optional[TimeLike]:
|
|
187
|
+
if self._start and is_relative(self._start):
|
|
188
|
+
# only do this for relative expressions otherwise inclusive date strings like '2020-01-01' can be turned into exclusive timestamps eg '2020-01-01 00:00:00'
|
|
189
|
+
return to_datetime(self._start, relative_base=to_datetime(self.execution_time))
|
|
190
|
+
return self._start
|
|
191
|
+
|
|
192
|
+
@property
|
|
193
|
+
def end(self) -> t.Optional[TimeLike]:
|
|
194
|
+
if self._end and is_relative(self._end):
|
|
195
|
+
# only do this for relative expressions otherwise inclusive date strings like '2020-01-01' can be turned into exclusive timestamps eg '2020-01-01 00:00:00'
|
|
196
|
+
return to_datetime(self._end, relative_base=to_datetime(self.execution_time))
|
|
197
|
+
return self._end
|
|
198
|
+
|
|
199
|
+
@cached_property
|
|
200
|
+
def execution_time(self) -> TimeLike:
|
|
201
|
+
# this is cached to return a stable value from now() in the places where the execution time matters for resolving relative date strings
|
|
202
|
+
# during the plan building process
|
|
203
|
+
return self._execution_time or now()
|
|
204
|
+
|
|
175
205
|
def set_start(self, new_start: TimeLike) -> PlanBuilder:
|
|
176
206
|
self._start = new_start
|
|
177
207
|
self.override_start = True
|
|
@@ -256,7 +286,8 @@ class PlanBuilder:
|
|
|
256
286
|
)
|
|
257
287
|
|
|
258
288
|
restatements = self._build_restatements(
|
|
259
|
-
dag,
|
|
289
|
+
dag,
|
|
290
|
+
earliest_interval_start(self._context_diff.snapshots.values(), self.execution_time),
|
|
260
291
|
)
|
|
261
292
|
models_to_backfill = self._build_models_to_backfill(dag, restatements)
|
|
262
293
|
|
|
@@ -266,11 +297,17 @@ class PlanBuilder:
|
|
|
266
297
|
# model should be ignored.
|
|
267
298
|
interval_end_per_model = None
|
|
268
299
|
|
|
300
|
+
# this deliberately uses the passed in self._execution_time and not self.execution_time cached property
|
|
301
|
+
# the reason is because that there can be a delay between the Plan being built and the Plan being actually run,
|
|
302
|
+
# so this ensures that an _execution_time of None can be propagated to the Plan and thus be re-resolved to
|
|
303
|
+
# the current timestamp of when the Plan is eventually run
|
|
304
|
+
plan_execution_time = self._execution_time
|
|
305
|
+
|
|
269
306
|
plan = Plan(
|
|
270
307
|
context_diff=self._context_diff,
|
|
271
308
|
plan_id=self._plan_id,
|
|
272
|
-
provided_start=self.
|
|
273
|
-
provided_end=self.
|
|
309
|
+
provided_start=self.start,
|
|
310
|
+
provided_end=self.end,
|
|
274
311
|
is_dev=self._is_dev,
|
|
275
312
|
skip_backfill=self._skip_backfill,
|
|
276
313
|
empty_backfill=self._empty_backfill,
|
|
@@ -289,7 +326,7 @@ class PlanBuilder:
|
|
|
289
326
|
selected_models_to_backfill=self._backfill_models,
|
|
290
327
|
models_to_backfill=models_to_backfill,
|
|
291
328
|
effective_from=self._effective_from,
|
|
292
|
-
execution_time=
|
|
329
|
+
execution_time=plan_execution_time,
|
|
293
330
|
end_bounded=self._end_bounded,
|
|
294
331
|
ensure_finalized_snapshots=self._ensure_finalized_snapshots,
|
|
295
332
|
user_provided_flags=self._user_provided_flags,
|
|
@@ -739,6 +776,18 @@ class PlanBuilder:
|
|
|
739
776
|
"The start and end dates can't be set for a production plan without restatements."
|
|
740
777
|
)
|
|
741
778
|
|
|
779
|
+
if (start := self.start) and (end := self.end):
|
|
780
|
+
if to_datetime(start) > to_datetime(end):
|
|
781
|
+
raise PlanError(
|
|
782
|
+
f"Plan end date: '{time_like_to_str(end)}' must be after the plan start date: '{time_like_to_str(start)}'"
|
|
783
|
+
)
|
|
784
|
+
|
|
785
|
+
if end := self.end:
|
|
786
|
+
if to_datetime(end) > to_datetime(self.execution_time):
|
|
787
|
+
raise PlanError(
|
|
788
|
+
f"Plan end date: '{time_like_to_str(end)}' cannot be in the future (execution time: '{time_like_to_str(self.execution_time)}')"
|
|
789
|
+
)
|
|
790
|
+
|
|
742
791
|
def _ensure_no_forward_only_revert(self) -> None:
|
|
743
792
|
"""Ensures that a previously superseded breaking / non-breaking snapshot is not being
|
|
744
793
|
used again to replace an existing forward-only snapshot with the same version.
|
sqlmesh/core/plan/definition.py
CHANGED
|
@@ -5,6 +5,7 @@ from dataclasses import dataclass
|
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from functools import cached_property
|
|
8
|
+
from pydantic import Field
|
|
8
9
|
|
|
9
10
|
from sqlmesh.core.context_diff import ContextDiff
|
|
10
11
|
from sqlmesh.core.environment import Environment, EnvironmentNamingInfo, EnvironmentStatements
|
|
@@ -63,7 +64,7 @@ class Plan(PydanticModel, frozen=True):
|
|
|
63
64
|
models_to_backfill: t.Optional[t.Set[str]] = None
|
|
64
65
|
"""All models that should be backfilled as part of this plan."""
|
|
65
66
|
effective_from: t.Optional[TimeLike] = None
|
|
66
|
-
|
|
67
|
+
execution_time_: t.Optional[TimeLike] = Field(default=None, alias="execution_time")
|
|
67
68
|
|
|
68
69
|
user_provided_flags: t.Optional[t.Dict[str, UserProvidedFlags]] = None
|
|
69
70
|
|
|
@@ -80,7 +81,12 @@ class Plan(PydanticModel, frozen=True):
|
|
|
80
81
|
|
|
81
82
|
@cached_property
|
|
82
83
|
def end(self) -> TimeLike:
|
|
83
|
-
return self.provided_end or
|
|
84
|
+
return self.provided_end or self.execution_time
|
|
85
|
+
|
|
86
|
+
@cached_property
|
|
87
|
+
def execution_time(self) -> TimeLike:
|
|
88
|
+
# note: property is cached so that it returns a consistent timestamp for now()
|
|
89
|
+
return self.execution_time_ or now()
|
|
84
90
|
|
|
85
91
|
@property
|
|
86
92
|
def previous_plan_id(self) -> t.Optional[str]:
|
|
@@ -271,7 +277,7 @@ class Plan(PydanticModel, frozen=True):
|
|
|
271
277
|
|
|
272
278
|
@cached_property
|
|
273
279
|
def _earliest_interval_start(self) -> datetime:
|
|
274
|
-
return earliest_interval_start(self.snapshots.values())
|
|
280
|
+
return earliest_interval_start(self.snapshots.values(), self.execution_time)
|
|
275
281
|
|
|
276
282
|
|
|
277
283
|
class EvaluatablePlan(PydanticModel):
|
|
@@ -345,8 +351,10 @@ class SnapshotIntervals:
|
|
|
345
351
|
return format_intervals(self.merged_intervals, unit)
|
|
346
352
|
|
|
347
353
|
|
|
348
|
-
def earliest_interval_start(
|
|
349
|
-
|
|
354
|
+
def earliest_interval_start(
|
|
355
|
+
snapshots: t.Collection[Snapshot], execution_time: t.Optional[TimeLike] = None
|
|
356
|
+
) -> datetime:
|
|
357
|
+
earliest_start = earliest_start_date(snapshots, relative_to=execution_time)
|
|
350
358
|
earliest_interval_starts = [s.intervals[0][0] for s in snapshots if s.intervals]
|
|
351
359
|
return (
|
|
352
360
|
min(earliest_start, to_datetime(min(earliest_interval_starts)))
|
|
@@ -1995,7 +1995,12 @@ def earliest_start_date(
|
|
|
1995
1995
|
start_date(snapshot, snapshots, cache=cache, relative_to=relative_to)
|
|
1996
1996
|
for snapshot in snapshots.values()
|
|
1997
1997
|
)
|
|
1998
|
-
|
|
1998
|
+
|
|
1999
|
+
relative_base = None
|
|
2000
|
+
if relative_to is not None:
|
|
2001
|
+
relative_base = to_datetime(relative_to)
|
|
2002
|
+
|
|
2003
|
+
return yesterday(relative_base=relative_base)
|
|
1999
2004
|
|
|
2000
2005
|
|
|
2001
2006
|
def start_date(
|
sqlmesh/utils/date.py
CHANGED
|
@@ -87,34 +87,34 @@ def now_ds() -> str:
|
|
|
87
87
|
return to_ds(now())
|
|
88
88
|
|
|
89
89
|
|
|
90
|
-
def yesterday() -> datetime:
|
|
90
|
+
def yesterday(relative_base: t.Optional[datetime] = None) -> datetime:
|
|
91
91
|
"""
|
|
92
92
|
Yesterday utc datetime.
|
|
93
93
|
|
|
94
94
|
Returns:
|
|
95
95
|
A datetime object with tz utc representing yesterday's date
|
|
96
96
|
"""
|
|
97
|
-
return to_datetime("yesterday")
|
|
97
|
+
return to_datetime("yesterday", relative_base=relative_base)
|
|
98
98
|
|
|
99
99
|
|
|
100
|
-
def yesterday_ds() -> str:
|
|
100
|
+
def yesterday_ds(relative_base: t.Optional[datetime] = None) -> str:
|
|
101
101
|
"""
|
|
102
102
|
Yesterday utc ds.
|
|
103
103
|
|
|
104
104
|
Returns:
|
|
105
105
|
Yesterday's ds string.
|
|
106
106
|
"""
|
|
107
|
-
return to_ds("yesterday")
|
|
107
|
+
return to_ds("yesterday", relative_base=relative_base)
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
def yesterday_timestamp() -> int:
|
|
110
|
+
def yesterday_timestamp(relative_base: t.Optional[datetime] = None) -> int:
|
|
111
111
|
"""
|
|
112
112
|
Yesterday utc timestamp.
|
|
113
113
|
|
|
114
114
|
Returns:
|
|
115
115
|
UTC epoch millis timestamp of yesterday
|
|
116
116
|
"""
|
|
117
|
-
return to_timestamp(yesterday())
|
|
117
|
+
return to_timestamp(yesterday(relative_base=relative_base))
|
|
118
118
|
|
|
119
119
|
|
|
120
120
|
def to_timestamp(
|
|
@@ -265,19 +265,19 @@ def date_dict(
|
|
|
265
265
|
return kwargs
|
|
266
266
|
|
|
267
267
|
|
|
268
|
-
def to_ds(obj: TimeLike) -> str:
|
|
268
|
+
def to_ds(obj: TimeLike, relative_base: t.Optional[datetime] = None) -> str:
|
|
269
269
|
"""Converts a TimeLike object into YYYY-MM-DD formatted string."""
|
|
270
|
-
return to_ts(obj)[0:10]
|
|
270
|
+
return to_ts(obj, relative_base=relative_base)[0:10]
|
|
271
271
|
|
|
272
272
|
|
|
273
|
-
def to_ts(obj: TimeLike) -> str:
|
|
273
|
+
def to_ts(obj: TimeLike, relative_base: t.Optional[datetime] = None) -> str:
|
|
274
274
|
"""Converts a TimeLike object into YYYY-MM-DD HH:MM:SS formatted string."""
|
|
275
|
-
return to_datetime(obj).replace(tzinfo=None).isoformat(sep=" ")
|
|
275
|
+
return to_datetime(obj, relative_base=relative_base).replace(tzinfo=None).isoformat(sep=" ")
|
|
276
276
|
|
|
277
277
|
|
|
278
|
-
def to_tstz(obj: TimeLike) -> str:
|
|
278
|
+
def to_tstz(obj: TimeLike, relative_base: t.Optional[datetime] = None) -> str:
|
|
279
279
|
"""Converts a TimeLike object into YYYY-MM-DD HH:MM:SS+00:00 formatted string."""
|
|
280
|
-
return to_datetime(obj).isoformat(sep=" ")
|
|
280
|
+
return to_datetime(obj, relative_base=relative_base).isoformat(sep=" ")
|
|
281
281
|
|
|
282
282
|
|
|
283
283
|
def is_date(obj: TimeLike) -> bool:
|
|
@@ -373,6 +373,16 @@ def is_categorical_relative_expression(expression: str) -> bool:
|
|
|
373
373
|
return not any(k in TIME_UNITS for k in grain_kwargs)
|
|
374
374
|
|
|
375
375
|
|
|
376
|
+
def is_relative(value: TimeLike) -> bool:
|
|
377
|
+
"""
|
|
378
|
+
Tests a TimeLike object to see if it is a relative expression, eg '1 week ago' as opposed to an absolute timestamp
|
|
379
|
+
"""
|
|
380
|
+
if isinstance(value, str):
|
|
381
|
+
return is_categorical_relative_expression(value)
|
|
382
|
+
|
|
383
|
+
return False
|
|
384
|
+
|
|
385
|
+
|
|
376
386
|
def to_time_column(
|
|
377
387
|
time_column: t.Union[TimeLike, exp.Null],
|
|
378
388
|
time_column_type: exp.DataType,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
|
|
2
|
-
sqlmesh/_version.py,sha256=
|
|
2
|
+
sqlmesh/_version.py,sha256=cV8Arntfzc4Guzu7jJhcAaDEg_RuL_QOn5RL7Q8P9hA,528
|
|
3
3
|
sqlmesh/magics.py,sha256=gjzoxREb1XT8Yho_PQMlMqhhkLq_sEfBM8S3PTgxvWE,40337
|
|
4
4
|
sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -13,7 +13,7 @@ sqlmesh/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
13
13
|
sqlmesh/core/_typing.py,sha256=e1f7xO2aZCy38M_3VoDy-XI3shyd99-IFctgIFSgXWM,497
|
|
14
14
|
sqlmesh/core/console.py,sha256=x7qWETjHgu8ZpMtfW8V3bGKByT4nZXDjgtO6xmvAb-I,151143
|
|
15
15
|
sqlmesh/core/constants.py,sha256=oqt6zjepUhQoWlgapKn_HpG7Pu9mrFwepdX5caNfJUI,2499
|
|
16
|
-
sqlmesh/core/context.py,sha256=
|
|
16
|
+
sqlmesh/core/context.py,sha256=1CYBKpVA3TRvglhWXxJuxoy3iAcukWc-QtyjHmHbxKg,118417
|
|
17
17
|
sqlmesh/core/context_diff.py,sha256=TCzM8egBE35DskpouOB-GQM2Qf5iUHWbRgiB5yZ6tzg,21552
|
|
18
18
|
sqlmesh/core/dialect.py,sha256=93cXYVuNoZ9CvJNTVn2Yz7WDOdHINwVXflbn0eZ-p14,49764
|
|
19
19
|
sqlmesh/core/environment.py,sha256=bNj-JCG_l13dwrp--YPIuGNsuWLTMLcFA5sY8IazVK8,12917
|
|
@@ -94,15 +94,15 @@ sqlmesh/core/model/meta.py,sha256=D9InI9M2-IXeb34vkXNQSLALL8xVXjZ_LXwI-Tqxm7I,21
|
|
|
94
94
|
sqlmesh/core/model/schema.py,sha256=OClbAeA8LpW-IiSiLT_TlDWkEqmIIvSk0GXq8SWI-GQ,3443
|
|
95
95
|
sqlmesh/core/model/seed.py,sha256=a0M-1zY1gOkN5ph2GQyataEdBSCtq50YjeFk2LyvInI,5058
|
|
96
96
|
sqlmesh/core/plan/__init__.py,sha256=aieod5xxcJJl0m7Xp9BXCwwrYnhMbeltGoNZGjwoVTA,521
|
|
97
|
-
sqlmesh/core/plan/builder.py,sha256=
|
|
98
|
-
sqlmesh/core/plan/definition.py,sha256
|
|
97
|
+
sqlmesh/core/plan/builder.py,sha256=OS6igFQvPRLwIxuYT4WYcuWnuSrPfCQArUA6ohxFnZw,41341
|
|
98
|
+
sqlmesh/core/plan/definition.py,sha256=-jAO5EWvZdmn8jU7bMFJcprBPdfTVhSRgAvBPZ6kqBg,13613
|
|
99
99
|
sqlmesh/core/plan/evaluator.py,sha256=7dPtjxc4SuKf9fHsMDwaGsprlXmhcoKi0N6Q1N8eFY4,27009
|
|
100
100
|
sqlmesh/core/plan/explainer.py,sha256=LAeboOuHc-gug-9C34rHn9yrsyCyNTeCJHU95WftAxc,11238
|
|
101
101
|
sqlmesh/core/plan/stages.py,sha256=AIBzEji7OorFx9B0Hm50E6h8zWIGSuLkoVWqIhq9AVw,10911
|
|
102
102
|
sqlmesh/core/snapshot/__init__.py,sha256=Z5HTetNCZGoKF1WAKXk4LWL9dc8EC8lwS2O4TtoBmt4,1317
|
|
103
103
|
sqlmesh/core/snapshot/cache.py,sha256=bgqCR2hyf6r2A_8QP1EnXFK25gDX37-Zg0YeMuETWxg,3934
|
|
104
104
|
sqlmesh/core/snapshot/categorizer.py,sha256=qGG5870mu1jR2whKisSBH_GFbsyh96RnzJDgkN7DV9g,2482
|
|
105
|
-
sqlmesh/core/snapshot/definition.py,sha256
|
|
105
|
+
sqlmesh/core/snapshot/definition.py,sha256=-cMc1jkJQox3BCoW6bk8qtSgMivr6nuKcGpKKkx4x8A,84216
|
|
106
106
|
sqlmesh/core/snapshot/evaluator.py,sha256=QqFcvXcr3NMHJtWy2wBRfDIph9EKPGpHaPg-36YjbDs,89484
|
|
107
107
|
sqlmesh/core/state_sync/__init__.py,sha256=B60xj-_Xk-4jas3UphLvwkuf04G-9AyGckcblXE0aRg,869
|
|
108
108
|
sqlmesh/core/state_sync/base.py,sha256=GaSyUg2TgDZFZrlLP5QF0Wjwl47KuIj1D3NSZSjL12c,18346
|
|
@@ -262,7 +262,7 @@ sqlmesh/utils/connection_pool.py,sha256=To1zr9d5MQOZ5im09jLQKO4DFmfzH6s_q75cEa1y
|
|
|
262
262
|
sqlmesh/utils/conversions.py,sha256=Ul8u6TzlKzFz_lVrUzFSzmJBKHUXOYe2e-xmkMXV084,406
|
|
263
263
|
sqlmesh/utils/cron.py,sha256=mHjXgrsD10Nq-XyRW3OK7eC5Y3KvDc-DitTQyji6Hjg,1828
|
|
264
264
|
sqlmesh/utils/dag.py,sha256=L_jwKf81wCySmt1TFs4vEKsrIHSOPTBhptlmv1bsSSg,7025
|
|
265
|
-
sqlmesh/utils/date.py,sha256=
|
|
265
|
+
sqlmesh/utils/date.py,sha256=xSX3HX3pGPg1-if_Ug11zqE1vg06cbKykeKzDKIxYLs,16133
|
|
266
266
|
sqlmesh/utils/errors.py,sha256=HtpLcs1IN0aq65G372flV9kqqJUULLC3Ci7wvgoBANk,5392
|
|
267
267
|
sqlmesh/utils/git.py,sha256=v1MD4Zwn52UBn_tTfoKn8SAPJVGC6SEFrJ4WEJFbgF0,1868
|
|
268
268
|
sqlmesh/utils/hashing.py,sha256=4Bi0NvRctBHzg58btNxXwSNgcvj8doIVVvOjJ40mHBg,512
|
|
@@ -275,7 +275,7 @@ sqlmesh/utils/pydantic.py,sha256=I898jAFqa3qU6lG2uPpRebVFncOUo8ZrLWM_R3K3DHU,116
|
|
|
275
275
|
sqlmesh/utils/rich.py,sha256=xNZyPCqEc4TAlJlsEthg-5eYUWpaizz0QjBzO7a1Yv4,1509
|
|
276
276
|
sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
|
|
277
277
|
sqlmesh/utils/yaml.py,sha256=np-WVcwmwsKghCgAj1OBBMsK1SXSRn4wR-H37cGiFr8,2282
|
|
278
|
-
sqlmesh-0.192.1.
|
|
278
|
+
sqlmesh-0.192.1.dev3.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
|
|
279
279
|
web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
280
280
|
web/client/dist/index.html,sha256=6S_GSRtPwXyr17YSqAWyZ2Prb2puyUa-UdLiZpFtwe4,5472
|
|
281
281
|
web/client/dist/assets/Audits-Dym5PKHr.js,sha256=UZFlxjPaLxv7b4C494dCxXDNY7918lWEkn2FghwDd4E,1041
|
|
@@ -393,8 +393,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
|
|
|
393
393
|
web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
|
|
394
394
|
web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
|
|
395
395
|
web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
|
|
396
|
-
sqlmesh-0.192.1.
|
|
397
|
-
sqlmesh-0.192.1.
|
|
398
|
-
sqlmesh-0.192.1.
|
|
399
|
-
sqlmesh-0.192.1.
|
|
400
|
-
sqlmesh-0.192.1.
|
|
396
|
+
sqlmesh-0.192.1.dev3.dist-info/METADATA,sha256=UwES126q4fD3I5bR5DYUqIr3QLgApP2NZ-6s1zYYXcw,26690
|
|
397
|
+
sqlmesh-0.192.1.dev3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
398
|
+
sqlmesh-0.192.1.dev3.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
|
|
399
|
+
sqlmesh-0.192.1.dev3.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
|
|
400
|
+
sqlmesh-0.192.1.dev3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|