- Introduce internal/providers/nws with shared timestamp parsing used by both
NWS sources and normalizers
- Migrate NWS observation source + normalizer to use the shared provider helper
for consistent RFC3339/RFC3339Nano handling
- Introduce internal/providers/openweather with a shared URL invariant helper
enforcing units=metric
- Remove duplicated OpenWeather URL validation logic from the observation source
- Align provider layering: move provider “contract/quirk” logic out of
normalizers and into internal/providers
- Update normalizer and standards documentation to clearly distinguish:
provider helpers (internal/providers) vs canonical mapping logic
(internal/normalizers)
This refactor reduces duplication between sources and normalizers, clarifies
layering boundaries, and establishes a scalable pattern for future forecast
and alert implementations.
- Adopt an opinionated Event.ID policy across sources:
- use upstream-provided ID when available
- otherwise derive a stable ID from Source:EffectiveAt (RFC3339Nano, UTC)
- fall back to Source:EmittedAt when EffectiveAt is unavailable
- Add common/id helper to centralize ID selection logic and keep sources consistent
- Simplify common event construction by collapsing SingleRawEventAt/SingleRawEvent
into a single explicit SingleRawEvent helper (emittedAt passed in)
- Update NWS/Open-Meteo/OpenWeather observation sources to:
- compute EffectiveAt first
- generate IDs via the shared helper
- build envelopes via the unified SingleRawEvent helper
- Improve determinism and dedupe-friendliness without changing schemas or payloads
Refactor OpenWeather normalizers to improve structure and reuse by moving
provider-specific helper functions out of observation.go and into a new
common.go.
This keeps observation.go focused on schema matching and domain mapping,
preserves the “one normalizer per file” convention, and establishes a clear
home for helpers that will be shared by future OpenWeather forecast and alert
normalizers.
No functional behavior changes; this is a pure internal refactor.
Add shared normalizer helpers to centralize payload extraction, JSON decoding,
and event finalization/validation.
Refactor NWS, Open-Meteo, and OpenWeather observation normalizers to use the
shared spine, removing repeated boilerplate while preserving provider-specific
mapping logic.
- Require params.user_agent for all HTTP sources (uniform config across providers)
- Add common.RequireHTTPSourceConfig() to validate name/url/user_agent in one call
- Add common.NewHTTPClient() with DefaultHTTPTimeout for consistent client setup
- Add common.SingleRawEvent() to centralize event envelope construction + validation
- Refactor NWS/Open-Meteo/OpenWeather observation sources to use new helpers