Source code for aeat.domain.calculations.registry._source_evidence_fingerprint
"""Filesystem fingerprints for registry source-evidence cache keys."""
from __future__ import annotations
from pathlib import Path
SourceEvidenceFingerprint = tuple[tuple[str, int, int], ...]
[docs]
def collect_source_evidence_fingerprints(
source_root: Path | None,
*,
justificante_corpus_root: Path | None = None,
) -> SourceEvidenceFingerprint:
"""Return ``(path, size, mtime_ns)`` fingerprints for source evidence files."""
roots = _source_evidence_roots(source_root, justificante_corpus_root=justificante_corpus_root)
fingerprints: list[tuple[str, int, int]] = []
for root in roots:
for path in sorted(item for item in root.rglob("*") if item.is_file()):
stat = path.stat()
fingerprints.append((str(path), stat.st_size, stat.st_mtime_ns))
return tuple(fingerprints)
def _source_evidence_roots(
source_root: Path | None,
*,
justificante_corpus_root: Path | None,
) -> tuple[Path, ...]:
candidates: list[Path] = []
if source_root is not None:
resolved = source_root.expanduser().resolve()
candidates.extend((resolved / "corpus", resolved / "src" / "aeat" / "_data" / "corpus"))
if resolved.parent != resolved:
candidates.append(resolved.parents[0] / "tests" / "fixtures" / "justificantes")
if justificante_corpus_root is not None:
candidates.append(justificante_corpus_root.expanduser().resolve())
seen: set[Path] = set()
roots: list[Path] = []
for candidate in candidates:
resolved_candidate = candidate.resolve()
if resolved_candidate in seen or not resolved_candidate.is_dir():
continue
seen.add(resolved_candidate)
roots.append(resolved_candidate)
return tuple(roots)