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.
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/CHANGELOG.md +25 -1
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/PKG-INFO +2 -2
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/pyproject.toml +4 -4
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/__init__.py +1 -1
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/client.py +21 -6
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/__init__.py +2 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/fields.py +35 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/models.py +5 -2
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/pydantic.py +7 -2
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/__init__.py +14 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/config.py +6 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/drivers/__init__.py +14 -1
- sillo_framework-1.2.1/sillo/storage/drivers/s3.py +438 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/storage.py +20 -3
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/connection.py +2 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_http_client.py +65 -0
- sillo_framework-1.2.1/tests/test_record/test_fields.py +112 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_pydantic_bridge.py +24 -1
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_integration.py +20 -1
- sillo_framework-1.2.1/tests/test_storage/test_s3_driver.py +455 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_redis_connection_internals.py +8 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/.gitignore +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/LICENSE +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/README.md +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/SECURITY.md +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/__main__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/application.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/mixins.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/apikey/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/mixins.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/jwt_auth/tokens.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/model.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/guard.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/mixins.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/session_auth/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/auth/use_auth.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/backends.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/decorator.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/cache/locks.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/config/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/config/core.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/arguments.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/command.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/console.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/output.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/prompt.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/style.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/console/terminal.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/converters.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/dependencies/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/dependencies/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/encoding.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/error/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/error/handler.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/helpers/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/helpers/async_helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/helpers/deprecation.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/cookies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/http/response.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/_utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/grouping.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/introspect.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/router.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/core/routing/websocket.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/dev.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/encoding.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/env/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/env/_loader.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/core.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/emitter.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/enums.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/mixins.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/memory.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/persistent.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/record.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/transports/redis.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/events/types.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/exception_handler.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/formparser.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/handlers/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/handlers/error_report.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/handlers/not_found.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/core.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/hashing/utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/concurrency.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/crypto.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/files.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/hashing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/html.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/jwt.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/lazy.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/network.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/registry.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/retry.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/signing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/strings.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/helpers/text.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/accepts.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/caching.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/errors.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/retry.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/transport.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/client/utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/etag.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/lifecycle/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/sse.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/http/status.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/installables.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/logging.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/client.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/mail/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/bridge.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/define.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/gzip.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/response_headers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/security.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/middleware/utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/normalize/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/normalize/helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/normalize/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/common.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/datastructures.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/http.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/objects/routing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/_builder.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/ui.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/openapi/utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/pagination.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/parameters.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/permissions/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/permissions/mixins.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/permissions/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/py.typed +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/_bridge.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/casting.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/collection.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/commands/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/commands/functions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/console.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/events.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/factories.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/logging.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/manager.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/mixins/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/pagination.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/queries.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/scopes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/serialization.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/record/transactions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/responses.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/route_builder.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/cors/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/cors/_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/cors/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/csrf/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/csrf/_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/csrf/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/memory.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/record.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/backends/redis.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/fixed_window.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/sliding_window.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/ratelimit/strategies/token_bucket.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/security/shield.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/file.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/session_objects.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/session/signed_cookies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/static.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/bucket.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/drivers/local.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/drivers/memory.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/errors.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/paths.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/policies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/routes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/signing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/sniff.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/storage/uploads.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/inputs.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/lifespan.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/transport.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/types.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/_internal/websockets.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/async_client.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/testclient/helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/types.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/commands.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/console.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/managers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/protocol.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/users/simple.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/compiler.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/errors.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/validation/fields.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/errors.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/websockets/status.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/backends.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/background/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/background/supervisor.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/background/tasks.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/commands.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/console.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/dependency.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/batches.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/events.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/failed.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/job.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/listener.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/payloads.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/queue/workers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/cron.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/jobs.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/manager.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/scheduler/triggers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/task.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/sillo/work/types.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/conftest.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/example.txt +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/page.html +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/script.js +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/style.css +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/static/subfolder/subfile.txt +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/templates/base.html +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/templates/product.html +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/templates/welcome.html +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_app_class_name.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_application.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_builtin_installables.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_installables.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_middleware_chain_cache.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_applications/test_route_kwargs.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_backend_manager_mode.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_apikey_user_mixin.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_auth_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_auth_utilities.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_custom_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_jwt_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_jwt_token_model.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_jwt_user_mixin.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_security_schemes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_guard.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_model_extend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_session_user_mixin.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_token_for_user.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_use_auth.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_auth/test_user_models.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_decorator.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_locks.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_memory_cache.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_redis_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cache/test_redis_cache_fake.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/conftest.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/test_config_loading.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_config/test_env_loading.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_arguments.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_builtin_record.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_builtin_users.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_builtin_work.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_cli.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_command.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_console.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_output.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_prompt.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_style.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_console/test_terminal.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_configuration.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_credentials_security.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_error_handling.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_integration.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_preflight_requests.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_cors/test_simple_requests.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dependencies/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dependencies/test_dependency_injection.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dependencies/test_dependency_overrides.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_dev.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_custom_encoder.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_encoding_shim.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_jsonable_encoder.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_native_json.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_encoding/test_passthrough_fast_path.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/conftest.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/test_load.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_env/test_parse.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_comprehensive_events.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_core_propagation.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_emitter_paths.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_events_backends.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_persistent_transport_fake.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_record_transport.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_redis_transport_fake.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_events/test_transport_registry_and_base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_basic_exception_handlers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_concurrent_error_pages.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_dispatch_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_error_report.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_exception_handler_integration.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_not_found_handler.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_exception_handlers/test_server_error_debug.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_forms/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_forms/test_form_parser.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_forms/test_uploaded_file_save.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_hashing/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_hashing/test_core.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_hashing/test_utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_accepts.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_async.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_concurrency.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_deprecation.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_files.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_hashing_crypto.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_html.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_jwt.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_network.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_registry.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_retry.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_signing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_strings.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_helpers/test_text.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_accepts.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_accepts_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_accepts_negotiation.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_cookie_parsing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_etag_full.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_http_etag.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_http_module_exports.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_http/test_sse.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_lifecycle/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_lifecycle/test_context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_lifecycle/test_request_id.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_mail_client.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_mail_service.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_mail/test_mail_transport.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_app_level_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_asgi_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_bridge.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_gzip.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_normalize_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_raw_asgi_layers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_route_level_asgi_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_route_level_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_router_level_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_security_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_middleware/test_use_for_route.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_normalize/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_normalize/test_helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_normalize/test_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_common.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_headers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_multidict.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_url.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_objects/test_url_building.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_docs_ui.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_openapi_config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_openapi_spec.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_openapi/test_openapi_utils.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_optional_imports.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_data_handlers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_edge_cases.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_error_handling.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_integration.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_pagination_strategies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_paginators.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_response_classes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_pagination/test_response_paginate.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_cookie.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_header.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_nested.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_openapi.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_parameters/test_query.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_permissions/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_permissions/test_permissions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_backend_config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_collection.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_events.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_factories.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_get_or_none.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_manager_lifecycle.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_mass_assignment.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_mixins.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_model_features.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_pagination_and_exceptions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_queries.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_query_logging.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_record_commands.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_release_fixes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_savepoints.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_scopes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_seeding.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_record/test_to_dict_relations.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_redis/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_redis/test_redis_cache.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_redis/test_redis_transport.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_basic_properties.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_body_data.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_cookies_auth.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_path_params.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_query_params.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_request_flags.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_requests/test_request_surface.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_abort_not_found.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_advanced_responses.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_basic_responses.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_cookie_attributes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_file_responses.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_header_override.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_headers_cookies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_json_serialization.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_redirect_streaming.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_response_properties.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_responses/test_responses_module.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_base_route.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_basic_routing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_converters.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_grouping.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_grouping_coverage.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_http_methods.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_literal_prefix_match.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_nested_routes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_path_parameters.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_route_builder.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_route_ordering.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_router_app_options.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_routing/test_router_use_raw_asgi.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_backends.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_csrf.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_csrf_predicates.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_csrf_regressions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_ratelimit_config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_ratelimit_redis_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_record_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_security/test_strategies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_base.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_config_and_objects_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_expiry.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_file_sessions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_integration.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_security.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_settings.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_sessions/test_signed_cookies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_small_module_gaps.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_static/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_static/test_static_files.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_static/test_static_files_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/contract.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_bucket.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_config.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_context.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_drivers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_local_driver_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_paths_helpers.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_policies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_routes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_safety.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_storage/test_uploads.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_supported_python_versions.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_async_context_manager.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_client_lifecycle.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_lifespan_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_transport_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_testclient/test_websocket_session_internals.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_type_comments.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_password.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_protocol.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_user_commands.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_users/test_user_model.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/conftest.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_body_form.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_legacy_compat.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_markers_unit.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_openapi_generation.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_params.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_request_model.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_validation/test_response_model.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_dependencies.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_errors.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_protocol.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_routing.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_websockets/test_websocket_state_machine.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/__init__.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_backends_full.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_background.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_events.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_job_dispatch.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_job_queue.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_job_round_trip.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_memory_backend.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_queue.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_queue_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_queue_worker.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_redis_queue_reliability.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_routes.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_scheduler.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_scheduler_middleware.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_task.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_types.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_work_commands.py +0 -0
- {sillo_framework-1.2.0 → sillo_framework-1.2.1}/tests/test_work/test_work_di.py +0 -0
- {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
|
-
## [
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|
|
@@ -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,
|
|
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
|
-
|
|
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) ->
|
|
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
|
-
|
|
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}")
|