Skip to content

refactor: data sync 三分支汇总格式统一 (SyncStats)#6429

Merged
Kaoruha merged 1 commit into
masterfrom
6432-refactor/data-sync-summary-format
Jun 28, 2026
Merged

refactor: data sync 三分支汇总格式统一 (SyncStats)#6429
Kaoruha merged 1 commit into
masterfrom
6432-refactor/data-sync-summary-format

Conversation

@Kaoruha

@Kaoruha Kaoruha commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

推进 #6054(data sync 三分支汇总格式不统一 refactor)。

问题

data_cli.sync 的 day/tick/adjustfactor 三分支各自维护 success_count/error_count(day 另有 skipped_count),汇总字符串独立拼接,导致:

  • 格式漂移:day 加 Skipped 计数时,tick/adjustfactor 未同步(仍二态)
  • 漏计数:adjustfactor 的 records_added=0(no-data)分支只 warn 不计数,day 同情况计 skipped

修复

抽取 SyncStats 三态计数器(success/skipped/errors)+ 统一 summary() 格式,三分支共用:

  • record_success() / record_skipped() / record_error() 累加
  • summary(type_name) 统一输出:{Type} sync completed. Success: N, Skipped: S, Errors: M
  • adjustfactor no-data 分支补计 skipped(对齐 day 语义)

未来加第 4 态只改 SyncStats 一处,杜绝漂移。

变更

  • src/ginkgo/client/data_cli.py:新增 SyncStats 类 + day/tick/adjustfactor 三分支接线
  • tests/unit/client/test_data_cli_syncstats.py:3 测试覆盖三态计数 + 格式

Test plan

三层冒烟(对齐 .github/workflows/ci.yml #6015)全绿:

  • L1 py_compile:src+api 全量 ✅
  • L2 启动路径:test_user_crud_mock + test_containers + test_user_cli(29 passed)✅
  • L3 变更相关:test_data_cli + test_data_cli_syncstats + test_data_cli_adjustfactor(56 passed,含既有 adjustfactor wiring 回归 + no-data 契约)✅

Closes #6054

🤖 Generated with Claude Code

@Kaoruha

Kaoruha commented Jun 24, 2026

Copy link
Copy Markdown
Owner Author

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

Verified(#6054:抽取 SyncStats 三态计数器 + 统一汇总格式,day/tick/adjustfactor 三分支共用):

raise typer.Exit(1)
try:
stats = SyncStats()
for current_code in codes:
try:
console.print(f":information: Processing {current_code}...")
if full:
if force:
# 强制全量同步:fast_mode=False 重算覆盖
console.print(f":information: Force full sync for {current_code} (overwrite existing)")
result = adjustfactor_service.sync(current_code, fast_mode=False)
else:
# 全量同步:fast_mode=True 跳过已有数据
console.print(f":information: Full sync for {current_code} (skip existing)")
result = adjustfactor_service.sync(current_code, fast_mode=True)
else:
# 增量同步:从最新日期开始到当下
console.print(f":information: Incremental sync for {current_code} (from latest date)")
result = adjustfactor_service.sync(current_code, fast_mode=True)
# Check sync result - ServiceResult has success property, other results may not
sync_success = False
if hasattr(result, 'success'):
sync_success = result.success
elif result is None: # Some functions return None on success
sync_success = True
if sync_success:
# 仿 day 分支:从 result.data.records_added 提取实际入库条数,
# 避免无数据时仍打印 ":white_check_mark: sync completed" 误导用户(#6053)。
records_added = 0
try:
_data = getattr(result, 'data', None)
raw = getattr(_data, 'records_added', 0)
records_added = int(raw) if isinstance(raw, (int, float)) else 0
except (AttributeError, TypeError, ValueError):
records_added = 0
if records_added > 0:
stats.record_success()
console.print(f":white_check_mark: {current_code} sync completed ({records_added} records)")
else:
# service.sync 成功但源端无数据:计 skipped(#6053/#6054 统一三态)

  • 行为等价性:day 分支格式逐字符保持(原三态→新三态);tick/adjustfactor 新增 Skipped: 列是 refactor: 统一 data sync 三分支汇总输出格式 #6054 明确要求的统一格式(issue body 列点),非漂移。type_name 'Day'/'Tick'/'Adjustfactor' 与原汇总行前缀逐一对应
  • 测试真实性test_data_cli_syncstats.py 3 测试纯逻辑(三态计数 + summary 格式 + type_name 插值),非假 GREEN。os.environ["GINKGO_SKIP_DEBUG_CHECK"]="1" 绕 debug 检查合理。测试位置 tests/unit/client/ 合规(CLAUDE.md「测试统一放 tests/」)
  • CLAUDE.md 合规:分层架构不违规(SyncStats 是 CLI 层局部展示工具类,无 Service/CRUD 调用);未触碰 Base 类;非 sed 批量替换(三分支上下文独立手工重构);SyncStats 单线程使用(CLI sync 同步 for 循环),self.success += 1 无竞态

观察附注(非 PR 缺陷,预存功能缺口):tick 分支无 records_added 提取(tick_service.sync_smart 返回类型不带),故 tick 恒 Skipped: 0——tick 无数据时仍显示成功,对称于 #5954 当初 day 分支的 bug。此缺口在 #6053/#6054 范围外(#6054 AC 只要求"格式统一"非"补齐 tick 的 records_added 契约"),建议后续独立 issue 记录「tick sync 无 skipped 态是 service 层返回类型限制,非 SyncStats 缺陷」。

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

抽取 SyncStats 三态计数器(success/skipped/errors)+ 统一汇总格式,
day/tick/adjustfactor 三分支共用,消除格式漂移。

- day 分支已有 skipped_count,tick/adjustfactor 仅二态 → 统一三态
- adjustfactor records_added=0 的 no-data 情况原仅 warn 不计数,
  现计 skipped(对齐 day 分支语义)
- summary 格式统一: {Type} sync completed. Success: N, Skipped: S, Errors: M

Co-Authored-By: Claude <noreply@anthropic.com>
@Kaoruha Kaoruha force-pushed the 6432-refactor/data-sync-summary-format branch from 975c41e to 5b57d2b Compare June 27, 2026 17:16
@Kaoruha Kaoruha merged commit 9803673 into master Jun 28, 2026
2 checks passed
@Kaoruha Kaoruha deleted the 6432-refactor/data-sync-summary-format branch June 28, 2026 02:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: 统一 data sync 三分支汇总输出格式

1 participant