lauren 1.0.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 (391) hide show
  1. lauren-1.0.0/.editorconfig +26 -0
  2. lauren-1.0.0/.github/CODEOWNERS +24 -0
  3. lauren-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +133 -0
  4. lauren-1.0.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
  5. lauren-1.0.0/.github/ISSUE_TEMPLATE/documentation.yml +64 -0
  6. lauren-1.0.0/.github/ISSUE_TEMPLATE/feature_request.yml +105 -0
  7. lauren-1.0.0/.github/ISSUE_TEMPLATE/performance.yml +82 -0
  8. lauren-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +61 -0
  9. lauren-1.0.0/.github/dependabot.yml +36 -0
  10. lauren-1.0.0/.github/workflows/codeql.yml +40 -0
  11. lauren-1.0.0/.github/workflows/docs.yml +72 -0
  12. lauren-1.0.0/.github/workflows/lint.yml +81 -0
  13. lauren-1.0.0/.github/workflows/release.yml +127 -0
  14. lauren-1.0.0/.github/workflows/stale.yml +41 -0
  15. lauren-1.0.0/.github/workflows/tests.yml +123 -0
  16. lauren-1.0.0/.gitignore +59 -0
  17. lauren-1.0.0/.markdownlint.yaml +30 -0
  18. lauren-1.0.0/.pre-commit-config.yaml +153 -0
  19. lauren-1.0.0/.yamllint.yaml +26 -0
  20. lauren-1.0.0/AGENTS.md +260 -0
  21. lauren-1.0.0/CHANGELOG.md +51 -0
  22. lauren-1.0.0/CLAUDE.md +430 -0
  23. lauren-1.0.0/CONTRIBUTING.md +222 -0
  24. lauren-1.0.0/LICENSE +21 -0
  25. lauren-1.0.0/PKG-INFO +426 -0
  26. lauren-1.0.0/README.md +368 -0
  27. lauren-1.0.0/SECURITY.md +53 -0
  28. lauren-1.0.0/assets/lauren-logo.png +0 -0
  29. lauren-1.0.0/docs/comparisons/index.md +12 -0
  30. lauren-1.0.0/docs/comparisons/python-frameworks.md +436 -0
  31. lauren-1.0.0/docs/concepts/extractors-vs-dependencies-vs-guards-vs-middlewares.md +170 -0
  32. lauren-1.0.0/docs/core-concepts/controllers.md +166 -0
  33. lauren-1.0.0/docs/core-concepts/index.md +48 -0
  34. lauren-1.0.0/docs/core-concepts/inheritance.md +175 -0
  35. lauren-1.0.0/docs/core-concepts/injectables.md +224 -0
  36. lauren-1.0.0/docs/core-concepts/lifecycle.md +154 -0
  37. lauren-1.0.0/docs/core-concepts/modules.md +139 -0
  38. lauren-1.0.0/docs/core-concepts/request-response.md +225 -0
  39. lauren-1.0.0/docs/development/index.md +12 -0
  40. lauren-1.0.0/docs/development/release.md +163 -0
  41. lauren-1.0.0/docs/development/versioning.md +109 -0
  42. lauren-1.0.0/docs/generated-reference/app.md +367 -0
  43. lauren-1.0.0/docs/generated-reference/background.md +59 -0
  44. lauren-1.0.0/docs/generated-reference/decorators.md +407 -0
  45. lauren-1.0.0/docs/generated-reference/di.md +398 -0
  46. lauren-1.0.0/docs/generated-reference/exceptions.md +265 -0
  47. lauren-1.0.0/docs/generated-reference/extractors.md +338 -0
  48. lauren-1.0.0/docs/generated-reference/signals.md +205 -0
  49. lauren-1.0.0/docs/generated-reference/sse.md +224 -0
  50. lauren-1.0.0/docs/generated-reference/testing.md +87 -0
  51. lauren-1.0.0/docs/generated-reference/types.md +366 -0
  52. lauren-1.0.0/docs/generated-reference/websockets.md +489 -0
  53. lauren-1.0.0/docs/getting-started/features.md +362 -0
  54. lauren-1.0.0/docs/getting-started/index.md +12 -0
  55. lauren-1.0.0/docs/getting-started/installation.md +67 -0
  56. lauren-1.0.0/docs/getting-started/quickstart.md +180 -0
  57. lauren-1.0.0/docs/getting-started/why-lauren.md +71 -0
  58. lauren-1.0.0/docs/guides/agent-skills.md +179 -0
  59. lauren-1.0.0/docs/guides/background-tasks.md +246 -0
  60. lauren-1.0.0/docs/guides/circular-module-imports.md +239 -0
  61. lauren-1.0.0/docs/guides/custom-exception-handlers.md +289 -0
  62. lauren-1.0.0/docs/guides/custom-extractors.md +373 -0
  63. lauren-1.0.0/docs/guides/custom-guards.md +274 -0
  64. lauren-1.0.0/docs/guides/custom-middleware.md +281 -0
  65. lauren-1.0.0/docs/guides/custom-providers.md +246 -0
  66. lauren-1.0.0/docs/guides/declaring-injectables.md +307 -0
  67. lauren-1.0.0/docs/guides/dependency-injection.md +671 -0
  68. lauren-1.0.0/docs/guides/di-model-types.md +305 -0
  69. lauren-1.0.0/docs/guides/file-uploads.md +232 -0
  70. lauren-1.0.0/docs/guides/implicit-params.md +286 -0
  71. lauren-1.0.0/docs/guides/index.md +112 -0
  72. lauren-1.0.0/docs/guides/interceptors.md +338 -0
  73. lauren-1.0.0/docs/guides/openapi-security.md +342 -0
  74. lauren-1.0.0/docs/guides/pipes.md +535 -0
  75. lauren-1.0.0/docs/guides/proxy-and-static-files.md +178 -0
  76. lauren-1.0.0/docs/guides/server-sent-events.md +380 -0
  77. lauren-1.0.0/docs/guides/signals.md +498 -0
  78. lauren-1.0.0/docs/guides/socketio.md +369 -0
  79. lauren-1.0.0/docs/guides/sync-handlers.md +194 -0
  80. lauren-1.0.0/docs/guides/typed-streaming.md +353 -0
  81. lauren-1.0.0/docs/guides/websockets.md +664 -0
  82. lauren-1.0.0/docs/index.md +120 -0
  83. lauren-1.0.0/docs/reference/app.md +9 -0
  84. lauren-1.0.0/docs/reference/background.md +7 -0
  85. lauren-1.0.0/docs/reference/cheat-sheet.md +512 -0
  86. lauren-1.0.0/docs/reference/decorators.md +53 -0
  87. lauren-1.0.0/docs/reference/di.md +25 -0
  88. lauren-1.0.0/docs/reference/errors.md +145 -0
  89. lauren-1.0.0/docs/reference/exceptions.md +79 -0
  90. lauren-1.0.0/docs/reference/extractors.md +45 -0
  91. lauren-1.0.0/docs/reference/index.md +57 -0
  92. lauren-1.0.0/docs/reference/signals.md +19 -0
  93. lauren-1.0.0/docs/reference/sse.md +23 -0
  94. lauren-1.0.0/docs/reference/testing.md +7 -0
  95. lauren-1.0.0/docs/reference/types.md +25 -0
  96. lauren-1.0.0/docs/reference/websockets.md +41 -0
  97. lauren-1.0.0/docs-requirements.txt +10 -0
  98. lauren-1.0.0/lauren/__init__.py +400 -0
  99. lauren-1.0.0/lauren/_app.py +605 -0
  100. lauren-1.0.0/lauren/_arena/__init__.py +320 -0
  101. lauren-1.0.0/lauren/_asgi/__init__.py +2692 -0
  102. lauren-1.0.0/lauren/_asgi/_docs.py +91 -0
  103. lauren-1.0.0/lauren/_asgi/_openapi.py +515 -0
  104. lauren-1.0.0/lauren/_di/__init__.py +2036 -0
  105. lauren-1.0.0/lauren/_di/custom.py +493 -0
  106. lauren-1.0.0/lauren/_lifecycle/__init__.py +140 -0
  107. lauren-1.0.0/lauren/_modules/__init__.py +348 -0
  108. lauren-1.0.0/lauren/_multipart.py +260 -0
  109. lauren-1.0.0/lauren/_routing/__init__.py +417 -0
  110. lauren-1.0.0/lauren/_socketio.py +424 -0
  111. lauren-1.0.0/lauren/_staticfiles.py +177 -0
  112. lauren-1.0.0/lauren/_typing/__init__.py +36 -0
  113. lauren-1.0.0/lauren/_typing/forwardref.py +530 -0
  114. lauren-1.0.0/lauren/_ws_runtime.py +1085 -0
  115. lauren-1.0.0/lauren/background.py +123 -0
  116. lauren-1.0.0/lauren/decorators.py +1010 -0
  117. lauren-1.0.0/lauren/docs.py +42 -0
  118. lauren-1.0.0/lauren/exceptions.py +276 -0
  119. lauren-1.0.0/lauren/extractors.py +1636 -0
  120. lauren-1.0.0/lauren/llms-full.txt +1888 -0
  121. lauren-1.0.0/lauren/llms.txt +46 -0
  122. lauren-1.0.0/lauren/logging.py +457 -0
  123. lauren-1.0.0/lauren/py.typed +0 -0
  124. lauren-1.0.0/lauren/serialization.py +308 -0
  125. lauren-1.0.0/lauren/signals.py +552 -0
  126. lauren-1.0.0/lauren/socketio.py +720 -0
  127. lauren-1.0.0/lauren/sse.py +561 -0
  128. lauren-1.0.0/lauren/static_files.py +10 -0
  129. lauren-1.0.0/lauren/streaming.py +505 -0
  130. lauren-1.0.0/lauren/testing.py +483 -0
  131. lauren-1.0.0/lauren/types.py +1154 -0
  132. lauren-1.0.0/lauren/websockets.py +932 -0
  133. lauren-1.0.0/lauren.egg-info/PKG-INFO +426 -0
  134. lauren-1.0.0/lauren.egg-info/SOURCES.txt +389 -0
  135. lauren-1.0.0/lauren.egg-info/dependency_links.txt +1 -0
  136. lauren-1.0.0/lauren.egg-info/requires.txt +28 -0
  137. lauren-1.0.0/lauren.egg-info/top_level.txt +1 -0
  138. lauren-1.0.0/mkdocs.yml +189 -0
  139. lauren-1.0.0/noxfile.py +528 -0
  140. lauren-1.0.0/pyproject.toml +121 -0
  141. lauren-1.0.0/scripts/check_llms_full.py +64 -0
  142. lauren-1.0.0/scripts/generate_api_docs.py +450 -0
  143. lauren-1.0.0/setup.cfg +4 -0
  144. lauren-1.0.0/skills/README.md +33 -0
  145. lauren-1.0.0/skills/abac-evaluation/SKILL.md +139 -0
  146. lauren-1.0.0/skills/alembic-migrations/SKILL.md +154 -0
  147. lauren-1.0.0/skills/api-key-auth/SKILL.md +146 -0
  148. lauren-1.0.0/skills/api-rate-limiting/SKILL.md +125 -0
  149. lauren-1.0.0/skills/api-versioning/SKILL.md +117 -0
  150. lauren-1.0.0/skills/audit-log-trail/SKILL.md +158 -0
  151. lauren-1.0.0/skills/background-task-scheduler/SKILL.md +110 -0
  152. lauren-1.0.0/skills/building-lauren-apps/SKILL.md +105 -0
  153. lauren-1.0.0/skills/building-lauren-apps/modules.md +120 -0
  154. lauren-1.0.0/skills/building-lauren-apps/project-layout.md +108 -0
  155. lauren-1.0.0/skills/building-lauren-background-tasks/SKILL.md +113 -0
  156. lauren-1.0.0/skills/building-lauren-controllers/SKILL.md +110 -0
  157. lauren-1.0.0/skills/building-lauren-controllers/eval.json +31 -0
  158. lauren-1.0.0/skills/building-lauren-controllers/extractors.md +267 -0
  159. lauren-1.0.0/skills/building-lauren-guards/SKILL.md +97 -0
  160. lauren-1.0.0/skills/building-lauren-guards/interceptors-middlewares.md +132 -0
  161. lauren-1.0.0/skills/building-lauren-services/SKILL.md +128 -0
  162. lauren-1.0.0/skills/building-lauren-services/custom-providers.md +117 -0
  163. lauren-1.0.0/skills/building-lauren-services/eval.json +31 -0
  164. lauren-1.0.0/skills/building-lauren-streaming/SKILL.md +116 -0
  165. lauren-1.0.0/skills/building-lauren-streaming/websockets.md +156 -0
  166. lauren-1.0.0/skills/bulk-import-export/SKILL.md +147 -0
  167. lauren-1.0.0/skills/common-patterns/SKILL.md +74 -0
  168. lauren-1.0.0/skills/common-patterns/auth-protected-crud.md +105 -0
  169. lauren-1.0.0/skills/common-patterns/background-job.md +111 -0
  170. lauren-1.0.0/skills/common-patterns/health-check.md +70 -0
  171. lauren-1.0.0/skills/common-patterns/typed-sse-stream.md +86 -0
  172. lauren-1.0.0/skills/config-hot-reload/SKILL.md +151 -0
  173. lauren-1.0.0/skills/cron-interval-jobs/SKILL.md +118 -0
  174. lauren-1.0.0/skills/docker-compose-setup/SKILL.md +163 -0
  175. lauren-1.0.0/skills/environment-profiles/SKILL.md +157 -0
  176. lauren-1.0.0/skills/event-sourcing/SKILL.md +188 -0
  177. lauren-1.0.0/skills/feature-flags/SKILL.md +144 -0
  178. lauren-1.0.0/skills/field-level-encryption/SKILL.md +159 -0
  179. lauren-1.0.0/skills/file-upload-validation/SKILL.md +103 -0
  180. lauren-1.0.0/skills/gdpr-data-requests/SKILL.md +137 -0
  181. lauren-1.0.0/skills/graceful-shutdown/SKILL.md +142 -0
  182. lauren-1.0.0/skills/graphql-integration/SKILL.md +123 -0
  183. lauren-1.0.0/skills/health-check-probes/SKILL.md +151 -0
  184. lauren-1.0.0/skills/image-processing/SKILL.md +113 -0
  185. lauren-1.0.0/skills/input-sanitization/SKILL.md +154 -0
  186. lauren-1.0.0/skills/jwt-refresh-rotation/SKILL.md +156 -0
  187. lauren-1.0.0/skills/jwt-tokens/SKILL.md +116 -0
  188. lauren-1.0.0/skills/message-queue/SKILL.md +138 -0
  189. lauren-1.0.0/skills/mfa-totp/SKILL.md +101 -0
  190. lauren-1.0.0/skills/migrating-from-fastapi/SKILL.md +163 -0
  191. lauren-1.0.0/skills/migrating-from-fastapi/di.md +113 -0
  192. lauren-1.0.0/skills/migrating-from-fastapi/middleware.md +100 -0
  193. lauren-1.0.0/skills/migrating-from-fastapi/routing.md +103 -0
  194. lauren-1.0.0/skills/multi-database-routing/SKILL.md +141 -0
  195. lauren-1.0.0/skills/multi-tenant-isolation/SKILL.md +149 -0
  196. lauren-1.0.0/skills/oauth2-integration/SKILL.md +115 -0
  197. lauren-1.0.0/skills/object-storage/SKILL.md +160 -0
  198. lauren-1.0.0/skills/opentelemetry-tracing/SKILL.md +130 -0
  199. lauren-1.0.0/skills/postgres-fts/SKILL.md +164 -0
  200. lauren-1.0.0/skills/presigned-url-uploads/SKILL.md +110 -0
  201. lauren-1.0.0/skills/prometheus-metrics/SKILL.md +113 -0
  202. lauren-1.0.0/skills/push-notifications/SKILL.md +205 -0
  203. lauren-1.0.0/skills/pydantic-settings-config/SKILL.md +142 -0
  204. lauren-1.0.0/skills/rbac-engine/SKILL.md +104 -0
  205. lauren-1.0.0/skills/redis-caching/SKILL.md +122 -0
  206. lauren-1.0.0/skills/rest-crud-endpoints/SKILL.md +125 -0
  207. lauren-1.0.0/skills/retry-dead-letter-queue/SKILL.md +135 -0
  208. lauren-1.0.0/skills/search-engine-integration/SKILL.md +186 -0
  209. lauren-1.0.0/skills/secrets-management/SKILL.md +171 -0
  210. lauren-1.0.0/skills/security-headers-cors/SKILL.md +154 -0
  211. lauren-1.0.0/skills/session-store/SKILL.md +124 -0
  212. lauren-1.0.0/skills/sqlalchemy-async/SKILL.md +158 -0
  213. lauren-1.0.0/skills/sqlalchemy-models/SKILL.md +142 -0
  214. lauren-1.0.0/skills/structured-json-logging/SKILL.md +125 -0
  215. lauren-1.0.0/skills/testing-lauren-apps/SKILL.md +212 -0
  216. lauren-1.0.0/skills/testing-lauren-apps/async-testing.md +146 -0
  217. lauren-1.0.0/skills/transactional-email/SKILL.md +178 -0
  218. lauren-1.0.0/skills/using-companion-packages/SKILL.md +63 -0
  219. lauren-1.0.0/skills/using-companion-packages/auth.md +116 -0
  220. lauren-1.0.0/skills/using-companion-packages/cors.md +66 -0
  221. lauren-1.0.0/skills/using-companion-packages/logging.md +94 -0
  222. lauren-1.0.0/skills/webhook-dispatcher/SKILL.md +180 -0
  223. lauren-1.0.0/skills/websocket-rooms/SKILL.md +113 -0
  224. lauren-1.0.0/tests/__init__.py +0 -0
  225. lauren-1.0.0/tests/benchmarks/__init__.py +17 -0
  226. lauren-1.0.0/tests/benchmarks/test_arena_bench.py +216 -0
  227. lauren-1.0.0/tests/benchmarks/test_bytestream_bench.py +207 -0
  228. lauren-1.0.0/tests/benchmarks/test_rfc7807_bench.py +102 -0
  229. lauren-1.0.0/tests/benchmarks/test_router_fastpath_bench.py +257 -0
  230. lauren-1.0.0/tests/benchmarks/test_serialization_bench.py +287 -0
  231. lauren-1.0.0/tests/benchmarks/test_signals_bench.py +245 -0
  232. lauren-1.0.0/tests/benchmarks/test_upload_file_bench.py +154 -0
  233. lauren-1.0.0/tests/benchmarks/test_uploadfile_bench.py +191 -0
  234. lauren-1.0.0/tests/integration/__init__.py +0 -0
  235. lauren-1.0.0/tests/integration/test_arena_integration.py +350 -0
  236. lauren-1.0.0/tests/integration/test_asgi_and_openapi.py +93 -0
  237. lauren-1.0.0/tests/integration/test_asgi_coverage.py +587 -0
  238. lauren-1.0.0/tests/integration/test_background_tasks_integration.py +644 -0
  239. lauren-1.0.0/tests/integration/test_basic_app.py +317 -0
  240. lauren-1.0.0/tests/integration/test_bytestream_integration.py +271 -0
  241. lauren-1.0.0/tests/integration/test_custom_providers_integration.py +669 -0
  242. lauren-1.0.0/tests/integration/test_di_enhancements.py +467 -0
  243. lauren-1.0.0/tests/integration/test_di_integration.py +237 -0
  244. lauren-1.0.0/tests/integration/test_discriminated_unions.py +169 -0
  245. lauren-1.0.0/tests/integration/test_docs_declaring_injectables.py +831 -0
  246. lauren-1.0.0/tests/integration/test_docs_dependency_injection.py +1727 -0
  247. lauren-1.0.0/tests/integration/test_end_to_end_app.py +326 -0
  248. lauren-1.0.0/tests/integration/test_exception_handlers.py +592 -0
  249. lauren-1.0.0/tests/integration/test_fastapi_style_app.py +458 -0
  250. lauren-1.0.0/tests/integration/test_forward_ref_modules.py +382 -0
  251. lauren-1.0.0/tests/integration/test_forwardref_integration.py +319 -0
  252. lauren-1.0.0/tests/integration/test_global_providers.py +730 -0
  253. lauren-1.0.0/tests/integration/test_implicit_params_integration.py +710 -0
  254. lauren-1.0.0/tests/integration/test_injectable_extractor_integration.py +858 -0
  255. lauren-1.0.0/tests/integration/test_interceptors_integration.py +635 -0
  256. lauren-1.0.0/tests/integration/test_list_multi_binding_integration.py +437 -0
  257. lauren-1.0.0/tests/integration/test_logging_integration.py +317 -0
  258. lauren-1.0.0/tests/integration/test_middleware_guards.py +207 -0
  259. lauren-1.0.0/tests/integration/test_mount_integration.py +349 -0
  260. lauren-1.0.0/tests/integration/test_multi_module_app.py +340 -0
  261. lauren-1.0.0/tests/integration/test_openapi_and_docs.py +630 -0
  262. lauren-1.0.0/tests/integration/test_openapi_security_integration.py +526 -0
  263. lauren-1.0.0/tests/integration/test_optional_extractors_integration.py +335 -0
  264. lauren-1.0.0/tests/integration/test_pipe_subscript_integration.py +235 -0
  265. lauren-1.0.0/tests/integration/test_rfc7807_integration.py +296 -0
  266. lauren-1.0.0/tests/integration/test_root_path_integration.py +216 -0
  267. lauren-1.0.0/tests/integration/test_router_fastpath_integration.py +306 -0
  268. lauren-1.0.0/tests/integration/test_serialization_integration.py +323 -0
  269. lauren-1.0.0/tests/integration/test_signals.py +162 -0
  270. lauren-1.0.0/tests/integration/test_signals_integration.py +309 -0
  271. lauren-1.0.0/tests/integration/test_skill_abac.py +200 -0
  272. lauren-1.0.0/tests/integration/test_skill_alembic.py +198 -0
  273. lauren-1.0.0/tests/integration/test_skill_api_keys.py +181 -0
  274. lauren-1.0.0/tests/integration/test_skill_api_versioning.py +205 -0
  275. lauren-1.0.0/tests/integration/test_skill_audit_log.py +255 -0
  276. lauren-1.0.0/tests/integration/test_skill_background_tasks.py +152 -0
  277. lauren-1.0.0/tests/integration/test_skill_bulk_import_export.py +269 -0
  278. lauren-1.0.0/tests/integration/test_skill_config.py +125 -0
  279. lauren-1.0.0/tests/integration/test_skill_config_reload.py +131 -0
  280. lauren-1.0.0/tests/integration/test_skill_cron_jobs.py +231 -0
  281. lauren-1.0.0/tests/integration/test_skill_docker_setup.py +217 -0
  282. lauren-1.0.0/tests/integration/test_skill_email.py +317 -0
  283. lauren-1.0.0/tests/integration/test_skill_env_profiles.py +151 -0
  284. lauren-1.0.0/tests/integration/test_skill_event_sourcing.py +377 -0
  285. lauren-1.0.0/tests/integration/test_skill_feature_flags.py +121 -0
  286. lauren-1.0.0/tests/integration/test_skill_field_encryption.py +208 -0
  287. lauren-1.0.0/tests/integration/test_skill_file_validation.py +188 -0
  288. lauren-1.0.0/tests/integration/test_skill_gdpr.py +230 -0
  289. lauren-1.0.0/tests/integration/test_skill_graceful_shutdown.py +236 -0
  290. lauren-1.0.0/tests/integration/test_skill_graphql.py +118 -0
  291. lauren-1.0.0/tests/integration/test_skill_health_checks.py +199 -0
  292. lauren-1.0.0/tests/integration/test_skill_image_processing.py +240 -0
  293. lauren-1.0.0/tests/integration/test_skill_jwt_refresh.py +162 -0
  294. lauren-1.0.0/tests/integration/test_skill_jwt_tokens.py +125 -0
  295. lauren-1.0.0/tests/integration/test_skill_message_queue.py +251 -0
  296. lauren-1.0.0/tests/integration/test_skill_mfa.py +133 -0
  297. lauren-1.0.0/tests/integration/test_skill_multi_db.py +115 -0
  298. lauren-1.0.0/tests/integration/test_skill_multi_tenant.py +252 -0
  299. lauren-1.0.0/tests/integration/test_skill_oauth2.py +116 -0
  300. lauren-1.0.0/tests/integration/test_skill_object_storage.py +205 -0
  301. lauren-1.0.0/tests/integration/test_skill_otel_tracing.py +176 -0
  302. lauren-1.0.0/tests/integration/test_skill_postgres_fts.py +199 -0
  303. lauren-1.0.0/tests/integration/test_skill_presigned_urls.py +189 -0
  304. lauren-1.0.0/tests/integration/test_skill_prometheus.py +206 -0
  305. lauren-1.0.0/tests/integration/test_skill_push_notifications.py +366 -0
  306. lauren-1.0.0/tests/integration/test_skill_rate_limiting.py +242 -0
  307. lauren-1.0.0/tests/integration/test_skill_rbac.py +118 -0
  308. lauren-1.0.0/tests/integration/test_skill_redis_cache.py +141 -0
  309. lauren-1.0.0/tests/integration/test_skill_rest_crud.py +232 -0
  310. lauren-1.0.0/tests/integration/test_skill_retry_dlq.py +301 -0
  311. lauren-1.0.0/tests/integration/test_skill_sanitization.py +245 -0
  312. lauren-1.0.0/tests/integration/test_skill_search_engine.py +178 -0
  313. lauren-1.0.0/tests/integration/test_skill_secrets.py +127 -0
  314. lauren-1.0.0/tests/integration/test_skill_security_headers.py +252 -0
  315. lauren-1.0.0/tests/integration/test_skill_session.py +168 -0
  316. lauren-1.0.0/tests/integration/test_skill_sqlalchemy_async.py +206 -0
  317. lauren-1.0.0/tests/integration/test_skill_sqlalchemy_models.py +162 -0
  318. lauren-1.0.0/tests/integration/test_skill_structured_logging.py +255 -0
  319. lauren-1.0.0/tests/integration/test_skill_webhooks.py +461 -0
  320. lauren-1.0.0/tests/integration/test_skill_websocket_rooms.py +181 -0
  321. lauren-1.0.0/tests/integration/test_socketio.py +591 -0
  322. lauren-1.0.0/tests/integration/test_sse.py +418 -0
  323. lauren-1.0.0/tests/integration/test_startup_errors.py +93 -0
  324. lauren-1.0.0/tests/integration/test_static_files_integration.py +220 -0
  325. lauren-1.0.0/tests/integration/test_streaming_and_edge.py +166 -0
  326. lauren-1.0.0/tests/integration/test_structured_streaming.py +393 -0
  327. lauren-1.0.0/tests/integration/test_sync_blocking.py +201 -0
  328. lauren-1.0.0/tests/integration/test_upload_file_integration.py +423 -0
  329. lauren-1.0.0/tests/integration/test_uploadfile_integration.py +338 -0
  330. lauren-1.0.0/tests/integration/test_uvicorn_integration.py +145 -0
  331. lauren-1.0.0/tests/integration/test_websockets.py +951 -0
  332. lauren-1.0.0/tests/integration/test_ws_coverage.py +673 -0
  333. lauren-1.0.0/tests/integration/test_ws_double_close.py +297 -0
  334. lauren-1.0.0/tests/integration/test_ws_static_classmethod.py +187 -0
  335. lauren-1.0.0/tests/unit/__init__.py +0 -0
  336. lauren-1.0.0/tests/unit/test_ai_docs.py +36 -0
  337. lauren-1.0.0/tests/unit/test_arena.py +311 -0
  338. lauren-1.0.0/tests/unit/test_auto_serialization.py +222 -0
  339. lauren-1.0.0/tests/unit/test_background_tasks.py +303 -0
  340. lauren-1.0.0/tests/unit/test_broadcast_group.py +203 -0
  341. lauren-1.0.0/tests/unit/test_bytestream.py +337 -0
  342. lauren-1.0.0/tests/unit/test_class_level_guards.py +164 -0
  343. lauren-1.0.0/tests/unit/test_class_signature_inspection.py +534 -0
  344. lauren-1.0.0/tests/unit/test_controller_lifecycle.py +144 -0
  345. lauren-1.0.0/tests/unit/test_controller_subclass_inheritance.py +656 -0
  346. lauren-1.0.0/tests/unit/test_custom_providers.py +604 -0
  347. lauren-1.0.0/tests/unit/test_decorator_usage.py +155 -0
  348. lauren-1.0.0/tests/unit/test_di.py +1174 -0
  349. lauren-1.0.0/tests/unit/test_di_field_injection.py +235 -0
  350. lauren-1.0.0/tests/unit/test_di_function_injectable.py +198 -0
  351. lauren-1.0.0/tests/unit/test_di_model_types.py +592 -0
  352. lauren-1.0.0/tests/unit/test_di_string_annotations.py +259 -0
  353. lauren-1.0.0/tests/unit/test_discriminated_unions.py +121 -0
  354. lauren-1.0.0/tests/unit/test_exception_handler_decorator.py +240 -0
  355. lauren-1.0.0/tests/unit/test_extractors.py +2071 -0
  356. lauren-1.0.0/tests/unit/test_forwardref.py +619 -0
  357. lauren-1.0.0/tests/unit/test_implicit_params.py +363 -0
  358. lauren-1.0.0/tests/unit/test_inheritance_guard.py +157 -0
  359. lauren-1.0.0/tests/unit/test_injectable_dataclass.py +302 -0
  360. lauren-1.0.0/tests/unit/test_interceptors.py +663 -0
  361. lauren-1.0.0/tests/unit/test_lauren_global_params.py +308 -0
  362. lauren-1.0.0/tests/unit/test_lifecycle.py +141 -0
  363. lauren-1.0.0/tests/unit/test_list_multi_binding.py +707 -0
  364. lauren-1.0.0/tests/unit/test_logging.py +283 -0
  365. lauren-1.0.0/tests/unit/test_module_scoped_di.py +257 -0
  366. lauren-1.0.0/tests/unit/test_modules.py +342 -0
  367. lauren-1.0.0/tests/unit/test_mount.py +135 -0
  368. lauren-1.0.0/tests/unit/test_multipart.py +269 -0
  369. lauren-1.0.0/tests/unit/test_openapi_security_decorator.py +365 -0
  370. lauren-1.0.0/tests/unit/test_optional_extractors.py +204 -0
  371. lauren-1.0.0/tests/unit/test_pipe_meta.py +514 -0
  372. lauren-1.0.0/tests/unit/test_pipe_subscript_syntax.py +475 -0
  373. lauren-1.0.0/tests/unit/test_pipes.py +489 -0
  374. lauren-1.0.0/tests/unit/test_root_path.py +180 -0
  375. lauren-1.0.0/tests/unit/test_router.py +169 -0
  376. lauren-1.0.0/tests/unit/test_router_static_fastpath.py +305 -0
  377. lauren-1.0.0/tests/unit/test_scope_enum.py +215 -0
  378. lauren-1.0.0/tests/unit/test_scope_violations.py +292 -0
  379. lauren-1.0.0/tests/unit/test_serialization.py +354 -0
  380. lauren-1.0.0/tests/unit/test_signals_bus.py +288 -0
  381. lauren-1.0.0/tests/unit/test_socketio_decorators.py +350 -0
  382. lauren-1.0.0/tests/unit/test_socketio_protocol.py +371 -0
  383. lauren-1.0.0/tests/unit/test_sse.py +669 -0
  384. lauren-1.0.0/tests/unit/test_static_classmethod_routes.py +133 -0
  385. lauren-1.0.0/tests/unit/test_static_files.py +188 -0
  386. lauren-1.0.0/tests/unit/test_streaming_primitives.py +317 -0
  387. lauren-1.0.0/tests/unit/test_sync_handlers.py +324 -0
  388. lauren-1.0.0/tests/unit/test_testing_module.py +719 -0
  389. lauren-1.0.0/tests/unit/test_types.py +522 -0
  390. lauren-1.0.0/tests/unit/test_use_decorator_none_filtering.py +253 -0
  391. lauren-1.0.0/tests/unit/test_websockets_decorators.py +511 -0
