ruroku 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +18 -1
- data/README.md +51 -1
- data/TODO.md +0 -2
- data/lib/ruroku.rb +23 -30
- data/lib/ruroku/api.rb +6 -2
- data/lib/ruroku/app.rb +46 -0
- data/lib/ruroku/base.rb +17 -2
- data/lib/ruroku/config_var.rb +13 -0
- data/lib/ruroku/nested_base.rb +1 -2
- data/lib/ruroku/release.rb +15 -0
- data/lib/ruroku/resource_sets.rb +12 -0
- data/lib/ruroku/{addon_set.rb → resource_sets/addon_set.rb} +1 -1
- data/lib/ruroku/resource_sets/app_set.rb +24 -0
- data/lib/ruroku/{collaborator_set.rb → resource_sets/collaborator_set.rb} +11 -0
- data/lib/ruroku/{config_var_set.rb → resource_sets/config_var_set.rb} +11 -0
- data/lib/ruroku/{domain_set.rb → resource_sets/domain_set.rb} +0 -0
- data/lib/ruroku/{key_set.rb → resource_sets/key_set.rb} +0 -0
- data/lib/ruroku/{nested_resource_set.rb → resource_sets/nested_resource_set.rb} +0 -0
- data/lib/ruroku/resource_sets/process_set.rb +38 -0
- data/lib/ruroku/resource_sets/release_set.rb +33 -0
- data/lib/ruroku/{resource_set.rb → resource_sets/resource_set.rb} +38 -7
- data/lib/ruroku/{stack_set.rb → resource_sets/stack_set.rb} +0 -0
- data/lib/ruroku/version.rb +1 -1
- data/ruroku.gemspec +5 -5
- data/spec/helpers/release.rb +4 -0
- data/spec/ruroku/api_spec.rb +12 -0
- data/spec/ruroku/app_spec.rb +14 -0
- data/spec/ruroku/config_var_set_spec.rb +31 -0
- data/spec/ruroku/release_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -1
- metadata +20 -15
- data/lib/ruroku/app_set.rb +0 -13
- data/lib/ruroku/process_set.rb +0 -20
- data/lib/ruroku/release_set.rb +0 -13
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
-
##
|
1
|
+
## Ruroku 0.0.3 (Jun 12, 2012)
|
2
|
+
|
3
|
+
* Added alternative app finder: `heroku['app-name']`
|
4
|
+
* Added release range finder: `releases[1..10]`
|
5
|
+
* Added release finder: `releases[2]` and `releases['v2']`
|
6
|
+
* Added process finder, which can return specific process or process
|
7
|
+
group: `processes['web.1']` and `processes['web']`
|
8
|
+
* Added app, collaborator finders, now possible to `apps['app-name']` or
|
9
|
+
`collaborators['email@me.com']`
|
10
|
+
* Added logs access
|
11
|
+
* Added config var access convenience method `#[]`, so it's possible to
|
12
|
+
`app.config_vars['KEY']` to get specific `Ruroku::ConfigVar`
|
13
|
+
* Added `#rollback` to `Ruroku::Release`
|
14
|
+
* Added ability to rename apps
|
15
|
+
* Added ability to transfer app ownership
|
16
|
+
* Added ability to delete apps
|
17
|
+
|
18
|
+
## Ruroku 0.0.2 (Jun 10, 2012)
|
2
19
|
|
3
20
|
* Added collection reloading
|
4
21
|
* Added collection caching
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![Dependency Status](https://gemnasium.com/goshakkk/ruroku.png?travis)](https://gemnasium.com/goshakkk/ruroku)
|
4
4
|
|
5
5
|
The better Ruby client for Heroku API, built on top of official
|
6
|
-
`heroku.rb` gem.
|
6
|
+
[`heroku.rb`](https://github.com/heroku/heroku.rb) gem.
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -48,6 +48,14 @@ To get specific app:
|
|
48
48
|
|
49
49
|
```ruby
|
50
50
|
app = heroku.app 'app-name'
|
51
|
+
|
52
|
+
# or:
|
53
|
+
|
54
|
+
app = heroku.apps['app-name']
|
55
|
+
|
56
|
+
# or even:
|
57
|
+
|
58
|
+
app = heroku['app-name']
|
51
59
|
```
|
52
60
|
|
53
61
|
And access its properties such as:
|
@@ -117,6 +125,12 @@ List all app collaborators:
|
|
117
125
|
collaborators = app.collaborators
|
118
126
|
```
|
119
127
|
|
128
|
+
get a specific collaborator:
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
collaborators['guy@me.com']
|
132
|
+
```
|
133
|
+
|
120
134
|
and
|
121
135
|
|
122
136
|
```ruby
|
@@ -154,6 +168,13 @@ They can also be updated like that:
|
|
154
168
|
config_var.value = 'new value'
|
155
169
|
```
|
156
170
|
|
171
|
+
Get/set a specific var:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
config_vars['DEBUG'] # => false
|
175
|
+
config_vars['DEBUG'] = true
|
176
|
+
```
|
177
|
+
|
157
178
|
And it'll instantly get updated.
|
158
179
|
|
159
180
|
### Domains
|
@@ -193,6 +214,13 @@ processes.stop 'ps' => 'run.1'
|
|
193
214
|
processes.stop 'type' => 'worker'
|
194
215
|
```
|
195
216
|
|
217
|
+
And access specific processes/process groups:
|
218
|
+
|
219
|
+
```ruby
|
220
|
+
processes['web.1']
|
221
|
+
processes['web']
|
222
|
+
```
|
223
|
+
|
196
224
|
### Releases
|
197
225
|
|
198
226
|
List all app releases:
|
@@ -201,10 +229,24 @@ List all app releases:
|
|
201
229
|
releases = app.releases
|
202
230
|
```
|
203
231
|
|
232
|
+
Get specific release:
|
233
|
+
|
234
|
+
```ruby
|
235
|
+
releases[2]
|
236
|
+
releases['v2']
|
237
|
+
```
|
238
|
+
|
239
|
+
Or a range of releases:
|
240
|
+
|
241
|
+
```ruby
|
242
|
+
releases[1..10]
|
243
|
+
```
|
244
|
+
|
204
245
|
And rollback to any release:
|
205
246
|
|
206
247
|
```ruby
|
207
248
|
releases.rollback 'v1'
|
249
|
+
release.rollback
|
208
250
|
```
|
209
251
|
|
210
252
|
### Stacks
|
@@ -221,6 +263,14 @@ Migrate the app to available stack:
|
|
221
263
|
stacks.migrate 'stack-name'
|
222
264
|
```
|
223
265
|
|
266
|
+
### Logs
|
267
|
+
|
268
|
+
Get the Array of String log lines:
|
269
|
+
|
270
|
+
```ruby
|
271
|
+
app.logs
|
272
|
+
```
|
273
|
+
|
224
274
|
### User
|
225
275
|
|
226
276
|
Get User object associtaed with current heroku account:
|
data/TODO.md
CHANGED
data/lib/ruroku.rb
CHANGED
@@ -1,35 +1,28 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require 'time'
|
2
|
+
require 'net/http'
|
3
|
+
require 'heroku-api'
|
4
|
+
require 'virtus'
|
5
|
+
require 'active_support/core_ext/numeric'
|
6
|
+
require 'active_support/core_ext/string'
|
6
7
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require "ruroku/resource_set"
|
10
|
-
require "ruroku/nested_resource_set"
|
8
|
+
require 'ruroku/base'
|
9
|
+
require 'ruroku/nested_base'
|
11
10
|
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
|
24
|
-
require
|
25
|
-
|
26
|
-
require
|
27
|
-
require "ruroku/stack"
|
28
|
-
require "ruroku/stack_set"
|
29
|
-
require "ruroku/user"
|
30
|
-
require "ruroku/key"
|
31
|
-
require "ruroku/key_set"
|
32
|
-
require "ruroku/version"
|
11
|
+
require 'ruroku/api'
|
12
|
+
require 'ruroku/app'
|
13
|
+
require 'ruroku/addon'
|
14
|
+
require 'ruroku/collaborator'
|
15
|
+
require 'ruroku/config_var'
|
16
|
+
require 'ruroku/domain'
|
17
|
+
require 'ruroku/process'
|
18
|
+
require 'ruroku/release'
|
19
|
+
require 'ruroku/stack'
|
20
|
+
require 'ruroku/user'
|
21
|
+
require 'ruroku/key'
|
22
|
+
|
23
|
+
require 'ruroku/resource_sets'
|
24
|
+
|
25
|
+
require 'ruroku/version'
|
33
26
|
|
34
27
|
module Ruroku
|
35
28
|
end
|
data/lib/ruroku/api.rb
CHANGED
@@ -7,16 +7,20 @@ module Ruroku
|
|
7
7
|
end
|
8
8
|
|
9
9
|
# Public: Get apps associated with current heroku account.
|
10
|
-
#
|
11
|
-
# Returns the Array[App].
|
12
10
|
def apps
|
13
11
|
@apps ||= AppSet.new heroku_api
|
14
12
|
end
|
15
13
|
|
16
14
|
# Public: Get specific app.
|
15
|
+
#
|
16
|
+
# Examples
|
17
|
+
#
|
18
|
+
# heroku.app 'app-name'
|
19
|
+
# heroku['app-name']
|
17
20
|
def app(app_name)
|
18
21
|
App.new heroku_api, heroku_api.get_app(app_name).body
|
19
22
|
end
|
23
|
+
alias :[] :app
|
20
24
|
|
21
25
|
# Public: Get keys associated with current heroku account.
|
22
26
|
def keys
|
data/lib/ruroku/app.rb
CHANGED
@@ -50,6 +50,27 @@ module Ruroku
|
|
50
50
|
@stacks ||= StackSet.new self
|
51
51
|
end
|
52
52
|
|
53
|
+
# Public: Get app logs.
|
54
|
+
#
|
55
|
+
# Examples
|
56
|
+
#
|
57
|
+
# app.logs
|
58
|
+
#
|
59
|
+
# Returns the Array of String log lines.
|
60
|
+
def logs
|
61
|
+
log_url = api.get_logs(name).body
|
62
|
+
log_uri = URI.parse log_url
|
63
|
+
|
64
|
+
http = Net::HTTP.new log_uri.host, log_uri.port
|
65
|
+
http.use_ssl = true
|
66
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
67
|
+
request = Net::HTTP::Get.new log_uri.request_uri
|
68
|
+
|
69
|
+
data = http.request request
|
70
|
+
|
71
|
+
data.body.split "\n"
|
72
|
+
end
|
73
|
+
|
53
74
|
# Public: Turn the maintenance mode on.
|
54
75
|
def maintenance!
|
55
76
|
api.post_app_maintenance name, '1'
|
@@ -59,5 +80,30 @@ module Ruroku
|
|
59
80
|
def no_maintenance!
|
60
81
|
api.post_app_maintenance name, '0'
|
61
82
|
end
|
83
|
+
|
84
|
+
# Public: Rename the app.
|
85
|
+
#
|
86
|
+
# Examples
|
87
|
+
#
|
88
|
+
# app.rename 'new-name'
|
89
|
+
def rename(new_name)
|
90
|
+
api.put_app name, name: new_name
|
91
|
+
self.name = new_name
|
92
|
+
end
|
93
|
+
|
94
|
+
# Public: Transfer app ownership.
|
95
|
+
#
|
96
|
+
# Examples
|
97
|
+
#
|
98
|
+
# app.transfer_ownership 'new_owner@me.com'
|
99
|
+
def transfer_ownership(new_owner)
|
100
|
+
api.put_app name, transfer_owner: new_owner
|
101
|
+
end
|
102
|
+
|
103
|
+
def delete!
|
104
|
+
api_method = "delete_app"
|
105
|
+
resource_id = name
|
106
|
+
api.send api_method, name, resource_id
|
107
|
+
end
|
62
108
|
end
|
63
109
|
end
|
data/lib/ruroku/base.rb
CHANGED
@@ -11,6 +11,17 @@ module Ruroku
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# Public: Define resource id key.
|
14
|
+
# It's used to represent the resource when talking to API. (It might be
|
15
|
+
# the name of the app for App object, the email for Collaborator object,
|
16
|
+
# and so on.)
|
17
|
+
#
|
18
|
+
# Examples
|
19
|
+
#
|
20
|
+
# class App < Base
|
21
|
+
# attr_accessor :name
|
22
|
+
#
|
23
|
+
# resource_id :name
|
24
|
+
# end
|
14
25
|
def self.resource_id(id_key = nil)
|
15
26
|
if id_key
|
16
27
|
@_resource_id = id_key
|
@@ -19,9 +30,13 @@ module Ruroku
|
|
19
30
|
end
|
20
31
|
end
|
21
32
|
|
33
|
+
# Public: Get the value of resource id.
|
34
|
+
def resource_id
|
35
|
+
send self.class.resource_id
|
36
|
+
end
|
37
|
+
|
22
38
|
def inspect
|
23
|
-
if
|
24
|
-
resource_id = send self.class.resource_id
|
39
|
+
if resource_id
|
25
40
|
"<#{self.class} #{resource_id}>"
|
26
41
|
else
|
27
42
|
"<#{self.class}>"
|
data/lib/ruroku/config_var.rb
CHANGED
@@ -6,6 +6,19 @@ module Ruroku
|
|
6
6
|
resource_id :key
|
7
7
|
deletable_resource
|
8
8
|
|
9
|
+
# Public: Set a ConfigVar value.
|
10
|
+
# Sets instance variable if current value is nil.
|
11
|
+
# If curren value is present, queries the api to update current var's
|
12
|
+
# value, and updates instance variable.
|
13
|
+
#
|
14
|
+
# Examples
|
15
|
+
#
|
16
|
+
# config_var = ConfigVar.new app # empty config var
|
17
|
+
# config_var.key = 'KEY'
|
18
|
+
# config_var.value = 'value' # doesn't send an api request
|
19
|
+
#
|
20
|
+
# config_var = app.config_vars['KEY'] # non-empty config var
|
21
|
+
# config_var.value = 'value' # sends the api request & updates i-var
|
9
22
|
def value=(new_value)
|
10
23
|
if @value.nil?
|
11
24
|
@value = new_value
|
data/lib/ruroku/nested_base.rb
CHANGED
@@ -8,13 +8,12 @@ module Ruroku
|
|
8
8
|
super app.api, attributes
|
9
9
|
end
|
10
10
|
|
11
|
-
# Public:
|
11
|
+
# Public: Declare nested resource as deletable.
|
12
12
|
def self.deletable_resource
|
13
13
|
resource_name = name.demodulize.underscore
|
14
14
|
|
15
15
|
define_method :delete! do
|
16
16
|
api_method = "delete_#{resource_name}"
|
17
|
-
resource_id = send self.class.resource_id
|
18
17
|
api.send api_method, app.name, resource_id
|
19
18
|
end
|
20
19
|
end
|
data/lib/ruroku/release.rb
CHANGED
@@ -10,5 +10,20 @@ module Ruroku
|
|
10
10
|
attribute :created_at, Time
|
11
11
|
|
12
12
|
resource_id :name
|
13
|
+
|
14
|
+
# Public: Rollback to specific release.
|
15
|
+
#
|
16
|
+
# Examples
|
17
|
+
#
|
18
|
+
# release.rollback
|
19
|
+
def rollback
|
20
|
+
api.post_release app.name, name
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Convert the release to Integer.
|
24
|
+
# Returns the release version number.
|
25
|
+
def to_i
|
26
|
+
name[1..-1]
|
27
|
+
end
|
13
28
|
end
|
14
29
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'ruroku/resource_sets/resource_set'
|
2
|
+
require 'ruroku/resource_sets/nested_resource_set'
|
3
|
+
|
4
|
+
require 'ruroku/resource_sets/app_set'
|
5
|
+
require 'ruroku/resource_sets/addon_set'
|
6
|
+
require 'ruroku/resource_sets/collaborator_set'
|
7
|
+
require 'ruroku/resource_sets/config_var_set'
|
8
|
+
require 'ruroku/resource_sets/domain_set'
|
9
|
+
require 'ruroku/resource_sets/key_set'
|
10
|
+
require 'ruroku/resource_sets/process_set'
|
11
|
+
require 'ruroku/resource_sets/release_set'
|
12
|
+
require 'ruroku/resource_sets/stack_set'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Ruroku
|
2
|
+
class AppSet < ResourceSet
|
3
|
+
resource_class App
|
4
|
+
collection_api_selector :get_apps
|
5
|
+
|
6
|
+
# Map API methods to collection methods.
|
7
|
+
#
|
8
|
+
# Examples
|
9
|
+
#
|
10
|
+
# apps.create name: 'another-app', stack: 'cedar'
|
11
|
+
map_api create: :post_app
|
12
|
+
|
13
|
+
# Public: Find an App with specified name.
|
14
|
+
#
|
15
|
+
# Examples
|
16
|
+
#
|
17
|
+
# apps['test-app']
|
18
|
+
#
|
19
|
+
# Returns the App object.
|
20
|
+
def [](app_name)
|
21
|
+
select { |app| app.name == app_name }.first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -11,5 +11,16 @@ module Ruroku
|
|
11
11
|
# collaborators.delete 'collaborator-email'
|
12
12
|
map_api add: :post_collaborator,
|
13
13
|
delete: :delete_collaborator
|
14
|
+
|
15
|
+
# Public: Find a Collaborator with specified email.
|
16
|
+
#
|
17
|
+
# Examples
|
18
|
+
#
|
19
|
+
# collaborators['guy@me.com']
|
20
|
+
#
|
21
|
+
# Returns the Collaborator object.
|
22
|
+
def [](collaborator_email)
|
23
|
+
select { |collaborator| collaborator.email == collaborator_email }.first
|
24
|
+
end
|
14
25
|
end
|
15
26
|
end
|
@@ -11,5 +11,16 @@ module Ruroku
|
|
11
11
|
# config_vars.delete 'KEY'
|
12
12
|
map_api add: :post_config_vars,
|
13
13
|
delete: :delete_config_var
|
14
|
+
|
15
|
+
# Public: Find a ConfigVar with specified name.
|
16
|
+
#
|
17
|
+
# Examples
|
18
|
+
#
|
19
|
+
# config_vars['DEBUG']
|
20
|
+
#
|
21
|
+
# Returns the ConfigVar object.
|
22
|
+
def [](var_name)
|
23
|
+
select { |var| var.key == var_name }.first
|
24
|
+
end
|
14
25
|
end
|
15
26
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Ruroku
|
2
|
+
class ProcessSet < NestedResourceSet
|
3
|
+
resource_class Process
|
4
|
+
collection_api_selector :get_ps
|
5
|
+
|
6
|
+
# Map API methods to collection methods.
|
7
|
+
#
|
8
|
+
# Examples
|
9
|
+
#
|
10
|
+
# processes.run 'rake task'
|
11
|
+
# processes.restart
|
12
|
+
# processes.scale 'web', 10
|
13
|
+
# processes.stop 'ps' => 'web.1'
|
14
|
+
# processes.stop 'type' => 'web'
|
15
|
+
map_api run: :post_ps,
|
16
|
+
restart: :post_ps_restart,
|
17
|
+
scale: :ps_scale,
|
18
|
+
stop: :post_ps_stop
|
19
|
+
|
20
|
+
# Public: Find either a process when specified full process name,
|
21
|
+
# or a collection of processes, if specified a process type.
|
22
|
+
#
|
23
|
+
# Examples
|
24
|
+
#
|
25
|
+
# processes['web.1']
|
26
|
+
# processes['web']
|
27
|
+
#
|
28
|
+
# Returns the ProcessSet object if process type was passed, the
|
29
|
+
# Process object otherwise.
|
30
|
+
def [](process_name)
|
31
|
+
if process_name.include? '.'
|
32
|
+
select { |process| process.type == process_name }
|
33
|
+
else
|
34
|
+
select { |process| process.process == process_name }.first
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Ruroku
|
2
|
+
class ReleaseSet < NestedResourceSet
|
3
|
+
resource_class Release
|
4
|
+
collection_api_selector :get_releases
|
5
|
+
|
6
|
+
# Map API methods to collection methods.
|
7
|
+
#
|
8
|
+
# Examples
|
9
|
+
#
|
10
|
+
# releases.rollback 'v1'
|
11
|
+
map_api rollback: :post_release
|
12
|
+
|
13
|
+
# Public: Find the specified release.
|
14
|
+
#
|
15
|
+
# Examples
|
16
|
+
#
|
17
|
+
# releases[2]
|
18
|
+
# releases['v2']
|
19
|
+
# releases[1..10]
|
20
|
+
#
|
21
|
+
# Returns the ReleaseSet object if range of release numbers is passed,
|
22
|
+
# the Release object otherwise.
|
23
|
+
def [](release_name)
|
24
|
+
if release_name.instance_of? Range
|
25
|
+
select { |release| release_name.include? release.to_i }
|
26
|
+
else
|
27
|
+
release_name = "v#{release_name}" if release.instance_of? Fixnum
|
28
|
+
|
29
|
+
select { |release| release.name == release_name }.first
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -20,7 +20,7 @@ module Ruroku
|
|
20
20
|
query_collection_objects
|
21
21
|
end
|
22
22
|
|
23
|
-
#
|
23
|
+
# Internal: Query collection objects from API.
|
24
24
|
def query_collection_objects
|
25
25
|
collection_objects = api.send(self.class.collection_api_selector, *collection_query_params).body
|
26
26
|
|
@@ -35,27 +35,47 @@ module Ruroku
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
#
|
38
|
+
# Internal: Build a resource from response.
|
39
39
|
def build_resource(response)
|
40
40
|
resource_class = self.class.resource_class
|
41
|
-
resource_class.new response
|
41
|
+
resource_class.new api, response
|
42
42
|
end
|
43
43
|
|
44
|
-
#
|
44
|
+
# Internal: Get params for querying collection.
|
45
45
|
def collection_query_params
|
46
46
|
[]
|
47
47
|
end
|
48
48
|
|
49
49
|
# Public: Set or get a collection API selector.
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
# This selector method is then applied on the API object in order to
|
51
|
+
# get collection objects.
|
52
|
+
#
|
53
|
+
# selector - The Symbol api selector.
|
54
|
+
#
|
55
|
+
# Examples
|
56
|
+
#
|
57
|
+
# class KeySet < ResourceSet
|
58
|
+
# resource_class Key
|
59
|
+
# collection_api_selector :get_keys
|
60
|
+
# end
|
61
|
+
def self.collection_api_selector(selector = nil)
|
62
|
+
if selector
|
63
|
+
@_collection_api_selector = selector
|
53
64
|
else
|
54
65
|
@_collection_api_selector
|
55
66
|
end
|
56
67
|
end
|
57
68
|
|
58
69
|
# Public: Set or get a collection resource class.
|
70
|
+
# Once collection was queried, the response is processed and
|
71
|
+
# resources are created with resource class.
|
72
|
+
#
|
73
|
+
# Examples
|
74
|
+
#
|
75
|
+
# class KeySet < ResourceSet
|
76
|
+
# resource_class Key
|
77
|
+
# collection_api_selector :get_keys
|
78
|
+
# end
|
59
79
|
def self.resource_class(klass = nil)
|
60
80
|
if klass
|
61
81
|
@_resource_class = klass
|
@@ -64,6 +84,17 @@ module Ruroku
|
|
64
84
|
end
|
65
85
|
end
|
66
86
|
|
87
|
+
# Public: Create mappings "set method -> api method".
|
88
|
+
#
|
89
|
+
# methods - The Hash of set method -> api method mappings.
|
90
|
+
#
|
91
|
+
# Examples
|
92
|
+
#
|
93
|
+
# class KeySet < ResourceSet
|
94
|
+
# map_api add: :post_key
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
# So now, when we call #add on KeySet, api#post_key is executed.
|
67
98
|
def self.map_api(methods)
|
68
99
|
methods.each do |method_name, api_mapping|
|
69
100
|
define_method method_name do |*args|
|
File without changes
|
data/lib/ruroku/version.rb
CHANGED
data/ruroku.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
require File.expand_path('../lib/ruroku/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = [
|
6
|
-
gem.email = [
|
5
|
+
gem.authors = ['Gosha Arinich']
|
6
|
+
gem.email = ['me@goshakkk.name']
|
7
7
|
gem.description = %q{The better Ruby client for the Heroku API}
|
8
8
|
gem.summary = %q{The better Ruby client for the Heroku API}
|
9
|
-
gem.homepage =
|
9
|
+
gem.homepage = ''
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
13
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
14
|
+
gem.name = 'ruroku'
|
15
|
+
gem.require_paths = ['lib']
|
16
16
|
gem.version = Ruroku::VERSION
|
17
17
|
|
18
18
|
gem.add_runtime_dependency 'heroku-api', '~> 0.2'
|
data/spec/helpers/release.rb
CHANGED
data/spec/ruroku/api_spec.rb
CHANGED
@@ -28,6 +28,18 @@ describe Ruroku::API do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
describe '#[]' do
|
32
|
+
it 'gets app from api' do
|
33
|
+
heroku.should_receive(:get_app)
|
34
|
+
api['test-app']
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns app' do
|
38
|
+
app = api['test-app']
|
39
|
+
app.instance_of?(Ruroku::App).should be_true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
31
43
|
describe '#keys' do
|
32
44
|
it 'gets keys from api' do
|
33
45
|
heroku.should_receive(:get_keys)
|
data/spec/ruroku/app_spec.rb
CHANGED
@@ -110,4 +110,18 @@ describe Ruroku::App do
|
|
110
110
|
@app.no_maintenance!
|
111
111
|
end
|
112
112
|
end
|
113
|
+
|
114
|
+
describe '#rename' do
|
115
|
+
it 'renames the app' do
|
116
|
+
heroku.should_receive(:put_app).with(@app.name, name: 'new-app')
|
117
|
+
@app.rename 'new-app'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#transfer_ownership' do
|
122
|
+
it 'transfers app ownership' do
|
123
|
+
heroku.should_receive(:put_app).with(@app.name, transfer_owner: 'new_owner@me.com')
|
124
|
+
@app.transfer_ownership 'new_owner@me.com'
|
125
|
+
end
|
126
|
+
end
|
113
127
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ruroku::ConfigVarSet do
|
4
|
+
before do
|
5
|
+
@set = Ruroku::ConfigVarSet.new stubbed_app
|
6
|
+
@set_api = @set.api
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#add' do
|
10
|
+
it 'maps to post_config_vars api method' do
|
11
|
+
@set_api.should_receive :post_config_vars
|
12
|
+
@set.add 'KEY' => 'value'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#delete' do
|
17
|
+
it 'maps to delete_config_var api method' do
|
18
|
+
@set_api.should_receive :delete_config_var
|
19
|
+
@set.delete 'KEY'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#[]' do
|
24
|
+
it 'finds specified ConfigVar' do
|
25
|
+
config_var = @set['KEY1']
|
26
|
+
config_var.key.should == 'KEY1'
|
27
|
+
config_var.value.should == 'value'
|
28
|
+
config_var.should == @set.first
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ruroku::Release do
|
4
|
+
before do
|
5
|
+
@release = Ruroku::Release.new stubbed_app, name: 'v2'
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#rollback' do
|
9
|
+
it 'rollbacks to given release' do
|
10
|
+
@release.api.should_receive(:post_release).with @release.app.name, @release.name
|
11
|
+
@release.rollback
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruroku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: heroku-api
|
@@ -77,28 +77,29 @@ files:
|
|
77
77
|
- TODO.md
|
78
78
|
- lib/ruroku.rb
|
79
79
|
- lib/ruroku/addon.rb
|
80
|
-
- lib/ruroku/addon_set.rb
|
81
80
|
- lib/ruroku/api.rb
|
82
81
|
- lib/ruroku/app.rb
|
83
|
-
- lib/ruroku/app_set.rb
|
84
82
|
- lib/ruroku/base.rb
|
85
83
|
- lib/ruroku/collaborator.rb
|
86
|
-
- lib/ruroku/collaborator_set.rb
|
87
84
|
- lib/ruroku/config_var.rb
|
88
|
-
- lib/ruroku/config_var_set.rb
|
89
85
|
- lib/ruroku/domain.rb
|
90
|
-
- lib/ruroku/domain_set.rb
|
91
86
|
- lib/ruroku/key.rb
|
92
|
-
- lib/ruroku/key_set.rb
|
93
87
|
- lib/ruroku/nested_base.rb
|
94
|
-
- lib/ruroku/nested_resource_set.rb
|
95
88
|
- lib/ruroku/process.rb
|
96
|
-
- lib/ruroku/process_set.rb
|
97
89
|
- lib/ruroku/release.rb
|
98
|
-
- lib/ruroku/
|
99
|
-
- lib/ruroku/
|
90
|
+
- lib/ruroku/resource_sets.rb
|
91
|
+
- lib/ruroku/resource_sets/addon_set.rb
|
92
|
+
- lib/ruroku/resource_sets/app_set.rb
|
93
|
+
- lib/ruroku/resource_sets/collaborator_set.rb
|
94
|
+
- lib/ruroku/resource_sets/config_var_set.rb
|
95
|
+
- lib/ruroku/resource_sets/domain_set.rb
|
96
|
+
- lib/ruroku/resource_sets/key_set.rb
|
97
|
+
- lib/ruroku/resource_sets/nested_resource_set.rb
|
98
|
+
- lib/ruroku/resource_sets/process_set.rb
|
99
|
+
- lib/ruroku/resource_sets/release_set.rb
|
100
|
+
- lib/ruroku/resource_sets/resource_set.rb
|
101
|
+
- lib/ruroku/resource_sets/stack_set.rb
|
100
102
|
- lib/ruroku/stack.rb
|
101
|
-
- lib/ruroku/stack_set.rb
|
102
103
|
- lib/ruroku/user.rb
|
103
104
|
- lib/ruroku/version.rb
|
104
105
|
- ruroku.gemspec
|
@@ -117,11 +118,13 @@ files:
|
|
117
118
|
- spec/ruroku/app_set_spec.rb
|
118
119
|
- spec/ruroku/app_spec.rb
|
119
120
|
- spec/ruroku/collaborator_set_spec.rb
|
121
|
+
- spec/ruroku/config_var_set_spec.rb
|
120
122
|
- spec/ruroku/domain_set_spec.rb
|
121
123
|
- spec/ruroku/key_set_spec.rb
|
122
124
|
- spec/ruroku/nested_resource_set_spec.rb
|
123
125
|
- spec/ruroku/process_set_spec.rb
|
124
126
|
- spec/ruroku/release_set_spec.rb
|
127
|
+
- spec/ruroku/release_spec.rb
|
125
128
|
- spec/ruroku/resource_set_spec.rb
|
126
129
|
- spec/ruroku/stack_set_spec.rb
|
127
130
|
- spec/spec_helper.rb
|
@@ -139,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
142
|
version: '0'
|
140
143
|
segments:
|
141
144
|
- 0
|
142
|
-
hash:
|
145
|
+
hash: 1691846107109911657
|
143
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
147
|
none: false
|
145
148
|
requirements:
|
@@ -148,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
151
|
version: '0'
|
149
152
|
segments:
|
150
153
|
- 0
|
151
|
-
hash:
|
154
|
+
hash: 1691846107109911657
|
152
155
|
requirements: []
|
153
156
|
rubyforge_project:
|
154
157
|
rubygems_version: 1.8.23
|
@@ -171,11 +174,13 @@ test_files:
|
|
171
174
|
- spec/ruroku/app_set_spec.rb
|
172
175
|
- spec/ruroku/app_spec.rb
|
173
176
|
- spec/ruroku/collaborator_set_spec.rb
|
177
|
+
- spec/ruroku/config_var_set_spec.rb
|
174
178
|
- spec/ruroku/domain_set_spec.rb
|
175
179
|
- spec/ruroku/key_set_spec.rb
|
176
180
|
- spec/ruroku/nested_resource_set_spec.rb
|
177
181
|
- spec/ruroku/process_set_spec.rb
|
178
182
|
- spec/ruroku/release_set_spec.rb
|
183
|
+
- spec/ruroku/release_spec.rb
|
179
184
|
- spec/ruroku/resource_set_spec.rb
|
180
185
|
- spec/ruroku/stack_set_spec.rb
|
181
186
|
- spec/spec_helper.rb
|
data/lib/ruroku/app_set.rb
DELETED
data/lib/ruroku/process_set.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Ruroku
|
2
|
-
class ProcessSet < NestedResourceSet
|
3
|
-
resource_class Process
|
4
|
-
collection_api_selector :get_ps
|
5
|
-
|
6
|
-
# Map API methods to collection methods.
|
7
|
-
#
|
8
|
-
# Examples
|
9
|
-
#
|
10
|
-
# processes.run 'rake task'
|
11
|
-
# processes.restart
|
12
|
-
# processes.scale 'web', 10
|
13
|
-
# processes.stop 'ps' => 'web.1'
|
14
|
-
# processes.stop 'type' => 'web'
|
15
|
-
map_api run: :post_ps,
|
16
|
-
restart: :post_ps_restart,
|
17
|
-
scale: :ps_scale,
|
18
|
-
stop: :post_ps_stop
|
19
|
-
end
|
20
|
-
end
|
data/lib/ruroku/release_set.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
module Ruroku
|
2
|
-
class ReleaseSet < NestedResourceSet
|
3
|
-
resource_class Release
|
4
|
-
collection_api_selector :get_releases
|
5
|
-
|
6
|
-
# Map API methods to collection methods.
|
7
|
-
#
|
8
|
-
# Examples
|
9
|
-
#
|
10
|
-
# releases.rollback 'v1'
|
11
|
-
map_api rollback: :post_release
|
12
|
-
end
|
13
|
-
end
|