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.
Files changed (453) hide show
  1. swiftpy_framework-0.1.0/.dockerignore +30 -0
  2. swiftpy_framework-0.1.0/.env.example +101 -0
  3. swiftpy_framework-0.1.0/.github/workflows/ci.yml +144 -0
  4. swiftpy_framework-0.1.0/.github/workflows/publish.yml +40 -0
  5. swiftpy_framework-0.1.0/.gitignore +32 -0
  6. swiftpy_framework-0.1.0/CHANGELOG.md +386 -0
  7. swiftpy_framework-0.1.0/CONTRIBUTING.md +125 -0
  8. swiftpy_framework-0.1.0/Dockerfile +52 -0
  9. swiftpy_framework-0.1.0/LICENSE +21 -0
  10. swiftpy_framework-0.1.0/PKG-INFO +603 -0
  11. swiftpy_framework-0.1.0/README.md +573 -0
  12. swiftpy_framework-0.1.0/app/__init__.py +0 -0
  13. swiftpy_framework-0.1.0/app/events/user_registered.py +15 -0
  14. swiftpy_framework-0.1.0/app/http/handler/exceptions.py +25 -0
  15. swiftpy_framework-0.1.0/app/http/middleware/__init__.py +0 -0
  16. swiftpy_framework-0.1.0/app/http/middleware/admin_middleware.py +45 -0
  17. swiftpy_framework-0.1.0/app/http/middleware/auth_middleware.py +39 -0
  18. swiftpy_framework-0.1.0/app/http/middleware/test_middleware.py +11 -0
  19. swiftpy_framework-0.1.0/app/http/requests/create_user_request.py +25 -0
  20. swiftpy_framework-0.1.0/app/jobs/send_notification_job.py +30 -0
  21. swiftpy_framework-0.1.0/app/listeners/send_welcome_notification.py +22 -0
  22. swiftpy_framework-0.1.0/app/mail/welcome_email.py +29 -0
  23. swiftpy_framework-0.1.0/app/models/user.py +26 -0
  24. swiftpy_framework-0.1.0/app/providers/app_service_provider.py +18 -0
  25. swiftpy_framework-0.1.0/app/providers/auth_service_provider.py +60 -0
  26. swiftpy_framework-0.1.0/app/providers/cache_service_provider.py +16 -0
  27. swiftpy_framework-0.1.0/app/providers/database_service_provider.py +12 -0
  28. swiftpy_framework-0.1.0/app/providers/event_service_provider.py +24 -0
  29. swiftpy_framework-0.1.0/app/providers/filesystem_service_provider.py +17 -0
  30. swiftpy_framework-0.1.0/app/providers/mail_service_provider.py +24 -0
  31. swiftpy_framework-0.1.0/app/providers/queue_service_provider.py +18 -0
  32. swiftpy_framework-0.1.0/app/repositories/user_repository.py +23 -0
  33. swiftpy_framework-0.1.0/app/schemas/user_schema.py +26 -0
  34. swiftpy_framework-0.1.0/app/services/user_service.py +27 -0
  35. swiftpy_framework-0.1.0/bootstrap/cache/.gitkeep +0 -0
  36. swiftpy_framework-0.1.0/config/__init__.py +0 -0
  37. swiftpy_framework-0.1.0/config/ai.py +69 -0
  38. swiftpy_framework-0.1.0/config/app.py +13 -0
  39. swiftpy_framework-0.1.0/config/auth.py +35 -0
  40. swiftpy_framework-0.1.0/config/cache.py +23 -0
  41. swiftpy_framework-0.1.0/config/cors.py +16 -0
  42. swiftpy_framework-0.1.0/config/database.py +30 -0
  43. swiftpy_framework-0.1.0/config/events.py +12 -0
  44. swiftpy_framework-0.1.0/config/filesystems.py +49 -0
  45. swiftpy_framework-0.1.0/config/logging.py +25 -0
  46. swiftpy_framework-0.1.0/config/mail.py +64 -0
  47. swiftpy_framework-0.1.0/config/queue.py +18 -0
  48. swiftpy_framework-0.1.0/database/migrations/2026_01_01_000000_create_users_table.py +20 -0
  49. swiftpy_framework-0.1.0/database/seeders/database_seeder.py +16 -0
  50. swiftpy_framework-0.1.0/docker-compose.yml +89 -0
  51. swiftpy_framework-0.1.0/documentations/2026-11-14-installation-quick-start.md +243 -0
  52. swiftpy_framework-0.1.0/documentations/2026-11-15-core-application-di-and-config.md +461 -0
  53. swiftpy_framework-0.1.0/documentations/2026-11-15-http-routing-middleware-and-exceptions.md +806 -0
  54. swiftpy_framework-0.1.0/main.py +58 -0
  55. swiftpy_framework-0.1.0/pyproject.toml +88 -0
  56. swiftpy_framework-0.1.0/red-black.png +0 -0
  57. swiftpy_framework-0.1.0/routes/__init__.py +2 -0
  58. swiftpy_framework-0.1.0/routes/api.py +26 -0
  59. swiftpy_framework-0.1.0/swiftpy/.gitignore +0 -0
  60. swiftpy_framework-0.1.0/swiftpy/__init__.py +572 -0
  61. swiftpy_framework-0.1.0/swiftpy/admin/__init__.py +50 -0
  62. swiftpy_framework-0.1.0/swiftpy/admin/auth.py +522 -0
  63. swiftpy_framework-0.1.0/swiftpy/admin/registry.py +567 -0
  64. swiftpy_framework-0.1.0/swiftpy/admin/views.py +1583 -0
  65. swiftpy_framework-0.1.0/swiftpy/ai/__init__.py +199 -0
  66. swiftpy_framework-0.1.0/swiftpy/ai/_deterministic.py +40 -0
  67. swiftpy_framework-0.1.0/swiftpy/ai/_fake.py +604 -0
  68. swiftpy_framework-0.1.0/swiftpy/ai/agents/__init__.py +30 -0
  69. swiftpy_framework-0.1.0/swiftpy/ai/agents/base_agent.py +506 -0
  70. swiftpy_framework-0.1.0/swiftpy/ai/agents/memory.py +864 -0
  71. swiftpy_framework-0.1.0/swiftpy/ai/client.py +1011 -0
  72. swiftpy_framework-0.1.0/swiftpy/ai/conversation.py +171 -0
  73. swiftpy_framework-0.1.0/swiftpy/ai/embeddings.py +321 -0
  74. swiftpy_framework-0.1.0/swiftpy/ai/exceptions.py +75 -0
  75. swiftpy_framework-0.1.0/swiftpy/ai/history_strategies.py +157 -0
  76. swiftpy_framework-0.1.0/swiftpy/ai/middleware.py +918 -0
  77. swiftpy_framework-0.1.0/swiftpy/ai/observability/__init__.py +28 -0
  78. swiftpy_framework-0.1.0/swiftpy/ai/observability/drivers.py +763 -0
  79. swiftpy_framework-0.1.0/swiftpy/ai/observability/observer.py +364 -0
  80. swiftpy_framework-0.1.0/swiftpy/ai/pool.py +102 -0
  81. swiftpy_framework-0.1.0/swiftpy/ai/pricing.py +101 -0
  82. swiftpy_framework-0.1.0/swiftpy/ai/prompts/__init__.py +6 -0
  83. swiftpy_framework-0.1.0/swiftpy/ai/prompts/loader.py +343 -0
  84. swiftpy_framework-0.1.0/swiftpy/ai/providers/__init__.py +22 -0
  85. swiftpy_framework-0.1.0/swiftpy/ai/providers/anthropic_provider.py +353 -0
  86. swiftpy_framework-0.1.0/swiftpy/ai/providers/base.py +273 -0
  87. swiftpy_framework-0.1.0/swiftpy/ai/providers/openai_provider.py +275 -0
  88. swiftpy_framework-0.1.0/swiftpy/ai/rag/__init__.py +53 -0
  89. swiftpy_framework-0.1.0/swiftpy/ai/rag/context_formatter.py +263 -0
  90. swiftpy_framework-0.1.0/swiftpy/ai/rag/pipeline_builder.py +544 -0
  91. swiftpy_framework-0.1.0/swiftpy/ai/rag/reranker.py +484 -0
  92. swiftpy_framework-0.1.0/swiftpy/ai/rag/result.py +78 -0
  93. swiftpy_framework-0.1.0/swiftpy/ai/rag/retriever.py +315 -0
  94. swiftpy_framework-0.1.0/swiftpy/ai/redis_store.py +227 -0
  95. swiftpy_framework-0.1.0/swiftpy/ai/streaming.py +115 -0
  96. swiftpy_framework-0.1.0/swiftpy/ai/tools/__init__.py +22 -0
  97. swiftpy_framework-0.1.0/swiftpy/ai/tools/base_tool.py +489 -0
  98. swiftpy_framework-0.1.0/swiftpy/ai/tools/first_party.py +384 -0
  99. swiftpy_framework-0.1.0/swiftpy/ai/tools/tool_loop.py +417 -0
  100. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/__init__.py +46 -0
  101. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/base.py +542 -0
  102. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/chroma_adapter.py +435 -0
  103. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/in_memory_adapter.py +321 -0
  104. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/lancedb_adapter.py +370 -0
  105. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/pgvector_adapter.py +496 -0
  106. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/pinecone_adapter.py +445 -0
  107. swiftpy_framework-0.1.0/swiftpy/ai/vectorstore/qdrant_adapter.py +418 -0
  108. swiftpy_framework-0.1.0/swiftpy/auth/__init__.py +50 -0
  109. swiftpy_framework-0.1.0/swiftpy/auth/api_key_guard.py +544 -0
  110. swiftpy_framework-0.1.0/swiftpy/auth/auth_manager.py +259 -0
  111. swiftpy_framework-0.1.0/swiftpy/auth/exceptions.py +71 -0
  112. swiftpy_framework-0.1.0/swiftpy/auth/jwt_guard.py +230 -0
  113. swiftpy_framework-0.1.0/swiftpy/auth/jwt_issuer.py +658 -0
  114. swiftpy_framework-0.1.0/swiftpy/auth/token_blacklist.py +300 -0
  115. swiftpy_framework-0.1.0/swiftpy/cache/__init__.py +14 -0
  116. swiftpy_framework-0.1.0/swiftpy/cache/cache.py +251 -0
  117. swiftpy_framework-0.1.0/swiftpy/cache/driver.py +216 -0
  118. swiftpy_framework-0.1.0/swiftpy/cache/drivers/memory.py +199 -0
  119. swiftpy_framework-0.1.0/swiftpy/cache/drivers/redis.py +421 -0
  120. swiftpy_framework-0.1.0/swiftpy/console/__init__.py +0 -0
  121. swiftpy_framework-0.1.0/swiftpy/console/cli.py +68 -0
  122. swiftpy_framework-0.1.0/swiftpy/console/commands/__init__.py +0 -0
  123. swiftpy_framework-0.1.0/swiftpy/console/commands/cache.py +164 -0
  124. swiftpy_framework-0.1.0/swiftpy/console/commands/make.py +935 -0
  125. swiftpy_framework-0.1.0/swiftpy/console/commands/migrate.py +280 -0
  126. swiftpy_framework-0.1.0/swiftpy/console/commands/new.py +1806 -0
  127. swiftpy_framework-0.1.0/swiftpy/console/commands/queue.py +306 -0
  128. swiftpy_framework-0.1.0/swiftpy/console/commands/seed.py +252 -0
  129. swiftpy_framework-0.1.0/swiftpy/console/commands/start.py +171 -0
  130. swiftpy_framework-0.1.0/swiftpy/console/commands/storage.py +104 -0
  131. swiftpy_framework-0.1.0/swiftpy/console/loader.py +21 -0
  132. swiftpy_framework-0.1.0/swiftpy/console/stubs/__init__.py +26 -0
  133. swiftpy_framework-0.1.0/swiftpy/console/stubs/controller.stub +14 -0
  134. swiftpy_framework-0.1.0/swiftpy/console/stubs/event.stub +14 -0
  135. swiftpy_framework-0.1.0/swiftpy/console/stubs/job.stub +22 -0
  136. swiftpy_framework-0.1.0/swiftpy/console/stubs/listener.stub +14 -0
  137. swiftpy_framework-0.1.0/swiftpy/console/stubs/mail.stub +20 -0
  138. swiftpy_framework-0.1.0/swiftpy/console/stubs/middleware.stub +16 -0
  139. swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.alter.stub +17 -0
  140. swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.api_keys.stub +22 -0
  141. swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.blank.stub +11 -0
  142. swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.create.stub +15 -0
  143. swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.stub +11 -0
  144. swiftpy_framework-0.1.0/swiftpy/console/stubs/migration.update.stub +17 -0
  145. swiftpy_framework-0.1.0/swiftpy/console/stubs/model.stub +17 -0
  146. swiftpy_framework-0.1.0/swiftpy/console/stubs/provider.stub +18 -0
  147. swiftpy_framework-0.1.0/swiftpy/console/stubs/repository.stub +10 -0
  148. swiftpy_framework-0.1.0/swiftpy/console/stubs/request.stub +16 -0
  149. swiftpy_framework-0.1.0/swiftpy/console/stubs/resource.stub +21 -0
  150. swiftpy_framework-0.1.0/swiftpy/console/stubs/schema.stub +12 -0
  151. swiftpy_framework-0.1.0/swiftpy/console/stubs/seeder.stub +14 -0
  152. swiftpy_framework-0.1.0/swiftpy/console/stubs/service.stub +10 -0
  153. swiftpy_framework-0.1.0/swiftpy/core/__init__.py +0 -0
  154. swiftpy_framework-0.1.0/swiftpy/core/application.py +1306 -0
  155. swiftpy_framework-0.1.0/swiftpy/core/bootstrap.py +30 -0
  156. swiftpy_framework-0.1.0/swiftpy/core/config.py +432 -0
  157. swiftpy_framework-0.1.0/swiftpy/core/container.py +596 -0
  158. swiftpy_framework-0.1.0/swiftpy/core/container_exceptions.py +18 -0
  159. swiftpy_framework-0.1.0/swiftpy/core/context.py +148 -0
  160. swiftpy_framework-0.1.0/swiftpy/core/exceptions.py +352 -0
  161. swiftpy_framework-0.1.0/swiftpy/core/providers/base.py +35 -0
  162. swiftpy_framework-0.1.0/swiftpy/database/__init__.py +41 -0
  163. swiftpy_framework-0.1.0/swiftpy/database/exceptions.py +42 -0
  164. swiftpy_framework-0.1.0/swiftpy/database/identifiers.py +105 -0
  165. swiftpy_framework-0.1.0/swiftpy/database/migrations/__init__.py +36 -0
  166. swiftpy_framework-0.1.0/swiftpy/database/migrations/blueprint.py +431 -0
  167. swiftpy_framework-0.1.0/swiftpy/database/migrations/lock.py +104 -0
  168. swiftpy_framework-0.1.0/swiftpy/database/migrations/migration.py +22 -0
  169. swiftpy_framework-0.1.0/swiftpy/database/migrations/migrator.py +507 -0
  170. swiftpy_framework-0.1.0/swiftpy/database/migrations/schema.py +435 -0
  171. swiftpy_framework-0.1.0/swiftpy/database/orm/__init__.py +33 -0
  172. swiftpy_framework-0.1.0/swiftpy/database/orm/fields.py +92 -0
  173. swiftpy_framework-0.1.0/swiftpy/database/orm/model.py +2034 -0
  174. swiftpy_framework-0.1.0/swiftpy/database/orm/registry.py +33 -0
  175. swiftpy_framework-0.1.0/swiftpy/database/orm/relationships.py +836 -0
  176. swiftpy_framework-0.1.0/swiftpy/database/pagination/__init__.py +16 -0
  177. swiftpy_framework-0.1.0/swiftpy/database/pagination/contracts.py +60 -0
  178. swiftpy_framework-0.1.0/swiftpy/database/pagination/paginator.py +112 -0
  179. swiftpy_framework-0.1.0/swiftpy/database/pagination/simple_paginator.py +97 -0
  180. swiftpy_framework-0.1.0/swiftpy/database/pool.py +218 -0
  181. swiftpy_framework-0.1.0/swiftpy/database/query_builder.py +1803 -0
  182. swiftpy_framework-0.1.0/swiftpy/database/seeder.py +39 -0
  183. swiftpy_framework-0.1.0/swiftpy/database/transaction.py +276 -0
  184. swiftpy_framework-0.1.0/swiftpy/events/__init__.py +10 -0
  185. swiftpy_framework-0.1.0/swiftpy/events/dispatcher.py +308 -0
  186. swiftpy_framework-0.1.0/swiftpy/events/redis_bus.py +552 -0
  187. swiftpy_framework-0.1.0/swiftpy/filesystem/__init__.py +227 -0
  188. swiftpy_framework-0.1.0/swiftpy/filesystem/disk.py +378 -0
  189. swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/__init__.py +11 -0
  190. swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/base.py +156 -0
  191. swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/local.py +559 -0
  192. swiftpy_framework-0.1.0/swiftpy/filesystem/drivers/s3.py +655 -0
  193. swiftpy_framework-0.1.0/swiftpy/filesystem/events.py +37 -0
  194. swiftpy_framework-0.1.0/swiftpy/filesystem/exceptions.py +127 -0
  195. swiftpy_framework-0.1.0/swiftpy/filesystem/manager.py +138 -0
  196. swiftpy_framework-0.1.0/swiftpy/filesystem/metadata.py +22 -0
  197. swiftpy_framework-0.1.0/swiftpy/filesystem/paths.py +99 -0
  198. swiftpy_framework-0.1.0/swiftpy/filesystem/service_provider.py +17 -0
  199. swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/__init__.py +13 -0
  200. swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/handlers.py +362 -0
  201. swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/uploaded_file.py +222 -0
  202. swiftpy_framework-0.1.0/swiftpy/filesystem/uploads/validators.py +186 -0
  203. swiftpy_framework-0.1.0/swiftpy/filesystem/visibility.py +22 -0
  204. swiftpy_framework-0.1.0/swiftpy/helpers/__init__.py +42 -0
  205. swiftpy_framework-0.1.0/swiftpy/helpers/helper.py +180 -0
  206. swiftpy_framework-0.1.0/swiftpy/http/exceptions.py +41 -0
  207. swiftpy_framework-0.1.0/swiftpy/http/middleware.py +307 -0
  208. swiftpy_framework-0.1.0/swiftpy/http/request.py +375 -0
  209. swiftpy_framework-0.1.0/swiftpy/http/response.py +442 -0
  210. swiftpy_framework-0.1.0/swiftpy/http/router.py +1050 -0
  211. swiftpy_framework-0.1.0/swiftpy/mail/__init__.py +58 -0
  212. swiftpy_framework-0.1.0/swiftpy/mail/attachments.py +255 -0
  213. swiftpy_framework-0.1.0/swiftpy/mail/config.py +71 -0
  214. swiftpy_framework-0.1.0/swiftpy/mail/envelope.py +183 -0
  215. swiftpy_framework-0.1.0/swiftpy/mail/exceptions.py +90 -0
  216. swiftpy_framework-0.1.0/swiftpy/mail/facade.py +312 -0
  217. swiftpy_framework-0.1.0/swiftpy/mail/mailable.py +53 -0
  218. swiftpy_framework-0.1.0/swiftpy/mail/manager.py +240 -0
  219. swiftpy_framework-0.1.0/swiftpy/mail/message.py +186 -0
  220. swiftpy_framework-0.1.0/swiftpy/mail/models.py +19 -0
  221. swiftpy_framework-0.1.0/swiftpy/mail/queue/__init__.py +5 -0
  222. swiftpy_framework-0.1.0/swiftpy/mail/queue/job.py +279 -0
  223. swiftpy_framework-0.1.0/swiftpy/mail/service_provider.py +19 -0
  224. swiftpy_framework-0.1.0/swiftpy/mail/templates/__init__.py +5 -0
  225. swiftpy_framework-0.1.0/swiftpy/mail/templates/renderer.py +173 -0
  226. swiftpy_framework-0.1.0/swiftpy/mail/transports/__init__.py +21 -0
  227. swiftpy_framework-0.1.0/swiftpy/mail/transports/api/__init__.py +13 -0
  228. swiftpy_framework-0.1.0/swiftpy/mail/transports/api/base.py +194 -0
  229. swiftpy_framework-0.1.0/swiftpy/mail/transports/api/mailgun.py +158 -0
  230. swiftpy_framework-0.1.0/swiftpy/mail/transports/api/resend.py +156 -0
  231. swiftpy_framework-0.1.0/swiftpy/mail/transports/api/sendgrid.py +172 -0
  232. swiftpy_framework-0.1.0/swiftpy/mail/transports/base.py +24 -0
  233. swiftpy_framework-0.1.0/swiftpy/mail/transports/console.py +91 -0
  234. swiftpy_framework-0.1.0/swiftpy/mail/transports/sendmail.py +128 -0
  235. swiftpy_framework-0.1.0/swiftpy/mail/transports/smtp.py +466 -0
  236. swiftpy_framework-0.1.0/swiftpy/queue/__init__.py +13 -0
  237. swiftpy_framework-0.1.0/swiftpy/queue/dispatcher.py +813 -0
  238. swiftpy_framework-0.1.0/swiftpy/queue/job.py +541 -0
  239. swiftpy_framework-0.1.0/swiftpy/queue/worker.py +556 -0
  240. swiftpy_framework-0.1.0/swiftpy/support/__init__.py +12 -0
  241. swiftpy_framework-0.1.0/swiftpy/support/keys.py +108 -0
  242. swiftpy_framework-0.1.0/swiftpy/support/redis_config.py +223 -0
  243. swiftpy_framework-0.1.0/swiftpy/support/strings.py +114 -0
  244. swiftpy_framework-0.1.0/swiftpy/testing/__init__.py +20 -0
  245. swiftpy_framework-0.1.0/swiftpy/testing/fakes/__init__.py +11 -0
  246. swiftpy_framework-0.1.0/swiftpy/testing/fakes/ai_fake.py +21 -0
  247. swiftpy_framework-0.1.0/swiftpy/testing/fakes/vectorstore_fake.py +194 -0
  248. swiftpy_framework-0.1.0/swiftpy/testing/fixtures.py +124 -0
  249. swiftpy_framework-0.1.0/swiftpy/testing/http_client.py +730 -0
  250. swiftpy_framework-0.1.0/swiftpy/testing/test_case.py +126 -0
  251. swiftpy_framework-0.1.0/swiftpy/validation/__init__.py +97 -0
  252. swiftpy_framework-0.1.0/swiftpy/validation/exceptions.py +26 -0
  253. swiftpy_framework-0.1.0/swiftpy/validation/form_request.py +302 -0
  254. swiftpy_framework-0.1.0/swiftpy/validation/protocols.py +33 -0
  255. swiftpy_framework-0.1.0/swiftpy/validation/rules/__init__.py +89 -0
  256. swiftpy_framework-0.1.0/swiftpy/validation/rules/builtin.py +391 -0
  257. swiftpy_framework-0.1.0/swiftpy/validation/rules/exists.py +86 -0
  258. swiftpy_framework-0.1.0/swiftpy/validation/rules/registry.py +290 -0
  259. swiftpy_framework-0.1.0/swiftpy/validation/rules/required.py +55 -0
  260. swiftpy_framework-0.1.0/swiftpy/validation/rules/unique.py +138 -0
  261. swiftpy_framework-0.1.0/swiftpy/validation/validator.py +612 -0
  262. swiftpy_framework-0.1.0/swiftpy/websockets/__init__.py +19 -0
  263. swiftpy_framework-0.1.0/swiftpy/websockets/connection.py +317 -0
  264. swiftpy_framework-0.1.0/swiftpy/websockets/manager.py +271 -0
  265. swiftpy_framework-0.1.0/tests/__init__.py +0 -0
  266. swiftpy_framework-0.1.0/tests/admin/__init__.py +0 -0
  267. swiftpy_framework-0.1.0/tests/admin/test_admin.py +899 -0
  268. swiftpy_framework-0.1.0/tests/ai/__init__.py +0 -0
  269. swiftpy_framework-0.1.0/tests/ai/conftest.py +52 -0
  270. swiftpy_framework-0.1.0/tests/ai/integration/__init__.py +2 -0
  271. swiftpy_framework-0.1.0/tests/ai/integration/test_chroma.py +79 -0
  272. swiftpy_framework-0.1.0/tests/ai/integration/test_lancedb.py +71 -0
  273. swiftpy_framework-0.1.0/tests/ai/integration/test_pinecone.py +61 -0
  274. swiftpy_framework-0.1.0/tests/ai/integration/test_qdrant.py +88 -0
  275. swiftpy_framework-0.1.0/tests/ai/integration/test_rag_integration.py +137 -0
  276. swiftpy_framework-0.1.0/tests/ai/test_agents.py +779 -0
  277. swiftpy_framework-0.1.0/tests/ai/test_ai_fake.py +216 -0
  278. swiftpy_framework-0.1.0/tests/ai/test_ai_fake_isolation.py +212 -0
  279. swiftpy_framework-0.1.0/tests/ai/test_client.py +392 -0
  280. swiftpy_framework-0.1.0/tests/ai/test_conversation.py +438 -0
  281. swiftpy_framework-0.1.0/tests/ai/test_embeddings.py +516 -0
  282. swiftpy_framework-0.1.0/tests/ai/test_middleware.py +277 -0
  283. swiftpy_framework-0.1.0/tests/ai/test_middleware_concurrency.py +313 -0
  284. swiftpy_framework-0.1.0/tests/ai/test_observability.py +289 -0
  285. swiftpy_framework-0.1.0/tests/ai/test_observability_resilience.py +280 -0
  286. swiftpy_framework-0.1.0/tests/ai/test_phase7_ai_remediation.py +873 -0
  287. swiftpy_framework-0.1.0/tests/ai/test_phase8_agents_tools_prompts_remediation.py +699 -0
  288. swiftpy_framework-0.1.0/tests/ai/test_phase8_rag_remediation.py +376 -0
  289. swiftpy_framework-0.1.0/tests/ai/test_phase8_vectorstore_remediation.py +585 -0
  290. swiftpy_framework-0.1.0/tests/ai/test_prompts.py +147 -0
  291. swiftpy_framework-0.1.0/tests/ai/test_prompts_security.py +146 -0
  292. swiftpy_framework-0.1.0/tests/ai/test_providers.py +704 -0
  293. swiftpy_framework-0.1.0/tests/ai/test_rag.py +1321 -0
  294. swiftpy_framework-0.1.0/tests/ai/test_streaming.py +503 -0
  295. swiftpy_framework-0.1.0/tests/ai/test_tools.py +955 -0
  296. swiftpy_framework-0.1.0/tests/ai/test_vectorstore.py +606 -0
  297. swiftpy_framework-0.1.0/tests/ai/test_vectorstore_adapters.py +1209 -0
  298. swiftpy_framework-0.1.0/tests/app/__init__.py +0 -0
  299. swiftpy_framework-0.1.0/tests/app/test_application_providers.py +290 -0
  300. swiftpy_framework-0.1.0/tests/app/test_starter_auth.py +202 -0
  301. swiftpy_framework-0.1.0/tests/auth/__init__.py +0 -0
  302. swiftpy_framework-0.1.0/tests/auth/test_api_key_guard.py +427 -0
  303. swiftpy_framework-0.1.0/tests/auth/test_auth_manager.py +131 -0
  304. swiftpy_framework-0.1.0/tests/auth/test_auth_remediation.py +237 -0
  305. swiftpy_framework-0.1.0/tests/auth/test_auth_security.py +1516 -0
  306. swiftpy_framework-0.1.0/tests/auth/test_jwt_issuer.py +323 -0
  307. swiftpy_framework-0.1.0/tests/auth/test_token_blacklist.py +165 -0
  308. swiftpy_framework-0.1.0/tests/benchmarks.py +208 -0
  309. swiftpy_framework-0.1.0/tests/cache/__init__.py +0 -0
  310. swiftpy_framework-0.1.0/tests/cache/test_cache_concurrency.py +410 -0
  311. swiftpy_framework-0.1.0/tests/cache/test_cache_manager.py +122 -0
  312. swiftpy_framework-0.1.0/tests/cache/test_driver_correctness.py +244 -0
  313. swiftpy_framework-0.1.0/tests/cache/test_memory_cache.py +324 -0
  314. swiftpy_framework-0.1.0/tests/cache/test_redis_cache.py +273 -0
  315. swiftpy_framework-0.1.0/tests/concurrency/__init__.py +0 -0
  316. swiftpy_framework-0.1.0/tests/concurrency/test_circular_dependency.py +36 -0
  317. swiftpy_framework-0.1.0/tests/concurrency/test_container_semantics.py +271 -0
  318. swiftpy_framework-0.1.0/tests/concurrency/test_resolution.py +44 -0
  319. swiftpy_framework-0.1.0/tests/concurrency/test_resolution2.py +87 -0
  320. swiftpy_framework-0.1.0/tests/conftest.py +22 -0
  321. swiftpy_framework-0.1.0/tests/console/__init__.py +0 -0
  322. swiftpy_framework-0.1.0/tests/console/test_cache_commands.py +108 -0
  323. swiftpy_framework-0.1.0/tests/console/test_new_command.py +471 -0
  324. swiftpy_framework-0.1.0/tests/console/test_phase9_cli_remediation.py +172 -0
  325. swiftpy_framework-0.1.0/tests/console/test_start.py +128 -0
  326. swiftpy_framework-0.1.0/tests/console/test_stubs_and_make.py +444 -0
  327. swiftpy_framework-0.1.0/tests/core/__init__.py +0 -0
  328. swiftpy_framework-0.1.0/tests/core/test_application_config_isolation.py +198 -0
  329. swiftpy_framework-0.1.0/tests/core/test_core_config.py +390 -0
  330. swiftpy_framework-0.1.0/tests/core/test_exceptions.py +345 -0
  331. swiftpy_framework-0.1.0/tests/core/test_instance_singletons.py +174 -0
  332. swiftpy_framework-0.1.0/tests/core/test_lifespan.py +261 -0
  333. swiftpy_framework-0.1.0/tests/database/__init__.py +0 -0
  334. swiftpy_framework-0.1.0/tests/database/test_orm_expansion.py +457 -0
  335. swiftpy_framework-0.1.0/tests/database/test_orm_vector.py +83 -0
  336. swiftpy_framework-0.1.0/tests/database/test_pagination_and_grouping.py +744 -0
  337. swiftpy_framework-0.1.0/tests/database/test_pagination_pg_integration.py +272 -0
  338. swiftpy_framework-0.1.0/tests/database/test_pgvector_integration.py +181 -0
  339. swiftpy_framework-0.1.0/tests/database/test_phase4_remediation.py +567 -0
  340. swiftpy_framework-0.1.0/tests/database/test_query_expansion.py +544 -0
  341. swiftpy_framework-0.1.0/tests/database/test_query_expansion_pg_integration.py +212 -0
  342. swiftpy_framework-0.1.0/tests/database/test_seeder.py +287 -0
  343. swiftpy_framework-0.1.0/tests/db/__init__.py +0 -0
  344. swiftpy_framework-0.1.0/tests/db/load_test_database.py +221 -0
  345. swiftpy_framework-0.1.0/tests/db/load_test_database2.py +218 -0
  346. swiftpy_framework-0.1.0/tests/db/test_arbitrary_primary_keys.py +174 -0
  347. swiftpy_framework-0.1.0/tests/db/test_identifiers.py +115 -0
  348. swiftpy_framework-0.1.0/tests/db/test_mass_writes.py +166 -0
  349. swiftpy_framework-0.1.0/tests/db/test_pool_config.py +190 -0
  350. swiftpy_framework-0.1.0/tests/db/test_query_builder_terminals.py +125 -0
  351. swiftpy_framework-0.1.0/tests/db/test_sql_injections.py +315 -0
  352. swiftpy_framework-0.1.0/tests/db/test_transaction_isolation.py +209 -0
  353. swiftpy_framework-0.1.0/tests/docs/__init__.py +0 -0
  354. swiftpy_framework-0.1.0/tests/docs/test_readme_examples.py +483 -0
  355. swiftpy_framework-0.1.0/tests/e2e/__init__.py +0 -0
  356. swiftpy_framework-0.1.0/tests/e2e/test_concurrent_auth.py +197 -0
  357. swiftpy_framework-0.1.0/tests/e2e/test_crud_auth_e2e.py +449 -0
  358. swiftpy_framework-0.1.0/tests/events/__init__.py +0 -0
  359. swiftpy_framework-0.1.0/tests/events/test_event_dispatcher.py +337 -0
  360. swiftpy_framework-0.1.0/tests/events/test_model_events.py +247 -0
  361. swiftpy_framework-0.1.0/tests/events/test_redis_bus.py +486 -0
  362. swiftpy_framework-0.1.0/tests/events/test_redis_bus_reliability.py +275 -0
  363. swiftpy_framework-0.1.0/tests/filesystem/__init__.py +0 -0
  364. swiftpy_framework-0.1.0/tests/filesystem/test_cli_storage_link.py +44 -0
  365. swiftpy_framework-0.1.0/tests/filesystem/test_disk.py +154 -0
  366. swiftpy_framework-0.1.0/tests/filesystem/test_filesystem_concurrency.py +62 -0
  367. swiftpy_framework-0.1.0/tests/filesystem/test_filesystem_config.py +88 -0
  368. swiftpy_framework-0.1.0/tests/filesystem/test_http_integration.py +266 -0
  369. swiftpy_framework-0.1.0/tests/filesystem/test_local_driver.py +251 -0
  370. swiftpy_framework-0.1.0/tests/filesystem/test_multipart.py +144 -0
  371. swiftpy_framework-0.1.0/tests/filesystem/test_paths.py +115 -0
  372. swiftpy_framework-0.1.0/tests/filesystem/test_phase6_filesystem_remediation.py +423 -0
  373. swiftpy_framework-0.1.0/tests/filesystem/test_s3_driver.py +284 -0
  374. swiftpy_framework-0.1.0/tests/filesystem/test_signed_urls.py +74 -0
  375. swiftpy_framework-0.1.0/tests/filesystem/test_storage_facade.py +87 -0
  376. swiftpy_framework-0.1.0/tests/filesystem/test_uploaded_file.py +192 -0
  377. swiftpy_framework-0.1.0/tests/filesystem/test_validation.py +191 -0
  378. swiftpy_framework-0.1.0/tests/http/__init__.py +0 -0
  379. swiftpy_framework-0.1.0/tests/http/test_error_pipeline.py +417 -0
  380. swiftpy_framework-0.1.0/tests/http/test_http_remediation.py +434 -0
  381. swiftpy_framework-0.1.0/tests/http/test_include_router.py +305 -0
  382. swiftpy_framework-0.1.0/tests/http/test_request.py +211 -0
  383. swiftpy_framework-0.1.0/tests/http/test_response.py +211 -0
  384. swiftpy_framework-0.1.0/tests/http/test_route_groups.py +23 -0
  385. swiftpy_framework-0.1.0/tests/http/test_router.py +395 -0
  386. swiftpy_framework-0.1.0/tests/integration/__init__.py +0 -0
  387. swiftpy_framework-0.1.0/tests/integration/test_queue_event_websocket.py +183 -0
  388. swiftpy_framework-0.1.0/tests/mail/__init__.py +0 -0
  389. swiftpy_framework-0.1.0/tests/mail/test_api_transports.py +411 -0
  390. swiftpy_framework-0.1.0/tests/mail/test_attachments.py +95 -0
  391. swiftpy_framework-0.1.0/tests/mail/test_cli_make_mail.py +23 -0
  392. swiftpy_framework-0.1.0/tests/mail/test_console_transport.py +25 -0
  393. swiftpy_framework-0.1.0/tests/mail/test_envelope.py +201 -0
  394. swiftpy_framework-0.1.0/tests/mail/test_facade_and_fake.py +162 -0
  395. swiftpy_framework-0.1.0/tests/mail/test_mailable.py +87 -0
  396. swiftpy_framework-0.1.0/tests/mail/test_manager_and_config.py +141 -0
  397. swiftpy_framework-0.1.0/tests/mail/test_message.py +120 -0
  398. swiftpy_framework-0.1.0/tests/mail/test_phase6_mail_remediation.py +796 -0
  399. swiftpy_framework-0.1.0/tests/mail/test_queue_integration.py +277 -0
  400. swiftpy_framework-0.1.0/tests/mail/test_service_provider_and_helpers.py +57 -0
  401. swiftpy_framework-0.1.0/tests/mail/test_smtp_and_sendmail.py +766 -0
  402. swiftpy_framework-0.1.0/tests/mail/test_templates.py +89 -0
  403. swiftpy_framework-0.1.0/tests/migrations/__init__.py +0 -0
  404. swiftpy_framework-0.1.0/tests/migrations/test_migrations.py +912 -0
  405. swiftpy_framework-0.1.0/tests/orm/__init__.py +0 -0
  406. swiftpy_framework-0.1.0/tests/orm/test_defaults_dirty.py +138 -0
  407. swiftpy_framework-0.1.0/tests/orm/test_eager_loading.py +571 -0
  408. swiftpy_framework-0.1.0/tests/orm/test_hidden.py +137 -0
  409. swiftpy_framework-0.1.0/tests/orm/test_mass_assignment.py +153 -0
  410. swiftpy_framework-0.1.0/tests/orm/test_model_events_transaction.py +137 -0
  411. swiftpy_framework-0.1.0/tests/orm/test_relationships_hardening.py +191 -0
  412. swiftpy_framework-0.1.0/tests/queue/__init__.py +0 -0
  413. swiftpy_framework-0.1.0/tests/queue/test_after_commit.py +159 -0
  414. swiftpy_framework-0.1.0/tests/queue/test_phase5_remediation.py +593 -0
  415. swiftpy_framework-0.1.0/tests/queue/test_poison_messages.py +158 -0
  416. swiftpy_framework-0.1.0/tests/queue/test_queue.py +1253 -0
  417. swiftpy_framework-0.1.0/tests/queue/test_reliability.py +264 -0
  418. swiftpy_framework-0.1.0/tests/queue/test_signing.py +164 -0
  419. swiftpy_framework-0.1.0/tests/queue/test_worker_behavior.py +283 -0
  420. swiftpy_framework-0.1.0/tests/security/__init__.py +0 -0
  421. swiftpy_framework-0.1.0/tests/security/test_security_audit.py +542 -0
  422. swiftpy_framework-0.1.0/tests/stress/__init__.py +0 -0
  423. swiftpy_framework-0.1.0/tests/stress/test_context_isolation.py +75 -0
  424. swiftpy_framework-0.1.0/tests/support/__init__.py +0 -0
  425. swiftpy_framework-0.1.0/tests/support/test_redis_config.py +167 -0
  426. swiftpy_framework-0.1.0/tests/support/test_strings.py +103 -0
  427. swiftpy_framework-0.1.0/tests/testing/__init__.py +0 -0
  428. swiftpy_framework-0.1.0/tests/testing/test_fixtures.py +204 -0
  429. swiftpy_framework-0.1.0/tests/testing/test_phase9_testing_remediation.py +266 -0
  430. swiftpy_framework-0.1.0/tests/testing/test_test_client.py +271 -0
  431. swiftpy_framework-0.1.0/tests/typing/__init__.py +0 -0
  432. swiftpy_framework-0.1.0/tests/typing/test_orm_typing.py +110 -0
  433. swiftpy_framework-0.1.0/tests/validation/__init__.py +0 -0
  434. swiftpy_framework-0.1.0/tests/validation/test_db_rules.py +269 -0
  435. swiftpy_framework-0.1.0/tests/validation/test_form_request_fail_closed.py +154 -0
  436. swiftpy_framework-0.1.0/tests/validation/test_form_request_pipeline.py +314 -0
  437. swiftpy_framework-0.1.0/tests/validation/test_phase6_validation_remediation.py +548 -0
  438. swiftpy_framework-0.1.0/tests/validation/test_rules_hardening.py +282 -0
  439. swiftpy_framework-0.1.0/tests/validation/test_validation_concurrency.py +289 -0
  440. swiftpy_framework-0.1.0/tests/validation/test_validator_rules.py +568 -0
  441. swiftpy_framework-0.1.0/tests/websockets/__init__.py +0 -0
  442. swiftpy_framework-0.1.0/tests/websockets/test_broadcast.py +216 -0
  443. swiftpy_framework-0.1.0/tests/websockets/test_handshake.py +379 -0
  444. swiftpy_framework-0.1.0/tests/websockets/test_lifecycle.py +179 -0
  445. swiftpy_framework-0.1.0/tests/websockets/test_websocket_concurrency.py +239 -0
  446. swiftpy_framework-0.1.0/tests/websockets/test_websocket_connection.py +393 -0
  447. swiftpy_framework-0.1.0/tests/websockets/test_websocket_manager.py +407 -0
  448. swiftpy_framework-0.1.0/tests/websockets/test_websocket_remediation.py +290 -0
  449. swiftpy_framework-0.1.0/tests/websockets/test_websocket_routing_and_lifecycle.py +161 -0
  450. swiftpy_framework-0.1.0/uv.lock +1205 -0
  451. swiftpy_framework-0.1.0/views/admin/dashboard.html +102 -0
  452. swiftpy_framework-0.1.0/views/admin/login.html +87 -0
  453. 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