Source code for pronto.pv
"""Object hierarchy of property-value annotations in OBO files.
"""
import abc
import functools
import fastobo
from .utils.meta import roundrepr, typechecked
__all__ = ["PropertyValue", "LiteralPropertyValue", "ResourcePropertyValue"]
class PropertyValue(abc.ABC):
"""A property-value, which adds annotations to an entity."""
property: str
__slots__ = ("property",)
@abc.abstractmethod
def __eq__(self, other: object):
return NotImplemented
@abc.abstractmethod
def __lt__(self, other: object):
return NotImplemented
[docs]
@roundrepr
@functools.total_ordering
class LiteralPropertyValue(PropertyValue):
"""A property-value which adds a literal annotation to an entity."""
literal: str
datatype: str
__slots__ = ("literal", "datatype")
[docs]
@typechecked()
def __init__(self, property: str, literal: str, datatype: str = "xsd:string"):
"""Create a new `LiteralPropertyValue` instance.
Arguments:
property (str): The annotation property, as an OBO identifier.
literal (str): The serialized value of the annotation.
datatype (str): The datatype of the annotation property value.
Defaults to `xsd:string`.
"""
if not fastobo.id.is_valid(property):
raise ValueError("invalid identifier: {}".format(property))
if not fastobo.id.is_valid(datatype):
raise ValueError("invalid identifier: {}".format(datatype))
self.property = property
self.literal = literal
self.datatype = datatype
[docs]
def __eq__(self, other: object) -> bool:
if isinstance(other, LiteralPropertyValue):
return (
self.property == other.property
and self.literal == other.literal
and self.datatype == other.datatype
)
return False
[docs]
def __lt__(self, other: object) -> bool:
if isinstance(other, LiteralPropertyValue):
return (self.property, self.literal, self.datatype) < (
other.property,
other.literal,
other.datatype,
)
elif isinstance(other, ResourcePropertyValue):
return self.property < other.property
else:
return NotImplemented
[docs]
def __hash__(self) -> int:
return hash((LiteralPropertyValue, self.property, self.literal, self.datatype))
[docs]
@roundrepr
@functools.total_ordering
class ResourcePropertyValue(PropertyValue):
"""A property-value which adds a resource annotation to an entity."""
resource: str
__slots__ = ("resource",)
[docs]
@typechecked()
def __init__(self, property: str, resource: str):
"""Create a new `ResourcePropertyValue` instance.
Arguments:
property (str): The annotation property, as an OBO identifier.
resource (str): The annotation entity value, as an OBO identifier.
"""
if not fastobo.id.is_valid(property):
raise ValueError("invalid identifier: {}".format(property))
if not fastobo.id.is_valid(resource):
raise ValueError("invalid identifier: {}".format(resource))
self.property = property
self.resource = resource
[docs]
def __eq__(self, other: object) -> bool:
if isinstance(other, ResourcePropertyValue):
return (self.property, self.resource) == (other.property, other.resource)
return False
[docs]
def __lt__(self, other: object) -> bool:
if isinstance(other, ResourcePropertyValue):
return (self.property, self.resource) < (other.property, other.resource)
elif isinstance(other, LiteralPropertyValue):
return self.property < other.property
else:
return NotImplemented
[docs]
def __hash__(self) -> int:
return hash((LiteralPropertyValue, self.property, self.resource))