|
|
|
@@ -0,0 +1,44 @@ |
|
|
|
"""Utility of file path""" |
|
|
|
import pathlib |
|
|
|
|
|
|
|
FILE_TYPE_ALIASES = { |
|
|
|
".tbz": (".tar", ".bz2"), |
|
|
|
".tbz2": (".tar", ".bz2"), |
|
|
|
".tgz": (".tar", ".gz"), |
|
|
|
} |
|
|
|
|
|
|
|
ARCHIVE_TYPE_SUFFIX = [ |
|
|
|
".tar", |
|
|
|
".zip", |
|
|
|
] |
|
|
|
|
|
|
|
COMPRESS_TYPE_SUFFIX = [ |
|
|
|
".bz2", |
|
|
|
".gz", |
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
def detect_file_type(filename: str): # pylint: disable=inconsistent-return-statements |
|
|
|
"""Detect file type by suffixes and return tuple(suffix, archive_type, compression).""" |
|
|
|
suffixes = pathlib.Path(filename).suffixes |
|
|
|
if not suffixes: |
|
|
|
raise RuntimeError(f"File `{filename}` has no suffixes that could be used to detect.") |
|
|
|
suffix = suffixes[-1] |
|
|
|
|
|
|
|
# Check if the suffix is a known alias. |
|
|
|
if suffix in FILE_TYPE_ALIASES: |
|
|
|
return suffix, FILE_TYPE_ALIASES[suffix][0], FILE_TYPE_ALIASES[suffix][1] |
|
|
|
|
|
|
|
# Check if the suffix is an archive type. |
|
|
|
if suffix in ARCHIVE_TYPE_SUFFIX: |
|
|
|
return suffix, suffix, None |
|
|
|
|
|
|
|
# Check if the suffix is a compression. |
|
|
|
if suffix in COMPRESS_TYPE_SUFFIX: |
|
|
|
# Check for suffix hierarchy. |
|
|
|
if len(suffixes) > 1: |
|
|
|
suffix2 = suffixes[-2] |
|
|
|
# Check if the suffix2 is an archive type. |
|
|
|
if suffix2 in ARCHIVE_TYPE_SUFFIX: |
|
|
|
return suffix2 + suffix, suffix2, suffix |
|
|
|
return suffix, None, suffix |