Skip to content

Commit

Permalink
Clean up some ruff warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
bpepple committed Jan 29, 2024
1 parent cda3540 commit 3f8153b
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 84 deletions.
3 changes: 1 addition & 2 deletions metrontagger/duplicates.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from dataclasses import dataclass
from itertools import groupby
from pathlib import Path
from typing import Optional

import pandas as pd
import questionary
Expand All @@ -30,7 +29,7 @@ class Duplicates:

def __init__(self: "Duplicates", file_lst: list[Path]) -> None:
self._file_lst = file_lst
self._data_frame: Optional[pd.DataFrame] = None
self._data_frame: pd.DataFrame | None = None

def _image_hashes(self: "Duplicates") -> list[dict[str, any]]:
"""
Expand Down
11 changes: 5 additions & 6 deletions metrontagger/filerenamer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import datetime
import re
from pathlib import Path
from typing import Optional

import questionary
from darkseid.issue_string import IssueString
Expand All @@ -20,8 +19,8 @@
class FileRenamer:
"""Class to rename a comic archive based on it's metadata tag"""

def __init__(self: "FileRenamer", metadata: Optional[Metadata] = None) -> None:
self.metadata: Optional[Metadata] = metadata
def __init__(self: "FileRenamer", metadata: Metadata | None = None) -> None:
self.metadata: Metadata | None = metadata
self.template: str = "%series% v%volume% #%issue% (of %issuecount%) (%year%)"
self.smart_cleanup: bool = True
self.issue_zero_padding: int = 3
Expand All @@ -43,7 +42,7 @@ def set_template(self: "FileRenamer", template: str) -> None:
"""
self.template = template

def replace_token(self: "FileRenamer", text: str, value: Optional[str], token: str) -> str:
def replace_token(self: "FileRenamer", text: str, value: str | None, token: str) -> str:
"""Method to replace a value with another value"""

# helper func
Expand Down Expand Up @@ -98,7 +97,7 @@ def smart_cleanup_string(self: "FileRenamer", new_name: str) -> str:
# remove duplicate spaces (again!)
return " ".join(new_name.split())

def determine_name(self: "FileRenamer", filename: Path) -> Optional[str]:
def determine_name(self: "FileRenamer", filename: Path) -> str | None:
"""Method to create the new filename based on the files metadata"""
md = self.metadata
new_name = self.template
Expand Down Expand Up @@ -172,7 +171,7 @@ def determine_name(self: "FileRenamer", filename: Path) -> Optional[str]:

return cleanup_string(new_name)

def rename_file(self: "FileRenamer", comic: Path) -> Optional[Path]:
def rename_file(self: "FileRenamer", comic: Path) -> Path | None:
# This shouldn't happen, but just in case let's make sure there is metadata.
if self.metadata is None:
questionary.print(
Expand Down
3 changes: 1 addition & 2 deletions metrontagger/filesorter.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""Class to sort comic file based on its metadata tags"""
from pathlib import Path
from shutil import Error, move
from typing import Optional

import questionary
from darkseid.comic import Comic
Expand All @@ -25,7 +24,7 @@ def __init__(self: "FileSorter", directory: str) -> None:
@staticmethod
def _cleanup_metadata(
meta_data: Metadata,
) -> tuple[Optional[str], Optional[str], Optional[str]]:
) -> tuple[str | None, str | None, str | None]:
"""Clean the metadata string."""
publisher = cleanup_string(meta_data.publisher.name)
series = cleanup_string(meta_data.series.name)
Expand Down
3 changes: 1 addition & 2 deletions metrontagger/run.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from pathlib import Path
from typing import Optional

