From 4db6b4c7435026a2114e8f9c4885c9b8897ddc18 Mon Sep 17 00:00:00 2001 From: bomzheg Date: Sun, 27 Oct 2024 23:17:41 +0300 Subject: [PATCH] #106 few refactoring --- .../models/dto/{scn => }/action/__init__.py | 2 ++ .../models/dto/{scn => }/action/decisions.py | 2 +- .../models/dto/{scn => }/action/interface.py | 0 .../core/models/dto/{scn => }/action/keys.py | 15 +++++++++++- .../dto/{scn => }/action/state_holder.py | 7 +++--- shvatka/core/models/dto/level.py | 3 ++- shvatka/core/models/dto/scn/__init__.py | 2 +- shvatka/core/models/dto/scn/level.py | 24 +++++++------------ shvatka/core/models/dto/time_key.py | 4 ++-- shvatka/core/services/key.py | 2 +- shvatka/tgbot/dialogs/level_scn/getters.py | 4 ++-- shvatka/tgbot/dialogs/level_scn/handlers.py | 20 ++++++++++++---- 12 files changed, 51 insertions(+), 34 deletions(-) rename shvatka/core/models/dto/{scn => }/action/__init__.py (93%) rename shvatka/core/models/dto/{scn => }/action/decisions.py (94%) rename shvatka/core/models/dto/{scn => }/action/interface.py (100%) rename shvatka/core/models/dto/{scn => }/action/keys.py (93%) rename shvatka/core/models/dto/{scn => }/action/state_holder.py (77%) diff --git a/shvatka/core/models/dto/scn/action/__init__.py b/shvatka/core/models/dto/action/__init__.py similarity index 93% rename from shvatka/core/models/dto/scn/action/__init__.py rename to shvatka/core/models/dto/action/__init__.py index 63893ff7..e75bbabb 100644 --- a/shvatka/core/models/dto/scn/action/__init__.py +++ b/shvatka/core/models/dto/action/__init__.py @@ -1,6 +1,8 @@ from .interface import WinCondition, Action, State, Decision, DecisionType, StateHolder from .decisions import NotImplementedActionDecision, Decisions from .keys import ( + SHKey, + BonusKey, KeyDecision, KeyWinCondition, TypedKeyAction, diff --git a/shvatka/core/models/dto/scn/action/decisions.py b/shvatka/core/models/dto/action/decisions.py similarity index 94% rename from shvatka/core/models/dto/scn/action/decisions.py rename to shvatka/core/models/dto/action/decisions.py index cbc312ec..c807020c 100644 --- a/shvatka/core/models/dto/scn/action/decisions.py +++ b/shvatka/core/models/dto/action/decisions.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import Literal, Sequence, overload -from shvatka.core.models.dto.scn.action.interface import DecisionType, Decision +from shvatka.core.models.dto.action.interface import DecisionType, Decision @dataclass diff --git a/shvatka/core/models/dto/scn/action/interface.py b/shvatka/core/models/dto/action/interface.py similarity index 100% rename from shvatka/core/models/dto/scn/action/interface.py rename to shvatka/core/models/dto/action/interface.py diff --git a/shvatka/core/models/dto/scn/action/keys.py b/shvatka/core/models/dto/action/keys.py similarity index 93% rename from shvatka/core/models/dto/scn/action/keys.py rename to shvatka/core/models/dto/action/keys.py index 8eea85bf..9c2dfedf 100644 --- a/shvatka/core/models/dto/scn/action/keys.py +++ b/shvatka/core/models/dto/action/keys.py @@ -6,11 +6,24 @@ from . import StateHolder from .decisions import NotImplementedActionDecision from .interface import Action, State, Decision, WinCondition, DecisionType -from shvatka.core.models.dto.scn import BonusKey SHKey: typing.TypeAlias = str +@dataclass(frozen=True) +class BonusKey: + text: str + bonus_minutes: float + + def __eq__(self, other: object) -> bool: + if not isinstance(other, BonusKey): + return NotImplemented + return self.text == other.text + + def __hash__(self) -> int: + return hash(self.text) + + @dataclass class TypedKeyAction(Action): key: SHKey diff --git a/shvatka/core/models/dto/scn/action/state_holder.py b/shvatka/core/models/dto/action/state_holder.py similarity index 77% rename from shvatka/core/models/dto/scn/action/state_holder.py rename to shvatka/core/models/dto/action/state_holder.py index 5a102a3a..5d2b89f1 100644 --- a/shvatka/core/models/dto/scn/action/state_holder.py +++ b/shvatka/core/models/dto/action/state_holder.py @@ -1,14 +1,13 @@ from dataclasses import dataclass -from . import TypedKeysState +from . import TypedKeysState, SHKey from .interface import StateHolder, T -from shvatka.core.models.dto import scn @dataclass class InMemoryStateHolder(StateHolder): - typed_correct: set[scn.SHKey] - all_typed: set[scn.SHKey] + typed_correct: set[SHKey] + all_typed: set[SHKey] def get(self, state_class: type[T]) -> T: if isinstance(state_class, TypedKeysState): diff --git a/shvatka/core/models/dto/level.py b/shvatka/core/models/dto/level.py index 09578601..741483df 100644 --- a/shvatka/core/models/dto/level.py +++ b/shvatka/core/models/dto/level.py @@ -4,7 +4,8 @@ from datetime import timedelta from .player import Player -from .scn.level import LevelScenario, BonusKey +from .scn.level import LevelScenario +from .action.keys import BonusKey from .scn.time_hint import TimeHint, EnumeratedTimeHint diff --git a/shvatka/core/models/dto/scn/__init__.py b/shvatka/core/models/dto/scn/__init__.py index a82302c0..037a4dea 100644 --- a/shvatka/core/models/dto/scn/__init__.py +++ b/shvatka/core/models/dto/scn/__init__.py @@ -25,6 +25,6 @@ PhotoHint, ContactHint, ) -from .level import LevelScenario, SHKey, BonusKey, HintsList, Conditions +from .level import LevelScenario, HintsList, Conditions from .parsed_zip import ParsedZip from .time_hint import TimeHint diff --git a/shvatka/core/models/dto/scn/level.py b/shvatka/core/models/dto/scn/level.py index 8015b214..42e8b6cd 100644 --- a/shvatka/core/models/dto/scn/level.py +++ b/shvatka/core/models/dto/scn/level.py @@ -9,7 +9,7 @@ from shvatka.core.utils import exceptions from .hint_part import AnyHint from .time_hint import TimeHint, EnumeratedTimeHint -from .action import ( +from shvatka.core.models.dto.action import ( WinCondition, Action, Decision, @@ -20,25 +20,17 @@ KeyBonusCondition, NotImplementedActionDecision, ) -from .action.keys import SHKey, KeyWinCondition, TypedKeyAction, WrongKeyDecision +from shvatka.core.models.dto.action.keys import ( + SHKey, + KeyWinCondition, + TypedKeyAction, + WrongKeyDecision, + BonusKey, +) logger = logging.getLogger(__name__) -@dataclass(frozen=True) -class BonusKey: - text: str - bonus_minutes: float - - def __eq__(self, other: object) -> bool: - if not isinstance(other, BonusKey): - return NotImplemented - return self.text == other.text - - def __hash__(self) -> int: - return hash(self.text) - - class HintsList(Sequence[TimeHint]): def __init__(self, hints: list[TimeHint]): self.verify(hints) diff --git a/shvatka/core/models/dto/time_key.py b/shvatka/core/models/dto/time_key.py index 814dd293..e7197a52 100644 --- a/shvatka/core/models/dto/time_key.py +++ b/shvatka/core/models/dto/time_key.py @@ -4,12 +4,12 @@ from datetime import datetime from shvatka.core.models import dto, enums -from . import scn +from . import action @dataclass(frozen=True) class KeyTime: - text: scn.SHKey + text: action.SHKey type_: enums.KeyType is_duplicate: bool at: datetime diff --git a/shvatka/core/services/key.py b/shvatka/core/services/key.py index a314b04c..1b3f1c5c 100644 --- a/shvatka/core/services/key.py +++ b/shvatka/core/services/key.py @@ -4,7 +4,7 @@ from shvatka.core.interfaces.dal.game_play import GamePlayerDao from shvatka.core.models import dto -from shvatka.core.models.dto.scn import action +from shvatka.core.models.dto import action from shvatka.core.utils import exceptions from shvatka.core.utils.input_validation import is_key_valid from shvatka.core.utils.key_checker_lock import KeyCheckerFactory diff --git a/shvatka/tgbot/dialogs/level_scn/getters.py b/shvatka/tgbot/dialogs/level_scn/getters.py index 8057fd62..943fdadb 100644 --- a/shvatka/tgbot/dialogs/level_scn/getters.py +++ b/shvatka/tgbot/dialogs/level_scn/getters.py @@ -1,7 +1,7 @@ from adaptix import Retort from aiogram_dialog import DialogManager -from shvatka.core.models.dto import scn +import shvatka.core.models.dto.action.keys from shvatka.core.models.dto.scn import TimeHint @@ -24,7 +24,7 @@ async def get_bonus_keys(dialog_manager: DialogManager, **_): "bonus_keys", dialog_manager.start_data.get("bonus_keys", []) ) return { - "bonus_keys": retort.load(keys_raw, list[scn.BonusKey]), + "bonus_keys": retort.load(keys_raw, list[shvatka.core.models.dto.action.keys.BonusKey]), } diff --git a/shvatka/tgbot/dialogs/level_scn/handlers.py b/shvatka/tgbot/dialogs/level_scn/handlers.py index 5648bb65..1a46b8ee 100644 --- a/shvatka/tgbot/dialogs/level_scn/handlers.py +++ b/shvatka/tgbot/dialogs/level_scn/handlers.py @@ -5,6 +5,7 @@ from aiogram_dialog import Data, DialogManager from aiogram_dialog.widgets.kbd import Button +import shvatka.core.models.dto.action.keys from shvatka.core.models import dto from shvatka.core.models.dto import scn from shvatka.core.services.level import upsert_level, get_by_id @@ -69,7 +70,7 @@ async def on_correct_keys(m: Message, dialog_: Any, manager: DialogManager, keys await manager.done({"keys": keys}) -def convert_bonus_keys(text: str) -> list[scn.BonusKey]: +def convert_bonus_keys(text: str) -> list[shvatka.core.models.dto.action.keys.BonusKey]: result = [] for key_str in text.splitlines(): key, bonus = key_str.split(maxsplit=1) @@ -78,7 +79,9 @@ def convert_bonus_keys(text: str) -> list[scn.BonusKey]: parsed_bonus = float(bonus) if not (-600 < parsed_bonus < 60): raise ValueError("bonus out of available range") - parsed_key = scn.BonusKey(text=key, bonus_minutes=parsed_bonus) + parsed_key = shvatka.core.models.dto.action.keys.BonusKey( + text=key, bonus_minutes=parsed_bonus + ) result.append(parsed_key) return result @@ -94,7 +97,10 @@ async def not_correct_bonus_keys( async def on_correct_bonus_keys( - m: Message, dialog_: Any, manager: DialogManager, keys: list[scn.BonusKey] + m: Message, + dialog_: Any, + manager: DialogManager, + keys: list[shvatka.core.models.dto.action.keys.BonusKey], ): retort: Retort = manager.middleware_data["retort"] await manager.done({"bonus_keys": retort.dump(keys)}) @@ -139,7 +145,9 @@ async def on_start_level_edit(start_data: dict[str, Any], manager: DialogManager manager.dialog_data["level_id"] = level.name_id manager.dialog_data["keys"] = list(level.get_keys()) manager.dialog_data["time_hints"] = retort.dump(level.scenario.time_hints) - manager.dialog_data["bonus_keys"] = retort.dump(level.get_bonus_keys(), set[scn.BonusKey]) + manager.dialog_data["bonus_keys"] = retort.dump( + level.get_bonus_keys(), set[shvatka.core.models.dto.action.keys.BonusKey] + ) async def on_start_hints_edit(start_data: dict[str, Any], manager: DialogManager): @@ -210,7 +218,9 @@ async def save_level(c: CallbackQuery, button: Button, manager: DialogManager): id_ = data["level_id"] keys = set(map(normalize_key, data["keys"])) time_hints = retort.load(data["time_hints"], list[scn.TimeHint]) - bonus_keys = retort.load(data.get("bonus_keys", []), set[scn.BonusKey]) + bonus_keys = retort.load( + data.get("bonus_keys", []), set[shvatka.core.models.dto.action.keys.BonusKey] + ) level_scn = scn.LevelScenario(id=id_, keys=keys, time_hints=time_hints, bonus_keys=bonus_keys) level = await upsert_level(author=author, scenario=level_scn, dao=dao.level)