From 0d84338e28c4a34036b168dfcdb075b0bf091449 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 25 Oct 2021 10:14:18 -0400 Subject: [PATCH] Add regex condition op --- netbox/extras/conditions.py | 11 +++++++++-- netbox/extras/tests/test_conditions.py | 10 ++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/netbox/extras/conditions.py b/netbox/extras/conditions.py index 7f1d804e8..6f1b012eb 100644 --- a/netbox/extras/conditions.py +++ b/netbox/extras/conditions.py @@ -1,4 +1,5 @@ import functools +import re __all__ = ( 'Condition', @@ -32,13 +33,14 @@ class Condition: LTE = 'lte' IN = 'in' CONTAINS = 'contains' + REGEX = 'regex' OPERATORS = ( - EQ, GT, GTE, LT, LTE, IN, CONTAINS + EQ, GT, GTE, LT, LTE, IN, CONTAINS, REGEX ) TYPES = { - str: (EQ, CONTAINS), + str: (EQ, CONTAINS, REGEX), bool: (EQ, CONTAINS), int: (EQ, GT, GTE, LT, LTE, CONTAINS), float: (EQ, GT, GTE, LT, LTE, CONTAINS), @@ -99,6 +101,11 @@ class Condition: def eval_contains(self, value): return self.value in value + # Regular expressions + + def eval_regex(self, value): + return re.match(self.value, value) is not None + class ConditionSet: """ diff --git a/netbox/extras/tests/test_conditions.py b/netbox/extras/tests/test_conditions.py index 47ae0b662..ee6afeaf6 100644 --- a/netbox/extras/tests/test_conditions.py +++ b/netbox/extras/tests/test_conditions.py @@ -95,6 +95,16 @@ class ConditionTestCase(TestCase): self.assertFalse(c.eval({'x': [1, 2, 3]})) self.assertTrue(c.eval({'x': [2, 3, 4]})) + def test_regex(self): + c = Condition('x', '[a-z]+', 'regex') + self.assertTrue(c.eval({'x': 'abc'})) + self.assertFalse(c.eval({'x': '123'})) + + def test_regex_negated(self): + c = Condition('x', '[a-z]+', 'regex', negate=True) + self.assertFalse(c.eval({'x': 'abc'})) + self.assertTrue(c.eval({'x': '123'})) + class ConditionSetTest(TestCase):