• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Doubak / doubak-data-parser
91%

Build:
DEFAULT BRANCH: main
Repo Added 23 Aug 2026 02:58AM UTC
Files 15
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

LAST BUILD ON BRANCH main
branch: SELECT
CHANGE BRANCH
x
  • No branch selected
  • browser-parse
  • main

30 Aug 2026 11:58AM UTC coverage: 91.238% (-0.9%) from 92.12%
29

push

github

MewX
fix(test): 三条断言把「豆瓣改了渲染」当成了「用户改了内容」

把前代工具 2022–2024 的档案并进来之后,三条长期为绿的断言红了。**三条都是
断言错了,数据是对的**,而且是同一个错误的三种大小。

**① 墓碑的 title 必须全是 null。** 实测 8 个墓碑里有 3 个留下了真名——
movie/11611021「在这世界的角落」、game/24299254「瘟疫公司」、
game/27054820「瘟疫公司:物竞天择」:老档案在豆瓣删掉它们**之前**看见过。
墓碑不是「一直无名」,是「变成了无名」,而一份看着它发生的档案正是目的本身。
改成:最新那一版必须是 null(「未知电影」是占位符,放进去会一路传到页面
标题与导出文件),更早的可以有名字,且恢复出来的个数写成**下界**——写成
恒等会让「多救回一个名字」表现成测试失败。

顺带纠正 CLAUDE.md 里那句「0 of 8 不可恢复」:那是从唯一看过的那个例子
(《返校》,它确实 2022-12 就已经是「未知条目」)推广出来的,n=1。

**② canonical 引用的图 == 档案里抓到的图。** 前代工具只存 HTML,一张图都
没存,所以导进来之后 20 个 URL 天然没有字节。这不是判据不一致。拆成三条:
真抓过的档案引用的必须有字节(132 == 132,严格相等,抽取器变松照样红);
抓到的每一张都必须被引用(0 孤儿,全档案无例外,抽取器变严照样红);
只被重建档案引用的必须**一张字节都没有**——把缺口说出来而不是放过去,
因为哪天它有了字节,上面那个划分就不成立,而第一条会静悄悄失去意义。

判据取 `capture_fidelity === 'decoded_body+synthesized_headers'`,不取
producer 的名字:那个值是 bundle/1.3 专为「重建出来的档案」新增的,按名字判
会在第二个导入适配器出现时失效,且会以「抽取器松了」的名义报错——归错因。

**③ 广播里用户写的那部分不可编辑。** 这条上次已经收窄过一回(target_title
移出去)。这次又有四个字段动了,而**没有一个是用户改的**:

    action  59 对  49 对只差冒号宽窄(老页面「说:」新页面「说:」,每个带冒号
                   的动作都恰好两种写法、按来源完全分开、零反例);另外 10 对
                   是豆瓣改了措辞,例如「分享了」→「转发了」
    text     9 对  4 对 \r\n\r\n 被压成 \r\n · 1 对 ™ 与 ™
                   的转义差别 · 3 对是老页面的正文这边读不出来
    images  27 对  老页面上 upload-pic-wrapper 那种附图还没认出来
    target_type / target_id 各 4 对

「发出去就不能改」说的是**用户改不了**,从来没有承诺豆瓣四年不换模板。写进
同一张表,就是拿豆瓣的排版变化去指控用户编辑了广播。真正冻住的只剩五个,
实测在全部 3856 条修订里一次都没变过:posted_at · rating · status ·
text_truncated · full_text_url。

被移出去的不是不管了,是改成**上界**:直接删掉等于把「豆瓣渲染变了」与
「抽取器坏了」一起放行,而后者正是这条测试存在的理由。认出老页面的附图写法
会让 images 那个数下降(绿),任何新的抽取器退化都会让它上涨(红)。

**④ 顺带:`--test-concurrency=2`。** 4 个测试文件各自完整解析一遍那份 619 MB
的真实档案,而 `node --test` 默认按核数并发——8 核上就是 8 份同时跑,实测会把
整个文件**整体**打挂,报出来只有一句没有断言的 `'test failed'`。单独跑又是
绿的,于是表现为「时好时坏」。限并发之后 215 个测试全绿。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E6dxwcUi4rM3dcKdsqx9xm

511 of 642 branches covered (79.6%)

Branch coverage included in aggregate %.

3352 of 3592 relevant lines covered (93.32%)

2562.93 hits per line

Relevant lines Covered
Build:
Build:
3592 RELEVANT LINES 3352 COVERED LINES
2562.93 HITS PER LINE
Source Files on main
  • Tree
  • List 15
  • Changed 9
  • Source Changed 0
  • Coverage Changed 9
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses

Recent builds

