Class: Vidispine::API::Client::Requests::BaseRequest

Inherits:
Object
  • Object
show all
Defined in:
lib/vidispine/api/client/requests/base_request.rb

Constant Summary collapse

HTTP_METHOD =
:get
HTTP_BASE_PATH =

Not used, using client.api_endpoint_prefix instead

'/API/'
HTTP_PATH =
''
HTTP_SUCCESS_CODE =
'200'
DEFAULT_PARAMETER_SEND_IN_VALUE =
:query
PARAMETERS =
[ ]

Attribute Readers collapse

Instance Attribute Summary collapse

Attribute Readers collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = { }, options = { }) ⇒ BaseRequest

Returns a new instance of BaseRequest.



85
86
87
88
89
90
# File 'lib/vidispine/api/client/requests/base_request.rb', line 85

def initialize(args = { }, options = { })
  @initial_arguments = args.dup
  @options = options.dup

  after_initialize
end

Instance Attribute Details

#argumentsObject

Returns the value of attribute arguments.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def arguments
  @arguments
end

#bodyObject



160
161
162
# File 'lib/vidispine/api/client/requests/base_request.rb', line 160

def body
  body_arguments.empty? ? nil : body_arguments
end

#clientObject

Returns the value of attribute client.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def client
  @client
end

#default_parameter_send_in_valueObject

Returns the value of attribute default_parameter_send_in_value.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def default_parameter_send_in_value
  @default_parameter_send_in_value
end

#initial_argumentsObject

Returns the value of attribute initial_arguments.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def initial_arguments
  @initial_arguments
end

#missing_required_argumentsObject

Returns the value of attribute missing_required_arguments.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def missing_required_arguments
  @missing_required_arguments
end

#optionsObject

Returns the value of attribute options.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def options
  @options
end

#parametersObject



180
181
182
# File 'lib/vidispine/api/client/requests/base_request.rb', line 180

def parameters
  @parameters ||= self.class::PARAMETERS.dup
end

#pathObject Also known as: path_with_matrix

The URI Path including “matrix” arguments



185
186
187
# File 'lib/vidispine/api/client/requests/base_request.rb', line 185

def path
  @path ||= [ path_only ].concat( [*matrix].delete_if { |v| v.respond_to?(:empty?) and v.empty? } ).join('')
end

#processed_parametersObject

Returns the value of attribute processed_parameters.



20
21
22
# File 'lib/vidispine/api/client/requests/base_request.rb', line 20

def processed_parameters
  @processed_parameters
end

#queryObject



201
202
203
204
205
# File 'lib/vidispine/api/client/requests/base_request.rb', line 201

def query
  @query ||= begin
    query_arguments.is_a?(Hash) ? (client.http_client.default_query_data.merge(query_arguments)).map { |k,v| "#{CGI.escape(k.to_s).gsub('+', '%20')}=#{CGI.escape(v.respond_to?(:to_s) ? v.to_s : v).gsub('+', '%20')}" }.join('&') : query_arguments
  end
end

Class Method Details

.normalize_argument_hash_keys(hash) ⇒ Object



25
26
27
28
# File 'lib/vidispine/api/client/requests/base_request.rb', line 25

def self.normalize_argument_hash_keys(hash)
  return hash unless hash.is_a?(Hash)
  Hash[ hash.dup.map { |k,v| [ normalize_parameter_name(k), v ] } ]
end

.normalize_parameter_name(name) ⇒ Object



30
31
32
# File 'lib/vidispine/api/client/requests/base_request.rb', line 30

def self.normalize_parameter_name(name)
  (name || '').respond_to?(:to_s) ? name.to_s.gsub('_', '').gsub('-', '').downcase : name
end

.process_parameter(param, args = { }, args_out = { }, missing_required_arguments = [ ], processed_parameters = { }, default_parameter_send_in_value = DEFAULT_PARAMETER_SEND_IN_VALUE, options = { }) ⇒ Object

A method to expose parameter processing

will be placed into this array will be set if the :send_in key is not found

