django-bolt 0.1.0__cp310-abi3-win_amd64.whl

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 (128) hide show
  1. django_bolt/__init__.py +147 -0
  2. django_bolt/_core.pyd +0 -0
  3. django_bolt/admin/__init__.py +25 -0
  4. django_bolt/admin/admin_detection.py +179 -0
  5. django_bolt/admin/asgi_bridge.py +267 -0
  6. django_bolt/admin/routes.py +91 -0
  7. django_bolt/admin/static.py +155 -0
  8. django_bolt/admin/static_routes.py +111 -0
  9. django_bolt/api.py +1011 -0
  10. django_bolt/apps.py +7 -0
  11. django_bolt/async_collector.py +228 -0
  12. django_bolt/auth/README.md +464 -0
  13. django_bolt/auth/REVOCATION_EXAMPLE.md +391 -0
  14. django_bolt/auth/__init__.py +84 -0
  15. django_bolt/auth/backends.py +236 -0
  16. django_bolt/auth/guards.py +224 -0
  17. django_bolt/auth/jwt_utils.py +212 -0
  18. django_bolt/auth/revocation.py +286 -0
  19. django_bolt/auth/token.py +335 -0
  20. django_bolt/binding.py +363 -0
  21. django_bolt/bootstrap.py +77 -0
  22. django_bolt/cli.py +133 -0
  23. django_bolt/compression.py +104 -0
  24. django_bolt/decorators.py +159 -0
  25. django_bolt/dependencies.py +128 -0
  26. django_bolt/error_handlers.py +305 -0
  27. django_bolt/exceptions.py +294 -0
  28. django_bolt/health.py +129 -0
  29. django_bolt/logging/__init__.py +6 -0
  30. django_bolt/logging/config.py +357 -0
  31. django_bolt/logging/middleware.py +296 -0
  32. django_bolt/management/__init__.py +1 -0
  33. django_bolt/management/commands/__init__.py +0 -0
  34. django_bolt/management/commands/runbolt.py +427 -0
  35. django_bolt/middleware/__init__.py +32 -0
  36. django_bolt/middleware/compiler.py +131 -0
  37. django_bolt/middleware/middleware.py +247 -0
  38. django_bolt/openapi/__init__.py +23 -0
  39. django_bolt/openapi/config.py +196 -0
  40. django_bolt/openapi/plugins.py +439 -0
  41. django_bolt/openapi/routes.py +152 -0
  42. django_bolt/openapi/schema_generator.py +581 -0
  43. django_bolt/openapi/spec/__init__.py +68 -0
  44. django_bolt/openapi/spec/base.py +74 -0
  45. django_bolt/openapi/spec/callback.py +24 -0
  46. django_bolt/openapi/spec/components.py +72 -0
  47. django_bolt/openapi/spec/contact.py +21 -0
  48. django_bolt/openapi/spec/discriminator.py +25 -0
  49. django_bolt/openapi/spec/encoding.py +67 -0
  50. django_bolt/openapi/spec/enums.py +41 -0
  51. django_bolt/openapi/spec/example.py +36 -0
  52. django_bolt/openapi/spec/external_documentation.py +21 -0
  53. django_bolt/openapi/spec/header.py +132 -0
  54. django_bolt/openapi/spec/info.py +50 -0
  55. django_bolt/openapi/spec/license.py +28 -0
  56. django_bolt/openapi/spec/link.py +66 -0
  57. django_bolt/openapi/spec/media_type.py +51 -0
  58. django_bolt/openapi/spec/oauth_flow.py +36 -0
  59. django_bolt/openapi/spec/oauth_flows.py +28 -0
  60. django_bolt/openapi/spec/open_api.py +87 -0
  61. django_bolt/openapi/spec/operation.py +105 -0
  62. django_bolt/openapi/spec/parameter.py +147 -0
  63. django_bolt/openapi/spec/path_item.py +78 -0
  64. django_bolt/openapi/spec/paths.py +27 -0
  65. django_bolt/openapi/spec/reference.py +38 -0
  66. django_bolt/openapi/spec/request_body.py +38 -0
  67. django_bolt/openapi/spec/response.py +48 -0
  68. django_bolt/openapi/spec/responses.py +44 -0
  69. django_bolt/openapi/spec/schema.py +678 -0
  70. django_bolt/openapi/spec/security_requirement.py +28 -0
  71. django_bolt/openapi/spec/security_scheme.py +69 -0
  72. django_bolt/openapi/spec/server.py +34 -0
  73. django_bolt/openapi/spec/server_variable.py +32 -0
  74. django_bolt/openapi/spec/tag.py +32 -0
  75. django_bolt/openapi/spec/xml.py +44 -0
  76. django_bolt/pagination.py +669 -0
  77. django_bolt/param_functions.py +49 -0
  78. django_bolt/params.py +337 -0
  79. django_bolt/request_parsing.py +128 -0
  80. django_bolt/responses.py +214 -0
  81. django_bolt/router.py +48 -0
  82. django_bolt/serialization.py +193 -0
  83. django_bolt/status_codes.py +321 -0
  84. django_bolt/testing/__init__.py +10 -0
  85. django_bolt/testing/client.py +274 -0
  86. django_bolt/testing/helpers.py +93 -0
  87. django_bolt/tests/__init__.py +0 -0
  88. django_bolt/tests/admin_tests/__init__.py +1 -0
  89. django_bolt/tests/admin_tests/conftest.py +6 -0
  90. django_bolt/tests/admin_tests/test_admin_with_django.py +278 -0
  91. django_bolt/tests/admin_tests/urls.py +9 -0
  92. django_bolt/tests/cbv/__init__.py +0 -0
  93. django_bolt/tests/cbv/test_class_views.py +570 -0
  94. django_bolt/tests/cbv/test_class_views_django_orm.py +703 -0
  95. django_bolt/tests/cbv/test_class_views_features.py +1173 -0
  96. django_bolt/tests/cbv/test_class_views_with_client.py +622 -0
  97. django_bolt/tests/conftest.py +165 -0
  98. django_bolt/tests/test_action_decorator.py +399 -0
  99. django_bolt/tests/test_auth_secret_key.py +83 -0
  100. django_bolt/tests/test_decorator_syntax.py +159 -0
  101. django_bolt/tests/test_error_handling.py +481 -0
  102. django_bolt/tests/test_file_response.py +192 -0
  103. django_bolt/tests/test_global_cors.py +172 -0
  104. django_bolt/tests/test_guards_auth.py +441 -0
  105. django_bolt/tests/test_guards_integration.py +303 -0
  106. django_bolt/tests/test_health.py +283 -0
  107. django_bolt/tests/test_integration_validation.py +400 -0
  108. django_bolt/tests/test_json_validation.py +536 -0
  109. django_bolt/tests/test_jwt_auth.py +327 -0
  110. django_bolt/tests/test_jwt_token.py +458 -0
  111. django_bolt/tests/test_logging.py +837 -0
  112. django_bolt/tests/test_logging_merge.py +419 -0
  113. django_bolt/tests/test_middleware.py +492 -0
  114. django_bolt/tests/test_middleware_server.py +230 -0
  115. django_bolt/tests/test_model_viewset.py +323 -0
  116. django_bolt/tests/test_models.py +24 -0
  117. django_bolt/tests/test_pagination.py +1258 -0
  118. django_bolt/tests/test_parameter_validation.py +178 -0
  119. django_bolt/tests/test_syntax.py +626 -0
  120. django_bolt/tests/test_testing_utilities.py +163 -0
  121. django_bolt/tests/test_testing_utilities_simple.py +123 -0
  122. django_bolt/tests/test_viewset_unified.py +346 -0
  123. django_bolt/typing.py +273 -0
  124. django_bolt/views.py +1110 -0
  125. django_bolt-0.1.0.dist-info/METADATA +629 -0
  126. django_bolt-0.1.0.dist-info/RECORD +128 -0
  127. django_bolt-0.1.0.dist-info/WHEEL +4 -0
  128. django_bolt-0.1.0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,178 @@
