summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrett Langdon <me@brett.is>2020-06-24 04:38:11 -0400
committerGitHub <noreply@github.com>2020-06-24 09:38:11 +0100
commit9f49997a18a6431f359fb9c4d9f1ebe48ffd7bf6 (patch)
treec1194aad0cb55b92505dc90688d2ad6307e4ad7e
parente320b1935149086dd5d02d4b4f09116c6829af8d (diff)
downloadtox-git-9f49997a18a6431f359fb9c4d9f1ebe48ffd7bf6.tar.gz
Precompile common regular expressions (#1603)
-rw-r--r--CONTRIBUTORS1
-rw-r--r--docs/changelog/1603.misc.rst1
-rw-r--r--src/tox/config/__init__.py13
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