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

整理: プリセットの public メソッド呼び出しによる内部更新を private へ変更 #1163

Merged
merged 3 commits into from
Apr 9, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
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
10 changes: 5 additions & 5 deletions run.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def audio_query_from_preset(
engine = get_engine(core_version)
core = get_core(core_version)
try:
presets = preset_manager.load_presets()
presets = preset_manager.read_all()
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
for preset in presets:
Expand Down Expand Up @@ -765,7 +765,7 @@ def get_presets() -> list[Preset]:
エンジンが保持しているプリセットの設定を返します
"""
try:
presets = preset_manager.load_presets()
presets = preset_manager.read_all()
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return presets
Expand All @@ -789,7 +789,7 @@ def add_preset(
新しいプリセットを追加します
"""
try:
id = preset_manager.add_preset(preset)
id = preset_manager.create(preset)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return id
Expand All @@ -813,7 +813,7 @@ def update_preset(
既存のプリセットを更新します
"""
try:
id = preset_manager.update_preset(preset)
id = preset_manager.update(preset)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return id
Expand All @@ -831,7 +831,7 @@ def delete_preset(
既存のプリセットを削除します
"""
try:
preset_manager.delete_preset(id)
preset_manager.delete(id)
except PresetError as err:
raise HTTPException(status_code=422, detail=str(err))
return Response(status_code=204)
Expand Down
52 changes: 26 additions & 26 deletions test/preset/test_preset.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ def tearDown(self) -> None:

def test_validation(self) -> None:
preset_manager = PresetManager(preset_path=presets_test_1_yaml_path)
presets = preset_manager.load_presets()
presets = preset_manager.read_all()
self.assertFalse(presets is None)

def test_validation_same(self) -> None:
preset_manager = PresetManager(preset_path=presets_test_1_yaml_path)
presets = preset_manager.load_presets()
presets2 = preset_manager.load_presets()
presets = preset_manager.read_all()
presets2 = preset_manager.read_all()
self.assertFalse(presets is None)
self.assertEqual(presets, presets2)

Expand All @@ -39,26 +39,26 @@ def test_validation_2(self) -> None:
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルにミスがあります"
):
preset_manager.load_presets()
preset_manager.read_all()

def test_preset_id(self) -> None:
preset_manager = PresetManager(preset_path=presets_test_3_yaml_path)
with self.assertRaises(PresetError, msg="プリセットのidに重複があります"):
preset_manager.load_presets()
preset_manager.read_all()

def test_empty_file(self) -> None:
preset_manager = PresetManager(preset_path=presets_test_4_yaml_path)
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルが空の内容です"
):
preset_manager.load_presets()
preset_manager.read_all()

def test_not_exist_file(self) -> None:
preset_manager = PresetManager(preset_path=Path("test/presets-dummy.yaml"))
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルが見つかりません"
):
preset_manager.load_presets()
preset_manager.read_all()

def test_add_preset(self) -> None:
temp_path = self.tmp_dir_path / "presets-test-temp.yaml"
Expand All @@ -78,7 +78,7 @@ def test_add_preset(self) -> None:
"postPhonemeLength": 0.1,
}
)
id = preset_manager.add_preset(preset)
id = preset_manager.create(preset)
self.assertEqual(id, 10)
self.assertEqual(len(preset_manager.presets), 3)
for _preset in preset_manager.presets:
Expand All @@ -91,7 +91,7 @@ def test_add_preset_load_failure(self) -> None:
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルにミスがあります"
):
preset_manager.add_preset(
preset_manager.create(
Preset(
**{
"id": 1,
Expand Down Expand Up @@ -126,7 +126,7 @@ def test_add_preset_conflict_id(self) -> None:
"postPhonemeLength": 0.1,
}
)
id = preset_manager.add_preset(preset)
id = preset_manager.create(preset)
self.assertEqual(id, 3)
self.assertEqual(len(preset_manager.presets), 3)
for _preset in preset_manager.presets:
Expand All @@ -152,7 +152,7 @@ def test_add_preset_conflict_id2(self) -> None:
"postPhonemeLength": 0.1,
}
)
id = preset_manager.add_preset(preset)
id = preset_manager.create(preset)
self.assertEqual(id, 3)
self.assertEqual(len(preset_manager.presets), 3)
for _preset in preset_manager.presets:
Expand All @@ -178,13 +178,13 @@ def test_add_preset_write_failure(self) -> None:
"postPhonemeLength": 0.1,
}
)
preset_manager.load_presets()
preset_manager.load_presets = lambda: [] # type:ignore[method-assign]
preset_manager.read_all()
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign]
preset_manager.preset_path = "" # type: ignore[assignment]
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルに書き込み失敗しました"
):
preset_manager.add_preset(preset)
preset_manager.create(preset)
self.assertEqual(len(preset_manager.presets), 2)
remove(temp_path)

