P0: live provider chain — GitHub mirror primary, relay fallback, bundled dump last resort + app telemetry beacon
- MirrorFuelProvider: fetches CURRENT prices from raw.githubusercontent (latest.json pointer → history/<day>.json full dump), app-group day-cache so the ~2.8 MB dump is re-downloaded only when the mirror pushes a new day - LiveChainProvider: full path (app refresh) GitHub → relay; focused path (background alert checks) relay-first so alerts never pull the full dump over mobile data; records which leg served for About + telemetry - FuelBeacon: fire-and-forget X-Client app ping to the relay's existing widget-diag route (zero relay changes) — attribution + cadence on-LAN, silent skip off-LAN is the reachability datum; /stats app-hit spike = GitHub path failing - Bundled dump: FuelBoardDump dataset (real 2026-08-15 snapshot, 8,022 stations) + BundledDumpProvider + scripts/refresh_bundled_dump.sh — no-network last resort replaces the demo sample set - ContentView: About meta from the chain; catch falls back cached → bundled → sample - 89 tests (6 new: chain order x4, cache decision, beacon URL); Release build green; beacon route verified against the live relay (204 + logged)
This commit is contained in:
@@ -19,9 +19,9 @@ protocol FuelPriceProviding {
|
||||
}
|
||||
|
||||
enum FuelPriceProvider {
|
||||
/// Default: the keyless relay (full-UK Fuel Finder data). Falls back to
|
||||
/// the England-wide sample set when the relay is unreachable.
|
||||
static let active: FuelPriceProviding = RelayFuelProvider()
|
||||
/// Default: the live chain — GitHub mirror (primary, off-LAN) → LAN
|
||||
/// relay (fallback) → bundled dump (last resort in the app target).
|
||||
static let active: FuelPriceProviding = LiveChainProvider()
|
||||
|
||||
/// Decodes a relay payload into stations, applying the defensive price
|
||||
/// band. Internal so the unit-test target can exercise the guard.
|
||||
@@ -296,12 +296,15 @@ struct FuelFinderProvider: FuelPriceProviding {
|
||||
enum FuelProviderError: LocalizedError {
|
||||
case notImplemented
|
||||
case relayUnavailable
|
||||
case mirrorUnavailable
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
case .notImplemented:
|
||||
return "Live Fuel Finder API not wired yet — activate with GOV.UK One Login credentials."
|
||||
case .relayUnavailable:
|
||||
return "FuelBoard Relay unreachable — showing cached/sample data."
|
||||
case .mirrorUnavailable:
|
||||
return "GitHub price mirror unreachable."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user