dry-rb/dry-validation

`Dry::Validation::Contract` behaves different when defined with a `params Dry::Schema::Params(parent: RawSchema)` vs. `params ParamsSchema`

Open

#729 opened on Apr 7, 2023

View on GitHub
 (2 comments) (1 reaction) (0 assignees)Ruby (193 forks)github user discovery
bughelp wanted

Repository metrics

Stars
 (1,421 stars)
PR merge metrics
 (PR metrics pending)

Description

Describe the bug

When Dry::Validation::Contract contains params Dry::Schema::Params(parent: RawSchema) (where RawSchema is defined using Dry::Schema.define do ... end), it fails to coerce empty Strings into Integers. However, if I define a ParamsSchema using Dry::Schema::Params() do ... end containing the same param definitions, and add params ParamsSchema to my Dry::Validation::Contract class, it works as expected.

To Reproduce

require 'dry/types'
require 'dry/schema'
require 'dry/validation'

module Types
  include Dry::Types()
end

RawSchema = Dry::Schema.define do
  required(:foo).filled(:string)
  optional(:bar).maybe(:integer)
end

ParamsSchema = Dry::Schema::Params() do
  required(:foo).filled(:string)
  optional(:bar).maybe(:integer)
end

class WrappedParamsSchemaValidation < Dry::Validation::Contract

  params Dry::Schema::Params(parent: RawSchema)

end

class ParamsSchemaValidation < Dry::Validation::Contract

  params ParamsSchema

end

params = {"foo" => "a", "bar" => ""}

p WrappedParamsSchemaValidation.new.call(params)
p ParamsSchemaValidation.new.call(params)

Expected behavior

#<Dry::Validation::Result{:foo=>"a", :bar=>nil} errors={}>
#<Dry::Validation::Result{:foo=>"a", :bar=>nil} errors={}>

Actual behavior

#<Dry::Validation::Result{:foo=>"a", :bar=>""} errors={:bar=>["must be an integer"]}>
#<Dry::Validation::Result{:foo=>"a", :bar=>nil} errors={}>

My environment

  • Affects my production application: NO (the app is not running in production)
  • Ruby version: ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]
  • dry-types: 1.7.1
  • dry-schema: 1.13.1
  • dry-validation: 1.10.0

Contributor guide