sqlmesh 0.199.1.dev34__py3-none-any.whl → 0.199.1.dev35__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.dev35'
21
+ __version_tuple__ = version_tuple = (0, 199, 1, 'dev35')
@@ -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.dev35
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=3sW3IsgIqRv-yyS7RFt31EBonk0WMykh--mr6eY-8SE,530
2
+ sqlmesh/_version.py,sha256=S9lEVv3QVWQs4d4mxXKYzMCuqOotm2m6JhCf7IGStXs,530
3
3
  sqlmesh/magics.py,sha256=tdkXrxkZug6LZ5F8TH4lx_XNV3T8bHGYTJUlGJfPQ4A,41777
4
4
  sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -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.dev35.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.dev35.dist-info/METADATA,sha256=2O2l5ufMQveHcekXHm4RlUfVObh5Pq_sSG_gm5BLqWE,26659
404
+ sqlmesh-0.199.1.dev35.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
405
+ sqlmesh-0.199.1.dev35.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
406
+ sqlmesh-0.199.1.dev35.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
407
+ sqlmesh-0.199.1.dev35.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
- )