From 844568db1a62381060b2353a817c0a5cadc3155a Mon Sep 17 00:00:00 2001 From: 283375 Date: Thu, 31 Aug 2023 22:18:11 +0800 Subject: [PATCH] feat(db): export methods --- src/arcaea_offline/database.py | 11 ++++++++++- .../external/exports/__init__.py | 2 ++ .../external/exports/exporters.py | 19 +++++++++++++++++++ src/arcaea_offline/external/exports/types.py | 16 ++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/arcaea_offline/external/exports/__init__.py create mode 100644 src/arcaea_offline/external/exports/exporters.py create mode 100644 src/arcaea_offline/external/exports/types.py diff --git a/src/arcaea_offline/database.py b/src/arcaea_offline/database.py index 282f98f..f7f4d02 100644 --- a/src/arcaea_offline/database.py +++ b/src/arcaea_offline/database.py @@ -1,10 +1,11 @@ import logging -from typing import Optional, Type, Union +from typing import List, Optional, Type, Union from sqlalchemy import Engine, func, inspect, select from sqlalchemy.orm import DeclarativeBase, InstrumentedAttribute, sessionmaker from .external.arcsong.arcsong_json import ArcSongJsonBuilder +from .external.exports import ScoreExport, exporters from .models.config import * from .models.scores import * from .models.songs import * @@ -211,7 +212,15 @@ class Database(metaclass=Singleton): # endregion + # region export + + def export_scores(self) -> List[ScoreExport]: + scores = self.get_scores() + return [exporters.score(score) for score in scores] + def generate_arcsong(self): with self.sessionmaker() as session: arcsong = ArcSongJsonBuilder(session).generate_arcsong_json() return arcsong + + # endregion diff --git a/src/arcaea_offline/external/exports/__init__.py b/src/arcaea_offline/external/exports/__init__.py new file mode 100644 index 0000000..5f34d9f --- /dev/null +++ b/src/arcaea_offline/external/exports/__init__.py @@ -0,0 +1,2 @@ +from . import exporters +from .types import ScoreExport diff --git a/src/arcaea_offline/external/exports/exporters.py b/src/arcaea_offline/external/exports/exporters.py new file mode 100644 index 0000000..35ec9c5 --- /dev/null +++ b/src/arcaea_offline/external/exports/exporters.py @@ -0,0 +1,19 @@ +from ...models import Score +from .types import ScoreExport + + +def score(score: Score) -> ScoreExport: + return { + "id": score.id, + "song_id": score.song_id, + "rating_class": score.rating_class, + "score": score.score, + "pure": score.pure, + "far": score.far, + "lost": score.lost, + "date": score.date, + "max_recall": score.max_recall, + "modifier": score.modifier, + "clear_type": score.clear_type, + "comment": score.comment, + } diff --git a/src/arcaea_offline/external/exports/types.py b/src/arcaea_offline/external/exports/types.py new file mode 100644 index 0000000..a5c3646 --- /dev/null +++ b/src/arcaea_offline/external/exports/types.py @@ -0,0 +1,16 @@ +from typing import Optional, TypedDict + + +class ScoreExport(TypedDict): + id: int + song_id: str + rating_class: int + score: int + pure: Optional[int] + far: Optional[int] + lost: Optional[int] + date: Optional[int] + max_recall: Optional[int] + modifier: Optional[int] + clear_type: Optional[int] + comment: Optional[str]