diff data_schema/__init__.py @ 39:78f5ef0ee087

Implement "ref-false", "ref-not-exists", "when-ref-false" and "when-ref-not-exists" in addition to the existing conditions
author Franz Glasner <f.glasner@feldmann-mg.com>
date Wed, 19 Jul 2023 14:19:21 +0200
parents 5a2fba996773
children 2376224a9717
line wrap: on
line diff
--- a/data_schema/__init__.py	Wed Jul 19 13:30:55 2023 +0200
+++ b/data_schema/__init__.py	Wed Jul 19 14:19:21 2023 +0200
@@ -1266,7 +1266,8 @@
     """
     pred, predval = _get_one_of(
         cond,
-        "when-ref-true", "when-ref-exists", "when",
+        "when-ref-true", "when-ref-false",
+        "when-ref-exists", "when-ref-not-exists", "when",
         default=_SENTINEL)
 
     if pred == "when":
@@ -1275,9 +1276,15 @@
     elif pred == "when-ref-true":
         refobj = try_get_reference(predval, context, schema, default=None)
         return bool(refobj)
+    elif pred == "when-ref-false":
+        refobj = try_get_reference(predval, context, schema, default=None)
+        return not bool(refobj)
     elif pred == "when-ref-exists":
         refobj = try_get_reference(predval, context, schema, default=_SENTINEL)
         return refobj is not _SENTINEL
+    elif pred == "when-ref-not-exists":
+        refobj = try_get_reference(predval, context, schema, default=_SENTINEL)
+        return refobj is _SENTINEL
     else:
         raise SchemaError("unknown condition type: {}".format(pred))
 
@@ -1325,16 +1332,25 @@
         else:
             pred_key, pred_val = _get_one_of(
                 pred,
-                "ref-true", "ref-exists", "equals",
+                "ref-true", "ref-false", "ref-exists", "ref-not-exists",
+                "equals",
                 default=None)
             if pred_key == "ref-true":
                 refobj = try_get_reference(
                     pred_val, context, schema, default=None)
                 return bool(refobj)
+            elif pred_key == "ref-false":
+                refobj = try_get_reference(
+                    pred_val, context, schema, default=None)
+                return not bool(refobj)
             elif pred_key == "ref-exists":
                 refobj = try_get_reference(
                     pred_val, context, schema, default=_SENTINEL)
                 return refobj is not _SENTINEL
+            elif pred_key == "ref-not-exists":
+                refobj = try_get_reference(
+                    pred_val, context, schema, default=_SENTINEL)
+                return refobj is _SENTINEL
             elif pred_key == "equals":
                 if not isinstance(pred_val, (list, tuple)):
                     raise SchemaError("`equals' requires a list as childs")