Skip to content

Commit

Permalink
Add the ability to pass a NamespaceManager to the n3 method on Paths …
Browse files Browse the repository at this point in the history
…just like for Terms
  • Loading branch information
mgberg committed Dec 7, 2022
1 parent 897d14e commit 5b12289
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 10 deletions.
21 changes: 11 additions & 10 deletions rdflib/paths.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@

if TYPE_CHECKING:
from rdflib.graph import Graph, _ObjectType, _SubjectType
from rdflib.namespace import NamespaceManager


# property paths
Expand Down Expand Up @@ -233,8 +234,8 @@ def eval(self, graph, subj=None, obj=None):
def __repr__(self):
return "Path(~%s)" % (self.arg,)

def n3(self):
return "^%s" % self.arg.n3()
def n3(self, namespace_manager: Optional["NamespaceManager"] = None):
return "^%s" % self.arg.n3(namespace_manager)


class SequencePath(Path):
Expand Down Expand Up @@ -277,8 +278,8 @@ def _eval_seq_bw(paths, subj, obj):
def __repr__(self):
return "Path(%s)" % " / ".join(str(x) for x in self.args)

def n3(self):
return "/".join(a.n3() for a in self.args)
def n3(self, namespace_manager: Optional["NamespaceManager"] = None):
return "/".join(a.n3(namespace_manager) for a in self.args)


class AlternativePath(Path):
Expand All @@ -298,8 +299,8 @@ def eval(self, graph, subj=None, obj=None):
def __repr__(self):
return "Path(%s)" % " | ".join(str(x) for x in self.args)

def n3(self):
return "|".join(a.n3() for a in self.args)
def n3(self, namespace_manager: Optional["NamespaceManager"] = None):
return "|".join(a.n3(namespace_manager) for a in self.args)


class MulPath(Path):
Expand Down Expand Up @@ -402,8 +403,8 @@ def _all_fwd_paths():
def __repr__(self):
return "Path(%s%s)" % (self.path, self.mod)

def n3(self):
return "%s%s" % (self.path.n3(), self.mod)
def n3(self, namespace_manager: Optional["NamespaceManager"] = None):
return "%s%s" % (self.path.n3(namespace_manager), self.mod)


class NegatedPath(Path):
Expand Down Expand Up @@ -435,8 +436,8 @@ def eval(self, graph, subj=None, obj=None):
def __repr__(self):
return "Path(! %s)" % ",".join(str(x) for x in self.args)

def n3(self):
return "!(%s)" % ("|".join(self.args))
def n3(self, namespace_manager: Optional["NamespaceManager"] = None):
return "!(%s)" % ("|".join(arg.n3(namespace_manager) for arg in self.args))


class PathList(list):
Expand Down
43 changes: 43 additions & 0 deletions test/test_paths_n3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from rdflib import Graph
from rdflib import RDF, RDFS
from rdflib.paths import ZeroOrMore, OneOrMore, ZeroOrOne
import pytest


g = Graph()
nsm = g.namespace_manager


@pytest.mark.parametrize(
"path, no_nsm, with_nsm",
[
(~RDF.type, f"^<{RDF.type}>", "^rdf:type"),
(
RDF.type / RDFS.subClassOf,
f"<{RDF.type}>/<{RDFS.subClassOf}>",
"rdf:type/rdfs:subClassOf",
),
(
RDF.type | RDFS.subClassOf,
f"<{RDF.type}>|<{RDFS.subClassOf}>",
"rdf:type|rdfs:subClassOf",
),
(-RDF.type, f"!(<{RDF.type}>)", "!(rdf:type)"),
(RDFS.subClassOf * ZeroOrMore, f"<{RDFS.subClassOf}>*", "rdfs:subClassOf*"),
(RDFS.subClassOf * OneOrMore, f"<{RDFS.subClassOf}>+", "rdfs:subClassOf+"),
(RDFS.subClassOf * ZeroOrOne, f"<{RDFS.subClassOf}>?", "rdfs:subClassOf?"),
(
RDF.type / RDFS.subClassOf * "*",
f"<{RDF.type}>/<{RDFS.subClassOf}>*",
"rdf:type/rdfs:subClassOf*",
),
(
-(RDF.type | RDFS.subClassOf),
f"!(<{RDF.type}>|<{RDFS.subClassOf}>)",
"!(rdf:type|rdfs:subClassOf)",
),
],
)
def test_paths_n3(path, no_nsm, with_nsm):
assert path.n3() == no_nsm
assert path.n3(nsm) == with_nsm

0 comments on commit 5b12289

Please sign in to comment.