pseudonymize 0.1.0a1__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.
- pseudonymize-0.1.0a1/.editorconfig +11 -0
- pseudonymize-0.1.0a1/.gitattributes +1 -0
- pseudonymize-0.1.0a1/.github/CODEOWNERS +1 -0
- pseudonymize-0.1.0a1/.github/ISSUE_TEMPLATE/bug.yml +24 -0
- pseudonymize-0.1.0a1/.github/ISSUE_TEMPLATE/detector-request.yml +23 -0
- pseudonymize-0.1.0a1/.github/ISSUE_TEMPLATE/feature.yml +17 -0
- pseudonymize-0.1.0a1/.github/dependabot.yml +13 -0
- pseudonymize-0.1.0a1/.github/pull_request_template.md +8 -0
- pseudonymize-0.1.0a1/.github/workflows/ci.yml +63 -0
- pseudonymize-0.1.0a1/.github/workflows/docs.yml +37 -0
- pseudonymize-0.1.0a1/.github/workflows/package.yml +29 -0
- pseudonymize-0.1.0a1/.github/workflows/release.yml +58 -0
- pseudonymize-0.1.0a1/.gitignore +218 -0
- pseudonymize-0.1.0a1/.pre-commit-config.yaml +7 -0
- pseudonymize-0.1.0a1/CHANGELOG.md +26 -0
- pseudonymize-0.1.0a1/CODE_OF_CONDUCT.md +5 -0
- pseudonymize-0.1.0a1/CONTRIBUTING.md +15 -0
- pseudonymize-0.1.0a1/LICENSE +201 -0
- pseudonymize-0.1.0a1/PKG-INFO +184 -0
- pseudonymize-0.1.0a1/README.md +156 -0
- pseudonymize-0.1.0a1/ROADMAP.md +100 -0
- pseudonymize-0.1.0a1/SECURITY.md +17 -0
- pseudonymize-0.1.0a1/VISION.md +56 -0
- pseudonymize-0.1.0a1/benchmarks/README.md +10 -0
- pseudonymize-0.1.0a1/benchmarks/benchmark_detectors.py +9 -0
- pseudonymize-0.1.0a1/benchmarks/benchmark_engine.py +17 -0
- pseudonymize-0.1.0a1/benchmarks/datasets/synthetic_messages.jsonl +3 -0
- pseudonymize-0.1.0a1/docs/adr/0001-dependency-free-core.md +6 -0
- pseudonymize-0.1.0a1/docs/adr/0002-token-format.md +6 -0
- pseudonymize-0.1.0a1/docs/adr/0003-no-reversible-storage.md +6 -0
- pseudonymize-0.1.0a1/docs/adr/0004-optional-ner-backend.md +6 -0
- pseudonymize-0.1.0a1/docs/api.md +17 -0
- pseudonymize-0.1.0a1/docs/architecture.md +92 -0
- pseudonymize-0.1.0a1/docs/benchmarks.md +5 -0
- pseudonymize-0.1.0a1/docs/contributing.md +4 -0
- pseudonymize-0.1.0a1/docs/detectors.md +8 -0
- pseudonymize-0.1.0a1/docs/index.md +10 -0
- pseudonymize-0.1.0a1/docs/limitations.md +6 -0
- pseudonymize-0.1.0a1/docs/llm-payloads.md +9 -0
- pseudonymize-0.1.0a1/docs/policies.md +9 -0
- pseudonymize-0.1.0a1/docs/quickstart.md +12 -0
- pseudonymize-0.1.0a1/docs/releasing.md +71 -0
- pseudonymize-0.1.0a1/docs/security.md +13 -0
- pseudonymize-0.1.0a1/docs/threat-model.md +14 -0
- pseudonymize-0.1.0a1/mkdocs.yml +35 -0
- pseudonymize-0.1.0a1/pyproject.toml +99 -0
- pseudonymize-0.1.0a1/scripts/__init__.py +0 -0
- pseudonymize-0.1.0a1/scripts/verify_release.py +105 -0
- pseudonymize-0.1.0a1/src/pseudonymize/__init__.py +28 -0
- pseudonymize-0.1.0a1/src/pseudonymize/api.py +50 -0
- pseudonymize-0.1.0a1/src/pseudonymize/backends/__init__.py +5 -0
- pseudonymize-0.1.0a1/src/pseudonymize/backends/base.py +14 -0
- pseudonymize-0.1.0a1/src/pseudonymize/backends/composite.py +17 -0
- pseudonymize-0.1.0a1/src/pseudonymize/backends/rules.py +19 -0
- pseudonymize-0.1.0a1/src/pseudonymize/cli.py +125 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/__init__.py +4 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/base.py +10 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/email.py +21 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/iban.py +31 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/ip_address.py +26 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/payment_card.py +33 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/phone.py +26 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/registry.py +18 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/secret.py +31 -0
- pseudonymize-0.1.0a1/src/pseudonymize/detectors/url.py +53 -0
- pseudonymize-0.1.0a1/src/pseudonymize/engine.py +214 -0
- pseudonymize-0.1.0a1/src/pseudonymize/exceptions.py +10 -0
- pseudonymize-0.1.0a1/src/pseudonymize/normalization.py +22 -0
- pseudonymize-0.1.0a1/src/pseudonymize/policy.py +71 -0
- pseudonymize-0.1.0a1/src/pseudonymize/py.typed +0 -0
- pseudonymize-0.1.0a1/src/pseudonymize/resolution.py +28 -0
- pseudonymize-0.1.0a1/src/pseudonymize/result.py +57 -0
- pseudonymize-0.1.0a1/src/pseudonymize/spans.py +45 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/__init__.py +27 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/alias.py +74 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/base.py +8 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/hmac.py +7 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/mode.py +8 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/placeholder.py +11 -0
- pseudonymize-0.1.0a1/src/pseudonymize/transforms/redact.py +13 -0
- pseudonymize-0.1.0a1/tests/corpus/de.jsonl +2 -0
- pseudonymize-0.1.0a1/tests/corpus/en.jsonl +2 -0
- pseudonymize-0.1.0a1/tests/corpus/it.jsonl +2 -0
- pseudonymize-0.1.0a1/tests/integration/test_cli.py +85 -0
- pseudonymize-0.1.0a1/tests/integration/test_public_api.py +30 -0
- pseudonymize-0.1.0a1/tests/integration/test_release_verifier.py +71 -0
- pseudonymize-0.1.0a1/tests/property/test_invariants.py +23 -0
- pseudonymize-0.1.0a1/tests/unit/detectors/test_detectors.py +94 -0
- pseudonymize-0.1.0a1/tests/unit/test_engine.py +70 -0
- pseudonymize-0.1.0a1/tests/unit/test_modes.py +175 -0
- pseudonymize-0.1.0a1/tests/unit/test_policy.py +32 -0
- pseudonymize-0.1.0a1/tests/unit/test_spans.py +15 -0
- pseudonymize-0.1.0a1/tests/unit/test_transforms.py +57 -0
- pseudonymize-0.1.0a1/tests/unit/test_types.py +10 -0
- pseudonymize-0.1.0a1/uv.lock +1606 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* text=auto eol=lf
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @ma2za
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report incorrect package behavior using synthetic data
|
|
3
|
+
title: "bug: "
|
|
4
|
+
labels: [bug]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: description
|
|
8
|
+
attributes:
|
|
9
|
+
label: Description
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: reproduction
|
|
14
|
+
attributes:
|
|
15
|
+
label: Synthetic reproduction
|
|
16
|
+
description: Never include real personal data or credentials.
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: input
|
|
20
|
+
id: version
|
|
21
|
+
attributes:
|
|
22
|
+
label: Version
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Detector request
|
|
2
|
+
description: Request structured-value detection using synthetic examples
|
|
3
|
+
title: "detector: "
|
|
4
|
+
labels: [detector]
|
|
5
|
+
body:
|
|
6
|
+
- type: input
|
|
7
|
+
id: entity
|
|
8
|
+
attributes:
|
|
9
|
+
label: Entity format
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: valid
|
|
14
|
+
attributes:
|
|
15
|
+
label: Synthetic valid examples
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: invalid
|
|
20
|
+
attributes:
|
|
21
|
+
label: Similar values that must remain unchanged
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a scoped capability
|
|
3
|
+
title: "feat: "
|
|
4
|
+
labels: [api]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: use-case
|
|
8
|
+
attributes:
|
|
9
|
+
label: Use case
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: proposal
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposed behavior
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
env:
|
|
11
|
+
UV_FROZEN: "1"
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
quality:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
18
|
+
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.14"
|
|
21
|
+
- run: uv sync --frozen --group quality --group test
|
|
22
|
+
- run: uv run ruff format --check .
|
|
23
|
+
- run: uv run ruff check .
|
|
24
|
+
- run: uv run mypy
|
|
25
|
+
|
|
26
|
+
tests:
|
|
27
|
+
strategy:
|
|
28
|
+
fail-fast: false
|
|
29
|
+
matrix:
|
|
30
|
+
include:
|
|
31
|
+
- os: ubuntu-latest
|
|
32
|
+
python: "3.11"
|
|
33
|
+
- os: ubuntu-latest
|
|
34
|
+
python: "3.12"
|
|
35
|
+
- os: ubuntu-latest
|
|
36
|
+
python: "3.13"
|
|
37
|
+
- os: ubuntu-latest
|
|
38
|
+
python: "3.14"
|
|
39
|
+
- os: macos-latest
|
|
40
|
+
python: "3.14"
|
|
41
|
+
- os: windows-latest
|
|
42
|
+
python: "3.14"
|
|
43
|
+
runs-on: ${{ matrix.os }}
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
46
|
+
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
47
|
+
with:
|
|
48
|
+
python-version: ${{ matrix.python }}
|
|
49
|
+
- run: uv sync --frozen --group test
|
|
50
|
+
- run: uv run pytest
|
|
51
|
+
|
|
52
|
+
property-tests:
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
56
|
+
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
57
|
+
with:
|
|
58
|
+
python-version: "3.14"
|
|
59
|
+
- run: uv sync --frozen --group test
|
|
60
|
+
- run: uv run pytest tests/property -o addopts="--strict-config --strict-markers -ra" --hypothesis-show-statistics
|
|
61
|
+
|
|
62
|
+
package:
|
|
63
|
+
uses: ./.github/workflows/package.yml
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
19
|
+
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.14"
|
|
22
|
+
- run: uv sync --frozen --group docs
|
|
23
|
+
- run: uv run mkdocs build --strict
|
|
24
|
+
- uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4
|
|
25
|
+
if: github.ref == 'refs/heads/main' && vars.ENABLE_PAGES == 'true'
|
|
26
|
+
with:
|
|
27
|
+
path: site
|
|
28
|
+
deploy:
|
|
29
|
+
if: github.ref == 'refs/heads/main' && vars.ENABLE_PAGES == 'true'
|
|
30
|
+
needs: build
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
environment:
|
|
33
|
+
name: github-pages
|
|
34
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
35
|
+
steps:
|
|
36
|
+
- id: deployment
|
|
37
|
+
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_call:
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
package:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
15
|
+
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.14"
|
|
18
|
+
- run: uv sync --frozen --group release
|
|
19
|
+
- run: uv build
|
|
20
|
+
- run: uv run twine check dist/*
|
|
21
|
+
- run: uv run python scripts/verify_release.py
|
|
22
|
+
- run: uv venv --python 3.14 .wheel-venv
|
|
23
|
+
- run: uv pip install --python .wheel-venv/bin/python dist/*.whl
|
|
24
|
+
- run: .wheel-venv/bin/python -c "from pseudonymize import pseudonymize; assert pseudonymize('maria@example.com') == '<EMAIL_1>'"
|
|
25
|
+
- run: .wheel-venv/bin/pseudonymize detectors
|
|
26
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
|
27
|
+
with:
|
|
28
|
+
name: distributions
|
|
29
|
+
path: dist/
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
quality-and-tests:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
17
|
+
with:
|
|
18
|
+
ref: ${{ github.ref }}
|
|
19
|
+
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.14"
|
|
22
|
+
- run: uv sync --all-groups --frozen
|
|
23
|
+
- run: uv run ruff format --check .
|
|
24
|
+
- run: uv run ruff check .
|
|
25
|
+
- run: uv run mypy
|
|
26
|
+
- run: uv run pytest
|
|
27
|
+
- run: uv run mkdocs build --strict
|
|
28
|
+
- name: Verify tag matches project version
|
|
29
|
+
if: github.event_name == 'push'
|
|
30
|
+
run: uv run python scripts/verify_release.py --check-tag-only --tag "$GITHUB_REF_NAME"
|
|
31
|
+
|
|
32
|
+
verify:
|
|
33
|
+
needs: quality-and-tests
|
|
34
|
+
uses: ./.github/workflows/package.yml
|
|
35
|
+
|
|
36
|
+
publish:
|
|
37
|
+
needs: verify
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
environment: ${{ github.event_name == 'workflow_dispatch' && 'testpypi' || 'pypi' }}
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
|
42
|
+
with:
|
|
43
|
+
name: distributions
|
|
44
|
+
path: dist
|
|
45
|
+
- uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # release/v1
|
|
46
|
+
with:
|
|
47
|
+
repository-url: ${{ github.event_name == 'workflow_dispatch' && 'https://test.pypi.org/legacy/' || 'https://upload.pypi.org/legacy/' }}
|
|
48
|
+
- name: Publish GitHub release artifacts
|
|
49
|
+
if: github.event_name == 'push'
|
|
50
|
+
shell: bash
|
|
51
|
+
run: |
|
|
52
|
+
release_flags=(--verify-tag --generate-notes)
|
|
53
|
+
if [[ "$GITHUB_REF_NAME" =~ (a|b|rc)[0-9]+$ ]]; then
|
|
54
|
+
release_flags+=(--prerelease --latest=false)
|
|
55
|
+
fi
|
|
56
|
+
gh release create "$GITHUB_REF_NAME" dist/* "${release_flags[@]}"
|
|
57
|
+
env:
|
|
58
|
+
GH_TOKEN: ${{ github.token }}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
# uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
# poetry.lock
|
|
109
|
+
# poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
# pdm.lock
|
|
116
|
+
# pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
# pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# Redis
|
|
135
|
+
*.rdb
|
|
136
|
+
*.aof
|
|
137
|
+
*.pid
|
|
138
|
+
|
|
139
|
+
# RabbitMQ
|
|
140
|
+
mnesia/
|
|
141
|
+
rabbitmq/
|
|
142
|
+
rabbitmq-data/
|
|
143
|
+
|
|
144
|
+
# ActiveMQ
|
|
145
|
+
activemq-data/
|
|
146
|
+
|
|
147
|
+
# SageMath parsed files
|
|
148
|
+
*.sage.py
|
|
149
|
+
|
|
150
|
+
# Environments
|
|
151
|
+
.env
|
|
152
|
+
.envrc
|
|
153
|
+
.venv
|
|
154
|
+
env/
|
|
155
|
+
venv/
|
|
156
|
+
ENV/
|
|
157
|
+
env.bak/
|
|
158
|
+
venv.bak/
|
|
159
|
+
|
|
160
|
+
# Spyder project settings
|
|
161
|
+
.spyderproject
|
|
162
|
+
.spyproject
|
|
163
|
+
|
|
164
|
+
# Rope project settings
|
|
165
|
+
.ropeproject
|
|
166
|
+
|
|
167
|
+
# mkdocs documentation
|
|
168
|
+
/site
|
|
169
|
+
|
|
170
|
+
# mypy
|
|
171
|
+
.mypy_cache/
|
|
172
|
+
.dmypy.json
|
|
173
|
+
dmypy.json
|
|
174
|
+
|
|
175
|
+
# Pyre type checker
|
|
176
|
+
.pyre/
|
|
177
|
+
|
|
178
|
+
# pytype static type analyzer
|
|
179
|
+
.pytype/
|
|
180
|
+
|
|
181
|
+
# Cython debug symbols
|
|
182
|
+
cython_debug/
|
|
183
|
+
|
|
184
|
+
# PyCharm
|
|
185
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
186
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
188
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
189
|
+
# .idea/
|
|
190
|
+
|
|
191
|
+
# Abstra
|
|
192
|
+
# Abstra is an AI-powered process automation framework.
|
|
193
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
194
|
+
# Learn more at https://abstra.io/docs
|
|
195
|
+
.abstra/
|
|
196
|
+
|
|
197
|
+
# Visual Studio Code
|
|
198
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
199
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
200
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
201
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
202
|
+
# .vscode/
|
|
203
|
+
# Temporary file for partial code execution
|
|
204
|
+
tempCodeRunnerFile.py
|
|
205
|
+
|
|
206
|
+
# Ruff stuff:
|
|
207
|
+
.ruff_cache/
|
|
208
|
+
|
|
209
|
+
# PyPI configuration file
|
|
210
|
+
.pypirc
|
|
211
|
+
|
|
212
|
+
# Marimo
|
|
213
|
+
marimo/_static/
|
|
214
|
+
marimo/_lsp/
|
|
215
|
+
__marimo__/
|
|
216
|
+
|
|
217
|
+
# Streamlit
|
|
218
|
+
.streamlit/secrets.toml
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes follow Keep a Changelog and Semantic Versioning.
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.1.0a1] - 2026-07-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Typed dependency-free pseudonymization core.
|
|
12
|
+
- Structured detectors, immutable policies, nested payload processing, and CLI.
|
|
13
|
+
- HMAC-SHA256 aliases, redaction, reports without raw detected values, and backend protocol.
|
|
14
|
+
- Local-first product vision, staged multimodal roadmap, and Trusted Publishing release runbook.
|
|
15
|
+
- Numbered semantic pseudonymization as the default transformation mode.
|
|
16
|
+
- Generic, deterministic, and redacted modes with independent alias assignment and rendering.
|
|
17
|
+
- Exact normalized entity resolution, reusable alias scopes, and opt-in reversible mappings.
|
|
18
|
+
- Optional backend contracts for person, organization, and location detection.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Deterministic processing now requires `mode="deterministic"` in addition to a key.
|
|
23
|
+
- `redact()` now emits `[REDACTED]` by default; generic mode emits typed placeholders.
|
|
24
|
+
|
|
25
|
+
[Unreleased]: https://github.com/ma2za/pseudonymize/compare/v0.1.0a1...HEAD
|
|
26
|
+
[0.1.0a1]: https://github.com/ma2za/pseudonymize/releases/tag/v0.1.0a1
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Code of conduct
|
|
2
|
+
|
|
3
|
+
Participation must be respectful, constructive, and free from harassment. Maintainers may remove
|
|
4
|
+
content or restrict participation to protect a safe technical community. Report conduct concerns
|
|
5
|
+
privately through the repository owner's GitHub profile.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Install uv, fork the repository, and run:
|
|
4
|
+
|
|
5
|
+
```console
|
|
6
|
+
uv sync --all-groups
|
|
7
|
+
uv run ruff format --check .
|
|
8
|
+
uv run ruff check .
|
|
9
|
+
uv run mypy
|
|
10
|
+
uv run pytest
|
|
11
|
+
uv run mkdocs build --strict
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Add positive, negative, boundary, Unicode, and adversarial tests with detector changes. Use only
|
|
15
|
+
synthetic values in issues, tests, benchmarks, and commits. Public API changes require an ADR.
|