optimizeplayer 0.0.1

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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +22 -0
  7. data/README.md +26 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/lib/optimize_player.rb +45 -0
  12. data/lib/optimize_player/account.rb +24 -0
  13. data/lib/optimize_player/api_object.rb +161 -0
  14. data/lib/optimize_player/asset.rb +5 -0
  15. data/lib/optimize_player/client.rb +177 -0
  16. data/lib/optimize_player/converter.rb +16 -0
  17. data/lib/optimize_player/encoding.rb +5 -0
  18. data/lib/optimize_player/errors/api_connection_error.rb +7 -0
  19. data/lib/optimize_player/errors/api_error.rb +7 -0
  20. data/lib/optimize_player/errors/bad_request.rb +7 -0
  21. data/lib/optimize_player/errors/connection_error.rb +7 -0
  22. data/lib/optimize_player/errors/forbidden.rb +7 -0
  23. data/lib/optimize_player/errors/method_not_allowed.rb +7 -0
  24. data/lib/optimize_player/errors/optimize_player_error.rb +20 -0
  25. data/lib/optimize_player/errors/resource_not_found.rb +7 -0
  26. data/lib/optimize_player/errors/socket_error.rb +7 -0
  27. data/lib/optimize_player/errors/unauthorized.rb +7 -0
  28. data/lib/optimize_player/errors/unhandled_error.rb +7 -0
  29. data/lib/optimize_player/errors/unprocessable_entity.rb +7 -0
  30. data/lib/optimize_player/folder.rb +5 -0
  31. data/lib/optimize_player/integration.rb +5 -0
  32. data/lib/optimize_player/media_info.rb +5 -0
  33. data/lib/optimize_player/project.rb +24 -0
  34. data/lib/optimize_player/proxies/account_proxy.rb +24 -0
  35. data/lib/optimize_player/proxies/asset_proxy.rb +9 -0
  36. data/lib/optimize_player/proxies/base_proxy.rb +36 -0
  37. data/lib/optimize_player/proxies/folder_proxy.rb +9 -0
  38. data/lib/optimize_player/proxies/integration_proxy.rb +9 -0
  39. data/lib/optimize_player/proxies/project_proxy.rb +14 -0
  40. data/lib/optimize_player/signer.rb +142 -0
  41. data/lib/optimize_player/version.rb +3 -0
  42. data/lib/optimizeplayer.rb +2 -0
  43. data/optimize_player.gemspec +29 -0
  44. data/spec/client_spec.rb +305 -0
  45. data/spec/converter_spec.rb +63 -0
  46. data/spec/optimize_player_spec.rb +7 -0
  47. data/spec/proxy_spec.rb +67 -0
  48. data/spec/spec_helper.rb +2 -0
  49. metadata +175 -0
