Source code for pybel.struct.filters.node_predicates.modifications

# -*- coding: utf-8 -*-

"""Predicates for checking nodes' variants."""

from functools import wraps
from typing import Tuple, Type, Union

from .utils import node_predicate
from ..typing import NodePredicate
from ....dsl import (
    BaseEntity,
    CentralDogma,
    Fragment,
    GeneModification,
    Hgvs,
    ProteinModification,
    Variant,
)

__all__ = [
    "has_variant",
    "has_protein_modification",
    "has_gene_modification",
    "has_fragment",
    "has_hgvs",
]


[docs]@node_predicate def has_variant(node: BaseEntity) -> bool: """Return true if the node has any variants.""" return isinstance(node, CentralDogma) and node.variants
def _variant_checker(variant_cls: Union[Type[Variant], Tuple[Type[Variant], ...]]) -> NodePredicate: @node_predicate @wraps(node_has_variant) def _rv(node: BaseEntity): return node_has_variant(node, variant_cls) return _rv def node_has_variant(node: BaseEntity, variant_cls) -> bool: """Return true if the node has at least one of the given variant.""" return ( isinstance(node, CentralDogma) and node.variants and any(isinstance(variant, variant_cls) for variant in node.variants) ) has_protein_modification = _variant_checker(ProteinModification) has_gene_modification = _variant_checker(GeneModification) has_hgvs = _variant_checker(Hgvs) has_fragment = _variant_checker(Fragment)