Cleanup the app generator
This commit is contained in:
parent
73213f4ca7
commit
c5f461d7b0
@ -3,115 +3,37 @@
|
||||
require 'active_support/secure_random'
|
||||
|
||||
class AppGenerator < Rails::Generator::Base
|
||||
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
||||
Config::CONFIG['ruby_install_name'])
|
||||
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
||||
|
||||
DATABASES = %w(mysql oracle postgresql sqlite2 sqlite3 frontbase ibm_db)
|
||||
DATABASES = %w( mysql oracle postgresql sqlite2 sqlite3 frontbase ibm_db )
|
||||
DEFAULT_DATABASE = 'sqlite3'
|
||||
|
||||
mandatory_options :source => "#{File.dirname(__FILE__)}/../../../../.."
|
||||
default_options :db => (ENV["RAILS_DEFAULT_DATABASE"] || DEFAULT_DATABASE),
|
||||
:shebang => DEFAULT_SHEBANG, :with_dispatchers => false, :freeze => false
|
||||
mandatory_options :source => "#{File.dirname(__FILE__)}/../../../../.."
|
||||
|
||||
|
||||
def initialize(runtime_args, runtime_options = {})
|
||||
super
|
||||
|
||||
usage if args.empty?
|
||||
usage("Databases supported for preconfiguration are: #{DATABASES.join(", ")}") if (options[:db] && !DATABASES.include?(options[:db]))
|
||||
|
||||
@destination_root = args.shift
|
||||
@app_name = File.basename(File.expand_path(@destination_root))
|
||||
end
|
||||
|
||||
def manifest
|
||||
# Use /usr/bin/env if no special shebang was specified
|
||||
script_options = { :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang] }
|
||||
dispatcher_options = { :chmod => 0755, :shebang => options[:shebang] }
|
||||
|
||||
# duplicate CGI::Session#generate_unique_id
|
||||
md5 = Digest::MD5.new
|
||||
now = Time.now
|
||||
md5 << now.to_s
|
||||
md5 << String(now.usec)
|
||||
md5 << String(rand(0))
|
||||
md5 << String($$)
|
||||
md5 << @app_name
|
||||
|
||||
# Do our best to generate a secure secret key for CookieStore
|
||||
secret = ActiveSupport::SecureRandom.hex(64)
|
||||
|
||||
record do |m|
|
||||
# Root directory and all subdirectories.
|
||||
m.directory ''
|
||||
BASEDIRS.each { |path| m.directory path }
|
||||
|
||||
# Root
|
||||
m.file "fresh_rakefile", "Rakefile"
|
||||
m.file "README", "README"
|
||||
|
||||
# Application
|
||||
m.template "helpers/application_controller.rb", "app/controllers/application_controller.rb", :assigns => {
|
||||
:app_name => @app_name, :app_secret => md5.hexdigest }
|
||||
m.template "helpers/application_helper.rb", "app/helpers/application_helper.rb"
|
||||
m.template "helpers/test_helper.rb", "test/test_helper.rb"
|
||||
m.template "helpers/performance_test.rb", "test/performance/browsing_test.rb"
|
||||
|
||||
# database.yml and routes.rb
|
||||
m.template "configs/databases/#{options[:db]}.yml", "config/database.yml", :assigns => {
|
||||
:app_name => @app_name,
|
||||
:socket => options[:db] == "mysql" ? mysql_socket_location : nil
|
||||
}
|
||||
m.template "configs/routes.rb", "config/routes.rb"
|
||||
|
||||
# Initializers
|
||||
m.template "configs/initializers/backtrace_silencers.rb", "config/initializers/backtrace_silencers.rb"
|
||||
m.template "configs/initializers/inflections.rb", "config/initializers/inflections.rb"
|
||||
m.template "configs/initializers/mime_types.rb", "config/initializers/mime_types.rb"
|
||||
m.template "configs/initializers/new_rails_defaults.rb", "config/initializers/new_rails_defaults.rb"
|
||||
|
||||
# Locale
|
||||
m.template "configs/locales/en.yml", "config/locales/en.yml"
|
||||
|
||||
# Environments
|
||||
m.file "environments/boot.rb", "config/boot.rb"
|
||||
m.template "environments/environment.rb", "config/environment.rb", :assigns => { :freeze => options[:freeze], :app_name => @app_name, :app_secret => secret }
|
||||
m.file "environments/production.rb", "config/environments/production.rb"
|
||||
m.file "environments/development.rb", "config/environments/development.rb"
|
||||
m.file "environments/test.rb", "config/environments/test.rb"
|
||||
|
||||
# Scripts
|
||||
%w( about console dbconsole destroy generate performance/benchmarker performance/profiler performance/request process/reaper process/spawner process/inspector runner server plugin ).each do |file|
|
||||
m.file "bin/#{file}", "script/#{file}", script_options
|
||||
end
|
||||
|
||||
# Dispatches
|
||||
if options[:with_dispatchers]
|
||||
m.file "dispatches/dispatch.rb", "public/dispatch.rb", dispatcher_options
|
||||
m.file "dispatches/dispatch.rb", "public/dispatch.cgi", dispatcher_options
|
||||
m.file "dispatches/dispatch.fcgi", "public/dispatch.fcgi", dispatcher_options
|
||||
end
|
||||
|
||||
# HTML files
|
||||
%w(404 422 500 index).each do |file|
|
||||
m.template "html/#{file}.html", "public/#{file}.html"
|
||||
end
|
||||
|
||||
m.template "html/favicon.ico", "public/favicon.ico"
|
||||
m.template "html/robots.txt", "public/robots.txt"
|
||||
m.file "html/images/rails.png", "public/images/rails.png"
|
||||
|
||||
# Javascripts
|
||||
m.file "html/javascripts/prototype.js", "public/javascripts/prototype.js"
|
||||
m.file "html/javascripts/effects.js", "public/javascripts/effects.js"
|
||||
m.file "html/javascripts/dragdrop.js", "public/javascripts/dragdrop.js"
|
||||
m.file "html/javascripts/controls.js", "public/javascripts/controls.js"
|
||||
m.file "html/javascripts/application.js", "public/javascripts/application.js"
|
||||
|
||||
# Docs
|
||||
m.file "doc/README_FOR_APP", "doc/README_FOR_APP"
|
||||
|
||||
# Logs
|
||||
%w(server production development test).each { |file|
|
||||
m.file "configs/empty.log", "log/#{file}.log", :chmod => 0666
|
||||
}
|
||||
create_directories(m)
|
||||
create_root_files(m)
|
||||
create_app_files(m)
|
||||
create_config_files(m)
|
||||
create_script_files(m)
|
||||
create_test_files(m)
|
||||
create_public_files(m)
|
||||
create_documentation_file(m)
|
||||
create_log_files(m)
|
||||
end
|
||||
end
|
||||
|
||||
@ -140,53 +62,185 @@ def add_options!(opt)
|
||||
"Default: false") { |v| options[:freeze] = v }
|
||||
end
|
||||
|
||||
def mysql_socket_location
|
||||
MYSQL_SOCKET_LOCATIONS.find { |f| File.exist?(f) } unless RUBY_PLATFORM =~ /(:?mswin|mingw)/
|
||||
|
||||
private
|
||||
def create_directories(m)
|
||||
m.directory ''
|
||||
|
||||
# Intermediate directories are automatically created so don't sweat their absence here.
|
||||
%w(
|
||||
app/controllers
|
||||
app/helpers
|
||||
app/models
|
||||
app/views/layouts
|
||||
config/environments
|
||||
config/initializers
|
||||
config/locales
|
||||
db
|
||||
doc
|
||||
lib
|
||||
lib/tasks
|
||||
log
|
||||
public/images
|
||||
public/javascripts
|
||||
public/stylesheets
|
||||
script/performance
|
||||
script/process
|
||||
test/fixtures
|
||||
test/functional
|
||||
test/integration
|
||||
test/performance
|
||||
test/unit
|
||||
vendor
|
||||
vendor/plugins
|
||||
tmp/sessions
|
||||
tmp/sockets
|
||||
tmp/cache
|
||||
tmp/pids
|
||||
).each { |path| m.directory(path) }
|
||||
end
|
||||
|
||||
def create_root_files(m)
|
||||
m.file "fresh_rakefile", "Rakefile"
|
||||
m.file "README", "README"
|
||||
end
|
||||
|
||||
def create_app_files(m)
|
||||
m.file "helpers/application_controller.rb", "app/controllers/application_controller.rb"
|
||||
m.file "helpers/application_helper.rb", "app/helpers/application_helper.rb"
|
||||
end
|
||||
|
||||
def create_config_files(m)
|
||||
create_database_configuration_file(m)
|
||||
create_routes_file(m)
|
||||
create_locale_file(m)
|
||||
create_initializer_files(m)
|
||||
create_environment_files(m)
|
||||
end
|
||||
|
||||
def create_documentation_file(m)
|
||||
m.file "doc/README_FOR_APP", "doc/README_FOR_APP"
|
||||
end
|
||||
|
||||
def create_log_files(m)
|
||||
%w( server production development test ).each do |file|
|
||||
m.file "configs/empty.log", "log/#{file}.log", :chmod => 0666
|
||||
end
|
||||
end
|
||||
|
||||
def create_public_files(m)
|
||||
create_dispatch_files(m)
|
||||
create_error_files(m)
|
||||
create_welcome_file(m)
|
||||
create_browser_convention_files(m)
|
||||
create_rails_image(m)
|
||||
create_javascript_files(m)
|
||||
end
|
||||
|
||||
def create_script_files(m)
|
||||
%w(
|
||||
about console dbconsole destroy generate performance/benchmarker performance/profiler
|
||||
performance/request process/reaper process/spawner process/inspector runner server plugin
|
||||
).each do |file|
|
||||
m.file "bin/#{file}", "script/#{file}", {
|
||||
:chmod => 0755,
|
||||
:shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def create_test_files(m)
|
||||
m.file "helpers/test_helper.rb", "test/test_helper.rb"
|
||||
m.file "helpers/performance_test.rb", "test/performance/browsing_test.rb"
|
||||
end
|
||||
|
||||
|
||||
# Installation skeleton. Intermediate directories are automatically
|
||||
# created so don't sweat their absence here.
|
||||
BASEDIRS = %w(
|
||||
app/controllers
|
||||
app/helpers
|
||||
app/models
|
||||
app/views/layouts
|
||||
config/environments
|
||||
config/initializers
|
||||
config/locales
|
||||
db
|
||||
doc
|
||||
lib
|
||||
lib/tasks
|
||||
log
|
||||
public/images
|
||||
public/javascripts
|
||||
public/stylesheets
|
||||
script/performance
|
||||
script/process
|
||||
test/fixtures
|
||||
test/functional
|
||||
test/integration
|
||||
test/performance
|
||||
test/unit
|
||||
vendor
|
||||
vendor/plugins
|
||||
tmp/sessions
|
||||
tmp/sockets
|
||||
tmp/cache
|
||||
tmp/pids
|
||||
)
|
||||
def create_database_configuration_file(m)
|
||||
m.template "configs/databases/#{options[:db]}.yml", "config/database.yml", :assigns => {
|
||||
:app_name => @app_name,
|
||||
:socket => options[:db] == "mysql" ? mysql_socket_location : nil }
|
||||
end
|
||||
|
||||
def create_routes_file(m)
|
||||
m.file "configs/routes.rb", "config/routes.rb"
|
||||
end
|
||||
|
||||
MYSQL_SOCKET_LOCATIONS = [
|
||||
"/tmp/mysql.sock", # default
|
||||
"/var/run/mysqld/mysqld.sock", # debian/gentoo
|
||||
"/var/tmp/mysql.sock", # freebsd
|
||||
"/var/lib/mysql/mysql.sock", # fedora
|
||||
"/opt/local/lib/mysql/mysql.sock", # fedora
|
||||
"/opt/local/var/run/mysqld/mysqld.sock", # mac + darwinports + mysql
|
||||
"/opt/local/var/run/mysql4/mysqld.sock", # mac + darwinports + mysql4
|
||||
"/opt/local/var/run/mysql5/mysqld.sock", # mac + darwinports + mysql5
|
||||
"/opt/lampp/var/mysql/mysql.sock" # xampp for linux
|
||||
]
|
||||
end
|
||||
def create_initializer_files(m)
|
||||
%w(
|
||||
backtrace_silencers
|
||||
inflections
|
||||
mime_types
|
||||
new_rails_defaults
|
||||
).each do |initializer|
|
||||
m.file "configs/initializers/#{initializer}.rb", "config/initializers/#{initializer}.rb"
|
||||
end
|
||||
|
||||
m.template "configs/initializers/session_store.rb", "config/initializers/session_store.rb",
|
||||
:assigns => { :app_name => @app_name, :app_secret => ActiveSupport::SecureRandom.hex(64) }
|
||||
end
|
||||
|
||||
def create_locale_file(m)
|
||||
m.file "configs/locales/en.yml", "config/locales/en.yml"
|
||||
end
|
||||
|
||||
def create_environment_files(m)
|
||||
m.template "environments/environment.rb", "config/environment.rb",
|
||||
:assigns => { :freeze => options[:freeze] }
|
||||
|
||||
m.file "environments/boot.rb", "config/boot.rb"
|
||||
m.file "environments/production.rb", "config/environments/production.rb"
|
||||
m.file "environments/development.rb", "config/environments/development.rb"
|
||||
m.file "environments/test.rb", "config/environments/test.rb"
|
||||
end
|
||||
|
||||
|
||||
def create_dispatch_files(m)
|
||||
if options[:with_dispatchers]
|
||||
dispatcher_options = { :chmod => 0755, :shebang => options[:shebang] }
|
||||
|
||||
m.file "dispatches/dispatch.rb", "public/dispatch.rb", dispatcher_options
|
||||
m.file "dispatches/dispatch.rb", "public/dispatch.cgi", dispatcher_options
|
||||
m.file "dispatches/dispatch.fcgi", "public/dispatch.fcgi", dispatcher_options
|
||||
end
|
||||
end
|
||||
|
||||
def create_error_files(m)
|
||||
%w( 404 422 500 ).each do |file|
|
||||
m.file "html/#{file}.html", "public/#{file}.html"
|
||||
end
|
||||
end
|
||||
|
||||
def create_welcome_file(m)
|
||||
m.file 'html/index.html', 'public/index.html'
|
||||
end
|
||||
|
||||
def create_browser_convention_files(m)
|
||||
m.file "html/favicon.ico", "public/favicon.ico"
|
||||
m.file "html/robots.txt", "public/robots.txt"
|
||||
end
|
||||
|
||||
def create_rails_image(m)
|
||||
m.file "html/images/rails.png", "public/images/rails.png"
|
||||
end
|
||||
|
||||
def create_javascript_files(m)
|
||||
%w( prototype effects dragdrop controls application ).each do |javascript|
|
||||
m.file "html/javascripts/#{javascript}.js", "public/javascripts/#{javascript}.js"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def mysql_socket_location
|
||||
[
|
||||
"/tmp/mysql.sock", # default
|
||||
"/var/run/mysqld/mysqld.sock", # debian/gentoo
|
||||
"/var/tmp/mysql.sock", # freebsd
|
||||
"/var/lib/mysql/mysql.sock", # fedora
|
||||
"/opt/local/lib/mysql/mysql.sock", # fedora
|
||||
"/opt/local/var/run/mysqld/mysqld.sock", # mac + darwinports + mysql
|
||||
"/opt/local/var/run/mysql4/mysqld.sock", # mac + darwinports + mysql4
|
||||
"/opt/local/var/run/mysql5/mysqld.sock", # mac + darwinports + mysql5
|
||||
"/opt/lampp/var/mysql/mysql.sock" # xampp for linux
|
||||
].find { |f| File.exist?(f) } unless RUBY_PLATFORM =~ /(:?mswin|mingw)/
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user