Source code for owmeta_core.mapped_class

from __future__ import print_function

import logging
import importlib as IM

import six
import rdflib as R

from .context_mapped_class_util import find_base_namespace

L = logging.getLogger(__name__)


[docs]class MappedClass(type): """A type for MappedClasses Sets up the graph with things needed for MappedClasses """ def __init__(self, name, bases, dct): L.debug("INITIALIZING %s", name) super(MappedClass, self).__init__(name, bases, dct) self.__base_namespace = find_base_namespace(dct, bases) self.__rdf_type = None # Set the rdf_type early if 'rdf_type' in dct: self.__rdf_type = R.URIRef(dct['rdf_type']) if self.__rdf_type is None: self.__rdf_type = self.base_namespace[self.__name__] self.__rdf_namespace = None rdf_ns = dct.get('rdf_namespace', None) if rdf_ns is not None: L.debug("Setting rdf_namespace to {}".format(rdf_ns)) if not isinstance(rdf_ns, R.Namespace): rdf_ns = R.Namespace(rdf_ns) self.__rdf_namespace = rdf_ns self.__schema_namespace = None schema_ns = dct.get('schema_namespace', None) if schema_ns is not None: L.debug("Setting schema_namespace to {}".format(schema_ns)) if not isinstance(schema_ns, R.Namespace): schema_ns = R.Namespace(schema_ns) self.__schema_namespace = schema_ns if self.__rdf_namespace is None: if self.base_data_namespace is not None: rdf_namespace = self.base_data_namespace[self.__name__] + '#' else: rdf_namespace = self.base_namespace[self.__name__] + '#' L.debug("Setting rdf_namespace to {}".format(rdf_namespace)) self.__rdf_namespace = R.Namespace(rdf_namespace) if self.__schema_namespace is None: L.debug("Setting schema_namespace to {}".format(self.base_namespace[self.__name__] + '/')) self.__schema_namespace = R.Namespace( self.base_namespace[self.__name__] + "/") self.__rdf_type_object_callback = dct.get('rdf_type_object_callback') self.__rdf_type_object = dct.get('rdf_type_object') if not getattr(self, 'unmapped', False) and not dct.get('unmapped'): self.register_on_module()
[docs] def register_on_module(self, module=None): ''' "Registers" this class on a module (typically the one in which the class is defined) such that owmeta-core functions can locate it. This happens automatically when the class is defined unless the 'unmapped' attribute is defined and set to `True`. This mechanism necessary in some cases where classes are generated dynamically or in a method and aren't necessarily assigned to attributes on the module where they are defined. ''' module = module or IM.import_module(self.__module__) if not hasattr(module, '__yarom_mapped_classes__'): module.__yarom_mapped_classes__ = [self] else: module.__yarom_mapped_classes__.append(self)
@property def base_namespace(self): return self.__base_namespace @property def rdf_type_object(self): if self.__rdf_type_object_callback is not None: rdto = self.__rdf_type_object_callback() if rdto is not None: self.__rdf_type_object_callback = None self.__rdf_type_object = rdto return self.__rdf_type_object @rdf_type_object.setter def rdf_type_object(self, value): if value is not None: self.__rdf_type_object_callback = None self.__rdf_type_object = value @property def rdf_type(self): return self.__rdf_type @rdf_type.setter def rdf_type(self, new_type): if not isinstance(new_type, R.URIRef) and \ isinstance(new_type, (str, six.text_type)): new_type = R.URIRef(new_type) self.__rdf_type = new_type @property def rdf_namespace(self): return self.__rdf_namespace @property def schema_namespace(self): return self.__schema_namespace def __lt__(self, other): res = False if issubclass(other, self) and not issubclass(self, other): res = True elif issubclass(self, other) == issubclass(other, self): res = self.__name__ < other.__name__ return res
[docs] def on_mapper_add_class(self, mapper): """ Called by :class:`owmeta_core.mapper.Mapper` Registers certain properties of the class """ return self