vidispine 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +296 -0
- data/Rakefile +2 -0
- data/bin/vidispine +7 -0
- data/bin/vidispine-notification-handler +339 -0
- data/bin/vidispine-utilities-http-server +13 -0
- data/dist/vidispine-1.4.0.gem +0 -0
- data/lib/vidispine.rb +5 -0
- data/lib/vidispine/api/client.rb +981 -0
- data/lib/vidispine/api/client/http_client.rb +291 -0
- data/lib/vidispine/api/client/requests.rb +27 -0
- data/lib/vidispine/api/client/requests/base_request.rb +234 -0
- data/lib/vidispine/api/client/requests/collection_access_add.rb +30 -0
- data/lib/vidispine/api/client/requests/collection_access_delete.rb +26 -0
- data/lib/vidispine/api/client/requests/collection_metadata_set.rb +24 -0
- data/lib/vidispine/api/client/requests/import_placeholder.rb +36 -0
- data/lib/vidispine/api/client/requests/import_placeholder_item.rb +38 -0
- data/lib/vidispine/api/client/requests/import_sidecar_file.rb +28 -0
- data/lib/vidispine/api/client/requests/import_using_uri.rb +44 -0
- data/lib/vidispine/api/client/requests/item_access_add.rb +30 -0
- data/lib/vidispine/api/client/requests/item_access_delete.rb +26 -0
- data/lib/vidispine/api/client/requests/item_delete.rb +17 -0
- data/lib/vidispine/api/client/requests/item_export.rb +44 -0
- data/lib/vidispine/api/client/requests/item_metadata_get.rb +37 -0
- data/lib/vidispine/api/client/requests/item_metadata_set.rb +29 -0
- data/lib/vidispine/api/client/requests/item_search.rb +0 -0
- data/lib/vidispine/api/client/requests/item_transcode.rb +23 -0
- data/lib/vidispine/api/client/requests/items_search.rb +40 -0
- data/lib/vidispine/api/client/requests/search.rb +59 -0
- data/lib/vidispine/api/client/requests/storage_file_create.rb +23 -0
- data/lib/vidispine/api/client/requests/storage_file_get.rb +40 -0
- data/lib/vidispine/api/client/requests/storage_files_get.rb +42 -0
- data/lib/vidispine/api/utilities.rb +1608 -0
- data/lib/vidispine/api/utilities/cli.rb +168 -0
- data/lib/vidispine/api/utilities/http_server.rb +230 -0
- data/lib/vidispine/api/utilities/http_server/cli.rb +77 -0
- data/lib/vidispine/cli.rb +174 -0
- data/lib/vidispine/version.rb +3 -0
- data/resources/postman/Vidispine API (From WADL v4.11).postman_collection.json +47437 -0
- data/vidispine.gemspec +26 -0
- metadata +117 -0
@@ -0,0 +1,291 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/https'
|
3
|
+
|
4
|
+
module Vidispine
|
5
|
+
module API
|
6
|
+
class Client
|
7
|
+
|
8
|
+
class HTTPClient
|
9
|
+
|
10
|
+
class HTTPAuthorizationError < RuntimeError; end
|
11
|
+
|
12
|
+
attr_accessor :logger, :http, :http_host_address, :http_host_port, :base_uri, :default_base_path
|
13
|
+
attr_accessor :username, :password
|
14
|
+
|
15
|
+
attr_accessor :default_request_headers,
|
16
|
+
:authorization_header_key, :authorization_header_value
|
17
|
+
|
18
|
+
attr_accessor :log_request_body, :log_response_body, :log_pretty_print_body
|
19
|
+
|
20
|
+
attr_accessor :request, :response, :use_exceptions
|
21
|
+
|
22
|
+
DEFAULT_HTTP_HOST_ADDRESS = 'localhost'
|
23
|
+
DEFAULT_HTTP_HOST_PORT = 8080
|
24
|
+
|
25
|
+
DEFAULT_USERNAME = 'admin'
|
26
|
+
DEFAULT_PASSWORD = 'password'
|
27
|
+
DEFAULT_BASE_PATH = 'API/'
|
28
|
+
|
29
|
+
DEFAULT_HEADER_CONTENT_TYPE = 'application/json; charset=utf-8'
|
30
|
+
DEFAULT_HEADER_ACCEPTS = 'application/json'
|
31
|
+
|
32
|
+
def initialize(args = { })
|
33
|
+
args = args.dup
|
34
|
+
|
35
|
+
@use_exceptions = args.fetch(:use_exceptions, true)
|
36
|
+
|
37
|
+
initialize_logger(args)
|
38
|
+
initialize_http(args)
|
39
|
+
|
40
|
+
logger.debug { "#{self.class.name}::#{__method__} Arguments: #{args.inspect}" }
|
41
|
+
|
42
|
+
@username = args[:username] || DEFAULT_USERNAME
|
43
|
+
@password = args[:password] || DEFAULT_PASSWORD
|
44
|
+
@authorization_header_value = args[:authorization_header_value]
|
45
|
+
|
46
|
+
@base_uri = args[:base_uri] || "http#{http.use_ssl? ? 's' : ''}://#{http.address}:#{http.port}"
|
47
|
+
@default_base_path = args[:default_base_path] || DEFAULT_BASE_PATH
|
48
|
+
|
49
|
+
# @user_agent_default = "#{@hostname}:#{@username} Ruby SDK Version #{Vidispine::VERSION}"
|
50
|
+
|
51
|
+
@authorization_header_key ||= 'Authorization' #CaseSensitiveHeaderKey.new('Authorization')
|
52
|
+
@authorization_header_value ||= %(Basic #{["#{username}:#{password}"].pack('m').delete("\r\n")})
|
53
|
+
|
54
|
+
content_type = args[:content_type_header] ||= DEFAULT_HEADER_CONTENT_TYPE
|
55
|
+
accepts = args[:accepts_header] ||= args[:accept_header] || DEFAULT_HEADER_ACCEPTS
|
56
|
+
|
57
|
+
@default_request_headers = {
|
58
|
+
'Content-Type' => content_type,
|
59
|
+
'Accept' => accepts,
|
60
|
+
authorization_header_key => authorization_header_value,
|
61
|
+
}
|
62
|
+
|
63
|
+
@log_request_body = args.fetch(:log_request_body, true)
|
64
|
+
@log_response_body = args.fetch(:log_response_body, true)
|
65
|
+
@log_pretty_print_body = args.fetch(:log_pretty_print_body, true)
|
66
|
+
|
67
|
+
@parse_response = args.fetch(:parse_response, true)
|
68
|
+
end
|
69
|
+
|
70
|
+
def initialize_logger(args = { })
|
71
|
+
@logger = args[:logger] ||= Logger.new(args[:log_to] || STDOUT)
|
72
|
+
log_level = args[:log_level]
|
73
|
+
if log_level
|
74
|
+
@logger.level = log_level
|
75
|
+
args[:logger] = @logger
|
76
|
+
end
|
77
|
+
@logger
|
78
|
+
end
|
79
|
+
|
80
|
+
def initialize_http(args = { })
|
81
|
+
@http_host_address = args[:http_host_address] ||= DEFAULT_HTTP_HOST_ADDRESS
|
82
|
+
@http_host_port = args[:http_host_port] ||= DEFAULT_HTTP_HOST_PORT
|
83
|
+
@http = Net::HTTP.new(http_host_address, http_host_port)
|
84
|
+
|
85
|
+
use_ssl = args[:http_host_use_ssl]
|
86
|
+
if use_ssl
|
87
|
+
# @TODO Add SSL Support
|
88
|
+
http.use_ssl = true
|
89
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
90
|
+
end
|
91
|
+
|
92
|
+
http
|
93
|
+
end
|
94
|
+
|
95
|
+
# Formats a HTTPRequest or HTTPResponse body for log output.
|
96
|
+
# @param [HTTPRequest|HTTPResponse] obj
|
97
|
+
# @return [String]
|
98
|
+
def format_body_for_log_output(obj)
|
99
|
+
if obj.content_type == 'application/json'
|
100
|
+
if @log_pretty_print_body
|
101
|
+
_body = obj.body
|
102
|
+
output = JSON.pretty_generate(JSON.parse(_body)) rescue _body
|
103
|
+
return output
|
104
|
+
else
|
105
|
+
return obj.body
|
106
|
+
end
|
107
|
+
elsif obj.content_type == 'application/xml'
|
108
|
+
return obj.body
|
109
|
+
else
|
110
|
+
return obj.body.inspect
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# @param [HTTPRequest] request
|
115
|
+
def send_request(request)
|
116
|
+
@response_parsed = nil
|
117
|
+
@request = request
|
118
|
+
logger.debug { %(REQUEST: #{request.method} http#{http.use_ssl? ? 's' : ''}://#{http.address}:#{http.port}#{request.path} HEADERS: #{request.to_hash.inspect} #{log_request_body and request.request_body_permitted? ? "\n-- BODY BEGIN --\n#{format_body_for_log_output(request)}\n-- BODY END --" : ''}) }
|
119
|
+
|
120
|
+
@request_time_start = Time.now
|
121
|
+
@response = http.request(request)
|
122
|
+
@request_time_end = Time.now
|
123
|
+
logger.debug { %(RESPONSE: #{response.inspect} HEADERS: #{response.to_hash.inspect} #{log_response_body and response.respond_to?(:body) ? "\n-- BODY BEGIN --\n#{format_body_for_log_output(response)}\n-- BODY END--" : ''}\nTook: #{@request_time_end - @request_time_start} seconds) }
|
124
|
+
#logger.debug { "Parse Response? #{@parse_response}" }
|
125
|
+
|
126
|
+
raise HTTPAuthorizationError if @use_exceptions && @response.code == '401'
|
127
|
+
|
128
|
+
@parse_response ? response_parsed : response.body
|
129
|
+
end
|
130
|
+
|
131
|
+
def response_parsed
|
132
|
+
@response_parsed ||= begin
|
133
|
+
response_body = response.respond_to?(:body) ? response.body : ''
|
134
|
+
logger.debug { "Parsing Response. #{response_body.inspect}" }
|
135
|
+
|
136
|
+
case response.content_type
|
137
|
+
when 'application/json'
|
138
|
+
response_body.empty? ? response_body : JSON.parse(response_body) # rescue response
|
139
|
+
else
|
140
|
+
response_body
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# @param [String] path
|
146
|
+
# @param [Hash|String|Nil] query
|
147
|
+
# @return [URI]
|
148
|
+
def build_uri(path = '', query = nil)
|
149
|
+
_query = query.is_a?(Hash) ? query.map { |k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.respond_to?(:to_s) ? v.to_s : v)}" }.join('&') : query
|
150
|
+
_path = "#{path}#{_query and _query.respond_to?(:empty?) and !_query.empty? ? "?#{_query}" : ''}"
|
151
|
+
URI.parse(File.join(base_uri, _path))
|
152
|
+
end
|
153
|
+
|
154
|
+
if RUBY_VERSION.start_with? '1.8.'
|
155
|
+
def request_method_name_to_class_name(method_name)
|
156
|
+
method_name.to_s.capitalize
|
157
|
+
end
|
158
|
+
else
|
159
|
+
def request_method_name_to_class_name(method_name)
|
160
|
+
method_name.to_s.capitalize.to_sym
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# @param [Symbol] method_name (:get)
|
165
|
+
# @param [Hash] args
|
166
|
+
# @option args [Hash] :headers ({})
|
167
|
+
# @option args [String] :path ('')
|
168
|
+
# @option args [Hash] :query ({})
|
169
|
+
# @option args [Any] :body (nil)
|
170
|
+
# @param [Hash] options
|
171
|
+
# @option options [Hash] :default_request_headers (@default_request_headers)
|
172
|
+
def call_method(method_name = :get, args = { }, options = { })
|
173
|
+
headers = args[:headers] || options[:headers] || { }
|
174
|
+
path = args[:path] || ''
|
175
|
+
query = args[:query] || { }
|
176
|
+
body = args[:body]
|
177
|
+
|
178
|
+
# Allow the default request headers to be overridden
|
179
|
+
_default_request_headers = options.fetch(:default_request_headers, default_request_headers)
|
180
|
+
_default_request_headers ||= { }
|
181
|
+
_headers = _default_request_headers.merge(headers)
|
182
|
+
|
183
|
+
@uri = build_uri(path, query)
|
184
|
+
klass_name = request_method_name_to_class_name(method_name)
|
185
|
+
klass = Net::HTTP.const_get(klass_name)
|
186
|
+
|
187
|
+
request = klass.new(@uri.request_uri, _headers)
|
188
|
+
|
189
|
+
if request.request_body_permitted?
|
190
|
+
_body = (body and !body.is_a?(String)) ? JSON.generate(body) : body
|
191
|
+
logger.debug { "Processing Body: '#{_body}'" }
|
192
|
+
request.body = _body if _body
|
193
|
+
end
|
194
|
+
|
195
|
+
send_request(request)
|
196
|
+
end
|
197
|
+
|
198
|
+
def delete(path, options = { })
|
199
|
+
query = options.fetch(:query, { })
|
200
|
+
base_path = options[:base_path] || ( path.start_with?(@default_base_path) ? '' : @default_base_path )
|
201
|
+
@uri = build_uri(File.join(base_path, path), query)
|
202
|
+
request = Net::HTTP::Delete.new(@uri.request_uri, default_request_headers)
|
203
|
+
send_request(request)
|
204
|
+
end
|
205
|
+
|
206
|
+
def get(path, options = { })
|
207
|
+
# Allow the default request headers to be overridden
|
208
|
+
headers = options[:headers] || { }
|
209
|
+
_default_request_headers = options.fetch(:default_request_headers, default_request_headers) || { }
|
210
|
+
_headers = _default_request_headers.merge(headers)
|
211
|
+
|
212
|
+
query ||= options.fetch(:query, { })
|
213
|
+
base_path = options[:base_path] || ( path.start_with?(@default_base_path) ? '' : @default_base_path )
|
214
|
+
@uri = build_uri(File.join(base_path, path), query)
|
215
|
+
request = Net::HTTP::Get.new(@uri.request_uri, _headers)
|
216
|
+
send_request(request)
|
217
|
+
end
|
218
|
+
|
219
|
+
def head(path, options = { })
|
220
|
+
# Allow the default request headers to be overridden
|
221
|
+
headers = options[:headers] || { }
|
222
|
+
_default_request_headers = options.fetch(:default_request_headers, default_request_headers) || { }
|
223
|
+
_headers = _default_request_headers.merge(headers)
|
224
|
+
|
225
|
+
query ||= options.fetch(:query, { })
|
226
|
+
base_path = options[:base_path] || ( path.start_with?(@default_base_path) ? '' : @default_base_path )
|
227
|
+
@uri = build_uri(File.join(base_path, path), query)
|
228
|
+
|
229
|
+
request = Net::HTTP::Head.new(@uri.request_uri, _headers)
|
230
|
+
send_request(request)
|
231
|
+
end
|
232
|
+
|
233
|
+
def options(path, options = { })
|
234
|
+
# Allow the default request headers to be overridden
|
235
|
+
headers = options[:headers] || { }
|
236
|
+
_default_request_headers = options.fetch(:default_request_headers, default_request_headers) || { }
|
237
|
+
_headers = _default_request_headers.merge(headers)
|
238
|
+
|
239
|
+
query ||= options.fetch(:query, { })
|
240
|
+
base_path = options[:base_path] || ( path.start_with?(@default_base_path) ? '' : @default_base_path )
|
241
|
+
@uri = build_uri(File.join(base_path, path), query)
|
242
|
+
request = Net::HTTP::Options.new(@uri.request_uri, _headers)
|
243
|
+
send_request(request)
|
244
|
+
end
|
245
|
+
|
246
|
+
def put(path, body, options = { })
|
247
|
+
# Allow the default request headers to be overridden
|
248
|
+
headers = options[:headers] || { }
|
249
|
+
_default_request_headers = options.fetch(:default_request_headers, default_request_headers) || { }
|
250
|
+
_headers = _default_request_headers.merge(headers)
|
251
|
+
|
252
|
+
query = options.fetch(:query, { })
|
253
|
+
base_path = options[:base_path] || ( path.start_with?(@default_base_path) ? '' : @default_base_path )
|
254
|
+
@uri = build_uri(File.join(base_path, path), query)
|
255
|
+
request = Net::HTTP::Put.new(@uri.request_uri, _headers)
|
256
|
+
|
257
|
+
body = JSON.generate(body) if body and !body.is_a?(String)
|
258
|
+
|
259
|
+
request.body = body if body
|
260
|
+
send_request(request)
|
261
|
+
end
|
262
|
+
|
263
|
+
def post(path, body, options = { })
|
264
|
+
# Allow the default request headers to be overridden
|
265
|
+
headers = options[:headers] || { }
|
266
|
+
_default_request_headers = options.fetch(:default_request_headers, default_request_headers) || { }
|
267
|
+
_headers = _default_request_headers.merge(headers)
|
268
|
+
|
269
|
+
query = options.fetch(:query, { })
|
270
|
+
base_path = options[:base_path] || ( path.start_with?(@default_base_path) ? '' : @default_base_path )
|
271
|
+
@uri = build_uri(File.join(base_path, path), query)
|
272
|
+
|
273
|
+
request = Net::HTTP::Post.new(@uri.request_uri, _headers)
|
274
|
+
|
275
|
+
body = JSON.generate(body) if body and !body.is_a?(String)
|
276
|
+
|
277
|
+
request.body = body if body
|
278
|
+
send_request(request)
|
279
|
+
end
|
280
|
+
|
281
|
+
# HTTPClient
|
282
|
+
end
|
283
|
+
|
284
|
+
# Client
|
285
|
+
end
|
286
|
+
|
287
|
+
# API
|
288
|
+
end
|
289
|
+
|
290
|
+
# Vidispine
|
291
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'vidispine/api/client/requests/base_request'
|
2
|
+
|
3
|
+
require 'vidispine/api/client/requests/collection_access_add'
|
4
|
+
require 'vidispine/api/client/requests/collection_access_delete'
|
5
|
+
require 'vidispine/api/client/requests/collection_metadata_set'
|
6
|
+
|
7
|
+
require 'vidispine/api/client/requests/import_placeholder'
|
8
|
+
require 'vidispine/api/client/requests/import_placeholder_item'
|
9
|
+
require 'vidispine/api/client/requests/import_sidecar_file'
|
10
|
+
require 'vidispine/api/client/requests/import_using_uri'
|
11
|
+
|
12
|
+
require 'vidispine/api/client/requests/item_access_add'
|
13
|
+
require 'vidispine/api/client/requests/item_access_delete'
|
14
|
+
require 'vidispine/api/client/requests/item_delete'
|
15
|
+
require 'vidispine/api/client/requests/item_export'
|
16
|
+
require 'vidispine/api/client/requests/item_metadata_get'
|
17
|
+
require 'vidispine/api/client/requests/item_metadata_set'
|
18
|
+
require 'vidispine/api/client/requests/item_transcode'
|
19
|
+
|
20
|
+
require 'vidispine/api/client/requests/items_search'
|
21
|
+
|
22
|
+
require 'vidispine/api/client/requests/search'
|
23
|
+
|
24
|
+
require 'vidispine/api/client/requests/storage_file_create'
|
25
|
+
require 'vidispine/api/client/requests/storage_file_get'
|
26
|
+
|
27
|
+
require 'vidispine/api/client/requests/storage_files_get'
|
@@ -0,0 +1,234 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Vidispine
|
5
|
+
module API
|
6
|
+
class Client
|
7
|
+
module Requests
|
8
|
+
|
9
|
+
class BaseRequest
|
10
|
+
|
11
|
+
HTTP_METHOD = :get
|
12
|
+
HTTP_BASE_PATH = '/API/'
|
13
|
+
HTTP_PATH = ''
|
14
|
+
HTTP_SUCCESS_CODE = '200'
|
15
|
+
|
16
|
+
DEFAULT_PARAMETER_SEND_IN_VALUE = :query
|
17
|
+
|
18
|
+
PARAMETERS = [ ]
|
19
|
+
|
20
|
+
attr_accessor :client, :arguments, :options, :initial_arguments, :missing_required_arguments,
|
21
|
+
:default_parameter_send_in_value, :processed_parameters
|
22
|
+
|
23
|
+
attr_writer :parameters, :path, :body, :query
|
24
|
+
|
25
|
+
def self.normalize_argument_hash_keys(hash)
|
26
|
+
return hash unless hash.is_a?(Hash)
|
27
|
+
Hash[ hash.dup.map { |k,v| [ normalize_parameter_name(k), v ] } ]
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.normalize_parameter_name(name)
|
31
|
+
(name || '').respond_to?(:to_s) ? name.to_s.gsub('_', '').gsub('-', '').downcase : name
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.process_parameters(params, args, options = { })
|
35
|
+
args = normalize_argument_hash_keys(args) || { }
|
36
|
+
args_out = options[:arguments_out] || { }
|
37
|
+
default_parameter_send_in_value = options[:default_parameter_send_in_value] || DEFAULT_PARAMETER_SEND_IN_VALUE
|
38
|
+
processed_parameters = options[:processed_parameters] || { }
|
39
|
+
missing_required_arguments = options[:missing_required_arguments] || [ ]
|
40
|
+
|
41
|
+
params.each do |param|
|
42
|
+
process_parameter(param, args, args_out, missing_required_arguments, processed_parameters, default_parameter_send_in_value)
|
43
|
+
end
|
44
|
+
{ :arguments_out => args_out, :processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments }
|
45
|
+
end
|
46
|
+
|
47
|
+
# A method to expose parameter processing
|
48
|
+
#
|
49
|
+
# @param [Hash|Symbol] param The parameter to process
|
50
|
+
# @param [Hash] args ({ }) Arguments to possibly match to the parameter
|
51
|
+
# @param [Hash] args_out ({ }) The processed value of the parameter (if any)
|
52
|
+
# @param [Array] missing_required_arguments ([ ]) If the parameter was required and no argument found then it
|
53
|
+
# will be placed into this array
|
54
|
+
# @param [Hash] processed_parameters ({ }) The parameter will be placed into this array once processed
|
55
|
+
# @param [Symbol] default_parameter_send_in_value (DEFAULT_PARAMETER_SEND_IN_VALUE) The :send_in value that
|
56
|
+
# will be set if the :send_in key is not found
|
57
|
+
# @param [Hash] options
|
58
|
+
# @option options [True|False] :normalize_argument_hash_keys (false)
|
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 = { })
|
60
|
+
args = normalize_argument_hash_keys(args) || { } if options.fetch(:normalize_argument_hash_keys, false)
|
61
|
+
|
62
|
+
_k = param.is_a?(Hash) ? param : { :name => param, :required => false, :send_in => default_parameter_send_in_value }
|
63
|
+
_k[:send_in] ||= default_parameter_send_in_value
|
64
|
+
|
65
|
+
proper_parameter_name = _k[:name]
|
66
|
+
param_name = normalize_parameter_name(proper_parameter_name)
|
67
|
+
arg_key = (has_key = args.has_key?(param_name)) ?
|
68
|
+
param_name :
|
69
|
+
( (_k[:aliases] || [ ]).map { |a| normalize_parameter_name(a) }.find { |a| has_key = args.has_key?(a) } || param_name )
|
70
|
+
|
71
|
+
value = has_key ? args[arg_key] : _k[:default_value]
|
72
|
+
is_set = has_key || _k.has_key?(:default_value)
|
73
|
+
|
74
|
+
processed_parameters[proper_parameter_name] = _k.merge(:value => value, :is_set => is_set)
|
75
|
+
|
76
|
+
unless is_set
|
77
|
+
missing_required_arguments << proper_parameter_name if _k[:required]
|
78
|
+
else
|
79
|
+
args_out[proper_parameter_name] = value
|
80
|
+
end
|
81
|
+
|
82
|
+
{ :arguments_out => args_out, :processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments }
|
83
|
+
end
|
84
|
+
|
85
|
+
def initialize(args = { }, options = { })
|
86
|
+
@initial_arguments = args.dup
|
87
|
+
@options = options.dup
|
88
|
+
|
89
|
+
after_initialize
|
90
|
+
end
|
91
|
+
|
92
|
+
def after_initialize
|
93
|
+
reset_attributes
|
94
|
+
|
95
|
+
process_parameters
|
96
|
+
end
|
97
|
+
|
98
|
+
def reset_attributes
|
99
|
+
@client = options[:client]
|
100
|
+
@missing_required_arguments = [ ]
|
101
|
+
@default_parameter_send_in_value = options[:default_parameter_send_in_value] || self.class::DEFAULT_PARAMETER_SEND_IN_VALUE
|
102
|
+
@processed_parameters = { }
|
103
|
+
@arguments = { }
|
104
|
+
@eval_http_path = options.fetch(:eval_http_path, true)
|
105
|
+
@base_path = options[:base_path]
|
106
|
+
|
107
|
+
@parameters = options[:parameters]
|
108
|
+
@http_method = options[:http_method]
|
109
|
+
@http_path = options[:http_path] ||= options[:path_raw]
|
110
|
+
@http_success_code = options[:http_success_code] ||= HTTP_SUCCESS_CODE
|
111
|
+
|
112
|
+
@path = options[:path]
|
113
|
+
@path_arguments = nil
|
114
|
+
@path_only = nil
|
115
|
+
|
116
|
+
@matrix = options[:matrix]
|
117
|
+
@matrix_arguments = nil
|
118
|
+
|
119
|
+
@query = options[:query]
|
120
|
+
@query_arguments = nil
|
121
|
+
|
122
|
+
@body = options[:body]
|
123
|
+
@body_arguments = nil
|
124
|
+
end
|
125
|
+
|
126
|
+
def process_parameters(params = parameters, args = @initial_arguments, options = @options)
|
127
|
+
|
128
|
+
before_process_parameters unless options.fetch(:skip_before_process_parameters, false)
|
129
|
+
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))
|
130
|
+
after_process_parameters unless options.fetch(:skip_after_process_parameters, false)
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
def before_process_parameters
|
135
|
+
# TO BE IMPLEMENTED IN CHILD CLASS
|
136
|
+
end
|
137
|
+
|
138
|
+
def after_process_parameters
|
139
|
+
# TO BE IMPLEMENTED IN CHILD CLASS
|
140
|
+
end
|
141
|
+
|
142
|
+
# @!group Attribute Readers
|
143
|
+
|
144
|
+
def http_success_code
|
145
|
+
@http_success_code
|
146
|
+
end
|
147
|
+
|
148
|
+
def arguments
|
149
|
+
@arguments ||= { }
|
150
|
+
end
|
151
|
+
|
152
|
+
def base_path
|
153
|
+
@base_path ||= self.class::HTTP_BASE_PATH
|
154
|
+
end
|
155
|
+
|
156
|
+
def body_arguments
|
157
|
+
@body_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :body }
|
158
|
+
end
|
159
|
+
|
160
|
+
def body
|
161
|
+
body_arguments.empty? ? nil : body_arguments
|
162
|
+
end
|
163
|
+
|
164
|
+
def client
|
165
|
+
@client ||= options[:client]
|
166
|
+
end
|
167
|
+
|
168
|
+
def eval_http_path?
|
169
|
+
@eval_http_path
|
170
|
+
end
|
171
|
+
|
172
|
+
def http_path
|
173
|
+
@http_path ||= self.class::HTTP_PATH #||= File.join(http.default_base_path, self.class::HTTP_PATH)
|
174
|
+
end
|
175
|
+
|
176
|
+
def http_method
|
177
|
+
@http_method ||= self.class::HTTP_METHOD
|
178
|
+
end
|
179
|
+
|
180
|
+
def parameters
|
181
|
+
@parameters ||= self.class::PARAMETERS.dup
|
182
|
+
end
|
183
|
+
|
184
|
+
# The URI Path including "matrix" arguments
|
185
|
+
def path
|
186
|
+
@path ||= [ path_only ].concat( [*matrix].delete_if { |v| v.respond_to?(:empty?) and v.empty? } ).join('')
|
187
|
+
end
|
188
|
+
alias :path_with_matrix :path
|
189
|
+
|
190
|
+
def path_arguments
|
191
|
+
@path_arguments ||= Hash[
|
192
|
+
arguments.dup.delete_if { |k, _| processed_parameters[k][:send_in] != :path }.
|
193
|
+
map { |k,v| [ k, CGI.escape(v.respond_to?(:to_s) ? v.to_s : '').gsub('+', '%20') ] }
|
194
|
+
]
|
195
|
+
end
|
196
|
+
|
197
|
+
def path_only
|
198
|
+
@path_only ||= File.join(base_path, (eval_http_path? ? eval(%("#{http_path}"), binding, __FILE__, __LINE__) : http_path))
|
199
|
+
end
|
200
|
+
|
201
|
+
def query
|
202
|
+
@query ||= begin
|
203
|
+
query_arguments.is_a?(Hash) ? 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
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def query_arguments
|
208
|
+
@query_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :query }
|
209
|
+
end
|
210
|
+
|
211
|
+
def matrix
|
212
|
+
@matrix = matrix_arguments.map { |k,v| ";#{CGI.escape(k.to_s).gsub('+', '%20')}=#{CGI.escape(v.to_s).gsub('+', '%20')}" }.join('')
|
213
|
+
end
|
214
|
+
|
215
|
+
def matrix_arguments
|
216
|
+
@matrix_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :matrix }
|
217
|
+
end
|
218
|
+
|
219
|
+
def uri_request_path
|
220
|
+
[ path_with_matrix ].concat( [*query].delete_if { |v| v.respond_to?(:empty?) and v.empty? } ).join('?')
|
221
|
+
end
|
222
|
+
|
223
|
+
def success?
|
224
|
+
_response = client.http_client.response
|
225
|
+
_response && (_response.code == http_success_code)
|
226
|
+
end
|
227
|
+
|
228
|
+
# @!endgroup
|
229
|
+
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|