From 391a6316adc090ff5d6fcd64e37b559e659e4e3c Mon Sep 17 00:00:00 2001 From: malice Date: Fri, 17 Jul 2026 14:06:08 -0600 Subject: [PATCH] chore: remove dead modules and orphaned fixtures (-2,952 LOC) (#142) * chore: remove dead mesh_sources.py module Superseded by mesh_data_store.py, whose docstring states it "replaces mesh_sources.py with a clean three-layer architecture." No remaining inbound imports (absolute or relative) repo-wide; the only surviving references to "mesh_sources" are to the unrelated config YAML section of the same name, which is untouched. Co-Authored-By: Claude Opus 4.8 (1M context) * chore: remove dead region_tagger.py module Only reference to "region_tagger" repo-wide was inside its own module docstring usage example; no live imports found. Co-Authored-By: Claude Opus 4.8 (1M context) * chore: remove empty meshai/cli package Package contained only a docstring, no code. No imports of meshai.cli found anywhere; console entry point is meshai.main:main (pyproject.toml), and packaging (tool.setuptools.packages.find, include = ["meshai*"]) has no explicit reference to the cli subpackage. No MANIFEST.in/setup.py/setup.cfg exist to update. Co-Authored-By: Claude Opus 4.8 (1M context) * chore: remove orphaned swpc/swpc_last golden fixtures 63 files (40 in fixtures/swpc/, 23 in fixtures/swpc_last/) never loaded by any test. harness/goldens.py's load_fixtures(hazard) is the only generic fixture loader and is never called with "swpc" or "swpc_last" (only "avalanche", "nws", "nws_last", "quake"). The sole remaining textual reference, a provenance comment in test_swpc_refactor.py:162 ("Fixture mirrors swpc_last/0003.json..."), is left untouched. Co-Authored-By: Claude Opus 4.8 (1M context) --------- Co-authored-by: Matt Johnson Co-authored-by: Claude Opus 4.8 (1M context) --- work/meshai/cli/__init__.py | 1 - work/meshai/mesh_sources.py | 544 --------------------- work/meshai/notifications/region_tagger.py | 160 ------ work/tests/fixtures/swpc/0000.json | 36 -- work/tests/fixtures/swpc/0001.json | 36 -- work/tests/fixtures/swpc/0002.json | 36 -- work/tests/fixtures/swpc/0003.json | 36 -- work/tests/fixtures/swpc/0004.json | 36 -- work/tests/fixtures/swpc/0005.json | 36 -- work/tests/fixtures/swpc/0006.json | 36 -- work/tests/fixtures/swpc/0007.json | 36 -- work/tests/fixtures/swpc/0008.json | 36 -- work/tests/fixtures/swpc/0009.json | 36 -- work/tests/fixtures/swpc/0010.json | 36 -- work/tests/fixtures/swpc/0011.json | 36 -- work/tests/fixtures/swpc/0012.json | 36 -- work/tests/fixtures/swpc/0013.json | 36 -- work/tests/fixtures/swpc/0014.json | 36 -- work/tests/fixtures/swpc/0015.json | 36 -- work/tests/fixtures/swpc/0016.json | 36 -- work/tests/fixtures/swpc/0017.json | 36 -- work/tests/fixtures/swpc/0018.json | 36 -- work/tests/fixtures/swpc/0019.json | 36 -- work/tests/fixtures/swpc/0020.json | 36 -- work/tests/fixtures/swpc/0021.json | 36 -- work/tests/fixtures/swpc/0022.json | 36 -- work/tests/fixtures/swpc/0023.json | 36 -- work/tests/fixtures/swpc/0024.json | 36 -- work/tests/fixtures/swpc/0025.json | 36 -- work/tests/fixtures/swpc/0026.json | 36 -- work/tests/fixtures/swpc/0027.json | 36 -- work/tests/fixtures/swpc/0028.json | 36 -- work/tests/fixtures/swpc/0029.json | 36 -- work/tests/fixtures/swpc/0030.json | 36 -- work/tests/fixtures/swpc/0031.json | 36 -- work/tests/fixtures/swpc/0032.json | 36 -- work/tests/fixtures/swpc/0033.json | 36 -- work/tests/fixtures/swpc/0034.json | 36 -- work/tests/fixtures/swpc/0035.json | 36 -- work/tests/fixtures/swpc/0036.json | 36 -- work/tests/fixtures/swpc/0037.json | 36 -- work/tests/fixtures/swpc/0038.json | 36 -- work/tests/fixtures/swpc/0039.json | 36 -- work/tests/fixtures/swpc_last/0000.json | 35 -- work/tests/fixtures/swpc_last/0001.json | 35 -- work/tests/fixtures/swpc_last/0002.json | 35 -- work/tests/fixtures/swpc_last/0003.json | 35 -- work/tests/fixtures/swpc_last/0004.json | 35 -- work/tests/fixtures/swpc_last/0005.json | 35 -- work/tests/fixtures/swpc_last/0006.json | 35 -- work/tests/fixtures/swpc_last/0007.json | 35 -- work/tests/fixtures/swpc_last/0008.json | 35 -- work/tests/fixtures/swpc_last/0009.json | 35 -- work/tests/fixtures/swpc_last/0010.json | 35 -- work/tests/fixtures/swpc_last/0011.json | 35 -- work/tests/fixtures/swpc_last/0012.json | 35 -- work/tests/fixtures/swpc_last/0013.json | 35 -- work/tests/fixtures/swpc_last/0014.json | 35 -- work/tests/fixtures/swpc_last/0015.json | 35 -- work/tests/fixtures/swpc_last/0016.json | 35 -- work/tests/fixtures/swpc_last/0017.json | 35 -- work/tests/fixtures/swpc_last/0018.json | 35 -- work/tests/fixtures/swpc_last/0019.json | 35 -- work/tests/fixtures/swpc_last/0020.json | 35 -- work/tests/fixtures/swpc_last/0021.json | 36 -- work/tests/fixtures/swpc_last/0022.json | 36 -- 66 files changed, 2952 deletions(-) delete mode 100644 work/meshai/cli/__init__.py delete mode 100644 work/meshai/mesh_sources.py delete mode 100644 work/meshai/notifications/region_tagger.py delete mode 100644 work/tests/fixtures/swpc/0000.json delete mode 100644 work/tests/fixtures/swpc/0001.json delete mode 100644 work/tests/fixtures/swpc/0002.json delete mode 100644 work/tests/fixtures/swpc/0003.json delete mode 100644 work/tests/fixtures/swpc/0004.json delete mode 100644 work/tests/fixtures/swpc/0005.json delete mode 100644 work/tests/fixtures/swpc/0006.json delete mode 100644 work/tests/fixtures/swpc/0007.json delete mode 100644 work/tests/fixtures/swpc/0008.json delete mode 100644 work/tests/fixtures/swpc/0009.json delete mode 100644 work/tests/fixtures/swpc/0010.json delete mode 100644 work/tests/fixtures/swpc/0011.json delete mode 100644 work/tests/fixtures/swpc/0012.json delete mode 100644 work/tests/fixtures/swpc/0013.json delete mode 100644 work/tests/fixtures/swpc/0014.json delete mode 100644 work/tests/fixtures/swpc/0015.json delete mode 100644 work/tests/fixtures/swpc/0016.json delete mode 100644 work/tests/fixtures/swpc/0017.json delete mode 100644 work/tests/fixtures/swpc/0018.json delete mode 100644 work/tests/fixtures/swpc/0019.json delete mode 100644 work/tests/fixtures/swpc/0020.json delete mode 100644 work/tests/fixtures/swpc/0021.json delete mode 100644 work/tests/fixtures/swpc/0022.json delete mode 100644 work/tests/fixtures/swpc/0023.json delete mode 100644 work/tests/fixtures/swpc/0024.json delete mode 100644 work/tests/fixtures/swpc/0025.json delete mode 100644 work/tests/fixtures/swpc/0026.json delete mode 100644 work/tests/fixtures/swpc/0027.json delete mode 100644 work/tests/fixtures/swpc/0028.json delete mode 100644 work/tests/fixtures/swpc/0029.json delete mode 100644 work/tests/fixtures/swpc/0030.json delete mode 100644 work/tests/fixtures/swpc/0031.json delete mode 100644 work/tests/fixtures/swpc/0032.json delete mode 100644 work/tests/fixtures/swpc/0033.json delete mode 100644 work/tests/fixtures/swpc/0034.json delete mode 100644 work/tests/fixtures/swpc/0035.json delete mode 100644 work/tests/fixtures/swpc/0036.json delete mode 100644 work/tests/fixtures/swpc/0037.json delete mode 100644 work/tests/fixtures/swpc/0038.json delete mode 100644 work/tests/fixtures/swpc/0039.json delete mode 100644 work/tests/fixtures/swpc_last/0000.json delete mode 100644 work/tests/fixtures/swpc_last/0001.json delete mode 100644 work/tests/fixtures/swpc_last/0002.json delete mode 100644 work/tests/fixtures/swpc_last/0003.json delete mode 100644 work/tests/fixtures/swpc_last/0004.json delete mode 100644 work/tests/fixtures/swpc_last/0005.json delete mode 100644 work/tests/fixtures/swpc_last/0006.json delete mode 100644 work/tests/fixtures/swpc_last/0007.json delete mode 100644 work/tests/fixtures/swpc_last/0008.json delete mode 100644 work/tests/fixtures/swpc_last/0009.json delete mode 100644 work/tests/fixtures/swpc_last/0010.json delete mode 100644 work/tests/fixtures/swpc_last/0011.json delete mode 100644 work/tests/fixtures/swpc_last/0012.json delete mode 100644 work/tests/fixtures/swpc_last/0013.json delete mode 100644 work/tests/fixtures/swpc_last/0014.json delete mode 100644 work/tests/fixtures/swpc_last/0015.json delete mode 100644 work/tests/fixtures/swpc_last/0016.json delete mode 100644 work/tests/fixtures/swpc_last/0017.json delete mode 100644 work/tests/fixtures/swpc_last/0018.json delete mode 100644 work/tests/fixtures/swpc_last/0019.json delete mode 100644 work/tests/fixtures/swpc_last/0020.json delete mode 100644 work/tests/fixtures/swpc_last/0021.json delete mode 100644 work/tests/fixtures/swpc_last/0022.json diff --git a/work/meshai/cli/__init__.py b/work/meshai/cli/__init__.py deleted file mode 100644 index 0b88ffa..0000000 --- a/work/meshai/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""CLI tools for MeshAI.""" diff --git a/work/meshai/mesh_sources.py b/work/meshai/mesh_sources.py deleted file mode 100644 index 7b34193..0000000 --- a/work/meshai/mesh_sources.py +++ /dev/null @@ -1,544 +0,0 @@ -"""Mesh data source manager with deduplication and normalization.""" - -import logging -import time -from typing import Optional - -from .config import MeshSourceConfig -from .sources.meshview import MeshviewSource -from .sources.meshmonitor_data import MeshMonitorDataSource - -logger = logging.getLogger(__name__) - -# Meshtastic role enum mapping (integer -> string) -# From meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role -MESHTASTIC_ROLE_MAP = { - 0: "CLIENT", - 1: "CLIENT_MUTE", - 2: "ROUTER", - 3: "ROUTER_CLIENT", - 4: "REPEATER", - 5: "TRACKER", - 6: "SENSOR", - 7: "TAK", - 8: "CLIENT_HIDDEN", - 9: "LOST_AND_FOUND", - 10: "TAK_TRACKER", - 11: "ROUTER_LATE", - 12: "CLIENT_BASE", -} - - -def _normalize_node(node: dict) -> dict: - """Normalize a node dict to consistent field names and formats.""" - result = dict(node) - - # === ROLE NORMALIZATION === - role = node.get("role") - if role is None: - result["role"] = "UNKNOWN" - elif isinstance(role, int): - result["role"] = MESHTASTIC_ROLE_MAP.get(role, f"UNKNOWN_{role}") - elif isinstance(role, str): - result["role"] = role.upper() - else: - result["role"] = str(role).upper() - - # === GPS NORMALIZATION === - lat = None - if "latitude" in node and node["latitude"] is not None: - lat = node["latitude"] - elif "last_lat" in node and node["last_lat"] is not None: - lat = node["last_lat"] - if isinstance(lat, int) and abs(lat) > 1000: - lat = lat / 1e7 - elif "lat" in node and node["lat"] is not None: - lat = node["lat"] - - lon = None - if "longitude" in node and node["longitude"] is not None: - lon = node["longitude"] - elif "last_long" in node and node["last_long"] is not None: - lon = node["last_long"] - if isinstance(lon, int) and abs(lon) > 1000: - lon = lon / 1e7 - elif "lon" in node and node["lon"] is not None: - lon = node["lon"] - elif "lng" in node and node["lng"] is not None: - lon = node["lng"] - - if lat is not None and lon is not None: - if abs(lat) < 0.001 and abs(lon) < 0.001: - lat = None - lon = None - - result["latitude"] = lat - result["longitude"] = lon - - # === TIMESTAMP NORMALIZATION === - ts = None - if "last_seen_us" in node and node["last_seen_us"] is not None: - val = node["last_seen_us"] - if isinstance(val, (int, float)) and val > 0: - ts = val / 1_000_000 - - if ts is None: - for field in ("lastHeard", "last_heard", "last_seen", "lastSeen", "updated_at"): - if field in node and node[field] is not None: - val = node[field] - if isinstance(val, (int, float)) and val > 0: - if val > 1e15: - ts = val / 1_000_000 - elif val > 1e12: - ts = val / 1_000 - else: - ts = float(val) - break - - result["last_heard"] = ts - - # === HARDWARE MODEL NORMALIZATION === - hw = None - if "hw_model" in node and isinstance(node["hw_model"], str): - hw = node["hw_model"] - elif "hwModel" in node and isinstance(node["hwModel"], str): - hw = node["hwModel"] - if hw is None: - if "hw_model" in node and node["hw_model"] is not None: - hw = node["hw_model"] - elif "hwModel" in node and node["hwModel"] is not None: - hw = node["hwModel"] - - if hw is not None: - result["hw_model"] = hw - - return result - - -def _extract_node_num(node: dict) -> int | None: - """Extract numeric node ID from various formats.""" - # Try numeric fields first - for field in ("nodeNum", "num", "node_num"): - if field in node: - val = node[field] - if isinstance(val, int): - return val - if isinstance(val, str) and val.isdigit(): - return int(val) - - # Try hex node_id field - if "node_id" in node: - nid = node["node_id"] - if isinstance(nid, str): - hex_str = nid.lstrip("!") - try: - return int(hex_str, 16) - except ValueError: - pass - elif isinstance(nid, int): - return nid - - # Try generic id field (but NOT database row IDs) - if "id" in node: - val = node["id"] - if isinstance(val, int): - # Database row IDs are small; Meshtastic node numbers are large - if val > 100000: - return val - if isinstance(val, str): - if val.startswith("!"): - hex_str = val.lstrip("!") - try: - return int(hex_str, 16) - except ValueError: - pass - elif len(val) == 8: - try: - return int(val, 16) - except ValueError: - pass - - return None - - -def _normalize_edge_key(edge: dict) -> tuple[int, int] | None: - """Normalize edge to a canonical (from_num, to_num) tuple.""" - from_num = edge.get("from_node") or edge.get("from") or edge.get("from_num") - to_num = edge.get("to_node") or edge.get("to") or edge.get("to_num") - - if from_num is None or to_num is None: - return None - - if isinstance(from_num, str): - if from_num.isdigit(): - from_num = int(from_num) - else: - try: - from_num = int(from_num.lstrip("!"), 16) - except ValueError: - return None - - if isinstance(to_num, str): - if to_num.isdigit(): - to_num = int(to_num) - else: - try: - to_num = int(to_num.lstrip("!"), 16) - except ValueError: - return None - - return (min(from_num, to_num), max(from_num, to_num)) - - -class MeshSourceManager: - """Manages multiple mesh data sources with deduplication.""" - - def __init__(self, source_configs: list[MeshSourceConfig]): - self._sources: dict[str, MeshviewSource | MeshMonitorDataSource] = {} - - for cfg in source_configs: - if not cfg.enabled: - continue - - name = cfg.name - if not name: - logger.warning("Skipping source with empty name") - continue - - if name in self._sources: - logger.warning(f"Duplicate source name '{name}', skipping") - continue - - try: - if cfg.type == "meshview": - self._sources[name] = MeshviewSource( - url=cfg.url, - refresh_interval=cfg.refresh_interval, - ) - logger.info(f"Created Meshview source '{name}' -> {cfg.url}") - - elif cfg.type == "meshmonitor": - self._sources[name] = MeshMonitorDataSource( - url=cfg.url, - api_token=cfg.api_token, - refresh_interval=cfg.refresh_interval, - ) - logger.info(f"Created MeshMonitor source '{name}' -> {cfg.url}") - - else: - logger.warning(f"Unknown source type '{cfg.type}' for '{name}'") - - except Exception as e: - logger.error(f"Failed to create source '{name}': {e}") - - def refresh_all(self) -> int: - refreshed = 0 - for name, source in self._sources.items(): - try: - if source.maybe_refresh(): - refreshed += 1 - except Exception as e: - logger.error(f"Error refreshing source '{name}': {e}") - return refreshed - - def get_source(self, name: str) -> Optional[MeshviewSource | MeshMonitorDataSource]: - return self._sources.get(name) - - def get_all_nodes(self) -> list[dict]: - """Get deduplicated nodes from all sources with _node_num field.""" - nodes_by_num: dict[int, dict] = {} - - for name, source in self._sources.items(): - for node in source.nodes: - normalized = _normalize_node(node) - node_num = _extract_node_num(normalized) - - if node_num is None: - normalized["_sources"] = [name] - pseudo_key = -len(nodes_by_num) - 1 - nodes_by_num[pseudo_key] = normalized - continue - - # BUG 1 FIX: Store _node_num on the normalized dict - normalized["_node_num"] = node_num - - if node_num in nodes_by_num: - existing = nodes_by_num[node_num] - if name not in existing["_sources"]: - existing["_sources"].append(name) - for key, value in normalized.items(): - if key not in ("_sources", "_node_num") and value is not None: - existing[key] = value - else: - normalized["_sources"] = [name] - nodes_by_num[node_num] = normalized - - return list(nodes_by_num.values()) - - def get_all_edges(self) -> list[dict]: - edges_by_key: dict[tuple[int, int], dict] = {} - - for name, source in self._sources.items(): - if not isinstance(source, MeshviewSource): - continue - - for edge in source.edges: - edge_key = _normalize_edge_key(edge) - if edge_key is None: - tagged = dict(edge) - tagged["_sources"] = [name] - pseudo_key = (-len(edges_by_key) - 1, 0) - edges_by_key[pseudo_key] = tagged - continue - - if edge_key in edges_by_key: - existing = edges_by_key[edge_key] - if name not in existing["_sources"]: - existing["_sources"].append(name) - for key, value in edge.items(): - if key != "_sources" and value is not None: - existing[key] = value - else: - tagged = dict(edge) - tagged["_sources"] = [name] - edges_by_key[edge_key] = tagged - - return list(edges_by_key.values()) - - def get_all_telemetry(self) -> list[dict]: - telemetry_by_key: dict[tuple[int, float], dict] = {} - - for name, source in self._sources.items(): - if not isinstance(source, MeshMonitorDataSource): - continue - - for item in source.telemetry: - node_num = _extract_node_num(item) - timestamp = item.get("timestamp") or item.get("time") or item.get("ts") - - if node_num is None or timestamp is None: - tagged = dict(item) - tagged["_sources"] = [name] - pseudo_key = (-len(telemetry_by_key) - 1, 0.0) - telemetry_by_key[pseudo_key] = tagged - continue - - key = (node_num, float(timestamp)) - - if key in telemetry_by_key: - existing = telemetry_by_key[key] - if name not in existing["_sources"]: - existing["_sources"].append(name) - for k, v in item.items(): - if k != "_sources" and v is not None: - existing[k] = v - else: - tagged = dict(item) - tagged["_sources"] = [name] - telemetry_by_key[key] = tagged - - return list(telemetry_by_key.values()) - - def get_all_traceroutes(self) -> list[dict]: - all_traceroutes = [] - for name, source in self._sources.items(): - if isinstance(source, MeshMonitorDataSource): - for item in source.traceroutes: - tagged = dict(item) - tagged["_sources"] = [name] - all_traceroutes.append(tagged) - return all_traceroutes - - def get_all_channels(self) -> list[dict]: - all_channels = [] - for name, source in self._sources.items(): - if isinstance(source, MeshMonitorDataSource): - for item in source.channels: - tagged = dict(item) - tagged["_sources"] = [name] - all_channels.append(tagged) - return all_channels - - def get_status(self) -> list[dict]: - status_list = [] - for name, source in self._sources.items(): - status = { - "name": name, - "type": "meshview" if isinstance(source, MeshviewSource) else "meshmonitor", - "enabled": True, - "is_loaded": source.is_loaded, - "last_refresh": source.last_refresh, - "last_error": source.last_error, - "node_count": len(source.nodes), - } - - if isinstance(source, MeshviewSource): - status["edge_count"] = len(source.edges) - elif isinstance(source, MeshMonitorDataSource): - status["telemetry_count"] = len(source.telemetry) - status["traceroute_count"] = len(source.traceroutes) - status["channel_count"] = len(source.channels) - - status_list.append(status) - - return status_list - - def get_stats_by_source(self) -> dict[str, dict]: - stats = {} - for name, source in self._sources.items(): - source_stats = { - "node_count": len(source.nodes), - "is_loaded": source.is_loaded, - "last_refresh": source.last_refresh, - } - - if isinstance(source, MeshviewSource): - source_stats["edge_count"] = len(source.edges) - source_stats["type"] = "meshview" - elif isinstance(source, MeshMonitorDataSource): - source_stats["telemetry_count"] = len(source.telemetry) - source_stats["traceroute_count"] = len(source.traceroutes) - source_stats["channel_count"] = len(source.channels) - source_stats["type"] = "meshmonitor" - - stats[name] = source_stats - - return stats - - def get_dedup_stats(self) -> dict: - raw_nodes = sum(len(s.nodes) for s in self._sources.values()) - raw_edges = sum( - len(s.edges) for s in self._sources.values() - if isinstance(s, MeshviewSource) - ) - - dedup_nodes = len(self.get_all_nodes()) - dedup_edges = len(self.get_all_edges()) - - return { - "raw_node_count": raw_nodes, - "dedup_node_count": dedup_nodes, - "node_duplicates": raw_nodes - dedup_nodes, - "raw_edge_count": raw_edges, - "dedup_edge_count": dedup_edges, - "edge_duplicates": raw_edges - dedup_edges, - } - - def get_all_packets(self) -> list[dict]: - packets_by_id: dict[int, dict] = {} - - for name, source in self._sources.items(): - if not isinstance(source, MeshMonitorDataSource): - continue - - if not hasattr(source, "packets"): - continue - - for pkt in source.packets: - packet_id = pkt.get("packet_id") or pkt.get("id") - if packet_id is None: - from_node = pkt.get("from_node") or pkt.get("from") - ts = pkt.get("timestamp") or pkt.get("rxTime") - portnum = pkt.get("portnum") - if from_node and ts: - packet_id = hash((from_node, ts, portnum)) - else: - packet_id = -len(packets_by_id) - 1 - - if packet_id in packets_by_id: - existing = packets_by_id[packet_id] - if name not in existing["_sources"]: - existing["_sources"].append(name) - else: - tagged = dict(pkt) - tagged["_sources"] = [name] - packets_by_id[packet_id] = tagged - - return list(packets_by_id.values()) - - def get_traffic_stats(self) -> dict[str, dict]: - stats = {} - - for name, source in self._sources.items(): - source_stats = {} - - if isinstance(source, MeshviewSource): - if hasattr(source, "stats") and source.stats: - data = source.stats.get("data", []) - source_stats["hourly_counts"] = data - total = sum(item.get("count", 0) for item in data) - source_stats["total_packets"] = total - source_stats["packets_per_hour"] = total / len(data) if data else 0 - - if hasattr(source, "counts") and source.counts: - source_stats["total_seen"] = source.counts.get("total_seen", 0) - source_stats["total_packets_all_time"] = source.counts.get("total_packets", 0) - - elif isinstance(source, MeshMonitorDataSource): - if hasattr(source, "network_stats") and source.network_stats: - ns = source.network_stats - source_stats["total_nodes"] = ns.get("totalNodes", 0) - source_stats["active_nodes"] = ns.get("activeNodes", 0) - source_stats["traceroute_count"] = ns.get("tracerouteCount", 0) - source_stats["last_updated"] = ns.get("lastUpdated", 0) - - if hasattr(source, "packets") and source.packets: - portnum_counts: dict[str, int] = {} - for pkt in source.packets: - portnum = pkt.get("portnum_name") or str(pkt.get("portnum", "UNKNOWN")) - portnum_counts[portnum] = portnum_counts.get(portnum, 0) + 1 - source_stats["packets_by_portnum"] = portnum_counts - source_stats["packet_count"] = len(source.packets) - - if source_stats: - stats[name] = source_stats - - return stats - - def get_solar_data(self) -> list[dict]: - all_solar = [] - for name, source in self._sources.items(): - if isinstance(source, MeshMonitorDataSource): - if hasattr(source, "solar") and source.solar: - for item in source.solar: - tagged = dict(item) - tagged["_sources"] = [name] - all_solar.append(tagged) - return all_solar - - def get_network_stats(self) -> dict[str, dict]: - stats = {} - - for name, source in self._sources.items(): - source_stats = {} - - if isinstance(source, MeshviewSource): - if hasattr(source, "counts") and source.counts: - source_stats.update(source.counts) - source_stats["node_count"] = len(source.nodes) - source_stats["edge_count"] = len(source.edges) - - elif isinstance(source, MeshMonitorDataSource): - if hasattr(source, "network_stats") and source.network_stats: - source_stats.update(source.network_stats) - if hasattr(source, "topology") and source.topology: - source_stats["topology"] = source.topology - source_stats["node_count"] = len(source.nodes) - source_stats["telemetry_count"] = len(source.telemetry) - source_stats["traceroute_count"] = len(source.traceroutes) - source_stats["channel_count"] = len(source.channels) - if hasattr(source, "packets"): - source_stats["packet_count"] = len(source.packets) - - if source_stats: - stats[name] = source_stats - - return stats - - @property - def source_count(self) -> int: - return len(self._sources) - - @property - def source_names(self) -> list[str]: - return list(self._sources.keys()) diff --git a/work/meshai/notifications/region_tagger.py b/work/meshai/notifications/region_tagger.py deleted file mode 100644 index 1ba9bb7..0000000 --- a/work/meshai/notifications/region_tagger.py +++ /dev/null @@ -1,160 +0,0 @@ -"""Region tagger for mapping coordinates and NWS zones to regions. - -This module provides functions to: -- Map lat/lon coordinates to the nearest configured region -- Map NWS zone codes to matching regions - -Usage: - from meshai.notifications.region_tagger import tag_by_coordinates, tag_by_nws_zone - from meshai.config import RegionAnchor - - regions = [ - RegionAnchor(name="South Western ID", lat=43.615, lon=-116.2023, - nws_zones=["IDZ016", "IDZ030"]), - RegionAnchor(name="Magic Valley", lat=42.5558, lon=-114.4701, - nws_zones=["IDZ031"]), - ] - - # Find region by coordinates - region = tag_by_coordinates(43.6, -116.2, regions) - # Returns: "South Western ID" - - # Find regions by NWS zone - regions = tag_by_nws_zone("IDZ016", regions) - # Returns: ["South Western ID"] -""" - -import math -from typing import Optional - -# Import RegionAnchor type for annotations -# Actual import happens at function call time to avoid circular imports -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from meshai.config import RegionAnchor - - -# Earth radius in miles (mean radius) -EARTH_RADIUS_MILES = 3958.8 - - -def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float: - """Calculate the great-circle distance between two points on Earth. - - Uses the haversine formula for accuracy on a spherical Earth model. - - Args: - lat1: Latitude of first point in degrees - lon1: Longitude of first point in degrees - lat2: Latitude of second point in degrees - lon2: Longitude of second point in degrees - - Returns: - Distance in miles - """ - # Convert to radians - lat1_rad = math.radians(lat1) - lat2_rad = math.radians(lat2) - lon1_rad = math.radians(lon1) - lon2_rad = math.radians(lon2) - - # Differences - dlat = lat2_rad - lat1_rad - dlon = lon2_rad - lon1_rad - - # Haversine formula - a = math.sin(dlat / 2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon / 2) ** 2 - c = 2 * math.asin(math.sqrt(a)) - - return EARTH_RADIUS_MILES * c - - -def tag_by_coordinates( - lat: float, - lon: float, - regions: list, # list[RegionAnchor] - radius_miles: float = 25.0, -) -> Optional[str]: - """Return the name of the nearest region within radius_miles. - - Finds the closest region anchor to the given coordinates. If the - closest anchor is within radius_miles, returns its name. Otherwise - returns None. - - Args: - lat: Latitude of the point to tag - lon: Longitude of the point to tag - regions: List of RegionAnchor objects to search - radius_miles: Maximum distance to consider (default 25 miles) - - Returns: - Name of the nearest region within range, or None if no match - """ - if not regions: - return None - - closest_region = None - closest_distance = float("inf") - - for region in regions: - # Skip regions without valid coordinates - region_lat = getattr(region, "lat", None) - region_lon = getattr(region, "lon", None) - - if region_lat is None or region_lon is None: - continue - if region_lat == 0.0 and region_lon == 0.0: - # Treat (0, 0) as unset coordinates - continue - - distance = haversine_distance(lat, lon, region_lat, region_lon) - - if distance < closest_distance: - closest_distance = distance - closest_region = region - - # Check if closest is within radius - if closest_region is not None and closest_distance <= radius_miles: - return getattr(closest_region, "name", None) - - return None - - -def tag_by_nws_zone( - zone_code: str, - regions: list, # list[RegionAnchor] -) -> list[str]: - """Return all region names whose nws_zones list contains zone_code. - - Multiple regions can match the same zone (a zone may span multiple - configured regions). - - Args: - zone_code: NWS zone code to match (e.g., "IDZ016") - regions: List of RegionAnchor objects to search - - Returns: - List of region names that contain this zone, empty if no matches - """ - if not zone_code or not regions: - return [] - - # Normalize zone code to uppercase for case-insensitive matching - zone_upper = zone_code.upper().strip() - - matching_regions = [] - - for region in regions: - region_zones = getattr(region, "nws_zones", None) - if not region_zones: - continue - - # Check if zone matches any in this region's list (case-insensitive) - for rz in region_zones: - if rz.upper().strip() == zone_upper: - region_name = getattr(region, "name", None) - if region_name: - matching_regions.append(region_name) - break # Don't add same region twice - - return matching_regions diff --git a/work/tests/fixtures/swpc/0000.json b/work/tests/fixtures/swpc/0000.json deleted file mode 100644 index 2c661de..0000000 --- a/work/tests/fixtures/swpc/0000.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=1 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=1 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 28.766672134399414, - "energy": ">=1 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0001.json b/work/tests/fixtures/swpc/0001.json deleted file mode 100644 index 145e563..0000000 --- a/work/tests/fixtures/swpc/0001.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=10 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=10 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.30123627185821533, - "energy": ">=10 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0002.json b/work/tests/fixtures/swpc/0002.json deleted file mode 100644 index c6bb513..0000000 --- a/work/tests/fixtures/swpc/0002.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=100 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=100 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.1961589753627777, - "energy": ">=100 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0003.json b/work/tests/fixtures/swpc/0003.json deleted file mode 100644 index 695bbff..0000000 --- a/work/tests/fixtures/swpc/0003.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=30 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=30 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.19939908385276794, - "energy": ">=30 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0004.json b/work/tests/fixtures/swpc/0004.json deleted file mode 100644 index 5174a08..0000000 --- a/work/tests/fixtures/swpc/0004.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=5 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=5 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.3074222505092621, - "energy": ">=5 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0005.json b/work/tests/fixtures/swpc/0005.json deleted file mode 100644 index 8124bdc..0000000 --- a/work/tests/fixtures/swpc/0005.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=50 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=50 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.19789846241474152, - "energy": ">=50 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0006.json b/work/tests/fixtures/swpc/0006.json deleted file mode 100644 index 8257ecb..0000000 --- a/work/tests/fixtures/swpc/0006.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=500 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=500 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.19208531081676483, - "energy": ">=500 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0007.json b/work/tests/fixtures/swpc/0007.json deleted file mode 100644 index a50f380..0000000 --- a/work/tests/fixtures/swpc/0007.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:15:00Z|>=60 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:15:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:15:00Z|>=60 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:15:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:15:00Z", - "satellite": 18, - "flux": 0.19741536676883698, - "energy": ">=60 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0008.json b/work/tests/fixtures/swpc/0008.json deleted file mode 100644 index 8e7bc63..0000000 --- a/work/tests/fixtures/swpc/0008.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=1 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=1 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 27.786531448364258, - "energy": ">=1 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0009.json b/work/tests/fixtures/swpc/0009.json deleted file mode 100644 index 48c4331..0000000 --- a/work/tests/fixtures/swpc/0009.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=10 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=10 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.2485874593257904, - "energy": ">=10 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0010.json b/work/tests/fixtures/swpc/0010.json deleted file mode 100644 index c39e1f9..0000000 --- a/work/tests/fixtures/swpc/0010.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=100 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=100 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.1894887238740921, - "energy": ">=100 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0011.json b/work/tests/fixtures/swpc/0011.json deleted file mode 100644 index 4779405..0000000 --- a/work/tests/fixtures/swpc/0011.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=30 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=30 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.19734397530555725, - "energy": ">=30 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0012.json b/work/tests/fixtures/swpc/0012.json deleted file mode 100644 index 599589c..0000000 --- a/work/tests/fixtures/swpc/0012.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=5 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=5 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.2579914927482605, - "energy": ">=5 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0013.json b/work/tests/fixtures/swpc/0013.json deleted file mode 100644 index 5fa778c..0000000 --- a/work/tests/fixtures/swpc/0013.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=50 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=50 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.19125120341777802, - "energy": ">=50 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0014.json b/work/tests/fixtures/swpc/0014.json deleted file mode 100644 index ba43c67..0000000 --- a/work/tests/fixtures/swpc/0014.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=500 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=500 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.18541516363620758, - "energy": ">=500 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0015.json b/work/tests/fixtures/swpc/0015.json deleted file mode 100644 index 456490a..0000000 --- a/work/tests/fixtures/swpc/0015.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:20:00Z|>=60 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:20:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:20:00Z|>=60 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:20:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:20:00Z", - "satellite": 18, - "flux": 0.19072958827018738, - "energy": ">=60 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0016.json b/work/tests/fixtures/swpc/0016.json deleted file mode 100644 index 5746114..0000000 --- a/work/tests/fixtures/swpc/0016.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=1 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=1 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 27.72285270690918, - "energy": ">=1 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0017.json b/work/tests/fixtures/swpc/0017.json deleted file mode 100644 index 340a81a..0000000 --- a/work/tests/fixtures/swpc/0017.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=10 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=10 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.28919678926467896, - "energy": ">=10 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0018.json b/work/tests/fixtures/swpc/0018.json deleted file mode 100644 index 2d64ac3..0000000 --- a/work/tests/fixtures/swpc/0018.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=100 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=100 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.1840660572052002, - "energy": ">=100 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0019.json b/work/tests/fixtures/swpc/0019.json deleted file mode 100644 index 3e98340..0000000 --- a/work/tests/fixtures/swpc/0019.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=30 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=30 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.18692995607852936, - "energy": ">=30 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0020.json b/work/tests/fixtures/swpc/0020.json deleted file mode 100644 index a9944aa..0000000 --- a/work/tests/fixtures/swpc/0020.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=5 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=5 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.43121543526649475, - "energy": ">=5 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0021.json b/work/tests/fixtures/swpc/0021.json deleted file mode 100644 index 23fd2c0..0000000 --- a/work/tests/fixtures/swpc/0021.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=50 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=50 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.1857948750257492, - "energy": ">=50 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0022.json b/work/tests/fixtures/swpc/0022.json deleted file mode 100644 index 65960a1..0000000 --- a/work/tests/fixtures/swpc/0022.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=500 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=500 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.17474256455898285, - "energy": ">=500 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0023.json b/work/tests/fixtures/swpc/0023.json deleted file mode 100644 index 09f5cf7..0000000 --- a/work/tests/fixtures/swpc/0023.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:25:00Z|>=60 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:25:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:25:00Z|>=60 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:25:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:25:00Z", - "satellite": 18, - "flux": 0.18532411754131317, - "energy": ">=60 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0024.json b/work/tests/fixtures/swpc/0024.json deleted file mode 100644 index 28e4db0..0000000 --- a/work/tests/fixtures/swpc/0024.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=1 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=1 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 27.166194915771484, - "energy": ">=1 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0025.json b/work/tests/fixtures/swpc/0025.json deleted file mode 100644 index 7003238..0000000 --- a/work/tests/fixtures/swpc/0025.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=10 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=10 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.3429813086986542, - "energy": ">=10 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0026.json b/work/tests/fixtures/swpc/0026.json deleted file mode 100644 index 04ffe71..0000000 --- a/work/tests/fixtures/swpc/0026.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=100 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=100 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.23083794116973877, - "energy": ">=100 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0027.json b/work/tests/fixtures/swpc/0027.json deleted file mode 100644 index b5dd243..0000000 --- a/work/tests/fixtures/swpc/0027.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=30 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=30 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.23371955752372742, - "energy": ">=30 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0028.json b/work/tests/fixtures/swpc/0028.json deleted file mode 100644 index 4fe6e2a..0000000 --- a/work/tests/fixtures/swpc/0028.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=5 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=5 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.39393070340156555, - "energy": ">=5 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0029.json b/work/tests/fixtures/swpc/0029.json deleted file mode 100644 index 4fce290..0000000 --- a/work/tests/fixtures/swpc/0029.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=50 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=50 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.23256810009479523, - "energy": ">=50 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0030.json b/work/tests/fixtures/swpc/0030.json deleted file mode 100644 index 1562943..0000000 --- a/work/tests/fixtures/swpc/0030.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=500 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=500 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.226764515042305, - "energy": ">=500 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0031.json b/work/tests/fixtures/swpc/0031.json deleted file mode 100644 index 2b1f5f9..0000000 --- a/work/tests/fixtures/swpc/0031.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:30:00Z|>=60 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:30:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:30:00Z|>=60 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:30:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:30:00Z", - "satellite": 18, - "flux": 0.23209738731384277, - "energy": ">=60 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0032.json b/work/tests/fixtures/swpc/0032.json deleted file mode 100644 index d5c7a56..0000000 --- a/work/tests/fixtures/swpc/0032.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=1 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=1 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 27.50701141357422, - "energy": ">=1 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0033.json b/work/tests/fixtures/swpc/0033.json deleted file mode 100644 index 63eaec2..0000000 --- a/work/tests/fixtures/swpc/0033.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=10 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=10 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.22531083226203918, - "energy": ">=10 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0034.json b/work/tests/fixtures/swpc/0034.json deleted file mode 100644 index 29b54fe..0000000 --- a/work/tests/fixtures/swpc/0034.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=100 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=100 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.16947858035564423, - "energy": ">=100 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0035.json b/work/tests/fixtures/swpc/0035.json deleted file mode 100644 index 5ac9797..0000000 --- a/work/tests/fixtures/swpc/0035.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=30 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=30 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.17234553396701813, - "energy": ">=30 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0036.json b/work/tests/fixtures/swpc/0036.json deleted file mode 100644 index 6938f8e..0000000 --- a/work/tests/fixtures/swpc/0036.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=5 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=5 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.22996729612350464, - "energy": ">=5 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0037.json b/work/tests/fixtures/swpc/0037.json deleted file mode 100644 index eb2a216..0000000 --- a/work/tests/fixtures/swpc/0037.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=50 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=50 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.1712087243795395, - "energy": ">=50 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0038.json b/work/tests/fixtures/swpc/0038.json deleted file mode 100644 index 224ab9d..0000000 --- a/work/tests/fixtures/swpc/0038.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=500 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=500 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.1654052734375, - "energy": ">=500 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc/0039.json b/work/tests/fixtures/swpc/0039.json deleted file mode 100644 index 3ad11c2..0000000 --- a/work/tests/fixtures/swpc/0039.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-06-27T20:35:00Z|>=60 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-06-27T20:35:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-06-27T20:35:00Z|>=60 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-06-27T20:35:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-06-27T20:35:00Z", - "satellite": 18, - "flux": 0.17073801159858704, - "energy": ">=60 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196490 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0000.json b/work/tests/fixtures/swpc_last/0000.json deleted file mode 100644 index ec360af..0000000 --- a/work/tests/fixtures/swpc_last/0000.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "A20F|2026-06-28 10:41:25.723", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-28T10:41:25.723000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "A20F|2026-06-28 10:41:25.723", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-28T10:41:25.723000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "A20F", - "issue_datetime": "2026-06-28 10:41:25.723", - "message": "Space Weather Message Code: WATA20\r\nSerial Number: 1114\r\nIssue Time: 2026 Jun 28 1041 UTC\r\n\r\nWATCH: Geomagnetic Storm Category G1 Predicted \nHighest Storm Level Predicted by Day:\nJun 28: None (Below G1) Jun 29: G1 (Minor) Jun 30: G1 (Minor) \nTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT\nComment: \r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 60 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nSpacecraft - Minor impact on satellite operations possible.\r\nAurora - Aurora may be visible at high latitudes, i.e., northern tier of the U.S. such as northern Michigan and Maine." - } - } - }, - "subject": "central.space.alert.a20f", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0001.json b/work/tests/fixtures/swpc_last/0001.json deleted file mode 100644 index 07cd061..0000000 --- a/work/tests/fixtures/swpc_last/0001.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "P11W|2026-06-30 16:36:36.953", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-30T16:36:36.953000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "P11W|2026-06-30 16:36:36.953", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-30T16:36:36.953000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "P11W", - "issue_datetime": "2026-06-30 16:36:36.953", - "message": "Space Weather Message Code: WARPX1\r\nSerial Number: 627\r\nIssue Time: 2026 Jun 30 1636 UTC\r\n\r\nCANCEL WARNING: Proton 10MeV Integral Flux above 10pfu expected \nCancel Serial Number: 626\nOriginal Issue Time: 2026 Jun 30 1600 UTC\nConditions no longer justify warning.\r\n\nConditions no longer justify warning.NOAA Scale: S1 - Minor" - } - } - }, - "subject": "central.space.alert.p11w", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0002.json b/work/tests/fixtures/swpc_last/0002.json deleted file mode 100644 index b1ea30b..0000000 --- a/work/tests/fixtures/swpc_last/0002.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "TIVA|2026-06-03 01:43:20.793", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-03T01:43:20.793000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "TIVA|2026-06-03 01:43:20.793", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-03T01:43:20.793000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "TIVA", - "issue_datetime": "2026-06-03 01:43:20.793", - "message": "Space Weather Message Code: ALTTP4\r\nSerial Number: 710\r\nIssue Time: 2026 Jun 03 0143 UTC\r\n\r\nALERT: Type IV Radio Emission \nBegin Time: 2026 Jun 03 0122 UTC\nComment: \r\n\n" - } - } - }, - "subject": "central.space.alert.tiva", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0003.json b/work/tests/fixtures/swpc_last/0003.json deleted file mode 100644 index f62c570..0000000 --- a/work/tests/fixtures/swpc_last/0003.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "XX0S|2026-06-03 11:59:48.137", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-03T11:59:48.137000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "XX0S|2026-06-03 11:59:48.137", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-03T11:59:48.137000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "XX0S", - "issue_datetime": "2026-06-03 11:59:48.137", - "message": "Space Weather Message Code: SUMX01\r\nSerial Number: 218\r\nIssue Time: 2026 Jun 03 1159 UTC\r\n\r\nSUMMARY: X-ray Event exceeded X1 \nBegin Time: 2026 Jun 03 1119 UTC\nMaximum Time: 2026 Jun 03 1128 UTC\nEnd Time: 2026 Jun 03 1135 UTC\nXray Class: X1.0\nOptical Class: \nLocation: N17W19\nNoaa Scale: R3 - Strong\nComment: GOES-18 outage so using GOES-19\n\r\n\nGOES-18 outage so using GOES-19NOAA Scale: R3 - Strong\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact consists of large portions of the sunlit side of Earth, strongest at the sub-solar point.\r\nRadio - Wide area blackout of HF (high frequency) radio communication for about an hour." - } - } - }, - "subject": "central.space.alert.xx0s", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0004.json b/work/tests/fixtures/swpc_last/0004.json deleted file mode 100644 index 1cdb8d6..0000000 --- a/work/tests/fixtures/swpc_last/0004.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "A50F|2026-06-03 14:52:28.343", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-03T14:52:28.343000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "A50F|2026-06-03 14:52:28.343", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-03T14:52:28.343000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "A50F", - "issue_datetime": "2026-06-03 14:52:28.343", - "message": "Space Weather Message Code: WATA50\r\nSerial Number: 98\r\nIssue Time: 2026 Jun 03 1452 UTC\r\n\r\nWATCH: Geomagnetic Storm Category G3 Predicted \nHighest Storm Level Predicted by Day:\nJun 04: G3 (Strong) Jun 05: G3 (Strong) Jun 06: None (Below G1) \nTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT\nComment: \r\n\n" - } - } - }, - "subject": "central.space.alert.a50f", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0005.json b/work/tests/fixtures/swpc_last/0005.json deleted file mode 100644 index 5f9b1b0..0000000 --- a/work/tests/fixtures/swpc_last/0005.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "MSIS|2026-06-05 05:13:38.727", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-05T05:13:38.727000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "MSIS|2026-06-05 05:13:38.727", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-05T05:13:38.727000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "MSIS", - "issue_datetime": "2026-06-05 05:13:38.727", - "message": "Space Weather Message Code: SUMSUD\r\nSerial Number: 300\r\nIssue Time: 2026 Jun 05 0513 UTC\r\n\r\nSUMMARY: Geomagnetic Sudden Impulse \nObserved: 2026 Jun 05 0511 UTC\nDeviation: 70 nT\nStation: MEA\nComment: \r\n\n" - } - } - }, - "subject": "central.space.alert.msis", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0006.json b/work/tests/fixtures/swpc_last/0006.json deleted file mode 100644 index a64355e..0000000 --- a/work/tests/fixtures/swpc_last/0006.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "SGIW|2026-07-03 11:38:06.157", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-03T11:38:06.157000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "SGIW|2026-07-03 11:38:06.157", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-03T11:38:06.157000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "SGIW", - "issue_datetime": "2026-07-03 11:38:06.157", - "message": "Space Weather Message Code: WARSUD\r\nSerial Number: 256\r\nIssue Time: 2026 Jul 03 1138 UTC\r\n\r\nWARNING: Geomagnetic Sudden Impulse expected \nValid From: 2026 Jul 03 1157 UTC\nValid To: 2026 Jul 03 1227 UTC\nIp Shock: 2026-07-03 11:20\nComment: \r\n\n" - } - } - }, - "subject": "central.space.alert.sgiw", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0007.json b/work/tests/fixtures/swpc_last/0007.json deleted file mode 100644 index f164f6e..0000000 --- a/work/tests/fixtures/swpc_last/0007.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "XM5A|2026-07-03 19:00:40.987", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-03T19:00:40.987000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "XM5A|2026-07-03 19:00:40.987", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-03T19:00:40.987000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "XM5A", - "issue_datetime": "2026-07-03 19:00:40.987", - "message": "Space Weather Message Code: ALTXMF\r\nSerial Number: 537\r\nIssue Time: 2026 Jul 03 1900 UTC\r\n\r\nALERT: X-Ray Flux exceeded M5 \nThreshold Reached: 2026 Jul 03 1856 UTC\nNoaa Scale: R2 - Moderate\nComment: \r\n\nNOAA Scale: R2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact centered on sub-solar point on the sunlit side of Earth. Extent of blackout of HF (high frequency) radio communication dependent upon current X-ray Flux intensity. For real-time information on affected area and expected duration please see http://www.swpc.noaa.gov/products/d-region-absorption-predictions-d-rap." - } - } - }, - "subject": "central.space.alert.xm5a", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0008.json b/work/tests/fixtures/swpc_last/0008.json deleted file mode 100644 index 0670264..0000000 --- a/work/tests/fixtures/swpc_last/0008.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "XM5S|2026-07-03 19:11:28.970", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-03T19:11:28.970000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "XM5S|2026-07-03 19:11:28.970", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-03T19:11:28.970000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "XM5S", - "issue_datetime": "2026-07-03 19:11:28.970", - "message": "Space Weather Message Code: SUMXM5\r\nSerial Number: 323\r\nIssue Time: 2026 Jul 03 1911 UTC\r\n\r\nSUMMARY: X-ray Event exceeded M5 \nBegin Time: 2026 Jul 03 1857 UTC\nMaximum Time: 2026 Jul 03 1859 UTC\nEnd Time: 2026 Jul 04 1903 UTC\nXray Class: M6.3\nOptical Class: \nLocation: S06W46\nNoaa Scale: R2 - Moderate\nComment: \r\n\nNOAA Scale: R2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact centered primarily on sub-solar point on the sunlit side of Earth.\r\nRadio - Limited blackout of HF (high frequency) radio communication for tens of minutes." - } - } - }, - "subject": "central.space.alert.xm5s", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0009.json b/work/tests/fixtures/swpc_last/0009.json deleted file mode 100644 index 5cf7c38..0000000 --- a/work/tests/fixtures/swpc_last/0009.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "A30F|2026-06-05 18:52:32.167", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-05T18:52:32.167000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "A30F|2026-06-05 18:52:32.167", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-05T18:52:32.167000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "A30F", - "issue_datetime": "2026-06-05 18:52:32.167", - "message": "Space Weather Message Code: WATA30\r\nSerial Number: 274\r\nIssue Time: 2026 Jun 05 1852 UTC\r\n\r\nWATCH: Geomagnetic Storm Category G2 Predicted \nHighest Storm Level Predicted by Day:\nJun 06: G2 (Moderate) Jun 07: None (Below G1) Jun 08: None (Below G1) \nTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT\nComment: \r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 55 degrees Geomagnetic Latitude.\r\nInduced Currents - Power grid fluctuations can occur. High-latitude power systems may experience voltage alarms.\r\nSpacecraft - Satellite orientation irregularities may occur; increased drag on low Earth-orbit satellites is possible.\r\nRadio - HF (high frequency) radio propagation can fade at higher latitudes.\r\nAurora - Aurora may be seen as low as New York to Wisconsin to Washington state." - } - } - }, - "subject": "central.space.alert.a30f", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0010.json b/work/tests/fixtures/swpc_last/0010.json deleted file mode 100644 index 35b0488..0000000 --- a/work/tests/fixtures/swpc_last/0010.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K04A|2026-07-03 20:54:38.663", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-03T20:54:38.663000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "K04A|2026-07-03 20:54:38.663", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-03T20:54:38.663000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K04A", - "issue_datetime": "2026-07-03 20:54:38.663", - "message": "Space Weather Message Code: ALTK04\r\nSerial Number: 2670\r\nIssue Time: 2026 Jul 03 2054 UTC\r\n\r\nALERT: Geomagnetic K-index of 4 \nThreshold Reached: 2026 Jul 03 2049 UTC\nSynoptic Period: 1800-2100\nActive Warning: YES\nComment: \r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 65 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nAurora - Aurora may be visible at high latitudes such as Canada and Alaska." - } - } - }, - "subject": "central.space.alert.k04a", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0011.json b/work/tests/fixtures/swpc_last/0011.json deleted file mode 100644 index 0b190b6..0000000 --- a/work/tests/fixtures/swpc_last/0011.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K07W|2026-07-04 05:01:32.633", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T05:01:32.633000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 3, - "specversion": "1.0", - "data": { - "id": "K07W|2026-07-04 05:01:32.633", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T05:01:32.633000Z", - "expires": null, - "severity": 3, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K07W", - "issue_datetime": "2026-07-04 05:01:32.633", - "message": "Space Weather Message Code: WARK07\r\nSerial Number: 151\r\nIssue Time: 2026 Jul 04 0501 UTC\r\n\r\nWARNING: Geomagnetic K-index of 7 or greater expected \nValid From: 2026 Jul 04 0500 UTC\nValid To: 2026 Jul 05 1200 UTC\nWarning Conditions: Onset\nNoaa Scale: G3 - Greater\nComment: \r\n\nNOAA Scale: G3 - Greater" - } - } - }, - "subject": "central.space.alert.k07w", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0012.json b/work/tests/fixtures/swpc_last/0012.json deleted file mode 100644 index 773b442..0000000 --- a/work/tests/fixtures/swpc_last/0012.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K07A|2026-07-04 05:10:10.740", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T05:10:10.740000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 3, - "specversion": "1.0", - "data": { - "id": "K07A|2026-07-04 05:10:10.740", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T05:10:10.740000Z", - "expires": null, - "severity": 3, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K07A", - "issue_datetime": "2026-07-04 05:10:10.740", - "message": "Space Weather Message Code: ALTK07\r\nSerial Number: 218\r\nIssue Time: 2026 Jul 04 0509 UTC\r\n\r\nALERT: Geomagnetic K-index of 7 \nThreshold Reached: 2026 Jul 04 0509 UTC\nSynoptic Period: 0300-0600\nActive Warning: YES\nNoaa Scale: G3 - Strong\nComment: \r\n\nNOAA Scale: G3 - Strong" - } - } - }, - "subject": "central.space.alert.k07a", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0013.json b/work/tests/fixtures/swpc_last/0013.json deleted file mode 100644 index 5e92bef..0000000 --- a/work/tests/fixtures/swpc_last/0013.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K06W|2026-07-04 13:57:38.983", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T13:57:38.983000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 2, - "specversion": "1.0", - "data": { - "id": "K06W|2026-07-04 13:57:38.983", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T13:57:38.983000Z", - "expires": null, - "severity": 2, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K06W", - "issue_datetime": "2026-07-04 13:57:38.983", - "message": "Space Weather Message Code: WARK06\r\nSerial Number: 665\r\nIssue Time: 2026 Jul 04 1357 UTC\r\n\r\nWARNING: Geomagnetic K-index of 6 expected \nValid From: 2026 Jul 04 1356 UTC\nValid To: 2026 Jul 05 2100 UTC\nWarning Conditions: Onset\nNoaa Scale: G2 - Moderate\nComment: \r\n\nNOAA Scale: G2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 55 degrees Geomagnetic Latitude.\r\nInduced Currents - Power grid fluctuations can occur. High-latitude power systems may experience voltage alarms.\r\nSpacecraft - Satellite orientation irregularities may occur; increased drag on low Earth-orbit satellites is possible.\r\nRadio - HF (high frequency) radio propagation can fade at higher latitudes.\r\nAurora - Aurora may be seen as low as New York to Wisconsin to Washington state." - } - } - }, - "subject": "central.space.alert.k06w", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0014.json b/work/tests/fixtures/swpc_last/0014.json deleted file mode 100644 index 4445f7b..0000000 --- a/work/tests/fixtures/swpc_last/0014.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K05W|2026-07-04 14:12:48.350", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T14:12:48.350000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 1, - "specversion": "1.0", - "data": { - "id": "K05W|2026-07-04 14:12:48.350", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T14:12:48.350000Z", - "expires": null, - "severity": 1, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K05W", - "issue_datetime": "2026-07-04 14:12:48.350", - "message": "Space Weather Message Code: WARK05\r\nSerial Number: 2248\r\nIssue Time: 2026 Jul 04 1412 UTC\r\n\r\nEXTENDED WARNING: Geomagnetic K-index of 5 expected\nExtension to Serial Number: 2247\nValid From: 2026 Jul 04 0100 UTC\nNow Valid Until: 2026 Jul 04 2359 UTC\nWarning Condition: Persistence\n\r\n\nNOAA Scale: G1 - Minor\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 60 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nSpacecraft - Minor impact on satellite operations possible.\r\nAurora - Aurora may be visible at high latitudes, i.e., northern tier of the U.S. such as northern Michigan and Maine." - } - } - }, - "subject": "central.space.alert.k05w", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0015.json b/work/tests/fixtures/swpc_last/0015.json deleted file mode 100644 index 2a7e2cf..0000000 --- a/work/tests/fixtures/swpc_last/0015.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K04W|2026-07-04 14:21:41.873", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T14:21:41.873000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "K04W|2026-07-04 14:21:41.873", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T14:21:41.873000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K04W", - "issue_datetime": "2026-07-04 14:21:41.873", - "message": "Space Weather Message Code: WARK04\r\nSerial Number: 5377\r\nIssue Time: 2026 Jul 04 1421 UTC\r\n\r\nEXTENDED WARNING: Geomagnetic K-index of 4 expected\nExtension to Serial Number: 5376\nValid From: 2026 Jul 03 1209 UTC\nNow Valid Until: 2026 Jul 05 0300 UTC\nWarning Condition: Persistence\n\r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 65 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nAurora - Aurora may be visible at high latitudes such as Canada and Alaska." - } - } - }, - "subject": "central.space.alert.k04w", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0016.json b/work/tests/fixtures/swpc_last/0016.json deleted file mode 100644 index dcb4f23..0000000 --- a/work/tests/fixtures/swpc_last/0016.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "BHIS|2026-06-06 14:14:05.560", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-06T14:14:05.560000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "BHIS|2026-06-06 14:14:05.560", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-06T14:14:05.560000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "BHIS", - "issue_datetime": "2026-06-06 14:14:05.560", - "message": "Space Weather Message Code: SUM10R\r\nSerial Number: 918\r\nIssue Time: 2026 Jun 06 1414 UTC\r\n\r\nSUMMARY: 10cm Radio Burst \nBegin Time: 2026 Jun 06 1344 UTC\nMaximum Time: 2026 Jun 06 1344 UTC\nEnd Time: 2026 Jun 06 1359 UTC\nPeak Flux: 190 sfu\nDuration: 5 minutes\nLatest Penticton Noon Flux: 141 sfu\nComment: \r\n\n" - } - } - }, - "subject": "central.space.alert.bhis", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0017.json b/work/tests/fixtures/swpc_last/0017.json deleted file mode 100644 index b93af29..0000000 --- a/work/tests/fixtures/swpc_last/0017.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "TIIA|2026-06-06 14:15:12.373", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-06T14:15:12.373000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "TIIA|2026-06-06 14:15:12.373", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-06T14:15:12.373000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "TIIA", - "issue_datetime": "2026-06-06 14:15:12.373", - "message": "Space Weather Message Code: ALTTP2\r\nSerial Number: 1498\r\nIssue Time: 2026 Jun 06 1415 UTC\r\n\r\nALERT: Type II Radio Emission \nBegin Time: 2026 Jun 06 1347 UTC\nEstimate Velocity: 838 km/s\nComment: \r\n\n" - } - } - }, - "subject": "central.space.alert.tiia", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0018.json b/work/tests/fixtures/swpc_last/0018.json deleted file mode 100644 index 28b1401..0000000 --- a/work/tests/fixtures/swpc_last/0018.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K05A|2026-07-04 16:14:30.417", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T16:14:30.417000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 1, - "specversion": "1.0", - "data": { - "id": "K05A|2026-07-04 16:14:30.417", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T16:14:30.417000Z", - "expires": null, - "severity": 1, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K05A", - "issue_datetime": "2026-07-04 16:14:30.417", - "message": "Space Weather Message Code: ALTK05\r\nSerial Number: 2036\r\nIssue Time: 2026 Jul 04 1614 UTC\r\n\r\nALERT: Geomagnetic K-index of 5 \nThreshold Reached: 2026 Jul 04 1610 UTC\nSynoptic Period: 1500-1800\nActive Warning: YES\nNoaa Scale: G1 - Minor\nComment: \r\n\nNOAA Scale: G1 - Minor\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 60 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nSpacecraft - Minor impact on satellite operations possible.\r\nAurora - Aurora may be visible at high latitudes, i.e., northern tier of the U.S. such as northern Michigan and Maine." - } - } - }, - "subject": "central.space.alert.k05a", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0019.json b/work/tests/fixtures/swpc_last/0019.json deleted file mode 100644 index a641c62..0000000 --- a/work/tests/fixtures/swpc_last/0019.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "K06A|2026-07-04 17:00:15.597", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-07-04T17:00:15.597000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 2, - "specversion": "1.0", - "data": { - "id": "K06A|2026-07-04 17:00:15.597", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-07-04T17:00:15.597000Z", - "expires": null, - "severity": 2, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "K06A", - "issue_datetime": "2026-07-04 17:00:15.597", - "message": "Space Weather Message Code: ALTK06\r\nSerial Number: 723\r\nIssue Time: 2026 Jul 04 1700 UTC\r\n\r\nALERT: Geomagnetic K-index of 6 \nThreshold Reached: 2026 Jul 04 1655 UTC\nSynoptic Period: 1500-1800\nActive Warning: YES\nNoaa Scale: G2 - Moderate\nComment: \r\n\nNOAA Scale: G2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 55 degrees Geomagnetic Latitude.\r\nInduced Currents - Power grid fluctuations can occur. High-latitude power systems may experience voltage alarms.\r\nSpacecraft - Satellite orientation irregularities may occur; increased drag on low Earth-orbit satellites is possible.\r\nRadio - HF (high frequency) radio propagation can fade at higher latitudes.\r\nAurora - Aurora may be seen as low as New York to Wisconsin to Washington state." - } - } - }, - "subject": "central.space.alert.k06a", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0020.json b/work/tests/fixtures/swpc_last/0020.json deleted file mode 100644 index 6f63393..0000000 --- a/work/tests/fixtures/swpc_last/0020.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "envelope": { - "id": "EF3A|2026-06-06 16:55:22.263", - "source": "central.echo6.co", - "type": "central.space.alert.v1", - "time": "2026-06-06T16:55:22.263000+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.alert", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "EF3A|2026-06-06 16:55:22.263", - "adapter": "swpc_alerts", - "category": "space.alert", - "time": "2026-06-06T16:55:22.263000Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "product_id": "EF3A", - "issue_datetime": "2026-06-06 16:55:22.263", - "message": "Space Weather Message Code: ALTEF3\r\nSerial Number: 3695\r\nIssue Time: 2026 Jun 06 1655 UTC\r\n\r\nALERT: Electron 2MeV Integral Flux exceeded 1000pfu \nThreshold Reached: 2026 Jun 06 1640 UTC\nStation: GOES-19\nComment: Yesterday's max: 536 pfu\n\r\n\nYesterday's max: 536 pfu" - } - } - }, - "subject": "central.space.alert.ef3a", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0021.json b/work/tests/fixtures/swpc_last/0021.json deleted file mode 100644 index ad34efa..0000000 --- a/work/tests/fixtures/swpc_last/0021.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-07-04T15:00:00", - "source": "central.echo6.co", - "type": "central.space.kindex.v1", - "time": "2026-07-04T15:00:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.kindex", - "centralseverity": 1, - "specversion": "1.0", - "data": { - "id": "2026-07-04T15:00:00", - "adapter": "swpc_kindex", - "category": "space.kindex", - "time": "2026-07-04T15:00:00Z", - "expires": null, - "severity": 1, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-07-04T15:00:00", - "Kp": 5.67, - "a_running": 67, - "station_count": 7 - } - } - }, - "subject": "central.space.kindex", - "captured_epoch": 1783196500 -} \ No newline at end of file diff --git a/work/tests/fixtures/swpc_last/0022.json b/work/tests/fixtures/swpc_last/0022.json deleted file mode 100644 index 976f6b8..0000000 --- a/work/tests/fixtures/swpc_last/0022.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "envelope": { - "id": "2026-07-04T20:10:00Z|>=60 MeV", - "source": "central.echo6.co", - "type": "central.space.proton_flux.v1", - "time": "2026-07-04T20:10:00+00:00", - "datacontenttype": "application/json", - "centralschemaversion": "1.0", - "centralcategory": "space.proton_flux", - "centralseverity": 0, - "specversion": "1.0", - "data": { - "id": "2026-07-04T20:10:00Z|>=60 MeV", - "adapter": "swpc_protons", - "category": "space.proton_flux", - "time": "2026-07-04T20:10:00Z", - "expires": null, - "severity": 0, - "geo": { - "centroid": null, - "bbox": null, - "regions": [], - "primary_region": null, - "geometry": null - }, - "data": { - "time_tag": "2026-07-04T20:10:00Z", - "satellite": 18, - "flux": 0.16377367079257965, - "energy": ">=60 MeV" - } - } - }, - "subject": "central.space.proton_flux", - "captured_epoch": 1783196500 -} \ No newline at end of file