summaryrefslogtreecommitdiff
path: root/libmat2/archive.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmat2/archive.py')
-rw-r--r--libmat2/archive.py32
1 files changed, 17 insertions, 15 deletions
diff --git a/libmat2/archive.py b/libmat2/archive.py
index 25ff7f9..cbedcd2 100644
--- a/libmat2/archive.py
+++ b/libmat2/archive.py
@@ -7,7 +7,7 @@ import tempfile
7import os 7import os
8import logging 8import logging
9import shutil 9import shutil
10from typing import Pattern, Union, Any 10from typing import Pattern, Union, Any, Set, Dict, List
11 11
12from . import abstract, UnknownMemberPolicy, parser_factory 12from . import abstract, UnknownMemberPolicy, parser_factory
13 13
@@ -44,16 +44,16 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
44 def __init__(self, filename): 44 def __init__(self, filename):
45 super().__init__(filename) 45 super().__init__(filename)
46 # We ignore typing here because mypy is too stupid 46 # We ignore typing here because mypy is too stupid
47 self.archive_class = None # type: ignore 47 self.archive_class = None # type: ignore
48 self.member_class = None # type: ignore 48 self.member_class = None # type: ignore
49 49
50 # Those are the files that have a format that _isn't_ 50 # Those are the files that have a format that _isn't_
51 # supported by mat2, but that we want to keep anyway. 51 # supported by mat2, but that we want to keep anyway.
52 self.files_to_keep = set() # type: set[Pattern] 52 self.files_to_keep = set() # type: Set[Pattern]
53 53
54 # Those are the files that we _do not_ want to keep, 54 # Those are the files that we _do not_ want to keep,
55 # no matter if they are supported or not. 55 # no matter if they are supported or not.
56 self.files_to_omit = set() # type: set[Pattern] 56 self.files_to_omit = set() # type: Set[Pattern]
57 57
58 # what should the parser do if it encounters an unknown file in 58 # what should the parser do if it encounters an unknown file in
59 # the archive? 59 # the archive?
@@ -72,7 +72,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
72 # pylint: disable=unused-argument 72 # pylint: disable=unused-argument
73 return True # pragma: no cover 73 return True # pragma: no cover
74 74
75 def _specific_get_meta(self, full_path: str, file_path: str) -> dict[str, Any]: 75 def _specific_get_meta(self, full_path: str, file_path: str) -> Dict[str, Any]:
76 """ This method can be used to extract specific metadata 76 """ This method can be used to extract specific metadata
77 from files present in the archive.""" 77 from files present in the archive."""
78 # pylint: disable=unused-argument 78 # pylint: disable=unused-argument
@@ -87,7 +87,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
87 87
88 @staticmethod 88 @staticmethod
89 @abc.abstractmethod 89 @abc.abstractmethod
90 def _get_all_members(archive: ArchiveClass) -> list[ArchiveMember]: 90 def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]:
91 """Return all the members of the archive.""" 91 """Return all the members of the archive."""
92 92
93 @staticmethod 93 @staticmethod
@@ -97,7 +97,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
97 97
98 @staticmethod 98 @staticmethod
99 @abc.abstractmethod 99 @abc.abstractmethod
100 def _get_member_meta(member: ArchiveMember) -> dict[str, str]: 100 def _get_member_meta(member: ArchiveMember) -> Dict[str, str]:
101 """Return all the metadata of a given member.""" 101 """Return all the metadata of a given member."""
102 102
103 @staticmethod 103 @staticmethod
@@ -128,8 +128,8 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
128 # pylint: disable=unused-argument 128 # pylint: disable=unused-argument
129 return member 129 return member
130 130
131 def get_meta(self) -> dict[str, Union[str, dict]]: 131 def get_meta(self) -> dict[str, Union[str, Dict]]:
132 meta = dict() # type: dict[str, Union[str, dict]] 132 meta = dict() # type: Dict[str, Union[str, Dict]]
133 133
134 with self.archive_class(self.filename) as zin: 134 with self.archive_class(self.filename) as zin:
135 temp_folder = tempfile.mkdtemp() 135 temp_folder = tempfile.mkdtemp()
@@ -264,6 +264,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
264 264
265class TarParser(ArchiveBasedAbstractParser): 265class TarParser(ArchiveBasedAbstractParser):
266 mimetypes = {'application/x-tar'} 266 mimetypes = {'application/x-tar'}
267
267 def __init__(self, filename): 268 def __init__(self, filename):
268 super().__init__(filename) 269 super().__init__(filename)
269 # yes, it's tarfile.open and not tarfile.TarFile, 270 # yes, it's tarfile.open and not tarfile.TarFile,
@@ -336,7 +337,7 @@ class TarParser(ArchiveBasedAbstractParser):
336 return member 337 return member
337 338
338 @staticmethod 339 @staticmethod
339 def _get_member_meta(member: ArchiveMember) -> dict[str, str]: 340 def _get_member_meta(member: ArchiveMember) -> Dict[str, str]:
340 assert isinstance(member, tarfile.TarInfo) # please mypy 341 assert isinstance(member, tarfile.TarInfo) # please mypy
341 metadata = {} 342 metadata = {}
342 if member.mtime != 0: 343 if member.mtime != 0:
@@ -358,7 +359,7 @@ class TarParser(ArchiveBasedAbstractParser):
358 archive.add(full_path, member.name, filter=TarParser._clean_member) # type: ignore 359 archive.add(full_path, member.name, filter=TarParser._clean_member) # type: ignore
359 360
360 @staticmethod 361 @staticmethod
361 def _get_all_members(archive: ArchiveClass) -> list[ArchiveMember]: 362 def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]:
362 assert isinstance(archive, tarfile.TarFile) # please mypy 363 assert isinstance(archive, tarfile.TarFile) # please mypy
363 return archive.getmembers() # type: ignore 364 return archive.getmembers() # type: ignore
364 365
@@ -391,7 +392,8 @@ class TarXzParser(TarParser):
391 392
392class ZipParser(ArchiveBasedAbstractParser): 393class ZipParser(ArchiveBasedAbstractParser):
393 mimetypes = {'application/zip'} 394 mimetypes = {'application/zip'}
394 def __init__(self, filename): 395
396 def __init__(self, filename: str):
395 super().__init__(filename) 397 super().__init__(filename)
396 self.archive_class = zipfile.ZipFile 398 self.archive_class = zipfile.ZipFile
397 self.member_class = zipfile.ZipInfo 399 self.member_class = zipfile.ZipInfo
@@ -412,7 +414,7 @@ class ZipParser(ArchiveBasedAbstractParser):
412 return member 414 return member
413 415
414 @staticmethod 416 @staticmethod
415 def _get_member_meta(member: ArchiveMember) -> dict[str, str]: 417 def _get_member_meta(member: ArchiveMember) -> Dict[str, str]:
416 assert isinstance(member, zipfile.ZipInfo) # please mypy 418 assert isinstance(member, zipfile.ZipInfo) # please mypy
417 metadata = {} 419 metadata = {}
418 if member.create_system == 3: # this is Linux 420 if member.create_system == 3: # this is Linux
@@ -439,7 +441,7 @@ class ZipParser(ArchiveBasedAbstractParser):
439 compress_type=member.compress_type) 441 compress_type=member.compress_type)
440 442
441 @staticmethod 443 @staticmethod
442 def _get_all_members(archive: ArchiveClass) -> list[ArchiveMember]: 444 def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]:
443 assert isinstance(archive, zipfile.ZipFile) # please mypy 445 assert isinstance(archive, zipfile.ZipFile) # please mypy
444 return archive.infolist() # type: ignore 446 return archive.infolist() # type: ignore
445 447