1+ """ドキュメントファイルを生成する。"""
2+ # TODO: 目的を「ドキュメント生成」から「API ドキュメント生成」へ変更し、ファイル名等をそれに合わせられるか検討
3+
14import json
25from pathlib import Path
36
7+ from fastapi import FastAPI
8+
49from voicevox_engine .app .application import generate_app
510from voicevox_engine .core .core_adapter import CoreAdapter
611from voicevox_engine .core .core_initializer import CoreManager
1621from 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