@@ -0,0 +1,3 @@
1
+ module OptimizePlayer
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,2 @@
1
+ # More logical way to require 'optimize_player'
2
+ require File.dirname(__FILE__) + '/optimize_player'
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'optimize_player/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "optimizeplayer"
8
+ spec.version = OptimizePlayer::VERSION
9
+ spec.authors = ["Oleg Haidul"]
10
+ spec.email = ["oleghaidul@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby wrapper for OptimizePlayer API}
13
+ spec.description = %q{A ruby library for OptimizePlayer's data API.}
14
+ spec.homepage = "http://github.com/optimizeplayer/optimizeplayer-ruby"
15
+ spec.licenses = ["MIT"]
16
+
17
+ spec.files = `git ls-files`.split("\n")
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency('rack')
23
+ spec.add_dependency('rest-client', '~> 1.4')
24
+ spec.add_dependency('json', '~> 1.8.1')
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.10"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec"
29
+ end
@@ -0,0 +1,305 @@
1
+ require 'spec_helper'
2
+
3
+ describe OptimizePlayer::Client do
4
+ subject { described_class.new('access_token', 'secret_key') }
5
+
6
+ context 'proxies' do
7
+ it 'returns account proxy' do
8
+ expect(subject.account).to be_a_kind_of(OptimizePlayer::Proxies::AccountProxy)
9
+ end
10
+
11
+ it 'returns project proxy' do
12
+ expect(subject.projects).to be_a_kind_of(OptimizePlayer::Proxies::ProjectProxy)
13
+ end
14
+
15
+ it 'returns asset proxy' do
16
+ expect(subject.assets).to be_a_kind_of(OptimizePlayer::Proxies::AssetProxy)
17
+ end
18
+
19
+ it 'returns folder proxy' do
20
+ expect(subject.folders).to be_a_kind_of(OptimizePlayer::Proxies::FolderProxy)
21
+ end
22
+
23
+ it 'returns integration proxy' do
24
+ expect(subject.integrations).to be_a_kind_of(OptimizePlayer::Proxies::IntegrationProxy)
25
+ end
26
+ end
27
+
28
+ describe '#send_request' do
29
+ context 'url' do
30
+ before do
31
+ allow(RestClient::Request).to receive(:execute).and_return(response)
32
+ allow_any_instance_of(OptimizePlayer::Signer).to receive(:sign_url).and_return('signed_url')
33
+ end
34
+
35
+ let(:response) { double(:body => {:key => 'value'}.to_json) }
36
+
37
+ it 'executes with signed url' do
38
+ expect(RestClient::Request).to receive(:execute).with(hash_including(:url => "signed_url"))
39
+ subject.send_request('projects', :get)
40
+ end
41
+
42
+ it 'executes with signed url without a payload' do
43
+ expect(RestClient::Request).to receive(:execute).with(hash_including(:url => "signed_url"))
44
+ subject.send_request('projects', :get, {:attr => 'value'})
45
+ end
46
+ end
47
+
48
+ context 'payload' do
49
+ before do
50
+ allow(RestClient::Request).to receive(:execute).and_return(response)
51
+ end
52
+
53
+ let(:response) { double(:body => {:key => 'value'}.to_json) }
54
+
55
+ it 'executes without a payload' do
56
+ expect(RestClient::Request).to receive(:execute).with(hash_including(:payload => nil))
57
+ subject.send_request('projects', :get)
58
+ end
59
+
60
+ it 'executes with empty payload' do
61
+ expect(RestClient::Request).to receive(:execute).with(hash_including(:payload => {}))
62
+ subject.send_request('projects', :post)
63
+ end
64
+
65
+ it 'executes with empty payload' do
66
+ expect(RestClient::Request).to receive(:execute).with(hash_including(:payload => {:attr => 'value'}))
67
+ subject.send_request('projects', :post, {:attr => 'value'})
68
+ end
69
+ end
70
+
71
+ context 'when response is success' do
72
+ before do
73
+ allow(RestClient::Request).to receive(:execute).and_return(response)
74
+ end
75
+
76
+ context 'with json' do
77
+ let(:response) { double(:body => {:key => 'value'}.to_json) }
78
+
79
+ it 'returns success json' do
80
+ result = subject.send_request('projects', :get)
81
+ expect(result).to eq({'key' => 'value'})
82
+ end
83
+ end
84
+
85
+ context 'with non-json format' do
86
+ let(:response) { double(:body => "simple string", :code => '200') }
87
+
88
+ it 'returns success json' do
89
+ expect {
90
+ subject.send_request('projects', :get)
91
+ }.to raise_error(OptimizePlayer::Errors::ApiError, /Invalid response object from API: "simple string"/)
92
+ end
93
+ end
94
+ end
95
+
96
+ context 'API errors' do
97
+ let(:response_code) { nil }
98
+ let(:response_body) { {:error => 'error', :message => 'message'}.to_json }
99
+
100
+ before do
101
+ allow_any_instance_of(RestClient::BadRequest).to receive(:http_code).and_return(response_code)
102
+ allow_any_instance_of(RestClient::BadRequest).to receive(:http_body).and_return(response_body)
103
+ allow(RestClient::Request).to receive(:execute).and_raise(RestClient::BadRequest)
104
+ end
105
+
106
+ context 'when 400 error is raised' do
107
+ let(:response_code) { 400 }
108
+
109
+ it 'should raise OptimizePlayer 400 error' do
110
+ expect {
111
+ subject.send_request('projects', :get)
112
+ }.to raise_error { |error|
113
+ expect(error.status).to eq(400)
114
+ expect(error.error).to eq('error')
115
+ expect(error.message).to eq('message')
116
+ expect(error).to be_a(OptimizePlayer::Errors::BadRequest)
117
+ }
118
+ end
119
+ end
120
+
121
+ context 'when 401 error is raised' do
122
+ let(:response_code) { 401 }
123
+
124
+ it 'should raise OptimizePlayer 401 error' do
125
+ expect {
126
+ subject.send_request('projects', :get)
127
+ }.to raise_error { |error|
128
+ expect(error.status).to eq(401)
129
+ expect(error.error).to eq('error')
130
+ expect(error.message).to eq('message')
131
+ expect(error).to be_a(OptimizePlayer::Errors::BadRequest)
132
+ }
133
+ end
134
+ end
135
+
136
+ context 'when 404 error is raised' do
137
+ let(:response_code) { 404 }
138
+
139
+ it 'should raise OptimizePlayer 404 error' do
140
+ expect {
141
+ subject.send_request('projects', :get)
142
+ }.to raise_error { |error|
143
+ expect(error.status).to eq(404)
144
+ expect(error.error).to eq('error')
145
+ expect(error.message).to eq('message')
146
+ expect(error).to be_a(OptimizePlayer::Errors::BadRequest)
147
+ }
148
+ end
149
+ end
150
+
151
+ context 'when 403 error is raised' do
152
+ let(:response_code) { 403 }
153
+
154
+ it 'should raise OptimizePlayer 403 error' do
155
+ expect {
156
+ subject.send_request('projects', :get)
157
+ }.to raise_error { |error|
158
+ expect(error.status).to eq(403)
159
+ expect(error.error).to eq('error')
160
+ expect(error.message).to eq('message')
161
+ expect(error).to be_a(OptimizePlayer::Errors::BadRequest)
162
+ }
163
+ end
164
+ end
165
+
166
+ context 'when 422 error is raised' do
167
+ let(:response_code) { 422 }
168
+
169
+ it 'should raise OptimizePlayer 422 error' do
170
+ expect {
171
+ subject.send_request('projects', :get)
172
+ }.to raise_error { |error|
173
+ expect(error.status).to eq(422)
174
+ expect(error.error).to eq('error')
175
+ expect(error.message).to eq('message')
176
+ expect(error).to be_a(OptimizePlayer::Errors::BadRequest)
177
+ }
178
+ end
179
+ end
180
+ end
181
+
182
+ context 'undefined errors' do
183
+ before do
184
+ allow(RestClient::Request).to receive(:execute).and_raise(RestClient::ExceptionWithResponse)
185
+ end
186
+
187
+ context 'when custom json error is raised' do
188
+ before do
189
+ allow_any_instance_of(RestClient::ExceptionWithResponse).to receive(:http_code).and_return(1111)
190
+ allow_any_instance_of(RestClient::ExceptionWithResponse).to receive(:http_body).and_return({:error => 'error', :message => 'message'}.to_json)
191
+ end
192
+
193
+ it 'should raise OptimizePlayer API error' do
194
+ expect {
195
+ subject.send_request('projects', :get)
196
+ }.to raise_error { |error|
197
+ expect(error.error).to eq('error')
198
+ expect(error.message).to eq('message')
199
+ expect(error).to be_a(OptimizePlayer::Errors::ApiError)
200
+ }
201
+ end
202
+ end
203
+
204
+ context 'when custom non-json error is raised' do
205
+ before do
206
+ allow_any_instance_of(RestClient::ExceptionWithResponse).to receive(:http_code).and_return(nil)
207
+ allow_any_instance_of(RestClient::ExceptionWithResponse).to receive(:http_body).and_return(nil)
208
+ end
209
+
210
+ it 'should raise OptimizePlayer UnhandledError' do
211
+ expect {
212
+ subject.send_request('projects', :get)
213
+ }.to raise_error { |error|
214
+ expect(error.error).to eq('UnhandledError')
215
+ expect(error.message).to eq('Unexpected error communicating with OptimizePlayer.')
216
+ expect(error).to be_a(OptimizePlayer::Errors::UnhandledError)
217
+ }
218
+ end
219
+ end
220
+ end
221
+
222
+ context 'socket error' do
223
+ before do
224
+ allow(RestClient::Request).to receive(:execute).and_raise(SocketError)
225
+ end
226
+
227
+ it 'should raise OptimizePlayer SocketError' do
228
+ expect {
229
+ subject.send_request('projects', :get)
230
+ }.to raise_error { |error|
231
+ expect(error.error).to eq('NetworkError')
232
+ expect(error.message).to eq('Unexpected error communicating when trying to connect to OptimizePlayer. You may be seeing this message because your DNS is not working.')
233
+ expect(error).to be_a(OptimizePlayer::Errors::SocketError)
234
+ }
235
+ end
236
+ end
237
+
238
+ context 'Errno::ECONNREFUSED error' do
239
+ before do
240
+ allow(RestClient::Request).to receive(:execute).and_raise(Errno::ECONNREFUSED)
241
+ end
242
+
243
+ it 'should raise OptimizePlayer connection error' do
244
+ expect {
245
+ subject.send_request('projects', :get)
246
+ }.to raise_error { |error|
247
+ expect(error.error).to eq('ConnectionError')
248
+ expect(error.message).to eq('Unexpected error communicating with OptimizePlayer.')
249
+ expect(error).to be_a(OptimizePlayer::Errors::ConnectionError)
250
+ }
251
+ end
252
+ end
253
+
254
+ context 'Errno::ServerBrokeConnection error' do
255
+ before do
256
+ allow(RestClient::Request).to receive(:execute).and_raise(RestClient::ServerBrokeConnection)
257
+ end
258
+
259
+ it 'should raise OptimizePlayer connection error' do
260
+ expect {
261
+ subject.send_request('projects', :get)
262
+ }.to raise_error { |error|
263
+ expect(error.error).to eq('ConnectionError')
264
+ expect(error.message).to eq('Could not connect to OptimizePlayer. Please check your internet connection and try again.')
265
+ expect(error).to be_a(OptimizePlayer::Errors::ConnectionError)
266
+ }
267
+ end
268
+ end
269
+
270
+ context 'timeout error' do
271
+ before do
272
+ allow(RestClient::Request).to receive(:execute).and_raise(RestClient::RequestTimeout)
273
+ end
274
+
275
+ it 'should raise OptimizePlayer connection error' do
276
+ expect {
277
+ subject.send_request('projects', :get)
278
+ }.to raise_error { |error|
279
+ expect(error.error).to eq('ConnectionError')
280
+ expect(error.message).to eq('Could not connect to OptimizePlayer. Please check your internet connection and try again.')
281
+ expect(error).to be_a(OptimizePlayer::Errors::ConnectionError)
282
+ }
283
+ end
284
+ end
285
+
286
+ context '405 error' do
287
+ before do
288
+ allow(RestClient::Request).to receive(:execute).and_raise(RestClient::MethodNotAllowed)
289
+ allow_any_instance_of(RestClient::MethodNotAllowed).to receive(:http_code).and_return(405)
290
+ # APi returne 405 method with empty body
291
+ allow_any_instance_of(RestClient::MethodNotAllowed).to receive(:http_body).and_return("")
292
+ end
293
+
294
+ it 'should raise OptimizePlayer 405 error' do
295
+ expect {
296
+ subject.send_request('projects', :get)
297
+ }.to raise_error { |error|
298
+ expect(error.error).to eq('MethodNotAllowed')
299
+ expect(error.message).to eq('Method Not Allowed')
300
+ expect(error).to be_a(OptimizePlayer::Errors::MethodNotAllowed)
301
+ }
302
+ end
303
+ end
304
+ end
305
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe OptimizePlayer::Converter do
4
+ let(:proxy) { OptimizePlayer::Proxies::ProjectProxy.new(client) }
5
+ let(:client) { OptimizePlayer::Client.new('access_token', 'secret_key') }
6
+
7
+ context 'collection' do
8
+ let(:data) do
9
+ [
10
+ {
11
+ "object_class" => "Project",
12
+ "cid" => 'cid',
13
+ "title" => 'Project Title'
14
+ }
15
+ ]
16
+ end
17
+
18
+ it 'returns only one object in collection' do
19
+ result = described_class.convert_to_object(proxy, data)
20
+ expect(result.length).to eq(1)
21
+ end
22
+
23
+ it 'returns converted object' do
24
+ result = described_class.convert_to_object(proxy, data)
25
+ expect(result[0]).to be_a_kind_of(OptimizePlayer::Project)
26
+ end
27
+
28
+ it 'returns project title' do
29
+ result = described_class.convert_to_object(proxy, data)
30
+ expect(result[0].title).to eq('Project Title')
31
+ end
32
+
33
+ it 'should raise NoMethoderror' do
34
+ result = described_class.convert_to_object(proxy, data)
35
+ expect { result[0].name }.to raise_error(NoMethodError, /undefined method `name'/)
36
+ end
37
+ end
38
+
39
+ context 'object' do
40
+ let(:data) do
41
+ {
42
+ "object_class" => "Project",
43
+ "cid" => 'cid',
44
+ "title" => 'Project Title'
45
+ }
46
+ end
47
+
48
+ it 'returns converted object' do
49
+ result = described_class.convert_to_object(proxy, data)
50
+ expect(result).to be_a_kind_of(OptimizePlayer::Project)
51
+ end
52
+
53
+ it 'returns project title' do
54
+ result = described_class.convert_to_object(proxy, data)
55
+ expect(result.title).to eq('Project Title')
56
+ end
57
+
58
+ it 'should raise NoMethoderror' do
59
+ result = described_class.convert_to_object(proxy, data)
60
+ expect { result.name }.to raise_error(NoMethodError, /undefined method `name'/)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe OptimizePlayer do
4
+ it 'has a version number' do
5
+ expect(OptimizePlayer::VERSION).not_to be nil
6
+ end
7
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe OptimizePlayer::Proxies::ProjectProxy do
4
+ subject { described_class.new(client) }
5
+ let(:client) { OptimizePlayer::Client.new('access_token', 'secret_key') }
6
+
7
+ before do
8
+ allow(OptimizePlayer::Converter).to receive(:convert_to_object)
9
+ allow(client).to receive(:send_request).and_return(response)
10
+ end
11
+
12
+ context '#all' do
13
+ let(:response) { [] }
14
+
15
+ it 'invokes send_request' do
16
+ expect(client).to receive(:send_request).with('projects', :get, {})
17
+ subject.all
18
+ end
19
+
20
+ it 'invokes send_request with params' do
21
+ expect(client).to receive(:send_request).with('projects', :get, {:attr => 'value'})
22
+ subject.all(:attr => 'value')
23
+ end
24
+
25
+ it 'invokes convertation' do
26
+ expect(OptimizePlayer::Converter).to receive(:convert_to_object).with(subject, [])
27
+ subject.all
28
+ end
29
+ end
30
+
31
+ context '#find' do
32
+ let(:response) { {} }
33
+
34
+ it 'invokes send_request' do
35
+ expect(client).to receive(:send_request).with('projects/1', :get)
36
+ subject.find(1)
37
+ end
38
+
39
+ it 'invokes convertation' do
40
+ expect(OptimizePlayer::Converter).to receive(:convert_to_object).with(subject, {})
41
+ subject.find(1)
42
+ end
43
+ end
44
+
45
+ context '#create' do
46
+ let(:response) { {} }
47
+
48
+ it 'invokes send_request with params' do
49
+ expect(client).to receive(:send_request).with('projects', :post, {:attr => 'value'})
50
+ subject.create(:attr => 'value')
51
+ end
52
+
53
+ it 'invokes convertation' do
54
+ expect(OptimizePlayer::Converter).to receive(:convert_to_object).with(subject, {})
55
+ subject.create(:attr => 'value')
56
+ end
57
+ end
58
+
59
+ context '#move' do
60
+ let(:response) { {} }
61
+
62
+ it 'invokes send_request with params' do
63
+ expect(client).to receive(:send_request).with('projects/move', :post, {:attr => 'value'})
64
+ subject.move(:attr => 'value')
65
+ end
66
+ end
67
+ end