|
26 | 26 |
|
27 | 27 | from jinja2 import Environment, FileSystemLoader |
28 | 28 |
|
29 | | -VERSION_REGEX = re.compile(r"v{?[0-9.]+.*}?|latest") |
| 29 | +TOXENV_REGEX = re.compile( |
| 30 | + r""" |
| 31 | + {?(?P<py_versions>(py\d+\.\d+,?)+)}? |
| 32 | + -(?P<framework>[a-z](?:[a-z_]|-(?!v{?\d|latest))*[a-z0-9]) |
| 33 | + (?:-( |
| 34 | + (v{?(?P<framework_versions>[0-9.]+[0-9a-z,.]*}?)) |
| 35 | + | |
| 36 | + (?P<framework_versions_latest>latest) |
| 37 | + ))? |
| 38 | +""", |
| 39 | + re.VERBOSE, |
| 40 | +) |
30 | 41 |
|
31 | 42 | OUT_DIR = Path(__file__).resolve().parent.parent.parent / ".github" / "workflows" |
32 | 43 | TOX_FILE = Path(__file__).resolve().parent.parent.parent / "tox.ini" |
@@ -211,33 +222,26 @@ def parse_tox(): |
211 | 222 | line = line.strip().lower() |
212 | 223 |
|
213 | 224 | try: |
214 | | - # Parse tox environment definitions. |
215 | | - # The format is pythonversions-integrationname-integrationversions. |
216 | | - # Some valid examples: |
217 | | - # {pyX.Y,pyX.Z}-integrationname-vA.B.C |
218 | | - # {pyX.Y,pyX.Z}-integrationname-v{A.B.C} |
219 | | - # {pyX.Y,pyX.Z}-integrationname |
220 | | - # No that integrationname can also contain dashes, which makes this a |
221 | | - # bit more annoying. |
222 | | - raw_python_versions = line.split("-")[0] |
223 | | - framework_versions = line.rsplit("-", maxsplit=1)[-1] |
224 | | - framework = line[ |
225 | | - len(raw_python_versions) + 1 : -(len(framework_versions) + 1) |
226 | | - ] |
227 | | - if not VERSION_REGEX.match(framework_versions): |
228 | | - (raw_python_versions, framework) = line.split("-") |
229 | | - framework_versions = [] |
| 225 | + # parse tox environment definition |
| 226 | + parsed = TOXENV_REGEX.match(line) |
| 227 | + if not parsed: |
| 228 | + print(f"ERROR reading line {line}") |
| 229 | + raise ValueError("Failed to parse tox environment definition") |
| 230 | + |
| 231 | + groups = parsed.groupdict() |
| 232 | + raw_python_versions = groups["py_versions"] |
| 233 | + framework = groups["framework"] |
| 234 | + framework_versions_latest = groups.get("framework_versions_latest") or False |
230 | 235 |
|
231 | 236 | # collect python versions to test the framework in |
232 | | - raw_python_versions = set( |
233 | | - raw_python_versions.replace("{", "").replace("}", "").split(",") |
234 | | - ) |
235 | | - if "latest" in framework_versions: |
| 237 | + raw_python_versions = set(raw_python_versions.split(",")) |
| 238 | + if framework_versions_latest: |
236 | 239 | py_versions_latest[framework] |= raw_python_versions |
237 | 240 | else: |
238 | 241 | py_versions_pinned[framework] |= raw_python_versions |
239 | 242 |
|
240 | | - except ValueError: |
| 243 | + except Exception: |
| 244 | + raise |
241 | 245 | print(f"ERROR reading line {line}") |
242 | 246 | parsed_correctly = False |
243 | 247 |
|
|
0 commit comments