summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaimie Murdock <jmmurdo@sandia.gov>2021-01-28 12:48:03 -0700
committerJaimie Murdock <jmmurdo@sandia.gov>2021-01-28 12:48:03 -0700
commitc85cf9d6f78a6554e226620c095b6759073ac04d (patch)
treeeb2f244ee2811d059281a4fdfc3314dd36f91a4b
parentcc340ede60b9ad445c6e68cdd21208fd09b8da27 (diff)
downloadrdflib-c85cf9d6f78a6554e226620c095b6759073ac04d.tar.gz
adding {ClosedNamespace,NamespaceManager,_RDFNamespace}.__contains__() and tests
-rw-r--r--rdflib/namespace.py21
-rw-r--r--test/test_namespace.py18
2 files changed, 32 insertions, 7 deletions
diff --git a/rdflib/namespace.py b/rdflib/namespace.py
index 4a4d0cfe..993d82a4 100644
--- a/rdflib/namespace.py
+++ b/rdflib/namespace.py
@@ -146,8 +146,8 @@ class Namespace(str):
def __repr__(self):
return "Namespace(%r)" % str(self)
- def __contains__(self, other):
- return other.startswith(self) # test namespace membership with "ref in ns" syntax
+ def __contains__(self, ref):
+ return ref.startswith(self) # test namespace membership with "ref in ns" syntax
class URIPattern(str):
@@ -194,11 +194,10 @@ class ClosedNamespace(object):
self.__uris[t] = URIRef(self.uri + t)
def term(self, name):
- uri = self.__uris.get(name)
- if uri is None:
+ if name not in self.__uris:
raise KeyError("term '{}' not in namespace '{}'".format(name, self.uri))
else:
- return uri
+ return self.__uris[name]
def __getitem__(self, key, default=None):
return self.term(key)
@@ -220,9 +219,12 @@ class ClosedNamespace(object):
def __dir__(self):
return list(self._ClosedNamespace__uris)
+
+ def __contains__(self, ref):
+ return ref in self.__uris.values() # test namespace membership with "ref in ns" syntax
def _ipython_key_completions_(self):
- return dir(self)
+ return dir(self.uri)
class _RDFNamespace(ClosedNamespace):
@@ -597,6 +599,13 @@ class NamespaceManager(object):
self.bind("rdfs", RDFS)
self.bind("xsd", XSD)
+ def __contians__(self, ref):
+ # checks if a reference is in any of the managed namespaces with syntax
+ # "ref in manager". Note that we don't use "ref in ns", as
+ # NamespaceManager.namespaces() returns Iterator[Tuple[str, URIRef]]
+ # rather than Iterator[Tuple[str, Namespace]]
+ return any(ref.startswith(ns) for prefix, ns in self.namespaces())
+
def reset(self):
self.__cache = {}
self.__strie = {}
diff --git a/test/test_namespace.py b/test/test_namespace.py
index 2706467f..7d9b04fe 100644
--- a/test/test_namespace.py
+++ b/test/test_namespace.py
@@ -1,7 +1,8 @@
+from rdflib.rdflib.namespace import Namespace
import unittest
from rdflib.graph import Graph
-from rdflib.namespace import FOAF
+from rdflib.namespace import FOAF, RDF, RDFS, SH
from rdflib.term import URIRef
@@ -112,3 +113,18 @@ class NamespacePrefixTest(unittest.TestCase):
add_not_in_namespace("givenName"),
URIRef("http://xmlns.com/foaf/0.1/givenName"),
)
+
+ def test_contains_method(self):
+ """Tests for Namespace.__contains__() methods."""
+
+ ref = URIRef('http://www.w3.org/ns/shacl#example')
+ self.assertTrue(type(SH) == Namespace, "SH no longer a Namespace, update test.")
+ self.assertTrue(ref in SH, "sh:example not in SH")
+
+ ref = URIRef('http://www.w3.org/2000/01/rdf-schema#label')
+ self.assertTrue(ref in RDFS, "ClosedNamespace(RDFS) does not include rdfs:label")
+ ref = URIRef('http://www.w3.org/2000/01/rdf-schema#example')
+ self.assertFalse(ref in RDFS, "ClosedNamespace(RDFS) includes out-of-ns member rdfs:example")
+
+ ref = URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
+ self.assertTrue(ref in RDF, "_RDFNamespace does not include rdf:type") \ No newline at end of file