diff env/lib/python3.7/site-packages/rdflib/namespace.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/rdflib/namespace.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,502 +0,0 @@
-from rdflib.py3compat import format_doctest_out
-
-__doc__ = format_doctest_out("""
-===================
-Namespace Utilities
-===================
-
-RDFLib provides mechanisms for managing Namespaces.
-
-In particular, there is a :class:`~rdflib.namespace.Namespace` class
-that takes as its argument the base URI of the namespace.
-
-.. code-block:: pycon
-
-    >>> from rdflib.namespace import Namespace
-    >>> owl = Namespace('http://www.w3.org/2002/07/owl#')
-
-Fully qualified URIs in the namespace can be constructed either by attribute
-or by dictionary access on Namespace instances:
-
-.. code-block:: pycon
-
-    >>> owl.seeAlso
-    rdflib.term.URIRef(%(u)s'http://www.w3.org/2002/07/owl#seeAlso')
-    >>> owl['seeAlso']
-    rdflib.term.URIRef(%(u)s'http://www.w3.org/2002/07/owl#seeAlso')
-
-
-Automatic handling of unknown predicates
------------------------------------------
-
-As a programming convenience, a namespace binding is automatically
-created when :class:`rdflib.term.URIRef` predicates are added to the graph.
-
-Importable namespaces
------------------------
-
-The following namespaces are available by directly importing from rdflib:
-
-* RDF
-* RDFS
-* OWL
-* XSD
-* FOAF
-* SKOS
-* DOAP
-* DC
-* DCTERMS
-* VOID
-
-.. code-block:: pycon
-
-    >>> from rdflib import OWL
-    >>> OWL.seeAlso
-    rdflib.term.URIRef(%(u)s'http://www.w3.org/2002/07/owl#seeAlso')
-
-""")
-
-import logging
-logger = logging.getLogger(__name__)
-
-import os
-
-from urllib.parse import urljoin, urldefrag
-from urllib.request import pathname2url
-
-from rdflib.term import URIRef, Variable, _XSD_PFX, _is_valid_uri
-
-__all__ = [
-    'is_ncname', 'split_uri', 'Namespace',
-    'ClosedNamespace', 'NamespaceManager',
-    'XMLNS', 'RDF', 'RDFS', 'XSD', 'OWL',
-    'SKOS', 'DOAP', 'FOAF', 'DC', 'DCTERMS', 'VOID']
-
-
-class Namespace(str):
-
-    __doc__ = format_doctest_out("""
-    Utility class for quickly generating URIRefs with a common prefix
-
-    >>> from rdflib import Namespace
-    >>> n = Namespace("http://example.org/")
-    >>> n.Person # as attribute
-    rdflib.term.URIRef(%(u)s'http://example.org/Person')
-    >>> n['first-name'] # as item - for things that are not valid python identifiers
-    rdflib.term.URIRef(%(u)s'http://example.org/first-name')
-
-    """)
-
-
-    def __new__(cls, value):
-        try:
-            rt = str.__new__(cls, value)
-        except UnicodeDecodeError:
-            rt = str.__new__(cls, value, 'utf-8')
-        return rt
-
-
-    @property
-    def title(self):
-        return URIRef(self + 'title')
-
-    def term(self, name):
-        # need to handle slices explicitly because of __getitem__ override
-        return URIRef(self + (name if isinstance(name, str) else ''))
-
-    def __getitem__(self, key, default=None):
-        return self.term(key)
-
-    def __getattr__(self, name):
-        if name.startswith("__"):  # ignore any special Python names!
-            raise AttributeError
-        else:
-            return self.term(name)
-
-    def __repr__(self):
-        return "Namespace(%s)"%str.__repr__(self)
-
-
-class URIPattern(str):
-
-    __doc__ = format_doctest_out("""
-    Utility class for creating URIs according to some pattern
-    This supports either new style formatting with .format
-    or old-style with %% operator
-
-    >>> u=URIPattern("http://example.org/%%s/%%d/resource")
-    >>> u%%('books', 12345)
-    rdflib.term.URIRef(%(u)s'http://example.org/books/12345/resource')
-
-    """)
-
-    def __new__(cls, value):
-        try:
-            rt = str.__new__(cls, value)
-        except UnicodeDecodeError:
-            rt = str.__new__(cls, value, 'utf-8')
-        return rt
-
-    def __mod__(self, *args, **kwargs):
-        return URIRef(str(self).__mod__(*args, **kwargs))
-
-    def format(self, *args, **kwargs):
-        return URIRef(str.format(self, *args, **kwargs))
-
-    def __repr__(self):
-        return "URIPattern(%r)"%str.__repr__(self)
-
-
-
-class ClosedNamespace(object):
-    """
-    A namespace with a closed list of members
-
-    Trying to create terms not listen is an error
-    """
-
-    def __init__(self, uri, terms):
-        self.uri = uri
-        self.__uris = {}
-        for t in terms:
-            self.__uris[t] = URIRef(self.uri + t)
-
-    def term(self, name):
-        uri = self.__uris.get(name)
-        if uri is None:
-            raise Exception(
-                "term '%s' not in namespace '%s'" % (name, self.uri))
-        else:
-            return uri
-
-    def __getitem__(self, key, default=None):
-        return self.term(key)
-
-    def __getattr__(self, name):
-        if name.startswith("__"):  # ignore any special Python names!
-            raise AttributeError
-        else:
-            return self.term(name)
-
-    def __str__(self):
-        return str(self.uri)
-
-    def __repr__(self):
-        return """rdf.namespace.ClosedNamespace('%s')""" % str(self.uri)
-
-
-class _RDFNamespace(ClosedNamespace):
-    """
-    Closed namespace for RDF terms
-    """
-    def __init__(self):
-        super(_RDFNamespace, self).__init__(
-            URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#"),
-            terms=[
-                # Syntax Names
-                "RDF", "Description", "ID", "about", "parseType",
-                "resource", "li", "nodeID", "datatype",
-
-                # RDF Classes
-                "Seq", "Bag", "Alt", "Statement", "Property",
-                "List", "PlainLiteral",
-
-                # RDF Properties
-                "subject", "predicate", "object", "type",
-                "value", "first", "rest",
-                # and _n where n is a non-negative integer
-
-                # RDF Resources
-                "nil",
-
-                # Added in RDF 1.1
-                "XMLLiteral", "HTML", "langString"]
-        )
-
-    def term(self, name):
-        try:
-            i = int(name)
-            return URIRef("%s_%s" % (self.uri, i))
-        except ValueError:
-            return super(_RDFNamespace, self).term(name)
-
-RDF = _RDFNamespace()
-
-RDFS = ClosedNamespace(
-    uri=URIRef("http://www.w3.org/2000/01/rdf-schema#"),
-    terms=[
-        "Resource", "Class", "subClassOf", "subPropertyOf", "comment", "label",
-        "domain", "range", "seeAlso", "isDefinedBy", "Literal", "Container",
-        "ContainerMembershipProperty", "member", "Datatype"]
-)
-
-OWL = Namespace('http://www.w3.org/2002/07/owl#')
-
-XSD = Namespace(_XSD_PFX)
-
-SKOS = Namespace('http://www.w3.org/2004/02/skos/core#')
-DOAP = Namespace('http://usefulinc.com/ns/doap#')
-FOAF = Namespace('http://xmlns.com/foaf/0.1/')
-DC = Namespace('http://purl.org/dc/elements/1.1/')
-DCTERMS = Namespace('http://purl.org/dc/terms/')
-VOID = Namespace('http://rdfs.org/ns/void#')
-
-
-
-class NamespaceManager(object):
-    """
-
-    Class for managing prefix => namespace mappings
-
-    Sample usage from FuXi ...
-
-    .. code-block:: python
-
-        ruleStore = N3RuleStore(additionalBuiltins=additionalBuiltins)
-        nsMgr = NamespaceManager(Graph(ruleStore))
-        ruleGraph = Graph(ruleStore,namespace_manager=nsMgr)
-
-
-    and ...
-
-    .. code-block:: pycon
-
-        >>> import rdflib
-        >>> from rdflib import Graph
-        >>> from rdflib.namespace import Namespace, NamespaceManager
-        >>> exNs = Namespace('http://example.com/')
-        >>> namespace_manager = NamespaceManager(Graph())
-        >>> namespace_manager.bind('ex', exNs, override=False)
-        >>> g = Graph()
-        >>> g.namespace_manager = namespace_manager
-        >>> all_ns = [n for n in g.namespace_manager.namespaces()]
-        >>> assert ('ex', rdflib.term.URIRef('http://example.com/')) in all_ns
-        >>>
-
-    """
-    def __init__(self, graph):
-        self.graph = graph
-        self.__cache = {}
-        self.__log = None
-        self.bind("xml", "http://www.w3.org/XML/1998/namespace")
-        self.bind("rdf", RDF)
-        self.bind("rdfs", RDFS)
-        self.bind("xsd", XSD)
-
-    def reset(self):
-        self.__cache = {}
-
-    def __get_store(self):
-        return self.graph.store
-    store = property(__get_store)
-
-    def qname(self, uri):
-        prefix, namespace, name = self.compute_qname(uri)
-        if prefix == "":
-            return name
-        else:
-            return ":".join((prefix, name))
-
-    def normalizeUri(self, rdfTerm):
-        """
-        Takes an RDF Term and 'normalizes' it into a QName (using the
-        registered prefix) or (unlike compute_qname) the Notation 3
-        form for URIs: <...URI...>
-        """
-        try:
-            namespace, name = split_uri(rdfTerm)
-            namespace = URIRef(str(namespace))
-        except:
-            if isinstance(rdfTerm, Variable):
-                return "?%s" % rdfTerm
-            else:
-                return "<%s>" % rdfTerm
-        prefix = self.store.prefix(namespace)
-        if prefix is None and isinstance(rdfTerm, Variable):
-            return "?%s" % rdfTerm
-        elif prefix is None:
-            return "<%s>" % rdfTerm
-        else:
-            qNameParts = self.compute_qname(rdfTerm)
-            return ':'.join([qNameParts[0], qNameParts[-1]])
-
-    def compute_qname(self, uri, generate=True):
-
-        if not _is_valid_uri(uri):
-            raise Exception('"%s" does not look like a valid URI, I cannot serialize this. Perhaps you wanted to urlencode it?'%uri)
-
-
-        if not uri in self.__cache:
-            namespace, name = split_uri(uri)
-            namespace = URIRef(namespace)
-            prefix = self.store.prefix(namespace)
-            if prefix is None:
-                if not generate:
-                    raise Exception(
-                        "No known prefix for %s and generate=False")
-                num = 1
-                while 1:
-                    prefix = "ns%s" % num
-                    if not self.store.namespace(prefix):
-                        break
-                    num += 1
-                self.bind(prefix, namespace)
-            self.__cache[uri] = (prefix, namespace, name)
-        return self.__cache[uri]
-
-    def bind(self, prefix, namespace, override=True, replace=False):
-
-        """bind a given namespace to the prefix
-
-        if override, rebind, even if the given namespace is already
-        bound to another prefix.
-
-        if replace, replace any existing prefix with the new namespace
-
-        """
-
-        namespace = URIRef(str(namespace))
-        # When documenting explain that override only applies in what cases
-        if prefix is None:
-            prefix = ''
-        bound_namespace = self.store.namespace(prefix)
-        # Check if the bound_namespace contains a URI
-        # and if so convert it into a URIRef for comparison
-        # This is to prevent duplicate namespaces with the
-        # same URI
-        if bound_namespace:
-            bound_namespace = URIRef(bound_namespace)
-        if bound_namespace and bound_namespace != namespace:
-
-            if replace:
-                self.store.bind(prefix, namespace)
-                return
-
-            # prefix already in use for different namespace
-            #
-            # append number to end of prefix until we find one
-            # that's not in use.
-            if not prefix:
-                prefix = "default"
-            num = 1
-            while 1:
-                new_prefix = "%s%s" % (prefix, num)
-                tnamespace = self.store.namespace(new_prefix)
-                if tnamespace and namespace == URIRef(tnamespace):
-                    # the prefix is already bound to the correct
-                    # namespace
-                    return
-                if not self.store.namespace(new_prefix):
-                    break
-                num += 1
-            self.store.bind(new_prefix, namespace)
-        else:
-            bound_prefix = self.store.prefix(namespace)
-            if bound_prefix is None:
-                self.store.bind(prefix, namespace)
-            elif bound_prefix == prefix:
-                pass  # already bound
-            else:
-                if override or bound_prefix.startswith("_"):  # or a generated
-                                                              # prefix
-                    self.store.bind(prefix, namespace)
-
-    def namespaces(self):
-        for prefix, namespace in self.store.namespaces():
-            namespace = URIRef(namespace)
-            yield prefix, namespace
-
-    def absolutize(self, uri, defrag=1):
-        base = urljoin("file:", pathname2url(os.getcwd()))
-        result = urljoin("%s/" % base, uri, allow_fragments=not defrag)
-        if defrag:
-            result = urldefrag(result)[0]
-        if not defrag:
-            if uri and uri[-1] == "#" and result[-1] != "#":
-                result = "%s#" % result
-        return URIRef(result)
-
-# From: http://www.w3.org/TR/REC-xml#NT-CombiningChar
-#
-# * Name start characters must have one of the categories Ll, Lu, Lo,
-#   Lt, Nl.
-#
-# * Name characters other than Name-start characters must have one of
-#   the categories Mc, Me, Mn, Lm, or Nd.
-#
-# * Characters in the compatibility area (i.e. with character code
-#   greater than #xF900 and less than #xFFFE) are not allowed in XML
-#   names.
-#
-# * Characters which have a font or compatibility decomposition
-#   (i.e. those with a "compatibility formatting tag" in field 5 of the
-#   database -- marked by field 5 beginning with a "<") are not allowed.
-#
-# * The following characters are treated as name-start characters rather
-#   than name characters, because the property file classifies them as
-#   Alphabetic: [#x02BB-#x02C1], #x0559, #x06E5, #x06E6.
-#
-# * Characters #x20DD-#x20E0 are excluded (in accordance with Unicode
-#   2.0, section 5.14).
-#
-# * Character #x00B7 is classified as an extender, because the property
-#   list so identifies it.
-#
-# * Character #x0387 is added as a name character, because #x00B7 is its
-#   canonical equivalent.
-#
-# * Characters ':' and '_' are allowed as name-start characters.
-#
-# * Characters '-' and '.' are allowed as name characters.
-
-from unicodedata import category
-
-NAME_START_CATEGORIES = ["Ll", "Lu", "Lo", "Lt", "Nl"]
-NAME_CATEGORIES = NAME_START_CATEGORIES + ["Mc", "Me", "Mn", "Lm", "Nd"]
-ALLOWED_NAME_CHARS = ["\u00B7", "\u0387", "-", ".", "_"]
-
-# http://www.w3.org/TR/REC-xml-names/#NT-NCName
-#  [4] NCName ::= (Letter | '_') (NCNameChar)* /* An XML Name, minus
-#      the ":" */
-#  [5] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar
-#      | Extender
-
-
-def is_ncname(name):
-    first = name[0]
-    if first == "_" or category(first) in NAME_START_CATEGORIES:
-        for i in range(1, len(name)):
-            c = name[i]
-            if not category(c) in NAME_CATEGORIES:
-                if c in ALLOWED_NAME_CHARS:
-                    continue
-                return 0
-            # if in compatibility area
-            # if decomposition(c)!='':
-            #    return 0
-
-        return 1
-    else:
-        return 0
-
-XMLNS = "http://www.w3.org/XML/1998/namespace"
-
-
-def split_uri(uri):
-    if uri.startswith(XMLNS):
-        return (XMLNS, uri.split(XMLNS)[1])
-    length = len(uri)
-    for i in range(0, length):
-        c = uri[-i - 1]
-        if not category(c) in NAME_CATEGORIES:
-            if c in ALLOWED_NAME_CHARS:
-                continue
-            for j in range(-1 - i, length):
-                if category(uri[j]) in NAME_START_CATEGORIES or uri[j] == "_":
-                    ns = uri[:j]
-                    if not ns:
-                        break
-                    ln = uri[j:]
-                    return (ns, ln)
-            break
-    raise Exception("Can't split '%s'" % uri)