Skip to content

Commit

Permalink
bundle dnspython in support/; resolving is always green
Browse files Browse the repository at this point in the history
Fixes installation issue when older dnspython is present in system packages
#341
  • Loading branch information
temoto committed Aug 20, 2016
1 parent 4f0913d commit 0983889
Show file tree
Hide file tree
Showing 101 changed files with 14,678 additions and 73 deletions.
5 changes: 0 additions & 5 deletions .travis.yml
Expand Up @@ -6,29 +6,24 @@ env:
- TOX_ENV=py26-epolls
- TOX_ENV=py26-poll
- TOX_ENV=py26-selects
- TOX_ENV=py27-dns
- TOX_ENV=py27-epolls
- TOX_ENV=py27-poll
- TOX_ENV=py27-selects
- TOX_ENV=py33-epolls
- TOX_ENV=py33-poll
- TOX_ENV=py33-selects
- TOX_ENV=py34-dns
- TOX_ENV=py34-epolls
- TOX_ENV=py34-poll
- TOX_ENV=py34-selects
- TOX_ENV=py35-dns
- TOX_ENV=py35-epolls
- TOX_ENV=py35-poll
- TOX_ENV=py35-selects
- TOX_ENV=pypy-dns
- TOX_ENV=pypy-epolls
- TOX_ENV=pypy-poll
- TOX_ENV=pypy-selects
matrix:
fast_finish: true
allow_failures:
- env: TOX_ENV=pypy-dns
- env: TOX_ENV=pypy-epolls
- env: TOX_ENV=pypy-poll
- env: TOX_ENV=pypy-selects
Expand Down
13 changes: 13 additions & 0 deletions bin/pull-dnspython
@@ -0,0 +1,13 @@
#!/bin/bash -eux
cd "$( dirname "${BASH_SOURCE[0]}" )/.."
version=${1-188aa701a6826c607da0624e31a8c4618d0a8017}

This comment has been minimized.

Copy link
@tipabu

tipabu Aug 22, 2016

Contributor

I'm a little wary of taking tip-of-master rather than a tagged release, but maybe that's overly-cautious of me.

This comment has been minimized.

Copy link
@temoto

temoto Aug 22, 2016

Author Member

I agree, you are over cautious. :-)

upstream_path=./dnspython-${version}
if [[ ! -d "${upstream_path}" ]]; then
curl -L -odnspython.zip "https://github.com/rthalley/dnspython/archive/${version}.zip"
unzip dnspython.zip
rm dnspython.zip
fi
rm -rf eventlet/support/dns
# patch --directory=eventlet/support -p1 --normal --forward -r/dev/null <./dns.patch
mv ${upstream_path}/dns eventlet/support/
rm -rf ${upstream_path}
36 changes: 14 additions & 22 deletions eventlet/green/socket.py
@@ -1,38 +1,30 @@
import os
import sys
import warnings

__import__('eventlet.green._socket_nodns')
__socket = sys.modules['eventlet.green._socket_nodns']

__all__ = __socket.__all__
__patched__ = __socket.__patched__ + ['gethostbyname', 'getaddrinfo', 'create_connection', ]
__patched__ = __socket.__patched__ + ['gethostbyname', 'getaddrinfo', 'create_connection']

This comment has been minimized.

Copy link
@tipabu

tipabu Aug 22, 2016

Contributor

Should we just add gethostbyname_ex and getnameinfo here and drop line 27?


from eventlet.patcher import slurp_properties
slurp_properties(__socket, globals(), srckeys=dir(__socket))


greendns = None
if os.environ.get("EVENTLET_NO_GREENDNS", '').lower() != "yes":
try:
from eventlet.support import greendns
except ImportError as ex:
try:
import dns
except ImportError:
# greendns import failed because we don't have dnspython - all is well,
# that's why we have the conditional import
pass
else:
# If, however, dnspython is importable yet greendns can't be imported
# this suggests there's another issue (like an import cycle)
raise
if os.environ.get("EVENTLET_NO_GREENDNS", '').lower() == "yes":
warnings.warn(
'EVENTLET_NO_GREENDNS is noop, dnspython is bundled and DNS resolution is always green',
DeprecationWarning,
stacklevel=2,
)

if greendns:
gethostbyname = greendns.gethostbyname
getaddrinfo = greendns.getaddrinfo
gethostbyname_ex = greendns.gethostbyname_ex
getnameinfo = greendns.getnameinfo
__patched__ = __patched__ + ['gethostbyname_ex', 'getnameinfo']
from eventlet.support import greendns
gethostbyname = greendns.gethostbyname
getaddrinfo = greendns.getaddrinfo
gethostbyname_ex = greendns.gethostbyname_ex
getnameinfo = greendns.getnameinfo
__patched__ = __patched__ + ['gethostbyname_ex', 'getnameinfo']


def create_connection(address,
Expand Down
54 changes: 54 additions & 0 deletions eventlet/support/dns/__init__.py
@@ -0,0 +1,54 @@
# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose with or without fee is hereby granted,
# provided that the above copyright notice and this permission notice
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""dnspython DNS toolkit"""

__all__ = [
'dnssec',
'e164',
'edns',
'entropy',
'exception',
'flags',
'hash',
'inet',
'ipv4',
'ipv6',
'message',
'name',
'namedict',
'node',
'opcode',
'query',
'rcode',
'rdata',
'rdataclass',
'rdataset',
'rdatatype',
'renderer',
'resolver',
'reversename',
'rrset',
'set',
'tokenizer',
'tsig',
'tsigkeyring',
'ttl',
'rdtypes',
'update',
'version',
'wiredata',
'zone',
]
47 changes: 47 additions & 0 deletions eventlet/support/dns/_compat.py
@@ -0,0 +1,47 @@
import sys
import decimal
from decimal import Context

if sys.version_info > (3,):
long = int
xrange = range
else:
long = long # pylint: disable=long-builtin
xrange = xrange # pylint: disable=xrange-builtin

# unicode / binary types
if sys.version_info > (3,):
text_type = str
binary_type = bytes
string_types = (str,)
unichr = chr
def maybe_decode(x):
return x.decode()
def maybe_encode(x):
return x.encode()
else:
text_type = unicode # pylint: disable=unicode-builtin, undefined-variable
binary_type = str
string_types = (
basestring, # pylint: disable=basestring-builtin, undefined-variable
)
unichr = unichr # pylint: disable=unichr-builtin
def maybe_decode(x):
return x
def maybe_encode(x):
return x


def round_py2_compat(what):
"""
Python 2 and Python 3 use different rounding strategies in round(). This
function ensures that results are python2/3 compatible and backward
compatible with previous py2 releases
:param what: float
:return: rounded long
"""
d = Context(
prec=len(str(long(what))), # round to integer with max precision
rounding=decimal.ROUND_HALF_UP
).create_decimal(str(what)) # str(): python 2.6 compat
return long(d)

0 comments on commit 0983889

Please sign in to comment.