From 4e7cf94d58a4355dbbf90f90144f4027691aedd8 Mon Sep 17 00:00:00 2001 From: sHa Date: Thu, 25 Dec 2025 03:42:47 +0000 Subject: [PATCH] feat: add pytest configuration and implement tests for file and metadata extraction --- pyproject.toml | 8 + renamer/test/__init__.py | 0 renamer/test/conftest.py | 15 ++ renamer/test/filenames.txt | 205 +++++++++++++++++++++++ renamer/test/test_fileinfo_extractor.py | 35 ++++ renamer/test/test_filename_extractor.py | 53 ++++++ renamer/test/test_mediainfo_extractor.py | 38 +++++ renamer/test/test_metadata_extractor.py | 38 +++++ uv.lock | 54 ++++++ 9 files changed, 446 insertions(+) create mode 100644 renamer/test/__init__.py create mode 100644 renamer/test/conftest.py create mode 100644 renamer/test/filenames.txt create mode 100644 renamer/test/test_fileinfo_extractor.py create mode 100644 renamer/test/test_filename_extractor.py create mode 100644 renamer/test/test_mediainfo_extractor.py create mode 100644 renamer/test/test_metadata_extractor.py diff --git a/pyproject.toml b/pyproject.toml index 4784f4a..2e781b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ dependencies = [ "textual>=6.11.0", "python-magic>=0.4.27", "pymediainfo>=6.0.0", + "pytest>=7.0.0", ] [project.scripts] @@ -16,3 +17,10 @@ renamer = "renamer.main:main" [tool.uv] package = true + +[tool.pytest.ini_options] +addopts = "--strict-markers" +testpaths = ["renamer/test"] +python_files = ["test_*.py"] +python_classes = ["Test*"] +python_functions = ["test_*"] diff --git a/renamer/test/__init__.py b/renamer/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/renamer/test/conftest.py b/renamer/test/conftest.py new file mode 100644 index 0000000..287825c --- /dev/null +++ b/renamer/test/conftest.py @@ -0,0 +1,15 @@ +# conftest.py - pytest configuration +import os +import sys + +# Force UTF-8 encoding for all I/O operations +os.environ['PYTHONIOENCODING'] = 'utf-8' +if hasattr(sys.stdout, 'reconfigure'): + sys.stdout.reconfigure(encoding='utf-8') +if hasattr(sys.stderr, 'reconfigure'): + sys.stderr.reconfigure(encoding='utf-8') + +# Configure pytest to handle Unicode properly +def pytest_configure(config): + # Ensure UTF-8 encoding for test output + config.option.capture = 'no' # Don't capture output to avoid encoding issues \ No newline at end of file diff --git a/renamer/test/filenames.txt b/renamer/test/filenames.txt new file mode 100644 index 0000000..cc9b719 --- /dev/null +++ b/renamer/test/filenames.txt @@ -0,0 +1,205 @@ +[01.1] Harry Potter and the Philosopher's Stone (2001) [Theatrical Cut] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv +[01.2] Harry Potter and the Sorcerer's Stone (2001) [Ultimate Extended Edition] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv +[02.1] Harry Potter and the Chamber of Secrets (2002) [Theatrical Cut] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv +[02.2] Harry Potter and the Chamber of Secrets (2002) [Ultimate Extended Edition] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv +[03] Harry Potter and the Prisoner of Azkaban (2004) BDRip 1080p x265 [5xUKR_ENG] [Hurtom].mkv +[04] Harry Potter and the Goblet of Fire (2005) BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv +[05] Harry Potter and the Order of the Phoenix (2007) BDRip 1080p x265 [3xUKR_ENG] [Hurtom].mkv +[06] Harry Potter and the Half-Blood Prince (2009) BDRip 1080p x265 [2xUKR_ENG] [Hurtom].mkv +[07] Harry Potter and the Deathly Hallows. Part 1 (2010) BDRip 1080p x265 [UKR_ENG] [Hurtom].mkv +[08] Harry Potter and the Deathly Hallows. Part 2 (2011) BDRip 1080p x265 [UKR_ENG] [Hurtom].mkv +12 стульев.(1971).[SD,rus].avi +A Mighty Heart.(2007).[SD,2ukr,eng].avi +An Ideal Husband (1999) [720p,ukr,eng].mkv +China Moon (1994) BDRip [SD,2ukr,eng].mkv +Cours Toujours (2010) [720p,und] [tmdbid-993291].mp4 +Davolja Posla (1965) [SD,und] [tmdbid-665739].avi +Destiny (2012) [720p,und] [tmdbid-496051].mp4 +Emma (1996) BDRip [720p,ukr,eng].mkv +I Come with the Rain.(2008).[720p,ukr].mkv +I Could Never Be Your Woman (2007) [SD,2ukr,eng].mkv +I Spy (2002) [720p,2ukr,eng].mkv +If I Stay (2014) [720p,ukr,eng].mkv +Il racconto dei racconti (Tale of Tales).(2015).[720p,ukr,eng].mkv +Imperium Nerone (2004) [SD,ukr].mkv +In Bruges (2008) [SD,ukr].mkv +Independence Day Resurgence.(2016).[720,ukr,eng].mkv +Inescapable (2012) [SD,ukr].mkv +Inside Llewyn Davis.(2013).[720p,ukr,eng].mkv +Into the Woods (2014) [720p,ukr,eng].mkv +Investigating Sex (2002) [SD,ukr].mkv +Jumper.(2008).[SD,ukr].mkv +Klątwa doliny węży (1988) [SD,rus].avi +Klątwa doliny węży (1988) DVDRip [SD,pol].mkv +Ladri di biciclette (1948).[720p,ukr].mp4 +Larry Crowne.(2011).[720p,2ukr,eng].mkv +Le dernier chaperon rouge (1996) [SD,fre] [tmdbid-82143].mkv +Lets Be Cops.(2014).[720p,rus,ukr,4eng].mkv +Life After Beth.(2014).[720p,ukr,eng].mkv +Life Is a Miracle.(2004).[SD,ukr].avi +Life Is a Miracle.(2004).[SD,ukr].avi +Loosies.(2011).[SD,ukr,eng].avi +Love & Friendship.(2016).[720p,ukr,eng].mkv +Love Story.(1970).[SD,ukr,eng].mkv +Mac and Me.(1988).[720p,ukr,eng].mkv +Made of Honor.(2008).[SD,ukr].avi +Man on the Moon.(1999).[720p,ukr,eng].mkv +Martyrs.(2008).[720p,fre,sukr].mkv +Max Keeble's Big Move.(2001).[SD,ukr].avi +Me Before You.(2016).[720p,ukr,eng].mkv +Me, Myself & Irene.(2000).[720p,ukr,eng].mkv +Meet Dave.(2008).[SD,ukr].avi +Minority Report.(2002).[720p,ukr,eng].mkv +Misconduct (2016) BDRip [720p,ukr,eng].mkv +Mission to Mars.(2000).[720p,ukr,eng].mkv +Monster's Ball.(2001).[SD,eng].mkv +Mr. Nobody (2009) BDRip [SD,2ukr,eng].mkv +My Week with Marilyn.(2011).[720p,ukr,eng].mkv +Nathalie... (2003) [SD,ukr].mkv +New Year's Eve (2011) [720p,ukr,eng].mkv +Nightmare City 2035 (2008) [SD,ukr].mkv +Noah (2014) [720p,ukr,eng].mkv +Northmen - A Viking Saga (2014) [SD,ukr].mkv +One More Kiss (1999) DVDRip [SD,ukr].avi +Orbita 9 (2017) [SD,ukr,eng].mkv +Pay It Forward (2000) [SD,ukr].mkv +Pay It Forward (2000) [SD,ukr].mkv +Perfect Stranger (2007) [SD,ukr].mkv +Peter Pan (2003) [720p,ukr,eng].mkv +Prime (2005) [SD,ukr,eng].mkv +Prince of Persia. The Sands of Time (2010) [720p,ukr,eng].mkv +Prince Valiant (1997) [SD,ukr,eng].mkv +Raging Bull (1980) [720p,ukr,eng].mkv +Rebecca (2020) [720p,eng].mkv +Rekopis znaleziony w Saragossie (1965) WEB-DL [SD,ukr].mkv +River's Edge (1986) [SD,ukr,eng].mkv +Riverworld (2003) [480p,ukr,eng].mkv +Romeo Is Bleeding (1993) [SD,2ukr,eng].mkv +Ruthless People (1986) [720p,ukr,eng].mkv +Sahara (1983) [SD,ukr,eng].mkv +Savages (2012) [SD,ukr].mkv +Scoop (2024) WEB-DL [720p,ukr,eng].mkv +Se7en (1995) [720p,ukr,eng].mkv +See No Evil, Hear No Evil (1989) [720p,ukr,eng].mkv +Senseless (1998) [SD,ukr].mkv +Sex Tape (2014) [720p,ukr,eng].mkv +Shutter Island (2010) [720p,ukr,eng].mkv +St. Trinian's (2007) [720p,ukr,eng].mkv +The Black Hole (1979) BDRip [480p,ukr,eng].mkv +The Invention of Lying (2009) [720p,ukr,eng].mkv +The Island of Dr. Moreau.(1977).[720p,ukr].mp4 +The Killing.(1956).[SD,ukr,eng].mkv +The Love Guru.(2008).[SD,ukr].avi +The Love Guru.(2008).[SD,ukr].avi +The Manchurian Candidate.(2004).[720p,ukr,eng].mkv +The Mortal Instruments. City of Bones.(2013).[720p,ukr,eng].mkv +The Mutant Chronicles.(2008).[SD,ukr,eng].mkv +The Name of the Rose (1986) [SD,3ukr,eng].mkv +The Number 23 (2007) [720p,ukr,eng].mkv +The People Under the Stairs (1991) [720p,ukr,eng].mkv +The Return (2024) WEB-DLRip [720p,ukr,eng].mkv +The Road to Wellville (1994) [SD,ukr,eng].mkv +The Ruins (2008) [SD,ukr].mkv +The Sound of Music (1965).[720p,ukr].mp4 +The Square Peg (1958).[480p,ukr,eng].mkv +Un homme à la hauteur.(2016).[720p,ukr].mkv +Upgrade.(2018).[SD,eng].mkv +Автомобиль, скрипка и собака Клякса.(1974).[SD,rus].avi +Ах, Водевиль, Водевиль...(1979).[SD,rus].avi +Белеет парус одинокий.(1937).[SD,rus].avi +Белое солнце пустыни.(1969).[SD,rus].avi +Берегись автомобиля.(1966).[SD,rus].avi +Берегите женщин.(1981).[SD,rus].avi +Бриллиантовая рука.(1968).[720p,2rus].mkv +В бой идут одни «старики».(1973).[720p,rus].mkv +В моей смерти прошу винить Клаву К.(1979).[480p,rus].mkv +В тринадцатом часу ночи.(1969).[SD,rus].avi +Верные друзья.(1954).[SD,rus].avi +Веселые ребята.(1934).[SD,rus].avi +Взломщик.(1987).[SD,rus].avi +Вий.(1967).[SD,rus].avi +Высота.(1957).[SD,rus].avi +Гиперболоид инженера Гарина.(1965).[SD,rus].avi +Глинка.(1946).[SD,rus].avi +Гостья из будущего (1984) [SD,rus] [tmdbid-20894].mkv +Гроза.(1934).[SD,rus].avi +Гусарская баллада.(1962).[SD,rus].avi +Два капитана.(1955).[SD,rus].avi +Девушка с гитарой.(1958).[SD,rus].avi +Деловые люди (1962) [SD,rus] [tmdbid-92983].avi +Джентльмены удачи.(1971).[SD,rus].avi +Добро пожаловать, или Посторонним вход воспрещен.(1964).[SD,rus].avi +Доживем до понедельника.(1968).[SD,rus].avi +За двома зайцями.(1961).[SD,ukr,rus].mkv +За спичками.(1980).[SD,rus,fin].mkv +Завтра, третьего апреля.(1969).[SD,rus].avi +Зеленый фургон.(1959).[SD,rus].avi +Золотой ключик.(1939).[SD,rus].avi +Золотой телёнок.pt1.(1968).[SD,rus].avi +Золотой телёнок.pt2.(1968).[SD,rus].avi +Иван Васильевич меняет профессию.(1973).[SD,rus].avi +Игла.(1988).[SD,rus].mkv +Иди и смотри.(1985).[SD,rus].avi +Идиот.(1958).[SD,rus].avi +Илья Муромец.(1956).[SD,rus].avi +Интердевочка.(1989).[SD,rus].mkv +Кавказская пленница, или Новые приключения Шурика.(1966).[SD,rus].avi +Карнавальная ночь.(1956).[SD,rus].avi +Конек-Горбунок.(1941).[SD,rus].avi +Королева бензоколонки.(1962).[SD,rus].avi +Королевство кривых зеркал.(1963).[SD,rus].avi +Курьер.(1986).[720p,rus].mkv +Мария, Мирабела в транзистории.(1989).[SD,rus].mpg +Мастер и Маргарита.pt1.(1994).[LQ,rus].wmv +Мастер и Маргарита.pt2.(1994).[LQ,rus].wmv +Мастер и Маргарита.pt3.(1994).[LQ,rus].wmv +Мастер и Маргарита.pt4.(1994).[LQ,rus].wmv +Миллион в брачной корзине.(1985).[SD,rus].avi +Мольба.(1967).[SD,rus].avi +Моцарт и Сальери.(1962).[SD,rus].avi +Не могу сказать «прощай».(1982).[SD,rus].avi +Не может быть!.(1975).[SD,rus].mkv +Невероятные приключения итальянцев в России.(1973).[SD,rus].avi +Неподдающиеся.(1959).[SD,rus].avi +Новый Гулливер.(1935).[SD,rus].avi +Нормандия - Неман.(1960).[SD,rus].avi +Обнаженная в шляпе (1991) [480p,rus] [tmdbid-286638].mkv +Огонь, вода и ... медные трубы.(1967).[SD,rus].avi +Операция «Ы» и другие приключения Шурика.(1965).[SD,rus].avi +Остров ржавого генерала.(1988).[SD,rus].avi +Остров сокровищ (1971) [SD,rus] [tmdbid-135710].avi +По щучьему велению.(1938).[SD,rus].avi +Подземелье ведьм.(1990).[SD,rus].avi +Подкидыш.(1939).[SD,rus].avi +После дождичка в четверг.(1985).[SD,rus].avi +Приключения Тома Сойера и Гекльберри Финна.pt1.(1981).[SD,rus].avi +Приключения Тома Сойера и Гекльберри Финна.pt2.(1981).[SD,rus].avi +Приключения Тома Сойера и Гекльберри Финна.pt3.(1981).[SD,rus].avi +Приключения Хоббита.(1984).[SD,rus].avi +Приморский бульвар.pt1.(1988).[SD,rus].avi +Приморский бульвар.pt2.(1988).[SD,rus].avi +Принцесса на горошине.(1976).[SD,rus].avi +Республика ШКИД.(1966).[SD,rus].mkv +Самые быстрые в мире.(1985).[SD,rus].avi +Свадьба в Малиновке.(1967).[1080p,3rus].mkv +Свой среди чужих, чужой среди своих.(1974).[SD,rus].avi +Сказ про то, как царь Петр арапа женил.(1976).[SD,rus].avi +Сказка о потерянном времени.(1964).[SD,rus].avi +Собачье сердце (1988) [1080p,2rus] [tmdbid-43680].mkv +Совершенно серьезно.(1961).[SD,rus].avi +Соломенная шляпка.(1974).[SD,rus].avi +Спортлото-82.(1982).[SD,rus].avi +Сталкер.(1979).[SD,rus].avi +Тайна острова Бэк-Кап (1958) [SD,rus].mkv +Там на неведомых дорожках.(1982).[SD,rus].avi +Трактористы.(1939).[SD,rus].avi +Три плюс два (1963) [SD,rus].mkv +Три толстяка.(1966).[SD,rus].avi +Трудно быть Богом (1989) [SD,rus] [tmdbid-64508].avi +Трудно быть Богом (2014) WEB-DL [720p,rus].m4v +Трудно первые 100 лет.(1988).[SD,rus].avi +Чародеи.pt1.(1982).[SD,rus].avi +Чародеи.pt2.(1982).[SD,rus].avi +Человек с бульвара Капуцинов (1987) [1080p,rus] [tmdbid-45227].mkv +Человек-амфибия (1961) [SD,rus] [tmdbid-43685].avi +Чук и Гек (1953) [SD,rus] [tmdbid-148412].avi diff --git a/renamer/test/test_fileinfo_extractor.py b/renamer/test/test_fileinfo_extractor.py new file mode 100644 index 0000000..d91f294 --- /dev/null +++ b/renamer/test/test_fileinfo_extractor.py @@ -0,0 +1,35 @@ +import pytest +from pathlib import Path +from renamer.extractors.fileinfo_extractor import FileInfoExtractor + + +class TestFileInfoExtractor: + @pytest.fixture + def test_file(self): + """Use the filenames.txt file for testing""" + return Path(__file__).parent / "filenames.txt" + + def test_extract_size(self, test_file): + """Test extracting file size""" + size = FileInfoExtractor.extract_size(test_file) + assert isinstance(size, int) + assert size > 0 + + def test_extract_modification_time(self, test_file): + """Test extracting modification time""" + mtime = FileInfoExtractor.extract_modification_time(test_file) + assert isinstance(mtime, float) + assert mtime > 0 + + def test_extract_file_name(self, test_file): + """Test extracting file name""" + name = FileInfoExtractor.extract_file_name(test_file) + assert isinstance(name, str) + assert name == "filenames.txt" + + def test_extract_file_path(self, test_file): + """Test extracting file path""" + path = FileInfoExtractor.extract_file_path(test_file) + assert isinstance(path, str) + assert "filenames.txt" in path + assert str(test_file) == path \ No newline at end of file diff --git a/renamer/test/test_filename_extractor.py b/renamer/test/test_filename_extractor.py new file mode 100644 index 0000000..ca9ff48 --- /dev/null +++ b/renamer/test/test_filename_extractor.py @@ -0,0 +1,53 @@ +import pytest +from pathlib import Path +from ..extractors.filename_extractor import FilenameExtractor + + +def load_test_filenames(): + """Load test filenames from filenames.txt""" + test_file = Path(__file__).parent / "filenames.txt" + if test_file.exists(): + with open(test_file, 'r', encoding='utf-8') as f: + return [line.strip() for line in f if line.strip()] + return [] + + +@pytest.mark.parametrize("filename", load_test_filenames()) +def test_extract_title(filename): + """Test title extraction from filename""" + file_path = Path(filename) + title = FilenameExtractor.extract_title(file_path) + # For now, just check it's not None and is string + assert isinstance(title, str) or title is None + + +@pytest.mark.parametrize("filename", load_test_filenames()) +def test_extract_year(filename): + """Test year extraction from filename""" + file_path = Path(filename) + year = FilenameExtractor.extract_year(file_path) + # Print filename and extracted year clearly + print(f"\nFilename: \033[1;36m{filename}\033[0m") + print(f"Extracted year: \033[1;32m{year}\033[0m") + # Year should be None or 4-digit string + if year: + assert len(year) == 4 and year.isdigit() + + +@pytest.mark.parametrize("filename", load_test_filenames()) +def test_extract_source(filename): + """Test source extraction from filename""" + file_path = Path(filename) + source = FilenameExtractor.extract_source(file_path) + # Source should be None or string + assert isinstance(source, str) or source is None + + +@pytest.mark.parametrize("filename", load_test_filenames()) +def test_extract_resolution(filename): + """Test resolution extraction from filename""" + file_path = Path(filename) + resolution = FilenameExtractor.extract_resolution(file_path) + # Resolution should be None or string like '2160p' + if resolution: + assert 'p' in resolution or 'i' in resolution \ No newline at end of file diff --git a/renamer/test/test_mediainfo_extractor.py b/renamer/test/test_mediainfo_extractor.py new file mode 100644 index 0000000..35a9fb8 --- /dev/null +++ b/renamer/test/test_mediainfo_extractor.py @@ -0,0 +1,38 @@ +import pytest +from pathlib import Path +from renamer.extractors.mediainfo_extractor import MediaInfoExtractor + + +class TestMediaInfoExtractor: + @pytest.fixture + def extractor(self): + return MediaInfoExtractor() + + @pytest.fixture + def test_file(self): + """Use the filenames.txt file for testing""" + return Path(__file__).parent / "filenames.txt" + + def test_extract_resolution(self, extractor, test_file): + """Test extracting resolution from media info""" + resolution = extractor.extract_resolution(test_file) + # Text files don't have video resolution + assert resolution is None + + def test_extract_hdr(self, extractor, test_file): + """Test extracting HDR info""" + hdr = extractor.extract_hdr(test_file) + # Text files don't have HDR + assert hdr is None + + def test_extract_audio_langs(self, extractor, test_file): + """Test extracting audio languages""" + langs = extractor.extract_audio_langs(test_file) + # Text files don't have audio tracks + assert langs == '' + + def test_extract_video_dimensions(self, extractor, test_file): + """Test extracting video dimensions""" + dims = extractor.extract_video_dimensions(test_file) + # Text files don't have video dimensions + assert dims is None \ No newline at end of file diff --git a/renamer/test/test_metadata_extractor.py b/renamer/test/test_metadata_extractor.py new file mode 100644 index 0000000..f304a63 --- /dev/null +++ b/renamer/test/test_metadata_extractor.py @@ -0,0 +1,38 @@ +import pytest +from pathlib import Path +from renamer.extractors.metadata_extractor import MetadataExtractor + + +class TestMetadataExtractor: + @pytest.fixture + def test_file(self): + """Use the filenames.txt file for testing""" + return Path(__file__).parent / "filenames.txt" + + def test_extract_title(self, test_file): + """Test extracting title from metadata""" + title = MetadataExtractor.extract_title(test_file) + # Text files don't have metadata, so should be None + assert title is None + + def test_extract_duration(self, test_file): + """Test extracting duration from metadata""" + duration = MetadataExtractor.extract_duration(test_file) + # Text files don't have duration + assert duration is None + + def test_extract_artist(self, test_file): + """Test extracting artist from metadata""" + artist = MetadataExtractor.extract_artist(test_file) + # Text files don't have artist + assert artist is None + + def test_extract_all_metadata(self, test_file): + """Test extracting all metadata""" + metadata = MetadataExtractor.extract_all_metadata(test_file) + expected = { + 'title': None, + 'duration': None, + 'artist': None + } + assert metadata == expected \ No newline at end of file diff --git a/uv.lock b/uv.lock index d039401..8c0e53f 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,24 @@ version = 1 revision = 3 requires-python = ">=3.11" +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "linkify-it-py" version = "2.0.3" @@ -61,6 +79,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719", size = 194391, upload-time = "2023-09-03T16:33:29.955Z" }, ] +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + [[package]] name = "platformdirs" version = "4.5.1" @@ -70,6 +97,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "pygments" version = "2.19.2" @@ -92,6 +128,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/26/9d50c2a330541bc36c0ea7ce29eeff5b0c35c2624139660df8bcfa9ae3ce/pymediainfo-7.0.1-py3-none-win_amd64.whl", hash = "sha256:13224fa7590e198763b8baf072e704ea81d334e71aa32a469091460e243893c7", size = 3271232, upload-time = "2025-02-12T15:07:13.672Z" }, ] +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + [[package]] name = "python-magic" version = "0.4.27" @@ -108,6 +160,7 @@ source = { editable = "." } dependencies = [ { name = "mutagen" }, { name = "pymediainfo" }, + { name = "pytest" }, { name = "python-magic" }, { name = "textual" }, ] @@ -116,6 +169,7 @@ dependencies = [ requires-dist = [ { name = "mutagen", specifier = ">=1.47.0" }, { name = "pymediainfo", specifier = ">=6.0.0" }, + { name = "pytest", specifier = ">=7.0.0" }, { name = "python-magic", specifier = ">=0.4.27" }, { name = "textual", specifier = ">=6.11.0" }, ]