Parameters:

  • param (Hash|Symbol)

    The parameter to process

  • args (Hash) (defaults to: { })

    ({ }) Arguments to possibly match to the parameter

  • args_out (Hash) (defaults to: { })

    ({ }) The processed value of the parameter (if any)

  • missing_required_arguments (Array) (defaults to: [ ])

    ([ ]) If the parameter was required and no argument found then it

  • processed_parameters (Hash) (defaults to: { })

    ({ }) The parameter will be placed into this array once processed

  • default_parameter_send_in_value (Symbol) (defaults to: DEFAULT_PARAMETER_SEND_IN_VALUE)

    (DEFAULT_PARAMETER_SEND_IN_VALUE) The :send_in value that

  • options (Hash) (defaults to: { })

Options Hash (options):

  • :normalize_argument_hash_keys (True|False) — default: false


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
# File 'lib/vidispine/api/client/requests/base_request.rb', line 59

def self.process_parameter(param, args = { }, args_out = { }, missing_required_arguments = [ ], processed_parameters = { }, default_parameter_send_in_value = DEFAULT_PARAMETER_SEND_IN_VALUE, options = { })
  args = normalize_argument_hash_keys(args) || { } if options.fetch(:normalize_argument_hash_keys, false)

  _k = param.is_a?(Hash) ? param : { :name => param, :required => false, :send_in => default_parameter_send_in_value }
  _k[:send_in] ||= default_parameter_send_in_value

  proper_parameter_name = _k[:name]
  param_name = normalize_parameter_name(proper_parameter_name)
  arg_key = (has_key = args.has_key?(param_name)) ?
      param_name :
      ( (_k[:aliases] || [ ]).map { |a| normalize_parameter_name(a) }.find { |a| has_key = args.has_key?(a) } || param_name )

  value = has_key ? args[arg_key] : _k[:default_value]
  is_set = has_key || _k.has_key?(:default_value)

  processed_parameters[proper_parameter_name] = _k.merge(:value => value, :is_set => is_set)

  unless is_set
    missing_required_arguments << proper_parameter_name if _k[:required]
  else
    args_out[proper_parameter_name] = value
  end

  { :arguments_out => args_out, :processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments }
end

.process_parameters(params, args, options = { }) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/vidispine/api/client/requests/base_request.rb', line 34

def self.process_parameters(params, args, options = { })
  args = normalize_argument_hash_keys(args) || { }
  args_out = options[:arguments_out] || { }
  default_parameter_send_in_value = options[:default_parameter_send_in_value] || DEFAULT_PARAMETER_SEND_IN_VALUE
  processed_parameters = options[:processed_parameters] || { }
  missing_required_arguments = options[:missing_required_arguments] || [ ]

  params.each do |param|
    process_parameter(param, args, args_out, missing_required_arguments, processed_parameters, default_parameter_send_in_value)
  end
  { :arguments_out => args_out, :processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments }
end

Instance Method Details

#after_initializeObject



92
93
94
95
96
# File 'lib/vidispine/api/client/requests/base_request.rb', line 92

def after_initialize
  reset_attributes

  process_parameters
end

#after_process_parametersObject



138
139
140
# File 'lib/vidispine/api/client/requests/base_request.rb', line 138

def after_process_parameters
  # TO BE IMPLEMENTED IN CHILD CLASS
end

#base_pathObject



152
153
154
# File 'lib/vidispine/api/client/requests/base_request.rb', line 152

def base_path
  @base_path ||= client.api_endpoint_prefix # self.class::HTTP_BASE_PATH
end

#before_process_parametersObject



134
135
136
# File 'lib/vidispine/api/client/requests/base_request.rb', line 134

def before_process_parameters
  # TO BE IMPLEMENTED IN CHILD CLASS
end

#body_argumentsObject



156
157
158
# File 'lib/vidispine/api/client/requests/base_request.rb', line 156

def body_arguments
  @body_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :body }
end

#eval_http_path?Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/vidispine/api/client/requests/base_request.rb', line 168

def eval_http_path?
  @eval_http_path
end

#http_methodObject



