Skip to content

Commit a1894aa

Browse files
Fix ty errors
1 parent b0cd31f commit a1894aa

File tree

9 files changed

+91
-51
lines changed

9 files changed

+91
-51
lines changed

.github/workflows/linting.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ env:
1616
PY_VERSION: 3.14
1717

1818
jobs:
19-
pre-commit:
19+
prek:
2020
permissions:
2121
contents: read
2222
runs-on: ubuntu-latest
@@ -28,5 +28,5 @@ jobs:
2828
python-version: ${{ env.PY_VERSION }}
2929
- name: Install project
3030
run: uv sync --locked --dev
31-
- name: Run pre-commit
31+
- name: Run prek
3232
run: uv run prek run -a

perdoo/cli/process.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ class SyncOption(str, Enum):
3939
def get_services(settings: Services) -> dict[Service, BaseService]:
4040
output = {}
4141
if settings.comicvine.api_key:
42-
output[Service.COMICVINE] = Comicvine(settings.comicvine)
42+
output[Service.COMICVINE] = Comicvine(api_key=settings.comicvine.api_key)
4343
if settings.metron.username and settings.metron.password:
44-
output[Service.METRON] = Metron(settings.metron)
44+
output[Service.METRON] = Metron(
45+
username=settings.metron.username, password=settings.metron.password
46+
)
4547
return output
4648

4749

@@ -98,22 +100,27 @@ def get_id(ids: list[Id], source: InformationSource) -> str | None:
98100
return next((x.value for x in ids if x.source is source), None)
99101

100102

101-
def search_from_metron_info(metron_info: MetronInfo) -> Search:
103+
def search_from_metron_info(metron_info: MetronInfo, filename: str) -> Search:
102104
series_id = metron_info.series.id
105+
comicvine_id = get_id(metron_info.ids, InformationSource.COMIC_VINE)
106+
metron_id = get_id(metron_info.ids, InformationSource.METRON)
103107
source = next((x.source for x in metron_info.ids if x.primary), None)
104108
return Search(
105109
series=SeriesSearch(
106110
name=metron_info.series.name,
107111
volume=metron_info.series.volume,
108112
year=metron_info.series.start_year,
109-
comicvine=series_id if source == InformationSource.COMIC_VINE else None,
110-
metron=series_id if source == InformationSource.METRON else None,
113+
comicvine=int(series_id)
114+
if series_id and source == InformationSource.COMIC_VINE
115+
else None,
116+
metron=int(series_id) if series_id and source == InformationSource.METRON else None,
111117
),
112118
issue=IssueSearch(
113119
number=metron_info.number,
114-
comicvine=get_id(metron_info.ids, InformationSource.COMIC_VINE),
115-
metron=get_id(metron_info.ids, InformationSource.METRON),
120+
comicvine=int(comicvine_id) if comicvine_id else None,
121+
metron=int(metron_id) if metron_id else None,
116122
),
123+
filename=filename,
117124
)
118125

119126

@@ -124,19 +131,21 @@ def search_from_comic_info(comic_info: ComicInfo, filename: str) -> Search:
124131
return Search(
125132
series=SeriesSearch(name=comic_info.series or filename, volume=volume, year=year),
126133
issue=IssueSearch(number=comic_info.number),
134+
filename=filename,
127135
)
128136

129137

130138
def search_from_filename(filename: str) -> Search:
131-
series_name = comicfn2dict(filename).get("series", filename).replace("-", " ")
132-
return Search(series=SeriesSearch(name=series_name), issue=IssueSearch())
139+
series_name = comicfn2dict(filename).get("series", filename)
140+
series_name = str(series_name).replace("-", " ")
141+
return Search(series=SeriesSearch(name=series_name), issue=IssueSearch(), filename=filename)
133142

134143

