Files
Giacomo Vercesi f17aa20bd7 model.migrations: implicitly increase version
Instead of delegating to the migration the task of increasing the model
version, do it implicitly as part of the `migrate` function.
2025-10-16 16:08:05 +02:00

54 lines
1.4 KiB
Python

#
# This file is distributed under the MIT License. See LICENSE.md for details.
#
import importlib
from abc import ABC, abstractmethod
# mypy cannot see the generated code, so this "type: ignore" is necessary
from revng.model import Binary # type: ignore
__all__ = ["migrate", "MigrationException", "MigrationBase"]
class MigrationException(Exception):
pass
class MigrationBase(ABC):
def __init__(self):
pass
@abstractmethod
def migrate(self, model: dict):
pass
def migrate(model: dict):
"""Runs migrations procedures against `model` up to the schema version supported by the current
version of revng.
An input model with no `Version` is assumed to be in the latest schema version, and thus no
migrations are run against it.
"""
if "Version" not in model:
return
version = model["Version"]
if version < 0:
raise MigrationException(f"The Version must be a positive integer but is {version}")
if version > Binary.SchemaVersion:
raise MigrationException(
f"The highest possible model schema version is {Binary.SchemaVersion}"
+ f"but the input model has version {version}"
)
for i in range(version + 1, Binary.SchemaVersion + 1):
migration_libray = importlib.import_module(f".versions.v{i}", __package__)
migration = migration_libray.Migration()
migration.migrate(model)
model["Version"] = i