sqlmesh 0.199.1.dev34__py3-none-any.whl → 0.199.1.dev36__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.199.1.dev34'
21
- __version_tuple__ = version_tuple = (0, 199, 1, 'dev34')
20
+ __version__ = version = '0.199.1.dev36'
21
+ __version_tuple__ = version_tuple = (0, 199, 1, 'dev36')
sqlmesh/cli/main.py CHANGED
@@ -279,6 +279,8 @@ def render(
279
279
  **format_kwargs: t.Any,
280
280
  ) -> None:
281
281
  """Render a model's query, optionally expanding referenced models."""
282
+ model = ctx.obj.get_model(model, raise_if_missing=True)
283
+
282
284
  rendered = ctx.obj.render(
283
285
  model,
284
286
  start=start,
sqlmesh/core/context.py CHANGED
@@ -946,11 +946,8 @@ class GenericContext(BaseContext, t.Generic[C]):
946
946
  pass
947
947
  return self.config, self.path
948
948
 
949
- def config_for_node(self, node: str | Model | Audit) -> Config:
950
- if isinstance(node, str):
951
- path = self.get_snapshot(node, raise_if_missing=True).node._path
952
- else:
953
- path = node._path
949
+ def config_for_node(self, node: Model | Audit) -> Config:
950
+ path = node._path
954
951
  if path is None:
955
952
  return self.config
956
953
  return self.config_for_path(path)[0] # type: ignore
sqlmesh/magics.py CHANGED
@@ -641,6 +641,8 @@ class SQLMeshMagics(Magics):
641
641
  model = render_opts.pop("model")
642
642
  dialect = render_opts.pop("dialect", None)
643
643
 
644
+ model = context.get_model(model, raise_if_missing=True)
645
+
644
646
  query = context.render(
645
647
  model,
646
648
  start=render_opts.pop("start", None),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.199.1.dev34
3
+ Version: 0.199.1.dev36
4
4
  Summary: Next-generation data transformation framework
5
5
  Author-email: "TobikoData Inc." <engineering@tobikodata.com>
6
6
  License: Apache License
@@ -1,19 +1,19 @@
1
1
  sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
2
- sqlmesh/_version.py,sha256=3sW3IsgIqRv-yyS7RFt31EBonk0WMykh--mr6eY-8SE,530
3
- sqlmesh/magics.py,sha256=tdkXrxkZug6LZ5F8TH4lx_XNV3T8bHGYTJUlGJfPQ4A,41777
2
+ sqlmesh/_version.py,sha256=K5r6C5ioMaXFWAgLSjWnUOupt50RWkpzWC2lbV4X4YU,530
3
+ sqlmesh/magics.py,sha256=bEzYqXHcM0P3CjyUZ1O9arlmXAdLAhoglKbQ29fD9AE,41842
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
7
7
  sqlmesh/cicd/config.py,sha256=mpgkisSBBovlNrNZir2unT8Wes6b38RW2UsU_o4e8vY,109
8
8
  sqlmesh/cli/__init__.py,sha256=MAXAyO7isbyM-PaSdFjkJNcjn32WjOl0XzxT5gvp_vo,1690
9
- sqlmesh/cli/main.py,sha256=vzQmFtz80_nVPJKYzFVw9ea5f-fM41Ux4-qI4GeI0_w,36053
9
+ sqlmesh/cli/main.py,sha256=rWwRZCJH-ogbT3X38inrYR4lQJUAOe2jHIUOsjpyCMA,36114
10
10
  sqlmesh/cli/options.py,sha256=-4ZclMIeIg8tghLowtmQNmpEFlm0QtOVEh40NqRdFHA,2499
11
11
  sqlmesh/cli/project_init.py,sha256=5JmDmUK0WJs39hM-p76uzHYdo1Hnx6fKuJg_pR3Hn5A,16419
12
12
  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=ObpdArJOXDOihWPXsWIUuwiQ64cMlroNWJHqQPkVqC0,160753
15
15
  sqlmesh/core/constants.py,sha256=gUABXWYgH_XOSbaZAJsR5o1dmA61JDCvBDyxqqXX3LM,2630
16
- sqlmesh/core/context.py,sha256=IKZxD5BnbwLKCRFt4s02W4HZ5REXFiOnyl6Ywhc3yA8,124456
16
+ sqlmesh/core/context.py,sha256=9a8RqBBHQXjH7nMYiTcQRtp5_NYpk_9EFpPoBfDx94o,124321
17
17
  sqlmesh/core/context_diff.py,sha256=CeUmMBJzN__98YohrtAiIYPIZI9mrGBk6bVADWBLUw8,21692
18
18
  sqlmesh/core/dialect.py,sha256=1ykYwb9WZn_nCaX08PcQ0BJh2Pihv9SPvoMNjpMeCfs,50158
19
19
  sqlmesh/core/environment.py,sha256=7DbJX0r5nZRU3LhcgIxbSV-JosQYDjAt3V5Wc2Fpns8,13005
@@ -150,9 +150,7 @@ sqlmesh/dbt/converter/jinja.py,sha256=LwtMRWcVYv16cVilOekBjoFfnD-OBfaP90JpYy34ji
150
150
  sqlmesh/dbt/converter/jinja_builtins.py,sha256=EVWyDNn0wnSrn9T5TkmKdBBVdw0TzROlfwnSVgnMehM,4589
151
151
  sqlmesh/dbt/converter/jinja_transforms.py,sha256=MkgL3Wky2mHzLaEIqkCwiYQk99jL19Wt2pOoXhsqtqQ,17597
152
152
  sqlmesh/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
- sqlmesh/engines/commands.py,sha256=Fjy_seH1JL2EZxFNJBr0-eIaOn5PNY-JEb0nBbcr6Go,6094
154
153
  sqlmesh/engines/spark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
- sqlmesh/engines/spark/app.py,sha256=du4Hh-3A7yHak54_CjL0W87X_Kl3btzHpUy9koIQXf4,3748
156
154
  sqlmesh/engines/spark/db_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
155
  sqlmesh/engines/spark/db_api/errors.py,sha256=LSXuHHhkzHvKlcdwmhCM9qm51KyKoP8gQH-p_W3Oow4,148
158
156
  sqlmesh/engines/spark/db_api/spark_session.py,sha256=uQP0VFFYtp3N9mK7zKw6SoiGVhJDDYPylqx46yDwGEc,4667
@@ -284,7 +282,7 @@ sqlmesh/utils/pydantic.py,sha256=o_NsXbIpDqNpUA1Uc5xF0ZzoXQYYB0DfHwdRxBwXPNk,120
284
282
  sqlmesh/utils/rich.py,sha256=BpB47G0-JcU41LkGkeGKroexj4NOV5fox4-GOIXPgIc,3545
285
283
  sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
286
284
  sqlmesh/utils/yaml.py,sha256=hvo5lmybYLcIx4p6CQwufS8X4MbwS60lEBnCmYJCXmU,2336
287
- sqlmesh-0.199.1.dev34.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
285
+ sqlmesh-0.199.1.dev36.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
288
286
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
287
  web/client/dist/index.html,sha256=DAv6ABGogw4xRLb0T_92WP_S7XWyqVhwBgGKWtuQwU4,5472
290
288
  web/client/dist/assets/Audits-BuHAmFO8.js,sha256=zbYUF6WdUGMbnMm01GMNPb7xAJwj-o5wMdL56vPo2qE,1041
@@ -402,8 +400,8 @@ web/server/api/endpoints/models.py,sha256=kwj0s7uve3iZSMfmjkoPVMFMeY1sD0peTeyrWf
402
400
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
403
401
  web/server/api/endpoints/plan.py,sha256=bbbY50W_2MsZSTxOHWMKz0tbIm75nsRSlPy8GI2fg9Q,9306
404
402
  web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
405
- sqlmesh-0.199.1.dev34.dist-info/METADATA,sha256=q_vQrhtmnSFSZk0NLlSXgPVsNk_om42U68wH4ejEOkk,26659
406
- sqlmesh-0.199.1.dev34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
407
- sqlmesh-0.199.1.dev34.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
408
- sqlmesh-0.199.1.dev34.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
409
- sqlmesh-0.199.1.dev34.dist-info/RECORD,,
403
+ sqlmesh-0.199.1.dev36.dist-info/METADATA,sha256=arsQUvWbMOAX0m384pPzCyHXlZTa0yi5KluPZ3ESuOI,26659
404
+ sqlmesh-0.199.1.dev36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
405
+ sqlmesh-0.199.1.dev36.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
406
+ sqlmesh-0.199.1.dev36.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
407
+ sqlmesh-0.199.1.dev36.dist-info/RECORD,,
@@ -1,184 +0,0 @@
1
- import typing as t
2
- from enum import Enum
3
-
4
- from sqlglot import exp
5
- from sqlmesh.core.environment import Environment, EnvironmentNamingInfo
6
- from sqlmesh.core.snapshot import (
7
- DeployabilityIndex,
8
- Snapshot,
9
- SnapshotEvaluator,
10
- SnapshotId,
11
- SnapshotTableCleanupTask,
12
- SnapshotTableInfo,
13
- )
14
- from sqlmesh.core.state_sync import cleanup_expired_views
15
- from sqlmesh.utils.date import TimeLike
16
- from sqlmesh.utils.errors import AuditError
17
- from sqlmesh.utils.pydantic import PydanticModel
18
-
19
- COMMAND_PAYLOAD_FILE_NAME = "payload.json"
20
-
21
-
22
- class CommandType(str, Enum):
23
- EVALUATE = "evaluate"
24
- PROMOTE = "promote"
25
- DEMOTE = "demote"
26
- CLEANUP = "cleanup"
27
- CREATE_TABLES = "create_tables"
28
- MIGRATE_TABLES = "migrate_tables"
29
-
30
- # This makes it easy to integrate with argparse
31
- def __str__(self) -> str:
32
- return self.value
33
-
34
-
35
- class EvaluateCommandPayload(PydanticModel):
36
- snapshot: Snapshot
37
- parent_snapshots: t.Dict[str, Snapshot]
38
- start: TimeLike
39
- end: TimeLike
40
- execution_time: TimeLike
41
- deployability_index: DeployabilityIndex
42
- batch_index: int
43
-
44
-
45
- class PromoteCommandPayload(PydanticModel):
46
- snapshots: t.List[Snapshot]
47
- environment_naming_info: EnvironmentNamingInfo
48
- deployability_index: DeployabilityIndex
49
-
50
-
51
- class DemoteCommandPayload(PydanticModel):
52
- snapshots: t.List[SnapshotTableInfo]
53
- environment_naming_info: EnvironmentNamingInfo
54
-
55
-
56
- class CleanupCommandPayload(PydanticModel):
57
- environments: t.List[Environment]
58
- tasks: t.List[SnapshotTableCleanupTask]
59
-
60
-
61
- class CreateTablesCommandPayload(PydanticModel):
62
- target_snapshot_ids: t.List[SnapshotId]
63
- snapshots: t.List[Snapshot]
64
- deployability_index: DeployabilityIndex
65
- allow_destructive_snapshots: t.Set[str]
66
-
67
-
68
- class MigrateTablesCommandPayload(PydanticModel):
69
- target_snapshot_ids: t.List[SnapshotId]
70
- snapshots: t.List[Snapshot]
71
- allow_destructive_snapshots: t.Set[str]
72
-
73
-
74
- def evaluate(
75
- evaluator: SnapshotEvaluator, command_payload: t.Union[str, EvaluateCommandPayload]
76
- ) -> None:
77
- if isinstance(command_payload, str):
78
- command_payload = EvaluateCommandPayload.parse_raw(command_payload)
79
-
80
- parent_snapshots = command_payload.parent_snapshots
81
- parent_snapshots[command_payload.snapshot.name] = command_payload.snapshot
82
-
83
- wap_id = evaluator.evaluate(
84
- command_payload.snapshot,
85
- start=command_payload.start,
86
- end=command_payload.end,
87
- execution_time=command_payload.execution_time,
88
- snapshots=parent_snapshots,
89
- deployability_index=command_payload.deployability_index,
90
- batch_index=command_payload.batch_index,
91
- )
92
- audit_results = evaluator.audit(
93
- snapshot=command_payload.snapshot,
94
- start=command_payload.start,
95
- end=command_payload.end,
96
- execution_time=command_payload.execution_time,
97
- snapshots=parent_snapshots,
98
- deployability_index=command_payload.deployability_index,
99
- wap_id=wap_id,
100
- )
101
-
102
- failed_audit_result = next((r for r in audit_results if r.count and r.blocking), None)
103
- if failed_audit_result:
104
- raise AuditError(
105
- audit_name=failed_audit_result.audit.name,
106
- audit_args=failed_audit_result.audit_args,
107
- model=command_payload.snapshot.model_or_none,
108
- count=t.cast(int, failed_audit_result.count),
109
- query=t.cast(exp.Query, failed_audit_result.query),
110
- adapter_dialect=evaluator.adapter.dialect,
111
- )
112
-
113
-
114
- def promote(
115
- evaluator: SnapshotEvaluator, command_payload: t.Union[str, PromoteCommandPayload]
116
- ) -> None:
117
- if isinstance(command_payload, str):
118
- command_payload = PromoteCommandPayload.parse_raw(command_payload)
119
- evaluator.promote(
120
- command_payload.snapshots,
121
- command_payload.environment_naming_info,
122
- deployability_index=command_payload.deployability_index,
123
- )
124
-
125
-
126
- def demote(
127
- evaluator: SnapshotEvaluator, command_payload: t.Union[str, DemoteCommandPayload]
128
- ) -> None:
129
- if isinstance(command_payload, str):
130
- command_payload = DemoteCommandPayload.parse_raw(command_payload)
131
- evaluator.demote(
132
- command_payload.snapshots,
133
- command_payload.environment_naming_info,
134
- )
135
-
136
-
137
- def cleanup(
138
- evaluator: SnapshotEvaluator, command_payload: t.Union[str, CleanupCommandPayload]
139
- ) -> None:
140
- if isinstance(command_payload, str):
141
- command_payload = CleanupCommandPayload.parse_raw(command_payload)
142
-
143
- cleanup_expired_views(evaluator.adapter, evaluator.adapters, command_payload.environments)
144
- evaluator.cleanup(command_payload.tasks)
145
-
146
-
147
- def create_tables(
148
- evaluator: SnapshotEvaluator,
149
- command_payload: t.Union[str, CreateTablesCommandPayload],
150
- ) -> None:
151
- if isinstance(command_payload, str):
152
- command_payload = CreateTablesCommandPayload.parse_raw(command_payload)
153
-
154
- snapshots_by_id = {s.snapshot_id: s for s in command_payload.snapshots}
155
- target_snapshots = [snapshots_by_id[sid] for sid in command_payload.target_snapshot_ids]
156
- evaluator.create(
157
- target_snapshots,
158
- snapshots_by_id,
159
- deployability_index=command_payload.deployability_index,
160
- allow_destructive_snapshots=command_payload.allow_destructive_snapshots,
161
- )
162
-
163
-
164
- def migrate_tables(
165
- evaluator: SnapshotEvaluator,
166
- command_payload: t.Union[str, MigrateTablesCommandPayload],
167
- ) -> None:
168
- if isinstance(command_payload, str):
169
- command_payload = MigrateTablesCommandPayload.parse_raw(command_payload)
170
- snapshots_by_id = {s.snapshot_id: s for s in command_payload.snapshots}
171
- target_snapshots = [snapshots_by_id[sid] for sid in command_payload.target_snapshot_ids]
172
- evaluator.migrate(
173
- target_snapshots, snapshots_by_id, command_payload.allow_destructive_snapshots
174
- )
175
-
176
-
177
- COMMAND_HANDLERS: t.Dict[CommandType, t.Callable[[SnapshotEvaluator, str], None]] = {
178
- CommandType.EVALUATE: evaluate,
179
- CommandType.PROMOTE: promote,
180
- CommandType.DEMOTE: demote,
181
- CommandType.CLEANUP: cleanup,
182
- CommandType.CREATE_TABLES: create_tables,
183
- CommandType.MIGRATE_TABLES: migrate_tables,
184
- }
@@ -1,114 +0,0 @@
1
- import argparse
2
- import logging
3
- import os
4
- import tempfile
5
-
6
- from pyspark import SparkFiles
7
- from pyspark.sql import SparkSession
8
-
9
- from sqlmesh.core.engine_adapter import create_engine_adapter
10
- from sqlmesh.core.snapshot import SnapshotEvaluator
11
- from sqlmesh.engines import commands
12
- from sqlmesh.engines.spark.db_api import spark_session as spark_session_db
13
- from sqlmesh.engines.spark.db_api.errors import NotSupportedError
14
- from sqlmesh.utils.errors import SQLMeshError
15
-
16
- logger = logging.getLogger(__name__)
17
-
18
-
19
- def get_or_create_spark_session(dialect: str) -> SparkSession:
20
- if dialect == "databricks":
21
- spark = SparkSession.getActiveSession()
22
- if not spark:
23
- raise SQLMeshError("Could not find an active SparkSession.")
24
- return spark
25
- return (
26
- SparkSession.builder.config("spark.scheduler.mode", "FAIR")
27
- .enableHiveSupport()
28
- .getOrCreate()
29
- )
30
-
31
-
32
- def main(
33
- dialect: str,
34
- default_catalog: str,
35
- command_type: commands.CommandType,
36
- ddl_concurrent_tasks: int,
37
- payload_path: str,
38
- ) -> None:
39
- if dialect not in ("databricks", "spark"):
40
- raise NotSupportedError(
41
- f"Dialect '{dialect}' not supported. Must be either 'databricks' or 'spark'"
42
- )
43
- logging.basicConfig(
44
- format="%(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)",
45
- level=logging.INFO,
46
- )
47
- command_handler = commands.COMMAND_HANDLERS.get(command_type)
48
- if not command_handler:
49
- raise NotSupportedError(f"Command '{command_type.value}' not supported")
50
-
51
- spark = get_or_create_spark_session(dialect)
52
-
53
- evaluator = SnapshotEvaluator(
54
- create_engine_adapter(
55
- lambda: spark_session_db.connection(spark),
56
- dialect,
57
- default_catalog=default_catalog,
58
- multithreaded=ddl_concurrent_tasks > 1,
59
- execute_log_level=logging.INFO,
60
- ),
61
- ddl_concurrent_tasks=ddl_concurrent_tasks,
62
- )
63
- if dialect == "spark":
64
- with open(SparkFiles.get(payload_path), "r", encoding="utf-8") as payload_fd:
65
- command_payload = payload_fd.read()
66
- else:
67
- from pyspark.dbutils import DBUtils # type: ignore
68
-
69
- dbutils = DBUtils(spark)
70
- with tempfile.TemporaryDirectory() as tmp:
71
- local_payload_path = os.path.join(tmp, commands.COMMAND_PAYLOAD_FILE_NAME)
72
- dbutils.fs.cp(payload_path, f"file://{local_payload_path}")
73
- with open(local_payload_path, "r", encoding="utf-8") as payload_fd:
74
- command_payload = payload_fd.read()
75
- logger.info("Command payload:\n %s", command_payload)
76
- command_handler(evaluator, command_payload)
77
-
78
- evaluator.close()
79
-
80
-
81
- if __name__ == "__main__":
82
- parser = argparse.ArgumentParser(description="SQLMesh Spark Submit App")
83
- parser.add_argument(
84
- "--dialect",
85
- help="The dialect to use when creating the engine adapter.",
86
- )
87
- parser.add_argument(
88
- "--default_catalog",
89
- help="The default catalog to use when creating the engine adapter.",
90
- )
91
- parser.add_argument(
92
- "--command_type",
93
- type=commands.CommandType,
94
- choices=list(commands.CommandType),
95
- help="The type of command that is being run",
96
- )
97
- parser.add_argument(
98
- "--ddl_concurrent_tasks",
99
- type=int,
100
- default=1,
101
- help="The number of ddl concurrent tasks to use. Default to 1.",
102
- )
103
- parser.add_argument(
104
- "--payload_path",
105
- help="Path to the payload object. Can be a local or remote path.",
106
- )
107
- args = parser.parse_args()
108
- main(
109
- args.dialect,
110
- args.default_catalog,
111
- args.command_type,
112
- args.ddl_concurrent_tasks,
113
- args.payload_path,
114
- )