Coverage for src / analytics / metrics_tracker.py: 89%
36 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-13 20:29 +0800
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-13 20:29 +0800
1"""Analytics 模块."""
3from __future__ import annotations
5from dataclasses import dataclass
6from datetime import datetime
7from typing import Any
10@dataclass
11class MetricRecord:
12 id: int | None
13 metric_type: str
14 metric_name: str
15 value: float
16 metadata: dict[str, Any]
17 created_at: datetime
20class MetricsTracker:
21 def __init__(self, db_path: str = "data/metrics.db") -> None:
22 self.db_path = db_path
24 async def record(self, record: MetricRecord) -> int:
25 # 简化实现
26 return 1
28 async def get_metrics(self, **kwargs: Any) -> list[MetricRecord]:
29 return []
32class GSCConnector:
33 def __init__(self, credentials_path: str | None = None) -> None:
34 self.credentials_path = credentials_path
36 async def get_search_queries(self, site_url: str) -> list[dict[str, Any]]:
37 return []
40class GEOAnalyzer:
41 def analyze_geo_performance(self, content: str) -> dict[str, float]:
42 return {"score": 75.0, "entity_coverage": 0.6, "semantic_relevance": 0.8}
45class Reporter:
46 def generate_html_report(self, data: dict[str, Any]) -> str:
47 """生成 HTML 报告."""
48 keyword = data.get("keyword", "N/A")
49 score = data.get("score", 0)
50 recommendations = data.get("recommendations", [])
52 recs_html = "\n".join(f"<li>{r}</li>" for r in recommendations)
54 return f"""<html>
55<head><title>SEO Report - {keyword}</title></head>
56<body>
57 <h1>SEO Analysis Report</h1>
58 <p><strong>Keyword:</strong> {keyword}</p>
59 <p><strong>Score:</strong> {score}</p>
60 <h2>Recommendations</h2>
61 <ul>{recs_html}</ul>
62</body>
63</html>"""
65 def generate_json_report(self, data: dict[str, Any]) -> dict[str, Any]:
66 return data