dry_params — Dry::Validation から Grape/Rails パラメータを自動生成する Ruby gem
概要
Dry::Validation を使っていると、バリデーション用の Contract と API レイヤー(Grape の params や Rails の strong params)で同じフィールド定義を二重に記述してしまいがちです。本リポジトリの dry_params は、Dry::Validation の契約定義を解析して Grape の params ブロック(または Rails の strong params)を自動生成することでその重複を排除します。現在は Grape 向けに本番利用されている開発途上の gem で、インストールして既存の Contract から直接 API パラメータ定義を生成できます。
リポジトリの統計情報
- スター数: 5
- フォーク数: 0
- ウォッチャー数: 5
- コミット数: 10
- ファイル数: 14
- メインの言語: Ruby
主な特徴
- Dry::Validation の Contract から Grape params(および Rails strong params)を自動生成し、定義の重複を解消する。
- 型情報、必須/任意、ネスト、配列などの基本的な構造をマッピング。
- Grape と組み合わせた実運用実績あり(ただし開発中・Work in Progress)。
- Gem として簡単に導入でき、既存の Contract をそのまま活かせる。
技術的なポイント
dry_params は Dry::Validation の Contract(Dry::Schema / Dry::Types を含む)を解析して、Grape の params DSL に変換する仕組みを持ちます。具体的には契約の各フィールドから型情報や必須性(required/optional)、ネストしたスキーマや配列要素の構造を読み取り、Grape の requires/optional、type:、coerce:、などへ対応付けます。これにより API 層とバリデーション層で同じルールの二重記述を防ぎ、単一のソース・オブ・トゥルースを実現します。
内部では Dry::Types や契約オブジェクトのメタデータを利用して型マッピングを行うため、カスタムタイプや複合型に対する扱い、独自の predicate や macro を使用している場合は適切な拡張が必要になることがあります。実行はアプリ起動時(またはランタイムに呼び出したタイミング)にパラメータ定義を生成する方式が想定され、Grape のルーティング内に組み込んで利用します。テスト周りは RSpec 設定が含まれており、Gemfile に依存関係が明記されています。現状は Grape にフォーカスしているため Rails での完全互換は限定的で、プロジェクト独自のニーズに合わせたカスタマイズや拡張ポイント(カスタムマッピング、国際化メッセージ、複雑なネスト/配列の扱い)を検討する必要があります。
プロジェクトの構成
主要なファイルとディレクトリ:
- .gitignore: file
- .rspec: file
- CHANGELOG.md: file
- Gemfile: file
- Gemfile.lock: file
…他 9 ファイル
まとめ
Dry::Validation と Grape をつなぐ実用的なジェム、重複排除に有用。
リポジトリ情報:
- 名前: dry_params
- 説明: 説明なし
- スター数: 5
- 言語: Ruby
- URL: https://github.com/rodrigonbarreto/dry_params
- オーナー: rodrigonbarreto
- アバター: https://avatars.githubusercontent.com/u/8334832?v=4
READMEの抜粋:
DryParams
Work in Progress - This gem is under active development and currently used in production with Grape only.
If you use dry-validation extensively, you know the pain of duplicating field definitions between your contracts and your API params. This gem eliminates that repetition by automatically generating Grape params (or Rails strong params) directly from your Dry::Validation contracts.
Installation
gem 'dry_params'
Grape
class UserContract < Dry...