Skip to content

Commit a5496e3

Browse files
committed
PR feedback
1 parent 366f3fe commit a5496e3

File tree

4 files changed

+49
-6
lines changed

4 files changed

+49
-6
lines changed

sqlmesh/core/config/root.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,9 @@ class Config(BaseConfig):
148148
environment_suffix_target: EnvironmentSuffixTarget = Field(
149149
default=EnvironmentSuffixTarget.default
150150
)
151-
physical_table_naming_convention: t.Optional[TableNamingConvention] = None
151+
physical_table_naming_convention: TableNamingConvention = Field(
152+
default=TableNamingConvention.default
153+
)
152154
gateway_managed_virtual_layer: bool = False
153155
infer_python_dependencies: bool = True
154156
environment_catalog_mapping: RegexKeyDict = {}

sqlmesh/core/snapshot/definition.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ class SnapshotDataVersion(PydanticModel, frozen=True):
228228
change_category: t.Optional[SnapshotChangeCategory] = None
229229
physical_schema_: t.Optional[str] = Field(default=None, alias="physical_schema")
230230
dev_table_suffix: str
231+
table_naming_convention: TableNamingConvention = Field(default=TableNamingConvention.default)
231232

232233
def snapshot_id(self, name: str) -> SnapshotId:
233234
return SnapshotId(name=name, identifier=self.fingerprint.to_identifier())
@@ -334,7 +335,7 @@ class SnapshotInfoMixin(ModelKindMixin):
334335
# This can be removed from this model once Pydantic 1 support is dropped (must remain in `Snapshot` though)
335336
base_table_name_override: t.Optional[str]
336337
dev_table_suffix: str
337-
table_naming_convention: t.Optional[TableNamingConvention] = None
338+
table_naming_convention: TableNamingConvention = Field(default=TableNamingConvention.default)
338339

