#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

"""
Utilities to help Proton support both python2 and python3.
"""

import sys

# bridge between py2 Queue renamed as py3 queue
try:
    import Queue as queue
except ImportError:
    import queue  # type: ignore

try:
    from urlparse import urlparse, urlunparse
    from urllib import quote, unquote  # type: ignore
except ImportError:
    from urllib.parse import urlparse, urlunparse, quote, unquote

PY3 = sys.version_info[0] == 3

if PY3:
    def raise_(t, v=None, tb=None):
        """Mimic the old 2.x raise behavior:
        Raise an exception of type t with value v using optional traceback tb
        """
        if v is None:
            v = t()
        if tb is None:
            raise v
        else:
            raise v.with_traceback(tb)

    def iteritems(d, **kw):
        return iter(d.items(**kw))

    def socket_errno(e):
        return e.errno

    unichr = chr
else:
    # the raise syntax will cause a parse error in Py3, so 'sneak' in a
    # definition that won't cause the parser to barf
    exec("""def raise_(t, v=None, tb=None):
    raise t, v, tb
""")

    def iteritems(d, **kw):
        return d.iteritems(**kw)

    def socket_errno(e):
        return e[0]

    unichr = unichr
