Source code for rdflib.compat

"""
Utility functions and objects to ease Python 2/3 compatibility,
and different versions of support libraries.
"""

import re
import codecs
import warnings
import typing as t

if t.TYPE_CHECKING:
    import xml.etree.ElementTree as etree
else:
    try:
        from lxml import etree
    except ImportError:
        import xml.etree.ElementTree as etree


try:
    etree_register_namespace = etree.register_namespace
except AttributeError:

    import xml.etree.ElementTree as etreenative

    def etree_register_namespace(prefix, uri):
        etreenative._namespace_map[uri] = prefix


[docs]def cast_bytes(s, enc="utf-8"): if isinstance(s, str): return s.encode(enc) return s
[docs]def ascii(stream): return codecs.getreader("ascii")(stream)
[docs]def bopen(*args, **kwargs): return open(*args, mode="rb", **kwargs)
long_type = int
[docs]def sign(n): if n < 0: return -1 if n > 0: return 1 return 0
r_unicodeEscape = re.compile(r"(\\u[0-9A-Fa-f]{4}|\\U[0-9A-Fa-f]{8})") def _unicodeExpand(s): return r_unicodeEscape.sub(lambda m: chr(int(m.group(0)[2:], 16)), s) narrow_build = False try: chr(0x10FFFF) except ValueError: narrow_build = True if narrow_build: def _unicodeExpand(s): try: return r_unicodeEscape.sub(lambda m: chr(int(m.group(0)[2:], 16)), s) except ValueError: warnings.warn( "Encountered a unicode char > 0xFFFF in a narrow python build. " "Trying to degrade gracefully, but this can cause problems " "later when working with the string:\n%s" % s ) return r_unicodeEscape.sub( lambda m: codecs.decode(m.group(0), "unicode_escape"), s )
[docs]def decodeStringEscape(s): r""" s is byte-string - replace \ escapes in string """ s = s.replace("\\t", "\t") s = s.replace("\\n", "\n") s = s.replace("\\r", "\r") s = s.replace("\\b", "\b") s = s.replace("\\f", "\f") s = s.replace('\\"', '"') s = s.replace("\\'", "'") s = s.replace("\\\\", "\\") return s
# return _unicodeExpand(s) # hmm - string escape doesn't do unicode escaping
[docs]def decodeUnicodeEscape(s): """ s is a unicode string replace ``\\n`` and ``\\u00AC`` unicode escapes """ if "\\" not in s: # Most of times, there are no backslashes in strings. # In the general case, it could use maketrans and translate. return s s = s.replace("\\t", "\t") s = s.replace("\\n", "\n") s = s.replace("\\r", "\r") s = s.replace("\\b", "\b") s = s.replace("\\f", "\f") s = s.replace('\\"', '"') s = s.replace("\\'", "'") s = s.replace("\\\\", "\\") s = _unicodeExpand(s) # hmm - string escape doesn't do unicode escaping return s
# Migration to abc in Python 3.8 try: from collections.abc import Mapping, MutableMapping except: from collections import Mapping, MutableMapping