"""Shared data shapes used by multiple submodules. Kept tiny on purpose — only types whose definition is depended on across module boundaries belong here. Behavior (find_dupes, decide_keep, extract_id, etc.) lives in the module that owns it. """ from __future__ import annotations from dataclasses import dataclass @dataclass class FileEntry: source: str # "Source" (priority) or "Target" remote: str # the rclone remote:path root supplied path: str # relative path within remote size: int mod_time: str jav_id: str # normalized, e.g. "SSIS-1" @property def full_path(self) -> str: sep = "" if self.remote.endswith("/") or not self.path else "/" return f"{self.remote}{sep}{self.path}"