aptible-api 0.1.2 → 0.2.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 +4 -4
- data/Gemfile +0 -3
- data/Procfile +1 -0
- data/README.md +2 -3
- data/aptible-api.gemspec +4 -3
- data/lib/aptible/api/account.rb +16 -0
- data/lib/aptible/api/adapter.rb +21 -0
- data/lib/aptible/api/app.rb +8 -0
- data/lib/aptible/api/attachment.rb +4 -0
- data/lib/aptible/api/configuration.rb +4 -0
- data/lib/aptible/api/container.rb +4 -0
- data/lib/aptible/api/disk.rb +6 -0
- data/lib/aptible/api/image.rb +4 -0
- data/lib/aptible/api/operation.rb +4 -0
- data/lib/aptible/api/permission.rb +4 -0
- data/lib/aptible/api/proxy.rb +4 -0
- data/lib/aptible/api/release.rb +5 -0
- data/lib/aptible/api/resource.rb +49 -0
- data/lib/aptible/api/service.rb +9 -0
- data/lib/aptible/api/vhost.rb +4 -0
- data/lib/aptible/api.rb +57 -4
- data/spec/aptible/api/resource_spec.rb +18 -0
- data/spec/aptible/api_spec.rb +27 -0
- metadata +49 -7
- data/lib/aptible/api/client.rb +0 -39
- data/lib/aptible/api/version.rb +0 -5
- data/spec/aptible/api/client_spec.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0013944c43af6ae364441bcf5802e68defadc874
|
4
|
+
data.tar.gz: 26b2de9b909d738085ab83b7b397e3e13fb625a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12d71e142af40537c0a9c20974fb995604ebf7ac51340f994ab9915908bac2da3f37f74967c637939ed285b131938c36a019126b4f2f184415da46923dd534d0
|
7
|
+
data.tar.gz: ff6a9b5150ab4dd95332e389c96934699c8ff25e6c5bd90040137f2b1fccb432154034a26248de21b1634e0c840d427fc218f86d43eb2ee5fdb0957db00af112
|
data/Gemfile
CHANGED
data/Procfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
console: bundle exec pry -r aptible/api
|
data/README.md
CHANGED
@@ -11,12 +11,11 @@ Ruby client for [api.aptible.com](https://api.aptible.com/). Aptible's API serve
|
|
11
11
|
Add the following lines to your application's Gemfile.
|
12
12
|
|
13
13
|
gem 'aptible-api'
|
14
|
-
gem 'hyperresource', github: 'fancyremarker/hyperresource', branch: 'aptible'
|
15
|
-
|
16
|
-
The forked version of the HyperResource gem is necessary until [gamache/hyperresource#19](https://github.com/gamache/hyperresource/pull/19) is merged.
|
17
14
|
|
18
15
|
And then run `bundle install`.
|
19
16
|
|
17
|
+
*Note:* A forked version of the HyperResource gem (`hyperresource-aptible`) is necessary until [gamache/hyperresource#22](https://github.com/gamache/hyperresource/pull/22) and [gamache/hyperresource#23](https://github.com/gamache/hyperresource/pull/23) are merged.
|
18
|
+
|
20
19
|
## Usage
|
21
20
|
|
22
21
|
First, get a token:
|
data/aptible-api.gemspec
CHANGED
@@ -3,11 +3,10 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
5
|
require 'English'
|
6
|
-
require 'aptible/api/version'
|
7
6
|
|
8
7
|
Gem::Specification.new do |spec|
|
9
8
|
spec.name = 'aptible-api'
|
10
|
-
spec.version =
|
9
|
+
spec.version = '0.2.0'
|
11
10
|
spec.authors = ['Frank Macreery']
|
12
11
|
spec.email = ['frank@macreery.com']
|
13
12
|
spec.description = %q{Ruby client for api.aptible.com}
|
@@ -20,13 +19,15 @@ Gem::Specification.new do |spec|
|
|
20
19
|
spec.require_paths = ['lib']
|
21
20
|
|
22
21
|
spec.add_dependency 'gem_config'
|
23
|
-
spec.add_dependency 'hyperresource'
|
22
|
+
spec.add_dependency 'hyperresource-aptible'
|
24
23
|
spec.add_dependency 'aptible-auth'
|
25
24
|
spec.add_dependency 'fridge'
|
26
25
|
|
27
26
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
28
27
|
spec.add_development_dependency 'aptible-tasks', '>= 0.2.0'
|
28
|
+
spec.add_development_dependency 'activesupport'
|
29
29
|
spec.add_development_dependency 'rake'
|
30
30
|
spec.add_development_dependency 'rspec', '~> 2.0'
|
31
|
+
spec.add_development_dependency 'foreman'
|
31
32
|
spec.add_development_dependency 'pry'
|
32
33
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Aptible
|
2
|
+
class Api::Account < Api::Resource
|
3
|
+
has_many :apps
|
4
|
+
has_many :disks
|
5
|
+
has_many :services
|
6
|
+
|
7
|
+
def production?
|
8
|
+
type == 'production'
|
9
|
+
end
|
10
|
+
|
11
|
+
def operations
|
12
|
+
# TODO: Implement /accounts/:id/operations
|
13
|
+
[]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Aptible
|
2
|
+
class Api::Adapter < HyperResource::Adapter::HAL_JSON
|
3
|
+
class << self
|
4
|
+
# rubocop:disable MethodLength
|
5
|
+
def get_data_type_from_object(object)
|
6
|
+
return nil unless object
|
7
|
+
|
8
|
+
if (type = object['_type'])
|
9
|
+
if type.respond_to?(:camelize)
|
10
|
+
type.camelize
|
11
|
+
else
|
12
|
+
type[0].upcase + type[1..-1]
|
13
|
+
end
|
14
|
+
else
|
15
|
+
'Resource'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
# rubocop:enable MethodLength
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
|
3
|
+
module Aptible
|
4
|
+
class Api::Resource < Api
|
5
|
+
def self.collection_url
|
6
|
+
basename = name.split('::').last
|
7
|
+
config = Aptible::Api.configuration
|
8
|
+
config.root_url.chomp('/') + "/#{basename.downcase.pluralize}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.find(id)
|
12
|
+
find_by_url("#{collection_url}/#{id}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_by_url(url)
|
16
|
+
# REVIEW: Should exception be raised if return type mismatch?
|
17
|
+
new.find_by_url(url)
|
18
|
+
rescue
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
|
22
|
+
# rubocop:disable PredicateName
|
23
|
+
def self.has_many(relation)
|
24
|
+
define_method relation do
|
25
|
+
get unless loaded
|
26
|
+
if (memoized = instance_variable_get("@#{relation}"))
|
27
|
+
memoized
|
28
|
+
elsif links[relation]
|
29
|
+
instance_variable_set("@#{relation}", links[relation].entries)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
# rubocop:enable PredicateName
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
require 'aptible/api/account'
|
38
|
+
require 'aptible/api/app'
|
39
|
+
require 'aptible/api/attachment'
|
40
|
+
require 'aptible/api/configuration'
|
41
|
+
require 'aptible/api/container'
|
42
|
+
require 'aptible/api/disk'
|
43
|
+
require 'aptible/api/image'
|
44
|
+
require 'aptible/api/operation'
|
45
|
+
require 'aptible/api/permission'
|
46
|
+
require 'aptible/api/proxy'
|
47
|
+
require 'aptible/api/release'
|
48
|
+
require 'aptible/api/service'
|
49
|
+
require 'aptible/api/vhost'
|
data/lib/aptible/api.rb
CHANGED
@@ -1,16 +1,69 @@
|
|
1
|
-
require 'aptible/
|
2
|
-
require 'aptible/api/client'
|
3
|
-
|
1
|
+
require 'aptible/auth'
|
4
2
|
require 'gem_config'
|
3
|
+
require 'hyperresource'
|
4
|
+
require 'fridge'
|
5
5
|
|
6
6
|
module Aptible
|
7
|
-
|
7
|
+
class Api < HyperResource
|
8
8
|
include GemConfig::Base
|
9
9
|
|
10
|
+
attr_accessor :token, :config
|
11
|
+
|
10
12
|
with_configuration do
|
11
13
|
has :root_url,
|
12
14
|
classes: [String],
|
13
15
|
default: ENV['APTIBLE_API_ROOT_URL'] || 'https://api.aptible.com'
|
14
16
|
end
|
17
|
+
|
18
|
+
def self.get_data_type_from_response(response)
|
19
|
+
return nil unless response && response.body
|
20
|
+
adapter.get_data_type_from_object(adapter.deserialize(response.body))
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.adapter
|
24
|
+
Aptible::Api::Adapter
|
25
|
+
end
|
26
|
+
|
27
|
+
def adapter
|
28
|
+
self.class.adapter
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(options = {})
|
32
|
+
if options.is_a?(Hash)
|
33
|
+
self.token = options[:token]
|
34
|
+
|
35
|
+
options[:root] ||= config.root_url
|
36
|
+
options[:namespace] ||= 'Aptible::Api'
|
37
|
+
options[:headers] ||= { 'Content-Type' => 'application/json' }
|
38
|
+
options[:headers].merge!(
|
39
|
+
'Authorization' => "Bearer #{bearer_token}"
|
40
|
+
) if options[:token]
|
41
|
+
end
|
42
|
+
|
43
|
+
super(options)
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_by_url(url)
|
47
|
+
fail "URL must be rooted at #{root}" unless /^#{root}/.match url
|
48
|
+
|
49
|
+
resource = dup
|
50
|
+
resource.href = url.gsub(/^#{root}/, '')
|
51
|
+
resource.get
|
52
|
+
end
|
53
|
+
|
54
|
+
def bearer_token
|
55
|
+
case token
|
56
|
+
when Aptible::Auth::Token then token.access_token
|
57
|
+
when Fridge::AccessToken then token.to_s
|
58
|
+
when String then token
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def config
|
63
|
+
@config ||= Aptible::Api.configuration
|
64
|
+
end
|
15
65
|
end
|
16
66
|
end
|
67
|
+
|
68
|
+
require 'aptible/api/adapter'
|
69
|
+
require 'aptible/api/resource'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Aptible::Api::Resource do
|
4
|
+
describe '.collection_url' do
|
5
|
+
it 'should use the pluralized resource name' do
|
6
|
+
url = Aptible::Api::Disk.collection_url
|
7
|
+
expect(url).to eq 'https://api.aptible.com/disks'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.find' do
|
12
|
+
it 'should call find_by_url' do
|
13
|
+
url = 'https://api.aptible.com/disks/42'
|
14
|
+
expect(Aptible::Api::Disk).to receive(:find_by_url).with url
|
15
|
+
Aptible::Api::Disk.find(42)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/spec/aptible/api_spec.rb
CHANGED
@@ -1,6 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Aptible::Api do
|
4
|
+
describe '#initialize' do
|
5
|
+
it 'should be a HyperResource instance' do
|
6
|
+
expect(subject).to be_a HyperResource
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#bearer_token' do
|
11
|
+
it 'should accept an Aptible::Auth::Token' do
|
12
|
+
token = Aptible::Auth::Token.new
|
13
|
+
token.stub(:access_token) { 'abtible_auth_token' }
|
14
|
+
subject.stub(:token) { token }
|
15
|
+
expect(subject.bearer_token).to eq token.access_token
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should accept an Fridge::AccessToken' do
|
19
|
+
token = Fridge::AccessToken.new
|
20
|
+
token.stub(:to_s) { 'fridge_access_token' }
|
21
|
+
subject.stub(:token) { token }
|
22
|
+
expect(subject.bearer_token).to eq token.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should accept a String' do
|
26
|
+
subject.stub(:token) { 'token' }
|
27
|
+
expect(subject.bearer_token).to eq 'token'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
4
31
|
it 'should have a configurable root_url' do
|
5
32
|
config = described_class.configuration
|
6
33
|
expect(config).to be_a GemConfig::Configuration
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aptible-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank Macreery
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_config
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: hyperresource
|
28
|
+
name: hyperresource-aptible
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '>='
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 0.2.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: activesupport
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rake
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +136,20 @@ dependencies:
|
|
122
136
|
- - ~>
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '2.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: foreman
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
- !ruby/object:Gem::Dependency
|
126
154
|
name: pry
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,13 +176,27 @@ files:
|
|
148
176
|
- .travis.yml
|
149
177
|
- Gemfile
|
150
178
|
- LICENSE.md
|
179
|
+
- Procfile
|
151
180
|
- README.md
|
152
181
|
- Rakefile
|
153
182
|
- aptible-api.gemspec
|
154
183
|
- lib/aptible/api.rb
|
155
|
-
- lib/aptible/api/
|
156
|
-
- lib/aptible/api/
|
157
|
-
-
|
184
|
+
- lib/aptible/api/account.rb
|
185
|
+
- lib/aptible/api/adapter.rb
|
186
|
+
- lib/aptible/api/app.rb
|
187
|
+
- lib/aptible/api/attachment.rb
|
188
|
+
- lib/aptible/api/configuration.rb
|
189
|
+
- lib/aptible/api/container.rb
|
190
|
+
- lib/aptible/api/disk.rb
|
191
|
+
- lib/aptible/api/image.rb
|
192
|
+
- lib/aptible/api/operation.rb
|
193
|
+
- lib/aptible/api/permission.rb
|
194
|
+
- lib/aptible/api/proxy.rb
|
195
|
+
- lib/aptible/api/release.rb
|
196
|
+
- lib/aptible/api/resource.rb
|
197
|
+
- lib/aptible/api/service.rb
|
198
|
+
- lib/aptible/api/vhost.rb
|
199
|
+
- spec/aptible/api/resource_spec.rb
|
158
200
|
- spec/aptible/api_spec.rb
|
159
201
|
- spec/shared/set_env.rb
|
160
202
|
- spec/spec_helper.rb
|
@@ -183,7 +225,7 @@ signing_key:
|
|
183
225
|
specification_version: 4
|
184
226
|
summary: Ruby client for api.aptible.com
|
185
227
|
test_files:
|
186
|
-
- spec/aptible/api/
|
228
|
+
- spec/aptible/api/resource_spec.rb
|
187
229
|
- spec/aptible/api_spec.rb
|
188
230
|
- spec/shared/set_env.rb
|
189
231
|
- spec/spec_helper.rb
|
data/lib/aptible/api/client.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'hyperresource'
|
2
|
-
require 'aptible/auth'
|
3
|
-
require 'fridge'
|
4
|
-
|
5
|
-
module Aptible
|
6
|
-
module Api
|
7
|
-
class Client < HyperResource
|
8
|
-
attr_accessor :token, :config
|
9
|
-
|
10
|
-
def initialize(options = {})
|
11
|
-
unless options.is_a?(Hash)
|
12
|
-
fail ArgumentError, 'Call Aptible::Api::Client.new with a Hash'
|
13
|
-
end
|
14
|
-
self.token = options[:token]
|
15
|
-
|
16
|
-
options[:root] ||= config.root_url
|
17
|
-
options[:headers] ||= { 'Content-Type' => 'application/json' }
|
18
|
-
options[:headers].merge!(
|
19
|
-
'Authorization' => "Bearer #{bearer_token}"
|
20
|
-
) if options[:token]
|
21
|
-
|
22
|
-
super(options)
|
23
|
-
end
|
24
|
-
|
25
|
-
def bearer_token
|
26
|
-
# REVIEW: Should we really allow any token type here?
|
27
|
-
case token
|
28
|
-
when Aptible::Auth::Token then token.access_token
|
29
|
-
when Fridge::AccessToken then token.to_s
|
30
|
-
when String then token
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def config
|
35
|
-
@config ||= Aptible::Api.configuration
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/aptible/api/version.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Aptible::Api::Client do
|
4
|
-
describe '#initialize' do
|
5
|
-
it 'should be a HyperResource instance' do
|
6
|
-
expect(subject).to be_a HyperResource
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#bearer_token' do
|
11
|
-
it 'should accept an Aptible::Auth::Token' do
|
12
|
-
token = Aptible::Auth::Token.new
|
13
|
-
token.stub(:access_token) { 'abtible_auth_token' }
|
14
|
-
subject.stub(:token) { token }
|
15
|
-
expect(subject.bearer_token).to eq token.access_token
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should accept an Fridge::AccessToken' do
|
19
|
-
token = Fridge::AccessToken.new
|
20
|
-
token.stub(:to_s) { 'fridge_access_token' }
|
21
|
-
subject.stub(:token) { token }
|
22
|
-
expect(subject.bearer_token).to eq token.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should accept a String' do
|
26
|
-
subject.stub(:token) { 'token' }
|
27
|
-
expect(subject.bearer_token).to eq 'token'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|