import typing
import phenopackets as pp202
from google.protobuf.message import Message
from ._base import OntologyClass, TimeElement, Evidence
from .._api import MessageMixin
from ..parse import extract_message_scalar, extract_message_sequence, extract_pb_message_scalar, extract_pb_message_seq
[docs]
class PhenotypicFeature(MessageMixin):
def __init__(
self,
type: OntologyClass,
excluded: bool = False,
description: typing.Optional[str] = None,
severity: typing.Optional[OntologyClass] = None,
modifiers: typing.Optional[typing.Iterable[OntologyClass]] = None,
onset: typing.Optional[TimeElement] = None,
resolution: typing.Optional[TimeElement] = None,
evidence: typing.Optional[typing.Iterable[Evidence]] = None,
):
self._type = type
self._excluded = excluded
self._description = description
self._severity = severity
self._modifiers = [] if modifiers is None else list(modifiers)
self._onset = onset
self._resolution = resolution
self._evidence = [] if evidence is None else list(evidence)
@property
def type(self) -> OntologyClass:
return self._type
@type.setter
def type(self, value: OntologyClass):
self._type = value
@property
def excluded(self) -> bool:
return self._excluded
@excluded.setter
def excluded(self, value: bool):
self._excluded = value
@property
def description(self) -> typing.Optional[str]:
return self._description
@description.setter
def description(self, value: str):
self._description = value
@description.deleter
def description(self):
self._description = None
@property
def severity(self) -> typing.Optional[OntologyClass]:
return self._severity
@severity.setter
def severity(self, value: OntologyClass):
self._severity = value
@severity.deleter
def severity(self):
self._severity = None
@property
def modifiers(self) -> typing.MutableSequence[OntologyClass]:
return self._modifiers
@property
def onset(self) -> typing.Optional[TimeElement]:
return self._onset
@onset.setter
def onset(self, value: TimeElement):
self._onset = value
@onset.deleter
def onset(self):
self._onset = None
@property
def resolution(self) -> typing.Optional[TimeElement]:
return self._resolution
@resolution.setter
def resolution(self, value: TimeElement):
self._resolution = value
@resolution.deleter
def resolution(self):
self._resolution = None
@property
def evidence(self) -> typing.MutableSequence[Evidence]:
return self._evidence
[docs]
@staticmethod
def field_names() -> typing.Iterable[str]:
return 'type', 'excluded', 'description', 'severity', 'modifiers', 'onset', 'resolution', 'evidence'
[docs]
@classmethod
def required_fields(cls) -> typing.Sequence[str]:
return 'type',
[docs]
@classmethod
def from_dict(cls, values: typing.Mapping[str, typing.Any]):
if cls._all_required_fields_are_present(values):
return PhenotypicFeature(
type=extract_message_scalar('type', OntologyClass, values),
excluded=values['excluded'] if 'excluded' in values else False,
description=values['description'] if 'description' in values else None,
severity=extract_message_scalar('severity', OntologyClass, values),
modifiers=extract_message_sequence('modifiers', OntologyClass, values),
onset=extract_message_scalar('onset', TimeElement, values),
resolution=extract_message_scalar('resolution', TimeElement, values),
evidence=extract_message_sequence('evidence', Evidence, values),
)
else:
cls._complain_about_missing_field(values)
[docs]
def to_message(self) -> Message:
pf = pp202.PhenotypicFeature(
type=self._type.to_message(), excluded=self._excluded,
)
if self._description is not None:
pf.description = self._description
if self._severity is not None:
pf.severity.CopyFrom(self._severity.to_message())
pf.modifiers.extend(m.to_message() for m in self._modifiers)
if self._onset is not None:
pf.onset.CopyFrom(self._onset.to_message())
if self._resolution is not None:
pf.resolution.CopyFrom(self._resolution.to_message())
pf.evidence.extend(e.to_message() for e in self._evidence)
return pf
[docs]
@classmethod
def message_type(cls) -> typing.Type[Message]:
return pp202.PhenotypicFeature
[docs]
@classmethod
def from_message(cls, msg: Message):
if isinstance(msg, cls.message_type()):
return PhenotypicFeature(
type=extract_pb_message_scalar('type', OntologyClass, msg),
excluded=msg.excluded,
description=None if msg.description == '' else msg.description,
severity=extract_pb_message_scalar('severity', OntologyClass, msg),
modifiers=extract_pb_message_seq('modifiers', OntologyClass, msg),
onset=extract_pb_message_scalar('onset', TimeElement, msg),
resolution=extract_pb_message_scalar('resolution', TimeElement, msg),
evidence=extract_pb_message_seq('evidence', Evidence, msg),
)
else:
cls.complain_about_incompatible_msg_type(msg)
def __eq__(self, other):
return isinstance(other, PhenotypicFeature) \
and self._type == other._type \
and self._excluded == other._excluded \
and self._description == other._description \
and self._severity == other._severity \
and self._modifiers == other._modifiers \
and self._onset == other._onset \
and self._resolution == other._resolution \
and self._evidence == other._evidence
def __repr__(self):
return (f'PhenotypicFeature(type={self._type}, '
f'excluded={self._excluded}, '
f'description={self._description}, '
f'severity={self._severity}, '
f'modifiers={self._modifiers}, '
f'onset={self._onset}, '
f'resolution={self._resolution}, '
f'evidence={self._evidence})')