my.bluemaestro: make config construction lazy
following the discussions here: https://github.com/karlicoss/HPI/issues/46#issuecomment-2295464073
This commit is contained in:
parent
9f017fb29b
commit
d154825591
2 changed files with 38 additions and 21 deletions
|
@ -4,36 +4,58 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# todo most of it belongs to DAL... but considering so few people use it I didn't bother for now
|
# todo most of it belongs to DAL... but considering so few people use it I didn't bother for now
|
||||||
|
import re
|
||||||
|
import sqlite3
|
||||||
|
from abc import abstractmethod
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import re
|
from typing import Iterable, Optional, Protocol, Sequence, Set
|
||||||
import sqlite3
|
|
||||||
from typing import Iterable, Sequence, Set, Optional
|
|
||||||
|
|
||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
from my.core import (
|
from my.core import (
|
||||||
|
Paths,
|
||||||
|
Res,
|
||||||
|
Stats,
|
||||||
get_files,
|
get_files,
|
||||||
make_logger,
|
make_logger,
|
||||||
Res,
|
|
||||||
stat,
|
stat,
|
||||||
Stats,
|
unwrap,
|
||||||
influxdb,
|
|
||||||
)
|
)
|
||||||
from my.core.cachew import mcachew
|
from my.core.cachew import mcachew
|
||||||
from my.core.error import unwrap
|
|
||||||
from my.core.pandas import DataFrameT, as_dataframe
|
from my.core.pandas import DataFrameT, as_dataframe
|
||||||
from my.core.sqlite import sqlite_connect_immutable
|
from my.core.sqlite import sqlite_connect_immutable
|
||||||
|
|
||||||
from my.config import bluemaestro as config
|
|
||||||
|
class config(Protocol):
|
||||||
|
@property
|
||||||
|
@abstractmethod
|
||||||
|
def export_path(self) -> Paths:
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tz(self) -> pytz.BaseTzInfo:
|
||||||
|
# fixme: later, rely on the timezone provider
|
||||||
|
# NOTE: the timezone should be set with respect to the export date!!!
|
||||||
|
return pytz.timezone('Europe/London')
|
||||||
|
# TODO when I change tz, check the diff
|
||||||
|
|
||||||
|
|
||||||
|
def make_config() -> config:
|
||||||
|
from my.config import bluemaestro as user_config
|
||||||
|
|
||||||
|
class combined_config(user_config, config): ...
|
||||||
|
|
||||||
|
return combined_config()
|
||||||
|
|
||||||
|
|
||||||
logger = make_logger(__name__)
|
logger = make_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def inputs() -> Sequence[Path]:
|
def inputs() -> Sequence[Path]:
|
||||||
return get_files(config.export_path)
|
cfg = make_config()
|
||||||
|
return get_files(cfg.export_path)
|
||||||
|
|
||||||
|
|
||||||
Celsius = float
|
Celsius = float
|
||||||
|
@ -50,12 +72,6 @@ class Measurement:
|
||||||
dewpoint: Celsius
|
dewpoint: Celsius
|
||||||
|
|
||||||
|
|
||||||
# fixme: later, rely on the timezone provider
|
|
||||||
# NOTE: the timezone should be set with respect to the export date!!!
|
|
||||||
tz = pytz.timezone('Europe/London')
|
|
||||||
# TODO when I change tz, check the diff
|
|
||||||
|
|
||||||
|
|
||||||
def is_bad_table(name: str) -> bool:
|
def is_bad_table(name: str) -> bool:
|
||||||
# todo hmm would be nice to have a hook that can patch any module up to
|
# todo hmm would be nice to have a hook that can patch any module up to
|
||||||
delegate = getattr(config, 'is_bad_table', None)
|
delegate = getattr(config, 'is_bad_table', None)
|
||||||
|
@ -64,6 +80,9 @@ def is_bad_table(name: str) -> bool:
|
||||||
|
|
||||||
@mcachew(depends_on=inputs)
|
@mcachew(depends_on=inputs)
|
||||||
def measurements() -> Iterable[Res[Measurement]]:
|
def measurements() -> Iterable[Res[Measurement]]:
|
||||||
|
cfg = make_config()
|
||||||
|
tz = cfg.tz
|
||||||
|
|
||||||
# todo ideally this would be via arguments... but needs to be lazy
|
# todo ideally this would be via arguments... but needs to be lazy
|
||||||
paths = inputs()
|
paths = inputs()
|
||||||
total = len(paths)
|
total = len(paths)
|
||||||
|
@ -211,6 +230,8 @@ def dataframe() -> DataFrameT:
|
||||||
|
|
||||||
|
|
||||||
def fill_influxdb() -> None:
|
def fill_influxdb() -> None:
|
||||||
|
from my.core import influxdb
|
||||||
|
|
||||||
influxdb.fill(measurements(), measurement=__name__)
|
influxdb.fill(measurements(), measurement=__name__)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,15 @@
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import TYPE_CHECKING, Iterator, Any
|
from typing import Iterator
|
||||||
|
|
||||||
from more_itertools import one
|
from more_itertools import one
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
from my.bluemaestro import measurements, Measurement
|
||||||
from my.bluemaestro import Measurement
|
|
||||||
else:
|
|
||||||
Measurement = Any
|
|
||||||
|
|
||||||
|
|
||||||
def ok_measurements() -> Iterator[Measurement]:
|
def ok_measurements() -> Iterator[Measurement]:
|
||||||
from my.bluemaestro import measurements
|
|
||||||
for m in measurements():
|
for m in measurements():
|
||||||
assert not isinstance(m, Exception)
|
assert not isinstance(m, Exception)
|
||||||
yield m
|
yield m
|
||||||
|
|
Loading…
Add table
Reference in a new issue