sqlmesh 0.198.1.dev12__py3-none-any.whl → 0.198.1.dev13__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.198.1.dev12'
21
- __version_tuple__ = version_tuple = (0, 198, 1, 'dev12')
20
+ __version__ = version = '0.198.1.dev13'
21
+ __version_tuple__ = version_tuple = (0, 198, 1, 'dev13')
@@ -627,8 +627,10 @@ class _Model(ModelMeta, frozen=True):
627
627
  {k: _render(v) for k, v in signal.items()} for name, signal in self.signals if not name
628
628
  ]
629
629
 
630
- def render_signal_calls(self) -> t.Dict[str, t.Dict[str, t.Optional[exp.Expression]]]:
631
- return {
630
+ def render_signal_calls(self) -> EvaluatableSignals:
631
+ python_env = self.python_env
632
+ env = prepare_env(python_env)
633
+ signals_to_kwargs = {
632
634
  name: {
633
635
  k: seq_get(self._create_renderer(v).render() or [], 0) for k, v in kwargs.items()
634
636
  }
@@ -636,6 +638,12 @@ class _Model(ModelMeta, frozen=True):
636
638
  if name
637
639
  }
638
640
 
641
+ return EvaluatableSignals(
642
+ signals_to_kwargs=signals_to_kwargs,
643
+ python_env=python_env,
644
+ prepared_python_env=env,
645
+ )
646
+
639
647
  def render_merge_filter(
640
648
  self,
641
649
  *,
@@ -1857,6 +1865,15 @@ class AuditResult(PydanticModel):
1857
1865
  blocking: bool = True
1858
1866
 
1859
1867
 
1868
+ class EvaluatableSignals(PydanticModel):
1869
+ signals_to_kwargs: t.Dict[str, t.Dict[str, t.Optional[exp.Expression]]]
1870
+ """A mapping of signal names to the kwargs passed to the signal."""
1871
+ python_env: t.Dict[str, Executable]
1872
+ """The Python environment that should be used to evaluated the rendered signal calls."""
1873
+ prepared_python_env: t.Dict[str, t.Any]
1874
+ """The prepared Python environment that should be used to evaluated the rendered signal calls."""
1875
+
1876
+
1860
1877
  def _extract_blueprints(blueprints: t.Any, path: Path) -> t.List[t.Any]:
1861
1878
  if not blueprints:
1862
1879
  return [None]
sqlmesh/core/scheduler.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
  import logging
3
3
  import typing as t
4
+ import time
4
5
  from sqlglot import exp
5
6
  from sqlmesh.core import constants as c
6
7
  from sqlmesh.core.console import Console, get_console
@@ -24,6 +25,7 @@ from sqlmesh.core.snapshot import (
24
25
  snapshots_to_dag,
25
26
  Intervals,
26
27
  )
28
+ from sqlmesh.core.snapshot.definition import check_ready_intervals
27
29
  from sqlmesh.core.snapshot.definition import (
28
30
  Interval,
29
31
  expand_range,
@@ -39,7 +41,16 @@ from sqlmesh.utils.date import (
39
41
  to_timestamp,
40
42
  validate_date_range,
41
43
  )
42
- from sqlmesh.utils.errors import AuditError, NodeAuditsErrors, CircuitBreakerError, SQLMeshError
44
+ from sqlmesh.utils.errors import (
45
+ AuditError,
46
+ NodeAuditsErrors,
47
+ CircuitBreakerError,
48
+ SQLMeshError,
49
+ SignalEvalError,
50
+ )
51
+
52
+ if t.TYPE_CHECKING:
53
+ from sqlmesh.core.context import ExecutionContext
43
54
 
44
55
  logger = logging.getLogger(__name__)
45
56
  SnapshotToIntervals = t.Dict[Snapshot, Intervals]
@@ -304,12 +315,11 @@ class Scheduler:
304
315
  default_catalog=self.default_catalog,
305
316
  )
306
317
 
307
- intervals = snapshot.check_ready_intervals(
318
+ intervals = self._check_ready_intervals(
319
+ snapshot,
308
320
  intervals,
309
321
  context,
310
- console=self.console,
311
- default_catalog=self.default_catalog,
312
- environment_naming_info=environment_naming_info,
322
+ environment_naming_info,
313
323
  )
314
324
  unready -= set(intervals)
315
325
 
@@ -709,6 +719,76 @@ class Scheduler:
709
719
 
710
720
  return audit_results
711
721
 
722
+ def _check_ready_intervals(
723
+ self,
724
+ snapshot: Snapshot,
725
+ intervals: Intervals,
726
+ context: ExecutionContext,
727
+ environment_naming_info: EnvironmentNamingInfo,
728
+ ) -> Intervals:
729
+ """Checks if the intervals are ready for evaluation for the given snapshot.
730
+
731
+ This implementation also includes the signal progress tracking.
732
+ Note that this will handle gaps in the provided intervals. The returned intervals
733
+ may introduce new gaps.
734
+
735
+ Args:
736
+ snapshot: The snapshot to check.
737
+ intervals: The intervals to check.
738
+ context: The context to use.
739
+ environment_naming_info: The environment naming info to use.
740
+
741
+ Returns:
742
+ The intervals that are ready for evaluation.
743
+ """
744
+ signals = snapshot.is_model and snapshot.model.render_signal_calls()
745
+
746
+ if not signals:
747
+ return intervals
748
+
749
+ self.console.start_signal_progress(
750
+ snapshot,
751
+ self.default_catalog,
752
+ environment_naming_info or EnvironmentNamingInfo(),
753
+ )
754
+
755
+ for signal_idx, (signal_name, kwargs) in enumerate(signals.signals_to_kwargs.items()):
756
+ # Capture intervals before signal check for display
757
+ intervals_to_check = merge_intervals(intervals)
758
+
759
+ signal_start_ts = time.perf_counter()
760
+
761
+ try:
762
+ intervals = check_ready_intervals(
763
+ signals.prepared_python_env[signal_name],
764
+ intervals,
765
+ context,
766
+ python_env=signals.python_env,
767
+ dialect=snapshot.model.dialect,
768
+ path=snapshot.model._path,
769
+ kwargs=kwargs,
770
+ )
771
+ except SQLMeshError as e:
772
+ raise SignalEvalError(
773
+ f"{e} '{signal_name}' for '{snapshot.model.name}' at {snapshot.model._path}"
774
+ )
775
+
776
+ duration = time.perf_counter() - signal_start_ts
777
+
778
+ self.console.update_signal_progress(
779
+ snapshot=snapshot,
780
+ signal_name=signal_name,
781
+ signal_idx=signal_idx,
782
+ total_signals=len(signals.signals_to_kwargs),
783
+ ready_intervals=merge_intervals(intervals),
784
+ check_intervals=intervals_to_check,
785
+ duration=duration,
786
+ )
787
+
788
+ self.console.stop_signal_progress()
789
+
790
+ return intervals
791
+
712
792
 
713
793
  def merged_missing_intervals(
714
794
  snapshots: t.Collection[Snapshot],
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import sys
4
- import time
5
4
  import typing as t
6
5
  from collections import defaultdict
7
6
  from datetime import datetime, timedelta
@@ -42,8 +41,6 @@ from sqlmesh.utils.date import (
42
41
  )
43
42
  from sqlmesh.utils.errors import SQLMeshError, SignalEvalError
44
43
  from sqlmesh.utils.metaprogramming import (
45
- prepare_env,
46
- print_exception,
47
44
  format_evaluated_code_exception,
48
45
  Executable,
49
46
  )
@@ -51,7 +48,6 @@ from sqlmesh.utils.hashing import hash_data
51
48
  from sqlmesh.utils.pydantic import PydanticModel, field_validator
52
49
 
53
50
  if t.TYPE_CHECKING:
54
- from sqlmesh.core.console import Console
55
51
  from sqlglot.dialects.dialect import DialectType
56
52
  from sqlmesh.core.environment import EnvironmentNamingInfo
57
53
  from sqlmesh.core.context import ExecutionContext
@@ -971,9 +967,6 @@ class Snapshot(PydanticModel, SnapshotInfoMixin):
971
967
  self,
972
968
  intervals: Intervals,
973
969
  context: ExecutionContext,
974
- console: t.Optional[Console] = None,
975
- default_catalog: t.Optional[str] = None,
976
- environment_naming_info: t.Optional[EnvironmentNamingInfo] = None,
977
970
  ) -> Intervals:
978
971
  """Returns a list of intervals that are considered ready by the provided signal.
979
972
 
@@ -981,59 +974,24 @@ class Snapshot(PydanticModel, SnapshotInfoMixin):
981
974
  may introduce new gaps.
982
975
  """
983
976
  signals = self.is_model and self.model.render_signal_calls()
984
-
985
977
  if not signals:
986
978
  return intervals
987
979
 
988
- python_env = self.model.python_env
989
- env = prepare_env(python_env)
990
-
991
- if console:
992
- console.start_signal_progress(
993
- self,
994
- default_catalog,
995
- environment_naming_info or EnvironmentNamingInfo(),
996
- )
997
-
998
- for signal_idx, (signal_name, kwargs) in enumerate(signals.items()):
999
- # Capture intervals before signal check for display
1000
- intervals_to_check = merge_intervals(intervals)
1001
-
1002
- signal_start_ts = time.perf_counter()
1003
-
980
+ for signal_name, kwargs in signals.signals_to_kwargs.items():
1004
981
  try:
1005
- intervals = _check_ready_intervals(
1006
- env[signal_name],
982
+ intervals = check_ready_intervals(
983
+ signals.prepared_python_env[signal_name],
1007
984
  intervals,
1008
985
  context,
1009
- python_env=python_env,
986
+ python_env=signals.python_env,
1010
987
  dialect=self.model.dialect,
1011
988
  path=self.model._path,
1012
989
  kwargs=kwargs,
1013
990
  )
1014
991
  except SQLMeshError as e:
1015
- print_exception(e, python_env)
1016
- raise SQLMeshError(
992
+ raise SignalEvalError(
1017
993
  f"{e} '{signal_name}' for '{self.model.name}' at {self.model._path}"
1018
994
  )
1019
-
1020
- duration = time.perf_counter() - signal_start_ts
1021
-
1022
- if console:
1023
- console.update_signal_progress(
1024
- snapshot=self,
1025
- signal_name=signal_name,
1026
- signal_idx=signal_idx,
1027
- total_signals=len(signals),
1028
- ready_intervals=merge_intervals(intervals),
1029
- check_intervals=intervals_to_check,
1030
- duration=duration,
1031
- )
1032
-
1033
- # Stop signal progress tracking
1034
- if console:
1035
- console.stop_signal_progress()
1036
-
1037
995
  return intervals
1038
996
 
1039
997
  def categorize_as(self, category: SnapshotChangeCategory) -> None:
@@ -2229,7 +2187,7 @@ def _contiguous_intervals(intervals: Intervals) -> t.List[Intervals]:
2229
2187
  return contiguous_intervals
2230
2188
 
2231
2189
 
2232
- def _check_ready_intervals(
2190
+ def check_ready_intervals(
2233
2191
  check: t.Callable,
2234
2192
  intervals: Intervals,
2235
2193
  context: ExecutionContext,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.198.1.dev12
3
+ Version: 0.198.1.dev13
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=hnPFLgViYAuq9OQ8HMNnl3oJTWYxsMayOWfylgVZPU0,530
2
+ sqlmesh/_version.py,sha256=Ot41ppAYTuEK_dNN-7AEmc6ave1-1Q5pztj9mQwkDoo,530
3
3
  sqlmesh/magics.py,sha256=R9U0Mp9ZQhDYe751nxAQDLaMv3zLAR4HcTdIflKTmEE,41709
4
4
  sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -24,7 +24,7 @@ sqlmesh/core/node.py,sha256=r4_1MRTPcU0MAlwZ5KzrykLT58B7dkKvHzPCsJmEKD8,14497
24
24
  sqlmesh/core/notification_target.py,sha256=PPGoDrgbRKxr27vJEu03XqNTQLYTw0ZF_b0yAapxGeI,16158
25
25
  sqlmesh/core/reference.py,sha256=k7OSkLqTjPR8WJjNeFj0xAJ297nZUMgb_iTVwKRRKjc,4875
26
26
  sqlmesh/core/renderer.py,sha256=ksdD2x2Q5Ns5fOLIGfWIznx_T3fXbP3CfwUhD5kVSOQ,26674
27
- sqlmesh/core/scheduler.py,sha256=TRuxqu3vIyOMZTnViKbalWBDkpnog2lCiMeScxvNvq4,36728
27
+ sqlmesh/core/scheduler.py,sha256=lA3zhpz52HV-QBGoPirtqd2KakivnTuqiqZp09pP8js,39318
28
28
  sqlmesh/core/schema_diff.py,sha256=Sp2MoqAngp-yTYevkLaf9jb26SuAdGXoZ54g5MjWowU,30516
29
29
  sqlmesh/core/schema_loader.py,sha256=lvrI9k7hr1P4X4E6t3U-KrcuvdQuw0UdNlN90P2s52w,3563
30
30
  sqlmesh/core/selector.py,sha256=_hcktUQiKXCPE-mOqXClHUVWBfEZKMPVVNDtpSSRhbI,12660
@@ -88,7 +88,7 @@ sqlmesh/core/model/__init__.py,sha256=C8GRZ53xuXEA9hQv3BQS9pNNyd9rZ06R_B96UYGhDu
88
88
  sqlmesh/core/model/cache.py,sha256=csun0RJguHzKX6-qITcOs4fVP4f8_Ts8qiUVV4sHY6Q,7869
89
89
  sqlmesh/core/model/common.py,sha256=PcQS3rHFNIXV_Z1dGwLQ7gLPbYVlrbWGGKAyc58-9Xk,17379
90
90
  sqlmesh/core/model/decorator.py,sha256=wUUg5t0K559tV9Pqt6FE2EWXt5TPGb4wF2Yg4B4hX4w,9251
91
- sqlmesh/core/model/definition.py,sha256=bVvdPhQxtRwqWe-fCBuslOPanWPPxK4vcRrbI-Dl2rk,111272
91
+ sqlmesh/core/model/definition.py,sha256=mG6UPwxiZj0xP_cdHSVELEcXusAcltpgHBX-wiUSuPM,111963
92
92
  sqlmesh/core/model/kind.py,sha256=8Dp8yiTiXltboZWrB2FJ-LQ3zx4Fv_5Tj0KdUIPwCHI,36358
93
93
  sqlmesh/core/model/meta.py,sha256=D9InI9M2-IXeb34vkXNQSLALL8xVXjZ_LXwI-Tqxm7I,21197
94
94
  sqlmesh/core/model/schema.py,sha256=OClbAeA8LpW-IiSiLT_TlDWkEqmIIvSk0GXq8SWI-GQ,3443
@@ -102,7 +102,7 @@ sqlmesh/core/plan/stages.py,sha256=5cvEbrQsw_cx1gayxwLRwkIehQPixrbUT9B4BbEOj3A,2
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=3unI15dMHzBLbfXatMSeVqH4y11TtP2PDt-FeiQfP5k,86696
105
+ sqlmesh/core/snapshot/definition.py,sha256=L7aNCiUUmsEdkvQOfroB9aZDW6ZitHRph1eYYq1rTLE,85363
106
106
  sqlmesh/core/snapshot/evaluator.py,sha256=3mjrSp9ggd9uKhuZURrY0HtuCc_WAPsH4PYvQlqmn9o,90443
107
107
  sqlmesh/core/state_sync/__init__.py,sha256=B60xj-_Xk-4jas3UphLvwkuf04G-9AyGckcblXE0aRg,869
108
108
  sqlmesh/core/state_sync/base.py,sha256=Drq4MDWWxO_J-sJIxsMG1-YSgj2L42n5WM2vh1sr6bc,18334
@@ -284,7 +284,7 @@ sqlmesh/utils/pydantic.py,sha256=o_NsXbIpDqNpUA1Uc5xF0ZzoXQYYB0DfHwdRxBwXPNk,120
284
284
  sqlmesh/utils/rich.py,sha256=BpB47G0-JcU41LkGkeGKroexj4NOV5fox4-GOIXPgIc,3545
285
285
  sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
286
286
  sqlmesh/utils/yaml.py,sha256=hvo5lmybYLcIx4p6CQwufS8X4MbwS60lEBnCmYJCXmU,2336
287
- sqlmesh-0.198.1.dev12.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
287
+ sqlmesh-0.198.1.dev13.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
288
288
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
289
  web/client/dist/index.html,sha256=kNpFjWxt34Pf-P-cROtPWi3GNSVk6zqA3eoN9tlZXI0,5472
290
290
  web/client/dist/assets/Audits-DKgXravk.js,sha256=SaVQhNlislD_yQc_KivO7SPi1JH0ts1GnDPD5Zssutw,1041
@@ -402,8 +402,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
402
402
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
403
403
  web/server/api/endpoints/plan.py,sha256=bbbY50W_2MsZSTxOHWMKz0tbIm75nsRSlPy8GI2fg9Q,9306
404
404
  web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
405
- sqlmesh-0.198.1.dev12.dist-info/METADATA,sha256=qnZqaFCgJs7F_RfwlVT0HnHKk4nO1q2InfazHHOLH1c,26659
406
- sqlmesh-0.198.1.dev12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
407
- sqlmesh-0.198.1.dev12.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
408
- sqlmesh-0.198.1.dev12.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
409
- sqlmesh-0.198.1.dev12.dist-info/RECORD,,
405
+ sqlmesh-0.198.1.dev13.dist-info/METADATA,sha256=tO04527OWfbw2b1VCQB8tQMxbS4NGkvObRntCNs2Npo,26659
406
+ sqlmesh-0.198.1.dev13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
407
+ sqlmesh-0.198.1.dev13.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
408
+ sqlmesh-0.198.1.dev13.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
409
+ sqlmesh-0.198.1.dev13.dist-info/RECORD,,