339340
@cached_property
340341
def identifier(self) -> str:
@@ -609,8 +610,8 @@ class Snapshot(PydanticModel, SnapshotInfoMixin):
609610
base_table_name_override: t.Optional[str] = None
610611
next_auto_restatement_ts: t.Optional[int] = None
611612
dev_table_suffix: str = "dev"
612-
table_naming_convention_: t.Optional[TableNamingConvention] = Field(
613-
default=None, alias="table_naming_convention"
613+
table_naming_convention_: TableNamingConvention = Field(
614+
default=TableNamingConvention.default, alias="table_naming_convention"
614615
)
615616

616617
@field_validator("ttl")
@@ -663,7 +664,7 @@ def from_node(
663664
ttl: str = c.DEFAULT_SNAPSHOT_TTL,
664665
version: t.Optional[str] = None,
665666
cache: t.Optional[t.Dict[str, SnapshotFingerprint]] = None,
666-
table_naming_convention: t.Optional[TableNamingConvention] = None,
667+
table_naming_convention: TableNamingConvention = TableNamingConvention.default,
667668
) -> Snapshot:
668669
"""Creates a new snapshot for a node.
669670
@@ -1023,6 +1024,7 @@ def categorize_as(self, category: SnapshotChangeCategory) -> None:
10231024
previous_version = self.previous_version
10241025
self.version = previous_version.data_version.version
10251026
self.physical_schema_ = previous_version.physical_schema
1027+
self.table_naming_convention = previous_version.table_naming_convention
10261028
if self.is_materialized and (category.is_indirect_non_breaking or category.is_metadata):
10271029
# Reuse the dev table for indirect non-breaking changes.
10281030
self.dev_version_ = (
@@ -1229,6 +1231,7 @@ def data_version(self) -> SnapshotDataVersion:
12291231
change_category=self.change_category,
12301232
physical_schema=self.physical_schema,
12311233
dev_table_suffix=self.dev_table_suffix,
1234+
table_naming_convention=self.table_naming_convention,
12321235
)
12331236

12341237
@property

tests/core/test_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1419,7 +1419,7 @@ def test_load_yaml_config_custom_dotenv_path(tmp_path_factory):
14191419
@pytest.mark.parametrize(
14201420
"convention_str, expected",
14211421
[
1422-
(None, None),
1422+
(None, TableNamingConvention.SCHEMA_AND_TABLE),
14231423
("schema_and_table", TableNamingConvention.SCHEMA_AND_TABLE),
14241424
("table_only", TableNamingConvention.TABLE_ONLY),
14251425
("hash_md5", TableNamingConvention.HASH_MD5),

tests/core/test_snapshot.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ def test_json(snapshot: Snapshot):
166166
"name": '"name"',
167167
"parents": [{"name": '"parent"."tbl"', "identifier": snapshot.parents[0].identifier}],
168168
"previous_versions": [],
169+
"table_naming_convention": "schema_and_table",
169170
"updated_ts": 1663891973000,
170171
"version": snapshot.fingerprint.to_version(),
171172
"migrated": False,
@@ -1140,6 +1141,9 @@ def test_snapshot_table_name(snapshot: Snapshot, make_snapshot: t.Callable):
11401141
data_hash="1", metadata_hash="1", parent_data_hash="1"
11411142
)
11421143
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
1144+
assert snapshot.table_naming_convention == TableNamingConvention.SCHEMA_AND_TABLE
1145+
assert snapshot.data_version.table_naming_convention == TableNamingConvention.SCHEMA_AND_TABLE
1146+
11431147
snapshot.previous_versions = ()
11441148
assert snapshot.table_name(is_deployable=True) == "sqlmesh__default.name__3078928823"
11451149
assert snapshot.table_name(is_deployable=False) == "sqlmesh__default.name__3078928823__dev"
@@ -1196,6 +1200,8 @@ def test_table_name_naming_convention_table_only(make_snapshot: t.Callable[...,
11961200
table_naming_convention=TableNamingConvention.TABLE_ONLY,
11971201
)
11981202
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
1203+
assert snapshot.table_naming_convention == TableNamingConvention.TABLE_ONLY
1204+
assert snapshot.data_version.table_naming_convention == TableNamingConvention.TABLE_ONLY
11991205

12001206
assert snapshot.table_name(is_deployable=True) == f"foo.sqlmesh__bar.baz__{snapshot.version}"
12011207
assert (
@@ -1220,6 +1226,8 @@ def test_table_name_naming_convention_hash_md5(make_snapshot: t.Callable[..., Sn
12201226
table_naming_convention=TableNamingConvention.HASH_MD5,
12211227
)
12221228
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
1229+
assert snapshot.table_naming_convention == TableNamingConvention.HASH_MD5
1230+
assert snapshot.data_version.table_naming_convention == TableNamingConvention.HASH_MD5
12231231

12241232
hash = md5(f"foo.sqlmesh__bar.bar__baz__{snapshot.version}")
12251233
assert snapshot.table_name(is_deployable=True) == f"foo.sqlmesh__bar.sqlmesh_md5__{hash}"
@@ -1273,6 +1281,36 @@ def test_table_name_view(make_snapshot: t.Callable):
12731281
assert new_snapshot.dev_version != snapshot.dev_version
12741282

12751283

1284+
def test_table_naming_convention_change_reuse_previous_version(make_snapshot):
1285+
# Ensure that snapshots that trigger "reuse previous version" inherit the naming convention of the previous snapshot
1286+
original_snapshot: Snapshot = make_snapshot(
1287+
SqlModel(name="a", query=parse_one("select 1, ds")),
1288+
table_naming_convention=TableNamingConvention.SCHEMA_AND_TABLE,
1289+
)
1290+
original_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
1291+
1292+
assert original_snapshot.table_naming_convention == TableNamingConvention.SCHEMA_AND_TABLE
1293+
assert original_snapshot.table_name() == "sqlmesh__default.a__4145234055"
1294+
1295+
changed_snapshot: Snapshot = make_snapshot(
1296+
SqlModel(name="a", query=parse_one("select 1, 'forward_only' as a, ds")),
1297+
table_naming_convention=TableNamingConvention.HASH_MD5,
1298+
)
1299+
changed_snapshot.previous_versions = original_snapshot.all_versions
1300+
1301+
assert changed_snapshot.previous_version == original_snapshot.data_version
1302+
1303+
changed_snapshot.categorize_as(SnapshotChangeCategory.FORWARD_ONLY)
1304+
1305+
# inherited from previous version even though changed_snapshot was created with TableNamingConvention.HASH_MD5
1306+
assert changed_snapshot.table_naming_convention == TableNamingConvention.SCHEMA_AND_TABLE
1307+
assert (
1308+
changed_snapshot.previous_version.table_naming_convention
1309+
== TableNamingConvention.SCHEMA_AND_TABLE
1310+
)
1311+
assert changed_snapshot.table_name() == "sqlmesh__default.a__4145234055"
1312+
1313+
12761314
def test_categorize_change_sql(make_snapshot):
12771315
old_snapshot = make_snapshot(SqlModel(name="a", query=parse_one("select 1, ds")))
12781316

0 commit comments

Comments
 (0)