bustapi 0.13.3__tar.gz → 0.13.4__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.13.3 → bustapi-0.13.4}/CHANGELOG.md +24 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/Cargo.lock +11 -11
- {bustapi-0.13.3 → bustapi-0.13.4}/Cargo.toml +1 -1
- {bustapi-0.13.3 → bustapi-0.13.4}/PKG-INFO +1 -1
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/changelog.md +24 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/pyproject.toml +1 -1
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/__init__.py +1 -1
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/dispatch.py +0 -1
- bustapi-0.13.4/tests/test_discussion_22.py +60 -0
- bustapi-0.13.4/tests/test_issue_23.py +45 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/- +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.github/FUNDING.yml +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.github/workflows/ci-multiplatform.yml +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.github/workflows/ci.yml +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.github/workflows/docs.yml +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.github/workflows/manual-publish.yml +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.gitignore +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/.python-version +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/AGENT_KNOWLEDGE.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/Dockerfile +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/LICENSE +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/README.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/CACHE_BENCHMARK.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/README.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/app.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/benchmark_all.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/benchmark_avg.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/benchmark_cache.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/benchmark_combined.png +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/bustapi.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/bustapi_bench.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/bustapi_internal.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/comparison_bench.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/comprehensive_benchmark.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/gen_graph.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/quick_bench.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/resource_bench.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/rps_comparison.png +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/run_comparison_auto.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/benchmarks/ws_benchmark.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/async.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/blueprints.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/dependency_injection.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/deployment.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/middleware.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/security.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/advanced/validation.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/api-reference.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/assets/logo.png +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/complete-api-reference.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/deployment-performance-guide.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/deployment.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/examples-guide.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/index.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/installation.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/overrides/.gitkeep +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/quickstart.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/release_track.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/advanced/async_support.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/advanced/blueprints.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/advanced/dependency_injection.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/advanced/middleware.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/advanced/validation.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/api/all.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/api/app.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/api/context.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/api/utilities.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/assets/logo.png +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/changelog.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/core_concepts/request_data.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/core_concepts/responses.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/core_concepts/routing.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/core_concepts/templates.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/examples/index.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/getting_started/index.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/getting_started/quickstart.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/index.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/script.js +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/site/style.css +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/stylesheets/extra.css +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/authentication.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/caching.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/cli.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/database.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/documentation.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/error_handling.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/jwt.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/logging.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/multiprocessing.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/request_data.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/responses.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/routing.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/sessions.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/static_files.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/templates.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/turbo-routes.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/user-guide/video-streaming.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/docs/websockets.md +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/08_auto_docs.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/12_test_modes.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/13_error_handling.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/14_middleware.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/16_middleware_session.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/20_file_uploads.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/24_body_and_depends.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/27_video_stream.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/28_websocket.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/advanced/29_turbo_websocket.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/basics/01_hello_world.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/basics/02_parameters.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/basics/03_async.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/basics/04_request_data.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/basics/19_all_types.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/database/07_database_raw.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/database/10_database_sqlmodel.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/routing/06_blueprints.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/routing/09_complex_routing.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/routing/21_path_validation.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/routing/22_path_docs.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/routing/23_query_validation.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/routing/blueprint_with_jwt.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/10_rate_limit_demo.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/11_security_demo.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/17_jwt_auth.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/17_safe_features.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/18_jwt_cookies.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/18_safe_advanced.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/security/18_session_login.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/templates/05_templates.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/templates/26_complex_template.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/templates/templates/index.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/turbo/cache_test.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/turbo/fair_benchmark.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/turbo/typed_turbo_example.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/ws/app.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/ws/templates/index.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/ws/websockets_demo.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/examples/ws/ws_limit.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/mkdocs.yml +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/app.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/csrf.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/decorators.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/login.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/password.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/tokens.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/auth/user.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/cli/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/cli/main.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/context.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/core/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/core/asgi.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/core/exceptions.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/core/helpers.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/core/logging.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/dependencies.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/documentation/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/documentation/generator.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/extraction.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/fastapi_compat.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/hooks.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/http/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/http/request.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/http/response.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/jwt.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/logging.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/middleware.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/multiprocess.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/params.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/py.typed +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/responses.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/routing/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/routing/blueprints.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/routing/decorators.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/safe/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/safe/concurrency.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/safe/types.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/security/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/security/extension.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/security/rate_limit.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/server/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/server/runner.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/server/wsgi.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/sessions.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/templating/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/templating/engine.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/templating/mixin.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/testing/__init__.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/testing/client.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/utils.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/python/bustapi/websocket.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/run_all_examples.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/scratch/test_abort.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/scratch/test_headers.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/app.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/converters.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/handlers.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/mod.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/request.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/typed_turbo.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/bindings/websocket.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/crypto.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/jwt.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/lib.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/logger.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/rate_limiter.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/request/methods.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/request/mod.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/request/tests.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/response/builders.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/response/methods.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/response/mod.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/router/handlers.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/router/matching.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/router/middleware.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/router/mod.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/router/tests.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/server/handlers.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/server/mod.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/server/startup.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/server/stream.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/static_files.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/templating.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/watcher.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/websocket/config.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/websocket/mod.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/websocket/session.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/src/websocket/turbo.rs +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/static/style.css +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/templates/base.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/templates/complex.html +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/docs_test_all.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/docs_test_api_reference.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/docs_test_installation.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/docs_test_quickstart.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/docs_test_simple.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_050_features.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_async_hooks.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_async_login.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_auth.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_discussion_21.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_examples.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_hot_reload.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_issue_18.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_jwt.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_jwt_cookies.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_login_manager.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_middleware.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_multiprocess_stability.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_new_examples.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_orm_conflict.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_path_standalone.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_path_validation.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_rate_limit_rust.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_safe.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_security_unit.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_sessions.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/test_zero_copy.py +0 -0
- {bustapi-0.13.3 → bustapi-0.13.4}/tests/verify_router.py +0 -0
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.13.4] - 2026-06-02
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Session and Redirect Tests**: Added regression tests (`test_discussion_22.py` and `test_issue_23.py`) to verify `session.permanent` scoping and redirect execution.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Token Double-Reset**: Fixed a `RuntimeError` when returning a response from a synchronous before-request hook by removing a redundant contextvar token reset call in `create_sync_wrapper`.
|
|
12
|
+
|
|
13
|
+
## [0.13.3] - 2026-05-30
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- **CI Linting**: Formatted `generator.py` with `black` to resolve CI linting pipeline failure.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **Git Config**: Added `*.db` to `.gitignore` to prevent tracking database files.
|
|
20
|
+
|
|
21
|
+
## [0.13.2] - 2026-05-30
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- **Authentication Tests**: Added comprehensive test cases (`test_discussion_21.py`) verifying role and permission decorators (`@roles_required`, `@permission_required`).
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
- **Request State Initialization**: Initialized `_login_user` and `_login_fresh` attributes directly on `Request` object instantiation to ensure robust compatibility with login management decorators.
|
|
28
|
+
|
|
5
29
|
## [0.13.1] - 2026-05-03
|
|
6
30
|
|
|
7
31
|
### Fixed
|
|
@@ -372,9 +372,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
|
|
|
372
372
|
|
|
373
373
|
[[package]]
|
|
374
374
|
name = "bitflags"
|
|
375
|
-
version = "2.
|
|
375
|
+
version = "2.12.1"
|
|
376
376
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
377
|
-
checksum = "
|
|
377
|
+
checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a"
|
|
378
378
|
|
|
379
379
|
[[package]]
|
|
380
380
|
name = "blake2"
|
|
@@ -432,7 +432,7 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
|
|
432
432
|
|
|
433
433
|
[[package]]
|
|
434
434
|
name = "bustapi_core"
|
|
435
|
-
version = "0.13.
|
|
435
|
+
version = "0.13.4"
|
|
436
436
|
dependencies = [
|
|
437
437
|
"actix-files",
|
|
438
438
|
"actix-http",
|
|
@@ -1284,9 +1284,9 @@ dependencies = [
|
|
|
1284
1284
|
|
|
1285
1285
|
[[package]]
|
|
1286
1286
|
name = "inotify"
|
|
1287
|
-
version = "0.11.
|
|
1287
|
+
version = "0.11.2"
|
|
1288
1288
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1289
|
-
checksum = "
|
|
1289
|
+
checksum = "533e68a5842e734946fe159fb03fc9bbbb254f590dd0d8ad321ae5ff7beca2c1"
|
|
1290
1290
|
dependencies = [
|
|
1291
1291
|
"bitflags",
|
|
1292
1292
|
"inotify-sys",
|
|
@@ -1341,9 +1341,9 @@ dependencies = [
|
|
|
1341
1341
|
|
|
1342
1342
|
[[package]]
|
|
1343
1343
|
name = "kqueue"
|
|
1344
|
-
version = "1.
|
|
1344
|
+
version = "1.2.0"
|
|
1345
1345
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1346
|
-
checksum = "
|
|
1346
|
+
checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5"
|
|
1347
1347
|
dependencies = [
|
|
1348
1348
|
"kqueue-sys",
|
|
1349
1349
|
"libc",
|
|
@@ -1432,9 +1432,9 @@ dependencies = [
|
|
|
1432
1432
|
|
|
1433
1433
|
[[package]]
|
|
1434
1434
|
name = "log"
|
|
1435
|
-
version = "0.4.
|
|
1435
|
+
version = "0.4.31"
|
|
1436
1436
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1437
|
-
checksum = "
|
|
1437
|
+
checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f"
|
|
1438
1438
|
|
|
1439
1439
|
[[package]]
|
|
1440
1440
|
name = "matchers"
|
|
@@ -2365,9 +2365,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
|
2365
2365
|
|
|
2366
2366
|
[[package]]
|
|
2367
2367
|
name = "unicode-segmentation"
|
|
2368
|
-
version = "1.13.
|
|
2368
|
+
version = "1.13.3"
|
|
2369
2369
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2370
|
-
checksum = "
|
|
2370
|
+
checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
|
|
2371
2371
|
|
|
2372
2372
|
[[package]]
|
|
2373
2373
|
name = "unicode-xid"
|
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.13.4] - 2026-06-02
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Session and Redirect Tests**: Added regression tests (`test_discussion_22.py` and `test_issue_23.py`) to verify `session.permanent` scoping and redirect execution.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Token Double-Reset**: Fixed a `RuntimeError` when returning a response from a synchronous before-request hook by removing a redundant contextvar token reset call in `create_sync_wrapper`.
|
|
12
|
+
|
|
13
|
+
## [0.13.3] - 2026-05-30
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- **CI Linting**: Formatted `generator.py` with `black` to resolve CI linting pipeline failure.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **Git Config**: Added `*.db` to `.gitignore` to prevent tracking database files.
|
|
20
|
+
|
|
21
|
+
## [0.13.2] - 2026-05-30
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- **Authentication Tests**: Added comprehensive test cases (`test_discussion_21.py`) verifying role and permission decorators (`@roles_required`, `@permission_required`).
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
- **Request State Initialization**: Initialized `_login_user` and `_login_fresh` attributes directly on `Request` object instantiation to ensure robust compatibility with login management decorators.
|
|
28
|
+
|
|
5
29
|
## [0.13.1] - 2026-05-03
|
|
6
30
|
|
|
7
31
|
### Fixed
|
|
@@ -130,7 +130,6 @@ def create_sync_wrapper(app: "BustAPI", handler: Callable, rule: str) -> Callabl
|
|
|
130
130
|
response = app._make_response(res)
|
|
131
131
|
if session:
|
|
132
132
|
app.session_interface.save_session(app, session, response)
|
|
133
|
-
_request_ctx.reset(token)
|
|
134
133
|
return app._response_to_rust_format(response)
|
|
135
134
|
|
|
136
135
|
# 4. Main Request Processing (Branching based on Middleware presence)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from datetime import timedelta
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from bustapi import BustAPI, session
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_session_permanent_outside_context():
|
|
8
|
+
"""Verify that accessing session.permanent outside of a request context raises a RuntimeError."""
|
|
9
|
+
with pytest.raises(RuntimeError) as exc_info:
|
|
10
|
+
session.permanent = True
|
|
11
|
+
assert "Working outside of request context" in str(exc_info.value)
|
|
12
|
+
|
|
13
|
+
with pytest.raises(RuntimeError) as exc_info:
|
|
14
|
+
_ = session.permanent
|
|
15
|
+
assert "Working outside of request context" in str(exc_info.value)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_session_permanent_inside_view():
|
|
19
|
+
"""Verify that setting session.permanent inside a request view works and correctly sets max_age/expires on the cookie."""
|
|
20
|
+
app = BustAPI()
|
|
21
|
+
app.secret_key = "test-secret"
|
|
22
|
+
app.permanent_session_lifetime = timedelta(days=5)
|
|
23
|
+
|
|
24
|
+
@app.route("/login")
|
|
25
|
+
def login():
|
|
26
|
+
session["user_id"] = 123
|
|
27
|
+
session.permanent = True
|
|
28
|
+
return "logged in"
|
|
29
|
+
|
|
30
|
+
client = app.test_client()
|
|
31
|
+
resp = client.get("/login")
|
|
32
|
+
assert resp.status_code == 200
|
|
33
|
+
|
|
34
|
+
cookie_header = resp.headers.get("Set-Cookie", "")
|
|
35
|
+
assert "session=" in cookie_header
|
|
36
|
+
assert "Max-Age=" in cookie_header or "expires=" in cookie_header.lower()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_session_permanent_in_before_request():
|
|
40
|
+
"""Verify that setting session.permanent in a before_request hook works."""
|
|
41
|
+
app = BustAPI()
|
|
42
|
+
app.secret_key = "test-secret"
|
|
43
|
+
app.permanent_session_lifetime = timedelta(days=5)
|
|
44
|
+
|
|
45
|
+
@app.before_request
|
|
46
|
+
def make_session_permanent():
|
|
47
|
+
session.permanent = True
|
|
48
|
+
|
|
49
|
+
@app.route("/test")
|
|
50
|
+
def test_route():
|
|
51
|
+
session["foo"] = "bar"
|
|
52
|
+
return "ok"
|
|
53
|
+
|
|
54
|
+
client = app.test_client()
|
|
55
|
+
resp = client.get("/test")
|
|
56
|
+
assert resp.status_code == 200
|
|
57
|
+
|
|
58
|
+
cookie_header = resp.headers.get("Set-Cookie", "")
|
|
59
|
+
assert "session=" in cookie_header
|
|
60
|
+
assert "Max-Age=" in cookie_header or "expires=" in cookie_header.lower()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from bustapi import BustAPI, redirect
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def test_sync_before_request_redirect():
|
|
6
|
+
"""Verify that returning a redirect from a synchronous before_request hook works without raising RuntimeError."""
|
|
7
|
+
app = BustAPI()
|
|
8
|
+
app.secret_key = "test-secret"
|
|
9
|
+
|
|
10
|
+
@app.before_request
|
|
11
|
+
def redirect_hook():
|
|
12
|
+
return redirect("/target")
|
|
13
|
+
|
|
14
|
+
@app.route("/")
|
|
15
|
+
def index():
|
|
16
|
+
return "Home"
|
|
17
|
+
|
|
18
|
+
@app.route("/target")
|
|
19
|
+
def target():
|
|
20
|
+
return "Target"
|
|
21
|
+
|
|
22
|
+
client = app.test_client()
|
|
23
|
+
# This request should be intercepted by the redirect_hook and return 302
|
|
24
|
+
resp = client.get("/")
|
|
25
|
+
assert resp.status_code == 302
|
|
26
|
+
assert resp.headers.get("Location") == "/target"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_async_before_request_redirect():
|
|
30
|
+
"""Verify that returning a redirect from an asynchronous before_request hook also works correctly."""
|
|
31
|
+
app = BustAPI()
|
|
32
|
+
app.secret_key = "test-secret"
|
|
33
|
+
|
|
34
|
+
@app.before_request
|
|
35
|
+
async def redirect_hook():
|
|
36
|
+
return redirect("/target")
|
|
37
|
+
|
|
38
|
+
@app.route("/")
|
|
39
|
+
def index():
|
|
40
|
+
return "Home"
|
|
41
|
+
|
|
42
|
+
client = app.test_client()
|
|
43
|
+
resp = client.get("/")
|
|
44
|
+
assert resp.status_code == 302
|
|
45
|
+
assert resp.headers.get("Location") == "/target"
|
|
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
|