refactoring

This commit is contained in:
Devaev Maxim 2020-09-10 07:30:25 +03:00
parent a6385cd20e
commit 967afb2d9a
5 changed files with 25 additions and 11 deletions

View File

@ -21,7 +21,6 @@
import asyncio import asyncio
import operator
from typing import Any from typing import Any
from typing import List from typing import List
@ -29,6 +28,8 @@ from typing import List
from aiohttp.web import Request from aiohttp.web import Request
from aiohttp.web import Response from aiohttp.web import Response
from .... import tools
from ....plugins.atx import BaseAtx from ....plugins.atx import BaseAtx
from ..info import InfoManager from ..info import InfoManager
@ -78,6 +79,6 @@ class ExportApi:
"", "",
]) ])
elif isinstance(value, dict): elif isinstance(value, dict):
for (sub_key, sub_value) in sorted(value.items(), key=operator.itemgetter(0)): for (sub_key, sub_value) in tools.sorted_kvs(value):
sub_path = (f"{path}_{sub_key}" if sub_key != "parsed_flags" else path) sub_path = (f"{path}_{sub_key}" if sub_key != "parsed_flags" else path)
self.__append_prometheus_rows(rows, sub_value, sub_path) self.__append_prometheus_rows(rows, sub_value, sub_path)

View File

@ -24,7 +24,6 @@ import signal
import asyncio import asyncio
import asyncio.subprocess import asyncio.subprocess
import dataclasses import dataclasses
import operator
from typing import Tuple from typing import Tuple
from typing import List from typing import List
@ -37,6 +36,7 @@ import aiohttp
from ...logging import get_logger from ...logging import get_logger
from ... import tools
from ... import aiotools from ... import aiotools
from ... import aioproc from ... import aioproc
from ... import htclient from ... import htclient
@ -315,7 +315,7 @@ class Streamer: # pylint: disable=too-many-instance-attributes
mtime=float(response.headers["X-Timestamp"]), mtime=float(response.headers["X-Timestamp"]),
headers=tuple( headers=tuple(
(key, value) (key, value)
for (key, value) in sorted(response.headers.items(), key=operator.itemgetter(0)) for (key, value) in tools.sorted_kvs(response.headers)
if key.lower().startswith("x-ustreamer-") or key.lower() in [ if key.lower().startswith("x-ustreamer-") or key.lower() in [
"x-timestamp", "x-timestamp",
"access-control-allow-origin", "access-control-allow-origin",

View File

@ -21,7 +21,6 @@
import asyncio import asyncio
import operator
from typing import List from typing import List
from typing import Dict from typing import Dict
@ -38,6 +37,7 @@ from ...plugins.ugpio import GpioDriverOfflineError
from ...plugins.ugpio import BaseUserGpioDriver from ...plugins.ugpio import BaseUserGpioDriver
from ...plugins.ugpio import get_ugpio_driver_class from ...plugins.ugpio import get_ugpio_driver_class
from ... import tools
from ... import aiotools from ... import aiotools
from ...yamlconf import Section from ...yamlconf import Section
@ -242,13 +242,13 @@ class UserGpio:
notifier=self.__notifier, notifier=self.__notifier,
**drv_config._unpack(ignore=["instance_name", "notifier", "type"]), **drv_config._unpack(ignore=["instance_name", "notifier", "type"]),
) )
for (driver, drv_config) in sorted(config.drivers.items(), key=operator.itemgetter(0)) for (driver, drv_config) in tools.sorted_kvs(config.drivers)
} }
self.__inputs: Dict[str, _GpioInput] = {} self.__inputs: Dict[str, _GpioInput] = {}
self.__outputs: Dict[str, _GpioOutput] = {} self.__outputs: Dict[str, _GpioOutput] = {}
for (channel, ch_config) in sorted(config.scheme.items(), key=operator.itemgetter(0)): for (channel, ch_config) in tools.sorted_kvs(config.scheme):
driver = self.__drivers[ch_config.driver] driver = self.__drivers[ch_config.driver]
if ch_config.mode == "input": if ch_config.mode == "input":
self.__inputs[channel] = _GpioInput(channel, ch_config, driver) self.__inputs[channel] = _GpioInput(channel, ch_config, driver)
@ -281,14 +281,14 @@ class UserGpio:
def sysprep(self) -> None: def sysprep(self) -> None:
get_logger().info("Preparing User-GPIO drivers ...") get_logger().info("Preparing User-GPIO drivers ...")
for (_, driver) in sorted(self.__drivers.items(), key=operator.itemgetter(0)): for (_, driver) in tools.sorted_kvs(self.__drivers):
driver.prepare() driver.prepare()
async def systask(self) -> None: async def systask(self) -> None:
get_logger(0).info("Running User-GPIO drivers ...") get_logger(0).info("Running User-GPIO drivers ...")
await asyncio.gather(*[ await asyncio.gather(*[
driver.run() driver.run()
for (_, driver) in sorted(self.__drivers.items(), key=operator.itemgetter(0)) for (_, driver) in tools.sorted_kvs(self.__drivers)
]) ])
async def cleanup(self) -> None: async def cleanup(self) -> None:

View File

@ -20,10 +20,14 @@
# ========================================================================== # # ========================================================================== #
import operator
import functools import functools
from typing import Tuple
from typing import List
from typing import Dict from typing import Dict
from typing import Hashable from typing import Hashable
from typing import TypeVar
# ===== # =====
@ -41,3 +45,11 @@ def rget(dct: Dict, *keys: Hashable) -> Dict:
if not isinstance(result, dict): if not isinstance(result, dict):
raise TypeError(f"Not a dict as result: {result!r} from {dct!r} at {list(keys)}") raise TypeError(f"Not a dict as result: {result!r} from {dct!r} at {list(keys)}")
return result return result
_DictKeyT = TypeVar("_DictKeyT")
_DictValueT = TypeVar("_DictValueT")
def sorted_kvs(dct: Dict[_DictKeyT, _DictValueT]) -> List[Tuple[_DictKeyT, _DictValueT]]:
return sorted(dct.items(), key=operator.itemgetter(0))

View File

@ -21,13 +21,14 @@
import textwrap import textwrap
import operator
from typing import Generator from typing import Generator
from typing import Any from typing import Any
import yaml import yaml
from .. import tools
from . import Section from . import Section
@ -37,7 +38,7 @@ def make_config_dump(config: Section, indent: int=4) -> str:
def _inner_make_dump(config: Section, indent: int, _level: int=0) -> Generator[str, None, None]: def _inner_make_dump(config: Section, indent: int, _level: int=0) -> Generator[str, None, None]:
for (key, value) in sorted(config.items(), key=operator.itemgetter(0)): for (key, value) in tools.sorted_kvs(config):
if isinstance(value, Section): if isinstance(value, Section):
prefix = " " * indent * _level prefix = " " * indent * _level
yield f"{prefix}{key}:" yield f"{prefix}{key}:"