filegrail 0.1.0__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 (121) hide show
  1. filegrail-0.1.0/.editorconfig +12 -0
  2. filegrail-0.1.0/.github/workflows/ci.yml +57 -0
  3. filegrail-0.1.0/.github/workflows/release.yml +30 -0
  4. filegrail-0.1.0/.gitignore +22 -0
  5. filegrail-0.1.0/.pre-commit-config.yaml +7 -0
  6. filegrail-0.1.0/CHANGELOG.md +1067 -0
  7. filegrail-0.1.0/CONTRIBUTING.md +82 -0
  8. filegrail-0.1.0/LICENSE +133 -0
  9. filegrail-0.1.0/PKG-INFO +587 -0
  10. filegrail-0.1.0/README.md +555 -0
  11. filegrail-0.1.0/SECURITY.md +43 -0
  12. filegrail-0.1.0/assets/README.md +40 -0
  13. filegrail-0.1.0/assets/filegrail-banner.svg +14 -0
  14. filegrail-0.1.0/assets/filegrail-logo-dark.svg +9 -0
  15. filegrail-0.1.0/assets/filegrail-logo-light.svg +9 -0
  16. filegrail-0.1.0/assets/filegrail-mark-light.svg +8 -0
  17. filegrail-0.1.0/assets/filegrail-mark-mono.svg +8 -0
  18. filegrail-0.1.0/assets/filegrail-mark.svg +8 -0
  19. filegrail-0.1.0/docs/DESIGN.md +584 -0
  20. filegrail-0.1.0/docs/FORMATS.md +202 -0
  21. filegrail-0.1.0/docs/specs/2026-09-01-derivation-lineage.md +167 -0
  22. filegrail-0.1.0/pyproject.toml +69 -0
  23. filegrail-0.1.0/src/filegrail/__init__.py +8 -0
  24. filegrail-0.1.0/src/filegrail/about.py +298 -0
  25. filegrail-0.1.0/src/filegrail/cbor.py +153 -0
  26. filegrail-0.1.0/src/filegrail/cli.py +445 -0
  27. filegrail-0.1.0/src/filegrail/cluster.py +113 -0
  28. filegrail-0.1.0/src/filegrail/compare.py +165 -0
  29. filegrail-0.1.0/src/filegrail/data/tlds.txt +1449 -0
  30. filegrail-0.1.0/src/filegrail/doctor.py +295 -0
  31. filegrail-0.1.0/src/filegrail/explain.py +179 -0
  32. filegrail-0.1.0/src/filegrail/filters.py +121 -0
  33. filegrail-0.1.0/src/filegrail/identify.py +408 -0
  34. filegrail-0.1.0/src/filegrail/lineage.py +210 -0
  35. filegrail-0.1.0/src/filegrail/menu.py +270 -0
  36. filegrail-0.1.0/src/filegrail/models.py +329 -0
  37. filegrail-0.1.0/src/filegrail/overview.py +357 -0
  38. filegrail-0.1.0/src/filegrail/reconcile.py +683 -0
  39. filegrail-0.1.0/src/filegrail/redact.py +211 -0
  40. filegrail-0.1.0/src/filegrail/report.py +1237 -0
  41. filegrail-0.1.0/src/filegrail/scan.py +245 -0
  42. filegrail-0.1.0/src/filegrail/sources/__init__.py +37 -0
  43. filegrail-0.1.0/src/filegrail/sources/archives.py +76 -0
  44. filegrail-0.1.0/src/filegrail/sources/browser.py +207 -0
  45. filegrail-0.1.0/src/filegrail/sources/c2pa.py +367 -0
  46. filegrail-0.1.0/src/filegrail/sources/embedded/__init__.py +465 -0
  47. filegrail-0.1.0/src/filegrail/sources/embedded/containers.py +236 -0
  48. filegrail-0.1.0/src/filegrail/sources/embedded/documents.py +264 -0
  49. filegrail-0.1.0/src/filegrail/sources/embedded/exif.py +367 -0
  50. filegrail-0.1.0/src/filegrail/sources/embedded/id3.py +119 -0
  51. filegrail-0.1.0/src/filegrail/sources/embedded/isobmff.py +186 -0
  52. filegrail-0.1.0/src/filegrail/sources/embedded/matroska.py +197 -0
  53. filegrail-0.1.0/src/filegrail/sources/embedded/ole.py +365 -0
  54. filegrail-0.1.0/src/filegrail/sources/embedded/png.py +119 -0
  55. filegrail-0.1.0/src/filegrail/sources/embedded/riff.py +264 -0
  56. filegrail-0.1.0/src/filegrail/sources/embedded/vorbis.py +130 -0
  57. filegrail-0.1.0/src/filegrail/sources/fsattrs.py +107 -0
  58. filegrail-0.1.0/src/filegrail/sources/iptc.py +302 -0
  59. filegrail-0.1.0/src/filegrail/sources/mail.py +249 -0
  60. filegrail-0.1.0/src/filegrail/sources/messenger.py +107 -0
  61. filegrail-0.1.0/src/filegrail/sources/quarantine.py +209 -0
  62. filegrail-0.1.0/src/filegrail/sources/recent.py +98 -0
  63. filegrail-0.1.0/src/filegrail/sources/shell.py +125 -0
  64. filegrail-0.1.0/src/filegrail/sources/shortcut.py +289 -0
  65. filegrail-0.1.0/src/filegrail/sources/sidecar.py +122 -0
  66. filegrail-0.1.0/src/filegrail/sources/xmp.py +381 -0
  67. filegrail-0.1.0/src/filegrail/theme.py +292 -0
  68. filegrail-0.1.0/src/filegrail/util.py +234 -0
  69. filegrail-0.1.0/tests/__init__.py +0 -0
  70. filegrail-0.1.0/tests/compound.py +136 -0
  71. filegrail-0.1.0/tests/shortcut.py +151 -0
  72. filegrail-0.1.0/tests/test_about.py +193 -0
  73. filegrail-0.1.0/tests/test_archives.py +116 -0
  74. filegrail-0.1.0/tests/test_blocks.py +292 -0
  75. filegrail-0.1.0/tests/test_browser.py +85 -0
  76. filegrail-0.1.0/tests/test_c2pa.py +251 -0
  77. filegrail-0.1.0/tests/test_cbor.py +72 -0
  78. filegrail-0.1.0/tests/test_cluster.py +169 -0
  79. filegrail-0.1.0/tests/test_commands.py +139 -0
  80. filegrail-0.1.0/tests/test_corpus.py +273 -0
  81. filegrail-0.1.0/tests/test_doctor.py +402 -0
  82. filegrail-0.1.0/tests/test_documented_formats.py +155 -0
  83. filegrail-0.1.0/tests/test_embedded.py +209 -0
  84. filegrail-0.1.0/tests/test_explain.py +209 -0
  85. filegrail-0.1.0/tests/test_fields.py +92 -0
  86. filegrail-0.1.0/tests/test_filters.py +148 -0
  87. filegrail-0.1.0/tests/test_formats.py +550 -0
  88. filegrail-0.1.0/tests/test_identify.py +228 -0
  89. filegrail-0.1.0/tests/test_iptc.py +289 -0
  90. filegrail-0.1.0/tests/test_kinds.py +191 -0
  91. filegrail-0.1.0/tests/test_layout.py +215 -0
  92. filegrail-0.1.0/tests/test_lineage.py +248 -0
  93. filegrail-0.1.0/tests/test_mail.py +138 -0
  94. filegrail-0.1.0/tests/test_matroska.py +198 -0
  95. filegrail-0.1.0/tests/test_menu.py +207 -0
  96. filegrail-0.1.0/tests/test_messenger.py +68 -0
  97. filegrail-0.1.0/tests/test_msg.py +169 -0
  98. filegrail-0.1.0/tests/test_ole.py +149 -0
  99. filegrail-0.1.0/tests/test_overview.py +412 -0
  100. filegrail-0.1.0/tests/test_profile.py +307 -0
  101. filegrail-0.1.0/tests/test_provenance.py +154 -0
  102. filegrail-0.1.0/tests/test_quarantine.py +242 -0
  103. filegrail-0.1.0/tests/test_recent.py +70 -0
  104. filegrail-0.1.0/tests/test_reconcile.py +707 -0
  105. filegrail-0.1.0/tests/test_redact.py +126 -0
  106. filegrail-0.1.0/tests/test_report.py +432 -0
  107. filegrail-0.1.0/tests/test_riff.py +339 -0
  108. filegrail-0.1.0/tests/test_scan.py +186 -0
  109. filegrail-0.1.0/tests/test_schema.py +127 -0
  110. filegrail-0.1.0/tests/test_shell.py +43 -0
  111. filegrail-0.1.0/tests/test_shortcut.py +255 -0
  112. filegrail-0.1.0/tests/test_sidecar.py +119 -0
  113. filegrail-0.1.0/tests/test_size_match.py +62 -0
  114. filegrail-0.1.0/tests/test_theme.py +108 -0
  115. filegrail-0.1.0/tests/test_util.py +116 -0
  116. filegrail-0.1.0/tests/test_vorbis.py +185 -0
  117. filegrail-0.1.0/tests/test_wrapping.py +316 -0
  118. filegrail-0.1.0/tests/test_xattrs.py +85 -0
  119. filegrail-0.1.0/tests/test_xmp.py +551 -0
  120. filegrail-0.1.0/tests/test_xmp_names.py +258 -0
  121. filegrail-0.1.0/tests/xattrs.py +56 -0
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = space
8
+ indent_size = 4
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.{md,yml,yaml,json,toml}]
12
+ indent_size = 2
@@ -0,0 +1,57 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ test:
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ os: [ubuntu-latest, macos-latest, windows-latest]
16
+ python-version: ["3.10", "3.12", "3.13"]
17
+
18
+ runs-on: ${{ matrix.os }}
19
+
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+ - name: Install
26
+ run: python -m pip install -e ".[dev]"
27
+ - name: Ruff
28
+ run: |
29
+ ruff check .
30
+ ruff format --check .
31
+ - name: Tests
32
+ run: pytest
33
+
34
+ package:
35
+ runs-on: ubuntu-latest
36
+
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - uses: actions/setup-python@v5
40
+ with:
41
+ python-version: "3.12"
42
+ - name: Build
43
+ run: |
44
+ python -m pip install build twine
45
+ python -m build
46
+ twine check dist/*
47
+ - name: The data file has to be inside the wheel
48
+ run: |
49
+ python - <<'CHECK'
50
+ import glob, zipfile
51
+ names = zipfile.ZipFile(glob.glob("dist/*.whl")[0]).namelist()
52
+ assert "filegrail/data/tlds.txt" in names, names
53
+ CHECK
54
+ - name: Install what was built and run it
55
+ run: |
56
+ python -m pip install dist/*.whl
57
+ filegrail --version
@@ -0,0 +1,30 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ environment: pypi
14
+
15
+ # Trusted Publishing: PyPI verifies this workflow's identity, so there is
16
+ # no API token to store, rotate or leak.
17
+ permissions:
18
+ id-token: write
19
+
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Build
26
+ run: |
27
+ python -m pip install build twine
28
+ python -m build
29
+ twine check dist/*
30
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,22 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ .venv/
9
+ .venv*/
10
+ venv/
11
+ .vscode/
12
+ .idea/
13
+ .DS_Store
14
+ .coverage
15
+ htmlcov/
16
+
17
+ # Review archives built with `git archive` - the repository already is the
18
+ # source of truth, so a snapshot of it inside itself only goes stale.
19
+ *.zip
20
+
21
+ # Local sample files for manual runs - never commit real documents
22
+ test-data/
@@ -0,0 +1,7 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.16.5
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format