diff options
author | Brett Langdon <me@brett.is> | 2020-06-24 04:38:11 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-24 09:38:11 +0100 |
commit | 9f49997a18a6431f359fb9c4d9f1ebe48ffd7bf6 (patch) | |
tree | c1194aad0cb55b92505dc90688d2ad6307e4ad7e | |
parent | e320b1935149086dd5d02d4b4f09116c6829af8d (diff) | |
download | tox-git-9f49997a18a6431f359fb9c4d9f1ebe48ffd7bf6.tar.gz |
Precompile common regular expressions (#1603)
-rw-r--r-- | CONTRIBUTORS | 1 | ||||
-rw-r--r-- | docs/changelog/1603.misc.rst | 1 | ||||
-rw-r--r-- | src/tox/config/__init__.py | 13 |
3 files changed, 11 insertions, 4 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 80dda65c..76b744e6 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -16,6 +16,7 @@ Barry Warsaw Bartolome Sanchez Salado Benoit Pierre Bernat Gabor +Brett Langdon Bruno Oliveira Carl Meyer Charles Brunet diff --git a/docs/changelog/1603.misc.rst b/docs/changelog/1603.misc.rst new file mode 100644 index 00000000..56ab17c9 --- /dev/null +++ b/docs/changelog/1603.misc.rst @@ -0,0 +1 @@ +Improve config parsing performance by precompiling commonly used regular expressions - by :user:`brettlangdon` diff --git a/src/tox/config/__init__.py b/src/tox/config/__init__.py index 2ac4cf3a..f963733e 100644 --- a/src/tox/config/__init__.py +++ b/src/tox/config/__init__.py @@ -57,6 +57,11 @@ SUICIDE_TIMEOUT = 0.0 INTERRUPT_TIMEOUT = 0.3 TERMINATE_TIMEOUT = 0.2 +_FACTOR_LINE_PATTERN = re.compile(r"^([\w{}\.!,-]+)\:\s+(.+)") +_ENVSTR_SPLIT_PATTERN = re.compile(r"((?:\{[^}]+\})+)|,") +_ENVSTR_EXPAND_PATTERN = re.compile(r"\{([^}]+)\}") +_WHITESPACE_PATTERN = re.compile(r"\s+") + def get_plugin_manager(plugins=()): # initialize plugin manager @@ -1438,12 +1443,12 @@ def _split_factor_expr_all(expr): def _expand_envstr(envstr): # split by commas not in groups - tokens = re.split(r"((?:\{[^}]+\})+)|,", envstr) + 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 = re.split(r"\{([^}]+)\}", env) - parts = [re.sub(r"\s+", "", token).split(",") for token in tokens] + 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) @@ -1607,7 +1612,7 @@ class SectionReader: def _apply_factors(self, s): def factor_line(line): - m = re.search(r"^([\w{}\.!,-]+)\:\s+(.+)", line) + m = _FACTOR_LINE_PATTERN.search(line) if not m: return line |