From 23ab494f2b6fb4b219cc4df363ab050a19a036ea Mon Sep 17 00:00:00 2001
From: Eric Proulx <eproulx@petalmd.com>
Date: Sun, 27 Oct 2024 18:51:02 +0100
Subject: [PATCH] ContractScope's validator inherits from
 Grape::Validations::Validator::Base initialize method has been updated
 accordingly opts adds fail_fast Use << when concatenating string Use map
 instead of each []

---
 lib/grape/validations/contract_scope.rb | 29 +++++++++++--------------
 1 file changed, 13 insertions(+), 16 deletions(-)

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