Builds Branch Commit Type Ran Committer Via Coverage
29 main fix(test): 三条断言把「豆瓣改了渲染」当成了「用户改了内容」 把前代工具 2022–2024 的档案并进来之后,三条长期为绿的断言红了。**三条都是 断言错了,数据是对的**,而且是同一个错误的三种大小。 **① 墓碑的 title 必须全是 null。** 实测 8 个墓碑里有 3 个留下了真名—— movie/11611021「在这世界的角落」、game/24299254「瘟疫公司」、 game/27054820「瘟疫公司:物竞天择」:老档案在豆瓣删掉它们**之前**看见... push 30 Aug 2026 11:59AM UTC MewX github
91.24
28 main docs: README 补上字节校验与「一个目录几份档案」,命令行签名同步 新增两节: - **一个目录里塞了好几份档案** —— 有几份 index-*.ndjson 就是几份,编号取自 索引文件名而非 manifest,manifest 说的不是这一份就不认。附上那个真实的 下载文件夹长什么样,以及 `'unknown'` 当账号用会劈开 5 条舞台剧的实测。 - **核一遍字节** —— 查什么、为什么它不是第二个 validate.py、为什么默认开、 为什么 `... push 30 Aug 2026 11:27AM UTC MewX github
92.12
27 main docs: README 现状那一节改成十七份档案的实测,并修掉一条早就不成立的说法 「广播 3394 条(修订 3394)一比一 —— 广播发布后不可编辑」这句从合并七月那两个 起点起就不成立了:挂在广播下面那张作品卡是豆瓣现渲染的,改个片名就产生一条修订。 实测 69 条差异每一条都只差 target_title,一条都没碰正文——所以「正文冻结」那半句 是对的,被写坏的是拿修订数当它的代称。README 里的数字会静静过期,这条是例子。 顺带写上导入档案也能喂进来(doubak-... push 30 Aug 2026 04:42AM UTC MewX github
91.07
26 main fix: data-cid 是 2023-12 才有的,两层身份必须认回同一条记录 identityOf() 有 data-cid 就用 `u:` 键、没有就用 `d:` 键,而两个键空间不相交。 于是**同一条标记在不同年代的观测会变成两条记录**——IDENTITY.md §2.2 那张表自己 就写着 data-cid 只有 2023-12 之后抓的页面才有,所以只要一个目录里同时有那之前 和之后的档案,每一条跨越那条线的标记都会一分为二。 实测把前代工具 2022-12 → 20... push 30 Aug 2026 04:32AM UTC MewX github
90.64
25 main docs: 记下八项契约、async parse() 与自带的 sha256 同一份代码现在也跑在浏览器扩展里。README 说清界线(「字节从哪儿来」各写各的), 列出那八项契约,并解释为什么 digest 不再用 node:crypto——crypto.subtle 会把 fieldDigest 染成 async,而它一份真实档案要调约 7.5 万次。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Sess... push 28 Aug 2026 04:03AM UTC MewX github
89.53
23 browser-parse docs: 记下八项契约、async parse() 与自带的 sha256 同一份代码现在也跑在浏览器扩展里。README 说清界线(「字节从哪儿来」各写各的), 列出那八项契约,并解释为什么 digest 不再用 node:crypto——crypto.subtle 会把 fieldDigest 染成 async,而它一份真实档案要调约 7.5 万次。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Sess... push 28 Aug 2026 03:57AM UTC MewX github
91.38
22 main 只留 --ignore-warnings 一种写法 同一个开关两个拼法,换来的是「到底哪个才对」,不是少打一次字。 整个项目的命令行都用连字符(--shelf-history、--no-shelf-history、 --sample=、--target=、--visibility=),跟着来就行。 --ignore_warning 现在会被未知开关那道检查挡下,报出能用的那个, 而不是静默忽略——负向语义的开关拼错了被吞掉,等于拿到相反的结果。 Co-Authored-By: Cla... push 25 Aug 2026 10:53AM UTC MewX github
90.98
21 main 连子目录一起找档案,并给混账号那道拦截一个绕过口 `openAll` 原先只看一层。真实的下载目录不长那样:解压出来带一层外壳、 按月份分了文件夹、几次导出堆在一起。要求人先手工摊平,换来的只会是 **摊漏了一份**——而漏一份档案没有任何声响,产出照样是一份看着完整的 canonical,只是少了一段历史。 两条边界:认出是 bundle 的目录不再往里钻(里面不会再套一份), 软链接不跟着走且同一个真实路径只进一次(一个指回上层的软链接 足以让递归转不出来,而那种结构在下载目录里并... push 25 Aug 2026 10:48AM UTC MewX github
89.01
20 main 覆盖率:修好 /dev/null 的 fsync,并去掉 tools/** 这条排除 CI 挂在 `EINVAL: invalid argument, fsync`。`--test-reporter-destination` 会对目标 fsync,而 runner 上的 /dev/null 不接受——本地能跑通,CI 上必炸。 改成 stdout,顺带能在日志里看见进度。 排除项从两条减到一条。tools/** 是反射性加的:coveralls.mjs 自己有测试, 排掉等于把一个测过... push 23 Aug 2026 04:09AM UTC MewX github
87.78
See All Builds (9)
  • Repo on GitHub
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc