Module nafparserpy.layers.utils

Expand source code
from dataclasses import dataclass, field

from lxml import etree


class AttributeGetter:
    """Provides an attribute getter"""
    def get(self, attribute):
        """Get attribute from `attrs` field

        Parameters
        ----------
        attribute : str
            attribute name

        Raises
        ------
        KeyError: if the layer has no such attribute"""
        if self.has(attribute):
            return self.attrs[attribute]
        else:
            raise KeyError('Attribute {} is not present in layer:\n{}'.format(attribute, self))

    def has(self, attribute):
        """Test if attribute appears in `attrs` field"""
        return self.attrs is not None and attribute in self.attrs.keys()


class IdrefGetter:
    """Provides a target ids getter for layers with a `span` field"""
    def target_ids(self):
        """Return list of target ids covered by the layer's span"""
        if self.span is None:
            return []
        return [t.id for t in self.span.targets]


class ExternalReferenceHolder:
    """Provides add/get method for external references"""
    def add_external_ref(self, external_ref):
        self.external_references.items.append(external_ref)

    def get_external_refs(self):
        return [x.reference for x in self.external_references.items]


@dataclass
class AttributeLayer(AttributeGetter):
    """A layer containing only attributes"""
    layer: str
    attrs: dict = field(default_factory=dict)
    """optional attributes (keys are subclass dependent)"""

    def node(self):
        """Create etree node from object"""
        return create_node(self.layer, None, [], self.attrs)

    @staticmethod
    def object(layer_name, node):
        """Create object from etree node"""
        return AttributeLayer(layer_name, node.attrib)

    def is_none(self):
        return not self.attrs


def create_node(layer, text, children, attributes):
    """Create an etree Element node from the text, children and attributes of NAF objects

    Parameters
    ----------
    layer : str
        layer name
    text : str
        text of node
    children : list
        list of NAF objects to add as subelements in the node
    attributes : dict
        node attributes (whether compulsory or optional)
    """
    node = etree.Element(layer)
    if text is not None:
        node.text = etree.CDATA(text)
    for child in children:
        # create node for each child and append to node subelements
        node.append(child.node())
    for k, v in attributes.items():
        node.set(k, v)
    return node

Functions

def create_node(layer, text, children, attributes)

Create an etree Element node from the text, children and attributes of NAF objects

Parameters

layer : str
layer name
text : str
text of node
children : list
list of NAF objects to add as subelements in the node
attributes : dict
node attributes (whether compulsory or optional)
Expand source code
def create_node(layer, text, children, attributes):
    """Create an etree Element node from the text, children and attributes of NAF objects

    Parameters
    ----------
    layer : str
        layer name
    text : str
        text of node
    children : list
        list of NAF objects to add as subelements in the node
    attributes : dict
        node attributes (whether compulsory or optional)
    """
    node = etree.Element(layer)
    if text is not None:
        node.text = etree.CDATA(text)
    for child in children:
        # create node for each child and append to node subelements
        node.append(child.node())
    for k, v in attributes.items():
        node.set(k, v)
    return node

Classes

class AttributeGetter

Provides an attribute getter

Expand source code
class AttributeGetter:
    """Provides an attribute getter"""
    def get(self, attribute):
        """Get attribute from `attrs` field

        Parameters
        ----------
        attribute : str
            attribute name

        Raises
        ------
        KeyError: if the layer has no such attribute"""
        if self.has(attribute):
            return self.attrs[attribute]
        else:
            raise KeyError('Attribute {} is not present in layer:\n{}'.format(attribute, self))

    def has(self, attribute):
        """Test if attribute appears in `attrs` field"""
        return self.attrs is not None and attribute in self.attrs.keys()

Subclasses

Methods

def get(self, attribute)

Get attribute from attrs field

Parameters

attribute : str
attribute name

Raises

KeyError : if the layer has no such attribute
 
Expand source code
def get(self, attribute):
    """Get attribute from `attrs` field

    Parameters
    ----------
    attribute : str
        attribute name

    Raises
    ------
    KeyError: if the layer has no such attribute"""
    if self.has(attribute):
        return self.attrs[attribute]
    else:
        raise KeyError('Attribute {} is not present in layer:\n{}'.format(attribute, self))
def has(self, attribute)

Test if attribute appears in attrs field

Expand source code
def has(self, attribute):
    """Test if attribute appears in `attrs` field"""
    return self.attrs is not None and attribute in self.attrs.keys()
class AttributeLayer (layer: str, attrs: dict = <factory>)

A layer containing only attributes

Expand source code
@dataclass
class AttributeLayer(AttributeGetter):
    """A layer containing only attributes"""
    layer: str
    attrs: dict = field(default_factory=dict)
    """optional attributes (keys are subclass dependent)"""

    def node(self):
        """Create etree node from object"""
        return create_node(self.layer, None, [], self.attrs)

    @staticmethod
    def object(layer_name, node):
        """Create object from etree node"""
        return AttributeLayer(layer_name, node.attrib)

    def is_none(self):
        return not self.attrs

Ancestors

Subclasses

Class variables

var attrs : dict

optional attributes (keys are subclass dependent)

var layer : str

Static methods

def object(layer_name, node)

Create object from etree node

Expand source code
@staticmethod
def object(layer_name, node):
    """Create object from etree node"""
    return AttributeLayer(layer_name, node.attrib)

Methods

def is_none(self)
Expand source code
def is_none(self):
    return not self.attrs
def node(self)

Create etree node from object

Expand source code
def node(self):
    """Create etree node from object"""
    return create_node(self.layer, None, [], self.attrs)

Inherited members

class ExternalReferenceHolder

Provides add/get method for external references

Expand source code
class ExternalReferenceHolder:
    """Provides add/get method for external references"""
    def add_external_ref(self, external_ref):
        self.external_references.items.append(external_ref)

    def get_external_refs(self):
        return [x.reference for x in self.external_references.items]

Subclasses

Methods

def add_external_ref(self, external_ref)
Expand source code
def add_external_ref(self, external_ref):
    self.external_references.items.append(external_ref)
def get_external_refs(self)
Expand source code
def get_external_refs(self):
    return [x.reference for x in self.external_references.items]
class IdrefGetter

Provides a target ids getter for layers with a span field

Expand source code
class IdrefGetter:
    """Provides a target ids getter for layers with a `span` field"""
    def target_ids(self):
        """Return list of target ids covered by the layer's span"""
        if self.span is None:
            return []
        return [t.id for t in self.span.targets]

Subclasses

Methods

def target_ids(self)

Return list of target ids covered by the layer's span

Expand source code
def target_ids(self):
    """Return list of target ids covered by the layer's span"""
    if self.span is None:
        return []
    return [t.id for t in self.span.targets]