From bc2a91c68a7bc5caedef30c1cdeba38af892a402 Mon Sep 17 00:00:00 2001 From: francescalb Date: Wed, 24 Nov 2021 17:42:28 +0100 Subject: [PATCH 1/8] Removed duplicate infer_version from ontoversion. --- tools/ontoversion | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/tools/ontoversion b/tools/ontoversion index 74e10b2d6..fe08c9d9e 100755 --- a/tools/ontoversion +++ b/tools/ontoversion @@ -8,21 +8,9 @@ import argparse import sys import rdflib +from rdflib.exceptions import ParserError - -def infer_version(iri, version_iri): - """Infer version from IRI and versionIRI.""" - if str(version_iri[: len(iri)]) == str(iri): - version = version_iri[len(iri) :] - else: - counter = 0 - version_parts = [] - for index, _ in enumerate(iri): - while iri[index] != version_iri[index + counter]: - version_parts.append(version_iri[index + counter]) - counter += 1 - version = "".join(version_parts) - return version.lstrip("/").rstrip("/#") +from ontopy.utils import infer_version def main(): @@ -34,7 +22,7 @@ def main(): help="IRI/file to OWL source to extract the version from.", ) parser.add_argument( - "--format", "-f", default="xml", help='OWL format. Default is "xml".' + "--format", "-f", default="ttl", help='OWL format. Default is "ttl".' ) try: args = parser.parse_args() @@ -44,6 +32,15 @@ def main(): # Extract base IRI and versionIRI graph = rdflib.Graph() graph.parse(args.iri.rstrip("/#"), format=args.format) + try: + graph.parse(args.iri.rstrip("/#"), format=args.format) + except ParserError as err: + print( + "rdflib could not parse the ontology, check format. " + "Default format is ´ttl´." + ) + print(err) + sys.exit() iri, version_iri = list( graph.subject_objects( rdflib.URIRef("http://www.w3.org/2002/07/owl#versionIRI") From deb208e2e496cd47db0d470ca63dd1e7fbcd5b43 Mon Sep 17 00:00:00 2001 From: francescalb Date: Wed, 24 Nov 2021 21:39:15 +0100 Subject: [PATCH 2/8] Removed redundant infer_version in tools/ontoversion --- tools/ontoversion | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/ontoversion b/tools/ontoversion index fe08c9d9e..a3b2efa69 100755 --- a/tools/ontoversion +++ b/tools/ontoversion @@ -9,6 +9,8 @@ import sys import rdflib from rdflib.exceptions import ParserError +from xml.parsers.expat import ExpatError +from xml.sax._exceptions import SAXParseException from ontopy.utils import infer_version @@ -31,10 +33,9 @@ def main(): # Extract base IRI and versionIRI graph = rdflib.Graph() - graph.parse(args.iri.rstrip("/#"), format=args.format) try: graph.parse(args.iri.rstrip("/#"), format=args.format) - except ParserError as err: + except [ExpatError, SAXParseException] as err: print( "rdflib could not parse the ontology, check format. " "Default format is ´ttl´." From 8993e527e988327dc0d97a41778a12b129c74588 Mon Sep 17 00:00:00 2001 From: francescalb Date: Thu, 25 Nov 2021 21:07:23 +0100 Subject: [PATCH 3/8] Added versionINFO in ontology.get_version --- ontopy/ontology.py | 27 ++++++++++++++++++++------- tools/ontoversion | 23 ++++++++++++++++------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/ontopy/ontology.py b/ontopy/ontology.py index dc24614fc..5e4edab88 100644 --- a/ontopy/ontology.py +++ b/ontopy/ontology.py @@ -1053,21 +1053,34 @@ def is_defined(self, entity): def get_version(self, as_iri=False): """Returns the version number of the ontology as inferred from the - owl:versionIRI tag. + owl:versionINFO tag or owl:versionIRI tag. If `as_iri` is True, the full versionIRI is returned. """ - version_iri_storid = self.world._abbreviate( - "http://www.w3.org/2002/07/owl#versionIRI" + version_info_storid = self.world._abbreviate( + "http://www.w3.org/2002/07/owl#versionInfo" ) - tokens = self.get_triples(s=self.storid, p=version_iri_storid) + tokens = self.get_triples(s=self.storid, p=version_info_storid) + print('verisionifo', tokens) if not tokens: - raise TypeError(f"No versionIRI in Ontology {self.base_iri!r}") + version_iri_storid = self.world._abbreviate( + "http://www.w3.org/2002/07/owl#versionIRI" + ) + tokens = self.get_triples(s=self.storid, p=version_iri_storid) + print('versioniri', tokens) + if not tokens: + raise TypeError("No versionIRI or versionInfo" + f"in Ontology {self.base_iri!r}") _, _, obj = tokens[0] + print('obj', obj) version_iri = self.world._unabbreviate(obj) - if as_iri: + if as_iri and version_iri_storid: + return version_iri + elif as_iri: return version_iri - return infer_version(self.base_iri, version_iri) + elif not as_iri and version_iri_storid: + return infer_version(self.base_iri, version_iri) + return version_iri def set_version(self, version=None, version_iri=None): """Assign version to ontology by asigning owl:versionIRI. diff --git a/tools/ontoversion b/tools/ontoversion index a3b2efa69..10d5ad8ca 100755 --- a/tools/ontoversion +++ b/tools/ontoversion @@ -8,11 +8,12 @@ import argparse import sys import rdflib +from rdflib.util import guess_format from rdflib.exceptions import ParserError from xml.parsers.expat import ExpatError from xml.sax._exceptions import SAXParseException -from ontopy.utils import infer_version +from ontopy.utils import infer_version, FMAP def main(): @@ -24,8 +25,9 @@ def main(): help="IRI/file to OWL source to extract the version from.", ) parser.add_argument( - "--format", "-f", default="ttl", help='OWL format. Default is "ttl".' - ) + "--format", "-f", choices=set(list(FMAP.keys()) + list(FMAP.values())), + help='Ontology format. Default: Guess format with rdflib.guess_format.' + ) # add accepted formats try: args = parser.parse_args() except SystemExit as exc: @@ -33,12 +35,19 @@ def main(): # Extract base IRI and versionIRI graph = rdflib.Graph() + + # Guess format if format not given + fmt = ( + args.format + if args.format + else guess_format(args.iri, fmap=FMAP) + ) + print(fmt) try: - graph.parse(args.iri.rstrip("/#"), format=args.format) - except [ExpatError, SAXParseException] as err: + graph.parse(args.iri, format=fmt) + except Exception as err: print( - "rdflib could not parse the ontology, check format. " - "Default format is ´ttl´." + "rdflib could not parse the ontology." ) print(err) sys.exit() From 741e055932fc82b55ed8daac6766617d28a8c9e5 Mon Sep 17 00:00:00 2001 From: francescalb Date: Thu, 25 Nov 2021 21:40:04 +0100 Subject: [PATCH 4/8] Fixed wrong abbreviated in versionInfo --- ontopy/ontology.py | 26 ++++++++++++++------------ tools/ontoversion | 21 +++++++-------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/ontopy/ontology.py b/ontopy/ontology.py index 5e4edab88..8acd51df8 100644 --- a/ontopy/ontology.py +++ b/ontopy/ontology.py @@ -1051,7 +1051,7 @@ def is_defined(self, entity): entity = self.get_by_label(entity) return hasattr(entity, "equivalent_to") and bool(entity.equivalent_to) - def get_version(self, as_iri=False): + def get_version(self, as_iri=False) -> str: """Returns the version number of the ontology as inferred from the owl:versionINFO tag or owl:versionIRI tag. @@ -1061,24 +1061,26 @@ def get_version(self, as_iri=False): "http://www.w3.org/2002/07/owl#versionInfo" ) tokens = self.get_triples(s=self.storid, p=version_info_storid) - print('verisionifo', tokens) + version_iri_storid = None if not tokens: version_iri_storid = self.world._abbreviate( "http://www.w3.org/2002/07/owl#versionIRI" ) tokens = self.get_triples(s=self.storid, p=version_iri_storid) - print('versioniri', tokens) if not tokens: - raise TypeError("No versionIRI or versionInfo" - f"in Ontology {self.base_iri!r}") + raise TypeError( + "No versionIRI or versionInfo " + f"in Ontology {self.base_iri!r}" + ) _, _, obj = tokens[0] - print('obj', obj) - version_iri = self.world._unabbreviate(obj) - if as_iri and version_iri_storid: - return version_iri - elif as_iri: - return version_iri - elif not as_iri and version_iri_storid: + if isinstance(obj, int): + version_iri = self.world._unabbreviate(obj) + else: + version_iri = obj.strip('"').strip("'") + + if as_iri and not version_iri_storid: + return self.base_iri + version_iri + if not as_iri and version_iri_storid: return infer_version(self.base_iri, version_iri) return version_iri diff --git a/tools/ontoversion b/tools/ontoversion index 10d5ad8ca..c678541cd 100755 --- a/tools/ontoversion +++ b/tools/ontoversion @@ -9,9 +9,6 @@ import sys import rdflib from rdflib.util import guess_format -from rdflib.exceptions import ParserError -from xml.parsers.expat import ExpatError -from xml.sax._exceptions import SAXParseException from ontopy.utils import infer_version, FMAP @@ -25,8 +22,10 @@ def main(): help="IRI/file to OWL source to extract the version from.", ) parser.add_argument( - "--format", "-f", choices=set(list(FMAP.keys()) + list(FMAP.values())), - help='Ontology format. Default: Guess format with rdflib.guess_format.' + "--format", + "-f", + choices=set(list(FMAP.keys()) + list(FMAP.values())), + help="Ontology format. Default: Guess format with rdflib.guess_format.", ) # add accepted formats try: args = parser.parse_args() @@ -37,20 +36,14 @@ def main(): graph = rdflib.Graph() # Guess format if format not given - fmt = ( - args.format - if args.format - else guess_format(args.iri, fmap=FMAP) - ) - print(fmt) + fmt = args.format if args.format else guess_format(args.iri, fmap=FMAP) try: graph.parse(args.iri, format=fmt) except Exception as err: - print( - "rdflib could not parse the ontology." - ) + print("rdflib could not parse the ontology.") print(err) sys.exit() + iri, version_iri = list( graph.subject_objects( rdflib.URIRef("http://www.w3.org/2002/07/owl#versionIRI") From 6d155d138565606d0ca64d7853ec4264436c5a3e Mon Sep 17 00:00:00 2001 From: francescalb Date: Sat, 4 Dec 2021 22:57:12 +0100 Subject: [PATCH 5/8] VersionIRI has precendence over versionInfo and added test --- ontopy/ontology.py | 44 ++++++++++--------- tests/test_get_version.py | 24 ++++++++++ tests/testonto/testonto.ttl | 3 +- tests/testonto/testonto_noVersionIRI.ttl | 12 +++++ .../testonto_noVersionIRI_noVersionInfo.ttl | 11 +++++ 5 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 tests/test_get_version.py create mode 100644 tests/testonto/testonto_noVersionIRI.ttl create mode 100644 tests/testonto/testonto_noVersionIRI_noVersionInfo.ttl diff --git a/ontopy/ontology.py b/ontopy/ontology.py index 8acd51df8..9d647840d 100644 --- a/ontopy/ontology.py +++ b/ontopy/ontology.py @@ -1053,36 +1053,38 @@ def is_defined(self, entity): def get_version(self, as_iri=False) -> str: """Returns the version number of the ontology as inferred from the - owl:versionINFO tag or owl:versionIRI tag. + owl:versionIRI tag or, if owl:versionIRI is not found, from + owl:versionINFO. If `as_iri` is True, the full versionIRI is returned. """ + version_iri_storid = self.world._abbreviate( + "http://www.w3.org/2002/07/owl#versionIRI" + ) + tokens = self.get_triples(s=self.storid, p=version_iri_storid) + if (not tokens) and (as_iri is True): + raise TypeError( + "No owl:versionIRI " + f"in Ontology {self.base_iri!r}. " + "Search for owl:versionInfo with as_iri=False" + ) + if tokens: + _, _, obj = tokens[0] + version_iri = self.world._unabbreviate(obj) + if as_iri: + return version_iri + return infer_version(self.base_iri, version_iri) + version_info_storid = self.world._abbreviate( "http://www.w3.org/2002/07/owl#versionInfo" ) tokens = self.get_triples(s=self.storid, p=version_info_storid) - version_iri_storid = None if not tokens: - version_iri_storid = self.world._abbreviate( - "http://www.w3.org/2002/07/owl#versionIRI" + raise TypeError( + "No versionIRI or versionInfo " f"in Ontology {self.base_iri!r}" ) - tokens = self.get_triples(s=self.storid, p=version_iri_storid) - if not tokens: - raise TypeError( - "No versionIRI or versionInfo " - f"in Ontology {self.base_iri!r}" - ) - _, _, obj = tokens[0] - if isinstance(obj, int): - version_iri = self.world._unabbreviate(obj) - else: - version_iri = obj.strip('"').strip("'") - - if as_iri and not version_iri_storid: - return self.base_iri + version_iri - if not as_iri and version_iri_storid: - return infer_version(self.base_iri, version_iri) - return version_iri + _, _, version_info = tokens[0] + return version_info.strip('"').strip("'") def set_version(self, version=None, version_iri=None): """Assign version to ontology by asigning owl:versionIRI. diff --git a/tests/test_get_version.py b/tests/test_get_version.py new file mode 100644 index 000000000..784c5adca --- /dev/null +++ b/tests/test_get_version.py @@ -0,0 +1,24 @@ +import pytest + + +def test_get_version() -> None: + """Test get_version function in ontology""" + from ontopy import get_ontology + + testonto = get_ontology("testonto/testonto.ttl").load() + assert ( + testonto.get_version(as_iri=True) == "http://emmo.info/testonto/0.1.0" + ) + assert testonto.get_version() == "0.1.0" + + testonto_noVersionIRI = get_ontology( + "testonto/testonto_noVersionIRI.ttl" + ).load() + assert testonto_noVersionIRI.get_version() == "v0.1.0" + with pytest.raises(TypeError): + testonto_noVersionIRI.get_version(as_iri=True) + testonto_noVersionIRI_noVersionInfo = get_ontology( + "testonto/testonto_noVersionIRI_noVersionInfo.ttl" + ).load() + with pytest.raises(TypeError): + testonto_noVersionIRI_noVersionInfo.get_version() diff --git a/tests/testonto/testonto.ttl b/tests/testonto/testonto.ttl index f9f52737c..2aea4b429 100644 --- a/tests/testonto/testonto.ttl +++ b/tests/testonto/testonto.ttl @@ -9,4 +9,5 @@ rdf:type owl:Ontology ; owl:versionIRI ; - owl:imports . + owl:imports ; + owl:versionInfo "v0.1.0" . diff --git a/tests/testonto/testonto_noVersionIRI.ttl b/tests/testonto/testonto_noVersionIRI.ttl new file mode 100644 index 000000000..52cf0e59c --- /dev/null +++ b/tests/testonto/testonto_noVersionIRI.ttl @@ -0,0 +1,12 @@ +@prefix : . +@prefix owl: . +@prefix rdf: . +@prefix xml: . +@prefix xsd: . +@prefix rdfs: . +@prefix skos: . +@base . + + rdf:type owl:Ontology ; + owl:imports ; + owl:versionInfo "v0.1.0" . diff --git a/tests/testonto/testonto_noVersionIRI_noVersionInfo.ttl b/tests/testonto/testonto_noVersionIRI_noVersionInfo.ttl new file mode 100644 index 000000000..038251391 --- /dev/null +++ b/tests/testonto/testonto_noVersionIRI_noVersionInfo.ttl @@ -0,0 +1,11 @@ +@prefix : . +@prefix owl: . +@prefix rdf: . +@prefix xml: . +@prefix xsd: . +@prefix rdfs: . +@prefix skos: . +@base . + + rdf:type owl:Ontology ; + owl:imports . From 9f466bda43cca07edc8307808101e1b76757076b Mon Sep 17 00:00:00 2001 From: francescalb Date: Mon, 6 Dec 2021 08:37:44 +0100 Subject: [PATCH 6/8] Corrected paths in test_get_version --- tests/{ => ontopy}/test_get_version.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) rename tests/{ => ontopy}/test_get_version.py (62%) diff --git a/tests/test_get_version.py b/tests/ontopy/test_get_version.py similarity index 62% rename from tests/test_get_version.py rename to tests/ontopy/test_get_version.py index 784c5adca..63ff99f58 100644 --- a/tests/test_get_version.py +++ b/tests/ontopy/test_get_version.py @@ -1,24 +1,29 @@ +from typing import TYPE_CHECKING import pytest +if TYPE_CHECKING: + from pathlib import Path -def test_get_version() -> None: + +def test_get_version(repo_dir: "Path") -> None: """Test get_version function in ontology""" from ontopy import get_ontology - testonto = get_ontology("testonto/testonto.ttl").load() + ontopath = repo_dir / "tests" / "testonto" + testonto = get_ontology(str(ontopath) + "/testonto.ttl").load() assert ( testonto.get_version(as_iri=True) == "http://emmo.info/testonto/0.1.0" ) assert testonto.get_version() == "0.1.0" testonto_noVersionIRI = get_ontology( - "testonto/testonto_noVersionIRI.ttl" + str(ontopath) + "/testonto_noVersionIRI.ttl" ).load() assert testonto_noVersionIRI.get_version() == "v0.1.0" with pytest.raises(TypeError): testonto_noVersionIRI.get_version(as_iri=True) testonto_noVersionIRI_noVersionInfo = get_ontology( - "testonto/testonto_noVersionIRI_noVersionInfo.ttl" + str(ontopath) + "/testonto_noVersionIRI_noVersionInfo.ttl" ).load() with pytest.raises(TypeError): testonto_noVersionIRI_noVersionInfo.get_version() From 1ceebaf9369efa93b74a70bef61d10ccddbb4297 Mon Sep 17 00:00:00 2001 From: francescalb Date: Tue, 7 Dec 2021 07:12:49 +0100 Subject: [PATCH 7/8] Removed v from versionInfo in testonto --- tests/testonto/testonto.ttl | 2 +- tests/testonto/testonto_noVersionIRI.ttl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testonto/testonto.ttl b/tests/testonto/testonto.ttl index 2aea4b429..2398f875a 100644 --- a/tests/testonto/testonto.ttl +++ b/tests/testonto/testonto.ttl @@ -10,4 +10,4 @@ rdf:type owl:Ontology ; owl:versionIRI ; owl:imports ; - owl:versionInfo "v0.1.0" . + owl:versionInfo "0.1.0" . diff --git a/tests/testonto/testonto_noVersionIRI.ttl b/tests/testonto/testonto_noVersionIRI.ttl index 52cf0e59c..a240bb2e0 100644 --- a/tests/testonto/testonto_noVersionIRI.ttl +++ b/tests/testonto/testonto_noVersionIRI.ttl @@ -9,4 +9,4 @@ rdf:type owl:Ontology ; owl:imports ; - owl:versionInfo "v0.1.0" . + owl:versionInfo "0.1.0" . From 65e97db761f9a2b952896e6a037e4425a144135c Mon Sep 17 00:00:00 2001 From: francescalb Date: Tue, 7 Dec 2021 07:28:38 +0100 Subject: [PATCH 8/8] Corrected versionnumber from versionInfo in test --- tests/ontopy/test_get_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ontopy/test_get_version.py b/tests/ontopy/test_get_version.py index 63ff99f58..3bd7b5b13 100644 --- a/tests/ontopy/test_get_version.py +++ b/tests/ontopy/test_get_version.py @@ -19,7 +19,7 @@ def test_get_version(repo_dir: "Path") -> None: testonto_noVersionIRI = get_ontology( str(ontopath) + "/testonto_noVersionIRI.ttl" ).load() - assert testonto_noVersionIRI.get_version() == "v0.1.0" + assert testonto_noVersionIRI.get_version() == "0.1.0" with pytest.raises(TypeError): testonto_noVersionIRI.get_version(as_iri=True) testonto_noVersionIRI_noVersionInfo = get_ontology(