135144
def build_search(
136145
metron_info: MetronInfo | None, comic_info: ComicInfo | None, filename: str
137146
) -> Search:
138147
if metron_info and metron_info.series and metron_info.series.name:
139-
return search_from_metron_info(metron_info=metron_info)
148+
return search_from_metron_info(metron_info=metron_info, filename=filename)
140149
if comic_info and comic_info.series:
141150
return search_from_comic_info(comic_info=comic_info, filename=filename)
142151
return search_from_filename(filename=filename)
@@ -166,7 +175,6 @@ def resolve_metadata(
166175
search = build_search(
167176
metron_info=metron_info, comic_info=comic_info, filename=entry.filepath.stem
168177
)
169-
search.filename = entry.filepath.stem
170178
return sync_metadata(search=search, services=services, service_order=settings.order)
171179

172180

perdoo/comic/archives/session.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def __exit__(
7171
def list(self) -> list[str]:
7272
if self._archive.IS_EDITABLE:
7373
return self._archive.list_filenames()
74-
assert self._folder
74+
if not self._folder:
75+
return []
7576
return [p.name for p in self._folder.iterdir()]
7677

7778
def contains(self, filename: str) -> bool:
@@ -80,7 +81,8 @@ def contains(self, filename: str) -> bool:
8081
def read(self, filename: str) -> bytes:
8182
if self._archive.IS_READABLE:
8283
return self._archive.read_file(filename=filename)
83-
assert self._folder
84+
if not self._folder:
85+
return b""
8486
return (self._folder / filename).read_bytes()
8587

8688
def write(self, filename: str, data: str | bytes) -> None:
@@ -90,7 +92,8 @@ def write(self, filename: str, data: str | bytes) -> None:
9092
if self._archive.IS_EDITABLE:
9193
self._archive.write_file(filename=filename, data=data)
9294
else:
93-
assert self._folder
95+
if not self._folder:
96+
return
9497
(self._folder / filename).write_bytes(data)
9598
self._updated = True
9699

@@ -99,7 +102,8 @@ def delete(self, filename: str) -> None:
99102
if self._archive.IS_EDITABLE:
100103
self._archive.delete_file(filename=filename)
101104
else:
102-
assert self._folder
105+
if not self._folder:
106+
return
103107
(self._folder / filename).unlink(missing_ok=True)
104108
self._updated = True
105109

@@ -108,7 +112,8 @@ def rename(self, filename: str, new_name: str, override: bool = False) -> None:
108112
if self._archive.IS_EDITABLE:
109113
self._archive.rename_file(filename=filename, new_name=new_name, override=override)
110114
else:
111-
assert self._folder
115+
if not self._folder:
116+
return
112117
src = self._folder / filename
113118
if not src.exists():
114119
raise ComicArchiveError(f"Unable to rename '{src}' as it does not exist.")

perdoo/comic/metadata/_base.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
LOGGER = logging.getLogger(__name__)
2525

2626

27-
def sanitize(value: str | None, seperator: Literal["-", "_", ".", " "]) -> str | None:
28-
if not value:
27+
def sanitize(value: str | int | None, seperator: Literal["-", "_", ".", " "]) -> str | None:
28+
if value is None:
2929
return value
3030
value = str(value)
3131
value = re.sub(r"[^0-9a-zA-Z&! ]+", "", value.replace(seperator, " "))
@@ -59,9 +59,10 @@ def from_bytes(cls, content: bytes) -> Self:
5959
return cls.from_xml(content)
6060

6161
def to_bytes(self) -> bytes:
62-
return b'<?xml version="1.0" encoding="UTF-8"?>\n' + self.to_xml(
63-
skip_empty=True, pretty_print=True, encoding="UTF-8"
64-
)
62+
content = self.to_xml(skip_empty=True, pretty_print=True, encoding="UTF-8")
63+
if isinstance(content, str):
64+
return ('<?xml version="1.0" encoding="UTF-8"?>\n' + content).encode("UTF-8")
65+
return b'<?xml version="1.0" encoding="UTF-8"?>\n' + content
6566

6667
def to_file(self, file: Path) -> None:
6768
file.write_bytes(self.to_bytes())
@@ -76,7 +77,7 @@ def display(self) -> None:
7677

7778
def evaluate_pattern(
7879
self,
79-
pattern_map: dict[str, Callable[[Self], str]],
80+
pattern_map: dict[str, Callable[[Self], str | int | None]],
8081
pattern: str,
8182
seperator: Literal["-", "_", ".", " "],
8283
) -> str:

perdoo/services/comicvine.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,16 @@
1717
from perdoo.comic.metadata import ComicInfo, MetronInfo
1818
from perdoo.comic.metadata.metron_info import InformationSource
1919
from perdoo.services._base import BaseService
20-
from perdoo.settings import Comicvine as ComicvineSettings
2120
from perdoo.utils import IssueSearch, Search, SeriesSearch
2221

2322
LOGGER = logging.getLogger(__name__)
2423
DEFAULT_CHOICE = Choice(title="None of the Above", value=None)
2524

2625

2726
class Comicvine(BaseService[Volume, Issue]):
28-
def __init__(self, settings: ComicvineSettings):
27+
def __init__(self, api_key: str):
2928
cache = SQLiteCache(path=get_cache_root() / "simyan.sqlite")
30-
self.session = Simyan(api_key=settings.api_key, cache=cache)
29+
self.session = Simyan(api_key=api_key, cache=cache)
3130

3231
def _search_series(
3332
self, name: str | None, volume: int | None, year: int | None, filename: str
@@ -187,17 +186,28 @@ def load_role(value: str) -> Role:
187186

188187
return MetronInfo(
189188
ids=[Id(primary=True, source=InformationSource.COMIC_VINE, value=str(issue.id))],
190-
publisher=Publisher(id=str(series.publisher.id), name=series.publisher.name),
191-
series=Series(id=str(series.id), name=series.name, start_year=series.start_year),
189+
publisher=Publisher(id=str(series.publisher.id), name=series.publisher.name)
190+
if series.publisher and series.publisher.name
191+
else None,
192+
series=Series(
193+
id=str(series.id),
194+
name=series.name,
195+
start_year=series.start_year,
196+
alternative_names=[],
197+
),
192198
collection_title=issue.name,
193199
number=issue.number,
194200
summary=issue.summary,
195201
cover_date=issue.cover_date,
196202
store_date=issue.store_date,
197-
arcs=[Arc(id=str(x.id), name=x.name) for x in issue.story_arcs],
198-
characters=[Resource[str](id=str(x.id), value=x.name) for x in issue.characters],
199-
teams=[Resource[str](id=str(x.id), value=x.name) for x in issue.teams],
200-
locations=[Resource[str](id=str(x.id), value=x.name) for x in issue.locations],
203+
arcs=[Arc(id=str(x.id), name=x.name) for x in issue.story_arcs if x.name],
204+
characters=[
205+
Resource[str](id=str(x.id), value=x.name) for x in issue.characters if x.name
206+
],
207+
teams=[Resource[str](id=str(x.id), value=x.name) for x in issue.teams if x.name],
208+
locations=[
209+
Resource[str](id=str(x.id), value=x.name) for x in issue.locations if x.name
210+
],
201211
urls=[Url(primary=True, value=issue.site_url)],
202212
credits=[
203213
Credit(
@@ -209,8 +219,15 @@ def load_role(value: str) -> Role:
209219
],
210220
)
211221
for x in issue.creators
222+
if x.name
212223
],
213224
last_modified=datetime.now(),
225+
genres=[],
226+
prices=[],
227+
reprints=[],
228+
stories=[],
229+
tags=[],
230+
universes=[],
214231
)
215232

216233
def _process_comic_info(self, series: Volume, issue: Issue) -> ComicInfo | None:
@@ -221,17 +238,19 @@ def _process_comic_info(self, series: Volume, issue: Issue) -> ComicInfo | None:
221238
summary=issue.summary,
222239
publisher=series.publisher.name if series.publisher else None,
223240
web=issue.site_url,
241+
pages=[],
224242
)
225243

226244
comic_info.cover_date = issue.cover_date
227245
comic_info.credits = {
228246
x.name: [r.strip() for r in re.split(r"[~\r\n,]+", x.roles) if r.strip()]
229247
for x in issue.creators
248+
if x.name
230249
}
231-
comic_info.character_list = [x.name for x in issue.characters]
232-
comic_info.team_list = [x.name for x in issue.teams]
233-
comic_info.location_list = [x.name for x in issue.locations]
234-
comic_info.story_arc_list = [x.name for x in issue.story_arcs]
250+
comic_info.character_list = [x.name for x in issue.characters if x.name]
251+
comic_info.team_list = [x.name for x in issue.teams if x.name]
252+
comic_info.location_list = [x.name for x in issue.locations if x.name]
253+
comic_info.story_arc_list = [x.name for x in issue.story_arcs if x.name]
235254

236255
return comic_info
237256

perdoo/services/metron.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,16 @@
1515
from perdoo.comic.metadata import ComicInfo, MetronInfo
1616
from perdoo.comic.metadata.metron_info import InformationSource
1717
from perdoo.services._base import BaseService
18-
from perdoo.settings import Metron as MetronSettings
1918
from perdoo.utils import IssueSearch, Search, SeriesSearch
2019

2120
LOGGER = logging.getLogger(__name__)
2221
DEFAULT_CHOICE = Choice(title="None of the Above", value=None)
2322

2423

2524
class Metron(BaseService[Series, Issue]):
26-
def __init__(self, settings: MetronSettings):
25+
def __init__(self, username: str, password: str):
2726
cache = SQLiteCache(path=get_cache_root() / "seagrin.sqlite")
28-
self.session = Seagrin(username=settings.username, password=settings.password, cache=cache)
27+
self.session = Seagrin(username=username, password=password, cache=cache)
2928

3029
def _search_series_by_comicvine(self, comicvine_id: int | None) -> int | None:
3130
if not comicvine_id:
@@ -220,8 +219,9 @@ def load_role(value: str) -> Role:
220219
volume=series.volume,
221220
format=Format.load(value=series.series_type.name),
222221
start_year=series.year_began,
222+
alternative_names=[],
223223
),
224-
collection_title=issue.collection_title or None,
224+
collection_title=issue.title or None,
225225
number=issue.number,
226226
stories=[Resource[str](value=x) for x in issue.story_titles],
227227
summary=issue.desc,
@@ -250,6 +250,8 @@ def load_role(value: str) -> Role:
250250
for x in issue.credits
251251
],
252252
last_modified=datetime.now(),
253+
locations=[],
254+
tags=[],
253255
)
254256

