Source code for ppsc.v202._meta_data

import typing

import phenopackets as pp202
from google.protobuf.message import Message

from ._base import ExternalReference
from .._api import MessageMixin
from .._timestamp import Timestamp
from ..parse import extract_message_scalar, extract_message_sequence, extract_pb_message_scalar, extract_pb_message_seq


[docs] class Resource(MessageMixin): def __init__( self, id: str, name: str, url: str, version: str, namespace_prefix: str, iri_prefix: str, ): self._id = id self._name = name self._url = url self._version = version self._namespace_prefix = namespace_prefix self._iri_prefix = iri_prefix @property def id(self) -> str: return self._id @id.setter def id(self, value: str): self._id = value @property def name(self) -> str: return self._name @name.setter def name(self, value: str): self._name = value @property def url(self) -> str: return self._url @url.setter def url(self, value: str): self._url = value @property def version(self) -> str: return self._version @version.setter def version(self, value: str): self._version = value @property def namespace_prefix(self) -> str: return self._namespace_prefix @namespace_prefix.setter def namespace_prefix(self, value: str): self._namespace_prefix = value @property def iri_prefix(self) -> str: return self._iri_prefix @iri_prefix.setter def iri_prefix(self, value: str): self._iri_prefix = value
[docs] @staticmethod def field_names() -> typing.Iterable[str]: return 'id', 'name', 'url', 'version', 'namespace_prefix', 'iri_prefix'
[docs] @classmethod def required_fields(cls) -> typing.Sequence[str]: return 'id', 'name', 'url', 'version', 'namespace_prefix', 'iri_prefix'
[docs] @classmethod def from_dict(cls, values: typing.Mapping[str, typing.Any]): if cls._all_required_fields_are_present(values): return Resource( id=values['id'], name=values['name'], url=values['url'], version=values['version'], namespace_prefix=values['namespace_prefix'], iri_prefix=values['iri_prefix'], ) else: cls._complain_about_missing_field(values)
[docs] @classmethod def message_type(cls) -> typing.Type[Message]: return pp202.Resource
[docs] @classmethod def from_message(cls, msg: Message): if isinstance(msg, cls.message_type()): return Resource( id=msg.id, name=msg.name, url=msg.url, version=msg.version, namespace_prefix=msg.namespace_prefix, iri_prefix=msg.iri_prefix, ) else: cls.complain_about_incompatible_msg_type(msg)
[docs] def to_message(self) -> Message: return pp202.Resource( id=self._id, name=self._name, url=self._url, version=self._version, namespace_prefix=self._namespace_prefix, iri_prefix=self._iri_prefix, )
def __eq__(self, other): return isinstance(other, Resource) \ and self._id == other._id \ and self._name == other._name \ and self._url == other._url \ and self._version == other._version \ and self._namespace_prefix == other._namespace_prefix \ and self._iri_prefix == other._iri_prefix def __repr__(self): return (f'Resource(id={self._id}, ' f'name={self._name}, ' f'url={self._url}, ' f'version={self._version}, ' f'namespace_prefix={self._namespace_prefix}, ' f'iri_prefix={self._iri_prefix})')
[docs] class Update(MessageMixin): def __init__( self, timestamp: Timestamp, updated_by: typing.Optional[str] = None, comment: typing.Optional[str] = None, ): self._timestamp = timestamp self._updated_by = updated_by self._comment = comment @property def timestamp(self) -> Timestamp: return self._timestamp @timestamp.setter def timestamp(self, value: Timestamp): self._timestamp = value @property def updated_by(self) -> str: return self._updated_by @updated_by.setter def updated_by(self, value: str): self._updated_by = value @updated_by.deleter def updated_by(self): self._updated_by = None @property def comment(self) -> str: return self._comment @comment.setter def comment(self, value: str): self._comment = value @comment.deleter def comment(self): self._comment = None
[docs] @staticmethod def field_names() -> typing.Iterable[str]: return 'timestamp', 'updated_by', 'comment'
[docs] @classmethod def required_fields(cls) -> typing.Sequence[str]: return 'timestamp',
[docs] @classmethod def from_dict(cls, values: typing.Mapping[str, typing.Any]): if cls._all_required_fields_are_present(values): return Update( timestamp=extract_message_scalar('timestamp', Timestamp, values), updated_by=values.get('updated_by', None), comment=values.get('comment', None), ) else: cls._complain_about_missing_field(values)
[docs] @classmethod def message_type(cls) -> typing.Type[Message]: return pp202.Update
[docs] @classmethod def from_message(cls, msg: Message): if isinstance(msg, cls.message_type()): return Update( timestamp=extract_pb_message_scalar('timestamp', Timestamp, msg), updated_by=None if msg.updated_by == '' else msg.updated_by, comment=None if msg.comment == '' else msg.comment, ) else: cls.complain_about_incompatible_msg_type(msg)
[docs] def to_message(self) -> Message: update = pp202.Update(timestamp=self._timestamp.to_message(), ) if self._updated_by is not None: update.updated_by = self._updated_by if self._comment is not None: update.comment = self._comment return update
def __eq__(self, other): return isinstance(other, Update) \ and self._timestamp == other._timestamp \ and self._updated_by == other._updated_by \ and self._comment == other._comment def __repr__(self): return f'Update(timestamp={self._timestamp}, updated_by={self._updated_by}, comment={self._comment})'
[docs] class MetaData(MessageMixin): # TODO: this entire class must be implemented! def __init__( self, created: Timestamp, created_by: str, submitted_by: typing.Optional[str] = None, resources: typing.Optional[typing.Iterable[Resource]] = None, updates: typing.Optional[typing.Iterable[Update]] = None, phenopacket_schema_version: str = '2.0.2', external_references: typing.Optional[typing.Iterable[ExternalReference]] = None, ): self._created = created self._created_by = created_by self._submitted_by = submitted_by self._resources = [] if resources is None else list(resources) self._updates = [] if updates is None else list(updates) self._phenopacket_schema_version = phenopacket_schema_version self._external_references = [] if external_references is None else list(external_references) @property def created(self) -> Timestamp: return self._created @created.setter def created(self, value: Timestamp): self._created = value @property def created_by(self) -> str: return self._created_by @created_by.setter def created_by(self, value: str): self._created_by = value @property def submitted_by(self) -> typing.Optional[str]: return self._submitted_by @submitted_by.setter def submitted_by(self, value: typing.Optional[str]): self._submitted_by = value @submitted_by.deleter def submitted_by(self): self._submitted_by = None @property def resources(self) -> typing.MutableSequence[Resource]: return self._resources @property def updates(self) -> typing.MutableSequence[Update]: return self._updates @property def phenopacket_schema_version(self) -> str: return self._phenopacket_schema_version @phenopacket_schema_version.setter def phenopacket_schema_version(self, value: str): self._phenopacket_schema_version = value @property def external_references(self) -> typing.MutableSequence[ExternalReference]: return self._external_references
[docs] @staticmethod def field_names() -> typing.Iterable[str]: return 'created', 'created_by', 'submitted_by', 'resources', 'updates', 'phenopacket_schema_version', 'external_references'
[docs] @classmethod def required_fields(cls) -> typing.Sequence[str]: return 'created', 'created_by', 'phenopacket_schema_version',
[docs] @classmethod def from_dict(cls, values: typing.Mapping[str, typing.Any]): if cls._all_required_fields_are_present(values): return MetaData( created=Timestamp.from_str(values['created']), created_by=values['created_by'], submitted_by=values.get('submitted_by', None), resources=extract_message_sequence('resources', Resource, values), updates=extract_message_sequence('updates', Update, values), phenopacket_schema_version=values['phenopacket_schema_version'], external_references=extract_message_sequence('external_references', ExternalReference, values), ) else: cls._complain_about_missing_field(values)
[docs] def to_message(self) -> Message: meta_data = pp202.MetaData( created=self._created.to_message(), created_by=self._created_by, phenopacket_schema_version=self._phenopacket_schema_version, ) if self._submitted_by is not None: meta_data.submitted_by = self._submitted_by meta_data.resources.extend(r.to_message() for r in self._resources) meta_data.resources.extend(u.to_message() for u in self._updates) meta_data.external_references.extend(er.to_message() for er in self._external_references) return meta_data
[docs] @classmethod def message_type(cls) -> typing.Type[Message]: return pp202.MetaData
[docs] @classmethod def from_message(cls, msg: Message): if isinstance(msg, pp202.MetaData): return MetaData( created=extract_pb_message_scalar('created', Timestamp, msg), created_by=msg.created_by, submitted_by=None if msg.submitted_by == '' else msg.submitted_by, resources=extract_pb_message_seq('resources', Resource, msg), updates=extract_pb_message_seq('updates', Update, msg), phenopacket_schema_version=msg.phenopacket_schema_version, external_references=extract_pb_message_seq('external_references', ExternalReference, msg), ) else: cls.complain_about_incompatible_msg_type(msg)
def __eq__(self, other): return isinstance(other, MetaData) \ and self._created == other._created \ and self._created_by == other._created_by \ and self._submitted_by == other._submitted_by \ and self._resources == other._resources \ and self._updates == other._updates \ and self._phenopacket_schema_version == other._phenopacket_schema_version \ and self._external_references == other._external_references def __repr__(self): return (f'MetaData(' f'created={self._created}, ' f'created_by={self._created_by}, ' f'submitted_by={self._submitted_by}, ' f'resources={self._resources}, ' f'updates={self._updates}, ' f'phenopacket_schema_version={self._phenopacket_schema_version}, ' f'external_references={self._external_references})')