preseason 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/CONTRIBUTING.md +18 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +100 -0
- data/LICENSE.txt +23 -0
- data/README.md +129 -0
- data/Rakefile +1 -0
- data/bin/preseason +8 -0
- data/lib/Gemfile +4 -0
- data/lib/Rakefile +1 -0
- data/lib/play.rb +2 -0
- data/lib/preseason/colorize.rb +57 -0
- data/lib/preseason/config/authentication.rb +31 -0
- data/lib/preseason/config/database.rb +48 -0
- data/lib/preseason/config/factory.rb +19 -0
- data/lib/preseason/config/heroku.rb +17 -0
- data/lib/preseason/config/ie8.rb +17 -0
- data/lib/preseason/config.rb +6 -0
- data/lib/preseason/generator_context.rb +20 -0
- data/lib/preseason/recipe/active_admin.rb +7 -0
- data/lib/preseason/recipe/application.rb +6 -0
- data/lib/preseason/recipe/authlogic.rb +50 -0
- data/lib/preseason/recipe/bundle.rb +7 -0
- data/lib/preseason/recipe/custom_error_pages.rb +30 -0
- data/lib/preseason/recipe/database.rb +28 -0
- data/lib/preseason/recipe/devise.rb +9 -0
- data/lib/preseason/recipe/flash.rb +6 -0
- data/lib/preseason/recipe/foreman.rb +5 -0
- data/lib/preseason/recipe/gemfile.rb +147 -0
- data/lib/preseason/recipe/git.rb +62 -0
- data/lib/preseason/recipe/gitignore.rb +22 -0
- data/lib/preseason/recipe/guard.rb +7 -0
- data/lib/preseason/recipe/heroku.rb +12 -0
- data/lib/preseason/recipe/ie8.rb +18 -0
- data/lib/preseason/recipe/initializer.rb +20 -0
- data/lib/preseason/recipe/playbook.rb +69 -0
- data/lib/preseason/recipe/production.rb +36 -0
- data/lib/preseason/recipe/routes.rb +21 -0
- data/lib/preseason/recipe/rspec.rb +5 -0
- data/lib/preseason/recipe/rvm.rb +10 -0
- data/lib/preseason/recipe/schedule.rb +5 -0
- data/lib/preseason/recipe/spork_rspec.rb +7 -0
- data/lib/preseason/recipe/whiskey_disk.rb +5 -0
- data/lib/preseason/recipe.rb +38 -0
- data/lib/preseason/templates/authlogic/POST_INSTALL +10 -0
- data/lib/preseason/templates/authlogic/app/controllers/application_controller.rb +40 -0
- data/lib/preseason/templates/authlogic/app/controllers/user_session_controller.rb +58 -0
- data/lib/preseason/templates/authlogic/app/mailers/site_mailer.rb +5 -0
- data/lib/preseason/templates/authlogic/app/models/user.rb +11 -0
- data/lib/preseason/templates/authlogic/app/models/user_session.rb +2 -0
- data/lib/preseason/templates/authlogic/app/views/site_mailer/password_reset_instructions.html.erb +22 -0
- data/lib/preseason/templates/authlogic/app/views/user_session/acquire_password.html.erb +14 -0
- data/lib/preseason/templates/authlogic/app/views/user_session/forgot_password.html.erb +11 -0
- data/lib/preseason/templates/authlogic/app/views/user_session/new.html.erb +17 -0
- data/lib/preseason/templates/authlogic/config/routes.rb +11 -0
- data/lib/preseason/templates/authlogic/spec/factories/users.rb +11 -0
- data/lib/preseason/templates/custom_error_pages/app/views/errors/application_error.html.erb +5 -0
- data/lib/preseason/templates/custom_error_pages/app/views/errors/not_found.html.erb +5 -0
- data/lib/preseason/templates/custom_error_pages/app/views/errors/unprocessable_entity.html.erb +5 -0
- data/lib/preseason/templates/custom_error_pages/config/routes.rb +5 -0
- data/lib/preseason/templates/database/config/database.yml.dist.erb +19 -0
- data/lib/preseason/templates/database/config/database.yml.erb +19 -0
- data/lib/preseason/templates/flash/app/views/shared/_flash.html.erb +6 -0
- data/lib/preseason/templates/ie8/app/assets/javascripts/ie8.coffee +8 -0
- data/lib/preseason/templates/playbook/app/views/layouts/application.html.erb +31 -0
- data/lib/preseason/templates/readme/README.md.erb +17 -0
- data/lib/preseason/templates/schedule/config/schedule.rb +7 -0
- data/lib/preseason/templates/spec/spec_helper.erb +61 -0
- data/lib/preseason/templates/sqlite/config/database.yml +17 -0
- data/lib/preseason/templates/whiskey_disk/config/deploy.yml +7 -0
- data/lib/preseason/version.rb +3 -0
- data/lib/preseason.rb +82 -0
- data/preseason.gemspec +27 -0
- metadata +175 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
class Preseason::Recipe::Devise < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
return unless config.authentication.devise?
|
4
|
+
|
5
|
+
generate 'devise:install'
|
6
|
+
generate 'devise', 'user'
|
7
|
+
insert_into_file 'config/environments/development.rb', "\n config.action_mailer.default_url_options = { :host => 'localhost:3000' }\n", :before => /^end$/
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
class Preseason::Recipe::Gemfile < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
remove_comments
|
4
|
+
remove_unwanted_gems
|
5
|
+
remove_empty_lines
|
6
|
+
add_ruby_version
|
7
|
+
add_database_gem
|
8
|
+
add_global_gems
|
9
|
+
add_non_heroku_gems
|
10
|
+
add_production_gems
|
11
|
+
add_development_gems
|
12
|
+
add_development_test_gems
|
13
|
+
add_test_gems
|
14
|
+
add_factory_gem
|
15
|
+
add_active_admin_gem
|
16
|
+
add_authentication_gem
|
17
|
+
add_modernizr_gem
|
18
|
+
add_normalize_gem
|
19
|
+
add_ie8_gems
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def remove_comments
|
24
|
+
gsub_file 'Gemfile', /^\s*#\s*.*$/, ''
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_unwanted_gems
|
28
|
+
gems_to_remove = %w(jquery-rails) # removing jquery-rails now so we can move it to top of Gemfile
|
29
|
+
gems_to_remove << 'sqlite3' unless config.database.sqlite?
|
30
|
+
gsub_file 'Gemfile', /^\s*gem '(#{Regexp.union(gems_to_remove)})'.*$/, ''
|
31
|
+
end
|
32
|
+
|
33
|
+
def remove_empty_lines
|
34
|
+
gsub_file 'Gemfile', /^\n/, ''
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_ruby_version
|
38
|
+
insert_into_file 'Gemfile', "ruby '#{RUBY_VERSION}'\n\n", :after => /source 'https:\/\/rubygems.org'.*\n/
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_database_gem
|
42
|
+
insert_into_file 'Gemfile', "gem '#{config.database.gem_name}'\n", :after => /gem 'rails'.*\n/ unless config.database.sqlite?
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_global_gems
|
46
|
+
insert_into_file 'Gemfile', :after => /gem '#{config.database.gem_name}'.*\n/ do
|
47
|
+
%w(
|
48
|
+
whiskey_disk
|
49
|
+
jquery-rails
|
50
|
+
bourbon
|
51
|
+
neat
|
52
|
+
).map { |gem_name| "gem '#{gem_name}'" }.join("\n") << "\n"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_modernizr_gem
|
57
|
+
insert_into_file 'Gemfile', "gem 'modernizr-rails'\n", :after => /gem 'uglifier'.*\n/
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_normalize_gem
|
61
|
+
insert_into_file 'Gemfile', "gem 'normalize-rails'\n", :after => /gem 'modernizr-rails'.*\n/
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_ie8_gems
|
65
|
+
if config.ie8.enabled?
|
66
|
+
insert_into_file 'Gemfile', :after => /gem 'jquery-rails'\n/ do
|
67
|
+
"gem 'selectivizr-rails'\ngem 'respond-rails'\n"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_non_heroku_gems
|
73
|
+
unless config.heroku.use?
|
74
|
+
insert_into_file 'Gemfile', :after => /gem 'jquery-rails'\n/ do
|
75
|
+
"gem 'lograge'\ngem 'whenever', :require => false\n"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def add_production_gems
|
81
|
+
if config.heroku.use?
|
82
|
+
gem_group :production do
|
83
|
+
gem 'heroku_rails_deflate'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def add_development_gems
|
89
|
+
gem_group :development do
|
90
|
+
gem 'foreman'
|
91
|
+
gem 'guard-bundler'
|
92
|
+
gem 'guard-rspec'
|
93
|
+
gem 'guard-spork'
|
94
|
+
gem 'rb-fsevent', :require => false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_development_test_gems
|
99
|
+
gem_group :development, :test do
|
100
|
+
gem 'pry-rails'
|
101
|
+
gem 'pry-nav'
|
102
|
+
gem 'awesome_print'
|
103
|
+
gem 'quiet_assets'
|
104
|
+
gem 'rspec-rails'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def add_test_gems
|
109
|
+
gem_group :test do
|
110
|
+
gem 'spork-rails'
|
111
|
+
gem 'database_cleaner'
|
112
|
+
gem 'shoulda-matchers'
|
113
|
+
gem 'capybara-webkit'
|
114
|
+
gem 'launchy'
|
115
|
+
gem 'fuubar'
|
116
|
+
gem 'simplecov'
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def add_factory_gem
|
121
|
+
if config.factory.factory_girl?
|
122
|
+
insert_into_file 'Gemfile', :after => "group :development, :test do\n" do
|
123
|
+
" gem 'factory_girl_rails'\n"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def add_active_admin_gem
|
129
|
+
if config.authentication.active_admin?
|
130
|
+
insert_into_file 'Gemfile', :after => "gem 'jquery-rails'\n" do
|
131
|
+
"gem 'activeadmin', :github => 'gregbell/active_admin'\n"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def add_authentication_gem
|
137
|
+
if config.authentication.authlogic?
|
138
|
+
insert_into_file 'Gemfile', :after => "gem 'jquery-rails'\n" do
|
139
|
+
"gem 'authlogic'\n"
|
140
|
+
end
|
141
|
+
elsif config.authentication.devise?
|
142
|
+
insert_into_file 'Gemfile', :after => "gem 'jquery-rails'\n" do
|
143
|
+
"gem 'devise'\n"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class Preseason::Recipe::Git < Preseason::Recipe
|
2
|
+
attr_reader :repo_name, :github_username, :public_repo
|
3
|
+
|
4
|
+
def prepare
|
5
|
+
remove_file 'README.rdoc'
|
6
|
+
create_file 'README.md', parse_template('readme/README.md.erb')
|
7
|
+
|
8
|
+
run 'rake db:migrate'
|
9
|
+
run 'git init'
|
10
|
+
run 'git add .'
|
11
|
+
run 'git commit -m "Initial commit"'
|
12
|
+
|
13
|
+
publish_to_github if github?
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def publish_to_github
|
18
|
+
ask_repo_details
|
19
|
+
ask_repo_owner if repo_organization?
|
20
|
+
|
21
|
+
run "curl -u '#{github_username}' #{github_url} -d '#{curl_params}' > /dev/null"
|
22
|
+
run "git remote add origin git@github.com:#{repo_owner}/#{repo_name}.git"
|
23
|
+
|
24
|
+
run 'git push -u origin master'
|
25
|
+
run 'git checkout -b staging'
|
26
|
+
run 'git push -u origin staging'
|
27
|
+
end
|
28
|
+
|
29
|
+
def github?
|
30
|
+
yes?("Do you want to create a Github repo? [y/n]")
|
31
|
+
end
|
32
|
+
|
33
|
+
def ask_repo_details
|
34
|
+
@repo_name = ask "What do you want to name the Github repo?"
|
35
|
+
@github_username = ask "What is your Github username?"
|
36
|
+
@public_repo = yes? "Is this a public repo? [y/n]"
|
37
|
+
end
|
38
|
+
|
39
|
+
def ask_repo_owner
|
40
|
+
@repo_owner = ask "What is the org's name?"
|
41
|
+
end
|
42
|
+
|
43
|
+
def repo_owner
|
44
|
+
@repo_owner || github_username
|
45
|
+
end
|
46
|
+
|
47
|
+
def repo_organization?
|
48
|
+
@repo_organization ||= yes? "Does this repo belong to an organization? [y/n]"
|
49
|
+
end
|
50
|
+
|
51
|
+
def github_url
|
52
|
+
if repo_organization?
|
53
|
+
"https://api.github.com/orgs/#{repo_owner}/repos"
|
54
|
+
else
|
55
|
+
"https://api.github.com/user/repos"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def curl_params
|
60
|
+
%Q[{"name":"#{repo_name}","public":"#{public_repo}"}]
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Preseason::Recipe::Gitignore < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
append_to_file '.gitignore' do
|
4
|
+
"\n" << %w(
|
5
|
+
.DS_Store
|
6
|
+
*.pid
|
7
|
+
.powrc
|
8
|
+
.ruby-gemset
|
9
|
+
.ruby-version
|
10
|
+
*.swp
|
11
|
+
config/aws_s3.yml
|
12
|
+
config/sunspot.yml
|
13
|
+
coverage
|
14
|
+
dump.rdb
|
15
|
+
erd.pdf
|
16
|
+
public/assets
|
17
|
+
solr/data
|
18
|
+
logfile
|
19
|
+
).join("\n")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class Preseason::Recipe::Guard < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
run 'bundle exec guard init'
|
4
|
+
gsub_file 'Guardfile', ":cucumber_env => { 'RAILS_ENV' => 'test' }, ", ''
|
5
|
+
gsub_file 'Guardfile', "guard 'rspec' do", "guard 'rspec', :cli => '--drb --format Fuubar --tag focus', :all_after_pass => false, :all_on_start => false do"
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Preseason::Recipe::Heroku < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
return unless config.heroku.use?
|
4
|
+
|
5
|
+
if yes?("Do you want to setup Heroku? [y/n]")
|
6
|
+
run "heroku auth:login"
|
7
|
+
run "heroku apps:create #{app_name}"
|
8
|
+
run "heroku addons:add pgbackups"
|
9
|
+
run "git push heroku master -u"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Preseason::Recipe::IE8 < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
return unless config.ie8.enabled?
|
4
|
+
|
5
|
+
copy_js
|
6
|
+
insert_into_layout
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def copy_js
|
12
|
+
mirror_file 'app/assets/javascripts/ie8.coffee'
|
13
|
+
end
|
14
|
+
|
15
|
+
def insert_into_layout
|
16
|
+
insert_into_file 'app/views/layouts/application.html.erb', "\n\n <!--[if IE 8]>\n <%= javascript_include_tag 'ie8' %>\n <![endif]-->", :after => /^ \<\%\= yield \%\>$/
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Preseason::Recipe::Initializer < Preseason::Recipe
|
2
|
+
attr_accessor :assets
|
3
|
+
|
4
|
+
def prepare
|
5
|
+
precompile_assets
|
6
|
+
initialize_assets
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def precompile_assets
|
11
|
+
@assets = %w(screen.css)
|
12
|
+
@assets << 'ie8.js' if config.ie8.enabled?
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize_assets
|
16
|
+
old_line = '# Rails.application.config.assets.precompile += %w( search.js )'
|
17
|
+
new_line = "Rails.application.config.assets.precompile += #{@assets}"
|
18
|
+
gsub_file 'config/initializers/assets.rb', old_line, new_line
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'find'
|
2
|
+
|
3
|
+
class Preseason::Recipe::Playbook < Preseason::Recipe
|
4
|
+
def prepare
|
5
|
+
download_playbook_repo
|
6
|
+
copy_playbook_assets
|
7
|
+
clean_playbook_assets
|
8
|
+
add_normalize_import
|
9
|
+
integrate_playbook
|
10
|
+
remove_unwanted_files
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def exclude_rules
|
16
|
+
# exclude:
|
17
|
+
# => files and directories beginning with "."
|
18
|
+
# => "README.md" files
|
19
|
+
# => "application.coffee" file
|
20
|
+
[/^\./, /^(?:readme.md|application\.coffee|syntax\.scss)$/]
|
21
|
+
end
|
22
|
+
|
23
|
+
def download_playbook_repo
|
24
|
+
version = '1.1.3.1'
|
25
|
+
get "https://github.com/centresource/playbook/archive/v#{version}.tar.gz", '/tmp/playbook.tar.gz'
|
26
|
+
remove_dir "/tmp/playbook-#{version}" if Dir.exist? "/tmp/playbook-#{version}"
|
27
|
+
remove_dir '/tmp/playbook-css' if Dir.exist? '/tmp/playbook-css'
|
28
|
+
`tar -zxvf /tmp/playbook.tar.gz -C /tmp 2> /dev/null`
|
29
|
+
`mv /tmp/playbook-#{version}/styles /tmp/playbook-css`
|
30
|
+
end
|
31
|
+
|
32
|
+
def copy_playbook_assets
|
33
|
+
Find.find('/tmp/playbook-css/') do |path|
|
34
|
+
if exclude_rules.none? { |regex| regex =~ File.basename(path) }
|
35
|
+
style_path = path.gsub('/tmp/playbook-css/', 'app/assets/stylesheets/')
|
36
|
+
if File.directory? path
|
37
|
+
FileUtils.makedirs style_path
|
38
|
+
else
|
39
|
+
copy_file path, style_path
|
40
|
+
end
|
41
|
+
else
|
42
|
+
Find.prune
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def clean_playbook_assets
|
48
|
+
gsub_file 'app/assets/stylesheets/screen.scss', 'bourbon/app/assets/stylesheets/bourbon', 'bourbon'
|
49
|
+
gsub_file 'app/assets/stylesheets/screen.scss', 'neat/app/assets/stylesheets/neat-helpers', 'neat-helpers'
|
50
|
+
gsub_file 'app/assets/stylesheets/screen.scss', 'neat/app/assets/stylesheets/neat', 'neat'
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_normalize_import
|
54
|
+
insert_into_file 'app/assets/stylesheets/screen.scss', "@import \"normalize-rails/normalize\";\n", :before => '@import "bourbon";'
|
55
|
+
end
|
56
|
+
|
57
|
+
def integrate_playbook
|
58
|
+
mirror_file 'app/views/layouts/application.html.erb'
|
59
|
+
end
|
60
|
+
|
61
|
+
def remove_unwanted_files
|
62
|
+
remove_file 'app/assets/stylesheets/application.css'
|
63
|
+
remove_file 'public/index.html'
|
64
|
+
remove_file 'app/assets/images/rails.png'
|
65
|
+
remove_dir '/tmp/centresource-generator-playbook*'
|
66
|
+
remove_dir '/tmp/playbook-css'
|
67
|
+
remove_file '/tmp/playbook.tar.gz'
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Preseason::Recipe::Production < Preseason::Recipe
|
2
|
+
PRODUCTION = 'config/environments/production.rb'
|
3
|
+
|
4
|
+
def prepare
|
5
|
+
enable_lograge unless config.heroku.use?
|
6
|
+
configure_heroku_rails_deflate
|
7
|
+
add_precompile_assets
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
def enable_lograge
|
12
|
+
insert_into_file PRODUCTION, "\n config.lograge.enabled = true\n", :before => /^end$/
|
13
|
+
end
|
14
|
+
|
15
|
+
def configure_heroku_rails_deflate
|
16
|
+
gsub_file PRODUCTION, 'config.serve_static_assets = false', 'config.serve_static_assets = true'
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_precompile_assets
|
20
|
+
insert_into_file PRODUCTION, precompile_array, :before => /^end$/
|
21
|
+
end
|
22
|
+
|
23
|
+
def precompile_array
|
24
|
+
str = <<-TXT
|
25
|
+
|
26
|
+
config.assets.precompile += %w(
|
27
|
+
screen.css
|
28
|
+
ie8.js
|
29
|
+
#{'active_admin.js' if config.authentication.active_admin?}
|
30
|
+
#{'active_admin.css' if config.authentication.active_admin?}
|
31
|
+
)
|
32
|
+
TXT
|
33
|
+
|
34
|
+
str.gsub /^\s{4}\n/, ''
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Preseason::Recipe::Routes < Preseason::Recipe
|
2
|
+
def prepare
|
3
|
+
remove_comments_and_newlines
|
4
|
+
add_root_path
|
5
|
+
generate_site_controller
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def remove_comments_and_newlines
|
10
|
+
gsub_file 'config/routes.rb', /^\s*#\s*.*$/, ''
|
11
|
+
gsub_file 'config/routes.rb', /^\n/, ''
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_root_path
|
15
|
+
insert_into_file 'config/routes.rb', " root :to => 'site#index'\n", :before => /^end$/
|
16
|
+
end
|
17
|
+
|
18
|
+
def generate_site_controller
|
19
|
+
generate 'controller site index --no-assets --no-helper'
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rvm'
|
2
|
+
|
3
|
+
class Preseason::Recipe::Rvm < Preseason::Recipe
|
4
|
+
def prepare
|
5
|
+
run "rvm gemset create #{app_name}"
|
6
|
+
RVM.gemset_use! "#{app_name}" # `run "rvm gemset use #{app_name}"` doesn't work -- rvm still uses the terminal's current gemset
|
7
|
+
create_file '.ruby-version', "#{RUBY_VERSION}\n"
|
8
|
+
create_file '.ruby-gemset', "#{app_name}\n"
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
class Preseason::Recipe
|
4
|
+
include Preseason::GeneratorContext
|
5
|
+
include Preseason::Colorize
|
6
|
+
|
7
|
+
attr_reader :config
|
8
|
+
|
9
|
+
def initialize(config)
|
10
|
+
@config = config
|
11
|
+
end
|
12
|
+
|
13
|
+
def recipe_root
|
14
|
+
"#{template_path}/#{self.class.name.demodulize.underscore}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def post_install_hook
|
18
|
+
# implement in child classes
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def mirror_file(path)
|
23
|
+
remove_file(path) if File.exist?(path)
|
24
|
+
copy_file "#{recipe_root}/#{path}", path
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_template(path)
|
28
|
+
ERB.new(File.read(File.join(template_path, path))).result(binding)
|
29
|
+
end
|
30
|
+
|
31
|
+
def template_path
|
32
|
+
@template_path ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
33
|
+
end
|
34
|
+
|
35
|
+
def insert(path, opts = {})
|
36
|
+
insert_into_file path, File.read("#{recipe_root}/#{path}"), opts
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
Authlogic Post-Install
|
3
|
+
======================
|
4
|
+
|
5
|
+
Authlogic has been installed and configured. Next steps:
|
6
|
+
|
7
|
+
- Update the login form with your preferred markup (app/views/user_session/new.html.erb)
|
8
|
+
- Update the default "from" address in the site mailer for password reset emails (app/mailers/site_mailer.rb)
|
9
|
+
- Update the password reset email to your needs (app/views/site_mailer/password_reset_instructions.html.erb)
|
10
|
+
- Update the reset password pages with your preferred markup (app/views/user_session/{acquire_password,forgot_password}.html.erb)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
private
|
4
|
+
|
5
|
+
def current_user_session
|
6
|
+
return @current_user_session if defined?(@current_user_session)
|
7
|
+
@current_user_session = UserSession.find
|
8
|
+
end
|
9
|
+
|
10
|
+
def current_user
|
11
|
+
return @current_user if defined?(@current_user)
|
12
|
+
@current_user = current_user_session && current_user_session.user
|
13
|
+
end
|
14
|
+
|
15
|
+
def require_user
|
16
|
+
unless current_user
|
17
|
+
store_location
|
18
|
+
flash[:notice] = 'You must be logged in to access this page'
|
19
|
+
redirect_to login_url
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def require_no_user
|
25
|
+
if current_user
|
26
|
+
store_location
|
27
|
+
flash[:notice] = 'You must be logged out to access this page'
|
28
|
+
redirect_to root_url
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def store_location
|
34
|
+
session[:return_to] = request.request_uri
|
35
|
+
end
|
36
|
+
|
37
|
+
def redirect_back_or_default(default)
|
38
|
+
redirect_to(session[:return_to] || default)
|
39
|
+
session[:return_to] = nil
|
40
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class UserSessionController < ApplicationController
|
2
|
+
before_filter :find_user_by_perishable_token, :only => [:acquire_password, :reset_password]
|
3
|
+
|
4
|
+
def new
|
5
|
+
@user_session = UserSession.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def create
|
9
|
+
@user_session = UserSession.new(params[:user_session])
|
10
|
+
|
11
|
+
if @user_session.save
|
12
|
+
redirect_back_or_default root_url
|
13
|
+
else
|
14
|
+
flash.now[:error] = 'Username or password are incorrect.'
|
15
|
+
render :action => :new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def destroy
|
20
|
+
current_user_session.destroy
|
21
|
+
redirect_to login_url
|
22
|
+
end
|
23
|
+
|
24
|
+
def send_reset_password_link
|
25
|
+
@user = User.where('LOWER(email) = ?', params[:email].downcase).first
|
26
|
+
if @user.blank?
|
27
|
+
flash.now[:error] = "No user found with that email address."
|
28
|
+
render :forgot_password
|
29
|
+
else
|
30
|
+
begin
|
31
|
+
@user.send_password_reset_instructions!
|
32
|
+
rescue Net::SMTPFatalError
|
33
|
+
end
|
34
|
+
flash[:notice] = "An email has been sent with a link to reset your password. Please check your inbox."
|
35
|
+
redirect_to root_url
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def reset_password
|
40
|
+
if @user.update_attributes(params[:user])
|
41
|
+
flash[:success] = "Your password has been changed. Please login to continue."
|
42
|
+
redirect_to root_url
|
43
|
+
else
|
44
|
+
flash.now[:error] = "There was an error updating your password."
|
45
|
+
render :acquire_password
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def find_user_by_perishable_token
|
51
|
+
@user = User.find_by_perishable_token(params[:token])
|
52
|
+
|
53
|
+
if @user.blank?
|
54
|
+
flash[:error] = "There was a problem finding your account. The reset password link may have expired. Please try again."
|
55
|
+
redirect_to forgot_password_url
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
|
2
|
+
acts_as_authentic do |c|
|
3
|
+
# because RSpec has problems with Authlogic's session maintenance
|
4
|
+
# see https://github.com/binarylogic/authlogic/issues/262#issuecomment-1804988
|
5
|
+
c.maintain_sessions = false
|
6
|
+
end
|
7
|
+
|
8
|
+
def send_password_reset_instructions!
|
9
|
+
reset_perishable_token!
|
10
|
+
SiteMailer.password_reset_instructions(self).deliver
|
11
|
+
end
|