mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2026-10-09 07:56:40 +00:00
The isolated pre-commit mypy hook previously omitted runtime type information that make mypy used, hiding errors involving dependencies such as Pydantic and Pendulum. Makefile, pre-commit and CI now run the same full-project typing policy in the development environment defined by uv.lock. - Use uv run --locked --exact --extra dev and the same mypy arguments for Makefile and the local hook. Check all of src and tests, including on configuration-only changes. - Pin Python 3.13 for local development and the pre-commit CI job, and install the locked pre-commit version in CI. - Disable incremental analysis because existing Pendulum cache state changes mypy 2.3.1 diagnostics. Document the policy, the performance tradeoff and the existing typing debt. - Add a regression test that exercises Makefile, the hook and the CI command in a temporary project, accepting valid dependency types and detecting deliberate Pydantic/Pendulum assignment errors. Resolve the newly detected mypy diagnostics. - Enable the numpydantic and Pydantic mypy plugins, retaining strict Pydantic constructor typing with init_typed = true. Validate raw/coercible payloads through model_validate. - Propagate concrete record, provider and time-window types through generic collections, factories and lookup methods. Preserve runtime field inspection and generated time-window documentation. - Align Pendulum annotations with actual factory/arithmetic results while retaining Pydantic validation adapters at runtime. Correct optional values, array boundaries, REST handlers and plotting interfaces. - Add pinned scipy-stubs and types-psutil, update uv.lock, and supply the plugins' dependencies. - Add runtime regression coverage for validated path defaults, normalized time-series metadata, generic field inspection, invalid timestamps and unsupported provider imports. Runtime and compatibility details: - Validate path defaults as Path objects while retaining raw string defaults needed by migration serialization with exclude_defaults. - Normalize feed-in tariff lists and default charge rates to NumPy arrays; reject missing timestamps/uninitialized values explicitly. Importing into a provider without import support returns HTTP 400. - Public JSON schemas and OpenAPI structure match main (excluding the generated version). Signed-off-by: dr-dimitry Signed-off-by: dr-dimitry Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com> Co-authored-by: dr-dimitri <87113560+dr-dimitri@users.noreply.github.com> Co-authored-by: Normann <github@koldrack.com>
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
"""Settings for caching.
|
|
|
|
Kept in an extra module to avoid cyclic dependencies on package import.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
|
|
from pydantic import Field
|
|
|
|
from akkudoktoreos.config.configabc import SettingsBaseModel
|
|
|
|
|
|
class CacheCommonSettings(SettingsBaseModel):
|
|
"""Cache Configuration."""
|
|
|
|
# Retain the raw serialized default for exclude_defaults compatibility.
|
|
subpath: Optional[Path] = Field(
|
|
default="cache",
|
|
validate_default=True,
|
|
json_schema_extra={"description": "Sub-path for the EOS cache data directory."},
|
|
)
|
|
|
|
cleanup_interval: float = Field(
|
|
default=5.0 * 60,
|
|
ge=5.0,
|
|
json_schema_extra={"description": "Intervall in seconds for EOS file cache cleanup."},
|
|
)
|
|
|
|
# Do not make this a pydantic computed field. The pydantic model must be fully initialized
|
|
# to have access to config.general, which may not be the case if it is a computed field.
|
|
def path(self) -> Optional[Path]:
|
|
"""Computed cache path based on general.data_folder_path."""
|
|
if self.config.general.home_assistant_addon:
|
|
# Only /data is persistent for home assistant add-on
|
|
return Path("/data/cache")
|
|
data_cache_path = self.config.general.data_folder_path
|
|
if data_cache_path is None or self.subpath is None:
|
|
return None
|
|
return data_cache_path.joinpath(self.subpath)
|