diff planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/results/csvresults.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/results/csvresults.py	Fri Jul 31 00:32:28 2020 -0400
@@ -0,0 +1,90 @@
+"""
+
+This module implements a parser and serializer for the CSV SPARQL result
+formats
+
+http://www.w3.org/TR/sparql11-results-csv-tsv/
+
+"""
+
+import codecs
+import csv
+
+from rdflib import Variable, BNode, URIRef, Literal, py3compat
+
+from rdflib.query import Result, ResultSerializer, ResultParser
+
+
+class CSVResultParser(ResultParser):
+    def __init__(self):
+        self.delim = ","
+
+    def parse(self, source):
+
+        r = Result('SELECT')
+
+        if isinstance(source.read(0), py3compat.bytestype):
+            # if reading from source returns bytes do utf-8 decoding
+            source = codecs.getreader('utf-8')(source)
+
+        reader = csv.reader(source, delimiter=self.delim)
+        r.vars = [Variable(x) for x in next(reader)]
+        r.bindings = []
+
+        for row in reader:
+            r.bindings.append(self.parseRow(row, r.vars))
+
+        return r
+
+    def parseRow(self, row, v):
+        return dict((var, val)
+                    for var, val in zip(v, [self.convertTerm(t)
+                                            for t in row]) if val is not None)
+
+    def convertTerm(self, t):
+        if t == "":
+            return None
+        if t.startswith("_:"):
+            return BNode(t)  # or generate new IDs?
+        if t.startswith("http://") or t.startswith("https://"):  # TODO: more?
+            return URIRef(t)
+        return Literal(t)
+
+
+class CSVResultSerializer(ResultSerializer):
+
+    def __init__(self, result):
+        ResultSerializer.__init__(self, result)
+
+        self.delim = ","
+        if result.type != "SELECT":
+            raise Exception(
+                "CSVSerializer can only serialize select query results")
+
+    def serialize(self, stream, encoding='utf-8'):
+
+        if py3compat.PY3:
+            # the serialiser writes bytes in the given encoding
+            # in py3 csv.writer is unicode aware and writes STRINGS,
+            # so we encode afterwards
+            # in py2 it breaks when passed unicode strings,
+            # and must be passed utf8, so we encode before
+
+            import codecs
+            stream = codecs.getwriter(encoding)(stream)
+
+        out = csv.writer(stream, delimiter=self.delim)
+
+        vs = [self.serializeTerm(v, encoding) for v in self.result.vars]
+        out.writerow(vs)
+        for row in self.result.bindings:
+            out.writerow([self.serializeTerm(
+                row.get(v), encoding) for v in self.result.vars])
+
+    def serializeTerm(self, term, encoding):
+        if term is None:
+            return ""
+        if not py3compat.PY3:
+            return term.encode(encoding)
+        else:
+            return term