class DadataMetro::Search
Attributes
api_token[R]
Public Class Methods
new(api_token:)
click to toggle source
# File lib/dadata_metro/search.rb, line 10 def initialize(api_token:) @api_token = api_token end
Public Instance Methods
call(query:, filters: nil)
click to toggle source
# File lib/dadata_metro/search.rb, line 14 def call(query:, filters: nil) check_api_token check_query(query) check_filters(filters) JSON.parse(request(query, filters)) end
Private Instance Methods
check_api_token()
click to toggle source
# File lib/dadata_metro/search.rb, line 58 def check_api_token raise ArgumentError, 'api_token is required' unless api_token end
check_filters(filters)
click to toggle source
# File lib/dadata_metro/search.rb, line 47 def check_filters(filters) return unless filters raise ArgumentError, 'filters should be array' unless filters.is_a?(Array) filters.each do |field| pp field.keys.first key = field.keys.first next if Constants::FILTERS_FIELDS.include? key raise ArgumentError, "filter field #{key} not supported" end end
check_query(query)
click to toggle source
# File lib/dadata_metro/search.rb, line 42 def check_query(query) raise ArgumentError, 'query is required' unless query raise ArgumentError, 'query is too long' if query.length > Constants::QUERY_MAX_LENGTH end
request(query, filters)
click to toggle source
# File lib/dadata_metro/search.rb, line 28 def request(query, filters) req = Net::HTTP::Post.new(url) req['Content-Type'] = 'application/json' req['Accept'] = 'application/json' req['Authorization'] = "Token #{api_token}" req.body = { query: query, filters: filters }.to_json http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.request(req).body.force_encoding('UTF-8') end
url()
click to toggle source
# File lib/dadata_metro/search.rb, line 24 def url URI(Constants::BASE_URL) end