| Current File : /home/jvzmxxx/wiki1/extensions/EventLogging/server/eventlogging/compat.py |
# -*- coding: utf-8 -*-
"""
eventlogging.compat
~~~~~~~~~~~~~~~~~~~
The source code for EventLogging aims to be compatible with both
Python 2 and 3 without requiring any translation to run on one or the
other version. This module supports this goal by providing import
paths and helper functions that wrap differences between Python 2 and
Python 3.
"""
# flake8: noqa
# pylint: disable=E0611, F0401, E1101
from __future__ import unicode_literals
import functools
import hashlib
import operator
import sys
import time
import uuid
import warnings
try:
from .lib.monotonic import monotonic as monotonic_clock
except ImportError:
warnings.warn('Using non-monotonic time.time() as last-resort fallback '
'for eventlogging.monotonic_clock()', RuntimeWarning)
monotonic_clock = time.time
try:
import simplejson as json
except ImportError:
import json
__all__ = ('http_get', 'integer_types', 'items', 'json', 'monotonic_clock',
'string_types', 'unquote_plus', 'urisplit', 'urlopen', 'urlencode',
'uuid5')
PY3 = sys.version_info[0] == 3
if PY3:
items = operator.methodcaller('items')
from urllib.request import urlopen
from urllib.parse import (unquote_to_bytes as unquote, urlsplit, urlencode,
parse_qsl, SplitResult)
string_types = str,
integer_types = int,
else:
items = operator.methodcaller('iteritems')
from urllib import unquote, urlencode
from urllib2 import urlopen
from urlparse import urlsplit, parse_qsl, SplitResult
string_types = basestring,
integer_types = int, long
def urisplit(uri):
"""Like `urlparse.urlsplit`, except always parses query and fragment
components, regardless of URI scheme."""
scheme, netloc, path, query, fragment = urlsplit(uri)
if not fragment and '#' in path:
path, fragment = path.split('#', 1)
if not query and '?' in path:
path, query = path.split('?', 1)
return SplitResult(scheme, netloc, path, query, fragment)
def unquote_plus(unicode):
"""Replace %xx escapes by their single-character equivalent."""
unicode = unicode.replace('+', ' ')
bytes = unicode.encode('utf-8')
return unquote(bytes).decode('utf-8')
def http_get(url):
"""Simple wrapper around the standard library's `urlopen` function which
works around a circular ref. See <https://bugs.python.org/issue1208304>.
"""
req = None
try:
req = urlopen(url)
return req.read().decode('utf-8')
finally:
if req is not None:
if hasattr(req, 'fp') and hasattr(req.fp, '_sock'):
req.fp._sock.recv = None
req.close()
@functools.wraps(uuid.uuid5)
def uuid5(namespace, name):
"""Generate UUID5 for `name` in `namespace`."""
# Python 2 expects `name` to be bytes; Python 3, unicode. This
# variant expects unicode strings in both Python 2 and Python 3.
hash = hashlib.sha1(namespace.bytes + name.encode('utf-8')).digest()
return uuid.UUID(bytes=hash[:16], version=5)