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.
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