sqlmesh 0.185.2.dev4__py3-none-any.whl → 0.186.1__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/config/connection.py +38 -0
- sqlmesh/core/macros.py +8 -0
- sqlmesh/core/model/definition.py +12 -7
- sqlmesh/core/plan/builder.py +9 -9
- sqlmesh/core/plan/evaluator.py +23 -2
- sqlmesh/core/renderer.py +1 -0
- sqlmesh/lsp/main.py +25 -4
- sqlmesh/utils/pydantic.py +18 -0
- {sqlmesh-0.185.2.dev4.dist-info → sqlmesh-0.186.1.dist-info}/METADATA +1 -1
- {sqlmesh-0.185.2.dev4.dist-info → sqlmesh-0.186.1.dist-info}/RECORD +15 -15
- {sqlmesh-0.185.2.dev4.dist-info → sqlmesh-0.186.1.dist-info}/WHEEL +0 -0
- {sqlmesh-0.185.2.dev4.dist-info → sqlmesh-0.186.1.dist-info}/entry_points.txt +0 -0
- {sqlmesh-0.185.2.dev4.dist-info → sqlmesh-0.186.1.dist-info}/licenses/LICENSE +0 -0
- {sqlmesh-0.185.2.dev4.dist-info → sqlmesh-0.186.1.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.
|
|
21
|
-
__version_tuple__ = version_tuple = (0,
|
|
20
|
+
__version__ = version = '0.186.1'
|
|
21
|
+
__version_tuple__ = version_tuple = (0, 186, 1)
|
|
@@ -13,6 +13,7 @@ from functools import partial
|
|
|
13
13
|
|
|
14
14
|
import pydantic
|
|
15
15
|
from pydantic import Field
|
|
16
|
+
from pydantic_core import from_json
|
|
16
17
|
from packaging import version
|
|
17
18
|
from sqlglot import exp
|
|
18
19
|
from sqlglot.helper import subclasses
|
|
@@ -33,6 +34,7 @@ from sqlmesh.utils.pydantic import (
|
|
|
33
34
|
field_validator,
|
|
34
35
|
model_validator,
|
|
35
36
|
validation_error_message,
|
|
37
|
+
get_concrete_types_from_typehint,
|
|
36
38
|
)
|
|
37
39
|
from sqlmesh.utils.aws import validate_s3_uri
|
|
38
40
|
|
|
@@ -177,6 +179,42 @@ class ConnectionConfig(abc.ABC, BaseConfig):
|
|
|
177
179
|
return self.db
|
|
178
180
|
return None
|
|
179
181
|
|
|
182
|
+
@model_validator(mode="before")
|
|
183
|
+
@classmethod
|
|
184
|
+
def _expand_json_strings_to_concrete_types(cls, data: t.Any) -> t.Any:
|
|
185
|
+
"""
|
|
186
|
+
There are situations where a connection config class has a field that is some kind of complex type
|
|
187
|
+
(eg a list of strings or a dict) but the value is being supplied from a source such as an environment variable
|
|
188
|
+
|
|
189
|
+
When this happens, the value is supplied as a string rather than a Python object. We need some way
|
|
190
|
+
of turning this string into the corresponding Python list or dict.
|
|
191
|
+
|
|
192
|
+
Rather than doing this piecemeal on every config subclass, this provides a generic implementatation
|
|
193
|
+
to identify fields that may be be supplied as JSON strings and handle them transparently
|
|
194
|
+
"""
|
|
195
|
+
if data and isinstance(data, dict):
|
|
196
|
+
for maybe_json_field_name in cls._get_list_and_dict_field_names():
|
|
197
|
+
if (value := data.get(maybe_json_field_name)) and isinstance(value, str):
|
|
198
|
+
# crude JSON check as we dont want to try and parse every string we get
|
|
199
|
+
value = value.strip()
|
|
200
|
+
if value.startswith("{") or value.startswith("["):
|
|
201
|
+
data[maybe_json_field_name] = from_json(value)
|
|
202
|
+
|
|
203
|
+
return data
|
|
204
|
+
|
|
205
|
+
@classmethod
|
|
206
|
+
def _get_list_and_dict_field_names(cls) -> t.Set[str]:
|
|
207
|
+
field_names = set()
|
|
208
|
+
for name, field in cls.model_fields.items():
|
|
209
|
+
if field.annotation:
|
|
210
|
+
field_types = get_concrete_types_from_typehint(field.annotation)
|
|
211
|
+
|
|
212
|
+
# check if the field type is something that could concievably be supplied as a json string
|
|
213
|
+
if any(ft is t for t in (list, tuple, set, dict) for ft in field_types):
|
|
214
|
+
field_names.add(name)
|
|
215
|
+
|
|
216
|
+
return field_names
|
|
217
|
+
|
|
180
218
|
|
|
181
219
|
class DuckDBAttachOptions(BaseConfig):
|
|
182
220
|
type: str
|
sqlmesh/core/macros.py
CHANGED
|
@@ -173,6 +173,7 @@ class MacroEvaluator:
|
|
|
173
173
|
default_catalog: t.Optional[str] = None,
|
|
174
174
|
path: Path = Path(),
|
|
175
175
|
environment_naming_info: t.Optional[EnvironmentNamingInfo] = None,
|
|
176
|
+
model_fqn: t.Optional[str] = None,
|
|
176
177
|
):
|
|
177
178
|
self.dialect = dialect
|
|
178
179
|
self.generator = MacroDialect().generator()
|
|
@@ -198,6 +199,7 @@ class MacroEvaluator:
|
|
|
198
199
|
self._snapshots = snapshots if snapshots is not None else {}
|
|
199
200
|
self._path = path
|
|
200
201
|
self._environment_naming_info = environment_naming_info
|
|
202
|
+
self._model_fqn = model_fqn
|
|
201
203
|
|
|
202
204
|
prepare_env(self.python_env, self.env)
|
|
203
205
|
for k, v in self.python_env.items():
|
|
@@ -476,6 +478,12 @@ class MacroEvaluator:
|
|
|
476
478
|
raise SQLMeshError("Model name is not available in the macro evaluator.")
|
|
477
479
|
return this_model.sql(dialect=self.dialect, identify=True, comments=False)
|
|
478
480
|
|
|
481
|
+
@property
|
|
482
|
+
def this_model_fqn(self) -> str:
|
|
483
|
+
if self._model_fqn is None:
|
|
484
|
+
raise SQLMeshError("Model name is not available in the macro evaluator.")
|
|
485
|
+
return self._model_fqn
|
|
486
|
+
|
|
479
487
|
@property
|
|
480
488
|
def engine_adapter(self) -> EngineAdapter:
|
|
481
489
|
engine_adapter = self.locals.get("engine_adapter")
|
sqlmesh/core/model/definition.py
CHANGED
|
@@ -2488,22 +2488,27 @@ def _create_model(
|
|
|
2488
2488
|
|
|
2489
2489
|
model.audit_definitions.update(audit_definitions)
|
|
2490
2490
|
|
|
2491
|
-
|
|
2491
|
+
# Any macro referenced in audits or signals needs to be treated as metadata-only
|
|
2492
|
+
statements.extend((audit.query, True) for audit in audit_definitions.values())
|
|
2492
2493
|
|
|
2493
2494
|
# Ensure that all audits referenced in the model are defined
|
|
2495
|
+
from sqlmesh.core.audit.builtin import BUILT_IN_AUDITS
|
|
2496
|
+
|
|
2494
2497
|
available_audits = BUILT_IN_AUDITS.keys() | model.audit_definitions.keys()
|
|
2495
|
-
for referenced_audit,
|
|
2498
|
+
for referenced_audit, audit_args in model.audits:
|
|
2496
2499
|
if referenced_audit not in available_audits:
|
|
2497
2500
|
raise_config_error(f"Audit '{referenced_audit}' is undefined", location=path)
|
|
2498
2501
|
|
|
2499
|
-
# Any macro referenced in audits or signals needs to be treated as metadata-only
|
|
2500
|
-
statements.extend((audit.query, True) for audit in audit_definitions.values())
|
|
2501
|
-
for _, audit_args in model.audits:
|
|
2502
2502
|
statements.extend(
|
|
2503
2503
|
(audit_arg_expression, True) for audit_arg_expression in audit_args.values()
|
|
2504
2504
|
)
|
|
2505
2505
|
|
|
2506
|
-
|
|
2506
|
+
signal_definitions = signal_definitions or UniqueKeyDict("signals")
|
|
2507
|
+
|
|
2508
|
+
for referenced_signal, kwargs in model.signals:
|
|
2509
|
+
if referenced_signal and referenced_signal not in signal_definitions:
|
|
2510
|
+
raise_config_error(f"Signal '{referenced_signal}' is undefined", location=path)
|
|
2511
|
+
|
|
2507
2512
|
statements.extend((signal_kwarg, True) for signal_kwarg in kwargs.values())
|
|
2508
2513
|
|
|
2509
2514
|
python_env = make_python_env(
|
|
@@ -2523,7 +2528,7 @@ def _create_model(
|
|
|
2523
2528
|
env: t.Dict[str, t.Tuple[t.Any, t.Optional[bool]]] = {}
|
|
2524
2529
|
|
|
2525
2530
|
for signal_name, _ in model.signals:
|
|
2526
|
-
if
|
|
2531
|
+
if signal_name and signal_name in signal_definitions:
|
|
2527
2532
|
func = signal_definitions[signal_name].func
|
|
2528
2533
|
setattr(func, c.SQLMESH_METADATA, True)
|
|
2529
2534
|
build_env(func, env=env, name=signal_name, path=module_path)
|
sqlmesh/core/plan/builder.py
CHANGED
|
@@ -344,6 +344,15 @@ class PlanBuilder:
|
|
|
344
344
|
for s_id in dag:
|
|
345
345
|
snapshot = self._context_diff.snapshots[s_id]
|
|
346
346
|
|
|
347
|
+
# Since we are traversing the graph in topological order and the largest interval range is pushed down
|
|
348
|
+
# the graph we just have to check our immediate parents in the graph and not the whole upstream graph.
|
|
349
|
+
restating_parents = [
|
|
350
|
+
self._context_diff.snapshots[s] for s in snapshot.parents if s in restatements
|
|
351
|
+
]
|
|
352
|
+
|
|
353
|
+
if not restating_parents and snapshot.name not in restate_models:
|
|
354
|
+
continue
|
|
355
|
+
|
|
347
356
|
if not forward_only_preview_needed:
|
|
348
357
|
if self._is_dev and not snapshot.is_paused:
|
|
349
358
|
self._console.log_warning(
|
|
@@ -362,15 +371,6 @@ class PlanBuilder:
|
|
|
362
371
|
logger.info("Skipping restatement for model '%s'", snapshot.name)
|
|
363
372
|
continue
|
|
364
373
|
|
|
365
|
-
# Since we are traversing the graph in topological order and the largest interval range is pushed down
|
|
366
|
-
# the graph we just have to check our immediate parents in the graph and not the whole upstream graph.
|
|
367
|
-
restating_parents = [
|
|
368
|
-
self._context_diff.snapshots[s] for s in snapshot.parents if s in restatements
|
|
369
|
-
]
|
|
370
|
-
|
|
371
|
-
if not restating_parents and snapshot.name not in restate_models:
|
|
372
|
-
continue
|
|
373
|
-
|
|
374
374
|
possible_intervals = {
|
|
375
375
|
restatements[p.snapshot_id] for p in restating_parents if p.is_incremental
|
|
376
376
|
}
|
sqlmesh/core/plan/evaluator.py
CHANGED
|
@@ -116,6 +116,7 @@ class BuiltInPlanEvaluator(PlanEvaluator):
|
|
|
116
116
|
after_promote_snapshots = all_names - before_promote_snapshots
|
|
117
117
|
deployability_index_for_evaluation = DeployabilityIndex.all_deployable()
|
|
118
118
|
|
|
119
|
+
# Step 1: Run before_all environment statements before doing anything else
|
|
119
120
|
execute_environment_statements(
|
|
120
121
|
adapter=self.snapshot_evaluator.adapter,
|
|
121
122
|
environment_statements=plan.environment_statements or [],
|
|
@@ -128,15 +129,24 @@ class BuiltInPlanEvaluator(PlanEvaluator):
|
|
|
128
129
|
execution_time=plan.execution_time,
|
|
129
130
|
)
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
# Step 2:Store new snapshot records in the state and create physical tables for them
|
|
133
133
|
push_completion_status = self._push(plan, snapshots, deployability_index_for_creation)
|
|
134
134
|
if push_completion_status.is_nothing_to_do:
|
|
135
135
|
self.console.log_success(
|
|
136
136
|
"" if plan.restatements else "\nSKIP: No physical layer updates to perform"
|
|
137
137
|
)
|
|
138
|
+
|
|
139
|
+
# Step 3: Update the intervals for the new forward-only snapshots
|
|
138
140
|
update_intervals_for_new_snapshots(plan.new_snapshots, self.state_sync)
|
|
141
|
+
|
|
142
|
+
# Step 4: Run audits without evaluations for snapshots that capture audit metadata changes
|
|
143
|
+
self._run_audits_for_metadata_snapshots(plan, new_snapshots)
|
|
144
|
+
|
|
145
|
+
# Step 5: Remove intervals for snapshots that need to be restated
|
|
139
146
|
self._restate(plan, snapshots_by_name)
|
|
147
|
+
|
|
148
|
+
# Step 6: Backfill missing intervals for snapshots that can be backfilled before updating
|
|
149
|
+
# the schema of production tables
|
|
140
150
|
first_bf_completion_status = self._backfill(
|
|
141
151
|
plan,
|
|
142
152
|
snapshots_by_name,
|
|
@@ -144,9 +154,15 @@ class BuiltInPlanEvaluator(PlanEvaluator):
|
|
|
144
154
|
deployability_index_for_evaluation,
|
|
145
155
|
circuit_breaker=circuit_breaker,
|
|
146
156
|
)
|
|
157
|
+
|
|
158
|
+
# Step 7: Update the target environment record in the state and migrate table schemas for forward-only
|
|
159
|
+
# snapshots if deploying to production
|
|
147
160
|
promotion_result = self._promote(
|
|
148
161
|
plan, snapshots, before_promote_snapshots, deployability_index_for_creation
|
|
149
162
|
)
|
|
163
|
+
|
|
164
|
+
# Step 8: Backfill missing intervals for snapshots that can be backfilled only after updating
|
|
165
|
+
# the schema of production tables
|
|
150
166
|
second_bf_completion_status = self._backfill(
|
|
151
167
|
plan,
|
|
152
168
|
snapshots_by_name,
|
|
@@ -154,15 +170,20 @@ class BuiltInPlanEvaluator(PlanEvaluator):
|
|
|
154
170
|
deployability_index_for_evaluation,
|
|
155
171
|
circuit_breaker=circuit_breaker,
|
|
156
172
|
)
|
|
173
|
+
|
|
157
174
|
if (
|
|
158
175
|
first_bf_completion_status.is_nothing_to_do
|
|
159
176
|
and second_bf_completion_status.is_nothing_to_do
|
|
160
177
|
):
|
|
161
178
|
self.console.log_success("SKIP: No model batches to execute")
|
|
179
|
+
|
|
180
|
+
# Step 9: Update environment views to point at new physical tables and finalize the environment
|
|
181
|
+
# record in the state
|
|
162
182
|
self._update_views(
|
|
163
183
|
plan, snapshots, promotion_result, deployability_index_for_evaluation
|
|
164
184
|
)
|
|
165
185
|
|
|
186
|
+
# Step 10: Run after_all environment statements
|
|
166
187
|
execute_environment_statements(
|
|
167
188
|
adapter=self.snapshot_evaluator.adapter,
|
|
168
189
|
environment_statements=plan.environment_statements or [],
|
sqlmesh/core/renderer.py
CHANGED
sqlmesh/lsp/main.py
CHANGED
|
@@ -69,10 +69,7 @@ class SQLMeshLanguageServer:
|
|
|
69
69
|
# Use user-provided instantiator to build the context
|
|
70
70
|
created_context = self.context_class(paths=[folder_path])
|
|
71
71
|
self.lsp_context = LSPContext(created_context)
|
|
72
|
-
ls
|
|
73
|
-
f"Loaded SQLMesh context from {config_path}",
|
|
74
|
-
types.MessageType.Info,
|
|
75
|
-
)
|
|
72
|
+
loaded_sqlmesh_message(ls, folder_path)
|
|
76
73
|
return # Exit after successfully loading any config
|
|
77
74
|
except Exception as e:
|
|
78
75
|
ls.show_message(
|
|
@@ -94,6 +91,9 @@ class SQLMeshLanguageServer:
|
|
|
94
91
|
@self.server.feature(API_FEATURE)
|
|
95
92
|
def api(ls: LanguageServer, request: ApiRequest) -> t.Dict[str, t.Any]:
|
|
96
93
|
ls.log_trace(f"API request: {request}")
|
|
94
|
+
if self.lsp_context is None:
|
|
95
|
+
current_path = Path.cwd()
|
|
96
|
+
self._ensure_context_in_folder(current_path)
|
|
97
97
|
if self.lsp_context is None:
|
|
98
98
|
raise RuntimeError("No context found")
|
|
99
99
|
|
|
@@ -291,6 +291,20 @@ class SQLMeshLanguageServer:
|
|
|
291
291
|
raise RuntimeError("No context found")
|
|
292
292
|
return self.lsp_context
|
|
293
293
|
|
|
294
|
+
def _ensure_context_in_folder(self, folder_uri: Path) -> None:
|
|
295
|
+
if self.lsp_context is not None:
|
|
296
|
+
return
|
|
297
|
+
for ext in ("py", "yml", "yaml"):
|
|
298
|
+
config_path = folder_uri / f"config.{ext}"
|
|
299
|
+
if config_path.exists():
|
|
300
|
+
try:
|
|
301
|
+
created_context = self.context_class(paths=[folder_uri])
|
|
302
|
+
self.lsp_context = LSPContext(created_context)
|
|
303
|
+
loaded_sqlmesh_message(self.server, folder_uri)
|
|
304
|
+
return
|
|
305
|
+
except Exception as e:
|
|
306
|
+
self.server.show_message(f"Error loading context: {e}", types.MessageType.Error)
|
|
307
|
+
|
|
294
308
|
def _ensure_context_for_document(
|
|
295
309
|
self,
|
|
296
310
|
document_uri: URI,
|
|
@@ -382,6 +396,13 @@ class SQLMeshLanguageServer:
|
|
|
382
396
|
self.server.start_io()
|
|
383
397
|
|
|
384
398
|
|
|
399
|
+
def loaded_sqlmesh_message(ls: LanguageServer, folder: Path) -> None:
|
|
400
|
+
ls.show_message(
|
|
401
|
+
f"Loaded SQLMesh context from {folder}",
|
|
402
|
+
types.MessageType.Info,
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
|
|
385
406
|
def main() -> None:
|
|
386
407
|
# Example instantiator that just uses the same signature as your original `Context` usage.
|
|
387
408
|
sqlmesh_server = SQLMeshLanguageServer(context_class=Context)
|
sqlmesh/utils/pydantic.py
CHANGED
|
@@ -306,6 +306,24 @@ def cron_validator(v: t.Any) -> str:
|
|
|
306
306
|
return v
|
|
307
307
|
|
|
308
308
|
|
|
309
|
+
def get_concrete_types_from_typehint(typehint: type[t.Any]) -> set[type[t.Any]]:
|
|
310
|
+
concrete_types = set()
|
|
311
|
+
unpacked = t.get_origin(typehint)
|
|
312
|
+
if unpacked is None:
|
|
313
|
+
if type(typehint) == type(type):
|
|
314
|
+
return {typehint}
|
|
315
|
+
elif unpacked is t.Union:
|
|
316
|
+
for item in t.get_args(typehint):
|
|
317
|
+
if str(item).startswith("typing."):
|
|
318
|
+
concrete_types |= get_concrete_types_from_typehint(item)
|
|
319
|
+
else:
|
|
320
|
+
concrete_types.add(item)
|
|
321
|
+
else:
|
|
322
|
+
concrete_types.add(unpacked)
|
|
323
|
+
|
|
324
|
+
return concrete_types
|
|
325
|
+
|
|
326
|
+
|
|
309
327
|
if t.TYPE_CHECKING:
|
|
310
328
|
SQLGlotListOfStrings = t.List[str]
|
|
311
329
|
SQLGlotString = str
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
sqlmesh/__init__.py,sha256=69xw6bTmi4cW90M-sl3g6wLDgxVcLHcKg1q8GS3lqyA,7466
|
|
2
|
-
sqlmesh/_version.py,sha256=
|
|
2
|
+
sqlmesh/_version.py,sha256=ZyYEbKRiUuvbnbcMpZ8ZrN0r56rDLeaI5UqpifrpO7U,515
|
|
3
3
|
sqlmesh/magics.py,sha256=JHorAZNtezf123jmTyNSoUC9yHmv-08hMP205PJmmIo,39750
|
|
4
4
|
sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -19,11 +19,11 @@ sqlmesh/core/dialect.py,sha256=fPTV517IOS0nWMxYznNNQnXkQkFFrPOSKe8ghsQ0o8A,49759
|
|
|
19
19
|
sqlmesh/core/environment.py,sha256=0TTQf4C4LXwf37fm-dfYv1qyG7vtZfQI5rizgm5g0j0,11442
|
|
20
20
|
sqlmesh/core/lineage.py,sha256=zjB0Zfamo2Fja2r5SSZPMbrEKTXr1WjozZPVqvxdybI,3143
|
|
21
21
|
sqlmesh/core/loader.py,sha256=5ty4qY4qQFQuinhtNRzB-l5yvU4TgdPPW_Y_9VrnS2U,32244
|
|
22
|
-
sqlmesh/core/macros.py,sha256=
|
|
22
|
+
sqlmesh/core/macros.py,sha256=wSKkFDZ2eIvhPENIsQ_7j27zVMHIgT-2juRjGvDeEKM,59620
|
|
23
23
|
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
|
-
sqlmesh/core/renderer.py,sha256=
|
|
26
|
+
sqlmesh/core/renderer.py,sha256=KOr7rQ-RfWiS51cEj2fzdhxCrYbU0A5wNTGwKyeqLt4,26636
|
|
27
27
|
sqlmesh/core/scheduler.py,sha256=TB03rSvPyaPMRANOJq_O_cNXvu0fc5rVaDVC9olE5kg,34196
|
|
28
28
|
sqlmesh/core/schema_diff.py,sha256=mE28W51JUQz6q8inSOw2Cds84VPIqPxI6C2ed6xLmrg,29812
|
|
29
29
|
sqlmesh/core/schema_loader.py,sha256=lvrI9k7hr1P4X4E6t3U-KrcuvdQuw0UdNlN90P2s52w,3563
|
|
@@ -41,7 +41,7 @@ sqlmesh/core/config/__init__.py,sha256=b4gFb04tpeZpowqJD-7h3U3TLgxrpQhZahVEAo6VW
|
|
|
41
41
|
sqlmesh/core/config/base.py,sha256=t8NQmsgQoZSc-k0dlDiCb8t1jj0AMYdGZ-6se9q_Pks,4898
|
|
42
42
|
sqlmesh/core/config/categorizer.py,sha256=6vzUoNLjR6GOEb_2mYVz2TwmMv2BfldgHX2u-Le5HZs,1975
|
|
43
43
|
sqlmesh/core/config/common.py,sha256=-o_HoRFtR4u84frg_TLno7z7vS9II6ASiOayb59MKHo,2806
|
|
44
|
-
sqlmesh/core/config/connection.py,sha256=
|
|
44
|
+
sqlmesh/core/config/connection.py,sha256=NlTFCqRVA9S18EfdXELH3Qb79Qfj84Tt-_eW0-4P0Eg,75808
|
|
45
45
|
sqlmesh/core/config/feature_flag.py,sha256=JRcD31OG_t2cYc24meKbHDGB0iVID0P07V2oOeB_mgA,203
|
|
46
46
|
sqlmesh/core/config/format.py,sha256=6CXFbvnor56xbldKE-Vrm9k_ABRoY4v6vgIb3mCihiQ,1355
|
|
47
47
|
sqlmesh/core/config/gateway.py,sha256=tYngyqwd_4Qr9lhcv2hlvLvb_2pgYYtKu6hdGsTr-4I,1931
|
|
@@ -87,15 +87,15 @@ sqlmesh/core/model/__init__.py,sha256=C8GRZ53xuXEA9hQv3BQS9pNNyd9rZ06R_B96UYGhDu
|
|
|
87
87
|
sqlmesh/core/model/cache.py,sha256=s-aEFuUmUKITaWHvYbOyRarsjsgoA6vfASK-f-MwJ9k,7257
|
|
88
88
|
sqlmesh/core/model/common.py,sha256=J3ukpCEvZyfiYlG38aMhqxlR-Tyq2Sm2dzg5SOnldXc,16279
|
|
89
89
|
sqlmesh/core/model/decorator.py,sha256=v_sVudNROGrtj5cZ3vgcOFnwPdzwoUGY6REAkQpIMQc,8927
|
|
90
|
-
sqlmesh/core/model/definition.py,sha256=
|
|
90
|
+
sqlmesh/core/model/definition.py,sha256=QBwGNL7Jqg8BGgpZfTtKciRJA7axkI5FShJJjnUDQ4w,108645
|
|
91
91
|
sqlmesh/core/model/kind.py,sha256=i6_AMBarXPGPoMdF9kzBkyqS9tu__a2339-BoX7TgCM,36010
|
|
92
92
|
sqlmesh/core/model/meta.py,sha256=Hxn5BjfnGATjopHQ4Odok3FoO0X1Ulb2gm6aAvwQhP0,19076
|
|
93
93
|
sqlmesh/core/model/schema.py,sha256=QzM1cOfukuK3L-cEE9MtxKeYec3x5JvutdZAnczJSiQ,3858
|
|
94
94
|
sqlmesh/core/model/seed.py,sha256=ctUHH6CmeEnBVJyIAZznx0xJBm09W7VIZ-76Cfwfq28,5004
|
|
95
95
|
sqlmesh/core/plan/__init__.py,sha256=ctpnu9mK3uTujs0It8qRMqcj9GdObXDnvSgn4rD2zqc,450
|
|
96
|
-
sqlmesh/core/plan/builder.py,sha256=
|
|
96
|
+
sqlmesh/core/plan/builder.py,sha256=Fd5raxq6r6b_3mOZndiI2U7SmliVYevcrpxWNqRV_OE,38471
|
|
97
97
|
sqlmesh/core/plan/definition.py,sha256=SI3zi2poPkKJKTZogYv60Q7eIOhksaAcFUcu-J2-XqI,13218
|
|
98
|
-
sqlmesh/core/plan/evaluator.py,sha256=
|
|
98
|
+
sqlmesh/core/plan/evaluator.py,sha256=RAHJgQoV5Y5SIG_pV2O_Bn0VFlD1yzMC0UrUU6eaB_E,26842
|
|
99
99
|
sqlmesh/core/snapshot/__init__.py,sha256=Z5HTetNCZGoKF1WAKXk4LWL9dc8EC8lwS2O4TtoBmt4,1317
|
|
100
100
|
sqlmesh/core/snapshot/cache.py,sha256=MRYi_koDvp2yeQ5NDGoNFzhuJTw7Vh7mI0oJyeVbqio,4022
|
|
101
101
|
sqlmesh/core/snapshot/categorizer.py,sha256=qGG5870mu1jR2whKisSBH_GFbsyh96RnzJDgkN7DV9g,2482
|
|
@@ -159,7 +159,7 @@ sqlmesh/lsp/api.py,sha256=LJdECSaEZoPbu_Xl4KscVG-WLt7_g4dY-zKGO68dH14,2162
|
|
|
159
159
|
sqlmesh/lsp/completions.py,sha256=Uo8lUzPBeoB58Eu2642YoAtNI0pgIFWFSvwmuJALTv4,3583
|
|
160
160
|
sqlmesh/lsp/context.py,sha256=Ff09vrsawdYS-7YcXbGZW_RU-tj_-k8WV7maCghpYp0,1438
|
|
161
161
|
sqlmesh/lsp/custom.py,sha256=GvNAiW7imPI8xmIx3qLWN5FljGPHFJKh0N5b6aZnwRo,489
|
|
162
|
-
sqlmesh/lsp/main.py,sha256=
|
|
162
|
+
sqlmesh/lsp/main.py,sha256=yX4HDvg6MmXvApndvHWUh9tsSXIWoa2hzgN3TtSzT2s,18044
|
|
163
163
|
sqlmesh/lsp/reference.py,sha256=MiTnNmaGrVs1Scms3jHkZ89Cu8_ZLJGAHcs1LRywFdU,8129
|
|
164
164
|
sqlmesh/lsp/uri.py,sha256=mvSLbZGmMTHPpliThOtVWiFcHnfJzp1w39q9l-xD2SI,802
|
|
165
165
|
sqlmesh/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -264,11 +264,11 @@ sqlmesh/utils/jinja.py,sha256=6Iob2Pv88L2rCaHyl_V90b5GKsG9hI10Ua_FRWhQIl0,23628
|
|
|
264
264
|
sqlmesh/utils/metaprogramming.py,sha256=i1rxWi-oxdh1VwKoBh5Qvy0GgHm9GaDZMvIrv3QXGt4,23083
|
|
265
265
|
sqlmesh/utils/migration.py,sha256=R7Ck6FX-LfcujGy7sgS0kDWlK-xAEBODr3gqIQ8gC08,835
|
|
266
266
|
sqlmesh/utils/pandas.py,sha256=uKI-ygEtMcGDRzXdBu0RkGmMBkYxwu5O2Wabho841Ls,2196
|
|
267
|
-
sqlmesh/utils/pydantic.py,sha256=
|
|
267
|
+
sqlmesh/utils/pydantic.py,sha256=I898jAFqa3qU6lG2uPpRebVFncOUo8ZrLWM_R3K3DHU,11685
|
|
268
268
|
sqlmesh/utils/rich.py,sha256=xNZyPCqEc4TAlJlsEthg-5eYUWpaizz0QjBzO7a1Yv4,1509
|
|
269
269
|
sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
|
|
270
270
|
sqlmesh/utils/yaml.py,sha256=np-WVcwmwsKghCgAj1OBBMsK1SXSRn4wR-H37cGiFr8,2282
|
|
271
|
-
sqlmesh-0.
|
|
271
|
+
sqlmesh-0.186.1.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
|
|
272
272
|
web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
273
273
|
web/client/dist/index.html,sha256=xQIU9G6dbuTnmbHZ61bSYbh0gYz9A2lb4BRwLlXL94Y,5472
|
|
274
274
|
web/client/dist/assets/Audits-Dcl7Y5yf.js,sha256=D2CfXzrdXFdD_-7c51tBJCKNwUY9yGeIpDEaRae7V8I,1041
|
|
@@ -386,8 +386,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
|
|
|
386
386
|
web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
|
|
387
387
|
web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
|
|
388
388
|
web/server/api/endpoints/table_diff.py,sha256=Wd5YxeKbZB7AkrDvqFgvV9ZQlnKYOF1n5W_w2EHE_Zw,2085
|
|
389
|
-
sqlmesh-0.
|
|
390
|
-
sqlmesh-0.
|
|
391
|
-
sqlmesh-0.
|
|
392
|
-
sqlmesh-0.
|
|
393
|
-
sqlmesh-0.
|
|
389
|
+
sqlmesh-0.186.1.dist-info/METADATA,sha256=e1nmr6XMP09suPC39FNfoJ6nLi_puiRGd3E1PqWtC2k,25518
|
|
390
|
+
sqlmesh-0.186.1.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
|
391
|
+
sqlmesh-0.186.1.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
|
|
392
|
+
sqlmesh-0.186.1.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
|
|
393
|
+
sqlmesh-0.186.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|