Просмотр исходного кода

Improve documentation and testing for conditions

jeremystretch 4 лет назад
Родитель
Сommit
dcececf9c0
3 измененных файлов с 50 добавлено и 3 удалено
  1. 35 2
      docs/reference/conditions.md
  2. 5 1
      netbox/extras/conditions.py
  3. 10 0
      netbox/extras/tests/test_conditions.py

+ 35 - 2
docs/reference/conditions.md

@@ -23,14 +23,47 @@ A condition is expressed as a JSON object with the following keys:
 * `in`: Is present within a list of values
 * `contains`: Contains the specified value
 
+### Accessing Nested Keys
+
+To access nested keys, use dots to denote the path to the desired attribute. For example, assume the following data:
+
+```json
+{
+  "a": {
+    "b": {
+      "c": 123
+    }
+  }
+}
+```
+
+The following condition will evaluate as true:
+
+```json
+{
+  "attr": "a.b.c",
+  "value": 123
+}
+```
+
 ### Examples
 
-`name` equals "foobar":
+`name` equals "foo":
 
 ```json
 {
   "attr": "name",
-  "value": "foobar"
+  "value": "foo"
+}
+```
+
+`name` does not equal "foo"
+
+```json
+{
+  "attr": "name",
+  "value": "foo",
+  "negate": true
 }
 ```
 

+ 5 - 1
netbox/extras/conditions.py

@@ -64,7 +64,11 @@ class Condition:
         """
         Evaluate the provided data to determine whether it matches the condition.
         """
-        value = functools.reduce(dict.get, self.attr.split('.'), data)
+        try:
+            value = functools.reduce(dict.get, self.attr.split('.'), data)
+        except TypeError:
+            # Invalid key path
+            value = None
         result = self.eval_func(value)
 
         if self.negate:

+ 10 - 0
netbox/extras/tests/test_conditions.py

@@ -35,6 +35,16 @@ class ConditionTestCase(TestCase):
             # 'gt' supports only numeric values
             Condition('x', 'foo', 'gt')
 
+    #
+    # Nested attrs tests
+    #
+
+    def test_nested(self):
+        c = Condition('x.y.z', 1)
+        self.assertTrue(c.eval({'x': {'y': {'z': 1}}}))
+        self.assertFalse(c.eval({'x': {'y': {'z': 2}}}))
+        self.assertFalse(c.eval({'a': {'b': {'c': 1}}}))
+
     #
     # Operator tests
     #