255257
def _process_comic_info(self, series: Series, issue: Issue) -> ComicInfo | None:
@@ -262,7 +264,7 @@ def load_age_rating(value: str) -> AgeRating:
262264
return AgeRating.UNKNOWN
263265

264266
comic_info = ComicInfo(
265-
title=issue.collection_title,
267+
title=issue.title,
266268
series=series.name,
267269
number=issue.number,
268270
volume=series.volume,
@@ -272,6 +274,7 @@ def load_age_rating(value: str) -> AgeRating:
272274
page_count=issue.page_count or 0,
273275
format=series.series_type.name,
274276
age_rating=load_age_rating(value=issue.rating.name),
277+
pages=[],
275278
)
276279

277280
comic_info.cover_date = issue.cover_date

perdoo/utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,22 @@ class SeriesSearch:
4545
name: str
4646
volume: int | None = None
4747
year: int | None = None
48-
comicvine: str | None = None
49-
metron: str | None = None
48+
comicvine: int | None = None
49+
metron: int | None = None
5050

5151

5252
@dataclass
5353
class IssueSearch:
5454
number: str | None = None
55-
comicvine: str | None = None
56-
metron: str | None = None
55+
comicvine: int | None = None
56+
metron: int | None = None
5757

5858

5959
@dataclass
6060
class Search:
6161
series: SeriesSearch
6262
issue: IssueSearch
63-
filename: str | None = None
63+
filename: str
6464

