From 9a8fc0d492c1d8ba65621351ffbf83d76ed7acdd Mon Sep 17 00:00:00 2001 From: Ali Sherief Date: Thu, 11 May 2023 13:14:16 +0300 Subject: [PATCH] Fix compatibility with tox>=4 --- setup.py | 2 +- src/tox_travis/after.py | 2 +- src/tox_travis/envlist.py | 8 +++++--- src/tox_travis/hooks.py | 10 ++++++---- src/tox_travis/v4_workarounds.py | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 src/tox_travis/v4_workarounds.py diff --git a/setup.py b/setup.py index d84402b..6217a68 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,7 @@ def default_environment(): entry_points={ 'tox': ['travis = tox_travis.hooks'], }, - install_requires=['tox>=2.0,<4'], + install_requires=['tox>=2.0'], python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*', classifiers=[ 'Development Status :: 4 - Beta', diff --git a/src/tox_travis/after.py b/src/tox_travis/after.py index b21cb4a..d1d3c42 100644 --- a/src/tox_travis/after.py +++ b/src/tox_travis/after.py @@ -5,7 +5,7 @@ import json import time -from tox.config import _split_env as split_env +from .v4_workarounds import _split_env as split_env try: import urllib.request as urllib2 except ImportError: diff --git a/src/tox_travis/envlist.py b/src/tox_travis/envlist.py index 3202689..5b7327c 100644 --- a/src/tox_travis/envlist.py +++ b/src/tox_travis/envlist.py @@ -4,12 +4,14 @@ import os import re import sys -from itertools import product +import itertools import tox.config -from tox.config import _split_env as split_env from .utils import TRAVIS_FACTORS, parse_dict +from .v4_workarounds import _split_env as split_env + + def detect_envlist(ini): """Default envlist automatically based on the Travis environment.""" @@ -20,7 +22,7 @@ def detect_envlist(ini): desired_factors = get_desired_factors(ini) # Reduce desired factors - desired_envs = ['-'.join(env) for env in product(*desired_factors)] + desired_envs = ['-'.join(env) for env in itertools.product(*desired_factors)] # Find matching envs return match_envs(declared_envs, desired_envs, diff --git a/src/tox_travis/hooks.py b/src/tox_travis/hooks.py index e4661dd..43d5435 100644 --- a/src/tox_travis/hooks.py +++ b/src/tox_travis/hooks.py @@ -3,6 +3,7 @@ import os import sys import tox +from tox.plugin import impl from .envlist import ( detect_envlist, autogen_envconfigs, @@ -15,8 +16,8 @@ from .after import travis_after -@tox.hookimpl -def tox_addoption(parser): +@impl +def tox_add_option(parser): """Add arguments and needed monkeypatches.""" parser.add_argument( '--travis-after', dest='travis_after', action='store_true', @@ -27,12 +28,13 @@ def tox_addoption(parser): subcommand_test_monkeypatch(tox_subcommand_test_post) -@tox.hookimpl -def tox_configure(config): +@impl +def tox_add_env_config(env_conf, state): """Check for the presence of the added options.""" if 'TRAVIS' not in os.environ: return + config = env_conf ini = config._cfg # envlist diff --git a/src/tox_travis/v4_workarounds.py b/src/tox_travis/v4_workarounds.py new file mode 100644 index 0000000..5cc7afa --- /dev/null +++ b/src/tox_travis/v4_workarounds.py @@ -0,0 +1,32 @@ +import itertools +import re + +_ENVSTR_SPLIT_PATTERN = re.compile(r"((?:{[^}]+})+)|,") +_ENVSTR_EXPAND_PATTERN = re.compile(r"{([^}]+)}") +_WHITESPACE_PATTERN = re.compile(r"\s+") + +def mapcat(f, seq): + return list(itertools.chain.from_iterable(map(f, seq))) + + +def _expand_envstr(envstr): + # split by commas not in groups + tokens = _ENVSTR_SPLIT_PATTERN.split(envstr) + envlist = ["".join(g).strip() for k, g in itertools.groupby(tokens, key=bool) if k] + + def expand(env): + tokens = _ENVSTR_EXPAND_PATTERN.split(env) + parts = [_WHITESPACE_PATTERN.sub("", token).split(",") for token in tokens] + return ["".join(variant) for variant in itertools.product(*parts)] + + return mapcat(expand, envlist) + +def _split_env(env): + """if handed a list, action="append" was used for -e""" + if env is None: + return [] + if not isinstance(env, list): + env = [e.split("#", 1)[0].strip() for e in env.split("\n")] + env = ",".join(e for e in env if e) + env = [env] + return mapcat(_expand_envstr, env)