@@ -0,0 +1,26 @@
1
+ # EditorConfig — https://editorconfig.org
2
+ # Unifies whitespace settings across editors and AI coding agents.
3
+
4
+ root = true
5
+
6
+ [*]
7
+ charset = utf-8
8
+ end_of_line = lf
9
+ insert_final_newline = true
10
+ trim_trailing_whitespace = true
11
+ indent_style = space
12
+ indent_size = 4
13
+ max_line_length = 88
14
+
15
+ [*.py]
16
+ indent_size = 4
17
+
18
+ [*.{yml,yaml,toml,json}]
19
+ indent_size = 2
20
+
21
+ [*.md]
22
+ trim_trailing_whitespace = false
23
+ max_line_length = 80
24
+
25
+ [Makefile]
26
+ indent_style = tab
@@ -0,0 +1,24 @@
1
+ # CODEOWNERS — auto-request reviews from these owners on PRs.
2
+ # See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-security/customizing-your-repository/about-code-owners
3
+ #
4
+ # Replace the placeholder team / users below with the actual maintainers
5
+ # (e.g. @lauren-framework/core, @your-handle) once the repo is published.
6
+
7
+ # Default owner — every file unless overridden below.
8
+ * @lauren-framework/maintainers
9
+
10
+ # Critical subsystems — keep an extra reviewer in the loop.
11
+ /lauren/_asgi/ @lauren-framework/runtime
12
+ /lauren/_di/ @lauren-framework/runtime
13
+ /lauren/_routing/ @lauren-framework/runtime
14
+
15
+ # Documentation and the AI-readable refs.
16
+ /docs/ @lauren-framework/docs
17
+ /README.md @lauren-framework/docs
18
+ /llms.txt @lauren-framework/docs
19
+ /llms-full.txt @lauren-framework/docs
20
+
21
+ # CI / build / release pipeline.
22
+ /.github/ @lauren-framework/maintainers
23
+ /noxfile.py @lauren-framework/maintainers
24
+ /pyproject.toml @lauren-framework/maintainers
@@ -0,0 +1,133 @@
1
+ name: 🐞 Bug report
2
+ description: Report a defect — something doesn't work the way the docs / `llms-full.txt` / type hints say it should.
3
+ title: "[bug]: <one-line summary>"
4
+ labels: ["bug", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for taking the time to file a precise bug report.
10
+
11
+ Before submitting, please:
12
+
13
+ 1. Search [open](https://github.com/lauren-framework/lauren/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and [closed](https://github.com/lauren-framework/lauren/issues?q=is%3Aissue+is%3Aclosed+label%3Abug) bug reports.
14
+ 2. Reproduce on the **latest** `main` if at all possible (`pip install git+https://github.com/lauren-framework/lauren@main`).
15
+ 3. Strip your reproducer down to the smallest self-contained snippet.
16
+
17
+ - type: textarea
18
+ id: summary
19
+ attributes:
20
+ label: Summary
21
+ description: One or two sentences describing the bug.
22
+ placeholder: e.g. "`Json[Model]` extractor raises `TypeError` when the model has a `ForwardRef` annotation."
23
+ validations:
24
+ required: true
25
+
26
+ - type: textarea
27
+ id: reproducer
28
+ attributes:
29
+ label: Minimal reproducer
30
+ description: |
31
+ A self-contained Python snippet that reproduces the bug. Prefer code that I can paste directly into a file and run with `python repro.py` or `pytest repro.py`. Include any `curl`/`httpx` commands needed.
32
+ render: python
33
+ placeholder: |
34
+ from lauren import LaurenFactory, controller, get, module, Json
35
+ # ...
36
+ validations:
37
+ required: true
38
+
39
+ - type: textarea
40
+ id: expected
41
+ attributes:
42
+ label: Expected behavior
43
+ description: What did you expect to happen, and *why* (cite the README, docs, llms-full.txt, or a type hint where applicable)?
44
+ validations:
45
+ required: true
46
+
47
+ - type: textarea
48
+ id: actual
49
+ attributes:
50
+ label: Actual behavior
51
+ description: |
52
+ What happened instead? Paste the full traceback inside a fenced code block. If the bug is a wrong response, paste the request and the response.
53
+ render: text
54
+ validations:
55
+ required: true
56
+
57
+ - type: input
58
+ id: lauren-version
59
+ attributes:
60
+ label: lauren version
61
+ description: Output of `python -c "import lauren; print(lauren.__version__)"` (or the commit SHA if installed from `main`).
62
+ placeholder: e.g. 1.0.0 or main@abc1234
63
+ validations:
64
+ required: true
65
+
66
+ - type: input
67
+ id: python-version
68
+ attributes:
69
+ label: Python version
70
+ description: Output of `python --version`.
71
+ placeholder: e.g. 3.12.4
72
+ validations:
73
+ required: true
74
+
75
+ - type: input
76
+ id: pydantic-version
77
+ attributes:
78
+ label: Pydantic version
79
+ description: Output of `python -c "import pydantic; print(pydantic.VERSION)"`.
80
+ placeholder: e.g. 2.8.2
81
+ validations:
82
+ required: true
83
+
84
+ - type: dropdown
85
+ id: os
86
+ attributes:
87
+ label: Operating system
88
+ options:
89
+ - Linux
90
+ - macOS
91
+ - Windows
92
+ - Other (please describe in "Additional context")
93
+ validations:
94
+ required: true
95
+
96
+ - type: dropdown
97
+ id: severity
98
+ attributes:
99
+ label: Severity
100
+ description: Your best guess — maintainers may re-classify.
101
+ options:
102
+ - "Critical: data loss, security, or app cannot start"
103
+ - "High: a documented feature is broken; no workaround"
104
+ - "Medium: documented feature is broken; workaround exists"
105
+ - "Low: incorrect error message, type hint, or doc"
106
+ default: 2
107
+ validations:
108
+ required: true
109
+
110
+ - type: textarea
111
+ id: regression
112
+ attributes:
113
+ label: Regression (if applicable)
114
+ description: Did this work in a previous version? If so, which one was the last good version? `git bisect` is welcome.
115
+ placeholder: e.g. Worked in 0.9.x, broken in 1.0.0.
116
+
117
+ - type: textarea
118
+ id: extra
119
+ attributes:
120
+ label: Additional context
121
+ description: Anything else — full ASGI server, deployment topology, related issues, screenshots.
122
+
123
+ - type: checkboxes
124
+ id: terms
125
+ attributes:
126
+ label: Pre-flight checklist
127
+ options:
128
+ - label: I have searched the existing issues and could not find a duplicate.
129
+ required: true
130
+ - label: I have read [`CONTRIBUTING.md`](https://github.com/lauren-framework/lauren/blob/main/CONTRIBUTING.md) and [`AGENTS.md`](https://github.com/lauren-framework/lauren/blob/main/AGENTS.md).
131
+ required: true
132
+ - label: My reproducer runs in a clean virtualenv with the dependencies I list above.
133
+ required: true
@@ -0,0 +1,11 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: 💬 Question / Discussion
4
+ url: https://github.com/lauren-framework/lauren/discussions
5
+ about: Ask a question, share an idea, or start a design discussion. Please use Discussions instead of Issues for questions.
6
+ - name: 📚 Documentation
7
+ url: https://lauren-framework.github.io/lauren/
8
+ about: Read the documentation, including the AI-readable llms.txt and llms-full.txt references.
9
+ - name: 🛡️ Security advisory (private)
10
+ url: https://github.com/lauren-framework/lauren/security/advisories/new
11
+ about: Report a security vulnerability privately via GitHub Security Advisories. DO NOT open a public issue for security problems.
@@ -0,0 +1,64 @@
1
+ name: 📚 Documentation issue
2
+ description: Report a problem with the docs, README, llms.txt, llms-full.txt, or examples.
3
+ title: "[docs]: <one-line summary>"
4
+ labels: ["documentation", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for helping keep the documentation honest! Documentation
10
+ bugs include wrong code samples, broken links, missing entries in
11
+ `llms-full.txt`, or sections that contradict the implementation.
12
+
13
+ - type: dropdown
14
+ id: location
15
+ attributes:
16
+ label: Where is the issue?
17
+ multiple: true
18
+ options:
19
+ - "README.md"
20
+ - "Documentation site (mkdocs)"
21
+ - "llms.txt"
22
+ - "llms-full.txt"
23
+ - "AGENTS.md / .CLAUDE.md"
24
+ - "CONTRIBUTING.md"
25
+ - "Docstrings / `__doc__`"
26
+ - "IDEAS.md"
27
+ - "Other (please specify)"
28
+ validations:
29
+ required: true
30
+
31
+ - type: input
32
+ id: url-or-path
33
+ attributes:
34
+ label: URL or file path
35
+ description: A direct link to the affected page or a path inside the repo.
36
+ placeholder: e.g. docs/core-concepts/extractors.md, or https://lauren-framework.github.io/lauren/guides/middleware/
37
+ validations:
38
+ required: true
39
+
40
+ - type: textarea
41
+ id: problem
42
+ attributes:
43
+ label: What's wrong?
44
+ description: |
45
+ Describe the issue. If a code sample doesn't work, paste the snippet, the command you ran, and the error.
46
+ validations:
47
+ required: true
48
+
49
+ - type: textarea
50
+ id: suggestion
51
+ attributes:
52
+ label: Suggested wording (optional)
53
+ description: |
54
+ If you'd like to propose specific wording, paste it here. Markdown is welcome. PRs welcome too!
55
+
56
+ - type: checkboxes
57
+ id: terms
58
+ attributes:
59
+ label: Pre-flight checklist
60
+ options:
61
+ - label: I have searched existing documentation issues for duplicates.
62
+ required: true
63
+ - label: If a code sample is wrong, I verified that it actually fails on the latest `main`.
64
+ required: false
@@ -0,0 +1,105 @@
1
+ name: ✨ Feature request
2
+ description: Propose a new feature, decorator, extractor, or behavior.
3
+ title: "[feature]: <one-line summary>"
4
+ labels: ["enhancement", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for proposing a feature! Please remember the project's
10
+ design philosophy from [`.CLAUDE.md`](https://github.com/lauren-framework/lauren/blob/main/.CLAUDE.md):
11
+
12
+ > **Startup validates; runtime dispatches.**
13
+ > Decorators attach metadata; they never rewrite functions.
14
+ > No reflection on the request path. Pre-compile everything.
15
+
16
+ Feature requests that violate these invariants are unlikely to land
17
+ even if useful — please propose a design that respects them, or
18
+ explain why the invariant should be relaxed.
19
+
20
+ - type: textarea
21
+ id: problem
22
+ attributes:
23
+ label: Problem / motivation
24
+ description: |
25
+ Describe the problem you're trying to solve. Include the user-facing pain — "I want to do X but currently have to write Y" — *not* the solution. Concrete code that fails or is awkward today is gold.
26
+ validations:
27
+ required: true
28
+
29
+ - type: textarea
30
+ id: proposed-api
31
+ attributes:
32
+ label: Proposed API
33
+ description: |
34
+ Sketch the public-facing API (Python code) that you would like to write. Include decorators, type hints, and at least one realistic example.
35
+ render: python
36
+ validations:
37
+ required: true
38
+
39
+ - type: textarea
40
+ id: behavior
41
+ attributes:
42
+ label: Behavior & invariants
43
+ description: |
44
+ Spell out the runtime behavior, including edge cases, what should happen at startup vs. on each request, and any new validation that would run inside `LaurenFactory.create(...)`.
45
+ validations:
46
+ required: true
47
+
48
+ - type: textarea
49
+ id: alternatives
50
+ attributes:
51
+ label: Alternatives considered
52
+ description: |
53
+ What other approaches did you consider, and why did you reject them? "I checked Axum / NestJS / FastAPI / Litestar and they do X" is welcome and useful.
54
+
55
+ - type: dropdown
56
+ id: scope
57
+ attributes:
58
+ label: Scope
59
+ description: Which subsystem(s) does this touch?
60
+ multiple: true
61
+ options:
62
+ - Routing (`lauren/_routing`)
63
+ - Dependency Injection (`lauren/_di`)
64
+ - Modules (`lauren/_modules`)
65
+ - Lifecycle (`lauren/_lifecycle`)
66
+ - ASGI runtime (`lauren/_asgi`)
67
+ - Extractors / typing (`lauren/_typing`)
68
+ - OpenAPI generation
69
+ - Middleware / guards
70
+ - Logging
71
+ - Documentation
72
+ - Tooling / build / CI
73
+ validations:
74
+ required: true
75
+
76
+ - type: dropdown
77
+ id: breaking
78
+ attributes:
79
+ label: Breaking change?
80
+ options:
81
+ - "No — pure addition"
82
+ - "No — addition with deprecation of an alternative"
83
+ - "Yes — would require a major version bump"
84
+ - "Unsure — please advise"
85
+ default: 0
86
+ validations:
87
+ required: true
88
+
89
+ - type: textarea
90
+ id: extra
91
+ attributes:
92
+ label: Additional context
93
+ description: Links to similar features in other frameworks, prior art, RFCs, or Discussions.
94
+
95
+ - type: checkboxes
96
+ id: terms
97
+ attributes:
98
+ label: Pre-flight checklist
99
+ options:
100
+ - label: I have read the design philosophy in [`.CLAUDE.md`](https://github.com/lauren-framework/lauren/blob/main/.CLAUDE.md) / [`AGENTS.md`](https://github.com/lauren-framework/lauren/blob/main/AGENTS.md).
101
+ required: true
102
+ - label: I have searched [`IDEAS.md`](https://github.com/lauren-framework/lauren/blob/main/IDEAS.md) and existing issues for prior art on this idea.
103
+ required: true
104
+ - label: I have considered alternatives and explained why this proposal is preferable.
105
+ required: true
@@ -0,0 +1,82 @@
1
+ name: 🐢 Performance regression
2
+ description: Report unexpected latency, memory, or throughput regressions.
3
+ title: "[perf]: <one-line summary>"
4
+ labels: ["performance", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ lauren has strong performance invariants — no reflection on the
10
+ request path, per-request DI cache, immutable execution graph.
11
+ If you've measured a regression against those guarantees we want
12
+ to know.
13
+
14
+ Please make sure your numbers come from a **warm** process
15
+ (discard the first ~1k requests) and that you're comparing
16
+ like-for-like (same Python version, same Pydantic version,
17
+ same number of workers, same hardware).
18
+
19
+ - type: textarea
20
+ id: scenario
21
+ attributes:
22
+ label: Scenario
23
+ description: What route / endpoint / startup step is slow? Paste the controller and the request.
24
+ render: python
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: numbers
30
+ attributes:
31
+ label: Measurements
32
+ description: |
33
+ Show the numbers: p50/p95/p99 latency, RPS, memory, or startup time. Include the benchmarking command and any flags. `wrk`, `oha`, `bombardier`, `pytest-benchmark`, or a self-rolled `asyncio` harness are all welcome.
34
+ render: text
35
+ validations:
36
+ required: true
37
+
38
+ - type: input
39
+ id: baseline
40
+ attributes:
41
+ label: Baseline (good) version
42
+ description: Last lauren version where the numbers were acceptable, if known.
43
+ placeholder: e.g. 1.0.0
44
+
45
+ - type: input
46
+ id: regressed
47
+ attributes:
48
+ label: Regressed (bad) version
49
+ description: First lauren version where the regression appeared.
50
+ placeholder: e.g. main@abc1234
51
+ validations:
52
+ required: true
53
+
54
+ - type: textarea
55
+ id: env
56
+ attributes:
57
+ label: Environment
58
+ description: |
59
+ - Python version
60
+ - Pydantic version
61
+ - ASGI server + version (`uvicorn 0.30`, `hypercorn`, `granian`, …)
62
+ - OS + arch
63
+ - CPU / RAM / container limits
64
+ validations:
65
+ required: true
66
+
67
+ - type: textarea
68
+ id: profile
69
+ attributes:
70
+ label: Profile / flamegraph (optional but very welcome)
71
+ description: |
72
+ Output of `py-spy`, `cProfile`, `perf`, or `austin` on the slow path. Drag-and-drop SVGs are fine.
73
+
74
+ - type: checkboxes
75
+ id: terms
76
+ attributes:
77
+ label: Pre-flight checklist
78
+ options:
79
+ - label: My measurements were taken on a warm process (steady-state, not cold-start).
80
+ required: true
81
+ - label: I have isolated lauren — i.e., the slow path doesn't include my own database / network calls.
82
+ required: true
@@ -0,0 +1,61 @@
1
+ <!--
2
+ Thanks for sending a pull request!
3
+
4
+ Please read CONTRIBUTING.md and AGENTS.md / .CLAUDE.md before opening
5
+ this PR — they contain the design invariants reviewers use to accept or
6
+ reject changes.
7
+ -->
8
+
9
+ ## Summary
10
+
11
+ <!-- One paragraph describing *what* this PR does and *why*. -->
12
+
13
+ ## Linked issues
14
+
15
+ <!-- Use "Closes #123" / "Fixes #123" / "Refs #123" syntax. -->
16
+
17
+ Closes #
18
+
19
+ ## Type of change
20
+
21
+ - [ ] 🐞 Bug fix (non-breaking change that fixes a defect)
22
+ - [ ] ✨ New feature (non-breaking change that adds functionality)
23
+ - [ ] 💥 Breaking change (would require a major version bump)
24
+ - [ ] 📚 Documentation only
25
+ - [ ] 🧹 Refactor / internal cleanup (no behavior change)
26
+ - [ ] ⚡ Performance improvement
27
+ - [ ] 🧪 Test-only change
28
+ - [ ] 🛠️ Build / CI / tooling
29
+
30
+ ## Design checklist
31
+
32
+ > See [`.CLAUDE.md`](../.CLAUDE.md) — these invariants are *not* optional.
33
+
34
+ - [ ] **Startup validates; runtime dispatches.** Any new misuse fails inside `LaurenFactory.create(...)`, not on the first request.
35
+ - [ ] **Decorators attach metadata; they don't rewrite functions.** No `functools.wraps` mutation of the user's callable.
36
+ - [ ] **No reflection on the request path.** All `inspect.signature(...)`, `get_type_hints(...)`, etc. happen at startup.
37
+ - [ ] Every public name is exported in `__all__` *and* documented in `llms-full.txt`.
38
+ - [ ] Type hints are tight and `mypy --strict` clean for the affected modules.
39
+
40
+ ## Tests
41
+
42
+ - [ ] I added at least one test that fails on `main` and passes here, OR this PR is test/docs-only.
43
+ - [ ] `nox -s tests` passes locally.
44
+ - [ ] `nox -s coverage` does not lower coverage on the touched modules.
45
+
46
+ ## Documentation
47
+
48
+ - [ ] I updated `README.md` if the public surface changed.
49
+ - [ ] I updated `llms-full.txt` for any new/changed public symbol.
50
+ - [ ] I updated the mkdocs site (`docs/`) if there's a user-facing concept change.
51
+
52
+ ## Reviewer notes
53
+
54
+ <!--
55
+ Anything subtle reviewers should look at first? Tricky concurrency? A
56
+ deliberate behavior change that might surprise users?
57
+ -->
58
+
59
+ ## Screenshots / logs (optional)
60
+
61
+ <!-- For perf or DX changes, paste before/after numbers here. -->
@@ -0,0 +1,36 @@
1
+ version: 2
2
+ updates:
3
+ # GitHub Actions versions in our workflows.
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ day: "monday"
9
+ time: "06:00"
10
+ timezone: "Etc/UTC"
11
+ open-pull-requests-limit: 5
12
+ commit-message:
13
+ prefix: "ci"
14
+ labels:
15
+ - "dependencies"
16
+ - "ci"
17
+
18
+ # Python runtime + dev dependencies declared in pyproject.toml.
19
+ - package-ecosystem: "pip"
20
+ directory: "/"
21
+ schedule:
22
+ interval: "weekly"
23
+ day: "monday"
24
+ time: "06:00"
25
+ timezone: "Etc/UTC"
26
+ open-pull-requests-limit: 5
27
+ commit-message:
28
+ prefix: "deps"
29
+ labels:
30
+ - "dependencies"
31
+ # Group patch / minor updates so we don't get one PR per dep per week.
32
+ groups:
33
+ python-minor-and-patch:
34
+ update-types:
35
+ - "minor"
36
+ - "patch"
@@ -0,0 +1,40 @@
1
+ name: codeql
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ schedule:
9
+ # Re-scan weekly to pick up new advisories.
10
+ - cron: "37 5 * * 1"
11
+ workflow_dispatch:
12
+
13
+ concurrency:
14
+ group: codeql-${{ github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ permissions:
18
+ actions: read
19
+ contents: read
20
+ security-events: write
21
+
22
+ jobs:
23
+ analyze:
24
+ name: Analyze (${{ matrix.language }})
25
+ runs-on: ubuntu-latest
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ language: [python]
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - name: Initialize CodeQL
33
+ uses: github/codeql-action/init@v3
34
+ with:
35
+ languages: ${{ matrix.language }}
36
+ queries: +security-and-quality
37
+ - name: Perform CodeQL Analysis
38
+ uses: github/codeql-action/analyze@v3
39
+ with:
40
+ category: "/language:${{ matrix.language }}"
@@ -0,0 +1,72 @@
1
+ name: docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ paths:
9
+ - "docs/**"
10
+ - "mkdocs.yml"
11
+ - "docs-requirements.txt"
12
+ - "README.md"
13
+ - "CHANGELOG.md"
14
+ # Rebuild when source changes so mkdocstrings API reference stays fresh.
15
+ - "lauren/**"
16
+ - ".github/workflows/docs.yml"
17
+ - "noxfile.py"
18
+ workflow_dispatch:
19
+
20
+ concurrency:
21
+ group: docs-${{ github.ref }}
22
+ cancel-in-progress: true
23
+
24
+ permissions:
25
+ contents: read
26
+ # Needed for the deploy job below.
27
+ pages: write
28
+ id-token: write
29
+
30
+ jobs:
31
+ build:
32
+ name: Build docs (strict)
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ - name: Install uv
37
+ run: |
38
+ curl -LsSf https://astral.sh/uv/install.sh | sh
39
+ echo "$HOME/.local/bin" >> "$GITHUB_PATH"
40
+ - uses: actions/setup-python@v5
41
+ with:
42
+ python-version: "3.12"
43
+ - run: pip install nox
44
+ - name: Re-generate plain-Markdown API reference (for lauren-website)
45
+ run: |
46
+ pip install griffe
47
+ python scripts/generate_api_docs.py
48
+ - name: Build site
49
+ run: nox -s docs
50
+ - name: Upload site artifact
51
+ uses: actions/upload-artifact@v4
52
+ with:
53
+ name: site
54
+ path: site/
55
+ retention-days: 14
56
+ - name: Upload Pages artifact
57
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
58
+ uses: actions/upload-pages-artifact@v3
59
+ with:
60
+ path: site/
61
+
62
+ # deploy:
63
+ # name: Deploy to GitHub Pages
64
+ # if: github.ref == 'refs/heads/main' && github.event_name == 'push'
65
+ # needs: build
66
+ # runs-on: ubuntu-latest
67
+ # environment:
68
+ # name: github-pages
69
+ # url: ${{ steps.deployment.outputs.page_url }}
70
+ # steps:
71
+ # - id: deployment
72
+ # uses: actions/deploy-pages@v4