vidispine 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +296 -0
  6. data/Rakefile +2 -0
  7. data/bin/vidispine +7 -0
  8. data/bin/vidispine-notification-handler +339 -0
  9. data/bin/vidispine-utilities-http-server +13 -0
  10. data/dist/vidispine-1.4.0.gem +0 -0
  11. data/lib/vidispine.rb +5 -0
  12. data/lib/vidispine/api/client.rb +981 -0
  13. data/lib/vidispine/api/client/http_client.rb +291 -0
  14. data/lib/vidispine/api/client/requests.rb +27 -0
  15. data/lib/vidispine/api/client/requests/base_request.rb +234 -0
  16. data/lib/vidispine/api/client/requests/collection_access_add.rb +30 -0
  17. data/lib/vidispine/api/client/requests/collection_access_delete.rb +26 -0
  18. data/lib/vidispine/api/client/requests/collection_metadata_set.rb +24 -0
  19. data/lib/vidispine/api/client/requests/import_placeholder.rb +36 -0
  20. data/lib/vidispine/api/client/requests/import_placeholder_item.rb +38 -0
  21. data/lib/vidispine/api/client/requests/import_sidecar_file.rb +28 -0
  22. data/lib/vidispine/api/client/requests/import_using_uri.rb +44 -0
  23. data/lib/vidispine/api/client/requests/item_access_add.rb +30 -0
  24. data/lib/vidispine/api/client/requests/item_access_delete.rb +26 -0
  25. data/lib/vidispine/api/client/requests/item_delete.rb +17 -0
  26. data/lib/vidispine/api/client/requests/item_export.rb +44 -0
  27. data/lib/vidispine/api/client/requests/item_metadata_get.rb +37 -0
  28. data/lib/vidispine/api/client/requests/item_metadata_set.rb +29 -0
  29. data/lib/vidispine/api/client/requests/item_search.rb +0 -0
  30. data/lib/vidispine/api/client/requests/item_transcode.rb +23 -0
  31. data/lib/vidispine/api/client/requests/items_search.rb +40 -0
  32. data/lib/vidispine/api/client/requests/search.rb +59 -0
  33. data/lib/vidispine/api/client/requests/storage_file_create.rb +23 -0
  34. data/lib/vidispine/api/client/requests/storage_file_get.rb +40 -0
  35. data/lib/vidispine/api/client/requests/storage_files_get.rb +42 -0
  36. data/lib/vidispine/api/utilities.rb +1608 -0
  37. data/lib/vidispine/api/utilities/cli.rb +168 -0
  38. data/lib/vidispine/api/utilities/http_server.rb +230 -0
  39. data/lib/vidispine/api/utilities/http_server/cli.rb +77 -0
  40. data/lib/vidispine/cli.rb +174 -0
  41. data/lib/vidispine/version.rb +3 -0
  42. data/resources/postman/Vidispine API (From WADL v4.11).postman_collection.json +47437 -0
  43. data/vidispine.gemspec +26 -0
  44. 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