puremagic 2.0.1__tar.gz → 2.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {puremagic-2.0.1 → puremagic-2.0.2}/CHANGELOG.md +5 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/PKG-INFO +1 -1
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/main.py +4 -4
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/PKG-INFO +1 -1
- {puremagic-2.0.1 → puremagic-2.0.2}/test/test_scanners.py +13 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/.coveragerc +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/.github/workflows/pythonpublish.yml +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/.github/workflows/tests.yml +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/.gitignore +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/.pre-commit-config.yaml +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/AUTHORS.rst +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/LICENSE +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/MANIFEST.in +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/README.rst +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/__init__.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/__main__.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/magic_data.json +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/py.typed +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/__init__.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/hdf5_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/helpers.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/json_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/mpeg_audio_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/pdf_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/python_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/sndhdr_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/text_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/zip_scanner.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/SOURCES.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/dependency_links.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/entry_points.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/top_level.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/pyproject.toml +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/requirements-test.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/scripts/parse_ftk_kessler_sigs.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/setup.cfg +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/__init__.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/common.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.7z +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.big_endian.pcapng +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.bz2 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.cb7 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.cbt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.cbz +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.fb2.zip +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.fbz +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.gz +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.little_endian.pcapng +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.pcapng +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.rar +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.tar +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.txt.lz4 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.txt.zst +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.xz +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.zip +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.aac +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.aif +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.flac +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.opus +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.sndr +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.wav +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_info_128k_notags.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_3di_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev1_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev2_tagplus_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_ext_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_lyrics3v2_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_notags.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_tagplus_apev2_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_tagplus_id3v1.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mpeg2_mp3_VBR_128k_id3v2_24.mp3 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/fake_file +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.avif +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.bmp +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.gif +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.ico +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.jpg +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.png +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.psd +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.svg +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.tga +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.tif +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.webp +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.xcf +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test_varriant.svg +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test_varriant_2.svg +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test (single).vmdk +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test (split).vmdk +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test.iso +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test.mdf +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test.swf +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.doc +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.docm +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.docx +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.dotm +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.dotx +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.eml +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.fb2 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.odp +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.ods +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.odt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.pdf +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.potm +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.potx +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.ppt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.pptm +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.pptx +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xls +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xlsb +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xlsm +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xlsx +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xltm +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xltx +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test_utf16le.csv +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/text_cr.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/text_crlf.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/text_lf.txt +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.exe +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.json +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.puremagic_multi_footer +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test_list.json +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.3g2 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.avi +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.flv +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.jxsv +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.mkv +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.mp4 +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.mpg +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.wmv +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/test/test_common_extensions.py +0 -0
- {puremagic-2.0.1 → puremagic-2.0.2}/uv.lock +0 -0
|
@@ -34,7 +34,7 @@ if os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
__author__ = "Chris Griffith"
|
|
37
|
-
__version__ = "2.0.
|
|
37
|
+
__version__ = "2.0.2"
|
|
38
38
|
__all__ = [
|
|
39
39
|
"magic_file",
|
|
40
40
|
"magic_string",
|
|
@@ -208,7 +208,7 @@ def perform_magic(header: bytes, footer: bytes, mime: bool, ext=None, filename=N
|
|
|
208
208
|
if not header:
|
|
209
209
|
raise PureValueError("Input was empty")
|
|
210
210
|
infos = identify_all(header, footer, ext)
|
|
211
|
-
if filename and os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
211
|
+
if filename and os.path.isfile(filename) and os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
212
212
|
results = run_deep_scan(infos, filename, header, footer, raise_on_none=True)
|
|
213
213
|
if results:
|
|
214
214
|
if results[0].extension == "":
|
|
@@ -362,7 +362,7 @@ def magic_string(string, filename: os.PathLike | str | None = None) -> list[Pure
|
|
|
362
362
|
ext = ext_from_filename(filename) if filename else None
|
|
363
363
|
info = identify_all(head, foot, ext)
|
|
364
364
|
info.sort(key=lambda x: x.confidence, reverse=True)
|
|
365
|
-
if filename and os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
365
|
+
if filename and os.path.isfile(filename) and os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
366
366
|
return run_deep_scan(info, filename, head, foot, raise_on_none=False)
|
|
367
367
|
return info
|
|
368
368
|
|
|
@@ -385,7 +385,7 @@ def magic_stream(
|
|
|
385
385
|
ext = ext_from_filename(filename) if filename else None
|
|
386
386
|
info = identify_all(head, foot, ext)
|
|
387
387
|
info.sort(key=lambda x: x.confidence, reverse=True)
|
|
388
|
-
if filename and os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
388
|
+
if filename and os.path.isfile(filename) and os.getenv("PUREMAGIC_DEEPSCAN") != "0":
|
|
389
389
|
return run_deep_scan(info, filename, head, foot, raise_on_none=False)
|
|
390
390
|
return info
|
|
391
391
|
|
|
@@ -57,6 +57,19 @@ def test_utf16_le_csv_deep_scan():
|
|
|
57
57
|
assert results[0].confidence >= 0.9
|
|
58
58
|
|
|
59
59
|
|
|
60
|
+
def test_from_string_nonexistent_filename():
|
|
61
|
+
# GH #137: passing filename for extension hint should not raise FileNotFoundError
|
|
62
|
+
# Use PDF-like bytes so identify_all finds a match via magic numbers,
|
|
63
|
+
# then deep scan is skipped (file doesn't exist) and the match is returned.
|
|
64
|
+
pdf_bytes = b"%PDF-1.4 fake content"
|
|
65
|
+
result = puremagic.from_string(pdf_bytes, filename="nonexistent.pdf")
|
|
66
|
+
assert result == ".pdf"
|
|
67
|
+
|
|
68
|
+
# magic_string should also work without crashing
|
|
69
|
+
results = puremagic.magic_string(pdf_bytes, filename="nonexistent.pdf")
|
|
70
|
+
assert any(r.extension == ".pdf" for r in results)
|
|
71
|
+
|
|
72
|
+
|
|
60
73
|
def test_python_scanner():
|
|
61
74
|
# Test the Python scanner with a sample Python file
|
|
62
75
|
py_file = SYSTEM_DIR / "test.py"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_3di_id3v1.mp3
RENAMED
|
File without changes
|
|
File without changes
|
{puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev1_id3v1.mp3
RENAMED
|
File without changes
|
|
File without changes
|
{puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_ext_id3v1.mp3
RENAMED
|
File without changes
|
{puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_lyrics3v2_id3v1.mp3
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_tagplus_id3v1.mp3
RENAMED
|
File without changes
|
{puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mpeg2_mp3_VBR_128k_id3v2_24.mp3
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|