motion_ocean 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,15 @@
1
+ module MotionOcean
2
+ module Resource
3
+ class Action
4
+ include Resource::Base
5
+
6
+ def all(&block)
7
+ get('actions', &block)
8
+ end
9
+
10
+ def show(action_id, &block)
11
+ get("actions/#{action_id}", &block)
12
+ end
13
+ end
14
+ end
15
+ 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
@@ -0,0 +1,11 @@
1
+ module MotionOcean
2
+ module Resource
3
+ class Region
4
+ include Resource::Base
5
+
6
+ def all(&block)
7
+ get('regions', &block)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module MotionOcean
2
+ module Resource
3
+ class Size
4
+ include Resource::Base
5
+
6
+ def all(&block)
7
+ get('sizes', &block)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module MotionOcean
2
+ VERSION = "0.1.0"
3
+ end
@@ -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
@@ -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