import questionary
from darkseid.comic import Comic
Expand Down Expand Up @@ -192,7 +191,7 @@ def _get_sort_dir(self: "Runner") -> bool:
def _get_duplicate_entry_index(
comic_path: str,
dups_list: list[DuplicateIssue],
) -> Optional[int]:
) -> int | None:
return next(
(idx for idx, item in enumerate(dups_list) if comic_path in item.path_),
None,
Expand Down
3 changes: 1 addition & 2 deletions metrontagger/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@
import platform
from os import environ
from pathlib import Path, PurePath
from typing import Optional

from xdg.BaseDirectory import save_config_path


class MetronTaggerSettings:
"""Class to handle project settings"""

def __init__(self: "MetronTaggerSettings", config_dir: Optional[str] = None) -> None:
def __init__(self: "MetronTaggerSettings", config_dir: str | None = None) -> None:
# Metron credentials
self.metron_user: str = ""
self.metron_pass: str = ""
Expand Down
11 changes: 5 additions & 6 deletions metrontagger/talker.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import io
from datetime import datetime
from pathlib import Path
from typing import Optional

import mokkari
import questionary
Expand All @@ -10,9 +9,9 @@
from darkseid.metadata import Basic, Credit, Metadata, Role, Series
from imagehash import ImageHash, hex_to_hash, phash
from mokkari.exceptions import ApiError
from PIL import Image
from mokkari.schemas.generic import GenericItem
from mokkari.schemas.issue import BaseIssue, Issue, Credit as MokkariCredit
from mokkari.schemas.issue import BaseIssue, Credit as MokkariCredit, Issue
from PIL import Image

from metrontagger import __version__
from metrontagger.settings import MetronTaggerSettings
Expand Down Expand Up @@ -67,7 +66,7 @@ def _select_choice_from_matches(
self: "Talker",
fn: Path,
match_set: list[BaseIssue],
) -> Optional[int]:
) -> int | None:
"""
Function to ask user to choice which issue metadata to write,
when there are multiple choices
Expand All @@ -81,7 +80,7 @@ def _select_choice_from_matches(
return questionary.select("Select an issue to match", choices=choices).ask()

@staticmethod
def _get_comic_cover_hash(comic: Comic) -> Optional[ImageHash]:
def _get_comic_cover_hash(comic: Comic) -> ImageHash | None:
with Image.open(io.BytesIO(comic.get_page(0))) as img:
try:
ch = phash(img)
Expand All @@ -103,7 +102,7 @@ def _process_file(
self: "Talker",
fn: Path,
interactive: bool,
) -> tuple[Optional[int], bool]:
) -> tuple[int | None, bool]:
ca = Comic(str(fn))

if not ca.is_writable() and not ca.seems_to_be_a_comic_archive():
Expand Down
3 changes: 1 addition & 2 deletions metrontagger/utils.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
"""Some miscellaneous functions"""
from pathlib import Path
from typing import Optional
from urllib.parse import quote_plus

from darkseid.filename import FileNameParser


def cleanup_string(path_name: Optional[str]) -> Optional[str]:
def cleanup_string(path_name: str | None) -> str | None:
"""
Function to remove some characters that don't play nicely on Windows machines filesystem
"""
Expand Down
3 changes: 1 addition & 2 deletions metrontagger/validate_ci.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from importlib.resources import as_file, files
from io import BytesIO
from pathlib import Path
from typing import Optional

from lxml import etree as et

Expand All @@ -22,7 +21,7 @@ def __init__(self: "ValidateComicInfo", ci_xml: bytes) -> None:
self.comic_info_xml = ci_xml

@staticmethod
def _get_xsd(schema_version: SchemaVersion) -> Optional[Path]:
def _get_xsd(schema_version: SchemaVersion) -> Path | None:
"""Method to return path of CI Schema."""
if schema_version == SchemaVersion.v1:
with as_file(files("metrontagger.schema.v1").joinpath("ComicInfo.xsd")) as xsd:
Expand Down
153 changes: 93 additions & 60 deletions tests/test_talker.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,78 @@
import sys
from datetime import date, datetime
from datetime import date, datetime, timedelta, timezone
from decimal import Decimal

from pathlib import Path
from zipfile import ZipFile

import pytest
from darkseid.comic import Comic
from darkseid.metadata import Basic
from mokkari.schemas.character import BaseCharacter
from mokkari.schemas.generic import GenericItem
from mokkari.schemas.issue import Credit, Issue, IssueSeries, BaseIssue, BasicSeries
from mokkari.schemas.issue import BaseIssue, BasicSeries, Credit, Issue, IssueSeries
from mokkari.schemas.reprint import Reprint
from mokkari.session import Session
from pydantic import HttpUrl, TypeAdapter

from metrontagger.talker import Talker
from pathlib import Path

tzinfo = timezone(timedelta(hours=-5))


@pytest.fixture()
def test_issue() -> Issue:
issue = Issue(id=31047,
publisher=GenericItem(id=1, name="Marvel"),
series=IssueSeries(id=2222, name="The Spectacular Spider-Man", sort_name="Spectacular Spider-Man",
volume=1, series_type=GenericItem(id=2, name="Cancelled Series")),
number="47",
collection_title="",
story_titles=["A Night on the Prowl!"],
cover_date=date(1980, 10, 1),
store_date=None,
price=Decimal(".5"),
rating=GenericItem(id=6, name="CCA"),
page_count=36,
desc="Spider-Man goes on a wild goose chase to find out who is behind the Prowler impersonation.",
image=HttpUrl("https://static.metron.cloud/media/issue/2021/05/22/the-spectacular-spider-man-47.jpg"),
cover_hash="c0f83fe438876c1b",
credits=[Credit(id=2335, creator="Al Milgrom", role=[GenericItem(id=7, name="Cover")]),
Credit(id=1402, creator="Bruce Patterson",
role=[GenericItem(id=4, name="Inker"), GenericItem(id=6, name="Letterer")]),
Credit(id=128, creator="Dennis O'Neil", role=[GenericItem(id=8, name="Editor")]),
Credit(id=624, creator="Glynis Oliver", role=[GenericItem(id=5, name="Colorist")]),
Credit(id=624, creator="Jim Shooter", role=[GenericItem(id=20, name="Editor In Chief")]),
Credit(id=675, creator="Marie Severin", role=[GenericItem(id=3, name="Penciller")]),
Credit(id=675, creator="Roger Stern", role=[GenericItem(id=1, name="Writer")]),
],
characters=[BaseCharacter(id=6784, name="Debra Whitman", modified=datetime.now()),
BaseCharacter(id=3067, name="Hobgoblin (Kingsley)", modified=datetime.now()),
BaseCharacter(id=2415, name="Prowler", modified=datetime.now()),
BaseCharacter(id=145, name="Spider-Man", modified=datetime.now())],
cv_id=20745,
resource_url=HttpUrl("https://metron.cloud/issue/the-spectacular-spider-man-1976-47/"),
modified=datetime.now(),
)
issue = Issue(
id=31047,
publisher=GenericItem(id=1, name="Marvel"),
series=IssueSeries(
id=2222,
name="The Spectacular Spider-Man",
sort_name="Spectacular Spider-Man",
volume=1,
series_type=GenericItem(id=2, name="Cancelled Series"),
),
number="47",
collection_title="",
story_titles=["A Night on the Prowl!"],
cover_date=date(1980, 10, 1),
store_date=None,
price=Decimal(".5"),
rating=GenericItem(id=6, name="CCA"),
page_count=36,
desc="Spider-Man goes on a wild goose chase to find out who is behind the Prowler impersonation.",
image=HttpUrl(
"https://static.metron.cloud/media/issue/2021/05/22/the-spectacular-spider-man-47.jpg"
),
cover_hash="c0f83fe438876c1b",
credits=[
Credit(id=2335, creator="Al Milgrom", role=[GenericItem(id=7, name="Cover")]),
Credit(
id=1402,
creator="Bruce Patterson",
role=[GenericItem(id=4, name="Inker"), GenericItem(id=6, name="Letterer")],
),
Credit(id=128, creator="Dennis O'Neil", role=[GenericItem(id=8, name="Editor")]),
Credit(id=624, creator="Glynis Oliver", role=[GenericItem(id=5, name="Colorist")]),
Credit(
id=624,
creator="Jim Shooter",
role=[GenericItem(id=20, name="Editor In Chief")],
),
Credit(
id=675, creator="Marie Severin", role=[GenericItem(id=3, name="Penciller")]
),
Credit(id=675, creator="Roger Stern", role=[GenericItem(id=1, name="Writer")]),
],
characters=[
BaseCharacter(id=6784, name="Debra Whitman", modified=datetime.now(tzinfo)),
BaseCharacter(id=3067, name="Hobgoblin (Kingsley)", modified=datetime.now(tzinfo)),
BaseCharacter(id=2415, name="Prowler", modified=datetime.now(tzinfo)),
BaseCharacter(id=145, name="Spider-Man", modified=datetime.now(tzinfo)),
],
cv_id=20745,
resource_url=HttpUrl("https://metron.cloud/issue/the-spectacular-spider-man-1976-47/"),
modified=datetime.now(tzinfo),
)
adapter = TypeAdapter(Issue)
return adapter.validate_python(issue)

Expand Down Expand Up @@ -111,30 +132,42 @@ def test_map_resp_to_metadata_with_no_story_name(
@pytest.fixture()
def test_issue_list() -> list[BaseIssue]:
i_list = [
BaseIssue(id=3634,
series=BasicSeries(name="Aquaman", volume=1, year_began=1962),
number="1",
issue_name="Aquaman (1962) #1",
cover_date=date(1962, 2, 1),
image=HttpUrl("https://static.metron.cloud/media/issue/2019/07/12/aquaman-v1-1.jpg"),
cover_hash="ccb2097c5b273c1b",
modified=datetime.now()),
BaseIssue(id=2471,
series=BasicSeries(name="Aquaman", volume=2, year_began=1986),
number="1",
issue_name="Aquaman (1986) #1",
cover_date=date(1986, 2, 1),
image=HttpUrl("https://static.metron.cloud/media/issue/2019/05/19/aquaman-v2-1.jpg"),
cover_hash="ea97c11cb3660c79",
modified=datetime.now()),
BaseIssue(id=2541,
series=BasicSeries(name="Aquaman", volume=3, year_began=1989),
number="1",
issue_name="Aquaman (1989) #1",
cover_date=date(1989, 6, 1),
image=HttpUrl("https://static.metron.cloud/media/issue/2019/05/25/aquaman-v3-1.jpg"),
cover_hash="d50df6181876276d",
modified=datetime.now())
BaseIssue(
id=3634,
series=BasicSeries(name="Aquaman", volume=1, year_began=1962),
number="1",
issue_name="Aquaman (1962) #1",
cover_date=date(1962, 2, 1),
image=HttpUrl(
"https://static.metron.cloud/media/issue/2019/07/12/aquaman-v1-1.jpg"
),
cover_hash="ccb2097c5b273c1b",
modified=datetime.now(tzinfo),
),
BaseIssue(
id=2471,
series=BasicSeries(name="Aquaman", volume=2, year_began=1986),
number="1",
issue_name="Aquaman (1986) #1",
cover_date=date(1986, 2, 1),
image=HttpUrl(
"https://static.metron.cloud/media/issue/2019/05/19/aquaman-v2-1.jpg"
),
cover_hash="ea97c11cb3660c79",
modified=datetime.now(tzinfo),
),
BaseIssue(
id=2541,
series=BasicSeries(name="Aquaman", volume=3, year_began=1989),
number="1",
issue_name="Aquaman (1989) #1",
cover_date=date(1989, 6, 1),
image=HttpUrl(
"https://static.metron.cloud/media/issue/2019/05/25/aquaman-v3-1.jpg"
),
cover_hash="d50df6181876276d",
modified=datetime.now(tzinfo),
),
]
adapter = TypeAdapter(list[BaseIssue])
return adapter.validate_python(i_list)
Expand Down

0 comments on commit 3f8153b

Please sign in to comment.