Skip to content

Commit 16aafcf

Browse files
committed
Merge branch 'main' into cordis
2 parents f6b2f57 + c69ebf4 commit 16aafcf

3 files changed

Lines changed: 30 additions & 5 deletions

File tree

src/pyobo/struct/reference.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ def datetime(cls, dt: datetime_cls | str) -> OBOLiteral:
363363
def date(cls, dt: datetime_cls | date_cls | str) -> OBOLiteral:
364364
"""Get a datetime literal."""
365365
if isinstance(dt, str):
366-
dt = _parse_datetime(dt)
367-
if isinstance(dt, datetime.datetime):
366+
dt = datetime.date.fromisoformat(dt)
367+
elif isinstance(dt, datetime.datetime):
368368
dt = dt.date()
369369
return cls(dt.isoformat(), v.xsd_date, None)
370370

src/pyobo/struct/struct_utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -975,8 +975,7 @@ def _iterate_obo_relations(
975975
case OBOLiteral(dd, datatype, _language):
976976
if predicate in skip_predicate_literals:
977977
continue
978-
# TODO how to clean/escape value?
979-
end = f'"{dd}" {get_preferred_curie(datatype)}'
978+
end = f'"{_escape_literal(dd)}" {get_preferred_curie(datatype)}'
980979
name = None
981980
case curies.Reference(): # it's a reference
982981
if predicate in skip_predicate_objects:
@@ -995,6 +994,10 @@ def _iterate_obo_relations(
995994
yield start + end
996995

997996

997+
def _escape_literal(s: str) -> str:
998+
return s.replace('"', '\\"')
999+
1000+
9981001
def _reference_or_literal_key(x: Reference | OBOLiteral) -> tuple[int, Reference | OBOLiteral]:
9991002
if isinstance(x, Reference):
10001003
return 0, x

tests/test_struct/test_obo/test_struct_term.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,8 @@ def test_12_property_string_with_language(self) -> None:
713713

714714
def test_12_property_string_with_quote(self) -> None:
715715
"""Test emitting a string property literal with a quote in it."""
716+
# see pyobo.struct.struct_utils._escape_literal for
717+
# implementation of escaping for these literals
716718
term = Term(reference=LYSINE_DEHYDROGENASE_ACT)
717719
term.annotate_string(RO_DUMMY, '"value" added')
718720
self.assert_obo_stanza(
@@ -727,7 +729,7 @@ def test_12_property_string_with_quote(self) -> None:
727729
ofn="""\
728730
Declaration(Class(GO:0050069))
729731
AnnotationAssertion(rdfs:label GO:0050069 "lysine dehydrogenase activity")
730-
AnnotationAssertion(RO:1234567 GO:0050069 "\\"value\\" added"@en)
732+
AnnotationAssertion(RO:1234567 GO:0050069 "\\"value\\" added"^^xsd:string)
731733
""",
732734
)
733735

@@ -791,6 +793,26 @@ def test_12_property_year(self) -> None:
791793
typedefs={RO_DUMMY.pair: RO_DUMMY},
792794
)
793795

796+
def test_12_property_date(self) -> None:
797+
"""Test emitting property literals that were annotated as a date."""
798+
term = Term(reference=LYSINE_DEHYDROGENASE_ACT)
799+
term.annotate_date(RO_DUMMY, "1993-01-01")
800+
self.assert_obo_stanza(
801+
term,
802+
obo="""\
803+
[Term]
804+
id: GO:0050069
805+
name: lysine dehydrogenase activity
806+
property_value: RO:1234567 "1993-01-01" xsd:date
807+
""",
808+
ofn="""\
809+
Declaration(Class(GO:0050069))
810+
AnnotationAssertion(rdfs:label GO:0050069 "lysine dehydrogenase activity")
811+
AnnotationAssertion(RO:1234567 GO:0050069 "1993-01-01"^^xsd:date)
812+
""",
813+
typedefs={RO_DUMMY.pair: RO_DUMMY},
814+
)
815+
794816
def test_12_property_object(self) -> None:
795817
"""Test emitting property literals."""
796818
term = Term(reference=LYSINE_DEHYDROGENASE_ACT)

0 commit comments

Comments
 (0)