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.
Files changed (135) hide show
  1. {puremagic-2.0.1 → puremagic-2.0.2}/CHANGELOG.md +5 -0
  2. {puremagic-2.0.1 → puremagic-2.0.2}/PKG-INFO +1 -1
  3. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/main.py +4 -4
  4. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/PKG-INFO +1 -1
  5. {puremagic-2.0.1 → puremagic-2.0.2}/test/test_scanners.py +13 -0
  6. {puremagic-2.0.1 → puremagic-2.0.2}/.coveragerc +0 -0
  7. {puremagic-2.0.1 → puremagic-2.0.2}/.github/workflows/pythonpublish.yml +0 -0
  8. {puremagic-2.0.1 → puremagic-2.0.2}/.github/workflows/tests.yml +0 -0
  9. {puremagic-2.0.1 → puremagic-2.0.2}/.gitignore +0 -0
  10. {puremagic-2.0.1 → puremagic-2.0.2}/.pre-commit-config.yaml +0 -0
  11. {puremagic-2.0.1 → puremagic-2.0.2}/AUTHORS.rst +0 -0
  12. {puremagic-2.0.1 → puremagic-2.0.2}/LICENSE +0 -0
  13. {puremagic-2.0.1 → puremagic-2.0.2}/MANIFEST.in +0 -0
  14. {puremagic-2.0.1 → puremagic-2.0.2}/README.rst +0 -0
  15. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/__init__.py +0 -0
  16. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/__main__.py +0 -0
  17. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/magic_data.json +0 -0
  18. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/py.typed +0 -0
  19. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/__init__.py +0 -0
  20. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/hdf5_scanner.py +0 -0
  21. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/helpers.py +0 -0
  22. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/json_scanner.py +0 -0
  23. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/mpeg_audio_scanner.py +0 -0
  24. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/pdf_scanner.py +0 -0
  25. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/python_scanner.py +0 -0
  26. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/sndhdr_scanner.py +0 -0
  27. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/text_scanner.py +0 -0
  28. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic/scanners/zip_scanner.py +0 -0
  29. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/SOURCES.txt +0 -0
  30. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/dependency_links.txt +0 -0
  31. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/entry_points.txt +0 -0
  32. {puremagic-2.0.1 → puremagic-2.0.2}/puremagic.egg-info/top_level.txt +0 -0
  33. {puremagic-2.0.1 → puremagic-2.0.2}/pyproject.toml +0 -0
  34. {puremagic-2.0.1 → puremagic-2.0.2}/requirements-test.txt +0 -0
  35. {puremagic-2.0.1 → puremagic-2.0.2}/scripts/parse_ftk_kessler_sigs.py +0 -0
  36. {puremagic-2.0.1 → puremagic-2.0.2}/setup.cfg +0 -0
  37. {puremagic-2.0.1 → puremagic-2.0.2}/test/__init__.py +0 -0
  38. {puremagic-2.0.1 → puremagic-2.0.2}/test/common.py +0 -0
  39. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.7z +0 -0
  40. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.big_endian.pcapng +0 -0
  41. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.bz2 +0 -0
  42. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.cb7 +0 -0
  43. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.cbt +0 -0
  44. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.cbz +0 -0
  45. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.fb2.zip +0 -0
  46. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.fbz +0 -0
  47. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.gz +0 -0
  48. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.little_endian.pcapng +0 -0
  49. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.pcapng +0 -0
  50. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.rar +0 -0
  51. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.tar +0 -0
  52. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.txt.lz4 +0 -0
  53. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.txt.zst +0 -0
  54. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.xz +0 -0
  55. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/archive/test.zip +0 -0
  56. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.aac +0 -0
  57. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.aif +0 -0
  58. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.flac +0 -0
  59. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.mp3 +0 -0
  60. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.opus +0 -0
  61. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.sndr +0 -0
  62. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test.wav +0 -0
  63. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_info_128k_notags.mp3 +0 -0
  64. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_3di_id3v1.mp3 +0 -0
  65. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev1.mp3 +0 -0
  66. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev1_id3v1.mp3 +0 -0
  67. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_apev2_tagplus_id3v1.mp3 +0 -0
  68. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_ext_id3v1.mp3 +0 -0
  69. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_lyrics3v2_id3v1.mp3 +0 -0
  70. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_notags.mp3 +0 -0
  71. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_tagplus_apev2_id3v1.mp3 +0 -0
  72. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mp3_vbr_xing_128k_tagplus_id3v1.mp3 +0 -0
  73. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/audio/test_mpeg2_mp3_VBR_128k_id3v2_24.mp3 +0 -0
  74. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/fake_file +0 -0
  75. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.avif +0 -0
  76. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.bmp +0 -0
  77. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.gif +0 -0
  78. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.ico +0 -0
  79. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.jpg +0 -0
  80. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.png +0 -0
  81. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.psd +0 -0
  82. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.svg +0 -0
  83. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.tga +0 -0
  84. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.tif +0 -0
  85. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.webp +0 -0
  86. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test.xcf +0 -0
  87. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test_varriant.svg +0 -0
  88. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/images/test_varriant_2.svg +0 -0
  89. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test (single).vmdk +0 -0
  90. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test (split).vmdk +0 -0
  91. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test.iso +0 -0
  92. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test.mdf +0 -0
  93. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/media/test.swf +0 -0
  94. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.doc +0 -0
  95. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.docm +0 -0
  96. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.docx +0 -0
  97. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.dotm +0 -0
  98. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.dotx +0 -0
  99. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.eml +0 -0
  100. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.fb2 +0 -0
  101. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.odp +0 -0
  102. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.ods +0 -0
  103. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.odt +0 -0
  104. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.pdf +0 -0
  105. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.potm +0 -0
  106. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.potx +0 -0
  107. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.ppt +0 -0
  108. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.pptm +0 -0
  109. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.pptx +0 -0
  110. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.txt +0 -0
  111. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xls +0 -0
  112. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xlsb +0 -0
  113. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xlsm +0 -0
  114. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xlsx +0 -0
  115. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xltm +0 -0
  116. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test.xltx +0 -0
  117. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/test_utf16le.csv +0 -0
  118. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/text_cr.txt +0 -0
  119. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/text_crlf.txt +0 -0
  120. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/office/text_lf.txt +0 -0
  121. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.exe +0 -0
  122. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.json +0 -0
  123. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.puremagic_multi_footer +0 -0
  124. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test.py +0 -0
  125. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/system/test_list.json +0 -0
  126. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.3g2 +0 -0
  127. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.avi +0 -0
  128. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.flv +0 -0
  129. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.jxsv +0 -0
  130. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.mkv +0 -0
  131. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.mp4 +0 -0
  132. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.mpg +0 -0
  133. {puremagic-2.0.1 → puremagic-2.0.2}/test/resources/video/test.wmv +0 -0
  134. {puremagic-2.0.1 → puremagic-2.0.2}/test/test_common_extensions.py +0 -0
  135. {puremagic-2.0.1 → puremagic-2.0.2}/uv.lock +0 -0
@@ -1,6 +1,11 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ Version 2.0.2
5
+ -------------
6
+
7
+ - Fixing #137 passing non-existent filename to from_string()/from_stream() no longer raises FileNotFoundError (thanks to denisw)
8
+
4
9
  Version 2.0.1
5
10
  -------------
6
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: puremagic
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Pure python implementation of magic file detection
5
5
  Author-email: Chris Griffith <chris@cdgriffith.com>
6
6
  License-Expression: MIT
@@ -34,7 +34,7 @@ if os.getenv("PUREMAGIC_DEEPSCAN") != "0":
34
34
  )
35
35
 
36
36
  __author__ = "Chris Griffith"
37
- __version__ = "2.0.1"
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: puremagic
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Pure python implementation of magic file detection
5
5
  Author-email: Chris Griffith <chris@cdgriffith.com>
6
6
  License-Expression: MIT
@@ -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