Herb Corpus
收藏资源简介:
一个真实世界Rails应用程序的语料库,用于测试Herb(解析器、linter、格式化程序和打印机),针对实际部署的ERB。包含256个应用程序和引擎,32,922个.erb文件,大小约50 MB,每个应用程序固定到特定提交以确保可重现性。
A corpus of real-world Rails applications designed for testing Herb — a parser, linter, formatter, and printer — targeted at production-deployed ERB files. This dataset includes 256 applications and engines, 32,922 .erb files with a total size of approximately 50 MB. Each application is pinned to a specific commit to ensure reproducibility.
数据集概述
Herb Corpus 是一个由真实世界 Rails 应用程序组成的语料库,专门用于测试 Herb(解析器、linter、格式化器和打印机)对实际生产环境中 ERB 模板的处理能力。每个应用程序都固定到确切的提交,确保跨机器和 CI 的结果可重复。
规模统计
| 指标 | 数值 |
|---|---|
| 应用程序和引擎总数 | 256 |
erb/ 目录中的 .erb 文件 |
32,922(来自 228 个应用) |
erb/ 目录大小 |
~50 MB |
| 待审核许可证的应用(已排除) | 28 个 |
双层结构
herb-corpus/ ├── apps/ # 每个应用为一个 git 子模块,固定在确切提交 ├── erb/ # 提取的所有 .erb 文件(扁平排布),附带来源清单 ├── corpus.yml # 每个应用的来源与许可证信息 ├── Yerbafile # corpus.yml 的格式化规则 └── bin/ # 管理 CLI 及 CI 运行的脚本
apps/:数据源,包含完整 git 历史,占用数 GB 磁盘空间。erb/:从apps/生成的扁平 .erb 文件,大小约 50 MB,已包含在仓库中。erb/MANIFEST.json记录每个提取文件的来源仓库、提交 SHA 和许可证。
获取数据集
- 仅需 ERB 文件:直接
git clone。 - 需要完整应用:
git clone后运行bin/corpus clone。 - 默认仅检出 ERB:
bin/corpus clone使用 blobless 部分克隆和稀疏检出,仅包含*.erb及许可证/README 文件。可通过--full参数获取完整工作目录。 - 不使用浅克隆:因许多应用固定在非分支顶端提交。
命令行工具 (CLI)
所有命令均支持可选的应用程序名称列表和 --help 选项,仅依赖 Ruby 标准库。
| 命令 | 功能 |
|---|---|
bin/corpus clone |
克隆未检出的应用(默认仅 ERB) |
bin/corpus update |
将每个应用的固定提交更新到其跟踪分支的最新提交 |
bin/corpus status |
显示每个应用的固定提交、检出状态和漂移情况 |
bin/corpus drift |
报告哪些应用的固定提交落后于其分支(无需检出) |
bin/corpus list |
列出应用及其仓库、分支、.erb 文件数和许可证 |
bin/corpus add |
添加新应用为子模块并创建清单条目 |
bin/corpus remove |
移除应用的子模块和检出 |
bin/corpus extract |
将 .erb 文件复制到 erb/ 并附带来源清单 |
bin/corpus stats |
打印语料库统计信息,或刷新 README 中的统计块 |
bin/corpus measure |
在语料库上运行不同 Herb 版本并对比结果 |
corpus.yml 配置
每个应用在 corpus.yml 中为一个条目,包含以下字段:
name:应用名称,作为所有命令的键repo:仓库地址license:许可证类型license_file:许可证文件名redistributable:是否可重新分发(布尔值)- 可选字段:
upstream、fork、note、exclude_paths(排除因许可证不同而不提取的目录)
格式化由 Yerba 维护,条目按 name 字母排序,字段顺序固定,条目间空一行。
自动化工作流
- 每周漂移检查:
.github/workflows/weekly-drift.yml每周一运行,使用bin/corpus drift检查漂移。 - 漂移处理:当有移动时,克隆相应应用、更新固定提交、重新生成
erb/并创建 Pull Request。 - 不自动合并:固定提交更新需人工审核,以确保结果可比性。
- 关键监控指标:解析错误计数,属于 Herb 自己的 CI 范畴。
脚本文件
所有 CI 运行的脚本位于 bin/ 目录,可在本地预运行:
| 脚本 | 功能 |
|---|---|
bin/corpus |
管理 CLI(克隆、更新、漂移、提取、统计、测量) |
bin/check |
对 .gitmodules、corpus.yml 和 erb/MANIFEST.json 进行一致性检查 |
bin/measure-herb |
测量一个 Herb 版本在语料库上的表现 |
bin/diff-runs |
比较两次测量运行结果 |
bin/drift-report |
将 corpus drift --json 转换为步骤输出和注释 |
bin/render-pr-body |
构建每周固定提交更新 Pull Request 的正文 |
测量对比
sh bin/corpus measure --herb 0.9.4 --herb 0.10.2 # 比较两个版本 bin/corpus measure --herb 0.10.2 --gem-path ../herb # 版本与工作目录对比 bin/corpus measure --diff runs/a.json,runs/b.json # 重新对比现有运行
- 整个语料库每个版本约需 7 秒。
- 输出包含对比表格和结果有变化的文件列表。
- 可信保证:
- 测量代码位于此仓库,Herb 版本为可替换依赖。
- 使用单一固定指标:
files_with_recursive_errors(递归错误文件数)。 - 每次运行记录语料库提交,拒绝对比不同语料库状态的运行。
固定提交策略
- 每个应用跟踪其官方上游仓库的默认分支,不指向分支或包含本地补丁。
bin/corpus update将应用移动到.gitmodules中记录的分支最新提交。- 远程消失处理:
- 分支删除:改用
main分支。 - 仓库消失:将检出移出语料库(而非删除)。
bin/corpus drift报告不可达问题,每周工作流发出警告。
- 分支删除:改用
数据来源与许可
- 来源:主要来自 real-world-rails(生产环境 Rails 代码库精选集)及直接添加的应用。
- 包含类型:应用程序和 Rails 引擎,后者更依赖 partial、helper 和 i18n 插值,有助于测试不同解析路径。
- 许可证处理:
corpus.yml记录每个应用的许可证和可重新分发标志。bin/corpus extract尊重该标志,将许可证文本复制到erb/<app>/中。- 标记为
redistributable: false的应用不纳入erb/,但仍保留在apps/中供本地测试。 - 每个应用的许可证均通过阅读实际文件确认,而非仅依赖 GitHub 报告。
- 存在目录级许可证差异的应用通过
exclude_paths处理。
- 版权声明:所有应用源代码归各自作者所有,本仓库不主张所有权。





