CR-005-1 npe/policies.py の API 整理+テスト追加 実装完了レポート
実装日時
2025-12-02 13:58(日本時間)
概要
CR-005-1「npe/policies.py の API 整理+テスト追加」を実装しました。機密データ検出ロジックをテストしやすい形に再設計し、pytest によるユニットテストを整備しました。
目的: 機密データ検出ロジックを「テストしやすい形」に再設計し、そのうえで pytest によるユニットテストを整備する。
実装ステップ
Step 1: 現状把握
確認した内容:
policies.pyの構造:context_scanner(code: str) -> str: “safe” または “sensitive” を返すsecure_context_builder(code: str) -> str: マスキング処理を行う- 正規表現パターンが
_SENSITIVE_PATTERNSリストに定義されている
- 呼び出し側の確認:
grepで検索した結果、現在は呼び出し側が存在しない- 既存の関数は後方互換性のために維持
Step 2: API 再設計
変更ファイル: src/nexuscore/npe/policies.py
実装内容:
SecretMatchデータクラスの追加:type: 検出された機密情報の種類(”aws_access_key”, “pem_private_key”, “email”, “phone”, “api_key” など)value: マッチした文字列span: マッチした位置(start, end)のタプル
- 新しい API
scan_text_for_secrets()の実装:- テキスト内の機密情報をスキャンし、
List[SecretMatch]を返す - 各種類の機密情報を個別の関数でスキャン:
_scan_aws_keys(): AWS アクセスキー_scan_pem_keys(): PEM 秘密鍵_scan_emails(): メールアドレス_scan_phones(): 電話番号_scan_api_keys(): API キー形式
- テキスト内の機密情報をスキャンし、
- 既存関数の更新:
context_scanner(): 新しいscan_text_for_secrets()API を使用するように変更secure_context_builder(): 既存のマスキングロジックを維持(変更なし)
- コード品質の改善:
print文を削除(ログ出力は要件に従って任意)- 型ヒントを追加
- 関数を分割してテストしやすく
Step 3: テストファイルの作成
新規ファイル: tests/nexuscore/npe/test_policies.py
実装内容:
- 基本テストケース(4件):
test_scan_text_for_secrets_detects_aws_access_key: AWS アクセスキーの検出test_scan_text_for_secrets_detects_pem_private_key: PEM 秘密鍵の検出test_scan_text_for_secrets_detects_email: メールアドレスの検出test_scan_text_for_secrets_no_false_positive_on_normal_text: 誤検出の防止
- 追加テストケース(9件):
- AWS アクセスキー(ASIA形式)の検出
- 電話番号の検出
- API キー形式の検出
- 複数の種類の機密情報の検出
context_scanner()の動作確認(sensitive/safe)secure_context_builder()のマスキング確認SecretMatchデータクラスの動作確認
合計: 13件のテストケース
Step 4: 呼び出し側の確認
確認結果:
grepとコードベース検索の結果、context_scanner()とsecure_context_builder()の呼び出し側は見つからなかった- 既存の関数は後方互換性のために維持し、新しい API を使用するように更新
変更ファイル一覧
新規作成ファイル
tests/nexuscore/npe/test_policies.py: 機密データ検出のテストファイル(13件のテストケース)
変更ファイル
src/nexuscore/npe/policies.py: API 再設計とコード品質の改善
動作確認結果
テスト結果
実行コマンド:
pytest tests/nexuscore/npe/test_policies.py -v
結果:
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_detects_aws_access_key PASSED [ 7%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_detects_aws_access_key_asia PASSED [ 15%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_detects_pem_private_key PASSED [ 23%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_detects_email PASSED [ 30%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_detects_phone PASSED [ 38%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_detects_api_key PASSED [ 46%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_no_false_positive_on_normal_text PASSED [ 53%]
tests/nexuscore/npe/test_policies.py::test_scan_text_for_secrets_multiple_types PASSED [ 61%]
tests/nexuscore/npe/test_policies.py::test_context_scanner_returns_sensitive PASSED [ 69%]
tests/nexuscore/npe/test_policies.py::test_context_scanner_returns_safe PASSED [ 76%]
tests/nexuscore/npe/test_policies.py::test_secure_context_builder_masks_aws_key PASSED [ 84%]
tests/nexuscore/npe/test_policies.py::test_secure_context_builder_masks_email PASSED [ 92%]
tests/nexuscore/npe/test_policies.py::test_secret_match_dataclass PASSED [100%]
============================== 13 passed in 0.08s ==============================
すべてのテストが成功しました。
静的解析結果
- リンターエラー: なし
- 型チェック: 未実施(将来的に mypy で確認予定)
コードレビュー結果
- 新しい API
scan_text_for_secrets()が正しく実装されている - 既存の関数
context_scanner()とsecure_context_builder()は後方互換性を維持 - テストカバレッジが十分(13件のテストケースで全パターンをカバー)
- 型ヒントが適切に追加されている
設計上の改善点
アーキテクチャの改善
- 機密情報検出ロジックを種類ごとの関数に分割し、テストしやすく
SecretMatchデータクラスにより、検出結果を構造化- 新しい API
scan_text_for_secrets()により、詳細な検出情報を取得可能
将来の拡張性への配慮
- 新しい機密情報の種類を追加する場合、新しい
_scan_*()関数を追加するだけで対応可能 SecretMatchのtypeフィールドを拡張することで、新しい種類の機密情報に対応可能- 既存の関数は後方互換性を維持しているため、既存コードへの影響を最小化
コード品質の向上
- 型ヒントを追加し、コードの可読性を向上
print文を削除し、ログ出力を適切に管理- 関数を分割し、単体テストが容易に
既知の制約・注意事項
既存コードとの互換性
- 既存の関数
context_scanner()とsecure_context_builder()は後方互換性を維持 - 呼び出し側は現在存在しないが、将来の使用に備えて既存関数を維持
制限事項やトレードオフ
- PEM鍵の検出: PEM鍵の開始位置のみを記録(終了位置の検出は簡易的)
- 誤検出の可能性: メールアドレスや電話番号のパターンは誤検出する可能性がある(要件通り「ゆるめヒット」)
- 重複除去: 同じ位置で複数のパターンにマッチする場合、最初に見つかったものを優先
移行時の注意点
- 新しい API
scan_text_for_secrets()を使用する場合は、List[SecretMatch]を扱う必要がある - 既存の
context_scanner()を使用する場合は、戻り値が “safe” または “sensitive” の文字列
次のステップ
推奨されるフォローアップアクション
- PEM鍵の検出改善:
- PEM鍵の終了位置も正確に検出できるように改善
- 誤検出の削減:
- メールアドレスや電話番号のパターンをより精密に調整
- コンテキストに基づく検出ロジックの追加
- ログ出力の改善:
- 機密データ値そのものをログに出さないように、logger を使用したログ出力の実装
- 新しい機密情報の種類の追加:
- クレジットカード番号、SSN などの追加検出パターン
- パフォーマンスの最適化:
- 大量のテキストをスキャンする場合のパフォーマンス改善
関連ファイル
src/nexuscore/npe/policies.py: 機密データ検出の実装tests/nexuscore/npe/test_policies.py: 機密データ検出のテストdocs/completion_reports/CR-005-1_POLICIES_API_REFACTORING_COMPLETION_REPORT.md: 本レポート