Source code for jsontas.data_structures.operator

# Copyright 2020 Axis Communications AB.
#
# For a full list of individual contributors, please see the commit history.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Operator datastructure."""
import re
from .datastructure import DataStructure

# pylint:disable=too-few-public-methods


[docs]class Operator(DataStructure): """Operator datastructure. Example:: { "$operator": { "key": "key to match", "operator": "$eq", "value": "value to match against key" } } Supported operators: * :$eq: :obj:`_equal` * :$in: :obj:`_in` * :$notin: :obj:`_notin` * :$startswith: :obj:`_startswith` * :$regex: :obj:`_regex` .. document private functions .. automethod:: _equal .. automethod:: _in .. automethod:: _notin .. automethod:: _startswith .. automethod:: _regex """ def __init__(self, *args, **kwargs): """Initialize. See :obj:`jsontas.data_structures.datastructure.DataStructure` """ super().__init__(*args, **kwargs) self.operators = { "$eq": self._equal, "$in": self._in, "$notin": self._notin, "$startswith": self._startswith, "$regex": self._regex } self.key = self.data.get("key") self.value = self.data.get("value") self.operator = self.operators.get(self.data.get("operator"))
[docs] def _equal(self): """Operator '=='. Example:: { "$operator": { "key": "key to match", "operator": "$eq", "value": "value to match against key" } } """ return self.key == self.value
[docs] def _in(self): """Operator 'in'. Example - In list:: { "$operator": { "key": "key", "operator": "$in", "value": ["key", "anotherkey"] } } Example - In string:: { "$operator": { "key": "k", "operator": "$in", "value": "key" } } """ return self.key in self.value
[docs] def _notin(self): """Operator 'not in'. Example - In list:: { "$operator": { "key": "key", "operator": "$notin", "value": ["key", "anotherkey"] } } Example - In string:: { "$operator": { "key": "k", "operator": "$notin", "value": "key" } } """ return self.key not in self.value
[docs] def _startswith(self): """Operator 'str.startswith()'. Example:: { "$operator": { "key": "key", "operator": "$startswith", "value": "k" } } """ return self.key.startswith(self.value)
[docs] def _regex(self): """Operator 're.match'. Example:: { "$operator": { "key": "key", "operator": "$regex", "value": "^[A-Za-z]+$" } } """ match = re.match(self.value, self.key) return match is not None
[docs] def execute(self): """Execute operator. :return: None and whether key matches value or not. :rtype: tuple """ if self.operator is None: raise Exception("Unknown operator: %r" % self.operator) try: return None, self.operator() except: # pylint: disable=bare-except return None, False