6565

6666
def list_files(path: Path, *extensions: str) -> list[Path]:

prek.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
hooks = [
33
{args = ["--all", "--in-place"], entry = "toml-sort", id = "toml-sort", language = "system", name = "toml sort", types = ["toml"]},
44
{args = ["--number", "--wrap=keep"], entry = "mdformat", exclude = "(.github/ISSUE_TEMPLATE/.*|README).md", id = "mdformat", language = "system", name = "mdformat", types = ["markdown"]},
5-
{entry = "ruff check .", id = "ruff-check", language = "system", name = "ruff check", types = ["python"]},
6-
{entry = "ruff format .", id = "ruff-format", language = "system", name = "ruff format", types = ["python"]},
7-
{entry = "ty check .", id = "ty", language = "system", name = "ty", types = ["python"]},
5+
{entry = "ruff check .", id = "ruff-check", language = "system", name = "ruff check", pass_filenames = false, types = ["python"]},
6+
{entry = "ruff format .", id = "ruff-format", language = "system", name = "ruff format", pass_filenames = false, types = ["python"]},
7+
{entry = "ty check .", id = "ty", language = "system", name = "ty", pass_filenames = false, types = ["python"]},
88
]
99
repo = "local"
1010

@@ -47,7 +47,7 @@ rev = "v6.0.0"
4747

4848
[[repos]]
4949
hooks = [
50-
{id = "check-hooks-apply"},
50+
# {id = "check-hooks-apply"},
5151
{id = "check-useless-excludes"},
5252
]
5353
repo = "meta"

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,7 @@ min_version = "4.22"
163163
[tool.tox.env_run_base]
164164
commands = [["pytest"]]
165165
dependency_groups = ["tests"]
166+
167+
[tool.ty.src]
168+
exclude = ["**/tests/"]
169+
include = ["**/perdoo"]

0 commit comments

Comments
 (0)