sillo-framework 1.2.0__tar.gz → 1.2.1__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 (616) hide show
  1. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/CHANGELOG.md +25 -1
  2. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/PKG-INFO +2 -2
  3. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/pyproject.toml +4 -4
  4. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/__init__.py +1 -1
  5. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/client.py +21 -6
  6. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/__init__.py +2 -0
  7. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/fields.py +35 -0
  8. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/models.py +5 -2
  9. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/pydantic.py +7 -2
  10. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/__init__.py +14 -0
  11. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/config.py +6 -0
  12. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/drivers/__init__.py +14 -1
  13. sillo_framework-1.2.1/sillo/storage/drivers/s3.py +438 -0
  14. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/storage.py +20 -3
  15. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/connection.py +2 -0
  16. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_http_client.py +65 -0
  17. sillo_framework-1.2.1/tests/test_record/test_fields.py +112 -0
  18. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_pydantic_bridge.py +24 -1
  19. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_integration.py +20 -1
  20. sillo_framework-1.2.1/tests/test_storage/test_s3_driver.py +455 -0
  21. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_redis_connection_internals.py +8 -0
  22. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/.gitignore +0 -0
  23. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/LICENSE +0 -0
  24. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/README.md +0 -0
  25. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/SECURITY.md +0 -0
  26. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/__main__.py +0 -0
  27. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/application.py +0 -0
  28. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/__init__.py +0 -0
  29. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/__init__.py +0 -0
  30. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/backend.py +0 -0
  31. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/mixins.py +0 -0
  32. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/models.py +0 -0
  33. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/backend.py +0 -0
  34. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/exceptions.py +0 -0
  35. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/__init__.py +0 -0
  36. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/backend.py +0 -0
  37. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/mixins.py +0 -0
  38. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/models.py +0 -0
  39. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/tokens.py +0 -0
  40. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/middleware.py +0 -0
  41. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/model.py +0 -0
  42. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/__init__.py +0 -0
  43. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/backend.py +0 -0
  44. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/guard.py +0 -0
  45. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/mixins.py +0 -0
  46. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/models.py +0 -0
  47. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/use_auth.py +0 -0
  48. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/__init__.py +0 -0
  49. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/backends.py +0 -0
  50. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/base.py +0 -0
  51. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/config.py +0 -0
  52. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/decorator.py +0 -0
  53. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/locks.py +0 -0
  54. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/config/__init__.py +0 -0
  55. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/config/core.py +0 -0
  56. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/__init__.py +0 -0
  57. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/arguments.py +0 -0
  58. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/command.py +0 -0
  59. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/console.py +0 -0
  60. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/exceptions.py +0 -0
  61. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/output.py +0 -0
  62. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/prompt.py +0 -0
  63. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/style.py +0 -0
  64. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/terminal.py +0 -0
  65. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/__init__.py +0 -0
  66. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/converters.py +0 -0
  67. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/dependencies/__init__.py +0 -0
  68. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/dependencies/base.py +0 -0
  69. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/encoding.py +0 -0
  70. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/error/__init__.py +0 -0
  71. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/error/handler.py +0 -0
  72. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/helpers/__init__.py +0 -0
  73. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/helpers/async_helpers.py +0 -0
  74. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/helpers/deprecation.py +0 -0
  75. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/__init__.py +0 -0
  76. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/context.py +0 -0
  77. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/cookies.py +0 -0
  78. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/response.py +0 -0
  79. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/__init__.py +0 -0
  80. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/_utils.py +0 -0
  81. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/base.py +0 -0
  82. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/grouping.py +0 -0
  83. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/introspect.py +0 -0
  84. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/router.py +0 -0
  85. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/websocket.py +0 -0
  86. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/dev.py +0 -0
  87. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/encoding.py +0 -0
  88. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/env/__init__.py +0 -0
  89. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/env/_loader.py +0 -0
  90. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/__init__.py +0 -0
  91. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/core.py +0 -0
  92. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/emitter.py +0 -0
  93. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/enums.py +0 -0
  94. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/exceptions.py +0 -0
  95. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/mixins.py +0 -0
  96. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/__init__.py +0 -0
  97. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/base.py +0 -0
  98. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/memory.py +0 -0
  99. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/persistent.py +0 -0
  100. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/record.py +0 -0
  101. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/redis.py +0 -0
  102. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/types.py +0 -0
  103. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/exception_handler.py +0 -0
  104. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/exceptions.py +0 -0
  105. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/formparser.py +0 -0
  106. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/handlers/__init__.py +0 -0
  107. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/handlers/error_report.py +0 -0
  108. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/handlers/not_found.py +0 -0
  109. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/__init__.py +0 -0
  110. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/config.py +0 -0
  111. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/core.py +0 -0
  112. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/exceptions.py +0 -0
  113. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/utils.py +0 -0
  114. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/__init__.py +0 -0
  115. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/concurrency.py +0 -0
  116. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/crypto.py +0 -0
  117. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/files.py +0 -0
  118. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/hashing.py +0 -0
  119. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/html.py +0 -0
  120. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/jwt.py +0 -0
  121. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/lazy.py +0 -0
  122. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/network.py +0 -0
  123. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/registry.py +0 -0
  124. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/retry.py +0 -0
  125. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/signing.py +0 -0
  126. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/strings.py +0 -0
  127. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/text.py +0 -0
  128. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/__init__.py +0 -0
  129. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/accepts.py +0 -0
  130. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/__init__.py +0 -0
  131. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/caching.py +0 -0
  132. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/config.py +0 -0
  133. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/errors.py +0 -0
  134. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/middleware.py +0 -0
  135. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/models.py +0 -0
  136. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/retry.py +0 -0
  137. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/transport.py +0 -0
  138. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/utils.py +0 -0
  139. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/etag.py +0 -0
  140. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/__init__.py +0 -0
  141. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/context.py +0 -0
  142. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/helpers.py +0 -0
  143. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/middleware.py +0 -0
  144. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/sse.py +0 -0
  145. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/status.py +0 -0
  146. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/installables.py +0 -0
  147. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/logging.py +0 -0
  148. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/__init__.py +0 -0
  149. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/client.py +0 -0
  150. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/config.py +0 -0
  151. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/context.py +0 -0
  152. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/models.py +0 -0
  153. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/__init__.py +0 -0
  154. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/base.py +0 -0
  155. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/bridge.py +0 -0
  156. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/define.py +0 -0
  157. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/gzip.py +0 -0
  158. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/response_headers.py +0 -0
  159. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/security.py +0 -0
  160. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/utils.py +0 -0
  161. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/normalize/__init__.py +0 -0
  162. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/normalize/helpers.py +0 -0
  163. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/normalize/middleware.py +0 -0
  164. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/__init__.py +0 -0
  165. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/common.py +0 -0
  166. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/datastructures.py +0 -0
  167. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/http.py +0 -0
  168. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/routing.py +0 -0
  169. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/__init__.py +0 -0
  170. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/_builder.py +0 -0
  171. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/config.py +0 -0
  172. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/models.py +0 -0
  173. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/ui.py +0 -0
  174. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/utils.py +0 -0
  175. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/pagination.py +0 -0
  176. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/parameters.py +0 -0
  177. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/permissions/__init__.py +0 -0
  178. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/permissions/mixins.py +0 -0
  179. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/permissions/models.py +0 -0
  180. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/py.typed +0 -0
  181. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/_bridge.py +0 -0
  182. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/casting.py +0 -0
  183. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/collection.py +0 -0
  184. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/commands/__init__.py +0 -0
  185. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/commands/functions.py +0 -0
  186. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/config.py +0 -0
  187. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/console.py +0 -0
  188. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/events.py +0 -0
  189. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/exceptions.py +0 -0
  190. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/factories.py +0 -0
  191. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/helpers.py +0 -0
  192. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/logging.py +0 -0
  193. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/manager.py +0 -0
  194. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/mixins/__init__.py +0 -0
  195. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/pagination.py +0 -0
  196. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/queries.py +0 -0
  197. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/scopes.py +0 -0
  198. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/serialization.py +0 -0
  199. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/transactions.py +0 -0
  200. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/responses.py +0 -0
  201. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/route_builder.py +0 -0
  202. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/__init__.py +0 -0
  203. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/cors/__init__.py +0 -0
  204. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/cors/_middleware.py +0 -0
  205. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/cors/config.py +0 -0
  206. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/csrf/__init__.py +0 -0
  207. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/csrf/_middleware.py +0 -0
  208. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/csrf/config.py +0 -0
  209. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/__init__.py +0 -0
  210. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/_middleware.py +0 -0
  211. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/__init__.py +0 -0
  212. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/base.py +0 -0
  213. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/memory.py +0 -0
  214. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/record.py +0 -0
  215. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/redis.py +0 -0
  216. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/config.py +0 -0
  217. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/models.py +0 -0
  218. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/__init__.py +0 -0
  219. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/base.py +0 -0
  220. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/fixed_window.py +0 -0
  221. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/sliding_window.py +0 -0
  222. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/token_bucket.py +0 -0
  223. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/shield.py +0 -0
  224. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/__init__.py +0 -0
  225. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/base.py +0 -0
  226. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/config.py +0 -0
  227. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/file.py +0 -0
  228. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/middleware.py +0 -0
  229. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/session_objects.py +0 -0
  230. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/signed_cookies.py +0 -0
  231. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/static.py +0 -0
  232. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/base.py +0 -0
  233. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/bucket.py +0 -0
  234. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/context.py +0 -0
  235. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/drivers/local.py +0 -0
  236. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/drivers/memory.py +0 -0
  237. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/errors.py +0 -0
  238. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/paths.py +0 -0
  239. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/policies.py +0 -0
  240. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/routes.py +0 -0
  241. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/signing.py +0 -0
  242. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/sniff.py +0 -0
  243. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/uploads.py +0 -0
  244. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/__init__.py +0 -0
  245. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/__init__.py +0 -0
  246. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/inputs.py +0 -0
  247. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/lifespan.py +0 -0
  248. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/transport.py +0 -0
  249. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/types.py +0 -0
  250. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/utils.py +0 -0
  251. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/websockets.py +0 -0
  252. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/async_client.py +0 -0
  253. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/base.py +0 -0
  254. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/exceptions.py +0 -0
  255. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/helpers.py +0 -0
  256. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/types.py +0 -0
  257. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/__init__.py +0 -0
  258. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/base.py +0 -0
  259. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/commands.py +0 -0
  260. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/console.py +0 -0
  261. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/managers.py +0 -0
  262. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/protocol.py +0 -0
  263. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/simple.py +0 -0
  264. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/__init__.py +0 -0
  265. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/compiler.py +0 -0
  266. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/errors.py +0 -0
  267. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/fields.py +0 -0
  268. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/__init__.py +0 -0
  269. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/base.py +0 -0
  270. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/errors.py +0 -0
  271. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/status.py +0 -0
  272. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/__init__.py +0 -0
  273. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/backends.py +0 -0
  274. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/background/__init__.py +0 -0
  275. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/background/supervisor.py +0 -0
  276. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/background/tasks.py +0 -0
  277. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/commands.py +0 -0
  278. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/console.py +0 -0
  279. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/dependency.py +0 -0
  280. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/middleware.py +0 -0
  281. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/__init__.py +0 -0
  282. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/batches.py +0 -0
  283. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/events.py +0 -0
  284. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/failed.py +0 -0
  285. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/job.py +0 -0
  286. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/listener.py +0 -0
  287. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/middleware.py +0 -0
  288. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/payloads.py +0 -0
  289. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/workers.py +0 -0
  290. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/__init__.py +0 -0
  291. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/cron.py +0 -0
  292. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/jobs.py +0 -0
  293. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/manager.py +0 -0
  294. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/middleware.py +0 -0
  295. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/triggers.py +0 -0
  296. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/task.py +0 -0
  297. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/types.py +0 -0
  298. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/__init__.py +0 -0
  299. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/conftest.py +0 -0
  300. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/example.txt +0 -0
  301. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/page.html +0 -0
  302. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/script.js +0 -0
  303. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/style.css +0 -0
  304. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/subfolder/subfile.txt +0 -0
  305. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/templates/base.html +0 -0
  306. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/templates/product.html +0 -0
  307. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/templates/welcome.html +0 -0
  308. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/__init__.py +0 -0
  309. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_app_class_name.py +0 -0
  310. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_application.py +0 -0
  311. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_builtin_installables.py +0 -0
  312. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_installables.py +0 -0
  313. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_middleware_chain_cache.py +0 -0
  314. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_route_kwargs.py +0 -0
  315. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/__init__.py +0 -0
  316. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_backend.py +0 -0
  317. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_backend_manager_mode.py +0 -0
  318. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_models.py +0 -0
  319. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_user_mixin.py +0 -0
  320. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_auth_middleware.py +0 -0
  321. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_auth_utilities.py +0 -0
  322. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_custom_backend.py +0 -0
  323. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_jwt_backend.py +0 -0
  324. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_jwt_token_model.py +0 -0
  325. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_jwt_user_mixin.py +0 -0
  326. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_security_schemes.py +0 -0
  327. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_backend.py +0 -0
  328. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_guard.py +0 -0
  329. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_model_extend.py +0 -0
  330. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_user_mixin.py +0 -0
  331. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_token_for_user.py +0 -0
  332. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_use_auth.py +0 -0
  333. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_user_models.py +0 -0
  334. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/__init__.py +0 -0
  335. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_base.py +0 -0
  336. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_decorator.py +0 -0
  337. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_locks.py +0 -0
  338. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_memory_cache.py +0 -0
  339. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_redis_backend.py +0 -0
  340. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_redis_cache_fake.py +0 -0
  341. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/__init__.py +0 -0
  342. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/conftest.py +0 -0
  343. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/test_config_loading.py +0 -0
  344. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/test_env_loading.py +0 -0
  345. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/__init__.py +0 -0
  346. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_arguments.py +0 -0
  347. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_builtin_record.py +0 -0
  348. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_builtin_users.py +0 -0
  349. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_builtin_work.py +0 -0
  350. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_cli.py +0 -0
  351. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_command.py +0 -0
  352. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_console.py +0 -0
  353. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_output.py +0 -0
  354. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_prompt.py +0 -0
  355. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_style.py +0 -0
  356. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_terminal.py +0 -0
  357. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/__init__.py +0 -0
  358. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_configuration.py +0 -0
  359. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_credentials_security.py +0 -0
  360. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_error_handling.py +0 -0
  361. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_integration.py +0 -0
  362. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_preflight_requests.py +0 -0
  363. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_simple_requests.py +0 -0
  364. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dependencies/__init__.py +0 -0
  365. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dependencies/test_dependency_injection.py +0 -0
  366. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dependencies/test_dependency_overrides.py +0 -0
  367. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dev.py +0 -0
  368. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/__init__.py +0 -0
  369. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_custom_encoder.py +0 -0
  370. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_encoding_shim.py +0 -0
  371. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_jsonable_encoder.py +0 -0
  372. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_native_json.py +0 -0
  373. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_passthrough_fast_path.py +0 -0
  374. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/__init__.py +0 -0
  375. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/conftest.py +0 -0
  376. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/test_load.py +0 -0
  377. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/test_parse.py +0 -0
  378. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/__init__.py +0 -0
  379. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_comprehensive_events.py +0 -0
  380. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_core_propagation.py +0 -0
  381. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_emitter_paths.py +0 -0
  382. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_events_backends.py +0 -0
  383. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_persistent_transport_fake.py +0 -0
  384. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_record_transport.py +0 -0
  385. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_redis_transport_fake.py +0 -0
  386. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_transport_registry_and_base.py +0 -0
  387. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/__init__.py +0 -0
  388. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_basic_exception_handlers.py +0 -0
  389. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_concurrent_error_pages.py +0 -0
  390. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_dispatch_internals.py +0 -0
  391. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_error_report.py +0 -0
  392. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_exception_handler_integration.py +0 -0
  393. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_not_found_handler.py +0 -0
  394. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_server_error_debug.py +0 -0
  395. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_forms/__init__.py +0 -0
  396. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_forms/test_form_parser.py +0 -0
  397. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_forms/test_uploaded_file_save.py +0 -0
  398. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_hashing/__init__.py +0 -0
  399. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_hashing/test_core.py +0 -0
  400. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_hashing/test_utils.py +0 -0
  401. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/__init__.py +0 -0
  402. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_accepts.py +0 -0
  403. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_async.py +0 -0
  404. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_concurrency.py +0 -0
  405. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_deprecation.py +0 -0
  406. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_files.py +0 -0
  407. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_hashing_crypto.py +0 -0
  408. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_html.py +0 -0
  409. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_jwt.py +0 -0
  410. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_network.py +0 -0
  411. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_registry.py +0 -0
  412. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_retry.py +0 -0
  413. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_signing.py +0 -0
  414. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_strings.py +0 -0
  415. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_text.py +0 -0
  416. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/__init__.py +0 -0
  417. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_accepts.py +0 -0
  418. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_accepts_middleware.py +0 -0
  419. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_accepts_negotiation.py +0 -0
  420. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_cookie_parsing.py +0 -0
  421. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_etag_full.py +0 -0
  422. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_http_etag.py +0 -0
  423. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_http_module_exports.py +0 -0
  424. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_sse.py +0 -0
  425. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_lifecycle/__init__.py +0 -0
  426. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_lifecycle/test_context.py +0 -0
  427. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_lifecycle/test_request_id.py +0 -0
  428. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/__init__.py +0 -0
  429. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_context.py +0 -0
  430. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_mail_client.py +0 -0
  431. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_mail_service.py +0 -0
  432. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_mail_transport.py +0 -0
  433. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/__init__.py +0 -0
  434. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_app_level_middleware.py +0 -0
  435. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_asgi_middleware.py +0 -0
  436. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_bridge.py +0 -0
  437. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_gzip.py +0 -0
  438. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_normalize_middleware.py +0 -0
  439. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_raw_asgi_layers.py +0 -0
  440. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_route_level_asgi_middleware.py +0 -0
  441. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_route_level_middleware.py +0 -0
  442. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_router_level_middleware.py +0 -0
  443. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_security_middleware.py +0 -0
  444. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_use_for_route.py +0 -0
  445. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_normalize/__init__.py +0 -0
  446. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_normalize/test_helpers.py +0 -0
  447. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_normalize/test_middleware.py +0 -0
  448. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/__init__.py +0 -0
  449. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_common.py +0 -0
  450. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_headers.py +0 -0
  451. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_multidict.py +0 -0
  452. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_url.py +0 -0
  453. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_url_building.py +0 -0
  454. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/__init__.py +0 -0
  455. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_docs_ui.py +0 -0
  456. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_openapi_config.py +0 -0
  457. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_openapi_spec.py +0 -0
  458. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_openapi_utils.py +0 -0
  459. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_optional_imports.py +0 -0
  460. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/__init__.py +0 -0
  461. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_data_handlers.py +0 -0
  462. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_edge_cases.py +0 -0
  463. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_error_handling.py +0 -0
  464. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_integration.py +0 -0
  465. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_pagination_strategies.py +0 -0
  466. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_paginators.py +0 -0
  467. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_response_classes.py +0 -0
  468. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_response_paginate.py +0 -0
  469. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/__init__.py +0 -0
  470. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_cookie.py +0 -0
  471. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_header.py +0 -0
  472. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_nested.py +0 -0
  473. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_openapi.py +0 -0
  474. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_query.py +0 -0
  475. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_permissions/__init__.py +0 -0
  476. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_permissions/test_permissions.py +0 -0
  477. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/__init__.py +0 -0
  478. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_backend_config.py +0 -0
  479. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_collection.py +0 -0
  480. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_events.py +0 -0
  481. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_factories.py +0 -0
  482. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_get_or_none.py +0 -0
  483. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_manager_lifecycle.py +0 -0
  484. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_mass_assignment.py +0 -0
  485. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_mixins.py +0 -0
  486. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_model_features.py +0 -0
  487. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_pagination_and_exceptions.py +0 -0
  488. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_queries.py +0 -0
  489. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_query_logging.py +0 -0
  490. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_record_commands.py +0 -0
  491. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_release_fixes.py +0 -0
  492. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_savepoints.py +0 -0
  493. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_scopes.py +0 -0
  494. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_seeding.py +0 -0
  495. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_to_dict_relations.py +0 -0
  496. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_redis/__init__.py +0 -0
  497. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_redis/test_redis_cache.py +0 -0
  498. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_redis/test_redis_transport.py +0 -0
  499. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/__init__.py +0 -0
  500. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_basic_properties.py +0 -0
  501. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_body_data.py +0 -0
  502. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_cookies_auth.py +0 -0
  503. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_path_params.py +0 -0
  504. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_query_params.py +0 -0
  505. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_request_flags.py +0 -0
  506. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_request_surface.py +0 -0
  507. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/__init__.py +0 -0
  508. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_abort_not_found.py +0 -0
  509. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_advanced_responses.py +0 -0
  510. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_basic_responses.py +0 -0
  511. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_cookie_attributes.py +0 -0
  512. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_file_responses.py +0 -0
  513. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_header_override.py +0 -0
  514. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_headers_cookies.py +0 -0
  515. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_json_serialization.py +0 -0
  516. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_redirect_streaming.py +0 -0
  517. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_response_properties.py +0 -0
  518. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_responses_module.py +0 -0
  519. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/__init__.py +0 -0
  520. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_base_route.py +0 -0
  521. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_basic_routing.py +0 -0
  522. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_converters.py +0 -0
  523. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_grouping.py +0 -0
  524. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_grouping_coverage.py +0 -0
  525. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_http_methods.py +0 -0
  526. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_literal_prefix_match.py +0 -0
  527. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_nested_routes.py +0 -0
  528. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_path_parameters.py +0 -0
  529. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_route_builder.py +0 -0
  530. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_route_ordering.py +0 -0
  531. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_router_app_options.py +0 -0
  532. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_router_use_raw_asgi.py +0 -0
  533. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/__init__.py +0 -0
  534. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_backends.py +0 -0
  535. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_csrf.py +0 -0
  536. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_csrf_predicates.py +0 -0
  537. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_csrf_regressions.py +0 -0
  538. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_middleware.py +0 -0
  539. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_ratelimit_config.py +0 -0
  540. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_ratelimit_redis_backend.py +0 -0
  541. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_record_backend.py +0 -0
  542. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_strategies.py +0 -0
  543. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/__init__.py +0 -0
  544. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_base.py +0 -0
  545. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_config_and_objects_internals.py +0 -0
  546. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_expiry.py +0 -0
  547. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_file_sessions.py +0 -0
  548. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_integration.py +0 -0
  549. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_middleware.py +0 -0
  550. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_security.py +0 -0
  551. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_settings.py +0 -0
  552. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_signed_cookies.py +0 -0
  553. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_small_module_gaps.py +0 -0
  554. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_static/__init__.py +0 -0
  555. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_static/test_static_files.py +0 -0
  556. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_static/test_static_files_internals.py +0 -0
  557. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/__init__.py +0 -0
  558. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/contract.py +0 -0
  559. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_bucket.py +0 -0
  560. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_config.py +0 -0
  561. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_context.py +0 -0
  562. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_drivers.py +0 -0
  563. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_local_driver_internals.py +0 -0
  564. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_paths_helpers.py +0 -0
  565. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_policies.py +0 -0
  566. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_routes.py +0 -0
  567. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_safety.py +0 -0
  568. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_uploads.py +0 -0
  569. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_supported_python_versions.py +0 -0
  570. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_async_context_manager.py +0 -0
  571. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_client_lifecycle.py +0 -0
  572. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_lifespan_internals.py +0 -0
  573. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_transport_internals.py +0 -0
  574. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_websocket_session_internals.py +0 -0
  575. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_type_comments.py +0 -0
  576. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/__init__.py +0 -0
  577. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_password.py +0 -0
  578. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_protocol.py +0 -0
  579. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_user_commands.py +0 -0
  580. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_user_model.py +0 -0
  581. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/__init__.py +0 -0
  582. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/conftest.py +0 -0
  583. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_body_form.py +0 -0
  584. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_legacy_compat.py +0 -0
  585. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_markers_unit.py +0 -0
  586. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_openapi_generation.py +0 -0
  587. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_params.py +0 -0
  588. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_request_model.py +0 -0
  589. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_response_model.py +0 -0
  590. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/__init__.py +0 -0
  591. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_dependencies.py +0 -0
  592. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_errors.py +0 -0
  593. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_protocol.py +0 -0
  594. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_routing.py +0 -0
  595. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_state_machine.py +0 -0
  596. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/__init__.py +0 -0
  597. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_backends_full.py +0 -0
  598. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_background.py +0 -0
  599. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_events.py +0 -0
  600. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_job_dispatch.py +0 -0
  601. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_job_queue.py +0 -0
  602. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_job_round_trip.py +0 -0
  603. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_memory_backend.py +0 -0
  604. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_middleware.py +0 -0
  605. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_queue.py +0 -0
  606. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_queue_middleware.py +0 -0
  607. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_queue_worker.py +0 -0
  608. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_redis_queue_reliability.py +0 -0
  609. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_routes.py +0 -0
  610. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_scheduler.py +0 -0
  611. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_scheduler_middleware.py +0 -0
  612. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_task.py +0 -0
  613. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_types.py +0 -0
  614. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_work_commands.py +0 -0
  615. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_work_di.py +0 -0
  616. {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/work_jobs.py +0 -0
@@ -5,7 +5,31 @@ All notable changes to Sillo are documented here.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [1.2.1] - 2026-10-19
9
+
10
+ ### Added
11
+
12
+ - The `s3` storage driver the documentation and the `storage-s3` extra already
13
+ described now ships (#458, #485). `sillo.storage.drivers.s3.S3Driver`
14
+ implements the same `Driver` contract as the local and memory drivers,
15
+ signing requests with AWS Signature Version 4 in pure Python over `httpx`
16
+ rather than depending on boto3. It works with AWS S3, MinIO, Cloudflare R2,
17
+ Backblaze B2, DigitalOcean Spaces, Wasabi and Ceph, supports path-style and
18
+ virtual-hosted addressing, a key prefix, a separate public endpoint for
19
+ presigned URLs, streaming writes and range reads, paged listings, and
20
+ creating a missing bucket on first write. Install it with
21
+ `sillo[storage-s3]`.
22
+ - `sillo.record.AnyJSONField` stores ordinary JSON-compatible Python values,
23
+ including bare strings, without requiring callers to pre-encode them (#460).
24
+
25
+ ### Fixed
26
+
27
+ - `HTTPClient` with configured middleware no longer fails every request. The
28
+ middleware chain consumes each link with `async for`, but the terminal call
29
+ was `httpx.AsyncClient.send` -- a coroutine function -- passed in directly,
30
+ so any `middlewares=` entry raised `TypeError: 'async for' requires an object
31
+ with __aiter__` before a request left the process. The terminal call is now
32
+ adapted to the chain's async-iterator contract (#455).
9
33
 
10
34
  ## [1.2.0] - 2026-10-08
11
35
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sillo-framework
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: Python with the pieces already in place: an async web framework whose ORM, auth, admin, queues, scheduler and WebSockets share one configuration model.
5
5
  Project-URL: Homepage, https://github.com/sillohq/core
6
6
  Project-URL: Repository, https://github.com/sillohq/core
@@ -69,7 +69,7 @@ Requires-Dist: pytest-asyncio<1.5.0,>=0.25.3; extra == 'dev'
69
69
  Requires-Dist: pytest<9.1.0,>=8.3.4; extra == 'dev'
70
70
  Requires-Dist: python-ulid>=2.0.0; extra == 'dev'
71
71
  Requires-Dist: redis>=5.0.0; extra == 'dev'
72
- Requires-Dist: ruff<0.17,>=0.16.0; extra == 'dev'
72
+ Requires-Dist: ruff<0.18,>=0.16.0; extra == 'dev'
73
73
  Requires-Dist: scrypt>=0.8.0; extra == 'dev'
74
74
  Requires-Dist: tortoise-orm>=1.0; extra == 'dev'
75
75
  Requires-Dist: ty<0.1,>=0.0.63; extra == 'dev'
@@ -31,7 +31,7 @@ exclude = [
31
31
 
32
32
  [project]
33
33
  name = "sillo-framework"
34
- version = "1.2.0"
34
+ version = "1.2.1"
35
35
  description = "Python with the pieces already in place: an async web framework whose ORM, auth, admin, queues, scheduler and WebSockets share one configuration model."
36
36
  authors = [
37
37
  {name = "Chidebele Dunamis", email = "techwithdunamix@gmail.com"}
@@ -204,7 +204,7 @@ dev = [
204
204
  # upstream release turns the build red with no change from us, and ty in
205
205
  # particular adds checks between patch releases. Upper-bounded so a
206
206
  # version bump is a commit somebody chose to make.
207
- "ruff>=0.16.0,<0.17",
207
+ "ruff>=0.16.0,<0.18",
208
208
  "ty>=0.0.63,<0.1",
209
209
  # Type stubs
210
210
  "typing-extensions==4.16.0",
@@ -368,7 +368,7 @@ ignore = [
368
368
 
369
369
  [tool.commitizen]
370
370
  name = "cz_conventional_commits"
371
- version = "1.2.0"
371
+ version = "1.2.1"
372
372
  version_files = [
373
373
  "pyproject.toml:version",
374
374
  "sillo/__init__.py:__version__"
@@ -409,7 +409,7 @@ dev = [
409
409
  # upstream release turns the build red with no change from us, and ty in
410
410
  # particular adds checks between patch releases. Upper-bounded so a
411
411
  # version bump is a commit somebody chose to make.
412
- "ruff>=0.16.0,<0.17",
412
+ "ruff>=0.16.0,<0.18",
413
413
  "ty>=0.0.63,<0.1",
414
414
  # Type hints
415
415
  "typing-extensions>=4.12.2",
@@ -119,7 +119,7 @@ Common Patterns:
119
119
 
120
120
  from sillo.core.routing import Group, Route, Router, WebsocketRoute
121
121
 
122
- __version__: str = "1.2.0"
122
+ __version__: str = "1.2.1"
123
123
 
124
124
  from sillo.core.dependencies import Depend
125
125
 
@@ -277,13 +277,32 @@ class HTTPClient:
277
277
  )
278
278
  state.stats.cache_misses += 1
279
279
 
280
+ effective_follow_redirects = (
281
+ follow_redirects
282
+ if follow_redirects is not None
283
+ else self._config.follow_redirects
284
+ )
285
+
286
+ # The middleware chain consumes every link -- including the terminal
287
+ # one -- with `async for`, so the terminal call must return an async
288
+ # iterator. httpx's `AsyncClient.send` is a coroutine function, so it
289
+ # is adapted to the chain's contract here rather than passed directly.
290
+ async def _terminal_send(
291
+ req: httpx.Request,
292
+ ) -> typing.AsyncGenerator[httpx.Response, None]:
293
+ yield await self._http_client.send(
294
+ req,
295
+ auth=auth,
296
+ follow_redirects=effective_follow_redirects,
297
+ )
298
+
280
299
  # Middleware chain (only when middlewares are registered)
281
300
  mw_chain = state.middleware_chain
282
301
 
283
302
  try:
284
303
  if mw_chain and mw_chain._middlewares:
285
304
  response = None
286
- async for r in mw_chain.run(request, self._http_client.send): # ty: ignore[invalid-argument-type]
305
+ async for r in mw_chain.run(request, _terminal_send):
287
306
  response = r
288
307
  if response is None:
289
308
  raise HTTPStatusError(
@@ -296,11 +315,7 @@ class HTTPClient:
296
315
  response = await self._http_client.send(
297
316
  request,
298
317
  auth=auth,
299
- follow_redirects=(
300
- follow_redirects
301
- if follow_redirects is not None
302
- else self._config.follow_redirects
303
- ),
318
+ follow_redirects=effective_follow_redirects,
304
319
  )
305
320
  except httpx.TimeoutException as exc:
306
321
  state.stats.requests_failed += 1
@@ -23,6 +23,7 @@ from .events import HasEvents, ModelObserver
23
23
  from .exceptions import register_db_exception_handlers
24
24
  from .factories import Factory, FactoryBuilder
25
25
  from .fields import (
26
+ AnyJSONField,
26
27
  CreatedAtField,
27
28
  SlugField,
28
29
  SoftDeleteField,
@@ -48,6 +49,7 @@ from .scopes import HasScopes, RecordManager, RecordQuerySet, ScopeRegistry
48
49
  from .transactions import TransactionContext, begin, commit, rollback, transaction
49
50
 
50
51
  __all__ = [
52
+ "AnyJSONField",
51
53
  "CascadesDeletesMixin",
52
54
  "Collection",
53
55
  "CreatedAtField",
@@ -2,17 +2,52 @@
2
2
  sillo.record.fields — Custom Tortoise field types.
3
3
 
4
4
  - CreatedAtField / UpdatedAtField / SoftDeleteField
5
+ - AnyJSONField — stores every JSON-compatible Python value, including strings
5
6
  - SlugField — auto-generated URL-safe slug
6
7
  - ULIDField — sortable primary key
7
8
  """
8
9
 
9
10
  from __future__ import annotations
10
11
 
12
+ from typing import Any
13
+
11
14
  from tortoise import fields as _fields
15
+ from tortoise.exceptions import FieldError
12
16
 
13
17
  from sillo.helpers.hashing import hash_password, is_hashed
14
18
 
15
19
 
20
+ class AnyJSONField(_fields.JSONField):
21
+ """A JSON field that treats strings as values, not serialized JSON.
22
+
23
+ Tortoise's :class:`~tortoise.fields.JSONField` assumes every ``str`` is
24
+ already JSON-encoded. That makes a normal Python string such as
25
+ ``"authenticated"`` fail validation unless the caller encodes it first.
26
+ This field encodes strings in the same way as dictionaries, lists and
27
+ other JSON-compatible values.
28
+
29
+ Use the standard Tortoise field when callers intentionally supply encoded
30
+ JSON strings. With this field, a string that looks like serialized JSON is
31
+ stored as a JSON string rather than interpreted as an object or list.
32
+ """
33
+
34
+ def to_db_value(self, value: Any, instance: Any) -> Any:
35
+ """Encode Python strings as JSON string values."""
36
+ if isinstance(value, str):
37
+ self.validate(value)
38
+ return self.encoder(value)
39
+ return super().to_db_value(value, instance)
40
+
41
+ def to_python_value(self, value: Any) -> Any:
42
+ """Accept string scalars already decoded by a database driver."""
43
+ try:
44
+ return super().to_python_value(value)
45
+ except FieldError:
46
+ if isinstance(value, str):
47
+ return value
48
+ raise
49
+
50
+
16
51
  class PasswordField(_fields.CharField):
17
52
  """A CharField that stores a *hashed* password, never the plaintext.
18
53
 
@@ -27,7 +27,7 @@ from tortoise.exceptions import ConfigurationError, OperationalError
27
27
  from typing_extensions import Doc, Self
28
28
 
29
29
  from .casting import HasCasts
30
- from .fields import CreatedAtField, SoftDeleteField, UpdatedAtField
30
+ from .fields import AnyJSONField, CreatedAtField, SoftDeleteField, UpdatedAtField
31
31
  from .scopes import HasScopes, RecordManager
32
32
  from .serialization import model_to_dict
33
33
 
@@ -110,7 +110,10 @@ class Model(_TortoiseModel, HasCasts, HasScopes):
110
110
  f"{key} is non nullable field, but null was passed"
111
111
  )
112
112
  if key not in casts:
113
- value = field_object.to_python_value(value)
113
+ is_any_json = isinstance(field_object, AnyJSONField)
114
+ preserve_string = is_any_json and isinstance(value, str)
115
+ if not preserve_string:
116
+ value = field_object.to_python_value(value)
114
117
  setattr(self, key, value)
115
118
  elif key in meta.backward_fk_fields:
116
119
  raise ConfigurationError(
@@ -9,10 +9,12 @@ from __future__ import annotations
9
9
 
10
10
  from typing import Annotated, Any, Optional
11
11
 
12
- from pydantic import BaseModel, Field, create_model
12
+ from pydantic import BaseModel, Field, JsonValue, create_model
13
13
  from tortoise import fields as f
14
14
  from typing_extensions import Doc
15
15
 
16
+ from .fields import AnyJSONField
17
+
16
18
 
17
19
  def pydantic_model_from_tortoise(
18
20
  model_class: type,
@@ -78,7 +80,7 @@ def pydantic_model_from_tortoise(
78
80
  )
79
81
 
80
82
 
81
- def _tortoise_to_python_type(field_obj) -> type:
83
+ def _tortoise_to_python_type(field_obj) -> Any:
82
84
  """Map a Tortoise ORM field type to the corresponding Python type.
83
85
 
84
86
  Looks up the field instance against a hardcoded mapping of common
@@ -93,6 +95,9 @@ def _tortoise_to_python_type(field_obj) -> type:
93
95
  ``float``, ``dict``) or ``str`` as a fallback for unrecognised
94
96
  field types.
95
97
  """
98
+ if isinstance(field_obj, AnyJSONField):
99
+ return JsonValue
100
+
96
101
  mapping = {
97
102
  f.IntField: int,
98
103
  f.SmallIntField: int,
@@ -34,6 +34,8 @@ Five properties this package is built around, each of which forces something:
34
34
 
35
35
  from __future__ import annotations
36
36
 
37
+ from typing import TYPE_CHECKING
38
+
37
39
  from .base import Action, Driver, FileInfo, Page, StorageEvent, Stored, chunks, collect
38
40
  from .bucket import Bucket
39
41
  from .config import BucketConfig, StorageConfig
@@ -52,6 +54,9 @@ from .signing import SignedGrant, Signer
52
54
  from .storage import Storage, StorageInstallable, bucket, setup_storage
53
55
  from .uploads import stream_upload
54
56
 
57
+ if TYPE_CHECKING:
58
+ from .drivers.s3 import S3Driver
59
+
55
60
  __all__ = [
56
61
  "Action",
57
62
  "Bucket",
@@ -68,6 +73,7 @@ __all__ = [
68
73
  "Private",
69
74
  "Public",
70
75
  "ReadOnly",
76
+ "S3Driver",
71
77
  "SignatureInvalid",
72
78
  "Signed",
73
79
  "SignedGrant",
@@ -87,3 +93,11 @@ __all__ = [
87
93
  "setup_storage",
88
94
  "stream_upload",
89
95
  ]
96
+
97
+
98
+ def __getattr__(name: str) -> object:
99
+ if name == "S3Driver":
100
+ from .drivers.s3 import S3Driver
101
+
102
+ return S3Driver
103
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
@@ -28,6 +28,9 @@ class BucketConfig:
28
28
  region: The S3 region.
29
29
  access_key: The S3 access key. Read from the environment in practice.
30
30
  secret_key: The S3 secret key.
31
+ prefix: A key prefix for S3, so multiple buckets can share a remote bucket.
32
+ path_style: Address the S3 bucket in the path (MinIO, Ceph) instead of host.
33
+ public_endpoint: S3 origin reachable by browsers for presigned URLs.
31
34
  max_bytes: Largest object this bucket accepts. Zero for no limit.
32
35
  accepts: Content types this bucket accepts, after sniffing. Empty for
33
36
  anything. Stated as what the *sniffer* decided, so declaring
@@ -43,6 +46,9 @@ class BucketConfig:
43
46
  region: str = "us-east-1"
44
47
  access_key: str = ""
45
48
  secret_key: str = ""
49
+ prefix: str = ""
50
+ path_style: bool = True
51
+ public_endpoint: str = ""
46
52
  max_bytes: int = 0
47
53
  accepts: tuple[str, ...] = ()
48
54
 
@@ -9,7 +9,20 @@ contract suite the shipped ones are held to.
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
+ from typing import TYPE_CHECKING
13
+
12
14
  from .local import LocalDriver
13
15
  from .memory import MemoryDriver
14
16
 
15
- __all__ = ["LocalDriver", "MemoryDriver"]
17
+ if TYPE_CHECKING:
18
+ from .s3 import S3Driver
19
+
20
+ __all__ = ["LocalDriver", "MemoryDriver", "S3Driver"]
21
+
22
+
23
+ def __getattr__(name: str) -> object:
24
+ if name == "S3Driver":
25
+ from .s3 import S3Driver
26
+
27
+ return S3Driver
28
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")