From ee0edb03d07ae3af03197e616cfbf6e132acd580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ianar=C3=A9=20S=C3=A9vi?= Date: Fri, 6 Nov 2026 16:34:07 +0100 Subject: [PATCH 1/3] :recycle: use hashes for request parameters --- .../client_options/base_product_parameters.rb | 11 +++++------ .../v2/client_options/base_search_parameters.rb | 6 +++--- lib/mindee/v2/http/mindee_api_v2.rb | 7 +++---- .../extraction/params/extraction_parameters.rb | 17 ++++++++--------- .../client_options/base_product_parameters.rbs | 2 +- .../client_options/base_search_parameters.rbs | 2 +- .../search/models/model_search_parameters.rbs | 2 +- .../rag_document_search_parameters.rbs | 2 +- 8 files changed, 23 insertions(+), 26 deletions(-) diff --git a/lib/mindee/v2/client_options/base_product_parameters.rb b/lib/mindee/v2/client_options/base_product_parameters.rb index db395460..812e39de 100644 --- a/lib/mindee/v2/client_options/base_product_parameters.rb +++ b/lib/mindee/v2/client_options/base_product_parameters.rb @@ -79,12 +79,11 @@ def self.load_from_hash(params: {}) end # Appends base form data to the provided array. - # @param [Array] form_data Array of form fields - # @return [Array] - def append_form_data(form_data) - form_data.push(['alias', @file_alias]) if @file_alias - webhook_ids = @webhook_ids || [] - form_data.push(['webhook_ids', webhook_ids.join(',')]) unless @webhook_ids.nil? || webhook_ids.empty? + # @return [Hash] + def request_parameters + form_data = { model_id: @model_id } + form_data[:alias] = @file_alias if @file_alias + form_data[:webhook_ids] = @webhook_ids.join(',') if @webhook_ids&.any? form_data end end diff --git a/lib/mindee/v2/client_options/base_search_parameters.rb b/lib/mindee/v2/client_options/base_search_parameters.rb index 89d1ed81..b4152918 100644 --- a/lib/mindee/v2/client_options/base_search_parameters.rb +++ b/lib/mindee/v2/client_options/base_search_parameters.rb @@ -20,9 +20,9 @@ def initialize(page: nil, per_page: nil) # Gets the request parameters for the search request. # @return [Hash{String => String, Array}] def request_parameters - params = {} # : Hash[String, String | Array[String]] - params['page'] = @page.to_s unless @page.nil? - params['per_page'] = @per_page.to_s unless @per_page.nil? + params = {} + params[:page] = @page.to_s unless @page.nil? + params[:per_page] = @per_page.to_s unless @per_page.nil? params end diff --git a/lib/mindee/v2/http/mindee_api_v2.rb b/lib/mindee/v2/http/mindee_api_v2.rb index 75efad8b..e66e2ab6 100644 --- a/lib/mindee/v2/http/mindee_api_v2.rb +++ b/lib/mindee/v2/http/mindee_api_v2.rb @@ -157,13 +157,12 @@ def enqueue(input_source, params) uri = URI("#{@settings.base_url}/v2/products/#{params.slug}/enqueue") form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource) - [['url', input_source.url]] # : Array[Array[untyped]] + { url: input_source.url } else file_data, file_metadata = input_source.read_contents(close: params.close_file) - [['file', file_data, file_metadata]] # : Array[Array[untyped]] + { file: [file_data, file_metadata] } end - form_data.push(['model_id', params.model_id]) - form_data = params.append_form_data(form_data) + form_data.merge!(params.request_parameters) headers = { 'Authorization' => @settings.api_key, diff --git a/lib/mindee/v2/product/extraction/params/extraction_parameters.rb b/lib/mindee/v2/product/extraction/params/extraction_parameters.rb index e7c14bdf..6d5d0e4e 100644 --- a/lib/mindee/v2/product/extraction/params/extraction_parameters.rb +++ b/lib/mindee/v2/product/extraction/params/extraction_parameters.rb @@ -77,17 +77,16 @@ def initialize( end # Appends inference-specific form data to the provided array. - # @param [Array] form_data Array of form fields - # @return [Array] - def append_form_data(form_data) + # @return [Hash] + def request_parameters new_form_data = super - new_form_data.push(['rag', @rag.to_s]) unless @rag.nil? - new_form_data.push(['raw_text', @raw_text.to_s]) unless @raw_text.nil? - new_form_data.push(['polygon', @polygon.to_s]) unless @polygon.nil? - new_form_data.push(['confidence', @confidence.to_s]) unless @confidence.nil? - new_form_data.push(['text_context', @text_context]) if @text_context - new_form_data.push(['data_schema', @data_schema.to_s]) if @data_schema + new_form_data[:rag] = @rag.to_s unless @rag.nil? + new_form_data[:raw_text] = @raw_text.to_s unless @raw_text.nil? + new_form_data[:polygon] = @polygon.to_s unless @polygon.nil? + new_form_data[:confidence] = @confidence.to_s unless @confidence.nil? + new_form_data[:text_context] = @text_context if @text_context + new_form_data[:data_schema] = @data_schema.to_s if @data_schema new_form_data end diff --git a/sig/mindee/v2/client_options/base_product_parameters.rbs b/sig/mindee/v2/client_options/base_product_parameters.rbs index c3a62ff5..e2439ee4 100644 --- a/sig/mindee/v2/client_options/base_product_parameters.rbs +++ b/sig/mindee/v2/client_options/base_product_parameters.rbs @@ -24,7 +24,7 @@ module Mindee ?close_file: bool? ) -> void - def append_form_data: (Array[Array[untyped]]) -> Array[Array[untyped]] + def request_parameters: -> Hash[Symbol, String | Array[String]] end end end diff --git a/sig/mindee/v2/client_options/base_search_parameters.rbs b/sig/mindee/v2/client_options/base_search_parameters.rbs index 629eb738..467a525f 100644 --- a/sig/mindee/v2/client_options/base_search_parameters.rbs +++ b/sig/mindee/v2/client_options/base_search_parameters.rbs @@ -7,7 +7,7 @@ module Mindee def initialize: (?page: Integer?, ?per_page: Integer?) -> void - def request_parameters: -> Hash[String, String | Array[String]] + def request_parameters: -> Hash[Symbol, String | Array[String]] def slug: -> String def self.slug: -> String diff --git a/sig/mindee/v2/search/models/model_search_parameters.rbs b/sig/mindee/v2/search/models/model_search_parameters.rbs index fc4c2b46..28ebd1d6 100644 --- a/sig/mindee/v2/search/models/model_search_parameters.rbs +++ b/sig/mindee/v2/search/models/model_search_parameters.rbs @@ -14,7 +14,7 @@ module Mindee def self.response_class: -> singleton(ModelSearchResponse) def response_class: -> singleton(ModelSearchResponse) - def request_parameters: -> Hash[String, String | Array[String]] + def request_parameters: -> Hash[Symbol, String | Array[String]] end end end diff --git a/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs b/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs index 3e8f100a..97896ee2 100644 --- a/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs +++ b/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs @@ -14,7 +14,7 @@ module Mindee def self.response_class: -> singleton(RAGDocumentSearchResponse) def response_class: -> singleton(RAGDocumentSearchResponse) - def request_parameters: -> Hash[String, String | Array[String]] + def request_parameters: -> Hash[Symbol, String | Array[String]] end end end From fa8c9d8fca2c8f0eb23e3ab7d5824e3738e41c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ianar=C3=A9=20S=C3=A9vi?= Date: Fri, 6 Nov 2026 21:09:34 +0100 Subject: [PATCH 2/3] steep --- .../client_options/base_product_parameters.rb | 13 +++-- .../client_options/base_search_parameters.rb | 6 +- lib/mindee/v2/http/mindee_api_v2.rb | 13 +++-- .../params/extraction_parameters.rb | 21 +++---- .../search/models/model_search_parameters.rb | 1 - .../rag_document_search_parameters.rb | 1 - .../base_product_parameters.rbs | 2 +- .../client_options/base_search_parameters.rbs | 2 +- .../params/extraction_parameters.rbs | 2 +- .../search/models/model_search_parameters.rbs | 2 +- .../rag_document_search_parameters.rbs | 2 +- .../extraction/extraction_parameter_spec.rb | 56 +++++++++++++++---- spec/v2/search/model_search_spec.rb | 11 ++++ spec/v2/search/rag_document_search_spec.rb | 11 ++++ 14 files changed, 100 insertions(+), 43 deletions(-) diff --git a/lib/mindee/v2/client_options/base_product_parameters.rb b/lib/mindee/v2/client_options/base_product_parameters.rb index 812e39de..9a5c4986 100644 --- a/lib/mindee/v2/client_options/base_product_parameters.rb +++ b/lib/mindee/v2/client_options/base_product_parameters.rb @@ -78,12 +78,15 @@ def self.load_from_hash(params: {}) params end - # Appends base form data to the provided array. - # @return [Hash] + # Gets the base request parameters for the endpoint. + # @return [Hash{String => String, Array}] def request_parameters - form_data = { model_id: @model_id } - form_data[:alias] = @file_alias if @file_alias - form_data[:webhook_ids] = @webhook_ids.join(',') if @webhook_ids&.any? + form_data = {} # : Hash[String, String | Array[String]] + form_data['model_id'] = @model_id + file_alias = @file_alias + form_data['alias'] = file_alias if file_alias + webhook_ids = @webhook_ids + form_data['webhook_ids'] = webhook_ids.join(',') if webhook_ids && !webhook_ids.empty? form_data end end diff --git a/lib/mindee/v2/client_options/base_search_parameters.rb b/lib/mindee/v2/client_options/base_search_parameters.rb index b4152918..89d1ed81 100644 --- a/lib/mindee/v2/client_options/base_search_parameters.rb +++ b/lib/mindee/v2/client_options/base_search_parameters.rb @@ -20,9 +20,9 @@ def initialize(page: nil, per_page: nil) # Gets the request parameters for the search request. # @return [Hash{String => String, Array}] def request_parameters - params = {} - params[:page] = @page.to_s unless @page.nil? - params[:per_page] = @per_page.to_s unless @per_page.nil? + params = {} # : Hash[String, String | Array[String]] + params['page'] = @page.to_s unless @page.nil? + params['per_page'] = @per_page.to_s unless @per_page.nil? params end diff --git a/lib/mindee/v2/http/mindee_api_v2.rb b/lib/mindee/v2/http/mindee_api_v2.rb index e66e2ab6..86d3e737 100644 --- a/lib/mindee/v2/http/mindee_api_v2.rb +++ b/lib/mindee/v2/http/mindee_api_v2.rb @@ -156,12 +156,13 @@ def poll(url) def enqueue(input_source, params) uri = URI("#{@settings.base_url}/v2/products/#{params.slug}/enqueue") - form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource) - { url: input_source.url } - else - file_data, file_metadata = input_source.read_contents(close: params.close_file) - { file: [file_data, file_metadata] } - end + form_data = {} # : Hash[String, untyped] + if input_source.is_a?(Mindee::Input::Source::URLInputSource) + form_data['url'] = input_source.url + else + file_data, file_metadata = input_source.read_contents(close: params.close_file) + form_data['file'] = [file_data, file_metadata] + end form_data.merge!(params.request_parameters) headers = { diff --git a/lib/mindee/v2/product/extraction/params/extraction_parameters.rb b/lib/mindee/v2/product/extraction/params/extraction_parameters.rb index 6d5d0e4e..7b9544ee 100644 --- a/lib/mindee/v2/product/extraction/params/extraction_parameters.rb +++ b/lib/mindee/v2/product/extraction/params/extraction_parameters.rb @@ -76,19 +76,20 @@ def initialize( # rubocop:enable Metrics/ParameterLists end - # Appends inference-specific form data to the provided array. - # @return [Hash] + # Gets inference-specific request parameters. + # @return [Hash{String => String, Array}] def request_parameters - new_form_data = super + form_data = super - new_form_data[:rag] = @rag.to_s unless @rag.nil? - new_form_data[:raw_text] = @raw_text.to_s unless @raw_text.nil? - new_form_data[:polygon] = @polygon.to_s unless @polygon.nil? - new_form_data[:confidence] = @confidence.to_s unless @confidence.nil? - new_form_data[:text_context] = @text_context if @text_context - new_form_data[:data_schema] = @data_schema.to_s if @data_schema + form_data['rag'] = @rag.to_s unless @rag.nil? + form_data['raw_text'] = @raw_text.to_s unless @raw_text.nil? + form_data['polygon'] = @polygon.to_s unless @polygon.nil? + form_data['confidence'] = @confidence.to_s unless @confidence.nil? + text_context = @text_context + form_data['text_context'] = text_context if text_context + form_data['data_schema'] = @data_schema.to_s if @data_schema - new_form_data + form_data end # Loads a prediction from a Hash. diff --git a/lib/mindee/v2/search/models/model_search_parameters.rb b/lib/mindee/v2/search/models/model_search_parameters.rb index a33faecd..7b33b35d 100644 --- a/lib/mindee/v2/search/models/model_search_parameters.rb +++ b/lib/mindee/v2/search/models/model_search_parameters.rb @@ -44,7 +44,6 @@ def request_parameters model_type = @model_type params['name'] = name unless name.nil? params['model_type'] = model_type unless model_type.nil? - params end end diff --git a/lib/mindee/v2/search/rag_documents/rag_document_search_parameters.rb b/lib/mindee/v2/search/rag_documents/rag_document_search_parameters.rb index 7ee67f7c..605717ce 100644 --- a/lib/mindee/v2/search/rag_documents/rag_document_search_parameters.rb +++ b/lib/mindee/v2/search/rag_documents/rag_document_search_parameters.rb @@ -42,7 +42,6 @@ def request_parameters params['model_id'] = @model_id filename = @filename params['filename'] = filename unless filename.nil? - params end end diff --git a/sig/mindee/v2/client_options/base_product_parameters.rbs b/sig/mindee/v2/client_options/base_product_parameters.rbs index e2439ee4..13973ed0 100644 --- a/sig/mindee/v2/client_options/base_product_parameters.rbs +++ b/sig/mindee/v2/client_options/base_product_parameters.rbs @@ -24,7 +24,7 @@ module Mindee ?close_file: bool? ) -> void - def request_parameters: -> Hash[Symbol, String | Array[String]] + def request_parameters: -> Hash[String, String | Array[String]] end end end diff --git a/sig/mindee/v2/client_options/base_search_parameters.rbs b/sig/mindee/v2/client_options/base_search_parameters.rbs index 467a525f..629eb738 100644 --- a/sig/mindee/v2/client_options/base_search_parameters.rbs +++ b/sig/mindee/v2/client_options/base_search_parameters.rbs @@ -7,7 +7,7 @@ module Mindee def initialize: (?page: Integer?, ?per_page: Integer?) -> void - def request_parameters: -> Hash[Symbol, String | Array[String]] + def request_parameters: -> Hash[String, String | Array[String]] def slug: -> String def self.slug: -> String diff --git a/sig/mindee/v2/product/extraction/params/extraction_parameters.rbs b/sig/mindee/v2/product/extraction/params/extraction_parameters.rbs index 190adad4..47cacf5f 100644 --- a/sig/mindee/v2/product/extraction/params/extraction_parameters.rbs +++ b/sig/mindee/v2/product/extraction/params/extraction_parameters.rbs @@ -28,7 +28,7 @@ module Mindee ) -> void def self.from_hash: (params: Hash[String | Symbol, untyped]) -> ExtractionParameters - def append_form_data: (Array[Array[untyped]]) -> Array[Array[untyped]] + def request_parameters: -> Hash[String, String | Array[String]] end end end diff --git a/sig/mindee/v2/search/models/model_search_parameters.rbs b/sig/mindee/v2/search/models/model_search_parameters.rbs index 28ebd1d6..fc4c2b46 100644 --- a/sig/mindee/v2/search/models/model_search_parameters.rbs +++ b/sig/mindee/v2/search/models/model_search_parameters.rbs @@ -14,7 +14,7 @@ module Mindee def self.response_class: -> singleton(ModelSearchResponse) def response_class: -> singleton(ModelSearchResponse) - def request_parameters: -> Hash[Symbol, String | Array[String]] + def request_parameters: -> Hash[String, String | Array[String]] end end end diff --git a/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs b/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs index 97896ee2..3e8f100a 100644 --- a/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs +++ b/sig/mindee/v2/search/rag_documents/rag_document_search_parameters.rbs @@ -14,7 +14,7 @@ module Mindee def self.response_class: -> singleton(RAGDocumentSearchResponse) def response_class: -> singleton(RAGDocumentSearchResponse) - def request_parameters: -> Hash[Symbol, String | Array[String]] + def request_parameters: -> Hash[String, String | Array[String]] end end end diff --git a/spec/v2/product/extraction/extraction_parameter_spec.rb b/spec/v2/product/extraction/extraction_parameter_spec.rb index 41dd26f6..50cabc2a 100644 --- a/spec/v2/product/extraction/extraction_parameter_spec.rb +++ b/spec/v2/product/extraction/extraction_parameter_spec.rb @@ -1,19 +1,27 @@ # frozen_string_literal: true +require 'json' +require_relative '../../../data' + require 'mindee/v2/product/extraction/params/data_schema' require 'mindee/v2/product/extraction/params/extraction_parameters' describe Mindee::V2::Product::Extraction::Params::ExtractionParameters do - let(:extracted_schema_content) do - File.read(File.join(V2_PRODUCT_DATA_DIR, 'extraction', 'data_schema_replace_param.json')) + let(:replace_path) { File.join(V2_PRODUCT_DATA_DIR, 'extraction', 'data_schema_replace_param.json') } + let(:data_schema_dict) { JSON.parse(File.read(replace_path)) } + let(:data_schema_string) { data_schema_dict.to_json } + let(:data_schema_instance) { Mindee::V2::Product::Extraction::Params::DataSchema.new(data_schema_dict) } + + it 'should init with minimum values' do + model_id = 'dummy-model' + product_params = Mindee::V2::Product::Extraction::Params::ExtractionParameters.new(model_id) + expect(product_params.model_id).to eq(model_id) + expect(product_params.request_parameters['model_id']).to eq(model_id) end - let(:extracted_schema_hash) { JSON.parse(extracted_schema_content) } - let(:extracted_schema_str) { extracted_schema_hash.to_json } - let(:extracted_schema_object) { Mindee::V2::Product::Extraction::Params::DataSchema.new(extracted_schema_hash) } describe 'Data Schema' do describe "shouldn't replace when unset" do - it 'should initialize with a data schema' do + it 'should leave unset when not provided' do param = Mindee::V2::Product::Extraction::Params::ExtractionParameters.new( 'dummy-model' ) @@ -23,26 +31,50 @@ it 'should initialize with string' do param = Mindee::V2::Product::Extraction::Params::ExtractionParameters.new( 'dummy-model', - data_schema: extracted_schema_str + data_schema: data_schema_string ) - expect(param.data_schema.to_s).to eq(extracted_schema_str) + expect(param.data_schema.to_s).to eq(data_schema_string) end it 'should initialize with hash' do param = Mindee::V2::Product::Extraction::Params::ExtractionParameters.new( 'dummy-model', - data_schema: extracted_schema_hash + data_schema: data_schema_dict ) - expect(param.data_schema.to_s).to eq(extracted_schema_str) + expect(param.data_schema.to_s).to eq(data_schema_string) end it 'should initialize with DataSchema object' do param = Mindee::V2::Product::Extraction::Params::ExtractionParameters.new( 'dummy-model', - data_schema: extracted_schema_object + data_schema: data_schema_instance ) - expect(param.data_schema.to_s).to eq(extracted_schema_str) + expect(param.data_schema.to_s).to eq(data_schema_string) end end end + + describe 'request_parameters' do + it 'returns hash with correct parameters' do + param = Mindee::V2::Product::Extraction::Params::ExtractionParameters.new( + 'dummy-model', + text_context: 'sample context', + webhook_ids: ['hook-1', 'hook-2'], + file_alias: 'my_file', + rag: true, + raw_text: false, + polygon: true, + confidence: false + ) + params = param.request_parameters + expect(params['model_id']).to eq('dummy-model') + expect(params['alias']).to eq('my_file') + expect(params['webhook_ids']).to eq('hook-1,hook-2') + expect(params['text_context']).to eq('sample context') + expect(params['rag']).to eq('true') + expect(params['raw_text']).to eq('false') + expect(params['polygon']).to eq('true') + expect(params['confidence']).to eq('false') + end + end end diff --git a/spec/v2/search/model_search_spec.rb b/spec/v2/search/model_search_spec.rb index 55f9a307..d14e9eb1 100644 --- a/spec/v2/search/model_search_spec.rb +++ b/spec/v2/search/model_search_spec.rb @@ -33,3 +33,14 @@ expect(last_item.id).to eq('e14e0923-ee55-ee55-a335-8d2110917d7b') end end + +describe Mindee::V2::Search::Models::ModelSearchParameters do + it 'builds request parameters' do + search_parameters = described_class.new(name: 'my-model', model_type: 'extraction', page: 2, per_page: 10) + request_parameters = search_parameters.request_parameters + expect(request_parameters['page']).to eq('2') + expect(request_parameters['per_page']).to eq('10') + expect(request_parameters['name']).to eq('my-model') + expect(request_parameters['model_type']).to eq('extraction') + end +end diff --git a/spec/v2/search/rag_document_search_spec.rb b/spec/v2/search/rag_document_search_spec.rb index c95b5253..e7761286 100644 --- a/spec/v2/search/rag_document_search_spec.rb +++ b/spec/v2/search/rag_document_search_spec.rb @@ -46,3 +46,14 @@ expect(third_item.status).to eq('Active') end end + +describe Mindee::V2::Search::RAGDocuments::RAGDocumentSearchParameters do + it 'builds request parameters' do + search_params = described_class.new(model_id: 'my-model-id', filename: 'test.pdf', page: 1, per_page: 25) + request_parameters = search_params.request_parameters + expect(request_parameters['page']).to eq('1') + expect(request_parameters['per_page']).to eq('25') + expect(request_parameters['model_id']).to eq('my-model-id') + expect(request_parameters['filename']).to eq('test.pdf') + end +end From 04b5cd648c4963ed71aa2610a951e9f37a879bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ianar=C3=A9=20S=C3=A9vi?= Date: Mon, 9 Nov 2026 15:56:29 +0100 Subject: [PATCH 3/3] pita --- lib/mindee/v2/http/mindee_api_v2.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/mindee/v2/http/mindee_api_v2.rb b/lib/mindee/v2/http/mindee_api_v2.rb index 86d3e737..44e010d0 100644 --- a/lib/mindee/v2/http/mindee_api_v2.rb +++ b/lib/mindee/v2/http/mindee_api_v2.rb @@ -165,13 +165,18 @@ def enqueue(input_source, params) end form_data.merge!(params.request_parameters) + # Convert hash to the array format required by Net::HTTP multipart + form_data_list = form_data.map do |k, v| + v.is_a?(Array) ? [k.to_s, *v] : [k.to_s, v] + end + headers = { 'Authorization' => @settings.api_key, 'User-Agent' => @settings.user_agent, } req = Net::HTTP::Post.new(uri, headers) - req.set_form(form_data, 'multipart/form-data') + req.set_form(form_data_list, 'multipart/form-data') req['Transfer-Encoding'] = 'chunked' Net::HTTP.start(uri.hostname, uri.port,