db-teigisho 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- db_teigisho-0.1.0/.gitignore +13 -0
- db_teigisho-0.1.0/PKG-INFO +233 -0
- db_teigisho-0.1.0/README.md +196 -0
- db_teigisho-0.1.0/examples/database-definition.yaml +117 -0
- db_teigisho-0.1.0/pyproject.toml +74 -0
- db_teigisho-0.1.0/schemas/db-definition.schema.json +571 -0
- db_teigisho-0.1.0/src/db_teigisho/__init__.py +3 -0
- db_teigisho-0.1.0/src/db_teigisho/__main__.py +5 -0
- db_teigisho-0.1.0/src/db_teigisho/assets/NotoSansJP[wght].ttf +0 -0
- db_teigisho-0.1.0/src/db_teigisho/assets/OFL.txt +93 -0
- db_teigisho-0.1.0/src/db_teigisho/cli.py +127 -0
- db_teigisho-0.1.0/src/db_teigisho/codex_hook.py +89 -0
- db_teigisho-0.1.0/src/db_teigisho/copilot_hook.py +112 -0
- db_teigisho-0.1.0/src/db_teigisho/diagram_render.py +119 -0
- db_teigisho-0.1.0/src/db_teigisho/er.py +103 -0
- db_teigisho-0.1.0/src/db_teigisho/er_graph.py +341 -0
- db_teigisho-0.1.0/src/db_teigisho/errors.py +40 -0
- db_teigisho-0.1.0/src/db_teigisho/loader.py +108 -0
- db_teigisho-0.1.0/src/db_teigisho/models.py +128 -0
- db_teigisho-0.1.0/src/db_teigisho/py.typed +1 -0
- db_teigisho-0.1.0/src/db_teigisho/render.py +840 -0
- db_teigisho-0.1.0/src/db_teigisho/schema.py +39 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/definition.html.j2 +294 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_auto_layout.css +5 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_auto_layout.js +328 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_details.css +69 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_details.js +446 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_edge_routing.css +24 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_edge_routing.js +1048 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_layout.css +5 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_layout.js +414 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_maximize.css +31 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_maximize.js +76 -0
- db_teigisho-0.1.0/src/db_teigisho/templates/er_viewer.js +604 -0
- db_teigisho-0.1.0/src/db_teigisho/validation.py +205 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: db-teigisho
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: YAML-first database definition validation and publishing
|
|
5
|
+
Project-URL: Homepage, https://github.com/dse-corp/db-teigisho
|
|
6
|
+
Project-URL: Repository, https://github.com/dse-corp/db-teigisho
|
|
7
|
+
Project-URL: Issues, https://github.com/dse-corp/db-teigisho/issues
|
|
8
|
+
Author: dse-corp
|
|
9
|
+
License: MIT
|
|
10
|
+
Keywords: cli,database,database-definition,schema,yaml
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Database
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: jinja2<4,>=3.1
|
|
22
|
+
Requires-Dist: openpyxl<4,>=3.1
|
|
23
|
+
Requires-Dist: pillow<12,>=11.2
|
|
24
|
+
Requires-Dist: pydantic<3,>=2.11
|
|
25
|
+
Requires-Dist: pyyaml<7,>=6.0
|
|
26
|
+
Requires-Dist: reportlab<5,>=4.4
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: build<2,>=1.2; extra == 'dev'
|
|
29
|
+
Requires-Dist: mypy<2,>=1.15; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-cov<7,>=6.1; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest<9,>=8.3; extra == 'dev'
|
|
32
|
+
Requires-Dist: ruff<1,>=0.11; extra == 'dev'
|
|
33
|
+
Requires-Dist: types-openpyxl<4,>=3.1; extra == 'dev'
|
|
34
|
+
Requires-Dist: types-pyyaml<7,>=6.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: types-reportlab<5,>=4.4; extra == 'dev'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# db-teigisho
|
|
39
|
+
|
|
40
|
+
Excelで管理していたテーブル定義書を、AIと人間の双方が扱いやすいYAML-firstの成果物へ
|
|
41
|
+
置き換えるPythonツールです。YAMLをSingle Source of Truth(SSOT)とし、JSON Schema、
|
|
42
|
+
意味検証、HTML・Excel・PDF、CI向けmanifestを同じ定義から生成します。
|
|
43
|
+
|
|
44
|
+
## CLIとして利用
|
|
45
|
+
|
|
46
|
+
PyPIからインストールして、`dbdef`コマンドを利用できます。
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pipx install db-teigisho
|
|
50
|
+
dbdef --version
|
|
51
|
+
dbdef validate path/to/definition.yaml
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
更新・削除は次のコマンドで行います。
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pipx upgrade db-teigisho
|
|
58
|
+
pipx uninstall db-teigisho
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Python 3.11以上が必要です。`validate`、`schema`、Mermaidコード生成はPythonだけで
|
|
62
|
+
動作します。HTML・XLSX・PDF・SVG・PNGを生成する場合は、Node.js 22.12以上を用意し、
|
|
63
|
+
リポジトリまたは作業環境で`npm ci`を実行してください。
|
|
64
|
+
|
|
65
|
+
## PyPIへの公開(メンテナ向け)
|
|
66
|
+
|
|
67
|
+
PyPIのTrusted Publisherに、Organization `dse-corp`、Repository `db-teigisho`、
|
|
68
|
+
Workflow `.github/workflows/publish-python.yml`、Environment `pypi`を登録します。
|
|
69
|
+
登録後はバージョンと同じタグを`origin`へpushすると、品質検査後にPyPIへ公開されます。
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git tag v0.1.0
|
|
73
|
+
git push origin v0.1.0
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## セットアップ
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Node.js 22.12+ が必要
|
|
80
|
+
python3 -m venv .venv
|
|
81
|
+
.venv/bin/pip install -e '.[dev]'
|
|
82
|
+
npm ci
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 基本操作
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# YAML定義書を検証
|
|
89
|
+
.venv/bin/dbdef validate definitions/example.yaml
|
|
90
|
+
|
|
91
|
+
# HTML・Excel・PDFとmanifestを一括生成
|
|
92
|
+
.venv/bin/dbdef build definitions/example.yaml --output dist
|
|
93
|
+
|
|
94
|
+
# Mermaid ER図コードを全カラム表示で生成
|
|
95
|
+
.venv/bin/dbdef render definitions/example.yaml --format mermaid --output dist/database-definition.mmd
|
|
96
|
+
|
|
97
|
+
# Mermaid ER図コードをPK/FKだけの表示で生成
|
|
98
|
+
.venv/bin/dbdef render definitions/example.yaml --format mermaid --er-columns keys --output dist/database-definition.mmd
|
|
99
|
+
|
|
100
|
+
# レンダリング済みSVG/PNGを出力
|
|
101
|
+
.venv/bin/dbdef render definitions/example.yaml --format svg --er-columns tables --output dist/database-definition.svg
|
|
102
|
+
.venv/bin/dbdef render definitions/example.yaml --format png --output dist/database-definition.png
|
|
103
|
+
|
|
104
|
+
# JSON Schemaの再生成と、コミット済みSchemaのドリフト検査
|
|
105
|
+
.venv/bin/dbdef schema --output schemas/db-definition.schema.json
|
|
106
|
+
.venv/bin/dbdef schema --check schemas/db-definition.schema.json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
YAMLの全項目は [examples/database-definition.yaml](examples/database-definition.yaml)、
|
|
110
|
+
AIエージェントによる作成・編集手順は
|
|
111
|
+
[.agents/skills/manage-db-definitions/SKILL.md](.agents/skills/manage-db-definitions/SKILL.md)
|
|
112
|
+
を参照してください。
|
|
113
|
+
|
|
114
|
+
### GitHub Copilot向けSkill
|
|
115
|
+
|
|
116
|
+
GitHub Copilotは既存の `.agents/skills/manage-db-definitions` に加え、次の用途別Skillを利用できます。
|
|
117
|
+
|
|
118
|
+
- `.github/skills/review-db-definitions`: YAML定義書とPull Requestのレビュー
|
|
119
|
+
- `.github/skills/publish-db-definitions`: HTML・XLSX・PDF・manifestの生成
|
|
120
|
+
- `.github/skills/evolve-dbdef-tooling`: Schema、検証器、CLI、レンダラーの変更
|
|
121
|
+
|
|
122
|
+
リポジトリ全体のCopilot指示は `.github/copilot-instructions.md` にあります。
|
|
123
|
+
|
|
124
|
+
## 出力
|
|
125
|
+
|
|
126
|
+
`dbdef build` は次のファイルを出力します。
|
|
127
|
+
|
|
128
|
+
- `<入力名>.html`: ズーム・パン・表示モード切り替え・最大化と詳細パネルを備えたER図、テーブル一覧、各定義を検索・印刷できる自己完結HTML
|
|
129
|
+
- `<入力名>.xlsx`: 文書情報、テーブル一覧、レンダリング済みER図、各テーブル、ビュー、ストアドプロシージャの各シート
|
|
130
|
+
- `<入力名>.pdf`: 表紙、レンダリング済みER図、テーブル一覧、各定義を収録した配布・レビュー用PDF
|
|
131
|
+
- `<入力名>.mmd`: FK制約から推論したMermaid ER Diagramコード
|
|
132
|
+
- `<入力名>.svg` / `<入力名>.png`: 全カラム表示のレンダリング済みER図
|
|
133
|
+
- `manifest.json`: 入力と各成果物のSHA-256、生成日時、ツールバージョン
|
|
134
|
+
|
|
135
|
+
PDFにはNoto Sans JPを埋め込むため、CIや閲覧端末に日本語フォントがない場合も文字を表示できます。
|
|
136
|
+
同梱フォントのライセンスは `src/db_teigisho/assets/OFL.txt` です。
|
|
137
|
+
|
|
138
|
+
ER図はYAMLに定義されたFKから生成します。`npm ci`で固定されたMermaid CLIとPuppeteerを
|
|
139
|
+
導入すると、外部CDNなしでSVG/PNGを生成します。HTMLでは埋め込みグラフデータからER図を
|
|
140
|
+
描画し、「全カラム」「PK・FKのみ」「テーブルのみ」の切り替え、リレーションの「曲線」「直線」
|
|
141
|
+
「鍵線」の切り替え、ホイールまたはボタンでのズーム、背景ドラッグでのパン、テーブルのドラッグ
|
|
142
|
+
による配置変更、「全体表示」、ER図をページ内で画面いっぱいに展開する「最大化」を利用できます。
|
|
143
|
+
最大化中は背景スクロールを抑止し、Escapeまたは「元に戻す」で通常表示へ戻せます。鍵線は中央の水平・垂直セグメントをドラッグまたは
|
|
144
|
+
矢印キーで移動でき、交差箇所を判別するLine jumpをOn/Offできます。線種は再生成せず即時反映され、
|
|
145
|
+
自己参照、同一テーブル間の複数FK、双方向参照は経路をずらしてFK名を判別できます。
|
|
146
|
+
FKの親子関係を層化した決定的な自動配置は「左→右」と「上→下」を切り替えられ、循環参照や
|
|
147
|
+
自己参照、孤立テーブル、複数の連結成分も重ならないよう配置してからER図全体を表示します。
|
|
148
|
+
テーブルを選択すると、選択テーブル、直接関連するテーブル、接続線を強調し、関連外の要素を
|
|
149
|
+
薄く表示します。テーブルまたはカラムの選択時は、インデックス、外部キー、制約、defaultを含む
|
|
150
|
+
詳細パネルを表示します。矢印キーで選択候補を移動し、EnterまたはSpaceで選択、Escapeまたは
|
|
151
|
+
閉じるボタンで閉じられます。倍率は5%から300%の範囲です。変更した配置、選択した線種、鍵線位置、
|
|
152
|
+
Line jump設定は同じブラウザの`localStorage`へ保存され、再読み込み時に復元されます。
|
|
153
|
+
「配置をリセット」で保存済み配置と鍵線位置を破棄して初期状態へ戻せます。
|
|
154
|
+
HTMLはランタイムをすべて同梱するため、`file:` URLかつオフラインで動作します。
|
|
155
|
+
JavaScriptが無効な場合と印刷時には、埋め込み済みの静的SVGを表示します。
|
|
156
|
+
PDFとXLSXには従来どおり全カラム表示を掲載します。参照元FK列がすべてNOT NULLなら親端を必須
|
|
157
|
+
(`||`)、それ以外は任意(`|o`)とし、FKがUNIQUEまたは主キーと一致すれば子端を
|
|
158
|
+
1(`||`)、それ以外は0以上の多(`o{`)とします。`ON DELETE CASCADE` またはFKが
|
|
159
|
+
主キーの一部なら実線、それ以外は破線です。`--er-columns` は `all`、`keys`、`tables`
|
|
160
|
+
を指定できます。`render --format svg|png` でも表示モードを指定できます。
|
|
161
|
+
|
|
162
|
+
自己完結HTMLには、`<script id="dbdef-er-graph" type="application/json">` として
|
|
163
|
+
`format_version: "1.0"` のERグラフデータも埋め込みます。`tables` とその `columns`、
|
|
164
|
+
`relationships` はYAMLの定義順を維持し、各カラムの制約と `key_roles`(`PK`、`UK`、`FK`)、
|
|
165
|
+
各テーブルの `indexes` と `foreign_keys`、複合FKの `column_pairs`、両端のcardinality、
|
|
166
|
+
`identifying` / `non_identifying` を収録します。
|
|
167
|
+
ブラウザでは要素の `textContent` を `JSON.parse` して取得できます。Pythonから同じ契約を
|
|
168
|
+
利用する場合は `db_teigisho.er_graph.build_er_graph` を呼び出します。
|
|
169
|
+
|
|
170
|
+
### HTML ERビューアの拡張API
|
|
171
|
+
|
|
172
|
+
生成HTMLは `window.dbdefErViewer` にバージョン付きAPIを公開します。`getState()` /
|
|
173
|
+
`setViewState()` は表示モード、ビューポート、全ノード座標を共有し、`setNodePosition()` /
|
|
174
|
+
`setNodePositions()` はドラッグ操作や自動配置から座標を更新します。座標更新後は
|
|
175
|
+
`redrawEdges()` が利用する同じ経路でリレーションを再描画します。
|
|
176
|
+
|
|
177
|
+
後続機能向けの主な境界は次のとおりです。
|
|
178
|
+
|
|
179
|
+
| 境界 | 用途 |
|
|
180
|
+
| --- | --- |
|
|
181
|
+
| `getGraph()` / `getState()` | 埋め込みグラフと現在のビュー状態をコピーとして取得 |
|
|
182
|
+
| `setMode(mode)` / `setViewport(viewport)` / `fitToView()` | 表示モードとズーム・パン状態を更新 |
|
|
183
|
+
| `getNodePosition(tableId)` / `setNodePosition(tableId, position)` | 単一ノードの座標を取得・更新 |
|
|
184
|
+
| `getNodeSize(tableId, mode)` | 指定表示モード(既定は全カラム)のノード寸法を取得 |
|
|
185
|
+
| `setNodePositions(positions)` | 配置アルゴリズムや保存済み配置から複数座標を一括更新 |
|
|
186
|
+
| `redrawEdges()` | 現在のノード座標とサイズから全エッジを再描画 |
|
|
187
|
+
| `setEdgePathRenderer(renderer)` | エッジ経路戦略を差し替え(`null` で既定へ復帰) |
|
|
188
|
+
| `screenToGraphPoint(clientX, clientY)` | ポインター座標をグラフ座標へ変換 |
|
|
189
|
+
|
|
190
|
+
ビューア要素 `#dbdef-er-viewer` は
|
|
191
|
+
`dbdef:er-view-change`、`dbdef:er-node-position-change`、
|
|
192
|
+
`dbdef:er-edges-redrawn`、`dbdef:er-selection-change` の各`CustomEvent`を発火します。
|
|
193
|
+
ノードDOMには `data-table-id`、カラム行には `data-column-id`、エッジDOMには
|
|
194
|
+
`data-relationship-id`があります。選択対象は `aria-selected` と
|
|
195
|
+
`aria-controls="dbdef-er-details"` で単一の詳細パネルへ関連付けられます。
|
|
196
|
+
|
|
197
|
+
線種切り替えは`window.dbdefErEdgeRouting` v2.0として分離され、
|
|
198
|
+
`getRoutingMode()` / `setRoutingMode(mode)`で`curve`、`straight`、`orthogonal`を取得・設定できます。
|
|
199
|
+
`getRouteOffsets()` / `setRouteOffset()` / `resetRouteOffsets()`は鍵線の手動位置を管理し、
|
|
200
|
+
`getLineJumpsEnabled()` / `setLineJumpsEnabled()`は交差ジャンプを切り替えます。各戦略は
|
|
201
|
+
`setEdgePathRenderer()`へ登録され、ノード座標計算には関与しません。座標の単一・一括更新および
|
|
202
|
+
ドラッグ時は`redrawEdges()`を通して選択中の経路、FK名、両端のカーディナリティを更新します。
|
|
203
|
+
保存領域が利用不可または容量超過の場合は図の閲覧と線種切り替えを継続しながら画面上に失敗を表示し、
|
|
204
|
+
`dbdef:er-edge-routing-storage-error`イベントを発火します。鍵線位置は定義IDとグラフ構造ごとに保存し、
|
|
205
|
+
`dbdef:er-route-offset-change`、`dbdef:er-route-offset-reset`、
|
|
206
|
+
`dbdef:er-line-jumps-change`イベントで変更を通知します。
|
|
207
|
+
|
|
208
|
+
配置操作は`window.dbdefErLayout` v1.0として分離され、`save()`、`restore()`、`reset()`、
|
|
209
|
+
`getStorageKey()`、`getGraphFingerprint()`を公開します。`window.dbdefErAutoLayout` v1.0は
|
|
210
|
+
`run()`、`setDirection()`、`calculate()`を公開し、計算と座標適用を分けて拡張できます。
|
|
211
|
+
保存キーは文書・データベース識別情報
|
|
212
|
+
のSHA-256と、テーブル・カラム・リレーション構造のフィンガープリントを含みます。構造変更時は
|
|
213
|
+
同じ定義書の過去配置から物理名が一致するテーブルだけを復元します。新規テーブルは初期位置を
|
|
214
|
+
基点に、復元済みテーブルと重なる場合だけ空き位置へ移してから全体表示します。保存領域が利用不可
|
|
215
|
+
または容量超過の場合は、図の閲覧とドラッグを継続しながら画面上に保存失敗を表示し、
|
|
216
|
+
`dbdef:er-layout-storage-error`イベントも発火します。
|
|
217
|
+
|
|
218
|
+
最大化操作は`window.dbdefErMaximize` v1.0として公開され、`isMaximized()`、
|
|
219
|
+
`setMaximized()`、`maximize()`、`restore()`、`toggle()`でページ内表示を切り替えられます。
|
|
220
|
+
ビューア要素は`dbdef:er-maximize-change`イベントを発火し、`detail.maximized`と
|
|
221
|
+
`detail.reason`を提供します。
|
|
222
|
+
|
|
223
|
+
## 自動検証
|
|
224
|
+
|
|
225
|
+
- `.pre-commit-config.yaml`: `definitions/**/*.yaml` をコミット前に検証
|
|
226
|
+
- `.codex/hooks.json`: Codexが定義YAMLを編集した直後に検証
|
|
227
|
+
- `.github/hooks/database-definitions.json`: GitHub CopilotがYAMLを編集した直後とタスク完了前に検証
|
|
228
|
+
- `.github/workflows/copilot-setup-steps.yml`: Copilot cloud agentへPython依存関係を事前導入
|
|
229
|
+
- `.github/workflows/database-definitions.yml`: テスト、Schemaドリフト、YAML検証、成果物アップロード
|
|
230
|
+
|
|
231
|
+
リポジトリのCodex hookは初回のみ `/hooks` で内容を確認し、信頼してください。
|
|
232
|
+
Copilot hookは編集後に検証結果をコンテキストへ返し、定義が不正な場合は完了前に修正を1回要求します。
|
|
233
|
+
無限継続を避けるため、再試行後はCIの検証を最終ゲートとします。
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# db-teigisho
|
|
2
|
+
|
|
3
|
+
Excelで管理していたテーブル定義書を、AIと人間の双方が扱いやすいYAML-firstの成果物へ
|
|
4
|
+
置き換えるPythonツールです。YAMLをSingle Source of Truth(SSOT)とし、JSON Schema、
|
|
5
|
+
意味検証、HTML・Excel・PDF、CI向けmanifestを同じ定義から生成します。
|
|
6
|
+
|
|
7
|
+
## CLIとして利用
|
|
8
|
+
|
|
9
|
+
PyPIからインストールして、`dbdef`コマンドを利用できます。
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pipx install db-teigisho
|
|
13
|
+
dbdef --version
|
|
14
|
+
dbdef validate path/to/definition.yaml
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
更新・削除は次のコマンドで行います。
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pipx upgrade db-teigisho
|
|
21
|
+
pipx uninstall db-teigisho
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Python 3.11以上が必要です。`validate`、`schema`、Mermaidコード生成はPythonだけで
|
|
25
|
+
動作します。HTML・XLSX・PDF・SVG・PNGを生成する場合は、Node.js 22.12以上を用意し、
|
|
26
|
+
リポジトリまたは作業環境で`npm ci`を実行してください。
|
|
27
|
+
|
|
28
|
+
## PyPIへの公開(メンテナ向け)
|
|
29
|
+
|
|
30
|
+
PyPIのTrusted Publisherに、Organization `dse-corp`、Repository `db-teigisho`、
|
|
31
|
+
Workflow `.github/workflows/publish-python.yml`、Environment `pypi`を登録します。
|
|
32
|
+
登録後はバージョンと同じタグを`origin`へpushすると、品質検査後にPyPIへ公開されます。
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git tag v0.1.0
|
|
36
|
+
git push origin v0.1.0
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## セットアップ
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Node.js 22.12+ が必要
|
|
43
|
+
python3 -m venv .venv
|
|
44
|
+
.venv/bin/pip install -e '.[dev]'
|
|
45
|
+
npm ci
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 基本操作
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# YAML定義書を検証
|
|
52
|
+
.venv/bin/dbdef validate definitions/example.yaml
|
|
53
|
+
|
|
54
|
+
# HTML・Excel・PDFとmanifestを一括生成
|
|
55
|
+
.venv/bin/dbdef build definitions/example.yaml --output dist
|
|
56
|
+
|
|
57
|
+
# Mermaid ER図コードを全カラム表示で生成
|
|
58
|
+
.venv/bin/dbdef render definitions/example.yaml --format mermaid --output dist/database-definition.mmd
|
|
59
|
+
|
|
60
|
+
# Mermaid ER図コードをPK/FKだけの表示で生成
|
|
61
|
+
.venv/bin/dbdef render definitions/example.yaml --format mermaid --er-columns keys --output dist/database-definition.mmd
|
|
62
|
+
|
|
63
|
+
# レンダリング済みSVG/PNGを出力
|
|
64
|
+
.venv/bin/dbdef render definitions/example.yaml --format svg --er-columns tables --output dist/database-definition.svg
|
|
65
|
+
.venv/bin/dbdef render definitions/example.yaml --format png --output dist/database-definition.png
|
|
66
|
+
|
|
67
|
+
# JSON Schemaの再生成と、コミット済みSchemaのドリフト検査
|
|
68
|
+
.venv/bin/dbdef schema --output schemas/db-definition.schema.json
|
|
69
|
+
.venv/bin/dbdef schema --check schemas/db-definition.schema.json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
YAMLの全項目は [examples/database-definition.yaml](examples/database-definition.yaml)、
|
|
73
|
+
AIエージェントによる作成・編集手順は
|
|
74
|
+
[.agents/skills/manage-db-definitions/SKILL.md](.agents/skills/manage-db-definitions/SKILL.md)
|
|
75
|
+
を参照してください。
|
|
76
|
+
|
|
77
|
+
### GitHub Copilot向けSkill
|
|
78
|
+
|
|
79
|
+
GitHub Copilotは既存の `.agents/skills/manage-db-definitions` に加え、次の用途別Skillを利用できます。
|
|
80
|
+
|
|
81
|
+
- `.github/skills/review-db-definitions`: YAML定義書とPull Requestのレビュー
|
|
82
|
+
- `.github/skills/publish-db-definitions`: HTML・XLSX・PDF・manifestの生成
|
|
83
|
+
- `.github/skills/evolve-dbdef-tooling`: Schema、検証器、CLI、レンダラーの変更
|
|
84
|
+
|
|
85
|
+
リポジトリ全体のCopilot指示は `.github/copilot-instructions.md` にあります。
|
|
86
|
+
|
|
87
|
+
## 出力
|
|
88
|
+
|
|
89
|
+
`dbdef build` は次のファイルを出力します。
|
|
90
|
+
|
|
91
|
+
- `<入力名>.html`: ズーム・パン・表示モード切り替え・最大化と詳細パネルを備えたER図、テーブル一覧、各定義を検索・印刷できる自己完結HTML
|
|
92
|
+
- `<入力名>.xlsx`: 文書情報、テーブル一覧、レンダリング済みER図、各テーブル、ビュー、ストアドプロシージャの各シート
|
|
93
|
+
- `<入力名>.pdf`: 表紙、レンダリング済みER図、テーブル一覧、各定義を収録した配布・レビュー用PDF
|
|
94
|
+
- `<入力名>.mmd`: FK制約から推論したMermaid ER Diagramコード
|
|
95
|
+
- `<入力名>.svg` / `<入力名>.png`: 全カラム表示のレンダリング済みER図
|
|
96
|
+
- `manifest.json`: 入力と各成果物のSHA-256、生成日時、ツールバージョン
|
|
97
|
+
|
|
98
|
+
PDFにはNoto Sans JPを埋め込むため、CIや閲覧端末に日本語フォントがない場合も文字を表示できます。
|
|
99
|
+
同梱フォントのライセンスは `src/db_teigisho/assets/OFL.txt` です。
|
|
100
|
+
|
|
101
|
+
ER図はYAMLに定義されたFKから生成します。`npm ci`で固定されたMermaid CLIとPuppeteerを
|
|
102
|
+
導入すると、外部CDNなしでSVG/PNGを生成します。HTMLでは埋め込みグラフデータからER図を
|
|
103
|
+
描画し、「全カラム」「PK・FKのみ」「テーブルのみ」の切り替え、リレーションの「曲線」「直線」
|
|
104
|
+
「鍵線」の切り替え、ホイールまたはボタンでのズーム、背景ドラッグでのパン、テーブルのドラッグ
|
|
105
|
+
による配置変更、「全体表示」、ER図をページ内で画面いっぱいに展開する「最大化」を利用できます。
|
|
106
|
+
最大化中は背景スクロールを抑止し、Escapeまたは「元に戻す」で通常表示へ戻せます。鍵線は中央の水平・垂直セグメントをドラッグまたは
|
|
107
|
+
矢印キーで移動でき、交差箇所を判別するLine jumpをOn/Offできます。線種は再生成せず即時反映され、
|
|
108
|
+
自己参照、同一テーブル間の複数FK、双方向参照は経路をずらしてFK名を判別できます。
|
|
109
|
+
FKの親子関係を層化した決定的な自動配置は「左→右」と「上→下」を切り替えられ、循環参照や
|
|
110
|
+
自己参照、孤立テーブル、複数の連結成分も重ならないよう配置してからER図全体を表示します。
|
|
111
|
+
テーブルを選択すると、選択テーブル、直接関連するテーブル、接続線を強調し、関連外の要素を
|
|
112
|
+
薄く表示します。テーブルまたはカラムの選択時は、インデックス、外部キー、制約、defaultを含む
|
|
113
|
+
詳細パネルを表示します。矢印キーで選択候補を移動し、EnterまたはSpaceで選択、Escapeまたは
|
|
114
|
+
閉じるボタンで閉じられます。倍率は5%から300%の範囲です。変更した配置、選択した線種、鍵線位置、
|
|
115
|
+
Line jump設定は同じブラウザの`localStorage`へ保存され、再読み込み時に復元されます。
|
|
116
|
+
「配置をリセット」で保存済み配置と鍵線位置を破棄して初期状態へ戻せます。
|
|
117
|
+
HTMLはランタイムをすべて同梱するため、`file:` URLかつオフラインで動作します。
|
|
118
|
+
JavaScriptが無効な場合と印刷時には、埋め込み済みの静的SVGを表示します。
|
|
119
|
+
PDFとXLSXには従来どおり全カラム表示を掲載します。参照元FK列がすべてNOT NULLなら親端を必須
|
|
120
|
+
(`||`)、それ以外は任意(`|o`)とし、FKがUNIQUEまたは主キーと一致すれば子端を
|
|
121
|
+
1(`||`)、それ以外は0以上の多(`o{`)とします。`ON DELETE CASCADE` またはFKが
|
|
122
|
+
主キーの一部なら実線、それ以外は破線です。`--er-columns` は `all`、`keys`、`tables`
|
|
123
|
+
を指定できます。`render --format svg|png` でも表示モードを指定できます。
|
|
124
|
+
|
|
125
|
+
自己完結HTMLには、`<script id="dbdef-er-graph" type="application/json">` として
|
|
126
|
+
`format_version: "1.0"` のERグラフデータも埋め込みます。`tables` とその `columns`、
|
|
127
|
+
`relationships` はYAMLの定義順を維持し、各カラムの制約と `key_roles`(`PK`、`UK`、`FK`)、
|
|
128
|
+
各テーブルの `indexes` と `foreign_keys`、複合FKの `column_pairs`、両端のcardinality、
|
|
129
|
+
`identifying` / `non_identifying` を収録します。
|
|
130
|
+
ブラウザでは要素の `textContent` を `JSON.parse` して取得できます。Pythonから同じ契約を
|
|
131
|
+
利用する場合は `db_teigisho.er_graph.build_er_graph` を呼び出します。
|
|
132
|
+
|
|
133
|
+
### HTML ERビューアの拡張API
|
|
134
|
+
|
|
135
|
+
生成HTMLは `window.dbdefErViewer` にバージョン付きAPIを公開します。`getState()` /
|
|
136
|
+
`setViewState()` は表示モード、ビューポート、全ノード座標を共有し、`setNodePosition()` /
|
|
137
|
+
`setNodePositions()` はドラッグ操作や自動配置から座標を更新します。座標更新後は
|
|
138
|
+
`redrawEdges()` が利用する同じ経路でリレーションを再描画します。
|
|
139
|
+
|
|
140
|
+
後続機能向けの主な境界は次のとおりです。
|
|
141
|
+
|
|
142
|
+
| 境界 | 用途 |
|
|
143
|
+
| --- | --- |
|
|
144
|
+
| `getGraph()` / `getState()` | 埋め込みグラフと現在のビュー状態をコピーとして取得 |
|
|
145
|
+
| `setMode(mode)` / `setViewport(viewport)` / `fitToView()` | 表示モードとズーム・パン状態を更新 |
|
|
146
|
+
| `getNodePosition(tableId)` / `setNodePosition(tableId, position)` | 単一ノードの座標を取得・更新 |
|
|
147
|
+
| `getNodeSize(tableId, mode)` | 指定表示モード(既定は全カラム)のノード寸法を取得 |
|
|
148
|
+
| `setNodePositions(positions)` | 配置アルゴリズムや保存済み配置から複数座標を一括更新 |
|
|
149
|
+
| `redrawEdges()` | 現在のノード座標とサイズから全エッジを再描画 |
|
|
150
|
+
| `setEdgePathRenderer(renderer)` | エッジ経路戦略を差し替え(`null` で既定へ復帰) |
|
|
151
|
+
| `screenToGraphPoint(clientX, clientY)` | ポインター座標をグラフ座標へ変換 |
|
|
152
|
+
|
|
153
|
+
ビューア要素 `#dbdef-er-viewer` は
|
|
154
|
+
`dbdef:er-view-change`、`dbdef:er-node-position-change`、
|
|
155
|
+
`dbdef:er-edges-redrawn`、`dbdef:er-selection-change` の各`CustomEvent`を発火します。
|
|
156
|
+
ノードDOMには `data-table-id`、カラム行には `data-column-id`、エッジDOMには
|
|
157
|
+
`data-relationship-id`があります。選択対象は `aria-selected` と
|
|
158
|
+
`aria-controls="dbdef-er-details"` で単一の詳細パネルへ関連付けられます。
|
|
159
|
+
|
|
160
|
+
線種切り替えは`window.dbdefErEdgeRouting` v2.0として分離され、
|
|
161
|
+
`getRoutingMode()` / `setRoutingMode(mode)`で`curve`、`straight`、`orthogonal`を取得・設定できます。
|
|
162
|
+
`getRouteOffsets()` / `setRouteOffset()` / `resetRouteOffsets()`は鍵線の手動位置を管理し、
|
|
163
|
+
`getLineJumpsEnabled()` / `setLineJumpsEnabled()`は交差ジャンプを切り替えます。各戦略は
|
|
164
|
+
`setEdgePathRenderer()`へ登録され、ノード座標計算には関与しません。座標の単一・一括更新および
|
|
165
|
+
ドラッグ時は`redrawEdges()`を通して選択中の経路、FK名、両端のカーディナリティを更新します。
|
|
166
|
+
保存領域が利用不可または容量超過の場合は図の閲覧と線種切り替えを継続しながら画面上に失敗を表示し、
|
|
167
|
+
`dbdef:er-edge-routing-storage-error`イベントを発火します。鍵線位置は定義IDとグラフ構造ごとに保存し、
|
|
168
|
+
`dbdef:er-route-offset-change`、`dbdef:er-route-offset-reset`、
|
|
169
|
+
`dbdef:er-line-jumps-change`イベントで変更を通知します。
|
|
170
|
+
|
|
171
|
+
配置操作は`window.dbdefErLayout` v1.0として分離され、`save()`、`restore()`、`reset()`、
|
|
172
|
+
`getStorageKey()`、`getGraphFingerprint()`を公開します。`window.dbdefErAutoLayout` v1.0は
|
|
173
|
+
`run()`、`setDirection()`、`calculate()`を公開し、計算と座標適用を分けて拡張できます。
|
|
174
|
+
保存キーは文書・データベース識別情報
|
|
175
|
+
のSHA-256と、テーブル・カラム・リレーション構造のフィンガープリントを含みます。構造変更時は
|
|
176
|
+
同じ定義書の過去配置から物理名が一致するテーブルだけを復元します。新規テーブルは初期位置を
|
|
177
|
+
基点に、復元済みテーブルと重なる場合だけ空き位置へ移してから全体表示します。保存領域が利用不可
|
|
178
|
+
または容量超過の場合は、図の閲覧とドラッグを継続しながら画面上に保存失敗を表示し、
|
|
179
|
+
`dbdef:er-layout-storage-error`イベントも発火します。
|
|
180
|
+
|
|
181
|
+
最大化操作は`window.dbdefErMaximize` v1.0として公開され、`isMaximized()`、
|
|
182
|
+
`setMaximized()`、`maximize()`、`restore()`、`toggle()`でページ内表示を切り替えられます。
|
|
183
|
+
ビューア要素は`dbdef:er-maximize-change`イベントを発火し、`detail.maximized`と
|
|
184
|
+
`detail.reason`を提供します。
|
|
185
|
+
|
|
186
|
+
## 自動検証
|
|
187
|
+
|
|
188
|
+
- `.pre-commit-config.yaml`: `definitions/**/*.yaml` をコミット前に検証
|
|
189
|
+
- `.codex/hooks.json`: Codexが定義YAMLを編集した直後に検証
|
|
190
|
+
- `.github/hooks/database-definitions.json`: GitHub CopilotがYAMLを編集した直後とタスク完了前に検証
|
|
191
|
+
- `.github/workflows/copilot-setup-steps.yml`: Copilot cloud agentへPython依存関係を事前導入
|
|
192
|
+
- `.github/workflows/database-definitions.yml`: テスト、Schemaドリフト、YAML検証、成果物アップロード
|
|
193
|
+
|
|
194
|
+
リポジトリのCodex hookは初回のみ `/hooks` で内容を確認し、信頼してください。
|
|
195
|
+
Copilot hookは編集後に検証結果をコンテキストへ返し、定義が不正な場合は完了前に修正を1回要求します。
|
|
196
|
+
無限継続を避けるため、再試行後はCIの検証を最終ゲートとします。
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# yaml-language-server: $schema=../schemas/db-definition.schema.json
|
|
2
|
+
format_version: "1.0"
|
|
3
|
+
|
|
4
|
+
document:
|
|
5
|
+
project_number: PJ-001
|
|
6
|
+
system_name: 受注管理システム
|
|
7
|
+
subsystem_name: 受注API
|
|
8
|
+
created_at: "2026-08-01T09:00:00+09:00"
|
|
9
|
+
updated_at: "2026-08-09T18:30:00+09:00"
|
|
10
|
+
|
|
11
|
+
database:
|
|
12
|
+
dbms_name: PostgreSQL
|
|
13
|
+
dbms_version: "17.5"
|
|
14
|
+
server_name: db.example.internal
|
|
15
|
+
port: 5432
|
|
16
|
+
database_name: orders
|
|
17
|
+
schema_name: public
|
|
18
|
+
collation: ja_JP.UTF-8
|
|
19
|
+
|
|
20
|
+
tables:
|
|
21
|
+
- physical_name: customers
|
|
22
|
+
logical_name: 顧客
|
|
23
|
+
description: 顧客の基本情報を管理する。
|
|
24
|
+
columns:
|
|
25
|
+
- physical_name: customer_id
|
|
26
|
+
logical_name: 顧客ID
|
|
27
|
+
data_type: uuid
|
|
28
|
+
default: gen_random_uuid()
|
|
29
|
+
not_null: true
|
|
30
|
+
unique: true
|
|
31
|
+
primary_key: true
|
|
32
|
+
description: 顧客を一意に識別するID。
|
|
33
|
+
- physical_name: email
|
|
34
|
+
logical_name: メールアドレス
|
|
35
|
+
data_type: varchar
|
|
36
|
+
length: 320
|
|
37
|
+
not_null: true
|
|
38
|
+
unique: true
|
|
39
|
+
primary_key: false
|
|
40
|
+
indexes:
|
|
41
|
+
- name: idx_customers_email
|
|
42
|
+
type: btree
|
|
43
|
+
unique: true
|
|
44
|
+
columns:
|
|
45
|
+
- name: email
|
|
46
|
+
order: ASC
|
|
47
|
+
include_columns: []
|
|
48
|
+
foreign_keys: []
|
|
49
|
+
|
|
50
|
+
- physical_name: orders
|
|
51
|
+
logical_name: 受注
|
|
52
|
+
description: 顧客から受け付けた受注を管理する。
|
|
53
|
+
columns:
|
|
54
|
+
- physical_name: order_id
|
|
55
|
+
logical_name: 受注ID
|
|
56
|
+
data_type: bigint
|
|
57
|
+
not_null: true
|
|
58
|
+
unique: false
|
|
59
|
+
primary_key: true
|
|
60
|
+
- physical_name: customer_id
|
|
61
|
+
logical_name: 顧客ID
|
|
62
|
+
data_type: uuid
|
|
63
|
+
not_null: true
|
|
64
|
+
unique: false
|
|
65
|
+
primary_key: false
|
|
66
|
+
- physical_name: amount
|
|
67
|
+
logical_name: 合計金額
|
|
68
|
+
data_type: numeric
|
|
69
|
+
length: 18
|
|
70
|
+
scale: 2
|
|
71
|
+
default: 0
|
|
72
|
+
not_null: true
|
|
73
|
+
unique: false
|
|
74
|
+
primary_key: false
|
|
75
|
+
indexes:
|
|
76
|
+
- name: idx_orders_customer
|
|
77
|
+
type: btree
|
|
78
|
+
unique: false
|
|
79
|
+
columns:
|
|
80
|
+
- name: customer_id
|
|
81
|
+
order: ASC
|
|
82
|
+
include_columns:
|
|
83
|
+
- amount
|
|
84
|
+
where: amount > 0
|
|
85
|
+
foreign_keys:
|
|
86
|
+
- name: fk_orders_customers
|
|
87
|
+
columns:
|
|
88
|
+
- customer_id
|
|
89
|
+
referenced_table: customers
|
|
90
|
+
referenced_columns:
|
|
91
|
+
- customer_id
|
|
92
|
+
on_update: NO ACTION
|
|
93
|
+
on_delete: RESTRICT
|
|
94
|
+
deferrable: false
|
|
95
|
+
|
|
96
|
+
views:
|
|
97
|
+
- physical_name: customer_order_totals
|
|
98
|
+
logical_name: 顧客別受注金額
|
|
99
|
+
description: 顧客単位の受注金額を集計する。
|
|
100
|
+
sql: |
|
|
101
|
+
SELECT
|
|
102
|
+
customer_id,
|
|
103
|
+
SUM(amount) AS total
|
|
104
|
+
FROM orders
|
|
105
|
+
GROUP BY customer_id;
|
|
106
|
+
|
|
107
|
+
stored_procedures:
|
|
108
|
+
- physical_name: close_orders
|
|
109
|
+
logical_name: 受注締め処理
|
|
110
|
+
description: 対象日までの受注を締める。
|
|
111
|
+
sql: |
|
|
112
|
+
CREATE PROCEDURE close_orders(IN closing_date date)
|
|
113
|
+
LANGUAGE SQL
|
|
114
|
+
AS $$
|
|
115
|
+
SELECT closing_date;
|
|
116
|
+
$$;
|
|
117
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling>=1.27"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "db-teigisho"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "YAML-first database definition validation and publishing"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [{ name = "dse-corp" }]
|
|
13
|
+
keywords = ["database", "database-definition", "yaml", "schema", "cli"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Environment :: Console",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.11",
|
|
21
|
+
"Programming Language :: Python :: 3.12",
|
|
22
|
+
"Programming Language :: Python :: 3.13",
|
|
23
|
+
"Topic :: Database",
|
|
24
|
+
]
|
|
25
|
+
dependencies = [
|
|
26
|
+
"Jinja2>=3.1,<4",
|
|
27
|
+
"openpyxl>=3.1,<4",
|
|
28
|
+
"Pillow>=11.2,<12",
|
|
29
|
+
"pydantic>=2.11,<3",
|
|
30
|
+
"PyYAML>=6.0,<7",
|
|
31
|
+
"reportlab>=4.4,<5",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[project.urls]
|
|
35
|
+
Homepage = "https://github.com/dse-corp/db-teigisho"
|
|
36
|
+
Repository = "https://github.com/dse-corp/db-teigisho"
|
|
37
|
+
Issues = "https://github.com/dse-corp/db-teigisho/issues"
|
|
38
|
+
|
|
39
|
+
[project.optional-dependencies]
|
|
40
|
+
dev = [
|
|
41
|
+
"build>=1.2,<2",
|
|
42
|
+
"mypy>=1.15,<2",
|
|
43
|
+
"pytest>=8.3,<9",
|
|
44
|
+
"pytest-cov>=6.1,<7",
|
|
45
|
+
"ruff>=0.11,<1",
|
|
46
|
+
"types-openpyxl>=3.1,<4",
|
|
47
|
+
"types-PyYAML>=6.0,<7",
|
|
48
|
+
"types-reportlab>=4.4,<5",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[project.scripts]
|
|
52
|
+
dbdef = "db_teigisho.cli:main"
|
|
53
|
+
|
|
54
|
+
[tool.hatch.build.targets.wheel]
|
|
55
|
+
packages = ["src/db_teigisho"]
|
|
56
|
+
|
|
57
|
+
[tool.hatch.build.targets.sdist]
|
|
58
|
+
include = ["src/db_teigisho", "README.md", "schemas", "examples"]
|
|
59
|
+
|
|
60
|
+
[tool.pytest.ini_options]
|
|
61
|
+
testpaths = ["tests"]
|
|
62
|
+
addopts = "--cov=db_teigisho --cov-report=term-missing --cov-fail-under=80"
|
|
63
|
+
|
|
64
|
+
[tool.ruff]
|
|
65
|
+
line-length = 100
|
|
66
|
+
target-version = "py311"
|
|
67
|
+
|
|
68
|
+
[tool.ruff.lint]
|
|
69
|
+
select = ["E", "F", "I", "N", "UP", "B", "SIM"]
|
|
70
|
+
|
|
71
|
+
[tool.mypy]
|
|
72
|
+
python_version = "3.11"
|
|
73
|
+
strict = true
|
|
74
|
+
packages = ["db_teigisho"]
|