Julian Pawlowski
|
c2b9908e69
|
refactor(naming): complete class naming convention alignment
Renamed 25 public classes + 1 Enum to include TibberPrices prefix
following Home Assistant integration naming standards.
All classes now follow pattern: TibberPrices{SemanticPurpose}
No package hierarchy in names (import path is namespace).
Key changes:
- Coordinator module: DataFetcher, DataTransformer, ListenerManager,
PeriodCalculator, TimeService (203 usages), CacheData
- Config flow: CannotConnectError, InvalidAuthError
- Entity utils: IconContext
- Sensor calculators: BaseCalculator + 8 subclasses
- Period handlers: 5 NamedTuples (PeriodConfig, PeriodData,
PeriodStatistics, ThresholdConfig, IntervalCriteria)
- Period handlers: SpikeCandidateContext (dataclass → NamedTuple)
- API: QueryType Enum
Documentation updates:
- AGENTS.md: Added Pyright code generation guidelines
- planning/class-naming-refactoring-plan.md: Complete execution log
Quality metrics:
- 0 Pyright errors (strict type checking)
- 0 Ruff errors (linting + formatting)
- All hassfest checks passed
- 79 files validated
Impact: Aligns with HA Core standards (TibberDataCoordinator pattern).
No user-facing changes - internal refactor only.
|
2025-11-20 11:22:53 +00:00 |
|
Julian Pawlowski
|
a962289682
|
refactor(sensor): implement Calculator Pattern with specialized modules
Massive refactoring of sensor platform reducing core.py from 2,170 to 909
lines (58% reduction). Extracted business logic into specialized calculators
and attribute builders following separation of concerns principles.
Changes:
- Created sensor/calculators/ package (8 specialized calculators, 1,838 lines):
* base.py: Abstract BaseCalculator with coordinator access
* interval.py: Single interval calculations (current/next/previous)
* rolling_hour.py: 5-interval rolling windows
* daily_stat.py: Calendar day min/max/avg statistics
* window_24h.py: Trailing/leading 24h windows
* volatility.py: Price volatility analysis
* trend.py: Complex trend analysis with caching (640 lines)
* timing.py: Best/peak price period timing
* metadata.py: Home/metering metadata
- Created sensor/attributes/ package (8 specialized modules, 1,209 lines):
* Modules match calculator types for consistent organization
* __init__.py: Routing logic + unified builders
* Handles state presentation separately from business logic
- Created sensor/chart_data.py (144 lines):
* Extracted chart data export functionality from entity class
* YAML parsing, service calls, metadata formatting
- Created sensor/value_getters.py (276 lines):
* Centralized handler mapping for all 80+ sensor types
* Single source of truth for sensor routing
- Extended sensor/helpers.py (+88 lines):
* Added aggregate_window_data() unified aggregator
* Added get_hourly_price_value() for backward compatibility
* Consolidated sensor-specific helper functions
- Refactored sensor/core.py (909 lines, was 2,170):
* Instantiates all calculators in __init__
* Delegates value calculations to appropriate calculator
* Uses unified handler methods via value_getters mapping
* Minimal platform-specific logic remains (icon callbacks, entity lifecycle)
- Deleted sensor/attributes.py (1,106 lines):
* Functionality split into attributes/ package (8 modules)
- Updated AGENTS.md:
* Documented Calculator Pattern architecture
* Added guidance for adding new sensors with calculation groups
* Updated file organization with new package structure
Architecture Benefits:
- Clear separation: Calculators (business logic) vs Attributes (presentation)
- Improved testability: Each calculator independently testable
- Better maintainability: 21 focused modules vs monolithic file
- Easy extensibility: Add sensors by choosing calculation pattern
- Reusable components: Calculators and attribute builders shared across sensors
Impact: Significantly improved code organization and maintainability while
preserving all functionality. All 80+ sensor types continue working with
cleaner, more modular architecture. Developer experience improved with
logical file structure and clear separation of concerns.
|
2025-11-18 21:25:55 +00:00 |
|