Skip to content

Commit 9cc20fc

Browse files
authored
Handle ontology IRI and ontology version IRI (#431)
Closes #430
1 parent c50ec69 commit 9cc20fc

4 files changed

Lines changed: 71 additions & 5 deletions

File tree

src/pyobo/struct/functional/obo_to_functional.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,15 @@ def get_ofn_from_obo(
3939
prefix = obo_ontology.ontology
4040
base = f"{_BASE}/{prefix}"
4141
if iri is None:
42-
iri = f"{base}/{prefix}.ofn"
43-
if version_iri is None and obo_ontology.data_version:
44-
version_iri = f"{base}/{obo_ontology.data_version}/{prefix}.ofn"
42+
if obo_ontology.ontology_iri:
43+
iri = obo_ontology.ontology_iri
44+
else:
45+
iri = f"{base}/{prefix}.ofn"
46+
if version_iri is None:
47+
if obo_ontology.ontology_version_iri:
48+
version_iri = obo_ontology.ontology_version_iri
49+
elif obo_ontology.data_version:
50+
version_iri = f"{base}/{obo_ontology.data_version}/{prefix}.ofn"
4551
ofn_ontology = Ontology(
4652
iri=iri,
4753
version_iri=version_iri,

src/pyobo/struct/obograph/export.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,12 @@ def to_parsed_obograph(obo: Obo) -> og.StandardizedGraphDocument:
7070

7171

7272
def _to_parsed_graph(obo: Obo) -> og.StandardizedGraph:
73+
if obo.ontology_iri:
74+
ontology_iri = obo.ontology_iri
75+
else:
76+
ontology_iri = f"http://purl.obolibrary.org/obo/{obo.ontology}.owl"
7377
return og.StandardizedGraph(
74-
id=f"http://purl.obolibrary.org/obo/{obo.ontology}.owl",
78+
id=ontology_iri,
7579
meta=_get_meta(obo),
7680
nodes=_get_nodes(obo),
7781
edges=_get_edges(obo),
@@ -167,7 +171,9 @@ def _get_meta(obo: Obo) -> og.StandardizedMeta | None:
167171
)
168172
)
169173

170-
if obo.data_version:
174+
if obo.ontology_version_iri:
175+
version_iri = obo.ontology_version_iri
176+
elif obo.data_version:
171177
version_iri = (
172178
f"http://purl.obolibrary.org/obo/{obo.ontology}/{obo.data_version}/{obo.ontology}.owl"
173179
)

src/pyobo/struct/struct.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,10 @@ class Obo:
594594

595595
imports: ClassVar[list[str] | None] = None
596596

597+
ontology_iri: ClassVar[str | None] = None
598+
599+
ontology_version_iri: ClassVar[str | None] = None
600+
597601
def __post_init__(self):
598602
"""Run post-init checks."""
599603
if self.ontology is None:
@@ -2319,6 +2323,8 @@ def build_ontology(
23192323
mailing_list: str | None = None,
23202324
logo: str | None = None,
23212325
repository: str | None = None,
2326+
ontology_iri: str | None = None,
2327+
ontology_version_iri: str | None = None,
23222328
) -> Obo:
23232329
"""Build an ontology from parts."""
23242330
if name is None:
@@ -2378,6 +2384,8 @@ def build_ontology(
23782384
_subsetdefs=subsetdefs,
23792385
_property_values=properties,
23802386
_imports=imports,
2387+
_ontology_iri=ontology_iri,
2388+
_ontology_version_iri=ontology_version_iri,
23812389
terms=terms,
23822390
)
23832391

@@ -2395,6 +2403,8 @@ def make_ad_hoc_ontology(
23952403
_subsetdefs: list[tuple[Reference, str]] | None = None,
23962404
_property_values: list[Annotation] | None = None,
23972405
_imports: list[str] | None = None,
2406+
_ontology_iri: str | None = None,
2407+
_ontology_version_iri: str | None = None,
23982408
*,
23992409
terms: list[Term] | None = None,
24002410
) -> Obo:
@@ -2413,6 +2423,8 @@ class AdHocOntology(AdHocOntologyBase):
24132423
subsetdefs = _subsetdefs
24142424
property_values = _property_values
24152425
imports = _imports
2426+
ontology_iri = _ontology_iri
2427+
ontology_version_iri = _ontology_version_iri
24162428

24172429
def __post_init__(self):
24182430
self.date = _date

tests/test_struct/test_obo/test_struct_obo.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,3 +459,45 @@ def test_18_properties_external(self) -> None:
459459
""",
460460
ontology,
461461
)
462+
463+
def test_ontology_iri(self) -> None:
464+
"""Test adding an ontology IRI."""
465+
ontology = build_ontology(
466+
prefix="xxx",
467+
ontology_iri="https://example.org/xxx.owl",
468+
)
469+
self.assert_obo_lines(
470+
r"""
471+
format-version: 1.4
472+
ontology: xxx
473+
""",
474+
ontology,
475+
)
476+
self.assert_ofn_lines(
477+
"""
478+
Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
479+
Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
480+
Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)
481+
Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
482+
483+
Ontology(<https://example.org/xxx.owl>
484+
485+
)
486+
""",
487+
ontology,
488+
)
489+
self.assert_owl_lines(
490+
"""
491+
<?xml version="1.0"?>
492+
<rdf:RDF xmlns="https://example.org/xxx.owl#"
493+
xml:base="https://example.org/xxx.owl"
494+
xmlns:owl="http://www.w3.org/2002/07/owl#"
495+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
496+
xmlns:xml="http://www.w3.org/XML/1998/namespace"
497+
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
498+
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
499+
<owl:Ontology rdf:about="https://example.org/xxx.owl"/>
500+
</rdf:RDF>
501+
""",
502+
ontology,
503+
)

0 commit comments

Comments
 (0)