ruroku 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/CHANGELOG.md +18 -1
  2. data/README.md +51 -1
  3. data/TODO.md +0 -2
  4. data/lib/ruroku.rb +23 -30
  5. data/lib/ruroku/api.rb +6 -2
  6. data/lib/ruroku/app.rb +46 -0
  7. data/lib/ruroku/base.rb +17 -2
  8. data/lib/ruroku/config_var.rb +13 -0
  9. data/lib/ruroku/nested_base.rb +1 -2
  10. data/lib/ruroku/release.rb +15 -0
  11. data/lib/ruroku/resource_sets.rb +12 -0
  12. data/lib/ruroku/{addon_set.rb → resource_sets/addon_set.rb} +1 -1
  13. data/lib/ruroku/resource_sets/app_set.rb +24 -0
  14. data/lib/ruroku/{collaborator_set.rb → resource_sets/collaborator_set.rb} +11 -0
  15. data/lib/ruroku/{config_var_set.rb → resource_sets/config_var_set.rb} +11 -0
  16. data/lib/ruroku/{domain_set.rb → resource_sets/domain_set.rb} +0 -0
  17. data/lib/ruroku/{key_set.rb → resource_sets/key_set.rb} +0 -0
  18. data/lib/ruroku/{nested_resource_set.rb → resource_sets/nested_resource_set.rb} +0 -0
  19. data/lib/ruroku/resource_sets/process_set.rb +38 -0
  20. data/lib/ruroku/resource_sets/release_set.rb +33 -0
  21. data/lib/ruroku/{resource_set.rb → resource_sets/resource_set.rb} +38 -7
  22. data/lib/ruroku/{stack_set.rb → resource_sets/stack_set.rb} +0 -0
  23. data/lib/ruroku/version.rb +1 -1
  24. data/ruroku.gemspec +5 -5
  25. data/spec/helpers/release.rb +4 -0
  26. data/spec/ruroku/api_spec.rb +12 -0
  27. data/spec/ruroku/app_spec.rb +14 -0
  28. data/spec/ruroku/config_var_set_spec.rb +31 -0
  29. data/spec/ruroku/release_spec.rb +14 -0
  30. data/spec/spec_helper.rb +1 -1
  31. metadata +20 -15
  32. data/lib/ruroku/app_set.rb +0 -13
  33. data/lib/ruroku/process_set.rb +0 -20
  34. data/lib/ruroku/release_set.rb +0 -13
@@ -1,4 +1,21 @@
1
- ## Ruruku 0.0.2 (Jun 10, 2012)
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
@@ -1,2 +0,0 @@
1
- * Logs
2
- * Collection finder methods
@@ -1,35 +1,28 @@
1
- require "time"
2
- require "heroku-api"
3
- require "virtus"
4
- require "active_support/core_ext/numeric"
5
- require "active_support/core_ext/string"
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 "ruroku/base"
8
- require "ruroku/nested_base"
9
- require "ruroku/resource_set"
10
- require "ruroku/nested_resource_set"
8
+ require 'ruroku/base'
9
+ require 'ruroku/nested_base'
11
10
 
12
- require "ruroku/api"
13
- require "ruroku/app"
14
- require "ruroku/app_set"
15
- require "ruroku/addon"
16
- require "ruroku/addon_set"
17
- require "ruroku/collaborator"
18
- require "ruroku/collaborator_set"
19
- require "ruroku/config_var"
20
- require "ruroku/config_var_set"
21
- require "ruroku/domain"
22
- require "ruroku/domain_set"
23
- require "ruroku/process"
24
- require "ruroku/process_set"
25
- require "ruroku/release"
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"
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
@@ -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
@@ -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
@@ -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 self.class.resource_id
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}>"
@@ -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
@@ -8,13 +8,12 @@ module Ruroku
8
8
  super app.api, attributes
9
9
  end
10
10
 
11
- # Public: Make resource deletable.
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
@@ -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'
@@ -9,7 +9,7 @@ module Ruroku
9
9
  #
10
10
  # addons.add 'addon-name'
11
11
  # addons.upgrade 'addon-name'
12
- # addon.delete 'addon-name'
12
+ # addons.delete 'addon-name'
13
13
  map_api add: :post_addon,
14
14
  upgrade: :put_addon,
15
15
  delete: :delete_addon
@@ -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
@@ -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
- # Public: Query collection objects from API.
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
- # Public: Build a resource from response.
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
- # Public: Get params for querying collection.
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
- def self.collection_api_selector(meth = nil)
51
- if meth
52
- @_collection_api_selector = meth
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|
@@ -1,3 +1,3 @@
1
1
  module Ruroku
2
- VERSION = "0.0.2"
2
+ VERSION = '0.0.3'
3
3
  end
@@ -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 = ["Gosha Arinich"]
6
- gem.email = ["me@goshakkk.name"]
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 = "ruroku"
15
- gem.require_paths = ["lib"]
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'
@@ -9,6 +9,10 @@ module Helpers
9
9
  }
10
10
  end
11
11
 
12
+ def release_response
13
+ stubbed_response release_data
14
+ end
15
+
12
16
  def releases_response
13
17
  stubbed_response [release_data]
14
18
  end
@@ -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)
@@ -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
@@ -60,7 +60,7 @@ module Helpers
60
60
  def stubbed_app
61
61
  app = double 'app'
62
62
  app.stub(:api).and_return stubbed_api
63
- app.stub(:name).and_return 'The App'
63
+ app.stub(:name).and_return 'test-app'
64
64
  app.stub(:keys).and_return Ruroku::Key.new(app, {})
65
65
 
66
66
  app
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.2
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-10 00:00:00.000000000 Z
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/release_set.rb
99
- - lib/ruroku/resource_set.rb
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: -1851789232377884994
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: -1851789232377884994
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
@@ -1,13 +0,0 @@
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 'another-app', 'cedar'
11
- map_api create: :post_app
12
- end
13
- end
@@ -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
@@ -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