Class: Nexmos::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/nexmos/base.rb

Direct Known Subclasses

Account, Message, Number, Search, TextToSpeech

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key = ::Nexmos.api_key, secret = ::Nexmos.api_secret) ⇒ Base

Returns a new instance of Base.



3
4
5
6
7
8
9
10
# File 'lib/nexmos/base.rb', line 3

def initialize(key = ::Nexmos.api_key, secret = ::Nexmos.api_secret)
  fail 'api_key should be set' unless key.present?
  fail 'api_secret should be set' unless secret.present?
  @default_params = {
    'api_key'    => key,
    'api_secret' => secret
  }
end

Class Method Details

.connectionObject



89
90
91
92
93
94
95
96
# File 'lib/nexmos/base.rb', line 89

def connection
  @connection ||= Faraday::Connection.new(faraday_options) do |conn|
    conn.request :url_encoded
    conn.response :mashrashify
    conn.response :json, content_type: /\bjson$/
    conn.adapter Faraday.default_adapter
  end
end

.define_api_calls(key) ⇒ Object



70
71
72
73
74
75
76
77
# File 'lib/nexmos/base.rb', line 70

def define_api_calls(key)
  ::Nexmos.apis[key].each do |k, v|
    define_method(k) do |*args|
      params = args[0] || {}
      make_api_call(v, params)
    end
  end
end

.faraday_optionsObject



79
80
81
82
83
84
85
86
87
# File 'lib/nexmos/base.rb', line 79

def faraday_options
  {
    url:     'https://rest.nexmo.com',
    headers: {
      accept:     'application/json',
      user_agent: ::Nexmos.user_agent
    }
  }
end

Instance Method Details

#camelize_params(params) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/nexmos/base.rb', line 51

def camelize_params(params)
  if params.respond_to?(:transform_keys!)
    params.transform_keys! { |key| key.camelize(:lower) }
  else
    params.keys.each do |key|
      params[key.camelize(:lower)] = params.delete(key)
    end
  end
end

#check_required_params(args, params) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/nexmos/base.rb', line 61

def check_required_params(args, params)
  return unless args[:required]
  required = params.slice(*args[:required])
  return if required.keys.sort == args[:required].sort
  missed = (args[:required] - required.keys).join(',')
  fail ArgumentError, "#{missed} params required"
end

#connectionObject



12
13
14
# File 'lib/nexmos/base.rb', line 12

def connection
  self.class.connection.dup
end

#get_response(args, params) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/nexmos/base.rb', line 24

def get_response(args, params)
  method = args[:method]
  url    = args[:url]
  fail 'url or method params missing' if !method.present? || !url.present?
  res = connection.__send__(method, url, params)
  if res.success?
    data = if res.body.is_a?(::Hash)
             res.body.merge(:success? => true)
           else
             ::Hashie::Mash.new(:success? => true)
           end
    return data
  end
  failed_res = ::Hashie::Mash.new(:success? => false, :not_authorized? => false, :failed? => false)
  case res.status
  when 401
    failed_res.merge! :not_authorized? => true
  when 420
    failed_res.merge! :failed? => true
  end
  failed_res
end

#make_api_call(args, params = {}) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/nexmos/base.rb', line 16

def make_api_call(args, params = {})
  normalize_params(params)
  check_required_params(args, params)
  camelize_params(params) if args[:camelize]
  params.merge!(@default_params)
  get_response(args, params)
end

#normalize_params(params) ⇒ Object



47
48
49
# File 'lib/nexmos/base.rb', line 47

def normalize_params(params)
  params.stringify_keys!
end