From 53b9f48f7da9ac741df322d268b4c30ebe58c49d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 4 Jun 2026 19:46:09 +0800 Subject: [PATCH] refactor: add equipment registry --- backend/core/basic/equipment.py | 11 ++----- backend/core/basic/equipment_registry.py | 22 ++++++++++++++ backend/tests/unit/test_equipment_registry.py | 30 +++++++++++++++++++ 3 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 backend/core/basic/equipment_registry.py create mode 100644 backend/tests/unit/test_equipment_registry.py diff --git a/backend/core/basic/equipment.py b/backend/core/basic/equipment.py index 4143b3e5..8549fb2f 100644 --- a/backend/core/basic/equipment.py +++ b/backend/core/basic/equipment.py @@ -4,6 +4,7 @@ from functools import cache from sqlalchemy.orm import Session from database.models import EmblemData, OathData, OathSuitData, OathSuitSkillData, PrimerData, EquData, SuitData, EnchantData, JadeData 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]: @@ -422,14 +423,8 @@ class OathSuit: self.__dict__.update(kwargs) -global equ0 -equ0 = Equipments('0') +_equipment_registry = EquipmentRegistry(Equipments) def get_equipment(version: str = '0') -> Equipments: - # print('加载装备信息') - try: - temp = eval(f'equ{version}'.format(version)) - except Exception: - temp = equ0 - return temp + return _equipment_registry.get(version) diff --git a/backend/core/basic/equipment_registry.py b/backend/core/basic/equipment_registry.py new file mode 100644 index 00000000..3ad157ca --- /dev/null +++ b/backend/core/basic/equipment_registry.py @@ -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() diff --git a/backend/tests/unit/test_equipment_registry.py b/backend/tests/unit/test_equipment_registry.py new file mode 100644 index 00000000..d91473ca --- /dev/null +++ b/backend/tests/unit/test_equipment_registry.py @@ -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']