From 4e76d402cfebdc4961c151cd0491288ab1cf1eb7 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Sun, 14 Jun 2026 16:19:35 +0800 Subject: [PATCH] refactor: migrate package to src layout --- .github/workflows/build.yml | 2 +- AGENTS.md | 3 ++- pyproject.toml | 10 ++++---- slophammer.yml | 24 +++++++++---------- .../manim_voiceover}/__init__.py | 0 .../manim_voiceover}/_typing.py | 0 .../manim_voiceover}/defaults.py | 0 .../manim_voiceover}/helper.py | 0 .../manim_voiceover}/modify_audio.py | 0 .../manim_voiceover}/py.typed | 0 .../manim_voiceover}/services/__init__.py | 0 .../manim_voiceover}/services/azure.py | 0 .../manim_voiceover}/services/base.py | 0 .../manim_voiceover}/services/elevenlabs.py | 0 .../manim_voiceover}/services/gtts.py | 0 .../manim_voiceover}/services/openai.py | 0 .../manim_voiceover}/services/pyttsx3.py | 0 .../services/recorder/__init__.py | 0 .../services/recorder/utility.py | 0 .../manim_voiceover}/services/stitcher.py | 0 .../manim_voiceover}/tracker.py | 0 .../manim_voiceover}/translate/__init__.py | 0 .../translate/gettext_utils.py | 0 .../manim_voiceover}/translate/render.py | 0 .../manim_voiceover}/translate/translate.py | 0 .../manim_voiceover}/voiceover_scene.py | 0 tests/__init__.py | 1 + tests/test_core_behavior.py | 3 ++- tests/test_examples_render.py | 2 +- tests/test_more_behavior.py | 1 + tests/test_mutation_contracts.py | 5 ++-- tests/test_recorder_behavior.py | 1 + tests/test_translation_cli.py | 1 + ty.toml | 2 +- 34 files changed, 31 insertions(+), 24 deletions(-) rename {manim_voiceover => src/manim_voiceover}/__init__.py (100%) rename {manim_voiceover => src/manim_voiceover}/_typing.py (100%) rename {manim_voiceover => src/manim_voiceover}/defaults.py (100%) rename {manim_voiceover => src/manim_voiceover}/helper.py (100%) rename {manim_voiceover => src/manim_voiceover}/modify_audio.py (100%) rename {manim_voiceover => src/manim_voiceover}/py.typed (100%) rename {manim_voiceover => src/manim_voiceover}/services/__init__.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/azure.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/base.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/elevenlabs.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/gtts.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/openai.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/pyttsx3.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/recorder/__init__.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/recorder/utility.py (100%) rename {manim_voiceover => src/manim_voiceover}/services/stitcher.py (100%) rename {manim_voiceover => src/manim_voiceover}/tracker.py (100%) rename {manim_voiceover => src/manim_voiceover}/translate/__init__.py (100%) rename {manim_voiceover => src/manim_voiceover}/translate/gettext_utils.py (100%) rename {manim_voiceover => src/manim_voiceover}/translate/render.py (100%) rename {manim_voiceover => src/manim_voiceover}/translate/translate.py (100%) rename {manim_voiceover => src/manim_voiceover}/voiceover_scene.py (100%) create mode 100644 tests/__init__.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aaff0c8..6776c97 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,7 @@ jobs: - name: Lint run: uv run ruff check . - name: Typecheck - run: uv run ty check manim_voiceover + run: uv run ty check src/manim_voiceover - name: Mypy run: uv run mypy - name: Test with coverage diff --git a/AGENTS.md b/AGENTS.md index 39de078..b7ec07f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,7 +7,8 @@ These instructions apply to this repository. https://github.com/osolmaz/slophammer/blob/main/docs/AGENT_ENTRYPOINT.md - Preserve the public package API unless the change is explicitly scoped as breaking. - Add or update tests when changing behavior. -- Run `uv run ruff format --check .`, `uv run ruff check .`, `uv run ty check manim_voiceover`, `uv run mypy`, `uv run pytest --cov=manim_voiceover --cov-fail-under=85`, `uvx slophammer-py@0.3.0 dry .`, `uv run mutmut run`, `uv run python scripts/check_mutmut_results.py`, `uv run pip-audit`, `uvx slophammer-py@0.3.0 check .`, and `uvx slophammer-py@0.3.0 check . --execute` before submitting a change. +- Source code lives under `src/manim_voiceover`. +- Run `uv run ruff format --check .`, `uv run ruff check .`, `uv run ty check src/manim_voiceover`, `uv run mypy`, `uv run pytest --cov=manim_voiceover --cov-fail-under=85`, `uvx slophammer-py@0.3.0 dry .`, `uv run mutmut run`, `uv run python scripts/check_mutmut_results.py`, `uv run pip-audit`, `uvx slophammer-py@0.3.0 check .`, and `uvx slophammer-py@0.3.0 check . --execute` before submitting a change. - Public functions and meaningful helpers must stay annotated and pass Ruff `ANN`, ty, and strict mypy. - Keep `Any`, casts, and import ignores isolated to external-library boundaries with a clear reason. - Use the existing project style and avoid unrelated formatting churn. diff --git a/pyproject.toml b/pyproject.toml index 7708ae1..28c8b74 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -122,7 +122,7 @@ dev = [ [tool.ruff] line-length = 127 target-version = "py38" -src = ["manim_voiceover", "tests"] +src = ["src", "tests"] extend-exclude = ["docs", "examples", "mutants"] [tool.ruff.lint] @@ -145,7 +145,7 @@ markers = [ ] [tool.coverage.run] -source = ["manim_voiceover"] +source = ["src/manim_voiceover"] branch = true [tool.coverage.report] @@ -153,13 +153,13 @@ fail_under = 85 show_missing = true [tool.mutmut] -source_paths = ["manim_voiceover"] +source_paths = ["src/manim_voiceover"] [tool.mypy] python_version = "3.8" strict = true show_error_codes = true -files = ["manim_voiceover"] +files = ["src/manim_voiceover"] # These dependencies do not ship usable type information for the supported # version range. Keep missing-import ignores scoped to those external @@ -179,7 +179,7 @@ module = [ ignore_missing_imports = true [tool.hatch.build.targets.wheel] -packages = ["manim_voiceover"] +packages = ["src/manim_voiceover"] [build-system] requires = ["hatchling"] diff --git a/slophammer.yml b/slophammer.yml index 4a5995a..fde1293 100644 --- a/slophammer.yml +++ b/slophammer.yml @@ -2,7 +2,7 @@ python: coverage: threshold: 85 paths: - - manim_voiceover + - src/manim_voiceover exclude: - pattern: "docs/**" reason: "Documentation source is not shipped runtime package code." @@ -13,7 +13,7 @@ python: dry: max_findings: 0 paths: - - manim_voiceover + - src/manim_voiceover exclude: - pattern: "docs/**" reason: "Documentation source is not production library code." @@ -24,23 +24,23 @@ python: min_tokens: 100 mutation: targets: - - manim_voiceover + - src/manim_voiceover exclude: - pattern: "docs/**" reason: "Documentation source is not production library code." - pattern: "examples/**" reason: "Example scenes are documentation/demo code." dependency_boundaries: - - from: manim_voiceover/services + - from: src/manim_voiceover/services allow: - - manim_voiceover/_typing - - manim_voiceover/defaults - - manim_voiceover/helper - - manim_voiceover/modify_audio - - manim_voiceover/tracker - - from: manim_voiceover/translate + - src/manim_voiceover/_typing + - src/manim_voiceover/defaults + - src/manim_voiceover/helper + - src/manim_voiceover/modify_audio + - src/manim_voiceover/tracker + - from: src/manim_voiceover/translate allow: - - manim_voiceover/defaults - - manim_voiceover/helper + - src/manim_voiceover/defaults + - src/manim_voiceover/helper typecheck: demotions: [] diff --git a/manim_voiceover/__init__.py b/src/manim_voiceover/__init__.py similarity index 100% rename from manim_voiceover/__init__.py rename to src/manim_voiceover/__init__.py diff --git a/manim_voiceover/_typing.py b/src/manim_voiceover/_typing.py similarity index 100% rename from manim_voiceover/_typing.py rename to src/manim_voiceover/_typing.py diff --git a/manim_voiceover/defaults.py b/src/manim_voiceover/defaults.py similarity index 100% rename from manim_voiceover/defaults.py rename to src/manim_voiceover/defaults.py diff --git a/manim_voiceover/helper.py b/src/manim_voiceover/helper.py similarity index 100% rename from manim_voiceover/helper.py rename to src/manim_voiceover/helper.py diff --git a/manim_voiceover/modify_audio.py b/src/manim_voiceover/modify_audio.py similarity index 100% rename from manim_voiceover/modify_audio.py rename to src/manim_voiceover/modify_audio.py diff --git a/manim_voiceover/py.typed b/src/manim_voiceover/py.typed similarity index 100% rename from manim_voiceover/py.typed rename to src/manim_voiceover/py.typed diff --git a/manim_voiceover/services/__init__.py b/src/manim_voiceover/services/__init__.py similarity index 100% rename from manim_voiceover/services/__init__.py rename to src/manim_voiceover/services/__init__.py diff --git a/manim_voiceover/services/azure.py b/src/manim_voiceover/services/azure.py similarity index 100% rename from manim_voiceover/services/azure.py rename to src/manim_voiceover/services/azure.py diff --git a/manim_voiceover/services/base.py b/src/manim_voiceover/services/base.py similarity index 100% rename from manim_voiceover/services/base.py rename to src/manim_voiceover/services/base.py diff --git a/manim_voiceover/services/elevenlabs.py b/src/manim_voiceover/services/elevenlabs.py similarity index 100% rename from manim_voiceover/services/elevenlabs.py rename to src/manim_voiceover/services/elevenlabs.py diff --git a/manim_voiceover/services/gtts.py b/src/manim_voiceover/services/gtts.py similarity index 100% rename from manim_voiceover/services/gtts.py rename to src/manim_voiceover/services/gtts.py diff --git a/manim_voiceover/services/openai.py b/src/manim_voiceover/services/openai.py similarity index 100% rename from manim_voiceover/services/openai.py rename to src/manim_voiceover/services/openai.py diff --git a/manim_voiceover/services/pyttsx3.py b/src/manim_voiceover/services/pyttsx3.py similarity index 100% rename from manim_voiceover/services/pyttsx3.py rename to src/manim_voiceover/services/pyttsx3.py diff --git a/manim_voiceover/services/recorder/__init__.py b/src/manim_voiceover/services/recorder/__init__.py similarity index 100% rename from manim_voiceover/services/recorder/__init__.py rename to src/manim_voiceover/services/recorder/__init__.py diff --git a/manim_voiceover/services/recorder/utility.py b/src/manim_voiceover/services/recorder/utility.py similarity index 100% rename from manim_voiceover/services/recorder/utility.py rename to src/manim_voiceover/services/recorder/utility.py diff --git a/manim_voiceover/services/stitcher.py b/src/manim_voiceover/services/stitcher.py similarity index 100% rename from manim_voiceover/services/stitcher.py rename to src/manim_voiceover/services/stitcher.py diff --git a/manim_voiceover/tracker.py b/src/manim_voiceover/tracker.py similarity index 100% rename from manim_voiceover/tracker.py rename to src/manim_voiceover/tracker.py diff --git a/manim_voiceover/translate/__init__.py b/src/manim_voiceover/translate/__init__.py similarity index 100% rename from manim_voiceover/translate/__init__.py rename to src/manim_voiceover/translate/__init__.py diff --git a/manim_voiceover/translate/gettext_utils.py b/src/manim_voiceover/translate/gettext_utils.py similarity index 100% rename from manim_voiceover/translate/gettext_utils.py rename to src/manim_voiceover/translate/gettext_utils.py diff --git a/manim_voiceover/translate/render.py b/src/manim_voiceover/translate/render.py similarity index 100% rename from manim_voiceover/translate/render.py rename to src/manim_voiceover/translate/render.py diff --git a/manim_voiceover/translate/translate.py b/src/manim_voiceover/translate/translate.py similarity index 100% rename from manim_voiceover/translate/translate.py rename to src/manim_voiceover/translate/translate.py diff --git a/manim_voiceover/voiceover_scene.py b/src/manim_voiceover/voiceover_scene.py similarity index 100% rename from manim_voiceover/voiceover_scene.py rename to src/manim_voiceover/voiceover_scene.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ + diff --git a/tests/test_core_behavior.py b/tests/test_core_behavior.py index 2120550..1e71dcb 100644 --- a/tests/test_core_behavior.py +++ b/tests/test_core_behavior.py @@ -2,13 +2,14 @@ from pathlib import Path from types import SimpleNamespace +from pydub import AudioSegment + from manim_voiceover.defaults import DEFAULT_VOICEOVER_CACHE_JSON_FILENAME from manim_voiceover.helper import append_to_json_file, chunks, msg_box, remove_bookmarks, trim_silence from manim_voiceover.services.base import SpeechService, timestamps_to_word_boundaries from manim_voiceover.tracker import AUDIO_OFFSET_RESOLUTION, TimeInterpolator, VoiceoverTracker from manim_voiceover.translate.gettext_utils import POEntry, POFile, extract_str from manim_voiceover.voiceover_scene import VoiceoverScene -from pydub import AudioSegment class DummyService(SpeechService): diff --git a/tests/test_examples_render.py b/tests/test_examples_render.py index cbf6abc..2c226fe 100644 --- a/tests/test_examples_render.py +++ b/tests/test_examples_render.py @@ -6,7 +6,7 @@ import pytest -from _render_assertions import assert_audio_is_speech_like, assert_video_has_audio_stream, load_audible_audio +from tests._render_assertions import assert_audio_is_speech_like, assert_video_has_audio_stream, load_audible_audio @dataclass(frozen=True) diff --git a/tests/test_more_behavior.py b/tests/test_more_behavior.py index e5c94e0..ce946fe 100644 --- a/tests/test_more_behavior.py +++ b/tests/test_more_behavior.py @@ -3,6 +3,7 @@ from types import SimpleNamespace import pytest + from manim_voiceover.defaults import DEFAULT_VOICEOVER_CACHE_JSON_FILENAME from manim_voiceover.helper import ( append_to_json_file, diff --git a/tests/test_mutation_contracts.py b/tests/test_mutation_contracts.py index 1228dc3..1fd0acd 100644 --- a/tests/test_mutation_contracts.py +++ b/tests/test_mutation_contracts.py @@ -3,6 +3,9 @@ from types import SimpleNamespace import pytest +from pydub import AudioSegment +from pydub.generators import Sine + from manim_voiceover.helper import ( append_to_json_file, create_dotenv_file, @@ -15,8 +18,6 @@ ) from manim_voiceover.tracker import AUDIO_OFFSET_RESOLUTION, TimeInterpolator, VoiceoverTracker from manim_voiceover.voiceover_scene import VoiceoverScene, _pop_float, _pop_int, _pop_optional_str -from pydub import AudioSegment -from pydub.generators import Sine def _tone(duration): diff --git a/tests/test_recorder_behavior.py b/tests/test_recorder_behavior.py index 3aa0867..c0171af 100644 --- a/tests/test_recorder_behavior.py +++ b/tests/test_recorder_behavior.py @@ -2,6 +2,7 @@ from types import SimpleNamespace import pytest + from manim_voiceover.services.recorder import RecorderService from manim_voiceover.services.recorder.utility import ( FIRST_RECORDING_MESSAGES, diff --git a/tests/test_translation_cli.py b/tests/test_translation_cli.py index 8e9bf65..0642023 100644 --- a/tests/test_translation_cli.py +++ b/tests/test_translation_cli.py @@ -2,6 +2,7 @@ from types import SimpleNamespace import pytest + from manim_voiceover.translate import get_gettext, render, translate diff --git a/ty.toml b/ty.toml index 9fb15f3..0df41f2 100644 --- a/ty.toml +++ b/ty.toml @@ -1,5 +1,5 @@ [src] -include = ["manim_voiceover"] +include = ["src/manim_voiceover"] [terminal] error-on-warning = true