swiftpy-framework 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- swiftpy_framework-0.1.0/.dockerignore +30 -0
- swiftpy_framework-0.1.0/.env.example +101 -0
- swiftpy_framework-0.1.0/.github/workflows/ci.yml +144 -0
- swiftpy_framework-0.1.0/.github/workflows/publish.yml +40 -0
- swiftpy_framework-0.1.0/.gitignore +32 -0
- swiftpy_framework-0.1.0/CHANGELOG.md +386 -0
- swiftpy_framework-0.1.0/CONTRIBUTING.md +125 -0
- swiftpy_framework-0.1.0/Dockerfile +52 -0
- swiftpy_framework-0.1.0/LICENSE +21 -0
- swiftpy_framework-0.1.0/PKG-INFO +603 -0
- swiftpy_framework-0.1.0/README.md +573 -0
- swiftpy_framework-0.1.0/app/__init__.py +0 -0
- swiftpy_framework-0.1.0/app/events/user_registered.py +15 -0
- swiftpy_framework-0.1.0/app/http/handler/exceptions.py +25 -0
- swiftpy_framework-0.1.0/app/http/middleware/__init__.py +0 -0
- swiftpy_framework-0.1.0/app/http/middleware/admin_middleware.py +45 -0
- swiftpy_framework-0.1.0/app/http/middleware/auth_middleware.py +39 -0
- swiftpy_framework-0.1.0/app/http/middleware/test_middleware.py +11 -0
- swiftpy_framework-0.1.0/app/http/requests/create_user_request.py +25 -0
- swiftpy_framework-0.1.0/app/jobs/send_notification_job.py +30 -0
- swiftpy_framework-0.1.0/app/listeners/send_welcome_notification.py +22 -0
- swiftpy_framework-0.1.0/app/mail/welcome_email.py +29 -0
- swiftpy_framework-0.1.0/app/models/user.py +26 -0
- swiftpy_framework-0.1.0/app/providers/app_service_provider.py +18 -0
- swiftpy_framework-0.1.0/app/providers/auth_service_provider.py +60 -0
- swiftpy_framework-0.1.0/app/providers/cache_service_provider.py +16 -0
- swiftpy_framework-0.1.0/app/providers/database_service_provider.py +12 -0
- swiftpy_framework-0.1.0/app/providers/event_service_provider.py +24 -0
- swiftpy_framework-0.1.0/app/providers/filesystem_service_provider.py +17 -0
- swiftpy_framework-0.1.0/app/providers/mail_service_provider.py +24 -0
- swiftpy_framework-0.1.0/app/providers/queue_service_provider.py +18 -0
- swiftpy_framework-0.1.0/app/repositories/user_repository.py +23 -0
- swiftpy_framework-0.1.0/app/schemas/user_schema.py +26 -0
- swiftpy_framework-0.1.0/app/services/user_service.py +27 -0
- swiftpy_framework-0.1.0/bootstrap/cache/.gitkeep +0 -0
- swiftpy_framework-0.1.0/config/__init__.py +0 -0
- swiftpy_framework-0.1.0/config/ai.py +69 -0
- swiftpy_framework-0.1.0/config/app.py +13 -0
- swiftpy_framework-0.1.0/config/auth.py +35 -0
- swiftpy_framework-0.1.0/config/cache.py +23 -0
- swiftpy_framework-0.1.0/config/cors.py +16 -0
- swiftpy_framework-0.1.0/config/database.py +30 -0
- swiftpy_framework-0.1.0/config/events.py +12 -0
- swiftpy_framework-0.1.0/config/filesystems.py +49 -0
- swiftpy_framework-0.1.0/config/logging.py +25 -0
- swiftpy_framework-0.1.0/config/mail.py +64 -0
- swiftpy_framework-0.1.0/config/queue.py +18 -0
- swiftpy_framework-0.1.0/database/migrations/2026_01_01_000000_create_users_table.py +20 -0
- swiftpy_framework-0.1.0/database/seeders/database_seeder.py +16 -0
- swiftpy_framework-0.1.0/docker-compose.yml +89 -0
- swiftpy_framework-0.1.0/documentations/2026-11-14-installation-quick-start.md +243 -0
- swiftpy_framework-0.1.0/documentations/2026-11-15-core-application-di-and-config.md +461 -0
- swiftpy_framework-0.1.0/documentations/2026-11-15-http-routing-middleware-and-exceptions.md +806 -0
- swiftpy_framework-0.1.0/main.py +58 -0
- swiftpy_framework-0.1.0/pyproject.toml +88 -0
- swiftpy_framework-0.1.0/red-black.png +0 -0
- swiftpy_framework-0.1.0/routes/__init__.py +2 -0
- swiftpy_framework-0.1.0/routes/api.py +26 -0
- swiftpy_framework-0.1.0/swiftpy/.gitignore +0 -0
- swiftpy_framework-0.1.0/swiftpy/__init__.py +572 -0
- swiftpy_framework-0.1.0/swiftpy/admin/__init__.py +50 -0
- swiftpy_framework-0.1.0/swiftpy/admin/auth.py +522 -0
- swiftpy_framework-0.1.0/swiftpy/admin/registry.py +567 -0
- swiftpy_framework-0.1.0/swiftpy/admin/views.py +1583 -0
- swiftpy_framework-0.1.0/swiftpy/ai/__init__.py +199 -0
- swiftpy_framework-0.1.0/swiftpy/ai/_deterministic.py +40 -0
- swiftpy_framework-0.1.0/swiftpy/ai/_fake.py +604 -0
- swiftpy_framework-0.1.0/swiftpy/ai/agents/__init__.py +30 -0
- swiftpy_framework-0.1.0/swiftpy/ai/agents/base_agent.py +506 -0
- swiftpy_framework-0.1.0/swiftpy/ai/agents/memory.py +864 -0
- swiftpy_framework-0.1.0/swiftpy/ai/client.py +1011 -0
- swiftpy_framework-0.1.0/swiftpy/ai/conversation.py +171 -0
- swiftpy_framework-0.1.0/swiftpy/ai/embeddings.py +321 -0
- swiftpy_framework-0.1.0/swiftpy/ai/exceptions.py +75 -0
- swiftpy_framework-0.1.0/swiftpy/ai/history_strategies.py +157 -0
- swiftpy_framework-0.1.0/swiftpy/ai/middleware.py +918 -0
- swiftpy_framework-0.1.0/swiftpy/ai/observability/__init__.py +28 -0
- swiftpy_framework-0.1.0/swiftpy/ai/observability/drivers.py +763 -0
- swiftpy_framework-0.1.0/swiftpy/ai/observability/observer.py +364 -0
- swiftpy_framework-0.1.0/swiftpy/ai/pool.py +102 -0
- swiftpy_framework-0.1.0/swiftpy/ai/pricing.py +101 -0
- swiftpy_framework-0.1.0/swiftpy/ai/prompts/__init__.py +6 -0
- swiftpy_framework-0.1.0/swiftpy/ai/prompts/loader.py +343 -0
- swiftpy_framework-0.1.0/swiftpy/ai/providers/__init__.py +22 -0
- swiftpy_framework-0.1.0/swiftpy/ai/providers/anthropic_provider.py +353 -0
- swiftpy_framework-0.1.0/swiftpy/ai/providers/base.py +273 -0
- swiftpy_framework-0.1.0/swiftpy/ai/providers/openai_provider.py +275 -0
- swiftpy_framework-0.1.0/swiftpy/ai/rag/__init__.py +53 -0
- swiftpy_framework-0.1.0/swiftpy/ai/rag/context_formatter.py +263 -0
- swiftpy_framework-0.1.0/swiftpy/ai/rag/pipeline_builder.py +544 -0
- swiftpy_framework-0.1.0/swiftpy/ai/rag/reranker.py +484 -0
- swiftpy_framework-0.1.0/swiftpy/ai/rag/result.py +78 -0
- swiftpy_framework-0.1.0/swiftpy/ai/rag/retriever.py +315 -0
- swiftpy_framework-0.1.0/swiftpy/ai/redis_store.py +227 -0
- swiftpy_framework-0.1.0/swiftpy/ai/streaming.py +115 -0
- swiftpy_framework-0.1.0/swiftpy/ai/tools/__init__.py +22 -0
- swiftpy_framework-0.1.0/swiftpy/ai/tools/base_tool.py +489 -0
- swiftpy_framework-0.1.0/swiftpy/ai/tools/first_party.py +384 -0
- swiftpy_framework-0.1.0/swiftpy/ai/tools/tool_loop.py +417 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/__init__.py +46 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/base.py +542 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/chroma_adapter.py +435 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/in_memory_adapter.py +321 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/lancedb_adapter.py +370 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/pgvector_adapter.py +496 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/pinecone_adapter.py +445 -0
- swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/qdrant_adapter.py +418 -0
- swiftpy_framework-0.1.0/swiftpy/auth/__init__.py +50 -0
- swiftpy_framework-0.1.0/swiftpy/auth/api_key_guard.py +544 -0
- swiftpy_framework-0.1.0/swiftpy/auth/auth_manager.py +259 -0
- swiftpy_framework-0.1.0/swiftpy/auth/exceptions.py +71 -0
- swiftpy_framework-0.1.0/swiftpy/auth/jwt_guard.py +230 -0
- swiftpy_framework-0.1.0/swiftpy/auth/jwt_issuer.py +658 -0
- swiftpy_framework-0.1.0/swiftpy/auth/token_blacklist.py +300 -0
- swiftpy_framework-0.1.0/swiftpy/cache/__init__.py +14 -0
- swiftpy_framework-0.1.0/swiftpy/cache/cache.py +251 -0
- swiftpy_framework-0.1.0/swiftpy/cache/driver.py +216 -0
- swiftpy_framework-0.1.0/swiftpy/cache/drivers/memory.py +199 -0
- swiftpy_framework-0.1.0/swiftpy/cache/drivers/redis.py +421 -0
- swiftpy_framework-0.1.0/swiftpy/console/__init__.py +0 -0
- swiftpy_framework-0.1.0/swiftpy/console/cli.py +68 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/__init__.py +0 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/cache.py +164 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/make.py +935 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/migrate.py +280 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/new.py +1806 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/queue.py +306 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/seed.py +252 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/start.py +171 -0
- swiftpy_framework-0.1.0/swiftpy/console/commands/storage.py +104 -0
- swiftpy_framework-0.1.0/swiftpy/console/loader.py +21 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/__init__.py +26 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/controller.stub +14 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/event.stub +14 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/job.stub +22 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/listener.stub +14 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/mail.stub +20 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/middleware.stub +16 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.alter.stub +17 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.api_keys.stub +22 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.blank.stub +11 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.create.stub +15 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.stub +11 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.update.stub +17 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/model.stub +17 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/provider.stub +18 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/repository.stub +10 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/request.stub +16 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/resource.stub +21 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/schema.stub +12 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/seeder.stub +14 -0
- swiftpy_framework-0.1.0/swiftpy/console/stubs/service.stub +10 -0
- swiftpy_framework-0.1.0/swiftpy/core/__init__.py +0 -0
- swiftpy_framework-0.1.0/swiftpy/core/application.py +1306 -0
- swiftpy_framework-0.1.0/swiftpy/core/bootstrap.py +30 -0
- swiftpy_framework-0.1.0/swiftpy/core/config.py +432 -0
- swiftpy_framework-0.1.0/swiftpy/core/container.py +596 -0
- swiftpy_framework-0.1.0/swiftpy/core/container_exceptions.py +18 -0
- swiftpy_framework-0.1.0/swiftpy/core/context.py +148 -0
- swiftpy_framework-0.1.0/swiftpy/core/exceptions.py +352 -0
- swiftpy_framework-0.1.0/swiftpy/core/providers/base.py +35 -0
- swiftpy_framework-0.1.0/swiftpy/database/__init__.py +41 -0
- swiftpy_framework-0.1.0/swiftpy/database/exceptions.py +42 -0
- swiftpy_framework-0.1.0/swiftpy/database/identifiers.py +105 -0
- swiftpy_framework-0.1.0/swiftpy/database/migrations/__init__.py +36 -0
- swiftpy_framework-0.1.0/swiftpy/database/migrations/blueprint.py +431 -0
- swiftpy_framework-0.1.0/swiftpy/database/migrations/lock.py +104 -0
- swiftpy_framework-0.1.0/swiftpy/database/migrations/migration.py +22 -0
- swiftpy_framework-0.1.0/swiftpy/database/migrations/migrator.py +507 -0
- swiftpy_framework-0.1.0/swiftpy/database/migrations/schema.py +435 -0
- swiftpy_framework-0.1.0/swiftpy/database/orm/__init__.py +33 -0
- swiftpy_framework-0.1.0/swiftpy/database/orm/fields.py +92 -0
- swiftpy_framework-0.1.0/swiftpy/database/orm/model.py +2034 -0
- swiftpy_framework-0.1.0/swiftpy/database/orm/registry.py +33 -0
- swiftpy_framework-0.1.0/swiftpy/database/orm/relationships.py +836 -0
- swiftpy_framework-0.1.0/swiftpy/database/pagination/__init__.py +16 -0
- swiftpy_framework-0.1.0/swiftpy/database/pagination/contracts.py +60 -0
- swiftpy_framework-0.1.0/swiftpy/database/pagination/paginator.py +112 -0
- swiftpy_framework-0.1.0/swiftpy/database/pagination/simple_paginator.py +97 -0
- swiftpy_framework-0.1.0/swiftpy/database/pool.py +218 -0
- swiftpy_framework-0.1.0/swiftpy/database/query_builder.py +1803 -0
- swiftpy_framework-0.1.0/swiftpy/database/seeder.py +39 -0
- swiftpy_framework-0.1.0/swiftpy/database/transaction.py +276 -0
- swiftpy_framework-0.1.0/swiftpy/events/__init__.py +10 -0
- swiftpy_framework-0.1.0/swiftpy/events/dispatcher.py +308 -0
- swiftpy_framework-0.1.0/swiftpy/events/redis_bus.py +552 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/__init__.py +227 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/disk.py +378 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/__init__.py +11 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/base.py +156 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/local.py +559 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/s3.py +655 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/events.py +37 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/exceptions.py +127 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/manager.py +138 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/metadata.py +22 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/paths.py +99 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/service_provider.py +17 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/__init__.py +13 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/handlers.py +362 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/uploaded_file.py +222 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/validators.py +186 -0
- swiftpy_framework-0.1.0/swiftpy/filesystem/visibility.py +22 -0
- swiftpy_framework-0.1.0/swiftpy/helpers/__init__.py +42 -0
- swiftpy_framework-0.1.0/swiftpy/helpers/helper.py +180 -0
- swiftpy_framework-0.1.0/swiftpy/http/exceptions.py +41 -0
- swiftpy_framework-0.1.0/swiftpy/http/middleware.py +307 -0
- swiftpy_framework-0.1.0/swiftpy/http/request.py +375 -0
- swiftpy_framework-0.1.0/swiftpy/http/response.py +442 -0
- swiftpy_framework-0.1.0/swiftpy/http/router.py +1050 -0
- swiftpy_framework-0.1.0/swiftpy/mail/__init__.py +58 -0
- swiftpy_framework-0.1.0/swiftpy/mail/attachments.py +255 -0
- swiftpy_framework-0.1.0/swiftpy/mail/config.py +71 -0
- swiftpy_framework-0.1.0/swiftpy/mail/envelope.py +183 -0
- swiftpy_framework-0.1.0/swiftpy/mail/exceptions.py +90 -0
- swiftpy_framework-0.1.0/swiftpy/mail/facade.py +312 -0
- swiftpy_framework-0.1.0/swiftpy/mail/mailable.py +53 -0
- swiftpy_framework-0.1.0/swiftpy/mail/manager.py +240 -0
- swiftpy_framework-0.1.0/swiftpy/mail/message.py +186 -0
- swiftpy_framework-0.1.0/swiftpy/mail/models.py +19 -0
- swiftpy_framework-0.1.0/swiftpy/mail/queue/__init__.py +5 -0
- swiftpy_framework-0.1.0/swiftpy/mail/queue/job.py +279 -0
- swiftpy_framework-0.1.0/swiftpy/mail/service_provider.py +19 -0
- swiftpy_framework-0.1.0/swiftpy/mail/templates/__init__.py +5 -0
- swiftpy_framework-0.1.0/swiftpy/mail/templates/renderer.py +173 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/__init__.py +21 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/api/__init__.py +13 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/api/base.py +194 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/api/mailgun.py +158 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/api/resend.py +156 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/api/sendgrid.py +172 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/base.py +24 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/console.py +91 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/sendmail.py +128 -0
- swiftpy_framework-0.1.0/swiftpy/mail/transports/smtp.py +466 -0
- swiftpy_framework-0.1.0/swiftpy/queue/__init__.py +13 -0
- swiftpy_framework-0.1.0/swiftpy/queue/dispatcher.py +813 -0
- swiftpy_framework-0.1.0/swiftpy/queue/job.py +541 -0
- swiftpy_framework-0.1.0/swiftpy/queue/worker.py +556 -0
- swiftpy_framework-0.1.0/swiftpy/support/__init__.py +12 -0
- swiftpy_framework-0.1.0/swiftpy/support/keys.py +108 -0
- swiftpy_framework-0.1.0/swiftpy/support/redis_config.py +223 -0
- swiftpy_framework-0.1.0/swiftpy/support/strings.py +114 -0
- swiftpy_framework-0.1.0/swiftpy/testing/__init__.py +20 -0
- swiftpy_framework-0.1.0/swiftpy/testing/fakes/__init__.py +11 -0
- swiftpy_framework-0.1.0/swiftpy/testing/fakes/ai_fake.py +21 -0
- swiftpy_framework-0.1.0/swiftpy/testing/fakes/vectorstore_fake.py +194 -0
- swiftpy_framework-0.1.0/swiftpy/testing/fixtures.py +124 -0
- swiftpy_framework-0.1.0/swiftpy/testing/http_client.py +730 -0
- swiftpy_framework-0.1.0/swiftpy/testing/test_case.py +126 -0
- swiftpy_framework-0.1.0/swiftpy/validation/__init__.py +97 -0
- swiftpy_framework-0.1.0/swiftpy/validation/exceptions.py +26 -0
- swiftpy_framework-0.1.0/swiftpy/validation/form_request.py +302 -0
- swiftpy_framework-0.1.0/swiftpy/validation/protocols.py +33 -0
- swiftpy_framework-0.1.0/swiftpy/validation/rules/__init__.py +89 -0
- swiftpy_framework-0.1.0/swiftpy/validation/rules/builtin.py +391 -0
- swiftpy_framework-0.1.0/swiftpy/validation/rules/exists.py +86 -0
- swiftpy_framework-0.1.0/swiftpy/validation/rules/registry.py +290 -0
- swiftpy_framework-0.1.0/swiftpy/validation/rules/required.py +55 -0
- swiftpy_framework-0.1.0/swiftpy/validation/rules/unique.py +138 -0
- swiftpy_framework-0.1.0/swiftpy/validation/validator.py +612 -0
- swiftpy_framework-0.1.0/swiftpy/websockets/__init__.py +19 -0
- swiftpy_framework-0.1.0/swiftpy/websockets/connection.py +317 -0
- swiftpy_framework-0.1.0/swiftpy/websockets/manager.py +271 -0
- swiftpy_framework-0.1.0/tests/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/admin/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/admin/test_admin.py +899 -0
- swiftpy_framework-0.1.0/tests/ai/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/ai/conftest.py +52 -0
- swiftpy_framework-0.1.0/tests/ai/integration/__init__.py +2 -0
- swiftpy_framework-0.1.0/tests/ai/integration/test_chroma.py +79 -0
- swiftpy_framework-0.1.0/tests/ai/integration/test_lancedb.py +71 -0
- swiftpy_framework-0.1.0/tests/ai/integration/test_pinecone.py +61 -0
- swiftpy_framework-0.1.0/tests/ai/integration/test_qdrant.py +88 -0
- swiftpy_framework-0.1.0/tests/ai/integration/test_rag_integration.py +137 -0
- swiftpy_framework-0.1.0/tests/ai/test_agents.py +779 -0
- swiftpy_framework-0.1.0/tests/ai/test_ai_fake.py +216 -0
- swiftpy_framework-0.1.0/tests/ai/test_ai_fake_isolation.py +212 -0
- swiftpy_framework-0.1.0/tests/ai/test_client.py +392 -0
- swiftpy_framework-0.1.0/tests/ai/test_conversation.py +438 -0
- swiftpy_framework-0.1.0/tests/ai/test_embeddings.py +516 -0
- swiftpy_framework-0.1.0/tests/ai/test_middleware.py +277 -0
- swiftpy_framework-0.1.0/tests/ai/test_middleware_concurrency.py +313 -0
- swiftpy_framework-0.1.0/tests/ai/test_observability.py +289 -0
- swiftpy_framework-0.1.0/tests/ai/test_observability_resilience.py +280 -0
- swiftpy_framework-0.1.0/tests/ai/test_phase7_ai_remediation.py +873 -0
- swiftpy_framework-0.1.0/tests/ai/test_phase8_agents_tools_prompts_remediation.py +699 -0
- swiftpy_framework-0.1.0/tests/ai/test_phase8_rag_remediation.py +376 -0
- swiftpy_framework-0.1.0/tests/ai/test_phase8_vectorstore_remediation.py +585 -0
- swiftpy_framework-0.1.0/tests/ai/test_prompts.py +147 -0
- swiftpy_framework-0.1.0/tests/ai/test_prompts_security.py +146 -0
- swiftpy_framework-0.1.0/tests/ai/test_providers.py +704 -0
- swiftpy_framework-0.1.0/tests/ai/test_rag.py +1321 -0
- swiftpy_framework-0.1.0/tests/ai/test_streaming.py +503 -0
- swiftpy_framework-0.1.0/tests/ai/test_tools.py +955 -0
- swiftpy_framework-0.1.0/tests/ai/test_vectorstore.py +606 -0
- swiftpy_framework-0.1.0/tests/ai/test_vectorstore_adapters.py +1209 -0
- swiftpy_framework-0.1.0/tests/app/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/app/test_application_providers.py +290 -0
- swiftpy_framework-0.1.0/tests/app/test_starter_auth.py +202 -0
- swiftpy_framework-0.1.0/tests/auth/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/auth/test_api_key_guard.py +427 -0
- swiftpy_framework-0.1.0/tests/auth/test_auth_manager.py +131 -0
- swiftpy_framework-0.1.0/tests/auth/test_auth_remediation.py +237 -0
- swiftpy_framework-0.1.0/tests/auth/test_auth_security.py +1516 -0
- swiftpy_framework-0.1.0/tests/auth/test_jwt_issuer.py +323 -0
- swiftpy_framework-0.1.0/tests/auth/test_token_blacklist.py +165 -0
- swiftpy_framework-0.1.0/tests/benchmarks.py +208 -0
- swiftpy_framework-0.1.0/tests/cache/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/cache/test_cache_concurrency.py +410 -0
- swiftpy_framework-0.1.0/tests/cache/test_cache_manager.py +122 -0
- swiftpy_framework-0.1.0/tests/cache/test_driver_correctness.py +244 -0
- swiftpy_framework-0.1.0/tests/cache/test_memory_cache.py +324 -0
- swiftpy_framework-0.1.0/tests/cache/test_redis_cache.py +273 -0
- swiftpy_framework-0.1.0/tests/concurrency/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/concurrency/test_circular_dependency.py +36 -0
- swiftpy_framework-0.1.0/tests/concurrency/test_container_semantics.py +271 -0
- swiftpy_framework-0.1.0/tests/concurrency/test_resolution.py +44 -0
- swiftpy_framework-0.1.0/tests/concurrency/test_resolution2.py +87 -0
- swiftpy_framework-0.1.0/tests/conftest.py +22 -0
- swiftpy_framework-0.1.0/tests/console/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/console/test_cache_commands.py +108 -0
- swiftpy_framework-0.1.0/tests/console/test_new_command.py +471 -0
- swiftpy_framework-0.1.0/tests/console/test_phase9_cli_remediation.py +172 -0
- swiftpy_framework-0.1.0/tests/console/test_start.py +128 -0
- swiftpy_framework-0.1.0/tests/console/test_stubs_and_make.py +444 -0
- swiftpy_framework-0.1.0/tests/core/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/core/test_application_config_isolation.py +198 -0
- swiftpy_framework-0.1.0/tests/core/test_core_config.py +390 -0
- swiftpy_framework-0.1.0/tests/core/test_exceptions.py +345 -0
- swiftpy_framework-0.1.0/tests/core/test_instance_singletons.py +174 -0
- swiftpy_framework-0.1.0/tests/core/test_lifespan.py +261 -0
- swiftpy_framework-0.1.0/tests/database/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/database/test_orm_expansion.py +457 -0
- swiftpy_framework-0.1.0/tests/database/test_orm_vector.py +83 -0
- swiftpy_framework-0.1.0/tests/database/test_pagination_and_grouping.py +744 -0
- swiftpy_framework-0.1.0/tests/database/test_pagination_pg_integration.py +272 -0
- swiftpy_framework-0.1.0/tests/database/test_pgvector_integration.py +181 -0
- swiftpy_framework-0.1.0/tests/database/test_phase4_remediation.py +567 -0
- swiftpy_framework-0.1.0/tests/database/test_query_expansion.py +544 -0
- swiftpy_framework-0.1.0/tests/database/test_query_expansion_pg_integration.py +212 -0
- swiftpy_framework-0.1.0/tests/database/test_seeder.py +287 -0
- swiftpy_framework-0.1.0/tests/db/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/db/load_test_database.py +221 -0
- swiftpy_framework-0.1.0/tests/db/load_test_database2.py +218 -0
- swiftpy_framework-0.1.0/tests/db/test_arbitrary_primary_keys.py +174 -0
- swiftpy_framework-0.1.0/tests/db/test_identifiers.py +115 -0
- swiftpy_framework-0.1.0/tests/db/test_mass_writes.py +166 -0
- swiftpy_framework-0.1.0/tests/db/test_pool_config.py +190 -0
- swiftpy_framework-0.1.0/tests/db/test_query_builder_terminals.py +125 -0
- swiftpy_framework-0.1.0/tests/db/test_sql_injections.py +315 -0
- swiftpy_framework-0.1.0/tests/db/test_transaction_isolation.py +209 -0
- swiftpy_framework-0.1.0/tests/docs/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/docs/test_readme_examples.py +483 -0
- swiftpy_framework-0.1.0/tests/e2e/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/e2e/test_concurrent_auth.py +197 -0
- swiftpy_framework-0.1.0/tests/e2e/test_crud_auth_e2e.py +449 -0
- swiftpy_framework-0.1.0/tests/events/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/events/test_event_dispatcher.py +337 -0
- swiftpy_framework-0.1.0/tests/events/test_model_events.py +247 -0
- swiftpy_framework-0.1.0/tests/events/test_redis_bus.py +486 -0
- swiftpy_framework-0.1.0/tests/events/test_redis_bus_reliability.py +275 -0
- swiftpy_framework-0.1.0/tests/filesystem/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_cli_storage_link.py +44 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_disk.py +154 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_filesystem_concurrency.py +62 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_filesystem_config.py +88 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_http_integration.py +266 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_local_driver.py +251 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_multipart.py +144 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_paths.py +115 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_phase6_filesystem_remediation.py +423 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_s3_driver.py +284 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_signed_urls.py +74 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_storage_facade.py +87 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_uploaded_file.py +192 -0
- swiftpy_framework-0.1.0/tests/filesystem/test_validation.py +191 -0
- swiftpy_framework-0.1.0/tests/http/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/http/test_error_pipeline.py +417 -0
- swiftpy_framework-0.1.0/tests/http/test_http_remediation.py +434 -0
- swiftpy_framework-0.1.0/tests/http/test_include_router.py +305 -0
- swiftpy_framework-0.1.0/tests/http/test_request.py +211 -0
- swiftpy_framework-0.1.0/tests/http/test_response.py +211 -0
- swiftpy_framework-0.1.0/tests/http/test_route_groups.py +23 -0
- swiftpy_framework-0.1.0/tests/http/test_router.py +395 -0
- swiftpy_framework-0.1.0/tests/integration/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/integration/test_queue_event_websocket.py +183 -0
- swiftpy_framework-0.1.0/tests/mail/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/mail/test_api_transports.py +411 -0
- swiftpy_framework-0.1.0/tests/mail/test_attachments.py +95 -0
- swiftpy_framework-0.1.0/tests/mail/test_cli_make_mail.py +23 -0
- swiftpy_framework-0.1.0/tests/mail/test_console_transport.py +25 -0
- swiftpy_framework-0.1.0/tests/mail/test_envelope.py +201 -0
- swiftpy_framework-0.1.0/tests/mail/test_facade_and_fake.py +162 -0
- swiftpy_framework-0.1.0/tests/mail/test_mailable.py +87 -0
- swiftpy_framework-0.1.0/tests/mail/test_manager_and_config.py +141 -0
- swiftpy_framework-0.1.0/tests/mail/test_message.py +120 -0
- swiftpy_framework-0.1.0/tests/mail/test_phase6_mail_remediation.py +796 -0
- swiftpy_framework-0.1.0/tests/mail/test_queue_integration.py +277 -0
- swiftpy_framework-0.1.0/tests/mail/test_service_provider_and_helpers.py +57 -0
- swiftpy_framework-0.1.0/tests/mail/test_smtp_and_sendmail.py +766 -0
- swiftpy_framework-0.1.0/tests/mail/test_templates.py +89 -0
- swiftpy_framework-0.1.0/tests/migrations/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/migrations/test_migrations.py +912 -0
- swiftpy_framework-0.1.0/tests/orm/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/orm/test_defaults_dirty.py +138 -0
- swiftpy_framework-0.1.0/tests/orm/test_eager_loading.py +571 -0
- swiftpy_framework-0.1.0/tests/orm/test_hidden.py +137 -0
- swiftpy_framework-0.1.0/tests/orm/test_mass_assignment.py +153 -0
- swiftpy_framework-0.1.0/tests/orm/test_model_events_transaction.py +137 -0
- swiftpy_framework-0.1.0/tests/orm/test_relationships_hardening.py +191 -0
- swiftpy_framework-0.1.0/tests/queue/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/queue/test_after_commit.py +159 -0
- swiftpy_framework-0.1.0/tests/queue/test_phase5_remediation.py +593 -0
- swiftpy_framework-0.1.0/tests/queue/test_poison_messages.py +158 -0
- swiftpy_framework-0.1.0/tests/queue/test_queue.py +1253 -0
- swiftpy_framework-0.1.0/tests/queue/test_reliability.py +264 -0
- swiftpy_framework-0.1.0/tests/queue/test_signing.py +164 -0
- swiftpy_framework-0.1.0/tests/queue/test_worker_behavior.py +283 -0
- swiftpy_framework-0.1.0/tests/security/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/security/test_security_audit.py +542 -0
- swiftpy_framework-0.1.0/tests/stress/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/stress/test_context_isolation.py +75 -0
- swiftpy_framework-0.1.0/tests/support/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/support/test_redis_config.py +167 -0
- swiftpy_framework-0.1.0/tests/support/test_strings.py +103 -0
- swiftpy_framework-0.1.0/tests/testing/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/testing/test_fixtures.py +204 -0
- swiftpy_framework-0.1.0/tests/testing/test_phase9_testing_remediation.py +266 -0
- swiftpy_framework-0.1.0/tests/testing/test_test_client.py +271 -0
- swiftpy_framework-0.1.0/tests/typing/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/typing/test_orm_typing.py +110 -0
- swiftpy_framework-0.1.0/tests/validation/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/validation/test_db_rules.py +269 -0
- swiftpy_framework-0.1.0/tests/validation/test_form_request_fail_closed.py +154 -0
- swiftpy_framework-0.1.0/tests/validation/test_form_request_pipeline.py +314 -0
- swiftpy_framework-0.1.0/tests/validation/test_phase6_validation_remediation.py +548 -0
- swiftpy_framework-0.1.0/tests/validation/test_rules_hardening.py +282 -0
- swiftpy_framework-0.1.0/tests/validation/test_validation_concurrency.py +289 -0
- swiftpy_framework-0.1.0/tests/validation/test_validator_rules.py +568 -0
- swiftpy_framework-0.1.0/tests/websockets/__init__.py +0 -0
- swiftpy_framework-0.1.0/tests/websockets/test_broadcast.py +216 -0
- swiftpy_framework-0.1.0/tests/websockets/test_handshake.py +379 -0
- swiftpy_framework-0.1.0/tests/websockets/test_lifecycle.py +179 -0
- swiftpy_framework-0.1.0/tests/websockets/test_websocket_concurrency.py +239 -0
- swiftpy_framework-0.1.0/tests/websockets/test_websocket_connection.py +393 -0
- swiftpy_framework-0.1.0/tests/websockets/test_websocket_manager.py +407 -0
- swiftpy_framework-0.1.0/tests/websockets/test_websocket_remediation.py +290 -0
- swiftpy_framework-0.1.0/tests/websockets/test_websocket_routing_and_lifecycle.py +161 -0
- swiftpy_framework-0.1.0/uv.lock +1205 -0
- swiftpy_framework-0.1.0/views/admin/dashboard.html +102 -0
- swiftpy_framework-0.1.0/views/admin/login.html +87 -0
- swiftpy_framework-0.1.0/views/mail/template.html +71 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
__pycache__
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*$py.class
|
|
4
|
+
.venv
|
|
5
|
+
.env
|
|
6
|
+
.env.*
|
|
7
|
+
!.env.example
|
|
8
|
+
.git
|
|
9
|
+
.github
|
|
10
|
+
.gitignore
|
|
11
|
+
.pytest_cache
|
|
12
|
+
.mypy_cache
|
|
13
|
+
.ruff_cache
|
|
14
|
+
.coverage
|
|
15
|
+
.coverage.*
|
|
16
|
+
htmlcov
|
|
17
|
+
dist
|
|
18
|
+
build
|
|
19
|
+
docker-compose*.yml
|
|
20
|
+
Dockerfile*
|
|
21
|
+
storage/cache/*
|
|
22
|
+
storage/logs/*
|
|
23
|
+
storage/app/public/*
|
|
24
|
+
bootstrap/cache/*.json
|
|
25
|
+
docs
|
|
26
|
+
AGENTS.md
|
|
27
|
+
DEVLOG.md
|
|
28
|
+
COMMANDS.md
|
|
29
|
+
PROMPTS.md
|
|
30
|
+
tests
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Application Configuration
|
|
2
|
+
APP_NAME=SwiftPY
|
|
3
|
+
APP_ENV=local
|
|
4
|
+
APP_KEY=
|
|
5
|
+
# Keep APP_DEBUG=false in staging/production; enable only for local debugging.
|
|
6
|
+
APP_DEBUG=false
|
|
7
|
+
APP_URL=http://localhost:8000
|
|
8
|
+
|
|
9
|
+
# Server (Uvicorn)
|
|
10
|
+
SERVER_HOST=127.0.0.1
|
|
11
|
+
SERVER_PORT=8000
|
|
12
|
+
SERVER_WORKERS=1
|
|
13
|
+
SERVER_RELOAD=true
|
|
14
|
+
|
|
15
|
+
# Database (PostgreSQL / asyncpg)
|
|
16
|
+
DB_CONNECTION=postgresql
|
|
17
|
+
DB_HOST=127.0.0.1
|
|
18
|
+
DB_PORT=5432
|
|
19
|
+
DB_DATABASE=swiftpy
|
|
20
|
+
DB_USERNAME=postgres
|
|
21
|
+
DB_PASSWORD=secret
|
|
22
|
+
DB_SSL=disable
|
|
23
|
+
DB_SSL_CA_FILE=
|
|
24
|
+
DB_POOL_MIN_SIZE=5
|
|
25
|
+
DB_POOL_MAX_SIZE=20
|
|
26
|
+
DB_POOL_MAX_QUERIES=50000
|
|
27
|
+
DB_POOL_MAX_INACTIVE_LIFETIME=300.0
|
|
28
|
+
DB_COMMAND_TIMEOUT=60.0
|
|
29
|
+
DB_CONNECT_TIMEOUT=10.0
|
|
30
|
+
DB_STATEMENT_TIMEOUT=30.0
|
|
31
|
+
DB_TRANSACTION_TIMEOUT=60.0
|
|
32
|
+
|
|
33
|
+
# Redis (Shared or dedicated instances)
|
|
34
|
+
REDIS_HOST=127.0.0.1
|
|
35
|
+
REDIS_PORT=6379
|
|
36
|
+
REDIS_PASSWORD=
|
|
37
|
+
REDIS_CACHE_DB=0
|
|
38
|
+
REDIS_QUEUE_DB=1
|
|
39
|
+
REDIS_EVENTS_DB=2
|
|
40
|
+
|
|
41
|
+
# Cache
|
|
42
|
+
CACHE_DRIVER=redis
|
|
43
|
+
CACHE_PREFIX=swiftpy_cache:
|
|
44
|
+
CACHE_DEFAULT_TTL=3600
|
|
45
|
+
|
|
46
|
+
# Queue
|
|
47
|
+
QUEUE_DRIVER=redis
|
|
48
|
+
QUEUE_PREFIX=swiftpy_queue:
|
|
49
|
+
QUEUE_NAME=default
|
|
50
|
+
|
|
51
|
+
# Filesystems & Storage
|
|
52
|
+
FILESYSTEM_DISK=local
|
|
53
|
+
STORAGE_LOCAL_ROOT=storage/app/private
|
|
54
|
+
STORAGE_PUBLIC_ROOT=storage/app/public
|
|
55
|
+
STORAGE_PUBLIC_URL=/storage
|
|
56
|
+
AWS_ACCESS_KEY_ID=
|
|
57
|
+
AWS_SECRET_ACCESS_KEY=
|
|
58
|
+
AWS_DEFAULT_REGION=us-east-1
|
|
59
|
+
AWS_BUCKET=
|
|
60
|
+
AWS_ENDPOINT=
|
|
61
|
+
|
|
62
|
+
# Mail Subsystem
|
|
63
|
+
MAIL_MAILER=smtp
|
|
64
|
+
MAIL_HOST=127.0.0.1
|
|
65
|
+
MAIL_PORT=587
|
|
66
|
+
MAIL_USERNAME=
|
|
67
|
+
MAIL_PASSWORD=
|
|
68
|
+
MAIL_ENCRYPTION=starttls
|
|
69
|
+
MAIL_TIMEOUT=30.0
|
|
70
|
+
MAIL_VALIDATE_CERTS=true
|
|
71
|
+
MAIL_FROM_ADDRESS=noreply@example.com
|
|
72
|
+
MAIL_FROM_NAME="${APP_NAME}"
|
|
73
|
+
RESEND_API_KEY=
|
|
74
|
+
SENDGRID_API_KEY=
|
|
75
|
+
MAILGUN_API_KEY=
|
|
76
|
+
MAILGUN_DOMAIN=
|
|
77
|
+
|
|
78
|
+
# Authentication & Security
|
|
79
|
+
AUTH_GUARD=jwt
|
|
80
|
+
JWT_SECRET=
|
|
81
|
+
JWT_ALGORITHM=HS256
|
|
82
|
+
JWT_ACCESS_TTL=900
|
|
83
|
+
JWT_REFRESH_TTL=604800
|
|
84
|
+
AUTH_KEY_PEPPER=
|
|
85
|
+
|
|
86
|
+
# CORS (use explicit comma-separated origins; never pair '*' with CORS_ALLOW_CREDENTIALS=true)
|
|
87
|
+
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8000
|
|
88
|
+
CORS_ALLOW_CREDENTIALS=false
|
|
89
|
+
CORS_MAX_AGE=600
|
|
90
|
+
|
|
91
|
+
# Logging
|
|
92
|
+
LOG_CHANNEL=stack
|
|
93
|
+
LOG_LEVEL=info
|
|
94
|
+
|
|
95
|
+
# AI Subsystem
|
|
96
|
+
AI_ENABLED=true
|
|
97
|
+
AI_DEFAULT_PROVIDER=openai
|
|
98
|
+
OPENAI_API_KEY=
|
|
99
|
+
OPENAI_MODEL=gpt-4o
|
|
100
|
+
ANTHROPIC_API_KEY=
|
|
101
|
+
ANTHROPIC_MODEL=claude-3-5-sonnet-20241022
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: Test, lint, type-check, and package validation
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
services:
|
|
15
|
+
postgres:
|
|
16
|
+
image: pgvector/pgvector:pg16
|
|
17
|
+
env:
|
|
18
|
+
POSTGRES_DB: swiftpy
|
|
19
|
+
POSTGRES_USER: postgres
|
|
20
|
+
POSTGRES_PASSWORD: secret
|
|
21
|
+
ports:
|
|
22
|
+
- 5432:5432
|
|
23
|
+
options: >-
|
|
24
|
+
--health-cmd "pg_isready -U postgres -d swiftpy"
|
|
25
|
+
--health-interval 5s
|
|
26
|
+
--health-timeout 5s
|
|
27
|
+
--health-retries 10
|
|
28
|
+
|
|
29
|
+
redis:
|
|
30
|
+
image: redis:7-alpine
|
|
31
|
+
command: "redis-server --requirepass secret"
|
|
32
|
+
ports:
|
|
33
|
+
- 6379:6379
|
|
34
|
+
options: >-
|
|
35
|
+
--health-cmd "redis-cli -a secret ping"
|
|
36
|
+
--health-interval 5s
|
|
37
|
+
--health-timeout 5s
|
|
38
|
+
--health-retries 10
|
|
39
|
+
|
|
40
|
+
env:
|
|
41
|
+
APP_ENV: testing
|
|
42
|
+
APP_KEY: "base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
43
|
+
JWT_SECRET: "very-long-and-secure-test-jwt-secret-key-32bytes!"
|
|
44
|
+
AUTH_KEY_PEPPER: "very-long-and-secure-test-auth-pepper-32bytes!"
|
|
45
|
+
DB_CONNECTION: postgresql
|
|
46
|
+
DATABASE_DEFAULT: postgresql
|
|
47
|
+
DB_HOST: localhost
|
|
48
|
+
DB_PORT: 5432
|
|
49
|
+
DB_DATABASE: swiftpy
|
|
50
|
+
DB_USERNAME: postgres
|
|
51
|
+
DB_PASSWORD: secret
|
|
52
|
+
DB_POOL_MAX_SIZE: 20
|
|
53
|
+
REDIS_HOST: localhost
|
|
54
|
+
REDIS_PORT: 6379
|
|
55
|
+
REDIS_PASSWORD: secret
|
|
56
|
+
|
|
57
|
+
steps:
|
|
58
|
+
- name: Checkout code
|
|
59
|
+
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
|
|
60
|
+
|
|
61
|
+
- name: Install uv
|
|
62
|
+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
|
|
63
|
+
with:
|
|
64
|
+
enable-cache: true
|
|
65
|
+
|
|
66
|
+
- name: Set up Python 3.12
|
|
67
|
+
run: uv python install 3.12
|
|
68
|
+
|
|
69
|
+
- name: Install SwiftPY development dependencies
|
|
70
|
+
run: uv sync --group dev --frozen || uv sync --group dev
|
|
71
|
+
|
|
72
|
+
- name: Run pytest with coverage gate
|
|
73
|
+
run: COVERAGE_FILE=/tmp/.coverage uv run pytest -vv -ra --durations=30 --timeout=120 --timeout-method=thread --cov=swiftpy --cov-report=term-missing --cov-fail-under=80
|
|
74
|
+
|
|
75
|
+
- name: Run Ruff
|
|
76
|
+
run: uv run ruff check .
|
|
77
|
+
|
|
78
|
+
- name: Run strict mypy
|
|
79
|
+
run: |
|
|
80
|
+
uv run --no-sync --with jinja2 --with aiosmtplib mypy swiftpy
|
|
81
|
+
uv run mypy swiftpy
|
|
82
|
+
uv run mypy .
|
|
83
|
+
uv run mypy --explicit-package-bases .
|
|
84
|
+
|
|
85
|
+
- name: Dependency security audit
|
|
86
|
+
run: uv run --no-sync --with pip-audit pip-audit --desc on
|
|
87
|
+
|
|
88
|
+
- name: Build and validate distributions
|
|
89
|
+
run: |
|
|
90
|
+
uv build
|
|
91
|
+
uv run --with twine twine check dist/*
|
|
92
|
+
|
|
93
|
+
- name: Smoke-test built wheel in isolated clean venv
|
|
94
|
+
run: |
|
|
95
|
+
uv venv /tmp/swiftpy-wheel-smoke --python 3.12 --clear
|
|
96
|
+
uv pip install --python /tmp/swiftpy-wheel-smoke/bin/python dist/*.whl
|
|
97
|
+
/tmp/swiftpy-wheel-smoke/bin/swiftpy --help
|
|
98
|
+
(
|
|
99
|
+
cd /tmp && /tmp/swiftpy-wheel-smoke/bin/python -c '
|
|
100
|
+
import asyncio
|
|
101
|
+
import swiftpy
|
|
102
|
+
import swiftpy.admin
|
|
103
|
+
import swiftpy.testing
|
|
104
|
+
from swiftpy import Application, Request, json_response
|
|
105
|
+
from swiftpy.ai.client import AI, AIClient
|
|
106
|
+
from swiftpy.ai.embeddings import EmbeddingsClient, generate_deterministic_embedding
|
|
107
|
+
|
|
108
|
+
assert hasattr(swiftpy, "ai")
|
|
109
|
+
app = Application(auto_discover_providers=False)
|
|
110
|
+
|
|
111
|
+
@app.get("/smoke")
|
|
112
|
+
async def smoke(req: Request):
|
|
113
|
+
return json_response({"ok": True})
|
|
114
|
+
|
|
115
|
+
sent = []
|
|
116
|
+
async def receive():
|
|
117
|
+
return {"type": "http.request", "body": b"", "more_body": False}
|
|
118
|
+
|
|
119
|
+
async def send(msg):
|
|
120
|
+
sent.append(msg)
|
|
121
|
+
|
|
122
|
+
async def main():
|
|
123
|
+
scope = {
|
|
124
|
+
"type": "http",
|
|
125
|
+
"asgi": {"version": "3.0"},
|
|
126
|
+
"method": "GET",
|
|
127
|
+
"path": "/smoke",
|
|
128
|
+
"raw_path": b"/smoke",
|
|
129
|
+
"query_string": b"",
|
|
130
|
+
"headers": [],
|
|
131
|
+
}
|
|
132
|
+
await app(scope, receive, send)
|
|
133
|
+
assert sent[0]["status"] == 200
|
|
134
|
+
fake = AI.fake("smoke-ok")
|
|
135
|
+
resp = await AI.chat().user("hello").send()
|
|
136
|
+
assert resp.content == "smoke-ok"
|
|
137
|
+
fake.restore()
|
|
138
|
+
vec = generate_deterministic_embedding("hello", dimensions=8)
|
|
139
|
+
assert len(vec) == 8
|
|
140
|
+
|
|
141
|
+
asyncio.run(main())
|
|
142
|
+
'
|
|
143
|
+
)
|
|
144
|
+
rm -rf /tmp/swiftpy-wheel-smoke
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build-and-publish:
|
|
9
|
+
name: Build and publish package
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment:
|
|
12
|
+
name: pypi
|
|
13
|
+
permissions:
|
|
14
|
+
id-token: write
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout code
|
|
18
|
+
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
|
|
19
|
+
|
|
20
|
+
- name: Install uv
|
|
21
|
+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
|
|
22
|
+
with:
|
|
23
|
+
enable-cache: true
|
|
24
|
+
|
|
25
|
+
- name: Set up Python 3.12
|
|
26
|
+
run: uv python install 3.12
|
|
27
|
+
|
|
28
|
+
- name: Install build tooling
|
|
29
|
+
run: uv sync --group dev --frozen || uv sync --group dev
|
|
30
|
+
|
|
31
|
+
- name: Build wheel and source distribution
|
|
32
|
+
run: uv build
|
|
33
|
+
|
|
34
|
+
- name: Validate package artifacts
|
|
35
|
+
run: uv run --with twine twine check dist/*
|
|
36
|
+
|
|
37
|
+
- name: Publish to PyPI via trusted publishing
|
|
38
|
+
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1 (v1.14.3)
|
|
39
|
+
with:
|
|
40
|
+
packages-dir: dist/
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*$py.class
|
|
4
|
+
*.pyc
|
|
5
|
+
*.pyo
|
|
6
|
+
*.pyd
|
|
7
|
+
|
|
8
|
+
.env
|
|
9
|
+
.env.*
|
|
10
|
+
!.env.example
|
|
11
|
+
|
|
12
|
+
storage/cache/
|
|
13
|
+
storage/logs/
|
|
14
|
+
bootstrap/cache/*.json
|
|
15
|
+
!bootstrap/cache/.gitkeep
|
|
16
|
+
.venv/
|
|
17
|
+
.mypy_cache/
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.ruff_cache/
|
|
20
|
+
|
|
21
|
+
.coverage
|
|
22
|
+
.coverage.*
|
|
23
|
+
htmlcov/
|
|
24
|
+
dist/
|
|
25
|
+
build/
|
|
26
|
+
*.egg-info/
|
|
27
|
+
|
|
28
|
+
COMMANDS.md
|
|
29
|
+
PROMPTS.md
|
|
30
|
+
/docs/
|
|
31
|
+
AGENTS.md
|
|
32
|
+
DEVLOG.md
|