pass
-def _order_json_keys_string(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> str:
+def _fmt_path(path: List) -> str:
+ return f'schema[{"][".join(map(repr, path))}]'
+
+
+def _order_json_keys_string(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> str:
if not isinstance(sub_value, str):
- raise ValidationError(f'Type of {"".join(path)} needs to be string (Python str).')
+ raise ValidationError(f'Type of {_fmt_path(path)} needs to be string (Python str).')
return sub_value
-def _order_json_keys_number(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> Union[int, float]:
+def _order_json_keys_number(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> Union[int, float]:
if not isinstance(sub_value, (int, float)) or isinstance(sub_value, bool):
- raise ValidationError(f'Type of {"".join(path)} needs to be number (Python int or float).')
+ raise ValidationError(f'Type of {_fmt_path(path)} needs to be number (Python int or float).')
return sub_value
-def _order_json_keys_object(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> Dict:
+def _order_json_keys_object(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> Dict:
if not isinstance(sub_value, dict):
- raise ValidationError(f'Type of {"".join(path)} needs to be object (Python dict).')
+ raise ValidationError(f'Type of {_fmt_path(path)} needs to be object (Python dict).')
v = sub_value.copy()
p = sub_schema.get('properties', {})
result = {}
for key in p:
if key in v:
- result[key] = _order_json_keys(v.pop(key), p[key], path + [f"['{key}']"])
+ result[key] = _order_json_keys(v.pop(key), p[key], path + [key])
else:
if key in sub_schema.get('required', []):
- raise ValidationError(f'Required key "{key}" not present ({"".join(path)}).')
+ raise ValidationError(f'Required key "{key}" not present ({_fmt_path(path)}).')
if len(v) > 0:
if sub_schema.get('additionalProperties', True):
# strictly speaking additionalProperties could be more complicated than boolean
result.update(v)
else:
- raise ValidationError(f'Keys not allowed in {"".join(path)}: {", ".join(v)}')
+ raise ValidationError(f'Keys not allowed in {_fmt_path(path)}: {", ".join(v)}')
return result
-def _order_json_keys_array(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> List:
+def _order_json_keys_array(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> List:
if not isinstance(sub_value, list):
- raise ValidationError(f'Type of {"".join(path)} needs to be array (Python list).')
+ raise ValidationError(f'Type of {"".join(_fmt_path(path))} needs to be array (Python list).')
s = sub_schema.get('items', True)
- return [_order_json_keys(v, s, path + [f'[{i}]']) for i, v in enumerate(sub_value)]
+ return [_order_json_keys(v, s, path + [i]) for i, v in enumerate(sub_value)]
-def _order_json_keys_boolean(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> bool:
+def _order_json_keys_boolean(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> bool:
if not isinstance(sub_value, bool):
- raise ValidationError(f'Type of {"".join(path)} needs to be boolean (Python bool).')
+ raise ValidationError(f'Type of {_fmt_path(path)} needs to be boolean (Python bool).')
return sub_value
-def _order_json_keys_null(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> None:
+def _order_json_keys_null(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> None:
if sub_value is not None:
- raise ValidationError(f'Type of {"".join(path)} needs to be null (Python None).')
+ raise ValidationError(f'Type of {_fmt_path(path)} needs to be null (Python None).')
return sub_value
-def _order_json_keys(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str]) -> JsonTypes:
+def _order_json_keys(sub_value: JsonTypes, sub_schema: JsonTypes, path: List) -> JsonTypes:
if isinstance(sub_schema, bool):
if sub_schema:
return sub_value
- raise ValidationError(f'Value {sub_value} not allowed in {"".join(path)}.')
+ raise ValidationError(f'Value {sub_value} not allowed in {_fmt_path(path)}.')
return {
'string': _order_json_keys_string,
'number': _order_json_keys_number,
def order_json_keys(value: JsonTypes, schema: JsonTypes) -> JsonTypes:
- return _order_json_keys(value, schema, ['value'])
+ return _order_json_keys(value, schema, [])