/lib/generators/instance/instance_generator.rb

https://github.com/plotchick/bionic_cms · Ruby · 132 lines · 97 code · 26 blank · 9 comment · 6 complexity · d01ace8e1b60cf12902aae51b5443865 MD5 · raw file

  1. require 'rbconfig'
  2. class InstanceGenerator < Rails::Generator::Base
  3. DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
  4. Config::CONFIG['ruby_install_name'])
  5. DATABASES = %w( mysql postgresql sqlite3 sqlserver db2 )
  6. MYSQL_SOCKET_LOCATIONS = [
  7. "/tmp/mysql.sock", # default
  8. "/var/run/mysqld/mysqld.sock", # debian/gentoo
  9. "/var/tmp/mysql.sock", # freebsd
  10. "/var/lib/mysql/mysql.sock", # fedora
  11. "/opt/local/lib/mysql/mysql.sock", # fedora
  12. "/opt/local/var/run/mysqld/mysqld.sock", # mac + darwinports + mysql
  13. "/opt/local/var/run/mysql4/mysqld.sock", # mac + darwinports + mysql4
  14. "/opt/local/var/run/mysql5/mysqld.sock" # mac + darwinports + mysql5
  15. ]
  16. default_options :db => "mysql", :shebang => DEFAULT_SHEBANG, :freeze => false
  17. def initialize(runtime_args, runtime_options = {})
  18. super
  19. usage if args.empty?
  20. usage("Databases supported for preconfiguration are: #{DATABASES.join(", ")}") if (options[:db] && !DATABASES.include?(options[:db]))
  21. @destination_root = args.shift
  22. end
  23. def manifest
  24. # The absolute location of the Bionic files
  25. root = File.expand_path(BIONIC_ROOT)
  26. # Use /usr/bin/env if no special shebang was specified
  27. script_options = { :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang] }
  28. record do |m|
  29. # Root directory
  30. m.directory ""
  31. # Standard files and directories
  32. base_dirs = %w(config config/environments config/initializers db lib lib/tasks lib/lockdown log script public vendor/plugins vendor/extensions)
  33. text_files = %w(CHANGELOG CONTRIBUTORS LICENSE INSTALL README lib/lockdown/init.rb)
  34. environments = Dir["#{root}/config/environments/*.rb"]
  35. scripts = Dir["#{root}/script/**/*"].reject { |f| f =~ /(destroy|generate|plugin)$/ }
  36. public_files = Dir["#{root}/public/**/*"]
  37. files = base_dirs + text_files + environments + scripts + public_files
  38. files.map! { |f| f = $1 if f =~ %r{^#{root}/(.+)$}; f }
  39. files.sort!
  40. files.each do |file|
  41. case
  42. when File.directory?("#{root}/#{file}")
  43. m.directory file
  44. when file =~ %r{^script/}
  45. m.file bionic_root(file), file, script_options
  46. else
  47. m.file bionic_root(file), file
  48. end
  49. end
  50. # script/generate
  51. m.file "instance_generate", "script/generate", script_options
  52. # database.yml
  53. m.template "databases/#{options[:db]}.yml", "config/database.yml", :assigns => {
  54. :app_name => app_name,
  55. :socket => options[:db] == "mysql" ? mysql_socket_location : nil
  56. }
  57. # Instance Rakefile
  58. m.file "instance_rakefile", "Rakefile"
  59. # Instance Configurations
  60. m.file "instance_routes.rb", "config/routes.rb"
  61. m.template "instance_environment.rb", "config/environment.rb", :assigns => {
  62. :app_name => app_name
  63. }
  64. instance_initializers = [
  65. "session_store.rb",
  66. "backtrace_silencers.rb",
  67. "bionic_init.rb",
  68. "inflections.rb",
  69. "mime_types.rb",
  70. "new_rails_defaults.rb"
  71. ]
  72. instance_initializers.each do |instance_initializer|
  73. m.template "initializers/instance_#{instance_initializer}", "config/initializers/#{instance_initializer}", :assigns => {
  74. :app_name => app_name
  75. }
  76. end
  77. m.template "instance_boot.rb", "config/boot.rb"
  78. # Install Readme
  79. m.readme bionic_root("INSTALL")
  80. end
  81. end
  82. protected
  83. def banner
  84. "Usage: #{$0} /path/to/bionic/app [options]"
  85. end
  86. def add_options!(opt)
  87. opt.separator ''
  88. opt.separator 'Options:'
  89. opt.on("-r", "--ruby=path", String,
  90. "Path to the Ruby binary of your choice (otherwise scripts use env, dispatchers current path).",
  91. "Default: #{DEFAULT_SHEBANG}") { |v| options[:shebang] = v }
  92. opt.on("-d", "--database=name", String,
  93. "Preconfigure for selected database (options: #{DATABASES.join(", ")}).",
  94. "Default: mysql") { |v| options[:db] = v }
  95. end
  96. def mysql_socket_location
  97. RUBY_PLATFORM =~ /mswin32/ ? MYSQL_SOCKET_LOCATIONS.find { |f| File.exists?(f) } : nil
  98. end
  99. private
  100. def bionic_root(filename = '')
  101. File.join("..", "..", "..", "..", filename)
  102. end
  103. def app_name
  104. File.basename(File.expand_path(@destination_root))
  105. end
  106. end