yard-lint をCIに追加し、YARDドキュメントの品質を継続的に担保

viewcomponent/view_component

view_componentプロジェクトに yard-lint を導入し、YARDドキュメントの静的検査をCIパイプラインに組み込みました。既存の違反をあわせて修正することで、ドキュメント品質のベースラインを確立しています。

背景

Issue #2567 で指摘されていたとおり、yard-lint をローカルで実行すると多数のドキュメントエラーが検出される状態が続いていました。チェックを自動化する仕組みがなかったため、新たな違反が混入しても気付けない状況でした。

本PRはこの問題に対処するため、yard-lint をGemfileに追加し、GitHubActionsのlintワークフローに新ジョブとして組み込みました。あわせて既存のルール違反のうち修正件数が少ないものを解消し、CIをグリーンな状態でスタートさせています。

技術的な変更

CI設定と依存関係の追加

.github/workflows/lint.ymlyard-lint ジョブが追加され、bundle exec yard-lint lib/ がCIで実行されるようになりました。Gemfile には gem "yard-lint", "~> 1.5" が追加され、バージョン 1.5.1Gemfile.lock に固定されています。

yard-lint:
  runs-on: ubuntu-latest
  steps:
  - uses: actions/checkout@v4
    with:
      fetch-depth: 0
  - name: Setup Ruby
    uses: ruby/setup-ruby@v1
    with:
      ruby-version: 4.0
      bundler-cache: true
  - name: YARD Lint
    run: bundle exec yard-lint lib/

.yard-lint.yml によるルール設定

新規追加された .yard-lint.yml では、有効化するバリデーターと除外パスを明示的に設定しています。vendor/spec/test/performance/ 配下はすべてチェック対象外です。

有効化されているルールは以下のとおりです:

  • Documentation/UndocumentedBooleanMethods: booleanを返すメソッドへのドキュメント必須化
  • Documentation/MarkdownSyntax: コメント内のMarkdown構文チェック
  • Documentation/EmptyCommentLine: 空のコメント行の検出
  • Tags/Order: YARDタグの順序チェック
  • Tags/InvalidTypes: タグの型指定の妥当性チェック
  • Tags/TypeSyntax: タグの型構文チェック

一方、Documentation/UndocumentedObjectsDocumentation/MissingReturn など違反数が多いルールは Enabled: false となっており、段階的な修正を前提とした設定になっています。また FailOnSeverity: error により、error レベルの違反のみがCIを失敗させます。

既存ドキュメントの修正

今回のCIグリーン化に伴い、3ファイルで既存のYARDコメントが修正されています。

lib/view_component/compiler.rb では @param タグと @return タグの順序が入れ替わりました。yard-lint の Tags/Order ルールは @param@return の順序を要求するため、従来の @return@param の記述が違反と判定されていました。

# 変更前
# @return all matching compiled templates, in priority order based on the requested details from LookupContext
#
# @param [ActionView::TemplateDetails::Requested] requested_details i.e. locales, formats, variants

# 変更後
# @param requested_details [ActionView::TemplateDetails::Requested] i.e. locales, formats, variants
# @return all matching compiled templates, in priority order based on the requested details from LookupContext

lib/view_component/test_helpers.rb では2点の修正が行われました。@param variants@param formats の型表記が Symbol[] から Array<Symbol> に変更され、Tags/TypeSyntax に準拠した構文になっています。また render_preview メソッドのコメント内にあった通常の説明文が @note タグに変換され、Tags/Order@param@return より前にタグなし本文が来ない)を満たす形に整理されています。

lib/view_component/slot.rb では method_missing 直前の末尾空コメント行(#のみの行)が削除され、Documentation/EmptyCommentLine 違反が解消されました。

設計判断

段階的導入の方針が FailOnSeverity: error と多数のルールの無効化に表れています。全ルールを一度に有効化すると大量の違反が発生してCIが通らなくなるため、まず修正容易なルールのみを有効化し、残りは Enabled: false で先送りしています。PRの説明文にも「後で残りを整理する」という意図が明示されており、この設定ファイルは将来的なルール追加の起点として機能します。

AllValidators.YardOptions--plugin activesupport-concern を渡しているのも注目点です。ActiveSupportの Concern モジュールを多用するビューコンポーネント特有の構造を正しく解析させるため、既存の yard-activesupport-concern との連携を維持しています。

まとめ

yard-lint のCIへの組み込みにより、YARDドキュメントの品質劣化を自動的に防ぐ仕組みが整いました。段階的に無効化されているルールを順次有効化していくことで、プロジェクト全体のドキュメント品質を継続的に高めていく基盤が確立されています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
038924bf

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「総論→各論→結論」の構成が記事全体とセクションの両方で明確に適用されています。リード文、背景、技術詳細、設計判断、まとめの各要素が適切に配置されており、模範的な構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```言語:ファイルパス)とGitHubのIssue/PRリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

YARD、CI、Gemfileなどの専門用語が適切に使用されており、専門知識を持つエンジニアという対象読者に適合した内容になっています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論から各論へと展開され、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。これにより、非常に高い可読性が確保されています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているCI設定、設定ファイル、Rubyコードの変更点は、提供されたDiff情報と完全に一致しています。コードの引用は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「yard-lint」「静的検査」「バリデーター」「@param」などの技術用語が、文脈に応じて正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

YARDタグの順序変更や型構文の修正理由など、コード変更に関する技術的な説明は論理的かつ正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Issue番号、段階的導入の方針など)は、PRのDescriptionやDiff内のコードによって裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2625)、Issue番号(#2567)、Gemのバージョン番号(~> 1.5, 1.5.1)など、すべての数値と固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRの主題である「yard-lintのセットアップ」を、「品質を継続的に担保する」という目的と合わせて的確に表現しており、PR内容と完全に一致しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事に含まれる情報はすべてPRで提供された情報に基づいており、サポート状況やリリース日程といったPR外の知識の追記はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

PR Descriptionにある「後で整理する(tidy up more of them later)」という将来の計画が、記事内で「段階的な修正を前提としている」と正確に表現されており、時間表現の歪曲はありません。