Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v3.3.2 #59

Merged
merged 7 commits into from
Nov 6, 2024
2 changes: 1 addition & 1 deletion acacore/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "3.3.1"
__version__ = "3.3.2"
65 changes: 65 additions & 0 deletions acacore/database/upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from .files_db import FileDB


# noinspection SqlResolve
def get_db_version(conn: Connection) -> Version | None:
if res := conn.execute("select VALUE from Metadata where KEY like 'version'").fetchone():
return Version(res[0])
Expand Down Expand Up @@ -154,12 +155,14 @@ def upgrade_3to3_0_2(conn: Connection) -> Version:
return set_db_version(conn, Version("3.0.2"))


# noinspection SqlResolve
def upgrade_3_0_2to3_0_6(conn: Connection) -> Version:
conn.execute("update Files set action = 'ignore' where action = 'template'")
conn.commit()
return set_db_version(conn, Version("3.0.6"))


# noinspection SqlResolve
def upgrade_3_0_6to3_0_7(conn: Connection) -> Version:
def convert_action_data(data: dict) -> dict | None:
if (reidentify := data.get("reidentify")) and reidentify.get("on_fail"):
Expand All @@ -181,6 +184,7 @@ def convert_action_data(data: dict) -> dict | None:
return set_db_version(conn, Version("3.0.7"))


# noinspection SqlResolve
def upgrade_3_1to3_2(conn: Connection) -> Version:
def convert_action_data(data: dict) -> dict:
if not data.get("convert"):
Expand Down Expand Up @@ -222,6 +226,7 @@ def upgrade_3_2to3_3(conn: Connection) -> Version:
if not conn.execute("select 1 from pragma_table_info('Files') where name = 'processed_names'").fetchone():
conn.execute("alter table Files add column processed_names text default '[]'")

# noinspection SqlResolve,DuplicatedCode
def _find_original_name(uuid: str, relative_path: str) -> str:
original_path: Path = Path(relative_path)
original_name: str = original_path.name
Expand Down Expand Up @@ -292,6 +297,64 @@ def upgrade_3_3to3_3_1(conn: Connection) -> Version:
return set_db_version(conn, Version("3.3.1"))


# noinspection SqlResolve
def upgrade_3_3_1to3_3_2(conn: Connection) -> Version:
if conn.execute("select 1 from pragma_table_info('Files') where name = 'original_name'").fetchone():
conn.execute("alter table Files rename column original_name to original_path")

# noinspection SqlResolve,DuplicatedCode
def _find_original_path(uuid: str, relative_path: str) -> str:
original_path: Path = Path(relative_path)

for [data_raw] in conn.execute(
"select data from History"
" where uuid = ? and data is not null and data not in ('', '\"\"', 'null', '[]', '{}')"
" order by time desc",
(uuid,),
):
try:
data = loads(data_raw)
except JSONDecodeError:
continue

if (
not isinstance(data, list)
or len(data) != 2
or not isinstance(data[0], str)
or not isinstance(data[1], str)
):
continue

a: str = data[0]
b: str = data[1]

if a == str(original_path):
original_path = Path(b)
elif b == str(original_path):
original_path = Path(a)
elif a == original_path.name:
original_path = original_path.with_name(b)
elif b == original_path.name:
original_path = original_path.with_name(a)

return str(original_path)

# noinspection SqlWithoutWhere
conn.execute("update Files set original_path = relative_path")

conn.executemany(
"update Files set original_path = ? where uuid = ?",
(
(_find_original_path(uuid, relative_path), uuid)
for uuid, relative_path in conn.execute(
"select distinct f.uuid, f.relative_path from Files f join History h where h.uuid = f.uuid"
)
),
)

return set_db_version(conn, Version("3.3.2"))


def get_upgrade_function(current_version: Version, latest_version: Version) -> Callable[[Connection], Version]:
if current_version < Version("2.0.0"):
return upgrade_1to2
Expand All @@ -311,6 +374,8 @@ def get_upgrade_function(current_version: Version, latest_version: Version) -> C
return upgrade_3_2to3_3
elif current_version < Version("3.3.1"):
return upgrade_3_3to3_3_1
elif current_version < Version("3.3.2"):
return upgrade_3_3_1to3_3_2
elif current_version < latest_version:
return lambda c: set_db_version(c, Version(__version__))
else:
Expand Down
9 changes: 7 additions & 2 deletions acacore/models/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ class File(BaseModel):
parent: UUID4 | None = None
processed: bool = False
lock: bool = False
original_name: str
original_path: Path
processed_names: list[str] = Field(default_factory=list)
root: Path | None = DBField(None, ignore=True)

Expand All @@ -99,7 +99,12 @@ class File(BaseModel):
@classmethod
def _model_validator(cls, data: dict):
if isinstance(data, dict):
data["original_name"] = data.get("original_name", "").strip() or Path(data["relative_path"]).name
if (op := data.get("original_path")) and isinstance(op, Path):
data["original_path"] = op
elif isinstance(op, str) and op.strip():
data["original_path"] = Path(op)
else:
data["original_path"] = data["relative_path"]
return data

# noinspection PyNestedDecorators
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "acacore"
version = "3.3.1"
version = "3.3.2"
description = ""
authors = ["Matteo Campinoti <[email protected]>"]
license = "GPL-3.0"
Expand Down
Loading