From d9f7ad498e93d0a0075b3c833e6d2006a9dd49b1 Mon Sep 17 00:00:00 2001 From: Bruno Casali Date: Wed, 17 Nov 2021 22:49:54 -0300 Subject: [PATCH] Move out params parsing of the HttpRequest class This way we would gain more control about when parse something or not that even could be a query_params situation or a body situation. Fixes https://github.com/meilisearch/meilisearch-ruby/issues/265 --- lib/meilisearch.rb | 1 + lib/meilisearch/client.rb | 3 ++- lib/meilisearch/http_request.rb | 24 +------------------- lib/meilisearch/index.rb | 9 ++++---- lib/meilisearch/utils.rb | 28 ++++++++++++++++++++++++ spec/meilisearch/index/documents_spec.rb | 11 ++++++++++ spec/meilisearch/index/settings_spec.rb | 17 ++++++++++++++ 7 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 lib/meilisearch/utils.rb diff --git a/lib/meilisearch.rb b/lib/meilisearch.rb index 9001ae99..3289517c 100644 --- a/lib/meilisearch.rb +++ b/lib/meilisearch.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'meilisearch/version' +require 'meilisearch/utils' require 'meilisearch/client' require 'meilisearch/index' diff --git a/lib/meilisearch/client.rb b/lib/meilisearch/client.rb index 3273da5e..71f8ec2d 100644 --- a/lib/meilisearch/client.rb +++ b/lib/meilisearch/client.rb @@ -20,7 +20,8 @@ def indexes # client.create_index('indexUID') # client.create_index('indexUID', primaryKey: 'id') def create_index(index_uid, options = {}) - body = options.merge(uid: index_uid) + body = Utils.transform_attributes(options.merge(uid: index_uid)) + index_hash = http_post '/indexes', body index_object(index_hash['uid'], index_hash['primaryKey']) end diff --git a/lib/meilisearch/http_request.rb b/lib/meilisearch/http_request.rb index d26e162d..b054d40c 100644 --- a/lib/meilisearch/http_request.rb +++ b/lib/meilisearch/http_request.rb @@ -61,8 +61,6 @@ def http_delete(relative_path = '') private - SNAKE_CASE = /[^a-zA-Z0-9]+(.)/.freeze - def send_request(http_method, relative_path, query_params: nil, body: nil, headers: nil) config = http_config(query_params, body, headers) begin @@ -74,35 +72,15 @@ def send_request(http_method, relative_path, query_params: nil, body: nil, heade end def http_config(query_params, body, headers) - body = transform_attributes(body).to_json { headers: headers, query: query_params, - body: body, + body: body.to_json, timeout: @options[:timeout] || 1, max_retries: @options[:max_retries] || 0 }.compact end - def transform_attributes(body) - case body - when Array - body.map { |item| transform_attributes(item) } - when Hash - parse(body) - else - body - end - end - - def parse(body) - body - .transform_keys(&:to_s) - .transform_keys do |key| - key.include?('_') ? key.downcase.gsub(SNAKE_CASE, &:upcase).gsub('_', '') : key - end - end - def validate(response) raise ApiError.new(response.code, response.message, response.body) unless response.success? diff --git a/lib/meilisearch/index.rb b/lib/meilisearch/index.rb index c3fb073d..32b294f0 100644 --- a/lib/meilisearch/index.rb +++ b/lib/meilisearch/index.rb @@ -65,7 +65,7 @@ def document(document_id) alias get_one_document document def documents(options = {}) - http_get "/indexes/#{@uid}/documents", options + http_get "/indexes/#{@uid}/documents", Utils.transform_attributes(options) end alias get_documents documents @@ -168,8 +168,9 @@ def delete_all_documents! ### SEARCH def search(query, options = {}) - parsed_options = options.compact - http_post "/indexes/#{@uid}/search", { q: query.to_s }.merge(parsed_options) + parsed_options = Utils.transform_attributes({ q: query.to_s }.merge(options.compact)) + + http_post "/indexes/#{@uid}/search", parsed_options end ### UPDATES @@ -229,7 +230,7 @@ def settings alias get_settings settings def update_settings(settings) - http_post "/indexes/#{@uid}/settings", settings + http_post "/indexes/#{@uid}/settings", Utils.transform_attributes(settings) end alias settings= update_settings diff --git a/lib/meilisearch/utils.rb b/lib/meilisearch/utils.rb new file mode 100644 index 00000000..954c189a --- /dev/null +++ b/lib/meilisearch/utils.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module MeiliSearch + module Utils + SNAKE_CASE = /[^a-zA-Z0-9]+(.)/.freeze + + def self.transform_attributes(body) + case body + when Array + body.map { |item| transform_attributes(item) } + when Hash + parse(body) + else + body + end + end + + def self.parse(body) + body + .transform_keys(&:to_s) + .transform_keys do |key| + key.include?('_') ? key.downcase.gsub(SNAKE_CASE, &:upcase).gsub('_', '') : key + end + end + + private_class_method :parse + end +end diff --git a/spec/meilisearch/index/documents_spec.rb b/spec/meilisearch/index/documents_spec.rb index ea21791e..d89a8189 100644 --- a/spec/meilisearch/index/documents_spec.rb +++ b/spec/meilisearch/index/documents_spec.rb @@ -25,6 +25,17 @@ expect(index.documents.count).to eq(documents.count) end + it 'keeps the structure of the original documents' do + docs = [ + { object_id: 123, my_title: 'Pride and Prejudice', 'my-comment': 'A great book' } + ] + + response = index.add_documents(docs) + index.wait_for_pending_update(response['updateId']) + + expect(index.documents.first.keys).to eq(docs.first.keys.map(&:to_s)) + end + it 'adds documents in a batch (as a array of documents)' do response = index.add_documents_in_batches(documents, 5) expect(response).to be_a(Array) diff --git a/spec/meilisearch/index/settings_spec.rb b/spec/meilisearch/index/settings_spec.rb index e6b26d8f..f2e8355d 100644 --- a/spec/meilisearch/index/settings_spec.rb +++ b/spec/meilisearch/index/settings_spec.rb @@ -89,6 +89,23 @@ expect(settings['stopWords']).to be_empty expect(settings['synonyms']).to be_empty end + + context 'with snake_case options' do + it 'does the request with camelCase attributes' do + response = index.update_settings( + ranking_rules: ['typo'], + distinct_ATTribute: 'title', + stopWords: ['a'] + ) + + index.wait_for_pending_update(response['updateId']) + settings = index.settings + + expect(settings['rankingRules']).to eq(['typo']) + expect(settings['distinctAttribute']).to eq('title') + expect(settings['stopWords']).to eq(['a']) + end + end end context 'On ranking-rules sub-routes' do