Skip to content

Commit 03f4e66

Browse files
Tidy things up
1 parent 8641a2b commit 03f4e66

File tree

12 files changed

+124
-89
lines changed

12 files changed

+124
-89
lines changed

perdoo/__main__.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from perdoo import __version__, get_cache_root, setup_logging
1212
from perdoo.cli import archive_app, settings_app
1313
from perdoo.comic import Comic
14-
from perdoo.comic.archive import ArchiveSession
14+
from perdoo.comic.archives import ArchiveSession
1515
from perdoo.comic.errors import ComicArchiveError, ComicMetadataError
1616
from perdoo.comic.metadata import ComicInfo, MetronInfo
1717
from perdoo.comic.metadata.metron_info import Id, InformationSource
@@ -212,20 +212,17 @@ def apply_changes(
212212
if metron_info:
213213
session.write(filename=MetronInfo.FILENAME, data=metron_info.to_bytes())
214214
else:
215-
session.remove(filename=MetronInfo.FILENAME)
216-
session.updated = True
215+
session.delete(filename=MetronInfo.FILENAME)
217216

218217
if local_comic_info != comic_info:
219218
if comic_info:
220219
session.write(filename=ComicInfo.FILENAME, data=comic_info.to_bytes())
221220
else:
222-
session.remove(filename=ComicInfo.FILENAME)
223-
session.updated = True
221+
session.delete(filename=ComicInfo.FILENAME)
224222

225223
if not skip_clean:
226224
for extra in entry.list_extras():
227-
session.remove(filename=extra.name)
228-
session.updated = True
225+
session.delete(filename=extra.name)
229226

230227
naming = None
231228
if not skip_rename and (
@@ -239,8 +236,7 @@ def apply_changes(
239236
for idx, img in enumerate(images):
240237
new_name = f"{stem}_{str(idx).zfill(pad)}{img.suffix}"
241238
if img.name != new_name:
242-
session.rename(old_name=img.name, new_name=new_name)
243-
session.updated = True
239+
session.rename(filename=img.name, new_name=new_name)
244240
return naming
245241

246242

perdoo/comic/archive/__init__.py

Lines changed: 0 additions & 8 deletions
This file was deleted.

perdoo/comic/archives/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
__all__ = ["Archive", "ArchiveSession", "CB7Archive", "CBRArchive", "CBTArchive", "CBZArchive"]
2+
3+
from perdoo.comic.archives._base import Archive
4+
from perdoo.comic.archives.rar import CBRArchive
5+
from perdoo.comic.archives.session import ArchiveSession
6+
from perdoo.comic.archives.sevenzip import CB7Archive
7+
from perdoo.comic.archives.tar import CBTArchive
8+
from perdoo.comic.archives.zip import CBZArchive
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ def list_filenames(self) -> list[str]: ...
4747
def read_file(self, filename: str) -> bytes:
4848
raise ComicArchiveError(f"Unable to read {filename} from {self.filepath.name}.")
4949

50-
def write_file(self, filename: str, data: str | bytes) -> None: # noqa: ARG002
50+
def write_file(self, filename: str, data: bytes) -> None: # noqa: ARG002
5151
raise ComicArchiveError(f"Unable to write {filename} to {self.filepath.name}.")
5252

53-
def remove_file(self, filename: str) -> None:
53+
def delete_file(self, filename: str) -> None:
5454
raise ComicArchiveError(f"Unable to delete {filename} in {self.filepath.name}.")
5555

5656
def rename_file(self, filename: str, new_name: str, override: bool = False) -> None: # noqa: ARG002
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from rarfile import RarFile, is_rarfile
88

9-
from perdoo.comic.archive._base import Archive
9+
from perdoo.comic.archives._base import Archive
1010
from perdoo.comic.errors import ComicArchiveError
1111

1212
LOGGER = logging.getLogger(__name__)
Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from tempfile import TemporaryDirectory
77
from types import TracebackType
88

9-
from perdoo.comic.archive import Archive
9+
from perdoo.comic.archives import Archive
1010
from perdoo.comic.errors import ComicArchiveError
1111
from perdoo.console import CONSOLE
1212
from perdoo.utils import list_files
@@ -25,7 +25,7 @@ def __init__(self, archive: Archive) -> None:
2525
self._temp_dir: TemporaryDirectory | None = None
2626
self._folder: Path | None = None
2727
self._extracted = False
28-
self.updated = False
28+
self._updated = False
2929

3030
def __enter__(self) -> Self:
3131
if self._archive.IS_EDITABLE:
@@ -39,7 +39,7 @@ def __enter__(self) -> Self:
3939
):
4040
self._archive.extract_files(destination=self._folder)
4141
self._extracted = True
42-
self.updated = False
42+
self._updated = False
4343
return self
4444

4545
def __exit__(
@@ -49,15 +49,15 @@ def __exit__(
4949
tb: TracebackType | None,
5050
) -> None:
5151
try:
52-
if exc_type is None and self._extracted and self.updated:
52+
if exc_type is None and self._extracted and self._updated:
5353
with CONSOLE.status(
5454
f"Archiving '{self._folder}' to '{self._archive.filepath}'",
5555
spinner="simpleDotsScrolling",
5656
):
5757
filepath = self._archive.archive_files(
5858
src=self._folder,
5959
output_name=self._archive.filepath.stem,
60-
files=list_files(self._folder),
60+
files=list_files(path=self._folder),
6161
)
6262
self._archive.filepath.unlink(missing_ok=True)
6363
shutil.move(filepath, self._archive.filepath)
@@ -77,29 +77,37 @@ def contains(self, filename: str) -> bool:
7777

7878
def read(self, filename: str) -> bytes:
7979
if self._archive.IS_READABLE:
80-
return self._archive.read_file(filename)
80+
return self._archive.read_file(filename=filename)
8181
return (self._folder / filename).read_bytes()
8282

83-
def write(self, filename: str, data: bytes) -> None:
83+
def write(self, filename: str, data: str | bytes) -> None:
8484
LOGGER.info("Writing '%s'", filename)
85+
if isinstance(data, str):
86+
data = data.encode("UTF-8")
8587
if self._archive.IS_EDITABLE:
86-
self._archive.write_file(filename, data)
88+
self._archive.write_file(filename=filename, data=data)
8789
else:
8890
(self._folder / filename).write_bytes(data)
91+
self._updated = True
8992

90-
def remove(self, filename: str) -> None:
91-
LOGGER.info("Removing '%s'", filename)
93+
def delete(self, filename: str) -> None:
94+
LOGGER.info("Deleting '%s'", filename)
9295
if self._archive.IS_EDITABLE:
93-
self._archive.remove_file(filename)
96+
self._archive.delete_file(filename=filename)
9497
else:
9598
(self._folder / filename).unlink(missing_ok=True)
99+
self._updated = True
96100

97-
def rename(self, old_name: str, new_name: str) -> None:
98-
LOGGER.info("Renaming '%s' to '%s'", old_name, new_name)
101+
def rename(self, filename: str, new_name: str, override: bool = False) -> None:
102+
LOGGER.info("Renaming '%s' to '%s'", filename, new_name)
99103
if self._archive.IS_EDITABLE:
100-
self._archive.rename_file(old_name=old_name, new_name=new_name)
104+
self._archive.rename_file(filename=filename, new_name=new_name, override=override)
101105
else:
102-
src = self._folder / old_name
106+
src = self._folder / filename
103107
if not src.exists():
104-
raise ComicArchiveError(f"{old_name} does not exist")
105-
src.rename(self._folder / new_name)
108+
raise ComicArchiveError(f"Unable to rename '{src}' as it does not exist.")
109+
dest = self._folder / new_name
110+
if dest.exists() and not override:
111+
raise ComicArchiveError(f"Unable to rename '{src}' as '{dest}' already exists.")
112+
shutil.move(src, dest)
113+
self._updated = True
Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
__all__ = ["CB7Archive"]
1+
__all__ = ["PY7ZR_AVAILABLE", "CB7Archive"]
22

33
import logging
4+
import shutil
45
from pathlib import Path
56
from sys import maxsize
7+
from tempfile import TemporaryDirectory
68
from typing import ClassVar
79

10+
from perdoo.comic.archive._base import Archive
11+
from perdoo.comic.errors import ComicArchiveError
12+
from perdoo.utils import list_files
13+
814
try:
915
import py7zr
1016

@@ -13,16 +19,19 @@
1319
py7zr = None
1420
PY7ZR_AVAILABLE = False
1521

16-
from perdoo.comic.archive._base import Archive
17-
from perdoo.comic.errors import ComicArchiveError
22+
try:
23+
from typing import Self # Python >= 3.11
24+
except ImportError:
25+
from typing_extensions import Self # Python < 3.11
26+
1827

1928
LOGGER = logging.getLogger(__name__)
2029

2130

2231
class CB7Archive(Archive):
2332
EXTENSION: ClassVar[str] = ".cb7"
2433
IS_READABLE: ClassVar[bool] = True
25-
IS_WRITEABLE: ClassVar[bool] = False
34+
IS_WRITEABLE: ClassVar[bool] = True
2635
IS_EDITABLE: ClassVar[bool] = False
2736

2837
@classmethod
@@ -47,7 +56,7 @@ def read_file(self, filename: str) -> bytes:
4756
archive.extract(targets=[filename], factory=factory)
4857
if file_obj := factory.products.get(filename):
4958
return file_obj.read()
50-
raise ComicArchiveError(f"Unable to read {filename} in {self.filepath.name}") # noqa: TRY301
59+
raise ComicArchiveError(f"Unable to read {filename} in {self.filepath.name}")
5160
except ComicArchiveError:
5261
raise
5362
except Exception as err:
@@ -61,3 +70,29 @@ def extract_files(self, destination: Path) -> None:
6170
raise ComicArchiveError(
6271
f"Unable to extract all files from {self.filepath.name} to {destination}"
6372
) from err
73+
74+
@classmethod
75+
def archive_files(cls, src: Path, output_name: str, files: list[Path]) -> Path:
76+
output_file = src.parent / (output_name + cls.EXTENSION)
77+
try:
78+
with py7zr.SevenZipFile(output_file, "w") as archive:
79+
for file in files:
80+
archive.write(file, arcname=file.name)
81+
return output_file
82+
except Exception as err:
83+
raise ComicArchiveError(f"Unable to archive files to {output_file.name}") from err
84+
85+
@classmethod
86+
def convert_from(cls, old_archive: Archive) -> Self:
87+
with TemporaryDirectory(prefix=f"{old_archive.filepath.stem}_") as temp_str:
88+
temp_folder = Path(temp_str)
89+
old_archive.extract_files(destination=temp_folder)
90+
filepath = cls.archive_files(
91+
src=temp_folder,
92+
output_name=old_archive.filepath.stem,
93+
files=list_files(temp_folder),
94+
)
95+
new_filepath = old_archive.filepath.with_suffix(cls.EXTENSION)
96+
old_archive.filepath.unlink(missing_ok=True)
97+
shutil.move(filepath, new_filepath)
98+
return cls(filepath=new_filepath)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from tempfile import TemporaryDirectory
88
from typing import ClassVar
99

10-
from perdoo.comic.archive._base import Archive
10+
from perdoo.comic.archives._base import Archive
1111
from perdoo.comic.errors import ComicArchiveError
1212
from perdoo.utils import list_files
1313

@@ -47,7 +47,7 @@ def extract_files(self, destination: Path) -> None:
4747

4848
@classmethod
4949
def archive_files(cls, src: Path, output_name: str, files: list[Path]) -> Path:
50-
output_file = src.parent / f"{output_name}.cbt"
50+
output_file = src.parent / (output_name + cls.EXTENSION)
5151
try:
5252
with tarfile.open(name=output_file, mode="w:gz") as archive:
5353
for file in files:
Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from zipremove import ZIP_DEFLATED, ZipFile, is_zipfile
1010

11-
from perdoo.comic.archive._base import Archive
11+
from perdoo.comic.archives._base import Archive
1212
from perdoo.comic.errors import ComicArchiveError
1313
from perdoo.utils import list_files
1414

@@ -49,9 +49,7 @@ def read_file(self, filename: str) -> bytes:
4949
except Exception as err:
5050
raise ComicArchiveError(f"Unable to read {filename} in {self.filepath.name}") from err
5151

52-
def write_file(self, filename: str, data: str | bytes) -> None:
53-
if isinstance(data, str):
54-
data = data.encode("UTF-8")
52+
def write_file(self, filename: str, data: bytes) -> None:
5553
try:
5654
with ZipFile(file=self.filepath, mode="a") as archive:
5755
if filename in archive.namelist():
@@ -61,7 +59,7 @@ def write_file(self, filename: str, data: str | bytes) -> None:
6159
except Exception as err:
6260
raise ComicArchiveError(f"Unable to write {filename} to {self.filepath.name}") from err
6361

64-
def remove_file(self, filename: str) -> None:
62+
def delete_file(self, filename: str) -> None:
6563
if filename not in self.list_filenames():
6664
return
6765
try:
@@ -73,27 +71,27 @@ def remove_file(self, filename: str) -> None:
7371
f"Unable to delete {filename} from {self.filepath.name}"
7472
) from err
7573

76-
def rename_file(self, old_name: str, new_name: str, override: bool = False) -> None:
77-
if old_name not in self.list_filenames():
74+
def rename_file(self, filename: str, new_name: str, override: bool = False) -> None:
75+
if filename not in self.list_filenames():
7876
raise ComicArchiveError(
79-
f"Unable to rename {old_name} as it doesn't exist in {self.filepath.name}."
77+
f"Unable to rename {filename} as it doesn't exist in {self.filepath.name}."
8078
)
8179
try:
8280
removed = []
8381
with ZipFile(file=self.filepath, mode="a") as archive:
8482
if new_name in archive.namelist():
8583
if not override:
86-
raise ComicArchiveError( # noqa: TRY301
87-
f"Unable to rename {old_name} as {new_name} already extsts in {self.filepath.name}."
84+
raise ComicArchiveError(
85+
f"Unable to rename {filename} as {new_name} already extsts in {self.filepath.name}."
8886
)
8987
removed.append(archive.remove(new_name))
90-
removed.append(archive.remove(archive.copy(old_name, new_name)))
88+
removed.append(archive.remove(archive.copy(filename, new_name)))
9189
archive.repack(removed)
9290
except ComicArchiveError:
9391
raise
9492
except Exception as err:
9593
raise ComicArchiveError(
96-
f"Unable to rename {old_name} to {new_name} in {self.filepath.name}"
94+
f"Unable to rename {filename} to {new_name} in {self.filepath.name}"
9795
) from err
9896

9997
def extract_files(self, destination: Path) -> None:
@@ -107,7 +105,7 @@ def extract_files(self, destination: Path) -> None:
107105

108106
@classmethod
109107
def archive_files(cls, src: Path, output_name: str, files: list[Path]) -> Path:
110-
output_file = src.parent / f"{output_name}.cbz"
108+
output_file = src.parent / (output_name + cls.EXTENSION)
111109
try:
112110
with ZipFile(file=output_file, mode="w", compression=ZIP_DEFLATED) as archive:
113111
for file in files:

perdoo/comic/comic.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77

88
from natsort import humansorted, ns
99

10-
from perdoo.comic.archive import Archive, CB7Archive, CBTArchive, CBZArchive
11-
from perdoo.comic.archive.session import ArchiveSession
10+
from perdoo.comic.archives import Archive, ArchiveSession, CB7Archive, CBTArchive, CBZArchive
1211
from perdoo.comic.metadata import ComicInfo, MetronInfo
1312

1413
LOGGER = logging.getLogger(__name__)

0 commit comments

Comments
 (0)