Class: SuggestGrid::APIHelper
- Inherits:
-
Object
- Object
- SuggestGrid::APIHelper
- Defined in:
- lib/suggestgrid/api_helper.rb
Class Method Summary collapse
-
.append_url_with_query_parameters(query_builder, parameters, array_serialization: 'indexed') ⇒ Object
Appends the given set of parameters to the given query string.
-
.append_url_with_template_parameters(query_builder, parameters) ⇒ Object
Replaces template parameters in the given url.
-
.clean_hash(hash) ⇒ Object
Removes elements with empty values from a hash.
-
.clean_url(url) ⇒ String
Validates and processes the given Url.
-
.form_encode(obj, instance_name) ⇒ Hash
Form encodes an object.
-
.form_encode_parameters(form_parameters) ⇒ Hash
Form encodes a hash of parameters.
-
.json_deserialize(json) ⇒ Object
Parses JSON string.
-
.serialize_array(key, array, formatting: 'indexed') ⇒ Object
Serializes an array parameter (creates key value pairs).
Class Method Details
.append_url_with_query_parameters(query_builder, parameters, array_serialization: 'indexed') ⇒ Object
Appends the given set of parameters to the given query string
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/suggestgrid/api_helper.rb', line 57 def self.append_url_with_query_parameters(query_builder, parameters, array_serialization: 'indexed') # perform parameter validation raise ArgumentError, 'Given value for parameter \"query_builder\" is invalid.' unless query_builder.instance_of? String # return if there are no parameters to replace return query_builder if parameters.nil? parameters.each do |key, value| seperator = (query_builder.include? '?') ? '&' : '?' if not value.nil? if value.instance_of? Array value.compact! if array_serialization == 'csv' query_builder += "#{seperator}#{key}=#{value.map { |element| CGI.escape(element.to_s) }.join(',')}" elsif array_serialization == 'psv' query_builder += "#{seperator}#{key}=#{value.map { |element| CGI.escape(element.to_s) }.join('|')}" elsif array_serialization == 'tsv' query_builder += "#{seperator}#{key}=#{value.map { |element| CGI.escape(element.to_s) }.join('\t')}" else query_builder += "#{seperator}#{APIHelper.serialize_array(key, value, formatting: array_serialization). map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')}" end else query_builder += "#{seperator}#{key}=#{CGI.escape(value.to_s)}" end end end query_builder end |
.append_url_with_template_parameters(query_builder, parameters) ⇒ Object
Replaces template parameters in the given url
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/suggestgrid/api_helper.rb', line 27 def self.append_url_with_template_parameters(query_builder, parameters) # perform parameter validation raise ArgumentError, 'Given value for parameter \"query_builder\" is invalid.' unless query_builder.instance_of? String # return if there are no parameters to replace return query_builder if parameters.nil? # iterate and append parameters parameters.each do |key, value| replace_value = '' if value.nil? replace_value = '' elsif value.instance_of? Array value.map! { |element| CGI.escape(element.to_s) } replace_value = value.join('/') else replace_value = CGI.escape(value.to_s) end # find the template parameter and replace it with its value query_builder = query_builder.gsub('{' + key.to_s + '}', replace_value) end query_builder end |
.clean_hash(hash) ⇒ Object
Removes elements with empty values from a hash.
125 126 127 |
# File 'lib/suggestgrid/api_helper.rb', line 125 def self.clean_hash(hash) hash.delete_if { |_key, value| value.to_s.strip.empty? } end |
.clean_url(url) ⇒ String
Validates and processes the given Url
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/suggestgrid/api_helper.rb', line 90 def self.clean_url(url) # perform parameter validation raise ArgumentError, 'Invalid Url.' unless url.instance_of? String # ensure that the urls are absolute matches = url.match(%r{^(https?:\/\/[^\/]+)}) raise ArgumentError, 'Invalid Url format.' if matches.nil? # get the http protocol match protocol = matches[1] # check if parameters exist index = url.index('?') # remove redundant forward slashes query = url[protocol.length...(!index.nil? ? index : url.length)] query.gsub!(%r{\/\/+}, '/') # get the parameters parameters = !index.nil? ? url[url.index('?')...url.length] : '' # return processed url protocol + query + parameters end |
.form_encode(obj, instance_name) ⇒ Hash
Form encodes an object.
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/suggestgrid/api_helper.rb', line 144 def self.form_encode(obj, instance_name) retval = {} # If this is a structure, resolve it's field names. obj = obj.to_hash if obj.is_a? BaseModel # Create a form encoded hash for this object. if obj.nil? nil elsif obj.instance_of? Array obj.each_with_index do |value, index| retval.merge!(APIHelper.form_encode(value, instance_name + '[' + index.to_s + ']')) end elsif obj.instance_of? Hash obj.each do |key, value| retval.merge!(APIHelper.form_encode(value, instance_name + '[' + key + ']')) end else retval[instance_name] = obj end retval end |
.form_encode_parameters(form_parameters) ⇒ Hash
Form encodes a hash of parameters.
132 133 134 135 136 137 138 |
# File 'lib/suggestgrid/api_helper.rb', line 132 def self.form_encode_parameters(form_parameters) encoded = {} form_parameters.each do |key, value| encoded.merge!(APIHelper.form_encode(value, key)) end encoded end |
.json_deserialize(json) ⇒ Object
Parses JSON string.
117 118 119 120 121 |
# File 'lib/suggestgrid/api_helper.rb', line 117 def self.json_deserialize(json) return JSON.parse(json) rescue raise TypeError, 'Server responded with invalid JSON.' end |
.serialize_array(key, array, formatting: 'indexed') ⇒ Object
Serializes an array parameter (creates key value pairs)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/suggestgrid/api_helper.rb', line 9 def self.serialize_array(key, array, formatting: 'indexed') tuples = [] if formatting == 'unindexed' tuples += array.map { |element| ["#{key}[]", element] } elsif formatting == 'indexed' tuples += array.map.with_index { |element, index| ["#{key}[#{index}]", element] } elsif formatting == 'plain' tuples += array.map { |element| [key, element] } else raise ArgumentError, 'Invalid format provided.' end tuples end |