def test_rgetattr(self): """Test `utils.rgetattr` function.""" obj = utils.AttrDict( **{ 'foo': { 'bar': True, 'buzz': [ utils.AttrDict(**{'fuzz': True}), # introduce inconsistency -- can happen in reality utils.AttrDict(**{'no-fuzz': True}) ] } }) self.assertTrue(utils.rgetattr(obj, 'foo.bar')) self.assertIsInstance(utils.rgetattr(obj, 'foo'), utils.AttrDict) self.assertIsInstance(utils.rgetattr(obj, 'foo.bar'), bool) # should not raise self.assertIsInstance(utils.rgetattr(obj, 'foo.buzz.fuzz')[0], bool) self.assertIn( 'Test', utils.rgetattr(obj, 'foo.buzz.no_fuzz', repl_missing='Test'), )
def test_rhasattr(self): """Test `utils.rhasattr` function.""" obj = utils.AttrDict(**{'foo': {'bar': None}}) self.assertTrue(utils.rhasattr(obj, 'foo.bar')) self.assertTrue(utils.rhasattr(obj, 'foo')) obj_with_arrays = utils.AttrDict(**{'buzz': [obj, obj]}) # --- # arrays self.assertTrue(utils.rhasattr(obj_with_arrays, 'buzz.foo')) self.assertTrue(utils.rhasattr(obj_with_arrays, 'buzz.foo.bar'))
def test_in_range(self): """Test `in_range` selector.""" obj = utils.AttrDict( **{'foo': {'bar': 5}, 'time': datetime.now()} ) # wrong with self.assertRaises(ValueError): select = selectors.in_range(high=10, low=100) select(obj, 'foo.bar') select = selectors.in_range(high=10, low=0) self.assertTrue(select(obj, 'foo.bar')) select = selectors.in_range(high=10, low=5) self.assertTrue(select(obj, 'foo.bar')) select = selectors.in_range(high=5, low=0) self.assertTrue(select(obj, 'foo.bar')) select = selectors.in_range(high=4, low=0) self.assertFalse(select(obj, 'foo.bar')) select = selectors.in_range(high=datetime.now(), low=datetime(1, 1, 1)) self.assertTrue(select(obj, 'time')) select = selectors.in_range(high=datetime(2, 2, 2), low=datetime(1, 1, 1)) self.assertFalse(select(obj, 'time'))
def test_search(self): """Test `search` selector.""" obj = utils.AttrDict( **{'foo': {'bar': 'abcdefgh'}, 'buzz': 'abcd'} ) # exact search select = selectors.search(pattern='abcd') # simple, exact match self.assertTrue(select(obj, 'buzz')) select = selectors.search(pattern='abc') self.assertTrue(select(obj, 'buzz')) select = selectors.search(pattern='bca') self.assertFalse(select(obj, 'buzz')) # --- # pattern select = selectors.search(pattern=r"(\w)+") self.assertTrue(select(obj, 'buzz')) # nested self.assertTrue(select(obj, 'foo.bar')) # --- # arrays obj_with_array = utils.AttrDict( **{ 'fuzz': [obj, obj] } ) select = selectors.search(pattern=r"abc") # nested self.assertTrue(select(obj_with_array, 'fuzz.foo.bar')) self.assertTrue(select(obj_with_array, 'fuzz.buzz')) # incorrect, should not raise self.assertFalse(select(obj_with_array, 'fuzz.bar'))
def test_in_(self): """Test `in_` selector.""" obj = utils.AttrDict( **{ 'foo': {'bar': 5}, 'buzz': False, } ) select = selectors.in_([0, 5, 10, 15]) self.assertTrue(select(obj, 'foo.bar')) select = selectors.in_([True, False]) self.assertTrue(select(obj, 'buzz'))
def test_match(self): """Test `match` selector.""" obj = utils.AttrDict(**{'foo': {'bar': 2}, 'buzz': 1}) # exact match select = selectors.match(pattern=1) # simple, exact match self.assertTrue(select(obj, 'buzz')) # exact match select = selectors.match(pattern=2) self.assertFalse(select(obj, 'buzz')) # --- # pattern select = selectors.match(pattern=r"(\d)+") self.assertTrue(select(obj, 'buzz')) # nested self.assertTrue(select(obj, 'foo.bar'))
def test_greater(self): """Test `gt` and `ge` selector.""" obj = utils.AttrDict( **{ 'foo': {'bar': 5}, 'time': datetime.now() } ) select = selectors.gt(0) self.assertTrue(select(obj, 'foo.bar')) self.assertTrue(select(obj, 'time')) select = selectors.gt(5) self.assertFalse(select(obj, 'foo.bar')) select = selectors.gt(datetime.now()) self.assertFalse(select(obj, 'time')) select = selectors.ge(5) self.assertTrue(select(obj, 'foo.bar'))
def project(self, p_dict: typing.Dict[str, int], **kwargs) -> utils.AttrDict: """Project specific document attributes.""" keys = p_dict.keys() # create projection tree if not p_dict.pop('id_', 1): projection = dict() else: projection = {'id_': self.id_} for key in keys: ptr_dict = projection sub_keys = key.split(sep='.') for sub_key in sub_keys[:-1]: ptr_dict[sub_key] = dict() ptr_dict = ptr_dict[sub_key] ptr_dict[sub_keys[-1]] = utils.rgetattr(self, key, **kwargs) return utils.AttrDict(**projection)
def test_lower(self): """Test `lt` and `le` selector.""" obj = utils.AttrDict( **{ 'foo': {'bar': 5}, 'time': datetime.now(), 'arr': [ '1.0.0', '1.4.3' ] } ) select = selectors.lt(0) self.assertFalse(select(obj, 'foo.bar')) select = selectors.lt(10) self.assertTrue(select(obj, 'foo.bar')) select = selectors.lt(datetime.now()) self.assertTrue(select(obj, 'time')) select = selectors.le(5) self.assertTrue(select(obj, 'foo.bar')) # --- # strings select = selectors.le('1.0.0') self.assertTrue(select(obj, 'arr')) select = selectors.lt('1.0.0') self.assertFalse(select(obj, 'arr')) select = selectors.lt('2.0.0') self.assertTrue(select(obj, 'arr'))