starmallow 0.3.8__py3-none-any.whl → 0.4.0__py3-none-any.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.
starmallow/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.3.8"
1
+ __version__ = "0.4.0"
2
2
 
3
3
  from .applications import StarMallow
4
4
  from .exceptions import RequestValidationError
@@ -251,6 +251,7 @@ class StarMallow(Starlette):
251
251
  name: str = None,
252
252
  include_in_schema: bool = True,
253
253
  status_code: Optional[int] = None,
254
+ request_class: Type[Request] = Default(Request),
254
255
  response_model: Optional[Type[Any]] = None,
255
256
  response_class: Type[Response] = JSONResponse,
256
257
  # OpenAPI summary
@@ -275,6 +276,7 @@ class StarMallow(Starlette):
275
276
  name=name,
276
277
  include_in_schema=include_in_schema,
277
278
  status_code=status_code,
279
+ request_class=request_class,
278
280
  response_model=response_model,
279
281
  response_class=response_class,
280
282
  summary=summary,
@@ -296,6 +298,7 @@ class StarMallow(Starlette):
296
298
  name: str = None,
297
299
  include_in_schema: bool = True,
298
300
  status_code: Optional[int] = None,
301
+ request_class: Type[Request] = Default(Request),
299
302
  response_model: Optional[Type[Any]] = None,
300
303
  response_class: Type[Response] = JSONResponse,
301
304
  # OpenAPI summary
@@ -319,6 +322,7 @@ class StarMallow(Starlette):
319
322
  name=name,
320
323
  include_in_schema=include_in_schema,
321
324
  status_code=status_code,
325
+ request_class=request_class,
322
326
  response_model=response_model,
323
327
  response_class=response_class,
324
328
  summary=summary,
@@ -356,6 +360,7 @@ class StarMallow(Starlette):
356
360
  callbacks: Optional[List[BaseRoute]] = None,
357
361
  deprecated: Optional[bool] = None,
358
362
  include_in_schema: bool = True,
363
+ default_request_class: Type[Request] = Default(Request),
359
364
  default_response_class: Type[Response] = Default(JSONResponse),
360
365
  generate_unique_id_function: Callable[[APIRoute], str] = Default(
361
366
  generate_unique_id,
@@ -369,6 +374,7 @@ class StarMallow(Starlette):
369
374
  callbacks=callbacks,
370
375
  deprecated=deprecated,
371
376
  include_in_schema=include_in_schema,
377
+ default_request_class=default_request_class,
372
378
  default_response_class=default_response_class,
373
379
  generate_unique_id_function=generate_unique_id_function,
374
380
  )
@@ -380,6 +386,7 @@ class StarMallow(Starlette):
380
386
  name: str = None,
381
387
  include_in_schema: bool = True,
382
388
  status_code: Optional[int] = None,
389
+ request_class: Type[Request] = Default(Request),
383
390
  response_model: Optional[Type[Any]] = None,
384
391
  response_class: Type[Response] = JSONResponse,
385
392
  # OpenAPI summary
@@ -402,6 +409,7 @@ class StarMallow(Starlette):
402
409
  name=name,
403
410
  include_in_schema=include_in_schema,
404
411
  status_code=status_code,
412
+ request_class=request_class,
405
413
  response_model=response_model,
406
414
  response_class=response_class,
407
415
  summary=summary,
@@ -422,6 +430,7 @@ class StarMallow(Starlette):
422
430
  name: str = None,
423
431
  include_in_schema: bool = True,
424
432
  status_code: Optional[int] = None,
433
+ request_class: Type[Request] = Default(Request),
425
434
  response_model: Optional[Type[Any]] = None,
426
435
  response_class: Type[Response] = JSONResponse,
427
436
  # OpenAPI summary
@@ -444,6 +453,7 @@ class StarMallow(Starlette):
444
453
  name=name,
445
454
  include_in_schema=include_in_schema,
446
455
  status_code=status_code,
456
+ request_class=request_class,
447
457
  response_model=response_model,
448
458
  response_class=response_class,
449
459
  summary=summary,
@@ -464,6 +474,7 @@ class StarMallow(Starlette):
464
474
  name: str = None,
465
475
  include_in_schema: bool = True,
466
476
  status_code: Optional[int] = None,
477
+ request_class: Type[Request] = Default(Request),
467
478
  response_model: Optional[Type[Any]] = None,
468
479
  response_class: Type[Response] = JSONResponse,
