def test_add_term(self): actual = OboDocument() term = actual.add_term() term.id = TestDocument.A_TERM_ID expected = OboDocument() expected_term = OboTerm() expected_term.id = TestDocument.A_TERM_ID expected.terms = [expected_term] self.assertDocumentEquals(actual, expected)
class OboDocumentBuilder: def __init__(self): self.document = OboDocument() self.scope = self.document.header self.qualifiers = {} self.xrefs = [] def term(self): self.scope = self.document.add_term() def add_xref(self, xref, description): self.xrefs.append(OboXref(xref, description)) def def_tag_value(self, value): definition = OboDef(value, self.xrefs) self.xrefs = [] self.scope.def_ = definition self._process_qualifiers("def_") def typedef(self): self.scope = self.document.add_typedef() def xref_tag(self): if len(self.xrefs) != 1: raise OboDocumentBuildingError.expected_only_one_xref(self.xrefs) self.scope.xref = self.xrefs.pop() self._process_qualifiers("xref") def tag_value_pair(self, tag, value): attribute = OboDocumentBuilder._extract_attribute(tag) self._ensure_attribute_is_defined(attribute) self._set_attribute_value(tag, attribute, value) self._process_qualifiers(attribute) def _process_qualifiers(self, attribute): if len(self.qualifiers) > 0: self.scope.add_qualifiers(attribute, self.qualifiers) self.qualifiers = {} def boolean_tag_value_pair(self, tag, boolean_value): attribute = OboDocumentBuilder._extract_attribute(tag) self._set_boolean_attribute_value(tag, attribute, boolean_value) self._process_qualifiers(attribute) def qualifier(self, id, value): self.qualifiers[id] = value def _set_attribute_value(self, tag, attribute, value): current_value = self.scope.__dict__.get(attribute) if current_value is None: self.scope.__dict__[attribute] = value return if type(current_value) == list: current_value.append(value) return if current_value != value: raise OboDocumentBuildingError.invalid_tag_pair_merge( tag, current_value, value) def _set_boolean_attribute_value(self, tag, attribute, value): current_value = self.scope.__dict__.get(attribute) if current_value is None: self.scope.__dict__[attribute] = value return if type(current_value) == list: raise OboDocumentBuildingError.unexpected_boolean_value( tag, current_value, value) if current_value != value: raise OboDocumentBuildingError.invalid_tag_pair_merge( tag, current_value, value) def _ensure_attribute_is_defined(self, attribute): if attribute not in self.scope.__dict__: self.scope.__dict__[attribute] = [] @staticmethod def _extract_attribute(tag): attribute = tag.replace("-", "_") if attribute == "version": return "data_version" if attribute == "import": return "import_" if attribute == "def": return "def_" return attribute