Fix error when capturing group is None

This commit is contained in:
Joscha 2021-05-27 13:56:01 +02:00
parent 80acc4b50d
commit 6fa9cfd4c3
2 changed files with 18 additions and 4 deletions

View File

@ -258,7 +258,9 @@ are available in `TARGET` for formatting.
be referred to as `{g<n>}` (e. g. `{g3}`). `{g0}` refers to the original path.
If capturing group *n*'s contents are a valid integer, the integer value is
available as `{i<n>}` (e. g. `{i3}`). If capturing group *n*'s contents are a
valid float, the float value is available as `{f<n>}` (e. g. `{f3}`).
valid float, the float value is available as `{f<n>}` (e. g. `{f3}`). If a
capturing group is not present (e. g. when matching the string `cd` with the
regex `(ab)?cd`), the corresponding variables are not defined.
Python's format string syntax has rich options for formatting its arguments. For
example, to left-pad the capturing group 3 with the digit `0` to width 5, you

View File

@ -7,7 +7,7 @@ import ast
import re
from abc import ABC, abstractmethod
from pathlib import PurePath
from typing import Dict, Optional, Union
from typing import Dict, Optional, Sequence, Union
from .logging import log
from .utils import fmt_path
@ -122,8 +122,14 @@ class ReRule(Rule):
vars: Dict[str, Union[str, int, float]] = {}
groups = [match[0]] + list(match.groups())
# For some reason, mypy thinks that "groups" has type List[str].
# But since elements of "match.groups()" can be None, mypy is
# wrong.
groups: Sequence[Optional[str]] = [match[0]] + list(match.groups())
for i, group in enumerate(groups):
if group is None:
continue
vars[f"g{i}"] = group
try:
@ -352,7 +358,13 @@ class Transformer:
for i, (line, rule) in enumerate(self._rules):
log.explain(f"Testing rule {i+1}: {line}")
try:
result = rule.transform(path)
except Exception as e:
log.warn(f"Error while testing rule {i+1}: {line}")
log.warn_contd(str(e))
continue
if isinstance(result, PurePath):
log.explain(f"Match found, transformed path to {fmt_path(result)}")
return result