|
77 | 77 | ) |
78 | 78 | from sqlmesh.core.engine_adapter import EngineAdapter |
79 | 79 | from sqlmesh.core.environment import Environment, EnvironmentNamingInfo, EnvironmentStatements |
| 80 | +from sqlmesh.core.janitor import cleanup_expired_views, delete_expired_snapshots |
80 | 81 | from sqlmesh.core.linter.definition import AnnotatedRuleViolation, Linter |
81 | 82 | from sqlmesh.core.linter.rules import BUILTIN_RULES |
82 | 83 | from sqlmesh.core.loader import Loader |
|
108 | 109 | StateReader, |
109 | 110 | StateSync, |
110 | 111 | ) |
111 | | -from sqlmesh.core.janitor import cleanup_expired_views, delete_expired_snapshots |
112 | 112 | from sqlmesh.core.table_diff import TableDiff |
113 | 113 | from sqlmesh.core.test import ( |
114 | 114 | ModelTestMetadata, |
115 | 115 | ModelTextTestResult, |
| 116 | + filter_tests_by_patterns, |
116 | 117 | generate_test, |
117 | 118 | run_tests, |
118 | 119 | ) |
@@ -391,6 +392,7 @@ def __init__( |
391 | 392 | "standaloneaudits" |
392 | 393 | ) |
393 | 394 | self._models_with_tests: t.Set[str] = set() |
| 395 | + self._model_test_metadata: t.List[ModelTestMetadata] = [] |
394 | 396 | self._macros: UniqueKeyDict[str, ExecutableOrMacro] = UniqueKeyDict("macros") |
395 | 397 | self._metrics: UniqueKeyDict[str, Metric] = UniqueKeyDict("metrics") |
396 | 398 | self._jinja_macros = JinjaMacroRegistry() |
@@ -641,6 +643,7 @@ def load(self, update_schemas: bool = True) -> GenericContext[C]: |
641 | 643 | self._excluded_requirements.update(project.excluded_requirements) |
642 | 644 | self._environment_statements.extend(project.environment_statements) |
643 | 645 | self._models_with_tests.update(project.models_with_tests) |
| 646 | + self._model_test_metadata.extend(project.model_test_metadata) |
644 | 647 |
|
645 | 648 | config = loader.config |
646 | 649 | self._linters[config.project] = Linter.from_rules( |
@@ -2219,7 +2222,10 @@ def test( |
2219 | 2222 |
|
2220 | 2223 | pd.set_option("display.max_columns", None) |
2221 | 2224 |
|
2222 | | - test_meta = self.load_model_tests(tests=tests, patterns=match_patterns) |
| 2225 | + loaded_test_meta = self._model_test_metadata |
| 2226 | + test_meta = self._filter_preloaded_tests( |
| 2227 | + test_meta=loaded_test_meta, tests=tests, patterns=match_patterns |
| 2228 | + ) |
2223 | 2229 |
|
2224 | 2230 | result = run_tests( |
2225 | 2231 | model_test_metadata=test_meta, |
@@ -2780,6 +2786,35 @@ def _get_engine_adapter(self, gateway: t.Optional[str] = None) -> EngineAdapter: |
2780 | 2786 | raise SQLMeshError(f"Gateway '{gateway}' not found in the available engine adapters.") |
2781 | 2787 | return self.engine_adapter |
2782 | 2788 |
|
| 2789 | + def _filter_preloaded_tests( |
| 2790 | + self, |
| 2791 | + test_meta: t.List[ModelTestMetadata], |
| 2792 | + tests: t.Optional[t.List[str]] = None, |
| 2793 | + patterns: t.Optional[t.List[str]] = None, |
| 2794 | + ) -> t.List[ModelTestMetadata]: |
| 2795 | + """Filter pre-loaded test metadata based on tests and patterns.""" |
| 2796 | + |
| 2797 | + if tests: |
| 2798 | + filtered_tests = [] |
| 2799 | + for test in tests: |
| 2800 | + if "::" in test: |
| 2801 | + filename, test_name = test.split("::", maxsplit=1) |
| 2802 | + filtered_tests.extend( |
| 2803 | + [ |
| 2804 | + t |
| 2805 | + for t in test_meta |
| 2806 | + if str(t.path) == filename and t.test_name == test_name |
| 2807 | + ] |
| 2808 | + ) |
| 2809 | + else: |
| 2810 | + filtered_tests.extend([t for t in test_meta if str(t.path) == test]) |
| 2811 | + test_meta = filtered_tests |
| 2812 | + |
| 2813 | + if patterns: |
| 2814 | + test_meta = filter_tests_by_patterns(test_meta, patterns) |
| 2815 | + |
| 2816 | + return test_meta |
| 2817 | + |
2783 | 2818 | def _snapshots( |
2784 | 2819 | self, models_override: t.Optional[UniqueKeyDict[str, Model]] = None |
2785 | 2820 | ) -> t.Dict[str, Snapshot]: |
|
0 commit comments