1 new commit in tox:
https://bitbucket.org/hpk42/tox/commits/37151bb27e53/
Changeset: 37151bb27e53
User: Vladimir Vitvitskiy
Date: 2015-04-22 21:18:46+00:00
Summary: fix PEP8 violations
* tox.ini updated to run PEP8 checks along with flakes
* added dev test environment to run any command in it or looponfail tests
* fixed all PEP8 violations pytest-pep8 complained about
* line width set to 99
Affected #: 16 files
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tests/test_config.py
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -65,8 +65,8 @@
def test_force_dep_version(self, initproj):
"""
- Make sure we can override dependencies configured in tox.ini when
using the command line option
- --force-dep.
+ Make sure we can override dependencies configured in tox.ini when
using the command line
+ option --force-dep.
"""
initproj("example123-0.5", filedefs={
'tox.ini': '''
@@ -83,7 +83,7 @@
config = parseconfig(
['--force-dep=dep1==1.5', '--force-dep=dep2==2.1',
'--force-dep=dep3==3.0'])
- assert config.option.force_dep== [
+ assert config.option.force_dep == [
'dep1==1.5', 'dep2==2.1', 'dep3==3.0']
assert [str(x) for x in config.envconfigs['python'].deps] == [
'dep1==1.5', 'dep2==2.1', 'dep3==3.0', 'dep4==4.0',
@@ -126,7 +126,6 @@
monkeypatch.undo()
assert not venv.matching_platform()
-
@pytest.mark.parametrize("plat", ["win", "lin", ])
def test_config_parse_platform_with_factors(self, newconfig, plat,
monkeypatch):
monkeypatch.setattr(sys, "platform", "win32")
@@ -171,6 +170,7 @@
""" % tmpdir)
assert config.toxworkdir == tmpdir
+
class TestParseconfig:
def test_search_parents(self, tmpdir):
b = tmpdir.mkdir("a").mkdir("b")
@@ -182,12 +182,13 @@
old.chdir()
assert config.toxinipath == toxinipath
+
def test_get_homedir(monkeypatch):
monkeypatch.setattr(py.path.local, "_gethomedir",
classmethod(lambda x: {}[1]))
assert not get_homedir()
monkeypatch.setattr(py.path.local, "_gethomedir",
- classmethod(lambda x: 0/0))
+ classmethod(lambda x: 0 / 0))
assert not get_homedir()
monkeypatch.setattr(py.path.local, "_gethomedir",
classmethod(lambda x: "123"))
@@ -224,7 +225,8 @@
assert x == [["echo", "whatever"]]
def test_command_substitution_from_other_section_multiline(self,
newconfig):
- """Ensure referenced multiline commands form from other section
injected as multiple commands."""
+ """Ensure referenced multiline commands form from other section
injected
+ as multiple commands."""
config = newconfig("""
[section]
commands =
@@ -275,7 +277,7 @@
reader = IniReader(config._cfg, fallbacksections=['mydefault'])
assert reader is not None
py.test.raises(tox.exception.ConfigError,
- 'reader.getdefault("mydefault", "key2")')
+ 'reader.getdefault("mydefault", "key2")')
def test_getdefault_fallback_sections(self, tmpdir, newconfig):
config = newconfig("""
@@ -346,7 +348,7 @@
x = reader.getdefault("section", "key1")
assert x == "hello"
py.test.raises(tox.exception.ConfigError,
- 'reader.getdefault("section", "key2")')
+ 'reader.getdefault("section", "key2")')
def test_getdefault_environment_substitution_with_default(self,
monkeypatch, newconfig):
monkeypatch.setenv("KEY1", "hello")
@@ -392,7 +394,7 @@
""")
reader = IniReader(config._cfg)
reader.addsubstitutions(item1="with space", item2="grr")
- #py.test.raises(tox.exception.ConfigError,
+ # py.test.raises(tox.exception.ConfigError,
# "reader.getargvlist('section', 'key1')")
assert reader.getargvlist('section', 'key1') == []
x = reader.getargvlist("section", "key2")
@@ -418,7 +420,7 @@
""")
reader = IniReader(config._cfg)
reader.addsubstitutions(item1="with space", item2="grr")
- #py.test.raises(tox.exception.ConfigError,
+ # py.test.raises(tox.exception.ConfigError,
# "reader.getargvlist('section', 'key1')")
assert reader.getargvlist('section', 'key1') == []
x = reader.getargvlist("section", "key2")
@@ -446,7 +448,7 @@
reader = IniReader(config._cfg)
posargs = ['hello', 'world']
reader.addsubstitutions(posargs, item2="value2")
- #py.test.raises(tox.exception.ConfigError,
+ # py.test.raises(tox.exception.ConfigError,
# "reader.getargvlist('section', 'key1')")
assert reader.getargvlist('section', 'key1') == []
argvlist = reader.getargvlist("section", "key2")
@@ -455,7 +457,7 @@
reader = IniReader(config._cfg)
reader.addsubstitutions([], item2="value2")
- #py.test.raises(tox.exception.ConfigError,
+ # py.test.raises(tox.exception.ConfigError,
# "reader.getargvlist('section', 'key1')")
assert reader.getargvlist('section', 'key1') == []
argvlist = reader.getargvlist("section", "key2")
@@ -490,8 +492,7 @@
x = reader.getargvlist("section", "key2")
assert x == [["cmd1", "-f", "foo", "bar baz"]]
- def test_positional_arguments_are_only_replaced_when_standing_alone(self,
- tmpdir, newconfig):
+ def test_positional_arguments_are_only_replaced_when_standing_alone(self,
tmpdir, newconfig):
config = newconfig("""
[section]
key=
@@ -520,7 +521,9 @@
posargs = ['hello', 'world']
reader.addsubstitutions(posargs, envlogdir='ENV_LOG_DIR',
envname='ENV_NAME')
- expected = ['py.test', '-n5',
'--junitxml=ENV_LOG_DIR/junit-ENV_NAME.xml', 'hello', 'world']
+ expected = [
+ 'py.test', '-n5', '--junitxml=ENV_LOG_DIR/junit-ENV_NAME.xml',
'hello', 'world'
+ ]
assert reader.getargvlist('section', 'key')[0] == expected
def test_getargv(self, newconfig):
@@ -582,8 +585,8 @@
envconfig = config.envconfigs['python']
assert envconfig.commands == [["xyz", "--abc"]]
assert envconfig.changedir == config.setupdir
- assert envconfig.sitepackages == False
- assert envconfig.develop == False
+ assert envconfig.sitepackages is False
+ assert envconfig.develop is False
assert envconfig.envlogdir == envconfig.envdir.join("log")
assert list(envconfig.setenv.keys()) == ['PYTHONHASHSEED']
hashseed = envconfig.setenv['PYTHONHASHSEED']
@@ -596,7 +599,7 @@
def test_sitepackages_switch(self, tmpdir, newconfig):
config = newconfig(["--sitepackages"], "")
envconfig = config.envconfigs['python']
- assert envconfig.sitepackages == True
+ assert envconfig.sitepackages is True
def test_installpkg_tops_develop(self, newconfig):
config = newconfig(["--installpkg=abc"], """
@@ -918,7 +921,7 @@
assert argv[0] == ["cmd1", "hello"]
def test_take_dependencies_from_other_testenv(self, newconfig):
- inisource="""
+ inisource = """
[testenv]
deps=
pytest
@@ -933,7 +936,7 @@
assert packages == ['pytest', 'pytest-cov', 'fun']
def test_take_dependencies_from_other_section(self, newconfig):
- inisource="""
+ inisource = """
[testing:pytest]
deps=
pytest
@@ -953,7 +956,7 @@
assert packages == ['pytest', 'pytest-cov', 'mock', 'fun']
def test_multilevel_substitution(self, newconfig):
- inisource="""
+ inisource = """
[testing:pytest]
deps=
pytest
@@ -978,7 +981,7 @@
assert packages == ['pytest', 'pytest-cov', 'mock', 'fun']
def test_recursive_substitution_cycle_fails(self, newconfig):
- inisource="""
+ inisource = """
[testing:pytest]
deps=
{[testing:mock]deps}
@@ -1004,7 +1007,7 @@
assert conf.changedir.dirpath().realpath() == tmpdir.realpath()
def test_factors(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = a-x,b
@@ -1022,7 +1025,7 @@
assert [dep.name for dep in configs['b'].deps] == ["dep-all", "dep-b"]
def test_factor_ops(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = {a,b}-{x,y}
@@ -1040,7 +1043,7 @@
assert get_deps("b-y") == ["dep-a-or-b", "dep-ab-and-y"]
def test_default_factors(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = py{26,27,33,34}-dep
@@ -1055,7 +1058,7 @@
@pytest.mark.issue188
def test_factors_in_boolean(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = py{27,33}
@@ -1069,7 +1072,7 @@
@pytest.mark.issue190
def test_factors_in_setenv(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = py27,py26
@@ -1083,7 +1086,7 @@
@pytest.mark.issue191
def test_factor_use_not_checked(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = py27-{a,b}
@@ -1095,7 +1098,7 @@
@pytest.mark.issue198
def test_factors_groups_touch(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = {a,b}{-x,}
@@ -1107,7 +1110,7 @@
assert set(configs.keys()) == set(['a', 'a-x', 'b', 'b-x'])
def test_period_in_factor(self, newconfig):
- inisource="""
+ inisource = """
[tox]
envlist = py27-{django1.6,django1.7}
@@ -1185,7 +1188,7 @@
[testenv:py27]
basepython=python2.7
"""
- #py.test.raises(tox.exception.ConfigError,
+ # py.test.raises(tox.exception.ConfigError,
# "newconfig(['-exyz'], inisource)")
config = newconfig([], inisource)
assert config.envlist == ["py26"]
@@ -1222,7 +1225,7 @@
assert env.basepython == name
else:
assert name.startswith("py")
- bp = "python%s.%s" %(name[2], name[3])
+ bp = "python%s.%s" % (name[2], name[3])
assert env.basepython == bp
def test_envlist_expansion(self, newconfig):
@@ -1284,6 +1287,7 @@
assert env.basepython == "python2.4"
assert env.commands == [['xyz']]
+
class TestHashseedOption:
def _get_envconfigs(self, newconfig, args=None, tox_ini=None,
@@ -1331,7 +1335,7 @@
args = ['--hashseed', '']
self._check_testenv(newconfig, '', args=args)
- @pytest.mark.xfail(sys.version_info >= (3,2),
+ @pytest.mark.xfail(sys.version_info >= (3, 2),
reason="at least Debian python 3.2/3.3 have a bug: "
"http://bugs.python.org/issue11884")
def test_passing_no_argument(self, tmpdir, newconfig):
@@ -1378,6 +1382,7 @@
"""
next_seed = [1000]
# This function is guaranteed to generate a different value each time.
+
def make_hashseed():
next_seed[0] += 1
return str(next_seed[0])
@@ -1401,6 +1406,7 @@
self._check_hashseed(envconfigs["hash1"], '2')
self._check_hashseed(envconfigs["hash2"], '123456789')
+
class TestIndexServer:
def test_indexserver(self, tmpdir, newconfig):
config = newconfig("""
@@ -1409,7 +1415,7 @@
name1 = XYZ
name2 = ABC
""")
- assert config.indexserver['default'].url == None
+ assert config.indexserver['default'].url is None
assert config.indexserver['name1'].url == "XYZ"
assert config.indexserver['name2'].url == "ABC"
@@ -1423,10 +1429,10 @@
config = newconfig([], inisource)
assert config.indexserver['default'].url == "http://pypi.testrun.org"
assert config.indexserver['name1'].url == "whatever"
- config = newconfig(['-i','qwe'], inisource)
+ config = newconfig(['-i', 'qwe'], inisource)
assert config.indexserver['default'].url == "qwe"
assert config.indexserver['name1'].url == "whatever"
- config = newconfig(['-i','name1=abc', '-i','qwe2'], inisource)
+ config = newconfig(['-i', 'name1=abc', '-i', 'qwe2'], inisource)
assert config.indexserver['default'].url == "qwe2"
assert config.indexserver['name1'].url == "abc"
@@ -1447,8 +1453,8 @@
config = newconfig([], inisource)
expected = "file://%s/.pip/downloads/simple" % config.homedir
assert config.indexserver['default'].url == expected
- assert config.indexserver['local1'].url == \
- config.indexserver['default'].url
+ assert config.indexserver['local1'].url ==
config.indexserver['default'].url
+
class TestParseEnv:
@@ -1467,6 +1473,7 @@
config = newconfig([], inisource)
assert config.envconfigs['hello'].recreate
+
class TestCmdInvocation:
def test_help(self, cmd):
result = cmd.run("tox", "-h")
@@ -1544,6 +1551,7 @@
r'*deps=*dep1, dep2==5.0*',
])
+
class TestArgumentParser:
def test_dash_e_single_1(self):
@@ -1591,12 +1599,15 @@
assert list(p.words()) == ['{sub:something with spaces}']
def test_command_parser_with_complex_word_set(self):
- complex_case = 'word [] [literal] {something} {some:other thing}
w{ord} w{or}d w{ord} w{o:rd} w{o:r}d {w:or}d w[]ord {posargs:{a key}}'
+ complex_case = (
+ 'word [] [literal] {something} {some:other thing} w{ord} w{or}d
w{ord} '
+ 'w{o:rd} w{o:r}d {w:or}d w[]ord {posargs:{a key}}')
p = CommandParser(complex_case)
parsed = list(p.words())
expected = [
'word', ' ', '[]', ' ', '[literal]', ' ', '{something}', ' ',
'{some:other thing}',
- ' ', 'w', '{ord}', ' ', 'w', '{or}', 'd', ' ', 'w', '{ord}', ' ',
'w', '{o:rd}', ' ', 'w', '{o:r}', 'd', ' ', '{w:or}', 'd',
+ ' ', 'w', '{ord}', ' ', 'w', '{or}', 'd', ' ', 'w', '{ord}', ' ',
'w', '{o:rd}', ' ',
+ 'w', '{o:r}', 'd', ' ', '{w:or}', 'd',
' ', 'w[]ord', ' ', '{posargs:{a key}}',
]
@@ -1619,7 +1630,10 @@
cmd = "nosetests -v -a !deferred --with-doctest []"
p = CommandParser(cmd)
parsed = list(p.words())
- assert parsed == ['nosetests', ' ', '-v', ' ', '-a', ' ', '!deferred',
' ', '--with-doctest', ' ', '[]']
+ assert parsed == [
+ 'nosetests', ' ', '-v', ' ', '-a', ' ', '!deferred', ' ',
+ '--with-doctest', ' ', '[]'
+ ]
@pytest.mark.skipif("sys.platform != 'win32'")
def test_commands_with_backslash(self, newconfig):
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tests/test_interpreters.py
--- a/tests/test_interpreters.py
+++ b/tests/test_interpreters.py
@@ -4,10 +4,12 @@
import pytest
from tox.interpreters import * # noqa
+
@pytest.fixture
def interpreters():
return Interpreters()
+
@pytest.mark.skipif("sys.platform != 'win32'")
def test_locate_via_py(monkeypatch):
class PseudoPy:
@@ -16,6 +18,7 @@
assert args[1] == '-c'
# Return value needs to actually exist!
return sys.executable
+
@staticmethod
def ret_pseudopy(name):
assert name == 'py'
@@ -24,6 +27,7 @@
monkeypatch.setattr(py.path.local, 'sysfind', ret_pseudopy)
assert locate_via_py('3', '2') == sys.executable
+
def test_find_executable():
p = find_executable(sys.executable)
assert p == py.path.local(sys.executable)
@@ -41,10 +45,11 @@
p = find_executable(name)
assert p
popen = py.std.subprocess.Popen([str(p), '-V'],
- stderr=py.std.subprocess.PIPE)
+ stderr=py.std.subprocess.PIPE)
stdout, stderr = popen.communicate()
assert ver in py.builtin._totext(stderr, "ascii")
+
def test_find_executable_extra(monkeypatch):
@staticmethod
def sysfind(x):
@@ -53,6 +58,7 @@
t = find_executable("qweqwe")
assert t == "hello"
+
def test_run_and_get_interpreter_info():
name = os.path.basename(sys.executable)
info = run_and_get_interpreter_info(name, sys.executable)
@@ -60,6 +66,7 @@
assert info.name == name
assert info.executable == sys.executable
+
class TestInterpreters:
def test_get_info_self_exceptions(self, interpreters):
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tests/test_result.py
--- a/tests/test_result.py
+++ b/tests/test_result.py
@@ -4,12 +4,14 @@
import tox
import pytest
+
@pytest.fixture
def pkg(tmpdir):
p = tmpdir.join("hello-1.0.tar.gz")
p.write("whatever")
return p
+
def test_pre_set_header(pkg):
replog = ResultLog()
d = replog.dict
@@ -22,6 +24,7 @@
replog2 = ResultLog.loads_json(data)
assert replog2.dict == replog.dict
+
def test_set_header(pkg):
replog = ResultLog()
d = replog.dict
@@ -31,13 +34,15 @@
assert replog.dict["toxversion"] == tox.__version__
assert replog.dict["platform"] == sys.platform
assert replog.dict["host"] == py.std.socket.getfqdn()
- assert replog.dict["installpkg"] == {"basename": "hello-1.0.tar.gz",
- "md5": pkg.computehash("md5"),
- "sha256": pkg.computehash("sha256")}
+ assert replog.dict["installpkg"] == {
+ "basename": "hello-1.0.tar.gz",
+ "md5": pkg.computehash("md5"),
+ "sha256": pkg.computehash("sha256")}
data = replog.dumps_json()
replog2 = ResultLog.loads_json(data)
assert replog2.dict == replog.dict
+
def test_addenv_setpython(pkg):
replog = ResultLog()
replog.set_header(installpkg=pkg)
@@ -47,6 +52,7 @@
assert envlog.dict["python"]["version"] == sys.version
assert envlog.dict["python"]["executable"] == sys.executable
+
def test_get_commandlog(pkg):
replog = ResultLog()
replog.set_header(installpkg=pkg)
@@ -60,4 +66,3 @@
assert envlog.dict["setup"]
setuplog2 = replog.get_envlog("py26").get_commandlog("setup")
assert setuplog2.list == setuplog.list
-
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tests/test_venv.py
--- a/tests/test_venv.py
+++ b/tests/test_venv.py
@@ -1,12 +1,13 @@
import py
import tox
import pytest
-import os, sys
+import os
+import sys
import tox._config
from tox._venv import * # noqa
from tox.interpreters import NoInterpreterInfo
-#def test_global_virtualenv(capfd):
+# def test_global_virtualenv(capfd):
# v = VirtualEnv()
# l = v.list()
# assert l
@@ -14,8 +15,11 @@
# assert not out
# assert not err
#
+
+
def test_getdigest(tmpdir):
- assert getdigest(tmpdir) == "0"*32
+ assert getdigest(tmpdir) == "0" * 32
+
def test_getsupportedinterpreter(monkeypatch, newconfig, mocksession):
config = newconfig([], """
@@ -25,8 +29,7 @@
venv = VirtualEnv(config.envconfigs['python'], session=mocksession)
interp = venv.getsupportedinterpreter()
# realpath needed for debian symlinks
- assert py.path.local(interp).realpath() \
- == py.path.local(sys.executable).realpath()
+ assert py.path.local(interp).realpath() ==
py.path.local(sys.executable).realpath()
monkeypatch.setattr(sys, 'platform', "win32")
monkeypatch.setattr(venv.envconfig, 'basepython', 'jython')
py.test.raises(tox.exception.UnsupportedInterpreter,
@@ -58,14 +61,14 @@
assert "virtualenv" == str(args[2])
if sys.platform != "win32":
# realpath is needed for stuff like the debian symlinks
- assert py.path.local(sys.executable).realpath() \
- == py.path.local(args[0]).realpath()
- #assert Envconfig.toxworkdir in args
+ assert py.path.local(sys.executable).realpath() ==
py.path.local(args[0]).realpath()
+ # assert Envconfig.toxworkdir in args
assert venv.getcommandpath("easy_install", cwd=py.path.local())
interp = venv._getliveconfig().python
assert interp == venv.envconfig._basepython_info.executable
assert venv.path_config.check(exists=False)
+
@pytest.mark.skipif("sys.platform == 'win32'")
def test_commandpath_venv_precendence(tmpdir, monkeypatch,
mocksession, newconfig):
@@ -80,6 +83,7 @@
p = venv.getcommandpath("easy_install")
assert py.path.local(p).relto(envconfig.envbindir), p
+
def test_create_sitepackages(monkeypatch, mocksession, newconfig):
config = newconfig([], """
[testenv:site]
@@ -106,6 +110,7 @@
assert "--system-site-packages" not in map(str, args)
assert "--no-site-packages" not in map(str, args)
+
def test_install_deps_wildcard(newmocksession):
mocksession = newmocksession([], """
[tox]
@@ -128,8 +133,8 @@
assert l[-1].cwd == venv.envconfig.config.toxinidir
assert "pip" in str(args[0])
assert args[1] == "install"
- #arg = "--download-cache=" + str(venv.envconfig.downloadcache)
- #assert arg in args[2:]
+ # arg = "--download-cache=" + str(venv.envconfig.downloadcache)
+ # assert arg in args[2:]
args = [arg for arg in args if str(arg).endswith("dep1-1.1.zip")]
assert len(args) == 1
@@ -162,6 +167,7 @@
deps = list(filter(None, [x[1] for x in venv._getliveconfig().deps]))
assert deps == ['dep1', 'dep2']
+
def test_install_deps_indexserver(newmocksession):
mocksession = newmocksession([], """
[tox]
@@ -194,6 +200,7 @@
assert "-i ABC" in args
assert "dep3" in args
+
def test_install_deps_pre(newmocksession):
mocksession = newmocksession([], """
[testenv]
@@ -213,6 +220,7 @@
assert "--pre " in args
assert "dep1" in args
+
def test_installpkg_indexserver(newmocksession, tmpdir):
mocksession = newmocksession([], """
[tox]
@@ -228,6 +236,7 @@
args = " ".join(l[0].args)
assert "-i ABC" in args
+
def test_install_recreate(newmocksession, tmpdir):
pkg = tmpdir.ensure("package.tar.gz")
mocksession = newmocksession(['--recreate'], """
@@ -241,6 +250,7 @@
venv.update()
mocksession.report.expect("verbosity0", "*recreate*")
+
def test_test_hashseed_is_in_output(newmocksession):
original_make_hashseed = tox._config.make_hashseed
tox._config.make_hashseed = lambda: '123456789'
@@ -255,6 +265,7 @@
venv.test()
mocksession.report.expect("verbosity0", "python runtests:
PYTHONHASHSEED='123456789'")
+
def test_test_runtests_action_command_is_in_output(newmocksession):
mocksession = newmocksession([], '''
[testenv]
@@ -265,6 +276,7 @@
venv.test()
mocksession.report.expect("verbosity0", "*runtests*commands?0? | echo foo
bar")
+
def test_install_error(newmocksession, monkeypatch):
mocksession = newmocksession(['--recreate'], """
[testenv]
@@ -277,6 +289,7 @@
mocksession.report.expect("error", "*not find*qwelkqw*")
assert venv.status == "commands failed"
+
def test_install_command_not_installed(newmocksession, monkeypatch):
mocksession = newmocksession(['--recreate'], """
[testenv]
@@ -288,6 +301,7 @@
mocksession.report.expect("warning", "*test command found but not*")
assert venv.status == 0
+
def test_install_command_whitelisted(newmocksession, monkeypatch):
mocksession = newmocksession(['--recreate'], """
[testenv]
@@ -303,6 +317,7 @@
invert=True)
assert venv.status == "commands failed"
+
@pytest.mark.skipif("not sys.platform.startswith('linux')")
def test_install_command_not_installed_bash(newmocksession):
mocksession = newmocksession(['--recreate'], """
@@ -340,6 +355,7 @@
for x in args:
assert "--download-cache" not in args, args
+
class TestCreationConfig:
def test_basic(self, newconfig, mocksession, tmpdir):
@@ -435,7 +451,7 @@
venv = VirtualEnv(envconfig, session=mocksession)
venv.update()
cconfig = venv._getliveconfig()
- cconfig.deps[:] = [("1"*32, "xyz.zip")]
+ cconfig.deps[:] = [("1" * 32, "xyz.zip")]
cconfig.writeconfig(venv.path_config)
mocksession._clearmocks()
venv.update()
@@ -453,6 +469,7 @@
venv.update()
mocksession.report.expect("verbosity0", "*recreate*")
+
class TestVenvTest:
def test_patchPATH(self, newmocksession, monkeypatch):
@@ -468,14 +485,14 @@
assert oldpath == "xyz"
res = os.environ['PATH']
assert res == "%s%sxyz" % (envconfig.envbindir, os.pathsep)
- p = "xyz"+os.pathsep+str(envconfig.envbindir)
+ p = "xyz" + os.pathsep + str(envconfig.envbindir)
monkeypatch.setenv("PATH", p)
venv.patchPATH()
res = os.environ['PATH']
- assert res == "%s%s%s" %(envconfig.envbindir, os.pathsep, p)
+ assert res == "%s%s%s" % (envconfig.envbindir, os.pathsep, p)
assert envconfig.commands
- monkeypatch.setattr(venv, '_pcall', lambda *args, **kwargs: 0/0)
+ monkeypatch.setattr(venv, '_pcall', lambda *args, **kwargs: 0 / 0)
py.test.raises(ZeroDivisionError, "venv._install(list('123'))")
py.test.raises(ZeroDivisionError, "venv.test()")
py.test.raises(ZeroDivisionError, "venv.run_install_command(['qwe'])")
@@ -488,6 +505,7 @@
assert 'PIP_REQUIRE_VIRTUALENV' not in os.environ
assert '__PYVENV_LAUNCHER__' not in os.environ
+
def test_env_variables_added_to_pcall(tmpdir, mocksession, newconfig,
monkeypatch):
pkg = tmpdir.ensure("package.tar.gz")
monkeypatch.setenv("X123", "123")
@@ -516,11 +534,12 @@
assert env['X123'] == "123"
assert set(["ENV_VAR", "VIRTUAL_ENV", "PYTHONHASHSEED", "X123", "PATH"])\
- .issubset(env)
+ .issubset(env)
- #for e in os.environ:
+ # for e in os.environ:
# assert e in env
+
def test_installpkg_no_upgrade(tmpdir, newmocksession):
pkg = tmpdir.ensure("package.tar.gz")
mocksession = newmocksession([], "")
@@ -532,6 +551,7 @@
assert len(l) == 1
assert '-U' not in l[0].args
+
def test_installpkg_upgrade(newmocksession, tmpdir):
pkg = tmpdir.ensure("package.tar.gz")
mocksession = newmocksession([], "")
@@ -545,6 +565,7 @@
assert '-U' in l[0].args[:index]
assert '--no-deps' in l[0].args[:index]
+
def test_run_install_command(newmocksession):
mocksession = newmocksession([], "")
venv = mocksession.getenv('python')
@@ -559,6 +580,7 @@
env = l[0].env
assert env is not None
+
def test_run_custom_install_command(newmocksession):
mocksession = newmocksession([], """
[testenv]
@@ -574,6 +596,7 @@
assert 'easy_install' in l[0].args[0]
assert l[0].args[1:] == ['whatever']
+
def test_command_relative_issue26(newmocksession, tmpdir, monkeypatch):
mocksession = newmocksession([], """
[testenv]
@@ -591,6 +614,7 @@
assert x4.endswith(os.sep + 'x')
mocksession.report.expect("warning", "*test command found but not*")
+
def test_sethome_only_on_option(newmocksession, monkeypatch):
mocksession = newmocksession([], "")
venv = mocksession.getenv('python')
@@ -598,6 +622,7 @@
monkeypatch.setattr(tox._venv, "hack_home_env", None)
venv._install(["x"], action=action)
+
def test_sethome_works_on_option(newmocksession, monkeypatch):
mocksession = newmocksession(["--set-home", "-i ALL=http://qwe"], "")
venv = mocksession.getenv('python')
@@ -622,6 +647,7 @@
assert not tmpdir.join(".pydistutils.cfg").check()
assert "PIP_INDEX_URL" not in env
+
def test_hack_home_env_passthrough(tmpdir, monkeypatch):
from tox._venv import hack_home_env
env = hack_home_env(tmpdir, "http://index")
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tests/test_z_cmdline.py
--- a/tests/test_z_cmdline.py
+++ b/tests/test_z_cmdline.py
@@ -12,35 +12,40 @@
from tox._cmdline import Session
from tox._config import parseconfig
+
def test_report_protocol(newconfig):
config = newconfig([], """
[testenv:mypython]
deps=xy
""")
+
class Popen:
def __init__(self, *args, **kwargs):
pass
+
def communicate(self):
return "", ""
+
def wait(self):
pass
session = Session(config, popen=Popen,
- Report=ReportExpectMock)
+ Report=ReportExpectMock)
report = session.report
report.expect("using")
venv = session.getvenv("mypython")
venv.update()
report.expect("logpopen")
+
def test__resolve_pkg(tmpdir, mocksession):
distshare = tmpdir.join("distshare")
spec = distshare.join("pkg123-*")
py.test.raises(tox.exception.MissingDirectory,
- 'mocksession._resolve_pkg(spec)')
+ 'mocksession._resolve_pkg(spec)')
distshare.ensure(dir=1)
py.test.raises(tox.exception.MissingDependency,
- 'mocksession._resolve_pkg(spec)')
+ 'mocksession._resolve_pkg(spec)')
distshare.ensure("pkg123-1.3.5.zip")
p = distshare.ensure("pkg123-1.4.5.zip")
@@ -58,6 +63,7 @@
result = mocksession._resolve_pkg(spec)
assert result == p
+
def test__resolve_pkg_doubledash(tmpdir, mocksession):
distshare = tmpdir.join("distshare")
p = distshare.ensure("pkg-mine-1.3.0.zip")
@@ -68,7 +74,6 @@
assert res == p
-
class TestSession:
def test_make_sdist(self, initproj):
initproj("example123-0.5", filedefs={
@@ -116,7 +121,7 @@
action.popen(["echo", ])
match = mocksession.report.getnext("logpopen")
assert match[1].outpath.relto(mocksession.config.logdir)
- assert match[1].shell == False
+ assert match[1].shell is False
def test_summary_status(self, initproj, capfd):
initproj("logexample123-0.5", filedefs={
@@ -177,6 +182,7 @@
"*created sdist package at*",
])
+
def test_minversion(cmd, initproj):
initproj("interp123-0.5", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -191,6 +197,7 @@
])
assert result.ret
+
def test_run_custom_install_command_error(cmd, initproj):
initproj("interp123-0.5", filedefs={
'tox.ini': '''
@@ -204,6 +211,7 @@
])
assert result.ret
+
def test_unknown_interpreter_and_env(cmd, initproj):
initproj("interp123-0.5", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -226,6 +234,7 @@
"*ERROR*unknown*",
])
+
def test_unknown_interpreter(cmd, initproj):
initproj("interp123-0.5", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -242,6 +251,7 @@
"*ERROR*InterpreterNotFound*xyz_unknown_interpreter*",
])
+
def test_skip_platform_mismatch(cmd, initproj):
initproj("interp123-0.5", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -260,6 +270,7 @@
"*python*platform mismatch*"
])
+
def test_skip_unknown_interpreter(cmd, initproj):
initproj("interp123-0.5", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -276,6 +287,7 @@
"*SKIPPED*InterpreterNotFound*xyz_unknown_interpreter*",
])
+
def test_unknown_dep(cmd, initproj):
initproj("dep123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -291,6 +303,7 @@
"*ERROR*could not install*qweqwe123*",
])
+
def test_unknown_environment(cmd, initproj):
initproj("env123-0.7", filedefs={
'tox.ini': ''
@@ -301,13 +314,13 @@
"*ERROR*unknown*environment*qpwoei*",
])
+
def test_skip_sdist(cmd, initproj):
initproj("pkg123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
'setup.py': """
syntax error
- """
- ,
+ """,
'tox.ini': '''
[tox]
skipsdist=True
@@ -318,12 +331,12 @@
result = cmd.run("tox", )
assert result.ret == 0
+
def test_minimal_setup_py_empty(cmd, initproj):
initproj("pkg123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
'setup.py': """
- """
- ,
+ """,
'tox.ini': ''
})
@@ -333,13 +346,13 @@
"*ERROR*empty*",
])
+
def test_minimal_setup_py_comment_only(cmd, initproj):
initproj("pkg123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
'setup.py': """\n# some comment
- """
- ,
+ """,
'tox.ini': ''
})
@@ -349,14 +362,14 @@
"*ERROR*empty*",
])
+
def test_minimal_setup_py_non_functional(cmd, initproj):
initproj("pkg123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
'setup.py': """
import sys
- """
- ,
+ """,
'tox.ini': ''
})
@@ -366,13 +379,13 @@
"*ERROR*check setup.py*",
])
+
def test_sdist_fails(cmd, initproj):
initproj("pkg123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
'setup.py': """
syntax error
- """
- ,
+ """,
'tox.ini': '',
})
result = cmd.run("tox", )
@@ -381,6 +394,7 @@
"*FAIL*could not package project*",
])
+
def test_package_install_fails(cmd, initproj):
initproj("pkg123-0.7", filedefs={
'tests': {'test_hello.py': "def test_hello(): pass"},
@@ -395,8 +409,7 @@
packages=['pkg123',],
install_requires=['qweqwe123'],
)
- """
- ,
+ """,
'tox.ini': '',
})
result = cmd.run("tox", )
@@ -406,14 +419,14 @@
])
-
class TestToxRun:
@pytest.fixture
def example123(self, initproj):
initproj("example123-0.5", filedefs={
- 'tests': {'test_hello.py': """
- def test_hello(pytestconfig):
- pass
+ 'tests': {
+ 'test_hello.py': """
+ def test_hello(pytestconfig):
+ pass
""",
},
'tox.ini': '''
@@ -475,6 +488,7 @@
assert not result.ret
assert "sdist-make" not in result.stdout.str()
+
def test_usedevelop(initproj, cmd):
initproj("example123", filedefs={'tox.ini': """
[testenv]
@@ -484,6 +498,7 @@
assert not result.ret
assert "sdist-make" not in result.stdout.str()
+
def test_usedevelop_mixed(initproj, cmd):
initproj("example123", filedefs={'tox.ini': """
[testenv:devenv]
@@ -502,11 +517,13 @@
assert not result.ret
assert "sdist-make" in result.stdout.str()
+
def test_test_usedevelop(cmd, initproj):
initproj("example123-0.5", filedefs={
- 'tests': {'test_hello.py': """
- def test_hello(pytestconfig):
- pass
+ 'tests': {
+ 'test_hello.py': """
+ def test_hello(pytestconfig):
+ pass
""",
},
'tox.ini': '''
@@ -568,6 +585,7 @@
result = cmd.run("tox")
assert not result.ret
+
def test_notest(initproj, cmd):
initproj("example123", filedefs={'tox.ini': """
# content of: tox.ini
@@ -586,6 +604,7 @@
"*py26*reusing*",
])
+
def test_PYC(initproj, cmd, monkeypatch):
initproj("example123", filedefs={'tox.ini': ''})
monkeypatch.setenv("PYTHONDOWNWRITEBYTECODE", 1)
@@ -595,6 +614,7 @@
"*create*",
])
+
def test_env_VIRTUALENV_PYTHON(initproj, cmd, monkeypatch):
initproj("example123", filedefs={'tox.ini': ''})
monkeypatch.setenv("VIRTUALENV_PYTHON", '/FOO')
@@ -604,6 +624,7 @@
"*create*",
])
+
def test_sdistonly(initproj, cmd):
initproj("example123", filedefs={'tox.ini': """
"""})
@@ -614,6 +635,7 @@
])
assert "-mvirtualenv" not in result.stdout.str()
+
def test_separate_sdist_no_sdistfile(cmd, initproj):
distshare = cmd.tmpdir.join("distshare")
initproj(("pkg123-foo", "0.7"), filedefs={
@@ -629,6 +651,7 @@
sdistfile = l[0]
assert 'pkg123-foo-0.7.zip' in str(sdistfile)
+
def test_separate_sdist(cmd, initproj):
distshare = cmd.tmpdir.join("distshare")
initproj("pkg123-0.7", filedefs={
@@ -663,6 +686,7 @@
sdist_path = session.sdist()
assert sdist_path == p
+
def test_installpkg(tmpdir, newconfig):
p = tmpdir.ensure("pkg123-1.0.zip")
config = newconfig(["--installpkg=%s" % p], "")
@@ -670,6 +694,7 @@
sdist_path = session.sdist()
assert sdist_path == p
+
@pytest.mark.xfail("sys.platform == 'win32' and sys.version_info < (2,6)",
reason="test needs better impl")
def test_envsitepackagesdir(cmd, initproj):
@@ -685,6 +710,7 @@
X:*tox*site-packages*
""")
+
def verify_json_report_format(data, testenvs=True):
assert data["reportversion"] == "1"
assert data["toxversion"] == tox.__version__
@@ -700,4 +726,3 @@
assert isinstance(pyinfo["version_info"], list)
assert pyinfo["version"]
assert pyinfo["executable"]
-
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tox.ini
--- a/tox.ini
+++ b/tox.ini
@@ -20,8 +20,29 @@
[testenv:flakes]
deps = pytest-flakes>=0.2
-commands = py.test --flakes -m flakes tox tests
+ pytest-pep8
+
+commands = py.test -x --flakes --pep8 tox tests
+
+[testenv:dev]
+# required to make looponfail reload on every source code change
+usedevelop = True
+
+deps =
+ pytest-xdist>=1.11
+commands = {posargs:py.test -s -x -f -v}
[pytest]
-rsyncdirs=tests tox
-addopts = -rsxXf
+rsyncdirs = tests tox
+addopts = -rsxX
+# pytest-xdist plugin configuration
+looponfailroots = tox tests
+norecursedirs = .hg .tox
+
+# pytest-pep8 plugin configuration
+pep8maxlinelength = 99
+# W503 - line break before binary operator
+# E402 - module level import not at top of file
+# E731 - do not assign a lambda expression, use a def
+pep8ignore =
+ *.py W503 E402 E731
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tox/__init__.py
--- a/tox/__init__.py
+++ b/tox/__init__.py
@@ -1,10 +1,12 @@
#
__version__ = '2.0.0.dev1'
+
class exception:
class Error(Exception):
def __str__(self):
- return "%s: %s" %(self.__class__.__name__, self.args[0])
+ return "%s: %s" % (self.__class__.__name__, self.args[0])
+
class ConfigError(Error):
""" error in tox configuration. """
class UnsupportedInterpreter(Error):
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tox/_cmdline.py
--- a/tox/_cmdline.py
+++ b/tox/_cmdline.py
@@ -17,9 +17,11 @@
from tox.result import ResultLog
from subprocess import STDOUT
+
def now():
return py.std.time.time()
+
def main(args=None):
try:
config = parseconfig(args, 'tox')
@@ -28,6 +30,7 @@
except KeyboardInterrupt:
raise SystemExit(2)
+
class Action(object):
def __init__(self, session, venv, msg, args):
self.venv = venv
@@ -55,12 +58,10 @@
def setactivity(self, name, msg):
self.activity = name
- self.report.verbosity0("%s %s: %s" %(self.venvname, name, msg),
- bold=True)
+ self.report.verbosity0("%s %s: %s" % (self.venvname, name, msg),
bold=True)
def info(self, name, msg):
- self.report.verbosity1("%s %s: %s" %(self.venvname, name, msg),
- bold=True)
+ self.report.verbosity1("%s %s: %s" % (self.venvname, name, msg),
bold=True)
def _initlogpath(self, actionid):
if self.venv:
@@ -83,8 +84,8 @@
resultjson = self.session.config.option.resultjson
if resultjson or redirect:
fout = self._initlogpath(self.id)
- fout.write("actionid=%s\nmsg=%s\ncmdargs=%r\nenv=%s\n" %(
- self.id, self.msg, args, env))
+ fout.write("actionid=%s\nmsg=%s\ncmdargs=%r\nenv=%s\n" % (
+ self.id, self.msg, args, env))
fout.flush()
self.popen_outpath = outpath = py.path.local(fout.name)
fin = outpath.open()
@@ -154,9 +155,9 @@
if hasattr(self, "commandlog"):
self.commandlog.add_command(popen.args, out, ret)
raise tox.exception.InvocationError(
- "%s (see %s)" %(invoked, outpath), ret)
+ "%s (see %s)" % (invoked, outpath), ret)
else:
- raise tox.exception.InvocationError("%r" %(invoked, ))
+ raise tox.exception.InvocationError("%r" % (invoked, ))
if not out and outpath:
out = outpath.read()
if hasattr(self, "commandlog"):
@@ -170,8 +171,8 @@
arg = cwd.bestrelpath(arg)
newargs.append(str(arg))
- #subprocess does not always take kindly to .py scripts
- #so adding the interpreter here.
+ # subprocess does not always take kindly to .py scripts
+ # so adding the interpreter here.
if sys.platform == "win32":
ext = os.path.splitext(str(newargs[0]))[1].lower()
if ext == '.py' and self.venv:
@@ -184,39 +185,37 @@
if env is None:
env = os.environ.copy()
return self.session.popen(args, shell=False, cwd=str(cwd),
- universal_newlines=True,
- stdout=stdout, stderr=stderr, env=env)
-
+ universal_newlines=True,
+ stdout=stdout, stderr=stderr, env=env)
class Reporter(object):
actionchar = "-"
+
def __init__(self, session):
self.tw = py.io.TerminalWriter()
self.session = session
self._reportedlines = []
- #self.cumulated_time = 0.0
+ # self.cumulated_time = 0.0
def logpopen(self, popen, env):
""" log information about the action.popen() created process. """
cmd = " ".join(map(str, popen.args))
if popen.outpath:
- self.verbosity1(" %s$ %s >%s" %(popen.cwd, cmd,
- popen.outpath,
- ))
+ self.verbosity1(" %s$ %s >%s" % (popen.cwd, cmd, popen.outpath,))
else:
- self.verbosity1(" %s$ %s " %(popen.cwd, cmd))
+ self.verbosity1(" %s$ %s " % (popen.cwd, cmd))
def logaction_start(self, action):
msg = action.msg + " " + " ".join(map(str, action.args))
- self.verbosity2("%s start: %s" %(action.venvname, msg), bold=True)
+ self.verbosity2("%s start: %s" % (action.venvname, msg), bold=True)
assert not hasattr(action, "_starttime")
action._starttime = now()
def logaction_finish(self, action):
duration = now() - action._starttime
- #self.cumulated_time += duration
- self.verbosity2("%s finish: %s after %.2f seconds" %(
+ # self.cumulated_time += duration
+ self.verbosity2("%s finish: %s after %.2f seconds" % (
action.venvname, action.msg, duration), bold=True)
def startsummary(self):
@@ -228,8 +227,7 @@
def using(self, msg):
if self.session.config.option.verbosity >= 1:
- self.logline("using %s" %(msg,), bold=True)
-
+ self.logline("using %s" % (msg,), bold=True)
def keyboard_interrupt(self):
self.error("KEYBOARDINTERRUPT")
@@ -275,7 +273,7 @@
if self.session.config.option.verbosity >= 2:
self.logline("%s" % msg, **opts)
- #def log(self, msg):
+ # def log(self, msg):
# py.builtin.print_(msg, file=sys.stderr)
@@ -288,13 +286,15 @@
self.report = Report(self)
self.make_emptydir(config.logdir)
config.logdir.ensure(dir=1)
- #self.report.using("logdir %s" %(self.config.logdir,))
- self.report.using("tox.ini: %s" %(self.config.toxinipath,))
+ # self.report.using("logdir %s" %(self.config.logdir,))
+ self.report.using("tox.ini: %s" % (self.config.toxinipath,))
self._spec2pkg = {}
self._name2venv = {}
try:
- self.venvlist = [self.getvenv(x)
- for x in self.config.envlist]
+ self.venvlist = [
+ self.getvenv(x)
+ for x in self.config.envlist
+ ]
except LookupError:
raise SystemExit(1)
self._actions = []
@@ -321,15 +321,14 @@
return action
def runcommand(self):
- self.report.using("tox-%s from %s" %(tox.__version__,
- tox.__file__))
+ self.report.using("tox-%s from %s" % (tox.__version__, tox.__file__))
if self.config.minversion:
minversion = NormalizedVersion(self.config.minversion)
toxversion = NormalizedVersion(tox.__version__)
if toxversion < minversion:
self.report.error(
- "tox version is %s, required is at least %s" %(
- toxversion, minversion))
+ "tox version is %s, required is at least %s" % (
+ toxversion, minversion))
raise SystemExit(1)
if self.config.option.showconfig:
self.showconfig()
@@ -342,7 +341,7 @@
for relpath in pathlist:
src = srcdir.join(relpath)
if not src.check():
- self.report.error("missing source file: %s" %(src,))
+ self.report.error("missing source file: %s" % (src,))
raise SystemExit(1)
target = destdir.join(relpath)
target.dirpath().ensure(dir=1)
@@ -358,7 +357,7 @@
self.make_emptydir(self.config.distdir)
action.popen([sys.executable, setup, "sdist", "--formats=zip",
"--dist-dir", self.config.distdir, ],
- cwd=self.config.setupdir)
+ cwd=self.config.setupdir)
try:
return self.config.distdir.listdir()[0]
except py.error.ENOENT:
@@ -375,12 +374,11 @@
)
raise SystemExit(1)
self.report.error(
- 'No dist directory found. Please check setup.py, e.g
with:\n'\
+ 'No dist directory found. Please check setup.py, e.g
with:\n'
' python setup.py sdist'
- )
+ )
raise SystemExit(1)
-
def make_emptydir(self, path):
if path.check():
self.report.info(" removing %s" % path)
@@ -446,25 +444,25 @@
:rtype: py.path.local
"""
if not self.config.option.sdistonly and (self.config.sdistsrc or
- self.config.option.installpkg):
+
self.config.option.installpkg):
sdist_path = self.config.option.installpkg
if not sdist_path:
sdist_path = self.config.sdistsrc
sdist_path = self._resolve_pkg(sdist_path)
self.report.info("using package %r, skipping 'sdist' activity " %
- str(sdist_path))
+ str(sdist_path))
else:
try:
sdist_path = self._makesdist()
except tox.exception.InvocationError:
v = sys.exc_info()[1]
self.report.error("FAIL could not package project - v = %r" %
- v)
+ v)
return
sdistfile = self.config.distshare.join(sdist_path.basename)
if sdistfile != sdist_path:
self.report.info("copying new sdistfile to %r" %
- str(sdistfile))
+ str(sdistfile))
try:
sdistfile.dirpath().ensure(dir=1)
except py.error.Error:
@@ -513,24 +511,23 @@
for venv in self.venvlist:
status = venv.status
if isinstance(status, tox.exception.InterpreterNotFound):
- msg = " %s: %s" %(venv.envconfig.envname, str(status))
+ msg = " %s: %s" % (venv.envconfig.envname, str(status))
if self.config.option.skip_missing_interpreters:
self.report.skip(msg)
else:
retcode = 1
self.report.error(msg)
elif status == "platform mismatch":
- msg = " %s: %s" %(venv.envconfig.envname, str(status))
+ msg = " %s: %s" % (venv.envconfig.envname, str(status))
self.report.verbosity1(msg)
elif status and status != "skipped tests":
- msg = " %s: %s" %(venv.envconfig.envname, str(status))
+ msg = " %s: %s" % (venv.envconfig.envname, str(status))
self.report.error(msg)
retcode = 1
else:
if not status:
status = "commands succeeded"
- self.report.good(" %s: %s" %(venv.envconfig.envname,
- status))
+ self.report.good(" %s: %s" % (venv.envconfig.envname, status))
if not retcode:
self.report.good(" congratulations :)")
@@ -586,7 +583,6 @@
versions.append("virtualenv-%s" % version.strip())
self.report.keyvalue("tool-versions:", " ".join(versions))
-
def _resolve_pkg(self, pkgspec):
try:
return self._spec2pkg[pkgspec]
@@ -614,7 +610,7 @@
items.append((ver, x))
else:
self.report.warning("could not determine version of: %s" %
- str(x))
+ str(x))
items.sort()
if not items:
raise tox.exception.MissingDependency(pkgspec)
@@ -624,6 +620,8 @@
_rex_getversion = py.std.re.compile("[\w_\-\+\.]+-(.*)(\.zip|\.tar.gz)")
+
+
def getversion(basename):
m = _rex_getversion.match(basename)
if m is None:
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tox/_config.py
--- a/tox/_config.py
+++ b/tox/_config.py
@@ -45,7 +45,7 @@
if inipath.check():
break
else:
- feedback("toxini file %r not found" %(basename), sysexit=True)
+ feedback("toxini file %r not found" % (basename), sysexit=True)
try:
parseini(config, inipath)
except tox.exception.InterpreterNotFound:
@@ -54,98 +54,104 @@
py.builtin.print_("ERROR: " + str(exn))
return config
+
def feedback(msg, sysexit=False):
py.builtin.print_("ERROR: " + msg, file=sys.stderr)
if sysexit:
raise SystemExit(1)
+
class VersionAction(argparse.Action):
def __call__(self, argparser, *args, **kwargs):
name = argparser.pkgname
mod = __import__(name)
version = mod.__version__
- py.builtin.print_("%s imported from %s" %(version, mod.__file__))
+ py.builtin.print_("%s imported from %s" % (version, mod.__file__))
raise SystemExit(0)
+
class CountAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if hasattr(namespace, self.dest):
- setattr(namespace, self.dest, int(getattr(namespace, self.dest))+1)
+ setattr(namespace, self.dest, int(getattr(namespace, self.dest)) +
1)
else:
setattr(namespace, self.dest, 0)
+
def prepare_parse(pkgname):
parser = argparse.ArgumentParser(description=__doc__,)
- #formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ # formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.pkgname = pkgname
parser.add_argument("--version", nargs=0, action=VersionAction,
- dest="version",
- help="report version information to stdout.")
+ dest="version",
+ help="report version information to stdout.")
parser.add_argument("-v", nargs=0, action=CountAction, default=0,
- dest="verbosity",
- help="increase verbosity of reporting output.")
+ dest="verbosity",
+ help="increase verbosity of reporting output.")
parser.add_argument("--showconfig", action="store_true",
- help="show configuration information for all environments. ")
+ help="show configuration information for all
environments. ")
parser.add_argument("-l", "--listenvs", action="store_true",
- dest="listenvs", help="show list of test environments")
+ dest="listenvs", help="show list of test environments")
parser.add_argument("-c", action="store", default="tox.ini",
- dest="configfile",
- help="use the specified config file name.")
+ dest="configfile",
+ help="use the specified config file name.")
parser.add_argument("-e", action="append", dest="env",
- metavar="envlist",
- help="work against specified environments (ALL selects all).")
+ metavar="envlist",
+ help="work against specified environments (ALL selects
all).")
parser.add_argument("--notest", action="store_true", dest="notest",
- help="skip invoking test commands.")
+ help="skip invoking test commands.")
parser.add_argument("--sdistonly", action="store_true", dest="sdistonly",
- help="only perform the sdist packaging activity.")
+ help="only perform the sdist packaging activity.")
parser.add_argument("--installpkg", action="store", default=None,
- metavar="PATH",
- help="use specified package for installation into venv, instead of "
- "creating an sdist.")
+ metavar="PATH",
+ help="use specified package for installation into
venv, instead of "
+ "creating an sdist.")
parser.add_argument("--develop", action="store_true", dest="develop",
- help="install package in the venv using 'setup.py develop' via "
- "'pip -e .'")
+ help="install package in the venv using 'setup.py
develop' via "
+ "'pip -e .'")
parser.add_argument("--set-home", action="store_true", dest="sethome",
- help="(experimental) force creating a new $HOME for each test "
- "environment and create .pydistutils.cfg|pip.conf files "
- "if index servers are specified with tox. ")
+ help="(experimental) force creating a new $HOME for
each test "
+ "environment and create .pydistutils.cfg|pip.conf
files "
+ "if index servers are specified with tox. ")
parser.add_argument('-i', action="append",
- dest="indexurl", metavar="URL",
- help="set indexserver url (if URL is of form name=url set the "
- "url for the 'name' indexserver, specifically)")
+ dest="indexurl", metavar="URL",
+ help="set indexserver url (if URL is of form name=url
set the "
+ "url for the 'name' indexserver, specifically)")
parser.add_argument("--pre", action="store_true", dest="pre",
- help="install pre-releases and development versions of dependencies. "
- "This will pass the --pre option to install_command (pip by
default).")
+ help="install pre-releases and development versions of
dependencies. "
+ "This will pass the --pre option to
install_command "
+ "(pip by default).")
parser.add_argument("-r", "--recreate", action="store_true",
- dest="recreate",
- help="force recreation of virtual environments")
+ dest="recreate",
+ help="force recreation of virtual environments")
parser.add_argument("--result-json", action="store",
- dest="resultjson", metavar="PATH",
- help="write a json file with detailed information about "
- "all commands and results involved. This will turn off "
- "pass-through output from running test commands which is "
- "instead captured into the json result file.")
+ dest="resultjson", metavar="PATH",
+ help="write a json file with detailed information
about "
+ "all commands and results involved. This will
turn off "
+ "pass-through output from running test commands
which is "
+ "instead captured into the json result file.")
# We choose 1 to 4294967295 because it is the range of PYTHONHASHSEED.
parser.add_argument("--hashseed", action="store",
- metavar="SEED", default=None,
- help="set PYTHONHASHSEED to SEED before running commands. "
- "Defaults to a random integer in the range [1, 4294967295] "
- "([1, 1024] on Windows). "
- "Passing 'noset' suppresses this behavior.")
+ metavar="SEED", default=None,
+ help="set PYTHONHASHSEED to SEED before running
commands. "
+ "Defaults to a random integer in the range [1,
4294967295] "
+ "([1, 1024] on Windows). "
+ "Passing 'noset' suppresses this behavior.")
parser.add_argument("--force-dep", action="append",
- metavar="REQ", default=None,
- help="Forces a certain version of one of the dependencies "
- "when configuring the virtual environment. REQ Examples "
- "'pytest<2.7' or 'django>=1.6'.")
+ metavar="REQ", default=None,
+ help="Forces a certain version of one of the
dependencies "
+ "when configuring the virtual environment. REQ
Examples "
+ "'pytest<2.7' or 'django>=1.6'.")
parser.add_argument("--sitepackages", action="store_true",
- help="override sitepackages setting to True in all envs")
+ help="override sitepackages setting to True in all
envs")
parser.add_argument("--skip-missing-interpreters", action="store_true",
- help="don't fail tests for missing interpreters")
+ help="don't fail tests for missing interpreters")
parser.add_argument("args", nargs="*",
- help="additional arguments available to command positional
substitution")
+ help="additional arguments available to command
positional substitution")
return parser
+
class Config(object):
def __init__(self):
self.envconfigs = {}
@@ -167,8 +173,9 @@
@property
def envbindir(self):
- if (sys.platform == "win32" and "jython" not in self.basepython
- and "pypy" not in self.basepython):
+ if (sys.platform == "win32"
+ and "jython" not in self.basepython
+ and "pypy" not in self.basepython):
return self.envdir.join("Scripts")
else:
return self.envdir.join("bin")
@@ -185,8 +192,8 @@
def envsitepackagesdir(self):
self.getsupportedinterpreter() # for throwing exceptions
x = self.config.interpreters.get_sitepackagesdir(
- info=self._basepython_info,
- envdir=self.envdir)
+ info=self._basepython_info,
+ envdir=self.envdir)
return x
def getsupportedinterpreter(self):
@@ -200,14 +207,14 @@
if not info.version_info:
raise tox.exception.InvocationError(
'Failed to get version_info for %s: %s' % (info.name,
info.err))
- if info.version_info < (2,6):
+ if info.version_info < (2, 6):
raise tox.exception.UnsupportedInterpreter(
"python2.5 is not supported anymore, sorry")
return info.executable
+testenvprefix = "testenv:"
-testenvprefix = "testenv:"
def get_homedir():
try:
@@ -215,12 +222,14 @@
except Exception:
return None
+
def make_hashseed():
max_seed = 4294967295
if sys.platform == 'win32':
max_seed = 1024
return str(random.randint(1, max_seed))
+
class parseini:
def __init__(self, config, inipath):
config.toxinipath = inipath
@@ -287,8 +296,7 @@
config.indexserver[name] = IndexServerConfig(name, override)
reader.addsubstitutions(toxworkdir=config.toxworkdir)
- config.distdir = reader.getpath(toxsection, "distdir",
- "{toxworkdir}/dist")
+ config.distdir = reader.getpath(toxsection, "distdir",
"{toxworkdir}/dist")
reader.addsubstitutions(distdir=config.distdir)
config.distshare = reader.getpath(toxsection, "distshare",
distshare_default)
@@ -335,18 +343,18 @@
def _makeenvconfig(self, name, section, subs, config):
vc = VenvConfig(config=config, envname=name)
factors = set(name.split('-'))
- reader = IniReader(self._cfg, fallbacksections=["testenv"],
- factors=factors)
+ reader = IniReader(self._cfg, fallbacksections=["testenv"],
factors=factors)
reader.addsubstitutions(**subs)
- vc.develop = not config.option.installpkg and \
- reader.getbool(section, "usedevelop", config.option.develop)
+ vc.develop = (
+ not config.option.installpkg
+ and reader.getbool(section, "usedevelop", config.option.develop))
vc.envdir = reader.getpath(section, "envdir", "{toxworkdir}/%s" % name)
vc.args_are_paths = reader.getbool(section, "args_are_paths", True)
if reader.getdefault(section, "python", None):
raise tox.exception.ConfigError(
"'python=' key was renamed to 'basepython='")
bp = next((default_factors[f] for f in factors if f in
default_factors),
- sys.executable)
+ sys.executable)
vc.basepython = reader.getdefault(section, "basepython", bp)
vc._basepython_info = config.interpreters.get_info(vc.basepython)
reader.addsubstitutions(envdir=vc.envdir, envname=vc.envname,
@@ -410,8 +418,9 @@
break
vc.platform = platform
- vc.sitepackages = self.config.option.sitepackages or \
- reader.getbool(section, "sitepackages", False)
+ vc.sitepackages = (
+ self.config.option.sitepackages
+ or reader.getbool(section, "sitepackages", False))
vc.downloadcache = None
downloadcache = reader.getdefault(section, "downloadcache")
@@ -424,10 +433,10 @@
section,
"install_command",
"pip install {opts} {packages}",
- )
+ )
if '{packages}' not in vc.install_command:
raise tox.exception.ConfigError(
- "'install_command' must contain '{packages}' substitution")
+ "'install_command' must contain '{packages}' substitution")
vc.pip_pre = config.option.pre or reader.getbool(
section, "pip_pre", False)
@@ -488,10 +497,12 @@
env = [env]
return mapcat(_expand_envstr, env)
+
def _split_factor_expr(expr):
partial_envs = _expand_envstr(expr)
return [set(e.split('-')) for e in partial_envs]
+
def _expand_envstr(envstr):
# split by commas not in groups
tokens = re.split(r'((?:\{[^}]+\})+)|,', envstr)
@@ -505,9 +516,11 @@
return mapcat(expand, envlist)
+
def mapcat(f, seq):
return list(itertools.chain.from_iterable(map(f, seq)))
+
class DepConfig:
def __init__(self, name, indexserver=None):
self.name = name
@@ -710,7 +723,7 @@
x = self._replace(x)
finally:
assert self._subststack.pop() == (section, name)
- #print "getdefault", section, name, "returned", repr(x)
+ # print "getdefault", section, name, "returned", repr(x)
return x
def _apply_factors(self, s):
@@ -740,7 +753,7 @@
else:
envkey = match_value
- if not envkey in os.environ and default is None:
+ if envkey not in os.environ and default is None:
raise tox.exception.ConfigError(
"substitution env:%r: unkown environment variable %r" %
(envkey, envkey))
@@ -750,11 +763,11 @@
def _substitute_from_other_section(self, key):
if key.startswith("[") and "]" in key:
i = key.find("]")
- section, item = key[1:i], key[i+1:]
+ section, item = key[1:i], key[i + 1:]
if section in self._cfg and item in self._cfg[section]:
if (section, item) in self._subststack:
- raise ValueError('%s already in %s' %(
- (section, item), self._subststack))
+ raise ValueError('%s already in %s' % (
+ (section, item), self._subststack))
x = str(self._cfg[section][item])
self._subststack.append((section, item))
try:
@@ -785,13 +798,14 @@
return '{%s}' % sub_value
handlers = {
- 'env' : self._replace_env,
- None : self._replace_substitution,
- }
+ 'env': self._replace_env,
+ None: self._replace_substitution,
+ }
try:
sub_type = g['sub_type']
except KeyError:
- raise tox.exception.ConfigError("Malformed substitution; no
substitution type provided")
+ raise tox.exception.ConfigError(
+ "Malformed substitution; no substitution type provided")
try:
handler = handlers[sub_type]
@@ -808,6 +822,7 @@
def _parse_command(self, command):
pass
+
class CommandParser(object):
class State(object):
@@ -824,11 +839,11 @@
def word_has_ended():
return ((cur_char in string.whitespace and ps.word and
- ps.word[-1] not in string.whitespace) or
- (cur_char == '{' and ps.depth == 0 and not
ps.word.endswith('\\')) or
- (ps.depth == 0 and ps.word and ps.word[-1] == '}') or
- (cur_char not in string.whitespace and ps.word and
- ps.word.strip() == ''))
+ ps.word[-1] not in string.whitespace) or
+ (cur_char == '{' and ps.depth == 0 and not
ps.word.endswith('\\')) or
+ (ps.depth == 0 and ps.word and ps.word[-1] == '}') or
+ (cur_char not in string.whitespace and ps.word and
+ ps.word.strip() == ''))
def yield_this_word():
yieldword = ps.word
@@ -869,8 +884,8 @@
yield_this_word()
return ps.yield_words
+
def getcontextname():
if any(env in os.environ for env in ['JENKINS_URL', 'HUDSON_URL']):
return 'jenkins'
return None
-
diff -r d3b25d3d9d603ac562030d12e18216f3b6268fd2 -r
37151bb27e530549ef2a17d3920f2bfea2421a87 tox/_exception.py
--- a/tox/_exception.py
+++ b/tox/_exception.py
@@ -1,16 +1,28 @@
class Error(Exception):
def __str__(self):
- return "%s: %s" %(self.__class__.__name__, self.args[0])
+ return "%s: %s" % (self.__class__.__name__, self.args[0])
+
+
class UnsupportedInterpreter(Error):
"signals an unsupported Interpreter"
+
+
class InterpreterNotFound(Error):
"signals that an interpreter could not be found"
+
+
class InvocationError(Error):
""" an error while invoking a script. """
+
+
class MissingFile(Error):
""" an error while invoking a script. """
+
+
class MissingDirectory(Error):
""" a directory did not exist. """
+
+
class MissingDependency(Error):
""" a dependency could not be found or determined. """
This diff is so big that we needed to truncate the remainder.
Repository URL: https://bitbucket.org/hpk42/tox/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
_______________________________________________
pytest-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pytest-commit