heroku_san 3.0.4 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -4,5 +4,4 @@ pkg
4
4
  Thumbs.db
5
5
  tmp
6
6
  .idea/**
7
- Gemfile.lock
8
7
  *.swp
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change log (curated)
2
2
 
3
+ ## v4.0.0
4
+
5
+ * Remove dependency on sunsetted 'heroku' gem. Add external dependency
6
+ on Heroku Toolbelt, instead.
7
+ * Deprecate Stage#rake, Stage#sharing_add and Stage#sharing_remove
8
+ * Closes #104
9
+ * Closes #107
10
+ * Closes #108
11
+ * Thanks to sworbel for the pull request (#104)
12
+
3
13
  ## v3.0.4
4
14
 
5
15
  * Documentation syntax highlighting and formatting.
@@ -81,4 +91,4 @@
81
91
 
82
92
  ## v1.3.0
83
93
 
84
- N/A
94
+ N/A
data/Gemfile.lock ADDED
@@ -0,0 +1,132 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ heroku_san (4.0.0)
5
+ activesupport
6
+ heroku-api (>= 0.1.2)
7
+ rake
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ actionmailer (3.2.1)
13
+ actionpack (= 3.2.1)
14
+ mail (~> 2.4.0)
15
+ actionpack (3.2.1)
16
+ activemodel (= 3.2.1)
17
+ activesupport (= 3.2.1)
18
+ builder (~> 3.0.0)
19
+ erubis (~> 2.7.0)
20
+ journey (~> 1.0.1)
21
+ rack (~> 1.4.0)
22
+ rack-cache (~> 1.1)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.1.2)
25
+ activemodel (3.2.1)
26
+ activesupport (= 3.2.1)
27
+ builder (~> 3.0.0)
28
+ activerecord (3.2.1)
29
+ activemodel (= 3.2.1)
30
+ activesupport (= 3.2.1)
31
+ arel (~> 3.0.0)
32
+ tzinfo (~> 0.3.29)
33
+ activeresource (3.2.1)
34
+ activemodel (= 3.2.1)
35
+ activesupport (= 3.2.1)
36
+ activesupport (3.2.1)
37
+ i18n (~> 0.6)
38
+ multi_json (~> 1.0)
39
+ arel (3.0.2)
40
+ aruba (0.5.0)
41
+ childprocess (= 0.2.3)
42
+ cucumber (>= 1.1.1)
43
+ ffi (>= 1.0.11)
44
+ rspec-expectations (>= 2.7.0)
45
+ builder (3.0.4)
46
+ childprocess (0.2.3)
47
+ ffi (~> 1.0.6)
48
+ colorize (0.5.8)
49
+ cucumber (1.2.1)
50
+ builder (>= 2.1.2)
51
+ diff-lcs (>= 1.1.3)
52
+ gherkin (~> 2.11.0)
53
+ json (>= 1.4.6)
54
+ diff-lcs (1.1.3)
55
+ erubis (2.7.0)
56
+ excon (0.16.7)
57
+ ffi (1.0.11)
58
+ gherkin (2.11.5)
59
+ json (>= 1.4.6)
60
+ git-smart (0.1.9)
61
+ colorize
62
+ godot (0.1.0)
63
+ heroku-api (0.3.5)
64
+ excon (~> 0.16.1)
65
+ hike (1.2.1)
66
+ i18n (0.6.0)
67
+ journey (1.0.3)
68
+ json (1.7.5)
69
+ mail (2.4.1)
70
+ i18n (>= 0.4.0)
71
+ mime-types (~> 1.16)
72
+ treetop (~> 1.4.8)
73
+ mime-types (1.17.2)
74
+ multi_json (1.1.0)
75
+ polyglot (0.3.3)
76
+ rack (1.4.1)
77
+ rack-cache (1.1)
78
+ rack (>= 0.4)
79
+ rack-ssl (1.3.2)
80
+ rack
81
+ rack-test (0.6.1)
82
+ rack (>= 1.0)
83
+ rails (3.2.1)
84
+ actionmailer (= 3.2.1)
85
+ actionpack (= 3.2.1)
86
+ activerecord (= 3.2.1)
87
+ activeresource (= 3.2.1)
88
+ activesupport (= 3.2.1)
89
+ bundler (~> 1.0)
90
+ railties (= 3.2.1)
91
+ railties (3.2.1)
92
+ actionpack (= 3.2.1)
93
+ activesupport (= 3.2.1)
94
+ rack-ssl (~> 1.3.2)
95
+ rake (>= 0.8.7)
96
+ rdoc (~> 3.4)
97
+ thor (~> 0.14.6)
98
+ rake (0.9.2.2)
99
+ rdoc (3.12)
100
+ json (~> 1.4)
101
+ rspec (2.11.0)
102
+ rspec-core (~> 2.11.0)
103
+ rspec-expectations (~> 2.11.0)
104
+ rspec-mocks (~> 2.11.0)
105
+ rspec-core (2.11.1)
106
+ rspec-expectations (2.11.3)
107
+ diff-lcs (~> 1.1.3)
108
+ rspec-mocks (2.11.3)
109
+ sprockets (2.1.2)
110
+ hike (~> 1.2)
111
+ rack (~> 1.0)
112
+ tilt (~> 1.1, != 1.3.0)
113
+ thor (0.14.6)
114
+ tilt (1.3.3)
115
+ treetop (1.4.10)
116
+ polyglot
117
+ polyglot (>= 0.3.1)
118
+ tzinfo (0.3.31)
119
+
120
+ PLATFORMS
121
+ ruby
122
+
123
+ DEPENDENCIES
124
+ aruba
125
+ bundler (~> 1.1)
126
+ cucumber
127
+ git-smart
128
+ godot
129
+ heroku_san!
130
+ rails (>= 2)
131
+ rake
132
+ rspec
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
  Helpful rake tasks for Heroku.
3
3
 
4
4
  [![Build Status](https://secure.travis-ci.org/fastestforward/heroku_san.png)](http://travis-ci.org/fastestforward/heroku_san)
5
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/fastestforward/heroku_san)
5
6
 
6
7
  ## Install
7
8
 
@@ -144,6 +145,7 @@ A full list of tasks provided:
144
145
  rake heroku:remotes # Add git remotes for all apps in this project
145
146
  rake heroku:restart # Restarts remote servers
146
147
  rake heroku:share # Adds a collaborator (asks for email)
148
+ rake heroku:shell # Opens a bash shell within app
147
149
  rake heroku:unshare # Removes a collaborator (asks for email)
148
150
  rake heroku:stage:all # Select all Heroku apps for later command
149
151
  ```
@@ -161,6 +163,7 @@ Frequently used tasks are aliased into the global namespace:
161
163
  task :migrate => 'heroku:db:migrate'
162
164
  task :logs => 'heroku:logs:default'
163
165
  task 'logs:tail' => 'heroku:logs:tail'
166
+ task 'shell' => 'heroku:shell'
164
167
  ```
165
168
 
166
169
  ## Links
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
- require 'bundler'
1
+ #!/usr/bin/env rake
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'bundler/gem_tasks'
2
5
  require 'rspec/core/rake_task'
3
6
 
4
- Bundler::GemHelper.install_tasks
5
-
6
7
  desc 'Default: run unit tests.'
7
8
  task :default => :spec
8
9
 
@@ -1,4 +1,4 @@
1
- @announce-cmd @slow_process
1
+ @slow_process @announce-cmd
2
2
  Feature: heroku_san can control a project on Heroku
3
3
  WARNING: This WILL create apps on Heroku!
4
4
  You must login with the heroku cli before starting
@@ -9,8 +9,7 @@ Feature: heroku_san can control a project on Heroku
9
9
  Given I have a new Rails project
10
10
  When I am in the project directory
11
11
  And I add heroku_san to the Gemfile
12
- And I run bundle install
13
- Then rake reports that the heroku: tasks are available
12
+ Then rake reports that the heroku: tasks are available
14
13
 
15
14
  Scenario: Manipulates a Rails app on Heroku
16
15
  Given I have a new Rails project
@@ -20,7 +19,6 @@ Feature: heroku_san can control a project on Heroku
20
19
  And I run bundle install
21
20
  And I generate a new config file
22
21
  And I create my project on Heroku
23
- And I list the remote configuration
24
22
  And I curl the app home page
25
23
  And I configure my project
26
24
  And I turn maintenance on
@@ -41,7 +39,6 @@ Feature: heroku_san can control a project on Heroku
41
39
  And I run bundle install
42
40
  And I create a new config/heroku.yml file
43
41
  And I create my project on Heroku
44
- And I list the remote configuration
45
42
  And I curl the app home page
46
43
  And I configure my project
47
44
  And I turn maintenance on
@@ -1,49 +1,50 @@
1
1
  World(Aruba::Api)
2
2
  require 'active_support/core_ext/string/strip'
3
+ require 'godot'
3
4
 
4
5
  Given /^I have a new Rails project$/ do
5
6
  cmd = "rails new test_app --quiet --force --database=postgresql --skip-bundle --skip-javascript --skip-test-unit --skip-sprockets"
6
- run_simple unescape(cmd)
7
+ run_clean unescape(cmd)
7
8
  end
8
9
 
9
10
  Given /^I have a new Sinatra project$/ do
10
11
  create_dir 'test_app/config'
11
- write_file 'test_app/app.rb', <<EOT.strip_heredoc
12
+ write_file 'test_app/app.rb', <<-EOT.strip_heredoc
12
13
  require 'sinatra'
13
14
 
14
15
  get '/' do
15
16
  'Hello, world.'
16
17
  end
17
- EOT
18
+ EOT
18
19
 
19
- write_file 'test_app/config.ru', <<EOT.strip_heredoc
20
+ write_file 'test_app/config.ru', <<-EOT.strip_heredoc
20
21
  require './app'
21
22
  run Sinatra::Application
22
- EOT
23
+ EOT
23
24
 
24
- write_file 'test_app/Gemfile', <<EOT.strip_heredoc
25
+ write_file 'test_app/Gemfile', <<-EOT.strip_heredoc
25
26
  source 'http://rubygems.org'
26
27
  gem 'sinatra'
27
- EOT
28
+ EOT
28
29
 
29
- write_file 'test_app/Rakefile', <<EOT.strip_heredoc
30
+ write_file 'test_app/Rakefile', <<-EOT.strip_heredoc
30
31
  require "bundler/setup"
31
32
  require "heroku_san"
32
33
  config_file = File.join(File.expand_path(File.dirname(__FILE__)), 'config', 'heroku.yml')
33
34
  HerokuSan.project = HerokuSan::Project.new(config_file, :deploy => HerokuSan::Deploy::Sinatra)
34
35
  load "heroku_san/tasks.rb"
35
- EOT
36
+ EOT
36
37
 
37
38
  end
38
39
 
39
40
  When /^I am in the project directory$/ do
40
41
  cd '/test_app'
41
- run_simple 'git init .'
42
+ run_clean 'git init .'
42
43
  end
43
44
 
44
- When /^I commit any changes with "(.*)"$/ do |message|
45
- run_simple 'git add .'
46
- run_simple "git commit -m '#{message}'"
45
+ When /^I commit .* changes with "(.*)"$/ do |message|
46
+ run_clean 'git add .'
47
+ run_clean "git commit -m '#{message}'"
47
48
  end
48
49
 
49
50
  When /^I add heroku_san to the Gemfile$/ do
@@ -54,35 +55,41 @@ When /^I add heroku_san to the Gemfile$/ do
54
55
  EOT
55
56
  end
56
57
 
58
+ def run_clean(cmd)
59
+ Bundler.with_clean_env do
60
+ ENV['NOEXEC'] = 'skip'
61
+ run_simple cmd
62
+ end
63
+ end
64
+
57
65
  When /^I run bundle install$/ do
58
- use_clean_gemset 'heroku_san_test'
59
- run_simple 'bundle install --quiet'
66
+ run_clean "bundle install"
60
67
  end
61
68
 
62
69
  Then /^rake reports that the heroku: tasks are available$/ do
63
- run_simple 'bundle exec rake -T heroku:'
64
- output = stdout_from 'bundle exec rake -T heroku:'
70
+ run_clean 'rake -T heroku:'
71
+ output = stdout_from 'rake -T heroku:'
65
72
  assert_partial_output 'rake heroku:apps', output
66
73
  end
67
74
 
68
75
  When /^I generate a new config file$/ do
69
- run_simple 'bundle exec rails generate heroku_san'
70
- output = stdout_from 'bundle exec rails generate heroku_san'
76
+ run_clean 'rails generate heroku_san'
77
+ output = stdout_from 'rails generate heroku_san'
71
78
  assert_partial_output 'create config/heroku.yml', output
72
79
  overwrite_simple_config_file
73
80
  end
74
81
 
75
82
  When /^I create a new config\/heroku\.yml file$/ do
76
- run_simple 'bundle exec rake heroku:create_config'
77
- output = stdout_from 'bundle exec rake heroku:create_config'
83
+ run_clean 'rake heroku:create_config'
84
+ output = stdout_from 'rake heroku:create_config'
78
85
  assert_matching_output %q{Copied example config to ".*.config.heroku.yml"}, output
79
86
  assert_matching_output %q{Please edit ".*.config.heroku.yml" with your application's settings.}, output
80
87
  overwrite_simple_config_file
81
88
  end
82
89
 
83
90
  When /^I create my project on Heroku$/ do
84
- cmd = 'bundle exec rake test_app heroku:create'
85
- run_simple unescape(cmd)
91
+ cmd = 'rake test_app heroku:create'
92
+ run_clean unescape(cmd)
86
93
  output = stdout_from cmd
87
94
  assert_matching_output %q{test_app: Created ([\w-]+)}, output
88
95
 
@@ -95,21 +102,8 @@ When /^I create my project on Heroku$/ do
95
102
  EOT
96
103
  end
97
104
 
98
- When /^I list the remote configuration$/ do
99
- cmd = 'bundle exec rake test_app heroku:config:list'
100
- run_simple unescape(cmd)
101
- output = stdout_from cmd
102
- assert_partial_output "APP_NAME: #{@app}", output
103
- assert_partial_output "URL: #{@app}.heroku.com", output
104
-
105
- @url = output.match(/\bURL:\s+(.*.heroku.com)\b/)[1]
106
- @curl = unescape("curl --silent http://#{@url}")
107
- end
108
-
109
105
  When /^I curl the app home page$/ do
110
- run_simple @curl
111
- output = stdout_from @curl
112
- assert_partial_output '<h1><strong>Heroku | Welcome to your new app!</strong></h1>', output
106
+ Godot.match("#{@app}.herokuapp.com", 80, %r{<h1><strong>Heroku | Welcome to your new app!</strong></h1>}).should be, "Heroku didn't spin up a new app"
113
107
  end
114
108
 
115
109
  When /^I configure my project$/ do
@@ -121,38 +115,36 @@ When /^I configure my project$/ do
121
115
  DROIDS: marvin
122
116
 
123
117
  EOT
124
- cmd = 'bundle exec rake test_app heroku:config'
125
- run_simple cmd
118
+ cmd = 'rake test_app heroku:config'
119
+ run_clean cmd
126
120
  output = stdout_from cmd
127
121
  assert_partial_output 'DROIDS: marvin', output
128
122
  end
129
123
 
130
124
  When /^I turn maintenance on$/ do
131
- run_simple 'bundle exec rake test_app heroku:maintenance_on'
132
- output = stdout_from 'bundle exec rake test_app heroku:maintenance_on'
125
+ run_clean 'rake test_app heroku:maintenance_on'
126
+ output = stdout_from 'rake test_app heroku:maintenance_on'
133
127
  assert_partial_output 'test_app: Maintenance mode enabled.', output
134
-
135
- run_simple @curl
136
- output = stdout_from @curl
137
- assert_partial_output '<title>Offline for Maintenance</title>', output
128
+
129
+ Godot.match("#{@app}.herokuapp.com", 80, %r{<title>Offline for Maintenance</title>}).should be, "App is not offline"
138
130
  end
139
131
 
140
132
  When /^I turn maintenance off$/ do
141
- run_simple 'bundle exec rake test_app heroku:maintenance_off'
142
- output = stdout_from 'bundle exec rake test_app heroku:maintenance_off'
133
+ run_clean 'rake test_app heroku:maintenance_off'
134
+ output = stdout_from 'rake test_app heroku:maintenance_off'
143
135
  assert_partial_output 'test_app: Maintenance mode disabled.', output
144
136
  assert_app_is_running
145
137
  end
146
138
 
147
139
  When /^I restart my project$/ do
148
- run_simple 'bundle exec rake test_app heroku:restart'
149
- output = stdout_from 'bundle exec rake test_app heroku:restart'
140
+ run_clean 'rake test_app heroku:restart'
141
+ output = stdout_from 'rake test_app heroku:restart'
150
142
  assert_partial_output 'test_app: Restarted.', output
151
143
  assert_app_is_running
152
144
  end
153
145
 
154
146
  When /^I generate a scaffold$/ do
155
- run_simple 'bundle exec rails generate scaffold droid'
147
+ run_clean 'rails generate scaffold droid'
156
148
  append_to_file 'app/views/droids/index.html.erb', %Q{\n<div><code><%= ENV['DROIDS'] -%></code></div>\n}
157
149
  end
158
150
 
@@ -166,16 +158,16 @@ EOT
166
158
  end
167
159
 
168
160
  When /^I deploy my project$/ do
169
- run_simple 'bundle exec rake test_app deploy'
170
- assert_partial_output "http://#{@app}.heroku.com deployed to Heroku", all_output
161
+ run_clean 'rake test_app deploy'
162
+ assert_partial_output "http://#{@app}.herokuapp.com deployed to Heroku", all_output
171
163
  end
172
164
 
173
165
  When /^I list all apps on Heroku$/ do
174
166
  sha = in_current_dir do
175
167
  `git rev-parse HEAD`.chomp
176
168
  end
177
- run_simple 'bundle exec rake heroku:apps'
178
- output = stdout_from 'bundle exec rake heroku:apps'
169
+ run_clean 'rake heroku:apps'
170
+ output = stdout_from 'rake heroku:apps'
179
171
  assert_partial_output "test_app is shorthand for the Heroku app #{@app} located at:", output
180
172
  assert_partial_output "git@heroku.com:#{@app}.git", output
181
173
  assert_partial_output "@ #{sha} master", output
@@ -191,24 +183,22 @@ When /^I install an addon$/ do
191
183
 
192
184
  END_CONFIG
193
185
 
194
- run_simple 'bundle exec rake test_app heroku:addons'
195
- output = stdout_from 'bundle exec rake test_app heroku:addons'
196
- # The output should show the default addons...
197
- assert_partial_output "shared-database:5mb", output
198
- # ... and the new one ...
186
+ run_clean 'rake test_app heroku:addons'
187
+ output = stdout_from 'rake test_app heroku:addons'
188
+ # The output should show the new one ...
199
189
  assert_partial_output "deployhooks:campfire", output
200
190
  # ... with a note about needing to configure it.
201
191
  assert_partial_output "https://api.heroku.com/myapps/#{@app}/addons/deployhooks:campfire", output
202
192
  end
203
193
 
204
194
  Then /^heroku_san is green$/ do
205
- run_simple "bundle exec heroku apps:destroy #{@app} --confirm #{@app}"
195
+ run_clean "heroku apps:destroy #{@app} --confirm #{@app}"
206
196
  end
207
197
 
208
198
  def assert_app_is_running
209
- run_simple @curl + "/droids"
210
- output = stdout_from @curl + "/droids"
211
- assert_partial_output %Q{<code>marvin</code>}, output
199
+ vladimir = Godot.new("#{@app}.herokuapp.com", 80)
200
+ vladimir.timeout = 30
201
+ vladimir.match(%r{<code>marvin</code>}, 'droids').should be, "http://#{@app}.herokuapp.com/droids are not the droids I'm looking for"
212
202
  end
213
203
 
214
204
  def overwrite_simple_config_file
@@ -217,4 +207,4 @@ def overwrite_simple_config_file
217
207
  test_app:
218
208
 
219
209
  EOT
220
- end
210
+ end
data/heroku_san.gemspec CHANGED
@@ -11,37 +11,41 @@ Gem::Specification.new do |s|
11
11
  s.description = %q{Manage multiple Heroku instances/apps for a single Rails app using Rake}
12
12
  s.email = %q{elijah.miller@gmail.com}
13
13
  s.homepage = %q{http://github.com/fastestforward/heroku_san}
14
+ s.license = "MIT"
14
15
  s.files = `git ls-files`.split("\n")
15
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
17
  s.require_paths = ["lib"]
17
18
  s.extra_rdoc_files = ["README.md"]
18
19
  s.rubygems_version = %q{1.6.1}
19
- s.summary = %q{A bunch of useful Rake tasks for managing your Heroku apps}
20
+ s.summary = %q{
21
+ A bunch of useful Rake tasks for managing your Heroku apps.
22
+ NOTE: The Heroku Toolbelt must be installed to use this gem.
23
+ https://toolbelt.heroku.com/
24
+ }
20
25
 
21
26
  if s.respond_to? :specification_version then
22
27
  s.specification_version = 3
23
28
 
24
29
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
- s.add_development_dependency(%q<rails>, ['>= 2'])
26
- s.add_runtime_dependency(%q<heroku>, ['>= 2'])
27
30
  s.add_runtime_dependency(%q<heroku-api>, ['>= 0.1.2'])
28
31
  s.add_runtime_dependency(%q<rake>)
29
32
  s.add_runtime_dependency('activesupport')
33
+ s.add_development_dependency(%q<rails>, ['>= 2'])
34
+ s.add_development_dependency(%q<rspec>)
30
35
  s.add_development_dependency(%q<aruba>)
31
36
  s.add_development_dependency(%q<cucumber>)
32
37
  s.add_development_dependency(%q<rake>)
33
38
  s.add_development_dependency(%q<bundler>, ['~> 1.1 '])
34
39
  s.add_development_dependency('git-smart')
40
+ s.add_development_dependency('godot')
35
41
  else
36
42
  s.add_dependency(%q<rails>, ['>= 2'])
37
- s.add_dependency(%q<heroku>, ['>= 2'])
38
43
  s.add_dependency(%q<heroku-api>, ['>= 0.1.2'])
39
44
  s.add_dependency(%q<aruba>)
40
45
  s.add_dependency(%q<cucumber>)
41
46
  end
42
47
  else
43
48
  s.add_dependency(%q<rails>, ['>= 2'])
44
- s.add_dependency(%q<heroku>, ['>= 2'])
45
49
  s.add_dependency(%q<heroku-api>, ['>= 0.1.2'])
46
50
  s.add_dependency(%q<aruba>)
47
51
  s.add_dependency(%q<cucumber>)
@@ -6,7 +6,7 @@ module HerokuSan
6
6
  def deploy
7
7
  # TODO: Add announce/logger
8
8
  super
9
- @stage.rake('db:migrate')
9
+ @stage.run('rake db:migrate')
10
10
  @stage.restart
11
11
  end
12
12
  end
@@ -1,8 +1,8 @@
1
- require 'heroku'
2
- require 'heroku/api'
1
+ require 'heroku-api'
3
2
  require 'json'
4
3
  require 'active_support/core_ext/object/blank'
5
4
  require 'active_support/core_ext/hash/keys'
5
+ require 'active_support/core_ext/hash/slice'
6
6
 
7
7
  MOCK = false unless defined?(MOCK)
8
8
 
@@ -20,7 +20,7 @@ module HerokuSan
20
20
  end
21
21
 
22
22
  def heroku
23
- @heroku ||= Heroku::API.new(:api_key => ENV['HEROKU_API_KEY'] || Heroku::Auth.api_key, :mock => MOCK)
23
+ @heroku ||= Heroku::API.new(:api_key => auth_token, :mock => MOCK)
24
24
  end
25
25
 
26
26
  def app
@@ -48,10 +48,10 @@ module HerokuSan
48
48
  end
49
49
 
50
50
  def run(command, args = nil)
51
- if stack =~ /cedar/
52
- sh_heroku "run #{command} #{args}"
51
+ if stack !~ /aspen|bamboo/
52
+ sh_heroku "run", command, *args
53
53
  else
54
- sh_heroku "run:#{command} #{args}"
54
+ sh_heroku "run:#{command}", *args
55
55
  end
56
56
  end
57
57
 
@@ -61,7 +61,7 @@ module HerokuSan
61
61
  end
62
62
 
63
63
  def migrate
64
- rake('db:migrate')
64
+ run('rake db:migrate')
65
65
  restart
66
66
  end
67
67
 
@@ -69,10 +69,9 @@ module HerokuSan
69
69
  strategy = @options['deploy'].new(self, commit, force)
70
70
  strategy.deploy
71
71
  end
72
-
72
+
73
73
  def rake(*args)
74
- run 'rake', args.join(' ')
75
- # heroku.rake app, args.join(' ')
74
+ raise HerokuSan::Deprecated.new("use Stage#run instead")
76
75
  end
77
76
 
78
77
  def maintenance(action = nil)
@@ -90,20 +89,20 @@ module HerokuSan
90
89
  end
91
90
 
92
91
  def create
93
- params = Hash[@options.select{|k,v| %w[app stack].include? k}].stringify_keys
92
+ params = @options.slice('app', 'stack').stringify_keys
94
93
  params['name'] = params.delete('app')
95
94
  response = heroku.post_app(params)
96
95
  response.body['name']
97
96
  end
98
97
 
99
98
  def sharing_add(email) # DEPREC?
100
- sh_heroku "sharing:add #{email.chomp}"
99
+ raise HerokuSan::Deprecated
101
100
  end
102
-
101
+
103
102
  def sharing_remove(email) # DEPREC?
104
- sh_heroku "sharing:remove #{email.chomp}"
103
+ raise HerokuSan::Deprecated
105
104
  end
106
-
105
+
107
106
  def long_config
108
107
  heroku.get_config_vars(app).body
109
108
  end
@@ -138,9 +137,18 @@ module HerokuSan
138
137
  end
139
138
 
140
139
  private
141
-
142
- def sh_heroku(command)
143
- sh "heroku #{command} --app #{app}"
140
+
141
+ def auth_token
142
+ @auth_token ||= (ENV['HEROKU_API_KEY'] || `heroku auth:token`.chomp unless MOCK)
143
+ end
144
+
145
+ def sh_heroku(*command)
146
+ cmd = (command + ['--app', app]).compact
147
+ show_command = cmd.join(' ')
148
+ $stderr.puts show_command if @debug
149
+ ok = system "heroku", *cmd
150
+ status = $?
151
+ ok or fail "Command failed with status (#{status.exitstatus}): [heroku #{show_command}]"
144
152
  end
145
153
  end
146
154
  end
@@ -42,24 +42,12 @@ namespace :heroku do
42
42
  end
43
43
  end
44
44
 
45
- desc 'Adds a collaborator (asks for email)'
46
45
  task :share do
47
- print "Email address of collaborator to add: "
48
- $stdout.flush
49
- email = $stdin.gets
50
- each_heroku_app do |stage|
51
- stage.sharing_add email
52
- end
46
+ raise HerokuSan::Deprecated
53
47
  end
54
48
 
55
- desc 'Removes a collaborator (asks for email)'
56
49
  task :unshare do
57
- print "Email address of collaborator to remove: "
58
- $stdout.flush
59
- email = $stdin.gets
60
- each_heroku_app do |stage|
61
- stage.sharing_remove email
62
- end
50
+ raise HerokuSan::Deprecated
63
51
  end
64
52
 
65
53
  desc 'Lists configured apps'
@@ -119,7 +107,6 @@ namespace :heroku do
119
107
 
120
108
  desc 'Creates an example configuration file'
121
109
  task :create_config do
122
- # FIXME: sh "rails generate heroku_san"
123
110
  filename = %Q{#{HerokuSan.project.config_file.to_s}}
124
111
  if HerokuSan.project.create_config
125
112
  puts "Copied example config to #{filename.inspect}"
@@ -172,7 +159,7 @@ namespace :heroku do
172
159
  desc 'Runs a rake task remotely'
173
160
  task :rake, [:task] do |t, args|
174
161
  each_heroku_app do |stage|
175
- puts stage.rake args.task
162
+ puts stage.run "rake #{args.task}"
176
163
  end
177
164
  end
178
165
 
@@ -1,3 +1,3 @@
1
1
  module HerokuSan
2
- VERSION = "3.0.4"
2
+ VERSION = "4.0.0"
3
3
  end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ # https://github.com/fastestforward/heroku_san/issues/105
4
+
5
+ =begin
6
+ Expected(202) <=> Actual(422 Unprocessable Entity)
7
+ request => {:connect_timeout=>60, :headers=>{"Accept"=>"application/json", "Accept-Encoding"=>"gzip", "Authorization"=>"Basic OjUwZTc4NjgxZDhmYzcxZDI3Yzc5ZTM3MTZhNDk3Nzk1MzU2Mzk4ZTM=", "User-Agent"=>"heroku-rb/0.1.8", "X-Heroku-API-Version"=>"3", "X-Ruby-Version"=>"1.9.2", "X-Ruby-Platform"=>"x86_64-darwin10.8.0", "Host"=>"api.heroku.com:443", "Content-Length"=>0}, :instrumentor_name=>"excon", :mock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/Users/kmayer/.rvm/gems/ruby-1.9.2-p320/gems/excon-0.13.4/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"api.heroku.com", :path=>"/apps", :port=>"443", :query=>{"app[name]"=>"stark-window-5734"}, :scheme=>"https", :expects=>202, :method=>:post}
8
+ response => #<Excon::Response:0x00000100e07288 @body="{\"error\":\"Name is already taken\"}", @headers={"Cache-Control"=>"no-cache", "Content-Type"=>"application/json; charset=utf-8", "Date"=>"Sun, 29 Jul 2012 19:24:33 GMT", "Server"=>"nginx/1.0.14", "Status"=>"422 Unprocessable Entity", "Strict-Transport-Security"=>"max-age=500", "X-RateLimit-Limit"=>"486", "X-RateLimit-Remaining"=>"485", "X-RateLimit-Reset"=>"1343589933", "X-Runtime"=>"426", "Content-Length"=>"33", "Connection"=>"keep-alive"}, @status=422>
9
+ =end
10
+
11
+ describe "Handle Excon exceptions" do
12
+ it "should report the error in a more readable format"
13
+ end
@@ -8,7 +8,7 @@ module HerokuSan
8
8
  it "calls push, rake db:migrate & restart" do
9
9
  subject = described_class.new(stage, {})
10
10
  stage.should_receive(:push) { "pushed" } # "mock" super
11
- stage.should_receive(:rake).with('db:migrate') { "migrated" }
11
+ stage.should_receive(:run).with('rake db:migrate') { "migrated" }
12
12
  stage.should_receive(:restart) { "restarted" }
13
13
  subject.deploy
14
14
  end
@@ -1,13 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'heroku/client'
3
2
 
4
3
  describe HerokuSan::Stage do
5
4
  include Git
6
- subject { HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7"})}
5
+ subject { HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "cedar"})}
7
6
  STOCK_CONFIG = {"BUNDLE_WITHOUT"=>"development:test", "LANG"=>"en_US.UTF-8", "RACK_ENV"=>"production"}
8
- before do
9
- Heroku::Auth.stub(:api_key) { 'API_KEY' }
10
- end
11
7
 
12
8
  context "initializes" do
13
9
  subject { HerokuSan::Stage.new('production',
@@ -73,13 +69,13 @@ describe HerokuSan::Stage do
73
69
 
74
70
  describe "#run" do
75
71
  it "runs commands using the pre-cedar format" do
76
- subject.should_receive(:sh).with("heroku run:rake foo bar bleh --app awesomeapp")
77
- subject.run 'rake', 'foo bar bleh'
72
+ subject = HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "aspen"})
73
+ subject.should_receive(:system).with("heroku", "run:rake foo bar bleh", "--app", "awesomeapp") { true }
74
+ subject.run 'rake foo bar bleh'
78
75
  end
79
76
  it "runs commands using the new cedar format" do
80
- subject = HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "cedar"})
81
- subject.should_receive(:sh).with("heroku run worker foo bar bleh --app awesomeapp")
82
- subject.run 'worker', 'foo bar bleh'
77
+ subject.should_receive(:system).with("heroku", "run", "worker foo bar bleh", "--app", "awesomeapp") { true }
78
+ subject.run 'worker foo bar bleh'
83
79
  end
84
80
  end
85
81
 
@@ -108,7 +104,7 @@ describe HerokuSan::Stage do
108
104
  describe "#migrate" do
109
105
  it "runs rake db:migrate" do
110
106
  with_app(subject, 'name' => subject.app) do |app_data|
111
- subject.should_receive(:rake).with('db:migrate').and_return 'output:'
107
+ subject.should_receive(:run).with('rake db:migrate').and_return 'output:'
112
108
  subject.migrate.should == "restarted"
113
109
  end
114
110
  end
@@ -192,24 +188,10 @@ describe HerokuSan::Stage do
192
188
  end
193
189
  it "uses the stack from the config" do
194
190
  (@app = subject.create).should == 'awesomeapp'
195
- subject.heroku.get_stack(@app).body.detect{|stack| stack['current']}['name'].should == 'bamboo-ree-1.8.7'
191
+ subject.heroku.get_stack(@app).body.detect{|stack| stack['current']}['name'].should == 'cedar'
196
192
  end
197
193
  end
198
194
 
199
- describe "#sharing_add" do
200
- it "add collaborators" do
201
- subject.should_receive(:sh).with("heroku sharing:add email@example.com --app awesomeapp")
202
- subject.sharing_add 'email@example.com'
203
- end
204
- end
205
-
206
- describe "#sharing_remove" do
207
- it "removes collaborators" do
208
- subject.should_receive(:sh).with("heroku sharing:remove email@example.com --app awesomeapp")
209
- subject.sharing_remove 'email@example.com'
210
- end
211
- end
212
-
213
195
  describe "#long_config" do
214
196
  it "returns the remote config" do
215
197
  with_app(subject, 'name' => subject.app) do |app_data|
@@ -228,11 +210,11 @@ describe HerokuSan::Stage do
228
210
 
229
211
  describe "#logs" do
230
212
  it "returns log files" do
231
- subject.should_receive(:sh).with("heroku logs --app awesomeapp")
213
+ subject.should_receive(:system).with("heroku", "logs", "--app", "awesomeapp") { true }
232
214
  subject.logs
233
215
  end
234
216
  it "tails log files" do
235
- subject.should_receive(:sh).with("heroku logs --tail --app awesomeapp")
217
+ subject.should_receive(:system).with("heroku", "logs --tail", "--app", "awesomeapp") { true }
236
218
  subject.logs(:tail)
237
219
  end
238
220
  end
metadata CHANGED
@@ -1,10 +1,15 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: heroku_san
3
- version: !ruby/object:Gem::Version
4
- version: 3.0.4
3
+ version: !ruby/object:Gem::Version
4
+ hash: 63
5
5
  prerelease:
6
+ segments:
7
+ - 4
8
+ - 0
9
+ - 0
10
+ version: 4.0.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Elijah Miller
9
14
  - Glenn Roberts
10
15
  - Ryan Ahearn
@@ -12,183 +17,183 @@ authors:
12
17
  autorequire:
13
18
  bindir: bin
14
19
  cert_chain: []
15
- date: 2012-07-05 00:00:00.000000000 Z
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
18
- name: rails
19
- requirement: !ruby/object:Gem::Requirement
20
+
21
+ date: 2012-11-09 00:00:00 Z
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
20
25
  none: false
21
- requirements:
22
- - - ! '>='
23
- - !ruby/object:Gem::Version
24
- version: '2'
25
- type: :development
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 31
30
+ segments:
31
+ - 0
32
+ - 1
33
+ - 2
34
+ version: 0.1.2
26
35
  prerelease: false
27
- version_requirements: !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '2'
33
- - !ruby/object:Gem::Dependency
34
- name: heroku
35
- requirement: !ruby/object:Gem::Requirement
36
- none: false
37
- requirements:
38
- - - ! '>='
39
- - !ruby/object:Gem::Version
40
- version: '2'
41
36
  type: :runtime
42
- prerelease: false
43
- version_requirements: !ruby/object:Gem::Requirement
44
- none: false
45
- requirements:
46
- - - ! '>='
47
- - !ruby/object:Gem::Version
48
- version: '2'
49
- - !ruby/object:Gem::Dependency
50
37
  name: heroku-api
51
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ version_requirements: &id002 !ruby/object:Gem::Requirement
52
41
  none: false
53
- requirements:
54
- - - ! '>='
55
- - !ruby/object:Gem::Version
56
- version: 0.1.2
57
- type: :runtime
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
58
49
  prerelease: false
59
- version_requirements: !ruby/object:Gem::Requirement
60
- none: false
61
- requirements:
62
- - - ! '>='
63
- - !ruby/object:Gem::Version
64
- version: 0.1.2
65
- - !ruby/object:Gem::Dependency
50
+ type: :runtime
66
51
  name: rake
67
- requirement: !ruby/object:Gem::Requirement
52
+ requirement: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
68
55
  none: false
69
- requirements:
70
- - - ! '>='
71
- - !ruby/object:Gem::Version
72
- version: '0'
73
- type: :runtime
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
74
63
  prerelease: false
75
- version_requirements: !ruby/object:Gem::Requirement
76
- none: false
77
- requirements:
78
- - - ! '>='
79
- - !ruby/object:Gem::Version
80
- version: '0'
81
- - !ruby/object:Gem::Dependency
64
+ type: :runtime
82
65
  name: activesupport
83
- requirement: !ruby/object:Gem::Requirement
66
+ requirement: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ version_requirements: &id004 !ruby/object:Gem::Requirement
84
69
  none: false
85
- requirements:
86
- - - ! '>='
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- type: :runtime
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 7
74
+ segments:
75
+ - 2
76
+ version: "2"
90
77
  prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- none: false
93
- requirements:
94
- - - ! '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: aruba
99
- requirement: !ruby/object:Gem::Requirement
78
+ type: :development
79
+ name: rails
80
+ requirement: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ version_requirements: &id005 !ruby/object:Gem::Requirement
100
83
  none: false
101
- requirements:
102
- - - ! '>='
103
- - !ruby/object:Gem::Version
104
- version: '0'
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ prerelease: false
105
92
  type: :development
93
+ name: rspec
94
+ requirement: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ version_requirements: &id006 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
106
105
  prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
106
+ type: :development
107
+ name: aruba
108
+ requirement: *id006
109
+ - !ruby/object:Gem::Dependency
110
+ version_requirements: &id007 !ruby/object:Gem::Requirement
108
111
  none: false
109
- requirements:
110
- - - ! '>='
111
- - !ruby/object:Gem::Version
112
- version: '0'
113
- - !ruby/object:Gem::Dependency
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ prerelease: false
120
+ type: :development
114
121
  name: cucumber
115
- requirement: !ruby/object:Gem::Requirement
122
+ requirement: *id007
123
+ - !ruby/object:Gem::Dependency
124
+ version_requirements: &id008 !ruby/object:Gem::Requirement
116
125
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
121
- type: :development
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
132
+ version: "0"
122
133
  prerelease: false
123
- version_requirements: !ruby/object:Gem::Requirement
124
- none: false
125
- requirements:
126
- - - ! '>='
127
- - !ruby/object:Gem::Version
128
- version: '0'
129
- - !ruby/object:Gem::Dependency
134
+ type: :development
130
135
  name: rake
131
- requirement: !ruby/object:Gem::Requirement
136
+ requirement: *id008
137
+ - !ruby/object:Gem::Dependency
138
+ version_requirements: &id009 !ruby/object:Gem::Requirement
132
139
  none: false
133
- requirements:
134
- - - ! '>='
135
- - !ruby/object:Gem::Version
136
- version: '0'
137
- type: :development
140
+ requirements:
141
+ - - ~>
142
+ - !ruby/object:Gem::Version
143
+ hash: 13
144
+ segments:
145
+ - 1
146
+ - 1
147
+ version: "1.1"
138
148
  prerelease: false
139
- version_requirements: !ruby/object:Gem::Requirement
140
- none: false
141
- requirements:
142
- - - ! '>='
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- - !ruby/object:Gem::Dependency
149
+ type: :development
146
150
  name: bundler
147
- requirement: !ruby/object:Gem::Requirement
151
+ requirement: *id009
152
+ - !ruby/object:Gem::Dependency
153
+ version_requirements: &id010 !ruby/object:Gem::Requirement
148
154
  none: false
149
- requirements:
150
- - - ~>
151
- - !ruby/object:Gem::Version
152
- version: '1.1'
153
- type: :development
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ hash: 3
159
+ segments:
160
+ - 0
161
+ version: "0"
154
162
  prerelease: false
155
- version_requirements: !ruby/object:Gem::Requirement
156
- none: false
157
- requirements:
158
- - - ~>
159
- - !ruby/object:Gem::Version
160
- version: '1.1'
161
- - !ruby/object:Gem::Dependency
163
+ type: :development
162
164
  name: git-smart
163
- requirement: !ruby/object:Gem::Requirement
165
+ requirement: *id010
166
+ - !ruby/object:Gem::Dependency
167
+ version_requirements: &id011 !ruby/object:Gem::Requirement
164
168
  none: false
165
- requirements:
166
- - - ! '>='
167
- - !ruby/object:Gem::Version
168
- version: '0'
169
- type: :development
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ hash: 3
173
+ segments:
174
+ - 0
175
+ version: "0"
170
176
  prerelease: false
171
- version_requirements: !ruby/object:Gem::Requirement
172
- none: false
173
- requirements:
174
- - - ! '>='
175
- - !ruby/object:Gem::Version
176
- version: '0'
177
+ type: :development
178
+ name: godot
179
+ requirement: *id011
177
180
  description: Manage multiple Heroku instances/apps for a single Rails app using Rake
178
181
  email: elijah.miller@gmail.com
179
182
  executables: []
183
+
180
184
  extensions: []
181
- extra_rdoc_files:
185
+
186
+ extra_rdoc_files:
182
187
  - README.md
183
- files:
188
+ files:
184
189
  - .gitignore
185
190
  - .travis.yml
186
191
  - CHANGELOG.md
187
192
  - Gemfile
193
+ - Gemfile.lock
188
194
  - LICENSE
189
195
  - README.md
190
196
  - Rakefile
191
- - autotest/discover.rb
192
197
  - cucumber.yml
193
198
  - examples/auto_tagger.rake
194
199
  - examples/deploy_strategies.md
@@ -213,6 +218,7 @@ files:
213
218
  - lib/railtie.rb
214
219
  - lib/tasks/heroku.rake
215
220
  - lib/templates/heroku.example.yml
221
+ - spec/bugs/issue_105_spec.rb
216
222
  - spec/fixtures/example.yml
217
223
  - spec/fixtures/extended_config.yml
218
224
  - spec/fixtures/old_format.yml
@@ -225,38 +231,45 @@ files:
225
231
  - spec/spec_helper.rb
226
232
  - spec/support/heroku.rb
227
233
  homepage: http://github.com/fastestforward/heroku_san
228
- licenses: []
234
+ licenses:
235
+ - MIT
229
236
  post_install_message:
230
237
  rdoc_options: []
231
- require_paths:
238
+
239
+ require_paths:
232
240
  - lib
233
- required_ruby_version: !ruby/object:Gem::Requirement
241
+ required_ruby_version: !ruby/object:Gem::Requirement
234
242
  none: false
235
- requirements:
236
- - - ! '>='
237
- - !ruby/object:Gem::Version
238
- version: '0'
239
- segments:
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ hash: 3
247
+ segments:
240
248
  - 0
241
- hash: -3097599512133406407
242
- required_rubygems_version: !ruby/object:Gem::Requirement
249
+ version: "0"
250
+ required_rubygems_version: !ruby/object:Gem::Requirement
243
251
  none: false
244
- requirements:
245
- - - ! '>='
246
- - !ruby/object:Gem::Version
247
- version: '0'
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ hash: 3
256
+ segments:
257
+ - 0
258
+ version: "0"
248
259
  requirements: []
260
+
249
261
  rubyforge_project:
250
262
  rubygems_version: 1.8.24
251
263
  signing_key:
252
264
  specification_version: 3
253
- summary: A bunch of useful Rake tasks for managing your Heroku apps
254
- test_files:
265
+ summary: "A bunch of useful Rake tasks for managing your Heroku apps. NOTE: The Heroku Toolbelt must be installed to use this gem. https://toolbelt.heroku.com/"
266
+ test_files:
255
267
  - features/config.feature
256
268
  - features/extended-config.feature
257
269
  - features/remote.feature
258
270
  - features/step_definitions/remote_steps.rb
259
271
  - features/support/env.rb
272
+ - spec/bugs/issue_105_spec.rb
260
273
  - spec/fixtures/example.yml
261
274
  - spec/fixtures/extended_config.yml
262
275
  - spec/fixtures/old_format.yml
data/autotest/discover.rb DELETED
@@ -1 +0,0 @@
1
- Autotest.add_discovery { "rspec2" }