diff --git a/CHANGELOG.md b/CHANGELOG.md index 450de2f..bcc0ff1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,19 @@ callers). ## [Unreleased] +### Internal + +- **Moved `detect_media_type` and `enrich_from_probe` from + `alfred.application.filesystem` to `alfred.application.release`**. + They are inspection-pipeline helpers — their natural home is next to + `inspect_release`, not next to the filesystem use cases. The move + also eliminates a circular-import workaround in + `resolve_destination.py`: `inspect_release` can now be imported at + module top instead of lazily inside `_resolve_parsed`. Public + surface is unchanged for callers that imported the helpers from + their full module paths (the only call sites — `inspect.py`, two + tests, one testing script — were updated in this commit). + ### Added - **`resolve_*_destination` use cases now consume `inspect_release`**. diff --git a/alfred/application/filesystem/resolve_destination.py b/alfred/application/filesystem/resolve_destination.py index 9e69a3d..437b768 100644 --- a/alfred/application/filesystem/resolve_destination.py +++ b/alfred/application/filesystem/resolve_destination.py @@ -22,6 +22,7 @@ import logging from dataclasses import dataclass from pathlib import Path +from alfred.application.release import inspect_release from alfred.domain.release import parse_release from alfred.domain.release.ports import ReleaseKnowledge from alfred.domain.release.value_objects import ParsedRelease @@ -51,11 +52,6 @@ def _resolve_parsed(release_name: str, source_path: str | None) -> ParsedRelease if source_path: path = Path(source_path) if path.exists(): - # Lazy import: ``alfred.application.release`` indirectly depends - # on this module (via :mod:`detect_media_type` / :mod:`enrich_from_probe`), - # so the import has to happen at call time, not at module load. - from alfred.application.release import inspect_release # noqa: PLC0415 - return inspect_release(release_name, path, _KB, _PROBER).parsed parsed, _ = parse_release(release_name, _KB) return parsed diff --git a/alfred/application/filesystem/detect_media_type.py b/alfred/application/release/detect_media_type.py similarity index 100% rename from alfred/application/filesystem/detect_media_type.py rename to alfred/application/release/detect_media_type.py diff --git a/alfred/application/filesystem/enrich_from_probe.py b/alfred/application/release/enrich_from_probe.py similarity index 100% rename from alfred/application/filesystem/enrich_from_probe.py rename to alfred/application/release/enrich_from_probe.py diff --git a/alfred/application/release/inspect.py b/alfred/application/release/inspect.py index 103a48b..9361fa6 100644 --- a/alfred/application/release/inspect.py +++ b/alfred/application/release/inspect.py @@ -48,8 +48,8 @@ from __future__ import annotations from dataclasses import dataclass from pathlib import Path -from alfred.application.filesystem.detect_media_type import detect_media_type -from alfred.application.filesystem.enrich_from_probe import enrich_from_probe +from alfred.application.release.detect_media_type import detect_media_type +from alfred.application.release.enrich_from_probe import enrich_from_probe from alfred.application.release.supported_media import find_main_video from alfred.domain.release.ports import ReleaseKnowledge from alfred.domain.release.services import parse_release diff --git a/testing/recognize_folders_in_downloads.py b/testing/recognize_folders_in_downloads.py index ac3e4f4..8dd2d41 100644 --- a/testing/recognize_folders_in_downloads.py +++ b/testing/recognize_folders_in_downloads.py @@ -100,8 +100,8 @@ def main() -> None: print(c(f"Error: {downloads} does not exist", RED), file=sys.stderr) sys.exit(1) - from alfred.application.filesystem.detect_media_type import detect_media_type - from alfred.application.filesystem.enrich_from_probe import enrich_from_probe + from alfred.application.release.detect_media_type import detect_media_type + from alfred.application.release.enrich_from_probe import enrich_from_probe from alfred.domain.release.services import parse_release from alfred.infrastructure.filesystem.find_video import find_video_file from alfred.infrastructure.probe import FfprobeMediaProber diff --git a/tests/application/test_detect_media_type.py b/tests/application/test_detect_media_type.py index 468675b..1d55a62 100644 --- a/tests/application/test_detect_media_type.py +++ b/tests/application/test_detect_media_type.py @@ -1,4 +1,4 @@ -"""Tests for ``alfred.application.filesystem.detect_media_type``. +"""Tests for ``alfred.application.release.detect_media_type``. The function refines a ``ParsedRelease.media_type`` using filesystem evidence. @@ -18,7 +18,7 @@ from pathlib import Path import pytest -from alfred.application.filesystem.detect_media_type import detect_media_type +from alfred.application.release.detect_media_type import detect_media_type from alfred.domain.release.services import parse_release from alfred.infrastructure.knowledge.release_kb import YamlReleaseKnowledge diff --git a/tests/application/test_enrich_from_probe.py b/tests/application/test_enrich_from_probe.py index 5e3a760..cf77ff9 100644 --- a/tests/application/test_enrich_from_probe.py +++ b/tests/application/test_enrich_from_probe.py @@ -1,4 +1,4 @@ -"""Tests for ``alfred.application.filesystem.enrich_from_probe``. +"""Tests for ``alfred.application.release.enrich_from_probe``. The function mutates a ``ParsedRelease`` in place using ffprobe ``MediaInfo``. Token-level values from the release name always win — only ``None`` fields @@ -18,7 +18,7 @@ Uses real ``ParsedRelease`` / ``MediaInfo`` instances — no mocking needed. from __future__ import annotations -from alfred.application.filesystem.enrich_from_probe import enrich_from_probe +from alfred.application.release.enrich_from_probe import enrich_from_probe from alfred.domain.release.value_objects import ParsedRelease from alfred.domain.shared.media import AudioTrack, MediaInfo, VideoTrack