Skip to content

Commit c602f8b

Browse files
authored
feat!: include sqlmesh in version check (#2125)
* feat!: include sqlmesh in version check * update check logic
1 parent 1229c18 commit c602f8b

File tree

3 files changed

+62
-11
lines changed

3 files changed

+62
-11
lines changed

sqlmesh/core/state_sync/base.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ class Versions(PydanticModel):
4242
def minor_sqlglot_version(self) -> t.Tuple[int, int]:
4343
return major_minor(self.sqlglot_version)
4444

45+
@property
46+
def minor_sqlmesh_version(self) -> t.Tuple[int, int]:
47+
return major_minor(self.sqlmesh_version)
48+
4549
@field_validator("sqlglot_version", "sqlmesh_version", mode="before")
4650
@classmethod
4751
def _package_version_validator(cls, v: t.Any) -> str:
@@ -178,6 +182,8 @@ def get_versions(self, validate: bool = True) -> Versions:
178182
Returns:
179183
The versions object.
180184
"""
185+
from sqlmesh._version import __version__ as SQLMESH_VERSION
186+
181187
versions = self._get_versions()
182188

183189
if validate:
@@ -204,27 +210,32 @@ def raise_error(
204210
f"{lib} (local) is using version '{local}' which is behind '{remote}' (remote).{upgrade_suggestion}"
205211
)
206212

207-
if SCHEMA_VERSION < versions.schema_version:
213+
if SCHEMA_VERSION != versions.schema_version:
208214
raise_error(
209215
"SQLMesh",
210216
SCHEMA_VERSION,
211217
versions.schema_version,
212218
remote_package_version=versions.sqlmesh_version,
219+
ahead=SCHEMA_VERSION > versions.schema_version,
213220
)
214221

215-
if major_minor(SQLGLOT_VERSION) < major_minor(versions.sqlglot_version):
222+
if major_minor(SQLGLOT_VERSION) != major_minor(versions.sqlglot_version):
216223
raise_error(
217224
"SQLGlot",
218225
SQLGLOT_VERSION,
219226
versions.sqlglot_version,
220227
remote_package_version=versions.sqlglot_version,
228+
ahead=major_minor(SQLGLOT_VERSION) > major_minor(versions.sqlglot_version),
221229
)
222230

223-
if SCHEMA_VERSION > versions.schema_version:
224-
raise_error("SQLMesh", SCHEMA_VERSION, versions.schema_version, ahead=True)
225-
226-
if major_minor(SQLGLOT_VERSION) > major_minor(versions.sqlglot_version):
227-
raise_error("SQLGlot", SQLGLOT_VERSION, versions.sqlglot_version, ahead=True)
231+
if major_minor(SQLMESH_VERSION) != major_minor(versions.sqlmesh_version):
232+
raise_error(
233+
"SQLMesh",
234+
SQLMESH_VERSION,
235+
versions.sqlmesh_version,
236+
remote_package_version=versions.sqlmesh_version,
237+
ahead=major_minor(SQLMESH_VERSION) > major_minor(versions.sqlmesh_version),
238+
)
228239

229240
return versions
230241

sqlmesh/core/state_sync/engine_adapter.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,11 @@ def migrate(self, default_catalog: t.Optional[str], skip_backup: bool = False) -
898898
versions = self.get_versions(validate=False)
899899
migrations = MIGRATIONS[versions.schema_version :]
900900

901-
if not migrations and major_minor(SQLGLOT_VERSION) == versions.minor_sqlglot_version:
901+
if (
902+
not migrations
903+
and major_minor(SQLGLOT_VERSION) == versions.minor_sqlglot_version
904+
and major_minor(SQLMESH_VERSION) == versions.minor_sqlmesh_version
905+
):
902906
return
903907

904908
if not skip_backup:

tests/core/test_state_sync.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ def test_unpause_snapshots_remove_intervals(
12051205
]
12061206

12071207

1208-
def test_get_version(state_sync: EngineAdapterStateSync) -> None:
1208+
def test_version_schema(state_sync: EngineAdapterStateSync) -> None:
12091209
from sqlmesh import __version__ as SQLMESH_VERSION
12101210

12111211
# fresh install should not raise
@@ -1250,29 +1250,65 @@ def test_get_version(state_sync: EngineAdapterStateSync) -> None:
12501250
state_sync.get_versions()
12511251
state_sync.get_versions(validate=False)
12521252

1253+
1254+
def test_version_sqlmesh(state_sync: EngineAdapterStateSync) -> None:
1255+
from sqlmesh import __version__ as SQLMESH_VERSION
1256+
from sqlmesh import __version_tuple__ as SQLMESH_VERSION_TUPLE
1257+
1258+
# patch version sqlmesh doesn't matter
1259+
major, minor, patch, *_ = SQLMESH_VERSION_TUPLE
1260+
sqlmesh_version_patch_bump = f"{major}.{minor}.{int(patch) + 1}"
1261+
state_sync._update_versions(sqlmesh_version=sqlmesh_version_patch_bump)
1262+
state_sync.get_versions(validate=False)
1263+
1264+
# sqlmesh version is behind
1265+
sqlmesh_version_minor_bump = f"{major}.{int(minor) + 1}.{patch}"
1266+
error = (
1267+
rf"SQLMesh \(local\) is using version '{SQLMESH_VERSION}' which is behind '{sqlmesh_version_minor_bump}' \(remote\). "
1268+
rf"""Please upgrade SQLMesh \('pip install --upgrade "sqlmesh=={sqlmesh_version_minor_bump}"' command\)."""
1269+
)
1270+
state_sync._update_versions(sqlmesh_version=sqlmesh_version_minor_bump)
1271+
with pytest.raises(SQLMeshError, match=error):
1272+
state_sync.get_versions()
1273+
state_sync.get_versions(validate=False)
1274+
1275+
# sqlmesh version is ahead
1276+
sqlmesh_version_minor_decrease = f"{major}.{int(minor) - 1}.{patch}"
1277+
error = rf"SQLMesh \(local\) is using version '{SQLMESH_VERSION}' which is ahead of '{sqlmesh_version_minor_decrease}'"
1278+
state_sync._update_versions(sqlmesh_version=sqlmesh_version_minor_decrease)
1279+
with pytest.raises(SQLMeshError, match=error):
1280+
state_sync.get_versions()
1281+
state_sync.get_versions(validate=False)
1282+
1283+
1284+
def test_version_sqlglot(state_sync: EngineAdapterStateSync) -> None:
12531285
# patch version sqlglot doesn't matter
12541286
major, minor, patch, *_ = SQLGLOT_VERSION.split(".")
12551287
sqlglot_version = f"{major}.{minor}.{int(patch) + 1}"
12561288
state_sync._update_versions(sqlglot_version=sqlglot_version)
12571289
state_sync.get_versions(validate=False)
12581290

1259-
# sqlglot version is behind, always raise
1291+
# sqlglot version is behind
12601292
sqlglot_version = f"{major}.{int(minor) + 1}.{patch}"
12611293
error = (
12621294
rf"SQLGlot \(local\) is using version '{SQLGLOT_VERSION}' which is behind '{sqlglot_version}' \(remote\). "
12631295
rf"""Please upgrade SQLGlot \('pip install --upgrade "sqlglot=={sqlglot_version}"' command\)."""
12641296
)
12651297
state_sync._update_versions(sqlglot_version=sqlglot_version)
1298+
with pytest.raises(SQLMeshError, match=error):
1299+
state_sync.get_versions()
12661300
state_sync.get_versions(validate=False)
12671301

1268-
# sqlglot version is ahead, only raise with validate is true
1302+
# sqlglot version is ahead
12691303
sqlglot_version = f"{major}.{int(minor) - 1}.{patch}"
12701304
error = rf"SQLGlot \(local\) is using version '{SQLGLOT_VERSION}' which is ahead of '{sqlglot_version}'"
12711305
state_sync._update_versions(sqlglot_version=sqlglot_version)
12721306
with pytest.raises(SQLMeshError, match=error):
12731307
state_sync.get_versions()
12741308
state_sync.get_versions(validate=False)
12751309

1310+
1311+
def test_empty_versions() -> None:
12761312
for empty_versions in (
12771313
Versions(),
12781314
Versions(schema_version=None, sqlglot_version=None, sqlmesh_version=None),

0 commit comments

Comments
 (0)