Coverage for fastagency/api/openapi/fastapi_code_generator_helpers.py: 100%

23 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-19 12:16 +0000

1from collections.abc import Iterator 1ahfegibcd

2from contextlib import contextmanager 1ahfegibcd

3from functools import cached_property 1ahfegibcd

4from typing import Optional, Union 1ahfegibcd

5 

6from fastapi_code_generator.parser import ( 1ahfegibcd

7 Argument, 

8 OpenAPIParser, 

9 ParameterObject, 

10 ReferenceObject, 

11) 

12 

13 

14class ArgumentWithDescription(Argument): # type: ignore[misc] 1ahfegibcd

15 description: Optional[str] = None 1ahfegibcd

16 

17 @cached_property 1ahfegibcd

18 def argument(self) -> str: 1ahfegibcd

19 if self.description: 1afegbcd

20 description = self.description.replace('"""', '"""') 1aegbcd

21 type_hint = f'Annotated[{self.type_hint}, """{description}"""]' 1aegbcd

22 else: 

23 type_hint = self.type_hint 1afbcd

24 

25 if self.default is None and self.required: 1afegbcd

26 return f"{self.name}: {type_hint}" 1afegbcd

27 

28 return f"{self.name}: {type_hint} = {self.default}" 1afebcd

29 

30 

31@contextmanager 1ahfegibcd

32def patch_get_parameter_type() -> Iterator[None]: 1ahfegibcd

33 original_get_parameter_type = OpenAPIParser.get_parameter_type 1afegbcd

34 

35 def get_parameter_type( 1afegbcd

36 self: OpenAPIParser, 

37 parameters: Union[ReferenceObject, ParameterObject], 

38 snake_case: bool, 

39 path: list[str], 

40 ) -> Optional[Argument]: 

41 # get the original argument 

42 argument = original_get_parameter_type(self, parameters, snake_case, path) 1afegbcd

43 

44 # add description to the argument 

45 parameters = self.resolve_object(parameters, ParameterObject) 1afegbcd

46 argument_with_description = ArgumentWithDescription( 1afegbcd

47 description=parameters.description, **argument.model_dump() 

48 ) 

49 return argument_with_description 1afegbcd

50 

51 OpenAPIParser.get_parameter_type = get_parameter_type 1afegbcd

52 

53 try: 1afegbcd

54 yield 1afegbcd

55 finally: 

56 OpenAPIParser.get_parameter_type = original_get_parameter_type 1afegbcd