Skip to content

Commit 3d80142

Browse files
Reimplement cbt export
1 parent 8f356e1 commit 3d80142

6 files changed

Lines changed: 48 additions & 18 deletions

File tree

.github/workflows/publishing.yaml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ on: push
55
jobs:
66
build:
77
name: Build
8+
permissions:
9+
contents: read
810
runs-on: ubuntu-latest
911

1012
steps:
1113
- uses: actions/checkout@v4
1214
- uses: actions/setup-python@v5
1315
with:
14-
python-version: '3.12'
16+
python-version: '3.13'
1517
- name: Install pypa/build
1618
run: pip install build
1719
- name: Build a binary wheel and a source tarball
@@ -22,16 +24,17 @@ jobs:
2224
path: dist/
2325

2426
publish-to-pypi:
25-
name: Publish to PyPI
2627
if: startsWith(github.ref, 'refs/tags/')
2728
needs:
2829
- build
29-
runs-on: ubuntu-latest
30+
3031
environment:
3132
name: pypi
3233
url: https://pypi.org/p/perdoo
34+
name: Publish to PyPI
3335
permissions:
3436
id-token: write
37+
runs-on: ubuntu-latest
3538

3639
steps:
3740
- uses: actions/download-artifact@v4

.github/workflows/testing.yaml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,29 @@ jobs:
3030
- ubuntu-latest
3131
- macos-latest
3232
- windows-latest
33+
34+
permissions:
35+
contents: read
3336
runs-on: ${{ matrix.os }}
37+
3438
steps:
3539
- uses: actions/checkout@v4
3640
- uses: astral-sh/setup-uv@v6
3741
- name: Setup Python
3842
run: uv python install ${{ matrix.python-version }}
3943
- name: Install project
40-
run: uv sync --group tests
44+
run: uv sync --all-extras --group tests
4145
- name: Run tests
4246
run: uv run pytest
47+
4348
collector:
44-
needs: [pytest]
4549
if: always()
50+
needs:
51+
- pytest
52+
53+
permissions: { }
4654
runs-on: ubuntu-latest
55+
4756
steps:
4857
- name: Check for failures
4958
if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')

perdoo/__main__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
from typing import Annotated
77

88
from comicfn2dict import comicfn2dict
9-
from darkseid.comic import SUPPORTED_IMAGE_EXTENSIONS
109
from typer import Argument, Context, Exit, Option, Typer
1110

1211
from perdoo import __version__, get_cache_root, setup_logging
1312
from perdoo.cli import archive_app, settings_app
14-
from perdoo.comic import Comic, ComicArchiveError, ComicMetadataError
13+
from perdoo.comic import SUPPORTED_IMAGE_EXTENSIONS, Comic, ComicArchiveError, ComicMetadataError
1514
from perdoo.console import CONSOLE
1615
from perdoo.metadata import ComicInfo, MetronInfo
1716
from perdoo.metadata.comic_info import Page
@@ -244,8 +243,10 @@ def run(
244243
style="subtitle",
245244
)
246245
if not skip_convert:
247-
with CONSOLE.status("Converting to 'CBZ'", spinner="simpleDotsScrolling"):
248-
entry.convert_to_cbz()
246+
with CONSOLE.status(
247+
f"Converting to '{settings.output.format}'", spinner="simpleDotsScrolling"
248+
):
249+
entry.convert(extension=settings.output.format)
249250

250251
metadata: tuple[MetronInfo | None, ComicInfo | None] = (entry.metron_info, entry.comic_info)
251252

perdoo/comic.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
1-
__all__ = ["Comic", "ComicArchiveError", "ComicMetadataError", "MetadataFormat"]
1+
__all__ = [
2+
"SUPPORTED_IMAGE_EXTENSIONS",
3+
"Comic",
4+
"ComicArchiveError",
5+
"ComicMetadataError",
6+
"MetadataFormat",
7+
]
28

39
import logging
410
import shutil
511
from pathlib import Path
6-
from typing import Final, TypeVar
12+
from typing import Final, Literal, TypeVar
713

814
from darkseid.archivers import (
915
PY7ZR_AVAILABLE,
1016
Archiver,
1117
ArchiverFactory,
1218
SevenZipArchiver,
19+
TarArchiver,
1320
ZipArchiver,
1421
)
1522
from darkseid.comic import (
@@ -98,11 +105,15 @@ def read_metadata(self, metadata_format: MetadataFormat) -> None:
98105
else:
99106
raise ComicMetadataError(f"Unsupported metadata format: {metadata_format}")
100107

101-
def convert_to_cbz(self) -> None:
102-
if self.is_cbz():
108+
def convert(self, extension: Literal["cbt", "cbz"]) -> None:
109+
check, archiver = {
110+
"cbt": (self.is_cbt, TarArchiver),
111+
"cbz": (self.is_cbz, ZipArchiver),
112+
}.get(extension)
113+
if check():
103114
return
104-
output_file = self.path.with_suffix(".cbz")
105-
with self.archive as source, ZipArchiver(path=output_file) as destination:
115+
output_file = self.path.with_suffix(f".{extension}")
116+
with self.archive as source, archiver(path=output_file) as destination:
106117
LOGGER.debug("Converting '%s' to '%s'", source.path.name, destination.path.name)
107118
if destination.copy_from_archive(other_archive=source):
108119
self._archiver = destination
@@ -176,7 +187,7 @@ def rename(self, naming: Naming, output_folder: Path) -> None:
176187
"Renaming '%s' to '%s'", self.path.name, output.relative_to(output_folder.parent)
177188
)
178189
shutil.move(self.path, output)
179-
self._archiver = ZipArchiver(path=output)
190+
self.archive._path = output # noqa: SLF001
180191

181192
new_filename = self.path.stem
182193
if all(

perdoo/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from enum import Enum
1515
from pathlib import Path
16-
from typing import Annotated, Any, ClassVar
16+
from typing import Annotated, Any, ClassVar, Literal
1717

1818
import tomli_w as tomlwriter
1919
from pydantic import BeforeValidator
@@ -74,6 +74,7 @@ class Naming(SettingsModel):
7474
class Output(SettingsModel):
7575
comic_info: ComicInfo = ComicInfo()
7676
folder: Path = get_data_root()
77+
format: Literal["cbt", "cbz"] = "cbz"
7778
metron_info: MetronInfo = MetronInfo()
7879
naming: Naming = Naming()
7980

tests/comic_test.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,15 @@ def comic_info() -> ComicInfo:
3434

3535

3636
def test_convert_to_cbz(cbt_comic: Comic) -> None:
37-
cbt_comic.convert_to_cbz()
37+
cbt_comic.convert(extension="cbz")
3838
assert cbt_comic.path.suffix == ".cbz"
3939

4040

41+
def test_convert_to_cbt(cbz_comic: Comic) -> None:
42+
cbz_comic.convert(extension="cbt")
43+
assert cbz_comic.path.suffix == ".cbt"
44+
45+
4146
def test_clean_archive(cbz_comic: Comic) -> None:
4247
cbz_comic._archiver.get_filename_list = MagicMock( # noqa: SLF001
4348
return_value=["image1.jpg", "info.txt", "ComicInfo.xml", "cover.png"]

0 commit comments

Comments
 (0)