ubiquity-mediasilo-api-v3 1.0.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 (33) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +100 -0
  6. data/Rakefile +2 -0
  7. data/bin/ubiquity-mediasilo-api-v3 +26 -0
  8. data/lib/ubiquity/cli.rb +127 -0
  9. data/lib/ubiquity/mediasilo/api/v3.rb +11 -0
  10. data/lib/ubiquity/mediasilo/api/v3/cli.rb +94 -0
  11. data/lib/ubiquity/mediasilo/api/v3/client.rb +712 -0
  12. data/lib/ubiquity/mediasilo/api/v3/client/paginator.rb +133 -0
  13. data/lib/ubiquity/mediasilo/api/v3/client/requests.rb +18 -0
  14. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_copy_to_folder.rb +19 -0
  15. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_copy_to_project.rb +19 -0
  16. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_create.rb +25 -0
  17. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_delete.rb +15 -0
  18. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_get_by_id.rb +14 -0
  19. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_move_to_folder.rb +16 -0
  20. data/lib/ubiquity/mediasilo/api/v3/client/requests/asset_move_to_project.rb +16 -0
  21. data/lib/ubiquity/mediasilo/api/v3/client/requests/assets_get.rb +56 -0
  22. data/lib/ubiquity/mediasilo/api/v3/client/requests/assets_get_by_folder_id.rb +14 -0
  23. data/lib/ubiquity/mediasilo/api/v3/client/requests/assets_get_by_project_id.rb +14 -0
  24. data/lib/ubiquity/mediasilo/api/v3/client/requests/base_request.rb +250 -0
  25. data/lib/ubiquity/mediasilo/api/v3/client/requests/batch.rb +20 -0
  26. data/lib/ubiquity/mediasilo/api/v3/client/requests/project_create.rb +15 -0
  27. data/lib/ubiquity/mediasilo/api/v3/client/requests/quicklink_create.rb +54 -0
  28. data/lib/ubiquity/mediasilo/api/v3/client/requests/quicklink_share.rb +32 -0
  29. data/lib/ubiquity/mediasilo/api/v3/http_client.rb +259 -0
  30. data/lib/ubiquity/mediasilo/api/v3/utilities.rb +1145 -0
  31. data/lib/ubiquity/mediasilo/api/v3/version.rb +9 -0
  32. data/ubiquity-mediasilo-api-v3.gemspec +23 -0
  33. metadata +104 -0
