# rails application template for generating customized rails apps
#
# == requires ==
#
# * rails 2.3+, rspec, cucumber, culerity (langalex-culerity gem), machinist
#
# == a newly generated app using this template comes with ==
#
# * working user registration/login via authlogic, cucumber features to verify that it works
# * rspec/cucumber/culerity for testing
# * thinking_sphinx configuration
# * german localization
# * capistrano deployment script
# * jquery and blueprint css set up
# * a blueprints.rb for machinist
#
# == how to use ==
#
# * install the required gems (and jruby for culerity)
# * generate a new app: rails my_new_app -m http://gist.github.com/raw/75038/a14ddd8be39b3d7705550b7fbd3a9b39cda63d58/upstream_rails_application_template.rb
# * run the features to verify everything is working: rake features
#
# == TODO ==
# * add forgot password method
# * make registration/login use resource_controller
app_name = `pwd`.split('/').last.strip
run "rm README"
run "rm -rf test"
run "rm public/index.html"
run "rm public/favicon.ico"
run "rm public/robots.txt"
run "rm public/images/rails.png"
run "rm -f public/javascripts/*"
# get jquery and plugins
run "curl -L http://jqueryjs.googlecode.com/files/jquery-1.3.2.js > public/javascripts/jquery.js"
run "curl -L http://jqueryjs.googlecode.com/svn/trunk/plugins/form/jquery.form.js > public/javascripts/jquery.form.js"
run "curl -L http://jqueryjs.googlecode.com/svn/trunk/plugins/methods/date.js > public/javascripts/date.js"
run "curl -L http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/scripts/jquery.datePicker.js > public/javascripts/jquery.datePicker.js"
run "curl -L http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/styles/datePicker.css > public/stylesheets/datePicker.css"
# blueprint/css
run "curl -L http://github.com/joshuaclayton/blueprint-css/tarball/master > public/stylesheets/blueprint.tar && tar xf public/stylesheets/blueprint.tar"
run 'rm public/stylesheets/blueprint.tar'
blueprint_dir = Dir.entries('.').grep(/blueprint/).first
run "mv #{blueprint_dir}/blueprint/*.css public/stylesheets"
run "rm -rf #{blueprint_dir}"
# environment
file 'config/environment.rb', <<-FILE
RAILS_GEM_VERSION = '2.3.1' unless defined? RAILS_GEM_VERSION
require File.join(File.dirname(__FILE__), 'boot')
Rails::Initializer.run do |config|
# config.load_paths += %W( \#{RAILS_ROOT}/extras )
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
# config.time_zone = 'UTC'
config.i18n.default_locale = :de
end
FILE
# application layout
file 'app/views/layouts/application.html.erb', <<-FILE
<%- if flash[:notice] -%>
<%= flash[:notice] %>
<%- end -%>
<%= yield %>
FILE
# Copy database.yml for distribution use
run "rm config/database.yml"
file "config/database.yml", <<-FILE
development:
adapter: mysql
database: #{app_name}_development
encoding: utf8
test:
adapter: mysql
database: #{app_name}_test
encoding: utf8
production:
username: rails
password:
adapter: mysql
database: #{app_name}_production
pool: 5
encoding: utf8
FILE
run "cp config/database.yml config/database.yml.example"
rake 'db:create'
# routes
file 'config/routes.rb', <<-FILE
ActionController::Routing::Routes.draw do |map|
end
FILE
# Set up .gitignore files
run "touch tmp/.gitignore log/.gitignore vendor/.gitignore"
run %{find . -type d -empty | grep -v "vendor" | grep -v ".git" | grep -v "tmp" | xargs -I xxx touch xxx/.gitignore}
file '.gitignore', <<-END
.DS_Store
log/*.log
log/*.pid
tmp/**/*
config/database.yml
db/schema.rb
config/*sphinx.conf
db/sphinx
END
# gems
gem 'mislav-will_paginate', :version => '~> 2.2.3', :lib => 'will_paginate', :source => 'http://gems.github.com'
gem 'authlogic'
gem 'giraffesoft-resource_controller', :lib => 'resource_controller', :source => 'http://gems.github.com'
rake 'gems:install', :sudo => true
# plugins
# plugin 'jrails', :git => 'git://github.com/aaronchi/jrails.git'
# plugin 'exceptional', :git => 'git://github.com/contrast/exceptional.git'
# run 'cp vendor/plugins/exceptional/exceptional.yml config/exceptional.yml'
# plugin 'thinking-sphinx', :git => 'git://github.com/freelancing-god/thinking-sphinx.git'
# generators
generate("rspec")
generate("rspec-rails")
run "rm -rf stories"
generate("cucumber")
run "rm features/step_definitions/webrat_steps.rb"
generate("culerity")
# enable culerity, disable webrat
file 'features/support/env.rb', <<-FILE
ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
require 'cucumber/rails/world'
require 'cucumber/formatters/unicode'
require 'cucumber/rails/rspec'
require 'culerity'
require 'machinist'
require RAILS_ROOT + '/spec/blueprints'
FILE
# machinist
file 'spec/blueprints.rb', <<-FILE
User.blueprint do
login "joe"
password "testtest"
password_confirmation "testtest"
end
FILE
# skip cucumber/rspec load errors on production server
[:cucumber, :rspec].each do |service|
file "lib/tasks/#{service}.rake", <<-FILE
begin
#{File.read("lib/tasks/#{service}.rake")}
rescue LoadError => e
STDERR.puts "could not load #{service}."
end
FILE
end
# authlogic login/signup
generate("session user_session")
generate 'rspec_model user login:string crypted_password:string password_salt:string persistence_token:string login_count:integer last_request_at:datetime last_login_at:datetime current_login_at:datetime last_login_ip:string current_login_ip:string'
route "map.root :controller => 'users', :action => 'new'"
route 'map.resource :user_session'
route "map.resource :account, :controller => 'users'"
route 'map.resources :users'
file "app/controllers/user_sessions_controller.rb", <<-FILE
class UserSessionsController < ApplicationController
require_user :only => :destroy
resource_controller
actions :new, :create
create do
flash "Login successful!"
success.wants.html do
redirect_back_or_default account_url
end
end
def destroy
current_user_session.destroy
flash[:notice] = "Logout successful!"
redirect_back_or_default new_user_session_url
end
end
FILE
file 'app/controllers/users_controller.rb', <<-FILE
class UsersController < ApplicationController
require_user :only => [:show, :edit, :update]
resource_controller
actions :new, :create, :show, :edit, :update
create do
flash "Account registered!"
success.wants.html do
redirect_back_or_default account_url
end
end
update.flash "Account updated!"
def object
@object ||= current_user
end
end
FILE
file 'app/models/user.rb', <<-FILE
class User < ActiveRecord::Base
acts_as_authentic
end
FILE
file 'app/controllers/application_controller.rb', <<-FILE
class ApplicationController < ActionController::Base
helper :all
protect_from_forgery
prepend_before_filter :activate_authlogic
filter_parameter_logging :password, :password_confirmation
helper_method :current_user_session, :current_user
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.user
end
def require_user
unless current_user
store_location
flash[:notice] = "You must be logged in to access this page"
redirect_to new_user_session_url
return false
end
end
def self.require_user(options = {})
before_filter :require_user, options
end
def store_location
session[:return_to] = request.request_uri
end
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end
end
FILE
file 'app/views/users/new.html.erb', <<-FILE