Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/fastjsonschema/draft07.py: 18%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

39 statements  

1from .draft06 import CodeGeneratorDraft06 

2 

3 

4class CodeGeneratorDraft07(CodeGeneratorDraft06): 

5 FORMAT_REGEXS = dict(CodeGeneratorDraft06.FORMAT_REGEXS, **{ 

6 'date': r'^(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})\Z', 

7 'iri': r'^\w+:(\/?\/?)[^\s]+\Z', 

8 'iri-reference': r'^(\w+:(\/?\/?))?[^#\\\s]*(#[^\\\s]*)?\Z', 

9 'idn-email': r'^[^@]+@[^@]+\.[^@]+\Z', 

10 #'idn-hostname': r'', 

11 'relative-json-pointer': r'^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)\Z', 

12 #'regex': r'', 

13 'time': ( 

14 r'^(?P<hour>\d{1,2}):(?P<minute>\d{1,2})' 

15 r'(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6}))?' 

16 r'([zZ]|[+-]\d\d:\d\d)?)?\Z' 

17 ), 

18 }) 

19 

20 def __init__(self, definition, resolver=None, formats={}, use_default=True, use_formats=True): 

21 super().__init__(definition, resolver, formats, use_default, use_formats) 

22 # pylint: disable=duplicate-code 

23 self._json_keywords_to_function.update(( 

24 ('if', self.generate_if_then_else), 

25 ('contentEncoding', self.generate_content_encoding), 

26 ('contentMediaType', self.generate_content_media_type), 

27 )) 

28 

29 def generate_if_then_else(self): 

30 """ 

31 Implementation of if-then-else. 

32 

33 .. code-block:: python 

34 

35 { 

36 'if': { 

37 'exclusiveMaximum': 0, 

38 }, 

39 'then': { 

40 'minimum': -10, 

41 }, 

42 'else': { 

43 'multipleOf': 2, 

44 }, 

45 } 

46 

47 Valid values are any between -10 and 0 or any multiplication of two. 

48 """ 

49 with self.l('try:', optimize=False): 

50 self.generate_func_code_block( 

51 self._definition['if'], 

52 self._variable, 

53 self._variable_name, 

54 clear_variables=True 

55 ) 

56 with self.l('except JsonSchemaValueException:'): 

57 if 'else' in self._definition: 

58 self.generate_func_code_block( 

59 self._definition['else'], 

60 self._variable, 

61 self._variable_name, 

62 clear_variables=True 

63 ) 

64 else: 

65 self.l('pass') 

66 if 'then' in self._definition: 

67 with self.l('else:'): 

68 self.generate_func_code_block( 

69 self._definition['then'], 

70 self._variable, 

71 self._variable_name, 

72 clear_variables=True 

73 ) 

74 

75 def generate_content_encoding(self): 

76 """ 

77 Means decoding value when it's encoded by base64. 

78 

79 .. code-block:: python 

80 

81 { 

82 'contentEncoding': 'base64', 

83 } 

84 """ 

85 if self._definition['contentEncoding'] == 'base64': 

86 with self.l('if isinstance({variable}, str):'): 

87 with self.l('try:'): 

88 self.l('import base64') 

89 self.l('{variable} = base64.b64decode({variable})') 

90 with self.l('except Exception:'): 

91 self.exc('{name} must be encoded by base64') 

92 with self.l('if {variable} == "":'): 

93 self.exc('contentEncoding must be base64') 

94 

95 def generate_content_media_type(self): 

96 """ 

97 Means loading value when it's specified as JSON. 

98 

99 .. code-block:: python 

100 

101 { 

102 'contentMediaType': 'application/json', 

103 } 

104 """ 

105 if self._definition['contentMediaType'] == 'application/json': 

106 with self.l('if isinstance({variable}, bytes):'): 

107 with self.l('try:'): 

108 self.l('{variable} = {variable}.decode("utf-8")') 

109 with self.l('except Exception:'): 

110 self.exc('{name} must encoded by utf8') 

111 with self.l('if isinstance({variable}, str):'): 

112 with self.l('try:'): 

113 self.l('import json') 

114 self.l('{variable} = json.loads({variable})') 

115 with self.l('except Exception:'): 

116 self.exc('{name} must be valid JSON')