FinDataHub fa23425cbe refactor(client): 抽取 SyncOutputParser,解析逻辑首次可测
## 为什么选这个切入方式

原计划先引入 SyncSession 值类型再拆文件。但实测 View 层对 @Published 状态的
直接访问约 90+ 处(15 × state、9 × progress、7 × startTime …),那条路要改
20 个属性的读写路径并全量验证。

改为更小的第一步:**抽取无状态解析**。关键区别是这一步**不需要放宽任何
private 访问级别**——Swift 的 private 是文件级作用域,一旦为拆文件而放开内部
状态,封装性就实质下降;而解析器接收「一行字符串」、返回「动作描述」,
天然不依赖 manager 状态。

## 改动

- 新增 SyncOutputParser.swift(260 行):5 个预编译正则 + stdout/stderr/tqdm
  解析 + 缓冲切分,全 static 无状态
- manager 的 4 个方法改为「调用 parser + switch 应用动作」
- 删除 manager 内 5 个正则声明(避免同一模式两处维护)
- 主文件 842 → 729 行

## 关键设计:返回动作序列而非直接改状态

原 parseStdoutLine 用 matched 标记而非提前 return,因此**一行可命中多个模式**
(如 `✅ [x] 完成 成功: 3` 同时产出两条日志)。改成 guard-else-return 会静默
改变行为。故 parser 返回 [StdoutAction],manager 逐条应用。
用例 testMultiplePatternsInOneLine 锁定该语义。

## 顺带修掉一个真实缺陷

原实现部分正则用 NSRange(location: 0, length: trimmed.count) 构造范围。
NSRange 按 **UTF-16 单元**计数,String.count 按**字素簇**计数:
含 emoji 的行(⚠️ 占 2 个 UTF-16 单元)长度偏小 → 行尾的「成功: N」「速率: X」
落在范围外被**静默漏匹配**。

统一改为 (s as NSString).length,并写回归用例
testEmojiLineStillMatchesTrailingRegex(先断言该行确实存在长度差,
否则用例本身没有意义)。

## 还原一处既有行为

`daily sync: 45%` 的表名取到 "sync" 而非 "daily"——原实现取冒号前最后一个
非数字片段。测试首次失败暴露这点,是测试期望写错、不是代码错。
已在用例中锁定并注明,避免后人"顺手修正"改变既有显示。

## 测试

Swift 18 → 42 tests(新增 24 条:模式识别、tqdm 提取、stderr 分级、
emoji/NSRange 回归、缓冲切分边界)。全量 8 套件 PASS。
2026-10-27 00:05:18 +08:00

FinDataHub 文档中心

更新于 2026-08-09 | P1-P4 全部完成 | P5 远期规划


目录结构

Docs/
├── README.md                  ← 你在这里
├── pipeline/                  # 🟣 数据管道架构设计
├── macos/                     # 🍎 macOS App 设计
└── tracking/                  # 📋 项目管理追踪

🟣 pipeline/ — 数据管道架构设计

文件 类型 说明
findatahub-data-pipeline.html 设计手册 核心架构 + 架构规范:三层 Medallion、7 步 Pipeline、4 级门控、依赖铁律、组件契约、代码质量标准
rate_limit_pull_plan.md 方案文档 限流方案:6 接口分析 + 新浪/东财降级 + 北交所重拉
EXECUTION_PLAN.md 已归档 重构执行方案(2026-07 阶段,已执行完毕)

🍎 macos/ — macOS App 设计

文件 类型 说明
DESIGN.md 设计规范 Apple HIG 设计 Token + Liquid Glass 改造方案(附录)
DEVLOG.md 开发日志 SwiftUI App 每日开发记录

📋 tracking/ — 项目管理追踪

文件 类型 说明
TODO.md 待办 + 完成记录 13 项任务 + P1-P4 完成明细 + 架构重构项

进度总览

阶段 内容 状态
P1 采集层:双源交叉验证 + AKShare 修复 + 北交所重拉 ✅
P2 预处理层:7 步 Pipeline + 4 级门控 + 策略画像 ✅
P3 使用层:SDK 11 方法 + API 14 端点 ✅
P4 AI 接入:Skills + MCP 7 工具 ✅
P5 云端扩展:阿里云同步 / Redis 缓存 / 数据血缘 📅 未来
S
Description
本地金融数据终端 macOS App(SwiftUI + kuaixun-service + MySQL 数据管线)
Readme
4.3 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 58.1%
Swift 26.9%
HTML 8.5%
Vue 2.8%
Shell 1.8%
Other 1.9%