mixin-suite 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. mixin_suite-0.1.0/.dto-strict-baseline-logging.json +1 -0
  2. mixin_suite-0.1.0/.dto-strict-baseline-sensitivity.json +146 -0
  3. mixin_suite-0.1.0/.github/workflows/ci.yml +46 -0
  4. mixin_suite-0.1.0/.github/workflows/cleanup-guard.yml +63 -0
  5. mixin_suite-0.1.0/.github/workflows/dto-strict.yml +41 -0
  6. mixin_suite-0.1.0/.github/workflows/no-ai-attribution.yml +73 -0
  7. mixin_suite-0.1.0/.github/workflows/publish.yml +35 -0
  8. mixin_suite-0.1.0/.github/workflows/ruff.yml +29 -0
  9. mixin_suite-0.1.0/.gitignore +132 -0
  10. mixin_suite-0.1.0/CHANGELOG.md +36 -0
  11. mixin_suite-0.1.0/CODE_OF_CONDUCT.md +31 -0
  12. mixin_suite-0.1.0/CONTRIBUTING.md +66 -0
  13. mixin_suite-0.1.0/LICENSE +201 -0
  14. mixin_suite-0.1.0/PKG-INFO +345 -0
  15. mixin_suite-0.1.0/README.md +298 -0
  16. mixin_suite-0.1.0/SECURITY.md +21 -0
  17. mixin_suite-0.1.0/docs/mixin_logging/CHANGELOG-history.md +127 -0
  18. mixin_suite-0.1.0/docs/mixin_logging/RELEASE_NOTES_0.2.0.md +122 -0
  19. mixin_suite-0.1.0/docs/mixin_logging/RELEASE_NOTES_0.3.0.md +70 -0
  20. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/README.md +114 -0
  21. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/aiohttp.md +70 -0
  22. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/asgi.md +331 -0
  23. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/botocore.md +76 -0
  24. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/celery.md +126 -0
  25. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/cloud.md +121 -0
  26. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/diagrams.md +653 -0
  27. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/graphql.md +100 -0
  28. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/grpc.md +96 -0
  29. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/httpx.md +148 -0
  30. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/proposed-adapters.md +55 -0
  31. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/requests.md +74 -0
  32. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/stdlib.md +158 -0
  33. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/urllib3.md +64 -0
  34. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/websocket.md +77 -0
  35. mixin_suite-0.1.0/docs/mixin_logging/apps/adapters/wsgi.md +136 -0
  36. mixin_suite-0.1.0/docs/mixin_logging/apps/context/correlation.md +250 -0
  37. mixin_suite-0.1.0/docs/mixin_logging/apps/context/diagrams.md +142 -0
  38. mixin_suite-0.1.0/docs/mixin_logging/apps/decorators/diagrams.md +122 -0
  39. mixin_suite-0.1.0/docs/mixin_logging/apps/decorators/logged.md +347 -0
  40. mixin_suite-0.1.0/docs/mixin_logging/apps/mixin/mixin.md +174 -0
  41. mixin_suite-0.1.0/docs/mixin_logging/apps/security-audit.md +353 -0
  42. mixin_suite-0.1.0/docs/mixin_logging/architecture/architecture.md +352 -0
  43. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-05-27-wsgi-adapter-security-audit.md +270 -0
  44. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-05-28-httpx-adapter-security-audit.md +223 -0
  45. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-asgi-adapter-security-audit.md +317 -0
  46. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-botocore-adapter-security-audit.md +171 -0
  47. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-celery-adapter-security-audit.md +174 -0
  48. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-cloud-adapter-security-audit.md +222 -0
  49. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-requests-adapter-security-audit.md +187 -0
  50. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-restructure-conformance-security-audit.md +504 -0
  51. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-04-stdlib-adapter-security-audit.md +191 -0
  52. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-09-standards-sweep-round2-security-audit.md +381 -0
  53. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-09-standards-sweep-security-audit.md +355 -0
  54. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-19-aiohttp-adapter-security-audit.md +209 -0
  55. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-19-graphql-adapter-security-audit.md +193 -0
  56. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-19-grpc-adapter-security-audit.md +176 -0
  57. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-19-urllib3-adapter-security-audit.md +191 -0
  58. mixin_suite-0.1.0/docs/mixin_logging/audits/2026-06-19-websocket-adapter-security-audit.md +221 -0
  59. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-05-27-wsgi-adapter-review.md +376 -0
  60. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-05-28-httpx-adapter-review.md +204 -0
  61. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-asgi-adapter-review.md +309 -0
  62. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-botocore-adapter-review.md +222 -0
  63. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-celery-adapter-review.md +228 -0
  64. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-cloud-adapter-review.md +242 -0
  65. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-requests-adapter-review.md +234 -0
  66. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-restructure-conformance-review.md +255 -0
  67. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-04-stdlib-adapter-review.md +194 -0
  68. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-09-standards-sweep-review.md +251 -0
  69. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-09-standards-sweep-round2-review.md +289 -0
  70. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-19-aiohttp-adapter-review.md +238 -0
  71. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-19-graphql-adapter-review.md +228 -0
  72. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-19-grpc-adapter-review.md +250 -0
  73. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-19-urllib3-adapter-review.md +224 -0
  74. mixin_suite-0.1.0/docs/mixin_logging/reviews/2026-06-19-websocket-adapter-review.md +247 -0
  75. mixin_suite-0.1.0/docs/mixin_sensitivity/CHANGELOG-history.md +167 -0
  76. mixin_suite-0.1.0/docs/mixin_sensitivity/STATUS.md +55 -0
  77. mixin_suite-0.1.0/docs/mixin_sensitivity/apps/decorators/compliance.md +98 -0
  78. mixin_suite-0.1.0/docs/mixin_sensitivity/apps/decorators/policies.md +293 -0
  79. mixin_suite-0.1.0/docs/mixin_sensitivity/apps/decorators/sensitive.md +238 -0
  80. mixin_suite-0.1.0/docs/mixin_sensitivity/apps/diagrams.md +195 -0
  81. mixin_suite-0.1.0/docs/mixin_sensitivity/architecture/architecture.md +246 -0
  82. mixin_suite-0.1.0/docs/mixin_sensitivity/audits/.gitkeep +0 -0
  83. mixin_suite-0.1.0/docs/mixin_sensitivity/audits/2026-06-09-decorator-layer-security-audit.md +194 -0
  84. mixin_suite-0.1.0/docs/mixin_sensitivity/reviews/.gitkeep +0 -0
  85. mixin_suite-0.1.0/docs/mixin_sensitivity/reviews/2026-06-09-decorator-layer-review.md +256 -0
  86. mixin_suite-0.1.0/mixin_logging/__init__.py +35 -0
  87. mixin_suite-0.1.0/mixin_logging/adapters/__init__.py +1 -0
  88. mixin_suite-0.1.0/mixin_logging/adapters/aiohttp/__init__.py +13 -0
  89. mixin_suite-0.1.0/mixin_logging/adapters/aiohttp/aiohttp_client.py +33 -0
  90. mixin_suite-0.1.0/mixin_logging/adapters/aiohttp/aiohttp_objects.py +43 -0
  91. mixin_suite-0.1.0/mixin_logging/adapters/asgi/__init__.py +23 -0
  92. mixin_suite-0.1.0/mixin_logging/adapters/asgi/asgi_client.py +60 -0
  93. mixin_suite-0.1.0/mixin_logging/adapters/asgi/asgi_objects.py +69 -0
  94. mixin_suite-0.1.0/mixin_logging/adapters/botocore/__init__.py +18 -0
  95. mixin_suite-0.1.0/mixin_logging/adapters/botocore/botocore_client.py +36 -0
  96. mixin_suite-0.1.0/mixin_logging/adapters/botocore/botocore_objects.py +41 -0
  97. mixin_suite-0.1.0/mixin_logging/adapters/celery/__init__.py +13 -0
  98. mixin_suite-0.1.0/mixin_logging/adapters/celery/celery_client.py +48 -0
  99. mixin_suite-0.1.0/mixin_logging/adapters/celery/celery_objects.py +41 -0
  100. mixin_suite-0.1.0/mixin_logging/adapters/cloud/__init__.py +11 -0
  101. mixin_suite-0.1.0/mixin_logging/adapters/cloud/cloud_client.py +22 -0
  102. mixin_suite-0.1.0/mixin_logging/adapters/cloud/cloud_objects.py +68 -0
  103. mixin_suite-0.1.0/mixin_logging/adapters/constants/__init__.py +1 -0
  104. mixin_suite-0.1.0/mixin_logging/adapters/constants/aiohttp.py +34 -0
  105. mixin_suite-0.1.0/mixin_logging/adapters/constants/asgi.py +54 -0
  106. mixin_suite-0.1.0/mixin_logging/adapters/constants/botocore.py +43 -0
  107. mixin_suite-0.1.0/mixin_logging/adapters/constants/celery.py +40 -0
  108. mixin_suite-0.1.0/mixin_logging/adapters/constants/cloud.py +58 -0
  109. mixin_suite-0.1.0/mixin_logging/adapters/constants/graphql.py +14 -0
  110. mixin_suite-0.1.0/mixin_logging/adapters/constants/grpc.py +32 -0
  111. mixin_suite-0.1.0/mixin_logging/adapters/constants/httpx.py +40 -0
  112. mixin_suite-0.1.0/mixin_logging/adapters/constants/requests.py +34 -0
  113. mixin_suite-0.1.0/mixin_logging/adapters/constants/stdlib.py +20 -0
  114. mixin_suite-0.1.0/mixin_logging/adapters/constants/urllib3.py +34 -0
  115. mixin_suite-0.1.0/mixin_logging/adapters/constants/websocket.py +46 -0
  116. mixin_suite-0.1.0/mixin_logging/adapters/constants/wsgi.py +34 -0
  117. mixin_suite-0.1.0/mixin_logging/adapters/graphql/__init__.py +13 -0
  118. mixin_suite-0.1.0/mixin_logging/adapters/graphql/graphql_client.py +19 -0
  119. mixin_suite-0.1.0/mixin_logging/adapters/graphql/graphql_objects.py +27 -0
  120. mixin_suite-0.1.0/mixin_logging/adapters/grpc/__init__.py +15 -0
  121. mixin_suite-0.1.0/mixin_logging/adapters/grpc/grpc_client.py +28 -0
  122. mixin_suite-0.1.0/mixin_logging/adapters/grpc/grpc_objects.py +44 -0
  123. mixin_suite-0.1.0/mixin_logging/adapters/httpx/__init__.py +19 -0
  124. mixin_suite-0.1.0/mixin_logging/adapters/httpx/httpx_client.py +36 -0
  125. mixin_suite-0.1.0/mixin_logging/adapters/httpx/httpx_objects.py +51 -0
  126. mixin_suite-0.1.0/mixin_logging/adapters/requests/__init__.py +13 -0
  127. mixin_suite-0.1.0/mixin_logging/adapters/requests/requests_client.py +36 -0
  128. mixin_suite-0.1.0/mixin_logging/adapters/requests/requests_objects.py +41 -0
  129. mixin_suite-0.1.0/mixin_logging/adapters/stdlib/__init__.py +9 -0
  130. mixin_suite-0.1.0/mixin_logging/adapters/stdlib/stdlib_client.py +28 -0
  131. mixin_suite-0.1.0/mixin_logging/adapters/tests/__init__.py +0 -0
  132. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_aiohttp/__init__.py +1 -0
  133. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_aiohttp/conftest.py +35 -0
  134. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_aiohttp/test_aiohttp_client.py +89 -0
  135. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_aiohttp/test_aiohttp_objects.py +105 -0
  136. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_asgi/__init__.py +1 -0
  137. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_asgi/conftest.py +248 -0
  138. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_asgi/test_asgi_client.py +221 -0
  139. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_asgi/test_asgi_objects.py +228 -0
  140. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_botocore/__init__.py +0 -0
  141. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_botocore/conftest.py +33 -0
  142. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_botocore/test_botocore_client.py +120 -0
  143. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_botocore/test_botocore_objects.py +103 -0
  144. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_celery/__init__.py +0 -0
  145. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_celery/conftest.py +35 -0
  146. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_celery/test_celery_client.py +201 -0
  147. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_celery/test_celery_objects.py +118 -0
  148. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_cloud/__init__.py +1 -0
  149. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_cloud/conftest.py +17 -0
  150. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_cloud/test_cloud_client.py +201 -0
  151. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_cloud/test_cloud_extraction.py +245 -0
  152. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_cloud/test_cloud_objects.py +94 -0
  153. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_graphql/__init__.py +1 -0
  154. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_graphql/conftest.py +17 -0
  155. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_graphql/test_graphql_client.py +59 -0
  156. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_graphql/test_graphql_objects.py +44 -0
  157. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_grpc/__init__.py +1 -0
  158. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_grpc/conftest.py +17 -0
  159. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_grpc/test_grpc_client.py +175 -0
  160. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_grpc/test_grpc_objects.py +173 -0
  161. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_httpx/__init__.py +1 -0
  162. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_httpx/conftest.py +33 -0
  163. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_httpx/test_httpx_client.py +112 -0
  164. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_httpx/test_httpx_objects.py +98 -0
  165. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_requests/__init__.py +1 -0
  166. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_requests/conftest.py +34 -0
  167. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_requests/test_requests_client.py +149 -0
  168. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_requests/test_requests_objects.py +110 -0
  169. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_stdlib/__init__.py +0 -0
  170. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_stdlib/conftest.py +17 -0
  171. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_stdlib/test_stdlib_client.py +244 -0
  172. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_urllib3/__init__.py +1 -0
  173. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_urllib3/conftest.py +17 -0
  174. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_urllib3/test_urllib3_client.py +231 -0
  175. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_urllib3/test_urllib3_objects.py +110 -0
  176. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_websocket/__init__.py +1 -0
  177. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_websocket/conftest.py +151 -0
  178. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_websocket/test_websocket_client.py +172 -0
  179. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_websocket/test_websocket_objects.py +169 -0
  180. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_wsgi/__init__.py +1 -0
  181. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_wsgi/conftest.py +116 -0
  182. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_wsgi/test_wsgi_client.py +171 -0
  183. mixin_suite-0.1.0/mixin_logging/adapters/tests/test_wsgi/test_wsgi_objects.py +75 -0
  184. mixin_suite-0.1.0/mixin_logging/adapters/urllib3/__init__.py +13 -0
  185. mixin_suite-0.1.0/mixin_logging/adapters/urllib3/urllib3_client.py +30 -0
  186. mixin_suite-0.1.0/mixin_logging/adapters/urllib3/urllib3_objects.py +43 -0
  187. mixin_suite-0.1.0/mixin_logging/adapters/websocket/__init__.py +15 -0
  188. mixin_suite-0.1.0/mixin_logging/adapters/websocket/websocket_client.py +38 -0
  189. mixin_suite-0.1.0/mixin_logging/adapters/websocket/websocket_objects.py +50 -0
  190. mixin_suite-0.1.0/mixin_logging/adapters/wsgi/__init__.py +25 -0
  191. mixin_suite-0.1.0/mixin_logging/adapters/wsgi/wsgi_client.py +57 -0
  192. mixin_suite-0.1.0/mixin_logging/adapters/wsgi/wsgi_objects.py +52 -0
  193. mixin_suite-0.1.0/mixin_logging/common/__init__.py +7 -0
  194. mixin_suite-0.1.0/mixin_logging/common/constants/__init__.py +7 -0
  195. mixin_suite-0.1.0/mixin_logging/common/constants/public_api.py +24 -0
  196. mixin_suite-0.1.0/mixin_logging/common/constants/tests.py +129 -0
  197. mixin_suite-0.1.0/mixin_logging/common/tests/__init__.py +5 -0
  198. mixin_suite-0.1.0/mixin_logging/common/tests/conftest.py +17 -0
  199. mixin_suite-0.1.0/mixin_logging/common/tests/test_public_api.py +96 -0
  200. mixin_suite-0.1.0/mixin_logging/common/tests/test_record_collector.py +97 -0
  201. mixin_suite-0.1.0/mixin_logging/common/tests/test_version_lockstep.py +30 -0
  202. mixin_suite-0.1.0/mixin_logging/common/utils/__init__.py +1 -0
  203. mixin_suite-0.1.0/mixin_logging/common/utils/record_collector.py +20 -0
  204. mixin_suite-0.1.0/mixin_logging/config/__init__.py +1 -0
  205. mixin_suite-0.1.0/mixin_logging/config/_version.py +3 -0
  206. mixin_suite-0.1.0/mixin_logging/context/__init__.py +1 -0
  207. mixin_suite-0.1.0/mixin_logging/context/constants/__init__.py +1 -0
  208. mixin_suite-0.1.0/mixin_logging/context/constants/correlation.py +22 -0
  209. mixin_suite-0.1.0/mixin_logging/context/correlation/__init__.py +19 -0
  210. mixin_suite-0.1.0/mixin_logging/context/correlation/correlation_client.py +40 -0
  211. mixin_suite-0.1.0/mixin_logging/context/correlation/correlation_objects.py +17 -0
  212. mixin_suite-0.1.0/mixin_logging/context/tests/__init__.py +1 -0
  213. mixin_suite-0.1.0/mixin_logging/context/tests/test_correlation/__init__.py +1 -0
  214. mixin_suite-0.1.0/mixin_logging/context/tests/test_correlation/conftest.py +20 -0
  215. mixin_suite-0.1.0/mixin_logging/context/tests/test_correlation/test_correlation_client.py +102 -0
  216. mixin_suite-0.1.0/mixin_logging/context/tests/test_correlation/test_correlation_objects.py +44 -0
  217. mixin_suite-0.1.0/mixin_logging/decorators/__init__.py +1 -0
  218. mixin_suite-0.1.0/mixin_logging/decorators/constants/__init__.py +1 -0
  219. mixin_suite-0.1.0/mixin_logging/decorators/constants/decorators.py +56 -0
  220. mixin_suite-0.1.0/mixin_logging/decorators/logged/__init__.py +15 -0
  221. mixin_suite-0.1.0/mixin_logging/decorators/logged/logged_client.py +142 -0
  222. mixin_suite-0.1.0/mixin_logging/decorators/logged/logged_objects.py +29 -0
  223. mixin_suite-0.1.0/mixin_logging/decorators/tests/__init__.py +1 -0
  224. mixin_suite-0.1.0/mixin_logging/decorators/tests/test_logged/__init__.py +1 -0
  225. mixin_suite-0.1.0/mixin_logging/decorators/tests/test_logged/conftest.py +59 -0
  226. mixin_suite-0.1.0/mixin_logging/decorators/tests/test_logged/test_logged_client.py +579 -0
  227. mixin_suite-0.1.0/mixin_logging/decorators/tests/test_logged/test_logged_objects.py +32 -0
  228. mixin_suite-0.1.0/mixin_logging/mixin/__init__.py +1 -0
  229. mixin_suite-0.1.0/mixin_logging/mixin/mixin.py +52 -0
  230. mixin_suite-0.1.0/mixin_logging/mixin/tests/__init__.py +1 -0
  231. mixin_suite-0.1.0/mixin_logging/mixin/tests/test_mixin/__init__.py +1 -0
  232. mixin_suite-0.1.0/mixin_logging/mixin/tests/test_mixin/conftest.py +43 -0
  233. mixin_suite-0.1.0/mixin_logging/mixin/tests/test_mixin/test_mixin.py +242 -0
  234. mixin_suite-0.1.0/mixin_logging/py.typed +0 -0
  235. mixin_suite-0.1.0/mixin_sensitivity/__init__.py +35 -0
  236. mixin_suite-0.1.0/mixin_sensitivity/common/__init__.py +1 -0
  237. mixin_suite-0.1.0/mixin_sensitivity/common/constants/__init__.py +1 -0
  238. mixin_suite-0.1.0/mixin_sensitivity/common/constants/metadata.py +9 -0
  239. mixin_suite-0.1.0/mixin_sensitivity/config/__init__.py +1 -0
  240. mixin_suite-0.1.0/mixin_sensitivity/config/_version.py +3 -0
  241. mixin_suite-0.1.0/mixin_sensitivity/decorators/__init__.py +1 -0
  242. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/__init__.py +1 -0
  243. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/compliance/__init__.py +8 -0
  244. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/compliance/compliance_objects.py +27 -0
  245. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/pci_aware/__init__.py +7 -0
  246. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/pci_aware/pci_aware_objects.py +25 -0
  247. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/phi_aware/__init__.py +7 -0
  248. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/phi_aware/phi_aware_objects.py +25 -0
  249. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/pii_aware/__init__.py +7 -0
  250. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/pii_aware/pii_aware_objects.py +25 -0
  251. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/secret_aware/__init__.py +7 -0
  252. mixin_suite-0.1.0/mixin_sensitivity/decorators/classes/secret_aware/secret_aware_objects.py +25 -0
  253. mixin_suite-0.1.0/mixin_sensitivity/decorators/constants/__init__.py +6 -0
  254. mixin_suite-0.1.0/mixin_sensitivity/decorators/constants/sensitive.py +20 -0
  255. mixin_suite-0.1.0/mixin_sensitivity/decorators/sensitive/__init__.py +9 -0
  256. mixin_suite-0.1.0/mixin_sensitivity/decorators/sensitive/sensitive_client.py +47 -0
  257. mixin_suite-0.1.0/mixin_sensitivity/decorators/sensitive/sensitive_objects.py +54 -0
  258. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/__init__.py +1 -0
  259. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_compliance/__init__.py +1 -0
  260. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_compliance/test_compliance_objects.py +80 -0
  261. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_pci_aware/__init__.py +1 -0
  262. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_pci_aware/conftest.py +40 -0
  263. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_pci_aware/test_pci_aware_objects.py +142 -0
  264. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_phi_aware/__init__.py +1 -0
  265. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_phi_aware/conftest.py +40 -0
  266. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_phi_aware/test_phi_aware_objects.py +159 -0
  267. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_pii_aware/__init__.py +1 -0
  268. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_pii_aware/conftest.py +40 -0
  269. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_pii_aware/test_pii_aware_objects.py +152 -0
  270. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_secret_aware/__init__.py +1 -0
  271. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_secret_aware/conftest.py +40 -0
  272. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_secret_aware/test_secret_aware_objects.py +154 -0
  273. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_sensitive/__init__.py +1 -0
  274. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_sensitive/conftest.py +160 -0
  275. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_sensitive/test_sensitive_client.py +386 -0
  276. mixin_suite-0.1.0/mixin_sensitivity/decorators/tests/test_sensitive/test_sensitive_objects.py +280 -0
  277. mixin_suite-0.1.0/mixin_sensitivity/py.typed +0 -0
  278. mixin_suite-0.1.0/mixin_sensitivity/services/__init__.py +1 -0
  279. mixin_suite-0.1.0/mixin_sensitivity/services/classify/__init__.py +10 -0
  280. mixin_suite-0.1.0/mixin_sensitivity/services/classify/classify_objects.py +57 -0
  281. mixin_suite-0.1.0/mixin_sensitivity/services/tests/__init__.py +1 -0
  282. mixin_suite-0.1.0/mixin_sensitivity/services/tests/test_classify/__init__.py +1 -0
  283. mixin_suite-0.1.0/mixin_sensitivity/services/tests/test_classify/conftest.py +39 -0
  284. mixin_suite-0.1.0/mixin_sensitivity/services/tests/test_classify/test_classify_objects.py +224 -0
  285. mixin_suite-0.1.0/pyproject.toml +133 -0
  286. mixin_suite-0.1.0/uv.lock +1635 -0
@@ -0,0 +1,146 @@
1
+ [
2
+ {
3
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
4
+ "line": 53,
5
+ "rule_id": "R006",
6
+ "message_hash": "39b463494516fb5c"
7
+ },
8
+ {
9
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
10
+ "line": 65,
11
+ "rule_id": "R006",
12
+ "message_hash": "37c78a1c852ac406"
13
+ },
14
+ {
15
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
16
+ "line": 71,
17
+ "rule_id": "R006",
18
+ "message_hash": "4d66a7f76f0b8142"
19
+ },
20
+ {
21
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
22
+ "line": 78,
23
+ "rule_id": "R006",
24
+ "message_hash": "e38d0ab3ae95054d"
25
+ },
26
+ {
27
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
28
+ "line": 83,
29
+ "rule_id": "R006",
30
+ "message_hash": "78e3e37712fc6cdc"
31
+ },
32
+ {
33
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
34
+ "line": 92,
35
+ "rule_id": "R006",
36
+ "message_hash": "5dbb4c7caa740013"
37
+ },
38
+ {
39
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
40
+ "line": 97,
41
+ "rule_id": "R006",
42
+ "message_hash": "810d0b1711b3728f"
43
+ },
44
+ {
45
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
46
+ "line": 106,
47
+ "rule_id": "R006",
48
+ "message_hash": "da6acb9bba813646"
49
+ },
50
+ {
51
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
52
+ "line": 114,
53
+ "rule_id": "R006",
54
+ "message_hash": "b5c9541f4b583f79"
55
+ },
56
+ {
57
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
58
+ "line": 120,
59
+ "rule_id": "R006",
60
+ "message_hash": "e5853e74f7f10616"
61
+ },
62
+ {
63
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
64
+ "line": 126,
65
+ "rule_id": "R006",
66
+ "message_hash": "7100018b46f528a3"
67
+ },
68
+ {
69
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
70
+ "line": 136,
71
+ "rule_id": "R006",
72
+ "message_hash": "bec8441895ed99c0"
73
+ },
74
+ {
75
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
76
+ "line": 144,
77
+ "rule_id": "R006",
78
+ "message_hash": "fef9dc34415dd616"
79
+ },
80
+ {
81
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
82
+ "line": 156,
83
+ "rule_id": "R006",
84
+ "message_hash": "82438a23ee521717"
85
+ },
86
+ {
87
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
88
+ "line": 164,
89
+ "rule_id": "R006",
90
+ "message_hash": "06595d06e49cd4c5"
91
+ },
92
+ {
93
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
94
+ "line": 174,
95
+ "rule_id": "R006",
96
+ "message_hash": "c4e29e4707a9cb7e"
97
+ },
98
+ {
99
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
100
+ "line": 183,
101
+ "rule_id": "R006",
102
+ "message_hash": "634023a21a0974a9"
103
+ },
104
+ {
105
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
106
+ "line": 189,
107
+ "rule_id": "R006",
108
+ "message_hash": "b9f518ea552964c2"
109
+ },
110
+ {
111
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
112
+ "line": 197,
113
+ "rule_id": "R006",
114
+ "message_hash": "b086131bcca486ac"
115
+ },
116
+ {
117
+ "file": "mixin_sensitivity/services/tests/test_classify/test_classify_objects.py",
118
+ "line": 213,
119
+ "rule_id": "R006",
120
+ "message_hash": "9e392fa5d8f12015"
121
+ },
122
+ {
123
+ "file": "mixin_sensitivity/services/tests/test_classify/conftest.py",
124
+ "line": 14,
125
+ "rule_id": "R004",
126
+ "message_hash": "13870fe286b5c275"
127
+ },
128
+ {
129
+ "file": "mixin_sensitivity/services/tests/test_classify/conftest.py",
130
+ "line": 30,
131
+ "rule_id": "R004",
132
+ "message_hash": "bcac4a2b08030260"
133
+ },
134
+ {
135
+ "file": "mixin_sensitivity/services/tests/test_classify/conftest.py",
136
+ "line": 14,
137
+ "rule_id": "R006",
138
+ "message_hash": "b609d7d3a45d294f"
139
+ },
140
+ {
141
+ "file": "mixin_sensitivity/services/tests/test_classify/conftest.py",
142
+ "line": 30,
143
+ "rule_id": "R006",
144
+ "message_hash": "f4bf89fc2ddf3bc8"
145
+ }
146
+ ]
@@ -0,0 +1,46 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ test:
17
+ runs-on: ubuntu-latest
18
+ strategy:
19
+ matrix:
20
+ python-version: ["3.11", "3.12"]
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+ - uses: astral-sh/setup-uv@v4
24
+ with:
25
+ enable-cache: true
26
+ - name: Install Python
27
+ run: uv python install ${{ matrix.python-version }}
28
+ - name: Sync dependencies
29
+ run: uv sync --all-extras
30
+ - name: Test
31
+ run: uv run pytest -v --cov --cov-fail-under=95
32
+
33
+ mypy:
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - uses: astral-sh/setup-uv@v4
38
+ with:
39
+ enable-cache: true
40
+ - name: Install Python 3.12
41
+ run: uv python install 3.12
42
+ - name: Sync dependencies
43
+ run: uv sync --all-extras
44
+ - name: Type-check
45
+ run: uv run mypy mixin_logging/ mixin_sensitivity/
46
+
@@ -0,0 +1,63 @@
1
+ name: Cleanup Guard
2
+
3
+ on:
4
+ pull_request
5
+
6
+ jobs:
7
+ adapter-documentation:
8
+ name: Verify all adapters have audit and review docs
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - name: Check adapter documentation completeness
13
+ run: |
14
+ set -e
15
+
16
+ echo "Checking that all adapter packages have audit and review documentation..."
17
+
18
+ ADAPTERS_DIR="mixin_logging/adapters"
19
+ AUDITS_DIR="docs/mixin_logging/audits"
20
+ REVIEWS_DIR="docs/mixin_logging/reviews"
21
+
22
+ if [ ! -d "$ADAPTERS_DIR" ]; then
23
+ echo "ERROR: Adapters directory not found: $ADAPTERS_DIR"
24
+ exit 1
25
+ fi
26
+
27
+ # Find all adapter directories (exclude non-adapter dirs like constants, tests, __pycache__)
28
+ ADAPTERS=$(find "$ADAPTERS_DIR" -maxdepth 1 -type d ! -name "__pycache__" ! -name "tests" ! -name "constants" ! -name "adapters" ! -path "$ADAPTERS_DIR")
29
+
30
+ MISSING_DOCS=0
31
+
32
+ for adapter_dir in $ADAPTERS; do
33
+ adapter_name=$(basename "$adapter_dir")
34
+
35
+ # Skip if no adapter files (empty directory)
36
+ if [ -z "$(find "$adapter_dir" -maxdepth 1 -type f -name "*.py")" ]; then
37
+ continue
38
+ fi
39
+
40
+ audit_file=$(find "$AUDITS_DIR" -name "*$adapter_name*audit*" 2>/dev/null | head -1)
41
+ review_file=$(find "$REVIEWS_DIR" -name "*$adapter_name*review*" 2>/dev/null | head -1)
42
+
43
+ if [ -z "$audit_file" ]; then
44
+ echo "FAIL: Adapter '$adapter_name' missing audit doc in docs/mixin_logging/audits"
45
+ MISSING_DOCS=$((MISSING_DOCS + 1))
46
+ fi
47
+
48
+ if [ -z "$review_file" ]; then
49
+ echo "FAIL: Adapter '$adapter_name' missing review doc in docs/mixin_logging/reviews"
50
+ MISSING_DOCS=$((MISSING_DOCS + 1))
51
+ fi
52
+ done
53
+
54
+ if [ $MISSING_DOCS -gt 0 ]; then
55
+ echo ""
56
+ echo "ERROR: $MISSING_DOCS adapter(s) missing documentation."
57
+ echo "Each adapter under mixin_logging/adapters/<name>/ must have:"
58
+ echo " - docs/mixin_logging/audits/*<name>*audit*.md"
59
+ echo " - docs/mixin_logging/reviews/*<name>*review*.md"
60
+ exit 1
61
+ fi
62
+
63
+ echo "✓ All adapter packages have corresponding audit and review docs."
@@ -0,0 +1,41 @@
1
+ name: dto-strict
2
+
3
+ # DTO-discipline lint (frozen+slots, facade-ban, R001-R006). Per-repo copy of
4
+ # the canonical gate; runs on the root-layout package. Empty baseline at
5
+ # v0.2.0 (clean rebuild — 0 violations).
6
+ # Lint step: whole package (native test-file exemption via R007/R008 rules).
7
+ # LOC-cap step: source dirs only (test density exempt from cap per review record).
8
+
9
+ on:
10
+ pull_request:
11
+ push:
12
+ branches: [main]
13
+
14
+ concurrency:
15
+ group: ${{ github.workflow }}-${{ github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ permissions:
19
+ contents: read
20
+
21
+ jobs:
22
+ lint:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ - uses: astral-sh/setup-uv@v4
27
+ with:
28
+ enable-cache: true
29
+ - name: Install Python 3.12
30
+ run: uv python install 3.12
31
+ - name: Run dto-strict
32
+ run: |
33
+ echo "=== dto-strict: mixin_logging ===" && \
34
+ uvx --python 3.12 dto-strict@0.3.0 mixin_logging/ --baseline .dto-strict-baseline-logging.json --format github && \
35
+ echo "=== dto-strict: mixin_sensitivity ===" && \
36
+ uvx --python 3.12 dto-strict@0.3.0 mixin_sensitivity/ --baseline .dto-strict-baseline-sensitivity.json --format github
37
+ - name: Check LOC cap
38
+ run: |
39
+ for dir in mixin_logging/adapters/{aiohttp,asgi,botocore,celery,cloud,constants,graphql,grpc,httpx,requests,stdlib,urllib3,websocket,wsgi} mixin_logging/common/{constants,utils} mixin_logging/config mixin_logging/context/{constants,correlation} mixin_logging/decorators/{constants,logged} mixin_logging/mixin mixin_sensitivity/common/{constants,utils} mixin_sensitivity/config mixin_sensitivity/decorators/{constants,phi_aware,pci_aware,pii_aware,secret_aware,sensitive} mixin_sensitivity/services/{classify,mask}; do
40
+ uvx --python 3.12 dto-strict@0.3.0 loc-cap "$dir"
41
+ done
@@ -0,0 +1,73 @@
1
+ name: Attribution Gate
2
+
3
+ # Server-side enforcement: rejects pushes/PRs whose commit messages contain
4
+ # Claude/Anthropic attribution. Catches GitHub squash-merge propagation that
5
+ # bypasses local commit-msg, pre-push, and PreToolUse hooks.
6
+ #
7
+ # Per-repo copy of the canonical attribution gate.
8
+
9
+ on:
10
+ push:
11
+ pull_request:
12
+
13
+ permissions:
14
+ contents: read
15
+ pull-requests: read
16
+
17
+ jobs:
18
+ scan:
19
+ name: Scan commit messages for attribution
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - name: Checkout (full history)
23
+ uses: actions/checkout@v4
24
+ with:
25
+ fetch-depth: 0
26
+
27
+ - name: Determine commit range
28
+ id: range
29
+ env:
30
+ EVENT_NAME: ${{ github.event_name }}
31
+ PR_BASE: ${{ github.event.pull_request.base.sha }}
32
+ PR_HEAD: ${{ github.event.pull_request.head.sha }}
33
+ PUSH_BEFORE: ${{ github.event.before }}
34
+ PUSH_AFTER: ${{ github.event.after }}
35
+ run: |
36
+ set -euo pipefail
37
+ if [ "$EVENT_NAME" = "pull_request" ]; then
38
+ BASE="$PR_BASE"
39
+ HEAD="$PR_HEAD"
40
+ else
41
+ BASE="$PUSH_BEFORE"
42
+ HEAD="$PUSH_AFTER"
43
+ if [ "$BASE" = "0000000000000000000000000000000000000000" ] || [ -z "$BASE" ]; then
44
+ git fetch origin main:refs/remotes/origin/main 2>/dev/null || true
45
+ BASE=$(git merge-base origin/main "$HEAD" 2>/dev/null || git rev-list --max-parents=0 "$HEAD" | tail -1)
46
+ fi
47
+ fi
48
+ echo "base=$BASE" >> "$GITHUB_OUTPUT"
49
+ echo "head=$HEAD" >> "$GITHUB_OUTPUT"
50
+
51
+ - name: Scan for Claude/Anthropic attribution
52
+ env:
53
+ BASE: ${{ steps.range.outputs.base }}
54
+ HEAD: ${{ steps.range.outputs.head }}
55
+ PATTERN: 'co-authored-by.*(claude|anthropic)|generated with claude|@claude|noreply@anthropic|🤖'
56
+ run: |
57
+ set -uo pipefail
58
+ OFFENDING=""
59
+ for sha in $(git rev-list "$BASE..$HEAD"); do
60
+ MSG=$(git log -1 --pretty=format:"%B" "$sha")
61
+ if echo "$MSG" | grep -qiE "$PATTERN"; then
62
+ AUTHOR=$(git log -1 --pretty=format:"%an" "$sha")
63
+ SUBJECT=$(git log -1 --pretty=format:"%s" "$sha")
64
+ OFFENDING="${OFFENDING} ${sha:0:8} | author=${AUTHOR} | ${SUBJECT}"$'\n'
65
+ fi
66
+ done
67
+ if [ -n "$OFFENDING" ]; then
68
+ echo "::error::Claude/Anthropic attribution detected in commit messages"
69
+ echo "Offending commits in range $BASE..$HEAD:"
70
+ printf '%s' "$OFFENDING"
71
+ exit 1
72
+ fi
73
+ echo "OK: no attribution detected in $BASE..$HEAD"
@@ -0,0 +1,35 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish:
9
+ name: Build + publish
10
+ runs-on: ubuntu-latest
11
+ environment: pypi # second-layer GitHub deployment-environment gate
12
+ permissions:
13
+ id-token: write # OIDC trusted publisher
14
+ contents: read
15
+
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: '3.12'
24
+
25
+ - name: Install build deps
26
+ run: python -m pip install --upgrade build
27
+
28
+ - name: Build sdist + wheel
29
+ run: python -m build
30
+
31
+ - name: Verify artifacts
32
+ run: python -m pip install --upgrade twine && python -m twine check dist/*
33
+
34
+ - name: Publish to PyPI
35
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,29 @@
1
+ name: Ruff
2
+
3
+ # Ruff lint + format check. Pinned to 0.15.14 to match local version.
4
+ # Format drift was previously undetected; this gate prevents future drift.
5
+
6
+ on:
7
+ pull_request:
8
+ push:
9
+ branches: [main]
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ jobs:
19
+ ruff:
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+ - uses: astral-sh/setup-uv@v4
24
+ with:
25
+ enable-cache: true
26
+ - name: Ruff lint
27
+ run: uvx ruff@0.15.14 check .
28
+ - name: Ruff format check
29
+ run: uvx ruff@0.15.14 format --check .
@@ -0,0 +1,132 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
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
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .nox/
42
+ .coverage
43
+ .coverage.*
44
+ .cache
45
+ nosetests.xml
46
+ coverage.xml
47
+ *.cover
48
+ *.py,cover
49
+ .hypothesis/
50
+ .pytest_cache/
51
+
52
+ # Translations
53
+ *.mo
54
+ *.pot
55
+
56
+ # Django stuff:
57
+ *.log
58
+ local_settings.py
59
+ db.sqlite3
60
+ db.sqlite3-journal
61
+
62
+ # Flask stuff:
63
+ instance/
64
+ .webassets-cache
65
+
66
+ # Scrapy stuff:
67
+ .scrapy
68
+
69
+ # Sphinx documentation
70
+ docs/_build/
71
+
72
+ # PyBuilder
73
+ target/
74
+
75
+ # Jupyter Notebook
76
+ .ipynb_checkpoints
77
+
78
+ # IPython
79
+ profile_default/
80
+ ipython_config.py
81
+
82
+ # pyenv
83
+ .python-version
84
+
85
+ # pipenv
86
+ Pipfile.lock
87
+
88
+ # PEP 582
89
+ __pypackages__/
90
+
91
+ # Celery stuff
92
+ celerybeat-schedule
93
+ celerybeat.pid
94
+
95
+ # SageMath parsed files
96
+ *.sage.py
97
+
98
+ # Environments
99
+ .env
100
+ .venv
101
+ env/
102
+ venv/
103
+ ENV/
104
+ env.bak/
105
+ venv.bak/
106
+
107
+ # Spyder project settings
108
+ .spyderproject
109
+ .spyproject
110
+
111
+ # Rope project settings
112
+ .ropeproject
113
+
114
+ # mkdocs documentation
115
+ /site
116
+
117
+ # mypy
118
+ .mypy_cache/
119
+ .dmypy.json
120
+ dmypy.json
121
+
122
+ # Pyre type checker
123
+ .pyre/
124
+
125
+
126
+ # IDE
127
+ .vscode/
128
+ .idea/
129
+ *.swp
130
+ *.swo
131
+ *~
132
+ .DS_Store
@@ -0,0 +1,36 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0]
11
+
12
+ ### Added
13
+
14
+ - **Consolidation of mixin-logging and mixin-sensitivity into a single distribution.**
15
+ - This release combines two independently-maintained packages: mixin-logging (v0.6.0) and mixin-sensitivity (v0.4.0).
16
+ - Both packages retain their original import roots: `mixin_logging` and `mixin_sensitivity`.
17
+ - The unified distribution provides composable mixins for structured logging with correlation-ID propagation and sensitive-data classification.
18
+
19
+ ### Includes
20
+
21
+ - **mixin-logging features** (v0.6.0): End-to-end correlation-ID propagation via 13 adapters (ASGI, WSGI, WebSocket, gRPC, GraphQL, Stdlib, HTTPX, Requests, aiohttp, urllib3, Botocore, Celery, Cloud). Class-level and method-level `@logged` decorators. Correlation-ID context propagation across async/await and task boundaries.
22
+
23
+ - **mixin-sensitivity features** (v0.4.0): Decorator-based sensitivity classification and masking for frozen dataclasses. Taxonomy support: PHI, PII, PCI, SECRET. Automatic masking in repr and introspection via `classify()`. Zero runtime dependencies.
24
+
25
+ ### References
26
+
27
+ - Historical mixin-logging changelog: see `docs/mixin_logging/CHANGELOG-history.md`
28
+ - Historical mixin-sensitivity changelog: see `docs/mixin_sensitivity/CHANGELOG-history.md`
29
+
30
+ ### Note
31
+
32
+ The original distributions remain live on PyPI:
33
+ - `mixin-logging` (v0.6.0 and prior): https://pypi.org/project/mixin-logging/
34
+ - `mixin-sensitivity` (v0.4.0 and prior): https://pypi.org/project/mixin-sensitivity/
35
+
36
+ New consumers should use the unified `mixin-suite` distribution. Existing consumers of the separate packages can continue using them without changes.
@@ -0,0 +1,31 @@
1
+ # Code of Conduct
2
+
3
+ ## My Commitment
4
+
5
+ I maintain this project solo, and I am committed to keeping it a welcoming space for everyone who participates in issues, pull requests, and discussions. I pledge to treat every participant with respect and dignity, regardless of age, body size, caste, disability, ethnicity, sex characteristics, gender, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, sexual identity and orientation, or any other dimension of diversity.
6
+
7
+ ## Standards
8
+
9
+ Behavior that keeps this a positive space:
10
+
11
+ - Welcoming and inclusive language
12
+ - Respect for differing viewpoints and experiences
13
+ - Gracefully accepting constructive criticism
14
+ - Focusing on what is best for the project
15
+ - Empathy toward other participants
16
+
17
+ Behavior I will not accept:
18
+
19
+ - Harassment or insulting or derogatory comments
20
+ - Personal attacks
21
+ - Public or private harassment
22
+ - Publishing someone's private information without consent
23
+ - Conduct that could reasonably be considered inappropriate
24
+
25
+ ## Enforcement
26
+
27
+ Report unacceptable behavior to me through GitHub, either by opening an issue or, where discretion is warranted, through private vulnerability reporting. I review and act on every report promptly and fairly, and I respect the privacy and security of anyone who reports.
28
+
29
+ ## Attribution
30
+
31
+ This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.