import sys

PY2 = sys.version_info[0] == 2


def _identity(x):  # pragma: no cover
    return x

__all__ = [
    'BytesIO',
    'PY2',
    'StringIO',
    'ascii_lowercase',
    'cmp',
    'configparser',
    'console_to_str',
    'imap',
    'input',
    'integer_types',
    'iteritems',
    'iterkeys',
    'itervalues',
    'izip',
    'number_types',
    'pickle',
    'range_type',
    'reraise',
    'string_types',
    'text_to_native',
    'text_type',
    'unichr',
    'urllib',
    'urlparse',
    'urlparse',
    'urlretrieve',
    '_identity',
]


if PY2:  # pragma: no cover
    unichr = unichr
    text_type = unicode
    string_types = (str, unicode)
    integer_types = (int, long)
    from urllib import urlretrieve

    def text_to_native(s, enc):
        return s.encode(enc)

    def iterkeys(d):
        return d.iterkeys()

    def itervalues(d):
        return d.itervalues()

    def iteritems(d):
        return d.iteritems()

    from cStringIO import StringIO as BytesIO
    from StringIO import StringIO
    import cPickle as pickle
    import ConfigParser as configparser

    from itertools import izip, imap
    range_type = xrange

    cmp = cmp

    input = raw_input
    from string import lower as ascii_lowercase
    import urlparse

    def console_to_str(s):
        return s.decode('utf_8')

    exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')

else:  # pragma: no cover
    unichr = chr
    text_type = str
    string_types = (str,)
    integer_types = (int, )

    def text_to_native(s, enc):
        return s

    def iterkeys(d):
        return iter(d.keys())

    def itervalues(d):
        return iter(d.values())

    def iteritems(d):
        return iter(d.items())

    from io import StringIO
    from io import BytesIO
    import pickle
    import configparser

    izip = zip
    imap = map
    range_type = range

    def cmp(a, b):
        return (a > b) - (a < b)

    input = input
    from string import ascii_lowercase
    import urllib.parse as urllib
    import urllib.parse as urlparse
    from urllib.request import urlretrieve

    console_encoding = sys.__stdout__.encoding

    def console_to_str(s):
        ''' From pypa/pip project, pip.backwardwardcompat. License MIT. '''
        try:
            return s.decode(console_encoding)
        except UnicodeDecodeError:
            return s.decode('utf_8')

    def reraise(tp, value, tb=None):
        if value.__traceback__ is not tb:
            raise(value.with_traceback(tb))
        raise value


number_types = integer_types + (float,)
