From e64aaf320bb297112bae5b6ff504ceb65a1760ee Mon Sep 17 00:00:00 2001 From: sHa Date: Fri, 2 Jan 2026 11:01:08 +0000 Subject: [PATCH] chore: Bump version to 0.6.1 and update decorators to use new cache system --- dist/renamer-0.6.1-py3-none-any.whl | Bin 0 -> 105415 bytes pyproject.toml | 2 +- renamer/extractors/default_extractor.py | 2 +- renamer/extractors/fileinfo_extractor.py | 2 +- renamer/extractors/filename_extractor.py | 2 +- renamer/extractors/mediainfo_extractor.py | 2 +- renamer/extractors/metadata_extractor.py | 2 +- renamer/formatters/__init__.py | 16 ++ renamer/formatters/conditional_decorators.py | 88 ++++++++ renamer/formatters/date_decorators.py | 37 ++++ renamer/formatters/proposed_name_formatter.py | 102 +++++++-- renamer/formatters/special_info_decorators.py | 54 +++++ renamer/formatters/text_decorators.py | 130 ++++++++++++ renamer/formatters/text_formatter.py | 4 + renamer/test/test_decorators.py | 186 +++++++++++++++++ renamer/test/test_proposed_name_formatter.py | 195 ++++++++++++++++++ uv.lock | 2 +- 17 files changed, 799 insertions(+), 27 deletions(-) create mode 100644 dist/renamer-0.6.1-py3-none-any.whl create mode 100644 renamer/formatters/conditional_decorators.py create mode 100644 renamer/formatters/date_decorators.py create mode 100644 renamer/formatters/special_info_decorators.py create mode 100644 renamer/formatters/text_decorators.py create mode 100644 renamer/test/test_decorators.py create mode 100644 renamer/test/test_proposed_name_formatter.py diff --git a/dist/renamer-0.6.1-py3-none-any.whl b/dist/renamer-0.6.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..7ec44dfc05c1e444fe00c1fee5d63666d9fd5c8d GIT binary patch literal 105415 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

