aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails_generator/generators/applications/app/app_generator.rb
blob: 8bdc6db86b6f7ae9c0ddbad7f81d99bba9403765 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
require 'rbconfig'

class AppGenerator < Rails::Generator::Base
  DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
                              Config::CONFIG['ruby_install_name'])

  default_options   :gem => true, :shebang => DEFAULT_SHEBANG
  mandatory_options :source  => "#{File.dirname(__FILE__)}/../../../../.."

  def initialize(runtime_args, runtime_options = {})
    super
    usage if args.empty?
    @destination_root = args.shift
  end

  def manifest
    script_options = { :chmod => 0755, :shebang => options[:shebang] }

    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"
      m.file "CHANGELOG", "CHANGELOG"

      # Application
      m.template "helpers/application.rb", "app/controllers/application.rb"
      m.template "helpers/application_helper.rb", "app/helpers/application_helper.rb"
      m.template "helpers/test_helper.rb", "test/test_helper.rb"

      # database.yml and .htaccess
      m.template "configs/database.yml", "config/database.yml"
      m.template "configs/routes.rb", "config/routes.rb"
      m.template "configs/apache.conf", "public/.htaccess"

      # Environments
      if options[:gem]
        m.file "environments/shared_for_gem.rb", "config/environment.rb"
      else
        m.file "environments/shared.rb", "config/environment.rb"
      end
      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(console console_sandbox.rb destroy generate server).each do |file|
        m.file "bin/#{file}", "script/#{file}", script_options
      end
      if options[:gem]
        m.file "bin/breakpointer_for_gem", "script/breakpointer", script_options
      else
        m.file "bin/breakpointer", "script/breakpointer", script_options
      end

      # Dispatches
      m.file "dispatches/dispatch.rb", "public/dispatch.rb", script_options
      m.file "dispatches/dispatch.rb", "public/dispatch.cgi", script_options
      m.file "dispatches/dispatch.fcgi", "public/dispatch.fcgi", script_options

      # HTML files
      %w(404 500 index).each do |file|
        m.template "html/#{file}.html", "public/#{file}.html"
      end

      # Docs
      m.template "doc/index.html", "public/_doc/index.html"
      m.file "doc/README_FOR_APP", "doc/README_FOR_APP"

      # Logs
      %w(apache production development test).each { |file|
        m.file "configs/empty.log", "log/#{file}.log", :chmod => 0666
      }
    end
  end

  protected
    def banner
      "Usage: #{$0} /path/to/your/app [options]"
    end

    def add_options!(opt)
      opt.separator ''
      opt.separator 'Options:'
      opt.on("--ruby [#{DEFAULT_SHEBANG}]",
             "Path to the Ruby binary of your choice.") { |options[:shebang]| }
      opt.on("--without-gems",
             "Don't use the Rails gems for your app.",
             "WARNING: see note below.") { |options[:gem]| }
    end


  # Installation skeleton.  Intermediate directories are automatically
  # created so don't sweat their absence here.
  BASEDIRS = %w(
    app/apis
    app/controllers
    app/helpers
    app/models
    app/views/layouts
    config/environments
    db
    doc
    lib
    log
    public/_doc
    public/images
    public/javascripts
    public/stylesheets
    script
    test/fixtures
    test/functional
    test/mocks/development
    test/mocks/testing
    test/unit
    vendor
  )
end