more fixes

This commit is contained in:
Dima Gerasimov 2022-04-14 09:31:05 +01:00
parent 3b60497082
commit f11302b98e
2 changed files with 24 additions and 12 deletions

View file

@ -5,6 +5,7 @@ from __future__ import annotations
import pathlib import pathlib
from pathlib import Path from pathlib import Path
import sys
from typing import Union, IO, Sequence from typing import Union, IO, Sequence
import io import io
@ -120,7 +121,16 @@ def kexists(path: PathIsh, subpath: str) -> bool:
import zipfile import zipfile
class ZipPath(zipfile.Path): if sys.version_info[:2] >= (3, 8):
ZipPathBase = zipfile.Path
else:
# meh... it's not available on 3.7
ZipPathBase = object
class ZipPath(ZipPathBase):
# NOTE: is_dir/is_file might not behave as expected, the base class checks it only based on the slash in path
# seems that at/root are not exposed in the docs, so might be an implementation detail # seems that at/root are not exposed in the docs, so might be an implementation detail
at: str at: str
root: zipfile.ZipFile root: zipfile.ZipFile
@ -159,4 +169,4 @@ class ZipPath(zipfile.Path):
# hmm, super class doesn't seem to treat as equals unless they are the same object # hmm, super class doesn't seem to treat as equals unless they are the same object
if not isinstance(other, ZipPath): if not isinstance(other, ZipPath):
return False return False
return self.filename == other.filename and self.at == other.at return self.filename == other.filename and Path(self.at) == Path(other.at)

View file

@ -1,5 +1,6 @@
from pathlib import Path
import lzma import lzma
from pathlib import Path
import sys
import zipfile import zipfile
from my.core.kompress import kopen, kexists, CPath from my.core.kompress import kopen, kexists, CPath
@ -49,6 +50,10 @@ def prepare(tmp_path: Path):
pass pass
@pytest.mark.skipif(
sys.version_info[:2] < (3, 8),
reason=f"ZipFile.Path is only available since 3.8",
)
def test_zippath() -> None: def test_zippath() -> None:
from my.core.kompress import ZipPath from my.core.kompress import ZipPath
target = structure_data / 'gdpr_export.zip' target = structure_data / 'gdpr_export.zip'
@ -58,7 +63,7 @@ def test_zippath() -> None:
# magic! convenient to make third party libraries agnostic of ZipPath # magic! convenient to make third party libraries agnostic of ZipPath
assert isinstance(zp, Path) assert isinstance(zp, Path)
# FIXME maybe change str? since it's a bit misleading... # TODO maybe change __str__/__repr__? since it's a bit misleading:
# Path('/code/hpi/tests/core/structure_data/gdpr_export.zip', 'gdpr_export/') # Path('/code/hpi/tests/core/structure_data/gdpr_export.zip', 'gdpr_export/')
assert ZipPath(target) == ZipPath(target) assert ZipPath(target) == ZipPath(target)
@ -68,6 +73,7 @@ def test_zippath() -> None:
assert (zp / 'gdpr_export/comments').exists() assert (zp / 'gdpr_export/comments').exists()
# check str constructor just in case # check str constructor just in case
assert (ZipPath(str(target)) / 'gdpr_export/comments').exists() assert (ZipPath(str(target)) / 'gdpr_export/comments').exists()
assert not (ZipPath(str(target)) / 'whatever').exists()
matched = list(zp.rglob('*')) matched = list(zp.rglob('*'))
assert len(matched) > 0 assert len(matched) > 0
@ -85,15 +91,13 @@ def test_zippath() -> None:
], rpaths ], rpaths
# TODO hmm this doesn't work atm, although Path does # TODO hmm this doesn't work atm, wheras Path does
# not sure if it should be defensive or something... # not sure if it should be defensive or something...
# ZipPath('doesnotexist') # ZipPath('doesnotexist')
# same for this one # same for this one
# assert ZipPath(Path('test'), 'whatever').absolute() == ZipPath(Path('test').absolute(), 'whatever') # assert ZipPath(Path('test'), 'whatever').absolute() == ZipPath(Path('test').absolute(), 'whatever')
#
# FIXME vvv this should really work... assert (ZipPath(target) / 'gdpr_export/comments').exists()
# assert (ZipPath(target) / 'gdpr_export/comments').exists()
# assert ZipPath(target, 'gdpr_export/comments').exists()
jsons = [str(p.relative_to(zp / 'gdpr_export')) for p in zp.rglob('*.json')] jsons = [str(p.relative_to(zp / 'gdpr_export')) for p in zp.rglob('*.json')]
assert jsons == [ assert jsons == [
@ -101,6 +105,4 @@ def test_zippath() -> None:
'profile/settings.json', 'profile/settings.json',
] ]
# FIXME uhh.. this doesn't work? without slash probably should... assert list(zp.rglob('mes*')) == [ZipPath(target, 'gdpr_export/messages')]
# assert list(zp.rglob('mes*')) == [ZipPath(target, 'gdpr_export/messages')]
assert list(zp.rglob('mes*')) == [ZipPath(target, 'gdpr_export/messages/')]