Expand All @@ -206,7 +206,7 @@ def test_update_preset(self) -> None:
"postPhonemeLength": 0.1,
}
)
id = preset_manager.update_preset(preset)
id = preset_manager.update(preset)
self.assertEqual(id, 1)
self.assertEqual(len(preset_manager.presets), 2)
for _preset in preset_manager.presets:
Expand All @@ -219,7 +219,7 @@ def test_update_preset_load_failure(self) -> None:
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルにミスがあります"
):
preset_manager.update_preset(
preset_manager.update(
Preset(
**{
"id": 1,
Expand Down Expand Up @@ -255,7 +255,7 @@ def test_update_preset_not_found(self) -> None:
}
)
with self.assertRaises(PresetError, msg="更新先のプリセットが存在しません"):
preset_manager.update_preset(preset)
preset_manager.update(preset)
self.assertEqual(len(preset_manager.presets), 2)
remove(temp_path)

Expand All @@ -277,13 +277,13 @@ def test_update_preset_write_failure(self) -> None:
"postPhonemeLength": 0.1,
}
)
preset_manager.load_presets()
preset_manager.load_presets = lambda: [] # type:ignore[method-assign]
preset_manager.read_all()
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign]
preset_manager.preset_path = "" # type: ignore[assignment]
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルに書き込み失敗しました"
):
preset_manager.update_preset(preset)
preset_manager.update(preset)
self.assertEqual(len(preset_manager.presets), 2)
self.assertEqual(preset_manager.presets[0].name, "test")
remove(temp_path)
Expand All @@ -292,7 +292,7 @@ def test_delete_preset(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)
id = preset_manager.delete_preset(1)
id = preset_manager.delete(1)
self.assertEqual(id, 1)
self.assertEqual(len(preset_manager.presets), 1)
remove(temp_path)
Expand All @@ -302,27 +302,27 @@ def test_delete_preset_load_failure(self) -> None:
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルにミスがあります"
):
preset_manager.delete_preset(10)
preset_manager.delete(10)

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="削除対象のプリセットが存在しません"):
preset_manager.delete_preset(10)
preset_manager.delete(10)
self.assertEqual(len(preset_manager.presets), 2)
remove(temp_path)

def test_delete_preset_write_failure(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)
preset_manager.load_presets()
preset_manager.load_presets = lambda: [] # type:ignore[method-assign]
preset_manager.read_all()
preset_manager._refresh_cache = lambda: None # type:ignore[method-assign]
preset_manager.preset_path = "" # type: ignore[assignment]
with self.assertRaises(
PresetError, msg="プリセットの設定ファイルに書き込み失敗しました"
):
preset_manager.delete_preset(1)
preset_manager.delete(1)
self.assertEqual(len(preset_manager.presets), 2)
remove(temp_path)
82 changes: 24 additions & 58 deletions voicevox_engine/preset/PresetManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,20 @@ class PresetManager:
"""

def __init__(self, preset_path: Path):
"""
Parameters
----------
preset_path : Path
プリセット情報を一元管理するYAMLファイルへのパス
"""
self.presets: list[Preset] = []
"""プリセットの設定ファイルへのパスからプリセットマネージャーを生成する"""
self.presets: list[Preset] = [] # 全プリセットのキャッシュ
self.last_modified_time = 0.0
self.preset_path = preset_path

def load_presets(self) -> list[Preset]:
"""
既存プリセットの読み込み
Returns
-------
ret: list[Preset]
読み込まれたプリセットのリスト
"""
def _refresh_cache(self) -> None:
"""プリセットの設定ファイルの最新状態をキャッシュへ反映する"""

# データベース更新の確認(タイムスタンプベース)
try:
_last_modified_time = self.preset_path.stat().st_mtime
if _last_modified_time == self.last_modified_time:
# 更新無し、キャッシュを返す
return self.presets
# 更新無し
return
except OSError:
raise PresetError("プリセットの設定ファイルが見つかりません")

Expand All @@ -61,26 +50,15 @@ def load_presets(self) -> list[Preset]:
):
raise PresetError("プリセットのidに重複があります")

# キャッシュを更新する
self.presets = _presets
self.last_modified_time = _last_modified_time

return self.presets

def add_preset(self, preset: Preset) -> int:
"""
新規プリセットの追加
Parameters
----------
preset : Preset
新規プリセット
Returns
-------
ret: int
追加されたプリセットのID
"""
def create(self, preset: Preset) -> int:
tarepan marked this conversation as resolved.
Show resolved Hide resolved
"""新規プリセットを追加し、その ID を取得する。"""

# データベース更新の反映
self.load_presets()
self._refresh_cache()

# 新規プリセットID の発行。IDが0未満、または存在するIDなら新規IDを発行
if preset.id < 0 or preset.id in {preset.id for preset in self.presets}:
Expand All @@ -100,21 +78,19 @@ def add_preset(self, preset: Preset) -> int:

return preset.id

def update_preset(self, preset: Preset) -> int:
"""
既存プリセットの更新
Parameters
----------
preset : Preset
新しい既存プリセット
Returns
-------
ret: int
更新されたプリセットのID
"""
def read_all(self) -> list[Preset]:
"""全てのプリセットを取得する"""

# データベース更新の反映
self._refresh_cache()

return self.presets

def update(self, preset: Preset) -> int:
"""指定されたプリセットを更新し、その ID を取得する。"""

# データベース更新の反映
self.load_presets()
self._refresh_cache()

# 対象プリセットの検索
prev_preset: tuple[int, Preset | None] = (-1, None)
Expand All @@ -138,21 +114,11 @@ def update_preset(self, preset: Preset) -> int:

return preset.id

def delete_preset(self, id: int) -> int:
"""
指定したIDのプリセットの削除
Parameters
----------
id: int
削除対象プリセットのID
Returns
-------
ret: int
削除されたプリセットのID
"""
def delete(self, id: int) -> int:
"""ID で指定されたプリセットを削除し、その ID を取得する。"""

# データベース更新の反映
self.load_presets()
self._refresh_cache()

# 対象プリセットの検索
buf = None
Expand Down
Loading