3.0.0をリリースしました]。3の定義ファイルを利用してリクエスト・レスポンスのバリデーションができます。committee-railsも最新のバージョンで3.0.0に対応してるため、railsを利用している人はこちらも導入すると便利に扱えます。3を使う場合は様々なオプションが推奨設定になっているため、初めて使う場合はフルにその恩恵を受けられるはずです。3に上げる場合は変換スクリプトがあるのでこれを使うと便利です。仕様上完全に変換することができないため、手で書いた場合に比べて冗長だったり、一部のnull非許可の設定がうまく変換できないことがあります。パスパラメータなどはHyper-Schema上に情報がそもそもないため、追加で登録する必要があったりと、結構癖が強い変換スクリプトになっています。3とではデフォルト設定が大幅に変わっています。3の一部の定義を考慮できません。3を導入する場合は基本的に新規導入のため、最大限利用できるおすすめの設定をデフォルトにしています。3を使わない人に変更を強要するのは避けたいため、2系の最新版との非互換の変更は起きないようになってます。そのため、一度2系の最新版に上げてdeprecatedになったオプション等を修正した状態で3系に上げると安全に上げられます。実装時に気になった点や、苦労した点がいくつかあります。Hyper-Schemaの形に変換しています。そのため、committeeの内部はHyper-Schemaの定義ファイルしか想定していませんでした。3はHyper-Schemaに比べてもう少し表現力が高く、かつ定義が厳密になっていたりとだいぶ違うため、変換するのではなくきちんとした処理を書いて共存するようにしました。いう風に抽象化しました。requsetに乗っているデータをバリデーションするファイルです。このファイルの2系では様々なバリデーションの処理が直接書かれていますが、3系では現在の定義に対応するクラスを取得し、そのクラスのバリデーションメソッドを呼ぶだけになっています。middlewareの層からは抽象化されているため、同じメソッドで実行出来るようになっています。3系の開発中にいくつか来た2系への修正や、互換性を保つための変更がほとんど被ることが無かったため、長期の実装にしては衝突が少なめに抑えられて良い結果になったと思います。3系ではメジャーバージョンアップということもあり、deprecatedなメソッドを一層しました。Hyper-Schemaのみを想定したものなど、いつくかで廃止しないと問題が起きる部分がありました。3系で大量の変更が必要となるとバージョンアップの難易度が大きすぎて大変です。そのため互換性を崩すような変更が発生した場合は、2系に対してdeprecated警告と2系でも3系でも問題なく動く機能を提供し、2系で警告をすべて消した状態にすると3系でも問題なく動くような状態を目指しました。deprecatedにする量が大きかった初期化部分では、既存機能より良い初期化オプションを2系に新規に追加し、修正時に良いコードに出来るようにしています。Hyper-SchemaではHyper-Schemaのバリデーションは別gemで行っています。3のgemを作り、そちらでバリデーションを行うようにしました。既存のgemを使う選択肢もありましたが、データのバリデーションを行ってくれるものはなく、committeeではパラメータの変換も行うため独自に作成しました。3にはヘッダの定義も含まれるため、パラメータ以外のバリデーションもgemの方でを行い、committeeはgemに適切なデータを渡すだけになっています。3に関する処理はgemで、リクエストパラメータやオプションを考慮する処理はcommitteeで行いgemに適切に渡すだけと、きれいに役割が分けられ安定的になったと思います。3のバリデーションを行うような場合もこのgemを利用できるので、かなり良い方針だったと思います。3を使う場合はデフォルトで最高の状態を得られるように目指しました。手元でいくつかアップデートした限りではそこそこうまく行っているのですが、他の人がやった場合にどう感じるかは未知なので試していただけると幸いです。ota42yC++/Ruby/RoR/golang/rust/flutter。