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.
- filegrail-0.1.0/.editorconfig +12 -0
- filegrail-0.1.0/.github/workflows/ci.yml +57 -0
- filegrail-0.1.0/.github/workflows/release.yml +30 -0
- filegrail-0.1.0/.gitignore +22 -0
- filegrail-0.1.0/.pre-commit-config.yaml +7 -0
- filegrail-0.1.0/CHANGELOG.md +1067 -0
- filegrail-0.1.0/CONTRIBUTING.md +82 -0
- filegrail-0.1.0/LICENSE +133 -0
- filegrail-0.1.0/PKG-INFO +587 -0
- filegrail-0.1.0/README.md +555 -0
- filegrail-0.1.0/SECURITY.md +43 -0
- filegrail-0.1.0/assets/README.md +40 -0
- filegrail-0.1.0/assets/filegrail-banner.svg +14 -0
- filegrail-0.1.0/assets/filegrail-logo-dark.svg +9 -0
- filegrail-0.1.0/assets/filegrail-logo-light.svg +9 -0
- filegrail-0.1.0/assets/filegrail-mark-light.svg +8 -0
- filegrail-0.1.0/assets/filegrail-mark-mono.svg +8 -0
- filegrail-0.1.0/assets/filegrail-mark.svg +8 -0
- filegrail-0.1.0/docs/DESIGN.md +584 -0
- filegrail-0.1.0/docs/FORMATS.md +202 -0
- filegrail-0.1.0/docs/specs/2026-09-01-derivation-lineage.md +167 -0
- filegrail-0.1.0/pyproject.toml +69 -0
- filegrail-0.1.0/src/filegrail/__init__.py +8 -0
- filegrail-0.1.0/src/filegrail/about.py +298 -0
- filegrail-0.1.0/src/filegrail/cbor.py +153 -0
- filegrail-0.1.0/src/filegrail/cli.py +445 -0
- filegrail-0.1.0/src/filegrail/cluster.py +113 -0
- filegrail-0.1.0/src/filegrail/compare.py +165 -0
- filegrail-0.1.0/src/filegrail/data/tlds.txt +1449 -0
- filegrail-0.1.0/src/filegrail/doctor.py +295 -0
- filegrail-0.1.0/src/filegrail/explain.py +179 -0
- filegrail-0.1.0/src/filegrail/filters.py +121 -0
- filegrail-0.1.0/src/filegrail/identify.py +408 -0
- filegrail-0.1.0/src/filegrail/lineage.py +210 -0
- filegrail-0.1.0/src/filegrail/menu.py +270 -0
- filegrail-0.1.0/src/filegrail/models.py +329 -0
- filegrail-0.1.0/src/filegrail/overview.py +357 -0
- filegrail-0.1.0/src/filegrail/reconcile.py +683 -0
- filegrail-0.1.0/src/filegrail/redact.py +211 -0
- filegrail-0.1.0/src/filegrail/report.py +1237 -0
- filegrail-0.1.0/src/filegrail/scan.py +245 -0
- filegrail-0.1.0/src/filegrail/sources/__init__.py +37 -0
- filegrail-0.1.0/src/filegrail/sources/archives.py +76 -0
- filegrail-0.1.0/src/filegrail/sources/browser.py +207 -0
- filegrail-0.1.0/src/filegrail/sources/c2pa.py +367 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/__init__.py +465 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/containers.py +236 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/documents.py +264 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/exif.py +367 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/id3.py +119 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/isobmff.py +186 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/matroska.py +197 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/ole.py +365 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/png.py +119 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/riff.py +264 -0
- filegrail-0.1.0/src/filegrail/sources/embedded/vorbis.py +130 -0
- filegrail-0.1.0/src/filegrail/sources/fsattrs.py +107 -0
- filegrail-0.1.0/src/filegrail/sources/iptc.py +302 -0
- filegrail-0.1.0/src/filegrail/sources/mail.py +249 -0
- filegrail-0.1.0/src/filegrail/sources/messenger.py +107 -0
- filegrail-0.1.0/src/filegrail/sources/quarantine.py +209 -0
- filegrail-0.1.0/src/filegrail/sources/recent.py +98 -0
- filegrail-0.1.0/src/filegrail/sources/shell.py +125 -0
- filegrail-0.1.0/src/filegrail/sources/shortcut.py +289 -0
- filegrail-0.1.0/src/filegrail/sources/sidecar.py +122 -0
- filegrail-0.1.0/src/filegrail/sources/xmp.py +381 -0
- filegrail-0.1.0/src/filegrail/theme.py +292 -0
- filegrail-0.1.0/src/filegrail/util.py +234 -0
- filegrail-0.1.0/tests/__init__.py +0 -0
- filegrail-0.1.0/tests/compound.py +136 -0
- filegrail-0.1.0/tests/shortcut.py +151 -0
- filegrail-0.1.0/tests/test_about.py +193 -0
- filegrail-0.1.0/tests/test_archives.py +116 -0
- filegrail-0.1.0/tests/test_blocks.py +292 -0
- filegrail-0.1.0/tests/test_browser.py +85 -0
- filegrail-0.1.0/tests/test_c2pa.py +251 -0
- filegrail-0.1.0/tests/test_cbor.py +72 -0
- filegrail-0.1.0/tests/test_cluster.py +169 -0
- filegrail-0.1.0/tests/test_commands.py +139 -0
- filegrail-0.1.0/tests/test_corpus.py +273 -0
- filegrail-0.1.0/tests/test_doctor.py +402 -0
- filegrail-0.1.0/tests/test_documented_formats.py +155 -0
- filegrail-0.1.0/tests/test_embedded.py +209 -0
- filegrail-0.1.0/tests/test_explain.py +209 -0
- filegrail-0.1.0/tests/test_fields.py +92 -0
- filegrail-0.1.0/tests/test_filters.py +148 -0
- filegrail-0.1.0/tests/test_formats.py +550 -0
- filegrail-0.1.0/tests/test_identify.py +228 -0
- filegrail-0.1.0/tests/test_iptc.py +289 -0
- filegrail-0.1.0/tests/test_kinds.py +191 -0
- filegrail-0.1.0/tests/test_layout.py +215 -0
- filegrail-0.1.0/tests/test_lineage.py +248 -0
- filegrail-0.1.0/tests/test_mail.py +138 -0
- filegrail-0.1.0/tests/test_matroska.py +198 -0
- filegrail-0.1.0/tests/test_menu.py +207 -0
- filegrail-0.1.0/tests/test_messenger.py +68 -0
- filegrail-0.1.0/tests/test_msg.py +169 -0
- filegrail-0.1.0/tests/test_ole.py +149 -0
- filegrail-0.1.0/tests/test_overview.py +412 -0
- filegrail-0.1.0/tests/test_profile.py +307 -0
- filegrail-0.1.0/tests/test_provenance.py +154 -0
- filegrail-0.1.0/tests/test_quarantine.py +242 -0
- filegrail-0.1.0/tests/test_recent.py +70 -0
- filegrail-0.1.0/tests/test_reconcile.py +707 -0
- filegrail-0.1.0/tests/test_redact.py +126 -0
- filegrail-0.1.0/tests/test_report.py +432 -0
- filegrail-0.1.0/tests/test_riff.py +339 -0
- filegrail-0.1.0/tests/test_scan.py +186 -0
- filegrail-0.1.0/tests/test_schema.py +127 -0
- filegrail-0.1.0/tests/test_shell.py +43 -0
- filegrail-0.1.0/tests/test_shortcut.py +255 -0
- filegrail-0.1.0/tests/test_sidecar.py +119 -0
- filegrail-0.1.0/tests/test_size_match.py +62 -0
- filegrail-0.1.0/tests/test_theme.py +108 -0
- filegrail-0.1.0/tests/test_util.py +116 -0
- filegrail-0.1.0/tests/test_vorbis.py +185 -0
- filegrail-0.1.0/tests/test_wrapping.py +316 -0
- filegrail-0.1.0/tests/test_xattrs.py +85 -0
- filegrail-0.1.0/tests/test_xmp.py +551 -0
- filegrail-0.1.0/tests/test_xmp_names.py +258 -0
- filegrail-0.1.0/tests/xattrs.py +56 -0
|
@@ -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/
|