diff --git a/properdocs/config/config_options.py b/properdocs/config/config_options.py index 506e95d0..334cfdba 100644 --- a/properdocs/config/config_options.py +++ b/properdocs/config/config_options.py @@ -1,6 +1,7 @@ from __future__ import annotations import functools +import importlib.util import ipaddress import logging import os @@ -1172,6 +1173,7 @@ def __init__(self, plugins_key: str) -> None: super().__init__() self.default = [] self.plugins_key = plugins_key + self._loaded_hooks: dict[tuple[str, str], types.ModuleType] = {} def pre_validation(self, config: Config, key_name: str): self._base_option = ListOfItems(File(exists=True)) @@ -1183,13 +1185,13 @@ def run_validation(self, value: object) -> Mapping[str, Any]: assert isinstance(value, list) hooks = {} - for name, path in zip(value, paths): + for name, path in zip(value, paths, strict=True): hooks[name] = self._load_hook(name, path) return hooks - @functools.cache - def _load_hook(self, name, path): - import importlib.util + def _load_hook(self, name: str, path: str) -> types.ModuleType: + if loaded_hook := self._loaded_hooks.get((name, path)): + return loaded_hook spec = importlib.util.spec_from_file_location(name, path) if spec is None: @@ -1206,6 +1208,7 @@ def _load_hook(self, name, path): finally: sys.path[:] = old_sys_path + self._loaded_hooks[name, path] = module return module def post_validation(self, config: Config, key_name: str): diff --git a/pyproject.toml b/pyproject.toml index 779faffc..548d0e6f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,7 +180,7 @@ select = [ "F", "E", "W", "I", "UP", "YTT", "ASYNC", "C4", "DTZ", "T10", "FA", "ISC", "PIE", "T20", "RSE", "N803", "N804", "N805", "N806", "N807", "N815", "N999", "S201", "S202", "S303", "S304", "S305", "S306", "S602", "S604", "S605", "S612", - "B002", "B003", "B004", "B005", "B008", "B009", "B010", "B011", "B012", "B013", "B014", "B015", "B016", "B017", "B018", "B020", "B021", "B022", "B023", "B025", "B026", "B029", "B030", "B031", "B032", "B033", "B034", "B035", "B039", "B909", + "B002", "B003", "B004", "B005", "B008", "B009", "B010", "B011", "B012", "B013", "B014", "B015", "B016", "B017", "B018", "B019", "B020", "B021", "B022", "B023", "B025", "B026", "B029", "B030", "B031", "B032", "B033", "B034", "B035", "B039", "B909", "COM818", "D200", "D201", "D202", "D204", "D207", "D208", "D209", "D210", "D211", "D213", "D214", "D300", "D301", "D400", "D402", "D403", "D405", "D412", "D414", "D415", "D416", "D417", "D419", "LOG001", "LOG007", "LOG009", "LOG015",