diff --git a/CHANGELOG.md b/CHANGELOG.md index a66dacc322..37ff1642b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * [#2504](https://github.com/ruby-grape/grape/pull/2504): Fix leaky modules in specs - [@ericproulx](https://github.com/ericproulx). * [#2506](https://github.com/ruby-grape/grape/pull/2506): Fix fetch_formatter api_format - [@ericproulx](https://github.com/ericproulx). * [#2507](https://github.com/ruby-grape/grape/pull/2507): Fix type: Set with values - [@nikolai-b](https://github.com/nikolai-b). +* [#2510](https://github.com/ruby-grape/grape/pull/2510): Fix ContractScope's validator inheritance - [@ericproulx](https://github.com/ericproulx). * Your contribution here. ### 2.2.0 (2024-09-14) diff --git a/lib/grape/validations/contract_scope.rb b/lib/grape/validations/contract_scope.rb index 0255051b45..3b66df5722 100644 --- a/lib/grape/validations/contract_scope.rb +++ b/lib/grape/validations/contract_scope.rb @@ -24,17 +24,18 @@ def initialize(api, contract = nil, &block) validator_options = { validator_class: Validator, - opts: { schema: contract } + opts: { schema: contract, fail_fast: false } } api.namespace_stackable(:validations, validator_options) end - class Validator + class Validator < Grape::Validations::Validators::Base attr_reader :schema - def initialize(*_args, schema:) - @schema = schema + def initialize(_attrs, _options, _required, _scope, opts) + super + @schema = opts.fetch(:schema) end # Validates a given request. @@ -49,21 +50,17 @@ def validate(request) return end - errors = [] - - res.errors.messages.each do |message| - full_name = message.path.first.to_s + raise Grape::Exceptions::ValidationArrayErrors.new(build_errors_from_messages(res.errors.messages)) + end - full_name += "[#{message.path[1..].join('][')}]" if message.path.size > 1 + private - errors << Grape::Exceptions::Validation.new(params: [full_name], message: message.text) + def build_errors_from_messages(messages) + messages.map do |message| + full_name = message.path.first.to_s + full_name << "[#{message.path[1..].join('][')}]" if message.path.size > 1 + Grape::Exceptions::Validation.new(params: [full_name], message: message.text) end - - raise Grape::Exceptions::ValidationArrayErrors.new(errors) - end - - def fail_fast? - false end end end diff --git a/spec/integration/dry_validation/dry_validation_spec.rb b/spec/integration/dry_validation/dry_validation_spec.rb index d7b2f8efab..6333bdacdd 100644 --- a/spec/integration/dry_validation/dry_validation_spec.rb +++ b/spec/integration/dry_validation/dry_validation_spec.rb @@ -236,4 +236,12 @@ end end end + + describe Grape::Validations::ContractScope::Validator do + describe '.inherits' do + subject { described_class } + + it { is_expected.to be < Grape::Validations::Validators::Base } + end + end end