Avoid importing asyncio directly because that in turn initializes logging (#8)

This commit is contained in:
Bruno Oliveira 2016-12-13 21:54:20 -02:00
parent 1312b83866
commit caee5ce489
2 changed files with 14 additions and 10 deletions

View File

@ -19,11 +19,6 @@ except ImportError: # pragma: no cover
# Only available in Python 3.4+ or as a backport
enum = None
try:
import asyncio
except ImportError: # pragma: no cover
# Only available in Python 3.4+ or as a backport
asyncio = None
_PY3 = sys.version_info > (3, 0)
_PY2 = not _PY3
@ -49,9 +44,17 @@ REGEX_TYPE = type(re.compile(''))
def is_generator(func):
genfunc = inspect.isgeneratorfunction(func)
if asyncio is not None:
return genfunc and not asyncio.iscoroutinefunction(func)
return genfunc
return genfunc and not iscoroutinefunction(func)
def iscoroutinefunction(func):
"""Return True if func is a decorated coroutine function.
Note: copied and modified from Python 3.5's builtin couroutines.py to avoid import asyncio directly,
which in turns also initializes the "logging" module as side-effect (see issue #8).
"""
return (getattr(func, '_is_coroutine', False) or
(hasattr(inspect, 'iscoroutinefunction') and inspect.iscoroutinefunction(func)))
def getlocation(function, curdir):

View File

@ -15,8 +15,8 @@ def test_is_generator():
assert not is_generator(foo)
@pytest.mark.skipif(sys.version_info < (3, 4), reason='asyncio available in Python 3.4+')
def test_is_generator_asyncio(testdir):
pytest.importorskip('asyncio')
testdir.makepyfile("""
from _pytest.compat import is_generator
import asyncio
@ -27,7 +27,8 @@ def test_is_generator_asyncio(testdir):
def test_is_generator_asyncio():
assert not is_generator(baz)
""")
result = testdir.runpytest()
# avoid importing asyncio into pytest's own process, which in turn imports logging (#8)
result = testdir.runpytest_subprocess()
result.stdout.fnmatch_lines(['*1 passed*'])