469
480
  # OpenAPI summary
@@ -486,6 +497,7 @@ class StarMallow(Starlette):
486
497
  name=name,
487
498
  include_in_schema=include_in_schema,
488
499
  status_code=status_code,
500
+ request_class=request_class,
489
501
  response_model=response_model,
490
502
  response_class=response_class,
491
503
  summary=summary,
@@ -506,6 +518,7 @@ class StarMallow(Starlette):
506
518
  name: str = None,
507
519
  include_in_schema: bool = True,
508
520
  status_code: Optional[int] = None,
521
+ request_class: Type[Request] = Default(Request),
509
522
  response_model: Optional[Type[Any]] = None,
510
523
  response_class: Type[Response] = JSONResponse,
511
524
  # OpenAPI summary
@@ -528,6 +541,7 @@ class StarMallow(Starlette):
528
541
  name=name,
529
542
  include_in_schema=include_in_schema,
530
543
  status_code=status_code,
544
+ request_class=request_class,
531
545
  response_model=response_model,
532
546
  response_class=response_class,
533
547
  summary=summary,
@@ -548,6 +562,7 @@ class StarMallow(Starlette):
548
562
  name: str = None,
549
563
  include_in_schema: bool = True,
550
564
  status_code: Optional[int] = None,
565
+ request_class: Type[Request] = Default(Request),
551
566
  response_model: Optional[Type[Any]] = None,
552
567
  response_class: Type[Response] = JSONResponse,
553
568
  # OpenAPI summary
@@ -570,6 +585,7 @@ class StarMallow(Starlette):
570
585
  name=name,
571
586
  include_in_schema=include_in_schema,
572
587
  status_code=status_code,
588
+ request_class=request_class,
573
589
  response_model=response_model,
574
590
  response_class=response_class,
575
591
  summary=summary,
@@ -590,6 +606,7 @@ class StarMallow(Starlette):
590
606
  name: str = None,
591
607
  include_in_schema: bool = True,
592
608
  status_code: Optional[int] = None,
609
+ request_class: Type[Request] = Default(Request),
593
610
  response_model: Optional[Type[Any]] = None,
594
611
  response_class: Type[Response] = JSONResponse,
595
612
  # OpenAPI summary
@@ -612,6 +629,7 @@ class StarMallow(Starlette):
612
629
  name=name,
613
630
  include_in_schema=include_in_schema,
614
631
  status_code=status_code,
632
+ request_class=request_class,
615
633
  response_model=response_model,
616
634
  response_class=response_class,
617
635
  summary=summary,
@@ -632,6 +650,7 @@ class StarMallow(Starlette):
632
650
  name: str = None,
633
651
  include_in_schema: bool = True,
634
652
  status_code: Optional[int] = None,
653
+ request_class: Type[Request] = Default(Request),
635
654
  response_model: Optional[Type[Any]] = None,
636
655
  response_class: Type[Response] = JSONResponse,
637
656
  # OpenAPI summary
@@ -654,6 +673,7 @@ class StarMallow(Starlette):
654
673
  name=name,
655
674
  include_in_schema=include_in_schema,
656
675
  status_code=status_code,
676
+ request_class=request_class,
657
677
  response_model=response_model,
658
678
  response_class=response_class,
659
679
  summary=summary,
@@ -674,6 +694,7 @@ class StarMallow(Starlette):
674
694
  name: str = None,
675
695
  include_in_schema: bool = True,
676
696
  status_code: Optional[int] = None,
697
+ request_class: Type[Request] = Default(Request),
677
698
  response_model: Optional[Type[Any]] = None,
678
699
  response_class: Type[Response] = JSONResponse,
679
700
  # OpenAPI summary
@@ -696,6 +717,7 @@ class StarMallow(Starlette):
696
717
  name=name,
697
718
  include_in_schema=include_in_schema,
698
719
  status_code=status_code,
720
+ request_class=request_class,
699
721
  response_model=response_model,
700
722
  response_class=response_class,
701
723
  summary=summary,
starmallow/decorators.py CHANGED
@@ -2,6 +2,7 @@ from dataclasses import dataclass, field
2
2
  from enum import Enum
3
3
  from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Type, Union
4
4
 
5
+ from starlette.requests import Request
5
6
  from starlette.responses import Response
6
7
  from starlette.routing import BaseRoute
7
8
 
@@ -20,6 +21,7 @@ class EndpointOptions:
20
21
  include_in_schema: bool = True
