codex/backend-optimization #2

Merged
imelon merged 11 commits from codex/backend-optimization into master 2026-06-05 11:36:19 +08:00
3 changed files with 55 additions and 8 deletions
Showing only changes of commit 53b9f48f7d - Show all commits
+3 -8
View File
@@ -4,6 +4,7 @@ from functools import cache
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from database.models import EmblemData, OathData, OathSuitData, OathSuitSkillData, PrimerData, EquData, SuitData, EnchantData, JadeData from database.models import EmblemData, OathData, OathSuitData, OathSuitSkillData, PrimerData, EquData, SuitData, EnchantData, JadeData
from database.connect import get_db_engine as get_engine from database.connect import get_db_engine as get_engine
from core.basic.equipment_registry import EquipmentRegistry
def parse_to_number_list(info: str, default: Sequence[float] = (0,)) -> list[float]: def parse_to_number_list(info: str, default: Sequence[float] = (0,)) -> list[float]:
@@ -422,14 +423,8 @@ class OathSuit:
self.__dict__.update(kwargs) self.__dict__.update(kwargs)
global equ0 _equipment_registry = EquipmentRegistry(Equipments)
equ0 = Equipments('0')
def get_equipment(version: str = '0') -> Equipments: def get_equipment(version: str = '0') -> Equipments:
# print('加载装备信息') return _equipment_registry.get(version)
try:
temp = eval(f'equ{version}'.format(version))
except Exception:
temp = equ0
return temp
+22
View File
@@ -0,0 +1,22 @@
from functools import cache
from pathlib import Path
from database.connect import BACKEND_DIR
class EquipmentRegistry:
def __init__(self, equipment_cls):
self.equipment_cls = equipment_cls
@cache
def get(self, version: str = '0'):
normalized = version or '0'
if not self._version_exists(normalized):
if normalized == '0':
return self.equipment_cls(normalized)
return self.get('0')
return self.equipment_cls(normalized)
def _version_exists(self, version: str) -> bool:
db_path = Path(BACKEND_DIR) / 'dataFiles' / f'dcalc_{version}.db'
return db_path.exists()
@@ -0,0 +1,30 @@
from core.basic.equipment import get_equipment
from core.basic.equipment_registry import EquipmentRegistry
def test_get_equipment_returns_cached_default_version():
first = get_equipment('0')
second = get_equipment('0')
assert first is second
assert first.version == '0'
def test_get_equipment_falls_back_to_default_version():
equipment = get_equipment('missing-version')
assert equipment.version == '0'
def test_equipment_registry_caches_by_version():
calls = []
class Equipment:
def __init__(self, version):
calls.append(version)
self.version = version
registry = EquipmentRegistry(Equipment)
assert registry.get('0') is registry.get('0')
assert calls == ['0']