Skip to content

Commit 3a62327

Browse files
authored
refactor: ドキュメント生成スクリプトを構造化 (#1618)
1 parent 78749bc commit 3a62327

File tree

1 file changed

+52
-27
lines changed

1 file changed

+52
-27
lines changed

tools/make_docs.py

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
"""ドキュメントファイルを生成する。"""
2+
# TODO: 目的を「ドキュメント生成」から「API ドキュメント生成」へ変更し、ファイル名等をそれに合わせられるか検討
3+
14
import json
25
from pathlib import Path
36

7+
from fastapi import FastAPI
8+
49
from voicevox_engine.app.application import generate_app
510
from voicevox_engine.core.core_adapter import CoreAdapter
611
from voicevox_engine.core.core_initializer import CoreManager
@@ -16,26 +21,8 @@
1621
from voicevox_engine.utility.path_utility import engine_manifest_path, get_save_dir
1722

1823

19-
def generate_api_docs_html(schema: str) -> str:
20-
"""OpenAPI schema から API ドキュメント HTML を生成する"""
21-
return f"""<!DOCTYPE html>
22-
<html lang="ja">
23-
<head>
24-
<title>voicevox_engine API Document</title>
25-
<meta charset="utf-8">
26-
<link rel="shortcut icon" href="https://voicevox.hiroshiba.jp/favicon-32x32.png">
27-
</head>
28-
<body>
29-
<div id="redoc-container"></div>
30-
<script src="https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"></script>
31-
<script>
32-
Redoc.init({schema}, {{"hideHostname": true}}, document.getElementById("redoc-container"));
33-
</script>
34-
</body>
35-
</html>"""
36-
37-
38-
if __name__ == "__main__":
24+
def _generate_mock_app() -> FastAPI:
25+
"""app インスタンスをモック設定で生成する。"""
3926
core_manager = CoreManager()
4027
core_manager.register_core(CoreAdapter(MockCoreWrapper()), "mock")
4128
tts_engines = TTSEngineManager()
@@ -50,8 +37,6 @@ def generate_api_docs_html(schema: str) -> str:
5037
engine_manifest.name,
5138
engine_manifest.uuid,
5239
)
53-
54-
# FastAPI の機能を用いて OpenAPI schema を生成する
5540
app = generate_app(
5641
tts_engines=tts_engines,
5742
song_engines=song_engines,
@@ -62,13 +47,53 @@ def generate_api_docs_html(schema: str) -> str:
6247
engine_manifest=engine_manifest,
6348
library_manager=library_manager,
6449
)
65-
api_schema = json.dumps(app.openapi())
50+
return app
6651

67-
# API ドキュメント HTML を生成する
68-
api_docs_html = generate_api_docs_html(api_schema)
6952

70-
# HTML ファイルとして保存する
53+
def _get_openapi_schema(app: FastAPI) -> str:
54+
"""OpenAPI スキーマを取得する。"""
55+
# FastAPI の機能を用いる
56+
return json.dumps(app.openapi())
57+
58+
59+
def _generate_api_docs_html(schema: str) -> str:
60+
"""OpenAPI schema から API ドキュメント HTML を生成する"""
61+
return f"""<!DOCTYPE html>
62+
<html lang="ja">
63+
<head>
64+
<title>voicevox_engine API Document</title>
65+
<meta charset="utf-8">
66+
<link rel="shortcut icon" href="https://voicevox.hiroshiba.jp/favicon-32x32.png">
67+
</head>
68+
<body>
69+
<div id="redoc-container"></div>
70+
<script src="https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"></script>
71+
<script>
72+
Redoc.init({schema}, {{"hideHostname": true}}, document.getElementById("redoc-container"));
73+
</script>
74+
</body>
75+
</html>"""
76+
77+
78+
def _save_as_html_file(api_docs_str: str) -> None:
79+
"""HTML 文字列を HTML ファイルとして保存する。"""
7180
api_docs_root = Path("docs/api") # 'upload-docs' workflow の対象
7281
output_path = api_docs_root / "index.html"
7382
output_path.parent.mkdir(parents=True, exist_ok=True)
74-
output_path.write_text(api_docs_html)
83+
output_path.write_text(api_docs_str)
84+
85+
86+
def _generate_api_docs() -> None:
87+
app = _generate_mock_app()
88+
api_schema = _get_openapi_schema(app)
89+
api_docs_html = _generate_api_docs_html(api_schema)
90+
_save_as_html_file(api_docs_html)
91+
92+
93+
def main() -> None:
94+
"""ドキュメントファイルを生成する。"""
95+
_generate_api_docs()
96+
97+
98+
if __name__ == "__main__":
99+
main()

0 commit comments

Comments
 (0)