Created
May 2, 2012 11:50
-
-
Save cs3b/2576043 to your computer and use it in GitHub Desktop.
rails 3.2 postgresql rspec factory-girl kameleon headless jasmine guard state_machine inherited_resources drapper devise cancan state-machine kaminari active_admin haml formtastic iconic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Selleo Application Boostrap Template | |
# initial based on https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-bootstrap-devise-cancan-template.rb | |
# | |
# In difference from original it's not customizable (at least ont interactive) - and it works with Rails 3.2 and above | |
# Usage: rails new APP_NAME -d postgresql -m https://raw.github.com/gist/2576043/44e01e55e68828f7d1dd996a5c9159a399249a42/selleo-template-rails-3.2.rb -T | |
# Information and a tutorial: | |
# https://github.com/RailsApps/rails3-bootstrap-devise-cancan | |
# Generated using the rails_apps_composer gem: | |
# https://github.com/RailsApps/rails_apps_composer/ | |
# If you are customizing this template, you can use any methods provided by Thor::Actions | |
# http://rdoc.info/rdoc/wycats/thor/blob/f939a3e8a854616784cac1dcff04ef4f3ee5f7ff/Thor/Actions.html | |
# and Rails::Generators::Actions | |
# http://github.com/rails/rails/blob/master/railties/lib/rails/generators/actions.rb | |
initializer 'generators.rb', <<-RUBY | |
Rails.application.config.generators do |g| | |
end | |
RUBY | |
@recipe = nil | |
def say_custom(name) | |
@recipe = name | |
say "\033[1m\033[36m" + "Running #{name} recipe..." | |
end | |
@current_recipe = nil | |
@configs = {} | |
@after_blocks = [] | |
def after_bundler(&block) | |
@after_blocks << [@recipe, block] | |
end | |
@after_everything_blocks = [] | |
def after_everything(&block) | |
@after_everything_blocks << [@recipe, block] | |
end | |
# >---------------------------[ Autoload Modules/Classes ]-----------------------------< | |
inject_into_file 'config/application.rb', :after => 'config.autoload_paths += %W(#{config.root}/extras)' do | |
<<-'RUBY' | |
config.autoload_paths += %W(#{config.root}/lib) | |
RUBY | |
end | |
# >---------------------------------[ DATABASE CREDENTIALS ]----------------------------------< | |
say_custom("database credential (postgresql)") | |
username = ask("username: ") | |
password = ask("password: ") | |
postgresql_config = <<-TEXT | |
development: | |
adapter: postgresql | |
encoding: unicode | |
database: #@app_name | |
pool: 5 | |
username: #{username} | |
password: #{password} | |
test: | |
adapter: postgresql | |
encoding: unicode | |
database: #{@app_name}_test | |
pool: 5 | |
username: #{username} | |
password: #{password} | |
TEXT | |
remove_file 'config/database.yml' | |
create_file 'config/database.yml' do | |
postgresql_config | |
end | |
create_file 'config/database.yml.example' do | |
postgresql_config | |
end | |
after_bundler do | |
run "rake db:create" | |
run "rake db:migrate" | |
end | |
# >---------------------------------[ HAML ]----------------------------------< | |
say_custom("haml") | |
@configs["haml"] = {'haml' => true} | |
gem 'haml', '>= 3.1.4' | |
gem 'haml-rails', '>= 0.3.4', :group => :development | |
# >---------------------------------[ RSpec ]---------------------------------< | |
say_custom("rspec") | |
@configs["rspec"] = { | |
"rspec" => true, | |
"factory_girl" => true, | |
"machinist" => false | |
} | |
gem 'rspec-rails', '>= 2.9.0.rc2', :group => [:development, :test] | |
gem 'database_cleaner', '>= 0.7.2', :group => :test | |
gem 'factory_girl_rails', '>= 3.2.0', :group => [:development, :test] | |
# add a collection of RSpec matchers and Cucumber steps to make testing email easy | |
gem 'email_spec', '>= 1.2.1', :group => :test | |
# note: there is no need to specify the RSpec generator in the config/application.rb file | |
after_bundler do | |
say_custom "RSpec recipe running 'after bundler'" | |
generate 'rspec:install' | |
generate 'email_spec:steps' | |
inject_into_file 'spec/spec_helper.rb', "require 'email_spec'\n", :after => "require 'rspec/rails'\n" | |
inject_into_file 'spec/spec_helper.rb', :after => "RSpec.configure do |config|\n" do | |
<<-RUBY | |
config.include(EmailSpec::Helpers) | |
config.include(EmailSpec::Matchers) | |
RUBY | |
end | |
say_custom "Removing test folder (not needed for RSpec)" | |
run 'rm -rf test/' | |
inject_into_file 'config/application.rb', :after => "Rails::Application\n" do | |
<<-RUBY | |
config.generators do |g| | |
g.view_specs false | |
g.helper_specs false | |
g.fixture_replacement :factory_girl | |
end | |
RUBY | |
end | |
create_file 'spec/support/devise.rb' do | |
<<-RUBY | |
RSpec.configure do |config| | |
config.include Devise::TestHelpers, :type => :controller | |
end | |
RUBY | |
end | |
end | |
# >-------------------------------[ Kameleon ]--------------------------------< | |
say_custom 'Kameleon' | |
gem 'headless', :group => :test | |
gem 'kameleon', :git => 'git://github.com/cs3b/kameleon.git', :group => :test | |
after_bundler do | |
inject_into_file 'spec/spec_helper.rb', "require 'kameleon/ext/rspec/all'\n", :before => "require 'rspec/rails'\n" | |
end | |
# >---------------------------------[ guard ]---------------------------------< | |
say_custom 'guard' | |
gem 'guard', '>= 0.6.2', :group => :development | |
gem 'libnotify', :group => :development | |
gem 'rb-inotify', :group => :development | |
def guards | |
@guards ||= [] | |
end | |
def guard(name, version = nil) | |
args = [] | |
if version | |
args << version | |
end | |
args << {:group => :development} | |
gem "guard-#{name}", *args | |
guards << name | |
end | |
guard 'bundler', '>= 0.1.3' | |
guard 'rails', '>= 0.0.3' | |
guard 'livereload', '>= 0.3.0' | |
guard 'rspec', '>= 0.4.3' | |
after_bundler do | |
run 'guard init' | |
guards.each do |name| | |
run "guard init #{name}" | |
end | |
end | |
# >-----------------------------[ ActionMailer ]------------------------------< | |
say_custom 'ActionMailer' | |
@configs["action_mailer"] = {'gmail' => true} | |
# Application template recipe for the rails_apps_composer. Check for a newer version here: | |
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/action_mailer.rb | |
after_bundler do | |
### modifying environment configuration files for ActionMailer | |
say_custom "ActionMailer recipe running 'after bundler'" | |
### development environment | |
gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '# ActionMailer Config' | |
gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do | |
<<-RUBY | |
config.action_mailer.default_url_options = { :host => 'localhost:3000' } | |
config.action_mailer.delivery_method = :smtp | |
# change to false to prevent email from being sent during development | |
config.action_mailer.perform_deliveries = true | |
config.action_mailer.raise_delivery_errors = true | |
config.action_mailer.default :charset => "utf-8" | |
RUBY | |
end | |
### test environment | |
inject_into_file 'config/environments/test.rb', :before => "\nend" do | |
<<-RUBY | |
\n | |
# ActionMailer Config | |
config.action_mailer.default_url_options = { :host => 'example.com' } | |
RUBY | |
end | |
### production environment | |
gsub_file 'config/environments/production.rb', /config.active_support.deprecation = :notify/ do | |
<<-RUBY | |
config.active_support.deprecation = :notify | |
config.action_mailer.default_url_options = { :host => 'example.com' } | |
# ActionMailer Config | |
# Setup for production - deliveries, no errors raised | |
config.action_mailer.delivery_method = :smtp | |
config.action_mailer.perform_deliveries = true | |
config.action_mailer.raise_delivery_errors = false | |
config.action_mailer.default :charset => "utf-8" | |
RUBY | |
end | |
### modifying environment configuration files to send email using a GMail account | |
gmail_configuration_text = <<-TEXT | |
\n | |
config.action_mailer.smtp_settings = { | |
address: "smtp.gmail.com", | |
port: 587, | |
domain: "example.com", | |
authentication: "plain", | |
enable_starttls_auto: true, | |
user_name: ENV["GMAIL_USERNAME"], | |
password: ENV["GMAIL_PASSWORD"] | |
} | |
TEXT | |
say_custom gmail_configuration_text | |
inject_into_file 'config/environments/development.rb', gmail_configuration_text, :after => 'config.action_mailer.default :charset => "utf-8"' | |
end | |
# >--------------------------------[ Devise ]---------------------------------< | |
say_custom 'Devise' | |
gem 'devise', '>= 2.1.0.rc' | |
gem 'devise_invitable', '>= 1.0.1' | |
gem 'cancan', '>= 1.6.7' | |
gem 'rolify', '>= 3.1.0' | |
after_bundler do | |
say_custom "Devise recipe running 'after bundler'" | |
# Run the Devise generator | |
generate 'devise:install' | |
generate 'devise_invitable:install' | |
# Prevent logging of password_confirmation | |
gsub_file 'config/application.rb', /:password/, ':password, :password_confirmation' | |
inject_into_file 'app/controllers/application_controller.rb', :before => 'end' do | |
<<-RUBY | |
rescue_from CanCan::AccessDenied do |exception| | |
redirect_to root_path, :alert => exception.message | |
end | |
RUBY | |
end | |
end | |
after_everything do | |
say_custom "Devise recipe running 'after everything'" | |
say_custom "Copying RSpec files from the rails3-devise-rspec-cucumber examples" | |
begin | |
# copy all the RSpec specs files from the rails3-devise-rspec-cucumber example app | |
remove_file 'spec/factories/users.rb' | |
get 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/spec/factories/users.rb', 'spec/factories/users.rb' | |
gsub_file 'spec/factories/users.rb', /# confirmed_at/, "confirmed_at" | |
remove_file 'spec/controllers/home_controller_spec.rb' | |
remove_file 'spec/controllers/users_controller_spec.rb' | |
get 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/spec/controllers/home_controller_spec.rb', 'spec/controllers/home_controller_spec.rb' | |
get 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/spec/controllers/users_controller_spec.rb', 'spec/controllers/users_controller_spec.rb' | |
remove_file 'spec/models/user_spec.rb' | |
get 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/spec/models/user_spec.rb', 'spec/models/user_spec.rb' | |
rescue OpenURI::HTTPError | |
say_custom "Unable to obtain RSpec example files from the repo" | |
end | |
remove_file 'spec/views/home/index.html.erb_spec.rb' | |
remove_file 'spec/views/home/index.html.haml_spec.rb' | |
remove_file 'spec/views/users/show.html.erb_spec.rb' | |
remove_file 'spec/views/users/show.html.haml_spec.rb' | |
remove_file 'spec/helpers/home_helper_spec.rb' | |
remove_file 'spec/helpers/users_helper_spec.rb' | |
end | |
# >--------------------------------[ AddUser ]--------------------------------< | |
say_custom 'AddUser' | |
after_bundler do | |
say_custom "AddUser recipe running 'after bundler'" | |
# Generate models and routes for a User | |
generate 'devise user' | |
generate 'cancan:ability' | |
generate 'rolify:role Role User' | |
# for ActiveRecord | |
# Devise created a Users database, we'll modify it | |
generate 'migration AddNameToUsers name:string' | |
generate 'migration AddConfirmableToUsers confirmation_token:string confirmed_at:datetime confirmation_sent_at:datetime unconfirmed_email:string' | |
# Devise created a Users model, we'll modify it | |
gsub_file 'app/models/user.rb', /attr_accessible :email/, 'attr_accessible :name, :email' | |
inject_into_file 'app/models/user.rb', :before => 'validates_uniqueness_of' do | |
"validates_presence_of :name\n" | |
end | |
gsub_file 'app/models/user.rb', /validates_uniqueness_of :email/, 'validates_uniqueness_of :name, :email' | |
# needed for both mongoid and ActiveRecord | |
gsub_file 'app/models/user.rb', /:registerable,/, ":registerable, :confirmable," | |
gsub_file 'app/models/user.rb', /:remember_me/, ':remember_me, :confirmed_at' | |
end | |
# >-------------------------------[ HomePage ]--------------------------------< | |
say_custom 'HomePage' | |
after_bundler do | |
say_custom "HomePage recipe running 'after bundler'" | |
# remove the default home page | |
remove_file 'public/index.html' | |
# create a home controller and view | |
generate(:controller, "home index") | |
remove_file 'app/views/home/index.html.haml' | |
create_file 'app/views/home/index.html.haml' do | |
<<-'HAML' | |
%h3 Home | |
HAML | |
end | |
# set routes | |
gsub_file 'config/routes.rb', /get \"home\/index\"/, 'root :to => "home#index"' | |
inject_into_file 'config/routes.rb', :before => " root :to" do | |
<<-RUBY | |
authenticated :user do | |
root :to => 'home#index' | |
end | |
\n | |
RUBY | |
end | |
end | |
# >-----------------------------[ SeedDatabase ]------------------------------< | |
say_custom 'SeedDatabase' | |
# Application template recipe for the rails_apps_composer. Check for a newer version here: | |
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/seed_database.rb | |
after_bundler do | |
say_custom "SeedDatabase recipe running 'after bundler'" | |
run 'bundle exec rake db:migrate' | |
generate 'devise_invitable user' | |
run 'bundle exec rake db:migrate' | |
# clone the schema changes to the test database | |
run 'bundle exec rake db:test:prepare' | |
append_file 'db/seeds.rb' do | |
<<-FILE | |
puts 'SETTING UP DEFAULT USER LOGIN' | |
user = User.create! :name => 'First User', :email => '[email protected]', :password => 'please', :password_confirmation => 'please', :confirmed_at => Time.now.utc | |
puts 'New user created: ' << user.name | |
user2 = User.create! :name => 'Second User', :email => '[email protected]', :password => 'please', :password_confirmation => 'please', :confirmed_at => Time.now.utc | |
puts 'New user created: ' << user2.name | |
FILE | |
end | |
append_file 'db/seeds.rb' do | |
<<-FILE | |
user.add_role :admin | |
FILE | |
end | |
end | |
after_everything do | |
say_custom "seeding the database" | |
run 'bundle exec rake db:seed' | |
end | |
# >------------------------------[ Formtastic ]-------------------------------< | |
say_custom 'Formtastic' | |
gem 'formtastic', '>= 2.1.0' | |
after_bundler do | |
generate "formtastic:install" | |
run "rm -rf /tmp/devise-formtastic && git clone git://github.com/digineo/devise-formtastic.git /tmp/devise-formtastic" | |
run "cp -rf /tmp/devise-formtastic/app/views/devise ./app/views/" | |
end | |
# >--------------------------------[ Cleanup ]--------------------------------< | |
say_custom 'Cleanup' | |
after_bundler do | |
say_custom "Cleanup recipe running 'after bundler'" | |
# remove unnecessary files | |
%w{ | |
README | |
doc/README_FOR_APP | |
public/index.html | |
app/assets/images/rails.png | |
}.each { |file| remove_file file } | |
# add placeholder READMEs | |
get "https://raw.github.com/RailsApps/rails3-application-templates/master/files/sample_readme.txt", "README" | |
get "https://raw.github.com/RailsApps/rails3-application-templates/master/files/sample_readme.textile", "README.textile" | |
gsub_file "README", /App_Name/, "#{app_name.humanize.titleize}" | |
gsub_file "README.textile", /App_Name/, "#{app_name.humanize.titleize}" | |
# remove commented lines and multiple blank lines from Gemfile | |
# thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb | |
gsub_file 'Gemfile', /#.*\n/, "\n" | |
gsub_file 'Gemfile', /\n^\s*\n/, "\n" | |
# remove commented lines and multiple blank lines from config/routes.rb | |
gsub_file 'config/routes.rb', / #.*\n/, "\n" | |
gsub_file 'config/routes.rb', /\n^\s*\n/, "\n" | |
end | |
# >--------------------------------[ Extras ]---------------------------------< | |
say_custom 'Extras' | |
say_custom "Adding 'rails-footnotes'" | |
gem 'rails-footnotes', '>= 3.7', :group => :development | |
after_bundler do | |
generate 'rails_footnotes:install' | |
end | |
gem 'kaminari' | |
gem 'therubyracer', :group => :assets, :platform => :ruby | |
say_custom 'Adding Active Admin' | |
gem 'activeadmin', :git => 'git://github.com/gregbell/active_admin.git' | |
after_bundler do | |
generate "active_admin:install" | |
run 'bundle exec rake db:migrate' | |
end | |
after_everything do | |
generate "active_admin:resource User" | |
generate "active_admin:resource Role" | |
generate "active_admin:resource Ability" | |
generate "active_admin:resource AdminUser" | |
end | |
# >----------------------------------[ Git ]----------------------------------< | |
say_custom 'Git' | |
after_everything do | |
say_custom "Git recipe running 'after everything'" | |
# Git should ignore some files | |
remove_file '.gitignore' | |
get "https://raw.github.com/RailsApps/rails3-application-templates/master/files/gitignore.txt", ".gitignore" | |
# Initialize new Git repo | |
git :init | |
git :add => '.' | |
git :commit => "-aqm 'new Rails app generated by Rails Apps Composer gem'" | |
# Create a git branch | |
git :checkout => ' -b working_branch' | |
git :add => '.' | |
git :commit => "-m 'Initial commit of working_branch'" | |
git :checkout => 'master' | |
end | |
# >-----------------------------[ Run Bundler ]-------------------------------< | |
say_custom "Running 'bundle install'. This will take a while." | |
run 'bundle install' | |
run 'bundle update' | |
say_custom "Running 'after bundler' callbacks." | |
require 'bundler/setup' | |
@after_blocks.each { |b| say_custom(b[0]); b[1].call } | |
say_custom "Running 'after everything' callbacks." | |
@after_everything_blocks.each { |b| say_custom(b[0]); b[1].call } | |
say_custom "Finished running the rails_apps_composer app template." | |
say_custom "Your new Rails app is ready." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment