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.
Files changed (318) hide show
  1. privyx-0.1.1/.dockerignore +51 -0
  2. privyx-0.1.1/.env.example +53 -0
  3. privyx-0.1.1/.github/release.yml +35 -0
  4. privyx-0.1.1/.github/workflows/ci.yml +19 -0
  5. privyx-0.1.1/.github/workflows/release.yml +145 -0
  6. privyx-0.1.1/.gitignore +32 -0
  7. privyx-0.1.1/.hypothesis/.gitignore +9 -0
  8. privyx-0.1.1/.hypothesis/constants/00b17860a874e031 +4 -0
  9. privyx-0.1.1/.hypothesis/constants/04a5e1c72b4500b2 +4 -0
  10. privyx-0.1.1/.hypothesis/constants/07509115f0fdaa77 +4 -0
  11. privyx-0.1.1/.hypothesis/constants/0c0a7e501d9430b7 +4 -0
  12. privyx-0.1.1/.hypothesis/constants/0dfbe950b7b2df80 +4 -0
  13. privyx-0.1.1/.hypothesis/constants/1090231a877b60dd +4 -0
  14. privyx-0.1.1/.hypothesis/constants/1778ab2612940bd3 +4 -0
  15. privyx-0.1.1/.hypothesis/constants/18319c6ac6e7fdaf +4 -0
  16. privyx-0.1.1/.hypothesis/constants/1a2102884a8c0e4f +4 -0
  17. privyx-0.1.1/.hypothesis/constants/1fbaa30407184d4b +4 -0
  18. privyx-0.1.1/.hypothesis/constants/2127787c64a1179c +4 -0
  19. privyx-0.1.1/.hypothesis/constants/21e704dc01037e2a +4 -0
  20. privyx-0.1.1/.hypothesis/constants/2451392d7b392b1c +4 -0
  21. privyx-0.1.1/.hypothesis/constants/25bd2960478fd1a9 +4 -0
  22. privyx-0.1.1/.hypothesis/constants/26a9ea24b3f139ec +4 -0
  23. privyx-0.1.1/.hypothesis/constants/2cd91bd11dfb0fce +4 -0
  24. privyx-0.1.1/.hypothesis/constants/2d53874d1a4e9b22 +4 -0
  25. privyx-0.1.1/.hypothesis/constants/2e50ff26b12465f5 +4 -0
  26. privyx-0.1.1/.hypothesis/constants/2ea0ab73ba2dd29c +4 -0
  27. privyx-0.1.1/.hypothesis/constants/33f1ac626da63dd6 +4 -0
  28. privyx-0.1.1/.hypothesis/constants/38d07edd06515f69 +4 -0
  29. privyx-0.1.1/.hypothesis/constants/3b65b91501e62405 +4 -0
  30. privyx-0.1.1/.hypothesis/constants/3c7189c09b3f75fa +4 -0
  31. privyx-0.1.1/.hypothesis/constants/4147357243c3f5a9 +4 -0
  32. privyx-0.1.1/.hypothesis/constants/4c40f05f23e647b0 +4 -0
  33. privyx-0.1.1/.hypothesis/constants/4d9a1a655a0ca455 +4 -0
  34. privyx-0.1.1/.hypothesis/constants/50f2594efbfc7112 +4 -0
  35. privyx-0.1.1/.hypothesis/constants/5ea4d513f9a20cd5 +4 -0
  36. privyx-0.1.1/.hypothesis/constants/5eb7eaef810ff587 +4 -0
  37. privyx-0.1.1/.hypothesis/constants/62aafca42697add8 +4 -0
  38. privyx-0.1.1/.hypothesis/constants/6730be64d769b466 +4 -0
  39. privyx-0.1.1/.hypothesis/constants/67b0a8ccf18bf5d2 +4 -0
  40. privyx-0.1.1/.hypothesis/constants/6ab315e6c96856ab +4 -0
  41. privyx-0.1.1/.hypothesis/constants/707cfeca7533a73a +4 -0
  42. privyx-0.1.1/.hypothesis/constants/7141ec6b8b2c9143 +4 -0
  43. privyx-0.1.1/.hypothesis/constants/7370dc02be56597f +4 -0
  44. privyx-0.1.1/.hypothesis/constants/745880873dfc8153 +4 -0
  45. privyx-0.1.1/.hypothesis/constants/782ae0898b0a2c07 +4 -0
  46. privyx-0.1.1/.hypothesis/constants/7ab63aac25da58b4 +4 -0
  47. privyx-0.1.1/.hypothesis/constants/7d9db744f0a04809 +4 -0
  48. privyx-0.1.1/.hypothesis/constants/83e052b391210e72 +4 -0
  49. privyx-0.1.1/.hypothesis/constants/860a4f9c9b996ff8 +4 -0
  50. privyx-0.1.1/.hypothesis/constants/87ce6d6fa86eac1c +4 -0
  51. privyx-0.1.1/.hypothesis/constants/887982eccf190144 +4 -0
  52. privyx-0.1.1/.hypothesis/constants/8e48427396daddc7 +4 -0
  53. privyx-0.1.1/.hypothesis/constants/8f3488b933c8e766 +4 -0
  54. privyx-0.1.1/.hypothesis/constants/924e9f481feae8df +4 -0
  55. privyx-0.1.1/.hypothesis/constants/93a68721ded858e7 +4 -0
  56. privyx-0.1.1/.hypothesis/constants/93d18ee0264f7ad8 +4 -0
  57. privyx-0.1.1/.hypothesis/constants/9404ace8b05577d6 +4 -0
  58. privyx-0.1.1/.hypothesis/constants/960d84b9f1ee81df +4 -0
  59. privyx-0.1.1/.hypothesis/constants/96a85b02a875512c +4 -0
  60. privyx-0.1.1/.hypothesis/constants/989d87fe0920caee +4 -0
  61. privyx-0.1.1/.hypothesis/constants/995c93783b5e6953 +4 -0
  62. privyx-0.1.1/.hypothesis/constants/9adef9b1f0308166 +4 -0
  63. privyx-0.1.1/.hypothesis/constants/9af9f7d26ff20008 +4 -0
  64. privyx-0.1.1/.hypothesis/constants/a14e8c285c2fe32d +4 -0
  65. privyx-0.1.1/.hypothesis/constants/a244d2eb65f34216 +4 -0
  66. privyx-0.1.1/.hypothesis/constants/a2a63468976de516 +4 -0
  67. privyx-0.1.1/.hypothesis/constants/a2f95d20928aa2bb +4 -0
  68. privyx-0.1.1/.hypothesis/constants/a4513bad8497bac7 +4 -0
  69. privyx-0.1.1/.hypothesis/constants/a765e51579040f8e +4 -0
  70. privyx-0.1.1/.hypothesis/constants/a927b5543b3c3568 +4 -0
  71. privyx-0.1.1/.hypothesis/constants/ac301f78410ce9f5 +4 -0
  72. privyx-0.1.1/.hypothesis/constants/ac49c5d505b08e43 +4 -0
  73. privyx-0.1.1/.hypothesis/constants/ac50c5ef342ee7ae +4 -0
  74. privyx-0.1.1/.hypothesis/constants/acf6b9ca73f29f7f +4 -0
  75. privyx-0.1.1/.hypothesis/constants/ada9b94e3b3388f1 +4 -0
  76. privyx-0.1.1/.hypothesis/constants/ae0c9b6b2181c6a1 +4 -0
  77. privyx-0.1.1/.hypothesis/constants/af13f6ad430d7430 +4 -0
  78. privyx-0.1.1/.hypothesis/constants/b61450bc9b5908a8 +4 -0
  79. privyx-0.1.1/.hypothesis/constants/ba6960f5c1f901a6 +4 -0
  80. privyx-0.1.1/.hypothesis/constants/c7a27830da4f7173 +4 -0
  81. privyx-0.1.1/.hypothesis/constants/c9e0742317f7b362 +4 -0
  82. privyx-0.1.1/.hypothesis/constants/caeeb73ce3f2c950 +4 -0
  83. privyx-0.1.1/.hypothesis/constants/d176b1af90813abe +4 -0
  84. privyx-0.1.1/.hypothesis/constants/d3f773f3d8b378b0 +4 -0
  85. privyx-0.1.1/.hypothesis/constants/d6037c5882d2c196 +4 -0
  86. privyx-0.1.1/.hypothesis/constants/d7eede67428f8cb0 +4 -0
  87. privyx-0.1.1/.hypothesis/constants/dbb7bdb9aee7709c +4 -0
  88. privyx-0.1.1/.hypothesis/constants/dd887c3db951d826 +4 -0
  89. privyx-0.1.1/.hypothesis/constants/e481af1d59bf87e8 +4 -0
  90. privyx-0.1.1/.hypothesis/constants/e4caa177f66d901a +4 -0
  91. privyx-0.1.1/.hypothesis/constants/e855f0a1fbeca24b +4 -0
  92. privyx-0.1.1/.hypothesis/constants/ec36a6166777e89a +4 -0
  93. privyx-0.1.1/.hypothesis/constants/f22b5276c50ed86e +4 -0
  94. privyx-0.1.1/.hypothesis/constants/f3802f4ac352b9f0 +4 -0
  95. privyx-0.1.1/.hypothesis/constants/f4e76d2f0496c4dc +4 -0
  96. privyx-0.1.1/.hypothesis/constants/f71070718f653970 +4 -0
  97. privyx-0.1.1/.hypothesis/constants/f7705e3f1819c3ed +4 -0
  98. privyx-0.1.1/.hypothesis/constants/f843eda65fcc5a23 +4 -0
  99. privyx-0.1.1/.hypothesis/constants/f8c3e62efea0c291 +4 -0
  100. privyx-0.1.1/.hypothesis/constants/fa7318af7d2a9fbb +4 -0
  101. privyx-0.1.1/.hypothesis/constants/fc88b49d215259fb +4 -0
  102. privyx-0.1.1/.hypothesis/constants/ffac0ffff2fcc08c +4 -0
  103. privyx-0.1.1/.hypothesis/constants/ffb9f2b85511cf9f +4 -0
  104. privyx-0.1.1/.hypothesis/constants/ffd269f23a488eed +4 -0
  105. privyx-0.1.1/.hypothesis/unicode_data/15.0.0/charmap.json.gz +0 -0
  106. privyx-0.1.1/.python-version +1 -0
  107. privyx-0.1.1/CHANGELOG.md +110 -0
  108. privyx-0.1.1/CONTRIBUTING.md +39 -0
  109. privyx-0.1.1/Dockerfile +62 -0
  110. privyx-0.1.1/LICENSE +21 -0
  111. privyx-0.1.1/Makefile +34 -0
  112. privyx-0.1.1/PKG-INFO +228 -0
  113. privyx-0.1.1/README.md +179 -0
  114. privyx-0.1.1/SECURITY.md +29 -0
  115. privyx-0.1.1/configs/default.yaml +188 -0
  116. privyx-0.1.1/configs/examples/anthropic.yaml +15 -0
  117. privyx-0.1.1/configs/examples/custom.yaml +14 -0
  118. privyx-0.1.1/configs/examples/encrypt.yaml +15 -0
  119. privyx-0.1.1/configs/examples/openai.yaml +14 -0
  120. privyx-0.1.1/configs/examples/terms.yaml +32 -0
  121. privyx-0.1.1/configs/strict.yaml +45 -0
  122. privyx-0.1.1/docker-compose.yml +55 -0
  123. privyx-0.1.1/docs/architecture/overview.md +100 -0
  124. privyx-0.1.1/docs/architecture/privacy-engine.md +97 -0
  125. privyx-0.1.1/docs/architecture/proxy.md +288 -0
  126. privyx-0.1.1/docs/architecture/scaling.md +32 -0
  127. privyx-0.1.1/docs/architecture/streaming.md +66 -0
  128. privyx-0.1.1/docs/development/plugins.md +119 -0
  129. privyx-0.1.1/docs/development/testing.md +62 -0
  130. privyx-0.1.1/docs/observability/audit-events.md +121 -0
  131. privyx-0.1.1/docs/providers/anthropic.md +68 -0
  132. privyx-0.1.1/docs/providers/generic.md +24 -0
  133. privyx-0.1.1/docs/providers/openai.md +91 -0
  134. privyx-0.1.1/docs/security/cryptography.md +47 -0
  135. privyx-0.1.1/docs/security/data-handling.md +47 -0
  136. privyx-0.1.1/docs/security/threat-model.md +44 -0
  137. privyx-0.1.1/examples/anthropic.py +59 -0
  138. privyx-0.1.1/examples/basic.py +38 -0
  139. privyx-0.1.1/examples/fastapi_gateway.py +48 -0
  140. privyx-0.1.1/examples/openai.py +63 -0
  141. privyx-0.1.1/examples/transparent_proxy.py +34 -0
  142. privyx-0.1.1/main.py +20 -0
  143. privyx-0.1.1/plugins/detectors/__init__.py +11 -0
  144. privyx-0.1.1/plugins/detectors/license_plate.py +39 -0
  145. privyx-0.1.1/plugins/operators/__init__.py +8 -0
  146. privyx-0.1.1/plugins/providers/__init__.py +7 -0
  147. privyx-0.1.1/pyproject.toml +84 -0
  148. privyx-0.1.1/scripts/benchmark.py +59 -0
  149. privyx-0.1.1/scripts/dev.py +32 -0
  150. privyx-0.1.1/scripts/e2e_claude.py +412 -0
  151. privyx-0.1.1/src/privyx/__init__.py +12 -0
  152. privyx-0.1.1/src/privyx/cli/__init__.py +1 -0
  153. privyx-0.1.1/src/privyx/cli/commands/__init__.py +1 -0
  154. privyx-0.1.1/src/privyx/cli/commands/config.py +38 -0
  155. privyx-0.1.1/src/privyx/cli/commands/detect.py +84 -0
  156. privyx-0.1.1/src/privyx/cli/commands/doctor.py +270 -0
  157. privyx-0.1.1/src/privyx/cli/commands/inspect.py +10 -0
  158. privyx-0.1.1/src/privyx/cli/commands/mask.py +313 -0
  159. privyx-0.1.1/src/privyx/cli/commands/proxy.py +297 -0
  160. privyx-0.1.1/src/privyx/cli/commands/run.py +307 -0
  161. privyx-0.1.1/src/privyx/cli/commands/session.py +79 -0
  162. privyx-0.1.1/src/privyx/cli/config.py +1 -0
  163. privyx-0.1.1/src/privyx/cli/main.py +50 -0
  164. privyx-0.1.1/src/privyx/cli/output.py +1 -0
  165. privyx-0.1.1/src/privyx/config/__init__.py +1 -0
  166. privyx-0.1.1/src/privyx/config/defaults.py +61 -0
  167. privyx-0.1.1/src/privyx/config/env.py +116 -0
  168. privyx-0.1.1/src/privyx/config/loader.py +76 -0
  169. privyx-0.1.1/src/privyx/config/schema.py +257 -0
  170. privyx-0.1.1/src/privyx/core/__init__.py +1 -0
  171. privyx-0.1.1/src/privyx/core/builder.py +270 -0
  172. privyx-0.1.1/src/privyx/core/context.py +35 -0
  173. privyx-0.1.1/src/privyx/core/engine.py +208 -0
  174. privyx-0.1.1/src/privyx/core/errors.py +57 -0
  175. privyx-0.1.1/src/privyx/core/result.py +137 -0
  176. privyx-0.1.1/src/privyx/core/session.py +73 -0
  177. privyx-0.1.1/src/privyx/gateway/__init__.py +5 -0
  178. privyx-0.1.1/src/privyx/gateway/server.py +317 -0
  179. privyx-0.1.1/src/privyx/gateway/transparent.py +80 -0
  180. privyx-0.1.1/src/privyx/observability/__init__.py +19 -0
  181. privyx-0.1.1/src/privyx/observability/audit.py +440 -0
  182. privyx-0.1.1/src/privyx/observability/logging.py +116 -0
  183. privyx-0.1.1/src/privyx/observability/metrics.py +1 -0
  184. privyx-0.1.1/src/privyx/observability/tracing.py +1 -0
  185. privyx-0.1.1/src/privyx/plugins/__init__.py +12 -0
  186. privyx-0.1.1/src/privyx/plugins/hooks.py +72 -0
  187. privyx-0.1.1/src/privyx/plugins/loader.py +172 -0
  188. privyx-0.1.1/src/privyx/plugins/registry.py +118 -0
  189. privyx-0.1.1/src/privyx/privacy/__init__.py +1 -0
  190. privyx-0.1.1/src/privyx/privacy/anchor/__init__.py +1 -0
  191. privyx-0.1.1/src/privyx/privacy/anchor/base.py +36 -0
  192. privyx-0.1.1/src/privyx/privacy/anchor/hmac.py +45 -0
  193. privyx-0.1.1/src/privyx/privacy/anchor/pasp.py +26 -0
  194. privyx-0.1.1/src/privyx/privacy/detector/__init__.py +14 -0
  195. privyx-0.1.1/src/privyx/privacy/detector/base.py +38 -0
  196. privyx-0.1.1/src/privyx/privacy/detector/builtin.py +116 -0
  197. privyx-0.1.1/src/privyx/privacy/detector/cache.py +110 -0
  198. privyx-0.1.1/src/privyx/privacy/detector/llm.py +200 -0
  199. privyx-0.1.1/src/privyx/privacy/detector/presidio.py +143 -0
  200. privyx-0.1.1/src/privyx/privacy/detector/yaml.py +179 -0
  201. privyx-0.1.1/src/privyx/privacy/operator/__init__.py +1 -0
  202. privyx-0.1.1/src/privyx/privacy/operator/base.py +115 -0
  203. privyx-0.1.1/src/privyx/privacy/operator/encrypt.py +128 -0
  204. privyx-0.1.1/src/privyx/privacy/operator/faker.py +233 -0
  205. privyx-0.1.1/src/privyx/privacy/operator/hash.py +77 -0
  206. privyx-0.1.1/src/privyx/privacy/operator/pseudonym.py +133 -0
  207. privyx-0.1.1/src/privyx/privacy/operator/redact.py +46 -0
  208. privyx-0.1.1/src/privyx/privacy/policy/__init__.py +1 -0
  209. privyx-0.1.1/src/privyx/privacy/policy/base.py +28 -0
  210. privyx-0.1.1/src/privyx/privacy/policy/default.py +16 -0
  211. privyx-0.1.1/src/privyx/privacy/policy/loader.py +33 -0
  212. privyx-0.1.1/src/privyx/privacy/policy/strict.py +28 -0
  213. privyx-0.1.1/src/privyx/privacy/transform/__init__.py +1 -0
  214. privyx-0.1.1/src/privyx/privacy/transform/json.py +61 -0
  215. privyx-0.1.1/src/privyx/privacy/transform/structured.py +28 -0
  216. privyx-0.1.1/src/privyx/privacy/transform/text.py +37 -0
  217. privyx-0.1.1/src/privyx/providers/__init__.py +1 -0
  218. privyx-0.1.1/src/privyx/providers/anthropic.py +26 -0
  219. privyx-0.1.1/src/privyx/providers/base.py +44 -0
  220. privyx-0.1.1/src/privyx/providers/generic.py +108 -0
  221. privyx-0.1.1/src/privyx/providers/google.py +29 -0
  222. privyx-0.1.1/src/privyx/providers/openai.py +26 -0
  223. privyx-0.1.1/src/privyx/providers/registry.py +147 -0
  224. privyx-0.1.1/src/privyx/proxy/__init__.py +14 -0
  225. privyx-0.1.1/src/privyx/proxy/headers.py +99 -0
  226. privyx-0.1.1/src/privyx/proxy/http.py +106 -0
  227. privyx-0.1.1/src/privyx/proxy/schemas.py +288 -0
  228. privyx-0.1.1/src/privyx/proxy/session.py +118 -0
  229. privyx-0.1.1/src/privyx/proxy/sse.py +1 -0
  230. privyx-0.1.1/src/privyx/proxy/stream_router.py +613 -0
  231. privyx-0.1.1/src/privyx/proxy/streaming.py +51 -0
  232. privyx-0.1.1/src/privyx/proxy/transparent.py +404 -0
  233. privyx-0.1.1/src/privyx/security/__init__.py +1 -0
  234. privyx-0.1.1/src/privyx/security/crypto.py +68 -0
  235. privyx-0.1.1/src/privyx/security/keys.py +105 -0
  236. privyx-0.1.1/src/privyx/security/redaction.py +1 -0
  237. privyx-0.1.1/src/privyx/security/secrets.py +1 -0
  238. privyx-0.1.1/src/privyx/streaming/__init__.py +6 -0
  239. privyx-0.1.1/src/privyx/streaming/adapters/__init__.py +4 -0
  240. privyx-0.1.1/src/privyx/streaming/adapters/anthropic.py +59 -0
  241. privyx-0.1.1/src/privyx/streaming/adapters/generic.py +79 -0
  242. privyx-0.1.1/src/privyx/streaming/adapters/openai.py +28 -0
  243. privyx-0.1.1/src/privyx/streaming/adapters/registry.py +41 -0
  244. privyx-0.1.1/src/privyx/streaming/buffer.py +29 -0
  245. privyx-0.1.1/src/privyx/streaming/deanonymizer.py +122 -0
  246. privyx-0.1.1/src/privyx/streaming/events.py +41 -0
  247. privyx-0.1.1/src/privyx/streaming/recognizer.py +85 -0
  248. privyx-0.1.1/src/privyx/streaming/sse.py +147 -0
  249. privyx-0.1.1/src/privyx/streaming/trie.py +111 -0
  250. privyx-0.1.1/src/privyx/token/__init__.py +21 -0
  251. privyx-0.1.1/src/privyx/token/codec.py +316 -0
  252. privyx-0.1.1/src/privyx/token/errors.py +14 -0
  253. privyx-0.1.1/src/privyx/token/model.py +52 -0
  254. privyx-0.1.1/src/privyx/utils/__init__.py +1 -0
  255. privyx-0.1.1/src/privyx/utils/async_.py +53 -0
  256. privyx-0.1.1/src/privyx/utils/ids.py +29 -0
  257. privyx-0.1.1/src/privyx/utils/json.py +47 -0
  258. privyx-0.1.1/src/privyx/vault/__init__.py +1 -0
  259. privyx-0.1.1/src/privyx/vault/base.py +44 -0
  260. privyx-0.1.1/src/privyx/vault/memory.py +41 -0
  261. privyx-0.1.1/src/privyx/vault/models.py +32 -0
  262. privyx-0.1.1/src/privyx/vault/redis.py +62 -0
  263. privyx-0.1.1/src/privyx/vault/sqlite.py +92 -0
  264. privyx-0.1.1/src/privyx/version.py +3 -0
  265. privyx-0.1.1/tests/fixtures/__init__.py +1 -0
  266. privyx-0.1.1/tests/fixtures/payloads/__init__.py +1 -0
  267. privyx-0.1.1/tests/fixtures/sse/__init__.py +1 -0
  268. privyx-0.1.1/tests/integration/__init__.py +1 -0
  269. privyx-0.1.1/tests/integration/test_anthropic.py +196 -0
  270. privyx-0.1.1/tests/integration/test_gateway_app.py +283 -0
  271. privyx-0.1.1/tests/integration/test_openai.py +237 -0
  272. privyx-0.1.1/tests/integration/test_proxy.py +389 -0
  273. privyx-0.1.1/tests/integration/test_streaming.py +51 -0
  274. privyx-0.1.1/tests/integration/test_transparent.py +541 -0
  275. privyx-0.1.1/tests/integration/test_transparent_app.py +190 -0
  276. privyx-0.1.1/tests/property/__init__.py +5 -0
  277. privyx-0.1.1/tests/property/test_chunk_boundaries.py +39 -0
  278. privyx-0.1.1/tests/property/test_encrypt_stream_equivalence.py +118 -0
  279. privyx-0.1.1/tests/property/test_faker_stream_equivalence.py +123 -0
  280. privyx-0.1.1/tests/property/test_stream_equivalence.py +317 -0
  281. privyx-0.1.1/tests/property/test_token_stream.py +114 -0
  282. privyx-0.1.1/tests/unit/cli/__init__.py +0 -0
  283. privyx-0.1.1/tests/unit/cli/test_commands.py +552 -0
  284. privyx-0.1.1/tests/unit/config/__init__.py +0 -0
  285. privyx-0.1.1/tests/unit/config/test_default_config.py +80 -0
  286. privyx-0.1.1/tests/unit/config/test_loader.py +63 -0
  287. privyx-0.1.1/tests/unit/config/test_tls.py +59 -0
  288. privyx-0.1.1/tests/unit/observability/__init__.py +0 -0
  289. privyx-0.1.1/tests/unit/observability/test_audit.py +272 -0
  290. privyx-0.1.1/tests/unit/observability/test_logging.py +115 -0
  291. privyx-0.1.1/tests/unit/plugins/__init__.py +0 -0
  292. privyx-0.1.1/tests/unit/plugins/test_loader.py +321 -0
  293. privyx-0.1.1/tests/unit/privacy/__init__.py +1 -0
  294. privyx-0.1.1/tests/unit/privacy/test_cached_detector.py +182 -0
  295. privyx-0.1.1/tests/unit/privacy/test_detector.py +172 -0
  296. privyx-0.1.1/tests/unit/privacy/test_encrypt_operator.py +166 -0
  297. privyx-0.1.1/tests/unit/privacy/test_engine.py +194 -0
  298. privyx-0.1.1/tests/unit/privacy/test_faker_operator.py +149 -0
  299. privyx-0.1.1/tests/unit/privacy/test_llm_detector.py +128 -0
  300. privyx-0.1.1/tests/unit/privacy/test_operators.py +223 -0
  301. privyx-0.1.1/tests/unit/privacy/test_presidio_detector.py +96 -0
  302. privyx-0.1.1/tests/unit/providers/__init__.py +1 -0
  303. privyx-0.1.1/tests/unit/providers/test_registry.py +99 -0
  304. privyx-0.1.1/tests/unit/proxy/__init__.py +0 -0
  305. privyx-0.1.1/tests/unit/proxy/test_headers.py +79 -0
  306. privyx-0.1.1/tests/unit/proxy/test_schemas.py +611 -0
  307. privyx-0.1.1/tests/unit/proxy/test_session.py +212 -0
  308. privyx-0.1.1/tests/unit/proxy/test_stream_router.py +525 -0
  309. privyx-0.1.1/tests/unit/security/__init__.py +0 -0
  310. privyx-0.1.1/tests/unit/security/test_keys.py +33 -0
  311. privyx-0.1.1/tests/unit/streaming/__init__.py +1 -0
  312. privyx-0.1.1/tests/unit/streaming/test_deanonymizer.py +74 -0
  313. privyx-0.1.1/tests/unit/streaming/test_sse.py +66 -0
  314. privyx-0.1.1/tests/unit/tokens/__init__.py +0 -0
  315. privyx-0.1.1/tests/unit/tokens/test_codec.py +190 -0
  316. privyx-0.1.1/tests/unit/vault/__init__.py +1 -0
  317. privyx-0.1.1/tests/unit/vault/test_memory.py +45 -0
  318. 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/
@@ -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/vault/memory.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['memory']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/providers/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/streaming/sse.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [':', 'data', 'event', 'id', 'retry']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/detector/llm.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [1024, ', ', 'AsyncAnthropic', 'AsyncOpenAI', 'anthropic', 'content', 'gpt-4o-mini', 'llm', 'openai', 'role', 'text', 'user']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/streaming/adapters/openai.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['0', 'choices', 'content', 'delta', 'openai', 'responses']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/detector/builtin.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['+', 'CREDIT_CARD', 'EMAIL', 'IP_ADDRESS', 'PHONE', 'SSN', 'regex', 'value', 'yaml']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/security/keys.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [384, '.config', 'XDG_CONFIG_HOME', 'anchor.key', 'privyx', 'utf-8', '~']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/token/model.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [' \t\r\n\x0c\x0b\x00', 'identifier', 'namespace', 'type']
@@ -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/providers/generic.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [60.0, '/', 'Accept', 'Authorization', 'POST', 'content-type', 'generic', 'text/event-stream']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/streaming/recognizer.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/operator/base.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['token']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/policy/default.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['default']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/version.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['0.1.1']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/observability/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['AuditEvent', 'AuditEventType', 'AuditLogger', 'SCHEMA_VERSION', 'configure_logging']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/utils/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -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/gateway/transparent.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['/health', '/{path:path}', '0.1.0', 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'Privyx (transparent)', 'ok', 'status', 'x-privyx-session']
@@ -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/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['PrivacyEngine', 'Session', '__version__']
@@ -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/providers/base.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['generic']
@@ -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/token/errors.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -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/streaming/adapters/anthropic.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [',', ':', 'anthropic', 'content_block_delta', 'delta', 'text', 'text_delta', 'type']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/cli/commands/config.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['--config', '--path', '--show', '-c', 'Config file path', 'PRIVYX_CONFIG', 'config', 'config_path', 'defaults']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/security/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /usr/lib/python3.12/sitecustomize.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/cli/commands/session.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['*', '--config', '--reveal', '-c', 'Config file path', 'config_path', 'seconds', 'session', 'session_id']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/config/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/cli/commands/detect.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['--config', '--policy/--no-policy', '--stdin', '--transform', '-c', 'Config file path', 'Read text from stdin', 'config_path', 'text', 'use_stdin']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/operator/encrypt.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['encrypt', 'id']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/operator/hash.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['hash']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/core/result.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ [100, 'CREDIT_CARD', 'EMAIL', 'IP_ADDRESS', 'PHONE', 'SSN', 'ZIPCODE', 'end', 'original', 'replacement', 'start', 'text', 'transformations']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/proxy/streaming.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['aclose']
@@ -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']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/core/errors.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/cli/commands/inspect.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['inspect']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/policy/strict.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['CREDIT_CARD', 'EMAIL', 'IP_ADDRESS', 'PHONE', 'SSN', 'strict']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/providers/registry.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ ['/', '2023-06-01', 'anthropic', 'anthropic-version', 'api_key', 'base_url', 'generic', 'headers', 'openai', 'type', 'x-api-key']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/vault/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/privyx/privyx/src/privyx/privacy/policy/__init__.py
2
+ # hypothesis_version: 6.165.10
3
+
4
+ []