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 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.dev1'
21
- __version_tuple__ = version_tuple = (0, 192, 1, 'dev1')
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 TimeLike, now_ds, to_timestamp, format_tz_datetime, now_timestamp
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, max_interval_end_per_model, backfill_models, modified_model_names
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(
@@ -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, earliest_interval_start(self._context_diff.snapshots.values())
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._start,
273
- provided_end=self._end,
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=self._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.
@@ -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
- execution_time: t.Optional[TimeLike] = None
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 now()
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(snapshots: t.Collection[Snapshot]) -> datetime:
349
- earliest_start = earliest_start_date(snapshots)
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
- return yesterday()
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.192.1.dev1
3
+ Version: 0.192.1.dev3
4
4
  Summary: Next-generation data transformation framework
5
5
  Author-email: "TobikoData Inc." <engineering@tobikodata.com>
6
6
  License: Apache License
@@ -1,5 +1,5 @@
1
1
  sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
2
- sqlmesh/_version.py,sha256=ebvW5tIkzsttItxSAQXyCRzcbmKqRc08NOQVnwzQCjk,528
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=kWKYcmcdZBQI2bE3bVcsZDCQvO68Kty6uSvIfL2nnC0,117938
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=mZ64P0m4LDtkyy4NoPsz8gqhtezF8Piaw5aj0_YuTjA,38496
98
- sqlmesh/core/plan/definition.py,sha256=pBjQu1P5U-XheWOe9WkSNAZeLzYE7LFgYtq6-4Fx67g,13236
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=PKzBLiQ1yIycGbmslEoQyJEwtfnJHsQuY_sl1xkBcvk,84081
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=7gdCCms1TQktbO4ZwwL-Jt8F2tmSwKsp480pHRJ1uR4,15418
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.dev1.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
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.dev1.dist-info/METADATA,sha256=OJDfgaGJDdg98YD6sIbXwQN5W1lhwD3NcjXoXSEtSz4,26690
397
- sqlmesh-0.192.1.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
398
- sqlmesh-0.192.1.dev1.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
399
- sqlmesh-0.192.1.dev1.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
400
- sqlmesh-0.192.1.dev1.dist-info/RECORD,,
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,,