sqlmesh 0.227.2.dev10__py3-none-any.whl → 0.227.2.dev12__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
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.227.2.dev10'
32
- __version_tuple__ = version_tuple = (0, 227, 2, 'dev10')
31
+ __version__ = version = '0.227.2.dev12'
32
+ __version_tuple__ = version_tuple = (0, 227, 2, 'dev12')
33
33
 
34
34
  __commit_id__ = commit_id = None
sqlmesh/core/context.py CHANGED
@@ -147,8 +147,8 @@ if t.TYPE_CHECKING:
147
147
  from typing_extensions import Literal
148
148
 
149
149
  from sqlmesh.core.engine_adapter._typing import (
150
- DF,
151
150
  BigframeSession,
151
+ DF,
152
152
  PySparkDataFrame,
153
153
  PySparkSession,
154
154
  SnowparkSession,
@@ -403,6 +403,7 @@ class GenericContext(BaseContext, t.Generic[C]):
403
403
  self._model_test_metadata_path_index: t.Dict[Path, t.List[ModelTestMetadata]] = {}
404
404
  self._model_test_metadata_fully_qualified_name_index: t.Dict[str, ModelTestMetadata] = {}
405
405
  self._models_with_tests: t.Set[str] = set()
406
+
406
407
  self._macros: UniqueKeyDict[str, ExecutableOrMacro] = UniqueKeyDict("macros")
407
408
  self._metrics: UniqueKeyDict[str, Metric] = UniqueKeyDict("metrics")
408
409
  self._jinja_macros = JinjaMacroRegistry()
@@ -656,6 +657,7 @@ class GenericContext(BaseContext, t.Generic[C]):
656
657
  self._requirements.update(project.requirements)
657
658
  self._excluded_requirements.update(project.excluded_requirements)
658
659
  self._environment_statements.extend(project.environment_statements)
660
+
659
661
  self._model_test_metadata.extend(project.model_test_metadata)
660
662
  for metadata in project.model_test_metadata:
661
663
  if metadata.path not in self._model_test_metadata_path_index:
@@ -2243,9 +2245,7 @@ class GenericContext(BaseContext, t.Generic[C]):
2243
2245
 
2244
2246
  pd.set_option("display.max_columns", None)
2245
2247
 
2246
- test_meta = self._select_tests(
2247
- test_meta=self._model_test_metadata, tests=tests, patterns=match_patterns
2248
- )
2248
+ test_meta = self.select_tests(tests=tests, patterns=match_patterns)
2249
2249
 
2250
2250
  result = run_tests(
2251
2251
  model_test_metadata=test_meta,
@@ -2807,33 +2807,6 @@ class GenericContext(BaseContext, t.Generic[C]):
2807
2807
  raise SQLMeshError(f"Gateway '{gateway}' not found in the available engine adapters.")
2808
2808
  return self.engine_adapter
2809
2809
 
2810
- def _select_tests(
2811
- self,
2812
- test_meta: t.List[ModelTestMetadata],
2813
- tests: t.Optional[t.List[str]] = None,
2814
- patterns: t.Optional[t.List[str]] = None,
2815
- ) -> t.List[ModelTestMetadata]:
2816
- """Filter pre-loaded test metadata based on tests and patterns."""
2817
-
2818
- if tests:
2819
- filtered_tests = []
2820
- for test in tests:
2821
- if "::" in test:
2822
- if test in self._model_test_metadata_fully_qualified_name_index:
2823
- filtered_tests.append(
2824
- self._model_test_metadata_fully_qualified_name_index[test]
2825
- )
2826
- else:
2827
- test_path = Path(test)
2828
- if test_path in self._model_test_metadata_path_index:
2829
- filtered_tests.extend(self._model_test_metadata_path_index[test_path])
2830
- test_meta = filtered_tests
2831
-
2832
- if patterns:
2833
- test_meta = filter_tests_by_patterns(test_meta, patterns)
2834
-
2835
- return test_meta
2836
-
2837
2810
  def _snapshots(
2838
2811
  self, models_override: t.Optional[UniqueKeyDict[str, Model]] = None
2839
2812
  ) -> t.Dict[str, Snapshot]:
@@ -3245,18 +3218,34 @@ class GenericContext(BaseContext, t.Generic[C]):
3245
3218
 
3246
3219
  return all_violations
3247
3220
 
3248
- def load_model_tests(
3249
- self, tests: t.Optional[t.List[str]] = None, patterns: list[str] | None = None
3221
+ def select_tests(
3222
+ self,
3223
+ tests: t.Optional[t.List[str]] = None,
3224
+ patterns: t.Optional[t.List[str]] = None,
3250
3225
  ) -> t.List[ModelTestMetadata]:
3251
- # If a set of specific test path(s) are provided, we can use a single loader
3252
- # since it's not required to walk every tests/ folder in each repo
3253
- loaders = [self._loaders[0]] if tests else self._loaders
3226
+ """Filter pre-loaded test metadata based on tests and patterns."""
3227
+
3228
+ test_meta = self._model_test_metadata
3229
+
3230
+ if tests:
3231
+ filtered_tests = []
3232
+ for test in tests:
3233
+ if "::" in test:
3234
+ if test in self._model_test_metadata_fully_qualified_name_index:
3235
+ filtered_tests.append(
3236
+ self._model_test_metadata_fully_qualified_name_index[test]
3237
+ )
3238
+ else:
3239
+ test_path = Path(test)
3240
+ if test_path in self._model_test_metadata_path_index:
3241
+ filtered_tests.extend(self._model_test_metadata_path_index[test_path])
3242
+
3243
+ test_meta = filtered_tests
3254
3244
 
3255
- model_tests = []
3256
- for loader in loaders:
3257
- model_tests.extend(loader.load_model_tests(tests=tests, patterns=patterns))
3245
+ if patterns:
3246
+ test_meta = filter_tests_by_patterns(test_meta, patterns)
3258
3247
 
3259
- return model_tests
3248
+ return test_meta
3260
3249
 
3261
3250
 
3262
3251
  class Context(GenericContext[Config]):
@@ -130,7 +130,7 @@ class NoMissingAudits(Rule):
130
130
 
131
131
 
132
132
  class NoMissingUnitTest(Rule):
133
- """All models must have a unit test found in the test/ directory yaml files"""
133
+ """All models must have a unit test found in the tests/ directory yaml files"""
134
134
 
135
135
  def check_model(self, model: Model) -> t.Optional[RuleViolation]:
136
136
  # External models cannot have unit tests
sqlmesh/core/loader.py CHANGED
@@ -35,7 +35,7 @@ from sqlmesh.core.model import (
35
35
  from sqlmesh.core.model import model as model_registry
36
36
  from sqlmesh.core.model.common import make_python_env
37
37
  from sqlmesh.core.signal import signal
38
- from sqlmesh.core.test import ModelTestMetadata, filter_tests_by_patterns
38
+ from sqlmesh.core.test import ModelTestMetadata
39
39
  from sqlmesh.utils import UniqueKeyDict, sys_path
40
40
  from sqlmesh.utils.errors import ConfigError
41
41
  from sqlmesh.utils.jinja import JinjaMacroRegistry, MacroExtractor
@@ -427,9 +427,7 @@ class Loader(abc.ABC):
427
427
  """Loads user linting rules"""
428
428
  return RuleSet()
429
429
 
430
- def load_model_tests(
431
- self, tests: t.Optional[t.List[str]] = None, patterns: list[str] | None = None
432
- ) -> t.List[ModelTestMetadata]:
430
+ def load_model_tests(self) -> t.List[ModelTestMetadata]:
433
431
  """Loads YAML-based model tests"""
434
432
  return []
435
433
 
@@ -868,38 +866,23 @@ class SqlMeshLoader(Loader):
868
866
 
869
867
  return model_test_metadata
870
868
 
871
- def load_model_tests(
872
- self, tests: t.Optional[t.List[str]] = None, patterns: list[str] | None = None
873
- ) -> t.List[ModelTestMetadata]:
869
+ def load_model_tests(self) -> t.List[ModelTestMetadata]:
874
870
  """Loads YAML-based model tests"""
875
871
  test_meta_list: t.List[ModelTestMetadata] = []
876
872
 
877
- if tests:
878
- for test in tests:
879
- filename, test_name = test.split("::", maxsplit=1) if "::" in test else (test, "")
873
+ search_path = Path(self.config_path) / c.TESTS
880
874
 
881
- test_meta = self._load_model_test_file(Path(filename))
882
- if test_name:
883
- test_meta_list.append(test_meta[test_name])
884
- else:
885
- test_meta_list.extend(test_meta.values())
886
- else:
887
- search_path = Path(self.config_path) / c.TESTS
888
-
889
- for yaml_file in itertools.chain(
890
- search_path.glob("**/test*.yaml"),
891
- search_path.glob("**/test*.yml"),
875
+ for yaml_file in itertools.chain(
876
+ search_path.glob("**/test*.yaml"),
877
+ search_path.glob("**/test*.yml"),
878
+ ):
879
+ if any(
880
+ yaml_file.match(ignore_pattern)
881
+ for ignore_pattern in self.config.ignore_patterns or []
892
882
  ):
893
- if any(
894
- yaml_file.match(ignore_pattern)
895
- for ignore_pattern in self.config.ignore_patterns or []
896
- ):
897
- continue
898
-
899
- test_meta_list.extend(self._load_model_test_file(yaml_file).values())
883
+ continue
900
884
 
901
- if patterns:
902
- test_meta_list = filter_tests_by_patterns(test_meta_list, patterns)
885
+ test_meta_list.extend(self._load_model_test_file(yaml_file).values())
903
886
 
904
887
  return test_meta_list
905
888
 
sqlmesh/lsp/context.py CHANGED
@@ -72,7 +72,7 @@ class LSPContext:
72
72
 
73
73
  def list_workspace_tests(self) -> t.List[TestEntry]:
74
74
  """List all tests in the workspace."""
75
- tests = self.context.load_model_tests()
75
+ tests = self.context.select_tests()
76
76
 
77
77
  # Use a set to ensure unique URIs
78
78
  unique_test_uris = {URI.from_path(test.path).value for test in tests}
@@ -81,7 +81,9 @@ class LSPContext:
81
81
  test_ranges = get_test_ranges(URI(uri).to_path())
82
82
  if uri not in test_uris:
83
83
  test_uris[uri] = {}
84
+
84
85
  test_uris[uri].update(test_ranges)
86
+
85
87
  return [
86
88
  TestEntry(
87
89
  name=test.test_name,
@@ -100,7 +102,7 @@ class LSPContext:
100
102
  Returns:
101
103
  List of TestEntry objects for the specified document.
102
104
  """
103
- tests = self.context.load_model_tests(tests=[str(uri.to_path())])
105
+ tests = self.context.select_tests(tests=[str(uri.to_path())])
104
106
  test_ranges = get_test_ranges(uri.to_path())
105
107
  return [
106
108
  TestEntry(
sqlmesh/magics.py CHANGED
@@ -337,7 +337,7 @@ class SQLMeshMagics(Magics):
337
337
  if not args.test_name and not args.ls:
338
338
  raise MagicError("Must provide either test name or `--ls` to list tests")
339
339
 
340
- test_meta = context.load_model_tests()
340
+ test_meta = context.select_tests()
341
341
 
342
342
  tests: t.Dict[str, t.Dict[str, ModelTestMetadata]] = defaultdict(dict)
343
343
  for model_test_metadata in test_meta:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.227.2.dev10
3
+ Version: 0.227.2.dev12
4
4
  Summary: Next-generation data transformation framework
5
5
  Author-email: "TobikoData Inc." <engineering@tobikodata.com>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  sqlmesh/__init__.py,sha256=v_spqQEhcnGaahp1yPvMqUIa6mhH3cs3Bc1CznxvCEA,7965
2
- sqlmesh/_version.py,sha256=O1wyptF98wDkJxBL0_UwMDlku2sh9cjCVueWIOGiL1A,723
3
- sqlmesh/magics.py,sha256=xLh3u4eqpVrKRVN5KF3X84RPRqjygAB9AJP1TXwH8hg,42086
2
+ sqlmesh/_version.py,sha256=MjcLqt8ff4n5akUGB4arakRl5PMDvUgkFb6BH37y6Rc,723
3
+ sqlmesh/magics.py,sha256=7Q1_lXSD_PgYH40Hsx6-OkfSQC3UJZgF043RVFRnw1s,42082
4
4
  sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  sqlmesh/cicd/bot.py,sha256=2zlbn-DXkqQzr3lA0__IGU4XaIfXBXBKLWXNI2DRJX8,759
@@ -13,13 +13,13 @@ sqlmesh/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  sqlmesh/core/_typing.py,sha256=PzXxMYnORq18JhblAOUttms3zPJZzZpIbfFA_jgKYPA,498
14
14
  sqlmesh/core/console.py,sha256=MYpVlciUY6rUuoqXyKfXTxD6a4-Bw4-ooATUTj_VHGg,172830
15
15
  sqlmesh/core/constants.py,sha256=BuQk43vluUm7LfP9nKp5o9qRhqIenWF_LiLXO_t_53c,2699
16
- sqlmesh/core/context.py,sha256=PZcI06NldePYMDkvsMuZf8vGreDk7dzjnzX5rZ422AM,133656
16
+ sqlmesh/core/context.py,sha256=Ig2FKOLecp0tZ3jnx4952gQ52KukFATMLNfRK4vHqlk,133051
17
17
  sqlmesh/core/context_diff.py,sha256=mxkJu0IthFMOlaQ_kcq5C09mlgkq2RQb-pG2rd-x_nA,21648
18
18
  sqlmesh/core/dialect.py,sha256=CnKcPj6BnREfu9Zn1OyS7hZ3ktnaX03ygOg91nADlTU,53029
19
19
  sqlmesh/core/environment.py,sha256=Kgs_gUEUI072mh0JJFWNRynrCxp1TzRHZhX_NWJRfXc,13142
20
20
  sqlmesh/core/janitor.py,sha256=zJRN48ENjKexeiqa1Kmwyj_HsEEEIAa8hsFD8gTCmfg,7194
21
21
  sqlmesh/core/lineage.py,sha256=LtiOztX1xIbFfWz-eb5dPZW4B0o2sI942_IM4YDbsso,3163
22
- sqlmesh/core/loader.py,sha256=sXGTeyDISd3Gtu9Ej9iEz1CMM4SXSwZMSBpbZNohE10,37458
22
+ sqlmesh/core/loader.py,sha256=YbdDekoeIwu1zg0xFsiQUWsxgupZTqpHAziwxV-53Hs,36698
23
23
  sqlmesh/core/macros.py,sha256=rkklwVnUEmEro4wpdel289mKhaS3x5_SPZrkYZt3Q9E,63173
24
24
  sqlmesh/core/node.py,sha256=2ejDwH1whl_ic1CRzX16Be-FQrosAf8pdyWb7oPzU6M,19895
25
25
  sqlmesh/core/notification_target.py,sha256=PPGoDrgbRKxr27vJEu03XqNTQLYTw0ZF_b0yAapxGeI,16158
@@ -82,7 +82,7 @@ sqlmesh/core/linter/definition.py,sha256=1EOhKdF16jmeqISfcrR-8fzMdgXuxpB7wb3Qaep
82
82
  sqlmesh/core/linter/helpers.py,sha256=cwKXP4sL6azRtNVGbMfJ5_6Hqq5Xx2M2rRLCgH3Y3ag,10743
83
83
  sqlmesh/core/linter/rule.py,sha256=nB3o1rHyN44ZOg5ImICP16SeUHimf-12ObdXJjkTGyM,3964
84
84
  sqlmesh/core/linter/rules/__init__.py,sha256=gevzfb67vFqckTCoVAe_TBGf6hQ-YtE1_YuGuXyh1L0,77
85
- sqlmesh/core/linter/rules/builtin.py,sha256=mJjRrL97mTyqPgrUGk-1Ceml6ATCxElZVgiwi6WFqmU,11727
85
+ sqlmesh/core/linter/rules/builtin.py,sha256=6j22W_5EOBN979Bi2_mvmCNq4yqZVsJ9oqEukunj4Ws,11728
86
86
  sqlmesh/core/metric/__init__.py,sha256=H1HmoD5IwN4YWe9iJXyueLYNmTQFZwok5nSWNJcZIBQ,237
87
87
  sqlmesh/core/metric/definition.py,sha256=Yd5aVgsZCDPJ43aGP7WqtzZOuuSUtB8uJGVA6Jw9x9M,7201
88
88
  sqlmesh/core/metric/rewriter.py,sha256=GiSTHfn2kinqCfNPYgZPRk93JFLzVaaejHtHDQ0yXZI,7326
@@ -162,7 +162,7 @@ sqlmesh/integrations/github/cicd/controller.py,sha256=0I5mHPz3HBJR5lkR-2J9Bj06Yn
162
162
  sqlmesh/lsp/api.py,sha256=Z_8Op6CWqdbmEeidCQgMcVmRooQujqaynn-0EOw4478,2505
163
163
  sqlmesh/lsp/commands.py,sha256=7tZPePSH-IwBYmXJPIlqGM7pi4rOCLEtc3fKJglAxZs,72
164
164
  sqlmesh/lsp/completions.py,sha256=7Lhboh6xyoMJ3kkHG3aZz1xVbDwKiXeQKdIRj5xlUOA,6674
165
- sqlmesh/lsp/context.py,sha256=VIL_Xl3II6I79ILZ67UTY9u6OzgkLHDTEpTK91DJxAA,20892
165
+ sqlmesh/lsp/context.py,sha256=7S17A1oE9WZtOU1dYvQeoExqvXGwmNxZdbk9uF4Xllw,20886
166
166
  sqlmesh/lsp/custom.py,sha256=npzNznpUJ3ELY_WU4n_4I73lAjuTapI0_HKCFsoMcOk,5132
167
167
  sqlmesh/lsp/errors.py,sha256=3NMim_5J00Eypz7t8b7XbkBfy8gIsRkeq-VcjD4COtc,1489
168
168
  sqlmesh/lsp/helpers.py,sha256=EFc1u3-b7kSv5-tNwmKUDxId72RCLDBnN2lLTgRSzzQ,1020
@@ -238,7 +238,7 @@ sqlmesh/utils/pydantic.py,sha256=-yppkVlw6iSBaSiKjbe7OChxL-u3urOS4-KCjJEgsRU,120
238
238
  sqlmesh/utils/rich.py,sha256=cwQ5nJ6sgz64xHtoh6_ec7ReV5YpsOGhMtUJnwoRfEI,3549
239
239
  sqlmesh/utils/windows.py,sha256=0F9RdpuuCoG5NiEDXvWlAGCiJ-59OjSAmgFF5wW05aY,1133
240
240
  sqlmesh/utils/yaml.py,sha256=KFBd7hsKNRTtRudGR7d410qUYffQv0EWRcDM8hVNNZg,3025
241
- sqlmesh-0.227.2.dev10.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
241
+ sqlmesh-0.227.2.dev12.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
242
242
  sqlmesh_dbt/__init__.py,sha256=awYS5y5mz-1NUmx6i5h5NSTJ7tidRl9NC0FAnFWSF6U,350
243
243
  sqlmesh_dbt/cli.py,sha256=p9foHjAW9ni7BTOJ2loynk47M0Sf43QIJZRggOzF5tc,6351
244
244
  sqlmesh_dbt/console.py,sha256=RwWLYnEZHzn9Xp-e2gbZvkdKbWbBLN146geI84mJitg,1132
@@ -363,8 +363,8 @@ web/server/api/endpoints/models.py,sha256=kwj0s7uve3iZSMfmjkoPVMFMeY1sD0peTeyrWf
363
363
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
364
364
  web/server/api/endpoints/plan.py,sha256=bbbY50W_2MsZSTxOHWMKz0tbIm75nsRSlPy8GI2fg9Q,9306
365
365
  web/server/api/endpoints/table_diff.py,sha256=8XTwgOh6QBbNy_hTM1JuHgRjbnie-pGPrphiW-FNLjQ,6058
366
- sqlmesh-0.227.2.dev10.dist-info/METADATA,sha256=kelyTZrbU-p1WD_tVLqX32kC0wOiZfX_Tn_FPBWBT_Y,26686
367
- sqlmesh-0.227.2.dev10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
368
- sqlmesh-0.227.2.dev10.dist-info/entry_points.txt,sha256=sHAf6tQczIM8xZoduN4qaUjV7QEPVUUW_LCT8EDUMv4,155
369
- sqlmesh-0.227.2.dev10.dist-info/top_level.txt,sha256=RQ-33FPe2IgL0rgossAfJkCRtqslz9b7wFARqiWLC5Q,24
370
- sqlmesh-0.227.2.dev10.dist-info/RECORD,,
366
+ sqlmesh-0.227.2.dev12.dist-info/METADATA,sha256=vNgqxzXZ_rPkFQMXmKkaJTMA6ivtfK_wUVPEpqEyUPs,26686
367
+ sqlmesh-0.227.2.dev12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
368
+ sqlmesh-0.227.2.dev12.dist-info/entry_points.txt,sha256=sHAf6tQczIM8xZoduN4qaUjV7QEPVUUW_LCT8EDUMv4,155
369
+ sqlmesh-0.227.2.dev12.dist-info/top_level.txt,sha256=RQ-33FPe2IgL0rgossAfJkCRtqslz9b7wFARqiWLC5Q,24
370
+ sqlmesh-0.227.2.dev12.dist-info/RECORD,,