Skip to content

Commit

Permalink
Fix bug with incorrectly defactorized dependencies tox-dev#768
Browse files Browse the repository at this point in the history
New version with improved changes, fixing errors raised
with the previous version:

tox-dev#899
tox-dev#906
  • Loading branch information
bartsanchez committed Oct 14, 2018
1 parent 8de2cef commit 206c610
Show file tree
Hide file tree
Showing 2 changed files with 228 additions and 4 deletions.
8 changes: 7 additions & 1 deletion src/tox/config.py
Expand Up @@ -1337,10 +1337,16 @@ def getstring(self, name, default=None, replace=True, crossonly=False):
x = default
else:
x = self._apply_factors(x)
x = self._replace_if_needed(x, name, replace, crossonly)
x = self._apply_factors(x)

x = self._replace_if_needed(x, name, replace, crossonly)
# print "getstring", self.section_name, name, "returned", repr(x)
return x

def _replace_if_needed(self, x, name, replace, crossonly):
if replace and x and hasattr(x, "replace"):
x = self._replace(x, name=name, crossonly=crossonly)
# print "getstring", self.section_name, name, "returned", repr(x)
return x

def _apply_factors(self, s):
Expand Down
224 changes: 221 additions & 3 deletions tests/unit/test_config.py
Expand Up @@ -1444,11 +1444,9 @@ def test_take_dependencies_from_other_testenv(self, newconfig, envlist, deps):
)
conf = newconfig([], inisource).envconfigs["py27"]
packages = [dep.name for dep in conf.deps]
assert packages == list(deps) + ["fun", "frob>1.0,<2.0"]
# assert packages == ["pytest", "pytest-cov", "fun", "frob>1.0,<2.0"]
assert packages == ["pytest", "pytest-cov", "fun", "frob>1.0,<2.0"]

