From 619d1fa3998a39ca11f32a4938c6ddb01286fc81 Mon Sep 17 00:00:00 2001 From: Aaron Liang <76561968+AaronL725@users.noreply.github.com> Date: Wed, 15 Jul 2026 00:17:27 +0800 Subject: [PATCH] fix: trigger final remaining review fixes --- tools/apply_remaining_review_fixes.py | 149 ++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 tools/apply_remaining_review_fixes.py diff --git a/tools/apply_remaining_review_fixes.py b/tools/apply_remaining_review_fixes.py new file mode 100644 index 0000000..9b6bc65 --- /dev/null +++ b/tools/apply_remaining_review_fixes.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from pathlib import Path +import ast +import json + +ROOT = Path(__file__).resolve().parents[1] +MAIN = ROOT / "grok_register_ttk.py" +CONFIG_EXAMPLE = ROOT / "config.example.json" + + +def read(path): + return path.read_text(encoding="utf-8-sig") + + +def replace_once(text, old, new, label): + count = text.count(old) + if count != 1: + raise RuntimeError(f"{label}: expected one match, got {count}") + return text.replace(old, new, 1) + + +main = read(MAIN) + +main = replace_once( + main, + ' "grok2api_allow_legacy_full_save": False,\n}', + ' "grok2api_allow_legacy_full_save": False,\n' + ' "email_provider": "duckmail",\n' + ' "yyds_api_key": "",\n' + ' "yyds_jwt": "",\n' + ' "defaultDomains": "",\n' + '}', + "complete default config", +) + +main = replace_once( + main, + ''' for key, allowed in enums.items(): + value = cfg.get(key, DEFAULT_CONFIG.get(key, "")) + if value not in allowed: + raise ConfigError(f"配置项 {key} 的值无效: {value!r}; 允许值: {sorted(allowed)}") + cfg[key] = value + return cfg +''', + ''' for key, allowed in enums.items(): + value = cfg.get(key, DEFAULT_CONFIG.get(key, "")) + if value not in allowed: + raise ConfigError(f"配置项 {key} 的值无效: {value!r}; 允许值: {sorted(allowed)}") + cfg[key] = value + + api_path_keys = { + "cloudflare_path_domains", "cloudflare_path_accounts", + "cloudflare_path_token", "cloudflare_path_messages", + "cloudmail_path_messages", + } + for key in api_path_keys: + value = cfg[key] + if value and not value.startswith("/"): + value = "/" + value + cfg[key] = value + + url_keys = { + "cloudflare_api_base", "cloudmail_api_base", + "grok2api_remote_base", "cpa_base_url", + } + for key in url_keys: + value = cfg[key] + if not value: + continue + parsed = urllib.parse.urlsplit(value) + if parsed.scheme not in ("http", "https") or not parsed.netloc: + raise ConfigError(f"配置项 {key} 必须是有效的 http/https URL") + + for key in path_keys: + value = cfg[key] + if value.startswith("~"): + cfg[key] = os.path.expanduser(value) + return cfg +''', + "normalize validated config", +) + +main = replace_once( + main, + ''' save_headers = dict(headers) + if etag: + save_headers["If-Match"] = etag + elif log_callback: + log_callback("[!] 旧版远端接口未提供 ETag;已由显式配置允许,但仍不建议多实例并发") +''', + ''' if not etag: + raise RemoteTokenCompatibilityError( + "旧版远端接口未提供 ETag,无法保证并发安全,已拒绝全量保存" + ) + save_headers = dict(headers) + save_headers["If-Match"] = etag +''', + "require ETag for legacy save", +) + +main = replace_once( + main, + ''' if kind == "log": + line = event[1] + self.log_text.insert(tk.END, f"{line}\\n") + self.log_text.see(tk.END) + elif kind == "stats": +''', + ''' if kind == "log": + line = event[1] + self.log_text.insert(tk.END, f"{line}\\n") + self.log_text.see(tk.END) + elif kind == "clear_log": + self.log_text.delete(1.0, tk.END) + elif kind == "stats": +''', + "GUI clear event", +) + +main = replace_once( + main, + ''' def clear_log(self): + self.log_text.delete(1.0, tk.END) +''', + ''' def clear_log(self): + self.ui_queue.put(("clear_log",)) +''', + "queue clear log", +) + +ast.parse(main, filename=str(MAIN)) +MAIN.write_text(main, encoding="utf-8") + +if CONFIG_EXAMPLE.exists(): + data = json.loads(read(CONFIG_EXAMPLE)) + data.setdefault("email_provider", "duckmail") + data.setdefault("yyds_api_key", "") + data.setdefault("yyds_jwt", "") + data.setdefault("defaultDomains", "") + data.setdefault("cpa_oidc_request_timeout_sec", 15) + data.setdefault("cpa_oidc_poll_timeout_sec", 15) + data.setdefault("grok2api_allow_legacy_full_save", False) + CONFIG_EXAMPLE.write_text( + json.dumps(data, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8", + ) + +print("remaining review fixes applied")