# バッチ設計書 45-cache_digests:nested_dependencies

## 概要

本ドキュメントは、指定されたテンプレートのネストされた依存関係を検索して表示するRakeタスク `cache_digests:nested_dependencies` の設計仕様を定義する。

### 本バッチの処理概要

`cache_digests:nested_dependencies` タスクは、Railsのフラグメントキャッシュにおいて、指定されたビューテンプレートが依存するすべてのネストされたテンプレート（パーシャル等）を再帰的に解析し、JSON形式で出力するユーティリティタスクである。

**業務上の目的・背景**：Railsのフラグメントキャッシュは、ビューテンプレートの内容に基づいてキャッシュキーを自動生成する。テンプレートが他のパーシャルを呼び出している場合、それらの依存関係も考慮してキャッシュキーが計算される。本タスクは、テンプレートの依存関係ツリー全体を可視化することで、キャッシュの無効化が予期せぬタイミングで発生する問題のデバッグや、キャッシュ戦略の設計に役立つ。パフォーマンスチューニングやキャッシュ関連の問題調査において重要な情報を提供する。

**バッチの実行タイミング**：手動実行が主体であり、以下のような場面で使用される。
- キャッシュの無効化が予期しないタイミングで発生する問題の調査
- フラグメントキャッシュの依存関係の把握
- パフォーマンスチューニング時のキャッシュ戦略検討

**主要な処理内容**：
1. TEMPLATE環境変数から対象テンプレート名を取得
2. 環境変数が未設定の場合は処理を中止
3. テンプレート名から拡張子を除去
4. ApplicationControllerのlookup_contextを使用してテンプレートを検索
5. ActionView::Digestor.treeを使用して依存関係ツリーを構築
6. ツリーの子要素に対してto_dep_mapを呼び出し
7. 結果をJSON形式で標準出力に表示

**前後の処理との関連**：本タスクは読み取り専用であり、他のタスクとの依存関係はない。`cache_digests:dependencies` タスクが第一レベルの依存関係のみを表示するのに対し、本タスクはネストされた全依存関係を表示する。

**影響範囲**：本タスクはテンプレートファイルを読み取るのみであり、ファイルの変更やデータベースへの操作は一切行わない。

## バッチ種別

情報表示 / デバッグ支援

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動実行） |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | 手動（bin/rails cache_digests:nested_dependencies TEMPLATE=xxx） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| TEMPLATE環境変数 | 対象テンプレート名が指定されていること |
| テンプレートファイル | 指定されたテンプレートが存在すること |
| Rails環境 | Railsアプリケーションがロードされていること |

### 実行可否判定

TEMPLATE環境変数が設定されていない場合は、エラーメッセージを出力して処理を中止する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| TEMPLATE | String | Yes | なし | 対象テンプレート名（例: messages/show, comments/_comment.html） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| app/views/**/*.erb | ERB | ビューテンプレートファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | JSON | ネストされた依存関係のマップ |

### 出力ファイル仕様

ファイル出力なし。標準出力へのJSON表示のみ。

出力例：
```json
[
  {
    "name": "comments/comment",
    "children": [
      {
        "name": "users/avatar",
        "children": []
      }
    ]
  },
  {
    "name": "shared/timestamp",
    "children": []
  }
]
```

## 処理フロー

### 処理シーケンス

```
1. TEMPLATE 環境変数の確認
   └─ 未設定の場合は abort で処理中止
2. テンプレート名の正規化
   └─ "." で分割して最初の部分（拡張子除去）を取得
3. finder の取得
   └─ ApplicationController.new.lookup_context を使用
4. 依存関係ツリーの構築
   └─ ActionView::Digestor.tree(template_name, finder) を呼び出し
5. 子要素の変換
   └─ tree.children.map(&:to_dep_map) で依存関係マップを生成
6. JSON 出力
   └─ JSON.pretty_generate で整形して puts 出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{TEMPLATE 設定あり？}
    B -->|No| C[abort: エラーメッセージ表示]
    B -->|Yes| D[テンプレート名を正規化]
    D --> E[lookup_context 取得]
    E --> F[Digestor.tree でツリー構築]
    F --> G[children.map で依存関係マップ生成]
    G --> H[JSON.pretty_generate で整形]
    H --> I[puts で出力]
    I --> J[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | - | - | データベース操作なし |

### テーブル別操作詳細

データベース操作は行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータ不足 | TEMPLATEが未設定 | TEMPLATE環境変数を設定 |
| - | テンプレート不存在 | 指定テンプレートが見つからない | テンプレート名を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

### 障害時対応

TEMPLATE環境変数を正しく設定し、テンプレートファイルが存在することを確認する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし |
| コミットタイミング | なし |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1テンプレート（ネストされた依存関係数に依存） |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 依存関係の深さに依存 |

## 排他制御

同時実行可能。読み取り専用のため排他制御不要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | 処理完了時 | 依存関係のJSONデータ |
| 標準エラー | エラー時 | エラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| - | - | - |

本タスクは手動実行が主であり、監視は不要。

## 備考

- テンプレート名の指定例: `messages/show`, `comments/_comment.html`, `layouts/application`
- `cache_digests:dependencies` は第一レベルの依存関係のみを表示する姉妹タスク
- ActionView::Digestorはフラグメントキャッシュのキー生成にも使用される
- 循環参照がある場合の動作は、ActionView::Digestorの実装に依存する
