Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIX: プリセットマネージャーのエラーハンドリングを改善 #1489

Merged
merged 2 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions test/unit/preset/test_preset.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ def test_add_preset_write_failure(tmp_path: Path) -> None:
preset_manager.load_presets()
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign]
preset_manager.preset_path = "" # type: ignore[assignment]
true_msg = "プリセットの設定ファイルが見つかりません"
true_msg = "プリセットの書き込みに失敗しました"
with pytest.raises(PresetInternalError, match=true_msg):
preset_manager.add_preset(preset)
assert len(preset_manager.presets) == 2
Expand Down Expand Up @@ -302,7 +302,7 @@ def test_update_preset_write_failure(tmp_path: Path) -> None:
preset_manager.load_presets()
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign]
preset_manager.preset_path = "" # type: ignore[assignment]
true_msg = "プリセットの設定ファイルが見つかりません"
true_msg = "プリセットの書き込みに失敗しました"
with pytest.raises(PresetInternalError, match=true_msg):
preset_manager.update_preset(preset)
assert len(preset_manager.presets) == 2
Expand Down Expand Up @@ -345,7 +345,7 @@ def test_delete_preset_write_failure(tmp_path: Path) -> None:
preset_manager.load_presets()
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign]
preset_manager.preset_path = "" # type: ignore[assignment]
true_msg = "プリセットの設定ファイルが見つかりません"
true_msg = "プリセットの書き込みに失敗しました"
with pytest.raises(PresetInternalError, match=true_msg):
preset_manager.delete_preset(1)
assert len(preset_manager.presets) == 2
Expand Down
37 changes: 21 additions & 16 deletions voicevox_engine/preset/preset_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,24 @@ def _refresh_cache(self) -> None:
if _last_modified_time == self.last_modified_time:
# 更新無し
return
except OSError:
raise PresetInternalError("プリセットの設定ファイルが見つかりません")

# データベースの読み込み
with open(self.preset_path, mode="r", encoding="utf-8") as f:
obj = yaml.safe_load(f)
if obj is None:
raise PresetInternalError("プリセットの設定ファイルが空の内容です")

# データベースの読み込み
with open(self.preset_path, mode="r", encoding="utf-8") as f:
obj = yaml.safe_load(f)
except OSError as err:
raise PresetInternalError("プリセットの読み込みに失敗しました") from err
except yaml.YAMLError as err:
raise PresetInternalError("プリセットのパースに失敗しました") from err
if obj is None:
raise PresetInternalError("プリセットの設定ファイルが空の内容です")

try:
preset_list_adapter = TypeAdapter(list[Preset])
_presets = preset_list_adapter.validate_python(obj)
except ValidationError:
raise PresetInternalError("プリセットの設定ファイルにミスがあります")
except ValidationError as err:
raise PresetInternalError(
"プリセットの設定ファイルにミスがあります"
) from err

# 全idの一意性をバリデーション
if len([preset.id for preset in _presets]) != len(
Expand Down Expand Up @@ -87,8 +92,8 @@ def add_preset(self, preset: Preset) -> int:
self._write_on_file()
except Exception as err:
self.presets.pop()
if isinstance(err, FileNotFoundError):
raise PresetInternalError("プリセットの設定ファイルが見つかりません")
if isinstance(err, OSError):
raise PresetInternalError("プリセットの書き込みに失敗しました") from err
else:
raise err

Expand Down Expand Up @@ -123,8 +128,8 @@ def update_preset(self, preset: Preset) -> int:
self._write_on_file()
except Exception as err:
self.presets[prev_preset[0]] = prev_preset[1]
if isinstance(err, FileNotFoundError):
raise PresetInternalError("プリセットの設定ファイルが見つかりません")
if isinstance(err, OSError):
raise PresetInternalError("プリセットの書き込みに失敗しました") from err
else:
raise err

Expand All @@ -150,9 +155,9 @@ def delete_preset(self, id: int) -> int:
# 変更の反映。失敗時はリバート。
try:
self._write_on_file()
except FileNotFoundError:
except OSError as err:
self.presets.insert(buf_index, buf)
raise PresetInternalError("プリセットの設定ファイルが見つかりません")
raise PresetInternalError("プリセットの書き込みに失敗しました") from err

return id

Expand Down