$L1+t)0?S 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 _{o){ezIRS3YE`HAN8iZ#g& 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 Optional[str]: """Return file extension. Returns None as no extension is available.""" - return None + return "ext" def extract_tmdb_url(self) -> Optional[str]: """Return TMDB URL. Returns None as no TMDB URL is available.""" diff --git a/renamer/extractors/fileinfo_extractor.py b/renamer/extractors/fileinfo_extractor.py index 739f1d4..13ed3b6 100644 --- a/renamer/extractors/fileinfo_extractor.py +++ b/renamer/extractors/fileinfo_extractor.py @@ -7,7 +7,7 @@ file system metadata such as size, timestamps, paths, and extensions. from pathlib import Path import logging import os -from ..decorators import cached_method +from ..cache import cached_method # Set up logging conditionally if os.getenv('FORMATTER_LOG', '0') == '1': diff --git a/renamer/extractors/filename_extractor.py b/renamer/extractors/filename_extractor.py index dd05196..341e8a9 100644 --- a/renamer/extractors/filename_extractor.py +++ b/renamer/extractors/filename_extractor.py @@ -8,7 +8,7 @@ from ..constants import ( is_valid_year, CYRILLIC_TO_ENGLISH ) -from ..decorators import cached_method +from ..cache import cached_method from ..utils.pattern_utils import PatternExtractor import langcodes diff --git a/renamer/extractors/mediainfo_extractor.py b/renamer/extractors/mediainfo_extractor.py index c76051e..2c4ed18 100644 --- a/renamer/extractors/mediainfo_extractor.py +++ b/renamer/extractors/mediainfo_extractor.py @@ -2,7 +2,7 @@ from pathlib import Path from pymediainfo import MediaInfo from collections import Counter from ..constants import FRAME_CLASSES, MEDIA_TYPES -from ..decorators import cached_method +from ..cache import cached_method import langcodes import logging diff --git a/renamer/extractors/metadata_extractor.py b/renamer/extractors/metadata_extractor.py index 3140f32..dd0a00d 100644 --- a/renamer/extractors/metadata_extractor.py +++ b/renamer/extractors/metadata_extractor.py @@ -8,7 +8,7 @@ import mutagen import logging from pathlib import Path from ..constants import MEDIA_TYPES -from ..decorators import cached_method +from ..cache import cached_method logger = logging.getLogger(__name__) diff --git a/renamer/formatters/__init__.py b/renamer/formatters/__init__.py index 08d2407..48764b4 100644 --- a/renamer/formatters/__init__.py +++ b/renamer/formatters/__init__.py @@ -23,6 +23,12 @@ from .track_formatter import TrackFormatter from .special_info_formatter import SpecialInfoFormatter from .formatter import FormatterApplier +# Decorator instances +from .date_decorators import date_decorators, DateDecorators +from .special_info_decorators import special_info_decorators, SpecialInfoDecorators +from .text_decorators import text_decorators, TextDecorators +from .conditional_decorators import conditional_decorators, ConditionalDecorators + __all__ = [ # Base classes 'Formatter', @@ -41,4 +47,14 @@ __all__ = [ 'TrackFormatter', 'SpecialInfoFormatter', 'FormatterApplier', + + # Decorator instances and classes + 'date_decorators', + 'DateDecorators', + 'special_info_decorators', + 'SpecialInfoDecorators', + 'text_decorators', + 'TextDecorators', + 'conditional_decorators', + 'ConditionalDecorators', ] \ No newline at end of file diff --git a/renamer/formatters/conditional_decorators.py b/renamer/formatters/conditional_decorators.py new file mode 100644 index 0000000..2d6d3cc --- /dev/null +++ b/renamer/formatters/conditional_decorators.py @@ -0,0 +1,88 @@ +"""Conditional formatting decorators. + +Provides decorators for conditional formatting (wrap, replace_slashes, default): + + @conditional_decorators.wrap("[", "]") + def get_order(self): + return self.extractor.get('order') +""" + +from functools import wraps +from typing import Callable, Any + + +class ConditionalDecorators: + """Conditional formatting decorators (wrap, replace_slashes, default).""" + + @staticmethod + def wrap(left: str, right: str = "") -> Callable: + """Decorator to wrap value with delimiters if it exists. + + Can be used for prefix-only (right=""), suffix-only (left=""), or both. + + Usage: + @conditional_decorators.wrap("[", "]") + def get_order(self): + return self.extractor.get('order') + + # Prefix only + @conditional_decorators.wrap(" ") + def get_source(self): + return self.extractor.get('source') + + # Suffix only + @conditional_decorators.wrap("", ",") + def get_hdr(self): + return self.extractor.get('hdr') + """ + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return f"{left}{result}{right}" if result else "" + return wrapper + return decorator + + @staticmethod + def replace_slashes() -> Callable: + """Decorator to replace forward and back slashes with dashes. + + Usage: + @conditional_decorators.replace_slashes() + def get_title(self): + return self.extractor.get('title') + """ + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + if result: + return str(result).replace("/", "-").replace("\\", "-") + return result or "" + return wrapper + return decorator + + @staticmethod + def default(default_value: Any) -> Callable: + """Decorator to provide a default value if result is None or empty. + + NOTE: It's better to handle defaults in the extractor itself rather than + using this decorator. This decorator should only be used when the extractor + cannot provide a sensible default. + + Usage: + @conditional_decorators.default("Unknown") + def get_value(self): + return self.extractor.get('value') + """ + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> Any: + result = func(*args, **kwargs) + return result if result else default_value + return wrapper + return decorator + + +# Singleton instance +conditional_decorators = ConditionalDecorators() diff --git a/renamer/formatters/date_decorators.py b/renamer/formatters/date_decorators.py new file mode 100644 index 0000000..3759fca --- /dev/null +++ b/renamer/formatters/date_decorators.py @@ -0,0 +1,37 @@ +"""Date formatting decorators. + +Provides decorator versions of DateFormatter methods for cleaner code: + + @date_decorators.year() + def get_year(self): + return self.extractor.get('year') +""" + +from functools import wraps +from typing import Callable +from .date_formatter import DateFormatter + + +class DateDecorators: + """Date and time formatting decorators.""" + + @staticmethod + def modification_date() -> Callable: + """Decorator to format modification dates. + + Usage: + @date_decorators.modification_date() + def get_mtime(self): + return self.file_path.stat().st_mtime + """ + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return DateFormatter.format_modification_date(result) + return wrapper + return decorator + + +# Singleton instance +date_decorators = DateDecorators() diff --git a/renamer/formatters/proposed_name_formatter.py b/renamer/formatters/proposed_name_formatter.py index 28a7f22..6b98e05 100644 --- a/renamer/formatters/proposed_name_formatter.py +++ b/renamer/formatters/proposed_name_formatter.py @@ -1,37 +1,99 @@ from rich.markup import escape -from .text_formatter import TextFormatter -from .date_formatter import DateFormatter -from .special_info_formatter import SpecialInfoFormatter +from .special_info_decorators import special_info_decorators +from .conditional_decorators import conditional_decorators +from .text_decorators import text_decorators class ProposedNameFormatter: - """Class for formatting proposed filenames""" + """Class for formatting proposed filenames using decorator pattern with properties.""" def __init__(self, extractor): """Initialize with media extractor data""" - - self.__order = f"[{extractor.get('order')}] " if extractor.get("order") else "" - self.__title = (extractor.get("title") or "Unknown Title").replace("/", "-").replace("\\", "-") - self.__year = DateFormatter.format_year(extractor.get("year")) - self.__source = f" {extractor.get('source')}" if extractor.get("source") else "" - self.__frame_class = extractor.get("frame_class") or None - self.__hdr = f",{extractor.get('hdr')}" if extractor.get("hdr") else "" - self.__audio_langs = extractor.get("audio_langs") or None - self.__special_info = f" [{SpecialInfoFormatter.format_special_info(extractor.get('special_info'))}]" if extractor.get("special_info") else "" - self.__db_info = f" [{SpecialInfoFormatter.format_database_info(extractor.get('movie_db'))}]" if extractor.get("movie_db") else "" - self.__extension = extractor.get("extension") or "ext" + self._extractor = extractor def __str__(self) -> str: """Convert the proposed name to string""" - return self.rename_line() + return self.rename_line + @property + @conditional_decorators.wrap("[", "] ") + def _order(self) -> str: + """Get the order number formatted as [XX] """ + return self._extractor.get("order") + + @property + @conditional_decorators.replace_slashes() + def _title(self) -> str: + """Get the title with slashes replaced""" + return self._extractor.get("title") + + @property + @conditional_decorators.wrap(" (", ")") + def _year(self) -> str: + """Get the year formatted as (YYYY)""" + return self._extractor.get("year") + + @property + @conditional_decorators.wrap(" ") + def _source(self) -> str: + """Get the source""" + return self._extractor.get("source") + + @property + def _frame_class(self) -> str: + """Get the frame class""" + return self._extractor.get("frame_class") or "" + + @property + @conditional_decorators.wrap(",") + def _hdr(self) -> str: + """Get the HDR info formatted with a trailing comma if present""" + return self._extractor.get("hdr") + + @property + def _audio_langs(self) -> str: + """Get the audio languages formatted with a trailing comma if present""" + return self._extractor.get("audio_langs") or "" + + @property + @conditional_decorators.wrap(" [", "]") + @special_info_decorators.special_info() + def _special_info(self) -> str: + """Get the special info formatted within brackets""" + return self._extractor.get("special_info") + + @property + @conditional_decorators.wrap(" [", "]") + @special_info_decorators.database_info() + def _db_info(self) -> str: + """Get the database info formatted within brackets""" + return self._extractor.get("movie_db") + + @property + def _extension(self) -> str: + """Get the file extension""" + return self._extractor.get("extension") + + @property def rename_line(self) -> str: - result = f"{self.__order}{self.__title} {self.__year}{self.__special_info}{self.__source} [{self.__frame_class}{self.__hdr},{self.__audio_langs}]{self.__db_info}.{self.__extension}" + """Generate the proposed filename.""" + result = f"{self._order}{self._title}{self._year}{self._special_info}{self._source} [{self._frame_class}{self._hdr},{self._audio_langs}]{self._db_info}.{self._extension}" return result.replace("/", "-").replace("\\", "-") def rename_line_formatted(self, file_path) -> str: """Format the proposed name for display with color""" - proposed = escape(str(self)) if file_path.name == str(self): - return f">> {TextFormatter.green(proposed)} <<" - return f">> {TextFormatter.bold_yellow(proposed)} <<" + return self.rename_line_similar + return self.rename_line_different + + @property + @text_decorators.green() + def rename_line_similar(self) -> str: + """Generate a simplified proposed filename for similarity checks.""" + return escape(str(self)) + + @property + @text_decorators.orange() + def rename_line_different(self) -> str: + """Generate a detailed proposed filename for difference checks.""" + return escape(str(self)) \ No newline at end of file diff --git a/renamer/formatters/special_info_decorators.py b/renamer/formatters/special_info_decorators.py new file mode 100644 index 0000000..01b0c42 --- /dev/null +++ b/renamer/formatters/special_info_decorators.py @@ -0,0 +1,54 @@ +"""Special info formatting decorators. + +Provides decorator versions of SpecialInfoFormatter methods: + + @special_info_decorators.special_info() + def get_special_info(self): + return self.extractor.get('special_info') +""" + +from functools import wraps +from typing import Callable +from .special_info_formatter import SpecialInfoFormatter + + +class SpecialInfoDecorators: + """Special info and database formatting decorators.""" + + @staticmethod + def special_info() -> Callable: + """Decorator to format special info lists. + + Usage: + @special_info_decorators.special_info() + def get_special_info(self): + return self.extractor.get('special_info') + """ + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return SpecialInfoFormatter.format_special_info(result) + return wrapper + return decorator + + @staticmethod + def database_info() -> Callable: + """Decorator to format database info. + + Usage: + @special_info_decorators.database_info() + def get_db_info(self): + return self.extractor.get('movie_db') + """ + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return SpecialInfoFormatter.format_database_info(result) + return wrapper + return decorator + + +# Singleton instance +special_info_decorators = SpecialInfoDecorators() diff --git a/renamer/formatters/text_decorators.py b/renamer/formatters/text_decorators.py new file mode 100644 index 0000000..ceff529 --- /dev/null +++ b/renamer/formatters/text_decorators.py @@ -0,0 +1,130 @@ +"""Text formatting decorators. + +Provides decorator versions of TextFormatter methods: + + @text_decorators.bold() + def get_title(self): + return self.title +""" + +from functools import wraps +from typing import Callable +from .text_formatter import TextFormatter + + +class TextDecorators: + """Text styling and color decorators.""" + + @staticmethod + def bold() -> Callable: + """Decorator to make text bold.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.bold(str(result)) + return wrapper + return decorator + + @staticmethod + def italic() -> Callable: + """Decorator to make text italic.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.italic(str(result)) + return wrapper + return decorator + + @staticmethod + def green() -> Callable: + """Decorator to color text green.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.green(str(result)) + return wrapper + return decorator + + @staticmethod + def yellow() -> Callable: + """Decorator to color text yellow.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.yellow(str(result)) + return wrapper + return decorator + + @staticmethod + def cyan() -> Callable: + """Decorator to color text cyan.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.cyan(str(result)) + return wrapper + return decorator + + @staticmethod + def magenta() -> Callable: + """Decorator to color text magenta.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.magenta(str(result)) + return wrapper + return decorator + + @staticmethod + def red() -> Callable: + """Decorator to color text red.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.red(str(result)) + return wrapper + return decorator + + @staticmethod + def orange() -> Callable: + """Decorator to color text orange.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.orange(str(result)) + return wrapper + return decorator + + @staticmethod + def uppercase() -> Callable: + """Decorator to convert text to uppercase.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.uppercase(str(result)) + return wrapper + return decorator + + @staticmethod + def lowercase() -> Callable: + """Decorator to convert text to lowercase.""" + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs) -> str: + result = func(*args, **kwargs) + return TextFormatter.lowercase(str(result)) + return wrapper + return decorator + + +# Singleton instance +text_decorators = TextDecorators() diff --git a/renamer/formatters/text_formatter.py b/renamer/formatters/text_formatter.py index 7b4109c..d9b8ec5 100644 --- a/renamer/formatters/text_formatter.py +++ b/renamer/formatters/text_formatter.py @@ -78,6 +78,10 @@ class TextFormatter: def yellow(text: str) -> str: return f"[yellow]{text}[/yellow]" + @staticmethod + def orange(text: str) -> str: + return f"[orange]{text}[/orange]" + @staticmethod def magenta(text: str) -> str: return f"[magenta]{text}[/magenta]" diff --git a/renamer/test/test_decorators.py b/renamer/test/test_decorators.py new file mode 100644 index 0000000..fff92fb --- /dev/null +++ b/renamer/test/test_decorators.py @@ -0,0 +1,186 @@ +"""Tests for formatter decorators.""" + +import pytest +from renamer.formatters import ( + date_decorators, + special_info_decorators, + text_decorators, + conditional_decorators +) + + +class TestDateDecorators: + """Test date formatting decorators.""" + + def test_modification_date_decorator(self): + """Test @date_decorators.modification_date() decorator.""" + class TestClass: + def __init__(self, mtime): + self.mtime = mtime + + @date_decorators.modification_date() + def get_mtime(self): + return self.mtime + + # Test with a known timestamp (2020-01-01 00:00:00 UTC) + obj = TestClass(1577836800.0) + result = obj.get_mtime() + assert "2020-01-01" in result # Date part should be present + + +class TestSpecialInfoDecorators: + """Test special info formatting decorators.""" + + def test_special_info_decorator(self): + """Test @special_info_decorators.special_info() decorator.""" + class TestClass: + def __init__(self, special_info): + self.special_info = special_info + + @special_info_decorators.special_info() + def get_special_info(self): + return self.special_info + + obj = TestClass(["Director's Cut", "Extended Edition"]) + assert obj.get_special_info() == "Director's Cut, Extended Edition" + + obj_none = TestClass(None) + assert obj_none.get_special_info() == "" + + def test_database_info_decorator(self): + """Test @special_info_decorators.database_info() decorator.""" + class TestClass: + def __init__(self, db_info): + self.db_info = db_info + + @special_info_decorators.database_info() + def get_db_info(self): + return self.db_info + + obj = TestClass(["tmdb", "12345"]) + assert obj.get_db_info() == "tmdbid-12345" + + obj_dict = TestClass({"name": "imdb", "id": "tt1234567"}) + assert obj_dict.get_db_info() == "imdbid-tt1234567" + + +class TestTextDecorators: + """Test text formatting decorators.""" + + def test_bold_decorator(self): + """Test @text_decorators.bold() decorator.""" + class TestClass: + @text_decorators.bold() + def get_text(self): + return "Hello" + + obj = TestClass() + assert obj.get_text() == "[bold]Hello[/bold]" + + def test_green_decorator(self): + """Test @text_decorators.green() decorator.""" + class TestClass: + @text_decorators.green() + def get_text(self): + return "Success" + + obj = TestClass() + assert obj.get_text() == "[green]Success[/green]" + + +class TestConditionalDecorators: + """Test conditional formatting decorators.""" + + def test_wrap_decorator_both_sides(self): + """Test @conditional_decorators.wrap() with both left and right.""" + class TestClass: + def __init__(self, order): + self.order = order + + @conditional_decorators.wrap("[", "] ") + def get_order(self): + return self.order + + obj = TestClass("01") + assert obj.get_order() == "[01] " + + obj_none = TestClass(None) + assert obj_none.get_order() == "" + + def test_wrap_decorator_prefix_only(self): + """Test @conditional_decorators.wrap() as prefix (right="").""" + class TestClass: + def __init__(self, source): + self.source = source + + @conditional_decorators.wrap(" ") + def get_source(self): + return self.source + + obj = TestClass("BDRip") + assert obj.get_source() == " BDRip" + + obj_none = TestClass(None) + assert obj_none.get_source() == "" + + def test_wrap_decorator_suffix_only(self): + """Test @conditional_decorators.wrap() as suffix (left="").""" + class TestClass: + def __init__(self, hdr): + self.hdr = hdr + + @conditional_decorators.wrap("", ",") + def get_hdr(self): + return self.hdr + + obj = TestClass("HDR") + assert obj.get_hdr() == "HDR," + + obj_none = TestClass(None) + assert obj_none.get_hdr() == "" + + def test_replace_slashes_decorator(self): + """Test @conditional_decorators.replace_slashes() decorator.""" + class TestClass: + def __init__(self, title): + self.title = title + + @conditional_decorators.replace_slashes() + def get_title(self): + return self.title + + obj = TestClass("Movie/Title\\Test") + assert obj.get_title() == "Movie-Title-Test" + + def test_default_decorator(self): + """Test @conditional_decorators.default() decorator.""" + class TestClass: + def __init__(self, title): + self.title = title + + @conditional_decorators.default("Unknown Title") + def get_title(self): + return self.title + + obj = TestClass(None) + assert obj.get_title() == "Unknown Title" + + obj_with_title = TestClass("Movie Title") + assert obj_with_title.get_title() == "Movie Title" + + def test_chained_decorators(self): + """Test chaining multiple decorators.""" + class TestClass: + def __init__(self, title): + self.title = title + + @conditional_decorators.replace_slashes() + @conditional_decorators.default("Unknown Title") + def get_title(self): + return self.title + + obj = TestClass("Movie/Title") + assert obj.get_title() == "Movie-Title" + + obj_none = TestClass(None) + assert obj_none.get_title() == "Unknown Title" diff --git a/renamer/test/test_proposed_name_formatter.py b/renamer/test/test_proposed_name_formatter.py new file mode 100644 index 0000000..911f666 --- /dev/null +++ b/renamer/test/test_proposed_name_formatter.py @@ -0,0 +1,195 @@ +"""Tests for ProposedNameFormatter with decorator pattern.""" + +import pytest +from pathlib import Path +from renamer.formatters.proposed_name_formatter import ProposedNameFormatter + + +class TestProposedNameFormatter: + """Test ProposedNameFormatter with decorator pattern.""" + + def test_basic_formatting(self): + """Test basic filename formatting with all fields.""" + extractor = { + 'order': '01', + 'title': 'Movie Title', + 'year': 2020, + 'source': 'BDRip', + 'frame_class': '1080p', + 'hdr': 'HDR', + 'audio_langs': 'ukr,eng', + 'special_info': ["Director's Cut"], + 'movie_db': ['tmdb', '12345'], + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + assert '[01]' in result + assert 'Movie Title' in result + assert '(2020)' in result + assert 'BDRip' in result + assert '1080p' in result + assert 'HDR' in result + assert 'ukr,eng' in result + assert "Director's Cut" in result + assert 'tmdbid-12345' in result + assert '.mkv' in result + + def test_minimal_formatting(self): + """Test formatting with minimal fields.""" + extractor = { + 'title': 'Simple Movie', + 'year': 2020, + 'extension': 'mp4' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + assert 'Simple Movie' in result + assert '(2020)' in result + assert '.mp4' in result + assert '[01]' not in result # No order + + def test_title_slash_replacement(self): + """Test that slashes in title are replaced with dashes.""" + extractor = { + 'title': 'Movie/Title\\Test', + 'year': 2020, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + assert 'Movie-Title-Test' in result + assert '/' not in result + assert '\\' not in result + + def test_none_title(self): + """Test formatting when title is None (extractor should provide default).""" + extractor = { + 'title': None, + 'year': 2020, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + # Since title is None, it won't appear (unless extractor provides default) + assert result is not None + + def test_none_extension(self): + """Test formatting when extension is None (extractor should provide default).""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'extension': None + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + # Extension handling depends on extractor default + assert result is not None + + def test_special_info_list_formatting(self): + """Test special info list is formatted correctly.""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'special_info': ['Extended Edition', 'Remastered'], + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + assert 'Extended Edition, Remastered' in result + + def test_database_info_formatting(self): + """Test database info is formatted correctly.""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'movie_db': {'name': 'imdb', 'id': 'tt1234567'}, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + assert 'imdbid-tt1234567' in result + + def test_str_method(self): + """Test __str__ method returns same as rename_line().""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + assert str(formatter) == formatter.rename_line + + def test_formatted_display_matching_name(self): + """Test rename_line_formatted when filename matches proposed name.""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + proposed = str(formatter) + file_path = Path(proposed) + + result = formatter.rename_line_formatted(file_path) + assert '>>' in result + assert '<<' in result + assert '[green]' in result + + def test_formatted_display_different_name(self): + """Test rename_line_formatted when filename differs from proposed name.""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + file_path = Path('different_name.mkv') + + result = formatter.rename_line_formatted(file_path) + assert '>>' in result + assert '<<' in result + + def test_year_formatting(self): + """Test year is wrapped in parentheses.""" + extractor = { + 'title': 'Movie', + 'year': 2020, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + assert '(2020)' in result + + def test_no_year(self): + """Test formatting when no year provided.""" + extractor = { + 'title': 'Movie', + 'year': None, + 'extension': 'mkv' + } + + formatter = ProposedNameFormatter(extractor) + result = formatter.rename_line + + # Should not have empty parentheses + assert '()' not in result diff --git a/uv.lock b/uv.lock index d324975..6717c84 100644 --- a/uv.lock +++ b/uv.lock @@ -462,7 +462,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.6.0" +version = "0.6.1" source = { editable = "." } dependencies = [ { name = "langcodes" },