From 78a21ea3792b276233717966591182cc799f7790 Mon Sep 17 00:00:00 2001 From: tarepan Date: Mon, 1 Apr 2024 10:48:39 +0000 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=E3=83=97=E3=83=AA=E3=82=BB=E3=83=83?= =?UTF-8?q?=E3=83=88=E9=96=A2=E9=80=A3=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92?= =?UTF-8?q?=E8=A9=B3=E7=B4=B0=E5=8C=96=E3=81=97500=E3=83=90=E3=82=B0?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 22 +++++++++++++++------ test/preset/test_preset.py | 26 ++++++++++++------------- voicevox_engine/preset/PresetError.py | 10 +++++++++- voicevox_engine/preset/PresetManager.py | 20 +++++++++---------- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/run.py b/run.py index 674a6188f..5f30ea06e 100644 --- a/run.py +++ b/run.py @@ -71,7 +71,7 @@ synthesis_morphing_parameter as _synthesis_morphing_parameter, ) from voicevox_engine.preset.Preset import Preset -from voicevox_engine.preset.PresetError import PresetError +from voicevox_engine.preset.PresetError import PresetInputError, PresetInternalError from voicevox_engine.preset.PresetManager import PresetManager from voicevox_engine.setting.Setting import CorsPolicyMode, Setting from voicevox_engine.setting.SettingLoader import USER_SETTING_PATH, SettingHandler @@ -320,8 +320,10 @@ def audio_query_from_preset( core = get_core(core_version) try: presets = preset_manager.load_presets() - except PresetError as err: + except PresetInputError as err: raise HTTPException(status_code=422, detail=str(err)) + except PresetInternalError as err: + raise HTTPException(status_code=500, detail=str(err)) for preset in presets: if preset.id == preset_id: selected_preset = preset @@ -766,8 +768,10 @@ def get_presets() -> list[Preset]: """ try: presets = preset_manager.load_presets() - except PresetError as err: + except PresetInputError as err: raise HTTPException(status_code=422, detail=str(err)) + except PresetInternalError as err: + raise HTTPException(status_code=500, detail=str(err)) return presets @app.post( @@ -790,8 +794,10 @@ def add_preset( """ try: id = preset_manager.add_preset(preset) - except PresetError as err: + except PresetInputError as err: raise HTTPException(status_code=422, detail=str(err)) + except PresetInternalError as err: + raise HTTPException(status_code=500, detail=str(err)) return id @app.post( @@ -814,8 +820,10 @@ def update_preset( """ try: id = preset_manager.update_preset(preset) - except PresetError as err: + except PresetInputError as err: raise HTTPException(status_code=422, detail=str(err)) + except PresetInternalError as err: + raise HTTPException(status_code=500, detail=str(err)) return id @app.post( @@ -832,8 +840,10 @@ def delete_preset( """ try: preset_manager.delete_preset(id) - except PresetError as err: + except PresetInputError as err: raise HTTPException(status_code=422, detail=str(err)) + except PresetInternalError as err: + raise HTTPException(status_code=500, detail=str(err)) return Response(status_code=204) @app.get("/version", tags=["その他"]) diff --git a/test/preset/test_preset.py b/test/preset/test_preset.py index 4a3b61609..e275430c7 100644 --- a/test/preset/test_preset.py +++ b/test/preset/test_preset.py @@ -5,7 +5,7 @@ from unittest import TestCase from voicevox_engine.preset.Preset import Preset -from voicevox_engine.preset.PresetError import PresetError +from voicevox_engine.preset.PresetError import PresetInternalError, PresetInputError from voicevox_engine.preset.PresetManager import PresetManager presets_test_1_yaml_path = Path("test/preset/presets-test-1.yaml") @@ -37,26 +37,26 @@ def test_validation_same(self) -> None: def test_validation_2(self) -> None: preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) with self.assertRaises( - PresetError, msg="プリセットの設定ファイルにミスがあります" + PresetInternalError, msg="プリセットの設定ファイルにミスがあります" ): preset_manager.load_presets() def test_preset_id(self) -> None: preset_manager = PresetManager(preset_path=presets_test_3_yaml_path) - with self.assertRaises(PresetError, msg="プリセットのidに重複があります"): + with self.assertRaises(PresetInternalError, msg="プリセットのidに重複があります"): preset_manager.load_presets() def test_empty_file(self) -> None: preset_manager = PresetManager(preset_path=presets_test_4_yaml_path) with self.assertRaises( - PresetError, msg="プリセットの設定ファイルが空の内容です" + PresetInternalError, msg="プリセットの設定ファイルが空の内容です" ): preset_manager.load_presets() def test_not_exist_file(self) -> None: preset_manager = PresetManager(preset_path=Path("test/presets-dummy.yaml")) with self.assertRaises( - PresetError, msg="プリセットの設定ファイルが見つかりません" + PresetInternalError, msg="プリセットの設定ファイルが見つかりません" ): preset_manager.load_presets() @@ -89,7 +89,7 @@ def test_add_preset(self) -> None: def test_add_preset_load_failure(self) -> None: preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) with self.assertRaises( - PresetError, msg="プリセットの設定ファイルにミスがあります" + PresetInternalError, msg="プリセットの設定ファイルにミスがあります" ): preset_manager.add_preset( Preset( @@ -182,7 +182,7 @@ def test_add_preset_write_failure(self) -> None: preset_manager.load_presets = lambda: [] # type:ignore[method-assign] preset_manager.preset_path = "" # type: ignore[assignment] with self.assertRaises( - PresetError, msg="プリセットの設定ファイルに書き込み失敗しました" + PresetInternalError, msg="プリセットの設定ファイルが見つかりません" ): preset_manager.add_preset(preset) self.assertEqual(len(preset_manager.presets), 2) @@ -217,7 +217,7 @@ def test_update_preset(self) -> None: def test_update_preset_load_failure(self) -> None: preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) with self.assertRaises( - PresetError, msg="プリセットの設定ファイルにミスがあります" + PresetInternalError, msg="プリセットの設定ファイルにミスがあります" ): preset_manager.update_preset( Preset( @@ -254,7 +254,7 @@ def test_update_preset_not_found(self) -> None: "postPhonemeLength": 0.1, } ) - with self.assertRaises(PresetError, msg="更新先のプリセットが存在しません"): + with self.assertRaises(PresetInputError, msg="更新先のプリセットが存在しません"): preset_manager.update_preset(preset) self.assertEqual(len(preset_manager.presets), 2) remove(temp_path) @@ -281,7 +281,7 @@ def test_update_preset_write_failure(self) -> None: preset_manager.load_presets = lambda: [] # type:ignore[method-assign] preset_manager.preset_path = "" # type: ignore[assignment] with self.assertRaises( - PresetError, msg="プリセットの設定ファイルに書き込み失敗しました" + PresetInternalError, msg="プリセットの設定ファイルが見つかりません" ): preset_manager.update_preset(preset) self.assertEqual(len(preset_manager.presets), 2) @@ -300,7 +300,7 @@ def test_delete_preset(self) -> None: def test_delete_preset_load_failure(self) -> None: preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) with self.assertRaises( - PresetError, msg="プリセットの設定ファイルにミスがあります" + PresetInternalError, msg="プリセットの設定ファイルにミスがあります" ): preset_manager.delete_preset(10) @@ -308,7 +308,7 @@ def test_delete_preset_not_found(self) -> None: temp_path = self.tmp_dir_path / "presets-test-temp.yaml" copyfile(presets_test_1_yaml_path, temp_path) preset_manager = PresetManager(preset_path=temp_path) - with self.assertRaises(PresetError, msg="削除対象のプリセットが存在しません"): + with self.assertRaises(PresetInputError, msg="削除対象のプリセットが存在しません"): preset_manager.delete_preset(10) self.assertEqual(len(preset_manager.presets), 2) remove(temp_path) @@ -321,7 +321,7 @@ def test_delete_preset_write_failure(self) -> None: preset_manager.load_presets = lambda: [] # type:ignore[method-assign] preset_manager.preset_path = "" # type: ignore[assignment] with self.assertRaises( - PresetError, msg="プリセットの設定ファイルに書き込み失敗しました" + PresetInternalError, msg="プリセットの設定ファイルが見つかりません" ): preset_manager.delete_preset(1) self.assertEqual(len(preset_manager.presets), 2) diff --git a/voicevox_engine/preset/PresetError.py b/voicevox_engine/preset/PresetError.py index 6f5f802f5..d2835ddd3 100644 --- a/voicevox_engine/preset/PresetError.py +++ b/voicevox_engine/preset/PresetError.py @@ -1,2 +1,10 @@ -class PresetError(Exception): +"""プリセットに関するエラー""" + + +class PresetInputError(Exception): + """クライアントのリクエスト値に起因するエラー""" + pass + +class PresetInternalError(Exception): + """サーバー/ENGINE に起因するエラー""" pass diff --git a/voicevox_engine/preset/PresetManager.py b/voicevox_engine/preset/PresetManager.py index c554e3e46..844bab480 100644 --- a/voicevox_engine/preset/PresetManager.py +++ b/voicevox_engine/preset/PresetManager.py @@ -5,7 +5,7 @@ from pydantic import ValidationError, parse_obj_as from .Preset import Preset -from .PresetError import PresetError +from .PresetError import PresetInputError, PresetInternalError class PresetManager: @@ -43,23 +43,23 @@ def load_presets(self) -> list[Preset]: # 更新無し、キャッシュを返す return self.presets except OSError: - raise PresetError("プリセットの設定ファイルが見つかりません") + raise PresetInternalError("プリセットの設定ファイルが見つかりません") # データベースの読み込み with open(self.preset_path, mode="r", encoding="utf-8") as f: obj = yaml.safe_load(f) if obj is None: - raise PresetError("プリセットの設定ファイルが空の内容です") + raise PresetInternalError("プリセットの設定ファイルが空の内容です") try: _presets = parse_obj_as(List[Preset], obj) except ValidationError: - raise PresetError("プリセットの設定ファイルにミスがあります") + raise PresetInternalError("プリセットの設定ファイルにミスがあります") # 全idの一意性をバリデーション if len([preset.id for preset in _presets]) != len( {preset.id for preset in _presets} ): - raise PresetError("プリセットのidに重複があります") + raise PresetInternalError("プリセットのidに重複があります") self.presets = _presets self.last_modified_time = _last_modified_time @@ -94,7 +94,7 @@ def add_preset(self, preset: Preset) -> int: except Exception as err: self.presets.pop() if isinstance(err, FileNotFoundError): - raise PresetError("プリセットの設定ファイルに書き込み失敗しました") + raise PresetInternalError("プリセットの設定ファイルが見つかりません") else: raise err @@ -124,7 +124,7 @@ def update_preset(self, preset: Preset) -> int: self.presets[i] = preset break else: - raise PresetError("更新先のプリセットが存在しません") + raise PresetInputError("更新先のプリセットが存在しません") # 変更の反映。失敗時はリバート。 try: @@ -132,7 +132,7 @@ def update_preset(self, preset: Preset) -> int: except Exception as err: self.presets[prev_preset[0]] = prev_preset[1] if isinstance(err, FileNotFoundError): - raise PresetError("プリセットの設定ファイルに書き込み失敗しました") + raise PresetInternalError("プリセットの設定ファイルが見つかりません") else: raise err @@ -163,14 +163,14 @@ def delete_preset(self, id: int) -> int: buf_index = i break else: - raise PresetError("削除対象のプリセットが存在しません") + raise PresetInputError("削除対象のプリセットが存在しません") # 変更の反映。失敗時はリバート。 try: self._write_on_file() except FileNotFoundError: self.presets.insert(buf_index, buf) - raise PresetError("プリセットの設定ファイルに書き込み失敗しました") + raise PresetInternalError("プリセットの設定ファイルが見つかりません") return id From f786d08c687a6ea53650d093e20a7f3971411102 Mon Sep 17 00:00:00 2001 From: tarepan Date: Mon, 1 Apr 2024 10:49:20 +0000 Subject: [PATCH 2/6] fix: lint --- test/preset/test_preset.py | 14 ++++++++++---- voicevox_engine/preset/PresetError.py | 3 +++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/test/preset/test_preset.py b/test/preset/test_preset.py index e275430c7..91038cf33 100644 --- a/test/preset/test_preset.py +++ b/test/preset/test_preset.py @@ -5,7 +5,7 @@ from unittest import TestCase from voicevox_engine.preset.Preset import Preset -from voicevox_engine.preset.PresetError import PresetInternalError, PresetInputError +from voicevox_engine.preset.PresetError import PresetInputError, PresetInternalError from voicevox_engine.preset.PresetManager import PresetManager presets_test_1_yaml_path = Path("test/preset/presets-test-1.yaml") @@ -43,7 +43,9 @@ def test_validation_2(self) -> None: def test_preset_id(self) -> None: preset_manager = PresetManager(preset_path=presets_test_3_yaml_path) - with self.assertRaises(PresetInternalError, msg="プリセットのidに重複があります"): + with self.assertRaises( + PresetInternalError, msg="プリセットのidに重複があります" + ): preset_manager.load_presets() def test_empty_file(self) -> None: @@ -254,7 +256,9 @@ def test_update_preset_not_found(self) -> None: "postPhonemeLength": 0.1, } ) - with self.assertRaises(PresetInputError, msg="更新先のプリセットが存在しません"): + with self.assertRaises( + PresetInputError, msg="更新先のプリセットが存在しません" + ): preset_manager.update_preset(preset) self.assertEqual(len(preset_manager.presets), 2) remove(temp_path) @@ -308,7 +312,9 @@ def test_delete_preset_not_found(self) -> None: temp_path = self.tmp_dir_path / "presets-test-temp.yaml" copyfile(presets_test_1_yaml_path, temp_path) preset_manager = PresetManager(preset_path=temp_path) - with self.assertRaises(PresetInputError, msg="削除対象のプリセットが存在しません"): + with self.assertRaises( + PresetInputError, msg="削除対象のプリセットが存在しません" + ): preset_manager.delete_preset(10) self.assertEqual(len(preset_manager.presets), 2) remove(temp_path) diff --git a/voicevox_engine/preset/PresetError.py b/voicevox_engine/preset/PresetError.py index d2835ddd3..8134e16ed 100644 --- a/voicevox_engine/preset/PresetError.py +++ b/voicevox_engine/preset/PresetError.py @@ -3,8 +3,11 @@ class PresetInputError(Exception): """クライアントのリクエスト値に起因するエラー""" + pass + class PresetInternalError(Exception): """サーバー/ENGINE に起因するエラー""" + pass From 2f4e4059a07515230ac846eaf9509ec1eeb9da14 Mon Sep 17 00:00:00 2001 From: tarepan Date: Sun, 14 Apr 2024 18:41:38 +0000 Subject: [PATCH 3/6] fix: lint --- run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run.py b/run.py index aab52b5c0..3aa38f04e 100644 --- a/run.py +++ b/run.py @@ -64,8 +64,8 @@ from voicevox_engine.morphing import ( synthesis_morphing_parameter as _synthesis_morphing_parameter, ) -from voicevox_engine.preset.PresetManager import PresetManager from voicevox_engine.preset.PresetError import PresetInputError, PresetInternalError +from voicevox_engine.preset.PresetManager import PresetManager from voicevox_engine.setting.Setting import CorsPolicyMode from voicevox_engine.setting.SettingLoader import USER_SETTING_PATH, SettingHandler from voicevox_engine.tts_pipeline.kana_converter import create_kana, parse_kana From ea91d86a7854aa64fff68a48c648c2fa67f07cb3 Mon Sep 17 00:00:00 2001 From: tarepan Date: Wed, 1 May 2024 19:56:39 +0900 Subject: [PATCH 4/6] Update voicevox_engine/preset/PresetError.py Co-authored-by: Hiroshiba --- voicevox_engine/preset/PresetError.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voicevox_engine/preset/PresetError.py b/voicevox_engine/preset/PresetError.py index 8134e16ed..027ab1a13 100644 --- a/voicevox_engine/preset/PresetError.py +++ b/voicevox_engine/preset/PresetError.py @@ -2,7 +2,7 @@ class PresetInputError(Exception): - """クライアントのリクエスト値に起因するエラー""" + """受け入れ不可能な入力値に起因するエラー""" pass From e3131bbaebb52a5b0ae4b2c71fc7d859daecc4f4 Mon Sep 17 00:00:00 2001 From: tarepan Date: Wed, 1 May 2024 10:59:22 +0000 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20`PresetInternalError`=20docstring=20?= =?UTF-8?q?=E3=82=92=E3=83=89=E3=83=A1=E3=82=A4=E3=83=B3=E5=86=85=E3=81=AE?= =?UTF-8?q?=E4=BA=8B=E8=B1=A1=E3=81=AB=E9=96=A2=E3=81=99=E3=82=8B=E8=A8=98?= =?UTF-8?q?=E8=BF=B0=E3=81=B8=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/preset/PresetError.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voicevox_engine/preset/PresetError.py b/voicevox_engine/preset/PresetError.py index 027ab1a13..371b5768a 100644 --- a/voicevox_engine/preset/PresetError.py +++ b/voicevox_engine/preset/PresetError.py @@ -8,6 +8,6 @@ class PresetInputError(Exception): class PresetInternalError(Exception): - """サーバー/ENGINE に起因するエラー""" + """ENGINE 内部に起因するエラー""" pass From aaf8bf2dd9e830f1bd6a2aab893e132269d94a98 Mon Sep 17 00:00:00 2001 From: tarepan Date: Fri, 3 May 2024 11:11:40 +0000 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20`PresetInternalError`=20docstring=20?= =?UTF-8?q?=E3=82=92=E6=98=8E=E7=A2=BA=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/preset/PresetError.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voicevox_engine/preset/PresetError.py b/voicevox_engine/preset/PresetError.py index 371b5768a..add7acf05 100644 --- a/voicevox_engine/preset/PresetError.py +++ b/voicevox_engine/preset/PresetError.py @@ -8,6 +8,6 @@ class PresetInputError(Exception): class PresetInternalError(Exception): - """ENGINE 内部に起因するエラー""" + """プリセットマネージャーに起因するエラー""" pass