From 4de908c57b9142f3c3017e51fc172aadd0f7046d Mon Sep 17 00:00:00 2001 From: Tristan Escalada <355457+tescalada@users.noreply.github.com> Date: Thu, 24 Sep 2026 17:43:26 -0400 Subject: [PATCH] Remove the offline check from metering startup Metering startup no longer checks OFFLINE: the checks in ensure_metering_runtime and metering_lifespan are removed, along with ConfigDict.is_offline() and the tests that set or asserted OFFLINE. --- sparkmeter/config/configdict.py | 4 ---- sparkmeter/config/tests/test_configdict.py | 10 ---------- sparkmeter/metering/lifespan.py | 11 ----------- sparkmeter/metering/tests/test_lifespan.py | 23 ---------------------- 4 files changed, 48 deletions(-) diff --git a/sparkmeter/config/configdict.py b/sparkmeter/config/configdict.py index f0e087b..63aa3d6 100644 --- a/sparkmeter/config/configdict.py +++ b/sparkmeter/config/configdict.py @@ -151,9 +151,5 @@ def is_cloud(self): """Get if this a cloud system.""" return self.local_system == self.CLOUD - def is_offline(self): - """Get if metering-provider startup is disabled for this process.""" - return bool(self.get("OFFLINE", False)) - config = ConfigDict() diff --git a/sparkmeter/config/tests/test_configdict.py b/sparkmeter/config/tests/test_configdict.py index b57aaba..a11c339 100644 --- a/sparkmeter/config/tests/test_configdict.py +++ b/sparkmeter/config/tests/test_configdict.py @@ -15,13 +15,3 @@ def test_system_methods(self, config): assert config.local_system == config.CLOUD assert config.is_ground() is False assert config.is_cloud() is True - - def test_is_offline(self, config): - # OFFLINE unset defaults to online; the flag reads the OFFLINE config - # value, which config normalizes from SM_OFFLINE at load time. - config.pop("OFFLINE", None) - assert config.is_offline() is False - config["OFFLINE"] = False - assert config.is_offline() is False - config["OFFLINE"] = True - assert config.is_offline() is True diff --git a/sparkmeter/metering/lifespan.py b/sparkmeter/metering/lifespan.py index 96710e3..29f4a19 100644 --- a/sparkmeter/metering/lifespan.py +++ b/sparkmeter/metering/lifespan.py @@ -129,11 +129,6 @@ async def ensure_metering_runtime( app.state.metering = None return False - if config.is_offline(): - logger.info("metering provider disabled in offline mode; skipping startup") - app.state.metering = None - return False - flask_app = getattr(app.state, "flask_app", None) desired_signature = _enabled_provider_signature(flask_app) existing_client = getattr(app.state, "metering", None) @@ -301,12 +296,6 @@ async def metering_lifespan(app: FastAPI) -> AsyncIterator[None]: yield return - if config.is_offline(): - logger.info("metering provider disabled in offline mode; skipping startup") - app.state.metering = None - yield - return - started = await ensure_metering_runtime(app) if not started: yield diff --git a/sparkmeter/metering/tests/test_lifespan.py b/sparkmeter/metering/tests/test_lifespan.py index 4b263d6..5381b16 100644 --- a/sparkmeter/metering/tests/test_lifespan.py +++ b/sparkmeter/metering/tests/test_lifespan.py @@ -490,19 +490,9 @@ async def test_cloud_mode_is_noop(self, config): pass assert app.state.metering is None - @pytest.mark.asyncio - async def test_offline_mode_is_noop(self, config): - config["HEROKU"] = False - config["OFFLINE"] = True - app = SimpleNamespace(state=SimpleNamespace()) - async with lifespan.metering_lifespan(app): - pass - assert app.state.metering is None - @pytest.mark.asyncio async def test_not_started_skips_shutdown(self, monkeypatch, config): config["HEROKU"] = False - config["OFFLINE"] = False async def fake_ensure(app): return False @@ -523,7 +513,6 @@ async def fake_shutdown(app): @pytest.mark.asyncio async def test_started_runs_shutdown(self, monkeypatch, config): config["HEROKU"] = False - config["OFFLINE"] = False async def fake_ensure(app): return True @@ -550,17 +539,9 @@ async def test_not_ground_returns_false(self, config): assert await lifespan.ensure_metering_runtime(app) is False assert app.state.metering is None - @pytest.mark.asyncio - async def test_offline_returns_false(self, config): - config["HEROKU"] = False - config["OFFLINE"] = True - app = SimpleNamespace(state=SimpleNamespace()) - assert await lifespan.ensure_metering_runtime(app) is False - @pytest.mark.asyncio async def test_already_active_reruns_reconcile(self, monkeypatch, config): config["HEROKU"] = False - config["OFFLINE"] = False signature = ("a", "http://x", "http", True) monkeypatch.setattr(lifespan, "_enabled_provider_signature", lambda flask_app: signature) @@ -976,7 +957,6 @@ def _install_ensure_harness( from sparkmeter.config.configdict import config monkeypatch.setitem(config, "HEROKU", False) - monkeypatch.setitem(config, "OFFLINE", False) monkeypatch.setattr(lifespan, "_enabled_provider_signature", lambda flask_app: signature) monkeypatch.setattr( lifespan, "configured_provider_url", lambda *, default="", flask_app=None: provider_url @@ -1040,7 +1020,6 @@ async def test_ensure_config_change_shuts_down_then_early_returns(self, monkeypa # shutdown_metering_runtime is awaited, then the empty provider URL # early-returns False with metering cleared. config["HEROKU"] = False - config["OFFLINE"] = False monkeypatch.setattr( lifespan, "_enabled_provider_signature", lambda flask_app: ("new", "http://new", "http", True) ) @@ -1071,7 +1050,6 @@ async def fake_shutdown(app): @pytest.mark.asyncio async def test_ensure_init_pass_logs_per_result_branch(self, monkeypatch, caplog, config): config["HEROKU"] = False - config["OFFLINE"] = False monkeypatch.setattr( lifespan, "_enabled_provider_signature", lambda flask_app: ("x", "y", "http", True) ) @@ -1106,7 +1084,6 @@ async def test_ensure_init_pass_logs_per_result_branch(self, monkeypatch, caplog @pytest.mark.asyncio async def test_ensure_init_pass_exception_is_swallowed(self, monkeypatch, caplog, config): config["HEROKU"] = False - config["OFFLINE"] = False monkeypatch.setattr( lifespan, "_enabled_provider_signature", lambda flask_app: ("x", "y", "http", True) )