@@ -0,0 +1,133 @@
1
+ class Ubiquity::MediaSilo::API::V3::Client::Paginator
2
+
3
+ attr_accessor :api_client
4
+
5
+ attr_reader :total_results, :last_page_number, :next_page_number, :prev_page_number, :page_size
6
+
7
+ def initialize(api_client)
8
+ @api_client = api_client
9
+
10
+ process_response
11
+ end
12
+
13
+ def logger
14
+ api_client.logger
15
+ end
16
+
17
+ def http_client
18
+ api_client.http_client
19
+ end
20
+
21
+ def process_response
22
+ http_response = http_client.response
23
+
24
+ @total_results = http_response['total-results']
25
+ @paginated = !!total_results
26
+
27
+ process_link_header(http_response['link']) if paginated?
28
+ end
29
+
30
+ def process_link_header(link)
31
+ links = link.split(',')
32
+ @next_page_number = nil
33
+ @prev_page_number = nil
34
+
35
+ links.map! do |l|
36
+ href, rel = l.split('; ')
37
+ rel = rel.match(/"(\w*)/)[1]
38
+ href = href.match(/<(.*)>/)[1]
39
+ _, query = href.split('?')
40
+ query_as_hash = Hash[ query.split('&').map { |v| v.split('=') } ]
41
+ @page_size = query_as_hash['_pageSize']
42
+
43
+ case rel
44
+ when 'next'
45
+ @next_page_number = query_as_hash['_page']
46
+ @next_page_href = href
47
+ when 'last'
48
+ @last_page_number = query_as_hash['_page']
49
+ @last_page_href = href
50
+ when 'prev'
51
+ @prev_page_number = query_as_hash['_page']
52
+ @prev_page_href = href
53
+ end
54
+
55
+ [ rel, href ]
56
+ end
57
+ @has_next_page = !!@next_page_number
58
+ @has_prev_page = !!@prev_page_number
59
+
60
+ Hash[links]
61
+ end
62
+
63
+ def request
64
+ @request ||= api_client.request
65
+ end
66
+
67
+ def request_args_out
68
+ @request_args_out ||= request.initial_arguments.dup
69
+ end
70
+
71
+ def request_options_out
72
+ @request_options_out ||= { :client => api_client }.merge request.initial_options.dup
73
+ end
74
+
75
+ def paginated?
76
+ @paginated
77
+ end
78
+
79
+ def next_page?
80
+ @has_next_page
81
+ end
82
+
83
+ def next_page_get(_next_page_number = @next_page_number)
84
+ page_get(_next_page_number)
85
+ end
86
+
87
+ def page_get(page_number)
88
+ logger.debug { "Getting Page #{page_number} of #{last_page_number}" }
89
+ new_request = request.class.new(request_args_out.merge('_page' => page_number), request_options_out)
90
+ _response = new_request.execute
91
+ process_response
92
+ _response
93
+ end
94
+
95
+ def pages_get(pages, options = { })
96
+ consolidate = options.fetch(:consolidate, true)
97
+ pages = pages.to_a if pages.respond_to?(:to_a)
98
+ pages_out = pages.map { |v| page_get(v) }
99
+ pages_out.flatten! if consolidate
100
+ pages_out
101
+ end
102
+
103
+ def prev_page?
104
+ @has_prev_page
105
+ end
106
+
107
+ def prev_page_get(_prev_page_number = @prev_page_number)
108
+ return [ ] unless paginated?
109
+ page_get(_prev_page_number)
110
+ end
111
+
112
+ def include_remaining_pages
113
+ response = api_client.response.dup
114
+ response.concat(remaining_pages_get)
115
+ end
116
+
117
+ def remaining_pages_get
118
+ return [ ] unless paginated? && next_page?
119
+ _next_page_number = @next_page_number
120
+ remaining_results = [ ]
121
+
122
+ loop do
123
+ response = next_page_get(_next_page_number)
124
+ break unless response.is_a?(Array)
125
+ remaining_results.concat(response)
126
+
127
+ break unless next_page?
128
+ _next_page_number = next_page_number
129
+ end
130
+ remaining_results
131
+ end
132
+
133
+ end
@@ -0,0 +1,18 @@
1
+ require 'ubiquity/mediasilo/api/v3/client/requests/base_request'
2
+
3
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_copy_to_folder'
4
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_copy_to_project'
5
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_create'
6
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_delete'
7
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_get_by_id'
8
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_move_to_folder'
9
+ require 'ubiquity/mediasilo/api/v3/client/requests/asset_move_to_project'
10
+
11
+ require 'ubiquity/mediasilo/api/v3/client/requests/assets_get'
12
+ require 'ubiquity/mediasilo/api/v3/client/requests/assets_get_by_folder_id'
13
+ require 'ubiquity/mediasilo/api/v3/client/requests/assets_get_by_project_id'
14
+
15
+ require 'ubiquity/mediasilo/api/v3/client/requests/batch'
16
+
17
+ require 'ubiquity/mediasilo/api/v3/client/requests/quicklink_create'
18
+ require 'ubiquity/mediasilo/api/v3/client/requests/quicklink_share'
@@ -0,0 +1,19 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetCopyToFolder < BaseRequest
4
+
5
+ HTTP_METHOD = :post
6
+ HTTP_PATH = '/folders/#{arguments[:destinationFolderId]}/assets/#{arguments[:assetId]}/copy'
7
+ HTTP_SUCCESS_CODE = 204
8
+
9
+ PARAMETERS = [
10
+ { :name => :destinationFolderId, :required => true, :aliases => [ :folderid ] },
11
+ { :name => :assetId, :required => true },
12
+ :includeComments,
13
+ :includeMetadata,
14
+ :includeTags
15
+ ]
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,19 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetCopyToProject < BaseRequest
4
+
5
+ HTTP_METHOD = :post
6
+ HTTP_PATH = '/projects/#{arguments[:destinationProjectId]}/assets/#{arguments[:assetId]}/copy'
7
+ HTTP_SUCCESS_CODE = 204
8
+
9
+ PARAMETERS = [
10
+ { :name => :destinationProjectId, :required => true, :aliases => [ :projectid ] },
11
+ { :name => :assetId, :required => true },
12
+ :includeComments,
13
+ :includeMetadata,
14
+ :includeTags
15
+ ]
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,25 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ # @see http://docs.mediasilo.com/v3.0/docs/create-asset
4
+ class AssetCreate < BaseRequest
5
+
6
+ HTTP_METHOD = :post
7
+ HTTP_PATH = '/assets'
8
+ DEFAULT_PARAMETER_SEND_IN_VALUE = :body
9
+
10
+ PARAMETERS = [
11
+ { :name => :projectId, :required => true },
12
+ :folderId,
13
+ :title,
14
+ :description,
15
+ { :name => :sourceUrl, :required => true },
16
+ :isPrivate
17
+ ]
18
+
19
+ def after_process_parameters
20
+ arguments.delete(:folderId) if arguments[:folderId].to_s == '0'
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,15 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetDelete < BaseRequest
4
+
5
+ HTTP_METHOD = :delete
6
+ HTTP_PATH = '/assets/#{arguments[:assetId]}'
7
+ HTTP_SUCCESS_CODE = 204
8
+
9
+ PARAMETERS = [
10
+ { :name => :assetId, :aliases => [ :id ], :required => true }
11
+ ]
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,14 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetGetById < BaseRequest
4
+
5
+ HTTP_METHOD = :get
6
+ HTTP_PATH = '/assets/#{arguments[:asset_id]}'
7
+
8
+ PARAMETERS = [
9
+ { :name => :asset_id, :aliases => [ :id ], :send_in => :path, :required => true },
10
+ ]
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,16 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetMoveToFolder < BaseRequest
4
+
5
+ HTTP_METHOD = :post
6
+ HTTP_PATH = '/folders/#{arguments[:destinationFolderId]}/assets/#{arguments[:assetId]}/move'
7
+ HTTP_SUCCESS_CODE = 204
8
+
9
+ PARAMETERS = [
10
+ { :name => :destinationFolderId, :required => true, :aliases => [ :folderid ] },
11
+ { :name => :assetId, :required => true },
12
+ ]
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,16 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetMoveToProject < BaseRequest
4
+
5
+ HTTP_METHOD = :post
6
+ HTTP_PATH = '/projects/#{arguments[:destinationProjectId]}/assets/#{arguments[:assetId]}/move'
7
+ HTTP_SUCCESS_CODE = 204
8
+
9
+ PARAMETERS = [
10
+ { :name => :destinationProjectId, :required => true, :aliases => [ :projectid ] },
11
+ { :name => :assetId, :required => true },
12
+ ]
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,56 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetsGet < BaseRequest
4
+
5
+ HTTP_METHOD = :get
6
+ HTTP_PATH = '/assets'
7
+
8
+ PARAMETERS = [
9
+ # { :name => :_pageSize, :default_value => 250 },
10
+ :_pageSize,
11
+ :_page,
12
+ :_sortBy,
13
+ :_sort,
14
+
15
+ :approvalstatus,
16
+ :averagerating,
17
+ :comments,
18
+ :datecreated,
19
+ :datemodified,
20
+ :description,
21
+ :duration,
22
+ :filename,
23
+ :folderid,
24
+ :hasapprovals,
25
+ :hascomments,
26
+ :hasrating,
27
+ :hastranscript,
28
+ :height,
29
+ :metadatakeys,
30
+ :metadatakeys_exact,
31
+ :metadatamatch,
32
+ :metadatavalues,
33
+ :metadatavalues_exact,
34
+ :projectid,
35
+ :rating,
36
+ :size,
37
+ :tags,
38
+ :title,
39
+ :transcript,
40
+ :transcriptstatus,
41
+ :type,
42
+ # { :name => :type, :default_value => '{"in":"video,image,document,archive,audio"}' },
43
+ :uploaduser,
44
+ :width,
45
+ ]
46
+
47
+ end
48
+
49
+
50
+
51
+ def success?
52
+ response_code = client.http_client.response.code
53
+ (response_code == '404' || response_code.start_with?('2'))
54
+ end
55
+
56
+ end
@@ -0,0 +1,14 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetsGetByFolderId < BaseRequest
4
+
5
+ HTTP_METHOD = :get
6
+ HTTP_PATH = '/folders/#{arguments[:folderId]}/assets'
7
+
8
+ PARAMETERS = [
9
+ { :name => :folderId, :aliases => [ :id ], :required => true },
10
+ ]
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,14 @@
1
+ module Ubiquity::MediaSilo::API::V3::Client::Requests
2
+
3
+ class AssetsGetByProjectId < BaseRequest
4
+
5
+ HTTP_METHOD = :get
6
+ HTTP_PATH = '/projects/#{arguments[:projectId]}/assets'
7
+
8
+ PARAMETERS = [
9
+ { :name => :projectId, :aliases => [ :id ], :required => true },
10
+ ]
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,250 @@
1
+ require 'cgi'
2
+
3
+ module Ubiquity
4
+ module MediaSilo
5
+ class API
6
+ module V3
7
+ class Client
8
+ module Requests
9
+ class BaseRequest
10
+
11
+ HTTP_METHOD = :get
12
+ HTTP_BASE_PATH = ''
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, :initial_options, :missing_required_arguments,
21
+ :default_parameter_send_in_value, :processed_parameters, :initialized, :response
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_parameter(param, args = { }, args_out = { }, missing_required_arguments = [ ], processed_parameters = { }, default_parameter_send_in_value = DEFAULT_PARAMETER_SEND_IN_VALUE, options = { })
35
+ args = normalize_argument_hash_keys(args) || { } if options.fetch(:normalize_argument_hash_keys, false)
36
+
37
+ _k = param.is_a?(Hash) ? param : { :name => param, :required => false, :send_in => default_parameter_send_in_value }
38
+ _k[:send_in] ||= default_parameter_send_in_value
39
+
40
+ proper_parameter_name = _k[:name]
41
+ param_name = normalize_parameter_name(proper_parameter_name)
42
+ arg_key = (has_key = args.has_key?(param_name)) ?
43
+ param_name :
44
+ ( (_k[:aliases] || [ ]).map { |a| normalize_parameter_name(a) }.find { |a| has_key = args.has_key?(a) } || param_name )
45
+
46
+ value = has_key ? args[arg_key] : _k[:default_value]
47
+ is_set = has_key || _k.has_key?(:default_value)
48
+
49
+ processed_parameters[proper_parameter_name] = _k.merge(:value => value, :is_set => is_set)
50
+
51
+ unless is_set
52
+ missing_required_arguments << proper_parameter_name if _k[:required]
53
+ else
54
+ args_out[proper_parameter_name] = value
55
+ end
56
+
57
+ { :arguments_out => args_out, :processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments }
58
+ rescue => e
59
+ raise e, "Error Processing Parameter: #{param.inspect} Args: #{args.inspect}. #{e.message}"
60
+ end
61
+
62
+ def self.process_parameters(params, args, options = { })
63
+ args = normalize_argument_hash_keys(args) || { }
64
+ args_out = options[:arguments_out] || { }
65
+ default_parameter_send_in_value = options[:default_parameter_send_in_value] || DEFAULT_PARAMETER_SEND_IN_VALUE
66
+ processed_parameters = options[:processed_parameters] || { }
67
+ missing_required_arguments = options[:missing_required_arguments] || [ ]
68
+
69
+ params.each do |param|
70
+ process_parameter(param, args, args_out, missing_required_arguments, processed_parameters, default_parameter_send_in_value)
71
+ end
72
+ { :arguments_out => args_out, :processed_parameters => processed_parameters, :missing_required_arguments => missing_required_arguments }
73
+ end
74
+
75
+ def initialize(args = { }, options = { })
76
+ @initial_arguments = args.dup
77
+ @initial_options = options.dup
78
+
79
+ @options = options.dup
80
+
81
+ initialize_attributes if options.fetch(:initialize_attributes, true)
82
+ after_initialize
83
+ end
84
+
85
+ def after_initialize
86
+ process_parameters if initialized
87
+ end
88
+
89
+ def initialize_attributes
90
+ @client = options[:client]
91
+ @missing_required_arguments = [ ]
92
+ @default_parameter_send_in_value = options[:default_parameter_send_in_value] || self.class::DEFAULT_PARAMETER_SEND_IN_VALUE
93
+ @processed_parameters = { }
94
+ @arguments = { }
95
+ @eval_http_path = options.fetch(:eval_http_path, true)
96
+ @base_path = options[:base_path]
97
+
98
+ @parameters = options[:parameters]
99
+ @http_method = options[:http_method]
100
+ @http_path = options[:http_path] ||= options[:path_raw]
101
+
102
+ @path = options[:path]
103
+ @path_arguments = nil
104
+ @path_only = nil
105
+
106
+ @query = options[:query]
107
+ @query_arguments = nil
108
+
109
+ @body = options[:body]
110
+ @body_arguments = nil
111
+
112
+ @response = nil
113
+
114
+ @http_success_code = options[:http_success_code] || HTTP_SUCCESS_CODE
115
+
116
+ @initialized = true
117
+ end
118
+ alias :reset_attributes :initialize_attributes
119
+
120
+ def process_parameters(params = parameters, args = @initial_arguments, _options = @options)
121
+ before_process_parameters unless _options.fetch(:skip_before_process_parameters, false)
122
+ 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))
123
+ after_process_parameters unless _options.fetch(:skip_after_process_parameters, false)
124
+ end
125
+
126
+ def before_process_parameters
127
+ # TO BE IMPLEMENTED IN CHILD CLASS
128
+ end
129
+ alias :pre_process_arguments :before_process_parameters
130
+
131
+ def after_process_parameters
132
+ # TO BE IMPLEMENTED IN CHILD CLASS
133
+ end
134
+ alias :post_process_arguments :after_process_parameters
135
+
136
+ # @!group Attribute Readers
137
+
138
+ def http_success_code
139
+ @http_success_code
140
+ end
141
+
142
+ def arguments
143
+ @arguments ||= { }
144
+ end
145
+
146
+ def base_path
147
+ @base_path ||= self.class::HTTP_BASE_PATH
148
+ end
149
+
150
+ def body_arguments
151
+ @body_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :body }
152
+ end
153
+
154
+ def body
155
+ @body ||= body_arguments.empty? ? nil : body_arguments
156
+ end
157
+
158
+ def client
159
+ @client ||= options[:client]
160
+ end
161
+
162
+ def eval_http_path?
163
+ @eval_http_path
164
+ end
165
+
166
+ def http_path
167
+ @http_path ||= self.class::HTTP_PATH
168
+ end
169
+
170
+ def http_method
171
+ @http_method ||= self.class::HTTP_METHOD
172
+ end
173
+
174
+ def parameters
175
+ @parameters ||= self.class::PARAMETERS.dup
176
+ end
177
+
178
+ def relative_path
179
+ @relative_path ||= (path.start_with?('/') ? path[1..-1] : path)
180
+ end
181
+
182
+ # The URI Path
183
+ def path
184
+ @path ||= File.join(base_path, (eval_http_path? ? eval(%("#{http_path}"), binding, __FILE__, __LINE__) : http_path))
185
+ end
186
+
187
+ def path_arguments
188
+ @path_arguments ||= Hash[
189
+ arguments.dup.delete_if { |k, _| processed_parameters[k][:send_in] != :path }.
190
+ map { |k,v| [ k, CGI.escape(v.respond_to?(:to_s) ? v.to_s : '').gsub('+', '%20') ] }
191
+ ]
192
+ end
193
+
194
+ def query
195
+ @query ||= begin
196
+ 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
197
+ end
198
+ end
199
+
200
+ def query_arguments
201
+ @query_arguments ||= arguments.dup.delete_if { |k,_| processed_parameters[k][:send_in] != :query }
202
+ end
203
+
204
+ def uri_request_path
205
+ [ path ].concat( [*query].delete_if { |v| v.respond_to?(:empty?) and v.empty? } ).join('?')
206
+ end
207
+
208
+ # @!endgroup
209
+
210
+ def to_batchable_request
211
+ _output = { :method => http_method.to_s.upcase, :resourcePath => relative_path }
212
+ _output[:payload] = body if (![:delete, :get, :options].include?(http_method) & body)
213
+ _output
214
+ end
215
+ alias :as_batchable_request :to_batchable_request
216
+
217
+ def to_batchable_request_as_json
218
+ #%({ "method": #{http_method.upcase}, "resourcePath": #{relative_path}#{(![:delete, :get].include?(http_method) && body) ? %(, "payload": { "body": #{body} }) : ''} })
219
+ to_batchable_request.to_json
220
+ end
221
+ alias :as_batchable_request_as_json :to_batchable_request_as_json
222
+
223
+ # def response
224
+ # client.response if client
225
+ # end
226
+
227
+ def http_client
228
+ client.http_client
229
+ end
230
+
231
+ def http_response
232
+ @http_response ||= http_client.response.dup rescue nil
233
+ end
234
+
235
+ def execute
236
+ @response = http_client.call_method(http_method, { :path => relative_path, :query => query, :body => body }, options) if client
237
+ end
238
+
239
+ def success?
240
+ _response = http_response and ([*http_success_code].include?(http_response.code))
241
+ _response
242
+ end
243
+
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end