176
177
178
# File 'lib/vidispine/api/client/requests/base_request.rb', line 176

def http_method
  @http_method ||= self.class::HTTP_METHOD
end

#http_pathObject



172
173
174
# File 'lib/vidispine/api/client/requests/base_request.rb', line 172

def http_path
  @http_path ||= self.class::HTTP_PATH #||= File.join(http.default_base_path, self.class::HTTP_PATH)
end

#http_success_codeObject



144
145
146
# File 'lib/vidispine/api/client/requests/base_request.rb', line 144

def http_success_code
  @http_success_code
end

#matrixObject



211
212
213
# File 'lib/vidispine/api/client/requests/base_request.rb', line 211

def matrix
  @matrix = matrix_arguments.map { |k,v| ";#{CGI.escape(k.to_s).gsub('+', '%20')}=#{CGI.escape(v.to_s).gsub('+', '%20')}" }.join('')
end

#matrix_argumentsObject



215
216
217
# File 'lib/vidispine/api/client/requests/base_request.rb', line 215

def matrix_arguments
  @matrix_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :matrix }
end

#path_argumentsObject



190
191
192
193
194
195
# File 'lib/vidispine/api/client/requests/base_request.rb', line 190

def path_arguments
  @path_arguments ||= Hash[
      arguments.dup.delete_if { |k, _| processed_parameters[k][:send_in] != :path }.
          map { |k,v| [ k, CGI.escape(v.respond_to?(:to_s) ? v.to_s : '').gsub('+', '%20') ] }
  ]
end

#path_onlyObject



197
198
199
# File 'lib/vidispine/api/client/requests/base_request.rb', line 197

def path_only
  @path_only ||= File.join(base_path, (eval_http_path? ? eval(%("#{http_path}"), binding, __FILE__, __LINE__) : http_path))
end

#process_parameters(params = parameters, args = @initial_arguments, options = @options) ⇒ Object



126
127
128
129
130
131
132
# File 'lib/vidispine/api/client/requests/base_request.rb', line 126

def process_parameters(params = parameters, args = @initial_arguments, options = @options)

  before_process_parameters unless options.fetch(:skip_before_process_parameters, false)
  self.class.process_parameters(params, args, options.merge(:processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments, :default_parameter_send_in_value => default_parameter_send_in_value, :arguments_out => arguments))
  after_process_parameters unless options.fetch(:skip_after_process_parameters, false)

end

#query_argumentsObject



207
208
209
# File 'lib/vidispine/api/client/requests/base_request.rb', line 207

def query_arguments
  @query_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :query }
end

#reset_attributesObject



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/vidispine/api/client/requests/base_request.rb', line 98

def reset_attributes
  @client = options[:client]
  @missing_required_arguments = [ ]
  @default_parameter_send_in_value = options[:default_parameter_send_in_value] || self.class::DEFAULT_PARAMETER_SEND_IN_VALUE
  @processed_parameters = { }
  @arguments = { }
  @eval_http_path = options.fetch(:eval_http_path, true)
  @base_path = options[:base_path]

  @parameters = options[:parameters]
  @http_method = options[:http_method]
  @http_path = options[:http_path] ||= options[:path_raw]
  @http_success_code = options[:http_success_code] ||= HTTP_SUCCESS_CODE

  @path = options[:path]
  @path_arguments = nil
  @path_only = nil

  @matrix = options[:matrix]
  @matrix_arguments = nil

  @query = options[:query]
  @query_arguments = nil

  @body = options[:body]
  @body_arguments = nil
end

#success?Boolean

Returns:

  • (Boolean)


223
224
225
226
# File 'lib/vidispine/api/client/requests/base_request.rb', line 223

def success?
  _response = client.http_client.response
  _response && (_response.code == http_success_code)
end

#uri_request_pathObject



219
220
221
# File 'lib/vidispine/api/client/requests/base_request.rb', line 219

def uri_request_path
  [ path_with_matrix ].concat( [*query].delete_if { |v| v.respond_to?(:empty?) and v.empty? } ).join('?')
end