Skip to content

Commit 17cfe08

Browse files
committed
Refactor aliases load using confuse MappingValues
1 parent de85b01 commit 17cfe08

1 file changed

Lines changed: 32 additions & 22 deletions

File tree

beetsplug/lastgenre/__init__.py

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ def __init__(self) -> None:
137137
"prefer_specific": False,
138138
"title_case": True,
139139
"pretend": False,
140-
"ignorelist": False,
140+
"ignorelist": {},
141+
"aliases": True,
141142
}
142143
)
143144
self.setup()
@@ -267,38 +268,47 @@ def _load_aliases(self) -> Aliases:
267268
The key (genre name) is used as a ``re.Match.expand()`` template,
268269
so ``\\g<N>`` back-references to capture groups are supported.
269270
270-
Setting ``aliases: true`` loads the bundled ``aliases.yaml`` file. Setting
271-
``aliases: false`` disables normalization entirely.
271+
Setting ``aliases: true`` (the default) loads the bundled
272+
``aliases.yaml`` file. Setting ``aliases: false`` disables
273+
normalization entirely.
272274
273275
Raises:
274-
UserError: if the config value is not a mapping, or if an entry's value is
275-
not a list of strings.
276+
confuse.ConfigTypeError: when the config value is not a mapping
277+
or a list entry is not a string.
276278
"""
277-
aliases_config = self.config["aliases"].get()
278-
if aliases_config is False:
279+
aliases_raw = self.config["aliases"].get()
280+
if aliases_raw is False:
279281
return []
280-
if aliases_config in (True, "", None):
282+
if aliases_raw in (True, "", None):
281283
self._log.debug("Loading default aliases from {}", ALIASES)
282284
with Path(ALIASES).open(encoding="utf-8") as f:
283-
aliases_config = yaml.safe_load(f)
284-
if not aliases_config:
285+
aliases_dict = yaml.safe_load(f)
286+
if not aliases_dict:
285287
return []
286-
if not isinstance(aliases_config, dict):
287-
raise UserError(
288-
"Invalid value for lastgenre.aliases: expected a mapping "
289-
f"(canonical -> list of patterns), got {aliases_config!r}"
288+
else:
289+
# Validate only the effective aliases value to avoid stale lower-
290+
# priority config layers affecting type checking.
291+
aliases_cfg = confuse.Configuration("lastgenre_aliases", read=False)
292+
aliases_cfg.set({"aliases": aliases_raw})
293+
aliases_dict = aliases_cfg["aliases"].get(
294+
confuse.MappingValues(confuse.Sequence(str))
290295
)
291296

292297
entries: Aliases = []
293-
for canonical, patterns in aliases_config.items():
294-
if not isinstance(patterns, list):
295-
raise UserError(
296-
f"Invalid lastgenre.aliases entry for {canonical!r}: "
297-
f"expected a list of patterns, got {patterns!r}"
298-
)
298+
for canonical, patterns in aliases_dict.items():
299299
template = str(canonical).lower()
300-
for raw in patterns:
301-
entries.append((self._compile_pattern(str(raw)), template))
300+
for raw_pat in patterns:
301+
try:
302+
entries.append(
303+
(re.compile(str(raw_pat), re.IGNORECASE), template)
304+
)
305+
except re.error:
306+
entries.append(
307+
(
308+
re.compile(re.escape(str(raw_pat)), re.IGNORECASE),
309+
template,
310+
)
311+
)
302312

303313
self._log.extra_debug("Loaded {} alias entries", len(entries))
304314
return entries

0 commit comments

Comments
 (0)