bustapi 0.13.4__tar.gz → 0.13.5__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.4 → bustapi-0.13.5}/CHANGELOG.md +9 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/Cargo.lock +3 -3
- {bustapi-0.13.4 → bustapi-0.13.5}/Cargo.toml +1 -1
- {bustapi-0.13.4 → bustapi-0.13.5}/PKG-INFO +1 -1
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/changelog.md +9 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/pyproject.toml +1 -1
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/__init__.py +1 -1
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/app.py +9 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/context.py +5 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/core/helpers.py +25 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/dispatch.py +18 -0
- bustapi-0.13.5/tests/test_issue_24.py +88 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/- +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.github/FUNDING.yml +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.github/workflows/ci-multiplatform.yml +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.github/workflows/ci.yml +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.github/workflows/docs.yml +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.github/workflows/manual-publish.yml +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.gitignore +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/.python-version +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/AGENT_KNOWLEDGE.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/Dockerfile +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/LICENSE +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/README.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/CACHE_BENCHMARK.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/README.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/app.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/benchmark_all.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/benchmark_avg.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/benchmark_cache.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/benchmark_combined.png +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/bustapi.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/bustapi_bench.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/bustapi_internal.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/comparison_bench.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/comprehensive_benchmark.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/gen_graph.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/quick_bench.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/resource_bench.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/rps_comparison.png +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/run_comparison_auto.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/benchmarks/ws_benchmark.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/async.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/blueprints.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/dependency_injection.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/deployment.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/middleware.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/security.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/advanced/validation.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/api-reference.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/assets/logo.png +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/complete-api-reference.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/deployment-performance-guide.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/deployment.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/examples-guide.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/index.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/installation.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/overrides/.gitkeep +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/quickstart.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/release_track.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/advanced/async_support.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/advanced/blueprints.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/advanced/dependency_injection.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/advanced/middleware.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/advanced/validation.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/api/all.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/api/app.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/api/context.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/api/utilities.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/assets/logo.png +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/changelog.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/core_concepts/request_data.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/core_concepts/responses.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/core_concepts/routing.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/core_concepts/templates.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/examples/index.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/getting_started/index.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/getting_started/quickstart.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/index.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/script.js +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/site/style.css +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/stylesheets/extra.css +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/authentication.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/caching.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/cli.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/database.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/documentation.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/error_handling.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/jwt.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/logging.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/multiprocessing.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/request_data.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/responses.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/routing.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/sessions.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/static_files.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/templates.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/turbo-routes.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/user-guide/video-streaming.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/docs/websockets.md +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/08_auto_docs.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/12_test_modes.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/13_error_handling.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/14_middleware.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/16_middleware_session.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/20_file_uploads.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/24_body_and_depends.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/27_video_stream.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/28_websocket.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/advanced/29_turbo_websocket.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/basics/01_hello_world.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/basics/02_parameters.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/basics/03_async.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/basics/04_request_data.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/basics/19_all_types.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/database/07_database_raw.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/database/10_database_sqlmodel.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/routing/06_blueprints.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/routing/09_complex_routing.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/routing/21_path_validation.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/routing/22_path_docs.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/routing/23_query_validation.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/routing/blueprint_with_jwt.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/10_rate_limit_demo.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/11_security_demo.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/17_jwt_auth.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/17_safe_features.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/18_jwt_cookies.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/18_safe_advanced.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/security/18_session_login.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/templates/05_templates.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/templates/26_complex_template.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/templates/templates/index.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/turbo/cache_test.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/turbo/fair_benchmark.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/turbo/typed_turbo_example.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/ws/app.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/ws/templates/index.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/ws/websockets_demo.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/examples/ws/ws_limit.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/mkdocs.yml +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/csrf.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/decorators.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/login.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/password.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/tokens.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/auth/user.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/cli/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/cli/main.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/core/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/core/asgi.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/core/exceptions.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/core/logging.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/dependencies.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/documentation/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/documentation/generator.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/extraction.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/fastapi_compat.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/hooks.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/http/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/http/request.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/http/response.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/jwt.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/logging.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/middleware.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/multiprocess.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/params.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/py.typed +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/responses.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/routing/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/routing/blueprints.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/routing/decorators.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/safe/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/safe/concurrency.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/safe/types.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/security/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/security/extension.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/security/rate_limit.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/server/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/server/runner.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/server/wsgi.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/sessions.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/templating/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/templating/engine.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/templating/mixin.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/testing/__init__.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/testing/client.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/utils.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/python/bustapi/websocket.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/run_all_examples.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/scratch/test_abort.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/scratch/test_headers.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/app.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/converters.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/handlers.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/mod.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/request.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/typed_turbo.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/bindings/websocket.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/crypto.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/jwt.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/lib.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/logger.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/rate_limiter.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/request/methods.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/request/mod.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/request/tests.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/response/builders.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/response/methods.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/response/mod.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/router/handlers.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/router/matching.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/router/middleware.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/router/mod.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/router/tests.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/server/handlers.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/server/mod.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/server/startup.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/server/stream.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/static_files.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/templating.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/watcher.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/websocket/config.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/websocket/mod.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/websocket/session.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/src/websocket/turbo.rs +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/static/style.css +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/templates/base.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/templates/complex.html +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/docs_test_all.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/docs_test_api_reference.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/docs_test_installation.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/docs_test_quickstart.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/docs_test_simple.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_050_features.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_async_hooks.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_async_login.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_auth.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_discussion_21.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_discussion_22.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_examples.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_hot_reload.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_issue_18.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_issue_23.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_jwt.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_jwt_cookies.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_login_manager.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_middleware.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_multiprocess_stability.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_new_examples.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_orm_conflict.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_path_standalone.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_path_validation.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_rate_limit_rust.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_safe.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_security_unit.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_sessions.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/test_zero_copy.py +0 -0
- {bustapi-0.13.4 → bustapi-0.13.5}/tests/verify_router.py +0 -0
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.13.5] - 2026-06-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Context Processor Tests**: Added comprehensive test cases (`test_issue_24.py`) to verify application-wide and blueprint-specific template context processors and CSRFProtect initialization.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **CSRFProtect AttributeError**: Fixed an issue where initializing `CSRFProtect(app)` raised an `AttributeError` by implementing the `context_processor` decorator on the `BustAPI` application object.
|
|
12
|
+
- **Request Endpoint Resolution**: Mapped the active endpoint (`request.endpoint`) during route dispatch so that blueprint-specific context processors can be resolved and applied during template rendering.
|
|
13
|
+
|
|
5
14
|
## [0.13.4] - 2026-06-02
|
|
6
15
|
|
|
7
16
|
### Added
|
|
@@ -432,7 +432,7 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
|
|
432
432
|
|
|
433
433
|
[[package]]
|
|
434
434
|
name = "bustapi_core"
|
|
435
|
-
version = "0.13.
|
|
435
|
+
version = "0.13.5"
|
|
436
436
|
dependencies = [
|
|
437
437
|
"actix-files",
|
|
438
438
|
"actix-http",
|
|
@@ -2869,9 +2869,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
|
|
2869
2869
|
|
|
2870
2870
|
[[package]]
|
|
2871
2871
|
name = "yoke"
|
|
2872
|
-
version = "0.8.
|
|
2872
|
+
version = "0.8.3"
|
|
2873
2873
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2874
|
-
checksum = "
|
|
2874
|
+
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
|
2875
2875
|
dependencies = [
|
|
2876
2876
|
"stable_deref_trait",
|
|
2877
2877
|
"yoke-derive",
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.13.5] - 2026-06-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Context Processor Tests**: Added comprehensive test cases (`test_issue_24.py`) to verify application-wide and blueprint-specific template context processors and CSRFProtect initialization.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **CSRFProtect AttributeError**: Fixed an issue where initializing `CSRFProtect(app)` raised an `AttributeError` by implementing the `context_processor` decorator on the `BustAPI` application object.
|
|
12
|
+
- **Request Endpoint Resolution**: Mapped the active endpoint (`request.endpoint`) during route dispatch so that blueprint-specific context processors can be resolved and applied during template rendering.
|
|
13
|
+
|
|
5
14
|
## [0.13.4] - 2026-06-02
|
|
6
15
|
|
|
7
16
|
### Added
|
|
@@ -146,6 +146,15 @@ class BustAPI(
|
|
|
146
146
|
def register_blueprint(self, blueprint: Blueprint, **options) -> None:
|
|
147
147
|
url_prefix = options.get("url_prefix", blueprint.url_prefix)
|
|
148
148
|
self.blueprints[blueprint.name] = blueprint
|
|
149
|
+
|
|
150
|
+
# Register blueprint template context processors
|
|
151
|
+
self.template_context_processors.setdefault(blueprint.name, []).extend(
|
|
152
|
+
blueprint.context_processor_funcs
|
|
153
|
+
)
|
|
154
|
+
self.template_context_processors.setdefault(None, []).extend(
|
|
155
|
+
blueprint.app_context_processor_funcs
|
|
156
|
+
)
|
|
157
|
+
|
|
149
158
|
for rule, endpoint, view_func, methods in blueprint.deferred_functions:
|
|
150
159
|
if url_prefix:
|
|
151
160
|
rule = url_prefix.rstrip("/") + "/" + rule.lstrip("/")
|
|
@@ -86,6 +86,11 @@ class ContextManagement:
|
|
|
86
86
|
self.shell_context_processors.append(f)
|
|
87
87
|
return f
|
|
88
88
|
|
|
89
|
+
def context_processor(self, f):
|
|
90
|
+
"""Register a template context processor function."""
|
|
91
|
+
self.template_context_processors.setdefault(None, []).append(f)
|
|
92
|
+
return f
|
|
93
|
+
|
|
89
94
|
def make_shell_context(self):
|
|
90
95
|
"""Create shell context."""
|
|
91
96
|
context = {"app": self}
|
|
@@ -348,6 +348,31 @@ def render_template(template_name: str, **context) -> Response:
|
|
|
348
348
|
except RuntimeError:
|
|
349
349
|
pass
|
|
350
350
|
|
|
351
|
+
# Run template context processors
|
|
352
|
+
try:
|
|
353
|
+
current_app = _get_current_object()
|
|
354
|
+
if hasattr(current_app, "template_context_processors"):
|
|
355
|
+
# Run global processors
|
|
356
|
+
funcs = current_app.template_context_processors.get(None, [])
|
|
357
|
+
for func in funcs:
|
|
358
|
+
context.update(func())
|
|
359
|
+
|
|
360
|
+
# Run blueprint-specific processors
|
|
361
|
+
try:
|
|
362
|
+
from ..http.request import request as req
|
|
363
|
+
|
|
364
|
+
if req and getattr(req, "endpoint", None) and "." in req.endpoint:
|
|
365
|
+
bp_name = req.endpoint.split(".", 1)[0]
|
|
366
|
+
bp_funcs = current_app.template_context_processors.get(
|
|
367
|
+
bp_name, []
|
|
368
|
+
)
|
|
369
|
+
for func in bp_funcs:
|
|
370
|
+
context.update(func())
|
|
371
|
+
except Exception:
|
|
372
|
+
pass
|
|
373
|
+
except Exception:
|
|
374
|
+
pass
|
|
375
|
+
|
|
351
376
|
# Load and render template
|
|
352
377
|
template = env.get_template(template_name)
|
|
353
378
|
html = template.render(**context)
|
|
@@ -112,6 +112,15 @@ def create_sync_wrapper(app: "BustAPI", handler: Callable, rule: str) -> Callabl
|
|
|
112
112
|
# 1. Context and Request Initialization (Fast Path)
|
|
113
113
|
request = Request._from_rust_request(rust_request)
|
|
114
114
|
request.app = app
|
|
115
|
+
|
|
116
|
+
# Find and set endpoint
|
|
117
|
+
endpoint = None
|
|
118
|
+
for ep, func in app.view_functions.items():
|
|
119
|
+
if func is handler:
|
|
120
|
+
endpoint = ep
|
|
121
|
+
break
|
|
122
|
+
request.endpoint = endpoint
|
|
123
|
+
|
|
115
124
|
token = _request_ctx.set(request)
|
|
116
125
|
|
|
117
126
|
# 2. Session Initialization
|
|
@@ -299,6 +308,15 @@ def create_async_wrapper(app: "BustAPI", handler: Callable, rule: str) -> Callab
|
|
|
299
308
|
async def run_logic():
|
|
300
309
|
request = Request._from_rust_request(rust_request)
|
|
301
310
|
request.app = app
|
|
311
|
+
|
|
312
|
+
# Find and set endpoint
|
|
313
|
+
endpoint = None
|
|
314
|
+
for ep, func in app.view_functions.items():
|
|
315
|
+
if func is handler:
|
|
316
|
+
endpoint = ep
|
|
317
|
+
break
|
|
318
|
+
request.endpoint = endpoint
|
|
319
|
+
|
|
302
320
|
token = _request_ctx.set(request)
|
|
303
321
|
|
|
304
322
|
try:
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from bustapi import BustAPI, CSRFProtect, render_template
|
|
6
|
+
from bustapi.routing.blueprints import Blueprint
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.fixture
|
|
10
|
+
def app_with_csrf():
|
|
11
|
+
app = BustAPI(import_name="test_app_csrf")
|
|
12
|
+
app.secret_key = "test-secret-key"
|
|
13
|
+
|
|
14
|
+
# Initialize CSRFProtect
|
|
15
|
+
csrf = CSRFProtect(app)
|
|
16
|
+
|
|
17
|
+
# Setup templates
|
|
18
|
+
template_dir = os.path.join(os.getcwd(), "templates_test_24")
|
|
19
|
+
os.makedirs(template_dir, exist_ok=True)
|
|
20
|
+
|
|
21
|
+
with open(os.path.join(template_dir, "index.html"), "w") as f:
|
|
22
|
+
f.write("<html><body>csrf_token: {{ csrf_token() }}</body></html>")
|
|
23
|
+
|
|
24
|
+
with open(os.path.join(template_dir, "bp.html"), "w") as f:
|
|
25
|
+
f.write(
|
|
26
|
+
"<html><body>csrf_token: {{ csrf_token() }}, bp_val: {{ bp_val }}</body></html>"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
app.template_folder = template_dir
|
|
30
|
+
|
|
31
|
+
# Add custom app-wide context processor
|
|
32
|
+
@app.context_processor
|
|
33
|
+
def app_processor():
|
|
34
|
+
return {"app_val": "app-wide"}
|
|
35
|
+
|
|
36
|
+
# Create Blueprint and register context processor
|
|
37
|
+
bp = Blueprint("test_bp", "test_bp_module")
|
|
38
|
+
|
|
39
|
+
@bp.context_processor
|
|
40
|
+
def bp_processor():
|
|
41
|
+
return {"bp_val": "blueprint-specific"}
|
|
42
|
+
|
|
43
|
+
@bp.route("/bp-view")
|
|
44
|
+
def bp_view():
|
|
45
|
+
return render_template("bp.html")
|
|
46
|
+
|
|
47
|
+
app.register_blueprint(bp)
|
|
48
|
+
|
|
49
|
+
@app.route("/")
|
|
50
|
+
def index():
|
|
51
|
+
return render_template("index.html")
|
|
52
|
+
|
|
53
|
+
yield app
|
|
54
|
+
|
|
55
|
+
# Cleanup
|
|
56
|
+
shutil.rmtree(template_dir, ignore_errors=True)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_csrf_initialization(app_with_csrf):
|
|
60
|
+
"""Test that CSRFProtect initializes without AttributeError."""
|
|
61
|
+
assert "csrf" in app_with_csrf.extensions
|
|
62
|
+
assert isinstance(app_with_csrf.extensions["csrf"], CSRFProtect)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_csrf_token_in_context(app_with_csrf):
|
|
66
|
+
"""Test that csrf_token is available and callable in the template context."""
|
|
67
|
+
with app_with_csrf.test_client() as client:
|
|
68
|
+
# Create session transaction to have a session so _get_csrf_token doesn't return empty
|
|
69
|
+
with client.session_transaction() as sess:
|
|
70
|
+
sess["_csrf_token"] = "test-csrf-value"
|
|
71
|
+
|
|
72
|
+
resp = client.get("/")
|
|
73
|
+
assert resp.status_code == 200
|
|
74
|
+
assert "csrf_token: test-csrf-value" in resp.text
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def test_blueprint_context_processor(app_with_csrf):
|
|
78
|
+
"""Test that blueprint-specific context processor gets applied only in blueprint context."""
|
|
79
|
+
with app_with_csrf.test_client() as client:
|
|
80
|
+
# Test main app template does not have bp_val (it would error if used, or render empty/none)
|
|
81
|
+
# Test blueprint template has both csrf_token and bp_val
|
|
82
|
+
with client.session_transaction() as sess:
|
|
83
|
+
sess["_csrf_token"] = "test-csrf-value"
|
|
84
|
+
|
|
85
|
+
resp = client.get("/bp-view")
|
|
86
|
+
assert resp.status_code == 200
|
|
87
|
+
assert "csrf_token: test-csrf-value" in resp.text
|
|
88
|
+
assert "bp_val: blueprint-specific" in resp.text
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|