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
« 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
7from pydantic.types import StrBytes 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD
10class Protocol(str, Enum): 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD
11 json = 'json' 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD
12 pickle = 'pickle' 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD
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
32 proto = proto or Protocol.json 1JKabcdefghijLMklmnopqrstEFGHPQRSTUINOuvwxyzABCD
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
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
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 )