bretels 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/Gemfile.lock +95 -0
- data/LICENSE +21 -0
- data/README.md +38 -0
- data/Rakefile +2 -0
- data/bin/bretels +16 -0
- data/bretels.gemspec +32 -0
- data/lib/bretels/actions.rb +35 -0
- data/lib/bretels/app_builder.rb +272 -0
- data/lib/bretels/generators/app_generator.rb +178 -0
- data/lib/bretels/version.rb +3 -0
- data/templates/Gemfile_clean +40 -0
- data/templates/Procfile +1 -0
- data/templates/README.md.erb +9 -0
- data/templates/_flashes.html.erb +5 -0
- data/templates/_javascript.html.erb +9 -0
- data/templates/bin_setup +11 -0
- data/templates/config_locales_nl.yml +11 -0
- data/templates/database_cleaner_rspec.rb +21 -0
- data/templates/disable_xml_params.rb +3 -0
- data/templates/email_validator.rb +7 -0
- data/templates/errors.rb +28 -0
- data/templates/factories.rb +9 -0
- data/templates/factories_spec.rb +14 -0
- data/templates/factory_girl_syntax_rspec.rb +3 -0
- data/templates/postgresql_database.yml.erb +11 -0
- data/templates/rack_timeout.rb +1 -0
- data/templates/rspec +1 -0
- data/templates/sample.env +2 -0
- data/templates/spec_helper.rb +16 -0
- data/templates/staging.rb.erb +4 -0
- data/templates/strong_parameters.rb +1 -0
- data/templates/suspenders_gitignore +15 -0
- data/templates/suspenders_layout.html.erb.erb +18 -0
- data/templates/unicorn.rb +24 -0
- metadata +140 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bretels (1.0.0)
|
5
|
+
bundler (>= 1.1)
|
6
|
+
hub (~> 1.10.2)
|
7
|
+
rails (= 3.2.12)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
actionmailer (3.2.12)
|
13
|
+
actionpack (= 3.2.12)
|
14
|
+
mail (~> 2.4.4)
|
15
|
+
actionpack (3.2.12)
|
16
|
+
activemodel (= 3.2.12)
|
17
|
+
activesupport (= 3.2.12)
|
18
|
+
builder (~> 3.0.0)
|
19
|
+
erubis (~> 2.7.0)
|
20
|
+
journey (~> 1.0.4)
|
21
|
+
rack (~> 1.4.5)
|
22
|
+
rack-cache (~> 1.2)
|
23
|
+
rack-test (~> 0.6.1)
|
24
|
+
sprockets (~> 2.2.1)
|
25
|
+
activemodel (3.2.12)
|
26
|
+
activesupport (= 3.2.12)
|
27
|
+
builder (~> 3.0.0)
|
28
|
+
activerecord (3.2.12)
|
29
|
+
activemodel (= 3.2.12)
|
30
|
+
activesupport (= 3.2.12)
|
31
|
+
arel (~> 3.0.2)
|
32
|
+
tzinfo (~> 0.3.29)
|
33
|
+
activeresource (3.2.12)
|
34
|
+
activemodel (= 3.2.12)
|
35
|
+
activesupport (= 3.2.12)
|
36
|
+
activesupport (3.2.12)
|
37
|
+
i18n (~> 0.6)
|
38
|
+
multi_json (~> 1.0)
|
39
|
+
arel (3.0.2)
|
40
|
+
builder (3.0.4)
|
41
|
+
erubis (2.7.0)
|
42
|
+
hike (1.2.1)
|
43
|
+
hub (1.10.4)
|
44
|
+
i18n (0.6.4)
|
45
|
+
journey (1.0.4)
|
46
|
+
json (1.7.6)
|
47
|
+
mail (2.4.4)
|
48
|
+
i18n (>= 0.4.0)
|
49
|
+
mime-types (~> 1.16)
|
50
|
+
treetop (~> 1.4.8)
|
51
|
+
mime-types (1.21)
|
52
|
+
multi_json (1.7.0)
|
53
|
+
polyglot (0.3.3)
|
54
|
+
rack (1.4.5)
|
55
|
+
rack-cache (1.2)
|
56
|
+
rack (>= 0.4)
|
57
|
+
rack-ssl (1.3.3)
|
58
|
+
rack
|
59
|
+
rack-test (0.6.2)
|
60
|
+
rack (>= 1.0)
|
61
|
+
rails (3.2.12)
|
62
|
+
actionmailer (= 3.2.12)
|
63
|
+
actionpack (= 3.2.12)
|
64
|
+
activerecord (= 3.2.12)
|
65
|
+
activeresource (= 3.2.12)
|
66
|
+
activesupport (= 3.2.12)
|
67
|
+
bundler (~> 1.0)
|
68
|
+
railties (= 3.2.12)
|
69
|
+
railties (3.2.12)
|
70
|
+
actionpack (= 3.2.12)
|
71
|
+
activesupport (= 3.2.12)
|
72
|
+
rack-ssl (~> 1.3.2)
|
73
|
+
rake (>= 0.8.7)
|
74
|
+
rdoc (~> 3.4)
|
75
|
+
thor (>= 0.14.6, < 2.0)
|
76
|
+
rake (10.0.3)
|
77
|
+
rdoc (3.12.2)
|
78
|
+
json (~> 1.4)
|
79
|
+
sprockets (2.2.2)
|
80
|
+
hike (~> 1.2)
|
81
|
+
multi_json (~> 1.0)
|
82
|
+
rack (~> 1.0)
|
83
|
+
tilt (~> 1.1, != 1.3.0)
|
84
|
+
thor (0.17.0)
|
85
|
+
tilt (1.3.5)
|
86
|
+
treetop (1.4.12)
|
87
|
+
polyglot
|
88
|
+
polyglot (>= 0.3.1)
|
89
|
+
tzinfo (0.3.37)
|
90
|
+
|
91
|
+
PLATFORMS
|
92
|
+
ruby
|
93
|
+
|
94
|
+
DEPENDENCIES
|
95
|
+
bretels!
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2010-2012 Mike Burns and thoughtbot, inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Bretels
|
2
|
+
|
3
|
+
Bretels is the base Rails application used at [brightin](http://brightin.nl). Big thanks to [thoughtbot](http://thoughtbot.com) for providing such a great starting point.
|
4
|
+
|
5
|
+
![Suspenders boy](http://media.tumblr.com/1TEAMALpseh5xzf0Jt6bcwSMo1_400.png)
|
6
|
+
|
7
|
+
Installation
|
8
|
+
------------
|
9
|
+
|
10
|
+
First install the bretels gem:
|
11
|
+
|
12
|
+
gem install bretels
|
13
|
+
|
14
|
+
Then run:
|
15
|
+
|
16
|
+
bretels projectname
|
17
|
+
|
18
|
+
This will create a Rails 3.2 app in `projectname`. This script creates a
|
19
|
+
new git repository. It is not meant to be used against an existing repo.
|
20
|
+
|
21
|
+
Dependencies
|
22
|
+
------------
|
23
|
+
|
24
|
+
Some gems included have native extensions. You should have GCC
|
25
|
+
installed on your machine before generating an app with Suspenders.
|
26
|
+
|
27
|
+
Use [OS X GCC Installer](https://github.com/kennethreitz/osx-gcc-installer/) for
|
28
|
+
Snow Leopard (OS X 10.6).
|
29
|
+
|
30
|
+
Use [Command Line Tools for XCode](https://developer.apple.com/downloads/index.action)
|
31
|
+
for Lion (OS X 10.7) or Mountain Lion (OS X 10.8).
|
32
|
+
|
33
|
+
We use [Capybara Webkit](https://github.com/thoughtbot/capybara-webkit) for
|
34
|
+
full-stack Javascript integration testing. It requires QT. Instructions for
|
35
|
+
installing QT are
|
36
|
+
[here](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit).
|
37
|
+
|
38
|
+
PostgreSQL needs to be installed and running for the `db:create` rake task.
|
data/Rakefile
ADDED
data/bin/bretels
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join('..', 'lib', 'bretels', 'generators', 'app_generator'), File.dirname(__FILE__))
|
4
|
+
require File.expand_path(File.join('..', 'lib', 'bretels', 'actions'), File.dirname(__FILE__))
|
5
|
+
require File.expand_path(File.join('..', 'lib', 'bretels', 'app_builder'), File.dirname(__FILE__))
|
6
|
+
|
7
|
+
if ['create', '--create'].include? ARGV[0]
|
8
|
+
ARGV.shift
|
9
|
+
puts "[WARNING] the bretels create argument is deprecated. Just use `bretels #{ARGV.join}` instead"
|
10
|
+
end
|
11
|
+
|
12
|
+
templates_root = File.expand_path(File.join("..", "templates"), File.dirname(__FILE__))
|
13
|
+
Bretels::AppGenerator.source_root templates_root
|
14
|
+
Bretels::AppGenerator.source_paths << Rails::Generators::AppGenerator.source_root << templates_root
|
15
|
+
|
16
|
+
Bretels::AppGenerator.start
|
data/bretels.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require 'bretels/version'
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'bretels'
|
8
|
+
s.version = Bretels::VERSION
|
9
|
+
s.date = Date.today.strftime('%Y-%m-%d')
|
10
|
+
s.authors = ['brightin', 'thoughtbot']
|
11
|
+
s.email = 'developers@brightin.com'
|
12
|
+
s.homepage = 'http://github.com/brightin/bretels'
|
13
|
+
|
14
|
+
s.summary = "Generate a Rails app using brightins's best practices."
|
15
|
+
s.description = <<-HERE
|
16
|
+
Fork of thoughtbot's Suspenders for use at Brightin.
|
17
|
+
HERE
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n").
|
20
|
+
reject { |file| file =~ /^\./ }.
|
21
|
+
reject { |file| file =~ /^(rdoc|pkg)/ }
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
|
26
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
27
|
+
s.extra_rdoc_files = %w[README.md LICENSE]
|
28
|
+
|
29
|
+
s.add_dependency 'rails', '3.2.12'
|
30
|
+
s.add_dependency 'bundler', '>= 1.1'
|
31
|
+
s.add_dependency 'hub', '~> 1.10.2'
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Bretels
|
2
|
+
module Actions
|
3
|
+
def concat_file(source, destination)
|
4
|
+
contents = IO.read(find_in_source_paths(source))
|
5
|
+
append_file destination, contents
|
6
|
+
end
|
7
|
+
|
8
|
+
def replace_in_file(relative_path, find, replace)
|
9
|
+
path = File.join(destination_root, relative_path)
|
10
|
+
contents = IO.read(path)
|
11
|
+
unless contents.gsub!(find, replace)
|
12
|
+
raise "#{find.inspect} not found in #{relative_path}"
|
13
|
+
end
|
14
|
+
File.open(path, "w") { |file| file.write(contents) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def action_mailer_host(rails_env, host)
|
18
|
+
inject_into_file(
|
19
|
+
"config/environments/#{rails_env}.rb",
|
20
|
+
"\n\n config.action_mailer.default_url_options = { :host => '#{host}' }",
|
21
|
+
:before => "\nend"
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def download_file(uri_string, destination)
|
26
|
+
uri = URI.parse(uri_string)
|
27
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
28
|
+
http.use_ssl = true if uri_string =~ /^https/
|
29
|
+
request = Net::HTTP::Get.new(uri.path)
|
30
|
+
contents = http.request(request).body
|
31
|
+
path = File.join(destination_root, destination)
|
32
|
+
File.open(path, "w") { |file| file.write(contents) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,272 @@
|
|
1
|
+
module Bretels
|
2
|
+
class AppBuilder < Rails::AppBuilder
|
3
|
+
include Bretels::Actions
|
4
|
+
|
5
|
+
def readme
|
6
|
+
template 'README.md.erb', 'README.md'
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove_public_index
|
10
|
+
remove_file 'public/index.html'
|
11
|
+
end
|
12
|
+
|
13
|
+
def remove_rails_logo_image
|
14
|
+
remove_file 'app/assets/images/rails.png'
|
15
|
+
end
|
16
|
+
|
17
|
+
def raise_delivery_errors
|
18
|
+
replace_in_file 'config/environments/development.rb',
|
19
|
+
'raise_delivery_errors = false', 'raise_delivery_errors = true'
|
20
|
+
end
|
21
|
+
|
22
|
+
def enable_factory_girl_syntax
|
23
|
+
copy_file 'factory_girl_syntax_rspec.rb', 'spec/support/factory_girl.rb'
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_factories_first
|
27
|
+
copy_file 'factories_spec.rb', 'spec/models/factories_spec.rb'
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_factories_file
|
31
|
+
template 'factories.rb', 'spec/factories.rb'
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_cdn_settings
|
35
|
+
config = <<-RUBY
|
36
|
+
\n\n # Cloudfront settings
|
37
|
+
# config.static_cache_control = "public, max-age=31536000"
|
38
|
+
# config.action_controller.asset_host = ENV['ASSET_HOST']
|
39
|
+
RUBY
|
40
|
+
|
41
|
+
inject_into_file 'config.ru', "use Rack::Deflater\n",
|
42
|
+
:before => "run #{app_const}"
|
43
|
+
|
44
|
+
inject_into_file 'config/environments/production.rb', config.rstrip,
|
45
|
+
:after => "config.assets.digest = true"
|
46
|
+
end
|
47
|
+
|
48
|
+
def configure_smtp
|
49
|
+
config = <<-RUBY
|
50
|
+
\n\n ActionMailer::Base.smtp_settings = {
|
51
|
+
:address => 'smtp.sendgrid.net',
|
52
|
+
:port => '587',
|
53
|
+
:authentication => :plain,
|
54
|
+
:user_name => ENV['SENDGRID_USERNAME'],
|
55
|
+
:password => ENV['SENDGRID_PASSWORD'],
|
56
|
+
:domain => 'herokuapp.com',
|
57
|
+
:enable_starttls_auto => true
|
58
|
+
}
|
59
|
+
config.action_mailer.delivery_method = :smtp
|
60
|
+
RUBY
|
61
|
+
|
62
|
+
inject_into_file 'config/environments/production.rb', config.rstrip,
|
63
|
+
:after => 'config.action_mailer.raise_delivery_errors = false'
|
64
|
+
|
65
|
+
inject_into_file(
|
66
|
+
"config/environments/development.rb",
|
67
|
+
"\n\n config.action_mailer.delivery_method = :letter_opener",
|
68
|
+
:before => "\nend"
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
def enable_force_ssl
|
73
|
+
replace_in_file 'config/environments/production.rb',
|
74
|
+
'# config.force_ssl = true', 'config.force_ssl = true'
|
75
|
+
end
|
76
|
+
|
77
|
+
def setup_staging_environment
|
78
|
+
template 'staging.rb.erb', 'config/environments/staging.rb'
|
79
|
+
end
|
80
|
+
|
81
|
+
def initialize_on_precompile
|
82
|
+
inject_into_file 'config/application.rb',
|
83
|
+
"\n config.assets.initialize_on_precompile = false",
|
84
|
+
:after => 'config.assets.enabled = true'
|
85
|
+
end
|
86
|
+
|
87
|
+
def lib_in_load_path
|
88
|
+
replace_in_file 'config/application.rb',
|
89
|
+
'# config.autoload_paths += %W(#{config.root}/extras)', 'config.autoload_paths += Dir["#{config.root}/lib/**/"]'
|
90
|
+
end
|
91
|
+
|
92
|
+
def create_partials_directory
|
93
|
+
empty_directory 'app/views/application'
|
94
|
+
end
|
95
|
+
|
96
|
+
def create_shared_flashes
|
97
|
+
copy_file '_flashes.html.erb', 'app/views/application/_flashes.html.erb'
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_shared_javascripts
|
101
|
+
copy_file '_javascript.html.erb', 'app/views/application/_javascript.html.erb'
|
102
|
+
end
|
103
|
+
|
104
|
+
def create_application_layout
|
105
|
+
template 'suspenders_layout.html.erb.erb',
|
106
|
+
'app/views/layouts/application.html.erb',
|
107
|
+
:force => true
|
108
|
+
end
|
109
|
+
|
110
|
+
def use_postgres_config_template
|
111
|
+
template 'postgresql_database.yml.erb', 'config/database.yml',
|
112
|
+
:force => true
|
113
|
+
end
|
114
|
+
|
115
|
+
def replace_gemfile
|
116
|
+
remove_file 'Gemfile'
|
117
|
+
copy_file 'Gemfile_clean', 'Gemfile'
|
118
|
+
end
|
119
|
+
|
120
|
+
def set_ruby_to_version_being_used
|
121
|
+
inject_into_file 'Gemfile', "\n\nruby '#{RUBY_VERSION}'",
|
122
|
+
after: /source 'https:\/\/rubygems.org'/
|
123
|
+
end
|
124
|
+
|
125
|
+
def enable_database_cleaner
|
126
|
+
copy_file 'database_cleaner_rspec.rb', 'spec/support/database_cleaner.rb'
|
127
|
+
end
|
128
|
+
|
129
|
+
def configure_rspec
|
130
|
+
remove_file '.rspec'
|
131
|
+
copy_file 'rspec', '.rspec'
|
132
|
+
|
133
|
+
config = <<-RUBY
|
134
|
+
|
135
|
+
# Hand-pick the generators we use
|
136
|
+
config.generators do |generate|
|
137
|
+
generate.test_framework :rspec
|
138
|
+
generate.helper false
|
139
|
+
generate.stylesheets false
|
140
|
+
generate.javascript_engine false
|
141
|
+
generate.request_specs false
|
142
|
+
generate.routing_specs false
|
143
|
+
generate.view_specs false
|
144
|
+
end
|
145
|
+
|
146
|
+
RUBY
|
147
|
+
|
148
|
+
inject_into_class 'config/application.rb', 'Application', config
|
149
|
+
end
|
150
|
+
|
151
|
+
def blacklist_active_record_attributes
|
152
|
+
replace_in_file 'config/application.rb',
|
153
|
+
'config.active_record.whitelist_attributes = true',
|
154
|
+
'config.active_record.whitelist_attributes = false'
|
155
|
+
end
|
156
|
+
|
157
|
+
def configure_strong_parameters
|
158
|
+
copy_file 'strong_parameters.rb', 'config/initializers/strong_parameters.rb'
|
159
|
+
end
|
160
|
+
|
161
|
+
def configure_time_zone
|
162
|
+
replace_in_file 'config/application.rb',
|
163
|
+
"# config.time_zone = 'Central Time (US & Canada)'",
|
164
|
+
"config.time_zone = 'Amsterdam'"
|
165
|
+
end
|
166
|
+
|
167
|
+
def configure_dutch_language
|
168
|
+
replace_in_file 'config/application.rb',
|
169
|
+
'# config.i18n.default_locale = :de',
|
170
|
+
"config.i18n.default_locale = :nl\n config.i18n.available_locales = :nl"
|
171
|
+
end
|
172
|
+
|
173
|
+
def configure_time_formats
|
174
|
+
copy_file 'config_locales_nl.yml', 'config/locales/nl.yml'
|
175
|
+
end
|
176
|
+
|
177
|
+
def configure_rack_timeout
|
178
|
+
copy_file 'rack_timeout.rb', 'config/initializers/rack_timeout.rb'
|
179
|
+
end
|
180
|
+
|
181
|
+
def configure_action_mailer
|
182
|
+
action_mailer_host 'development', "#{app_name}.dev"
|
183
|
+
action_mailer_host 'test', 'www.example.com'
|
184
|
+
action_mailer_host 'production', "#{app_name}.nl"
|
185
|
+
end
|
186
|
+
|
187
|
+
def generate_rspec
|
188
|
+
copy_file 'spec_helper.rb', 'spec/spec_helper.rb'
|
189
|
+
end
|
190
|
+
|
191
|
+
def setup_foreman
|
192
|
+
copy_file 'sample.env', '.sample.env'
|
193
|
+
copy_file 'unicorn.rb', 'config/unicorn.rb'
|
194
|
+
copy_file 'Procfile', 'Procfile'
|
195
|
+
end
|
196
|
+
|
197
|
+
def setup_stylesheets
|
198
|
+
copy_file 'app/assets/stylesheets/application.css',
|
199
|
+
'app/assets/stylesheets/application.css.scss'
|
200
|
+
remove_file 'app/assets/stylesheets/application.css'
|
201
|
+
end
|
202
|
+
|
203
|
+
def gitignore_files
|
204
|
+
concat_file 'suspenders_gitignore', '.gitignore'
|
205
|
+
[
|
206
|
+
'spec/support',
|
207
|
+
'spec/lib',
|
208
|
+
'spec/features',
|
209
|
+
'spec/models',
|
210
|
+
].each do |dir|
|
211
|
+
empty_directory_with_gitkeep dir
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
def init_git
|
216
|
+
run 'git init'
|
217
|
+
run 'git add .'
|
218
|
+
run 'git commit -m "Initial commit" > /dev/null'
|
219
|
+
end
|
220
|
+
|
221
|
+
def create_heroku_apps
|
222
|
+
run "#{path_addition} heroku create #{app_name}-production --remote=production"
|
223
|
+
run "#{path_addition} heroku create #{app_name}-staging --remote=staging"
|
224
|
+
run "#{path_addition} heroku config:add RACK_ENV=staging RAILS_ENV=staging --remote=staging"
|
225
|
+
end
|
226
|
+
|
227
|
+
def create_github_repo(repo_name)
|
228
|
+
run "#{path_addition} hub create #{repo_name}"
|
229
|
+
end
|
230
|
+
|
231
|
+
def copy_miscellaneous_files
|
232
|
+
copy_file 'errors.rb', 'config/initializers/errors.rb'
|
233
|
+
end
|
234
|
+
|
235
|
+
def customize_error_pages
|
236
|
+
meta_tags =<<-EOS
|
237
|
+
<meta charset='utf-8' />
|
238
|
+
<meta name='robots' content='noodp' />
|
239
|
+
EOS
|
240
|
+
style_tags =<<-EOS
|
241
|
+
<link href='/assets/application.css' media='all' rel='stylesheet' type='text/css' />
|
242
|
+
EOS
|
243
|
+
|
244
|
+
%w(500 404 422).each do |page|
|
245
|
+
inject_into_file "public/#{page}.html", meta_tags, :after => "<head>\n"
|
246
|
+
replace_in_file "public/#{page}.html", /<style.+>.+<\/style>/mi, style_tags.strip
|
247
|
+
replace_in_file "public/#{page}.html", /<!--.+-->\n/, ''
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def remove_routes_comment_lines
|
252
|
+
replace_in_file 'config/routes.rb',
|
253
|
+
/Application\.routes\.draw do.*end/m,
|
254
|
+
"Application.routes.draw do\nend"
|
255
|
+
end
|
256
|
+
|
257
|
+
def add_email_validator
|
258
|
+
copy_file 'email_validator.rb', 'app/validators/email_validator.rb'
|
259
|
+
end
|
260
|
+
|
261
|
+
def disable_xml_params
|
262
|
+
copy_file 'disable_xml_params.rb', 'config/initializers/disable_xml_params.rb'
|
263
|
+
end
|
264
|
+
|
265
|
+
def setup_default_rake_task
|
266
|
+
append_file 'Rakefile' do
|
267
|
+
"task(:default).clear\ntask :default => [:spec]"
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
end
|
272
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/rails/app/app_generator'
|
3
|
+
|
4
|
+
module Bretels
|
5
|
+
class AppGenerator < Rails::Generators::AppGenerator
|
6
|
+
class_option :database, :type => :string, :aliases => '-d', :default => 'postgresql',
|
7
|
+
:desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})"
|
8
|
+
|
9
|
+
class_option :heroku, :type => :boolean, :aliases => '-H', :default => false,
|
10
|
+
:desc => 'Create staging and production Heroku apps'
|
11
|
+
|
12
|
+
class_option :github, :type => :string, :aliases => '-G', :default => nil,
|
13
|
+
:desc => 'Create Github repository and add remote origin pointed to repo'
|
14
|
+
|
15
|
+
class_option :skip_test_unit, :type => :boolean, :aliases => '-T', :default => true,
|
16
|
+
:desc => 'Skip Test::Unit files'
|
17
|
+
|
18
|
+
def finish_template
|
19
|
+
invoke :suspenders_customization
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def suspenders_customization
|
24
|
+
invoke :remove_files_we_dont_need
|
25
|
+
invoke :customize_gemfile
|
26
|
+
invoke :setup_development_environment
|
27
|
+
invoke :setup_test_environment
|
28
|
+
invoke :setup_production_environment
|
29
|
+
invoke :setup_staging_environment
|
30
|
+
invoke :create_suspenders_views
|
31
|
+
invoke :setup_database
|
32
|
+
invoke :configure_app
|
33
|
+
invoke :setup_stylesheets
|
34
|
+
invoke :copy_miscellaneous_files
|
35
|
+
invoke :customize_error_pages
|
36
|
+
invoke :remove_routes_comment_lines
|
37
|
+
invoke :setup_git
|
38
|
+
invoke :create_heroku_apps
|
39
|
+
invoke :create_github_repo
|
40
|
+
invoke :outro
|
41
|
+
end
|
42
|
+
|
43
|
+
def remove_files_we_dont_need
|
44
|
+
build :remove_public_index
|
45
|
+
build :remove_rails_logo_image
|
46
|
+
end
|
47
|
+
|
48
|
+
def setup_development_environment
|
49
|
+
say 'Setting up the development environment'
|
50
|
+
build :raise_delivery_errors
|
51
|
+
build :initialize_on_precompile
|
52
|
+
build :lib_in_load_path
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup_test_environment
|
56
|
+
say 'Setting up the test environment'
|
57
|
+
build :enable_factory_girl_syntax
|
58
|
+
build :test_factories_first
|
59
|
+
build :generate_rspec
|
60
|
+
build :configure_rspec
|
61
|
+
build :enable_database_cleaner
|
62
|
+
build :generate_factories_file
|
63
|
+
end
|
64
|
+
|
65
|
+
def setup_production_environment
|
66
|
+
say 'Setting up the production environment'
|
67
|
+
build :configure_smtp
|
68
|
+
build :enable_force_ssl
|
69
|
+
build :add_cdn_settings
|
70
|
+
end
|
71
|
+
|
72
|
+
def setup_staging_environment
|
73
|
+
say 'Setting up the staging environment'
|
74
|
+
build :setup_staging_environment
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_suspenders_views
|
78
|
+
say 'Creating suspenders views'
|
79
|
+
build :create_partials_directory
|
80
|
+
build :create_shared_flashes
|
81
|
+
build :create_shared_javascripts
|
82
|
+
build :create_application_layout
|
83
|
+
end
|
84
|
+
|
85
|
+
def customize_gemfile
|
86
|
+
build :replace_gemfile
|
87
|
+
build :set_ruby_to_version_being_used
|
88
|
+
end
|
89
|
+
|
90
|
+
def setup_database
|
91
|
+
say 'Setting up database'
|
92
|
+
|
93
|
+
if 'postgresql' == options[:database]
|
94
|
+
build :use_postgres_config_template
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def configure_app
|
99
|
+
say 'Configuring app'
|
100
|
+
build :configure_action_mailer
|
101
|
+
build :blacklist_active_record_attributes
|
102
|
+
build :configure_strong_parameters
|
103
|
+
build :configure_time_zone
|
104
|
+
build :configure_time_formats
|
105
|
+
build :configure_dutch_language
|
106
|
+
build :configure_rack_timeout
|
107
|
+
build :disable_xml_params
|
108
|
+
build :add_email_validator
|
109
|
+
build :setup_default_rake_task
|
110
|
+
build :setup_foreman
|
111
|
+
end
|
112
|
+
|
113
|
+
def setup_stylesheets
|
114
|
+
say 'Set up stylesheets'
|
115
|
+
build :setup_stylesheets
|
116
|
+
end
|
117
|
+
|
118
|
+
def setup_git
|
119
|
+
say 'Initializing git'
|
120
|
+
invoke :setup_gitignore
|
121
|
+
invoke :init_git
|
122
|
+
end
|
123
|
+
|
124
|
+
def create_heroku_apps
|
125
|
+
if options[:heroku]
|
126
|
+
say 'Creating Heroku apps'
|
127
|
+
build :create_heroku_apps
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def create_github_repo
|
132
|
+
if options[:github]
|
133
|
+
say 'Creating Github repo'
|
134
|
+
build :create_github_repo, options[:github]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def setup_gitignore
|
139
|
+
build :gitignore_files
|
140
|
+
end
|
141
|
+
|
142
|
+
def init_git
|
143
|
+
build :init_git
|
144
|
+
end
|
145
|
+
|
146
|
+
def copy_miscellaneous_files
|
147
|
+
say 'Copying miscellaneous support files'
|
148
|
+
build :copy_miscellaneous_files
|
149
|
+
end
|
150
|
+
|
151
|
+
def customize_error_pages
|
152
|
+
say 'Customizing the 500/404/422 pages'
|
153
|
+
build :customize_error_pages
|
154
|
+
end
|
155
|
+
|
156
|
+
def remove_routes_comment_lines
|
157
|
+
build :remove_routes_comment_lines
|
158
|
+
end
|
159
|
+
|
160
|
+
def outro
|
161
|
+
say 'Done. Congratulations!'
|
162
|
+
say '1. Run bundle install'
|
163
|
+
say '2. Run rake db:create'
|
164
|
+
say "3. Run exceptional install <api-key>"
|
165
|
+
end
|
166
|
+
|
167
|
+
def run_bundle
|
168
|
+
# Let's not: We'll bundle manually at the right spot
|
169
|
+
end
|
170
|
+
|
171
|
+
protected
|
172
|
+
|
173
|
+
def get_builder_class
|
174
|
+
Bretels::AppBuilder
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'rails', '3.2.12'
|
4
|
+
gem 'flutie'
|
5
|
+
gem 'jquery-rails'
|
6
|
+
gem 'pg'
|
7
|
+
gem 'rack-timeout'
|
8
|
+
gem 'strong_parameters'
|
9
|
+
gem 'unicorn'
|
10
|
+
gem 'rails-i18n'
|
11
|
+
|
12
|
+
group :assets do
|
13
|
+
gem 'coffee-rails'
|
14
|
+
gem 'sass-rails'
|
15
|
+
gem 'uglifier'
|
16
|
+
end
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem 'foreman'
|
20
|
+
gem 'better_errors'
|
21
|
+
gem 'binding_of_caller'
|
22
|
+
gem 'quiet_assets'
|
23
|
+
gem 'letter_opener'
|
24
|
+
end
|
25
|
+
|
26
|
+
group :development, :test do
|
27
|
+
gem 'rspec-rails'
|
28
|
+
gem 'factory_girl_rails'
|
29
|
+
end
|
30
|
+
|
31
|
+
group :test do
|
32
|
+
gem 'capybara-webkit', '>= 0.14.1'
|
33
|
+
gem 'database_cleaner'
|
34
|
+
gem 'launchy'
|
35
|
+
end
|
36
|
+
|
37
|
+
group :staging, :production do
|
38
|
+
gem 'exceptional'
|
39
|
+
gem 'newrelic_rpm'
|
40
|
+
end
|
data/templates/Procfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
|
@@ -0,0 +1,9 @@
|
|
1
|
+
You look great with Bretels
|
2
|
+
===========================
|
3
|
+
|
4
|
+
Use the following guides for getting things done, programming well, and
|
5
|
+
programming in style.
|
6
|
+
|
7
|
+
* [Protocol](http://github.com/thoughtbot/guides/blob/master/protocol)
|
8
|
+
* [Best Practices](http://github.com/thoughtbot/guides/blob/master/best-practices)
|
9
|
+
* [Style](http://github.com/thoughtbot/guides/blob/master/style)
|
data/templates/bin_setup
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env sh
|
2
|
+
|
3
|
+
# Set up Rails app. Run this script immediately after cloning the codebase.
|
4
|
+
# https://github.com/thoughtbot/guides/tree/master/protocol
|
5
|
+
|
6
|
+
bundle install --binstubs=bin/stubs
|
7
|
+
bundle exec rake db:setup
|
8
|
+
|
9
|
+
if [ ! -f .env ]; then
|
10
|
+
cp .sample.env .env
|
11
|
+
fi
|
@@ -0,0 +1,21 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.before(:suite) do
|
3
|
+
DatabaseCleaner.clean_with(:deletion)
|
4
|
+
end
|
5
|
+
|
6
|
+
config.before(:each) do
|
7
|
+
DatabaseCleaner.strategy = :transaction
|
8
|
+
end
|
9
|
+
|
10
|
+
config.before(:each, :js => true) do
|
11
|
+
DatabaseCleaner.strategy = :deletion
|
12
|
+
end
|
13
|
+
|
14
|
+
config.before(:each) do
|
15
|
+
DatabaseCleaner.start
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after(:each) do
|
19
|
+
DatabaseCleaner.clean
|
20
|
+
end
|
21
|
+
end
|
data/templates/errors.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/smtp'
|
3
|
+
|
4
|
+
# Example:
|
5
|
+
# begin
|
6
|
+
# some http call
|
7
|
+
# rescue *HTTP_ERRORS => error
|
8
|
+
# notify_hoptoad error
|
9
|
+
# end
|
10
|
+
|
11
|
+
HTTP_ERRORS = [Timeout::Error,
|
12
|
+
Errno::EINVAL,
|
13
|
+
Errno::ECONNRESET,
|
14
|
+
EOFError,
|
15
|
+
Net::HTTPBadResponse,
|
16
|
+
Net::HTTPHeaderSyntaxError,
|
17
|
+
Net::ProtocolError]
|
18
|
+
|
19
|
+
SMTP_SERVER_ERRORS = [TimeoutError,
|
20
|
+
IOError,
|
21
|
+
Net::SMTPUnknownError,
|
22
|
+
Net::SMTPServerBusy,
|
23
|
+
Net::SMTPAuthenticationError]
|
24
|
+
|
25
|
+
SMTP_CLIENT_ERRORS = [Net::SMTPFatalError,
|
26
|
+
Net::SMTPSyntaxError]
|
27
|
+
|
28
|
+
SMTP_ERRORS = SMTP_SERVER_ERRORS + SMTP_CLIENT_ERRORS
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'validate FactoryGirl factories' do
|
4
|
+
FactoryGirl.factories.each do |factory|
|
5
|
+
context "with factory for :#{factory.name}" do
|
6
|
+
subject { FactoryGirl.build(factory.name) }
|
7
|
+
|
8
|
+
it 'is valid' do
|
9
|
+
is_valid = subject.valid?
|
10
|
+
expect(is_valid).to be_true, subject.errors.full_messages.join(',')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Rack::Timeout.timeout = (ENV['TIMEOUT_IN_SECONDS'] || 5).to_i
|
data/templates/rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
@@ -0,0 +1,16 @@
|
|
1
|
+
ENV["RAILS_ENV"] ||= 'test'
|
2
|
+
require File.expand_path("../../config/environment", __FILE__)
|
3
|
+
require 'rspec/rails'
|
4
|
+
require 'rspec/autorun'
|
5
|
+
require 'capybara/rspec'
|
6
|
+
|
7
|
+
Capybara.javascript_driver = :webkit
|
8
|
+
|
9
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.include FactoryGirl::Syntax::Methods
|
13
|
+
config.use_transactional_fixtures = false
|
14
|
+
config.infer_base_class_for_anonymous_controllers = false
|
15
|
+
config.order = "random"
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
ActiveRecord::Base.send :include, ActiveModel::ForbiddenAttributesProtection
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<meta charset="utf-8" />
|
6
|
+
<meta name="robots" content="noopd" />
|
7
|
+
<title><%%= page_title %></title>
|
8
|
+
<%%= stylesheet_link_tag :application, :media => 'all' %>
|
9
|
+
<%%= csrf_meta_tags %>
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body class="<%%= body_class %>">
|
13
|
+
<%%= render 'flashes' %>
|
14
|
+
<%%= yield %>
|
15
|
+
<%%= render 'javascript' %>
|
16
|
+
</body>
|
17
|
+
|
18
|
+
</html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
worker_processes Integer(ENV['WEB_CONCURRENCY'] || 3)
|
2
|
+
timeout Integer(ENV['WEB_TIMEOUT'] || 15)
|
3
|
+
preload_app true
|
4
|
+
|
5
|
+
before_fork do |server, worker|
|
6
|
+
|
7
|
+
Signal.trap 'TERM' do
|
8
|
+
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
|
9
|
+
Process.kill 'QUIT', Process.pid
|
10
|
+
end
|
11
|
+
|
12
|
+
defined?(ActiveRecord::Base) and
|
13
|
+
ActiveRecord::Base.connection.disconnect!
|
14
|
+
end
|
15
|
+
|
16
|
+
after_fork do |server, worker|
|
17
|
+
|
18
|
+
Signal.trap 'TERM' do
|
19
|
+
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
|
20
|
+
end
|
21
|
+
|
22
|
+
defined?(ActiveRecord::Base) and
|
23
|
+
ActiveRecord::Base.establish_connection
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bretels
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- brightin
|
9
|
+
- thoughtbot
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rails
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - '='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.2.12
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - '='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 3.2.12
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: bundler
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '1.1'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.1'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: hub
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.10.2
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.10.2
|
63
|
+
description: ! 'Fork of thoughtbot''s Suspenders for use at Brightin.
|
64
|
+
|
65
|
+
'
|
66
|
+
email: developers@brightin.com
|
67
|
+
executables:
|
68
|
+
- bretels
|
69
|
+
extensions: []
|
70
|
+
extra_rdoc_files:
|
71
|
+
- README.md
|
72
|
+
- LICENSE
|
73
|
+
files:
|
74
|
+
- Gemfile
|
75
|
+
- Gemfile.lock
|
76
|
+
- LICENSE
|
77
|
+
- README.md
|
78
|
+
- Rakefile
|
79
|
+
- bin/bretels
|
80
|
+
- bretels.gemspec
|
81
|
+
- lib/bretels/actions.rb
|
82
|
+
- lib/bretels/app_builder.rb
|
83
|
+
- lib/bretels/generators/app_generator.rb
|
84
|
+
- lib/bretels/version.rb
|
85
|
+
- templates/Gemfile_clean
|
86
|
+
- templates/Procfile
|
87
|
+
- templates/README.md.erb
|
88
|
+
- templates/_flashes.html.erb
|
89
|
+
- templates/_javascript.html.erb
|
90
|
+
- templates/bin_setup
|
91
|
+
- templates/config_locales_nl.yml
|
92
|
+
- templates/database_cleaner_rspec.rb
|
93
|
+
- templates/disable_xml_params.rb
|
94
|
+
- templates/email_validator.rb
|
95
|
+
- templates/errors.rb
|
96
|
+
- templates/factories.rb
|
97
|
+
- templates/factories_spec.rb
|
98
|
+
- templates/factory_girl_syntax_rspec.rb
|
99
|
+
- templates/postgresql_database.yml.erb
|
100
|
+
- templates/rack_timeout.rb
|
101
|
+
- templates/rspec
|
102
|
+
- templates/sample.env
|
103
|
+
- templates/spec_helper.rb
|
104
|
+
- templates/staging.rb.erb
|
105
|
+
- templates/strong_parameters.rb
|
106
|
+
- templates/suspenders_gitignore
|
107
|
+
- templates/suspenders_layout.html.erb.erb
|
108
|
+
- templates/unicorn.rb
|
109
|
+
homepage: http://github.com/brightin/bretels
|
110
|
+
licenses: []
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options:
|
113
|
+
- --charset=UTF-8
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
hash: -35484308327208431
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
127
|
+
requirements:
|
128
|
+
- - ! '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
segments:
|
132
|
+
- 0
|
133
|
+
hash: -35484308327208431
|
134
|
+
requirements: []
|
135
|
+
rubyforge_project:
|
136
|
+
rubygems_version: 1.8.24
|
137
|
+
signing_key:
|
138
|
+
specification_version: 3
|
139
|
+
summary: Generate a Rails app using brightins's best practices.
|
140
|
+
test_files: []
|