django-bolt 0.2.2__cp310-abi3-win_amd64.whl → 0.2.4__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.

django_bolt/__init__.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from .api import BoltAPI
2
2
  from .responses import Response, JSON, StreamingResponse
3
3
  from .compression import CompressionConfig
4
+ from .types import Request
4
5
 
5
6
  # Views module
6
7
  from .views import (
@@ -80,6 +81,7 @@ from .openapi import (
80
81
 
81
82
  __all__ = [
82
83
  "BoltAPI",
84
+ "Request",
83
85
  "Response",
84
86
  "JSON",
85
87
  "StreamingResponse",
django_bolt/_core.pyd CHANGED
Binary file
django_bolt/api.py CHANGED
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import inspect
2
4
  import msgspec
3
5
  import re
@@ -23,8 +25,8 @@ from .request_parsing import parse_form_data
23
25
  from .dependencies import resolve_dependency
24
26
  from .serialization import serialize_response
25
27
  from .middleware.compiler import compile_middleware_meta
28
+ from .types import Request
26
29
 
27
- Request = Dict[str, Any]
28
30
  Response = Tuple[int, List[Tuple[str, str]], bytes]
29
31
 
30
32
  # Global registry for BoltAPI instances (used by autodiscovery)
@@ -4,10 +4,13 @@ JWT utility functions for Django-Bolt.
4
4
  Provides helper functions to create JWT tokens for Django users and
5
5
  extract user information from request context.
6
6
  """
7
+ from __future__ import annotations
8
+
7
9
  import time
8
10
  import jwt
9
11
  from typing import Any, Dict, Optional
10
12
  from django.contrib.auth import get_user_model
13
+ from django_bolt.types import Request
11
14
 
12
15
 
13
16
  def create_jwt_for_user(
@@ -95,7 +98,7 @@ def create_jwt_for_user(
95
98
  return jwt.encode(payload, secret, algorithm=algorithm)
96
99
 
97
100
 
98
- async def get_current_user(request: Dict[str, Any]):
101
+ async def get_current_user(request: Request):
99
102
  """
100
103
  Dependency function to extract and fetch Django User from request context.
101
104
 
@@ -147,7 +150,7 @@ async def get_current_user(request: Dict[str, Any]):
147
150
  return None
148
151
 
149
152
 
150
- def extract_user_id_from_context(request: Dict[str, Any]) -> Optional[str]:
153
+ def extract_user_id_from_context(request: Request) -> Optional[str]:
151
154
  """
152
155
  Extract user_id from request context.
153
156
 
@@ -173,7 +176,7 @@ def extract_user_id_from_context(request: Dict[str, Any]) -> Optional[str]:
173
176
  return context.get("user_id")
174
177
 
175
178
 
176
- def get_auth_context(request: Dict[str, Any]) -> Dict[str, Any]:
179
+ def get_auth_context(request: Request) -> Dict[str, Any]:
177
180
  """
178
181
  Get the full authentication context from request.
179
182
 
@@ -1,11 +1,11 @@
1
1
  """Dependency injection utilities."""
2
+ from __future__ import annotations
3
+
2
4
  import inspect
3
- from typing import Any, Callable, Dict, List, TYPE_CHECKING
5
+ from typing import Any, Callable, Dict, List
4
6
  from .params import Depends as DependsMarker
5
7
  from .binding import convert_primitive
6
-
7
- if TYPE_CHECKING:
8
- from .typing import FieldDefinition
8
+ from .typing import FieldDefinition
9
9
 
10
10
 
11
11
  async def resolve_dependency(
@@ -50,9 +50,6 @@ class Command(BaseCommand):
50
50
  )
51
51
  options['processes'] = 1
52
52
 
53
- self.stdout.write(
54
- self.style.SUCCESS("[django-bolt] 🔥 Development mode enabled (auto-reload on file changes)")
55
- )
56
53
  self.run_with_autoreload(options)
57
54
  else:
58
55
  # Production mode (current logic)
@@ -75,11 +72,18 @@ class Command(BaseCommand):
75
72
  import sys
76
73
  sys.exit(1)
77
74
 
75
+ # Print dev mode message only once (in the main reloader process)
76
+ import os
77
+ if os.environ.get('RUN_MAIN') == 'true':
78
+ self.stdout.write(
79
+ self.style.SUCCESS("[django-bolt] 🔥 Development mode enabled (auto-reload on file changes)")
80
+ )
81
+
78
82
  # Use Django's autoreload system which is optimized
79
83
  # It only restarts the Python interpreter when necessary
80
84
  # and reuses the same process for faster reloads
81
85
  def run_server():
82
- self.start_single_process(options)
86
+ self.start_single_process(options, dev_mode=True)
83
87
 
84
88
  autoreload.run_with_reloader(run_server)
85
89
 
@@ -133,7 +137,7 @@ class Command(BaseCommand):
133
137
  except KeyboardInterrupt:
134
138
  pass
135
139
 
136
- def start_single_process(self, options, process_id=None):
140
+ def start_single_process(self, options, process_id=None, dev_mode=False):
137
141
  """Start a single process server"""
138
142
  # Setup Django logging once at server startup (one-shot, respects existing LOGGING)
139
143
  from django_bolt.logging.config import setup_django_logging
@@ -178,9 +182,9 @@ class Command(BaseCommand):
178
182
  merged_api._register_openapi_routes()
179
183
 
180
184
  if process_id is not None:
181
- self.stdout.write(f"[django-bolt] Process {process_id}: OpenAPI docs enabled at {openapi_config.path}")
185
+ self.stdout.write(f"[django-bolt] Process {process_id}: OpenAPI docs enabled at http://{options['host']}:{options['port']}{openapi_config.path}")
182
186
  else:
183
- self.stdout.write(self.style.SUCCESS(f"[django-bolt] OpenAPI docs enabled at {openapi_config.path}"))
187
+ self.stdout.write(self.style.SUCCESS(f"[django-bolt] OpenAPI docs enabled at http://{options['host']}:{options['port']}{openapi_config.path}"))
184
188
 
185
189
  # Register Django admin routes if not disabled
186
190
  # Admin is controlled solely by --no-admin command-line flag
@@ -242,7 +246,6 @@ class Command(BaseCommand):
242
246
  else:
243
247
  self.stdout.write(self.style.SUCCESS(f"[django-bolt] Starting server on http://{options['host']}:{options['port']}"))
244
248
  self.stdout.write(f"[django-bolt] Workers: {options['workers']}, Processes: {options['processes']}")
245
- self.stdout.write(self.style.SUCCESS(f"[django-bolt] OpenAPI docs enabled at http://{options['host']}:{options['port']}/docs/"))
246
249
  # Set environment variable for Rust to read worker count
247
250
  import os
248
251
  os.environ['DJANGO_BOLT_WORKERS'] = str(options['workers'])
django_bolt/types.py ADDED
@@ -0,0 +1,249 @@
1
+ """
2
+ Type definitions for Django-Bolt.
3
+
4
+ This module provides type hints and protocols for Django-Bolt objects,
5
+ enabling full IDE autocomplete and static type checking.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from typing import Protocol, Any, Dict, Optional, overload, runtime_checkable
10
+
11
+
12
+ @runtime_checkable
13
+ class Request(Protocol):
14
+ """
15
+ Django-Bolt request object (Rust-backed PyRequest).
16
+
17
+ Provides dict-like access to HTTP request data with full type safety.
18
+ This is a Protocol that matches the Rust PyRequest implementation,
19
+ enabling proper type hints and IDE autocomplete.
20
+
21
+ Example:
22
+ ```python
23
+ from django_bolt import BoltAPI, Request
24
+ import msgspec
25
+
26
+ class UserCreate(msgspec.Struct):
27
+ name: str
28
+ email: str
29
+
30
+ api = BoltAPI()
31
+
32
+ # With request object and validated body
33
+ @api.post("/users")
34
+ async def create_user(request: Request, user: UserCreate):
35
+ # Type-safe access to request data
36
+ method = request.method # str
37
+ auth = request.get("auth") # Optional[Dict[str, Any]]
38
+ headers = request["headers"] # Dict[str, str]
39
+
40
+ # Validated body with full type safety
41
+ name = user.name # str
42
+ email = user.email # str
43
+
44
+ return {"id": 1, "name": name}
45
+
46
+ # With just request object
47
+ @api.get("/users/{user_id}")
48
+ async def get_user(request: Request, user_id: int):
49
+ auth = request.get("auth", {})
50
+ user_id = auth.get("user_id")
51
+ return {"user_id": user_id}
52
+ ```
53
+
54
+ Available Keys (for .get() and [] access):
55
+ - "method": HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)
56
+ - "path": Request path (/users/123)
57
+ - "body": Raw request body (bytes)
58
+ - "params": Path parameters from URL pattern (Dict[str, str])
59
+ - "query": Query string parameters (Dict[str, str])
60
+ - "headers": HTTP headers (Dict[str, str])
61
+ - "cookies": Parsed cookies (Dict[str, str])
62
+ - "auth": Authentication context (Optional[Dict[str, Any]])
63
+ - "context": Same as "auth" (alias)
64
+
65
+ Auth Context Structure (when authentication is present):
66
+ ```python
67
+ {
68
+ "user_id": "123", # User identifier (str)
69
+ "is_staff": False, # Staff status (bool)
70
+ "is_admin": False, # Admin/superuser status (bool)
71
+ "auth_backend": "jwt", # Backend used: jwt, api_key, etc.
72
+ "permissions": ["read", "write"], # User permissions (List[str], optional)
73
+ "auth_claims": { # Full JWT claims (optional, JWT only)
74
+ "sub": "123",
75
+ "exp": 1234567890,
76
+ "iat": 1234567800,
77
+ # ... additional claims
78
+ }
79
+ }
80
+ ```
81
+ """
82
+
83
+ # Properties (from Rust #[getter])
84
+ @property
85
+ def method(self) -> str:
86
+ """
87
+ HTTP method.
88
+
89
+ Returns:
90
+ HTTP method string: "GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"
91
+
92
+ Example:
93
+ ```python
94
+ if request.method == "POST":
95
+ # Handle POST request
96
+ pass
97
+ ```
98
+ """
99
+ ...
100
+
101
+ @property
102
+ def path(self) -> str:
103
+ """
104
+ Request path.
105
+
106
+ Returns:
107
+ Request path string (e.g., "/users/123")
108
+
109
+ Example:
110
+ ```python
111
+ path = request.path # "/api/users/123"
112
+ ```
113
+ """
114
+ ...
115
+
116
+ @property
117
+ def body(self) -> bytes:
118
+ """
119
+ Raw request body.
120
+
121
+ Returns:
122
+ Request body as bytes
123
+
124
+ Note:
125
+ For JSON requests, the framework automatically decodes this
126
+ when you use msgspec.Struct parameter types. You typically
127
+ don't need to access this directly.
128
+
129
+ Example:
130
+ ```python
131
+ raw_body = request.body
132
+ # b'{"name": "John", "email": "john@example.com"}'
133
+ ```
134
+ """
135
+ ...
136
+
137
+ @property
138
+ def context(self) -> Optional[Dict[str, Any]]:
139
+ """
140
+ Authentication/middleware context.
141
+
142
+ Returns:
143
+ Context dictionary when authentication is present, None otherwise.
144
+
145
+ When present, contains:
146
+ - user_id (str): User identifier
147
+ - is_staff (bool): Staff status
148
+ - is_admin (bool): Admin/superuser status
149
+ - auth_backend (str): Backend used (jwt, api_key, etc.)
150
+ - permissions (List[str]): User permissions (if available)
151
+ - auth_claims (Dict): Full JWT claims (if JWT authentication)
152
+
153
+ Example:
154
+ ```python
155
+ ctx = request.context
156
+ if ctx:
157
+ user_id = ctx.get("user_id")
158
+ is_admin = ctx.get("is_admin", False)
159
+ ```
160
+ """
161
+ ...
162
+
163
+ # Methods
164
+ @overload
165
+ def get(self, key: str) -> Any:
166
+ """Get request attribute (returns None if not found)."""
167
+ ...
168
+
169
+ @overload
170
+ def get(self, key: str, default: Any) -> Any:
171
+ """Get request attribute with default value."""
172
+ ...
173
+
174
+ def get(self, key: str, default: Any = None) -> Any:
175
+ """
176
+ Get request attribute with optional default value.
177
+
178
+ This method provides dict-like .get() access to request data,
179
+ with support for default values when keys don't exist.
180
+
181
+ Args:
182
+ key: Attribute name to retrieve. Available keys:
183
+ - "method": HTTP method (str)
184
+ - "path": Request path (str)
185
+ - "body": Raw body (bytes)
186
+ - "params": Path parameters (Dict[str, str])
187
+ - "query": Query parameters (Dict[str, str])
188
+ - "headers": HTTP headers (Dict[str, str])
189
+ - "cookies": Parsed cookies (Dict[str, str])
190
+ - "auth": Auth context (Optional[Dict[str, Any]])
191
+ - "context": Same as "auth"
192
+ default: Default value to return if key doesn't exist or is None.
193
+ Defaults to None.
194
+
195
+ Returns:
196
+ Attribute value if present, otherwise default value.
197
+
198
+ Special Behavior:
199
+ For "auth" and "context" keys, if authentication is not configured
200
+ or no credentials provided, returns the default value (not an empty dict).
201
+
202
+ Example:
203
+ ```python
204
+ # Get with None as default
205
+ auth = request.get("auth") # None if no auth
206
+
207
+ # Get with custom default
208
+ auth = request.get("auth", {}) # {} if no auth
209
+
210
+ # Get method (always present)
211
+ method = request.get("method") # "GET", "POST", etc.
212
+
213
+ # Get query params
214
+ query = request.get("query", {})
215
+ page = query.get("page", "1")
216
+ ```
217
+ """
218
+ ...
219
+
220
+ def __getitem__(self, key: str) -> Any:
221
+ """
222
+ Dict-style access to request attributes.
223
+
224
+ Args:
225
+ key: Attribute name (same keys as .get())
226
+
227
+ Returns:
228
+ Attribute value
229
+
230
+ Raises:
231
+ KeyError: If key doesn't exist
232
+
233
+ Example:
234
+ ```python
235
+ method = request["method"] # "GET"
236
+ headers = request["headers"] # Dict[str, str]
237
+ params = request["params"] # Dict[str, str]
238
+
239
+ # Raises KeyError if no auth
240
+ context = request["context"]
241
+
242
+ # Safe alternative with .get()
243
+ context = request.get("context", {})
244
+ ```
245
+ """
246
+ ...
247
+
248
+
249
+ __all__ = ["Request"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-bolt
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -24,6 +24,7 @@ Requires-Dist: django>=4.2
24
24
  Requires-Dist: click>=8.1
25
25
  Requires-Dist: msgspec>=0.18
26
26
  Requires-Dist: multipart>=1.3
27
+ Requires-Dist: pyjwt>=2.10.1
27
28
  Requires-Dist: pyyaml>=6.0 ; extra == 'yaml'
28
29
  Provides-Extra: yaml
29
30
  Summary: High-performance API framework for Django with Rust-powered endpoints delivering 60k+ RPS
@@ -535,11 +536,11 @@ async def stream_json():
535
536
 
536
537
  ```bash
537
538
  # Clone repository
538
- git clone https://github.com/yourusername/django-bolt.git
539
+ git clone https://github.com/FarhanAliRaza/django-bolt.git
539
540
  cd django-bolt
540
541
 
541
542
  # Install dependencies
542
- pip install -r requirements-dev.txt
543
+ uv sync
543
544
 
544
545
  # Build Rust extension
545
546
  make build # or: maturin develop --release
@@ -1,8 +1,8 @@
1
- django_bolt-0.2.2.dist-info/METADATA,sha256=Df6mtO4KEFHivc0NVXio1G_8k-f1NF0jCMazmVgEVw8,21978
2
- django_bolt-0.2.2.dist-info/WHEEL,sha256=4EDp_7DiFfWl1yYv5M4wSosAn5L_xgD1dyrQxQxfCx8,95
3
- django_bolt-0.2.2.dist-info/entry_points.txt,sha256=cUEGAdiOY6BryNhsgOS_50AONPPHajI3yvhqr56ZiaU,51
4
- django_bolt/__init__.py,sha256=fhXQUJR5SO-GwhF_2N9w0UK6rIFx7kWGfpOPyIKvB9Q,3139
5
- django_bolt/_core.pyd,sha256=2_iF6HF1hgI4YXmW-dvJM81gPnL3PwHViqXv9QedDMo,8941568
1
+ django_bolt-0.2.4.dist-info/METADATA,sha256=WcTs8UntAqUHJrapMRCiNUgbtB646anFRRvaGl-JMrE,21980
2
+ django_bolt-0.2.4.dist-info/WHEEL,sha256=4EDp_7DiFfWl1yYv5M4wSosAn5L_xgD1dyrQxQxfCx8,95
3
+ django_bolt-0.2.4.dist-info/entry_points.txt,sha256=cUEGAdiOY6BryNhsgOS_50AONPPHajI3yvhqr56ZiaU,51
4
+ django_bolt/__init__.py,sha256=BerkkdUuHfxTJUKTFoXxfjYr6OFCb3MH88NIBEjphm4,3183
5
+ django_bolt/_core.pyd,sha256=XMyXq12lOXHu6fKlJKSMmjm8ITa0ytvn3buTj3uDXHE,8955392
6
6
  django_bolt/_json.py,sha256=oGxi29DHB8UYvbqjtqtrP6gThk7Qonlw333c4_cTr6s,4917
7
7
  django_bolt/admin/__init__.py,sha256=BNN1afSvWvt-377rNzZLdNDEvKyMZXkmB_0MhTxAN8k,601
8
8
  django_bolt/admin/admin_detection.py,sha256=1yQkLx9rF5DLMjJqbx8n4c82UgS9JEAnUcPdRfFqAXk,5825
@@ -10,13 +10,13 @@ django_bolt/admin/asgi_bridge.py,sha256=oJrOqbBi8w-OUZD_wvpa5FlRFGIOyRvV284z8OS1
10
10
  django_bolt/admin/routes.py,sha256=dGrSz6fOwofLuBpNpzyqtcLuGbd4AgSQ2jZub_3cz1Y,3235
11
11
  django_bolt/admin/static.py,sha256=eXeOs2VWnxKdLDKarI4eD2q92K9R3JJHW1XQYmAsVDA,4692
12
12
  django_bolt/admin/static_routes.py,sha256=sdpuCPhULMr5LccVxfbU2XSfpmL8oP7DCXqUpy0cnNY,3512
13
- django_bolt/api.py,sha256=1wJOg4-fuDzhG9ovHXjA6ONqlEFEvfrjx97xpja4oBU,49386
13
+ django_bolt/api.py,sha256=wR2sqaWtQIspyRfnVpCKbOSQO0Ee4FRuIKFqj2E1tas,49426
14
14
  django_bolt/apps.py,sha256=OKBK6McSzRZ8zGQaId5iw239QbIgqs8tIbAqpuYxmn0,193
15
15
  django_bolt/async_collector.py,sha256=m1U6wjE9wheVMuql8aooR47tkLz_RlADgkIl2p9H6Uw,7749
16
16
  django_bolt/auth/__init__.py,sha256=ygi_SCzH1CNOcQwDe0ZKIe072xBa7zeKVUtUoG0_dwY,1968
17
17
  django_bolt/auth/backends.py,sha256=T02zfiC17GZrARKlqzKSnkMOtEcYQDTmS4PouRvsNOU,7944
18
18
  django_bolt/auth/guards.py,sha256=Dwbqhq4_I41BoN0eWrQ7Ad9mmr9zgCoPAg4C3GElTio,6591
19
- django_bolt/auth/jwt_utils.py,sha256=phLKyXQXrqL8TLLZVA-reitOVylSTJ9FKSBETa1_OCg,6518
19
+ django_bolt/auth/jwt_utils.py,sha256=8Wprx4tbtXvNDNQWp2eQepG0n4sYPdF2uX8xCmBgSzg,6574
20
20
  django_bolt/auth/revocation.py,sha256=YzzKALZwawV8jLk8TV00CrbQ61rDxWy8YElcexhtn8s,8674
21
21
  django_bolt/auth/token.py,sha256=LAkjupXcQDLY8IoTrS9TrSDitK8Pfjef-zb3zUZT-i4,11449
22
22
  django_bolt/binding.py,sha256=UtmwW55RKyBwNxbX5QQ74NF0EF5k5zaMGa5el7mgljg,12860
@@ -24,7 +24,7 @@ django_bolt/bootstrap.py,sha256=zXkVhcDZxluQBWXc_UHK0FfgOfpdgxCg01DmSbSdXos,3007
24
24
  django_bolt/cli.py,sha256=0TBGM37cCqKEew_QA26ru7KkR8_6mP5wKXgFhr8GWng,4647
25
25
  django_bolt/compression.py,sha256=8ioDa2j0TG_mna-Jh34-e6WjCeY0GSKwRPHMn8en8OQ,4025
26
26
  django_bolt/decorators.py,sha256=hvfIZMxZI3S4eo6KYiOiEC-1Z96fSwQxQopLB4jmez0,6656
27
- django_bolt/dependencies.py,sha256=D_D9onQLMH85q0o4tSeKo0nTiJmx_Hifg3AwwcTfRUM,4443
27
+ django_bolt/dependencies.py,sha256=mX19F2X5nbZ5Rzq9GbdeNBuX7EufftQljuHQlCeqpw0,4441
28
28
  django_bolt/error_handlers.py,sha256=uD9_9vnub8FxZCRXgcqOdMic5M8cFD-sPXePdSl9IaY,10032
29
29
  django_bolt/exceptions.py,sha256=iYTkmtel7VlpjwuOrijDgt8fsx8_Kd0gezLEdR6CrDs,8823
30
30
  django_bolt/health.py,sha256=MBcXlgkTAdEiAvmGRPSgn9iePhH-rcHXan7Ge1EaPog,3356
@@ -33,7 +33,7 @@ django_bolt/logging/config.py,sha256=SE_7yvYzPVdgvMUAK9yU3Dyn2HJY_EVkajm0aAhgcNw
33
33
  django_bolt/logging/middleware.py,sha256=_tkVN8cN8BloLv7Ebk-2RKBFkH4ooOTNs_dAxXSa0yU,10057
34
34
  django_bolt/management/__init__.py,sha256=f0hFqUIOIxXbeDzGL06KrZqWGSsIGVSVVh3EemtatMY,38
35
35
  django_bolt/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- django_bolt/management/commands/runbolt.py,sha256=mNqIkSSvq5V6OGcNU9AFwitqie4dSRk_UiBlFTAnPYw,17847
36
+ django_bolt/management/commands/runbolt.py,sha256=DWNDq3cnNz-ulLwyY5xkm6ZQuGWB7xbDLhhobIHyJS4,17966
37
37
  django_bolt/middleware/__init__.py,sha256=C6e6vdSLqe4brMrKR4TueroD4f_OPsnoZZDlxkbyjbw,608
38
38
  django_bolt/middleware/compiler.py,sha256=Knxh3XouU70ymIskDB-JWn1TcHSMPQvUBXtTPHEJJRY,4766
39
39
  django_bolt/middleware/middleware.py,sha256=Qdr16OM15oOS1OYNnxFY3hJ0un9E8VaVwht-A8Qcuws,8113
@@ -86,6 +86,7 @@ django_bolt/status_codes.py,sha256=jTZ32kPwj3tC23jh6uC1Ci1P9EKttywsvyWINQIEwGg,9
86
86
  django_bolt/testing/__init__.py,sha256=TgJjct2WucKL7HyrbMuQfplNptlCPhu4CL-WQZxaoRY,216
87
87
  django_bolt/testing/client.py,sha256=Yx7N1lfXmJcH4yF--6K0YehtPY2_wiwb8U3a0qQoqDE,8616
88
88
  django_bolt/testing/helpers.py,sha256=hq2HD1IEwHuW8tMgZO9ZW6BFdcE_JQXaV8sZc58LBDc,1472
89
+ django_bolt/types.py,sha256=sk8huP2mArTr5A7FmTVmIke5z0oR-SW0OmzzRfrRlxQ,7982
89
90
  django_bolt/typing.py,sha256=sGlFUUXY8EJbYWCgARgNGLZPu7SaxxohZaSx1SRLYaE,8686
90
91
  django_bolt/views.py,sha256=KewSpL6g-zZxXnEkwun6hueX3S_Eji-d2dawzoqe-GM,41715
91
- django_bolt-0.2.2.dist-info/RECORD,,
92
+ django_bolt-0.2.4.dist-info/RECORD,,