何を見つけたか
共通層のモジュールを読むテストのうち 2 つ(plugins/ndf/skills/cross-review/tests/test_monitor_outcome_file.py の _load_outcome_mod と plugins/ndf/scripts/tests/test_monitor_outcome_unit.py の _load_monitor_outcome)は、importlib.util.spec_from_file_location で読み込んだモジュールを sys.modules に登録しない。この形で読んだモジュールが from __future__ import annotations の下で @dataclass を持つと、dataclass が型注釈を解くときに sys.modules[cls.__module__] を引いて KeyError で落ちる。
再現: plugins/ndf/scripts/lib/monitor_outcome.py の先頭に from __future__ import annotations を戻し、@dataclass(frozen=True) class LaunchOutcome を持ったまま上の 2 テストを実行する。
どこで見つけたか
#729 の実装(結末を 1 つの値として読む関数 read_launch_outcome と LaunchOutcome の新設)で、monitor_outcome.py に dataclass を足したとき。回避として monitor_outcome.py から from __future__ import annotations を外した(Python 3.10 以上では注釈を実行時に評価できるため振る舞いは同じ)。
cross-review の tests/conftest.py の _load_module は sys.modules[name] = mod を行っており、この落とし穴に当たらない。
なぜこの変更の範囲外なのか
#729 の受け入れ条件(AC1〜AC24)はテストの読み込みの流儀を対象にしていない。実装計画の「やらないこと」にも無いが、直す対象は共通層と cross-review の結果なしの判断であって、テストの足場ではない。
直さないと何が起きるか
共通層(plugins/ndf/scripts/lib/)に dataclass を持つモジュールを足す・既存のモジュールに from __future__ import annotations を足すたびに、読み込みの流儀の違いで一部のテストだけが落ちる。落ちる理由が読み込みの側にあるため、実装の誤りと切り分けるのに時間がかかる。
直し方の候補: 2 つのテストの読み込みを conftest._load_module と同じ形(sys.modules へ登録する)へ揃える。
由来
issue #729(G3 の実装。Pull Request は作成前)
何を見つけたか
共通層のモジュールを読むテストのうち 2 つ(
plugins/ndf/skills/cross-review/tests/test_monitor_outcome_file.pyの_load_outcome_modとplugins/ndf/scripts/tests/test_monitor_outcome_unit.pyの_load_monitor_outcome)は、importlib.util.spec_from_file_locationで読み込んだモジュールをsys.modulesに登録しない。この形で読んだモジュールがfrom __future__ import annotationsの下で@dataclassを持つと、dataclassが型注釈を解くときにsys.modules[cls.__module__]を引いてKeyErrorで落ちる。再現:
plugins/ndf/scripts/lib/monitor_outcome.pyの先頭にfrom __future__ import annotationsを戻し、@dataclass(frozen=True) class LaunchOutcomeを持ったまま上の 2 テストを実行する。どこで見つけたか
#729 の実装(結末を 1 つの値として読む関数
read_launch_outcomeとLaunchOutcomeの新設)で、monitor_outcome.pyにdataclassを足したとき。回避としてmonitor_outcome.pyからfrom __future__ import annotationsを外した(Python 3.10 以上では注釈を実行時に評価できるため振る舞いは同じ)。cross-review の
tests/conftest.pyの_load_moduleはsys.modules[name] = modを行っており、この落とし穴に当たらない。なぜこの変更の範囲外なのか
#729 の受け入れ条件(AC1〜AC24)はテストの読み込みの流儀を対象にしていない。実装計画の「やらないこと」にも無いが、直す対象は共通層と cross-review の結果なしの判断であって、テストの足場ではない。
直さないと何が起きるか
共通層(
plugins/ndf/scripts/lib/)にdataclassを持つモジュールを足す・既存のモジュールにfrom __future__ import annotationsを足すたびに、読み込みの流儀の違いで一部のテストだけが落ちる。落ちる理由が読み込みの側にあるため、実装の誤りと切り分けるのに時間がかかる。直し方の候補: 2 つのテストの読み込みを
conftest._load_moduleと同じ形(sys.modulesへ登録する)へ揃える。由来
issue #729(G3 の実装。Pull Request は作成前)