Skip to content

Commit

Permalink
added few adaptix fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
bomzheg committed Dec 3, 2024
1 parent 8537d0a commit fd8e923
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 15 deletions.
10 changes: 7 additions & 3 deletions shvatka/api/models/responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,20 @@
from datetime import datetime
from typing import Sequence, Generic

from adaptix import Retort, dumper
from adaptix import Retort, dumper, P

from shvatka.common.factory import REQUIRED_GAME_RECIPES
from shvatka.core.games.dto import CurrentHints
from shvatka.core.models import dto, enums
from shvatka.core.models.dto import scn
from shvatka.core.models.dto import scn, action
from shvatka.core.models.enums import GameStatus

T = typing.TypeVar("T")
retort = Retort(recipe=[*REQUIRED_GAME_RECIPES, dumper(scn.HintsList, lambda x: x.hints)])
retort = Retort(recipe=[
*REQUIRED_GAME_RECIPES,
dumper(scn.HintsList, lambda x: x.hints),
dumper(P[action.KeyBonusCondition].keys, lambda keys: [{"text": x.text, "bonus_minutes": x.bonus_minutes} for x in keys]),
])


@dataclass
Expand Down
9 changes: 5 additions & 4 deletions shvatka/common/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from telegraph.aio import Telegraph

from shvatka.common.url_factory import UrlFactory
from shvatka.core.models.dto import scn
from shvatka.core.models.dto import scn, action
from shvatka.core.models.dto.action import AnyCondition
from shvatka.core.models.dto.scn import HintsList, TimeHint, Conditions
from shvatka.core.models.schems import schemas
Expand All @@ -40,12 +40,12 @@ def create_telegraph(self, bot_config: BotConfig) -> Telegraph:
REQUIRED_GAME_RECIPES = [
name_mapping(map={"__model_version__": "__model_version__"}),
loader(HintsList, lambda x: HintsList.parse(x), Chain.LAST),
ABCProxy(HintsList, list[TimeHint]), # internal class, can be broken in next version adaptix
ABCProxy(HintsList, list[TimeHint]), # internal class, can be broken in next adaptix version
loader(Conditions, lambda x: Conditions(x), Chain.LAST),
ABCProxy(
Conditions, list[AnyCondition]
), # internal class, can be broken in next version adaptix
dumper(set, lambda x: tuple(x)),
), # internal class, can be broken in next adaptix version
dumper(P[action.KeyWinCondition].keys, list),
]


Expand All @@ -68,6 +68,7 @@ def create_retort(self) -> Retort:
name_style=adaptix.NameStyle.LOWER_KEBAB,
),
*REQUIRED_GAME_RECIPES,
dumper(P[action.KeyBonusCondition].keys, lambda keys: [{"text": x.text, "bonus-minutes": x.bonus_minutes} for x in keys]),
validator(
pred=P[scn.LevelScenario].id,
func=lambda x: validate_level_id(x) is not None,
Expand Down
19 changes: 15 additions & 4 deletions shvatka/infrastructure/db/models/level.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,32 @@
import logging
import typing
from typing import Any

from adaptix import Retort
from adaptix import Retort, dumper, P
from sqlalchemy import Integer, Text, ForeignKey, JSON, TypeDecorator, UniqueConstraint
from sqlalchemy.engine import Dialect
from sqlalchemy.orm import relationship, mapped_column, Mapped

from shvatka.common.factory import REQUIRED_GAME_RECIPES
from shvatka.core.models import dto
from shvatka.core.models.dto import scn
from shvatka.core.models.dto import scn, action
from shvatka.infrastructure.db.models import Base

if typing.TYPE_CHECKING:
from .game import Game
from .player import Player

logger = logging.getLogger(__name__)


class ScenarioField(TypeDecorator):
impl = JSON
cache_ok = True
retort = Retort(
recipe=REQUIRED_GAME_RECIPES,
recipe=[
dumper(P[action.KeyBonusCondition].keys, lambda keys: [{"text": x.text, "bonus_minutes": x.bonus_minutes} for x in keys]),
*REQUIRED_GAME_RECIPES
],
)

def coerce_compared_value(self, op: Any, value: Any):
Expand All @@ -29,7 +35,12 @@ def coerce_compared_value(self, op: Any, value: Any):
return self.impl().coerce_compared_value(op=op, value=value)

def process_bind_param(self, value: scn.LevelScenario | None, dialect: Dialect):
return self.retort.dump(value, scn.LevelScenario)
try:
dumped = self.retort.dump(value, scn.LevelScenario)
except Exception as e:
logger.exception("can't dump level scenario", exc_info=e)
raise
return dumped

def process_result_value(self, value: Any, dialect: Dialect) -> scn.LevelScenario | None:
if value is None:
Expand Down
8 changes: 4 additions & 4 deletions shvatka/tgbot/dialogs/level_scn/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import shvatka.core.models.dto.action.keys
from shvatka.core.models import dto
from shvatka.core.models.dto import scn
from shvatka.core.models.dto import scn, action
from shvatka.core.services.level import upsert_level, get_by_id
from shvatka.core.utils.input_validation import (
is_multiple_keys_normal,
Expand Down Expand Up @@ -100,10 +100,10 @@ async def on_correct_bonus_keys(
m: Message,
dialog_: Any,
manager: DialogManager,
keys: list[shvatka.core.models.dto.action.keys.BonusKey],
keys: list[action.BonusKey],
):
retort: Retort = manager.middleware_data["retort"]
await manager.done({"bonus_keys": retort.dump(keys)})
await manager.done({"bonus_keys": retort.dump(keys, list[action.BonusKey])})


async def process_time_hint_result(start_data: Data, result: Any, manager: DialogManager):
Expand Down Expand Up @@ -146,7 +146,7 @@ async def on_start_level_edit(start_data: dict[str, Any], manager: DialogManager
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[shvatka.core.models.dto.action.keys.BonusKey]
list(level.get_bonus_keys()), list[action.BonusKey]
)


Expand Down
4 changes: 4 additions & 0 deletions tests/fixtures/resources/complex_scn.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ levels:
keys:
- "SH123"
- "SH321"
- type: BONUS_KEY
keys:
- text: "SHBONUS"
bonus-minutes: 10
time-hints:
- time: 0
hint:
Expand Down

0 comments on commit fd8e923

Please sign in to comment.