summaryrefslogtreecommitdiff
path: root/talerbank/talerconfig.py
diff options
context:
space:
mode:
authorMarcello Stanisci <stanisci.m@gmail.com>2017-12-06 17:51:55 +0100
committerMarcello Stanisci <stanisci.m@gmail.com>2017-12-06 17:51:55 +0100
commit4efff7788f052cfdd2949af9198eb2c18a4cd4e8 (patch)
tree04cf19060f3c3d029af5290e2165b0b33432c695 /talerbank/talerconfig.py
parente10115be96dfcbbfae2c0d004e5498a224ba9a3b (diff)
downloadbank-4efff7788f052cfdd2949af9198eb2c18a4cd4e8.tar.gz
bank-4efff7788f052cfdd2949af9198eb2c18a4cd4e8.tar.bz2
bank-4efff7788f052cfdd2949af9198eb2c18a4cd4e8.zip
annotating types for config parser
Diffstat (limited to 'talerbank/talerconfig.py')
-rw-r--r--talerbank/talerconfig.py56
1 files changed, 28 insertions, 28 deletions
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 "<Entry section=%s, option=%s, value=%s>" \
% (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 "<unknown>"
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")