Example #1
0
    def __new__(mcs, name, bases, namespace):
        namespace['DoesNotExist'] = \
            type(name + 'DoesNotExist', (DoesNotExist,), {})
        cls = super(NodeMeta, mcs).__new__(mcs, name, bases, namespace)
        # needed by Python < 3.5 for unpickling DoesNotExist objects:
        cls.DoesNotExist._model_class = cls

        if hasattr(cls, '__abstract_node__'):
            delattr(cls, '__abstract_node__')
        else:
            if 'deleted' in namespace:
                raise ValueError("Class property called 'deleted' conflicts "
                                 "with neomodel internals.")
            for key, value in ((x, y) for x, y in namespace.items()
                               if isinstance(y, Property)):
                value.name, value.owner = key, cls
                if hasattr(value, 'setup') and callable(value.setup):
                    value.setup()

            # cache various groups of properies
            cls.__required_properties__ = tuple(
                name for name, property in cls.defined_properties(
                    aliases=False, rels=False).items()
                if property.required or property.unique_index)
            cls.__all_properties__ = tuple(
                cls.defined_properties(aliases=False, rels=False).items())
            cls.__all_aliases__ = tuple(
                cls.defined_properties(properties=False, rels=False).items())
            cls.__all_relationships__ = tuple(
                cls.defined_properties(aliases=False,
                                       properties=False).items())

            cls.__label__ = namespace.get('__label__', name)
            cls.__optional_labels__ = namespace.get('__optional_labels__', [])

            if config.AUTO_INSTALL_LABELS:
                install_labels(cls, quiet=False)

            base_label_set = frozenset(cls.inherited_labels())
            optional_label_set = set(cls.inherited_optional_labels())

            # Construct all possible combinations of labels + optional labels
            possible_label_combinations = [
                frozenset(set(x).union(base_label_set))
                for i in range(1,
                               len(optional_label_set) + 1)
                for x in combinations(optional_label_set, i)
            ]
            possible_label_combinations.append(base_label_set)

            for label_set in possible_label_combinations:
                if label_set not in db._NODE_CLASS_REGISTRY:
                    db._NODE_CLASS_REGISTRY[label_set] = cls
                else:
                    raise ClassAlreadyDefined(cls, db._NODE_CLASS_REGISTRY)

        return cls
Example #2
0
    def __new__(mcs, name, bases, namespace):
        namespace["DoesNotExist"] = type(name + "DoesNotExist",
                                         (DoesNotExist, ), {})
        cls = super(NodeMeta, mcs).__new__(mcs, name, bases, namespace)
        # needed by Python < 3.5 for unpickling DoesNotExist objects:
        cls.DoesNotExist._model_class = cls

        if hasattr(cls, "__abstract_node__"):
            delattr(cls, "__abstract_node__")
        else:
            if "deleted" in namespace:
                raise ValueError("Class property called 'deleted' conflicts "
                                 "with neomodel internals.")
            for key, value in ((x, y) for x, y in namespace.items()
                               if isinstance(y, Property)):
                value.name, value.owner = key, cls
                if hasattr(value, "setup") and callable(value.setup):
                    value.setup()

            # cache various groups of properies
            cls.__required_properties__ = tuple(
                name for name, property in cls.defined_properties(
                    aliases=False, rels=False).items()
                if property.required or property.unique_index)
            cls.__all_properties__ = tuple(
                cls.defined_properties(aliases=False, rels=False).items())
            cls.__all_aliases__ = tuple(
                cls.defined_properties(properties=False, rels=False).items())
            cls.__all_relationships__ = tuple(
                cls.defined_properties(aliases=False,
                                       properties=False).items())

            cls.__label__ = namespace.get("__label__", name)

            if config.AUTO_INSTALL_LABELS:
                install_labels(cls, quiet=False)

            label_set = frozenset(cls.inherited_labels())
            if label_set not in db._NODE_CLASS_REGISTRY:
                db._NODE_CLASS_REGISTRY[label_set] = cls
            else:
                raise ClassAlreadyDefined(cls, db._NODE_CLASS_REGISTRY)

        return cls