mirror of
https://github.com/mwisnowski/mtg_python_deckbuilder.git
synced 2026-04-05 20:57:16 +02:00
62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
|
|
"""Land optimization service for surfacing smart-land diagnostics to the web layer.
|
||
|
|
|
||
|
|
Reads _land_report_data produced by LandAnalysisMixin (Roadmap 14) from the
|
||
|
|
active builder session and formats it for JSON API responses.
|
||
|
|
"""
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import json
|
||
|
|
import logging
|
||
|
|
from typing import Any, Dict
|
||
|
|
|
||
|
|
from code.web.services.base import BaseService
|
||
|
|
from code import logging_util
|
||
|
|
|
||
|
|
logger = logging_util.logging.getLogger(__name__)
|
||
|
|
logger.setLevel(logging_util.LOG_LEVEL)
|
||
|
|
logger.addHandler(logging_util.file_handler)
|
||
|
|
logger.addHandler(logging_util.stream_handler)
|
||
|
|
|
||
|
|
|
||
|
|
class LandOptimizationService(BaseService):
|
||
|
|
"""Thin service that extracts and formats land diagnostics from a build session."""
|
||
|
|
|
||
|
|
def __init__(self) -> None:
|
||
|
|
super().__init__()
|
||
|
|
|
||
|
|
def get_land_report(self, session: Dict[str, Any]) -> Dict[str, Any]:
|
||
|
|
"""Extract _land_report_data from the active builder in ``session``.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
session: The dict returned by ``get_session(sid)``.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
A copy of ``_land_report_data``, or an empty dict if unavailable.
|
||
|
|
"""
|
||
|
|
ctx = session.get('build_ctx') or {}
|
||
|
|
builder = ctx.get('builder') if isinstance(ctx, dict) else None
|
||
|
|
if builder is None:
|
||
|
|
return {}
|
||
|
|
report = getattr(builder, '_land_report_data', None)
|
||
|
|
return dict(report) if report else {}
|
||
|
|
|
||
|
|
def format_for_api(self, report: Dict[str, Any]) -> Dict[str, Any]:
|
||
|
|
"""Return a JSON-serialisable copy of ``report``.
|
||
|
|
|
||
|
|
Converts any non-primitive values (numpy types, DataFrames, etc.) to
|
||
|
|
strings so the result can be passed straight to ``JSONResponse``.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
report: Raw _land_report_data dict.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
A plain-dict copy safe for JSON serialisation.
|
||
|
|
"""
|
||
|
|
if not report:
|
||
|
|
return {}
|
||
|
|
try:
|
||
|
|
return json.loads(json.dumps(report, default=str))
|
||
|
|
except Exception as exc: # pragma: no cover
|
||
|
|
logger.warning('LandOptimizationService.format_for_api failed: %s', exc)
|
||
|
|
return {}
|