fix: isolate auxiliary price source failures
This commit is contained in:
@@ -206,7 +206,11 @@ def run_scrape(force_full=False):
|
|||||||
price_current = metrics["price"]
|
price_current = metrics["price"]
|
||||||
|
|
||||||
log.info("Fetching BTC ATH...")
|
log.info("Fetching BTC ATH...")
|
||||||
|
try:
|
||||||
ath_data = price.fetch_ath()
|
ath_data = price.fetch_ath()
|
||||||
|
except Exception as e:
|
||||||
|
cycle_errors.append(f"ATH: {e}")
|
||||||
|
ath_data = {}
|
||||||
ath_val = ath_data.get("ath") or existing_cache.get("drawdown", {}).get("ath")
|
ath_val = ath_data.get("ath") or existing_cache.get("drawdown", {}).get("ath")
|
||||||
if price_current.get("price") and ath_val:
|
if price_current.get("price") and ath_val:
|
||||||
drawdown = price.calculate_drawdown(price_current["price"], ath_val)
|
drawdown = price.calculate_drawdown(price_current["price"], ath_val)
|
||||||
@@ -218,7 +222,11 @@ def run_scrape(force_full=False):
|
|||||||
metrics["drawdown"] = {"value": None}
|
metrics["drawdown"] = {"value": None}
|
||||||
|
|
||||||
log.info("Fetching historical prices for 200D SMA / Mayer...")
|
log.info("Fetching historical prices for 200D SMA / Mayer...")
|
||||||
|
try:
|
||||||
hist = price.fetch_historical()
|
hist = price.fetch_historical()
|
||||||
|
except Exception as e:
|
||||||
|
cycle_errors.append(f"Historical price: {e}")
|
||||||
|
hist = []
|
||||||
if hist:
|
if hist:
|
||||||
sma_200d = price.calculate_200d_sma(hist)
|
sma_200d = price.calculate_200d_sma(hist)
|
||||||
mayer = price.calculate_mayer_multiple(price_current.get("price"), sma_200d)
|
mayer = price.calculate_mayer_multiple(price_current.get("price"), sma_200d)
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ def test_partial_fast_scrape_preserves_last_known_good_metric(server, monkeypatc
|
|||||||
monkeypatch.setattr(server, "HISTORY_PATH", str(history_path))
|
monkeypatch.setattr(server, "HISTORY_PATH", str(history_path))
|
||||||
monkeypatch.setattr(server.fear_greed, "fetch", lambda: {"value": 25})
|
monkeypatch.setattr(server.fear_greed, "fetch", lambda: {"value": 25})
|
||||||
monkeypatch.setattr(server.price, "fetch_current", lambda: (_ for _ in ()).throw(RuntimeError("price timeout")))
|
monkeypatch.setattr(server.price, "fetch_current", lambda: (_ for _ in ()).throw(RuntimeError("price timeout")))
|
||||||
monkeypatch.setattr(server.price, "fetch_ath", lambda: {"ath": 70000})
|
monkeypatch.setattr(server.price, "fetch_ath", lambda: (_ for _ in ()).throw(RuntimeError("ATH timeout")))
|
||||||
monkeypatch.setattr(server.price, "fetch_historical", lambda: [])
|
monkeypatch.setattr(server.price, "fetch_historical", lambda: (_ for _ in ()).throw(RuntimeError("history timeout")))
|
||||||
monkeypatch.setattr(server.engine, "score_all", lambda metrics: {"composite_score": 50, "scored_count": 1, "metrics": []})
|
monkeypatch.setattr(server.engine, "score_all", lambda metrics: {"composite_score": 50, "scored_count": 1, "metrics": []})
|
||||||
monkeypatch.setattr(server.engine, "score_all_ml", lambda metrics: {"composite_score": 50, "scored_count": 1, "metrics": []})
|
monkeypatch.setattr(server.engine, "score_all_ml", lambda metrics: {"composite_score": 50, "scored_count": 1, "metrics": []})
|
||||||
fake_updater = types.ModuleType("scrapers.history_updater")
|
fake_updater = types.ModuleType("scrapers.history_updater")
|
||||||
|
|||||||
Reference in New Issue
Block a user