Coverage for pydantic/tools.py: 100.00%

33 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-08-15 13:26 +0000

1import json 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

2from functools import lru_cache 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

3from pathlib import Path 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

4from typing import TYPE_CHECKING, Any, Callable, Optional, Type, TypeVar, Union 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

5 

6from pydantic.parse import Protocol, load_file, load_str_bytes 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

7from pydantic.types import StrBytes 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

8from pydantic.typing import display_as_type 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

9 

10__all__ = ('parse_file_as', 'parse_obj_as', 'parse_raw_as', 'schema_of', 'schema_json_of') 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

11 

12NameFactory = Union[str, Callable[[Type[Any]], str]] 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

13 

14if TYPE_CHECKING: 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

15 from pydantic.typing import DictStrAny 

16 

17 

18def _generate_parsing_type_name(type_: Any) -> str: 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

19 return f'ParsingModel[{display_as_type(type_)}]' 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

20 

21 

22@lru_cache(maxsize=2048) 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

23def _get_parsing_type(type_: Any, *, type_name: Optional[NameFactory] = None) -> Any: 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

24 from pydantic.main import create_model 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

25 

26 if type_name is None: 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

27 type_name = _generate_parsing_type_name 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

28 if not isinstance(type_name, str): 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

29 type_name = type_name(type_) 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

30 return create_model(type_name, __root__=(type_, ...)) 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

31 

32 

33T = TypeVar('T') 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

34 

35 

36def parse_obj_as(type_: Type[T], obj: Any, *, type_name: Optional[NameFactory] = None) -> T: 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

37 model_type = _get_parsing_type(type_, type_name=type_name) # type: ignore[arg-type] 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

38 return model_type(__root__=obj).__root__ 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

39 

40 

41def parse_file_as( 1abcdefghijklmnopqrstuvwxPQRSTUyzABCDEFGHI

42 type_: Type[T], 

43 path: Union[str, Path], 

44 *, 

45 content_type: str = None, 

46 encoding: str = 'utf8', 

47 proto: Protocol = None, 

48 allow_pickle: bool = False, 

49 json_loads: Callable[[str], Any] = json.loads, 

50 type_name: Optional[NameFactory] = None, 

51) -> T: 

52 obj = load_file( 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

53 path, 

54 proto=proto, 

55 content_type=content_type, 

56 encoding=encoding, 

57 allow_pickle=allow_pickle, 

58 json_loads=json_loads, 

59 ) 

60 return parse_obj_as(type_, obj, type_name=type_name) 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

61 

62 

63def parse_raw_as( 1abcdefghijklmnopqrstuvwxPQRSTUyzABCDEFGHI

64 type_: Type[T], 

65 b: StrBytes, 

66 *, 

67 content_type: str = None, 

68 encoding: str = 'utf8', 

69 proto: Protocol = None, 

70 allow_pickle: bool = False, 

71 json_loads: Callable[[str], Any] = json.loads, 

72 type_name: Optional[NameFactory] = None, 

73) -> T: 

74 obj = load_str_bytes( 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

75 b, 

76 proto=proto, 

77 content_type=content_type, 

78 encoding=encoding, 

79 allow_pickle=allow_pickle, 

80 json_loads=json_loads, 

81 ) 

82 return parse_obj_as(type_, obj, type_name=type_name) 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

83 

84 

85def schema_of(type_: Any, *, title: Optional[NameFactory] = None, **schema_kwargs: Any) -> 'DictStrAny': 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

86 """Generate a JSON schema (as dict) for the passed model or dynamically generated one""" 

87 return _get_parsing_type(type_, type_name=title).schema(**schema_kwargs) 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI

88 

89 

90def schema_json_of(type_: Any, *, title: Optional[NameFactory] = None, **schema_json_kwargs: Any) -> str: 1JKabcdefghijLMklmnopqrstuvwxPQRSTUyNOzABCDEFGHI

91 """Generate a JSON schema (as JSON) for the passed model or dynamically generated one""" 

92 return _get_parsing_type(type_, type_name=title).schema_json(**schema_json_kwargs) 1JKabcdefghijLMklmnopqrstuvwxyNOzABCDEFGHI