# https://github.com/tox-dev/tox/issues/706
@pytest.mark.xfail(reason="reproduce bug 706")
@pytest.mark.parametrize("envlist", [["py27", "coverage", "other"]])
def test_regression_test_issue_706(self, newconfig, envlist):
inisource = """
Expand Down Expand Up @@ -1477,6 +1475,226 @@ def test_regression_test_issue_706(self, newconfig, envlist):
packages = [dep.name for dep in conf.deps]
assert packages == ["flake8", "fun"]

def test_factor_expansion(self, newconfig):
inisource = """
[tox]
envlist = {py27, py37}-cover
[testenv]
deps=
{py27}: foo
{py37}: bar
"""
conf = newconfig([], inisource).envconfigs["py27-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == ["foo"]

conf = newconfig([], inisource).envconfigs["py37-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == ["bar"]

# https://github.com/tox-dev/tox/issues/899
def test_regression_test__issue_899(self, newconfig):
inisource = """
[tox]
minversion = 2.0
skipsdist = True
envlist =
style
sdist
bdist_wheel
{py27,py34,py35,py36,pypy,pypy3}-cover
{py27,py34,py35,py36,pypy,pypy3}-nocov
[testenv]
skip_install = True
sitepackages = True
passenv =
CI
TRAVIS
TRAVIS_*
TOXENV
CODECOV_*
whitelist_externals =
bash
echo
install_command = pip install --only-binary=scipy {opts} {packages}
deps =
#Lines startings xxx: are filtered by the environment.
#Leaving py34 without any soft dependencies (just numpy)
cover: coverage
cover: codecov
{py27}: unittest2
{py27}: mysql-python
{py27,py36}: mmtf-python
{py27,py35}: reportlab
{py27,py34,py35,py36}: psycopg2-binary
{py27,py34,py35,py35}: mysql-connector-python-rf
{py27,py35,pypy}: rdflib
{pypy,pypy3}: numpy==1.12.1
{py27,py34,py36}: numpy
{py36}: scipy
{py27}: networkx
{py36}: matplotlib
"""
conf = newconfig([], inisource).envconfigs["style"]
packages = [dep.name for dep in conf.deps]
assert packages == []

conf = newconfig([], inisource).envconfigs["py27-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "unittest2", "mysql-python", "mmtf-python",
"reportlab", "psycopg2-binary", "mysql-connector-python-rf",
"rdflib", "numpy", "networkx",
]

conf = newconfig([], inisource).envconfigs["py34-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "psycopg2-binary",
"mysql-connector-python-rf", "numpy"
]

conf = newconfig([], inisource).envconfigs["py35-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "reportlab", "psycopg2-binary",
"mysql-connector-python-rf", "rdflib",
]

conf = newconfig([], inisource).envconfigs["py36-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "mmtf-python", "psycopg2-binary", "numpy",
"scipy", "matplotlib",
]

conf = newconfig([], inisource).envconfigs["pypy-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "rdflib", "numpy==1.12.1",
]

conf = newconfig([], inisource).envconfigs["pypy3-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "numpy==1.12.1",
]

conf = newconfig([], inisource).envconfigs["py27-nocov"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"unittest2", "mysql-python", "mmtf-python", "reportlab",
"psycopg2-binary", "mysql-connector-python-rf", "rdflib", "numpy",
"networkx",
]

conf = newconfig([], inisource).envconfigs["py34-nocov"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"psycopg2-binary", "mysql-connector-python-rf", "numpy"
]

conf = newconfig([], inisource).envconfigs["py35-nocov"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"reportlab", "psycopg2-binary", "mysql-connector-python-rf",
"rdflib",
]

conf = newconfig([], inisource).envconfigs["py36-nocov"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"mmtf-python", "psycopg2-binary", "numpy", "scipy", "matplotlib",
]

conf = newconfig([], inisource).envconfigs["pypy-nocov"]
packages = [dep.name for dep in conf.deps]
assert packages == ["rdflib", "numpy==1.12.1"]

conf = newconfig([], inisource).envconfigs["pypy3-cover"]
packages = [dep.name for dep in conf.deps]
assert packages == [
"coverage", "codecov", "numpy==1.12.1",
]

# https://github.com/tox-dev/tox/issues/906
def test_regression_test__issue_906(self, newconfig):
inisource = """
[tox]
envlist =
django_master-py{36,35}
django20-py{36,35,34,py3}
django111-py{36,35,34,27,py}
django18-py{35,34,27,py}
lint
docs
skipsdist = true
[testenv]
deps =
.[test]
django18: {[django]1.8.x}
django111: {[django]1.11.x}
django20: {[django]2.0.x}
django_master: {[django]master}
commands = py.test --ds=tests.settings --cov=./djmoney {posargs}
usedevelop = false
[django]
1.8.x =
Django>=1.8.0,<1.9.0
django-reversion==1.10.0
djangorestframework>=3.3.3,<3.7.0
1.11.x =
Django>=1.11.0,<2.0.0
django-reversion>=2.0.8
djangorestframework>=3.6.2
2.0.x =
Django>=2.0,<2.1
django-reversion>=2.0.8
djangorestframework>=3.7.3
master =
https://github.com/django/django/tarball/master
django-reversion>=2.0.8
djangorestframework>=3.6.2
"""
conf = newconfig([], inisource).envconfigs["django_master-py36"]
packages = [dep.name for dep in conf.deps]
assert packages == [
".[test]", "https://github.com/django/django/tarball/master",
"django-reversion>=2.0.8", "djangorestframework>=3.6.2",
]

conf = newconfig([], inisource).envconfigs["django20-pypy3"]
packages = [dep.name for dep in conf.deps]
assert packages == [
".[test]", "Django>=2.0,<2.1", "django-reversion>=2.0.8",
"djangorestframework>=3.7.3",
]

conf = newconfig([], inisource).envconfigs["django111-py34"]
packages = [dep.name for dep in conf.deps]
assert packages == [
".[test]", "Django>=1.11.0,<2.0.0", "django-reversion>=2.0.8",
"djangorestframework>=3.6.2",
]

conf = newconfig([], inisource).envconfigs["django18-py27"]
packages = [dep.name for dep in conf.deps]
assert packages == [
".[test]", "Django>=1.8.0,<1.9.0", "django-reversion==1.10.0",
"djangorestframework>=3.3.3,<3.7.0",
]

conf = newconfig([], inisource).envconfigs["lint"]
packages = [dep.name for dep in conf.deps]
assert packages == [".[test]"]

conf = newconfig([], inisource).envconfigs["docs"]
packages = [dep.name for dep in conf.deps]
assert packages == [".[test]"]

def test_take_dependencies_from_other_section(self, newconfig):
inisource = """
[testing:pytest]
Expand Down

0 comments on commit 206c610

Please sign in to comment.