Coverage for pydantic/parse.py: 100.00%

36 statements  

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

1import json 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

2import pickle 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

3from enum import Enum 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

4from pathlib import Path 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

5from typing import Any, Callable, Union 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

6 

7from pydantic.types import StrBytes 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

8 

9 

10class Protocol(str, Enum): 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

11 json = 'json' 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

12 pickle = 'pickle' 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

13 

14 

15def load_str_bytes( 1abcdefghijklmnopqrstEFGHPQRSTUIuvwxyzABCD

16 b: StrBytes, 

17 *, 

18 content_type: str = None, 

19 encoding: str = 'utf8', 

20 proto: Protocol = None, 

21 allow_pickle: bool = False, 

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

23) -> Any: 

24 if proto is None and content_type: 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

25 if content_type.endswith(('json', 'javascript')): 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

26 pass 1JKabcdefghijLMklmnopqrstNOuvwxyzABCD

27 elif allow_pickle and content_type.endswith('pickle'): 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

28 proto = Protocol.pickle 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

29 else: 

30 raise TypeError(f'Unknown content-type: {content_type}') 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

31 

32 proto = proto or Protocol.json 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

33 

34 if proto == Protocol.json: 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

35 if isinstance(b, bytes): 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

36 b = b.decode(encoding) 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

37 return json_loads(b) 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD

38 elif proto == Protocol.pickle: 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

39 if not allow_pickle: 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

40 raise RuntimeError('Trying to decode with pickle with allow_pickle=False') 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

41 bb = b if isinstance(b, bytes) else b.encode() 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

42 return pickle.loads(bb) 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

43 else: 

44 raise TypeError(f'Unknown protocol: {proto}') 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

45 

46 

47def load_file( 1abcdefghijklmnopqrstEFGHPQRSTUIuvwxyzABCD

48 path: Union[str, Path], 

49 *, 

50 content_type: str = None, 

51 encoding: str = 'utf8', 

52 proto: Protocol = None, 

53 allow_pickle: bool = False, 

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

55) -> Any: 

56 path = Path(path) 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

57 b = path.read_bytes() 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

58 if content_type is None: 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

59 if path.suffix in ('.js', '.json'): 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

60 proto = Protocol.json 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

61 elif path.suffix == '.pkl': 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

62 proto = Protocol.pickle 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

63 

64 return load_str_bytes( 1JKabcdefghijLMklmnopqrstEFGHINOuvwxyzABCD

65 b, proto=proto, content_type=content_type, encoding=encoding, allow_pickle=allow_pickle, json_loads=json_loads 

66 )