Class: Gonebusy::APIHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/gonebusy/api_helper.rb

Class Method Summary collapse

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

Parameters:

  • The (String)

    query string builder to add the query parameters to

  • The (Hash)

    parameters to append

  • The (String)

    format of array parameter serialization

Raises:

  • (ArgumentError)


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/gonebusy/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

Parameters:

  • The (String)

    query string builder to replace the template parameters

  • The (Hash)

    parameters to replace in the url

Raises:

  • (ArgumentError)


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/gonebusy/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.

Parameters:

  • The (Hash)

    hash to clean.



125
126
127
# File 'lib/gonebusy/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

Parameters:

  • The (String)

    given Url to process

Returns:

  • (String)

    Pre-processed Url as string

Raises:

  • (ArgumentError)


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/gonebusy/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.

Parameters:

  • An (Dynamic)

    object to form encode.

  • The (String)

    name of the object.

Returns:

  • (Hash)

    A form encoded representation of the object in the form of a hash.



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/gonebusy/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.

Parameters:

  • The (Hash)

    hash of parameters to encode.

Returns:

  • (Hash)

    A hash with the same parameters form encoded.



132
133
134
135
136
137
138
# File 'lib/gonebusy/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.

Parameters:



117
118
119
120
121
# File 'lib/gonebusy/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)

Parameters:

  • The (String)

    name of the parameter

  • The (Array)

    value of the parameter

  • The (String)

    format of the serialization



9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/gonebusy/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