1111 Literal ,
1212 Optional ,
1313 TypeVar ,
14- Union ,
1514)
1615
1716from fastapi import APIRouter , Body , Path , Query , Request , status
@@ -62,19 +61,19 @@ class RoutersJSONAPI:
6261 def __init__ (
6362 self ,
6463 router : APIRouter ,
65- path : Union [ str , list [str ] ],
64+ path : str | list [str ],
6665 tags : Iterable [str ],
6766 class_list : type ["ListViewBase" ],
6867 class_detail : type ["DetailViewBase" ],
6968 model : type [TypeModel ],
7069 schema : type [BaseModel ],
7170 resource_type : str ,
72- schema_in_post : Optional [ type [BaseModel ]] = None ,
73- schema_in_patch : Optional [ type [BaseModel ]] = None ,
74- pagination_default_size : Optional [ int ] = 25 ,
75- pagination_default_number : Optional [ int ] = 1 ,
76- pagination_default_offset : Optional [ int ] = None ,
77- pagination_default_limit : Optional [ int ] = None ,
71+ schema_in_post : type [BaseModel ] | None = None ,
72+ schema_in_patch : type [BaseModel ] | None = None ,
73+ pagination_default_size : int | None = 25 ,
74+ pagination_default_number : int | None = 1 ,
75+ pagination_default_offset : int | None = None ,
76+ pagination_default_limit : int | None = None ,
7877 methods : Iterable [str ] = (),
7978 ) -> None :
8079 """
@@ -121,10 +120,10 @@ def __init__(
121120 raise ValueError (msg )
122121 self .all_jsonapi_routers [self .type_ ] = self
123122
124- self .pagination_default_size : Optional [ int ] = pagination_default_size
125- self .pagination_default_number : Optional [ int ] = pagination_default_number
126- self .pagination_default_offset : Optional [ int ] = pagination_default_offset
127- self .pagination_default_limit : Optional [ int ] = pagination_default_limit
123+ self .pagination_default_size : int | None = pagination_default_size
124+ self .pagination_default_number : int | None = pagination_default_number
125+ self .pagination_default_offset : int | None = pagination_default_offset
126+ self .pagination_default_limit : int | None = pagination_default_limit
128127 self .schema_builder = SchemaBuilder (resource_type = resource_type )
129128
130129 dto = self .schema_builder .create_schemas (
@@ -280,25 +279,21 @@ def _create_pagination_query_params(self) -> list[Parameter]:
280279 offset = Query (self .pagination_default_offset , alias = "page[offset]" , title = "pagination_page_offset" )
281280 limit = Query (self .pagination_default_limit , alias = "page[limit]" , title = "pagination_page_limit" )
282281
283- params = []
284-
285- for q_param in (
286- size ,
287- number ,
288- offset ,
289- limit ,
290- ):
291- params .append (
292- Parameter (
293- # name doesn't really matter here
294- name = q_param .title ,
295- kind = Parameter .POSITIONAL_OR_KEYWORD ,
296- annotation = Optional [int ],
297- default = q_param ,
298- ),
282+ return [
283+ Parameter (
284+ # name doesn't really matter here
285+ name = q_param .title ,
286+ kind = Parameter .POSITIONAL_OR_KEYWORD ,
287+ annotation = int | None ,
288+ default = q_param ,
299289 )
300-
301- return params
290+ for q_param in (
291+ size ,
292+ number ,
293+ offset ,
294+ limit ,
295+ )
296+ ]
302297
303298 @classmethod
304299 def _create_filters_query_dependency_param (cls ):
@@ -387,8 +382,11 @@ def _update_signature_for_resource_detail_view(
387382
388383 return sig .replace (parameters = params + include_params + list (additional_dependency_params ) + tail_params )
389384
390- @staticmethod
391- def _create_dependency_params_from_pydantic_model (model_class : type [BaseModel ]) -> list [Parameter ]:
385+ @classmethod
386+ def _create_dependency_params_from_pydantic_model (
387+ cls ,
388+ model_class : type [BaseModel ],
389+ ) -> list [Parameter ]:
392390 return [
393391 Parameter (
394392 name = field_name ,
@@ -399,8 +397,12 @@ def _create_dependency_params_from_pydantic_model(model_class: type[BaseModel])
399397 for field_name , field_info in model_class .model_fields .items ()
400398 ]
401399
402- @staticmethod
403- def _update_method_config (view : type ["ViewBase" ], method : HTTPMethod ) -> HTTPMethodConfig :
400+ @classmethod
401+ def _update_method_config (
402+ cls ,
403+ view : type ["ViewBase" ],
404+ method : HTTPMethod ,
405+ ) -> HTTPMethodConfig :
404406 target_config = view .method_dependencies .get (method ) or HTTPMethodConfig ()
405407 common_config = view .method_dependencies .get (HTTPMethod .ALL ) or HTTPMethodConfig ()
406408
@@ -425,17 +427,18 @@ def _update_method_config(view: type["ViewBase"], method: HTTPMethod) -> HTTPMet
425427
426428 return new_method_config
427429
430+ @classmethod
428431 def _update_method_config_and_get_dependency_params (
429- self ,
432+ cls ,
430433 view : type ["ViewBase" ],
431434 method : HTTPMethod ,
432435 ) -> list [Parameter ]:
433- method_config = self ._update_method_config (view , method )
436+ method_config = cls ._update_method_config (view , method )
434437
435438 if method_config .dependencies is None :
436439 return []
437440
438- return self ._create_dependency_params_from_pydantic_model (method_config .dependencies )
441+ return cls ._create_dependency_params_from_pydantic_model (method_config .dependencies )
439442
440443 def prepare_dependencies_handler_signature (
441444 self ,
@@ -679,7 +682,7 @@ def _register_views(self, path: str):
679682 :param path:
680683 :return:
681684 """
682- methods_map : dict [Union [ str , ViewMethods ] , Callable [[str ], None ]] = {
685+ methods_map : dict [str | ViewMethods , Callable [[str ], None ]] = {
683686 ViewMethods .GET_LIST : self ._register_get_resource_list ,
684687 ViewMethods .POST : self ._register_post_resource_list ,
685688 ViewMethods .DELETE_LIST : self ._register_delete_resource_list ,
0 commit comments