diff data_schema/__init__.py @ 38:5a2fba996773

Implement a "forbidden" schema field for dicts
author Franz Glasner <f.glasner@feldmann-mg.com>
date Wed, 19 Jul 2023 13:30:55 +0200
parents ef586378f79a
children 78f5ef0ee087
line wrap: on
line diff
--- a/data_schema/__init__.py	Wed Jul 19 13:26:06 2023 +0200
+++ b/data_schema/__init__.py	Wed Jul 19 13:30:55 2023 +0200
@@ -118,6 +118,7 @@
     E10056 = NC_("schema-msg", "failing `any-of' item")
     E10057 = NC_("schema-msg", "`all-of' failed")
     E10058 = NC_("schema-msg", "failing `all-of' item")
+    E10059 = NC_("schema-msg", "forbidden key detected")
 
 
 @enum.unique
@@ -738,6 +739,14 @@
     if not required_keys <= seen_keys:
         hs = [str(i) for i in required_keys - seen_keys]
         yield ValidationProblem(code=ERRORS.E10005, hint=sorted(hs), context=context)
+    # check whether no forbidden keys are seen
+    try:
+        forbidden_keys = set(schema.get("forbidden", set()))
+    except (TypeError, ValueError):
+        raise SchemaError("`forbidden` must be an iterable")
+    if forbidden_keys & seen_keys:
+        hs = [str(i) for i in forbidden_keys & seen_keys]
+        yield ValidationProblem(code=ERRORS.E10059, hint=sorted(hs), context=context)
 
 
 def validate_list(obj, schema, context):