suspenders 1.0.1 → 1.1.0
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.
- data/Gemfile.lock +3 -1
- data/NEWS.md +7 -0
- data/README.md +24 -7
- data/features/clearance_false.feature +10 -0
- data/features/github_repo.feature +8 -0
- data/features/heroku_true.feature +9 -0
- data/features/step_definitions/{shell_steps.rb → suspenders_steps.rb} +18 -0
- data/features/support/env.rb +2 -7
- data/features/support/fake_github.rb +21 -0
- data/features/support/fake_heroku.rb +1 -1
- data/features/webkit_false.feature +11 -0
- data/lib/suspenders/app_builder.rb +54 -19
- data/lib/suspenders/generators/app_generator.rb +38 -9
- data/lib/suspenders/version.rb +1 -1
- data/suspenders.gemspec +5 -4
- data/templates/Gemfile_additions +2 -2
- data/templates/Guardfile +12 -0
- data/templates/README.md.erb +318 -234
- data/templates/features_support_env.rb +16 -0
- metadata +32 -13
- data/GOALS +0 -2
- data/features/creating_a_heroku_app.feature +0 -9
- data/features/skipping_clearance.feature +0 -13
- data/features/step_definitions/gem_steps.rb +0 -5
- data/features/step_definitions/heroku_steps.rb +0 -3
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
suspenders (1.0.
|
4
|
+
suspenders (1.0.1)
|
5
5
|
bundler (>= 1.1)
|
6
|
+
hub (~> 1.10.2)
|
6
7
|
rails (= 3.2.6)
|
7
8
|
|
8
9
|
GEM
|
@@ -56,6 +57,7 @@ GEM
|
|
56
57
|
gherkin (2.9.3)
|
57
58
|
json (>= 1.4.6)
|
58
59
|
hike (1.2.1)
|
60
|
+
hub (1.10.2)
|
59
61
|
i18n (0.6.0)
|
60
62
|
journey (1.0.4)
|
61
63
|
json (1.6.6)
|
data/NEWS.md
CHANGED
data/README.md
CHANGED
@@ -27,29 +27,27 @@ which will be appended to the default generated projectname/Gemfile.
|
|
27
27
|
|
28
28
|
It includes application gems like:
|
29
29
|
|
30
|
-
* [Paperclip](https://github.com/thoughtbot/paperclip) for file uploads
|
31
|
-
* [Formtastic](https://github.com/justinfrench/formtastic) for better forms
|
32
30
|
* [Airbrake](https://github.com/airbrake/airbrake) for exception notification
|
33
|
-
* [Flutie](https://github.com/thoughtbot/flutie) for default CSS styles
|
34
31
|
* [Bourbon](https://github.com/thoughtbot/bourbon) for classy sass mixins
|
35
32
|
* [Clearance](https://github.com/thoughtbot/clearance) for authentication
|
33
|
+
* [Flutie](https://github.com/thoughtbot/flutie) for default CSS styles
|
34
|
+
* [Formtastic](https://github.com/justinfrench/formtastic) for better forms
|
35
|
+
* [Paperclip](https://github.com/thoughtbot/paperclip) for file uploads
|
36
36
|
|
37
37
|
And testing gems like:
|
38
38
|
|
39
|
+
* [Bourne](https://github.com/thoughtbot/bourne) and Mocha for stubbing and spying
|
39
40
|
* [Cucumber, Capybara, and Capybara Webkit](http://robots.thoughtbot.com/post/4583605733/capybara-webkit) for integration testing, including Javascript behavior
|
40
|
-
* [RSpec](https://github.com/rspec/rspec) for awesome, readable isolation testing
|
41
41
|
* [Factory Girl](https://github.com/thoughtbot/factory_girl) for easier creation of test data
|
42
|
+
* [RSpec](https://github.com/rspec/rspec) for awesome, readable isolation testing
|
42
43
|
* [Shoulda Matchers](http://github.com/thoughtbot/shoulda-matchers) for frequently needed Rails and RSpec matchers
|
43
44
|
* [Timecop](https://github.com/jtrupiano/timecop) for dealing with time
|
44
|
-
* [Bourne](https://github.com/thoughtbot/bourne) and Mocha for stubbing and spying
|
45
|
-
* [email_spec](https://github.com/bmabey/email-spec) for testing emails.
|
46
45
|
|
47
46
|
Other goodies
|
48
47
|
-------------
|
49
48
|
|
50
49
|
Suspenders also comes with:
|
51
50
|
|
52
|
-
* [jQuery](https://github.com/jquery/jquery) for Javascript pleasantry
|
53
51
|
* Rails' flashes set up and in application layout.
|
54
52
|
* A few nice time formats.
|
55
53
|
|
@@ -65,6 +63,17 @@ This has the same effect as running:
|
|
65
63
|
heroku create app-staging --remote staging
|
66
64
|
heroku create app-production --remote production
|
67
65
|
|
66
|
+
Github
|
67
|
+
------
|
68
|
+
|
69
|
+
You can optionally create a Github repository:
|
70
|
+
|
71
|
+
suspenders app --github organization/project
|
72
|
+
|
73
|
+
This has the same effect as running:
|
74
|
+
|
75
|
+
hub create organization/project
|
76
|
+
|
68
77
|
Clearance
|
69
78
|
---------
|
70
79
|
|
@@ -72,6 +81,14 @@ You can optionally not include Clearance:
|
|
72
81
|
|
73
82
|
suspenders app --clearance false
|
74
83
|
|
84
|
+
Capybara Webkit
|
85
|
+
---------------
|
86
|
+
|
87
|
+
You can optionally not include Capybara Webkit (which depends on QT being
|
88
|
+
installed on your machine):
|
89
|
+
|
90
|
+
suspenders app --webkit false
|
91
|
+
|
75
92
|
Dependencies
|
76
93
|
------------
|
77
94
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
@disable-bundler
|
2
|
+
Feature: Skipping Clearance
|
3
|
+
|
4
|
+
Scenario: --clearance=false
|
5
|
+
When I suspend a project called "test_project" with:
|
6
|
+
| argument | value |
|
7
|
+
| --clearance | false |
|
8
|
+
And I cd to the "test_project" root
|
9
|
+
Then "clearance" should not be installed
|
10
|
+
And I can cleanly rake the project
|
@@ -0,0 +1,8 @@
|
|
1
|
+
@disable-bundler
|
2
|
+
Feature: Creating a Github repo
|
3
|
+
|
4
|
+
Scenario: --github=organization/project
|
5
|
+
When I suspend a project called "test_project" with:
|
6
|
+
| argument | value |
|
7
|
+
| --github | organization/project |
|
8
|
+
Then the "organization/project" Github repo should exist
|
@@ -0,0 +1,9 @@
|
|
1
|
+
@disable-bundler
|
2
|
+
Feature: Creating a Heroku app
|
3
|
+
|
4
|
+
Scenario: --heroku=true
|
5
|
+
When I suspend a project called "test_project" with:
|
6
|
+
| argument | value |
|
7
|
+
| --heroku | true |
|
8
|
+
Then the "test_project-staging" Heroku app should exist
|
9
|
+
And the "test_project-production" Heroku app should exist
|
@@ -53,3 +53,21 @@ Then 'I can cleanly rake the project' do
|
|
53
53
|
Then I see a successful response in the shell
|
54
54
|
}
|
55
55
|
end
|
56
|
+
|
57
|
+
Then /^"(.*)" should not be installed$/ do |gem_name|
|
58
|
+
in_current_dir do
|
59
|
+
system("bundle show #{gem_name} 2>&1 > /dev/null").should be_false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
Then /^"(.*)" should not be included in "(.*)"$/ do |content, file_path|
|
64
|
+
check_file_content file_path, content, false
|
65
|
+
end
|
66
|
+
|
67
|
+
Then /^the "([^"]*)" Heroku app should exist$/ do |app_name|
|
68
|
+
FakeHeroku.should have_created_app(app_name)
|
69
|
+
end
|
70
|
+
|
71
|
+
Then /^the "([^"]*)" Github repo should exist$/ do |repo_name|
|
72
|
+
FakeGithub.should have_created_repo(repo_name)
|
73
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
class FakeGithub
|
2
|
+
RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'hub_commands'), File.dirname(__FILE__))
|
3
|
+
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
end
|
7
|
+
|
8
|
+
def run!
|
9
|
+
File.open(RECORDER, 'a') do |file|
|
10
|
+
file.write @args.join(' ')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.clear!
|
15
|
+
FileUtils.rm_rf RECORDER
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.has_created_repo?(repo_name)
|
19
|
+
File.open(RECORDER, 'r').read.include?("create #{repo_name}")
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
@disable-bundler
|
2
|
+
Feature: Skipping Capybara Webkit
|
3
|
+
|
4
|
+
Scenario: --webkit=false
|
5
|
+
When I suspend a project called "test_project" with:
|
6
|
+
| argument | value |
|
7
|
+
| --webkit | false |
|
8
|
+
And I cd to the "test_project" root
|
9
|
+
Then "capybara-webkit" should not be installed
|
10
|
+
And "webkit" should not be included in "features/support/env.rb"
|
11
|
+
And I can cleanly rake the project
|
@@ -55,24 +55,40 @@ module Suspenders
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def use_postgres_config_template
|
58
|
-
template 'postgresql_database.yml.erb', 'config/database.yml',
|
58
|
+
template 'postgresql_database.yml.erb', 'config/database.yml',
|
59
|
+
:force => true
|
59
60
|
end
|
60
61
|
|
61
62
|
def create_database
|
62
63
|
bundle_command 'exec rake db:create'
|
63
64
|
end
|
64
65
|
|
65
|
-
def
|
66
|
+
def add_custom_gems
|
66
67
|
additions_path = find_in_source_paths 'Gemfile_additions'
|
67
68
|
new_gems = File.open(additions_path).read
|
68
|
-
inject_into_file 'Gemfile', "\n#{new_gems}",
|
69
|
+
inject_into_file 'Gemfile', "\n#{new_gems}",
|
70
|
+
:after => /gem 'jquery-rails'/
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_clearance_gem
|
74
|
+
inject_into_file 'Gemfile', "\ngem 'clearance'",
|
75
|
+
:after => /gem 'jquery-rails'/
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_capybara_webkit_gem
|
79
|
+
inject_into_file 'Gemfile', "\n gem 'capybara-webkit', '~> 0.11.0'",
|
80
|
+
:after => /gem 'cucumber-rails', '1.3.0'/
|
69
81
|
end
|
70
82
|
|
71
83
|
def configure_rspec
|
72
84
|
generators_config = <<-RUBY
|
73
|
-
|
74
|
-
|
75
|
-
|
85
|
+
config.generators do |generate|
|
86
|
+
generate.test_framework :rspec
|
87
|
+
generate.helper false
|
88
|
+
generate.stylesheets false
|
89
|
+
generate.javascript_engine false
|
90
|
+
generate.view_specs false
|
91
|
+
end
|
76
92
|
RUBY
|
77
93
|
inject_into_class 'config/application.rb', 'Application', generators_config
|
78
94
|
end
|
@@ -86,18 +102,27 @@ module Suspenders
|
|
86
102
|
|
87
103
|
def generate_rspec
|
88
104
|
generate 'rspec:install'
|
105
|
+
inject_into_file '.rspec', " --drb", :after => '--color'
|
89
106
|
replace_in_file 'spec/spec_helper.rb',
|
90
107
|
'# config.mock_with :mocha', 'config.mock_with :mocha'
|
91
108
|
end
|
92
109
|
|
93
|
-
def generate_cucumber
|
110
|
+
def generate_cucumber(options = {})
|
94
111
|
generate 'cucumber:install', '--rspec', '--capybara'
|
95
|
-
inject_into_file 'features/support/env.rb',
|
96
|
-
%{Capybara.save_and_open_page_path = 'tmp'\n} +
|
97
|
-
%{Capybara.javascript_driver = :webkit\n},
|
98
|
-
:before => %{Capybara.default_selector = :css}
|
99
112
|
inject_into_file 'config/cucumber.yml',
|
100
|
-
' -r features', :after => %{default: <%= std_opts %> features}
|
113
|
+
' -drb -r features', :after => %{default: <%= std_opts %> features}
|
114
|
+
copy_file 'features_support_env.rb', 'features/support/env.rb',
|
115
|
+
:force => true
|
116
|
+
|
117
|
+
if options[:webkit]
|
118
|
+
inject_into_file 'features/support/env.rb',
|
119
|
+
"\n Capybara.javascript_driver = :webkit",
|
120
|
+
:after => /Capybara.default_selector = :css/
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def setup_guard_spork
|
125
|
+
copy_file 'Guardfile', 'Guardfile'
|
101
126
|
end
|
102
127
|
|
103
128
|
def generate_clearance
|
@@ -137,11 +162,7 @@ module Suspenders
|
|
137
162
|
end
|
138
163
|
|
139
164
|
def create_heroku_apps
|
140
|
-
|
141
|
-
if ENV['TESTING']
|
142
|
-
support_bin = File.expand_path(File.join('..', '..', '..', 'features', 'support', 'bin'))
|
143
|
-
path_addition = "PATH=#{support_bin}:$PATH"
|
144
|
-
end
|
165
|
+
path_addition = override_path_for_tests
|
145
166
|
run "#{path_addition} heroku create #{app_name}-production --remote=production"
|
146
167
|
run "#{path_addition} heroku create #{app_name}-staging --remote=staging"
|
147
168
|
end
|
@@ -152,6 +173,11 @@ module Suspenders
|
|
152
173
|
inject_into_file('README.md', "#{documentation}\n", :before => 'Most importantly')
|
153
174
|
end
|
154
175
|
|
176
|
+
def create_github_repo(repo_name)
|
177
|
+
path_addition = override_path_for_tests
|
178
|
+
run "#{path_addition} hub create #{repo_name}"
|
179
|
+
end
|
180
|
+
|
155
181
|
def copy_miscellaneous_files
|
156
182
|
copy_file 'errors.rb', 'config/initializers/errors.rb'
|
157
183
|
copy_file 'time_formats.rb', 'config/initializers/time_formats.rb'
|
@@ -177,6 +203,10 @@ module Suspenders
|
|
177
203
|
route "root :to => 'Clearance::Sessions#new'"
|
178
204
|
end
|
179
205
|
|
206
|
+
def remove_routes_comment_lines
|
207
|
+
replace_in_file 'config/routes.rb', /Application\.routes\.draw do.*end/m, "Application.routes.draw do\nend"
|
208
|
+
end
|
209
|
+
|
180
210
|
def set_attr_accessibles_on_user
|
181
211
|
inject_into_file 'app/models/user.rb',
|
182
212
|
' attr_accessible :email, :password\n',
|
@@ -197,8 +227,13 @@ module Suspenders
|
|
197
227
|
end
|
198
228
|
end
|
199
229
|
|
200
|
-
|
201
|
-
|
230
|
+
private
|
231
|
+
|
232
|
+
def override_path_for_tests
|
233
|
+
if ENV['TESTING']
|
234
|
+
support_bin = File.expand_path(File.join('..', '..', '..', 'features', 'support', 'bin'))
|
235
|
+
"PATH=#{support_bin}:$PATH"
|
236
|
+
end
|
202
237
|
end
|
203
238
|
end
|
204
239
|
end
|
@@ -3,17 +3,23 @@ require 'rails/generators/rails/app/app_generator'
|
|
3
3
|
|
4
4
|
module Suspenders
|
5
5
|
class AppGenerator < Rails::Generators::AppGenerator
|
6
|
+
class_option :clearance, :type => :boolean, :aliases => '-C', :default => true,
|
7
|
+
:desc => 'Add the Clearance Rails authentication library'
|
8
|
+
|
6
9
|
class_option :database, :type => :string, :aliases => '-d', :default => 'postgresql',
|
7
10
|
:desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})"
|
8
11
|
|
12
|
+
class_option :heroku, :type => :boolean, :aliases => '-H', :default => false,
|
13
|
+
:desc => 'Create staging and production Heroku apps'
|
14
|
+
|
15
|
+
class_option :github, :type => :string, :aliases => '-G', :default => nil,
|
16
|
+
:desc => 'Create Github repository and add remote origin pointed to repo'
|
17
|
+
|
9
18
|
class_option :skip_test_unit, :type => :boolean, :aliases => '-T', :default => true,
|
10
19
|
:desc => 'Skip Test::Unit files'
|
11
20
|
|
12
|
-
class_option :
|
13
|
-
:desc => '
|
14
|
-
|
15
|
-
class_option :clearance, :type => :boolean, :aliases => '-C', :default => true,
|
16
|
-
:desc => 'Add the clearance Rails authentication library'
|
21
|
+
class_option :webkit, :type => :boolean, :aliases => '-W', :default => true,
|
22
|
+
:desc => 'Add the Capybara Webkit Javascript integration testing library'
|
17
23
|
|
18
24
|
def finish_template
|
19
25
|
invoke :suspenders_customization
|
@@ -33,9 +39,11 @@ module Suspenders
|
|
33
39
|
invoke :setup_stylesheets
|
34
40
|
invoke :copy_miscellaneous_files
|
35
41
|
invoke :customize_error_pages
|
42
|
+
invoke :remove_routes_comment_lines
|
36
43
|
invoke :setup_root_route
|
37
44
|
invoke :setup_git
|
38
45
|
invoke :create_heroku_apps
|
46
|
+
invoke :create_github_repo
|
39
47
|
invoke :outro
|
40
48
|
end
|
41
49
|
|
@@ -74,18 +82,26 @@ module Suspenders
|
|
74
82
|
end
|
75
83
|
|
76
84
|
def customize_gemfile
|
77
|
-
build :
|
85
|
+
build :add_custom_gems
|
86
|
+
|
78
87
|
if options[:clearance]
|
79
88
|
build :add_clearance_gem
|
80
89
|
end
|
90
|
+
|
91
|
+
if options[:webkit]
|
92
|
+
build :add_capybara_webkit_gem
|
93
|
+
end
|
94
|
+
|
81
95
|
bundle_command 'install'
|
82
96
|
end
|
83
97
|
|
84
98
|
def setup_database
|
85
99
|
say 'Setting up database'
|
100
|
+
|
86
101
|
if 'postgresql' == options[:database]
|
87
102
|
build :use_postgres_config_template
|
88
103
|
end
|
104
|
+
|
89
105
|
build :create_database
|
90
106
|
end
|
91
107
|
|
@@ -94,7 +110,8 @@ module Suspenders
|
|
94
110
|
build :configure_rspec
|
95
111
|
build :configure_action_mailer
|
96
112
|
build :generate_rspec
|
97
|
-
build :generate_cucumber
|
113
|
+
build :generate_cucumber, :webkit => options[:webkit]
|
114
|
+
build :setup_guard_spork
|
98
115
|
build :add_email_validator
|
99
116
|
build :setup_default_rake_task
|
100
117
|
build :setup_clearance
|
@@ -104,6 +121,7 @@ module Suspenders
|
|
104
121
|
if options[:clearance]
|
105
122
|
build :generate_clearance
|
106
123
|
build :include_clearance_matchers
|
124
|
+
|
107
125
|
if using_active_record?
|
108
126
|
build :set_attr_accessibles_on_user
|
109
127
|
end
|
@@ -122,13 +140,20 @@ module Suspenders
|
|
122
140
|
end
|
123
141
|
|
124
142
|
def create_heroku_apps
|
125
|
-
if options[
|
126
|
-
say 'Creating
|
143
|
+
if options[:heroku]
|
144
|
+
say 'Creating Heroku apps'
|
127
145
|
build :create_heroku_apps
|
128
146
|
build :document_heroku
|
129
147
|
end
|
130
148
|
end
|
131
149
|
|
150
|
+
def create_github_repo
|
151
|
+
if options[:github]
|
152
|
+
say 'Creating Github repo'
|
153
|
+
build :create_github_repo, options[:github]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
132
157
|
def setup_gitignore
|
133
158
|
build :gitignore_files
|
134
159
|
end
|
@@ -147,6 +172,10 @@ module Suspenders
|
|
147
172
|
build :customize_error_pages
|
148
173
|
end
|
149
174
|
|
175
|
+
def remove_routes_comment_lines
|
176
|
+
build :remove_routes_comment_lines
|
177
|
+
end
|
178
|
+
|
150
179
|
def setup_root_route
|
151
180
|
if options[:clearance]
|
152
181
|
say 'Setting up a root route'
|