make genscript provide information as to compatibility

(now that argparse is a dependency on python2.6)
This commit is contained in:
holger krekel 2013-07-26 08:59:31 +02:00
parent 7a8134660f
commit 2a7c79dbf5
7 changed files with 51 additions and 11 deletions

View File

@ -1,9 +1,12 @@
Changes between 2.3.5 and 2.4.DEV Changes between 2.3.5 and 2.4.DEV
----------------------------------- -----------------------------------
- integrate option tab-completion when argcomplete is used. Thanks - integrate tab-completion on options through use of "argcomplete".
Anthon van der Neut for the PR. This also lets pytest use argparse Thanks Anthon van der Neut for the PR.
instead of optparse.
- pytest now uses argparse instead of optparse (thanks Anthon) which
means that "argparse" is added as a dependency if installing into python2.6
environments or below.
- SO-17664702: call fixture finalizers even if the fixture function - SO-17664702: call fixture finalizers even if the fixture function
partially failed (finalizers would not always be called before) partially failed (finalizers would not always be called before)
@ -68,6 +71,13 @@ Changes between 2.3.5 and 2.4.DEV
- better parametrize error messages, thanks Brianna Laugher - better parametrize error messages, thanks Brianna Laugher
known incompatibilities:
- if calling --genscript from python2.7 or above, you only get a
standalone script which works on python2.7 or above. Use Python2.6
to also get a python2.5 compatible version.
Changes between 2.3.4 and 2.3.5 Changes between 2.3.4 and 2.3.5
----------------------------------- -----------------------------------

View File

@ -1,5 +1,6 @@
""" generate a single-file self-contained version of py.test """ """ generate a single-file self-contained version of py.test """
import py import py
import sys
def find_toplevel(name): def find_toplevel(name):
for syspath in py.std.sys.path: for syspath in py.std.sys.path:
@ -59,11 +60,21 @@ def pytest_addoption(parser):
def pytest_cmdline_main(config): def pytest_cmdline_main(config):
genscript = config.getvalue("genscript") genscript = config.getvalue("genscript")
if genscript: if genscript:
tw = py.io.TerminalWriter()
deps = ['py', '_pytest', 'pytest']
if sys.version_info < (2,7):
deps.append("argparse")
tw.line("generated script will run on python2.5-python3.3++")
else:
tw.line("WARNING: generated script will not run on python2.6 "
"or below due to 'argparse' dependency. Use python2.6 "
"to generate a python2.5/6 compatible script", red=True)
script = generate_script( script = generate_script(
'import py; raise SystemExit(py.test.cmdline.main())', 'import py; raise SystemExit(py.test.cmdline.main())',
['py', '_pytest', 'pytest'], deps,
) )
genscript = py.path.local(genscript) genscript = py.path.local(genscript)
genscript.write(script) genscript.write(script)
tw.line("generated pytest standalone script: %s" % genscript,
bold=True)
return 0 return 0

View File

@ -13,6 +13,10 @@ class DictImporter(object):
self.sources = sources self.sources = sources
def find_module(self, fullname, path=None): def find_module(self, fullname, path=None):
if fullname == "argparse" and sys.version_info >= (2,7):
# we were generated with <python2.7 (which pulls in argparse)
# but we are running now on a stdlib which has it, so use that.
return None
if fullname in self.sources: if fullname in self.sources:
return self return self
if fullname + '.__init__' in self.sources: if fullname + '.__init__' in self.sources:

View File

@ -8,6 +8,10 @@ except ImportError:
long_description = open("README.rst").read() long_description = open("README.rst").read()
def main(): def main():
install_requires = ["py>=1.4.15"]
if sys.version_info < (2,7):
install_requires.append("argparse")
setup( setup(
name='pytest', name='pytest',
description='py.test: simple powerful testing with Python', description='py.test: simple powerful testing with Python',
@ -21,7 +25,7 @@ def main():
entry_points= make_entry_points(), entry_points= make_entry_points(),
cmdclass = {'test': PyTest}, cmdclass = {'test': PyTest},
# the following should be enabled for release # the following should be enabled for release
install_requires=['py>=1.4.14'], install_requires=install_requires,
classifiers=['Development Status :: 6 - Mature', classifiers=['Development Status :: 6 - Mature',
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License', 'License :: OSI Approved :: MIT License',

View File

@ -77,6 +77,9 @@ winpymap = {
'python2.5': r'C:\Python25\python.exe', 'python2.5': r'C:\Python25\python.exe',
'python2.4': r'C:\Python24\python.exe', 'python2.4': r'C:\Python24\python.exe',
'python3.1': r'C:\Python31\python.exe', 'python3.1': r'C:\Python31\python.exe',
'python3.2': r'C:\Python32\python.exe',
'python3.3': r'C:\Python33\python.exe',
'python3.4': r'C:\Python34\python.exe',
} }
def getexecutable(name, cache={}): def getexecutable(name, cache={}):

View File

@ -1,10 +1,11 @@
import pytest
import py, os, sys import py, os, sys
import subprocess import subprocess
def pytest_funcarg__standalone(request): @pytest.fixture(scope="module")
return request.cached_setup(scope="module", def standalone(request):
setup=lambda: Standalone(request)) return Standalone(request)
class Standalone: class Standalone:
def __init__(self, request): def __init__(self, request):
@ -20,6 +21,12 @@ class Standalone:
return testdir._run(anypython, self.script, *args) return testdir._run(anypython, self.script, *args)
def test_gen(testdir, anypython, standalone): def test_gen(testdir, anypython, standalone):
if sys.version_info >= (2,7):
result = testdir._run(anypython, "-c",
"import sys;print sys.version_info >=(2,7)")
if result.stdout.str() == "False":
pytest.skip("genscript called from python2.7 cannot work "
"earlier python versions")
result = standalone.run(anypython, testdir, '--version') result = standalone.run(anypython, testdir, '--version')
assert result.ret == 0 assert result.ret == 0
result.stderr.fnmatch_lines([ result.stderr.fnmatch_lines([

View File

@ -1,3 +1,4 @@
from __future__ import with_statement
import py, pytest import py, pytest
from _pytest import config as parseopt from _pytest import config as parseopt
from textwrap import dedent from textwrap import dedent
@ -44,7 +45,7 @@ class TestParser:
res = argument.attrs() res = argument.attrs()
assert res['default'] == 42 assert res['default'] == 42
assert res['dest'] == 'abc' assert res['dest'] == 'abc'
def test_group_add_and_get(self): def test_group_add_and_get(self):
parser = parseopt.Parser() parser = parseopt.Parser()
group = parser.getgroup("hello", description="desc") group = parser.getgroup("hello", description="desc")
@ -128,7 +129,7 @@ class TestParser:
x = parser.addoption("--ultimate-answer", type=int) x = parser.addoption("--ultimate-answer", type=int)
args = parser.parse(['--ultimate-answer', '42']) args = parser.parse(['--ultimate-answer', '42'])
assert args.ultimate_answer == 42 assert args.ultimate_answer == 42
def test_parse_defaultgetter(self): def test_parse_defaultgetter(self):
def defaultget(option): def defaultget(option):
if not hasattr(option, 'type'): if not hasattr(option, 'type'):