dawn-api 0.9.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: f67aba9063e02175a8f39faef656f1046d01a474
4
+ data.tar.gz: 1b4424a7e02702a2acf8625162e30f233f58c6ea
5
+ SHA512:
6
+ metadata.gz: c680999789ae45609b11fc9e311ae2a9a09437b9d182ab1d0beb5c30f0b9111e06466d364e3a85047bd6d16b52d6fed140d9abc7790fff925680442016e3e779
7
+ data.tar.gz: 569ba8aab02dbd02e00952dcca4b32d5d6f251222d3ae8047ad448c0f748fe882bb3e781ccac24f7ed2d5441ea6ab496203683855b42db4fd3b75d4c6bef1e77
@@ -0,0 +1,40 @@
1
+ require 'dawn/api/base_api'
2
+ require 'dawn/api/domain'
3
+
4
+ module Dawn
5
+ class App
6
+ class Domains
7
+
8
+ include BaseApi
9
+
10
+ attr_reader :app
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def create(options={})
17
+ Domain.new(json_request(
18
+ expects: 200,
19
+ method: :post,
20
+ path: "/apps/#{app.id}/domains",
21
+ body: options.to_json
22
+ )["domain"]).tap { |d| d.app = @app }
23
+ end
24
+
25
+ def all(options={})
26
+ json_request(
27
+ expects: 200,
28
+ method: :get,
29
+ path: "/apps/#{app.id}/domains",
30
+ query: options
31
+ ).map { |hsh| Domain.new(hsh["domain"]).tap { |d| d.app = @app } }
32
+ end
33
+
34
+ def find(options={})
35
+ Domain.find(options).tap { |d| d.app = @app }
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'dawn/api/base_api'
2
+ require 'dawn/api/drain'
3
+
4
+ module Dawn
5
+ class App
6
+ class Drains
7
+
8
+ include BaseApi
9
+
10
+ attr_reader :app
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def create(options={})
17
+ Drain.new(json_request(
18
+ expects: 200,
19
+ method: :post,
20
+ path: "/apps/#{app.id}/drains",
21
+ body: options.to_json
22
+ )["drain"]).tap { |d| d.app = @app }
23
+ end
24
+
25
+ def all(options={})
26
+ json_request(
27
+ expects: 200,
28
+ method: :get,
29
+ path: "/apps/#{app.id}/drains",
30
+ query: options
31
+ ).map { |hsh| Drain.new(hsh["drain"]).tap { |d| d.app = @app } }
32
+ end
33
+
34
+ def find(options={})
35
+ Drain.find(options).tap { |d| d.app = @app }
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,37 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class App
5
+ class Env < Hash
6
+
7
+ include BaseApi
8
+
9
+ attr_reader :app
10
+
11
+ def initialize(app, data)
12
+ @app = app
13
+ super()
14
+ replace(data)
15
+ end
16
+
17
+ def refresh(options={})
18
+ replace json_request(
19
+ expects: 200,
20
+ method: :get,
21
+ path: "/apps/#{app.id}/env",
22
+ query: options
23
+ )["env"]
24
+ end
25
+
26
+ def save(options={})
27
+ replace json_request(
28
+ expects: 200,
29
+ method: :post,
30
+ path: "/apps/#{app.id}/env",
31
+ body: { env: merge(options) }.to_json
32
+ )["env"]
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,49 @@
1
+ require 'dawn/api/base_api'
2
+ require 'dawn/api/gear'
3
+
4
+ module Dawn
5
+ class App
6
+ class Gears
7
+
8
+ include BaseApi
9
+
10
+ attr_reader :app
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def create(options={})
17
+ Gear.new(json_request(
18
+ expects: 200,
19
+ method: :post,
20
+ path: "/apps/#{app.id}/gears",
21
+ body: options.to_json
22
+ )["gear"]).tap { |d| d.app = @app }
23
+ end
24
+
25
+ def all(options={})
26
+ json_request(
27
+ expects: 200,
28
+ method: :get,
29
+ path: "/apps/#{app.id}/gears",
30
+ query: options
31
+ ).map { |hsh| Gear.new(hsh["gear"]).tap { |d| d.app = @app } }
32
+ end
33
+
34
+ def find(options={})
35
+ Gear.find(options).tap { |d| d.app = @app }
36
+ end
37
+
38
+ def restart(options={})
39
+ request(
40
+ expects: 200,
41
+ method: :post,
42
+ path: "/apps/#{app.id}/gears/restart",
43
+ body: options.to_json
44
+ )
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,131 @@
1
+ require 'dawn/api/hosts'
2
+ require 'dawn/api/base_api'
3
+ require 'dawn/api/app/env'
4
+ require 'dawn/api/app/gears'
5
+ require 'dawn/api/app/drains'
6
+ require 'dawn/api/app/domains'
7
+
8
+ module Dawn
9
+ class App
10
+
11
+ include BaseApi
12
+
13
+ attr_reader :data
14
+ attr_reader :env
15
+
16
+ def initialize(hsh)
17
+ @data = hsh
18
+ @env = Env.new(self, @data.delete("env"))
19
+ end
20
+
21
+ def name
22
+ data["name"]
23
+ end
24
+
25
+ def id
26
+ data["id"]
27
+ end
28
+
29
+ def formation
30
+ data["formation"]
31
+ end
32
+
33
+ def git
34
+ data["git"]
35
+ end
36
+
37
+ def restart(options={})
38
+ request(
39
+ expects: 200,
40
+ method: :delete,
41
+ path: "/apps/#{id}/gears",
42
+ query: options
43
+ )
44
+ end
45
+
46
+ def gears
47
+ @gears ||= Gears.new self
48
+ end
49
+
50
+ def drains
51
+ @drains ||= Drains.new self
52
+ end
53
+
54
+ def domains
55
+ @domains ||= Domains.new self
56
+ end
57
+
58
+ def logs(options={})
59
+ url = json_request(
60
+ expects: 200,
61
+ method: :get,
62
+ path: "/apps/#{id}/logs",
63
+ query: options
64
+ )["logs"]
65
+ "http://#{Dawn.log_host}#{url}"
66
+ end
67
+
68
+ def update(options={})
69
+ data.merge!(json_request(
70
+ expects: 200,
71
+ method: :patch,
72
+ path: "/apps/#{id}",
73
+ body: { name: name }.merge(options).to_json
74
+ )["app"])
75
+ end
76
+
77
+ def scale(options={})
78
+ request(
79
+ expects: 200,
80
+ method: :post,
81
+ path: "/apps/#{id}/scale",
82
+ body: options.to_json
83
+ )
84
+ end
85
+
86
+ def destroy(options={})
87
+ request(
88
+ expects: 200,
89
+ method: :delete,
90
+ path: "/apps/#{id}",
91
+ query: options
92
+ )
93
+ end
94
+
95
+ def self.all(options={})
96
+ json_request(
97
+ expects: 200,
98
+ method: :get,
99
+ path: "/apps",
100
+ query: options
101
+ ).map { |hsh| new(hsh["app"]) }
102
+ end
103
+
104
+ def self.create(options)
105
+ new json_request(
106
+ expects: 200,
107
+ method: :post,
108
+ path: '/apps',
109
+ body: options.to_json
110
+ )["app"]
111
+ end
112
+
113
+ def self.find(options)
114
+ path = options[:id] ? "/apps/#{options.delete(:id)}" : "/apps"
115
+ hsh = json_request(
116
+ expects: 200,
117
+ method: :get,
118
+ path: path,
119
+ query: options
120
+ )
121
+ hsh = hsh.first if hsh.is_a?(Array)
122
+ hsh && new(hsh["app"])
123
+ end
124
+
125
+ def self.destroy(options)
126
+ app = find options
127
+ app.destroy if app
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,66 @@
1
+ require 'dawn/api/version'
2
+ require 'excon'
3
+ require 'netrc'
4
+
5
+ module Dawn
6
+
7
+ HEADERS = {
8
+ 'Accept' => 'application/json',
9
+ 'Content-Type' => 'application/json',
10
+ 'Accept-Encoding' => 'gzip',
11
+ 'User-Agent' => "dawn/#{API::VERSION}",
12
+ 'X-Ruby-Version' => RUBY_VERSION,
13
+ 'X-Ruby-Platform' => RUBY_PLATFORM
14
+ }
15
+
16
+ OPTIONS = {
17
+ headers: {},
18
+ host: 'api.dawn.dev',
19
+ nonblock: false,
20
+ scheme: 'http'
21
+ }
22
+
23
+ class AuthenticationError < RuntimeError
24
+ end
25
+
26
+ def self.request(options)
27
+ Dawn.authenticate unless @connection
28
+ @connection.request(options)
29
+ end
30
+
31
+ def self.authenticate(options={})
32
+ options = OPTIONS.merge options
33
+ options[:headers] = options[:headers].merge(HEADERS)
34
+ @api_key = options.delete(:api_key) || ENV['DAWN_API_KEY']
35
+
36
+ if !@api_key
37
+ hostname = options[:host]
38
+ url = "#{options[:scheme]}://#{hostname}"
39
+
40
+ if options.key?(:username) && options.key?(:password)
41
+ username = options.delete(:username)
42
+ password = options.delete(:password)
43
+
44
+ @connection = Excon.new url, headers: HEADERS
45
+
46
+ @api_key = User.login(username: username, password: password)['api_key']
47
+
48
+ netrc = Netrc.read
49
+ netrc[hostname] = username, @api_key
50
+ netrc.save
51
+ else
52
+ netrc = Netrc.read
53
+ username, api_key = netrc[hostname]
54
+ if api_key
55
+ @api_key = api_key
56
+ else
57
+ raise AuthenticationError, "api_key was not found, try dawn login to reset your .netrc"
58
+ # "please provide a DAWN_API_KEY, username and password, or update your .netrc with the dawn details (use dawn login)"
59
+ end
60
+ end
61
+ end
62
+ @headers = HEADERS.merge 'Authorization' => "Token token=\"#{@api_key}\""
63
+ @connection = Excon.new "#{options[:scheme]}://#{options[:host]}", headers: @headers
64
+ end
65
+
66
+ end
@@ -0,0 +1,23 @@
1
+ require 'dawn/api/authenticate'
2
+ require 'json'
3
+
4
+ module Dawn
5
+ module BaseApi
6
+ module Extension
7
+ def request(options)
8
+ Dawn.request options
9
+ end
10
+
11
+ def json_request(options)
12
+ JSON.load request(options).body
13
+ end
14
+ end
15
+
16
+ include Extension
17
+
18
+ def self.included(mod)
19
+ mod.extend Extension
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,80 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Domain
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+ attr_writer :app
10
+
11
+ def initialize(data)
12
+ @app = nil
13
+ @data = data
14
+ end
15
+
16
+ def app_id
17
+ data["app_id"]
18
+ end
19
+
20
+ def app
21
+ @app ||= App.find(id: app_id)
22
+ end
23
+
24
+ def id
25
+ data["id"]
26
+ end
27
+
28
+ def url
29
+ data["url"]
30
+ end
31
+
32
+ def refresh
33
+ @data = json_request(
34
+ expects: 200,
35
+ method: :get,
36
+ path: "/domains/#{id}",
37
+ query: options
38
+ )["domain"]
39
+ end
40
+
41
+ def update(options={})
42
+ request(
43
+ expects: 200,
44
+ method: :post,
45
+ path: "/domains/#{id}",
46
+ body: options.to_json
47
+ )
48
+ end
49
+
50
+ def destroy(options={})
51
+ request(
52
+ expects: 200,
53
+ method: :delete,
54
+ path: "/domains/#{id}",
55
+ query: options
56
+ )
57
+ end
58
+
59
+ def self.all(options={})
60
+ json_request(
61
+ expects: 200,
62
+ method: :get,
63
+ path: "/domains",
64
+ query: options
65
+ ).map { |hsh| new hsh["domain"] }
66
+ end
67
+
68
+ def self.find(options)
69
+ id = options.delete(:id)
70
+
71
+ new json_request(
72
+ expects: 200,
73
+ method: :get,
74
+ path: "/domains/#{id}",
75
+ query: options
76
+ )["domain"]
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,80 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Drain
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+ attr_writer :app
10
+
11
+ def initialize(data)
12
+ @app = nil
13
+ @data = data
14
+ end
15
+
16
+ def app_id
17
+ data["app_id"]
18
+ end
19
+
20
+ def app
21
+ @app ||= App.find(id: app_id)
22
+ end
23
+
24
+ def id
25
+ data["id"]
26
+ end
27
+
28
+ def url
29
+ data["url"]
30
+ end
31
+
32
+ def refresh
33
+ @data = json_request(
34
+ expects: 200,
35
+ method: :get,
36
+ path: "/drains/#{id}",
37
+ query: options
38
+ )["drain"]
39
+ end
40
+
41
+ def update(options={})
42
+ request(
43
+ expects: 200,
44
+ method: :post,
45
+ path: "/drains/#{id}",
46
+ body: options.to_json
47
+ )
48
+ end
49
+
50
+ def destroy(options={})
51
+ request(
52
+ expects: 200,
53
+ method: :delete,
54
+ path: "/drains/#{id}",
55
+ query: options
56
+ )
57
+ end
58
+
59
+ def self.all(options={})
60
+ json_request(
61
+ expects: 200,
62
+ method: :get,
63
+ path: "/drains",
64
+ query: options
65
+ ).map { |hsh| new hsh["drain"] }
66
+ end
67
+
68
+ def self.find(options={})
69
+ id = options.delete(:id)
70
+
71
+ new json_request(
72
+ expects: 200,
73
+ method: :get,
74
+ path: "/drains/#{id}",
75
+ query: options
76
+ )["drain"]
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,101 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Gear
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+ attr_writer :app
10
+
11
+ def initialize(data)
12
+ @app = nil
13
+ @data = data
14
+ end
15
+
16
+ def app_id
17
+ data["app_id"]
18
+ end
19
+
20
+ def app
21
+ @app ||= App.find(id: app_id)
22
+ end
23
+
24
+ def id
25
+ data["id"]
26
+ end
27
+
28
+ def name
29
+ data["name"]
30
+ end
31
+
32
+ def uptime
33
+ data["uptime"]
34
+ end
35
+
36
+ def type
37
+ data["type"]
38
+ end
39
+
40
+ def number
41
+ data["number"]
42
+ end
43
+
44
+ def refresh
45
+ @data = json_request(
46
+ expects: 200,
47
+ method: :get,
48
+ path: "/gears/#{id}",
49
+ query: options
50
+ )["gear"]
51
+ end
52
+
53
+ def restart(options={})
54
+ request(
55
+ expects: 200,
56
+ method: :post,
57
+ path: "/gears/#{id}/restart",
58
+ query: options
59
+ )
60
+ end
61
+
62
+ def update(options={})
63
+ request(
64
+ expects: 200,
65
+ method: :post,
66
+ path: "/gears/#{id}",
67
+ body: options.to_json
68
+ )
69
+ end
70
+
71
+ def destroy(options={})
72
+ request(
73
+ expects: 200,
74
+ method: :delete,
75
+ path: "/gears/#{id}",
76
+ query: options
77
+ )
78
+ end
79
+
80
+ def self.all(options={})
81
+ json_request(
82
+ expects: 200,
83
+ method: :get,
84
+ path: "/gears",
85
+ query: options
86
+ ).map { |hsh| new hsh["gear"] }
87
+ end
88
+
89
+ def self.find(options)
90
+ id = options.delete(:id)
91
+
92
+ new json_request(
93
+ expects: 200,
94
+ method: :get,
95
+ path: "/gears/#{id}",
96
+ query: options
97
+ )["gear"]
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,11 @@
1
+ module Dawn
2
+
3
+ def self.git_host
4
+ "dawn.dev"
5
+ end
6
+
7
+ def self.log_host
8
+ "dawn.dev:8001"
9
+ end
10
+
11
+ end
@@ -0,0 +1,73 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class Key
5
+
6
+ include BaseApi
7
+
8
+ attr_reader :data
9
+
10
+ def initialize(data)
11
+ @data = data
12
+ end
13
+
14
+ def id
15
+ data["id"]
16
+ end
17
+
18
+ def fingerprint
19
+ data["fingerprint"]
20
+ end
21
+
22
+ def key
23
+ data["key"]
24
+ end
25
+
26
+ def destroy
27
+ request(
28
+ method: :delete,
29
+ expects: 200,
30
+ path: "/account/keys/#{id}"
31
+ )
32
+ end
33
+
34
+ def self.add(pubkey)
35
+ new json_request(
36
+ method: :post,
37
+ expects: 200,
38
+ path: '/account/keys',
39
+ query: { key: pubkey }
40
+ )["key"]
41
+ end
42
+
43
+ def self.get(id)
44
+ new json_request(
45
+ method: :get,
46
+ expects: 200,
47
+ path: "/account/keys/#{id}"
48
+ )["key"]
49
+ end
50
+
51
+ def self.all(options={})
52
+ json_request(
53
+ method: :get,
54
+ expects: 200,
55
+ path: '/account/keys',
56
+ query: options
57
+ ).map { |hsh| new(hsh["key"]) }
58
+ end
59
+
60
+ def self.destroy(options={})
61
+ request(
62
+ method: :delete,
63
+ expects: 200,
64
+ path: "/account/keys/#{options[:id]}"
65
+ )
66
+ end
67
+
68
+ class << self
69
+ private :new
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,18 @@
1
+ require 'dawn/api/base_api'
2
+
3
+ module Dawn
4
+ class User
5
+
6
+ include BaseApi
7
+
8
+ def self.login(options={})
9
+ json_request(
10
+ expects: 200,
11
+ method: :post,
12
+ path: '/login',
13
+ body: options.to_json
14
+ )
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Dawn
2
+ module API
3
+ module Version
4
+ MAJOR = 0
5
+ MINOR = 9
6
+ PATCH = 0
7
+ BUILD = nil
8
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join(".").freeze
9
+ end
10
+ # backward compatibility
11
+ VERSION = Version::STRING
12
+ end
13
+ end
data/lib/dawn/api.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'json'
2
+
3
+ require 'dawn/api/version'
4
+ require 'dawn/api/authenticate'
5
+ require 'dawn/api/app'
6
+ require 'dawn/api/domain'
7
+ require 'dawn/api/drain'
8
+ require 'dawn/api/gear'
9
+ require 'dawn/api/key'
10
+ require 'dawn/api/login'
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dawn-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Blaž Hrastnik
8
+ - Corey Powell
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: excon
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.34'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '0.34'
28
+ - !ruby/object:Gem::Dependency
29
+ name: json
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.8'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.8'
42
+ - !ruby/object:Gem::Dependency
43
+ name: netrc
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0.7'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.7'
56
+ - !ruby/object:Gem::Dependency
57
+ name: sshkey
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.6'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.6'
70
+ description: Dawn Client API
71
+ email:
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/dawn/api.rb
77
+ - lib/dawn/api/app.rb
78
+ - lib/dawn/api/app/domains.rb
79
+ - lib/dawn/api/app/drains.rb
80
+ - lib/dawn/api/app/env.rb
81
+ - lib/dawn/api/app/gears.rb
82
+ - lib/dawn/api/authenticate.rb
83
+ - lib/dawn/api/base_api.rb
84
+ - lib/dawn/api/domain.rb
85
+ - lib/dawn/api/drain.rb
86
+ - lib/dawn/api/gear.rb
87
+ - lib/dawn/api/hosts.rb
88
+ - lib/dawn/api/key.rb
89
+ - lib/dawn/api/login.rb
90
+ - lib/dawn/api/version.rb
91
+ homepage: https://github.com/dawn/dawn-api
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.2.2
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Dawn API
115
+ test_files: []
116
+ has_rdoc: