def __new__(cls, name, bases, namespace, **kwds): props = {} if name == 'VertexProperty': element_type = name.lower() elif bases: element_type = bases[0].__type__ if element_type not in ['vertex', 'edge']: element_type = bases[0].__name__.lower() for base in bases: base_props = getattr(base, '__properties__', {}) props.update(base_props) else: element_type = name.lower() namespace['__type__'] = element_type if not namespace.get('__label__', None): namespace['__label__'] = inflection.underscore(name) new_namespace = {} props.pop('id', None) for k, v in namespace.items(): if isinstance(v, abc.BaseProperty): if element_type == 'edge' and hasattr(v, 'cardinality'): raise exception.MappingError( 'Edge property cannot have set/list cardinality') props[k] = v if k != 'id': if not v.db_name: v.db_name = v.db_name_factory(k, namespace['__label__']) v = v.__descriptor__(k, v) new_namespace[k] = v new_namespace['__mapping__'] = mapper.create_mapping(namespace, props) new_namespace['__properties__'] = props result = type.__new__(cls, name, bases, new_namespace) return result
def __getattr__(self, value): try: mapping, _ = self._ogm_properties[value] return mapping except KeyError: raise exception.MappingError( "unrecognized property {} for class: {}".format( value, self._element_type))
def _map_properties(self, properties): for name, prop in properties.items(): data_type = prop.data_type if prop.db_name: db_name = prop.db_name else: db_name = name if hasattr(prop, '__mapping__'): if not self._element_type == 'vertex': raise exception.MappingError( 'Only vertices can have vertex properties') self._db_properties[db_name] = (name, data_type) self._ogm_properties[name] = (db_name, data_type)