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 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