raygun 0.0.2
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/.gitignore +17 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +63 -0
- data/Rakefile +1 -0
- data/TODO.md +24 -0
- data/bin/raygun +11 -0
- data/lib/raygun/actions.rb +26 -0
- data/lib/raygun/app_builder.rb +283 -0
- data/lib/raygun/generators/app_generator.rb +182 -0
- data/lib/raygun/version.rb +3 -0
- data/marvin.jpg +0 -0
- data/raygun.gemspec +25 -0
- data/templates/Gemfile_customized +32 -0
- data/templates/README.md.erb +31 -0
- data/templates/_app/assets/stylesheets/_footer.less +30 -0
- data/templates/_app/assets/stylesheets/application.css.less +8 -0
- data/templates/_app/controllers/application_controller.rb +14 -0
- data/templates/_app/controllers/password_resets_controller.rb +38 -0
- data/templates/_app/controllers/registrations_controller.rb +27 -0
- data/templates/_app/controllers/user_sessions_controller.rb +25 -0
- data/templates/_app/helpers/application_helper.rb +11 -0
- data/templates/_app/mailers/user_mailer.rb +22 -0
- data/templates/_app/models/user.rb +17 -0
- data/templates/_app/models/user_session.rb +6 -0
- data/templates/_app/views/layouts/application.html.slim.erb +36 -0
- data/templates/_app/views/password_resets/edit.html.slim +16 -0
- data/templates/_app/views/password_resets/new.html.slim +11 -0
- data/templates/_app/views/registrations/new.html.slim +14 -0
- data/templates/_app/views/user_mailer/activation_needed_email.html.erb +17 -0
- data/templates/_app/views/user_mailer/activation_needed_email.text.erb +9 -0
- data/templates/_app/views/user_mailer/activation_success_email.html.erb +17 -0
- data/templates/_app/views/user_mailer/activation_success_email.text.erb +9 -0
- data/templates/_app/views/user_mailer/reset_password_email.html.erb +16 -0
- data/templates/_app/views/user_mailer/reset_password_email.text.erb +8 -0
- data/templates/_app/views/user_sessions/new.html.slim +13 -0
- data/templates/_config/database.yml.erb +13 -0
- data/templates/_db/sample_data.rb +17 -0
- data/templates/_lib/email_validator.rb +9 -0
- data/templates/_lib/tasks/db.rake +7 -0
- data/templates/_lib/templates/rspec/scaffold/controller_spec.rb +152 -0
- data/templates/_lib/templates/slim/scaffold/_form.html.slim +13 -0
- data/templates/_lib/templates/slim/scaffold/edit.html.slim +5 -0
- data/templates/_lib/templates/slim/scaffold/index.html.slim +27 -0
- data/templates/_lib/templates/slim/scaffold/new.html.slim +4 -0
- data/templates/_lib/templates/slim/scaffold/show.html.slim +15 -0
- data/templates/_public/index.html.erb +41 -0
- data/templates/_spec/factories/users.rb +7 -0
- data/templates/_spec/mailers/user_mailer_spec.rb +48 -0
- data/templates/_spec/models/user_spec.rb +29 -0
- data/templates/_spec/requests/user_sessions_spec.rb +29 -0
- data/templates/_spec/support/accept_values.rb +55 -0
- data/templates/_spec/support/factory_girl.rb +3 -0
- data/templates/_spec/support/sorcery.rb +3 -0
- data/templates/_spec/support/user_sessions_request_helper.rb +21 -0
- data/templates/rvmrc.erb +1 -0
- metadata +168 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3-p194@raygun --create
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Carbon Five
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
<img src="https://raw.github.com/carbonfive/raygun/master/marvin.jpg" align="right"/>
|
2
|
+
|
3
|
+
# Raygun
|
4
|
+
|
5
|
+
__NOTE: Currently a work in progress and not yet representative of best practices. Soon the veil will be lifted.__
|
6
|
+
|
7
|
+
Command line Rails application generator that builds a new project skeleton configured with all of the Carbon Five
|
8
|
+
best practices baked right in.
|
9
|
+
|
10
|
+
Inspired by and code shamelessly lifted from ThoughtBot's Suspenders. Thanks!
|
11
|
+
|
12
|
+
Major tools/libraries:
|
13
|
+
|
14
|
+
* Rails
|
15
|
+
* PostgreSQL
|
16
|
+
* Slim
|
17
|
+
* Less
|
18
|
+
* Bootstrap
|
19
|
+
* Sorcery
|
20
|
+
* Cancan
|
21
|
+
* RSpec
|
22
|
+
* Factory Girl
|
23
|
+
* Guard
|
24
|
+
|
25
|
+
And many tweaks, patterns and common recipes.
|
26
|
+
|
27
|
+
## Projects Goals
|
28
|
+
|
29
|
+
Raygun...
|
30
|
+
* should generate a new rails application that's ready for feature development immediately.
|
31
|
+
* should generate an application that has best practices that apply to most projects baked in.
|
32
|
+
* is a forum for discussing what should or should not be included as part of a standard stack.
|
33
|
+
|
34
|
+
## Installation
|
35
|
+
|
36
|
+
$ gem install raygun
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
$ raygun your-project
|
41
|
+
|
42
|
+
Once your project is baked out, you can easily kick the wheels:
|
43
|
+
|
44
|
+
$ cd your-project
|
45
|
+
|
46
|
+
# Prep the database
|
47
|
+
$ rake db:create db:migrate db:test:prepare
|
48
|
+
|
49
|
+
# Run the specs
|
50
|
+
$ rake spec
|
51
|
+
|
52
|
+
# Load some sample data, fire up the app and open it in a browser
|
53
|
+
$ rake db:seed db:sample_data
|
54
|
+
$ rails s
|
55
|
+
$ open http://0.0.0.0:3000
|
56
|
+
|
57
|
+
## Contributing
|
58
|
+
|
59
|
+
1. Fork it
|
60
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
61
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
62
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
63
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/TODO.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# TODOs
|
2
|
+
|
3
|
+
Looking for inspiration? Here are some ideas for things that still could be done.
|
4
|
+
|
5
|
+
* Cleanup/refactor raygun code (a few simple helpers would help out a whole lot)
|
6
|
+
* Automated testing of raygun (e.g. generate an app and run its specs?)
|
7
|
+
* Raygun on CI
|
8
|
+
* Add the concept of an admin / super user
|
9
|
+
* Invite user flow
|
10
|
+
* Use cancan to restrict access to /users to an admin
|
11
|
+
* Use cancan to allow users to edit only themselves and admins to edit any user
|
12
|
+
* Continue to improve bootstrap view templates
|
13
|
+
* CSS/less best practices for file organization
|
14
|
+
* JS/coffeescript best practices
|
15
|
+
* Add pagination to the default index scaffold (kaminari)
|
16
|
+
* JS testing
|
17
|
+
* Use foreigner for database constraints
|
18
|
+
* Fast tests best practices
|
19
|
+
* Use guard (rspec, livereload, js testing, etc)
|
20
|
+
* Paperclip + S3 configuration
|
21
|
+
* Application monitoring
|
22
|
+
* Analytics
|
23
|
+
* One step configuration for Heroku (production and acceptance)
|
24
|
+
* One step configuration on CI
|
data/bin/raygun
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join('..', 'lib', 'raygun', 'generators', 'app_generator'), File.dirname(__FILE__))
|
4
|
+
require File.expand_path(File.join('..', 'lib', 'raygun', 'actions'), File.dirname(__FILE__))
|
5
|
+
require File.expand_path(File.join('..', 'lib', 'raygun', 'app_builder'), File.dirname(__FILE__))
|
6
|
+
|
7
|
+
templates_root = File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
|
8
|
+
Raygun::AppGenerator.source_root templates_root
|
9
|
+
Raygun::AppGenerator.source_paths << Rails::Generators::AppGenerator.source_root << templates_root
|
10
|
+
|
11
|
+
Raygun::AppGenerator.start
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Raygun
|
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
|
+
|
9
|
+
def replace_in_file(relative_path, find, replace)
|
10
|
+
path = File.join(destination_root, relative_path)
|
11
|
+
contents = IO.read(path)
|
12
|
+
unless contents.gsub!(find, replace)
|
13
|
+
raise "#{find.inspect} not found in #{relative_path}"
|
14
|
+
end
|
15
|
+
File.open(path, "w") { |file| file.write(contents) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def action_mailer_host(rails_env, host)
|
19
|
+
inject_into_file(
|
20
|
+
"config/environments/#{rails_env}.rb",
|
21
|
+
"\n\n config.action_mailer.default_url_options = { :host => '#{host}' }",
|
22
|
+
:before => "\nend"
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,283 @@
|
|
1
|
+
module Raygun
|
2
|
+
class AppBuilder < Rails::AppBuilder
|
3
|
+
include Raygun::Actions
|
4
|
+
|
5
|
+
def readme
|
6
|
+
template 'README.md.erb', 'README.md'
|
7
|
+
end
|
8
|
+
|
9
|
+
def replace_public_index
|
10
|
+
template '_public/index.html.erb', 'public/index.html', force: true
|
11
|
+
end
|
12
|
+
|
13
|
+
def remove_rails_logo_image
|
14
|
+
remove_file 'app/assets/images/rails.png'
|
15
|
+
end
|
16
|
+
|
17
|
+
def remove_application_layout
|
18
|
+
remove_file 'app/views/layouts/application.html.erb'
|
19
|
+
end
|
20
|
+
|
21
|
+
def enable_factory_girl_syntax
|
22
|
+
copy_file '_spec/support/factory_girl.rb', 'spec/support/factory_girl.rb'
|
23
|
+
end
|
24
|
+
|
25
|
+
def enable_threadsafe_mode
|
26
|
+
uncomment_lines 'config/environments/production.rb', 'config.threadsafe!'
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize_on_precompile
|
30
|
+
inject_into_file 'config/application.rb',
|
31
|
+
"\n config.assets.initialize_on_precompile = false",
|
32
|
+
after: 'config.assets.enabled = true'
|
33
|
+
end
|
34
|
+
|
35
|
+
def setup_acceptance_environment
|
36
|
+
run 'cp config/environments/production.rb config/environments/acceptance.rb'
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_application_layout
|
40
|
+
template '_app/views/layouts/application.html.slim.erb',
|
41
|
+
'app/views/layouts/application.html.slim',
|
42
|
+
force: true
|
43
|
+
end
|
44
|
+
|
45
|
+
def use_postgres_config_template
|
46
|
+
template '_config/database.yml.erb', 'config/database.yml', force: true
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_database
|
50
|
+
bundle_command 'exec rake db:create'
|
51
|
+
end
|
52
|
+
|
53
|
+
def configure_rvm
|
54
|
+
template 'rvmrc.erb', '.rvmrc', rvm_ruby: rvm_ruby
|
55
|
+
end
|
56
|
+
|
57
|
+
def configure_gemfile
|
58
|
+
run 'gem install bundler'
|
59
|
+
copy_file 'Gemfile_customized', 'Gemfile', force: true
|
60
|
+
end
|
61
|
+
|
62
|
+
def setup_generators
|
63
|
+
%w(_form index show new edit).each do |view|
|
64
|
+
template = "lib/templates/slim/scaffold/#{view}.html.slim"
|
65
|
+
remove_file template
|
66
|
+
copy_file "_lib/templates/slim/scaffold/#{view}.html.slim", template
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def configure_rspec
|
71
|
+
generators_config = <<-RUBY
|
72
|
+
|
73
|
+
config.generators do |generate|
|
74
|
+
generate.stylesheets false
|
75
|
+
#generate.helpers false
|
76
|
+
generate.route_specs false
|
77
|
+
#generate.view_specs false
|
78
|
+
end
|
79
|
+
|
80
|
+
RUBY
|
81
|
+
inject_into_class 'config/application.rb', 'Application', generators_config
|
82
|
+
|
83
|
+
copy_file '_lib/templates/rspec/scaffold/controller_spec.rb',
|
84
|
+
'lib/templates/rspec/scaffold/controller_spec.rb'
|
85
|
+
end
|
86
|
+
|
87
|
+
def generate_rspec
|
88
|
+
generate 'rspec:install'
|
89
|
+
end
|
90
|
+
|
91
|
+
def add_rspec_support
|
92
|
+
shared_transaction = <<-RUBY
|
93
|
+
|
94
|
+
# Forces all threads to share the same connection. This works on
|
95
|
+
# Capybara because it starts the web server in a thread.
|
96
|
+
#
|
97
|
+
# http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
|
98
|
+
|
99
|
+
class ActiveRecord::Base
|
100
|
+
mattr_accessor :shared_connection
|
101
|
+
@@shared_connection = nil
|
102
|
+
|
103
|
+
def self.connection
|
104
|
+
@@shared_connection || retrieve_connection
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
|
109
|
+
|
110
|
+
# Turn down the logging while testing.
|
111
|
+
Rails.logger.level = 4
|
112
|
+
RUBY
|
113
|
+
|
114
|
+
append_to_file 'spec/spec_helper.rb', shared_transaction
|
115
|
+
|
116
|
+
copy_file '_spec/support/accept_values.rb', 'spec/support/accept_values.rb'
|
117
|
+
end
|
118
|
+
|
119
|
+
def configure_time_zone
|
120
|
+
'config/application.rb'.tap do |fn|
|
121
|
+
#inject_into_file fn, ' config.active_record.default_timezone = :utc\n', after: "'Central Time (US & Canada)'\n"
|
122
|
+
#uncomment_lines fn, 'config.time_zone'
|
123
|
+
gsub_file fn, 'Central Time (US & Canada)', 'Pacific Time (US & Canada)'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def configure_action_mailer
|
128
|
+
action_mailer_host 'development', "#{app_name}.local"
|
129
|
+
action_mailer_host 'test', "example.com"
|
130
|
+
action_mailer_host 'acceptance', "acceptance.#{app_name}.com"
|
131
|
+
action_mailer_host 'production', "#{app_name}.com"
|
132
|
+
end
|
133
|
+
|
134
|
+
def add_lib_to_load_path
|
135
|
+
'config/application.rb'.tap do |fn|
|
136
|
+
gsub_file fn, '#{config.root}/extras', '#{config.root}/lib'
|
137
|
+
uncomment_lines fn, 'config.autoload_paths'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def add_email_validator
|
142
|
+
# CN: I'm not thrilled with this use of the lib directory, but it's not that unusual. Would love to hear what
|
143
|
+
# other folks think about where such things should live.
|
144
|
+
copy_file '_lib/email_validator.rb', 'lib/email_validator.rb'
|
145
|
+
end
|
146
|
+
|
147
|
+
def setup_simple_form
|
148
|
+
generate 'simple_form:install --bootstrap -s'
|
149
|
+
|
150
|
+
replace_in_file 'config/initializers/simple_form.rb',
|
151
|
+
%(# config.label_text = lambda { |label, required| "\#{required} \#{label}" }),
|
152
|
+
%(config.label_text = lambda { |label, required| "\#{label}" })
|
153
|
+
end
|
154
|
+
|
155
|
+
def setup_authentication
|
156
|
+
# User model
|
157
|
+
generate 'scaffold user email:string name:string'
|
158
|
+
|
159
|
+
remove_file 'app/models/user.rb'
|
160
|
+
remove_file 'spec/factories/users.rb'
|
161
|
+
remove_file 'spec/requests/users_spec.rb'
|
162
|
+
create_users_migration = 'db/migrate/' + Dir.new('./db/migrate').entries.select { |e| e =~ /create_users/ }.first
|
163
|
+
remove_file create_users_migration
|
164
|
+
|
165
|
+
generate 'sorcery:install brute_force_protection activity_logging user_activation remember_me reset_password external'
|
166
|
+
|
167
|
+
copy_file '_app/models/user.rb', 'app/models/user.rb', force: true
|
168
|
+
copy_file '_spec/support/sorcery.rb', 'spec/support/sorcery.rb'
|
169
|
+
copy_file '_spec/factories/users.rb', 'spec/factories/users.rb', force: true
|
170
|
+
copy_file '_spec/models/user_spec.rb', 'spec/models/user_spec.rb', force: true
|
171
|
+
|
172
|
+
inject_into_file 'app/controllers/users_controller.rb',
|
173
|
+
"\n before_filter :require_login\n\n",
|
174
|
+
after: "UsersController < ApplicationController\n"
|
175
|
+
|
176
|
+
# User mailer (has to happen before sorcery config changes)
|
177
|
+
generate 'mailer UserMailer activation_needed_email activation_success_email reset_password_email'
|
178
|
+
copy_file '_app/mailers/user_mailer.rb', 'app/mailers/user_mailer.rb', force: true
|
179
|
+
copy_file '_spec/mailers/user_mailer_spec.rb', 'spec/mailers/user_mailer_spec.rb', force: true
|
180
|
+
|
181
|
+
%w(activation_needed_email activation_success_email reset_password_email).each do |fn|
|
182
|
+
remove_file "app/views/user_mailer/#{fn}.text.slim"
|
183
|
+
|
184
|
+
%w(html.erb text.erb).each do |ext|
|
185
|
+
copy_file "_app/views/user_mailer/#{fn}.#{ext}", "app/views/user_mailer/#{fn}.#{ext}", force: true
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
remove_dir 'spec/fixtures/user_mailer'
|
190
|
+
|
191
|
+
# Patch sorcery configuration and migrations
|
192
|
+
sorcery_core_migration = 'db/migrate/' + Dir.new('./db/migrate').entries.select { |e| e =~ /sorcery_core/ }.first
|
193
|
+
inject_into_file sorcery_core_migration, " t.string :name\n", after: "create_table :users do |t|\n"
|
194
|
+
comment_lines sorcery_core_migration, /^.* t.string :username.*$\n/
|
195
|
+
|
196
|
+
'config/initializers/sorcery.rb'.tap do |fn|
|
197
|
+
replace_in_file fn, 'config.user_class = "User"', 'config.user_class = User'
|
198
|
+
replace_in_file fn, '# user.username_attribute_names =', 'user.username_attribute_names = :email'
|
199
|
+
replace_in_file fn, '# user.user_activation_mailer =', 'user.user_activation_mailer = UserMailer'
|
200
|
+
replace_in_file fn, '# user.reset_password_mailer =', 'user.reset_password_mailer = UserMailer'
|
201
|
+
#replace_in_file sorcery_rb, /# user.unlock_token_mailer =.*$/, 'user.unlock_token_mailer = UserMailer'
|
202
|
+
end
|
203
|
+
|
204
|
+
# Routes, controllers, helpers and views
|
205
|
+
route "resources :password_resets, only: [:new, :create, :edit, :update]"
|
206
|
+
route "match 'sign_up/:token/activate' => 'registrations#activate', via: :get"
|
207
|
+
route "match 'sign_up' => 'registrations#create', via: :post"
|
208
|
+
route "match 'sign_up' => 'registrations#new', via: :get"
|
209
|
+
route "resources :registrations, only: [:new, :create, :activate]"
|
210
|
+
route "resources :user_sessions, only: [:new, :create, :destroy]"
|
211
|
+
route "match 'sign_out' => 'user_sessions#destroy', as: :sign_out"
|
212
|
+
route "match 'sign_in' => 'user_sessions#new', as: :sign_in"
|
213
|
+
|
214
|
+
copy_file '_app/controllers/application_controller.rb',
|
215
|
+
'app/controllers/application_controller.rb',
|
216
|
+
force: true
|
217
|
+
|
218
|
+
copy_file '_app/helpers/application_helper.rb',
|
219
|
+
'app/helpers/application_helper.rb',
|
220
|
+
force: true
|
221
|
+
|
222
|
+
copy_file '_app/models/user_session.rb',
|
223
|
+
'app/models/user_session.rb'
|
224
|
+
|
225
|
+
copy_file '_app/controllers/user_sessions_controller.rb',
|
226
|
+
'app/controllers/user_sessions_controller.rb'
|
227
|
+
|
228
|
+
copy_file '_app/views/user_sessions/new.html.slim',
|
229
|
+
'app/views/user_sessions/new.html.slim'
|
230
|
+
|
231
|
+
copy_file '_spec/support/user_sessions_request_helper.rb',
|
232
|
+
'spec/support/user_sessions_request_helper.rb'
|
233
|
+
|
234
|
+
copy_file '_spec/requests/user_sessions_spec.rb',
|
235
|
+
'spec/requests/user_sessions_spec.rb'
|
236
|
+
|
237
|
+
copy_file '_app/controllers/registrations_controller.rb',
|
238
|
+
'app/controllers/registrations_controller.rb'
|
239
|
+
|
240
|
+
directory '_app/views/registrations', 'app/views/registrations'
|
241
|
+
|
242
|
+
copy_file '_app/controllers/password_resets_controller.rb',
|
243
|
+
'app/controllers/password_resets_controller.rb'
|
244
|
+
|
245
|
+
directory '_app/views/password_resets', 'app/views/password_resets'
|
246
|
+
|
247
|
+
copy_file '_app/views/password_resets/edit.html.slim',
|
248
|
+
'app/views/password_resets/edit.html.slim'
|
249
|
+
|
250
|
+
end
|
251
|
+
|
252
|
+
def setup_stylesheets
|
253
|
+
remove_file 'app/assets/stylesheets/application.css'
|
254
|
+
directory '_app/assets/stylesheets', 'app/assets/stylesheets'
|
255
|
+
end
|
256
|
+
|
257
|
+
def setup_javascripts
|
258
|
+
inject_into_file 'app/assets/javascripts/application.js',
|
259
|
+
"//= require twitter/bootstrap\n",
|
260
|
+
after: "require jquery_ujs\n"
|
261
|
+
end
|
262
|
+
|
263
|
+
def copy_rake_tasks
|
264
|
+
copy_file '_lib/tasks/db.rake', 'lib/tasks/db.rake'
|
265
|
+
copy_file '_db/sample_data.rb', 'db/sample_data.rb'
|
266
|
+
end
|
267
|
+
|
268
|
+
def remove_routes_comment_lines
|
269
|
+
replace_in_file 'config/routes.rb', /Application\.routes\.draw do.*end/m, "Application.routes.draw do\nend"
|
270
|
+
end
|
271
|
+
|
272
|
+
def convert_to_19_hash_syntax
|
273
|
+
run 'hash_syntax -n'
|
274
|
+
end
|
275
|
+
|
276
|
+
def consistent_quoting
|
277
|
+
gsub_file 'config/application.rb', '"utf-8"', "'utf-8'"
|
278
|
+
%w(acceptance production).each do |fn|
|
279
|
+
gsub_file "config/environments/#{fn}.rb", '"X-Sendfile"', "'X-Sendfile'"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/rails/app/app_generator'
|
3
|
+
require 'rvm'
|
4
|
+
|
5
|
+
module Raygun
|
6
|
+
class AppGenerator < Rails::Generators::AppGenerator
|
7
|
+
|
8
|
+
class_option :database, type: :string, aliases: '-d', default: 'postgresql',
|
9
|
+
desc: "Preconfigure for selected database (options: #{DATABASES.join('/')})"
|
10
|
+
|
11
|
+
class_option :skip_test_unit, type: :boolean, aliases: '-T', default: true,
|
12
|
+
desc: "Skip Test::Unit files"
|
13
|
+
|
14
|
+
def finish_template
|
15
|
+
invoke :raygun_customization
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def raygun_customization
|
20
|
+
rvm_original_env = RVM.current.expanded_name
|
21
|
+
|
22
|
+
invoke :remove_files_we_dont_need
|
23
|
+
invoke :remove_routes_comment_lines
|
24
|
+
invoke :setup_development_environment
|
25
|
+
invoke :setup_production_environment
|
26
|
+
invoke :setup_acceptance_environment
|
27
|
+
#invoke :setup_staging_environment
|
28
|
+
# FUTURE autodetect rvm or rbenv
|
29
|
+
invoke :configure_rvm
|
30
|
+
# FUTURE invoke :configure_rbenv
|
31
|
+
invoke :customize_gemfile
|
32
|
+
invoke :setup_database
|
33
|
+
invoke :setup_generators
|
34
|
+
invoke :create_raygun_views
|
35
|
+
invoke :configure_app
|
36
|
+
invoke :setup_javascripts
|
37
|
+
invoke :setup_stylesheets
|
38
|
+
invoke :copy_miscellaneous_files
|
39
|
+
|
40
|
+
# Go back to the original rvm environment.
|
41
|
+
@@env.use!(rvm_original_env)
|
42
|
+
|
43
|
+
invoke :knits_and_picks
|
44
|
+
invoke :outro
|
45
|
+
end
|
46
|
+
|
47
|
+
def remove_files_we_dont_need
|
48
|
+
say "Removing unwanted files."
|
49
|
+
build :remove_rails_logo_image
|
50
|
+
build :remove_application_layout
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_routes_comment_lines
|
54
|
+
build :remove_routes_comment_lines
|
55
|
+
end
|
56
|
+
|
57
|
+
def setup_development_environment
|
58
|
+
say "Setting up the development environment."
|
59
|
+
build :raise_delivery_errors
|
60
|
+
build :enable_factory_girl_syntax
|
61
|
+
end
|
62
|
+
|
63
|
+
def setup_production_environment
|
64
|
+
say "Setting up the production environment."
|
65
|
+
build :enable_threadsafe_mode
|
66
|
+
end
|
67
|
+
|
68
|
+
def setup_acceptance_environment
|
69
|
+
say "Setting up the acceptance environment."
|
70
|
+
build :setup_acceptance_environment
|
71
|
+
build :initialize_on_precompile
|
72
|
+
end
|
73
|
+
|
74
|
+
def configure_rvm
|
75
|
+
say "Configuring RVM"
|
76
|
+
|
77
|
+
@@env = RVM::Environment.new
|
78
|
+
|
79
|
+
@@env.gemset_create(app_name)
|
80
|
+
@@env.gemset_use!(app_name)
|
81
|
+
|
82
|
+
build :configure_rvm
|
83
|
+
end
|
84
|
+
|
85
|
+
def customize_gemfile
|
86
|
+
say "Customizing the Gemfile."
|
87
|
+
build :configure_gemfile
|
88
|
+
bundle_command 'install'
|
89
|
+
end
|
90
|
+
|
91
|
+
def setup_database
|
92
|
+
say 'Setting up database'
|
93
|
+
build :use_postgres_config_template
|
94
|
+
build :create_database
|
95
|
+
end
|
96
|
+
|
97
|
+
def setup_generators
|
98
|
+
say 'Installing custom view generator templates'
|
99
|
+
build :setup_generators
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_raygun_views
|
103
|
+
say 'Creating views and layouts'
|
104
|
+
build :replace_public_index
|
105
|
+
build :create_partials_directory
|
106
|
+
#build :create_shared_flashes
|
107
|
+
#build :create_shared_javascripts
|
108
|
+
build :create_application_layout
|
109
|
+
end
|
110
|
+
|
111
|
+
def configure_app
|
112
|
+
say 'Configuring app'
|
113
|
+
|
114
|
+
build :configure_rspec
|
115
|
+
build :generate_rspec
|
116
|
+
build :add_rspec_support
|
117
|
+
|
118
|
+
build :configure_time_zone
|
119
|
+
build :configure_action_mailer
|
120
|
+
build :add_lib_to_load_path
|
121
|
+
build :add_email_validator
|
122
|
+
build :setup_simple_form
|
123
|
+
build :setup_authentication
|
124
|
+
build :setup_default_rake_task
|
125
|
+
#build :setup_guard
|
126
|
+
end
|
127
|
+
|
128
|
+
def setup_stylesheets
|
129
|
+
say "Configuring stylesheets"
|
130
|
+
build :setup_stylesheets
|
131
|
+
end
|
132
|
+
|
133
|
+
def setup_javascripts
|
134
|
+
say "Configuring javascripts"
|
135
|
+
build :setup_javascripts
|
136
|
+
end
|
137
|
+
|
138
|
+
def copy_miscellaneous_files
|
139
|
+
say 'Copying miscellaneous support files'
|
140
|
+
build :copy_rake_tasks
|
141
|
+
end
|
142
|
+
|
143
|
+
def knits_and_picks
|
144
|
+
say 'Converting old hash syntax and fixing knit picks'
|
145
|
+
build :convert_to_19_hash_syntax
|
146
|
+
build :consistent_quoting
|
147
|
+
end
|
148
|
+
|
149
|
+
def outro
|
150
|
+
say ""
|
151
|
+
say "You're done! Next steps..."
|
152
|
+
say ""
|
153
|
+
say "# Prepare the database"
|
154
|
+
say " $ cd #{ARGV[0]}"
|
155
|
+
say " $ rake db:create db:migrate db:test:prepare"
|
156
|
+
say ""
|
157
|
+
say "# Run the specs (they should all pass)"
|
158
|
+
say " $ rake spec"
|
159
|
+
say ""
|
160
|
+
say "# Load reference and sample data, then run the app and check things out"
|
161
|
+
say " $ rake db:seed db:sample_data"
|
162
|
+
say " $ rails s"
|
163
|
+
say " $ open http://0.0.0.0:3000"
|
164
|
+
say ""
|
165
|
+
say "Enjoy your Carbon Five flavored Rails application!"
|
166
|
+
end
|
167
|
+
|
168
|
+
def run_bundle
|
169
|
+
# Let's not: We'll bundle manually at the right spot
|
170
|
+
end
|
171
|
+
|
172
|
+
def rvm_ruby
|
173
|
+
@@env.expanded_name.match(/(.*)@/)[1]
|
174
|
+
end
|
175
|
+
|
176
|
+
protected
|
177
|
+
|
178
|
+
def get_builder_class
|
179
|
+
Raygun::AppBuilder
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
data/marvin.jpg
ADDED
Binary file
|
data/raygun.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'raygun/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.name = "raygun"
|
9
|
+
gem.version = Raygun::VERSION
|
10
|
+
gem.authors = ["Christian Nelson"]
|
11
|
+
gem.email = ["christian@carbonfive.com"]
|
12
|
+
gem.description = %q{Carbon Five Rails application generator}
|
13
|
+
gem.summary = %q{Generates and customizes Rails applications with Carbon Five best practices baked in.}
|
14
|
+
gem.homepage = "https://github.com/carbonfive/raygun"
|
15
|
+
|
16
|
+
gem.files = `git ls-files`.split($/)
|
17
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
+
gem.require_paths = ["lib"]
|
20
|
+
|
21
|
+
gem.add_dependency 'rails', '3.2.8'
|
22
|
+
gem.add_dependency 'bundler', '>= 1.2'
|
23
|
+
gem.add_dependency 'rvm', '>= 1.11.3.5'
|
24
|
+
gem.add_dependency 'hash_syntax', '>= 1.0'
|
25
|
+
end
|