changeset 1031:78a6f15a462a

fix rdflibpatch for rdflib 4.2.1's new quirks Ignore-this: 684277f12d795ca1ab8673ca719350c5
author Drew Perttula <drewp@bigasterisk.com>
date Tue, 27 May 2014 05:47:35 +0000
parents efcb41c585fe
children 54027815c6cc
files light9/rdfdb/rdflibpatch.py
diffstat 1 files changed, 32 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/light9/rdfdb/rdflibpatch.py	Mon May 26 20:52:25 2014 +0000
+++ b/light9/rdfdb/rdflibpatch.py	Tue May 27 05:47:35 2014 +0000
@@ -16,27 +16,38 @@
     deletes or before the adds (not a real transaction) if any of the
     deletes isn't in the graph or if any of the adds was already in
     the graph.
+
+    These input quads use URIRef for the context, unlike some rdflib
+    APIs that use a Graph(identifier=...) for the context.
     """
     toDelete = []
-    for s, p, o, c in deleteQuads:
-        stmt = (s, p, o)
+    for spoc in deleteQuads:
+        if not isinstance(spoc[3], U):
+            raise TypeError("please pass URIRef contexts to patchQuads")
+
         if perfect:
-            if not any(graph.store.triples(stmt, c)):
-                raise ValueError("%r not in %r" % (stmt, c))
+            if inGraph(spoc, graph):
+                toDelete.append(spoc)
             else:
-                toDelete.append((c, stmt))
+                raise ValueError("%r not in %r" % (spoc[:3], spoc[3]))
         else:
-            graph.store.remove(stmt, context=c)
-    for c, stmt in toDelete:
-        graph.store.remove(stmt, context=c)
+            graph.remove(spoc)
+    for spoc in toDelete:
+        graph.remove(spoc)
 
     if perfect:
         addQuads = list(addQuads)
         for spoc in addQuads:
-            if spoc in graph:
+            if inGraph(spoc, graph):
                 raise ValueError("%r already in %r" % (spoc[:3], spoc[3]))
     graph.addN(addQuads)
 
+def inGraph(spoc, graph):
+    """
+    c is just a URIRef.
+    Workaround for https://github.com/RDFLib/rdflib/issues/398
+    """
+    return (spoc[:3] + (Graph(identifier=spoc[3]),)) in graph.quads()
 
 
 def graphFromQuads(q):
@@ -48,18 +59,9 @@
     return g
 
 def graphFromNQuad(text):
-    """
-    g.parse(data=self.nqOut, format='nquads')
-    makes a graph that serializes to nothing
-    """
     g1 = ConjunctiveGraph()
     g1.parse(data=text, format='nquads')
-    g2 = ConjunctiveGraph()
-    for s,p,o,c in g1.quads((None,None,None)):
-        #g2.get_context(c).add((s,p,o))
-        g2.store.add((s,p,o), c)
-    #import pprint; pprint.pprint(g2.store.__dict__)
-    return g2
+    return g1
 
 from rdflib.plugins.serializers.nt import _xmlcharref_encode
 def serializeQuad(g):
@@ -118,15 +120,17 @@
         self.assertEqual(out.strip(), self.nqOut.strip())
 
 
-stmt1 = U('http://a'), U('http://b'), U('http://c'), U('http://ctx1')
-stmt2 = U('http://a'), U('http://b'), U('http://c'), U('http://ctx2')
+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.assert_(len(g), 1)
         quads = list(g.quads((None,None,None)))
-        self.assertEqual(quads, [stmt1])
+        self.assertEqual(quads, [(A, B, C, Graph(identifier=CTX1))])
 
     def testDeletes(self):
         g = ConjunctiveGraph()
@@ -139,7 +143,7 @@
         g = ConjunctiveGraph()
         patchQuads(g, [stmt1], [stmt1])
         quads = list(g.quads((None,None,None)))
-        self.assertEqual(quads, [stmt1])
+        self.assertEqual(quads, [(A, B, C, Graph(identifier=CTX1))])
 
     def testPerfectAddRejectsExistingStmt(self):
         g = ConjunctiveGraph()
@@ -156,6 +160,11 @@
         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])