Class: RestDSL::ServiceBase

Inherits:
Object
  • Object
show all
Defined in:
lib/rest_dsl/service_base.rb

Overview

Base Class for defining a rest service DSL Object. Will look in a config file contained in the same directory as the service defining its headers and/or creds by environment. This file should be named such that it matches the service file name with a .yml ending.

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.authentication=(value) ⇒ Object (writeonly)

Sets the attribute authentication

Parameters:

  • value

    the value to set the attribute authentication to.



21
22
23
# File 'lib/rest_dsl/service_base.rb', line 21

def authentication=(value)
  @authentication = value
end

.clientObject (readonly)

Returns the value of attribute client.



20
21
22
# File 'lib/rest_dsl/service_base.rb', line 20

def client
  @client
end

.config_fileObject

Returns the value of attribute config_file.



20
21
22
# File 'lib/rest_dsl/service_base.rb', line 20

def config_file
  @config_file
end

.environmentObject

Returns the value of attribute environment.



20
21
22
# File 'lib/rest_dsl/service_base.rb', line 20

def environment
  @environment
end

.file_nameObject (readonly)

Returns the value of attribute file_name.



20
21
22
# File 'lib/rest_dsl/service_base.rb', line 20

def file_name
  @file_name
end

.headersObject



82
83
84
# File 'lib/rest_dsl/service_base.rb', line 82

def headers
  @headers ||= config&.[](:headers) || {}
end

.last_responseObject (readonly)

Returns the value of attribute last_response.



20
21
22
# File 'lib/rest_dsl/service_base.rb', line 20

def last_response
  @last_response
end

.service_name=(value) ⇒ Object (writeonly)

Sets the attribute service_name

Parameters:

  • value

    the value to set the attribute service_name to.



21
22
23
# File 'lib/rest_dsl/service_base.rb', line 21

def service_name=(value)
  @service_name = value
end

Class Method Details

.authObject



78
79
80
# File 'lib/rest_dsl/service_base.rb', line 78

def auth
  @authentication || config&.[](:credentials) || {}
end

.build_params(params) ⇒ Object



52
53
54
55
56
# File 'lib/rest_dsl/service_base.rb', line 52

def build_params(params)
  params ||= {}
  return "" if params.empty?
  "?#{params.map{|key,value| "#{key}=#{value}"}.join('&')}" unless params.empty?
end

.configObject



63
64
65
# File 'lib/rest_dsl/service_base.rb', line 63

def config
  @config || reload_config
end

.execute_request(method, rest_method_call, *args, headers: nil, payload: nil, params: nil, url_args: nil, form_data: nil, **hash_args, &block) ⇒ Object

The method wrapped by the methods generated by rest_call, these methods all follow this blueprint Can by wrapped manually to create more complicated logic than what’s supported by the default generators



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/rest_dsl/service_base.rb', line 38

def execute_request(method, rest_method_call, *args, headers: nil, payload: nil, params: nil, url_args: nil, form_data: nil, **hash_args, &block)
  headers ||= self.headers
  url_args ||= {}
  service_name = "#{@service_name}/" unless @service_name&.empty?
  hash_args.merge!(auth)
  hash_args.merge!(payload: payload.to_json) if payload
  hash_args.merge!(payload: form_data) if form_data
  sub_url_args!(url_args, rest_method_call)
  arg_list = [method, "#{service_name}#{rest_method_call}#{build_params(params)}", headers]
  response = @client.execute(*arg_list, *args, **hash_args, &block)
  @last_response = response[:response]
  response[:parsed]
end

.inherited(clazz) ⇒ Object



12
13
14
15
16
17
# File 'lib/rest_dsl/service_base.rb', line 12

def self.inherited(clazz)
  clazz.class_eval do
    @file_name = caller_locations[2].path
    @config_file = @file_name.gsub('.rb', '.yml')
  end
end

.reload_configObject



72
73
74
75
76
# File 'lib/rest_dsl/service_base.rb', line 72

def reload_config
  @config = Psych.load_file(@config_file)[@environment] if File.exist?(@config_file)
  @config = {} unless File.exist?(@config_file)
  @config
end

.rest_call(method, name, url_schema) ⇒ Object



30
31
32
33
34
# File 'lib/rest_dsl/service_base.rb', line 30

def rest_call(method, name, url_schema)
  self.class.define_method("#{method}_#{name}") do |*args, headers: nil, payload: nil, params: nil, url_args: nil, **hash_args|
    execute_request(method, url_schema.dup, *args, **hash_args, headers: headers, payload: payload, params: params, url_args: url_args)
  end
end

.sub_url_args!(arg_list, rest_method_call) ⇒ Object



58
59
60
61
# File 'lib/rest_dsl/service_base.rb', line 58

def sub_url_args!(arg_list, rest_method_call)
  # Given the protocol is handled by the client and not service_base, this should be a safe enough pattern in most cases
  arg_list.each{ |arg_name, value| rest_method_call.gsub!(":#{arg_name}", value) }
end

Instance Method Details

#service_nameObject



87
88
89
# File 'lib/rest_dsl/service_base.rb', line 87

def service_name
  self.class.instance_variable_get(:@service_name)
end