c417c892d9
Enhance JSON payload decoding to accept both typed and pointer payloads, and add corresponding tests
ci/woodpecker/push/build-image Pipeline was successful
2026-06-10 22:11:38 -05:00
5d94d3f32d
Remove invalid SPC URLs for day 3 tornado/wind/hail risk
ci/woodpecker/push/build-image Pipeline failed
2026-06-10 21:56:11 -05:00
06d5973746
Clean up stale internal literals
ci/woodpecker/push/build-image Pipeline was canceled
2026-06-11 02:23:42 +00:00
8045b27173
Move SPC provider fixture helper
2026-06-11 02:20:25 +00:00
985468c1b9
Add documentation identifier consistency tests
2026-06-11 02:18:15 +00:00
6a0b30b7c7
Centralize Postgres event envelope mapping
2026-06-11 02:15:52 +00:00
86ce4eb68c
Share HTTP config parsing for multi-document sources
2026-06-11 02:13:38 +00:00
33541a71fc
Table-drive source registry tests
2026-06-11 02:10:13 +00:00
b7277e0c02
Centralize weather event and driver identifiers
2026-06-11 02:08:36 +00:00
a990da957b
Finalize SPC outlook feature addition and clean up implemented roadmap documentation
ci/woodpecker/push/build-image Pipeline was successful
2026-06-10 19:54:39 -05:00
e966276c40
Add Postgres mapping for SPC outlooks
2026-06-11 00:24:12 +00:00
1e2db468ea
Add SPC outlook normalization
2026-06-11 00:20:31 +00:00
cefd4dfc7c
Add raw SPC convective outlook source
2026-06-11 00:15:40 +00:00
42c646c328
Add GeoJSON point containment helper
2026-06-11 00:10:01 +00:00
b2c429983c
Add SPC provider parsing helpers
2026-06-11 00:06:55 +00:00
002f9d0ba6
Clean up documentation consistency
ci/woodpecker/push/build-image Pipeline was successful
2026-06-10 20:28:41 +00:00
47176520bb
Document development workflow and internals
2026-06-10 20:22:38 +00:00
fd820fd964
Implemented NWS weather stories support
ci/woodpecker/push/build-image Pipeline was successful
2026-05-30 06:47:18 -05:00
cca873cafb
Made forecast-period conditionCode optional
ci/woodpecker/manual/build-image Pipeline was successful
2026-05-28 07:47:07 -05:00
a0389ebce8
Added support for Area Forecast Discussions issued by the NWS
ci/woodpecker/push/build-image Pipeline was successful
2026-03-28 16:17:03 -05:00
40f17c9d86
Updates to track upstream feedkit v0.8.2
ci/woodpecker/push/build-image Pipeline was successful
2026-03-28 13:53:54 -05:00
c76088c38c
Code cleanup and deduplication pass through weatherfeeder
ci/woodpecker/push/build-image Pipeline was successful
ci/woodpecker/manual/build-image Pipeline was successful
2026-03-28 12:01:07 -05:00
2c1278a70a
Moved generic and broadly useful helper functions upstream into feedkit
ci/woodpecker/push/build-image Pipeline was successful
2026-03-28 11:30:20 -05:00
eb27486466
Moved HTTP polling helpers upstream into feedkit, and updated to feedkit v0.8.0
ci/woodpecker/push/build-image Pipeline was successful
2026-03-28 10:02:50 -05:00
356c3be648
Feature addition to support narrative forecast updates from the NWS
ci/woodpecker/push/build-image Pipeline was successful
2026-03-27 16:07:12 -05:00
dbaebbbd7a
Updates to the nws forecast source and normalizer to separate code specific to hourly forecasts and prepare for upcoming feature addition of daily and narrative forecasts
ci/woodpecker/push/build-image Pipeline was successful
2026-03-27 12:58:23 -05:00
88d5727a84
Simplified the forecast schema
ci/woodpecker/push/build-image Pipeline was successful
2026-03-26 21:35:08 -05:00
129cebd94d
Updated the normalized observation schema to remove duplicate and/or unnecessary fields
ci/woodpecker/push/build-image Pipeline was successful
2026-03-17 11:04:51 -05:00
9ddcf5e0df
Document the PostgreSQL schema contract in doc.go
ci/woodpecker/push/build-image Pipeline was successful
2026-03-17 09:33:07 -05:00
d0b58a4734
Updates to track feedkit v0.7.2 and to add a dedupe processor
ci/woodpecker/push/build-image Pipeline was successful
2026-03-16 18:35:44 -05:00
84da2bb689
Added a postgres sink implementation.
ci/woodpecker/push/build-image Pipeline failed
2026-03-16 15:32:46 -05:00
ea113e2dcc
Updated processor/normalizer wiring to track Feedkit v0.7.0
ci/woodpecker/push/build-image Pipeline failed
2026-03-16 13:35:51 -05:00
eae9568afe
Updated source configuration to track Feedkit v0.6.0
ci/woodpecker/push/build-image Pipeline failed
2026-03-15 19:22:57 -05:00
123e8ff763
Moved the standards package out of internal/ so it can be imported by downstream consumers.
ci/woodpecker/push/build-image Pipeline was successful
2026-02-08 09:15:07 -06:00
5923592b53
Moved the weatherfeeder model out of internal/ so that downstream consumers can import it directly.
ci/woodpecker/push/build-image Pipeline was successful
2026-02-08 08:56:16 -06:00
da0231b20f
Add day/night estimation for NWS observations based on solar elevation and update observation model.
2026-01-22 23:15:17 -06:00
c675045013
Updated documentation and added API.md to document the stable external wire format.
2026-01-17 17:39:18 -06:00
b4a67e208c
Updated model and normalizers to map provider “feels like” fields into a single ApparentTemperatureC field.
2026-01-17 10:36:19 -06:00
c12cf91115
normalizers: implemented openmeteo forecast normalizer.
2026-01-17 10:16:50 -06:00
b47f1b2051
sources: added an OpenMeteo forecast source.
2026-01-17 08:00:23 -06:00
b8804d32d2
refactor(normalizers): deduplicate synthetic station ID generation
...
- Add common SynthStationID helpers for coordinate-based providers
- Use shared helper for Open-Meteo and OpenWeather station ID synthesis
- Require both lat/lon when generating synthetic IDs to avoid misleading defaults
- Remove unused Open-Meteo normalizer wrapper code
This reduces cross-provider duplication while keeping provider-specific
mapping logic explicit and readable.
2026-01-16 22:13:44 -06:00
00e811f8f7
normalizers/nws: add NWS alerts normalizer and canonical alert mapping
...
- Introduce AlertsNormalizer to convert Raw NWS Alerts (SchemaRawNWSAlertsV1)
into canonical WeatherAlert runs (SchemaWeatherAlertV1)
- Add minimal NWS alerts response/types to support GeoJSON FeatureCollection parsing
- Map NWS alert properties (event, headline, severity, timing, area, references)
into model.WeatherAlert with best-effort timestamp handling
- Establish clear AsOf / EffectiveAt policy for alert runs to support stable
deduplication and snapshot semantics
- Register the new alerts normalizer alongside existing NWS observation and
forecast normalizers
2026-01-16 21:40:20 -06:00
2eb2d4b90f
feat(nws, normalizers): add NWS hourly forecast normalization and enforce canonical float rounding
...
- Implement full NWS hourly forecast normalizer (raw.nws.hourly.forecast.v1 → weather.forecast.v1)
- Add GeoJSON forecast types and helpers for NWS gridpoint hourly payloads
- Normalize temperatures, winds, humidity, PoP, and infer WMO condition codes from forecast text/icons
- Treat forecast IssuedAt as EffectiveAt for stable, dedupe-friendly event IDs
- Introduce project-wide float rounding at normalization finalization
- Round all float values in canonical payloads to 2 decimal places
- Apply consistently across pointers, slices, maps, and nested structs
- Preserve opaque structs (e.g., time.Time) unchanged
- Add SchemaRawNWSHourlyForecastV1 and align schema matching/comments
- Clean up NWS helper organization and comments
- Update documentation to reflect numeric wire-format and normalization policies
This establishes a complete, deterministic hourly forecast pipeline for NWS
and improves JSON output stability across all canonical weather schemas.
2026-01-16 10:28:32 -06:00
0fcc536885
Updates in preparation for adding forecast sources.
2026-01-16 00:04:37 -06:00
e10ba804ca
model: add explicit JSON tags and document canonical payload contract
...
Add lowerCamelCase JSON tags to canonical model types (observation, forecast,
alert) to stabilize the emitted wire format and make payload structure explicit
for downstream sinks.
Introduce internal/model/doc.go to document these structs as versioned,
schema-governed payloads and clarify compatibility expectations (additive
changes preferred; breaking changes require schema bumps).
No functional behavior changes; this formalizes the canonical output contract
ahead of additional sinks and consumers.
2026-01-15 22:39:37 -06:00
f13f43cf56
refactor(providers): centralize provider-specific parsing and invariants
...
- 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.
2026-01-15 20:40:53 -06:00
a341aee5df
normalizers: Updated error handling within the JSON helper function.
2026-01-15 20:17:46 -06:00
d8db58c004
sources: standardize Event.ID on Source:EffectiveAt; simplify raw event helper
...
- 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
2026-01-15 19:38:15 -06:00
d9474b5a5b
v0.x: add reusable HTTP source spine; fix routing; upstream HTTP transport helper
...
- fix dispatch route compilation so empty Kinds matches all (nil), not none
- introduce internal/sources/common/HTTPSource to centralize HTTP polling boilerplate:
- standard cfg parsing (url + user_agent)
- default HTTP client + Accept/User-Agent headers
- consistent error wrapping
- refactor observation sources (nws/openmeteo/openweather) to use HTTPSource
- upstream generic HTTP fetch/limits/timeout helper from weatherfeeder to feedkit:
- move internal/sources/common/http.go -> feedkit/transport/http.go
- keep behavior: status checks, max-body limit, default timeout
2026-01-15 19:11:58 -06:00
1790218d38
Updated documentation for internal consistency.
2026-01-15 10:47:59 -06:00