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.
- lauren-1.0.0/.editorconfig +26 -0
- lauren-1.0.0/.github/CODEOWNERS +24 -0
- lauren-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +133 -0
- lauren-1.0.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
- lauren-1.0.0/.github/ISSUE_TEMPLATE/documentation.yml +64 -0
- lauren-1.0.0/.github/ISSUE_TEMPLATE/feature_request.yml +105 -0
- lauren-1.0.0/.github/ISSUE_TEMPLATE/performance.yml +82 -0
- lauren-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +61 -0
- lauren-1.0.0/.github/dependabot.yml +36 -0
- lauren-1.0.0/.github/workflows/codeql.yml +40 -0
- lauren-1.0.0/.github/workflows/docs.yml +72 -0
- lauren-1.0.0/.github/workflows/lint.yml +81 -0
- lauren-1.0.0/.github/workflows/release.yml +127 -0
- lauren-1.0.0/.github/workflows/stale.yml +41 -0
- lauren-1.0.0/.github/workflows/tests.yml +123 -0
- lauren-1.0.0/.gitignore +59 -0
- lauren-1.0.0/.markdownlint.yaml +30 -0
- lauren-1.0.0/.pre-commit-config.yaml +153 -0
- lauren-1.0.0/.yamllint.yaml +26 -0
- lauren-1.0.0/AGENTS.md +260 -0
- lauren-1.0.0/CHANGELOG.md +51 -0
- lauren-1.0.0/CLAUDE.md +430 -0
- lauren-1.0.0/CONTRIBUTING.md +222 -0
- lauren-1.0.0/LICENSE +21 -0
- lauren-1.0.0/PKG-INFO +426 -0
- lauren-1.0.0/README.md +368 -0
- lauren-1.0.0/SECURITY.md +53 -0
- lauren-1.0.0/assets/lauren-logo.png +0 -0
- lauren-1.0.0/docs/comparisons/index.md +12 -0
- lauren-1.0.0/docs/comparisons/python-frameworks.md +436 -0
- lauren-1.0.0/docs/concepts/extractors-vs-dependencies-vs-guards-vs-middlewares.md +170 -0
- lauren-1.0.0/docs/core-concepts/controllers.md +166 -0
- lauren-1.0.0/docs/core-concepts/index.md +48 -0
- lauren-1.0.0/docs/core-concepts/inheritance.md +175 -0
- lauren-1.0.0/docs/core-concepts/injectables.md +224 -0
- lauren-1.0.0/docs/core-concepts/lifecycle.md +154 -0
- lauren-1.0.0/docs/core-concepts/modules.md +139 -0
- lauren-1.0.0/docs/core-concepts/request-response.md +225 -0
- lauren-1.0.0/docs/development/index.md +12 -0
- lauren-1.0.0/docs/development/release.md +163 -0
- lauren-1.0.0/docs/development/versioning.md +109 -0
- lauren-1.0.0/docs/generated-reference/app.md +367 -0
- lauren-1.0.0/docs/generated-reference/background.md +59 -0
- lauren-1.0.0/docs/generated-reference/decorators.md +407 -0
- lauren-1.0.0/docs/generated-reference/di.md +398 -0
- lauren-1.0.0/docs/generated-reference/exceptions.md +265 -0
- lauren-1.0.0/docs/generated-reference/extractors.md +338 -0
- lauren-1.0.0/docs/generated-reference/signals.md +205 -0
- lauren-1.0.0/docs/generated-reference/sse.md +224 -0
- lauren-1.0.0/docs/generated-reference/testing.md +87 -0
- lauren-1.0.0/docs/generated-reference/types.md +366 -0
- lauren-1.0.0/docs/generated-reference/websockets.md +489 -0
- lauren-1.0.0/docs/getting-started/features.md +362 -0
- lauren-1.0.0/docs/getting-started/index.md +12 -0
- lauren-1.0.0/docs/getting-started/installation.md +67 -0
- lauren-1.0.0/docs/getting-started/quickstart.md +180 -0
- lauren-1.0.0/docs/getting-started/why-lauren.md +71 -0
- lauren-1.0.0/docs/guides/agent-skills.md +179 -0
- lauren-1.0.0/docs/guides/background-tasks.md +246 -0
- lauren-1.0.0/docs/guides/circular-module-imports.md +239 -0
- lauren-1.0.0/docs/guides/custom-exception-handlers.md +289 -0
- lauren-1.0.0/docs/guides/custom-extractors.md +373 -0
- lauren-1.0.0/docs/guides/custom-guards.md +274 -0
- lauren-1.0.0/docs/guides/custom-middleware.md +281 -0
- lauren-1.0.0/docs/guides/custom-providers.md +246 -0
- lauren-1.0.0/docs/guides/declaring-injectables.md +307 -0
- lauren-1.0.0/docs/guides/dependency-injection.md +671 -0
- lauren-1.0.0/docs/guides/di-model-types.md +305 -0
- lauren-1.0.0/docs/guides/file-uploads.md +232 -0
- lauren-1.0.0/docs/guides/implicit-params.md +286 -0
- lauren-1.0.0/docs/guides/index.md +112 -0
- lauren-1.0.0/docs/guides/interceptors.md +338 -0
- lauren-1.0.0/docs/guides/openapi-security.md +342 -0
- lauren-1.0.0/docs/guides/pipes.md +535 -0
- lauren-1.0.0/docs/guides/proxy-and-static-files.md +178 -0
- lauren-1.0.0/docs/guides/server-sent-events.md +380 -0
- lauren-1.0.0/docs/guides/signals.md +498 -0
- lauren-1.0.0/docs/guides/socketio.md +369 -0
- lauren-1.0.0/docs/guides/sync-handlers.md +194 -0
- lauren-1.0.0/docs/guides/typed-streaming.md +353 -0
- lauren-1.0.0/docs/guides/websockets.md +664 -0
- lauren-1.0.0/docs/index.md +120 -0
- lauren-1.0.0/docs/reference/app.md +9 -0
- lauren-1.0.0/docs/reference/background.md +7 -0
- lauren-1.0.0/docs/reference/cheat-sheet.md +512 -0
- lauren-1.0.0/docs/reference/decorators.md +53 -0
- lauren-1.0.0/docs/reference/di.md +25 -0
- lauren-1.0.0/docs/reference/errors.md +145 -0
- lauren-1.0.0/docs/reference/exceptions.md +79 -0
- lauren-1.0.0/docs/reference/extractors.md +45 -0
- lauren-1.0.0/docs/reference/index.md +57 -0
- lauren-1.0.0/docs/reference/signals.md +19 -0
- lauren-1.0.0/docs/reference/sse.md +23 -0
- lauren-1.0.0/docs/reference/testing.md +7 -0
- lauren-1.0.0/docs/reference/types.md +25 -0
- lauren-1.0.0/docs/reference/websockets.md +41 -0
- lauren-1.0.0/docs-requirements.txt +10 -0
- lauren-1.0.0/lauren/__init__.py +400 -0
- lauren-1.0.0/lauren/_app.py +605 -0
- lauren-1.0.0/lauren/_arena/__init__.py +320 -0
- lauren-1.0.0/lauren/_asgi/__init__.py +2692 -0
- lauren-1.0.0/lauren/_asgi/_docs.py +91 -0
- lauren-1.0.0/lauren/_asgi/_openapi.py +515 -0
- lauren-1.0.0/lauren/_di/__init__.py +2036 -0
- lauren-1.0.0/lauren/_di/custom.py +493 -0
- lauren-1.0.0/lauren/_lifecycle/__init__.py +140 -0
- lauren-1.0.0/lauren/_modules/__init__.py +348 -0
- lauren-1.0.0/lauren/_multipart.py +260 -0
- lauren-1.0.0/lauren/_routing/__init__.py +417 -0
- lauren-1.0.0/lauren/_socketio.py +424 -0
- lauren-1.0.0/lauren/_staticfiles.py +177 -0
- lauren-1.0.0/lauren/_typing/__init__.py +36 -0
- lauren-1.0.0/lauren/_typing/forwardref.py +530 -0
- lauren-1.0.0/lauren/_ws_runtime.py +1085 -0
- lauren-1.0.0/lauren/background.py +123 -0
- lauren-1.0.0/lauren/decorators.py +1010 -0
- lauren-1.0.0/lauren/docs.py +42 -0
- lauren-1.0.0/lauren/exceptions.py +276 -0
- lauren-1.0.0/lauren/extractors.py +1636 -0
- lauren-1.0.0/lauren/llms-full.txt +1888 -0
- lauren-1.0.0/lauren/llms.txt +46 -0
- lauren-1.0.0/lauren/logging.py +457 -0
- lauren-1.0.0/lauren/py.typed +0 -0
- lauren-1.0.0/lauren/serialization.py +308 -0
- lauren-1.0.0/lauren/signals.py +552 -0
- lauren-1.0.0/lauren/socketio.py +720 -0
- lauren-1.0.0/lauren/sse.py +561 -0
- lauren-1.0.0/lauren/static_files.py +10 -0
- lauren-1.0.0/lauren/streaming.py +505 -0
- lauren-1.0.0/lauren/testing.py +483 -0
- lauren-1.0.0/lauren/types.py +1154 -0
- lauren-1.0.0/lauren/websockets.py +932 -0
- lauren-1.0.0/lauren.egg-info/PKG-INFO +426 -0
- lauren-1.0.0/lauren.egg-info/SOURCES.txt +389 -0
- lauren-1.0.0/lauren.egg-info/dependency_links.txt +1 -0
- lauren-1.0.0/lauren.egg-info/requires.txt +28 -0
- lauren-1.0.0/lauren.egg-info/top_level.txt +1 -0
- lauren-1.0.0/mkdocs.yml +189 -0
- lauren-1.0.0/noxfile.py +528 -0
- lauren-1.0.0/pyproject.toml +121 -0
- lauren-1.0.0/scripts/check_llms_full.py +64 -0
- lauren-1.0.0/scripts/generate_api_docs.py +450 -0
- lauren-1.0.0/setup.cfg +4 -0
- lauren-1.0.0/skills/README.md +33 -0
- lauren-1.0.0/skills/abac-evaluation/SKILL.md +139 -0
- lauren-1.0.0/skills/alembic-migrations/SKILL.md +154 -0
- lauren-1.0.0/skills/api-key-auth/SKILL.md +146 -0
- lauren-1.0.0/skills/api-rate-limiting/SKILL.md +125 -0
- lauren-1.0.0/skills/api-versioning/SKILL.md +117 -0
- lauren-1.0.0/skills/audit-log-trail/SKILL.md +158 -0
- lauren-1.0.0/skills/background-task-scheduler/SKILL.md +110 -0
- lauren-1.0.0/skills/building-lauren-apps/SKILL.md +105 -0
- lauren-1.0.0/skills/building-lauren-apps/modules.md +120 -0
- lauren-1.0.0/skills/building-lauren-apps/project-layout.md +108 -0
- lauren-1.0.0/skills/building-lauren-background-tasks/SKILL.md +113 -0
- lauren-1.0.0/skills/building-lauren-controllers/SKILL.md +110 -0
- lauren-1.0.0/skills/building-lauren-controllers/eval.json +31 -0
- lauren-1.0.0/skills/building-lauren-controllers/extractors.md +267 -0
- lauren-1.0.0/skills/building-lauren-guards/SKILL.md +97 -0
- lauren-1.0.0/skills/building-lauren-guards/interceptors-middlewares.md +132 -0
- lauren-1.0.0/skills/building-lauren-services/SKILL.md +128 -0
- lauren-1.0.0/skills/building-lauren-services/custom-providers.md +117 -0
- lauren-1.0.0/skills/building-lauren-services/eval.json +31 -0
- lauren-1.0.0/skills/building-lauren-streaming/SKILL.md +116 -0
- lauren-1.0.0/skills/building-lauren-streaming/websockets.md +156 -0
- lauren-1.0.0/skills/bulk-import-export/SKILL.md +147 -0
- lauren-1.0.0/skills/common-patterns/SKILL.md +74 -0
- lauren-1.0.0/skills/common-patterns/auth-protected-crud.md +105 -0
- lauren-1.0.0/skills/common-patterns/background-job.md +111 -0
- lauren-1.0.0/skills/common-patterns/health-check.md +70 -0
- lauren-1.0.0/skills/common-patterns/typed-sse-stream.md +86 -0
- lauren-1.0.0/skills/config-hot-reload/SKILL.md +151 -0
- lauren-1.0.0/skills/cron-interval-jobs/SKILL.md +118 -0
- lauren-1.0.0/skills/docker-compose-setup/SKILL.md +163 -0
- lauren-1.0.0/skills/environment-profiles/SKILL.md +157 -0
- lauren-1.0.0/skills/event-sourcing/SKILL.md +188 -0
- lauren-1.0.0/skills/feature-flags/SKILL.md +144 -0
- lauren-1.0.0/skills/field-level-encryption/SKILL.md +159 -0
- lauren-1.0.0/skills/file-upload-validation/SKILL.md +103 -0
- lauren-1.0.0/skills/gdpr-data-requests/SKILL.md +137 -0
- lauren-1.0.0/skills/graceful-shutdown/SKILL.md +142 -0
- lauren-1.0.0/skills/graphql-integration/SKILL.md +123 -0
- lauren-1.0.0/skills/health-check-probes/SKILL.md +151 -0
- lauren-1.0.0/skills/image-processing/SKILL.md +113 -0
- lauren-1.0.0/skills/input-sanitization/SKILL.md +154 -0
- lauren-1.0.0/skills/jwt-refresh-rotation/SKILL.md +156 -0
- lauren-1.0.0/skills/jwt-tokens/SKILL.md +116 -0
- lauren-1.0.0/skills/message-queue/SKILL.md +138 -0
- lauren-1.0.0/skills/mfa-totp/SKILL.md +101 -0
- lauren-1.0.0/skills/migrating-from-fastapi/SKILL.md +163 -0
- lauren-1.0.0/skills/migrating-from-fastapi/di.md +113 -0
- lauren-1.0.0/skills/migrating-from-fastapi/middleware.md +100 -0
- lauren-1.0.0/skills/migrating-from-fastapi/routing.md +103 -0
- lauren-1.0.0/skills/multi-database-routing/SKILL.md +141 -0
- lauren-1.0.0/skills/multi-tenant-isolation/SKILL.md +149 -0
- lauren-1.0.0/skills/oauth2-integration/SKILL.md +115 -0
- lauren-1.0.0/skills/object-storage/SKILL.md +160 -0
- lauren-1.0.0/skills/opentelemetry-tracing/SKILL.md +130 -0
- lauren-1.0.0/skills/postgres-fts/SKILL.md +164 -0
- lauren-1.0.0/skills/presigned-url-uploads/SKILL.md +110 -0
- lauren-1.0.0/skills/prometheus-metrics/SKILL.md +113 -0
- lauren-1.0.0/skills/push-notifications/SKILL.md +205 -0
- lauren-1.0.0/skills/pydantic-settings-config/SKILL.md +142 -0
- lauren-1.0.0/skills/rbac-engine/SKILL.md +104 -0
- lauren-1.0.0/skills/redis-caching/SKILL.md +122 -0
- lauren-1.0.0/skills/rest-crud-endpoints/SKILL.md +125 -0
- lauren-1.0.0/skills/retry-dead-letter-queue/SKILL.md +135 -0
- lauren-1.0.0/skills/search-engine-integration/SKILL.md +186 -0
- lauren-1.0.0/skills/secrets-management/SKILL.md +171 -0
- lauren-1.0.0/skills/security-headers-cors/SKILL.md +154 -0
- lauren-1.0.0/skills/session-store/SKILL.md +124 -0
- lauren-1.0.0/skills/sqlalchemy-async/SKILL.md +158 -0
- lauren-1.0.0/skills/sqlalchemy-models/SKILL.md +142 -0
- lauren-1.0.0/skills/structured-json-logging/SKILL.md +125 -0
- lauren-1.0.0/skills/testing-lauren-apps/SKILL.md +212 -0
- lauren-1.0.0/skills/testing-lauren-apps/async-testing.md +146 -0
- lauren-1.0.0/skills/transactional-email/SKILL.md +178 -0
- lauren-1.0.0/skills/using-companion-packages/SKILL.md +63 -0
- lauren-1.0.0/skills/using-companion-packages/auth.md +116 -0
- lauren-1.0.0/skills/using-companion-packages/cors.md +66 -0
- lauren-1.0.0/skills/using-companion-packages/logging.md +94 -0
- lauren-1.0.0/skills/webhook-dispatcher/SKILL.md +180 -0
- lauren-1.0.0/skills/websocket-rooms/SKILL.md +113 -0
- lauren-1.0.0/tests/__init__.py +0 -0
- lauren-1.0.0/tests/benchmarks/__init__.py +17 -0
- lauren-1.0.0/tests/benchmarks/test_arena_bench.py +216 -0
- lauren-1.0.0/tests/benchmarks/test_bytestream_bench.py +207 -0
- lauren-1.0.0/tests/benchmarks/test_rfc7807_bench.py +102 -0
- lauren-1.0.0/tests/benchmarks/test_router_fastpath_bench.py +257 -0
- lauren-1.0.0/tests/benchmarks/test_serialization_bench.py +287 -0
- lauren-1.0.0/tests/benchmarks/test_signals_bench.py +245 -0
- lauren-1.0.0/tests/benchmarks/test_upload_file_bench.py +154 -0
- lauren-1.0.0/tests/benchmarks/test_uploadfile_bench.py +191 -0
- lauren-1.0.0/tests/integration/__init__.py +0 -0
- lauren-1.0.0/tests/integration/test_arena_integration.py +350 -0
- lauren-1.0.0/tests/integration/test_asgi_and_openapi.py +93 -0
- lauren-1.0.0/tests/integration/test_asgi_coverage.py +587 -0
- lauren-1.0.0/tests/integration/test_background_tasks_integration.py +644 -0
- lauren-1.0.0/tests/integration/test_basic_app.py +317 -0
- lauren-1.0.0/tests/integration/test_bytestream_integration.py +271 -0
- lauren-1.0.0/tests/integration/test_custom_providers_integration.py +669 -0
- lauren-1.0.0/tests/integration/test_di_enhancements.py +467 -0
- lauren-1.0.0/tests/integration/test_di_integration.py +237 -0
- lauren-1.0.0/tests/integration/test_discriminated_unions.py +169 -0
- lauren-1.0.0/tests/integration/test_docs_declaring_injectables.py +831 -0
- lauren-1.0.0/tests/integration/test_docs_dependency_injection.py +1727 -0
- lauren-1.0.0/tests/integration/test_end_to_end_app.py +326 -0
- lauren-1.0.0/tests/integration/test_exception_handlers.py +592 -0
- lauren-1.0.0/tests/integration/test_fastapi_style_app.py +458 -0
- lauren-1.0.0/tests/integration/test_forward_ref_modules.py +382 -0
- lauren-1.0.0/tests/integration/test_forwardref_integration.py +319 -0
- lauren-1.0.0/tests/integration/test_global_providers.py +730 -0
- lauren-1.0.0/tests/integration/test_implicit_params_integration.py +710 -0
- lauren-1.0.0/tests/integration/test_injectable_extractor_integration.py +858 -0
- lauren-1.0.0/tests/integration/test_interceptors_integration.py +635 -0
- lauren-1.0.0/tests/integration/test_list_multi_binding_integration.py +437 -0
- lauren-1.0.0/tests/integration/test_logging_integration.py +317 -0
- lauren-1.0.0/tests/integration/test_middleware_guards.py +207 -0
- lauren-1.0.0/tests/integration/test_mount_integration.py +349 -0
- lauren-1.0.0/tests/integration/test_multi_module_app.py +340 -0
- lauren-1.0.0/tests/integration/test_openapi_and_docs.py +630 -0
- lauren-1.0.0/tests/integration/test_openapi_security_integration.py +526 -0
- lauren-1.0.0/tests/integration/test_optional_extractors_integration.py +335 -0
- lauren-1.0.0/tests/integration/test_pipe_subscript_integration.py +235 -0
- lauren-1.0.0/tests/integration/test_rfc7807_integration.py +296 -0
- lauren-1.0.0/tests/integration/test_root_path_integration.py +216 -0
- lauren-1.0.0/tests/integration/test_router_fastpath_integration.py +306 -0
- lauren-1.0.0/tests/integration/test_serialization_integration.py +323 -0
- lauren-1.0.0/tests/integration/test_signals.py +162 -0
- lauren-1.0.0/tests/integration/test_signals_integration.py +309 -0
- lauren-1.0.0/tests/integration/test_skill_abac.py +200 -0
- lauren-1.0.0/tests/integration/test_skill_alembic.py +198 -0
- lauren-1.0.0/tests/integration/test_skill_api_keys.py +181 -0
- lauren-1.0.0/tests/integration/test_skill_api_versioning.py +205 -0
- lauren-1.0.0/tests/integration/test_skill_audit_log.py +255 -0
- lauren-1.0.0/tests/integration/test_skill_background_tasks.py +152 -0
- lauren-1.0.0/tests/integration/test_skill_bulk_import_export.py +269 -0
- lauren-1.0.0/tests/integration/test_skill_config.py +125 -0
- lauren-1.0.0/tests/integration/test_skill_config_reload.py +131 -0
- lauren-1.0.0/tests/integration/test_skill_cron_jobs.py +231 -0
- lauren-1.0.0/tests/integration/test_skill_docker_setup.py +217 -0
- lauren-1.0.0/tests/integration/test_skill_email.py +317 -0
- lauren-1.0.0/tests/integration/test_skill_env_profiles.py +151 -0
- lauren-1.0.0/tests/integration/test_skill_event_sourcing.py +377 -0
- lauren-1.0.0/tests/integration/test_skill_feature_flags.py +121 -0
- lauren-1.0.0/tests/integration/test_skill_field_encryption.py +208 -0
- lauren-1.0.0/tests/integration/test_skill_file_validation.py +188 -0
- lauren-1.0.0/tests/integration/test_skill_gdpr.py +230 -0
- lauren-1.0.0/tests/integration/test_skill_graceful_shutdown.py +236 -0
- lauren-1.0.0/tests/integration/test_skill_graphql.py +118 -0
- lauren-1.0.0/tests/integration/test_skill_health_checks.py +199 -0
- lauren-1.0.0/tests/integration/test_skill_image_processing.py +240 -0
- lauren-1.0.0/tests/integration/test_skill_jwt_refresh.py +162 -0
- lauren-1.0.0/tests/integration/test_skill_jwt_tokens.py +125 -0
- lauren-1.0.0/tests/integration/test_skill_message_queue.py +251 -0
- lauren-1.0.0/tests/integration/test_skill_mfa.py +133 -0
- lauren-1.0.0/tests/integration/test_skill_multi_db.py +115 -0
- lauren-1.0.0/tests/integration/test_skill_multi_tenant.py +252 -0
- lauren-1.0.0/tests/integration/test_skill_oauth2.py +116 -0
- lauren-1.0.0/tests/integration/test_skill_object_storage.py +205 -0
- lauren-1.0.0/tests/integration/test_skill_otel_tracing.py +176 -0
- lauren-1.0.0/tests/integration/test_skill_postgres_fts.py +199 -0
- lauren-1.0.0/tests/integration/test_skill_presigned_urls.py +189 -0
- lauren-1.0.0/tests/integration/test_skill_prometheus.py +206 -0
- lauren-1.0.0/tests/integration/test_skill_push_notifications.py +366 -0
- lauren-1.0.0/tests/integration/test_skill_rate_limiting.py +242 -0
- lauren-1.0.0/tests/integration/test_skill_rbac.py +118 -0
- lauren-1.0.0/tests/integration/test_skill_redis_cache.py +141 -0
- lauren-1.0.0/tests/integration/test_skill_rest_crud.py +232 -0
- lauren-1.0.0/tests/integration/test_skill_retry_dlq.py +301 -0
- lauren-1.0.0/tests/integration/test_skill_sanitization.py +245 -0
- lauren-1.0.0/tests/integration/test_skill_search_engine.py +178 -0
- lauren-1.0.0/tests/integration/test_skill_secrets.py +127 -0
- lauren-1.0.0/tests/integration/test_skill_security_headers.py +252 -0
- lauren-1.0.0/tests/integration/test_skill_session.py +168 -0
- lauren-1.0.0/tests/integration/test_skill_sqlalchemy_async.py +206 -0
- lauren-1.0.0/tests/integration/test_skill_sqlalchemy_models.py +162 -0
- lauren-1.0.0/tests/integration/test_skill_structured_logging.py +255 -0
- lauren-1.0.0/tests/integration/test_skill_webhooks.py +461 -0
- lauren-1.0.0/tests/integration/test_skill_websocket_rooms.py +181 -0
- lauren-1.0.0/tests/integration/test_socketio.py +591 -0
- lauren-1.0.0/tests/integration/test_sse.py +418 -0
- lauren-1.0.0/tests/integration/test_startup_errors.py +93 -0
- lauren-1.0.0/tests/integration/test_static_files_integration.py +220 -0
- lauren-1.0.0/tests/integration/test_streaming_and_edge.py +166 -0
- lauren-1.0.0/tests/integration/test_structured_streaming.py +393 -0
- lauren-1.0.0/tests/integration/test_sync_blocking.py +201 -0
- lauren-1.0.0/tests/integration/test_upload_file_integration.py +423 -0
- lauren-1.0.0/tests/integration/test_uploadfile_integration.py +338 -0
- lauren-1.0.0/tests/integration/test_uvicorn_integration.py +145 -0
- lauren-1.0.0/tests/integration/test_websockets.py +951 -0
- lauren-1.0.0/tests/integration/test_ws_coverage.py +673 -0
- lauren-1.0.0/tests/integration/test_ws_double_close.py +297 -0
- lauren-1.0.0/tests/integration/test_ws_static_classmethod.py +187 -0
- lauren-1.0.0/tests/unit/__init__.py +0 -0
- lauren-1.0.0/tests/unit/test_ai_docs.py +36 -0
- lauren-1.0.0/tests/unit/test_arena.py +311 -0
- lauren-1.0.0/tests/unit/test_auto_serialization.py +222 -0
- lauren-1.0.0/tests/unit/test_background_tasks.py +303 -0
- lauren-1.0.0/tests/unit/test_broadcast_group.py +203 -0
- lauren-1.0.0/tests/unit/test_bytestream.py +337 -0
- lauren-1.0.0/tests/unit/test_class_level_guards.py +164 -0
- lauren-1.0.0/tests/unit/test_class_signature_inspection.py +534 -0
- lauren-1.0.0/tests/unit/test_controller_lifecycle.py +144 -0
- lauren-1.0.0/tests/unit/test_controller_subclass_inheritance.py +656 -0
- lauren-1.0.0/tests/unit/test_custom_providers.py +604 -0
- lauren-1.0.0/tests/unit/test_decorator_usage.py +155 -0
- lauren-1.0.0/tests/unit/test_di.py +1174 -0
- lauren-1.0.0/tests/unit/test_di_field_injection.py +235 -0
- lauren-1.0.0/tests/unit/test_di_function_injectable.py +198 -0
- lauren-1.0.0/tests/unit/test_di_model_types.py +592 -0
- lauren-1.0.0/tests/unit/test_di_string_annotations.py +259 -0
- lauren-1.0.0/tests/unit/test_discriminated_unions.py +121 -0
- lauren-1.0.0/tests/unit/test_exception_handler_decorator.py +240 -0
- lauren-1.0.0/tests/unit/test_extractors.py +2071 -0
- lauren-1.0.0/tests/unit/test_forwardref.py +619 -0
- lauren-1.0.0/tests/unit/test_implicit_params.py +363 -0
- lauren-1.0.0/tests/unit/test_inheritance_guard.py +157 -0
- lauren-1.0.0/tests/unit/test_injectable_dataclass.py +302 -0
- lauren-1.0.0/tests/unit/test_interceptors.py +663 -0
- lauren-1.0.0/tests/unit/test_lauren_global_params.py +308 -0
- lauren-1.0.0/tests/unit/test_lifecycle.py +141 -0
- lauren-1.0.0/tests/unit/test_list_multi_binding.py +707 -0
- lauren-1.0.0/tests/unit/test_logging.py +283 -0
- lauren-1.0.0/tests/unit/test_module_scoped_di.py +257 -0
- lauren-1.0.0/tests/unit/test_modules.py +342 -0
- lauren-1.0.0/tests/unit/test_mount.py +135 -0
- lauren-1.0.0/tests/unit/test_multipart.py +269 -0
- lauren-1.0.0/tests/unit/test_openapi_security_decorator.py +365 -0
- lauren-1.0.0/tests/unit/test_optional_extractors.py +204 -0
- lauren-1.0.0/tests/unit/test_pipe_meta.py +514 -0
- lauren-1.0.0/tests/unit/test_pipe_subscript_syntax.py +475 -0
- lauren-1.0.0/tests/unit/test_pipes.py +489 -0
- lauren-1.0.0/tests/unit/test_root_path.py +180 -0
- lauren-1.0.0/tests/unit/test_router.py +169 -0
- lauren-1.0.0/tests/unit/test_router_static_fastpath.py +305 -0
- lauren-1.0.0/tests/unit/test_scope_enum.py +215 -0
- lauren-1.0.0/tests/unit/test_scope_violations.py +292 -0
- lauren-1.0.0/tests/unit/test_serialization.py +354 -0
- lauren-1.0.0/tests/unit/test_signals_bus.py +288 -0
- lauren-1.0.0/tests/unit/test_socketio_decorators.py +350 -0
- lauren-1.0.0/tests/unit/test_socketio_protocol.py +371 -0
- lauren-1.0.0/tests/unit/test_sse.py +669 -0
- lauren-1.0.0/tests/unit/test_static_classmethod_routes.py +133 -0
- lauren-1.0.0/tests/unit/test_static_files.py +188 -0
- lauren-1.0.0/tests/unit/test_streaming_primitives.py +317 -0
- lauren-1.0.0/tests/unit/test_sync_handlers.py +324 -0
- lauren-1.0.0/tests/unit/test_testing_module.py +719 -0
- lauren-1.0.0/tests/unit/test_types.py +522 -0
- lauren-1.0.0/tests/unit/test_use_decorator_none_filtering.py +253 -0
- 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
|