Mercurial > personal > weather-server
comparison weather_server/locations.py @ 1:f66df122f18d
get the skeleton of a webserver up?
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sun, 29 Sep 2019 00:52:13 -0400 |
parents | |
children | f1ea183d28ba |
comparison
equal
deleted
inserted
replaced
0:efe7a1eff167 | 1:f66df122f18d |
---|---|
1 """Manages the directory containing the various logs.""" | |
2 | |
3 import configparser | |
4 import pathlib | |
5 import typing as t | |
6 | |
7 import attr | |
8 import pytz | |
9 | |
10 from . import logfile | |
11 from . import types | |
12 | |
13 | |
14 CONFIG_FILE = 'config.ini' | |
15 LOG = 'log.bson' | |
16 | |
17 | |
18 @attr.s(frozen=True, slots=True) | |
19 class LocationInfo: | |
20 name = attr.ib(type=str) | |
21 tz_name = attr.ib(type=str) | |
22 password = attr.ib(type=str) | |
23 | |
24 def timezone(self): | |
25 try: | |
26 return pytz.timezone(self.tz_name) | |
27 except pytz.UnknownTimeZoneError: | |
28 return pytz.UTC | |
29 | |
30 @classmethod | |
31 def load(cls, config_file: pathlib.Path) -> 'LocationInfo': | |
32 parser = configparser.ConfigParser(interpolation=None) | |
33 parser.read(config_file) | |
34 return LocationInfo( | |
35 name=parser.get('location', 'name', fallback='Weather station'), | |
36 tz_name=parser.get('location', 'timezone', fallback='UTC'), | |
37 password=parser.get('location', 'password')) | |
38 | |
39 | |
40 class Locations: | |
41 def __init__(self, base: str): | |
42 self._path = pathlib.Path(base) | |
43 | |
44 def paths(self) -> t.Tuple[str, ...]: | |
45 return tuple(sorted(f.name for f in self._path.iterdir())) | |
46 | |
47 def get(self, name) -> t.Tuple[LocationInfo, logfile.Logger]: | |
48 try: | |
49 directory = self._path / name | |
50 return ( | |
51 LocationInfo.load(directory / CONFIG_FILE), | |
52 logfile.Logger.create(str(directory / LOG))) | |
53 except OSError: | |
54 raise KeyError(name) |