refactoring

This commit is contained in:
Devaev Maxim
2020-09-08 12:32:16 +03:00
parent d932a937ca
commit d528a3002e
3 changed files with 20 additions and 13 deletions

View File

@@ -29,6 +29,7 @@ import logging.config
from typing import Tuple from typing import Tuple
from typing import List from typing import List
from typing import Dict from typing import Dict
from typing import Set
from typing import Optional from typing import Optional
import pygments import pygments
@@ -52,8 +53,6 @@ from ..yamlconf import build_raw_from_options
from ..yamlconf.dumper import make_config_dump from ..yamlconf.dumper import make_config_dump
from ..yamlconf.loader import load_yaml_file from ..yamlconf.loader import load_yaml_file
from ..validators import check_string_in_list
from ..validators.basic import valid_stripped_string from ..validators.basic import valid_stripped_string
from ..validators.basic import valid_stripped_string_not_empty from ..validators.basic import valid_stripped_string_not_empty
from ..validators.basic import valid_bool from ..validators.basic import valid_bool
@@ -181,7 +180,7 @@ def _patch_dynamic( # pylint: disable=too-many-locals
rebuild = True rebuild = True
if load_gpio: if load_gpio:
drivers: List[str] = [] drivers: Set[str] = set()
for (driver, params) in { # type: ignore for (driver, params) in { # type: ignore
"__gpio__": {}, "__gpio__": {},
**tools.rget(raw_config, "kvmd", "gpio", "drivers"), **tools.rget(raw_config, "kvmd", "gpio", "drivers"),
@@ -192,17 +191,13 @@ def _patch_dynamic( # pylint: disable=too-many-locals
"type": Option(driver_type, type=valid_stripped_string_not_empty), "type": Option(driver_type, type=valid_stripped_string_not_empty),
**get_ugpio_driver_class(driver_type).get_plugin_options() **get_ugpio_driver_class(driver_type).get_plugin_options()
} }
drivers.append(driver) drivers.add(driver)
for (channel, params) in tools.rget(raw_config, "kvmd", "gpio", "scheme").items(): for (channel, params) in tools.rget(raw_config, "kvmd", "gpio", "scheme").items():
channel = valid_ugpio_channel(channel) channel = valid_ugpio_channel(channel)
mode = valid_ugpio_mode(params.get("mode", "")) mode = valid_ugpio_mode(params.get("mode", ""))
scheme["kvmd"]["gpio"]["scheme"][channel] = { scheme["kvmd"]["gpio"]["scheme"][channel] = {
"driver": Option("__gpio__", type=(lambda arg: check_string_in_list( "driver": Option("__gpio__", type=(lambda arg: valid_ugpio_driver(arg, drivers))),
arg=valid_stripped_string_not_empty(arg),
name="configured GPIO driver",
variants=drivers,
))),
"pin": Option(-1, type=valid_gpio_pin), "pin": Option(-1, type=valid_gpio_pin),
"mode": Option("", type=valid_ugpio_mode), "mode": Option("", type=valid_ugpio_mode),
"inverted": Option(False, type=valid_bool), "inverted": Option(False, type=valid_bool),

View File

@@ -23,6 +23,7 @@
import re import re
from typing import List from typing import List
from typing import Set
from typing import Mapping from typing import Mapping
from typing import Sequence from typing import Sequence
from typing import Callable from typing import Callable
@@ -62,13 +63,19 @@ def check_not_none_string(arg: Any, name: str, strip: bool=True) -> str:
return arg return arg
def check_in_list(arg: Any, name: str, variants: Union[Sequence, Mapping]) -> Any: def check_in_list(arg: Any, name: str, variants: Union[Sequence, Mapping, Set]) -> Any:
if arg not in variants: if arg not in variants:
raise_error(arg, name) raise_error(arg, name)
return arg return arg
def check_string_in_list(arg: Any, name: str, variants: Union[Sequence[str], Mapping[str, Any]], lower: bool=True) -> str: def check_string_in_list(
arg: Any,
name: str,
variants: Union[Sequence[str], Mapping[str, Any], Set[str]],
lower: bool=True,
) -> str:
arg = check_not_none_string(arg, name) arg = check_not_none_string(arg, name)
if lower: if lower:
arg = arg.lower() arg = arg.lower()

View File

@@ -21,6 +21,8 @@
from typing import List from typing import List
from typing import Set
from typing import Optional
from typing import Any from typing import Any
from ..keyboard.mappings import KEYMAP from ..keyboard.mappings import KEYMAP
@@ -92,9 +94,12 @@ def valid_hid_mouse_wheel(arg: Any) -> int:
# ===== # =====
def valid_ugpio_driver(arg: Any) -> str: def valid_ugpio_driver(arg: Any, variants: Optional[Set[str]]=None) -> str:
name = "GPIO driver" name = "GPIO driver"
return check_len(check_re_match(arg, name, r"^[a-zA-Z_][a-zA-Z0-9_-]*$"), name, 255) arg = check_len(check_re_match(arg, name, r"^[a-zA-Z_][a-zA-Z0-9_-]*$"), name, 255)
if variants is not None:
arg = check_string_in_list(arg, f"configured {name}", variants)
return arg
def valid_ugpio_mode(arg: Any) -> str: def valid_ugpio_mode(arg: Any) -> str: