# バッチ設計書 46-cache_digests:dependencies

## 概要

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

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

`cache_digests:dependencies` タスクは、Railsのフラグメントキャッシュにおいて、指定されたビューテンプレートが直接依存するテンプレート（パーシャル等）を解析し、JSON形式で出力するユーティリティタスクである。ネストされた依存関係は含まず、直接の依存関係のみを表示する。

**業務上の目的・背景**：フラグメントキャッシュのデバッグにおいて、テンプレートが直接参照しているパーシャルを確認することは重要である。`cache_digests:nested_dependencies` が再帰的な依存関係を表示するのに対し、本タスクは第一レベルの依存関係のみを簡潔に表示する。これにより、テンプレートの直接的な構造を把握しやすくなり、キャッシュ問題の原因特定が容易になる。

**バッチの実行タイミング**：手動実行が主体であり、以下のような場面で使用される。
- テンプレートが直接参照しているパーシャルの確認
- キャッシュ無効化の原因調査
- ビューの構造把握

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

**前後の処理との関連**：本タスクは読み取り専用であり、他のタスクとの依存関係はない。`cache_digests:nested_dependencies` タスクが再帰的な依存関係を表示するのに対し、本タスクは直接の依存関係のみを表示する。

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

## バッチ種別

情報表示 / デバッグ支援

## 実行スケジュール

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

## 実行条件

### 前提条件

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

### 実行可否判定

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

## 入力仕様

### 入力パラメータ

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

### 入力データソース

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

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | JSON | 第一レベルの依存関係の名前リスト |

### 出力ファイル仕様

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

出力例：
```json
[
  "comments/comment",
  "shared/timestamp",
  "users/avatar"
]
```

## 処理フロー

### 処理シーケンス

```
1. TEMPLATE 環境変数の確認
   └─ 未設定の場合は abort で処理中止
2. テンプレート名の正規化
   └─ "." で分割して最初の部分（拡張子除去）を取得
3. finder の取得
   └─ ApplicationController.new.lookup_context を使用
4. 依存関係ツリーの構築
   └─ ActionView::Digestor.tree(template_name, finder) を呼び出し
5. 子要素の名前抽出
   └─ tree.children.map(&:name) で名前リストを生成
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(&:name) で名前抽出]
    G --> H[JSON.pretty_generate で整形]
    H --> I[puts で出力]
    I --> J[バッチ終了]
```

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

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

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

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

### 障害時対応

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

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1テンプレート |
| 目標処理時間 | 1秒以内 |
| メモリ使用量上限 | 最小限 |

## 排他制御

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

## ログ出力

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

## 監視・アラート

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

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

## 備考

- `cache_digests:nested_dependencies` は再帰的な全依存関係を表示する姉妹タスク
- 本タスクは直接の依存関係のみを表示するため、出力がシンプル
- テンプレート名の指定例: `messages/show`, `comments/_comment.html`
- 依存関係がない場合は空の配列 `[]` が出力される
