| # -*- coding: utf-8 -*- |
| # flake8: noqa |
| """ |
| hyper/compat |
| ~~~~~~~~~~~~ |
| |
| Normalizes the Python 2/3 API for internal use. |
| """ |
| from contextlib import contextmanager |
| import sys |
| import zlib |
| |
| try: |
| from . import ssl_compat |
| except ImportError: |
| # TODO log? |
| ssl_compat = None |
| |
| _ver = sys.version_info |
| is_py2 = _ver[0] == 2 |
| is_py2_7_9_or_later = _ver[0] >= 2 and _ver[1] >= 7 and _ver[2] >= 9 |
| is_py3 = _ver[0] == 3 |
| is_py3_3 = is_py3 and _ver[1] == 3 |
| |
| |
| @contextmanager |
| def ignore_missing(): |
| try: |
| yield |
| except (AttributeError, NotImplementedError): # pragma: no cover |
| pass |
| |
| if is_py2: |
| if is_py2_7_9_or_later: |
| import ssl |
| else: |
| ssl = ssl_compat |
| |
| from urllib import urlencode |
| from urlparse import urlparse, urlsplit |
| from itertools import imap |
| |
| def to_byte(char): |
| return ord(char) |
| |
| def decode_hex(b): |
| return b.decode('hex') |
| |
| def write_to_stdout(data): |
| sys.stdout.write(data + '\n') |
| sys.stdout.flush() |
| |
| # The standard zlib.compressobj() accepts only positional arguments. |
| def zlib_compressobj(level=6, method=zlib.DEFLATED, wbits=15, memlevel=8, |
| strategy=zlib.Z_DEFAULT_STRATEGY): |
| return zlib.compressobj(level, method, wbits, memlevel, strategy) |
| |
| unicode = unicode |
| bytes = str |
| |
| elif is_py3: |
| from urllib.parse import urlencode, urlparse, urlsplit |
| |
| imap = map |
| |
| def to_byte(char): |
| return char |
| |
| def decode_hex(b): |
| return bytes.fromhex(b) |
| |
| def write_to_stdout(data): |
| sys.stdout.buffer.write(data + b'\n') |
| sys.stdout.buffer.flush() |
| |
| zlib_compressobj = zlib.compressobj |
| |
| if is_py3_3: |
| ssl = ssl_compat |
| else: |
| import ssl |
| |
| unicode = str |
| bytes = bytes |