開発ではいろいろな OSS(オープンソースソフトウェア) のライブラリを利用していくことが一般的ですが、 OSS のライブラリを利用していて痒いところに手が届かずに困ることがあるかと思います。 この記事は、私が実際 OSS のライブラリを利用していて困った時にプルリクエストを出してマージされたときのお話です。
前置きとか
Synergy!のアプリケーションのモダナイズ(名称:NEWT)プロジェクトで、私は「フォーム機能」のバックエンドを担当しています。
「フォーム機能」ではユーザが入力した内容が正しいかをバリデーションする必要がありますが、フォームにおける正しい入力値の定義に、JSON Schema を採用しています。 JSON Schema とは JSON のデータ構造を JSON 自体で定義したものです。 ユーザの入力した内容を JSON として JSON Schema と合致しているかをチェックすることでバリデーションを行なっています。
モダナイズされた「フォーム機能」では、ユーザが入力中にバリデーションエラーのメッセージを表示できるようになっています。 これはフロントエンド側でバリデーションを行なうことで実現していますが、 フロントエンド側で愚直にバリデーションを実装すると、バックエンドと二重実装になってしまいます。 JSON Schema によって、フロントエンドとバックエンドでフォームにおける正しい入力値の定義を共有することができ、バリデーションの実装差異を極力なくすことができています。
で、困りました。。
モダナイズされた「フォーム機能」のバックエンドでの JSON Schema を用いたユーザが入力した内容のバリデーションには、networknt/json-schema-validator を採用しています。
networknt/json-schema-validator を採用した理由ですが、フォームが進化するたびに、JSON Schema で利用できる keyword で対応出来ないようなバリデーションに対応する場合もありうると考え、networknt/json-schema-validator がカスタムの keyword を定義して拡張がしやすいと判断したためです。 (余談ですが、フロントエンド側も同様の理由で ajv を採用しています)
しかし、networknt/json-schema-validatorの用意している EmailValidator で、我々の望むメールアドレスのパターンのバリデーションが出来なくて困りました。
当初、以下のような定義(実際にはもっと複雑ですが簡略化してます)で format: email
として定義しておいて、なおかつ format: email
の場合に適用する正規表現のパターンを我々のアプリケーションに適したものに上書きすれば、メールアドレスのバリデーションが実現できるだろう、と考えていました。
{ "type": "string", "format": "email" }
バージョンが v1.0.20 までは上書きできる作りになっていたので問題なかったのですが、
v1.0.21 に入った修正 により、format: email
の場合は先述した EmailValidator が強制適用され、しかもパターンの上書きもできなくなってしまいました。
しばらくは仕方なく変更が入る前の v1.0.20 を利用していましたが、このままだとバージョンアップ出来ない問題があるため、JSON Schema の新しい仕様に追随できないなどの問題がありました。
で、どうする?
どうするかの対応案を以下のように考えていました。が、既にリリース済であることもあり、どの案もなかなかしっくりきませんでした。。
- 他のライブラリを探す。ただし、以下を満たすものでないといけない。
- メールアドレスのバリデーションの挙動が期待通りである or 上書きできる。
- カスタム keyword の利用が可能。
- format: email を諦めて、pattern で定義する。
- 既存のデータの書き換えが必要で面倒。
- networknt/json-schema-validator を fork する。fork した上で EmailValidator の挙動を上書きできるようにする。
- この場合、fork したライブラリをメンテナンスし続ける必要がある。
そんな中でいちばん最後の案に近い、networknt/json-schema-validator に EmailValidatorの挙動を上書きできるようにダメ元でプルリクエストを 出してみようと考えました。
fork しようと考えたこともあったのでソースコードは見ており、この辺りで先述の EmailValidator が強制適用されるため、ここを修正してやれば挙動を上書きできそう、ということは掴んでいました。
プルリクエスト出しました
で、プルリクエストを出しました。
「EmailValidator が要件に合わないから上書きしたいけどできないからできるようにしたよ」ということを私が言っています。
思ったよりも早く2日後に返信がきました。 私が最初に出した修正が、メールアドレスのみ挙動を変更できるような修正だったので、 「メールアドレス以外の format でも同じように上書きできるようにした方が良いのでは?」とのことです。 感触は悪くありません。
「UUID や date-time の挙動はカスタマイズしたいとは特に思っていないけど、場合によってはカスタマイズもしたいかもしれないから、できるように修正します」というようなことを私が言ってます。
「テスト追加とドキュメントへの記載をしてくれ」と返信があり、対応しました。 その後マージされて、v1.0.51 をリリースしたと返信いただきました 🎉
3月24日にプルリクエストを出して、3月31日にマージされたので1週間で問題解決です 👍
終わりに
最後に、OSS にプルリクエストを出すのは特別高いハードルがある訳ではない、ということを伝えたいです。
プルリクエストを出すことそのものは自由ですし、そのプルリクエストが受け入れてもらえるかどうかは相手次第な部分もあるため、必要と思い修正ができそうならプルリクエスト出していくべきでは、と思います。 (自分の修正によって、そのライブラリを利用している他の人に影響は出ないように、という意識は必要ですが)
また、英語でやりとりしていますが、私は特別英語ができる訳でもなく、日本語を Google 翻訳で英語に変換して、ちょっと手直しした文章でやりとりしているだけです。(Google 翻訳が優秀)
皆さんも是非一度プルリクエストを出してみてはいかがでしょうか。自分の提案がマージされると嬉しいものですよ。