From aff75141cb59d07513bd6d7ca7304e05074c4513 Mon Sep 17 00:00:00 2001 From: yumao Date: Thu, 9 Jul 2026 11:32:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BC=81=E5=BE=AE=20?= =?UTF-8?q?Delta=20=E6=A8=A1=E5=BC=8F=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- daily/config.py | 38 +++++++++++++++++++++++++++-------- tests/test_wecom_delta.py | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 tests/test_wecom_delta.py diff --git a/daily/config.py b/daily/config.py index 8308aac..0e686f4 100644 --- a/daily/config.py +++ b/daily/config.py @@ -3,13 +3,11 @@ from __future__ import annotations import os -import sys from pathlib import Path from dotenv import load_dotenv ROOT = Path(__file__).resolve().parent.parent -BOT_DIR = ROOT / "bot" OUTPUT_DIR = ROOT / "output" LOG_DIR = ROOT / "logs" CACHE_DIR = ROOT / ".cache" @@ -45,16 +43,11 @@ def wecom_max_bytes() -> int: """兼容旧配置名。""" return wecom_chunk_bytes() + load_dotenv(ROOT / ".env") load_dotenv(ROOT / ".env.local", override=True) -def ensure_bot_on_path() -> None: - bot = str(BOT_DIR) - if bot not in sys.path: - sys.path.insert(0, bot) - - def _clean_env_value(raw: str | None) -> str | None: if raw is None: return None @@ -79,3 +72,32 @@ def env_int(key: str, default: int) -> int: return int(raw) except ValueError: return default + + +def env_bool(key: str, default: bool) -> bool: + raw = env(key) + if raw is None: + return default + return raw.strip().lower() in {"1", "true", "yes", "on"} + + +def wecom_mode() -> str: + raw = (env("DAILY_WECOM_MODE") or "delta").strip().lower() + return raw if raw in {"full", "delta"} else "delta" + + +def news_dedup_days() -> int: + return max(1, env_int("DAILY_NEWS_DEDUP_DAYS", 7)) + + +def skip_push_when_silent() -> bool: + return env_bool("DAILY_SKIP_PUSH_WHEN_SILENT", True) + + +def delta_baseline_fallback() -> str: + raw = (env("DAILY_DELTA_BASELINE_FALLBACK") or "full").strip().lower() + return raw if raw in {"full", "empty"} else "full" + + +def force_push() -> bool: + return env_bool("DAILY_FORCE_PUSH", False) diff --git a/tests/test_wecom_delta.py b/tests/test_wecom_delta.py new file mode 100644 index 0000000..c0f887e --- /dev/null +++ b/tests/test_wecom_delta.py @@ -0,0 +1,42 @@ +"""Tests for WeCom delta mode.""" + +from __future__ import annotations + +import os +import unittest +from unittest.mock import patch + +from daily.config import ( + delta_baseline_fallback, + env_bool, + force_push, + news_dedup_days, + skip_push_when_silent, + wecom_mode, +) + + +class ConfigHelpersTests(unittest.TestCase): + def test_wecom_mode_defaults_delta(self): + with patch.dict(os.environ, {}, clear=True): + self.assertEqual(wecom_mode(), "delta") + + def test_wecom_mode_full(self): + with patch.dict(os.environ, {"DAILY_WECOM_MODE": "full"}, clear=True): + self.assertEqual(wecom_mode(), "full") + + def test_env_bool_truthy(self): + with patch.dict(os.environ, {"DAILY_FORCE_PUSH": "1"}, clear=True): + self.assertTrue(env_bool("DAILY_FORCE_PUSH", False)) + + def test_skip_push_when_silent_default(self): + with patch.dict(os.environ, {}, clear=True): + self.assertTrue(skip_push_when_silent()) + + def test_news_dedup_days_default(self): + with patch.dict(os.environ, {}, clear=True): + self.assertEqual(news_dedup_days(), 7) + + def test_delta_baseline_fallback_default(self): + with patch.dict(os.environ, {}, clear=True): + self.assertEqual(delta_baseline_fallback(), "full")