ruroku 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/.travis.yml +5 -0
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +9 -0
  4. data/README.md +180 -48
  5. data/Rakefile +7 -1
  6. data/TODO.md +0 -4
  7. data/lib/ruroku.rb +9 -1
  8. data/lib/ruroku/addon.rb +8 -10
  9. data/lib/ruroku/addon_set.rb +4 -1
  10. data/lib/ruroku/api.rb +20 -1
  11. data/lib/ruroku/app.rb +29 -20
  12. data/lib/ruroku/app_set.rb +13 -0
  13. data/lib/ruroku/base.rb +20 -3
  14. data/lib/ruroku/collaborator.rb +5 -2
  15. data/lib/ruroku/collaborator_set.rb +4 -1
  16. data/lib/ruroku/config_var.rb +9 -2
  17. data/lib/ruroku/config_var_set.rb +5 -2
  18. data/lib/ruroku/domain.rb +8 -9
  19. data/lib/ruroku/domain_set.rb +4 -1
  20. data/lib/ruroku/key.rb +8 -0
  21. data/lib/ruroku/key_set.rb +17 -0
  22. data/lib/ruroku/nested_base.rb +3 -2
  23. data/lib/ruroku/nested_resource_set.rb +28 -0
  24. data/lib/ruroku/process.rb +14 -11
  25. data/lib/ruroku/process_set.rb +11 -28
  26. data/lib/ruroku/release.rb +9 -5
  27. data/lib/ruroku/release_set.rb +4 -1
  28. data/lib/ruroku/resource_set.rb +61 -6
  29. data/lib/ruroku/stack.rb +10 -0
  30. data/lib/ruroku/stack_set.rb +13 -0
  31. data/lib/ruroku/user.rb +15 -0
  32. data/lib/ruroku/version.rb +1 -1
  33. data/ruroku.gemspec +4 -5
  34. data/spec/helpers/addon.rb +12 -0
  35. data/spec/helpers/app.rb +18 -0
  36. data/spec/helpers/collaborator.rb +11 -0
  37. data/spec/helpers/config_var.rb +11 -0
  38. data/spec/helpers/domain.rb +13 -0
  39. data/spec/helpers/keys.rb +12 -0
  40. data/spec/helpers/process.rb +15 -0
  41. data/spec/helpers/release.rb +15 -0
  42. data/spec/helpers/stack.rb +11 -0
  43. data/spec/helpers/user.rb +15 -0
  44. data/spec/ruroku/addon_set_spec.rb +29 -0
  45. data/spec/ruroku/api_spec.rb +55 -0
  46. data/spec/ruroku/app_set_spec.rb +15 -0
  47. data/spec/ruroku/app_spec.rb +113 -0
  48. data/spec/ruroku/collaborator_set_spec.rb +22 -0
  49. data/spec/ruroku/domain_set_spec.rb +22 -0
  50. data/spec/ruroku/key_set_spec.rb +29 -0
  51. data/spec/ruroku/nested_resource_set_spec.rb +27 -0
  52. data/spec/ruroku/process_set_spec.rb +36 -0
  53. data/spec/ruroku/release_set_spec.rb +15 -0
  54. data/spec/ruroku/resource_set_spec.rb +26 -0
  55. data/spec/ruroku/stack_set_spec.rb +15 -0
  56. data/spec/spec_helper.rb +72 -0
  57. metadata +70 -15
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby-19mode
5
+ - rbx-19mode
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ ## Ruruku 0.0.2 (Jun 10, 2012)
2
+
3
+ * Added collection reloading
4
+ * Added collection caching
5
+ * Added support of keys
6
+ * Finding app by name
7
+ * Added support of stacks
8
+
9
+ ## Ruroku 0.0.1 (Jun 9, 2012)
10
+
11
+ * First public release (app, app addons, app collaborators, app config
12
+ vars, app domains, app processes, app releases, app stacks)
data/Gemfile CHANGED
@@ -1,3 +1,12 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ platform :jruby do
6
+ gem 'jruby-openssl'
7
+ end
8
+
9
+ group :development, :test do
10
+ gem 'rake'
11
+ gem 'rspec'
12
+ end
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # Ruroku
2
+ [![Build Status](https://secure.travis-ci.org/goshakkk/ruroku.png)](http://travis-ci.org/goshakkk/ruroku)
3
+ [![Dependency Status](https://gemnasium.com/goshakkk/ruroku.png?travis)](https://gemnasium.com/goshakkk/ruroku)
2
4
 
3
- The Ruby client for Heroku API, built on top of official `heroku.rb`
4
- gem.
5
+ The better Ruby client for Heroku API, built on top of official
6
+ `heroku.rb` gem.
5
7
 
6
8
  ## Installation
7
9
 
@@ -21,7 +23,9 @@ Or install it yourself as:
21
23
 
22
24
  Start by initiating a connection with Heroku API:
23
25
 
24
- heroku = Ruroku::API.new api_key: YOUR_HEROKU_API_KEY
26
+ ```ruby
27
+ heroku = Ruroku::API.new api_key: YOUR_HEROKU_API_KEY
28
+ ```
25
29
 
26
30
  (You can leave out `:api_key` if `ENV['HEROKU_API_KEY']` is set
27
31
  instead.)
@@ -33,106 +37,234 @@ Now you can interact with Heroku API using Ruroku.
33
37
  Each API object has apps associated with the Heroku account. You can
34
38
  access an Array of all the associated apps with `#apps`:
35
39
 
36
- heroku.apps
37
- # => [#<App>, #<App>, #<App>]
38
-
39
- app = heroku.apps.first
40
+ ```ruby
41
+ heroku.apps
42
+ # => [#<App>, #<App>, #<App>]
40
43
 
41
- You then can get additional app info:
44
+ app = heroku.apps.first
45
+ ```
42
46
 
43
- app.id
44
- app.name
45
- app.stack
46
- app.git_url
47
- app.slug_size
48
- app.repo_size
49
- app.dynos
50
- apps.workers
51
- # and a few less interesting ones
47
+ To get specific app:
48
+
49
+ ```ruby
50
+ app = heroku.app 'app-name'
51
+ ```
52
+
53
+ And access its properties such as:
54
+
55
+ * `id`
56
+ * `name`
57
+ * `stack`
58
+ * `git_url`
59
+ * `slug_size`
60
+ * `repo_size`
61
+ * `dynos`
62
+ * `workers`
52
63
 
53
64
  Maintenance mode can be turned on and off:
54
65
 
55
- app.maintenance!
56
- app.no_maintenance!
66
+ ```ruby
67
+ app.maintenance!
68
+ app.no_maintenance!
69
+ ```
57
70
 
58
- ### Addons
71
+ Also, imagine you've created another app after you you queried
72
+ `heroku.app`. To refresh collection of apps (or other collections:
73
+ addons, config vars, collaborators, and so on), just call `#reload` on
74
+ collection:
59
75
 
60
- To get a list of addons used by a particular app:
76
+ ```ruby
77
+ apps.reload
78
+ ```
61
79
 
62
- addons = app.addons
63
- # => [#<Addon>, #<Addon>, #<Addon>]
64
-
65
- addon = app.addons.first
80
+ ### Addons
66
81
 
67
- It's possible perform several actions on addon collections:
82
+ To get a list of addons used by a particular app:
68
83
 
69
- #### Add an addon
84
+ ```ruby
85
+ addons = app.addons
86
+ # => [#<Addon>, #<Addon>, #<Addon>]
70
87
 
71
- addons.add 'addon:plan'
88
+ addon = app.addons.first
89
+ ```
72
90
 
73
- #### Remove an addon
91
+ It's possible perform several actions on addon collections:
74
92
 
75
- addons.delete 'addon-name'
93
+ ```ruby
94
+ # Add an addon
95
+ addons.add 'addon:plan'
76
96
 
77
- #### Upgrade an addon
97
+ # Remove an addon
98
+ addons.delete 'addon-name'
78
99
 
79
- addons.upgrade 'addon:new-plan'
100
+ # Upgrade an addon
101
+ addons.upgrade 'addon:new-plan'
102
+ ```
80
103
 
81
104
  Each addon object is associated with the application. You can delete
82
105
  addons from the app by calling `#delete` method on the addon object as
83
106
  well:
84
107
 
85
- addon.delete!
108
+ ```ruby
109
+ addon.delete!
110
+ ```
86
111
 
87
112
  ### Collaborators
88
113
 
89
114
  List all app collaborators:
90
115
 
91
- collaborators = app.collaborators
116
+ ```ruby
117
+ collaborators = app.collaborators
118
+ ```
92
119
 
93
- #### Add a collaborator
120
+ and
94
121
 
95
- collaborators.add 'email@me.com'
122
+ ```ruby
123
+ # Add a collaborator
124
+ collaborators.add 'email@me.com'
96
125
 
97
- #### Remove a collaborator
126
+ # Remove a collaborator
127
+ collaborators.delete 'email@me.com'
128
+ # or
129
+ collaborator.delete!
130
+ ```
98
131
 
99
- collaborators.delete 'email@me.com'
132
+ ### Config variables
100
133
 
101
- or
134
+ List all app config vars:
102
135
 
103
- collaborator.delete!
136
+ ```ruby
137
+ config_vars = app.config_vars
138
+ ```
104
139
 
105
- ### Config variables
140
+ Add or delete a config var:
106
141
 
107
- List all app config vars:
142
+ ```ruby
143
+ config_vars.add 'KEY' => 'value'
144
+ config_vars.delete 'KEY'
145
+
146
+ # or:
147
+
148
+ config_var.delete!
149
+ ```
150
+
151
+ They can also be updated like that:
108
152
 
109
- app.config_vars
153
+ ```ruby
154
+ config_var.value = 'new value'
155
+ ```
156
+
157
+ And it'll instantly get updated.
110
158
 
111
159
  ### Domains
112
160
 
113
161
  Access domains used by the application:
114
162
 
115
- app.domains
163
+ ```ruby
164
+ domains = app.domains
165
+ ```
166
+
167
+ Same as with other collection objects, they can be added or deleted:
168
+
169
+ ```ruby
170
+ domains.add 'domain.com'
171
+ domains.delete 'domain.com'
172
+
173
+ # or:
174
+
175
+ domain.delete!
176
+ ```
116
177
 
117
178
  ### Processes
118
179
 
119
180
  Get current application processes:
120
181
 
121
- app.collaborators
182
+ ```ruby
183
+ processes = app.processes
184
+ ```
185
+
186
+ You can also run, restart, scale, and stop method collections:
187
+
188
+ ```ruby
189
+ processes.run 'rake evolve'
190
+ processes.restart
191
+ processes.scale 'worker', 10
192
+ processes.stop 'ps' => 'run.1'
193
+ processes.stop 'type' => 'worker'
194
+ ```
122
195
 
123
196
  ### Releases
124
197
 
125
198
  List all app releases:
126
199
 
127
- app.releases
200
+ ```ruby
201
+ releases = app.releases
202
+ ```
203
+
204
+ And rollback to any release:
205
+
206
+ ```ruby
207
+ releases.rollback 'v1'
208
+ ```
209
+
210
+ ### Stacks
211
+
212
+ List stacks, available for the app:
213
+
214
+ ```ruby
215
+ app.stacks
216
+ ```
217
+
218
+ Migrate the app to available stack:
219
+
220
+ ```ruby
221
+ stacks.migrate 'stack-name'
222
+ ```
223
+
224
+ ### User
225
+
226
+ Get User object associtaed with current heroku account:
227
+
228
+ ```ruby
229
+ heroku.user
230
+ ```
231
+
232
+ ### Keys
233
+
234
+ Access all keys:
235
+
236
+ ```ruby
237
+ keys = heroku.keys
238
+ ```
239
+
240
+ Add a key:
241
+
242
+ ```ruby
243
+ keys.add 'content of id_rsa.pub here...'
244
+ ```
245
+
246
+ Delete specific key:
247
+
248
+ ```ruby
249
+ keys.delete 'email@me.com'
250
+ key.delete!
251
+ ```
252
+
253
+ Delete all keys:
254
+
255
+ ```ruby
256
+ keys.delete_all
257
+ ```
128
258
 
129
259
  ## Mock
130
260
 
131
261
  For practice or testing you can also use a simulated Heroku:
132
262
 
133
- require 'ruroku'
263
+ ```ruby
264
+ require 'ruroku'
134
265
 
135
- heroku = Ruroku::API.new api_key: API_KEY, mock: true
266
+ heroku = Ruroku::API.new api_key: API_KEY, mock: true
267
+ ```
136
268
 
137
269
  After that commands should still behave the same, but they will only modify some local data instead of updating the state of things on Heroku.
138
270
 
data/Rakefile CHANGED
@@ -1,2 +1,8 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
4
+
5
+ desc 'Default: run specs.'
6
+ task default: :spec
7
+
8
+ RSpec::Core::RakeTask.new
data/TODO.md CHANGED
@@ -1,6 +1,2 @@
1
1
  * Logs
2
- * Stacks
3
- * Keys
4
- * User info
5
2
  * Collection finder methods
6
- * Specs
data/lib/ruroku.rb CHANGED
@@ -1,14 +1,17 @@
1
- require "heroku-api"
2
1
  require "time"
2
+ require "heroku-api"
3
+ require "virtus"
3
4
  require "active_support/core_ext/numeric"
4
5
  require "active_support/core_ext/string"
5
6
 
6
7
  require "ruroku/base"
7
8
  require "ruroku/nested_base"
8
9
  require "ruroku/resource_set"
10
+ require "ruroku/nested_resource_set"
9
11
 
10
12
  require "ruroku/api"
11
13
  require "ruroku/app"
14
+ require "ruroku/app_set"
12
15
  require "ruroku/addon"
13
16
  require "ruroku/addon_set"
14
17
  require "ruroku/collaborator"
@@ -21,6 +24,11 @@ require "ruroku/process"
21
24
  require "ruroku/process_set"
22
25
  require "ruroku/release"
23
26
  require "ruroku/release_set"
27
+ require "ruroku/stack"
28
+ require "ruroku/stack_set"
29
+ require "ruroku/user"
30
+ require "ruroku/key"
31
+ require "ruroku/key_set"
24
32
  require "ruroku/version"
25
33
 
26
34
  module Ruroku
data/lib/ruroku/addon.rb CHANGED
@@ -1,15 +1,13 @@
1
1
  module Ruroku
2
2
  class Addon < NestedBase
3
- attr_accessor :name, :description, :url, :state, :price, :beta
4
- deletable :name
3
+ attribute :name, String
4
+ attribute :description, String
5
+ attribute :url, String
6
+ attribute :state, String
7
+ attribute :price, Hash
8
+ attribute :beta, Boolean, default: false
5
9
 
6
- # Public: Check if the addon is in beta.
7
- def beta?
8
- !!beta
9
- end
10
-
11
- def price=(value)
12
- @price = value
13
- end
10
+ resource_id :name
11
+ deletable_resource
14
12
  end
15
13
  end
@@ -1,5 +1,8 @@
1
1
  module Ruroku
2
- class AddonSet < ResourceSet
2
+ class AddonSet < NestedResourceSet
3
+ resource_class Addon
4
+ collection_api_selector :get_addons
5
+
3
6
  # Map API methods to collection methods.
4
7
  #
5
8
  # Examples
data/lib/ruroku/api.rb CHANGED
@@ -10,7 +10,26 @@ module Ruroku
10
10
  #
11
11
  # Returns the Array[App].
12
12
  def apps
13
- heroku_api.get_apps.body.map { |app| App.new heroku_api, app }
13
+ @apps ||= AppSet.new heroku_api
14
+ end
15
+
16
+ # Public: Get specific app.
17
+ def app(app_name)
18
+ App.new heroku_api, heroku_api.get_app(app_name).body
19
+ end
20
+
21
+ # Public: Get keys associated with current heroku account.
22
+ def keys
23
+ @keys ||= KeySet.new heroku_api
24
+ end
25
+
26
+ # Public: Get User object associated with current heroku account.
27
+ def user
28
+ @user ||= User.new heroku_api, heroku_api.get_user.body
29
+ end
30
+
31
+ def inspect
32
+ "<#{self.class}>"
14
33
  end
15
34
  end
16
35
  end