diff --git a/.claude/rules/coding-style.md b/.claude/rules/coding-style.md new file mode 100644 index 0000000..42ed3a7 --- /dev/null +++ b/.claude/rules/coding-style.md @@ -0,0 +1,69 @@ +--- +paths: ["**/*.py"] +--- + +# コーディング規約 (Coding Standards) + +Python コード(`src/`・`scripts/`・`tests/`)を書く・編集するときは常に本ルールに従うこと. + +基本方針として PEP 8 および Ruff の自動チェックに準拠する.本ガイドでは PEP 8 でカバーされないプロジェクト固有のルールのみ定義する. + +## フォーマット (Formatting) + +- フォーマッター・リンター: Ruff(`ruff.toml` で設定済み) +- 行長: 88 文字(`ruff.toml` で設定済み) +- クォート: ダブルクォート `"` + +## 命名規則 (Naming) + +PEP 8 に準拠する. + +| 対象 | 形式 | 例 | +| --- | --- | --- | +| モジュール | `snake_case` | `uniformity.py` | +| 関数・変数 | `snake_case` | `calc_cov` | +| 定数 | `UPPER_SNAKE_CASE` | `DEFAULT_ROI_SIZE` | +| クラス | `PascalCase` | `UniformityResult` | + +## import 順序 (Import Order) + +Ruff(`isort` 互換)で自動整列する.順序: + +1. 標準ライブラリ +2. サードパーティ(numpy,cv2,colour 等) +3. プロジェクト内モジュール + +## 型ヒント (Type Hints) + +- 関数の引数と戻り値に型ヒントを付ける +- NumPy 配列は `numpy.ndarray` を使用する + +```python +def calc_cov(image: numpy.ndarray) -> float: +``` + +## コメント (Comments) + +- 「何をしているか」ではなく「なぜそうしているか」を書く +- 論文・規格への参照がある場合はコメントに明記する + +```python +# CIE ΔE2000 を使用(CIEDE2000, CIE 142-2001) +delta_e = colour.delta_E(lab1, lab2, method="CIE 2000") +``` + +## docstring + +- 公開関数には Google スタイルの docstring を付ける + +```python +def load_image(path: str) -> numpy.ndarray: + """PNG 画像を読み込み RGB 配列として返す. + + Args: + path: 画像ファイルのパス. + + Returns: + RGB 画像の NumPy 配列(H x W x 3, uint8). + """ +``` diff --git a/.claude/rules/error-handling.md b/.claude/rules/error-handling.md new file mode 100644 index 0000000..4109823 --- /dev/null +++ b/.claude/rules/error-handling.md @@ -0,0 +1,44 @@ +--- +paths: ["src/**", "scripts/**"] +--- + +# エラーハンドリング方針 (Error Handling) + +ソースコード・実行スクリプトで例外処理・入力検証・ログ出力を書くときは本ルールに従うこと. + +## 基本方針 (Principle) + +- 研究用のローカル実行ツールのため,過度な防御的プログラミングは行わない +- エラーは早期に検出し,原因がわかるメッセージで失敗させる + +## エラーの分類 (Error Categories) + +| 分類 | 例 | 対処 | +| --- | --- | --- | +| 入力エラー | 画像ファイルが存在しない,形式が不正 | メッセージを出して即終了 | +| 計算エラー | ゼロ除算,配列サイズ不一致 | 原因を特定できるメッセージで例外を送出 | +| 出力エラー | 書き込み先ディレクトリが存在しない | ディレクトリを自動作成する | + +## 実装ルール (Rules) + +- 入力の検証は **システム境界**(画像読み込み時)で行う + +```python +def load_image(path: str) -> numpy.ndarray: + if not Path(path).exists(): + raise FileNotFoundError(f"画像ファイルが見つかりません: {path}") +``` + +- 内部関数間では型や値の検証を重複させない +- `print` ではなく例外で失敗を通知する +- 例外は握りつぶさない(空の `except:` 禁止) + +## ログ出力 (Logging) + +- 現時点では `print` による簡易出力で十分とする +- 処理の開始・完了を表示する程度にとどめる + +```python +print(f"解析開始: {image_path}") +print(f"結果を保存しました: {output_path}") +``` diff --git a/.claude/rules/project-structure.md b/.claude/rules/project-structure.md new file mode 100644 index 0000000..8ff0fcd --- /dev/null +++ b/.claude/rules/project-structure.md @@ -0,0 +1,44 @@ +--- +paths: ["src/**", "scripts/**", "tests/**", "config/**"] +--- + +# ディレクトリ構造規則 (Directory Structure) + +ファイルを新規作成・移動するときは本ルールの配置に従うこと. + +## プロジェクトルート (Project Root) + +```text +SmTIAS-Evaluation/ +├── src/ # ソースコード +│ ├── io/ # 画像の読み込み +│ ├── analysis/ # 解析ロジック +│ ├── visualization/ # 可視化 +│ └── export/ # 結果出力 +├── scripts/ # 実行スクリプト +├── config/ # 解析設定(ROI 定義 `roi_config.json` 等) +├── tests/ # テストコード(`scripts/` のテストは `tests/scripts/`) +├── data/ # 入力画像(Git 管理外) +├── output/ # 解析結果(Git 管理外) +└── docs/ # ドキュメント +``` + +## 配置ルール (Placement Rules) + +| 種類 | 配置先 | 備考 | +| --- | --- | --- | +| 解析ロジック | `src/` 配下の該当パッケージ | 1 モジュール = 1 責務 | +| 実行スクリプト | `scripts/` | CLI のエントリーポイント | +| テスト | `tests/` | `src/` の構造に対応させる | +| 入力画像 | `data/{装置名}/{撮影物}/` | 例: `data/smtias/whiteboard/` | +| 出力結果 | `output/figures/`,`output/results/` | 図は PNG,数値は CSV | +| 設定ファイル | プロジェクトルート | `pyproject.toml`,`ruff.toml` 等 | + +## テストの対応関係 (Test Mapping) + +`tests/` は `src/` のディレクトリ構造に対応させる. + +```text +src/analysis/uniformity.py → tests/analysis/test_uniformity.py +src/io/loader.py → tests/io/test_loader.py +``` diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md new file mode 100644 index 0000000..829edff --- /dev/null +++ b/.claude/rules/testing.md @@ -0,0 +1,53 @@ +--- +paths: ["tests/**"] +--- + +# テスト方針 (Testing Strategy) + +テストを書く・編集するときは常に本ルールに従うこと. + +## テストフレームワーク (Framework) + +- pytest を使用する(`pyproject.toml` で設定済み) + +## テストの種類 (Test Types) + +| 種類 | 対象 | 例 | +| --- | --- | --- | +| ユニットテスト | 個々の関数・モジュール | `calc_cov` が既知の配列で正しい値を返す | +| 統合テスト | パイプライン全体の連結 | 画像読み込みから CSV 出力まで通しで動く | + +## テスト対象の優先度 (Priority) + +1. **解析ロジック**(`uniformity.py`,`color.py`)— 数値の正しさが論文の信頼性に直結する +2. **入出力**(`loader.py`,`exporter.py`)— 形式変換のミスを防ぐ +3. **可視化**(`plotter.py`)— 出力ファイルが生成されることを確認する程度でよい + +## テストデータ (Test Data) + +- 小さなテスト用画像(例: 8x8 px)を `tests/fixtures/` に配置する +- 既知の値を持つ合成画像で期待値と比較する + +```python +# 例: 均一な白画像(全ピクセル 200)→ CoV = 0.0 +uniform_image = numpy.full((8, 8), 200, dtype=numpy.uint8) +assert calc_cov(uniform_image) == 0.0 +``` + +## 実行方法 (Execution) + +```bash +# 全テスト実行 +pytest + +# 特定のテストファイル +pytest tests/analysis/test_uniformity.py + +# 詳細出力 +pytest -v +``` + +## カバレッジ基準 (Coverage) + +- 解析ロジック(`src/analysis/`): 主要関数を網羅する +- 厳密なカバレッジ率は設けない(研究用プロジェクトのため) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f8a59b4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,27 @@ +# 依存パッケージの定期更新 PR(Dependabot version updates) +# 脆弱性検出(Dependabot alerts / security updates)はリポジトリ設定で有効化済み(本ファイルとは独立に動く) +version: 2 +updates: + # requirements.txt / requirements-dev.txt / pyproject.toml + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 5 + commit-message: + prefix: "[update]" + groups: + minor-and-patch: + update-types: + - "minor" + - "patch" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + commit-message: + prefix: "[update]" + groups: + actions: + patterns: + - "*" diff --git a/CLAUDE.md b/CLAUDE.md index 058fa4e..25a104b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ ## 必須ルール(コード実装時) -- コーディング規約は GUIDE_06,テスト方針は GUIDE_08,エラーハンドリングは GUIDE_09 を参照 +- コーディング規約・ディレクトリ構成・テスト方針・エラーハンドリングは `.claude/rules/`(coding-style / project-structure / testing / error-handling)に path-scoped rule として定義されている(該当ファイル編集時に自動ロードされる) ### Git 運用 @@ -71,17 +71,15 @@ - プロジェクト立ち上げフロー: docs/01_GUIDE/GUIDE_01_プロジェクト立ち上げフロー.md - エージェント運用ルール: docs/01_GUIDE/GUIDE_02_エージェント運用ルール.md -- コーディング規約: docs/01_GUIDE/GUIDE_06_コーディング規約.md -- ディレクトリ構造規則: docs/01_GUIDE/GUIDE_07_ディレクトリ構造規則.md -- テスト方針: docs/01_GUIDE/GUIDE_08_テスト方針.md -- エラーハンドリング方針: docs/01_GUIDE/GUIDE_09_エラーハンドリング方針.md - ※ Git 規約・ドキュメント書式・命名規則・進捗記録・テンプレート改変記録は `.claude/rules/`(git-conventions / markdown-style / docs-naming / progress-log / template-customization)に定義されている(git-conventions は常時,他は該当ファイル編集時に自動ロード) +- ※ コーディング規約・ディレクトリ構成・テスト方針・エラーハンドリングは `.claude/rules/`(coding-style / project-structure / testing / error-handling)に定義されている(該当ファイル編集時に自動ロード) ### 02_ENV(環境) - 技術スタック: docs/02_ENV/ENV_01_技術スタック.md - 環境構築手順: docs/02_ENV/ENV_02_環境構築手順.md - 管理者用環境構築手順: docs/02_ENV/ENV_03_管理者用環境構築手順.md +- 開発コマンド: docs/02_ENV/ENV_04_開発コマンド.md ### 03_PLAN(計画) diff --git "a/docs/01_GUIDE/GUIDE_06_\343\202\263\343\203\274\343\203\207\343\202\243\343\203\263\343\202\260\350\246\217\347\264\204.md" "b/docs/01_GUIDE/GUIDE_06_\343\202\263\343\203\274\343\203\207\343\202\243\343\203\263\343\202\260\350\246\217\347\264\204.md" deleted file mode 100644 index c649ff5..0000000 --- "a/docs/01_GUIDE/GUIDE_06_\343\202\263\343\203\274\343\203\207\343\202\243\343\203\263\343\202\260\350\246\217\347\264\204.md" +++ /dev/null @@ -1,63 +0,0 @@ -# コーディング規約 (Coding Standards) - -基本方針として PEP 8 および Ruff の自動チェックに準拠する.本ガイドでは PEP 8 でカバーされないプロジェクト固有のルールのみ定義する. - -## フォーマット (Formatting) - -- フォーマッター・リンター: Ruff(`ruff.toml` で設定済み) -- 行長: 88 文字(`ruff.toml` で設定済み) -- クォート: ダブルクォート `"` - -## 命名規則 (Naming) - -PEP 8 に準拠する. - -| 対象 | 形式 | 例 | -| --- | --- | --- | -| モジュール | `snake_case` | `uniformity.py` | -| 関数・変数 | `snake_case` | `calc_cov` | -| 定数 | `UPPER_SNAKE_CASE` | `DEFAULT_ROI_SIZE` | -| クラス | `PascalCase` | `UniformityResult` | - -## import 順序 (Import Order) - -Ruff(`isort` 互換)で自動整列する.順序: - -1. 標準ライブラリ -2. サードパーティ(numpy,cv2,colour 等) -3. プロジェクト内モジュール - -## 型ヒント (Type Hints) - -- 関数の引数と戻り値に型ヒントを付ける -- NumPy 配列は `numpy.ndarray` を使用する - -```python -def calc_cov(image: numpy.ndarray) -> float: -``` - -## コメント (Comments) - -- 「何をしているか」ではなく「なぜそうしているか」を書く -- 論文・規格への参照がある場合はコメントに明記する - -```python -# CIE ΔE2000 を使用(CIEDE2000, CIE 142-2001) -delta_e = colour.delta_E(lab1, lab2, method="CIE 2000") -``` - -## docstring - -- 公開関数には Google スタイルの docstring を付ける - -```python -def load_image(path: str) -> numpy.ndarray: - """PNG 画像を読み込み RGB 配列として返す. - - Args: - path: 画像ファイルのパス. - - Returns: - RGB 画像の NumPy 配列(H x W x 3, uint8). - """ -``` diff --git "a/docs/01_GUIDE/GUIDE_07_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\351\200\240\350\246\217\345\211\207.md" "b/docs/01_GUIDE/GUIDE_07_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\351\200\240\350\246\217\345\211\207.md" deleted file mode 100644 index 3e1c4ac..0000000 --- "a/docs/01_GUIDE/GUIDE_07_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\351\200\240\350\246\217\345\211\207.md" +++ /dev/null @@ -1,38 +0,0 @@ -# ディレクトリ構造規則 (Directory Structure) - -## プロジェクトルート (Project Root) - -```text -SmTIAS-Evaluation/ -├── src/ # ソースコード -│ ├── io/ # 画像の読み込み -│ ├── analysis/ # 解析ロジック -│ ├── visualization/ # 可視化 -│ └── export/ # 結果出力 -├── scripts/ # 実行スクリプト -├── tests/ # テストコード -├── data/ # 入力画像(Git 管理外) -├── output/ # 解析結果(Git 管理外) -├── docs/ # ドキュメント -└── SmTIAS/ # 参照用コピー(Git 管理外) -``` - -## 配置ルール (Placement Rules) - -| 種類 | 配置先 | 備考 | -| --- | --- | --- | -| 解析ロジック | `src/` 配下の該当パッケージ | 1 モジュール = 1 責務 | -| 実行スクリプト | `scripts/` | CLI のエントリーポイント | -| テスト | `tests/` | `src/` の構造に対応させる | -| 入力画像 | `data/{装置名}/{撮影物}/` | 例: `data/smtias/whiteboard/` | -| 出力結果 | `output/figures/`,`output/results/` | 図は PNG,数値は CSV | -| 設定ファイル | プロジェクトルート | `pyproject.toml`,`ruff.toml` 等 | - -## テストの対応関係 (Test Mapping) - -`tests/` は `src/` のディレクトリ構造に対応させる. - -```text -src/analysis/uniformity.py → tests/analysis/test_uniformity.py -src/io/loader.py → tests/io/test_loader.py -``` diff --git "a/docs/01_GUIDE/GUIDE_08_\343\203\206\343\202\271\343\203\210\346\226\271\351\207\235.md" "b/docs/01_GUIDE/GUIDE_08_\343\203\206\343\202\271\343\203\210\346\226\271\351\207\235.md" deleted file mode 100644 index 35eb0ad..0000000 --- "a/docs/01_GUIDE/GUIDE_08_\343\203\206\343\202\271\343\203\210\346\226\271\351\207\235.md" +++ /dev/null @@ -1,47 +0,0 @@ -# テスト方針 (Testing Strategy) - -## テストフレームワーク (Framework) - -- pytest を使用する(`pyproject.toml` で設定済み) - -## テストの種類 (Test Types) - -| 種類 | 対象 | 例 | -| --- | --- | --- | -| ユニットテスト | 個々の関数・モジュール | `calc_cov` が既知の配列で正しい値を返す | -| 統合テスト | パイプライン全体の連結 | 画像読み込みから CSV 出力まで通しで動く | - -## テスト対象の優先度 (Priority) - -1. **解析ロジック**(`uniformity.py`,`color.py`)— 数値の正しさが論文の信頼性に直結する -2. **入出力**(`loader.py`,`exporter.py`)— 形式変換のミスを防ぐ -3. **可視化**(`plotter.py`)— 出力ファイルが生成されることを確認する程度でよい - -## テストデータ (Test Data) - -- 小さなテスト用画像(例: 8x8 px)を `tests/fixtures/` に配置する -- 既知の値を持つ合成画像で期待値と比較する - -```python -# 例: 均一な白画像(全ピクセル 200)→ CoV = 0.0 -uniform_image = numpy.full((8, 8), 200, dtype=numpy.uint8) -assert calc_cov(uniform_image) == 0.0 -``` - -## 実行方法 (Execution) - -```bash -# 全テスト実行 -pytest - -# 特定のテストファイル -pytest tests/analysis/test_uniformity.py - -# 詳細出力 -pytest -v -``` - -## カバレッジ基準 (Coverage) - -- 解析ロジック(`src/analysis/`): 主要関数を網羅する -- 厳密なカバレッジ率は設けない(研究用プロジェクトのため) diff --git "a/docs/01_GUIDE/GUIDE_09_\343\202\250\343\203\251\343\203\274\343\203\217\343\203\263\343\203\211\343\203\252\343\203\263\343\202\260\346\226\271\351\207\235.md" "b/docs/01_GUIDE/GUIDE_09_\343\202\250\343\203\251\343\203\274\343\203\217\343\203\263\343\203\211\343\203\252\343\203\263\343\202\260\346\226\271\351\207\235.md" deleted file mode 100644 index 124c58e..0000000 --- "a/docs/01_GUIDE/GUIDE_09_\343\202\250\343\203\251\343\203\274\343\203\217\343\203\263\343\203\211\343\203\252\343\203\263\343\202\260\346\226\271\351\207\235.md" +++ /dev/null @@ -1,38 +0,0 @@ -# エラーハンドリング方針 (Error Handling) - -## 基本方針 (Principle) - -- 研究用のローカル実行ツールのため,過度な防御的プログラミングは行わない -- エラーは早期に検出し,原因がわかるメッセージで失敗させる - -## エラーの分類 (Error Categories) - -| 分類 | 例 | 対処 | -| --- | --- | --- | -| 入力エラー | 画像ファイルが存在しない,形式が不正 | メッセージを出して即終了 | -| 計算エラー | ゼロ除算,配列サイズ不一致 | 原因を特定できるメッセージで例外を送出 | -| 出力エラー | 書き込み先ディレクトリが存在しない | ディレクトリを自動作成する | - -## 実装ルール (Rules) - -- 入力の検証は **システム境界**(画像読み込み時)で行う - -```python -def load_image(path: str) -> numpy.ndarray: - if not Path(path).exists(): - raise FileNotFoundError(f"画像ファイルが見つかりません: {path}") -``` - -- 内部関数間では型や値の検証を重複させない -- `print` ではなく例外で失敗を通知する -- 例外は握りつぶさない(空の `except:` 禁止) - -## ログ出力 (Logging) - -- 現時点では `print` による簡易出力で十分とする -- 処理の開始・完了を表示する程度にとどめる - -```python -print(f"解析開始: {image_path}") -print(f"結果を保存しました: {output_path}") -``` diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index 96a4b6c..1f8af47 100644 --- "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -5,6 +5,9 @@ - Python 3.11 以上がインストール済みであること - Git がインストール済みであること - GitHub CLI (`gh`) がインストール済みであること +- `bash` が使えること(Windows では Git for Windows 付属の Git Bash).Claude Code のフック(`.claude/settings.json`)は `bash .claude/hooks/run_python.sh` 経由で Python を起動するため,Python と bash のどちらかが欠けるとリポジトリ外アクセス制限フックがファイル操作をすべてブロックする + +日常の開発コマンド(テスト・lint・解析スクリプト)は [ENV_04](ENV_04_開発コマンド.md) を参照. ## 手順 (Steps) diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index 2a32cbc..ddb6049 100644 --- "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -6,6 +6,23 @@ ※ 作成済み +## GitHub リポジトリのセキュリティ設定 (Security Settings) + +Dependabot alerts(既知脆弱性の検出)と Dependabot security updates(修正 PR の自動作成)はリポジトリごとに既定で OFF のため,`gh` で有効化する(admin 権限が必要.冪等なので再実行してよい). + +※ 2026-09-29 に有効化済み + +```bash +gh api -X PUT repos/rintoHasegawa/SmTIAS-Evaluation/vulnerability-alerts +gh api -X PUT repos/rintoHasegawa/SmTIAS-Evaluation/automated-security-fixes + +# 検証(前者は 204 なら有効・404 なら無効,後者は "enabled":true なら有効) +gh api repos/rintoHasegawa/SmTIAS-Evaluation/vulnerability-alerts -i +gh api repos/rintoHasegawa/SmTIAS-Evaluation/automated-security-fixes +``` + +依存パッケージの定期更新 PR(Dependabot version updates)は `.github/dependabot.yml` で設定する(pip・github-actions を週 1 回,マイナー/パッチは 1 PR にまとめる).Dependabot の PR と alert は `/deps-update` で処理する. + ## 設定ファイルの配置 (Configuration Files) 以下のファイルをリポジトリルートに配置する. @@ -17,6 +34,7 @@ | `.gitignore` | Git 管理対象外の定義 | | `ruff.toml` | Ruff(リンター・フォーマッター)の設定 | | `pyproject.toml` | プロジェクトメタデータ・pytest 設定 | +| `.github/dependabot.yml` | 依存パッケージの定期更新 PR の設定 | ## 初期ディレクトリの作成 (Create Directories) diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" new file mode 100644 index 0000000..851fd98 --- /dev/null +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -0,0 +1,57 @@ +# 開発コマンド (Development Commands) + +日常の開発で使うコマンドの一覧.人間とエージェントがコマンドを推測せずに済むよう,ここを唯一の参照先とする.コマンドが確定・変更されたら本ファイルに反映する. + +※ すべてプロジェクトルートで,仮想環境(`.venv`)を有効化した状態で実行する(構築手順は [ENV_02](ENV_02_環境構築手順.md)).グローバルの Python には pytest 等が入っていない場合がある. + +## テスト (Test) + +```bash +# 全テスト(testpaths = tests は pyproject.toml で設定済み) +pytest + +# 特定のテストファイル・詳細出力 +pytest tests/analysis/test_uniformity.py +pytest -v +``` + +テストの書き方は `.claude/rules/testing.md` を参照. + +## Lint・フォーマット (Lint & Format) + +```bash +# lint(設定は ruff.toml) +ruff check . + +# 自動修正・フォーマット +ruff check . --fix +ruff format . +``` + +## 解析スクリプト (Analysis Scripts) + +```bash +# PNG の照明均一性評価(単一画像 / ディレクトリ一括) +python scripts/run_uniformity.py --image data/smtias/whiteboard/xxx.png +python scripts/run_uniformity.py --image data/smtias/whiteboard/ + +# DNG の照明均一性評価 +python scripts/run_uniformity_dng.py --image data/smtias/quantitative/xxx.dng + +# ROI の対話的選択(config/roi_config.json に保存) +python scripts/select_roi.py --image data/smtias/whiteboard/xxx.png --key smtias.whiteboard + +# 結果ビューア +streamlit run scripts/viewer.py +``` + +- `scripts/compare_*.py`・`plot_radial_clean.py` 等の比較・作図スクリプトは,各ファイル冒頭の docstring「使い方」を参照する +- 入力は `data/`,出力は `output/`(いずれも Git 管理外) + +## Claude Code フックのテスト (Hook Tests) + +`.claude/hooks/` のフックを変更した場合,またはテンプレート同期後に実行する(標準ライブラリのみで動く). + +```bash +python -m unittest discover -s .claude/hooks/tests -p "test_*.py" +``` diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index a6167c9..6d5b8cb 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -46,3 +46,7 @@ - **失敗の再発(写り込み)**: 下のみ `134105` の ROI 下端(y≈1391–1408, x≈68–611, 面積比 0.14%)に遮光テープが写り込み min 依存指標が無効化(max/min 11.5).写り込み行除外の参考値 CoV 0.0576・max/min 1.560 を報告書に併記.TEST_04 で提起した「フレーム外で遮光」運用が徹底されず → SPEC_03 への手順明文化を推奨として記載. - **スクリプト**: `compare_single_leds.py` を CLI 引数化(`--bottom/--left/--right/--output/--title-suffix`,既定値は従来撮影で挙動不変).`compare_composite_vs_sum.py` を新規追加(実測/加算の共通スケール並置+比マップ+動径重ね描き+指標表).出力は `compare_single_leds_w1p4.png`・`compare_composite_vs_sum_w1p4.png`. - **筐体直接比較(w0.5 vs w1.4,追加実施)**: `compare_loft_housings.py` を新規追加し,全灯(比マップ付き)と単灯(2×3 並置+動径重ね描き 6 本)を筐体間で直接比較.画素比 w1.4/w0.5 は中央値 1.131・[p5,p95]=[1.090,1.172] で,**増光は像面上側の暗部で最大(+15〜17%)・中心明部で最小(+9%)**.暗部の選択的持ち上げが CoV 微改善の実体と判明.出力 `compare_loft_housings_{all,singles}.png`. + +- [x] **テンプレート同期(2026-09-29)**: programming-template の最新版(commands → skills 移行,規約の `.claude/rules/` 化,solo/team モード,ops-runner 等のエージェント,ntfy 通知フック)を取り込み,プロジェクト側を新構成へ追従. + - **設計判断**: プロジェクト固有の GUIDE_06〜09(コーディング規約・ディレクトリ構造・テスト方針・エラーハンドリング)を path-scoped rule(`.claude/rules/{coding-style,project-structure,testing,error-handling}.md`)へ移行.docs に置くと読ませ忘れが起きるが,rule なら該当ファイル編集時に自動ロードされるため.内容は据え置き(構造図のみ実態に合わせ `config/` 追加・廃止済み `SmTIAS/` 参照コピーを削除). + - **追加**: 開発コマンド一覧 `ENV_04` を新設.GitHub の Dependabot alerts / security updates を有効化し `.github/dependabot.yml`(pip・github-actions,週 1)を追加.`.claude/project-mode` は solo. diff --git a/tests/analysis/test_radial_min_max.py b/tests/analysis/test_radial_min_max.py index 303c705..396f961 100644 --- a/tests/analysis/test_radial_min_max.py +++ b/tests/analysis/test_radial_min_max.py @@ -17,7 +17,7 @@ - export_spatial_summary が新指標を CSV に書き出せること -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - numpy で合成した既知のプロファイルで期待値と比較する """ @@ -565,7 +565,7 @@ class TestPlotRadialProfileMinMaxMarkers: """plot_radial_profile に最大/最小マーカーと注記が追加された仕様検証テスト群. - テスト方針: 可視化テストは「出力ファイルが生成されること程度でよい」(GUIDE_08). + テスト方針: 可視化テストは「出力ファイルが生成されること程度でよい」(.claude/rules/testing.md). ここではファイル生成確認と、既知のプロファイルで例外が発生しないことを確認する. """ diff --git a/tests/analysis/test_registration.py b/tests/analysis/test_registration.py index cc8bf93..c69c469 100644 --- a/tests/analysis/test_registration.py +++ b/tests/analysis/test_registration.py @@ -15,7 +15,7 @@ - 負のシフト → 下端・右端が False - 無効ピクセル幅は ceil(|shift|) 行/列 -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - numpy で合成した画像を使用し,実画像に依存しない - 既知のシフト量で推定値を検証する diff --git a/tests/analysis/test_reproducibility.py b/tests/analysis/test_reproducibility.py index 6256db0..810fc09 100644 --- a/tests/analysis/test_reproducibility.py +++ b/tests/analysis/test_reproducibility.py @@ -18,7 +18,7 @@ std_ssim_registered, mean_shift_magnitude, max_shift_magnitude, n_pairs - 2 枚未満で ValueError -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - numpy で合成した画像を使用し,実画像に依存しない """ diff --git a/tests/analysis/test_spatial.py b/tests/analysis/test_spatial.py index c0d5193..48696b6 100644 --- a/tests/analysis/test_spatial.py +++ b/tests/analysis/test_spatial.py @@ -7,7 +7,7 @@ - calc_radial_profile: 放射状プロファイル(num_bins x 2) - calc_spatial_uniformity: ファサード関数 -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - numpy で合成した画像を使用 - 既知の値で期待値と比較 diff --git a/tests/analysis/test_uniformity.py b/tests/analysis/test_uniformity.py index 6af3aca..51f8781 100644 --- a/tests/analysis/test_uniformity.py +++ b/tests/analysis/test_uniformity.py @@ -4,7 +4,7 @@ - to_grayscale: RGB 画像を Rec.709 輝度係数でグレースケールに変換する - calc_uniformity: CoV, std, max_min_ratio, mean, max, min を算出する -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - numpy で合成した画像を使用 - 既知の値で期待値と比較 diff --git a/tests/export/test_exporter.py b/tests/export/test_exporter.py index 9167c2d..ea841a2 100644 --- a/tests/export/test_exporter.py +++ b/tests/export/test_exporter.py @@ -5,7 +5,7 @@ - export_summary: バッチ結果を集約 CSV 出力 - ensure_output_dirs: output/figures/ と output/results/ を作成 -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - tmp_path フィクスチャで一時ディレクトリを利用 """ diff --git a/tests/io/test_dng_loader.py b/tests/io/test_dng_loader.py index 3d91275..094c4f1 100644 --- a/tests/io/test_dng_loader.py +++ b/tests/io/test_dng_loader.py @@ -9,7 +9,7 @@ - エラー: FileNotFoundError(存在しないパス), ValueError(不正 format/demosaic) - Rec.709 係数 (0.2126, 0.7152, 0.0722) は uniformity.py の REC709_COEFF_* と一致すること -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - サンプル DNG は .gitignore 対象のため不在時は pytest.mark.skipif でスキップ - 合成 DNG(rawpy モック)または実 DNG で検証する diff --git a/tests/io/test_loader.py b/tests/io/test_loader.py index d90cc53..cd44e80 100644 --- a/tests/io/test_loader.py +++ b/tests/io/test_loader.py @@ -4,7 +4,7 @@ - load_image: PNG を OpenCV で読み込み BGR→RGB 変換して返す - extract_roi: NumPy スライスで矩形 ROI を切り出す -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - テスト用画像は tests/fixtures/ に配置するか numpy.zeros 等で合成する - extract_roi は純粋な NumPy 操作のためダミー配列でテスト可能 diff --git a/tests/scripts/test_run_uniformity.py b/tests/scripts/test_run_uniformity.py index 8996248..9bf3e05 100644 --- a/tests/scripts/test_run_uniformity.py +++ b/tests/scripts/test_run_uniformity.py @@ -6,7 +6,7 @@ - 存在しないキーで None が返る - ファイル不在で FileNotFoundError -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - tmp_path フィクスチャを利用 """ diff --git a/tests/scripts/test_select_roi.py b/tests/scripts/test_select_roi.py index 570b373..98cc2d6 100644 --- a/tests/scripts/test_select_roi.py +++ b/tests/scripts/test_select_roi.py @@ -6,7 +6,7 @@ - set_nested: ドット区切りキーでネスト辞書に値をセット - save_config: JSON 保存 -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - GUI(selectROI)を伴うテストは除外 """ diff --git a/tests/scripts/test_viewer.py b/tests/scripts/test_viewer.py index 3e39fba..b6c5bb8 100644 --- a/tests/scripts/test_viewer.py +++ b/tests/scripts/test_viewer.py @@ -16,7 +16,7 @@ - ファイルが存在しない場合 FileNotFoundError を送出する - ファイルが存在する場合 DataFrame を返す -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - pytest を使用 - tmp_path フィクスチャを利用 - 合成画像(PIL.Image)でテストデータを生成する diff --git a/tests/visualization/test_plotter.py b/tests/visualization/test_plotter.py index b4964f6..0ff5630 100644 --- a/tests/visualization/test_plotter.py +++ b/tests/visualization/test_plotter.py @@ -6,7 +6,7 @@ - plot_radial_profile: 放射状プロファイルを折れ線グラフで PNG 保存 - plot_zone_map: ゾーンオーバーレイ輝度マップを PNG 保存 -テスト方針 (GUIDE_08_テスト方針.md): +テスト方針 (.claude/rules/testing.md): - 出力ファイルが生成されることを確認する程度でよい - tmp_path フィクスチャを使用 """