bcdice / bcdice-js

BCDice ported package for TypeScript and JavaScript by Opal.
BSD 3-Clause "New" or "Revised" License
22 stars 9 forks source link

クラス継承を使用しているダイスボットでは全ての継承元クラスのi18n情報を動的インポートする #55

Closed TK11235 closed 2 years ago

TK11235 commented 2 years ago

概要

CIのエラーで気付いたバグの修正です。 あるダイスボットが別のダイスボットと継承関係を持っている場合、全ての継承元クラスのi18nファイルを動的インポートする必要があります。

バグ

53 のコードにはバグがありました。

具体的な再現例としてはSwordWorld2.5を動的インポートする場合が挙げられます。

初期状態からSwordWorld2.5のみを動的インポートした場合、#53 のコードではSwordWorld2.5のi18nファイルだけがインポートされた状態となります。 この状態でSwordWorld2.5の継承元クラスであるSwordWorldSwordWorld2.0の機能を使用すると、SwordWorldSwordWorld2.0のi18n情報不足によってエラーになります。

CIのエラー

53 でローカル環境のテストがパスしていたのは、I18n.$clear_translate_table()によるi18nリセットのタイミングが適切ではなく、SwordWorldSwordWorld2.0SwordWorld2.5という"安全な順番"で動的インポート&テストが行われていた為と考えています。

GitHubのCIでエラーが表面化した理由は、推測ですが、async/awaitのタイミング揺らぎでi18n情報リセットのタイミングがブレたのかなと考えています。(曖昧) テスト結果としてはCIの挙動とエラーが正しい筈です。

変更内容

クラス継承があり、なおかつi18nを使用するダイスボットは現状ではSwordWorld系統のみです。 しかし、将来的に追加されるダイスボットがSwordWorld系統と同様または亜種的なクラス継承関係を持つ場合が想定されます。

このPRではそういったクラス継承が存在する場合のi18nファイル検索も想定してgame_system_list.jsonsuperClassNameキーを追加しています。

影響範囲

影響範囲は #53 のバグ修正のみです。

esnya commented 2 years ago

ローカルでも(成功が多かったものの)テスト結果が不安定だったので、実行順というのは正しそうです。ありがとうございます。