From 5796d9a80ff488dcc6c8f1128a17d755e7def1ec Mon Sep 17 00:00:00 2001 From: 283375 Date: Sat, 16 Sep 2023 02:40:56 +0800 Subject: [PATCH] impr(external): `ArcaeaParser` file reading --- src/arcaea_offline/external/arcaea/common.py | 20 +++++++++++++++++++ .../external/arcaea/packlist.py | 3 +-- .../external/arcaea/songlist.py | 3 +-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/arcaea_offline/external/arcaea/common.py b/src/arcaea_offline/external/arcaea/common.py index 96dc86c..f1c8e4c 100644 --- a/src/arcaea_offline/external/arcaea/common.py +++ b/src/arcaea_offline/external/arcaea/common.py @@ -1,3 +1,4 @@ +import contextlib import json from os import PathLike from typing import Any, List, Optional, Union @@ -43,6 +44,25 @@ class ArcaeaParser: def __init__(self, filepath: Union[str, bytes, PathLike]): self.filepath = filepath + def read_file_text(self): + file_handle = None + + with contextlib.suppress(TypeError): + # original open + file_handle = open(self.filepath, "r", encoding="utf-8") + + if file_handle is None: + try: + # or maybe a `pathlib.Path` subset + # or an `importlib.resources.abc.Traversable` like object + # e.g. `zipfile.Path` + file_handle = self.filepath.open(mode="r", encoding="utf-8") + except Exception as e: + raise ValueError("Invalid `filepath`.") from e + + with file_handle: + return file_handle.read() + def parse(self) -> List[DeclarativeBase]: ... diff --git a/src/arcaea_offline/external/arcaea/packlist.py b/src/arcaea_offline/external/arcaea/packlist.py index e35e8e7..0d85e59 100644 --- a/src/arcaea_offline/external/arcaea/packlist.py +++ b/src/arcaea_offline/external/arcaea/packlist.py @@ -10,8 +10,7 @@ class PacklistParser(ArcaeaParser): super().__init__(filepath) def parse(self) -> List[Union[Pack, PackLocalized]]: - with open(self.filepath, "r", encoding="utf-8") as pl_f: - packlist_json_root = json.loads(pl_f.read()) + packlist_json_root = json.loads(self.read_file_text()) packlist_json = packlist_json_root["packs"] results: List[Union[Pack, PackLocalized]] = [ diff --git a/src/arcaea_offline/external/arcaea/songlist.py b/src/arcaea_offline/external/arcaea/songlist.py index 37ac206..02cbf93 100644 --- a/src/arcaea_offline/external/arcaea/songlist.py +++ b/src/arcaea_offline/external/arcaea/songlist.py @@ -12,8 +12,7 @@ class SonglistParser(ArcaeaParser): def parse( self, ) -> List[Union[Song, SongLocalized, Difficulty, DifficultyLocalized]]: - with open(self.filepath, "r", encoding="utf-8") as sl_f: - songlist_json_root = json.loads(sl_f.read()) + songlist_json_root = json.loads(self.read_file_text()) songlist_json = songlist_json_root["songs"] results = []