privyx 0.1.1__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.
- privyx-0.1.1/.dockerignore +51 -0
- privyx-0.1.1/.env.example +53 -0
- privyx-0.1.1/.github/release.yml +35 -0
- privyx-0.1.1/.github/workflows/ci.yml +19 -0
- privyx-0.1.1/.github/workflows/release.yml +145 -0
- privyx-0.1.1/.gitignore +32 -0
- privyx-0.1.1/.hypothesis/.gitignore +9 -0
- privyx-0.1.1/.hypothesis/constants/00b17860a874e031 +4 -0
- privyx-0.1.1/.hypothesis/constants/04a5e1c72b4500b2 +4 -0
- privyx-0.1.1/.hypothesis/constants/07509115f0fdaa77 +4 -0
- privyx-0.1.1/.hypothesis/constants/0c0a7e501d9430b7 +4 -0
- privyx-0.1.1/.hypothesis/constants/0dfbe950b7b2df80 +4 -0
- privyx-0.1.1/.hypothesis/constants/1090231a877b60dd +4 -0
- privyx-0.1.1/.hypothesis/constants/1778ab2612940bd3 +4 -0
- privyx-0.1.1/.hypothesis/constants/18319c6ac6e7fdaf +4 -0
- privyx-0.1.1/.hypothesis/constants/1a2102884a8c0e4f +4 -0
- privyx-0.1.1/.hypothesis/constants/1fbaa30407184d4b +4 -0
- privyx-0.1.1/.hypothesis/constants/2127787c64a1179c +4 -0
- privyx-0.1.1/.hypothesis/constants/21e704dc01037e2a +4 -0
- privyx-0.1.1/.hypothesis/constants/2451392d7b392b1c +4 -0
- privyx-0.1.1/.hypothesis/constants/25bd2960478fd1a9 +4 -0
- privyx-0.1.1/.hypothesis/constants/26a9ea24b3f139ec +4 -0
- privyx-0.1.1/.hypothesis/constants/2cd91bd11dfb0fce +4 -0
- privyx-0.1.1/.hypothesis/constants/2d53874d1a4e9b22 +4 -0
- privyx-0.1.1/.hypothesis/constants/2e50ff26b12465f5 +4 -0
- privyx-0.1.1/.hypothesis/constants/2ea0ab73ba2dd29c +4 -0
- privyx-0.1.1/.hypothesis/constants/33f1ac626da63dd6 +4 -0
- privyx-0.1.1/.hypothesis/constants/38d07edd06515f69 +4 -0
- privyx-0.1.1/.hypothesis/constants/3b65b91501e62405 +4 -0
- privyx-0.1.1/.hypothesis/constants/3c7189c09b3f75fa +4 -0
- privyx-0.1.1/.hypothesis/constants/4147357243c3f5a9 +4 -0
- privyx-0.1.1/.hypothesis/constants/4c40f05f23e647b0 +4 -0
- privyx-0.1.1/.hypothesis/constants/4d9a1a655a0ca455 +4 -0
- privyx-0.1.1/.hypothesis/constants/50f2594efbfc7112 +4 -0
- privyx-0.1.1/.hypothesis/constants/5ea4d513f9a20cd5 +4 -0
- privyx-0.1.1/.hypothesis/constants/5eb7eaef810ff587 +4 -0
- privyx-0.1.1/.hypothesis/constants/62aafca42697add8 +4 -0
- privyx-0.1.1/.hypothesis/constants/6730be64d769b466 +4 -0
- privyx-0.1.1/.hypothesis/constants/67b0a8ccf18bf5d2 +4 -0
- privyx-0.1.1/.hypothesis/constants/6ab315e6c96856ab +4 -0
- privyx-0.1.1/.hypothesis/constants/707cfeca7533a73a +4 -0
- privyx-0.1.1/.hypothesis/constants/7141ec6b8b2c9143 +4 -0
- privyx-0.1.1/.hypothesis/constants/7370dc02be56597f +4 -0
- privyx-0.1.1/.hypothesis/constants/745880873dfc8153 +4 -0
- privyx-0.1.1/.hypothesis/constants/782ae0898b0a2c07 +4 -0
- privyx-0.1.1/.hypothesis/constants/7ab63aac25da58b4 +4 -0
- privyx-0.1.1/.hypothesis/constants/7d9db744f0a04809 +4 -0
- privyx-0.1.1/.hypothesis/constants/83e052b391210e72 +4 -0
- privyx-0.1.1/.hypothesis/constants/860a4f9c9b996ff8 +4 -0
- privyx-0.1.1/.hypothesis/constants/87ce6d6fa86eac1c +4 -0
- privyx-0.1.1/.hypothesis/constants/887982eccf190144 +4 -0
- privyx-0.1.1/.hypothesis/constants/8e48427396daddc7 +4 -0
- privyx-0.1.1/.hypothesis/constants/8f3488b933c8e766 +4 -0
- privyx-0.1.1/.hypothesis/constants/924e9f481feae8df +4 -0
- privyx-0.1.1/.hypothesis/constants/93a68721ded858e7 +4 -0
- privyx-0.1.1/.hypothesis/constants/93d18ee0264f7ad8 +4 -0
- privyx-0.1.1/.hypothesis/constants/9404ace8b05577d6 +4 -0
- privyx-0.1.1/.hypothesis/constants/960d84b9f1ee81df +4 -0
- privyx-0.1.1/.hypothesis/constants/96a85b02a875512c +4 -0
- privyx-0.1.1/.hypothesis/constants/989d87fe0920caee +4 -0
- privyx-0.1.1/.hypothesis/constants/995c93783b5e6953 +4 -0
- privyx-0.1.1/.hypothesis/constants/9adef9b1f0308166 +4 -0
- privyx-0.1.1/.hypothesis/constants/9af9f7d26ff20008 +4 -0
- privyx-0.1.1/.hypothesis/constants/a14e8c285c2fe32d +4 -0
- privyx-0.1.1/.hypothesis/constants/a244d2eb65f34216 +4 -0
- privyx-0.1.1/.hypothesis/constants/a2a63468976de516 +4 -0
- privyx-0.1.1/.hypothesis/constants/a2f95d20928aa2bb +4 -0
- privyx-0.1.1/.hypothesis/constants/a4513bad8497bac7 +4 -0
- privyx-0.1.1/.hypothesis/constants/a765e51579040f8e +4 -0
- privyx-0.1.1/.hypothesis/constants/a927b5543b3c3568 +4 -0
- privyx-0.1.1/.hypothesis/constants/ac301f78410ce9f5 +4 -0
- privyx-0.1.1/.hypothesis/constants/ac49c5d505b08e43 +4 -0
- privyx-0.1.1/.hypothesis/constants/ac50c5ef342ee7ae +4 -0
- privyx-0.1.1/.hypothesis/constants/acf6b9ca73f29f7f +4 -0
- privyx-0.1.1/.hypothesis/constants/ada9b94e3b3388f1 +4 -0
- privyx-0.1.1/.hypothesis/constants/ae0c9b6b2181c6a1 +4 -0
- privyx-0.1.1/.hypothesis/constants/af13f6ad430d7430 +4 -0
- privyx-0.1.1/.hypothesis/constants/b61450bc9b5908a8 +4 -0
- privyx-0.1.1/.hypothesis/constants/ba6960f5c1f901a6 +4 -0
- privyx-0.1.1/.hypothesis/constants/c7a27830da4f7173 +4 -0
- privyx-0.1.1/.hypothesis/constants/c9e0742317f7b362 +4 -0
- privyx-0.1.1/.hypothesis/constants/caeeb73ce3f2c950 +4 -0
- privyx-0.1.1/.hypothesis/constants/d176b1af90813abe +4 -0
- privyx-0.1.1/.hypothesis/constants/d3f773f3d8b378b0 +4 -0
- privyx-0.1.1/.hypothesis/constants/d6037c5882d2c196 +4 -0
- privyx-0.1.1/.hypothesis/constants/d7eede67428f8cb0 +4 -0
- privyx-0.1.1/.hypothesis/constants/dbb7bdb9aee7709c +4 -0
- privyx-0.1.1/.hypothesis/constants/dd887c3db951d826 +4 -0
- privyx-0.1.1/.hypothesis/constants/e481af1d59bf87e8 +4 -0
- privyx-0.1.1/.hypothesis/constants/e4caa177f66d901a +4 -0
- privyx-0.1.1/.hypothesis/constants/e855f0a1fbeca24b +4 -0
- privyx-0.1.1/.hypothesis/constants/ec36a6166777e89a +4 -0
- privyx-0.1.1/.hypothesis/constants/f22b5276c50ed86e +4 -0
- privyx-0.1.1/.hypothesis/constants/f3802f4ac352b9f0 +4 -0
- privyx-0.1.1/.hypothesis/constants/f4e76d2f0496c4dc +4 -0
- privyx-0.1.1/.hypothesis/constants/f71070718f653970 +4 -0
- privyx-0.1.1/.hypothesis/constants/f7705e3f1819c3ed +4 -0
- privyx-0.1.1/.hypothesis/constants/f843eda65fcc5a23 +4 -0
- privyx-0.1.1/.hypothesis/constants/f8c3e62efea0c291 +4 -0
- privyx-0.1.1/.hypothesis/constants/fa7318af7d2a9fbb +4 -0
- privyx-0.1.1/.hypothesis/constants/fc88b49d215259fb +4 -0
- privyx-0.1.1/.hypothesis/constants/ffac0ffff2fcc08c +4 -0
- privyx-0.1.1/.hypothesis/constants/ffb9f2b85511cf9f +4 -0
- privyx-0.1.1/.hypothesis/constants/ffd269f23a488eed +4 -0
- privyx-0.1.1/.hypothesis/unicode_data/15.0.0/charmap.json.gz +0 -0
- privyx-0.1.1/.python-version +1 -0
- privyx-0.1.1/CHANGELOG.md +110 -0
- privyx-0.1.1/CONTRIBUTING.md +39 -0
- privyx-0.1.1/Dockerfile +62 -0
- privyx-0.1.1/LICENSE +21 -0
- privyx-0.1.1/Makefile +34 -0
- privyx-0.1.1/PKG-INFO +228 -0
- privyx-0.1.1/README.md +179 -0
- privyx-0.1.1/SECURITY.md +29 -0
- privyx-0.1.1/configs/default.yaml +188 -0
- privyx-0.1.1/configs/examples/anthropic.yaml +15 -0
- privyx-0.1.1/configs/examples/custom.yaml +14 -0
- privyx-0.1.1/configs/examples/encrypt.yaml +15 -0
- privyx-0.1.1/configs/examples/openai.yaml +14 -0
- privyx-0.1.1/configs/examples/terms.yaml +32 -0
- privyx-0.1.1/configs/strict.yaml +45 -0
- privyx-0.1.1/docker-compose.yml +55 -0
- privyx-0.1.1/docs/architecture/overview.md +100 -0
- privyx-0.1.1/docs/architecture/privacy-engine.md +97 -0
- privyx-0.1.1/docs/architecture/proxy.md +288 -0
- privyx-0.1.1/docs/architecture/scaling.md +32 -0
- privyx-0.1.1/docs/architecture/streaming.md +66 -0
- privyx-0.1.1/docs/development/plugins.md +119 -0
- privyx-0.1.1/docs/development/testing.md +62 -0
- privyx-0.1.1/docs/observability/audit-events.md +121 -0
- privyx-0.1.1/docs/providers/anthropic.md +68 -0
- privyx-0.1.1/docs/providers/generic.md +24 -0
- privyx-0.1.1/docs/providers/openai.md +91 -0
- privyx-0.1.1/docs/security/cryptography.md +47 -0
- privyx-0.1.1/docs/security/data-handling.md +47 -0
- privyx-0.1.1/docs/security/threat-model.md +44 -0
- privyx-0.1.1/examples/anthropic.py +59 -0
- privyx-0.1.1/examples/basic.py +38 -0
- privyx-0.1.1/examples/fastapi_gateway.py +48 -0
- privyx-0.1.1/examples/openai.py +63 -0
- privyx-0.1.1/examples/transparent_proxy.py +34 -0
- privyx-0.1.1/main.py +20 -0
- privyx-0.1.1/plugins/detectors/__init__.py +11 -0
- privyx-0.1.1/plugins/detectors/license_plate.py +39 -0
- privyx-0.1.1/plugins/operators/__init__.py +8 -0
- privyx-0.1.1/plugins/providers/__init__.py +7 -0
- privyx-0.1.1/pyproject.toml +84 -0
- privyx-0.1.1/scripts/benchmark.py +59 -0
- privyx-0.1.1/scripts/dev.py +32 -0
- privyx-0.1.1/scripts/e2e_claude.py +412 -0
- privyx-0.1.1/src/privyx/__init__.py +12 -0
- privyx-0.1.1/src/privyx/cli/__init__.py +1 -0
- privyx-0.1.1/src/privyx/cli/commands/__init__.py +1 -0
- privyx-0.1.1/src/privyx/cli/commands/config.py +38 -0
- privyx-0.1.1/src/privyx/cli/commands/detect.py +84 -0
- privyx-0.1.1/src/privyx/cli/commands/doctor.py +270 -0
- privyx-0.1.1/src/privyx/cli/commands/inspect.py +10 -0
- privyx-0.1.1/src/privyx/cli/commands/mask.py +313 -0
- privyx-0.1.1/src/privyx/cli/commands/proxy.py +297 -0
- privyx-0.1.1/src/privyx/cli/commands/run.py +307 -0
- privyx-0.1.1/src/privyx/cli/commands/session.py +79 -0
- privyx-0.1.1/src/privyx/cli/config.py +1 -0
- privyx-0.1.1/src/privyx/cli/main.py +50 -0
- privyx-0.1.1/src/privyx/cli/output.py +1 -0
- privyx-0.1.1/src/privyx/config/__init__.py +1 -0
- privyx-0.1.1/src/privyx/config/defaults.py +61 -0
- privyx-0.1.1/src/privyx/config/env.py +116 -0
- privyx-0.1.1/src/privyx/config/loader.py +76 -0
- privyx-0.1.1/src/privyx/config/schema.py +257 -0
- privyx-0.1.1/src/privyx/core/__init__.py +1 -0
- privyx-0.1.1/src/privyx/core/builder.py +270 -0
- privyx-0.1.1/src/privyx/core/context.py +35 -0
- privyx-0.1.1/src/privyx/core/engine.py +208 -0
- privyx-0.1.1/src/privyx/core/errors.py +57 -0
- privyx-0.1.1/src/privyx/core/result.py +137 -0
- privyx-0.1.1/src/privyx/core/session.py +73 -0
- privyx-0.1.1/src/privyx/gateway/__init__.py +5 -0
- privyx-0.1.1/src/privyx/gateway/server.py +317 -0
- privyx-0.1.1/src/privyx/gateway/transparent.py +80 -0
- privyx-0.1.1/src/privyx/observability/__init__.py +19 -0
- privyx-0.1.1/src/privyx/observability/audit.py +440 -0
- privyx-0.1.1/src/privyx/observability/logging.py +116 -0
- privyx-0.1.1/src/privyx/observability/metrics.py +1 -0
- privyx-0.1.1/src/privyx/observability/tracing.py +1 -0
- privyx-0.1.1/src/privyx/plugins/__init__.py +12 -0
- privyx-0.1.1/src/privyx/plugins/hooks.py +72 -0
- privyx-0.1.1/src/privyx/plugins/loader.py +172 -0
- privyx-0.1.1/src/privyx/plugins/registry.py +118 -0
- privyx-0.1.1/src/privyx/privacy/__init__.py +1 -0
- privyx-0.1.1/src/privyx/privacy/anchor/__init__.py +1 -0
- privyx-0.1.1/src/privyx/privacy/anchor/base.py +36 -0
- privyx-0.1.1/src/privyx/privacy/anchor/hmac.py +45 -0
- privyx-0.1.1/src/privyx/privacy/anchor/pasp.py +26 -0
- privyx-0.1.1/src/privyx/privacy/detector/__init__.py +14 -0
- privyx-0.1.1/src/privyx/privacy/detector/base.py +38 -0
- privyx-0.1.1/src/privyx/privacy/detector/builtin.py +116 -0
- privyx-0.1.1/src/privyx/privacy/detector/cache.py +110 -0
- privyx-0.1.1/src/privyx/privacy/detector/llm.py +200 -0
- privyx-0.1.1/src/privyx/privacy/detector/presidio.py +143 -0
- privyx-0.1.1/src/privyx/privacy/detector/yaml.py +179 -0
- privyx-0.1.1/src/privyx/privacy/operator/__init__.py +1 -0
- privyx-0.1.1/src/privyx/privacy/operator/base.py +115 -0
- privyx-0.1.1/src/privyx/privacy/operator/encrypt.py +128 -0
- privyx-0.1.1/src/privyx/privacy/operator/faker.py +233 -0
- privyx-0.1.1/src/privyx/privacy/operator/hash.py +77 -0
- privyx-0.1.1/src/privyx/privacy/operator/pseudonym.py +133 -0
- privyx-0.1.1/src/privyx/privacy/operator/redact.py +46 -0
- privyx-0.1.1/src/privyx/privacy/policy/__init__.py +1 -0
- privyx-0.1.1/src/privyx/privacy/policy/base.py +28 -0
- privyx-0.1.1/src/privyx/privacy/policy/default.py +16 -0
- privyx-0.1.1/src/privyx/privacy/policy/loader.py +33 -0
- privyx-0.1.1/src/privyx/privacy/policy/strict.py +28 -0
- privyx-0.1.1/src/privyx/privacy/transform/__init__.py +1 -0
- privyx-0.1.1/src/privyx/privacy/transform/json.py +61 -0
- privyx-0.1.1/src/privyx/privacy/transform/structured.py +28 -0
- privyx-0.1.1/src/privyx/privacy/transform/text.py +37 -0
- privyx-0.1.1/src/privyx/providers/__init__.py +1 -0
- privyx-0.1.1/src/privyx/providers/anthropic.py +26 -0
- privyx-0.1.1/src/privyx/providers/base.py +44 -0
- privyx-0.1.1/src/privyx/providers/generic.py +108 -0
- privyx-0.1.1/src/privyx/providers/google.py +29 -0
- privyx-0.1.1/src/privyx/providers/openai.py +26 -0
- privyx-0.1.1/src/privyx/providers/registry.py +147 -0
- privyx-0.1.1/src/privyx/proxy/__init__.py +14 -0
- privyx-0.1.1/src/privyx/proxy/headers.py +99 -0
- privyx-0.1.1/src/privyx/proxy/http.py +106 -0
- privyx-0.1.1/src/privyx/proxy/schemas.py +288 -0
- privyx-0.1.1/src/privyx/proxy/session.py +118 -0
- privyx-0.1.1/src/privyx/proxy/sse.py +1 -0
- privyx-0.1.1/src/privyx/proxy/stream_router.py +613 -0
- privyx-0.1.1/src/privyx/proxy/streaming.py +51 -0
- privyx-0.1.1/src/privyx/proxy/transparent.py +404 -0
- privyx-0.1.1/src/privyx/security/__init__.py +1 -0
- privyx-0.1.1/src/privyx/security/crypto.py +68 -0
- privyx-0.1.1/src/privyx/security/keys.py +105 -0
- privyx-0.1.1/src/privyx/security/redaction.py +1 -0
- privyx-0.1.1/src/privyx/security/secrets.py +1 -0
- privyx-0.1.1/src/privyx/streaming/__init__.py +6 -0
- privyx-0.1.1/src/privyx/streaming/adapters/__init__.py +4 -0
- privyx-0.1.1/src/privyx/streaming/adapters/anthropic.py +59 -0
- privyx-0.1.1/src/privyx/streaming/adapters/generic.py +79 -0
- privyx-0.1.1/src/privyx/streaming/adapters/openai.py +28 -0
- privyx-0.1.1/src/privyx/streaming/adapters/registry.py +41 -0
- privyx-0.1.1/src/privyx/streaming/buffer.py +29 -0
- privyx-0.1.1/src/privyx/streaming/deanonymizer.py +122 -0
- privyx-0.1.1/src/privyx/streaming/events.py +41 -0
- privyx-0.1.1/src/privyx/streaming/recognizer.py +85 -0
- privyx-0.1.1/src/privyx/streaming/sse.py +147 -0
- privyx-0.1.1/src/privyx/streaming/trie.py +111 -0
- privyx-0.1.1/src/privyx/token/__init__.py +21 -0
- privyx-0.1.1/src/privyx/token/codec.py +316 -0
- privyx-0.1.1/src/privyx/token/errors.py +14 -0
- privyx-0.1.1/src/privyx/token/model.py +52 -0
- privyx-0.1.1/src/privyx/utils/__init__.py +1 -0
- privyx-0.1.1/src/privyx/utils/async_.py +53 -0
- privyx-0.1.1/src/privyx/utils/ids.py +29 -0
- privyx-0.1.1/src/privyx/utils/json.py +47 -0
- privyx-0.1.1/src/privyx/vault/__init__.py +1 -0
- privyx-0.1.1/src/privyx/vault/base.py +44 -0
- privyx-0.1.1/src/privyx/vault/memory.py +41 -0
- privyx-0.1.1/src/privyx/vault/models.py +32 -0
- privyx-0.1.1/src/privyx/vault/redis.py +62 -0
- privyx-0.1.1/src/privyx/vault/sqlite.py +92 -0
- privyx-0.1.1/src/privyx/version.py +3 -0
- privyx-0.1.1/tests/fixtures/__init__.py +1 -0
- privyx-0.1.1/tests/fixtures/payloads/__init__.py +1 -0
- privyx-0.1.1/tests/fixtures/sse/__init__.py +1 -0
- privyx-0.1.1/tests/integration/__init__.py +1 -0
- privyx-0.1.1/tests/integration/test_anthropic.py +196 -0
- privyx-0.1.1/tests/integration/test_gateway_app.py +283 -0
- privyx-0.1.1/tests/integration/test_openai.py +237 -0
- privyx-0.1.1/tests/integration/test_proxy.py +389 -0
- privyx-0.1.1/tests/integration/test_streaming.py +51 -0
- privyx-0.1.1/tests/integration/test_transparent.py +541 -0
- privyx-0.1.1/tests/integration/test_transparent_app.py +190 -0
- privyx-0.1.1/tests/property/__init__.py +5 -0
- privyx-0.1.1/tests/property/test_chunk_boundaries.py +39 -0
- privyx-0.1.1/tests/property/test_encrypt_stream_equivalence.py +118 -0
- privyx-0.1.1/tests/property/test_faker_stream_equivalence.py +123 -0
- privyx-0.1.1/tests/property/test_stream_equivalence.py +317 -0
- privyx-0.1.1/tests/property/test_token_stream.py +114 -0
- privyx-0.1.1/tests/unit/cli/__init__.py +0 -0
- privyx-0.1.1/tests/unit/cli/test_commands.py +552 -0
- privyx-0.1.1/tests/unit/config/__init__.py +0 -0
- privyx-0.1.1/tests/unit/config/test_default_config.py +80 -0
- privyx-0.1.1/tests/unit/config/test_loader.py +63 -0
- privyx-0.1.1/tests/unit/config/test_tls.py +59 -0
- privyx-0.1.1/tests/unit/observability/__init__.py +0 -0
- privyx-0.1.1/tests/unit/observability/test_audit.py +272 -0
- privyx-0.1.1/tests/unit/observability/test_logging.py +115 -0
- privyx-0.1.1/tests/unit/plugins/__init__.py +0 -0
- privyx-0.1.1/tests/unit/plugins/test_loader.py +321 -0
- privyx-0.1.1/tests/unit/privacy/__init__.py +1 -0
- privyx-0.1.1/tests/unit/privacy/test_cached_detector.py +182 -0
- privyx-0.1.1/tests/unit/privacy/test_detector.py +172 -0
- privyx-0.1.1/tests/unit/privacy/test_encrypt_operator.py +166 -0
- privyx-0.1.1/tests/unit/privacy/test_engine.py +194 -0
- privyx-0.1.1/tests/unit/privacy/test_faker_operator.py +149 -0
- privyx-0.1.1/tests/unit/privacy/test_llm_detector.py +128 -0
- privyx-0.1.1/tests/unit/privacy/test_operators.py +223 -0
- privyx-0.1.1/tests/unit/privacy/test_presidio_detector.py +96 -0
- privyx-0.1.1/tests/unit/providers/__init__.py +1 -0
- privyx-0.1.1/tests/unit/providers/test_registry.py +99 -0
- privyx-0.1.1/tests/unit/proxy/__init__.py +0 -0
- privyx-0.1.1/tests/unit/proxy/test_headers.py +79 -0
- privyx-0.1.1/tests/unit/proxy/test_schemas.py +611 -0
- privyx-0.1.1/tests/unit/proxy/test_session.py +212 -0
- privyx-0.1.1/tests/unit/proxy/test_stream_router.py +525 -0
- privyx-0.1.1/tests/unit/security/__init__.py +0 -0
- privyx-0.1.1/tests/unit/security/test_keys.py +33 -0
- privyx-0.1.1/tests/unit/streaming/__init__.py +1 -0
- privyx-0.1.1/tests/unit/streaming/test_deanonymizer.py +74 -0
- privyx-0.1.1/tests/unit/streaming/test_sse.py +66 -0
- privyx-0.1.1/tests/unit/tokens/__init__.py +0 -0
- privyx-0.1.1/tests/unit/tokens/test_codec.py +190 -0
- privyx-0.1.1/tests/unit/vault/__init__.py +1 -0
- privyx-0.1.1/tests/unit/vault/test_memory.py +45 -0
- privyx-0.1.1/uv.lock +2171 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Version control & CI
|
|
2
|
+
.git
|
|
3
|
+
.github
|
|
4
|
+
.gitignore
|
|
5
|
+
|
|
6
|
+
# Cache & virtualenvs
|
|
7
|
+
.venv
|
|
8
|
+
.temp/
|
|
9
|
+
__pycache__
|
|
10
|
+
*.py[cod]
|
|
11
|
+
*$py.class
|
|
12
|
+
*.so
|
|
13
|
+
|
|
14
|
+
# Testing & linting caches
|
|
15
|
+
.pytest_cache
|
|
16
|
+
.hypothesis
|
|
17
|
+
.mypy_cache
|
|
18
|
+
.ruff_cache
|
|
19
|
+
.coverage
|
|
20
|
+
htmlcov/
|
|
21
|
+
tests/
|
|
22
|
+
|
|
23
|
+
# Build artifacts
|
|
24
|
+
build/
|
|
25
|
+
dist/
|
|
26
|
+
wheels/
|
|
27
|
+
*.egg-info/
|
|
28
|
+
|
|
29
|
+
# Logs & runtime databases
|
|
30
|
+
*.log
|
|
31
|
+
*-audit.log
|
|
32
|
+
*-debug.log
|
|
33
|
+
*.db
|
|
34
|
+
*.sqlite
|
|
35
|
+
*.sqlite3
|
|
36
|
+
|
|
37
|
+
# Environment & secrets
|
|
38
|
+
.env
|
|
39
|
+
.env.*
|
|
40
|
+
!.env.example
|
|
41
|
+
|
|
42
|
+
# IDE & OS files
|
|
43
|
+
.DS_Store
|
|
44
|
+
.idea/
|
|
45
|
+
.vscode/
|
|
46
|
+
.claude/
|
|
47
|
+
|
|
48
|
+
# Docker files
|
|
49
|
+
Dockerfile*
|
|
50
|
+
docker-compose*.yml
|
|
51
|
+
.dockerignore
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Privyx environment configuration (copy to .env and fill in)
|
|
2
|
+
|
|
3
|
+
# --- Upstream provider endpoints ---
|
|
4
|
+
# Generic passthrough target when running `privyx proxy`
|
|
5
|
+
PRIVYX_UPSTREAM_URL=http://localhost:20128
|
|
6
|
+
|
|
7
|
+
# Provider keys (used only when adapter needs direct SDK access)
|
|
8
|
+
PRIVYX_OPENAI_API_KEY=
|
|
9
|
+
PRIVYX_ANTHROPIC_API_KEY=
|
|
10
|
+
# Read, but the google provider is not implemented yet — setting this alone
|
|
11
|
+
# does not make `provider.type: google` work.
|
|
12
|
+
PRIVYX_GOOGLE_API_KEY=
|
|
13
|
+
|
|
14
|
+
# --- Vault backend ---
|
|
15
|
+
# memory | sqlite | redis
|
|
16
|
+
PRIVYX_VAULT=memory
|
|
17
|
+
PRIVYX_VAULT_DSN=sqlite+aiosqlite:///privyx.db
|
|
18
|
+
PRIVYX_REDIS_URL=redis://localhost:6379/0
|
|
19
|
+
|
|
20
|
+
# --- Session ---
|
|
21
|
+
# How a session is identified when the client sends no x-privyx-session header:
|
|
22
|
+
# ephemeral (default) — a fresh session per request
|
|
23
|
+
# client — one reused session per API key
|
|
24
|
+
# conversation — one reused session per conversation (first user message)
|
|
25
|
+
# `privyx run` defaults this to `conversation`.
|
|
26
|
+
PRIVYX_SESSION_STRATEGY=
|
|
27
|
+
|
|
28
|
+
# --- Security ---
|
|
29
|
+
# HMAC anchor secret. Set this to make pseudonyms deterministic across
|
|
30
|
+
# sessions (the same value always gets the same pseudonym). Leave empty to
|
|
31
|
+
# use per-session counters instead; an empty secret disables anchoring rather
|
|
32
|
+
# than anchoring with a guessable key.
|
|
33
|
+
# Generate one with: openssl rand -hex 32
|
|
34
|
+
PRIVYX_ANCHOR_SECRET=
|
|
35
|
+
|
|
36
|
+
# Encrypt operator key (required for `operator.type: encrypt`). 32-byte
|
|
37
|
+
# AES-256 key as 64 hex chars; the vault then stores ciphertext, not plaintext.
|
|
38
|
+
# Generate one with: openssl rand -hex 32
|
|
39
|
+
PRIVYX_ENCRYPT_KEY=
|
|
40
|
+
|
|
41
|
+
# --- Server ---
|
|
42
|
+
PRIVYX_HOST=127.0.0.1
|
|
43
|
+
PRIVYX_PORT=8000
|
|
44
|
+
|
|
45
|
+
# --- Observability ---
|
|
46
|
+
PRIVYX_LOG_LEVEL=info
|
|
47
|
+
PRIVYX_LOGGING=json
|
|
48
|
+
# Debug file incl. third-party logs; at debug it holds raw PII (created 0600).
|
|
49
|
+
# PRIVYX_LOG_FILE=privyx-debug.log
|
|
50
|
+
|
|
51
|
+
# PII-safe audit trail (entity types + counts, never content) as JSONL.
|
|
52
|
+
PRIVYX_AUDIT_ENABLED=true
|
|
53
|
+
PRIVYX_AUDIT_PATH=privyx-audit.log
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
changelog:
|
|
2
|
+
exclude:
|
|
3
|
+
labels:
|
|
4
|
+
- duplicate
|
|
5
|
+
- invalid
|
|
6
|
+
- wontfix
|
|
7
|
+
- question
|
|
8
|
+
categories:
|
|
9
|
+
- title: "💥 Breaking Changes"
|
|
10
|
+
labels:
|
|
11
|
+
- "breaking-change"
|
|
12
|
+
- title: "✨ Features"
|
|
13
|
+
labels:
|
|
14
|
+
- "enhancement"
|
|
15
|
+
- title: "🐛 Bug Fixes"
|
|
16
|
+
labels:
|
|
17
|
+
- "bug"
|
|
18
|
+
- title: "⚡ Performance"
|
|
19
|
+
labels:
|
|
20
|
+
- "performance"
|
|
21
|
+
- title: "🔒 Security"
|
|
22
|
+
labels:
|
|
23
|
+
- "security"
|
|
24
|
+
- title: "♻️ Refactoring"
|
|
25
|
+
labels:
|
|
26
|
+
- "refactor"
|
|
27
|
+
- title: "📚 Documentation"
|
|
28
|
+
labels:
|
|
29
|
+
- "documentation"
|
|
30
|
+
- title: "📦 Dependencies"
|
|
31
|
+
labels:
|
|
32
|
+
- "dependencies"
|
|
33
|
+
- title: "Other Changes"
|
|
34
|
+
labels:
|
|
35
|
+
- "*"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
check:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: astral-sh/setup-uv@v6
|
|
14
|
+
with:
|
|
15
|
+
enable-cache: true
|
|
16
|
+
- run: uv sync --all-extras --locked
|
|
17
|
+
- run: uv run ruff check src tests
|
|
18
|
+
- run: uv run mypy src
|
|
19
|
+
- run: uv run pytest
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
outputs:
|
|
17
|
+
is_prerelease: ${{ steps.check_prerelease.outputs.is_prerelease }}
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- uses: astral-sh/setup-uv@v6
|
|
22
|
+
with:
|
|
23
|
+
enable-cache: true
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: uv sync --all-extras --locked
|
|
27
|
+
|
|
28
|
+
- name: Lint
|
|
29
|
+
run: uv run ruff check src tests
|
|
30
|
+
|
|
31
|
+
- name: Type check
|
|
32
|
+
run: uv run mypy src
|
|
33
|
+
|
|
34
|
+
- name: Test
|
|
35
|
+
run: uv run pytest
|
|
36
|
+
|
|
37
|
+
- name: Verify tag matches package version
|
|
38
|
+
run: |
|
|
39
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
40
|
+
PKG_VERSION="$(uv run python -c 'from privyx.version import __version__; print(__version__)')"
|
|
41
|
+
if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
|
|
42
|
+
echo "::error::Tag v$TAG_VERSION does not match package version $PKG_VERSION"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
- name: Determine if this is a pre-release (rc/alpha/beta/dev)
|
|
47
|
+
id: check_prerelease
|
|
48
|
+
run: |
|
|
49
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
50
|
+
if echo "$VERSION" | grep -qE '(a|b|rc|alpha|beta|pre)[0-9]*$|\.?dev[0-9]*$'; then
|
|
51
|
+
echo "is_prerelease=true" >> "$GITHUB_OUTPUT"
|
|
52
|
+
echo "::notice::$VERSION looks like a pre-release; will publish a GitHub prerelease and SKIP the PyPI production publish job."
|
|
53
|
+
else
|
|
54
|
+
echo "is_prerelease=false" >> "$GITHUB_OUTPUT"
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
- name: Build sdist and wheel
|
|
58
|
+
run: uv build
|
|
59
|
+
|
|
60
|
+
- name: Extract changelog section for this version
|
|
61
|
+
run: |
|
|
62
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
63
|
+
awk -v ver="$VERSION" '
|
|
64
|
+
BEGIN { found=0 }
|
|
65
|
+
/^## \[/ {
|
|
66
|
+
if (found) exit
|
|
67
|
+
if ($0 ~ "\\[" ver "\\]") { found=1; next }
|
|
68
|
+
}
|
|
69
|
+
/^\[[A-Za-z0-9._-]+\]:/ { if (found) exit }
|
|
70
|
+
found { print }
|
|
71
|
+
' CHANGELOG.md > changelog-excerpt.md
|
|
72
|
+
echo "--- changelog-excerpt.md ---"
|
|
73
|
+
cat changelog-excerpt.md
|
|
74
|
+
|
|
75
|
+
- name: Generate PR-based release notes (categorized via .github/release.yml)
|
|
76
|
+
env:
|
|
77
|
+
GH_TOKEN: ${{ github.token }}
|
|
78
|
+
run: |
|
|
79
|
+
gh api "repos/${{ github.repository }}/releases/generate-notes" \
|
|
80
|
+
-f tag_name="${GITHUB_REF_NAME}" \
|
|
81
|
+
--jq .body > generated-notes.md
|
|
82
|
+
echo "--- generated-notes.md ---"
|
|
83
|
+
cat generated-notes.md
|
|
84
|
+
|
|
85
|
+
- name: Assemble final release notes
|
|
86
|
+
run: |
|
|
87
|
+
{
|
|
88
|
+
cat changelog-excerpt.md
|
|
89
|
+
echo
|
|
90
|
+
echo "---"
|
|
91
|
+
echo
|
|
92
|
+
cat generated-notes.md
|
|
93
|
+
} > release-notes.md
|
|
94
|
+
echo "--- release-notes.md (final) ---"
|
|
95
|
+
cat release-notes.md
|
|
96
|
+
|
|
97
|
+
- name: Create GitHub Release
|
|
98
|
+
env:
|
|
99
|
+
GH_TOKEN: ${{ github.token }}
|
|
100
|
+
IS_PRERELEASE: ${{ steps.check_prerelease.outputs.is_prerelease }}
|
|
101
|
+
run: |
|
|
102
|
+
PRERELEASE_FLAG=""
|
|
103
|
+
if [ "$IS_PRERELEASE" = "true" ]; then
|
|
104
|
+
PRERELEASE_FLAG="--prerelease"
|
|
105
|
+
fi
|
|
106
|
+
gh release create "${GITHUB_REF_NAME}" \
|
|
107
|
+
--title "${GITHUB_REF_NAME}" \
|
|
108
|
+
--notes-file release-notes.md \
|
|
109
|
+
$PRERELEASE_FLAG \
|
|
110
|
+
dist/*.whl dist/*.tar.gz
|
|
111
|
+
|
|
112
|
+
- name: Upload build artifacts for PyPI publish
|
|
113
|
+
uses: actions/upload-artifact@v4
|
|
114
|
+
with:
|
|
115
|
+
name: dist
|
|
116
|
+
path: dist/
|
|
117
|
+
retention-days: 7
|
|
118
|
+
|
|
119
|
+
publish-pypi:
|
|
120
|
+
name: Publish to PyPI
|
|
121
|
+
needs: build
|
|
122
|
+
# Safety gate: only real, stable releases reach production PyPI. A version
|
|
123
|
+
# with a pre-release suffix (rc/alpha/beta/dev) only produces a GitHub
|
|
124
|
+
# prerelease above; nothing is uploaded to PyPI for it. PyPI releases are
|
|
125
|
+
# permanent (a version string can never be reused, even after deletion),
|
|
126
|
+
# so this check exists specifically to prevent test/rc tags from leaking
|
|
127
|
+
# into the production index.
|
|
128
|
+
if: needs.build.outputs.is_prerelease == 'false'
|
|
129
|
+
runs-on: ubuntu-latest
|
|
130
|
+
environment:
|
|
131
|
+
name: pypi
|
|
132
|
+
url: https://pypi.org/p/privyx
|
|
133
|
+
permissions:
|
|
134
|
+
id-token: write # required for PyPI Trusted Publishing (OIDC), no API token stored
|
|
135
|
+
steps:
|
|
136
|
+
- name: Download build artifacts
|
|
137
|
+
uses: actions/download-artifact@v4
|
|
138
|
+
with:
|
|
139
|
+
name: dist
|
|
140
|
+
path: dist/
|
|
141
|
+
|
|
142
|
+
- name: Publish to PyPI
|
|
143
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
144
|
+
with:
|
|
145
|
+
packages-dir: dist/
|
privyx-0.1.1/.gitignore
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Python-generated files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[oc]
|
|
4
|
+
build/
|
|
5
|
+
dist/
|
|
6
|
+
wheels/
|
|
7
|
+
*.egg-info
|
|
8
|
+
|
|
9
|
+
# Virtual environments
|
|
10
|
+
.venv
|
|
11
|
+
.temp/
|
|
12
|
+
|
|
13
|
+
# Tooling
|
|
14
|
+
.mypy_cache/
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.ruff_cache/
|
|
17
|
+
.coverage
|
|
18
|
+
htmlcov/
|
|
19
|
+
|
|
20
|
+
# Runtime / secrets
|
|
21
|
+
*.db
|
|
22
|
+
*.sqlite
|
|
23
|
+
*.sqlite3
|
|
24
|
+
*-audit.log
|
|
25
|
+
*-debug.log
|
|
26
|
+
.env
|
|
27
|
+
.env.local
|
|
28
|
+
|
|
29
|
+
# Editor / OS
|
|
30
|
+
.DS_Store
|
|
31
|
+
.idea/
|
|
32
|
+
.vscode/
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# This .gitignore file was automatically created by Hypothesis. Hypothesis gitignores
|
|
2
|
+
# .hypothesis by default, because we generally recommend that .hypothesis not be checked
|
|
3
|
+
# into version control.
|
|
4
|
+
#
|
|
5
|
+
# If you *would* like to check .hypothesis into version control, you should delete this
|
|
6
|
+
# file. Hypothesis will not re-create this .gitignore unless .hypothesis is deleted (and
|
|
7
|
+
# if it does, that's a bug - please report it!)
|
|
8
|
+
|
|
9
|
+
*
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/privacy/detector/presidio.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[0.35, 'BANK_ACCOUNT', 'EMAIL', 'EMAIL_ADDRESS', 'LOCATION', 'ORG', 'ORGANIZATION', 'PHONE', 'PHONE_NUMBER', 'SSN', 'US_BANK_NUMBER', 'US_SSN', 'en', 'lang_code', 'model_name', 'models', 'nlp_engine_name', 'presidio', 'spacy']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/proxy/schemas.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[4096, '/', '_id', '_url', 'anthropic', 'arguments', 'cache_control', 'content', 'data', 'description', 'encrypted_', 'file_data', 'id', 'input', 'instructions', 'media_type', 'messages', 'name', 'openai', 'prediction', 'prompt', 'responses', 'result', 'role', 'signature', 'status', 'system', 'text', 'thinking', 'tools', 'type', 'url']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/proxy/headers.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
['2023-06-01', 'accept-encoding', 'anthropic', 'anthropic-version', 'authorization', 'connection', 'content-encoding', 'content-length', 'host', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'x-api-key', 'x-privyx-session']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/proxy/session.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
['anthropic', 'authorization', 'client', 'content', 'conversation', 'ephemeral', 'header', 'input', 'input_text', 'messages', 'openai', 'responses', 'role', 'text', 'type', 'user', 'utf-8', 'x-api-key']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/proxy/stream_router.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[',', '.', ':', '[DONE]', 'anthropic', 'args', 'arguments', 'build_resolver', 'choices', 'command_index', 'content', 'content_block', 'content_block_delta', 'content_block_start', 'content_block_stop', 'content_index', 'delta', 'done', 'error', 'finish_reason', 'function', 'function_call', 'generic', 'id', 'index', 'input_json_delta', 'item_id', 'literal', 'message_stop', 'name', 'object', 'output_index', 'partial_json', 'reasoning', 'reasoning_content', 'refusal', 'replace', 'response.audio.delta', 'response.completed', 'response.failed', 'response.incomplete', 'responses', 'schema_name', 'signature', 'signature_delta', 'stream_restore', 'summary_index', 'text', 'text_delta', 'thinking', 'thinking_delta', 'token', 'tool_calls', 'tool_use', 'type', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/proxy/transparent.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[10.0, 300.0, 1000, '/', 'application/json', 'cache-control', 'cleanup', 'content-type', 'ephemeral', 'generic', 'no-cache', 'stream', 'text/event-stream', 'upstream', 'utf-8', 'x-privyx-session']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/cli/commands/proxy.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[1.0, ', ', '--config', '--host', '--port', '--reload', '--ssl-ca-certs', '--ssl-certfile', '--ssl-keyfile', '--upstream', '-c', '-u', 'Bind address', 'Bind port', 'Config file path', 'PRIVYX_CONFIG', 'base_url', 'ca_certs', 'certfile', 'config_path', 'gateway', 'host', 'http', 'https', 'keyfile', 'keyfile_password', 'mode', 'port', 'provider', 'proxy', 'reload_on_change', 'tls', 'transparent', 'transparent_mode', 'upstream_url', 'uvicorn']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/observability/logging.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[384, '.failed', 'aiosqlite', 'args', 'connect_tcp.started', 'exc_info', 'executing %s', 'httpcore.', 'json', 'level', 'logger', 'message', 'privyx', 'time', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/config/defaults.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
[8000, '127.0.0.1', 'PRIVYX', 'anchor', 'api_key', 'audit', 'base_url', 'ca_certs', 'certfile', 'default', 'detector', 'dsn', 'enabled', 'ephemeral', 'format', 'generic', 'headers', 'hmac', 'host', 'info', 'keyfile', 'keyfile_password', 'log_file', 'log_level', 'logging', 'memory', 'namespace', 'operator', 'path', 'paths', 'patterns', 'plugins', 'policy', 'port', 'privyx-audit.log', 'provider', 'pseudonym', 'redis_url', 'regex', 'secret', 'session', 'strategy', 'terms', 'text', 'tls', 'token', 'ttl', 'type', 'upstream_url', 'vault']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /home/runner/work/privyx/privyx/src/privyx/privacy/operator/faker.py
|
|
2
|
+
# hypothesis_version: 6.165.10
|
|
3
|
+
|
|
4
|
+
['ADDRESS', 'COMPANY', 'CREDIT_CARD', 'DATE', 'DATE_TIME', 'EMAIL', 'IP_ADDRESS', 'LOCATION', 'NAME', 'ORG', 'ORGANIZATION', 'PERSON', 'PHONE', 'PHONE_NUMBER', 'SSN', 'URL', 'ZIPCODE', 'ascii_email', 'city', 'company', 'credit_card_number', 'date', 'faker', 'ipv4', 'iso8601', 'literal', 'name', 'phone_number', 'postcode', 'ssn', 'street_address', 'url']
|