Files
jcl-cobol-data-create/README.md
T
2026-07-12 14:54:50 +08:00

259 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# COBOL テストデータ生成 Agent
COBOL プログラムの詳細設計書・COPYBOOK・ソースコードを解析し、DeepSeek v4 Flash API を使ってテストデータ(JSON/SQL)を自動生成する Python ツール。
## クイックスタート
```bash
# インストール
pip install -r requirements.txt
# テスト実行
python -m pytest tests/ -v
# 単一プログラムのテストデータ生成
python main.py \
--design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN04MAT.md" \
--source "D:\cobol-tna-system\src\ZAN04MAT.cbl" \
--file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" \
--cpy "D:\cobol-tna-system\cpy" \
--db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" \
--output "output"
```
| 引数 | 必須 | 説明 |
|------|------|------|
| `--design` | ✓ | 詳細設計書 .md のパス |
| `--source` | ✓ | COBOL ソース .cbl のパス |
| `--file-db-md` | ✓ | ファイル/DB 構造定義 .md のパス |
| `--cpy` | ✓ | COPYBOOK 格納ディレクトリ |
| `--db-md` | ✓ | DB 定義書 .md のパス |
| `--output` | | 出力ディレクトリ(デフォルト: `output` |
| `--api-key` | | DeepSeek API Key |
| `--model` | | モデル名(デフォルト: `deepseek-v4-flash` |
| `--rules` | | ルール格納ディレクトリ(デフォルト: `rules` |
### ライブラリとしての利用
```python
from agent import generate
result = generate(
design_md="詳細設計書_ZAN04MAT.md",
source_cbl="src/ZAN04MAT.cbl",
file_db_md="COPY句定義書.md",
cpy_dir="cpy/",
db_md="DB定義書.md",
output_dir="output/"
)
# result = {"output_files": {...}, "program_id": "ZAN04MAT", "groups": 5, "input_type": "file"}
```
## プロジェクト構造
```
├── agent/ # コアモジュール
│ ├── __init__.py # generate() エントリポイント + 全エクスポート
│ ├── models.py # データクラス定義(ProgramMeta, FileInfo, CopyField 等)
│ ├── markdown_utils.py # Markdown テーブル解析ユーティリティ
│ ├── input_parser.py # 設計書・COPYBOOK・DB定義の解析
│ ├── rule_loader.py # PGMパターン→ルールファイルのマッチング
│ ├── prompt_builder.py # DeepSeek API プロンプト組立
│ ├── api_client.py # API 呼出 + 3回リトライ + JSON パース
│ └── output_writer.py # JSON / SQL ファイル出力
├── rules/ # データ生成ルール(.md ファイル)
│ ├── pgm_pattern/ # PGMパターン別ルール
│ │ ├── マッチング(1-1).md
│ │ ├── マッチング(1-N).md
│ │ ├── マッチング(N-1).md
│ │ ├── DB更新.md
│ │ ├── 振り分け.md
│ │ ├── 項目チェック.md
│ │ ├── レイアウト編集のみ(GETPUT).md
│ │ ├── キーブレイク(集計).md
│ │ ├── キーブレイク(集約).md
│ │ ├── キーブレイク(集計、集約).md
│ │ ├── SELECT処理.md
│ │ ├── MERGE.md
│ │ ├── 50分割.md
│ │ ├── CSV→FB変換.md
│ │ └── GETPUT(編集出力).md
│ └── special_feature/ # 特殊機能ルール
│ └── 条件分支.md
├── layout/ # ドキュメントテンプレート(参考)
├── tests/ # テストコード (48 tests)
│ └── test_data/ # テストフィクスチャ
├── main.py # CLI エントリポイント
├── requirements.txt # 依存関係
├── AGENTS.md # AI エージェント向け指示書
└── README.md
```
## 処理フロー
```
[詳細設計書.md] ──┐
[ソース.cbl] ────┤
[COPYBOOK .cpy] ─┤
[DB定義書.md] ───┘
InputParser ──→ ProgramMeta(全メタデータ)
RuleLoader ───→ ルール.md + 条件分支.md(該当時)
PromptBuilder ─→ API プロンプト
APIClient ────→ DeepSeek API(最大3回リトライ)
OutputWriter ──→ output/{プログラムID}/g{N}/{プログラムID}_g{N}.json
output/{プログラムID}/g{N}/{プログラムID}_g{N}.sql
```
## 出力形式
### 入力元がファイルの場合(JSON)
```json
{
"program": "ZAN04MAT",
"records": [
{
"input": {
"ZAN04R01": {
"R01-APPL-ID": "A0000001",
"R01-EMP-ID": "00000001",
"R01-APPL-DATE": "20250101",
"R01-START-TIME": "0800",
"R01-END-TIME": "1700",
"R01-STATUS": "1",
"R01-OVT-TYPE": "O",
"R01-FILLER": " "
},
"ZAN04R02": {
"R02-APPL-ID": "A0000002",
...
}
}
}
]
}
```
### 入力元が DB の場合(SQL)
```sql
-- Group: 1
-- 用途: 正常INSERT + 多keyテスト
INSERT INTO LEAVE_RECORDS (EMP_ID, LEAVE_TYPE, START_DATE, ...) VALUES
('00000001', '01', '20260101', ...),
('00000002', '02', '20260102', ...);
```
### 出力ディレクトリ構成
```
output/
└── ZAN04MAT/
├── g1/
│ └── ZAN04MAT_g1.json
├── g2/
│ └── ZAN04MAT_g2.json
└── g3/
└── ZAN04MAT_g3.json
```
## 対応 PGM パターン
| パターン | ルールファイル | カバー数 | 多keyテスト |
|----------|---------------|----------|-------------|
| マッチング(1:1) | マッチング(1-1).md | 1 | ✓ |
| マッチング(1:N) | マッチング(1-N).md | 2 | ✓ |
| マッチング(N:1) | マッチング(N-1).md | 1 | ✓ |
| DB更新 | DB更新.md | 5 | ✓ |
| 振り分け | 振り分け.md | 2 | — |
| 項目チェック | 項目チェック.md | 2 | — |
| GETPUT | レイアウト編集のみ(GETPUT).md | 3 | — |
| キーブレイク(集計) | キーブレイク(集計).md | 2 | ✓ |
| キーブレイク(集約) | キーブレイク(集約).md | 1 | ✓ |
| キーブレイク(集計、集約) | キーブレイク(集計、集約).md | 1 | ✓ |
| SELECT処理 | SELECT処理.md | 1 | ✓ |
| MERGE | MERGE.md | 1 | ✓ |
| 50分割 | 50分割.md | 1 | — |
| CSV→FB変換 | CSV→FB変換.md | 1 | — |
**合計: 24 プログラム対応**
### 多keyテストとは
キーが複数項目(例: A001, A002, A003)で構成される場合、基準データの各キー項目を 1 つだけ変えた N 件の追加データを各グループ末尾に生成する。これにより COBOL プログラムが正しい全キー項目で比較していることを検証する。
## ルール追加方法
1. `rules/pgm_pattern/` に新しい `.md` ファイルを作成
2. `agent/rule_loader.py``PGM_PATTERN_MAP` にエントリを追加
3. コード変更不要、ルール .md ファイル追加のみで拡張可能
ルールマッチング: まず `PGM_PATTERN_MAP` 完全一致 → なければルールファイル名(.md 除く)が PGM パターン文字列内に含まれるかチェック。
## 全プログラム実行コマンド
```bash
# マッチング(1:1)
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN04MAT.md" --source "D:\cobol-tna-system\src\ZAN04MAT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# マッチング(1:N)
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN05MAT.md" --source "D:\cobol-tna-system\src\KIN05MAT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN07DAI.md" --source "D:\cobol-tna-system\src\KIN07DAI.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# マッチング(N:1)
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN03CHK.md" --source "D:\cobol-tna-system\src\ZAN03CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# DB更新
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN02UPD.md" --source "D:\cobol-tna-system\src\KIN02UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN08DBU.md" --source "D:\cobol-tna-system\src\KIN08DBU.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU02REG.md" --source "D:\cobol-tna-system\src\KYU02REG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU06UPD.md" --source "D:\cobol-tna-system\src\KYU06UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN06UPD.md" --source "D:\cobol-tna-system\src\ZAN06UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# 振り分け
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN01INP.md" --source "D:\cobol-tna-system\src\KIN01INP.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN01CHK.md" --source "D:\cobol-tna-system\src\ZAN01CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# 項目チェック
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN02CHK.md" --source "D:\cobol-tna-system\src\ZAN02CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN04CHK.md" --source "D:\cobol-tna-system\src\KIN04CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# GETPUT
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN06CLD.md" --source "D:\cobol-tna-system\src\KIN06CLD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU08PRI.md" --source "D:\cobol-tna-system\src\KYU08PRI.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN09CSV.md" --source "D:\cobol-tna-system\src\KIN09CSV.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# キーブレイク(集計)
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN03EXP.md" --source "D:\cobol-tna-system\src\KIN03EXP.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN05CAL.md" --source "D:\cobol-tna-system\src\ZAN05CAL.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# キーブレイク(集約)
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU03AGG.md" --source "D:\cobol-tna-system\src\KYU03AGG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU04CAL.md" --source "D:\cobol-tna-system\src\KYU04CAL.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
# その他
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU05DED.md" --source "D:\cobol-tna-system\src\KYU05DED.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU07DIV.md" --source "D:\cobol-tna-system\src\KYU07DIV.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU09MRG.md" --source "D:\cobol-tna-system\src\KYU09MRG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU01CVT.md" --source "D:\cobol-tna-system\src\KYU01CVT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
```
## 注意事項
- **API Key**: DeepSeek API キーは `agent/__init__.py` にハードコードされています。本番利用時は環境変数などに変更してください。
- **サブプログラム**: `PGMタイプ = サブ` のプログラムは処理対象外です。
- **全角/半角**: 詳細設計書内の PGMパターン表記には全角括弧 `()` と半角括弧 `()` のバリエーションがあります。`rule_loader.py` で両方対応済みです。
- **テスト**: 全 48 テストが `tests/test_data/` のフィクスチャを使って API を mock して動作します。
- **所要時間**: 24 プログラム全実行で約 26 分(DeepSeek API 応答速度に依存)。