]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/commitdiff
JSON path now contains the keys directly.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 29 Oct 2021 07:14:46 +0000 (09:14 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 29 Oct 2021 07:18:55 +0000 (09:18 +0200)
wrpylib/json_tools.py

index d9443c7fa2bda59e7f569c46b4ff4b1d04de7d5b..8490b5947e9569f74f20e4292e4398b4b37c2450 100644 (file)
@@ -8,63 +8,67 @@ class ValidationError(ValueError):
     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,
@@ -76,4 +80,4 @@ def _order_json_keys(sub_value: JsonTypes, sub_schema: JsonTypes, path: List[str
 
 
 def order_json_keys(value: JsonTypes, schema: JsonTypes) -> JsonTypes:
-    return _order_json_keys(value, schema, ['value'])
+    return _order_json_keys(value, schema, [])