pyproject-fmt 2.13.0での破壊的変更について
pyproject-fmtというプロジェクトがある。これは、Pythonプロジェクトで標準的に用いられる設定ファイルであるpyproject.tomlに特化したフォーマッタである。
このpyproject-fmtだが、バージョン2.13.0で破壊的変更があった。具体的な内容は割愛するが、2.13.0以前のバージョンで整形したものが、2.13.0以降のバージョンでは「未整形」として扱われてしまうのである。
自分のプロジェクト(hotaru)では、pyproject-fmtを使ってpyproject.tomlを整形しているのだが、
この破壊的変更によって、ローカルではテストが通るのに、リモート(GitHub ActionsによるCI)では落ちる、ということが起こった。
手元ではpoetryを使ってpyproject.tomlに追加しており、pyproject-fmt>=2.12.1,<3というバージョンの制約がすでになされていたのだが、この制約では不十分だったわけである。
気づいてしまえば単純な話であり、対処法は簡単である。バージョン指定の下限を変えるか、上限を変えるか。つまり、リモートに合わせるか、ローカルに合わせるか。
そもそもpoetryはなぜpyproject-fmt>=2.12.1,<3というバージョン指定をしたのか。それは、パッケージのバージョンが、Semantic Versioningという考え方で振られていることを期待しているからである。
この考え方によると、(メジャーバージョンが0でない場合)、破壊的変更がなされる場合にはメジャーバージョンを上げることになっている。
今回のように「2.13.0へのアップデートにより破壊的変更が導入される」ことは、poetry側がそもそも想定していないということだ。
pyproject-fmtはスター200程度の小規模なプロジェクトである。このようなプロジェクトにおいては、Semantic Versioningに従っていることを期待してはいけないのかもしれない。
開発ペースがかなり早いということもあり、今後も同じようなことが頻発することが容易に想像できるため、バージョン指定をpyproject-fmt>=2.12.1,<2.13にすることで対応することにした。