From 4efff7788f052cfdd2949af9198eb2c18a4cd4e8 Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Wed, 6 Dec 2017 17:51:55 +0100 Subject: annotating types for config parser --- talerbank/talerconfig.py | 56 ++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-) (limited to 'talerbank/talerconfig.py') diff --git a/talerbank/talerconfig.py b/talerbank/talerconfig.py index a7ca065..41ebf44 100644 --- a/talerbank/talerconfig.py +++ b/talerbank/talerconfig.py @@ -24,6 +24,7 @@ import os import weakref import sys import re +from typing import Callable, Any LOGGER = logging.getLogger(__name__) @@ -44,7 +45,7 @@ class ExpansionSyntaxError(Exception): pass -def expand(var, getter): +def expand(var: str, getter: Callable[[str], str]) -> str: """ Do shell-style parameter expansion. Supported syntax: @@ -93,17 +94,17 @@ def expand(var, getter): class OptionDict(collections.defaultdict): - def __init__(self, config, section_name): + def __init__(self, config: SectionDict, section_name: str) -> None: self.config = weakref.ref(config) self.section_name = section_name super().__init__() - def __missing__(self, key): + def __missing__(self, key: str) -> Entry: entry = Entry(self.config(), self.section_name, key) self[key] = entry return entry - def __getitem__(self, chunk): + def __getitem__(self, chunk: str) -> Entry: return super().__getitem__(chunk.lower()) - def __setitem__(self, chunk, value): + def __setitem__(self, chunk: str, value: Entry) -> None: super().__setitem__(chunk.lower(), value) @@ -112,14 +113,13 @@ class SectionDict(collections.defaultdict): value = OptionDict(self, key) self[key] = value return value - def __getitem__(self, chunk): + def __getitem__(self, chunk: str) -> OptionDict: return super().__getitem__(chunk.lower()) - def __setitem__(self, chunk, value): + def __setitem__(self, chunk: str, value: OptionDict) -> None: super().__setitem__(chunk.lower(), value) - class Entry: - def __init__(self, config, section, option, **kwargs): + def __init__(self, config: SectionDict, section: str, option: str, **kwargs) -> None: self.value = kwargs.get("value") self.filename = kwargs.get("filename") self.lineno = kwargs.get("lineno") @@ -127,14 +127,14 @@ class Entry: self.option = option self.config = weakref.ref(config) - def __repr__(self): + def __repr__(self) -> str: return "" \ % (self.section, self.option, repr(self.value),) - def __str__(self): + def __str__(self) -> Any: return self.value - def value_string(self, default=None, required=False, warn=False): + def value_string(self, default=None, required=False, warn=False) -> str: if required and self.value is None: raise ConfigurationError("Missing required option '%s' in section '%s'" \ % (self.option.upper(), self.section.upper())) @@ -149,7 +149,7 @@ class Entry: return default return self.value - def value_int(self, default=None, required=False, warn=False): + def value_int(self, default=None, required=False, warn=False) -> int: value = self.value_string(default, warn, required) if value is None: return None @@ -159,7 +159,7 @@ class Entry: raise ConfigurationError("Expected number for option '%s' in section '%s'" \ % (self.option.upper(), self.section.upper())) - def _getsubst(self, key): + def _getsubst(self, key: str) -> Any: value = self.config()["paths"][key].value if value is not None: return value @@ -168,13 +168,13 @@ class Entry: return value return None - def value_filename(self, default=None, required=False, warn=False): + def value_filename(self, default=None, required=False, warn=False) -> str: value = self.value_string(default, required, warn) if value is None: return None return expand(value, self._getsubst) - def location(self): + def location(self) -> str: if self.filename is None or self.lineno is None: return "" return "%s:%s" % (self.filename, self.lineno) @@ -185,16 +185,16 @@ class TalerConfig: One loaded taler configuration, including base configuration files and included files. """ - def __init__(self): + def __init__(self) -> None: """ Initialize an empty configuration """ - self.sections = SectionDict() + self.sections = SectionDict() # just plain dict # defaults != config file: the first is the 'base' # whereas the second overrides things from the first. @staticmethod - def from_file(filename=None, load_defaults=True): + def from_file(filename=None, load_defaults=True) -> TalerConfig: cfg = TalerConfig() if filename is None: xdg = os.environ.get("XDG_CONFIG_HOME") @@ -207,19 +207,19 @@ class TalerConfig: cfg.load_file(filename) return cfg - def value_string(self, section, option, **kwargs): + def value_string(self, section, option, **kwargs) -> str: return self.sections[section][option].value_string( kwargs.get("default"), kwargs.get("required"), kwargs.get("warn")) - def value_filename(self, section, option, **kwargs): + def value_filename(self, section, option, **kwargs) -> str: return self.sections[section][option].value_filename( kwargs.get("default"), kwargs.get("required"), kwargs.get("warn")) - def value_int(self, section, option, **kwargs): + def value_int(self, section, option, **kwargs) -> int: return self.sections[section][option].value_int( kwargs.get("default"), kwargs.get("required"), kwargs.get("warn")) - def load_defaults(self): + def load_defaults(self) -> None: base_dir = os.environ.get("TALER_BASE_CONFIG") if base_dir: self.load_dir(base_dir) @@ -237,7 +237,7 @@ class TalerConfig: LOGGER.warning("no base directory found") @staticmethod - def from_env(*args, **kwargs): + def from_env(*args, **kwargs) -> TalerConfig: """ Load configuration from environment variable TALER_CONFIG_FILE or from default location if the variable is not set. @@ -245,7 +245,7 @@ class TalerConfig: filename = os.environ.get("TALER_CONFIG_FILE") return TalerConfig.from_file(filename, *args, **kwargs) - def load_dir(self, dirname): + def load_dir(self, dirname) -> None: try: files = os.listdir(dirname) except FileNotFoundError: @@ -256,7 +256,7 @@ class TalerConfig: continue self.load_file(os.path.join(dirname, file)) - def load_file(self, filename): + def load_file(self, filename) -> None: sections = self.sections try: with open(filename, "r") as file: @@ -300,7 +300,7 @@ class TalerConfig: sys.exit(3) - def dump(self): + def dump(self) -> None: for kv_section in self.sections.items(): print("[%s]" % (kv_section[1].section_name,)) for kv_option in kv_section[1].items(): @@ -309,7 +309,7 @@ class TalerConfig: kv_option[1].value, kv_option[1].location())) - def __getitem__(self, chunk): + def __getitem__(self, chunk: str) -> OptionDict: if isinstance(chunk, str): return self.sections[chunk] raise TypeError("index must be string") -- cgit v1.2.3