1
+ """
2
+ Test parameter validation and inference system.
3
+ """
4
+ import pytest
5
+ import msgspec
6
+ from django_bolt import BoltAPI
7
+ from django_bolt.params import Query, Body
8
+
9
+
10
+ class UserCreate(msgspec.Struct):
11
+ name: str
12
+ email: str
13
+
14
+
15
+ def test_get_with_body_param_raises_error():
16
+ """Test that GET endpoints with body parameters raise TypeError."""
17
+ api = BoltAPI()
18
+
19
+ with pytest.raises(TypeError) as exc_info:
20
+ @api.get("/users")
21
+ async def create_user(user: UserCreate):
22
+ return {"id": 1}
23
+
24
+ error_msg = str(exc_info.value)
25
+ assert "GET /users cannot have body parameters" in error_msg
26
+ assert "user" in error_msg
27
+ assert "Change HTTP method to POST/PUT/PATCH" in error_msg
28
+
29
+
30
+ def test_head_with_body_param_raises_error():
31
+ """Test that HEAD endpoints cannot have body parameters."""
32
+ # Note: BoltAPI doesn't have @api.head() decorator yet, but we test the principle
33
+ # This would be the expected behavior if we add HEAD support
34
+ pass
35
+
36
+
37
+ def test_delete_with_body_param_raises_error():
38
+ """Test that DELETE endpoints with body parameters raise TypeError."""
39
+ api = BoltAPI()
40
+
41
+ with pytest.raises(TypeError) as exc_info:
42
+ @api.delete("/users/{user_id}")
43
+ async def delete_user(user_id: int, data: UserCreate):
44
+ return {"deleted": True}
45
+
46
+ error_msg = str(exc_info.value)
47
+ assert "DELETE" in error_msg
48
+ assert "cannot have body parameters" in error_msg
49
+
50
+
51
+ def test_post_with_body_param_works():
52
+ """Test that POST endpoints with body parameters work fine."""
53
+ api = BoltAPI()
54
+
55
+ # This should NOT raise an error
56
+ @api.post("/users")
57
+ async def create_user(user: UserCreate):
58
+ return {"id": 1}
59
+
60
+ # Verify the route was registered
61
+ assert len(api._routes) == 1
62
+ assert api._routes[0][0] == "POST"
63
+
64
+
65
+ def test_get_with_explicit_query_marker_works():
66
+ """Test that GET with explicit Query() marker works."""
67
+ api = BoltAPI()
68
+
69
+ @api.get("/users")
70
+ async def list_users(name: str = Query()):
71
+ return {"users": []}
72
+
73
+ assert len(api._routes) == 1
74
+
75
+
76
+ def test_get_with_simple_types_inferred_as_query():
77
+ """Test that simple types are auto-inferred as query parameters."""
78
+ api = BoltAPI()
79
+
80
+ @api.get("/users")
81
+ async def list_users(page: int = 1, limit: int = 10, search: str = ""):
82
+ return {"users": []}
83
+
84
+ assert len(api._routes) == 1
85
+
86
+ # Check that parameters were inferred as query params
87
+ handler = api._routes[0][3]
88
+ meta = api._handler_meta[handler]
89
+
90
+ for field in meta["fields"]:
91
+ if field["name"] in ("page", "limit", "search"):
92
+ assert field["source"] == "query", f"{field['name']} should be query param"
93
+
94
+
95
+ def test_post_with_struct_inferred_as_body():
96
+ """Test that msgspec.Struct is auto-inferred as body parameter."""
97
+ api = BoltAPI()
98
+
99
+ @api.post("/users")
100
+ async def create_user(user: UserCreate):
101
+ return {"id": 1}
102
+
103
+ handler = api._routes[0][3]
104
+ meta = api._handler_meta[handler]
105
+
106
+ user_field = next(f for f in meta["fields"] if f["name"] == "user")
107
+ assert user_field["source"] == "body"
108
+
109
+
110
+ def test_path_params_inferred_correctly():
111
+ """Test that path parameters are correctly inferred."""
112
+ api = BoltAPI()
113
+
114
+ @api.get("/users/{user_id}/posts/{post_id}")
115
+ async def get_post(user_id: int, post_id: int):
116
+ return {"user_id": user_id, "post_id": post_id}
117
+
118
+ handler = api._routes[0][3]
119
+ meta = api._handler_meta[handler]
120
+
121
+ user_id_field = next(f for f in meta["fields"] if f["name"] == "user_id")
122
+ post_id_field = next(f for f in meta["fields"] if f["name"] == "post_id")
123
+
124
+ assert user_id_field["source"] == "path"
125
+ assert post_id_field["source"] == "path"
126
+
127
+
128
+ def test_mixed_params_inference():
129
+ """Test mixed parameter types with auto-inference."""
130
+ api = BoltAPI()
131
+
132
+ @api.get("/users/{user_id}")
133
+ async def get_user(user_id: int, include_posts: bool = False):
134
+ return {"user_id": user_id, "include_posts": include_posts}
135
+
136
+ handler = api._routes[0][3]
137
+ meta = api._handler_meta[handler]
138
+
139
+ user_id_field = next(f for f in meta["fields"] if f["name"] == "user_id")
140
+ include_posts_field = next(f for f in meta["fields"] if f["name"] == "include_posts")
141
+
142
+ assert user_id_field["source"] == "path"
143
+ assert include_posts_field["source"] == "query"
144
+
145
+
146
+ def test_explicit_body_marker_with_post():
147
+ """Test explicit Body() marker works with POST."""
148
+ api = BoltAPI()
149
+
150
+ @api.post("/users")
151
+ async def create_user(user: UserCreate = Body()):
152
+ return {"id": 1}
153
+
154
+ handler = api._routes[0][3]
155
+ meta = api._handler_meta[handler]
156
+
157
+ user_field = next(f for f in meta["fields"] if f["name"] == "user")
158
+ assert user_field["source"] == "body"
159
+
160
+
161
+ def test_error_message_clarity():
162
+ """Test that error messages are clear and helpful."""
163
+ api = BoltAPI()
164
+
165
+ with pytest.raises(TypeError) as exc_info:
166
+ @api.get("/items")
167
+ async def bad_handler(item: UserCreate):
168
+ pass
169
+
170
+ error_msg = str(exc_info.value)
171
+ # Check all parts of the error message
172
+ assert "bad_handler" in error_msg
173
+ assert "GET /items" in error_msg
174
+ assert "cannot have body parameters" in error_msg
175
+ assert "['item']" in error_msg
176
+ assert "Solutions:" in error_msg
177
+ assert "POST/PUT/PATCH" in error_msg
178
+ assert "Query()" in error_msg