django-bolt 0.2.6__tar.gz → 0.2.8__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.

Potentially problematic release.


This version of django-bolt might be problematic. Click here for more details.

Files changed (248) hide show
  1. {django_bolt-0.2.6 → django_bolt-0.2.8}/CLAUDE.md +1 -0
  2. {django_bolt-0.2.6 → django_bolt-0.2.8}/Cargo.lock +1 -1
  3. {django_bolt-0.2.6 → django_bolt-0.2.8}/Cargo.toml +1 -1
  4. {django_bolt-0.2.6 → django_bolt-0.2.8}/PKG-INFO +3 -2
  5. {django_bolt-0.2.6 → django_bolt-0.2.8}/TODO.md +1 -1
  6. {django_bolt-0.2.6 → django_bolt-0.2.8}/pyproject.toml +3 -2
  7. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/__init__.py +1 -1
  8. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/api.py +27 -22
  9. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/management/commands/runbolt.py +25 -16
  10. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/middleware/__init__.py +2 -0
  11. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_compression.py +1 -2
  12. {django_bolt-0.2.6 → django_bolt-0.2.8}/.github/workflows/CI.yml +0 -0
  13. {django_bolt-0.2.6 → django_bolt-0.2.8}/.gitignore +0 -0
  14. {django_bolt-0.2.6 → django_bolt-0.2.8}/.python-version +0 -0
  15. {django_bolt-0.2.6 → django_bolt-0.2.8}/BENCHMARK_BASELINE.md +0 -0
  16. {django_bolt-0.2.6 → django_bolt-0.2.8}/BENCHMARK_DEV.md +0 -0
  17. {django_bolt-0.2.6 → django_bolt-0.2.8}/Makefile +0 -0
  18. {django_bolt-0.2.6 → django_bolt-0.2.8}/README.md +0 -0
  19. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/ANNOTATION_GUIDE.md +0 -0
  20. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/ASYNC_DJANGO.md +0 -0
  21. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/CLASS_BASED_VIEWS.md +0 -0
  22. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/COMPRESSION.md +0 -0
  23. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/DEPENDENCY_INJECTION.md +0 -0
  24. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/DJANGO_ADMIN.md +0 -0
  25. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/EXCEPTIONS.md +0 -0
  26. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/GETTING_STARTED.md +0 -0
  27. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/GIL_OPTIMIZATION.md +0 -0
  28. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/LOGGING.md +0 -0
  29. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/MIDDLEWARE.md +0 -0
  30. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/OPENAPI.md +0 -0
  31. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/OPENAPI_ERROR_RESPONSES.md +0 -0
  32. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/OPENAPI_METADATA_IMPLEMENTATION.md +0 -0
  33. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/PAGINATION.md +0 -0
  34. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/PUBLISHING.md +0 -0
  35. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/README.md +0 -0
  36. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/RESPONSES.md +0 -0
  37. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/SECURITY.md +0 -0
  38. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/SERIALIZATION.md +0 -0
  39. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/TESTING_UTILITIES.md +0 -0
  40. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/favicon.png +0 -0
  41. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/icon.png +0 -0
  42. {django_bolt-0.2.6 → django_bolt-0.2.8}/docs/logo.png +0 -0
  43. {django_bolt-0.2.6 → django_bolt-0.2.8}/pytest.ini +0 -0
  44. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/_json.py +0 -0
  45. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/admin/__init__.py +0 -0
  46. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/admin/admin_detection.py +0 -0
  47. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/admin/asgi_bridge.py +0 -0
  48. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/admin/routes.py +0 -0
  49. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/admin/static.py +0 -0
  50. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/admin/static_routes.py +0 -0
  51. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/apps.py +0 -0
  52. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/async_collector.py +0 -0
  53. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/auth/__init__.py +0 -0
  54. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/auth/backends.py +0 -0
  55. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/auth/guards.py +0 -0
  56. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/auth/jwt_utils.py +0 -0
  57. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/auth/revocation.py +0 -0
  58. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/auth/token.py +0 -0
  59. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/binding.py +0 -0
  60. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/bootstrap.py +0 -0
  61. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/cli.py +0 -0
  62. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/decorators.py +0 -0
  63. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/dependencies.py +0 -0
  64. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/error_handlers.py +0 -0
  65. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/exceptions.py +0 -0
  66. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/health.py +0 -0
  67. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/logging/__init__.py +0 -0
  68. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/logging/config.py +0 -0
  69. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/logging/middleware.py +0 -0
  70. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/management/__init__.py +0 -0
  71. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/management/commands/__init__.py +0 -0
  72. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/middleware/compiler.py +0 -0
  73. {django_bolt-0.2.6/python/django_bolt → django_bolt-0.2.8/python/django_bolt/middleware}/compression.py +0 -0
  74. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/middleware/middleware.py +0 -0
  75. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/__init__.py +0 -0
  76. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/config.py +0 -0
  77. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/plugins.py +0 -0
  78. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/routes.py +0 -0
  79. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/schema_generator.py +0 -0
  80. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/__init__.py +0 -0
  81. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/base.py +0 -0
  82. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/callback.py +0 -0
  83. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/components.py +0 -0
  84. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/contact.py +0 -0
  85. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/discriminator.py +0 -0
  86. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/encoding.py +0 -0
  87. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/enums.py +0 -0
  88. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/example.py +0 -0
  89. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/external_documentation.py +0 -0
  90. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/header.py +0 -0
  91. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/info.py +0 -0
  92. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/license.py +0 -0
  93. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/link.py +0 -0
  94. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/media_type.py +0 -0
  95. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/oauth_flow.py +0 -0
  96. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/oauth_flows.py +0 -0
  97. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/open_api.py +0 -0
  98. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/operation.py +0 -0
  99. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/parameter.py +0 -0
  100. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/path_item.py +0 -0
  101. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/paths.py +0 -0
  102. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/reference.py +0 -0
  103. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/request_body.py +0 -0
  104. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/response.py +0 -0
  105. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/responses.py +0 -0
  106. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/schema.py +0 -0
  107. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/security_requirement.py +0 -0
  108. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/security_scheme.py +0 -0
  109. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/server.py +0 -0
  110. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/server_variable.py +0 -0
  111. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/tag.py +0 -0
  112. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/xml.py +0 -0
  113. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/pagination.py +0 -0
  114. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/param_functions.py +0 -0
  115. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/params.py +0 -0
  116. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/request_parsing.py +0 -0
  117. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/responses.py +0 -0
  118. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/router.py +0 -0
  119. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/serialization.py +0 -0
  120. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/status_codes.py +0 -0
  121. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/testing/__init__.py +0 -0
  122. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/testing/client.py +0 -0
  123. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/testing/helpers.py +0 -0
  124. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/types.py +0 -0
  125. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/typing.py +0 -0
  126. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/django_bolt/views.py +0 -0
  127. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/README.md +0 -0
  128. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/__init__.py +0 -0
  129. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/admin.py +0 -0
  130. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/api.py +0 -0
  131. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/apps.py +0 -0
  132. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/migrations/0001_initial.py +0 -0
  133. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/migrations/__init__.py +0 -0
  134. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/models.py +0 -0
  135. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/tests.py +0 -0
  136. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/bench/views.py +0 -0
  137. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/manage.py +0 -0
  138. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/100B +0 -0
  139. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/100B.txt +0 -0
  140. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/100K +0 -0
  141. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/100K.json +0 -0
  142. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/100K.txt +0 -0
  143. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/10K +0 -0
  144. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/10K.json +0 -0
  145. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/10K.txt +0 -0
  146. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/1K +0 -0
  147. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/1K.json +0 -0
  148. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/1K.txt +0 -0
  149. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/1M +0 -0
  150. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/1M.json +0 -0
  151. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/1M.txt +0 -0
  152. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/500K +0 -0
  153. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/500K.json +0 -0
  154. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/500K.txt +0 -0
  155. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/5M +0 -0
  156. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/5M.json +0 -0
  157. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/5M.txt +0 -0
  158. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/FILE_UPLOAD_1K +0 -0
  159. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/FILE_UPLOAD_1K_HEADERS.json +0 -0
  160. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/FORM_URLENCODED_1K +0 -0
  161. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/FORM_URLENCODED_1K_HEADERS.json +0 -0
  162. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/MULTIPART_1K +0 -0
  163. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/MULTIPART_1K_HEADERS.json +0 -0
  164. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/__init__.py +0 -0
  165. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/objects.py +0 -0
  166. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/persons_100.json +0 -0
  167. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/persons_50.json +0 -0
  168. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/test_data/persons_500.json +0 -0
  169. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/__init__.py +0 -0
  170. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/api.py +0 -0
  171. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/asgi.py +0 -0
  172. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/settings.py +0 -0
  173. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/test_api.py +0 -0
  174. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/urls.py +0 -0
  175. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/views.py +0 -0
  176. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/testproject/wsgi.py +0 -0
  177. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/__init__.py +0 -0
  178. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/admin.py +0 -0
  179. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/api.py +0 -0
  180. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/apps.py +0 -0
  181. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/migrations/0001_initial.py +0 -0
  182. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/migrations/__init__.py +0 -0
  183. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/models.py +0 -0
  184. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/tests.py +0 -0
  185. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/example/users/views.py +0 -0
  186. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/__init__.py +0 -0
  187. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/admin_tests/__init__.py +0 -0
  188. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/admin_tests/conftest.py +0 -0
  189. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/admin_tests/test_admin_with_django.py +0 -0
  190. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/admin_tests/urls.py +0 -0
  191. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/cbv/__init__.py +0 -0
  192. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/cbv/test_class_views.py +0 -0
  193. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/cbv/test_class_views_django_orm.py +0 -0
  194. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/cbv/test_class_views_features.py +0 -0
  195. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/cbv/test_class_views_with_client.py +0 -0
  196. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/conftest.py +0 -0
  197. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_action_decorator.py +0 -0
  198. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_auth_secret_key.py +0 -0
  199. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_cors_implementation.py +0 -0
  200. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_decorator_syntax.py +0 -0
  201. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_error_handling.py +0 -0
  202. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_file_response.py +0 -0
  203. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_global_cors.py +0 -0
  204. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_guards_auth.py +0 -0
  205. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_guards_integration.py +0 -0
  206. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_health.py +0 -0
  207. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_integration_validation.py +0 -0
  208. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_json_validation.py +0 -0
  209. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_jwt_auth.py +0 -0
  210. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_jwt_token.py +0 -0
  211. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_logging.py +0 -0
  212. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_logging_merge.py +0 -0
  213. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_middleware.py +0 -0
  214. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_middleware_server.py +0 -0
  215. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_model_viewset.py +0 -0
  216. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_models.py +0 -0
  217. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_openapi_docs.py +0 -0
  218. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_openapi_metadata.py +0 -0
  219. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_pagination.py +0 -0
  220. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_parameter_validation.py +0 -0
  221. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_request_get.py +0 -0
  222. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_syntax.py +0 -0
  223. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_testing_utilities.py +0 -0
  224. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_testing_utilities_simple.py +0 -0
  225. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_types.py +0 -0
  226. {django_bolt-0.2.6 → django_bolt-0.2.8}/python/tests/test_viewset_unified.py +0 -0
  227. {django_bolt-0.2.6 → django_bolt-0.2.8}/scripts/benchmark.sh +0 -0
  228. {django_bolt-0.2.6 → django_bolt-0.2.8}/scripts/install_hey.sh +0 -0
  229. {django_bolt-0.2.6 → django_bolt-0.2.8}/scripts/release.sh +0 -0
  230. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/direct_stream.rs +0 -0
  231. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/error.rs +0 -0
  232. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/handler.rs +0 -0
  233. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/json.rs +0 -0
  234. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/lib.rs +0 -0
  235. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/metadata.rs +0 -0
  236. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/middleware/auth.rs +0 -0
  237. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/middleware/compression.rs +0 -0
  238. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/middleware/mod.rs +0 -0
  239. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/middleware/rate_limit.rs +0 -0
  240. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/permissions.rs +0 -0
  241. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/request.rs +0 -0
  242. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/router.rs +0 -0
  243. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/server.rs +0 -0
  244. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/state.rs +0 -0
  245. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/streaming.rs +0 -0
  246. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/test_state.rs +0 -0
  247. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/testing.rs +0 -0
  248. {django_bolt-0.2.6 → django_bolt-0.2.8}/src/validation.rs +0 -0
@@ -533,3 +533,4 @@ uv run --with pytest pytest python/tests -s -vv
533
533
  - **Middleware compilation**: Python middleware config is compiled to Rust metadata at server startup
534
534
  - **Route autodiscovery**: Runs once at server startup, no hot-reload in production mode (use `--dev` for development)
535
535
  - **Multi-process**: Each process has its own Python interpreter and imports Django independently
536
+ - never silently ignore the error or exception. At least we have print method there this happened. This create obscure errors .
@@ -599,7 +599,7 @@ dependencies = [
599
599
 
600
600
  [[package]]
601
601
  name = "django-bolt"
602
- version = "0.2.6"
602
+ version = "0.2.8"
603
603
  dependencies = [
604
604
  "actix-cors",
605
605
  "actix-files",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "django-bolt"
3
- version = "0.2.6"
3
+ version = "0.2.8"
4
4
  edition = "2021"
5
5
  readme = "README.md"
6
6
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-bolt
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -25,7 +25,8 @@ Requires-Dist: click>=8.1
25
25
  Requires-Dist: msgspec>=0.18
26
26
  Requires-Dist: multipart>=1.3
27
27
  Requires-Dist: pyjwt>=2.10.1
28
- Requires-Dist: uvloop>=0.22.1
28
+ Requires-Dist: typing-extensions>=4.5.0
29
+ Requires-Dist: uvloop>=0.22.1 ; sys_platform != 'win32'
29
30
  Requires-Dist: pyyaml>=6.0 ; extra == 'yaml'
30
31
  Provides-Extra: yaml
31
32
  Summary: High-performance API framework for Django with Rust-powered endpoints delivering 60k+ RPS
@@ -45,7 +45,7 @@ Pagination helpers
45
45
  ⚠️ content negotiation
46
46
  ⚠️ log level setup from cli (easy to deploy)
47
47
  ⚠️ with broken settings it was not able to find api from root folder
48
- ⚠️ If api folder has error it does not discover the apis
48
+ If api folder has error it does not discover the apis - FIXED (Now crashes with descriptive error instead of silently ignoring)
49
49
  ⚠️ Msgspec based serializer and stuff
50
50
  ✅ Larger json has some GIL contention issue have done alot of investigation. Serialization hold gil when moved serialization to rust it improved but not that much .. Under large concurrency i think it happens . Have to investigate more. (Fixeed using batching gil, reuse event loop, copy memory outside of the gil)
51
51
 
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "django-bolt"
7
- version = "0.2.6"
7
+ version = "0.2.8"
8
8
  description = "High-performance API framework for Django with Rust-powered endpoints delivering 60k+ RPS"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -40,7 +40,8 @@ dependencies = [
40
40
  "msgspec>=0.18",
41
41
  "multipart>=1.3",
42
42
  "pyjwt>=2.10.1",
43
- "uvloop>=0.22.1"
43
+ "typing-extensions>=4.5.0",
44
+ "uvloop>=0.22.1; sys_platform != 'win32'"
44
45
  ]
45
46
 
46
47
  [project.optional-dependencies]
@@ -1,6 +1,6 @@
1
1
  from .api import BoltAPI
2
2
  from .responses import Response, JSON, StreamingResponse
3
- from .compression import CompressionConfig
3
+ from .middleware import CompressionConfig
4
4
  from .types import Request
5
5
 
6
6
  # Views module
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import inspect
4
+ import logging
4
5
  import msgspec
5
6
  import re
6
7
  import time
@@ -8,17 +9,22 @@ from typing import Any, Callable, Dict, List, Tuple, Optional, get_origin, get_a
8
9
 
9
10
  from .bootstrap import ensure_django_ready
10
11
  from django_bolt import _core
12
+
13
+ # Import local modules
11
14
  from .responses import StreamingResponse
12
15
  from .exceptions import HTTPException
13
16
  from .params import Param, Depends as DependsMarker
14
17
  from .typing import FieldDefinition
15
-
18
+ from .middleware import CompressionConfig
19
+ from .logging.middleware import create_logging_middleware, LoggingMiddleware
20
+ from .exceptions import RequestValidationError, parse_msgspec_decode_error
16
21
  # Import modularized components
17
22
  from .binding import (
18
23
  coerce_to_response_type,
19
24
  coerce_to_response_type_async,
20
25
  convert_primitive,
21
26
  create_extractor,
27
+ get_msgspec_decoder
22
28
  )
23
29
  from .typing import is_msgspec_struct, is_optional, unwrap_optional
24
30
  from .request_parsing import parse_form_data
@@ -26,12 +32,27 @@ from .dependencies import resolve_dependency
26
32
  from .serialization import serialize_response
27
33
  from .middleware.compiler import compile_middleware_meta
28
34
  from .types import Request
35
+ from .views import APIView, ViewSet
36
+ from .status_codes import HTTP_201_CREATED, HTTP_204_NO_CONTENT
37
+ from .decorators import ActionHandler
38
+ from .error_handlers import handle_exception
39
+ from .openapi.schema_generator import SchemaGenerator
40
+ from .openapi import OpenAPIConfig, SwaggerRenderPlugin, RedocRenderPlugin, ScalarRenderPlugin, RapidocRenderPlugin, StoplightRenderPlugin, JsonRenderPlugin, YamlRenderPlugin
41
+ from .openapi.routes import OpenAPIRouteRegistrar
42
+ from .admin.routes import AdminRouteRegistrar
43
+ from .admin.static_routes import StaticRouteRegistrar
44
+ from .admin.admin_detection import detect_admin_url_prefix
45
+
46
+ from . import _json
29
47
 
30
48
  Response = Tuple[int, List[Tuple[str, str]], bytes]
31
49
 
32
50
  # Global registry for BoltAPI instances (used by autodiscovery)
33
51
  _BOLT_API_REGISTRY = []
34
52
 
53
+ # Pre-compiled regex pattern for extracting path parameters
54
+ _PATH_PARAM_REGEX = re.compile(r'\{(\w+)\}')
55
+
35
56
 
36
57
  def _extract_path_params(path: str) -> set[str]:
37
58
  """
@@ -41,7 +62,7 @@ def _extract_path_params(path: str) -> set[str]:
41
62
  "/users/{user_id}" -> {"user_id"}
42
63
  "/posts/{post_id}/comments/{comment_id}" -> {"post_id", "comment_id"}
43
64
  """
44
- return set(re.findall(r'\{(\w+)\}', path))
65
+ return set(_PATH_PARAM_REGEX.findall(path))
45
66
 
46
67
 
47
68
  def extract_parameter_value(
@@ -156,8 +177,7 @@ def extract_parameter_value(
156
177
  if not body_loaded:
157
178
  body_bytes: bytes = request["body"]
158
179
  if is_msgspec_struct(meta["body_struct_type"]):
159
- from .binding import get_msgspec_decoder
160
- from .exceptions import RequestValidationError, parse_msgspec_decode_error
180
+
161
181
  decoder = get_msgspec_decoder(meta["body_struct_type"])
162
182
  try:
163
183
  value = decoder.decode(body_bytes)
@@ -173,7 +193,7 @@ def extract_parameter_value(
173
193
  body=body_bytes,
174
194
  ) from e
175
195
  else:
176
- from .exceptions import RequestValidationError, parse_msgspec_decode_error
196
+
177
197
  try:
178
198
  value = msgspec.json.decode(body_bytes, type=meta["body_struct_type"])
179
199
  except msgspec.ValidationError:
@@ -230,11 +250,9 @@ class BoltAPI:
230
250
  if self.enable_logging:
231
251
  # Create logging middleware (actual logging setup happens at server startup)
232
252
  if logging_config is not None:
233
- from .logging.middleware import LoggingMiddleware
234
253
  self._logging_middleware = LoggingMiddleware(logging_config)
235
254
  else:
236
255
  # Use default logging configuration
237
- from .logging.middleware import create_logging_middleware
238
256
  self._logging_middleware = create_logging_middleware()
239
257
 
240
258
  # Compression configuration
@@ -244,7 +262,6 @@ class BoltAPI:
244
262
  self.compression = None
245
263
  elif compression is None:
246
264
  # Not provided, use default
247
- from .compression import CompressionConfig
248
265
  self.compression = CompressionConfig()
249
266
  else:
250
267
  # Custom config provided
@@ -253,7 +270,6 @@ class BoltAPI:
253
270
  # OpenAPI configuration - enabled by default with sensible defaults
254
271
  if openapi_config is None:
255
272
  # Create default OpenAPI config
256
- from .openapi import OpenAPIConfig, SwaggerRenderPlugin, RedocRenderPlugin, ScalarRenderPlugin, RapidocRenderPlugin, StoplightRenderPlugin, JsonRenderPlugin, YamlRenderPlugin
257
273
  try:
258
274
  # Try to get Django project name from settings
259
275
  from django.conf import settings
@@ -420,7 +436,6 @@ class BoltAPI:
420
436
  Raises:
421
437
  ValueError: If view class doesn't implement any requested methods
422
438
  """
423
- from .views import APIView
424
439
 
425
440
  def decorator(view_cls: type) -> type:
426
441
  # Validate that view_cls is an APIView subclass
@@ -538,8 +553,6 @@ class BoltAPI:
538
553
  Returns:
539
554
  Decorator function that registers the viewset
540
555
  """
541
- from .views import ViewSet
542
- from .status_codes import HTTP_201_CREATED, HTTP_204_NO_CONTENT
543
556
 
544
557
  def decorator(viewset_cls: type) -> type:
545
558
  # Validate that viewset_cls is a ViewSet subclass
@@ -627,7 +640,6 @@ class BoltAPI:
627
640
  """
628
641
  import inspect
629
642
  import types
630
- from .decorators import ActionHandler
631
643
 
632
644
  # Get class-level auth and guards (if any)
633
645
  class_auth = getattr(view_cls, 'auth', None)
@@ -934,7 +946,6 @@ class BoltAPI:
934
946
  def _handle_http_exception(self, he: HTTPException) -> Response:
935
947
  """Handle HTTPException and return response."""
936
948
  try:
937
- from . import _json
938
949
  body = _json.encode({"detail": he.detail})
939
950
  headers = [("content-type", "application/json")]
940
951
  except Exception:
@@ -948,9 +959,8 @@ class BoltAPI:
948
959
 
949
960
  def _handle_generic_exception(self, e: Exception, request: Dict[str, Any] = None) -> Response:
950
961
  """Handle generic exception using error_handlers module."""
951
- from . import error_handlers
952
962
  # Use the error handler which respects Django DEBUG setting
953
- return error_handlers.handle_exception(e, debug=None, request=request) # debug will be checked dynamically
963
+ return handle_exception(e, debug=None, request=request) # debug will be checked dynamically
954
964
 
955
965
  async def _dispatch(self, handler: Callable, request: Dict[str, Any], handler_id: int = None) -> Response:
956
966
  """Async dispatch that calls the handler and returns response tuple.
@@ -975,7 +985,7 @@ class BoltAPI:
975
985
  logger = logging_middleware.logger
976
986
  should_time = False
977
987
  try:
978
- if logger.isEnabledFor(__import__('logging').INFO):
988
+ if logger.isEnabledFor(logging.INFO):
979
989
  should_time = True
980
990
  except Exception:
981
991
  pass
@@ -1034,7 +1044,6 @@ class BoltAPI:
1034
1044
  OpenAPI schema as dictionary.
1035
1045
  """
1036
1046
  if self._openapi_schema is None:
1037
- from .openapi.schema_generator import SchemaGenerator
1038
1047
 
1039
1048
  generator = SchemaGenerator(self, self.openapi_config)
1040
1049
  openapi = generator.generate()
@@ -1047,7 +1056,6 @@ class BoltAPI:
1047
1056
 
1048
1057
  Delegates to OpenAPIRouteRegistrar for cleaner separation of concerns.
1049
1058
  """
1050
- from .openapi.routes import OpenAPIRouteRegistrar
1051
1059
 
1052
1060
  registrar = OpenAPIRouteRegistrar(self)
1053
1061
  registrar.register_routes()
@@ -1061,7 +1069,6 @@ class BoltAPI:
1061
1069
  host: Server hostname for ASGI scope
1062
1070
  port: Server port for ASGI scope
1063
1071
  """
1064
- from .admin.routes import AdminRouteRegistrar
1065
1072
 
1066
1073
  registrar = AdminRouteRegistrar(self)
1067
1074
  registrar.register_routes(host, port)
@@ -1071,7 +1078,6 @@ class BoltAPI:
1071
1078
 
1072
1079
  Delegates to StaticRouteRegistrar for cleaner separation of concerns.
1073
1080
  """
1074
- from .admin.static_routes import StaticRouteRegistrar
1075
1081
 
1076
1082
  registrar = StaticRouteRegistrar(self)
1077
1083
  registrar.register_routes()
@@ -1089,7 +1095,6 @@ class BoltAPI:
1089
1095
  if self.enable_admin:
1090
1096
  self._register_admin_routes(host, port)
1091
1097
  if self._admin_routes_registered:
1092
- from .admin.admin_detection import detect_admin_url_prefix
1093
1098
  admin_prefix = detect_admin_url_prefix() or 'admin'
1094
1099
  print(f"[django-bolt] Django admin available at http://{host}:{port}/{admin_prefix}/")
1095
1100
 
@@ -366,25 +366,34 @@ class Command(BaseCommand):
366
366
 
367
367
  def import_api(self, dotted_path):
368
368
  """Import a BoltAPI instance from dotted path like 'myapp.api:api'"""
369
+ if ':' not in dotted_path:
370
+ return None
371
+
372
+ module_path, attr_name = dotted_path.split(':', 1)
373
+
369
374
  try:
370
- if ':' not in dotted_path:
371
- return None
372
-
373
- module_path, attr_name = dotted_path.split(':', 1)
374
375
  module = importlib.import_module(module_path)
375
-
376
- if not hasattr(module, attr_name):
376
+ except ModuleNotFoundError as e:
377
+ # Check if the error is for the target module itself (optional)
378
+ # or for a dependency within the module (fatal error)
379
+ if e.name == module_path or e.name == module_path.split('.')[0]:
380
+ # Target module doesn't exist - this is fine, api.py is optional
377
381
  return None
378
-
379
- api = getattr(module, attr_name)
380
-
381
- # Verify it's a BoltAPI instance
382
- if isinstance(api, BoltAPI):
383
- return api
384
-
385
- except (ImportError, AttributeError, ValueError):
386
- pass
387
-
382
+ else:
383
+ # Module exists but has a missing dependency - let the original error bubble up
384
+ # This preserves the full traceback for debugging
385
+ raise
386
+
387
+ # If attribute doesn't exist, return None (not an error, just doesn't have that attr)
388
+ if not hasattr(module, attr_name):
389
+ return None
390
+
391
+ api = getattr(module, attr_name)
392
+
393
+ # Verify it's a BoltAPI instance
394
+ if isinstance(api, BoltAPI):
395
+ return api
396
+
388
397
  return None
389
398
 
390
399
  def merge_apis(self, apis):
@@ -17,6 +17,7 @@ from .middleware import (
17
17
  CORSMiddleware,
18
18
  RateLimitMiddleware,
19
19
  )
20
+ from .compression import CompressionConfig
20
21
 
21
22
  __all__ = [
22
23
  "Middleware",
@@ -29,4 +30,5 @@ __all__ = [
29
30
  "no_compress",
30
31
  "CORSMiddleware",
31
32
  "RateLimitMiddleware",
33
+ "CompressionConfig",
32
34
  ]
@@ -5,8 +5,7 @@ Tests both global compression configuration and per-route skip functionality.
5
5
  """
6
6
  import pytest
7
7
  from django_bolt import BoltAPI
8
- from django_bolt.compression import CompressionConfig
9
- from django_bolt.middleware import skip_middleware, no_compress
8
+ from django_bolt.middleware import skip_middleware, no_compress, CompressionConfig
10
9
  from django_bolt.testing import TestClient
11
10
 
12
11
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes