engineyard 1.3.7 → 1.3.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,16 +2,19 @@ module EY
2
2
  class CLI
3
3
  class Recipes < EY::Thor
4
4
  desc "apply [--environment ENVIRONMENT]",
5
- "Run uploaded chef recipes on specified environment."
5
+ "Run chef recipes uploaded by the 'recipes upload' command on the specified environment."
6
6
  long_desc <<-DESC
7
7
  This is similar to '#{banner_base} rebuild' except Engine Yard's main
8
8
  configuration step is skipped.
9
+
10
+ The cookbook uploaded by the 'recipes upload' command will be run when
11
+ you run 'recipes apply'.
9
12
  DESC
10
13
 
11
14
  method_option :environment, :type => :string, :aliases => %w(-e),
12
15
  :desc => "Environment in which to apply recipes"
13
16
  method_option :account, :type => :string, :aliases => %w(-c),
14
- :desc => "Name of the account you want to deploy in"
17
+ :desc => "Name of the account in which the environment can be found"
15
18
  def apply
16
19
  environment = fetch_environment(options[:environment], options[:account])
17
20
  environment.run_custom_recipes
@@ -19,16 +22,18 @@ module EY
19
22
  end
20
23
 
21
24
  desc "upload [--environment ENVIRONMENT]",
22
- "Upload custom chef recipes to specified environment."
25
+ "Upload custom chef recipes to specified environment so they can be applied."
23
26
  long_desc <<-DESC
24
- The current directory should contain a subdirectory named "cookbooks" to be
25
- uploaded.
27
+ The current working directory should contain a subdirectory named "cookbooks"
28
+ that is the collection of recipes to be uploaded.
29
+
30
+ The uploaded cookbook will be run when executing 'recipes apply'.
26
31
  DESC
27
32
 
28
33
  method_option :environment, :type => :string, :aliases => %w(-e),
29
34
  :desc => "Environment that will receive the recipes"
30
35
  method_option :account, :type => :string, :aliases => %w(-c),
31
- :desc => "Name of the account you want to deploy in"
36
+ :desc => "Name of the account in which the environment can be found"
32
37
  def upload
33
38
  environment = fetch_environment(options[:environment], options[:account])
34
39
  environment.upload_recipes
@@ -36,17 +41,17 @@ module EY
36
41
  end
37
42
 
38
43
  desc "download [--environment ENVIRONMENT]",
39
- "Download custom chef recipes from ENVIRONMENT into the current directory."
44
+ "Download a copy of the custom chef recipes from this environment into the current directory."
40
45
  long_desc <<-DESC
41
46
  The recipes will be unpacked into a directory called "cookbooks" in the
42
- current directory.
47
+ current directory. This is the opposite of 'recipes upload'.
43
48
 
44
49
  If the cookbooks directory already exists, an error will be raised.
45
50
  DESC
46
51
  method_option :environment, :type => :string, :aliases => %w(-e),
47
52
  :desc => "Environment for which to download the recipes"
48
53
  method_option :account, :type => :string, :aliases => %w(-c),
49
- :desc => "Name of the account you want to deploy in"
54
+ :desc => "Name of the account in which the environment can be found"
50
55
  def download
51
56
  environment = fetch_environment(options[:environment], options[:account])
52
57
  environment.download_recipes
@@ -10,7 +10,7 @@ module EY
10
10
  method_option :verbose, :type => :boolean, :aliases => %w(-v),
11
11
  :desc => "Be verbose"
12
12
  method_option :account, :type => :string, :aliases => %w(-c),
13
- :desc => "Name of the account you want to deploy in"
13
+ :desc => "Name of the account in which the environment can be found"
14
14
  def enable
15
15
  app, environment = fetch_app_and_environment(options[:app], options[:environment], options[:account])
16
16
  EY.ui.info "Taking down maintenance page for '#{app.name}' in '#{environment.name}'"
@@ -37,7 +37,7 @@ module EY
37
37
  method_option :verbose, :type => :boolean, :aliases => %w(-v),
38
38
  :desc => "Be verbose"
39
39
  method_option :account, :type => :string, :aliases => %w(-c),
40
- :desc => "Name of the account you want to deploy in"
40
+ :desc => "Name of the account in which the environment can be found"
41
41
  def disable
42
42
  app, environment = fetch_app_and_environment(options[:app], options[:environment], options[:account])
43
43
  EY.ui.info "Putting up maintenance page for '#{app.name}' in '#{environment.name}'"
@@ -43,7 +43,7 @@ module EY
43
43
  method_option :app, :type => :string, :aliases => %w(-a),
44
44
  :desc => "Name of the application to deploy"
45
45
  method_option :account, :type => :string, :aliases => %w(-c),
46
- :desc => "Name of the account you want to deploy in"
46
+ :desc => "Name of the account in which the environment can be found"
47
47
  method_option :verbose, :type => :boolean, :aliases => %w(-v),
48
48
  :desc => "Be verbose"
49
49
  method_option :extra_deploy_hook_options, :type => :hash, :default => {},
@@ -120,7 +120,7 @@ module EY
120
120
  method_option :environment, :type => :string, :aliases => %w(-e),
121
121
  :desc => "Environment to rebuild"
122
122
  method_option :account, :type => :string, :aliases => %w(-c),
123
- :desc => "Name of the account you want to rebuild in"
123
+ :desc => "Name of the account in which the environment can be found"
124
124
  def rebuild
125
125
  environment = fetch_environment(options[:environment], options[:account])
126
126
  EY.ui.debug("Rebuilding #{environment.name}")
@@ -138,7 +138,7 @@ module EY
138
138
  method_option :app, :type => :string, :aliases => %w(-a),
139
139
  :desc => "Name of the application to roll back"
140
140
  method_option :account, :type => :string, :aliases => %w(-c),
141
- :desc => "Name of the account you want to roll back in"
141
+ :desc => "Name of the account in which the environment can be found"
142
142
  method_option :verbose, :type => :boolean, :aliases => %w(-v),
143
143
  :desc => "Be verbose"
144
144
  method_option :extra_deploy_hook_options, :type => :hash, :default => {},
@@ -168,7 +168,7 @@ module EY
168
168
  method_option :environment, :type => :string, :aliases => %w(-e),
169
169
  :desc => "Environment to ssh into"
170
170
  method_option :account, :type => :string, :aliases => %w(-c),
171
- :desc => "Name of the account you want to deploy in"
171
+ :desc => "Name of the account in which the environment can be found"
172
172
  method_option :all, :type => :boolean, :aliases => %(-a),
173
173
  :desc => "Run command on all servers"
174
174
  method_option :app_servers, :type => :boolean,
@@ -231,7 +231,7 @@ module EY
231
231
  method_option :environment, :type => :string, :aliases => %w(-e),
232
232
  :desc => "Environment with the interesting logs"
233
233
  method_option :account, :type => :string, :aliases => %w(-c),
234
- :desc => "Name of the account you want to deploy in"
234
+ :desc => "Name of the account in which the environment can be found"
235
235
  def logs
236
236
  environment = fetch_environment(options[:environment], options[:account])
237
237
  environment.logs.each do |log|
@@ -0,0 +1,51 @@
1
+ require 'escape'
2
+
3
+ module EY
4
+ module Model
5
+ class Deployment < ApiStruct.new(:id, :app, :created_at, :environment, :finished_at, :migration_command, :output, :ref, :successful)
6
+ def self.started(environment, app, ref, migration_command)
7
+ from_hash({
8
+ :app => app,
9
+ :environment => environment,
10
+ :migration_command => migration_command,
11
+ :ref => ref,
12
+ :created_at => Time.now.utc,
13
+ })
14
+ end
15
+
16
+ def finished(successful, output)
17
+ self.successful = successful
18
+ self.output = output
19
+ self.finished_at = Time.now.utc
20
+ post_to_appcloud!
21
+ end
22
+
23
+ private
24
+
25
+ def post_to_appcloud!
26
+ api.request(api_uri, :method => :post, :params => params)
27
+ EY.ui.info "Deployment recorded in AppCloud"
28
+ end
29
+
30
+ def params
31
+ {:deployment => {
32
+ :created_at => created_at,
33
+ :finished_at => finished_at,
34
+ :migrate => !!migration_command,
35
+ :migrate_command => migration_command,
36
+ :output => output,
37
+ :ref => ref,
38
+ :successful => successful,
39
+ }}
40
+ end
41
+
42
+ def api_uri
43
+ "/apps/#{app.id}/environments/#{environment.id}/deployments"
44
+ end
45
+
46
+ def api
47
+ app.api
48
+ end
49
+ end
50
+ end
51
+ end
@@ -55,7 +55,7 @@ module EY
55
55
  end
56
56
 
57
57
  def rebuild
58
- api.request("/environments/#{id}/rebuild", :method => :put)
58
+ api.request("/environments/#{id}/update_instances", :method => :put)
59
59
  end
60
60
 
61
61
  def run_custom_recipes
@@ -1,4 +1,5 @@
1
1
  require 'escape'
2
+ require 'open4'
2
3
 
3
4
  module EY
4
5
  module Model
@@ -19,13 +20,17 @@ module EY
19
20
  private :adapter
20
21
 
21
22
  def deploy(app, ref, migration_command=nil, extra_configuration=nil, verbose=false)
23
+ deployment = Deployment.started(environment, app, ref, migration_command)
24
+
22
25
  deploy_command = adapter(app, verbose).deploy do |args|
23
26
  args.config = extra_configuration if extra_configuration
24
27
  args.migrate = migration_command if migration_command
25
28
  args.ref = ref
26
29
  end
27
30
 
28
- invoke deploy_command
31
+ successful, output = invoke_with_output(deploy_command)
32
+ deployment.finished(successful, output)
33
+ successful
29
34
  end
30
35
 
31
36
  def rollback(app, extra_configuration=nil, verbose=false)
@@ -62,20 +67,29 @@ module EY
62
67
 
63
68
  private
64
69
 
65
- def ssh(remote_command, output = true)
70
+ def ssh(remote_command)
66
71
  user = environment.username
72
+ out = ""
73
+ tee = lambda do |chunk|
74
+ out << chunk
75
+ $stdout << chunk
76
+ end
67
77
 
68
78
  cmd = Escape.shell_command(%w[ssh -o StrictHostKeyChecking=no -q] << "#{user}@#{hostname}" << remote_command)
69
- cmd << " > /dev/null" unless output
70
79
  EY.ui.debug(cmd)
71
- unless ENV["NO_SSH"]
72
- system cmd
80
+ if ENV["NO_SSH"]
81
+ [true, "NO_SSH is set."]
73
82
  else
74
- true
83
+ status = Open4.spawn(cmd, :out => tee, :err => tee, :quiet => true)
84
+ [status.success?, out]
75
85
  end
76
86
  end
77
87
 
78
88
  def invoke(action)
89
+ invoke_with_output(action).first
90
+ end
91
+
92
+ def invoke_with_output(action)
79
93
  action.call do |cmd|
80
94
  puts cmd if action.verbose
81
95
  ssh cmd
@@ -3,6 +3,7 @@ module EY
3
3
  autoload :ApiStruct, 'engineyard/model/api_struct'
4
4
  autoload :Account, 'engineyard/model/account'
5
5
  autoload :App, 'engineyard/model/app'
6
+ autoload :Deployment, 'engineyard/model/deployment'
6
7
  autoload :Environment, 'engineyard/model/environment'
7
8
  autoload :Log, 'engineyard/model/log'
8
9
  autoload :Instance, 'engineyard/model/instance'
@@ -1,3 +1,3 @@
1
1
  module EY
2
- VERSION = '1.3.7'
2
+ VERSION = '1.3.10'
3
3
  end
@@ -11,13 +11,13 @@ describe "EY::Model::Environment#rebuild" do
11
11
 
12
12
  FakeWeb.register_uri(
13
13
  :put,
14
- "https://cloud.engineyard.com/api/v2/environments/#{env.id}/rebuild",
14
+ "https://cloud.engineyard.com/api/v2/environments/#{env.id}/update_instances",
15
15
  :body => ''
16
16
  )
17
17
 
18
18
  env.rebuild
19
19
 
20
- FakeWeb.should have_requested(:put, "https://cloud.engineyard.com/api/v2/environments/#{env.id}/rebuild")
20
+ FakeWeb.should have_requested(:put, "https://cloud.engineyard.com/api/v2/environments/#{env.id}/update_instances")
21
21
  end
22
22
  end
23
23
 
@@ -38,6 +38,7 @@ describe "ey deploy" do
38
38
 
39
39
  def verify_ran(scenario)
40
40
  @out.should match(/Beginning deploy for.*#{scenario[:application]}.*#{scenario[:environment]}/)
41
+ @out.should match(/Deployment recorded in AppCloud/)
41
42
  @ssh_commands.should have_command_like(/engineyard-serverside.*deploy.*--app #{scenario[:application]}/)
42
43
  end
43
44
 
@@ -96,7 +96,7 @@ class FakeAwsm < Sinatra::Base
96
96
  end
97
97
  end
98
98
 
99
- put "/api/v2/environments/:env_id/rebuild" do
99
+ put "/api/v2/environments/:env_id/update_instances" do
100
100
  status(202)
101
101
  ""
102
102
  end
@@ -106,6 +106,10 @@ class FakeAwsm < Sinatra::Base
106
106
  ""
107
107
  end
108
108
 
109
+ post "/api/v2/apps/:app_id/environments/:environment_id/deployments" do
110
+ {"deployment" => params[:deployment].merge({"id" => 2, "commit" => 'a'*40})}.to_json
111
+ end
112
+
109
113
  post "/api/v2/authenticate" do
110
114
  if valid_user?
111
115
  {"api_token" => "deadbeef", "ok" => true}.to_json
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
4
  prerelease: false
6
5
  segments:
7
6
  - 1
8
7
  - 3
9
- - 7
10
- version: 1.3.7
8
+ - 10
9
+ version: 1.3.10
11
10
  platform: ruby
12
11
  authors:
13
12
  - EY Cloud Team
@@ -15,102 +14,104 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-11-22 00:00:00 -08:00
17
+ date: 2010-12-28 00:00:00 -08:00
19
18
  default_executable: ey
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
21
+ prerelease: false
22
+ name: thor
23
+ type: :runtime
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
25
  requirements:
25
26
  - - ~>
26
27
  - !ruby/object:Gem::Version
27
- hash: 43
28
28
  segments:
29
29
  - 0
30
30
  - 14
31
31
  - 6
32
32
  version: 0.14.6
33
- name: thor
33
+ requirement: *id001
34
+ - !ruby/object:Gem::Dependency
34
35
  prerelease: false
36
+ name: rest-client
35
37
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
39
  requirements:
41
40
  - - ~>
42
41
  - !ruby/object:Gem::Version
43
- hash: 7
44
42
  segments:
45
43
  - 1
46
44
  - 4
47
45
  version: "1.4"
48
- name: rest-client
46
+ requirement: *id002
47
+ - !ruby/object:Gem::Dependency
49
48
  prerelease: false
49
+ name: highline
50
50
  type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- requirement: &id003 !ruby/object:Gem::Requirement
54
- none: false
51
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
52
  requirements:
56
53
  - - ~>
57
54
  - !ruby/object:Gem::Version
58
- hash: 13
59
55
  segments:
60
56
  - 1
61
57
  - 6
62
58
  - 1
63
59
  version: 1.6.1
64
- name: highline
60
+ requirement: *id003
61
+ - !ruby/object:Gem::Dependency
65
62
  prerelease: false
63
+ name: json_pure
66
64
  type: :runtime
67
- version_requirements: *id003
68
- - !ruby/object:Gem::Dependency
69
- requirement: &id004 !ruby/object:Gem::Requirement
70
- none: false
65
+ version_requirements: &id004 !ruby/object:Gem::Requirement
71
66
  requirements:
72
67
  - - ">="
73
68
  - !ruby/object:Gem::Version
74
- hash: 3
75
69
  segments:
76
70
  - 0
77
71
  version: "0"
78
- name: json_pure
72
+ requirement: *id004
73
+ - !ruby/object:Gem::Dependency
79
74
  prerelease: false
75
+ name: escape
80
76
  type: :runtime
81
- version_requirements: *id004
82
- - !ruby/object:Gem::Dependency
83
- requirement: &id005 !ruby/object:Gem::Requirement
84
- none: false
77
+ version_requirements: &id005 !ruby/object:Gem::Requirement
85
78
  requirements:
86
79
  - - ~>
87
80
  - !ruby/object:Gem::Version
88
- hash: 23
89
81
  segments:
90
82
  - 0
91
83
  - 0
92
84
  - 4
93
85
  version: 0.0.4
94
- name: escape
86
+ requirement: *id005
87
+ - !ruby/object:Gem::Dependency
95
88
  prerelease: false
89
+ name: engineyard-serverside-adapter
96
90
  type: :runtime
97
- version_requirements: *id005
98
- - !ruby/object:Gem::Dependency
99
- requirement: &id006 !ruby/object:Gem::Requirement
100
- none: false
91
+ version_requirements: &id006 !ruby/object:Gem::Requirement
101
92
  requirements:
102
93
  - - "="
103
94
  - !ruby/object:Gem::Version
104
- hash: 7
105
95
  segments:
106
96
  - 1
107
97
  - 4
108
98
  - 0
109
99
  version: 1.4.0
110
- name: engineyard-serverside-adapter
100
+ requirement: *id006
101
+ - !ruby/object:Gem::Dependency
111
102
  prerelease: false
103
+ name: open4
112
104
  type: :runtime
113
- version_requirements: *id006
105
+ version_requirements: &id007 !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ segments:
110
+ - 1
111
+ - 0
112
+ - 1
113
+ version: 1.0.1
114
+ requirement: *id007
114
115
  description: This gem allows you to deploy your rails application to the Engine Yard cloud directly from the command line.
115
116
  email: cloud@engineyard.com
116
117
  executables:
@@ -122,63 +123,33 @@ extra_rdoc_files: []
122
123
  files:
123
124
  - bin/ey
124
125
  - lib/engineyard/cli.rb
125
- - lib/engineyard/model.rb
126
+ - lib/engineyard/api.rb
126
127
  - lib/engineyard/error.rb
127
- - lib/engineyard/resolver.rb
128
+ - lib/engineyard/ruby_ext.rb
129
+ - lib/engineyard/cli/api.rb
130
+ - lib/engineyard/cli/web.rb
131
+ - lib/engineyard/cli/recipes.rb
132
+ - lib/engineyard/cli/ui.rb
133
+ - lib/engineyard/model/log.rb
134
+ - lib/engineyard/model/instance.rb
135
+ - lib/engineyard/model/environment.rb
136
+ - lib/engineyard/model/app.rb
137
+ - lib/engineyard/model/deployment.rb
138
+ - lib/engineyard/model/account.rb
139
+ - lib/engineyard/model/api_struct.rb
140
+ - lib/engineyard/thor.rb
141
+ - lib/engineyard/model.rb
142
+ - lib/engineyard/repo.rb
128
143
  - lib/engineyard/collection/abstract.rb
129
144
  - lib/engineyard/collection/apps.rb
130
145
  - lib/engineyard/collection/environments.rb
131
146
  - lib/engineyard/collection.rb
132
147
  - lib/engineyard/config.rb
133
- - lib/engineyard/repo.rb
134
- - lib/engineyard/thor.rb
135
- - lib/engineyard/api.rb
136
- - lib/engineyard/cli/recipes.rb
137
- - lib/engineyard/cli/web.rb
138
- - lib/engineyard/cli/ui.rb
139
- - lib/engineyard/cli/api.rb
140
148
  - lib/engineyard/version.rb
141
- - lib/engineyard/ruby_ext.rb
142
- - lib/engineyard/model/account.rb
143
- - lib/engineyard/model/instance.rb
144
- - lib/engineyard/model/api_struct.rb
145
- - lib/engineyard/model/app.rb
146
- - lib/engineyard/model/environment.rb
147
- - lib/engineyard/model/log.rb
149
+ - lib/engineyard/resolver.rb
148
150
  - lib/engineyard.rb
149
151
  - LICENSE
150
152
  - README.rdoc
151
- - spec/support/shared_behavior.rb
152
- - spec/support/helpers.rb
153
- - spec/support/bundled_ey
154
- - spec/support/ruby_ext.rb
155
- - spec/support/git_repo.rb
156
- - spec/support/fake_awsm.ru
157
- - spec/engineyard/resolver_spec.rb
158
- - spec/engineyard/api_spec.rb
159
- - spec/engineyard/repo_spec.rb
160
- - spec/engineyard/cli_spec.rb
161
- - spec/engineyard/config_spec.rb
162
- - spec/engineyard/collection/environments_spec.rb
163
- - spec/engineyard/collection/apps_spec.rb
164
- - spec/engineyard/cli/api_spec.rb
165
- - spec/engineyard/model/environment_spec.rb
166
- - spec/engineyard/model/instance_spec.rb
167
- - spec/engineyard/model/api_struct_spec.rb
168
- - spec/ey/rollback_spec.rb
169
- - spec/ey/rebuild_spec.rb
170
- - spec/ey/web/enable_spec.rb
171
- - spec/ey/web/disable_spec.rb
172
- - spec/ey/deploy_spec.rb
173
- - spec/ey/ey_spec.rb
174
- - spec/ey/ssh_spec.rb
175
- - spec/ey/list_environments_spec.rb
176
- - spec/ey/logs_spec.rb
177
- - spec/ey/recipes/upload_spec.rb
178
- - spec/ey/recipes/download_spec.rb
179
- - spec/ey/recipes/apply_spec.rb
180
- - spec/spec_helper.rb
181
- - spec/engineyard_spec.rb
182
153
  has_rdoc: true
183
154
  homepage: http://github.com/engineyard/engineyard
184
155
  licenses: []
@@ -189,59 +160,55 @@ rdoc_options: []
189
160
  require_paths:
190
161
  - lib
191
162
  required_ruby_version: !ruby/object:Gem::Requirement
192
- none: false
193
163
  requirements:
194
164
  - - ">="
195
165
  - !ruby/object:Gem::Version
196
- hash: 3
197
166
  segments:
198
167
  - 0
199
168
  version: "0"
200
169
  required_rubygems_version: !ruby/object:Gem::Requirement
201
- none: false
202
170
  requirements:
203
171
  - - ">="
204
172
  - !ruby/object:Gem::Version
205
- hash: 3
206
173
  segments:
207
174
  - 0
208
175
  version: "0"
209
176
  requirements: []
210
177
 
211
178
  rubyforge_project:
212
- rubygems_version: 1.3.7
179
+ rubygems_version: 1.3.6
213
180
  signing_key:
214
181
  specification_version: 3
215
182
  summary: Command-line deployment for the Engine Yard cloud
216
183
  test_files:
217
- - spec/support/shared_behavior.rb
218
- - spec/support/helpers.rb
219
- - spec/support/bundled_ey
220
- - spec/support/ruby_ext.rb
221
184
  - spec/support/git_repo.rb
222
185
  - spec/support/fake_awsm.ru
223
- - spec/engineyard/resolver_spec.rb
224
- - spec/engineyard/api_spec.rb
225
- - spec/engineyard/repo_spec.rb
186
+ - spec/support/ruby_ext.rb
187
+ - spec/support/helpers.rb
188
+ - spec/support/bundled_ey
189
+ - spec/support/shared_behavior.rb
226
190
  - spec/engineyard/cli_spec.rb
227
191
  - spec/engineyard/config_spec.rb
228
- - spec/engineyard/collection/environments_spec.rb
229
- - spec/engineyard/collection/apps_spec.rb
230
192
  - spec/engineyard/cli/api_spec.rb
193
+ - spec/engineyard/model/api_struct_spec.rb
231
194
  - spec/engineyard/model/environment_spec.rb
232
195
  - spec/engineyard/model/instance_spec.rb
233
- - spec/engineyard/model/api_struct_spec.rb
196
+ - spec/engineyard/resolver_spec.rb
197
+ - spec/engineyard/collection/apps_spec.rb
198
+ - spec/engineyard/collection/environments_spec.rb
199
+ - spec/engineyard/repo_spec.rb
200
+ - spec/engineyard/api_spec.rb
201
+ - spec/ey/list_environments_spec.rb
234
202
  - spec/ey/rollback_spec.rb
203
+ - spec/ey/logs_spec.rb
235
204
  - spec/ey/rebuild_spec.rb
236
- - spec/ey/web/enable_spec.rb
237
- - spec/ey/web/disable_spec.rb
205
+ - spec/ey/recipes/download_spec.rb
206
+ - spec/ey/recipes/apply_spec.rb
207
+ - spec/ey/recipes/upload_spec.rb
238
208
  - spec/ey/deploy_spec.rb
239
209
  - spec/ey/ey_spec.rb
210
+ - spec/ey/web/disable_spec.rb
211
+ - spec/ey/web/enable_spec.rb
240
212
  - spec/ey/ssh_spec.rb
241
- - spec/ey/list_environments_spec.rb
242
- - spec/ey/logs_spec.rb
243
- - spec/ey/recipes/upload_spec.rb
244
- - spec/ey/recipes/download_spec.rb
245
- - spec/ey/recipes/apply_spec.rb
246
- - spec/spec_helper.rb
247
213
  - spec/engineyard_spec.rb
214
+ - spec/spec_helper.rb