fix: ruff lint and format fixes for persist assessment
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
15ed793817
commit
a8ad512eec
@@ -165,7 +165,9 @@ class TelegramSettings(BaseSettings):
|
|||||||
class DetectorSettings(BaseSettings):
|
class DetectorSettings(BaseSettings):
|
||||||
"""Risk-scorer / detector tuning."""
|
"""Risk-scorer / detector tuning."""
|
||||||
|
|
||||||
model_config = SettingsConfigDict(env_prefix="DETECTOR_", env_file=".env", env_file_encoding="utf-8", extra="ignore")
|
model_config = SettingsConfigDict(
|
||||||
|
env_prefix="DETECTOR_", env_file=".env", env_file_encoding="utf-8", extra="ignore"
|
||||||
|
)
|
||||||
|
|
||||||
alert_threshold: float = Field(
|
alert_threshold: float = Field(
|
||||||
default=0.80,
|
default=0.80,
|
||||||
|
|||||||
@@ -537,7 +537,7 @@ class Pipeline:
|
|||||||
result.success_count + result.failure_count,
|
result.success_count + result.failure_count,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def _persist_assessment(self, assessment: "RiskAssessment") -> None:
|
async def _persist_assessment(self, assessment: RiskAssessment) -> None:
|
||||||
"""Write the assessment row. Best-effort; never raises."""
|
"""Write the assessment row. Best-effort; never raises."""
|
||||||
if not self._db_manager:
|
if not self._db_manager:
|
||||||
return
|
return
|
||||||
@@ -574,9 +574,7 @@ class Pipeline:
|
|||||||
volume_impact=(
|
volume_impact=(
|
||||||
_D(str(round(size_sig.volume_impact, 4))) if size_sig is not None else None
|
_D(str(round(size_sig.volume_impact, 4))) if size_sig is not None else None
|
||||||
),
|
),
|
||||||
book_impact=(
|
book_impact=(_D(str(round(size_sig.book_impact, 4))) if size_sig is not None else None),
|
||||||
_D(str(round(size_sig.book_impact, 4))) if size_sig is not None else None
|
|
||||||
),
|
|
||||||
wallet_age_hours=wallet_age,
|
wallet_age_hours=wallet_age,
|
||||||
should_alert=assessment.should_alert,
|
should_alert=assessment.should_alert,
|
||||||
threshold_at_eval=_D(str(round(self._settings.detector.alert_threshold, 3))),
|
threshold_at_eval=_D(str(round(self._settings.detector.alert_threshold, 3))),
|
||||||
@@ -586,9 +584,7 @@ class Pipeline:
|
|||||||
repo = RiskAssessmentRepository(session)
|
repo = RiskAssessmentRepository(session)
|
||||||
await repo.insert(dto)
|
await repo.insert(dto)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(
|
logger.warning("Failed to persist risk assessment %s: %s", assessment.assessment_id, e)
|
||||||
"Failed to persist risk assessment %s: %s", assessment.assessment_id, e
|
|
||||||
)
|
|
||||||
|
|
||||||
async def run(self) -> None:
|
async def run(self) -> None:
|
||||||
"""Start the pipeline and run until interrupted.
|
"""Start the pipeline and run until interrupted.
|
||||||
|
|||||||
@@ -585,9 +585,7 @@ class RiskAssessmentRepository:
|
|||||||
|
|
||||||
async def get_by_assessment_id(self, assessment_id: str) -> RiskAssessmentDTO | None:
|
async def get_by_assessment_id(self, assessment_id: str) -> RiskAssessmentDTO | None:
|
||||||
result = await self.session.execute(
|
result = await self.session.execute(
|
||||||
select(RiskAssessmentModel).where(
|
select(RiskAssessmentModel).where(RiskAssessmentModel.assessment_id == assessment_id)
|
||||||
RiskAssessmentModel.assessment_id == assessment_id
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
model = result.scalar_one_or_none()
|
model = result.scalar_one_or_none()
|
||||||
if model is None:
|
if model is None:
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ from polymarket_insider_tracker.pipeline import Pipeline
|
|||||||
from polymarket_insider_tracker.storage.database import DatabaseManager
|
from polymarket_insider_tracker.storage.database import DatabaseManager
|
||||||
from polymarket_insider_tracker.storage.models import Base, RiskAssessmentModel
|
from polymarket_insider_tracker.storage.models import Base, RiskAssessmentModel
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Fixtures
|
# Fixtures
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -63,9 +62,7 @@ async def db_manager(async_engine):
|
|||||||
manager._sync_engine = None
|
manager._sync_engine = None
|
||||||
manager._async_engine = async_engine
|
manager._async_engine = async_engine
|
||||||
manager._sync_session_factory = None
|
manager._sync_session_factory = None
|
||||||
manager._async_session_factory = async_sessionmaker(
|
manager._async_session_factory = async_sessionmaker(bind=async_engine, expire_on_commit=False)
|
||||||
bind=async_engine, expire_on_commit=False
|
|
||||||
)
|
|
||||||
return manager
|
return manager
|
||||||
|
|
||||||
|
|
||||||
@@ -139,9 +136,7 @@ class TestPersistAssessment:
|
|||||||
):
|
):
|
||||||
"""Assessments with should_alert=False must still hit the DB; no dispatch."""
|
"""Assessments with should_alert=False must still hit the DB; no dispatch."""
|
||||||
assessment = _make_assessment(sample_trade, should_alert=False, score=0.45)
|
assessment = _make_assessment(sample_trade, should_alert=False, score=0.45)
|
||||||
pipeline = _build_pipeline(
|
pipeline = _build_pipeline(mock_settings, db_manager=db_manager, assessment=assessment)
|
||||||
mock_settings, db_manager=db_manager, assessment=assessment
|
|
||||||
)
|
|
||||||
|
|
||||||
await pipeline._score_and_alert(SignalBundle(trade_event=sample_trade))
|
await pipeline._score_and_alert(SignalBundle(trade_event=sample_trade))
|
||||||
|
|
||||||
@@ -160,21 +155,15 @@ class TestPersistAssessment:
|
|||||||
assert pipeline.stats.alerts_sent == 0
|
assert pipeline.stats.alerts_sent == 0
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_persistence_failure_does_not_block_dispatch(
|
async def test_persistence_failure_does_not_block_dispatch(self, mock_settings, sample_trade):
|
||||||
self, mock_settings, sample_trade
|
|
||||||
):
|
|
||||||
"""If repo.insert blows up, the alert pipeline still ships the alert."""
|
"""If repo.insert blows up, the alert pipeline still ships the alert."""
|
||||||
assessment = _make_assessment(sample_trade, should_alert=True, score=0.92)
|
assessment = _make_assessment(sample_trade, should_alert=True, score=0.92)
|
||||||
|
|
||||||
# db_manager whose get_async_session raises -> _persist_assessment swallows it
|
# db_manager whose get_async_session raises -> _persist_assessment swallows it
|
||||||
broken_db = MagicMock()
|
broken_db = MagicMock()
|
||||||
broken_db.get_async_session = MagicMock(
|
broken_db.get_async_session = MagicMock(side_effect=RuntimeError("DB connection failed"))
|
||||||
side_effect=RuntimeError("DB connection failed")
|
|
||||||
)
|
|
||||||
|
|
||||||
pipeline = _build_pipeline(
|
pipeline = _build_pipeline(mock_settings, db_manager=broken_db, assessment=assessment)
|
||||||
mock_settings, db_manager=broken_db, assessment=assessment
|
|
||||||
)
|
|
||||||
|
|
||||||
await pipeline._score_and_alert(SignalBundle(trade_event=sample_trade))
|
await pipeline._score_and_alert(SignalBundle(trade_event=sample_trade))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user