ruroku 0.0.2 → 0.0.3

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.
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