Source code for goblin.abc

import abc
import logging

from gremlin_python.process.traversal import Cardinality

from goblin import element, exception, manager

logger = logging.getLogger(__name__)


[docs]class DataType(abc.ABC): """ Abstract base class for Goblin Data Types. All custom data types should inherit from :py:class:`DataType`. """ def __init__(self, val=None): if val: val = self.validate(val) self._val = val
[docs] @abc.abstractmethod def validate(self, val): """Validate property value""" return val
[docs] @abc.abstractmethod def to_db(self, val=None): """ Convert property value to db compatible format. If no value passed, try to use default bound value """ if val is None: val = self._val return val
[docs] @abc.abstractmethod def to_ogm(self, val): """Convert property value to a Python compatible format""" return val
[docs] def validate_vertex_prop(self, val, card, vertex_prop, data_type): if card == Cardinality.list_: if isinstance(val, list): val = val elif isinstance(val, (set, tuple)): val = list(val) else: val = [val] vertex_props = [] for v in val: vp = vertex_prop(data_type, card=card) vp.value = self.validate(v) vertex_props.append(vp) val = manager.ListVertexPropertyManager(data_type, vertex_prop, card, vertex_props) elif card == Cardinality.set_: if isinstance(val, set): val = val elif isinstance(val, (list, tuple)): val = set(val) else: val = set([val]) vertex_props = set([]) for v in val: if not isinstance(v, element.VertexProperty): vp = vertex_prop(data_type, card=card) vp.value = self.validate(v) else: vp = v vertex_props.add(vp) val = manager.SetVertexPropertyManager(data_type, vertex_prop, card, vertex_props) else: vp = vertex_prop(data_type) vp.value = self.validate(val) val = vp return val
[docs]class BaseProperty: """Abstract base class that implements the property interface""" @property def data_type(self): raise NotImplementedError