Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/rdflib/query.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.7/site-packages/rdflib/query.py Sat May 02 07:14:21 2020 -0400 @@ -0,0 +1,315 @@ + +import os +import shutil +import tempfile +import warnings +import types + +from urllib.parse import urlparse +try: + from io import BytesIO + assert BytesIO +except: + from io import StringIO as BytesIO + +from . import py3compat + +__all__ = ['Processor', 'Result', 'ResultParser', 'ResultSerializer', + 'ResultException'] + + + + +class Processor(object): + """ + Query plugin interface. + + This module is useful for those wanting to write a query processor + that can plugin to rdf. If you are wanting to execute a query you + likely want to do so through the Graph class query method. + + """ + + def __init__(self, graph): + pass + + def query(self, strOrQuery, initBindings={}, initNs={}, DEBUG=False): + pass + +class UpdateProcessor(object): + """ + Update plugin interface. + + This module is useful for those wanting to write an update + processor that can plugin to rdflib. If you are wanting to execute + an update statement you likely want to do so through the Graph + class update method. + + .. versionadded:: 4.0 + + """ + + def __init__(self, graph): + pass + def update(self, strOrQuery, initBindings={}, initNs={}): + pass + +class ResultException(Exception): + pass + + +class EncodeOnlyUnicode(object): + """ + This is a crappy work-around for + http://bugs.python.org/issue11649 + + + """ + + def __init__(self, stream): + self.__stream = stream + + def write(self, arg): + if isinstance(arg, str): + self.__stream.write(arg.encode("utf-8")) + else: + self.__stream.write(arg) + + def __getattr__(self, name): + return getattr(self.__stream, name) + + +class ResultRow(tuple): + """ + a single result row + allows accessing bindings as attributes or with [] + + >>> from rdflib import URIRef, Variable + >>> rr=ResultRow({ Variable('a'): URIRef('urn:cake') }, [Variable('a')]) + + >>> rr[0] + rdflib.term.URIRef(%(u)s'urn:cake') + >>> rr[1] + Traceback (most recent call last): + ... + IndexError: tuple index out of range + + >>> rr.a + rdflib.term.URIRef(%(u)s'urn:cake') + >>> rr.b + Traceback (most recent call last): + ... + AttributeError: b + + >>> rr['a'] + rdflib.term.URIRef(%(u)s'urn:cake') + >>> rr['b'] + Traceback (most recent call last): + ... + KeyError: 'b' + + >>> rr[Variable('a')] + rdflib.term.URIRef(%(u)s'urn:cake') + + .. versionadded:: 4.0 + + """ + __doc__ = py3compat.format_doctest_out(__doc__) + + def __new__(cls, values, labels): + + instance = super(ResultRow, cls).__new__( + cls, (values.get(v) for v in labels)) + instance.labels = dict((str(x[1]), x[0]) + for x in enumerate(labels)) + return instance + + def __getattr__(self, name): + if name not in self.labels: + raise AttributeError(name) + return tuple.__getitem__(self, self.labels[name]) + + def __getitem__(self, name): + try: + return tuple.__getitem__(self, name) + except TypeError: + if name in self.labels: + return tuple.__getitem__(self, self.labels[name]) + if str(name) in self.labels: # passing in variable object + return tuple.__getitem__(self, self.labels[str(name)]) + raise KeyError(name) + + def asdict(self): + return dict((v, self[v]) for v in self.labels if self[v] != None) + + +class Result(object): + """ + A common class for representing query result. + + There is a bit of magic here that makes this appear like different + Python objects, depending on the type of result. + + If the type is "SELECT", iterating will yield lists of QueryRow objects + + If the type is "ASK", iterating will yield a single bool (or + bool(result) will return the same bool) + + If the type is "CONSTRUCT" or "DESCRIBE" iterating will yield the + triples. + + len(result) also works. + + """ + def __init__(self, type_): + + if type_ not in ('CONSTRUCT', 'DESCRIBE', 'SELECT', 'ASK'): + raise ResultException('Unknown Result type: %s' % type_) + + self.type = type_ + self.vars = None + self._bindings = None + self._genbindings = None + self.askAnswer = None + self.graph = None + + def _get_bindings(self): + if self._genbindings: + self._bindings += list(self._genbindings) + self._genbindings = None + + return self._bindings + + def _set_bindings(self, b): + if isinstance(b, types.GeneratorType): + self._genbindings = b + self._bindings = [] + else: + self._bindings = b + + bindings = property( + _get_bindings, _set_bindings, doc="a list of variable bindings as dicts") + + @staticmethod + def parse(source, format='xml', **kwargs): + from rdflib import plugin + parser = plugin.get(format, ResultParser)() + return parser.parse(source, **kwargs) + + def serialize( + self, destination=None, encoding="utf-8", format='xml', **args): + + if self.type in ('CONSTRUCT', 'DESCRIBE'): + return self.graph.serialize( + destination, encoding=encoding, format=format, **args) + + """stolen wholesale from graph.serialize""" + from rdflib import plugin + serializer = plugin.get(format, ResultSerializer)(self) + if destination is None: + stream = BytesIO() + stream2 = EncodeOnlyUnicode(stream) + serializer.serialize(stream2, encoding=encoding, **args) + return stream.getvalue() + if hasattr(destination, "write"): + stream = destination + serializer.serialize(stream, encoding=encoding, **args) + else: + location = destination + scheme, netloc, path, params, query, fragment = urlparse(location) + if netloc != "": + print(("WARNING: not saving as location" + + "is not a local file reference")) + return + fd, name = tempfile.mkstemp() + stream = os.fdopen(fd, 'wb') + serializer.serialize(stream, encoding=encoding, **args) + stream.close() + if hasattr(shutil, "move"): + shutil.move(name, path) + else: + shutil.copy(name, path) + os.remove(name) + + def __len__(self): + if self.type == 'ASK': + return 1 + elif self.type == 'SELECT': + return len(self.bindings) + else: + return len(self.graph) + + def __bool__(self): + if self.type == 'ASK': + return self.askAnswer + else: + return len(self)>0 + + def __iter__(self): + if self.type in ("CONSTRUCT", "DESCRIBE"): + for t in self.graph: + yield t + elif self.type == 'ASK': + yield self.askAnswer + elif self.type == 'SELECT': + # this iterates over ResultRows of variable bindings + + if self._genbindings: + for b in self._genbindings: + if b: # don't add a result row in case of empty binding {} + self._bindings.append(b) + yield ResultRow(b, self.vars) + self._genbindings = None + else: + for b in self._bindings: + if b: # don't add a result row in case of empty binding {} + yield ResultRow(b, self.vars) + + def __getattr__(self, name): + if self.type in ("CONSTRUCT", "DESCRIBE") and self.graph is not None: + return self.graph.__getattr__(self, name) + elif self.type == 'SELECT' and name == 'result': + warnings.warn( + "accessing the 'result' attribute is deprecated." + " Iterate over the object instead.", + DeprecationWarning, stacklevel=2) + # copied from __iter__, above + return [(tuple(b[v] for v in self.vars)) for b in self.bindings] + else: + raise AttributeError( + "'%s' object has no attribute '%s'" % (self, name)) + + def __eq__(self, other): + try: + if self.type != other.type: + return False + if self.type == 'ASK': + return self.askAnswer == other.askAnswer + elif self.type == 'SELECT': + return self.vars == other.vars \ + and self.bindings == other.bindings + else: + return self.graph == other.graph + + except: + return False + + +class ResultParser(object): + + def __init__(self): + pass + + def parse(self, source, **kwargs): + """return a Result object""" + pass # abstract + + +class ResultSerializer(object): + + def __init__(self, result): + self.result = result + + def serialize(self, stream, encoding="utf-8", **kwargs): + """return a string properly serialized""" + pass # abstract