bustapi 0.14.0__tar.gz → 0.14.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.
- {bustapi-0.14.0 → bustapi-0.14.1}/.gitignore +2 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/CHANGELOG.md +6 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/Cargo.lock +1 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/Cargo.toml +1 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/PKG-INFO +1 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/changelog.md +6 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/pyproject.toml +1 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/__init__.py +1 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/login.py +5 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/sessions.py +3 -1
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_async_login.py +28 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/- +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/.github/FUNDING.yml +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/.github/workflows/ci-multiplatform.yml +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/.github/workflows/ci.yml +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/.github/workflows/docs.yml +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/.github/workflows/manual-publish.yml +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/.python-version +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/AGENT_KNOWLEDGE.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/Dockerfile +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/LICENSE +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/README.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/CACHE_BENCHMARK.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/README.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/app.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/benchmark_all.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/benchmark_avg.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/benchmark_cache.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/benchmark_combined.png +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/bustapi.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/bustapi_bench.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/bustapi_internal.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/comparison_bench.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/comprehensive_benchmark.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/gen_graph.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/quick_bench.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/resource_bench.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/rps_comparison.png +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/run_comparison_auto.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/benchmarks/ws_benchmark.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/async.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/blueprints.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/dependency_injection.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/deployment.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/middleware.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/security.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/advanced/validation.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/api-reference.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/assets/logo.png +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/complete-api-reference.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/deployment-performance-guide.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/deployment.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/examples-guide.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/index.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/installation.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/overrides/.gitkeep +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/quickstart.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/release_track.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/advanced/async_support.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/advanced/blueprints.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/advanced/dependency_injection.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/advanced/middleware.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/advanced/validation.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/api/all.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/api/app.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/api/context.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/api/utilities.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/assets/logo.png +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/changelog.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/core_concepts/request_data.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/core_concepts/responses.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/core_concepts/routing.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/core_concepts/templates.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/examples/index.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/getting_started/index.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/getting_started/quickstart.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/index.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/script.js +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/site/style.css +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/stylesheets/extra.css +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/authentication.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/caching.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/cli.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/database.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/documentation.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/error_handling.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/jwt.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/logging.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/multiprocessing.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/request_data.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/responses.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/routing.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/sessions.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/static_files.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/templates.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/turbo-routes.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/user-guide/video-streaming.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/docs/websockets.md +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/08_auto_docs.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/12_test_modes.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/13_error_handling.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/14_middleware.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/16_middleware_session.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/20_file_uploads.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/24_body_and_depends.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/27_video_stream.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/28_websocket.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/advanced/29_turbo_websocket.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/basics/01_hello_world.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/basics/02_parameters.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/basics/03_async.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/basics/04_request_data.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/basics/19_all_types.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/database/07_database_raw.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/database/10_database_sqlmodel.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/routing/06_blueprints.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/routing/09_complex_routing.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/routing/21_path_validation.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/routing/22_path_docs.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/routing/23_query_validation.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/routing/blueprint_with_jwt.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/10_rate_limit_demo.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/11_security_demo.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/17_jwt_auth.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/17_safe_features.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/18_jwt_cookies.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/18_safe_advanced.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/security/18_session_login.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/templates/05_templates.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/templates/26_complex_template.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/templates/templates/index.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/turbo/cache_test.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/turbo/fair_benchmark.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/turbo/typed_turbo_example.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/ws/app.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/ws/templates/index.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/ws/websockets_demo.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/examples/ws/ws_limit.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/mkdocs.yml +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/app.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/csrf.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/decorators.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/password.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/tokens.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/auth/user.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/cli/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/cli/main.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/context.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/core/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/core/asgi.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/core/exceptions.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/core/helpers.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/core/logging.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/dependencies.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/dispatch.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/documentation/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/documentation/generator.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/extraction.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/fastapi_compat.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/hooks.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/http/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/http/request.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/http/response.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/jwt.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/logging.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/middleware.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/multiprocess.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/params.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/py.typed +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/responses.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/routing/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/routing/blueprints.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/routing/decorators.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/safe/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/safe/concurrency.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/safe/types.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/security/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/security/extension.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/security/rate_limit.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/server/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/server/runner.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/server/wsgi.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/templating/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/templating/engine.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/templating/mixin.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/testing/__init__.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/testing/client.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/utils.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/python/bustapi/websocket.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/run_all_examples.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/scratch/test_abort.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/scratch/test_headers.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/app.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/converters.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/handlers.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/mod.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/request.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/typed_turbo.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/bindings/websocket.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/crypto.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/jwt.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/lib.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/logger.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/rate_limiter.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/request/methods.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/request/mod.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/request/tests.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/response/builders.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/response/methods.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/response/mod.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/router/handlers.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/router/matching.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/router/middleware.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/router/mod.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/router/tests.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/server/handlers.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/server/mod.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/server/startup.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/server/stream.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/static_files.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/templating.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/watcher.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/websocket/config.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/websocket/mod.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/websocket/session.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/src/websocket/turbo.rs +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/static/style.css +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/templates/base.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/templates/complex.html +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/docs_test_all.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/docs_test_api_reference.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/docs_test_installation.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/docs_test_quickstart.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/docs_test_simple.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_050_features.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_async_hooks.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_auth.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_discussion_21.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_discussion_22.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_discussion_28.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_examples.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_hot_reload.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_issue_18.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_issue_23.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_issue_24.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_issue_29.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_jwt.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_jwt_cookies.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_login_manager.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_middleware.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_multiprocess_stability.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_new_examples.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_orm_conflict.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_path_standalone.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_path_validation.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_rate_limit_rust.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_safe.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_security_unit.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_sessions.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/test_zero_copy.py +0 -0
- {bustapi-0.14.0 → bustapi-0.14.1}/tests/verify_router.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.14.1] - 2026-06-17
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Auth Login**: Resolved `RuntimeWarning: coroutine 'load_user' was never awaited` when using an asynchronous `user_loader` callback with `login_user(user_id)`. The loader's return value is now correctly run/awaited synchronously.
|
|
9
|
+
- **Session Expiration**: Replaced deprecated `datetime.utcnow()` with timezone-aware `datetime.now(timezone.utc)` to avoid future Python compatibility deprecation warnings.
|
|
10
|
+
|
|
5
11
|
## [0.14.0] - 2026-06-17
|
|
6
12
|
|
|
7
13
|
### Added
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.14.1] - 2026-06-17
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Auth Login**: Resolved `RuntimeWarning: coroutine 'load_user' was never awaited` when using an asynchronous `user_loader` callback with `login_user(user_id)`. The loader's return value is now correctly run/awaited synchronously.
|
|
9
|
+
- **Session Expiration**: Replaced deprecated `datetime.utcnow()` with timezone-aware `datetime.now(timezone.utc)` to avoid future Python compatibility deprecation warnings.
|
|
10
|
+
|
|
5
11
|
## [0.14.0] - 2026-06-17
|
|
6
12
|
|
|
7
13
|
### Added
|
|
@@ -162,7 +162,11 @@ def login_user(user, remember: bool = False, fresh: bool = True) -> bool:
|
|
|
162
162
|
|
|
163
163
|
try:
|
|
164
164
|
res = login_manager._user_loader_callback(user_id)
|
|
165
|
-
if
|
|
165
|
+
if inspect.isawaitable(res):
|
|
166
|
+
from ..utils import async_to_sync
|
|
167
|
+
|
|
168
|
+
loaded_user = async_to_sync(res)
|
|
169
|
+
else:
|
|
166
170
|
loaded_user = res
|
|
167
171
|
except Exception:
|
|
168
172
|
pass
|
|
@@ -128,7 +128,9 @@ class SecureCookieSessionInterface(SessionInterface):
|
|
|
128
128
|
expires = None
|
|
129
129
|
max_age = None
|
|
130
130
|
if session.permanent and app.permanent_session_lifetime:
|
|
131
|
-
|
|
131
|
+
from datetime import timezone
|
|
132
|
+
|
|
133
|
+
expires = datetime.now(timezone.utc) + app.permanent_session_lifetime
|
|
132
134
|
max_age = int(app.permanent_session_lifetime.total_seconds())
|
|
133
135
|
|
|
134
136
|
response.set_cookie(
|
|
@@ -78,5 +78,33 @@ def test_sync_user_loader_still_works():
|
|
|
78
78
|
assert response.json == {"id": 1, "name": "Sync User"}
|
|
79
79
|
|
|
80
80
|
|
|
81
|
+
def test_login_user_with_async_user_loader():
|
|
82
|
+
app = BustAPI()
|
|
83
|
+
app.secret_key = "test-secret"
|
|
84
|
+
login_manager = LoginManager(app)
|
|
85
|
+
|
|
86
|
+
async def get_user_from_db(user_id):
|
|
87
|
+
await asyncio.sleep(0.001)
|
|
88
|
+
if user_id == "42":
|
|
89
|
+
return User(42, "Direct Async User")
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
@login_manager.user_loader
|
|
93
|
+
async def load_user(user_id):
|
|
94
|
+
return await get_user_from_db(user_id)
|
|
95
|
+
|
|
96
|
+
@app.route("/login-raw")
|
|
97
|
+
def login_raw():
|
|
98
|
+
# Call login_user with raw ID
|
|
99
|
+
login_user("42")
|
|
100
|
+
# Check if the resolved user is loaded immediately
|
|
101
|
+
return {"id": current_user.id, "name": current_user.name}
|
|
102
|
+
|
|
103
|
+
client = BustTestClient(app)
|
|
104
|
+
response = client.get("/login-raw")
|
|
105
|
+
assert response.status_code == 200
|
|
106
|
+
assert response.json == {"id": 42, "name": "Direct Async User"}
|
|
107
|
+
|
|
108
|
+
|
|
81
109
|
if __name__ == "__main__":
|
|
82
110
|
pytest.main([__file__])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|