motion_ocean 0.1.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.
- checksums.yaml +7 -0
- data/README.md +75 -0
- data/lib/motion_ocean/client.rb +45 -0
- data/lib/motion_ocean/resource/action.rb +15 -0
- data/lib/motion_ocean/resource/base.rb +34 -0
- data/lib/motion_ocean/resource/domain.rb +43 -0
- data/lib/motion_ocean/resource/droplet.rb +106 -0
- data/lib/motion_ocean/resource/image.rb +38 -0
- data/lib/motion_ocean/resource/key.rb +27 -0
- data/lib/motion_ocean/resource/region.rb +11 -0
- data/lib/motion_ocean/resource/size.rb +11 -0
- data/lib/motion_ocean/version.rb +3 -0
- data/lib/motion_ocean.rb +25 -0
- data/spec/client_spec.rb +27 -0
- metadata +179 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a06c40dcba0ec2769bec760b0280d44e1db514e2
|
4
|
+
data.tar.gz: 371c8a2e7935258115e4454bf1213898cec2eebd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c12c7d2ebd6306085c47cc76f2770e0eec7ea74c8f7e8c4e3f4091122bf424d813f25a405770918ee1651462799072e7e4803bcb48188f387dd27f7df3d6a642
|
7
|
+
data.tar.gz: 1b19173cd4eacab7862b0778610d65a1525997ec32113d78686cc39c9ed6d0d93ee7942ef94ef4e1b259c4611879a173000ff015c429d4e842e3430460341731
|
data/README.md
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# MotionOcean
|
2
|
+
|
3
|
+
RubyMotion library for [version 2 of DigitalOcean's API](https://developers.digitalocean.com/v2/)
|
4
|
+
|
5
|
+
**Please note that version 2 of DigitalOcean's API is in beta, and is still
|
6
|
+
being developed. Everything is subject to change.**
|
7
|
+
|
8
|
+
### Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
``` ruby
|
13
|
+
gem 'motion_ocean'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
``` sh
|
18
|
+
$ bundle
|
19
|
+
```
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
``` sh
|
24
|
+
$ gem install motion_ocean
|
25
|
+
```
|
26
|
+
|
27
|
+
### Initialization
|
28
|
+
|
29
|
+
``` ruby
|
30
|
+
client = MotionOcean::Client.new(access_token: 'token')
|
31
|
+
```
|
32
|
+
|
33
|
+
*or*
|
34
|
+
|
35
|
+
``` ruby
|
36
|
+
client = MotionOcean::Client.new do |config|
|
37
|
+
config.access_token = 'token'
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
### Usage
|
42
|
+
|
43
|
+
Since MotionOcean is based on [AFMotion][afmotion], requests are being made asynchronous. Every MotionOcean method call therefore requires a block, which yields the data (or nil if the request failed).
|
44
|
+
|
45
|
+
MotionOcean pretty much implements the DO API 1:1, so please check [their documentation](https://developers.digitalocean.com/v2/) for the available functions and options.
|
46
|
+
|
47
|
+
### success?
|
48
|
+
|
49
|
+
You can use `success?` to check if a successful HTTP status code was returned:
|
50
|
+
|
51
|
+
``` ruby
|
52
|
+
client.droplet.create(options) do |result|
|
53
|
+
result.success? # => true
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
### response
|
58
|
+
|
59
|
+
MotionOcean uses [AFMotion][afmotion]. You can use `response` to get to the response
|
60
|
+
object:
|
61
|
+
|
62
|
+
``` ruby
|
63
|
+
client.droplet.create(options) do |result|
|
64
|
+
result.response # => AFMotion::HTTPResult
|
65
|
+
end
|
66
|
+
```
|
67
|
+
[afmotion]: https://github.com/usepropellor/afmotion
|
68
|
+
|
69
|
+
## Contributing
|
70
|
+
|
71
|
+
1. Fork it ( https://github.com/[my-github-username]/motion_ocean/fork )
|
72
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
73
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
74
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
75
|
+
5. Create a new Pull Request
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module MotionOcean
|
2
|
+
class Client
|
3
|
+
attr_accessor :access_token
|
4
|
+
|
5
|
+
attr_reader :action
|
6
|
+
attr_reader :domain
|
7
|
+
attr_reader :droplet
|
8
|
+
attr_reader :image
|
9
|
+
attr_reader :key
|
10
|
+
attr_reader :region
|
11
|
+
attr_reader :size
|
12
|
+
|
13
|
+
DEFAULT_OPTIONS = {}
|
14
|
+
DIGITAL_OCEAN_URL = 'https://api.digitalocean.com/v2'
|
15
|
+
|
16
|
+
def initialize(options = DEFAULT_OPTIONS)
|
17
|
+
self.access_token = options.fetch(:access_token, nil)
|
18
|
+
yield(self) if block_given?
|
19
|
+
fail ArgumentError, 'missing access token' unless access_token
|
20
|
+
initialize_resources
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def initialize_resources
|
25
|
+
@action = Resource::Action.new(api_client)
|
26
|
+
@domain = Resource::Domain.new(api_client)
|
27
|
+
@droplet = Resource::Droplet.new(api_client)
|
28
|
+
@region = Resource::Region.new(api_client)
|
29
|
+
@size = Resource::Size.new(api_client)
|
30
|
+
end
|
31
|
+
|
32
|
+
def api_client
|
33
|
+
@api_client ||= AFMotion::SessionClient.build(DIGITAL_OCEAN_URL) do |client|
|
34
|
+
client.session_configuration :default
|
35
|
+
|
36
|
+
client.header 'Accept', 'application/json'
|
37
|
+
client.header 'Content-Type', 'application/json'
|
38
|
+
client.header 'Authorization', "Bearer #{access_token}"
|
39
|
+
|
40
|
+
client.request_serializer :json
|
41
|
+
client.response_serializer :json
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module MotionOcean
|
2
|
+
module Resource
|
3
|
+
module Base
|
4
|
+
attr_reader :api_client
|
5
|
+
|
6
|
+
PER_PAGE = 200
|
7
|
+
|
8
|
+
def initialize(api_client)
|
9
|
+
@api_client = api_client
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
[:delete, :get, :head, :post, :put].each do |verb|
|
14
|
+
define_method verb do |url, options = {}, &block|
|
15
|
+
request(__method__, url, options, &block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def request(verb, url, options, &block)
|
20
|
+
opts = {}
|
21
|
+
opts = { per_page: PER_PAGE } if verb == :get
|
22
|
+
options = opts.merge(options)
|
23
|
+
|
24
|
+
api_client.public_send(verb, url, options) do |response|
|
25
|
+
data = response.object.tap do |r|
|
26
|
+
r.define_singleton_method(:response) { response }
|
27
|
+
r.define_singleton_method(:success?) { response.success? }
|
28
|
+
end
|
29
|
+
block.call(data)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module MotionOcean
|
2
|
+
module Resource
|
3
|
+
class Domain
|
4
|
+
include Resource::Base
|
5
|
+
|
6
|
+
def create(options, &block)
|
7
|
+
post('domains', options, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def all(&block)
|
11
|
+
get('domains', &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def show(domain_name, &block)
|
15
|
+
get("domains/#{domain_name}", &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy(domain_name, &block)
|
19
|
+
delete("domains/#{domain_name}", &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_record(domain_name, options, &block)
|
23
|
+
post("domains/#{domain_name}/records", options, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def records(domain_name, &block)
|
27
|
+
get("domains/#{domain_name}/records", &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
def show_record(domain_name, record_id, &block)
|
31
|
+
get("domains/#{domain_name}/records/#{record_id}", &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def update_record(domain_name, record_id, options, &block)
|
35
|
+
put("domains/#{domain_name}/records", options, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def destroy_record(domain_name, record_id, &block)
|
39
|
+
delete("domains/#{domain_name}/records", &block)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module MotionOcean
|
2
|
+
module Resource
|
3
|
+
class Droplet
|
4
|
+
include Resource::Base
|
5
|
+
|
6
|
+
def create(options, &block)
|
7
|
+
post('droplets', options, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def all(&block)
|
11
|
+
get('droplets', &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def show(droplet_name, &block)
|
15
|
+
get("droplets/#{droplet_name}", &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy(droplet_name, &block)
|
19
|
+
delete("droplets/#{droplet_name}", &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def backups(droplet_id, &block)
|
23
|
+
get("droplets/#{droplet_id}/backups", &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def kernels(droplet_id, &block)
|
27
|
+
get("droplets/#{droplet_id}/kernels", &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
def snapshots(droplet_id, &block)
|
31
|
+
get("droplets/#{droplet_id}/snapshots", &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def rename(droplet_id, name, &block)
|
35
|
+
action(droplet_id, __method__, name: name, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def reboot(droplet_id, &block)
|
39
|
+
action(droplet_id, __method__, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def shutdown(droplet_id, &block)
|
43
|
+
action(droplet_id, __method__, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def power_off(droplet_id, &block)
|
47
|
+
action(droplet_id, __method__, &block)
|
48
|
+
end
|
49
|
+
|
50
|
+
def power_cycle(droplet_id, &block)
|
51
|
+
action(droplet_id, __method__, &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
def power_on(droplet_id, &block)
|
55
|
+
action(droplet_id, __method__, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def resize(droplet_id, size, &block)
|
59
|
+
action(droplet_id, __method__, size: size, &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
def rebuild(droplet_id, image_id, &block)
|
63
|
+
action(droplet_id, __method__, image: image_id, &block)
|
64
|
+
end
|
65
|
+
|
66
|
+
def restore(droplet_id, image_id, &block)
|
67
|
+
action(droplet_id, __method__, image: image_id, &block)
|
68
|
+
end
|
69
|
+
|
70
|
+
def password_reset(droplet_id, &block)
|
71
|
+
action(droplet_id, __method__, &block)
|
72
|
+
end
|
73
|
+
|
74
|
+
def change_kernel(droplet_id, kernel_id, &block)
|
75
|
+
action(droplet_id, __method__, kernel: kernel_id, &block)
|
76
|
+
end
|
77
|
+
|
78
|
+
def enable_ipv6(droplet_id, &block)
|
79
|
+
action(droplet_id, __method__, &block)
|
80
|
+
end
|
81
|
+
|
82
|
+
def disable_backups(droplet_id, &block)
|
83
|
+
action(droplet_id, __method__, &block)
|
84
|
+
end
|
85
|
+
|
86
|
+
def enable_private_networking(droplet_id, &block)
|
87
|
+
action(droplet_id, __method__, &block)
|
88
|
+
end
|
89
|
+
|
90
|
+
def actions(droplet_id, &block)
|
91
|
+
get("droplets/#{droplet_id}/actions", &block)
|
92
|
+
end
|
93
|
+
|
94
|
+
def show_action(droplet_id, action_id, &block)
|
95
|
+
get("droplets/#{droplet_id}/actions/#{action_id}", &block)
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def action(droplet_id, type, params = {}, &block)
|
101
|
+
post("droplets/#{droplet_id}/actions",
|
102
|
+
{ type: type }.merge(params).to_json, &block)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module MotionOcean
|
2
|
+
module Resource
|
3
|
+
class Image
|
4
|
+
include Resource::Base
|
5
|
+
|
6
|
+
def all(&block)
|
7
|
+
get('images', &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def show(image_id, &block)
|
11
|
+
get("images/#{image_id}", &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def update(image_id, options, &block)
|
15
|
+
put("images/#{image_id}", options.to_json, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy(image_id, &block)
|
19
|
+
delete("images/#{image_id}", &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def transfer(image_id, region, &block)
|
23
|
+
action(image_id, __method__, region: region, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def show_action(image_id, action_id, &block)
|
27
|
+
get("images/#{image_id}/actions/#{action_id}", &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def action(image_id, type, params = {}, &block)
|
33
|
+
post("images/#{image_id}/actions",
|
34
|
+
{ type: type }.merge(params).to_json, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module MotionOcean
|
2
|
+
module Resource
|
3
|
+
class Key
|
4
|
+
include Resource::Base
|
5
|
+
|
6
|
+
def create(options, &block)
|
7
|
+
post('account/keys', options.to_json)
|
8
|
+
end
|
9
|
+
|
10
|
+
def all(&block)
|
11
|
+
get('account/keys', &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def show(key_id, &block)
|
15
|
+
get("account/keys/#{key_id}", &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def update(key_id, options, &block)
|
19
|
+
put("account/keys/#{key_id}", options.to_json, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy(key_id, &block)
|
23
|
+
delete("account/keys/#{key_id}", &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/motion_ocean.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'dbt'
|
2
|
+
require 'afmotion'
|
3
|
+
|
4
|
+
unless defined?(Motion::Project::Config)
|
5
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
6
|
+
end
|
7
|
+
|
8
|
+
Motion::Project::App.setup do |app|
|
9
|
+
core_lib = File.join(File.dirname(__FILE__), 'motion_ocean')
|
10
|
+
|
11
|
+
# scans app.files until it finds app/ (the default)
|
12
|
+
# if found, it inserts just before those files, otherwise it will insert to
|
13
|
+
# the end of the list
|
14
|
+
insert_point = app.files.find_index { |file| file =~ /^(?:\.\/)?app\// } || 0
|
15
|
+
|
16
|
+
Dir.glob(File.join(core_lib, '**/*.rb')).reverse.each do |file|
|
17
|
+
app.files.insert(insert_point, file)
|
18
|
+
end
|
19
|
+
|
20
|
+
DBT.analyze(app)
|
21
|
+
end
|
22
|
+
|
23
|
+
module MotionOcean
|
24
|
+
# Your code goes here...
|
25
|
+
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
describe "MotionOcean::Client" do
|
2
|
+
describe "#access_token" do
|
3
|
+
before do
|
4
|
+
@token ||= "some_token"
|
5
|
+
end
|
6
|
+
|
7
|
+
it "can be set via a hash" do
|
8
|
+
client = MotionOcean::Client.new(access_token: @token)
|
9
|
+
expect(client.access_token).to eq(@token)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "can be set via a block" do
|
13
|
+
client = MotionOcean::Client.new do |c|
|
14
|
+
c.access_token = @token
|
15
|
+
end
|
16
|
+
|
17
|
+
expect(client.access_token).to eq(@token)
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when none given" do
|
21
|
+
it "fails" do
|
22
|
+
expect { MotionOcean::Client.new }.to raise_error(ArgumentError, 'missing access token')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion_ocean
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Erwin Boskma
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dbt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.1.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.1.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: afmotion
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.3'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 2.3.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '2.3'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 2.3.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rake
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '10.3'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 10.3.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.3'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 10.3.0
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: webstub
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.0'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.0.0
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.0.0
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: motion-redgreen
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0.1'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.1.0
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.1'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 0.1.0
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: bacon-expect
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '1.0'
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 1.0.0
|
123
|
+
type: :development
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '1.0'
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 1.0.0
|
133
|
+
description: MotionOcean, for RubyMotion, is an implementation of v2 of the Digital
|
134
|
+
Ocean API
|
135
|
+
email:
|
136
|
+
- erwin@datarift.nl
|
137
|
+
executables: []
|
138
|
+
extensions: []
|
139
|
+
extra_rdoc_files: []
|
140
|
+
files:
|
141
|
+
- README.md
|
142
|
+
- lib/motion_ocean.rb
|
143
|
+
- lib/motion_ocean/client.rb
|
144
|
+
- lib/motion_ocean/resource/action.rb
|
145
|
+
- lib/motion_ocean/resource/base.rb
|
146
|
+
- lib/motion_ocean/resource/domain.rb
|
147
|
+
- lib/motion_ocean/resource/droplet.rb
|
148
|
+
- lib/motion_ocean/resource/image.rb
|
149
|
+
- lib/motion_ocean/resource/key.rb
|
150
|
+
- lib/motion_ocean/resource/region.rb
|
151
|
+
- lib/motion_ocean/resource/size.rb
|
152
|
+
- lib/motion_ocean/version.rb
|
153
|
+
- spec/client_spec.rb
|
154
|
+
homepage: https://github.com/datarift/motion_ocean
|
155
|
+
licenses:
|
156
|
+
- MIT
|
157
|
+
metadata: {}
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
requirements: []
|
173
|
+
rubyforge_project:
|
174
|
+
rubygems_version: 2.2.2
|
175
|
+
signing_key:
|
176
|
+
specification_version: 4
|
177
|
+
summary: Digital Ocean API implementation for RubyMotion
|
178
|
+
test_files:
|
179
|
+
- spec/client_spec.rb
|