21
22
  status_code: Optional[int] = None
22
23
  deprecated: Optional[bool] = None
24
+ request_class: Type[Request] = Request
23
25
  response_model: Optional[Type[Any]] = None
24
26
  response_class: Type[Response] = JSONResponse
25
27
  # OpenAPI summary
@@ -46,6 +48,7 @@ def route(
46
48
  include_in_schema: bool = True,
47
49
  status_code: Optional[int] = None,
48
50
  deprecated: Optional[bool] = None,
51
+ request_class: Type[Request] = Default(Request),
49
52
  response_model: Optional[Type[Any]] = None,
50
53
  response_class: Type[Response] = JSONResponse,
51
54
  # OpenAPI summary
@@ -73,6 +76,7 @@ def route(
73
76
  include_in_schema=include_in_schema,
74
77
  status_code=status_code,
75
78
  deprecated=deprecated,
79
+ request_class=request_class,
76
80
  response_model=response_model,
77
81
  response_class=response_class,
78
82
  summary=summary,
starmallow/endpoint.py CHANGED
@@ -245,6 +245,9 @@ class EndpointMixin:
245
245
  elif is_marshmallow_schema(model):
246
246
  return SchemaModel(model() if inspect.isclass(model) else model, **kwargs)
247
247
  elif is_marshmallow_field(model):
248
+ if inspect.isclass(model):
249
+ model = model()
250
+
248
251
  if model.load_default is not None and model.load_default != kwargs.get('load_default', ma.missing):
249
252
  logger.warning(
250
253
  f"'{parameter_name}' model and annotation have different 'load_default' values."
@@ -269,7 +269,7 @@ async def resolve_params(
269
269
  dependency_cache=dependency_cache,
270
270
  )
271
271
  if errors:
272
- return None, errors, background_tasks
272
+ return None, errors, background_tasks, response
273
273
 
274
274
  arg_values, errors = await resolve_basic_args(
275
275
  request,
@@ -278,7 +278,7 @@ async def resolve_params(
278
278
  params,
279
279
  )
280
280
  if errors:
281
- return None, errors, background_tasks
281
+ return None, errors, background_tasks, response
282
282
 
283
283
  resolved_values, errors = await resolve_subparams(
284
284
  request,
@@ -288,7 +288,7 @@ async def resolve_params(
288
288
  dependency_cache=dependency_cache,
289
289
  )
290
290
  if errors:
291
- return None, errors, background_tasks
291
+ return None, errors, background_tasks, response
292
292
 
293
293
  return {
294
294
  **security_values,
starmallow/requests.py ADDED
@@ -0,0 +1,36 @@
1
+ from typing import Any
2
+
3
+ from starlette.requests import Request
4
+
5
+ try:
6
+ import ujson
7
+ except ImportError: # pragma: nocover
8
+ ujson = None # type: ignore
9
+
10
+
11
+ try:
12
+ import orjson
13
+ except ImportError: # pragma: nocover
14
+ orjson = None # type: ignore
15
+
16
+
17
+ class UJSONRequest(Request):
18
+
19
+ async def json(self) -> Any:
20
+ assert ujson is not None, "ujson must be installed to use UJSONRequest"
21
+
22
+ if not hasattr(self, "_json"):
23
+ body = await self.body()
24
+ self._json = ujson.loads(body)
25
+ return self._json
26
+
27
+
28
+ class ORJSONRequest(Request):
29
+
30
+ async def json(self) -> Any:
31
+ assert orjson is not None, "orjson must be installed to use ORJSONRequest"
32
+
33
+ if not hasattr(self, "_json"):
34
+ body = await self.body()
35
+ self._json = orjson.loads(body)
36
+ return self._json
starmallow/routing.py CHANGED
@@ -3,14 +3,32 @@ import functools
3
3
  import inspect
4
4
  import logging
5
5
  from enum import Enum, IntEnum
6
- from typing import Any, Callable, Coroutine, Dict, List, Optional, Set, Tuple, Type, Union
6
+ from typing import (
7
+ Any,
8
+ Awaitable,
9
+ Callable,
10
+ Coroutine,
11
+ Dict,
12
+ List,
13
+ Optional,
14
+ Set,
15
+ Tuple,
16
+ Type,
17
+ Union,
18
+ )
7
19
 
8
20
  import marshmallow as ma
9
21
  from starlette import routing
10
22
  from starlette.concurrency import run_in_threadpool
11
23
  from starlette.requests import Request
12
24
  from starlette.responses import Response
13
- from starlette.routing import BaseRoute, Match, compile_path, request_response
25
+ from starlette.routing import (
26
+ BaseRoute,
27
+ Match,
28
+ compile_path,
29
+ is_async_callable,
30
+ wrap_app_handling_exceptions,
31
+ )
14
32
  from starlette.status import WS_1008_POLICY_VIOLATION
15
33
  from starlette.types import ASGIApp, Receive, Scope, Send
16
34
  from starlette.websockets import WebSocket
@@ -57,6 +75,30 @@ async def run_endpoint_function(
57
75
  return await run_in_threadpool(endpoint_model.call, **kwargs)
58
76
 
59
77
 
78
+ def request_response(
79
+ func: Callable[[Request], Union[Awaitable[Response], Response]],
80
+ request_class: Type[Request],
81
+ ) -> ASGIApp:
82
+ """
83
+ Takes a function or coroutine `func(request) -> response`,
84
+ and returns an ASGI application.
85
+ """
86
+
87
+ async def app(scope: Scope, receive: Receive, send: Send) -> None:
88
+ request = request_class(scope, receive, send)
89
+
90
+ async def app(scope: Scope, receive: Receive, send: Send) -> None:
91
+ if is_async_callable(func):
92
+ response = await func(request)
93
+ else:
94
+ response = await run_in_threadpool(func, request)
95
+ await response(scope, receive, send)
96
+
97
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
98
+
99
+ return app
100
+
101
+
60
102
  def websocket_session(func: Callable) -> ASGIApp:
61
103
  """
62
104
  Takes a coroutine `func(session)`, and returns an ASGI application.
@@ -173,6 +215,9 @@ class APIRoute(routing.Route, EndpointMixin):
173
215
  include_in_schema: bool = True,
174
216
  status_code: Optional[int] = None,
175
217
  deprecated: Optional[bool] = None,
218
+ request_class: Union[Type[Request], DefaultPlaceholder] = Default(
219
+ Request,
220
+ ),
176
221
  response_model: Optional[ma.Schema] = None,
177
222
  response_class: Union[Type[Response], DefaultPlaceholder] = Default(
178
223
  JSONResponse,
@@ -205,7 +250,7 @@ class APIRoute(routing.Route, EndpointMixin):
205
250
  endpoint_handler = endpoint_handler.func
206
251
  if inspect.isfunction(endpoint_handler) or inspect.ismethod(endpoint_handler):
207
252
  # Endpoint is function or method. Treat it as `func(request) -> response`.
208
- self.app = request_response(endpoint)
253
+ self.app = request_response(endpoint, request_class)
209
254
  if methods is None:
210
255
  methods = ["GET"]
211
256
  else:
@@ -226,7 +271,6 @@ class APIRoute(routing.Route, EndpointMixin):
226
271
  self.status_code = status_code
227
272
  self.deprecated = deprecated
228
273
  self.response_model = response_model
229
- self.response_class = response_class
230
274
  self.summary = summary
231
275
  self.operation_id = operation_id
232
276
  self.callbacks = callbacks
@@ -234,6 +278,16 @@ class APIRoute(routing.Route, EndpointMixin):
234
278
  self.responses = responses or {}
235
279
  self.openapi_extra = openapi_extra
236
280
 
281
+ if isinstance(request_class, DefaultPlaceholder):
282
+ self.request_class: Request = request_class.value
283
+ else:
284
+ self.request_class = request_class
285
+
286
+ if isinstance(response_class, DefaultPlaceholder):
287
+ self.response_class: Response = response_class.value
288
+ else:
289
+ self.response_class = response_class
290
+
237
291
  self.generate_unique_id_function = generate_unique_id_function
238
292
  if isinstance(generate_unique_id_function, DefaultPlaceholder):
239
293
  current_generate_unique_id: Callable[
@@ -279,16 +333,16 @@ class APIRoute(routing.Route, EndpointMixin):
279
333
 
280
334
  self.endpoint_model = self.get_endpoint_model(
281
335
  self.path_format,
282
- endpoint,
283
- name=name,
336
+ self.endpoint,
337
+ name=self.name,
284
338
  methods=self.methods,
285
- status_code=status_code,
286
- response_model=response_model,
287
- response_class=response_class,
339
+ status_code=self.status_code,
340
+ response_model=self.response_model,
341
+ response_class=self.response_class,
288
342
  route=self,
289
343
  )
290
344
 
291
- self.app = request_response(get_request_handler(self.endpoint_model))
345
+ self.app = request_response(get_request_handler(self.endpoint_model), self.request_class)
292
346
 
293
347
 
294
348
  class APIRouter(routing.Router):
@@ -297,6 +351,7 @@ class APIRouter(routing.Router):
297
351
  self,
298
352
  *args,
299
353
  tags: Optional[List[Union[str, Enum]]] = None,
354
+ default_request_class: Type[Request] = Default(Request),
300
355
  default_response_class: Type[Response] = Default(JSONResponse),
301
356
  deprecated: Optional[bool] = None,
302
357
  include_in_schema: bool = True,
@@ -311,6 +366,7 @@ class APIRouter(routing.Router):
311
366
  super().__init__(*args, **kwargs)
312
367
 
313
368
  self.tags: List[Union[str, Enum]] = tags or []
369
+ self.default_request_class = default_request_class
314
370
  self.default_response_class = default_response_class
315
371
  self.deprecated = deprecated
316
372
  self.include_in_schema = include_in_schema
@@ -348,6 +404,7 @@ class APIRouter(routing.Router):
348
404
  include_in_schema: bool = True,
349
405
  status_code: Optional[int] = None,
350
406
  deprecated: Optional[bool] = None,
407
+ request_class: Type[Request] = Default(Request),
351
408
  response_model: Optional[Type[Any]] = None,
352
409
  response_class: Type[Response] = JSONResponse,
353
410
  # OpenAPI summary
@@ -394,6 +451,7 @@ class APIRouter(routing.Router):
394
451
  include_in_schema=endpoint_options.include_in_schema and include_in_schema and self.include_in_schema,
395
452
  status_code=endpoint_options.status_code or status_code,
396
453
  deprecated=endpoint_options.deprecated or deprecated or self.deprecated,
454
+ request_class=endpoint_options.request_class or request_class,
397
455
  response_model=endpoint_options.response_model or response_model,
398
456
  response_class=endpoint_options.response_class or response_class,
399
457
  summary=endpoint_options.summary or summary,
@@ -418,6 +476,7 @@ class APIRouter(routing.Router):
418
476
  include_in_schema=include_in_schema and self.include_in_schema,
419
477
  status_code=status_code,
420
478
  deprecated=deprecated or self.deprecated,
479
+ request_class=request_class,
421
480
  response_model=response_model,
422
481
  response_class=response_class,
423
482
  summary=summary,
@@ -442,6 +501,7 @@ class APIRouter(routing.Router):
442
501
  include_in_schema: bool = True,
443
502
  status_code: Optional[int] = None,
444
503
  deprecated: Optional[bool] = None,
504
+ request_class: Type[Request] = Default(Request),
445
505
  response_model: Optional[Type[Any]] = None,
446
506
  response_class: Type[Response] = JSONResponse,
447
507
  # OpenAPI summary
@@ -468,6 +528,7 @@ class APIRouter(routing.Router):
468
528
  include_in_schema=include_in_schema,
469
529
  status_code=status_code,
470
530
  deprecated=deprecated,
531
+ request_class=request_class,
471
532
  response_model=response_model,
472
533
  response_class=response_class,
473
534
  summary=summary,
@@ -517,6 +578,7 @@ class APIRouter(routing.Router):
517
578
  *,
518
579
  prefix: str = "",
519
580
  tags: Optional[List[Union[str, Enum]]] = None,
581
+ default_request_class: Type[Request] = Default(Request),
520
582
  default_response_class: Type[Response] = Default(JSONResponse),
521
583
  responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
522
584
  callbacks: Optional[List[BaseRoute]] = None,
@@ -543,6 +605,12 @@ class APIRouter(routing.Router):
543
605
  for route in router.routes:
544
606
  if isinstance(route, APIRoute):
545
607
  combined_responses = {**responses, **route.responses}
608
+ use_request_class = get_value_or_default(
609
+ route.request_class,
610
+ router.default_request_class,
611
+ default_request_class,
612
+ self.default_request_class,
613
+ )
546
614
  use_response_class = get_value_or_default(
547
615
  route.response_class,
548
616
  router.default_response_class,
@@ -584,6 +652,7 @@ class APIRouter(routing.Router):
584
652
  and self.include_in_schema
585
653
  and include_in_schema
586
654
  ),
655
+ request_class=use_request_class,
587
656
  response_class=use_response_class,
588
657
  name=route.name,
589
658
  openapi_extra=route.openapi_extra,
@@ -620,6 +689,7 @@ class APIRouter(routing.Router):
620
689
  include_in_schema: bool = True,
621
690
  status_code: Optional[int] = None,
622
691
  deprecated: Optional[bool] = None,
692
+ request_class: Type[Request] = Default(Request),
623
693
  response_model: Optional[Type[Any]] = None,
624
694
  response_class: Type[Response] = JSONResponse,
625
695
  # OpenAPI summary
@@ -644,6 +714,7 @@ class APIRouter(routing.Router):
644
714
  include_in_schema=include_in_schema,
645
715
  status_code=status_code,
646
716
  deprecated=deprecated,
717
+ request_class=request_class,
647
718
  response_model=response_model,
648
719
  response_class=response_class,
649
720
  summary=summary,
@@ -665,6 +736,7 @@ class APIRouter(routing.Router):
665
736
  include_in_schema: bool = True,
666
737
  status_code: Optional[int] = None,
667
738
  deprecated: Optional[bool] = None,
739
+ request_class: Type[Request] = Default(Request),
668
740
  response_model: Optional[Type[Any]] = None,
669
741
  response_class: Type[Response] = JSONResponse,
670
742
  # OpenAPI summary
@@ -689,6 +761,7 @@ class APIRouter(routing.Router):
689
761
  include_in_schema=include_in_schema,
690
762
  status_code=status_code,
691
763
  deprecated=deprecated,
764
+ request_class=request_class,
692
765
  response_model=response_model,
693
766
  response_class=response_class,
694
767
  summary=summary,
@@ -710,6 +783,7 @@ class APIRouter(routing.Router):
710
783
  include_in_schema: bool = True,
711
784
  status_code: Optional[int] = None,
712
785
  deprecated: Optional[bool] = None,
786
+ request_class: Type[Request] = Default(Request),
713
787
  response_model: Optional[Type[Any]] = None,
714
788
  response_class: Type[Response] = JSONResponse,
715
789
  # OpenAPI summary
@@ -734,6 +808,7 @@ class APIRouter(routing.Router):
734
808
  include_in_schema=include_in_schema,
735
809
  status_code=status_code,
736
810
  deprecated=deprecated,
811
+ request_class=request_class,
737
812
  response_model=response_model,
738
813
  response_class=response_class,
739
814
  summary=summary,
@@ -755,6 +830,7 @@ class APIRouter(routing.Router):
755
830
  include_in_schema: bool = True,
756
831
  status_code: Optional[int] = None,
757
832
  deprecated: Optional[bool] = None,
833
+ request_class: Type[Request] = Default(Request),
758
834
  response_model: Optional[Type[Any]] = None,
759
835
  response_class: Type[Response] = JSONResponse,
760
836
  # OpenAPI summary
@@ -779,6 +855,7 @@ class APIRouter(routing.Router):
779
855
  include_in_schema=include_in_schema,
780
856
  status_code=status_code,
781
857
  deprecated=deprecated,
858
+ request_class=request_class,
782
859
  response_model=response_model,
783
860
  response_class=response_class,
784
861
  summary=summary,
@@ -800,6 +877,7 @@ class APIRouter(routing.Router):
800
877
  include_in_schema: bool = True,
801
878
  status_code: Optional[int] = None,
802
879
  deprecated: Optional[bool] = None,
880
+ request_class: Type[Request] = Default(Request),
803
881
  response_model: Optional[Type[Any]] = None,
804
882
  response_class: Type[Response] = JSONResponse,
805
883
  # OpenAPI summary
@@ -824,6 +902,7 @@ class APIRouter(routing.Router):
824
902
  include_in_schema=include_in_schema,
825
903
  status_code=status_code,
826
904
  deprecated=deprecated,
905
+ request_class=request_class,
827
906
  response_model=response_model,
828
907
  response_class=response_class,
829
908
  summary=summary,
@@ -845,6 +924,7 @@ class APIRouter(routing.Router):
845
924
  include_in_schema: bool = True,
846
925
  status_code: Optional[int] = None,
847
926
  deprecated: Optional[bool] = None,
927
+ request_class: Type[Request] = Default(Request),
848
928
  response_model: Optional[Type[Any]] = None,
849
929
  response_class: Type[Response] = JSONResponse,
850
930
  # OpenAPI summary
@@ -869,6 +949,7 @@ class APIRouter(routing.Router):
869
949
  include_in_schema=include_in_schema,
870
950
  status_code=status_code,
871
951
  deprecated=deprecated,
952
+ request_class=request_class,
872
953
  response_model=response_model,
873
954
  response_class=response_class,
874
955
  summary=summary,
@@ -890,6 +971,7 @@ class APIRouter(routing.Router):
890
971
  include_in_schema: bool = True,
891
972
  status_code: Optional[int] = None,
892
973
  deprecated: Optional[bool] = None,
974
+ request_class: Type[Request] = Default(Request),
893
975
  response_model: Optional[Type[Any]] = None,
894
976
  response_class: Type[Response] = JSONResponse,
895
977
  # OpenAPI summary
@@ -914,6 +996,7 @@ class APIRouter(routing.Router):
914
996
  include_in_schema=include_in_schema,
915
997
  status_code=status_code,
916
998
  deprecated=deprecated,
999
+ request_class=request_class,
917
1000
  response_model=response_model,
918
1001
  response_class=response_class,
919
1002
  summary=summary,
@@ -935,6 +1018,7 @@ class APIRouter(routing.Router):
935
1018
  include_in_schema: bool = True,
936
1019
  status_code: Optional[int] = None,
937
1020
  deprecated: Optional[bool] = None,
1021
+ request_class: Type[Request] = Default(Request),
938
1022
  response_model: Optional[Type[Any]] = None,
939
1023
  response_class: Type[Response] = JSONResponse,
940
1024
  # OpenAPI summary
@@ -959,6 +1043,7 @@ class APIRouter(routing.Router):
959
1043
  include_in_schema=include_in_schema,
960
1044
  status_code=status_code,
961
1045
  deprecated=deprecated,
1046
+ request_class=request_class,
962
1047
  response_model=response_model,
963
1048
  response_class=response_class,
964
1049
  summary=summary,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: starmallow
3
- Version: 0.3.8
3
+ Version: 0.4.0
4
4
  Summary: StarMallow framework
5
5
  Project-URL: Homepage, https://github.com/mvanderlee/starmallow
6
6
  Author-email: Michiel Vanderlee <jmt.vanderlee@gmail.com>
@@ -1,21 +1,22 @@
1
- starmallow/__init__.py,sha256=9qePgv2nvtRSr6GG-Kt0zj6MxxZRnzmsHu9kQ4LhzRk,322
2
- starmallow/applications.py,sha256=oZxxLof82QdfK44-q6wUHq9z8_sRGSEVzSQkNvfGKIg,29708
1
+ starmallow/__init__.py,sha256=fE4KZucjP-MqtKdZJkyPl8VpJdp0A1h_jNbSkHuJF8c,322
2
+ starmallow/applications.py,sha256=7tRWNi-Vqsurb-bvQUuSeTVX0_9HIqSFzRdMwQUb7Sk,30810
3
3
  starmallow/concurrency.py,sha256=MVRjo4Vqss_yqhaoeVt3xb7rLaSuAq_q9uYgTwbsojE,1375
4
4
  starmallow/constants.py,sha256=u0h8cJKhJY0oIZqzr7wpEZG2bPLrw5FroMnn3d8KBNQ,129
5
5
  starmallow/dataclasses.py,sha256=ap9DInvQjH2AyI4MAAnbDEuNnbPb94PigaNmEb7AQU8,2658
6
6
  starmallow/datastructures.py,sha256=iH_KJuJ6kBCWEsnHFLdA3iyb6ZxhfdMHYrJlhiEZtDU,839
7
- starmallow/decorators.py,sha256=SBrzmKxzF2q7hNCW_V7j0UV461QERSh9OTtTdTFi6Kg,3597
7
+ starmallow/decorators.py,sha256=7635d-JxCbEIqlAloekenGO2ucBSD16Q7zc4v6IQGPU,3773
8
8
  starmallow/delimited_field.py,sha256=gonWgYg6G5xH2yXAyfDgkePmQ8dUaRSp2hdJ3mCfOBw,3466
9
9
  starmallow/docs.py,sha256=eA39LunVMEoPU5ge4qxm2eiJbrFTUSUu5EhG1L_LKxk,6268
10
- starmallow/endpoint.py,sha256=TFpNIqSvRbgI_NFKGzE6vq0bkqioBrVyprngzVR6J3w,15816
10
+ starmallow/endpoint.py,sha256=YdEtRKF1Z-p_KXoqJJNP_9nEwOzvgxYoMI3Rly7ECrM,15888
11
11
  starmallow/endpoints.py,sha256=UrwVZCxbmWI20iNtJ0oXxo4d3-y12TjsOGs_jnStTiU,939
12
12
  starmallow/exception_handlers.py,sha256=gr2qLYWEtsIEH28n7OreEiiLVz6Y7b6osRyS9esJbBk,891
13
13
  starmallow/exceptions.py,sha256=vabtPJkTmtCdC8_2OPBE8Osz0v0KxaSOX6IWf1jgNkc,872
14
14
  starmallow/fields.py,sha256=arrTabCYoJFZcoY69EZTBH3YUg7CUSr3-zYLiAjYLTM,1238
15
15
  starmallow/params.py,sha256=-f6ut1p_w_I8lyEgRciJxUtHmoVXKAD2Ug4KuRjPlJA,8661
16
- starmallow/request_resolver.py,sha256=1_P2EnDFojm6TIbtiB5NpAh1QobegqGAArt808bep90,10755
16
+ starmallow/request_resolver.py,sha256=kT7B0BWSqBP_9Jl865Ya_Op9I3W4FyfBxXjvtucWT_0,10785
17
+ starmallow/requests.py,sha256=o_yNhH9WJ35uAGuoXa5_gihevHeaveOvkP525dbwQSU,843
17
18
  starmallow/responses.py,sha256=k2pf_m21ykf_FECdODUz400pMucMJJf_Zm8TXFujvaU,2012
18
- starmallow/routing.py,sha256=sy7wbWc20zDjxo5CIR4j1VXlyKsan6i8zPpql0RFrNw,39203
19
+ starmallow/routing.py,sha256=8oXJb-3EixI3iYEY2q0r31x8NZnB56RKKIEfhtjjTpQ,42157
19
20
  starmallow/schema_generator.py,sha256=BKtXVQoNFWoAIEtiRNylWls_7nyFIshy3_myooogjoI,17806
20
21
  starmallow/serializers.py,sha256=rBEKMNgONgz_bai12uDvAEMCI_aEFGsqMSeIoWtlrOI,12514
21
22
  starmallow/types.py,sha256=8GXWjvzXQhF5NMHf14fbid6uErxVd1Xk_w2I4FoUgZ4,717
@@ -33,7 +34,7 @@ starmallow/security/http.py,sha256=cpGjM1kFDq3i_bOY96kMkf4cspBUxFkkET9lTK3NA-0,6
33
34
  starmallow/security/oauth2.py,sha256=1nv1580PY4cwgu5gzpQCf2MfMNv2Cfv05753AUHPOhQ,10005
34
35
  starmallow/security/open_id_connect_url.py,sha256=IPsL2YzWc2mPwJbrUn6oFRTi7uRAG6mR62CGwmzBs1k,1399
35
36
  starmallow/security/utils.py,sha256=bd8T0YM7UQD5ATKucr1bNtAvz_Y3__dVNAv5UebiPvc,293
36
- starmallow-0.3.8.dist-info/METADATA,sha256=cLs4Cga2MxfVWjLQ2NVx3fBhVPhiOgd4IiF5jn_u4TU,5651
37
- starmallow-0.3.8.dist-info/WHEEL,sha256=y1bSCq4r5i4nMmpXeUJMqs3ipKvkZObrIXSvJHm1qCI,87
38
- starmallow-0.3.8.dist-info/licenses/LICENSE.md,sha256=QelyGgOzch8CXzy6HrYwHh7nmj0rlWkDA0YzmZ3CPaY,1084
39
- starmallow-0.3.8.dist-info/RECORD,,
37
+ starmallow-0.4.0.dist-info/METADATA,sha256=jPVSz2HCZ8VpNCrkbR2ZPV_ia-WHWodk73LdQUF3jkU,5651
38
+ starmallow-0.4.0.dist-info/WHEEL,sha256=y1bSCq4r5i4nMmpXeUJMqs3ipKvkZObrIXSvJHm1qCI,87
39
+ starmallow-0.4.0.dist-info/licenses/LICENSE.md,sha256=QelyGgOzch8CXzy6HrYwHh7nmj0rlWkDA0YzmZ3CPaY,1084
40
+ starmallow-0.4.0.dist-info/RECORD,,