diff --git a/CHANGELOG.md b/CHANGELOG.md index 63817b15..32233a46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v4.1.2 + +### Changes + +* Use acacore 3.1.0 + ## v4.1.1 ### Changes diff --git a/digiarch/__version__.py b/digiarch/__version__.py index 72aa7583..13ffcf42 100644 --- a/digiarch/__version__.py +++ b/digiarch/__version__.py @@ -1 +1 @@ -__version__ = "4.1.1" +__version__ = "4.1.2" diff --git a/digiarch/commands/completions.py b/digiarch/commands/completions.py index 707966e2..faac1602 100644 --- a/digiarch/commands/completions.py +++ b/digiarch/commands/completions.py @@ -1,6 +1,7 @@ from typing import ClassVar from typing import Type +from acacore.utils.decorators import docstring_format from click import argument from click import BadParameter from click import Choice @@ -16,7 +17,6 @@ from click.shell_completion import ZshComplete from digiarch.common import ctx_params -from digiarch.common import docstring_format class CompleteChoice(Choice): diff --git a/digiarch/commands/doctor.py b/digiarch/commands/doctor.py index 5ca82def..49f26d05 100644 --- a/digiarch/commands/doctor.py +++ b/digiarch/commands/doctor.py @@ -7,6 +7,9 @@ from acacore.database import FileDB from acacore.models.history import HistoryEntry +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import Choice from click import command @@ -14,12 +17,10 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import option_dry_run -from digiarch.common import start_program invalid_characters: str = "\\#%&{}[]<>*?/$!'\":@+`|=" + bytes(range(32)).decode("ascii") + "\x7f" @@ -166,7 +167,7 @@ def command_doctor(ctx: Context, root: Path, fix: tuple[str, ...], dry_run: bool check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, not dry_run, True, False) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, not dry_run, True, False) with ExceptionManager(BaseException) as exception: if not fix or "paths" in fix: diff --git a/digiarch/commands/edit/action.py b/digiarch/commands/edit/action.py index 5bd734fb..174a3785 100644 --- a/digiarch/commands/edit/action.py +++ b/digiarch/commands/edit/action.py @@ -14,6 +14,11 @@ from acacore.models.reference_files import TActionType from acacore.models.reference_files import TemplateTypeEnum from acacore.models.reference_files import TTemplateType +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import param_callback_regex +from acacore.utils.click import start_program +from acacore.utils.decorators import docstring_format from acacore.utils.helpers import ExceptionManager from click import argument from click import BadParameter @@ -26,15 +31,11 @@ from click import Path as ClickPath from pydantic import BaseModel +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import docstring_format -from digiarch.common import end_program from digiarch.common import fetch_actions from digiarch.common import option_dry_run -from digiarch.common import param_regex -from digiarch.common import start_program from .common import argument_query from .common import find_files @@ -99,7 +100,7 @@ def group_action(): "--outputs", type=str, multiple=True, - callback=param_regex("^(.[a-zA-Z0-9]+)+$"), + callback=param_callback_regex("^(.[a-zA-Z0-9]+)+$"), help='The file extensions to generate. [multiple; required for tools other than "copy"]', ) @option("--lock", is_flag=True, default=False, help="Lock the edited files.") @@ -134,7 +135,7 @@ def action_convert( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): @@ -153,7 +154,7 @@ def action_convert( @option( "--extension", type=str, - callback=param_regex(r"^(.[a-zA-Z0-9]+)+$"), + callback=param_callback_regex(r"^(.[a-zA-Z0-9]+)+$"), help="The extension the file must have for extraction to succeed.", ) @option("--lock", is_flag=True, default=False, help="Lock the edited files.") @@ -183,7 +184,7 @@ def action_extract( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): @@ -203,14 +204,14 @@ def action_extract( "data_reason", type=str, required=True, - callback=param_regex(r"^.*\S.*$"), + callback=param_callback_regex(r"^.*\S.*$"), help="The reason why the file must be processed manually.", ) @option( "--process", type=str, required=True, - callback=param_regex(r"^.*\S.*$"), + callback=param_callback_regex(r"^.*\S.*$"), help="The steps to take to process the file.", ) @option("--lock", is_flag=True, default=False, help="Lock the edited files.") @@ -240,7 +241,7 @@ def action_manual( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): @@ -266,7 +267,7 @@ def action_manual( "--reason", "data_reason", type=str, - callback=param_regex(r"^.*\S.*$"), + callback=param_callback_regex(r"^.*\S.*$"), help='The reason why the file is ignored. [required for "text" template]', ) @option("--lock", is_flag=True, default=False, help="Lock the edited files.") @@ -306,7 +307,7 @@ def action_ignore( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): @@ -378,7 +379,7 @@ def command_copy( raise BadParameter(f"Action {action} not found in {puid}.", ctx, ctx_params(ctx)["puid"]) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): diff --git a/digiarch/commands/edit/lock.py b/digiarch/commands/edit/lock.py index c46fbace..309514fa 100644 --- a/digiarch/commands/edit/lock.py +++ b/digiarch/commands/edit/lock.py @@ -3,6 +3,9 @@ from acacore.database import FileDB from acacore.models.history import HistoryEntry +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import argument from click import command @@ -10,12 +13,10 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import option_dry_run -from digiarch.common import start_program from .common import argument_query from .common import find_files @@ -49,7 +50,7 @@ def command_lock( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): diff --git a/digiarch/commands/edit/processed.py b/digiarch/commands/edit/processed.py index 207b9a52..45cd8ae1 100644 --- a/digiarch/commands/edit/processed.py +++ b/digiarch/commands/edit/processed.py @@ -3,6 +3,9 @@ from acacore.database import FileDB from acacore.models.history import HistoryEntry +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import argument from click import command @@ -10,12 +13,10 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import option_dry_run -from digiarch.common import start_program from .common import argument_query from .common import find_files @@ -55,7 +56,7 @@ def command_processed( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): diff --git a/digiarch/commands/edit/remove.py b/digiarch/commands/edit/remove.py index 7db4e820..5a5e33c2 100644 --- a/digiarch/commands/edit/remove.py +++ b/digiarch/commands/edit/remove.py @@ -3,6 +3,9 @@ from acacore.database import FileDB from acacore.models.history import HistoryEntry +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import argument from click import command @@ -10,12 +13,10 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import option_dry_run -from digiarch.common import start_program from .common import argument_query from .common import find_files @@ -64,7 +65,7 @@ def command_remove( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): diff --git a/digiarch/commands/edit/rename.py b/digiarch/commands/edit/rename.py index 45b3980f..382db900 100644 --- a/digiarch/commands/edit/rename.py +++ b/digiarch/commands/edit/rename.py @@ -5,6 +5,10 @@ from acacore.database import FileDB from acacore.models.history import HistoryEntry +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import param_callback_regex +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import argument from click import command @@ -12,13 +16,10 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import option_dry_run -from digiarch.common import param_regex -from digiarch.common import start_program from .common import argument_query from .common import find_files @@ -33,7 +34,7 @@ nargs=1, type=str, required=True, - callback=param_regex(r"^((\.[a-zA-Z0-9]+)+| +)$"), + callback=param_callback_regex(r"^((\.[a-zA-Z0-9]+)+| +)$"), ) @argument("reason", nargs=1, type=str, required=True) @option("--append", "replace_mode", flag_value="append", default=True, help="Append the new extension. [default]") @@ -65,7 +66,7 @@ def command_rename( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, not dry_run, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, not dry_run, True, dry_run) with ExceptionManager(BaseException) as exception: for file in find_files(database, query): diff --git a/digiarch/commands/edit/rollback.py b/digiarch/commands/edit/rollback.py index 17eca4ba..a4d8b189 100644 --- a/digiarch/commands/edit/rollback.py +++ b/digiarch/commands/edit/rollback.py @@ -9,6 +9,10 @@ from acacore.models.history import HistoryEntry from acacore.models.reference_files import ActionData from acacore.models.reference_files import TActionType +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import param_callback_regex +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import argument from click import command @@ -17,13 +21,10 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import option_dry_run -from digiarch.common import param_regex -from digiarch.common import start_program def rollback_edit_action(database: FileDB, event: HistoryEntry, dry_run: bool) -> tuple[File | None, str | None]: @@ -166,7 +167,7 @@ def rollback_doctor_files( "commands", type=str, multiple=True, - callback=param_regex(r"^[a-z-]+(.[a-z-]+)*$"), + callback=param_callback_regex(r"^[a-z-]+(.[a-z-]+)*$"), help="Specify commands to roll back. [multiple]", ) @option_dry_run() @@ -206,7 +207,7 @@ def command_rollback( check_database_version(ctx, ctx_params(ctx)["root"], (db_path := root / "_metadata" / "files.db")) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) with ExceptionManager(BaseException) as exception: where = "uuid is not null and time >= ? and time <= ?" diff --git a/digiarch/commands/extract/extract.py b/digiarch/commands/extract/extract.py index 76d17dbd..f5bae987 100644 --- a/digiarch/commands/extract/extract.py +++ b/digiarch/commands/extract/extract.py @@ -14,6 +14,9 @@ from acacore.models.reference_files import ManualAction from acacore.siegfried import Siegfried from acacore.siegfried.siegfried import TSignaturesProvider +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import BadParameter from click import Choice @@ -23,15 +26,13 @@ from click import pass_context from click import Path as ClickPath +from digiarch.__version__ import __version__ from digiarch.commands.identify import identify_file from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import fetch_actions from digiarch.common import fetch_custom_signatures from digiarch.common import option_dry_run -from digiarch.common import start_program from .extractors.base import ExtractError from .extractors.base import ExtractorBase @@ -151,7 +152,7 @@ def command_extract( custom_signatures = fetch_custom_signatures(ctx, "custom_signatures_file", custom_signatures_file) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, dry_run) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, dry_run) offset: int = 0 with ExceptionManager(BaseException) as exception: diff --git a/digiarch/commands/history.py b/digiarch/commands/history.py index 03d8a0a0..3563f0c9 100644 --- a/digiarch/commands/history.py +++ b/digiarch/commands/history.py @@ -6,6 +6,8 @@ import yaml from acacore.database import FileDB +from acacore.utils.click import check_database_version +from acacore.utils.click import param_callback_regex from click import command from click import Context from click import DateTime @@ -14,9 +16,7 @@ from click import pass_context from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import param_regex @command("history", no_args_is_help=True, short_help="View events log.") @@ -40,7 +40,7 @@ type=str, default=None, multiple=True, - callback=param_regex(r"[a-z%-]+(\.[a-z%-]+)*(:[a-z%-]+([.:][a-z%-]+)*)?", IGNORECASE), + callback=param_callback_regex(r"[a-z%-]+(\.[a-z%-]+)*(:[a-z%-]+([.:][a-z%-]+)*)?", IGNORECASE), help="Operation and sub-operation. [multiple]", ) @option( @@ -48,7 +48,7 @@ type=str, default=None, multiple=True, - callback=param_regex(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", IGNORECASE), + callback=param_callback_regex(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", IGNORECASE), help="File UUID. [multiple]", ) @option("--reason", type=str, default=None, multiple=True, help="Event reason.") diff --git a/digiarch/commands/identify.py b/digiarch/commands/identify.py index bb69d96e..b4a00e72 100644 --- a/digiarch/commands/identify.py +++ b/digiarch/commands/identify.py @@ -25,6 +25,9 @@ from acacore.siegfried import Siegfried from acacore.siegfried.siegfried import SiegfriedFile from acacore.siegfried.siegfried import TSignaturesProvider +from acacore.utils.click import check_database_version +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.functions import find_files from acacore.utils.helpers import ExceptionManager from click import Argument @@ -38,16 +41,14 @@ from click import Path as ClickPath from PIL import UnidentifiedImageError +from digiarch.__version__ import __version__ from digiarch.commands.edit.common import argument_query from digiarch.commands.edit.common import query_to_where from digiarch.commands.edit.common import TQuery from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params -from digiarch.common import end_program from digiarch.common import fetch_actions from digiarch.common import fetch_custom_signatures -from digiarch.common import start_program def handle_rename_action(file: File, action: RenameAction) -> tuple[Path, Path] | tuple[None, None]: @@ -280,7 +281,7 @@ def command_identify( db_path.parent.mkdir(parents=True, exist_ok=True) with FileDB(db_path) as database: - log_file, log_stdout, _ = start_program(ctx, database, None, True, True, False) + log_file, log_stdout, _ = start_program(ctx, database, __version__, None, True, True, False) database.init() with ExceptionManager(BaseException) as exception: diff --git a/digiarch/commands/search.py b/digiarch/commands/search.py index dff44bde..f125d17c 100644 --- a/digiarch/commands/search.py +++ b/digiarch/commands/search.py @@ -3,6 +3,7 @@ import yaml from acacore.database import FileDB +from acacore.utils.click import check_database_version from click import Choice from click import command from click import Context @@ -14,7 +15,6 @@ from digiarch.commands.edit.common import find_files from digiarch.commands.edit.common import TQuery from digiarch.common import argument_root -from digiarch.common import check_database_version from digiarch.common import ctx_params diff --git a/digiarch/commands/upgrade.py b/digiarch/commands/upgrade.py index 34a89f63..b7aa2021 100644 --- a/digiarch/commands/upgrade.py +++ b/digiarch/commands/upgrade.py @@ -6,6 +6,8 @@ from acacore.database import FileDB from acacore.database.upgrade import is_latest from acacore.models.history import HistoryEntry +from acacore.utils.click import end_program +from acacore.utils.click import start_program from acacore.utils.helpers import ExceptionManager from click import BadParameter from click import ClickException @@ -14,10 +16,9 @@ from click import option from click import pass_context +from digiarch.__version__ import __version__ from digiarch.common import argument_root from digiarch.common import ctx_params -from digiarch.common import end_program -from digiarch.common import start_program @command("upgrade", no_args_is_help=True, short_help="Upgrade the database.") @@ -38,7 +39,7 @@ def command_upgrade(ctx: Context, root: Path, backup: bool): "files-{version}.db". The copy will not be created if the database is already at the latest version. """ with FileDB(root / "_metadata" / "files.db", check_version=False) as database: - log_file, log_stdout, start_event = start_program(ctx, database, None, True, True, True) + log_file, log_stdout, start_event = start_program(ctx, database, __version__, None, True, True, True) updated: bool = False with ExceptionManager(BaseException, allow=[ClickException]) as exception: diff --git a/digiarch/common.py b/digiarch/common.py index 202cbba2..f2e1e415 100644 --- a/digiarch/common.py +++ b/digiarch/common.py @@ -1,64 +1,19 @@ -from datetime import datetime -from logging import ERROR -from logging import INFO -from logging import Logger from pathlib import Path -from re import compile as re_compile -from re import Pattern -from sqlite3 import DatabaseError -from sys import stdout -from traceback import format_tb -from typing import Any -from typing import Callable import yaml -from acacore.database import FileDB -from acacore.database.upgrade import is_latest -from acacore.models.history import HistoryEntry from acacore.models.reference_files import Action from acacore.models.reference_files import CustomSignature from acacore.reference_files import get_actions from acacore.reference_files import get_custom_signatures -from acacore.utils.helpers import ExceptionManager -from acacore.utils.log import setup_logger +from acacore.utils.click import ctx_params from click import argument from click import BadParameter -from click import Command from click import Context from click import option from click import Parameter from click import Path as ClickPath from pydantic import TypeAdapter -from .__version__ import __version__ - - -def ctx_params(ctx: Context) -> dict[str, Parameter]: - return {p.name: p for p in ctx.command.params} - - -def param_regex(pattern: str, flags: int = 0): - compiled_pattern: Pattern = re_compile(pattern, flags) - - def callback(ctx: Context, param: Parameter, value: str | tuple[str, ...] | None) -> str | tuple[str, ...] | None: - if value is None: - return value - elif isinstance(value, str) and not compiled_pattern.match(value): - raise BadParameter(f"does not match {pattern!r}", ctx, param) - elif isinstance(value, tuple) and any(not compiled_pattern.match(v) for v in value): - raise BadParameter(f"does not match {pattern!r}", ctx, param) - return value - - return callback - - -def copy_params(command: Command) -> Callable[[Command], Command]: - def decorator(command2: Command) -> Command: - command2.params.extend(command.params.copy()) - return command2 - - return decorator - def argument_root(exists: bool): if exists: @@ -87,24 +42,6 @@ def option_dry_run(): return option("--dry-run", is_flag=True, default=False, help="Show changes without committing them.") -def docstring_format(**kwargs: Any) -> Callable[[Callable], Callable]: # noqa: ANN401 - def decorator(func: Callable) -> Callable: - func.__doc__ = (func.__doc__ or "").format(**kwargs) - return func - - return decorator - - -def check_database_version(ctx: Context, param: Parameter, path: Path): - if not path.is_file(): - return - with FileDB(path, check_version=False) as db: - try: - is_latest(db, raise_on_difference=True) - except DatabaseError as err: - raise BadParameter(err.args[0], ctx, param) - - def fetch_actions(ctx: Context, parameter_name: str, file: Path | None) -> dict[str, Action]: if file: try: @@ -135,57 +72,3 @@ def fetch_custom_signatures(ctx: Context, parameter_name: str, file: Path | None raise BadParameter( f"Cannot download actions. {err.args[0] if err.args else ''}", ctx, ctx_params(ctx)[parameter_name] ) - - -def start_program( - ctx: Context, - database: FileDB, - time: datetime | None = None, - log_file: bool = True, - log_stdout: bool = True, - dry_run: bool = False, -) -> tuple[Logger | None, Logger | None, HistoryEntry]: - prog: str = ctx.find_root().command.name - log_file: Logger | None = ( - setup_logger(f"{prog}_file", files=[database.path.parent / f"{prog}.log"]) if log_file else None - ) - log_stdout: Logger | None = setup_logger(f"{prog}_stdout", streams=[stdout]) if log_stdout else None - program_start: HistoryEntry = HistoryEntry.command_history( - ctx, - "start", - data={"version": __version__}, - add_params_to_data=True, - time=time, - ) - - if not dry_run: - database.history.insert(program_start) - - if log_file: - program_start.log(INFO, log_file) - if log_stdout: - program_start.log(INFO, log_stdout, show_args=False) - - return log_file, log_stdout, program_start - - -def end_program( - ctx: Context, - database: FileDB, - exception: ExceptionManager, - dry_run: bool = False, - *loggers: Logger | None, -): - program_end: HistoryEntry = HistoryEntry.command_history( - ctx, - "end", - data=repr(exception.exception) if exception.exception else None, - reason="".join(format_tb(exception.traceback)) if exception.traceback else None, - ) - - for logger in (log for log in loggers if log): - program_end.log(ERROR if exception.exception else INFO, logger) - - if not dry_run: - database.history.insert(program_end) - database.commit() diff --git a/poetry.lock b/poetry.lock index 75b4c29b..7e4cc644 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "acacore" -version = "3.0.11" +version = "3.1.0" description = "" optional = false python-versions = "^3.11" @@ -14,14 +14,14 @@ click = "^8.1.7" imagesize = "^1.4.1" packaging = "^24.1" pillow = "^10.4.0" -pydantic = "^2.9.1" +pydantic = "^2.9.2" pyyaml = "^6.0.2" [package.source] type = "git" url = "https://github.com/aarhusstadsarkiv/acacore.git" -reference = "v3.0.11" -resolved_reference = "aa8661940f4160ac8462d62dd0b82441b09b74fc" +reference = "v3.1.0" +resolved_reference = "b948dc1eb4f3a424b514e5a39d46e1ab78f2c4d7" [[package]] name = "annotated-types" @@ -624,18 +624,18 @@ files = [ [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, @@ -647,100 +647,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -985,4 +985,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "446db5949a929339cd201923f5397ca78aa0a900ff58191c634d256fa4bf0069" +content-hash = "127fd99c33374da391bbe99028c5ebb2ff52a6aa99c4973f7a8c7be298d03a9c" diff --git a/pyproject.toml b/pyproject.toml index 7e01cffc..40b5142d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "digiarch" -version = "4.1.1" +version = "4.1.2" description = "Tools for the Digital Archive Project at Aarhus Stadsarkiv" authors = ["Aarhus Stadsarkiv "] license = "GPL-3.0" @@ -12,7 +12,7 @@ include = ["pyproject.toml"] [tool.poetry.dependencies] python = "^3.11" -acacore = {git = "https://github.com/aarhusstadsarkiv/acacore.git", tag = "v3.0.11"} +acacore = {git = "https://github.com/aarhusstadsarkiv/acacore.git", tag = "v3.1.0"} patool = "^2.4.0" tnefparse = "^1.4.0" extract-msg = "^0.49.0" diff --git a/tests/files/_metadata/files.db b/tests/files/_metadata/files.db index 4fd7d56d..c1488f0e 100644 Binary files a/tests/files/_metadata/files.db and b/tests/files/_metadata/files.db differ