# HG changeset patch # User drewp@bigasterisk.com # Date 1649135321 25200 # Node ID 7d894e97761543853b7520f41f89d5175f58b0bd # Parent 36f4318442f27b80de36fa811234478442cb5ede clean up rdflibpatch (some of which might now be unused) diff -r 36f4318442f2 -r 7d894e977615 rdfdb/rdflibpatch.py --- a/rdfdb/rdflibpatch.py Mon Apr 04 22:00:45 2022 -0700 +++ b/rdfdb/rdflibpatch.py Mon Apr 04 22:08:41 2022 -0700 @@ -1,16 +1,5 @@ -""" -this is a proposal for a ConjunctiveGraph method in rdflib -""" -import sys - -if sys.path[0] == '/usr/lib/python2.7/dist-packages': - # nosetests puts this in - sys.path = sys.path[1:] - -import unittest - -from rdflib import ConjunctiveGraph, Graph, Literal -from rdflib import URIRef as U +from rdflib import ConjunctiveGraph, Graph, Literal, URIRef +from rdflib.plugins.serializers.nt import _quoteLiteral def patchQuads(graph, deleteQuads, addQuads, perfect=False): @@ -49,7 +38,7 @@ def fixContextToUri(spoc): - if not isinstance(spoc[3], U): + if not isinstance(spoc[3], URIRef): return spoc[:3] + (spoc[3].identifier,) return spoc @@ -77,9 +66,11 @@ # some of the following workarounds may be fixed in https://github.com/RDFLib/rdflib/issues/299 def graphFromQuads(q): g = ConjunctiveGraph() - #g.addN(q) # no effect on nquad output + # Ought to be just: + # g.addN(q) + # but that doesn't work. for s, p, o, c in q: - #g.get_context(c).add((s,p,o)) # kind of works with broken rdflib nquad serializer code; you need this for json_ld serialize to work :( + # g.get_context(c).add((s,p,o)) # kind of works with broken rdflib nquad serializer code; you need this for json_ld serialize to work :( g.store.add((s, p, o), c) # no effect on nquad output return g @@ -91,9 +82,6 @@ return g1 -from rdflib.plugins.serializers.nt import _quoteLiteral - - def serializeQuad(g): """ replacement for graph.serialize(format='nquads') @@ -125,127 +113,3 @@ def contextsForStatement(graph, triple): return [q[3] for q in graph.quads(triple)] - - -A = U("http://a") -B = U("http://b") - - -class TestInContext(unittest.TestCase): - - def testResultHasQuads(self): - g = inContext([(A, A, A)], B) - self.assertEqual(list(g.quads())[0], (A, A, A, B)) - - -class TestContextsForStatement(unittest.TestCase): - - def testNotFound(self): - g = graphFromQuads([(A, A, A, A)]) - self.assertEqual(contextsForStatement(g, (B, B, B)), []) - - def testOneContext(self): - g = graphFromQuads([(A, A, A, A), (A, A, B, B)]) - self.assertEqual(contextsForStatement(g, (A, A, A)), [A]) - - def testTwoContexts(self): - g = graphFromQuads([(A, A, A, A), (A, A, A, B)]) - self.assertEqual(sorted(contextsForStatement(g, (A, A, A))), sorted([A, B])) - - # There's a case where contextsForStatement was returning a Graph - # with identifier, which I've fixed without a test - - -class TestInGraph(unittest.TestCase): - - def testSimpleMatch(self): - g = graphFromQuads([(A, A, A, A)]) - self.assertTrue(inGraph((A, A, A, A), g)) - - def testDontMatchDifferentStatement(self): - g = graphFromQuads([(A, A, A, A)]) - self.assertFalse(inGraph((B, B, B, B), g)) - - def testDontMatchStatementInAnotherContext(self): - g = graphFromQuads([(A, A, A, A)]) - self.assertFalse(inGraph((A, A, A, B), g)) - - self.assertFalse(inGraph((A, A, A, Graph(identifier=B)), g)) - - -class TestGraphFromQuads(unittest.TestCase): - nqOut = ' .\n' - - def testSerializes(self): - n = U("http://example.com/") - g = graphFromQuads([(n, n, n, n)]) - out = serializeQuad(g) - self.assertEqual(out.strip(), self.nqOut.strip()) - - def testNquadParserSerializes(self): - g = graphFromNQuad(self.nqOut) - self.assertEqual(len(g), 1) - out = serializeQuad(g) - self.assertEqual(out.strip(), self.nqOut.strip()) - - -A = U("http://a") -B = U("http://b") -C = U("http://c") -CTX1 = U('http://ctx1') -CTX2 = U('http://ctx2') -stmt1 = A, B, C, CTX1 -stmt2 = A, B, C, CTX2 - - -class TestPatchQuads(unittest.TestCase): - - def testAddsToNewContext(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt1]) - self.assertEqual(len(g), 1) - quads = list(g.quads((None, None, None))) - self.assertEqual(quads, [(A, B, C, Graph(identifier=CTX1))]) - - def testDeletes(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt1]) - patchQuads(g, [stmt1], []) - quads = list(g.quads((None, None, None))) - self.assertEqual(quads, []) - - def testDeleteRunsBeforeAdd(self): - g = ConjunctiveGraph() - patchQuads(g, [stmt1], [stmt1]) - quads = list(g.quads((None, None, None))) - self.assertEqual(quads, [(A, B, C, Graph(identifier=CTX1))]) - - def testPerfectAddRejectsExistingStmt(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt1]) - self.assertRaises(ValueError, patchQuads, g, [], [stmt1], perfect=True) - - def testPerfectAddAllowsExistingStmtInNewContext(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt1]) - patchQuads(g, [], [stmt2], perfect=True) - self.assertEqual(len(list(g.quads((None, None, None)))), 2) - - def testPerfectDeleteRejectsAbsentStmt(self): - g = ConjunctiveGraph() - self.assertRaises(ValueError, patchQuads, g, [stmt1], [], perfect=True) - - def testPerfectDeleteRejectsStmtFromOtherGraph(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt2]) - self.assertRaises(ValueError, patchQuads, g, [stmt1], [], perfect=True) - - def testPerfectDeleteAllowsRemovalOfStmtInMultipleContexts(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt1, stmt2]) - patchQuads(g, [stmt1], [], perfect=True) - - def testRedundantStmtOkForAddOrDelete(self): - g = ConjunctiveGraph() - patchQuads(g, [], [stmt1, stmt1], perfect=True) - patchQuads(g, [stmt1, stmt1], [], perfect=True) diff -r 36f4318442f2 -r 7d894e977615 rdfdb/rdflibpatch_test.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rdfdb/rdflibpatch_test.py Mon Apr 04 22:08:41 2022 -0700 @@ -0,0 +1,129 @@ +import unittest + +from rdflib import ConjunctiveGraph, Graph +from rdflib import URIRef as U + +from rdfdb.rdflibpatch import (contextsForStatement, graphFromNQuad, graphFromQuads, inContext, inGraph, patchQuads, serializeQuad) + +A = U("http://a") +B = U("http://b") + + +class TestInContext(unittest.TestCase): + + def testResultHasQuads(self): + g = inContext([(A, A, A)], B) + self.assertEqual(list(g.quads())[0], (A, A, A, B)) + + +class TestContextsForStatement(unittest.TestCase): + + def testNotFound(self): + g = graphFromQuads([(A, A, A, A)]) + self.assertEqual(contextsForStatement(g, (B, B, B)), []) + + def testOneContext(self): + g = graphFromQuads([(A, A, A, A), (A, A, B, B)]) + self.assertEqual(contextsForStatement(g, (A, A, A)), [A]) + + def testTwoContexts(self): + g = graphFromQuads([(A, A, A, A), (A, A, A, B)]) + self.assertEqual(sorted(contextsForStatement(g, (A, A, A))), sorted([A, B])) + + # There's a case where contextsForStatement was returning a Graph + # with identifier, which I've fixed without a test + + +class TestInGraph(unittest.TestCase): + + def testSimpleMatch(self): + g = graphFromQuads([(A, A, A, A)]) + self.assertTrue(inGraph((A, A, A, A), g)) + + def testDontMatchDifferentStatement(self): + g = graphFromQuads([(A, A, A, A)]) + self.assertFalse(inGraph((B, B, B, B), g)) + + def testDontMatchStatementInAnotherContext(self): + g = graphFromQuads([(A, A, A, A)]) + self.assertFalse(inGraph((A, A, A, B), g)) + + self.assertFalse(inGraph((A, A, A, Graph(identifier=B)), g)) + + +class TestGraphFromQuads(unittest.TestCase): + nqOut = ' .\n' + + def testSerializes(self): + n = U("http://example.com/") + g = graphFromQuads([(n, n, n, n)]) + out = serializeQuad(g) + self.assertEqual(out.strip(), self.nqOut.strip()) + + def testNquadParserSerializes(self): + g = graphFromNQuad(self.nqOut) + self.assertEqual(len(g), 1) + out = serializeQuad(g) + self.assertEqual(out.strip(), self.nqOut.strip()) + + +A = U("http://a") +B = U("http://b") +C = U("http://c") +CTX1 = U('http://ctx1') +CTX2 = U('http://ctx2') +stmt1 = A, B, C, CTX1 +stmt2 = A, B, C, CTX2 + + +class TestPatchQuads(unittest.TestCase): + + def testAddsToNewContext(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt1]) + self.assertEqual(len(g), 1) + quads = list(g.quads((None, None, None))) + self.assertEqual(quads, [(A, B, C, Graph(identifier=CTX1))]) + + def testDeletes(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt1]) + patchQuads(g, [stmt1], []) + quads = list(g.quads((None, None, None))) + self.assertEqual(quads, []) + + def testDeleteRunsBeforeAdd(self): + g = ConjunctiveGraph() + patchQuads(g, [stmt1], [stmt1]) + quads = list(g.quads((None, None, None))) + self.assertEqual(quads, [(A, B, C, Graph(identifier=CTX1))]) + + def testPerfectAddRejectsExistingStmt(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt1]) + self.assertRaises(ValueError, patchQuads, g, [], [stmt1], perfect=True) + + def testPerfectAddAllowsExistingStmtInNewContext(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt1]) + patchQuads(g, [], [stmt2], perfect=True) + self.assertEqual(len(list(g.quads((None, None, None)))), 2) + + def testPerfectDeleteRejectsAbsentStmt(self): + g = ConjunctiveGraph() + self.assertRaises(ValueError, patchQuads, g, [stmt1], [], perfect=True) + + def testPerfectDeleteRejectsStmtFromOtherGraph(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt2]) + self.assertRaises(ValueError, patchQuads, g, [stmt1], [], perfect=True) + + def testPerfectDeleteAllowsRemovalOfStmtInMultipleContexts(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt1, stmt2]) + patchQuads(g, [stmt1], [], perfect=True) + + def testRedundantStmtOkForAddOrDelete(self): + g = ConjunctiveGraph() + patchQuads(g, [], [stmt1, stmt1], perfect=True) + patchQuads(g, [stmt1, stmt1], [], perfect=True)