droplet_kit 1.1.2 → 1.1.3
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 +4 -4
- data/Gemfile +1 -0
- data/README.md +18 -0
- data/droplet_kit.gemspec +4 -3
- data/lib/droplet_kit/paginated_resource.rb +7 -1
- data/lib/droplet_kit/resources/image_action_resource.rb +8 -0
- data/lib/droplet_kit/version.rb +1 -1
- data/spec/fixtures/droplets/all_empty.json +7 -0
- data/spec/fixtures/image_actions/all.json +28 -0
- data/spec/lib/droplet_kit/client_spec.rb +11 -0
- data/spec/lib/droplet_kit/models/base_model_spec.rb +21 -0
- data/spec/lib/droplet_kit/paginated_resource_spec.rb +22 -15
- data/spec/lib/droplet_kit/resources/droplet_resource_spec.rb +6 -0
- data/spec/lib/droplet_kit/resources/image_action_resource_spec.rb +26 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/support/null_hash_load.rb +0 -4
- data/spec/support/request_stub_helpers.rb +19 -0
- metadata +24 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e28942bdd478cd811a6f8e8aa0ee9632b5d4f50
|
4
|
+
data.tar.gz: 96fca5ad6cb96e1e4c58f0d4bc513bcc770e05a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1efaaffe2af2dd9f717e09c61742a16fb6c8c3bf3602e67164550bd3c7842cf26b7b7d35165a8447c366ecc97528c22e65c86b399c7a9204a2284d9ebb6ed65f
|
7
|
+
data.tar.gz: 32839b6b91778d2414440ecb9de9b8aad17a1306525d55226fe462b15abcbfc3287233858eea2672568b1beccb8d8782dcc38ef4830a0a88e8a24a94c907ad6b
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -121,6 +121,12 @@ Actions supported:
|
|
121
121
|
|
122
122
|
client = DropletKit::Client.new(access_token: 'TOKEN')
|
123
123
|
client.domain_records #=> DropletKit::DomainRecordResource
|
124
|
+
domain_record = DropletKit::DomainRecord.new(
|
125
|
+
type: 'CNAME',
|
126
|
+
name: 'www',
|
127
|
+
data: '@'
|
128
|
+
)
|
129
|
+
|
124
130
|
|
125
131
|
Actions supported:
|
126
132
|
|
@@ -144,6 +150,18 @@ Actions supported:
|
|
144
150
|
* `client.images.update(image, id: 'id')`
|
145
151
|
|
146
152
|
|
153
|
+
## Image Action Resource
|
154
|
+
|
155
|
+
client = DropletKit::Client.new(access_token: 'TOKEN')
|
156
|
+
client.image_actions #=> DropletKit::ImageActionResource
|
157
|
+
|
158
|
+
Image Actions Supported:
|
159
|
+
|
160
|
+
* `client.image_actions.all(image_id: 123)`
|
161
|
+
* `client.image_actions.find(image_id: 123, id: 123455)`
|
162
|
+
* `client.image_actions.transfer(image_id: 123, region: 'nyc3')`
|
163
|
+
|
164
|
+
|
147
165
|
## Region resource
|
148
166
|
|
149
167
|
client = DropletKit::Client.new(access_token: 'TOKEN')
|
data/droplet_kit.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = DropletKit::VERSION
|
9
9
|
spec.authors = ["Robert Ross"]
|
10
10
|
spec.email = ["rross@digitalocean.com"]
|
11
|
-
spec.summary = %q{Droplet Kit is the official Ruby library for
|
12
|
-
spec.description = %q{Droplet Kit is the official Ruby library for
|
11
|
+
spec.summary = %q{Droplet Kit is the official Ruby library for DigitalOcean's API}
|
12
|
+
spec.description = %q{Droplet Kit is the official Ruby library for DigitalOcean's API}
|
13
13
|
spec.homepage = ""
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -17,13 +17,14 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
-
|
20
|
+
|
21
21
|
spec.required_ruby_version = '>= 2.0.0'
|
22
22
|
|
23
23
|
spec.add_dependency 'virtus', '~> 1.0.3'
|
24
24
|
spec.add_dependency "resource_kit", '~> 0.1.1'
|
25
25
|
spec.add_dependency "kartograph", '~> 0.2.0'
|
26
26
|
spec.add_dependency "activesupport", '~> 4.1.6'
|
27
|
+
spec.add_dependency "faraday", '~> 0.9.1'
|
27
28
|
|
28
29
|
spec.add_development_dependency "bundler", "~> 1.6"
|
29
30
|
spec.add_development_dependency "rake"
|
@@ -40,7 +40,13 @@ module DropletKit
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def last?
|
43
|
-
@current_page ==
|
43
|
+
@current_page == total_pages || self.total.zero?
|
44
|
+
end
|
45
|
+
|
46
|
+
def total_pages
|
47
|
+
return nil if self.total.nil?
|
48
|
+
|
49
|
+
(self.total.to_f / per_page.to_f).ceil
|
44
50
|
end
|
45
51
|
|
46
52
|
def ==(other)
|
@@ -6,9 +6,17 @@ module DropletKit
|
|
6
6
|
handler(200, 201) { |response| ImageActionMapping.extract_single(response.body, :read) }
|
7
7
|
end
|
8
8
|
|
9
|
+
action :all, 'GET /v2/images/:image_id/actions' do
|
10
|
+
handler(200) { |response| ImageActionMapping.extract_collection(response.body, :read) }
|
11
|
+
end
|
12
|
+
|
9
13
|
action :find, 'GET /v2/images/:image_id/actions/:id' do
|
10
14
|
handler(200) { |response| ImageActionMapping.extract_single(response.body, :read) }
|
11
15
|
end
|
12
16
|
end
|
17
|
+
|
18
|
+
def all(*args)
|
19
|
+
PaginatedResource.new(action(:all), self, *args)
|
20
|
+
end
|
13
21
|
end
|
14
22
|
end
|
data/lib/droplet_kit/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
{
|
2
|
+
"actions": [
|
3
|
+
{
|
4
|
+
"id": 298374,
|
5
|
+
"status": "completed",
|
6
|
+
"type": "image_destroy",
|
7
|
+
"started_at": "2014-10-28T17:11:05Z",
|
8
|
+
"completed_at": "2014-10-28T17:11:06Z",
|
9
|
+
"resource_id": 45646587,
|
10
|
+
"resource_type": "image",
|
11
|
+
"region": null
|
12
|
+
},
|
13
|
+
{
|
14
|
+
"id": 234598,
|
15
|
+
"status": "completed",
|
16
|
+
"type": "transfer",
|
17
|
+
"started_at": "2014-10-28T17:09:11Z",
|
18
|
+
"completed_at": "2014-10-28T17:12:04Z",
|
19
|
+
"resource_id": 45646587,
|
20
|
+
"resource_type": "image",
|
21
|
+
"region": "nyc2"
|
22
|
+
}
|
23
|
+
],
|
24
|
+
"links": {},
|
25
|
+
"meta": {
|
26
|
+
"total": 2
|
27
|
+
}
|
28
|
+
}
|
@@ -10,6 +10,17 @@ RSpec.describe DropletKit::Client do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "#method_missing" do
|
14
|
+
|
15
|
+
context "called with an existing method" do
|
16
|
+
it { expect{ client.actions}.to_not raise_error }
|
17
|
+
end
|
18
|
+
|
19
|
+
context "called with a missing method" do
|
20
|
+
it { expect{client.this_is_wrong}.to raise_error(NoMethodError) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
13
24
|
describe '#connection' do
|
14
25
|
it 'populates the authorization header correctly' do
|
15
26
|
expect(client.connection.headers['Authorization']).to eq("Bearer #{client.access_token}")
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe DropletKit::BaseModel do
|
4
|
+
subject(:resource) do
|
5
|
+
Class.new(DropletKit::BaseModel) do |base|
|
6
|
+
attribute :droplet_limit
|
7
|
+
def self.name
|
8
|
+
'SomeModel'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#inspect' do
|
14
|
+
it 'returns the information about the current user' do
|
15
|
+
instance = resource.new(droplet_limit: 5)
|
16
|
+
expect(instance.inspect).to include("<SomeModel")
|
17
|
+
expect(instance.inspect).to include("@droplet_limit=>5")
|
18
|
+
expect(instance.inspect).to include("<SomeModel {:@droplet_limit=>5}>")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -8,21 +8,8 @@ RSpec.describe DropletKit::PaginatedResource do
|
|
8
8
|
let(:request_count) { RequestCounter.new(0) }
|
9
9
|
|
10
10
|
let(:connection) { Faraday.new {|b| b.adapter :test, stubs } }
|
11
|
-
let(:
|
12
|
-
|
13
|
-
stub.get('/droplets') do |env|
|
14
|
-
request_count.count += 1
|
15
|
-
uri = Addressable::URI.parse(env[:url].to_s)
|
16
|
-
page = (uri.query_values['page'] || 1).to_i
|
17
|
-
per_page = (uri.query_values['per_page'] || 20).to_i
|
18
|
-
range = (0...per_page).map do |num|
|
19
|
-
num + ((page - 1) * per_page)
|
20
|
-
end
|
21
|
-
|
22
|
-
[200, {}, { objects: range, meta: { total: 40 } }.to_json ]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
11
|
+
let(:response_size) { 40 }
|
12
|
+
let(:stubs) { stub_pager_request(response_size) }
|
26
13
|
let(:action) { ResourceKit::Action.new(:find, :get, '/droplets') }
|
27
14
|
|
28
15
|
before do
|
@@ -38,6 +25,26 @@ RSpec.describe DropletKit::PaginatedResource do
|
|
38
25
|
end
|
39
26
|
end
|
40
27
|
|
28
|
+
describe "#total_pages" do
|
29
|
+
let(:instance) { DropletKit::PaginatedResource.new(action, resource) }
|
30
|
+
it "returns nil if no request made" do
|
31
|
+
expect(instance.total_pages).to be_nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns correct page count after request made" do
|
35
|
+
instance.take(20)
|
36
|
+
expect(instance.total_pages).to eq(2)
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when results are empty" do
|
40
|
+
let(:stubs) { stub_pager_request(0) }
|
41
|
+
it "returns 0" do
|
42
|
+
instance.take(1)
|
43
|
+
expect(instance.total_pages).to eq(0)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
41
48
|
describe '#each' do
|
42
49
|
subject(:paginated) { DropletKit::PaginatedResource.new(action, resource) }
|
43
50
|
|
@@ -69,6 +69,12 @@ RSpec.describe DropletKit::DropletResource do
|
|
69
69
|
|
70
70
|
check_droplet(droplets.first)
|
71
71
|
end
|
72
|
+
|
73
|
+
it 'returns an empty array of droplets' do
|
74
|
+
stub_do_api('/v2/droplets', :get).to_return(body: api_fixture('droplets/all_empty'))
|
75
|
+
droplets = resource.all.map(&:id)
|
76
|
+
expect(droplets).to be_empty
|
77
|
+
end
|
72
78
|
end
|
73
79
|
|
74
80
|
describe '#find' do
|
@@ -26,6 +26,32 @@ RSpec.describe DropletKit::ImageActionResource do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
describe '#all' do
|
30
|
+
it 'returns all of the image actions via a paginated resources' do
|
31
|
+
request = stub_do_api('/v2/images/449676391/actions', :get).to_return(
|
32
|
+
body: api_fixture('image_actions/all'),
|
33
|
+
status: 200
|
34
|
+
)
|
35
|
+
|
36
|
+
actions = resource.all(image_id: 449676391).take(20)
|
37
|
+
|
38
|
+
expect(request).to have_been_made
|
39
|
+
|
40
|
+
expect(actions.size).to be(2)
|
41
|
+
|
42
|
+
action = actions.first
|
43
|
+
|
44
|
+
expect(action.id).to eq(298374)
|
45
|
+
expect(action.status).to eq("completed")
|
46
|
+
expect(action.type).to eq("image_destroy")
|
47
|
+
expect(action.started_at).to eq("2014-10-28T17:11:05Z")
|
48
|
+
expect(action.completed_at).to eq("2014-10-28T17:11:06Z")
|
49
|
+
expect(action.resource_id).to eq(45646587)
|
50
|
+
expect(action.resource_type).to eq("image")
|
51
|
+
expect(action.region).to eq(nil)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
29
55
|
describe '#find' do
|
30
56
|
it 'returns a single action' do
|
31
57
|
stub_do_api('/v2/images/449676391/actions/23').to_return(body: api_fixture('image_actions/find'))
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
|
3
|
+
SimpleCov.start
|
4
|
+
|
1
5
|
require 'droplet_kit'
|
2
6
|
require 'webmock/rspec'
|
3
7
|
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
9
|
+
SimpleCov::Formatter::HTMLFormatter
|
10
|
+
]
|
11
|
+
|
4
12
|
Dir['./spec/support/**/*.rb'].each do |file|
|
5
13
|
require file
|
6
14
|
end
|
@@ -6,4 +6,23 @@ module RequestStubHelpers
|
|
6
6
|
def api_fixture(fixture_name)
|
7
7
|
Pathname.new('./spec/fixtures/').join("#{fixture_name}.json").read
|
8
8
|
end
|
9
|
+
|
10
|
+
def stub_pager_request(total_results = 40)
|
11
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
12
|
+
stub.get('/droplets') do |env|
|
13
|
+
request_count.count += 1
|
14
|
+
uri = Addressable::URI.parse(env[:url].to_s)
|
15
|
+
page = (uri.query_values['page'] || 1).to_i
|
16
|
+
per_page = (uri.query_values['per_page'] || 20).to_i
|
17
|
+
|
18
|
+
max_elems = [total_results, per_page].min
|
19
|
+
|
20
|
+
range = (0...max_elems).map do |num|
|
21
|
+
num + ((page - 1) * per_page)
|
22
|
+
end
|
23
|
+
|
24
|
+
[200, {}, { objects: range, meta: { total: total_results } }.to_json ]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
9
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: droplet_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Ross
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 4.1.6
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.9.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.9.1
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: bundler
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,7 +164,7 @@ dependencies:
|
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '1.18'
|
153
|
-
description: Droplet Kit is the official Ruby library for
|
167
|
+
description: Droplet Kit is the official Ruby library for DigitalOcean's API
|
154
168
|
email:
|
155
169
|
- rross@digitalocean.com
|
156
170
|
executables: []
|
@@ -227,12 +241,14 @@ files:
|
|
227
241
|
- spec/fixtures/domains/create.json
|
228
242
|
- spec/fixtures/domains/find.json
|
229
243
|
- spec/fixtures/droplets/all.json
|
244
|
+
- spec/fixtures/droplets/all_empty.json
|
230
245
|
- spec/fixtures/droplets/create.json
|
231
246
|
- spec/fixtures/droplets/find.json
|
232
247
|
- spec/fixtures/droplets/list_actions.json
|
233
248
|
- spec/fixtures/droplets/list_backups.json
|
234
249
|
- spec/fixtures/droplets/list_kernels.json
|
235
250
|
- spec/fixtures/droplets/list_snapshots.json
|
251
|
+
- spec/fixtures/image_actions/all.json
|
236
252
|
- spec/fixtures/image_actions/create.json
|
237
253
|
- spec/fixtures/image_actions/find.json
|
238
254
|
- spec/fixtures/images/all.json
|
@@ -244,6 +260,7 @@ files:
|
|
244
260
|
- spec/fixtures/ssh_keys/find.json
|
245
261
|
- spec/fixtures/ssh_keys/update.json
|
246
262
|
- spec/lib/droplet_kit/client_spec.rb
|
263
|
+
- spec/lib/droplet_kit/models/base_model_spec.rb
|
247
264
|
- spec/lib/droplet_kit/models/droplet_spec.rb
|
248
265
|
- spec/lib/droplet_kit/paginated_resource_spec.rb
|
249
266
|
- spec/lib/droplet_kit/resources/account_resource_spec.rb
|
@@ -285,7 +302,7 @@ rubyforge_project:
|
|
285
302
|
rubygems_version: 2.2.2
|
286
303
|
signing_key:
|
287
304
|
specification_version: 4
|
288
|
-
summary: Droplet Kit is the official Ruby library for
|
305
|
+
summary: Droplet Kit is the official Ruby library for DigitalOcean's API
|
289
306
|
test_files:
|
290
307
|
- spec/fixtures/account/info.json
|
291
308
|
- spec/fixtures/actions/all.json
|
@@ -298,12 +315,14 @@ test_files:
|
|
298
315
|
- spec/fixtures/domains/create.json
|
299
316
|
- spec/fixtures/domains/find.json
|
300
317
|
- spec/fixtures/droplets/all.json
|
318
|
+
- spec/fixtures/droplets/all_empty.json
|
301
319
|
- spec/fixtures/droplets/create.json
|
302
320
|
- spec/fixtures/droplets/find.json
|
303
321
|
- spec/fixtures/droplets/list_actions.json
|
304
322
|
- spec/fixtures/droplets/list_backups.json
|
305
323
|
- spec/fixtures/droplets/list_kernels.json
|
306
324
|
- spec/fixtures/droplets/list_snapshots.json
|
325
|
+
- spec/fixtures/image_actions/all.json
|
307
326
|
- spec/fixtures/image_actions/create.json
|
308
327
|
- spec/fixtures/image_actions/find.json
|
309
328
|
- spec/fixtures/images/all.json
|
@@ -315,6 +334,7 @@ test_files:
|
|
315
334
|
- spec/fixtures/ssh_keys/find.json
|
316
335
|
- spec/fixtures/ssh_keys/update.json
|
317
336
|
- spec/lib/droplet_kit/client_spec.rb
|
337
|
+
- spec/lib/droplet_kit/models/base_model_spec.rb
|
318
338
|
- spec/lib/droplet_kit/models/droplet_spec.rb
|
319
339
|
- spec/lib/droplet_kit/paginated_resource_spec.rb
|
320
340
|
- spec/lib/droplet_kit/resources/account_resource_spec.rb
|