From 49ea82c99266cb52fa1727f5d70c8b9c2952eb3b Mon Sep 17 00:00:00 2001 From: davebshow <davebshow@gmail.com> Date: Thu, 7 Jul 2016 17:56:48 -0400 Subject: [PATCH] added __getattr__ to Mapping --- goblin/mapper.py | 20 ++++++++++++++------ tests/test_engine.py | 4 ++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/goblin/mapper.py b/goblin/mapper.py index 3521153..35ae6f7 100644 --- a/goblin/mapper.py +++ b/goblin/mapper.py @@ -7,14 +7,16 @@ logger = logging.getLogger(__name__) def props_generator(properties): - for prop in properties: - yield prop['ogm_name'], prop['db_name'], prop['data_type'] + for ogm_name, (db_name, data_type) in properties.items(): + yield ogm_name, db_name, data_type def map_props_to_db(element, mapping): """Convert OGM property names/values to DB property names/values""" property_tuples = [] props = mapping.properties + # What happens if unknown props come back on an element from a database? + # currently they are ignored... for ogm_name, db_name, data_type in props_generator(props): val = getattr(element, ogm_name, None) property_tuples.append((db_name, data_type.to_db(val))) @@ -58,7 +60,7 @@ class Mapping: def __init__(self, namespace, properties): self._label = namespace.get('__label__', None) or self._create_label() self._type = namespace['__type__'] - self._properties = [] + self._properties = {} self._map_properties(properties) @property @@ -69,6 +71,13 @@ class Mapping: def properties(self): return self._properties + def __getattr__(self, value): + try: + mapping, _ = self._properties[value] + return mapping + except: + raise Exception("Unknown property") + def _create_label(self): return inflection.underscore(self.__class__.__name__) @@ -76,9 +85,8 @@ class Mapping: for name, prop in properties.items(): data_type = prop.data_type db_name = '{}__{}'.format(self._label, name) - mapping = {'ogm_name': name, 'db_name': db_name, - 'data_type': data_type} - self._properties.append(mapping) + self._properties[name] = (db_name, data_type) + def __repr__(self): return '<{}(type={}, label={}, properties={})'.format( diff --git a/tests/test_engine.py b/tests/test_engine.py index 5501420..061293a 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -209,11 +209,11 @@ class TestEngine(unittest.TestCase): session.add(leif, jon, works_for) await session.flush() result = await session.traversal(TestVertex).has( - ('k1', 'test_vertex__name'), ('v1', 'the one and only leifur'))._in().all() + TestVertex.__mapping__.name, ('v1', 'the one and only leifur'))._in().all() async for msg in result: self.assertIs(msg, jon) result = await session.traversal(TestVertex).has( - ('k1', 'test_vertex__name'), ('v1', 'the one and only jonathan')).out().all() + TestVertex.__mapping__.name, ('v1', 'the one and only jonathan')).out().all() async for msg in result: self.assertIs(msg, leif) await session.remove_vertex(leif) -- GitLab