社会インフラシステムは、仕向け毎に仕様の一部が異なることが多く、仕様の差異を多数の設定パラメータとして管理することがある。このような設定パラメータはしばしば Excel を用いてドキュメント化され、同時に、マクロとして実装されたツールにより、アプリケーションが解釈可能な設定ファイルの生成が行われている。しかしながら、このようなツールにはソースコードとしてのマクロの構成管理の難しさや、継続的インテグレーション(CI)を実現するツールからの実行が困難などの課題がある。
そこで、我々はある社会インフラシステムの向けに、Excel で管理された設定データをもとに、設定ファイルを生成するツールを Python で開発した。本発表では、ツールの開発で得られた以下の知見について述べる。
(1) Embeddable 版 Python のバンドル
-----------------------------------------------
社会インフラシステムのライフサイクルは10年以上にわたるため、長期間ツールも実行可能である必要がある。一方で、ソースコードと使用するライブラリを記述した requirements.txt を共有し、それぞれの環境で pip でパッケージをインストールする方法では、必要なパッケージがリポジトリに存在し続ける保証はなく、同じ環境を再現できなくなる可能性がある。そこで、Embeddable 版の Python をベースに必要なライブラリを追加した Python 実行環境を作成し、ツールとバンドルして利用者間で共有する方法を採用した。
(2) openpyxl による Excel ファイルの読み込みとデータクラスへの変換
---------------------------------------------------------------------
Python から Excel データを読み込む方法はいくつかあるが、本ツール openpyxl を採用した。openpyxl は Excel 2010 以降のドキュメントを読み書きできるライブラリである。openpyxl は Excel ファイルを直接読み込むことができるため、Excel がインストールされていないコンテナ上でも動作し、CI 環境を容易に構築できる。
また、Excel ファイルのテーブルの行を Python 3.7 から導入されたデータクラスのオブジェクトとして読み込めるようにした。Excel 上に記載した独自形式のスキーマ情報をもとにデータクラスを動的に生成することで実現している。
(3) Jinja2 による設定ファイルの生成
-----------------------------------------------
対象としたシステムの中には、設定ファイルの全体ではなく、一部のみを自動生成する必要のあるものがあった。このような設定ファイルの生成には、Web アプリケーションで使用されるテンプレートエンジンンの Jinja2 を使用した。これにより、手作業で編集する部分については、Jinja2 テンプレートを編集することで従来通りの方法を維持しつつ、一部のみを自動生成できる。