aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/generators/rails/app/templates/config/boot.rb
blob: 928b195d8d66e21d4c18f889dd8d4e340ad258eb (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb

module Rails
  # Mark the version of Rails that generated the boot.rb file. This is
  # a temporary solution and will most likely be removed as Rails 3.0
  # comes closer.
  BOOTSTRAP_VERSION = "3.0"

  class << self
    def boot!
      unless booted?
        root = File.expand_path('../..', __FILE__)
        booter = File.exist?("#{root}/vendor/rails") ? VendorBoot : GemBoot
        booter.new(root).run
      end
    end

    def booted?
      defined? Rails::Initializer
    end
  end

  class Boot
    def initialize(root)
      @root = root
    end

    def run
      preinitialize
      set_load_paths
      load_initializer
    end

    def preinitialize
      path = "#{@root}/config/preinitializer.rb"
      load(path) if File.exist?(path)
    end

    def set_load_paths
      %w(
        actionmailer/lib
        actionpack/lib
        activemodel/lib
        activerecord/lib
        activeresource/lib
        activesupport/lib
        railties/lib
        railties
      ).reverse_each do |path|
        path = "#{framework_root_path}/#{path}"
        $LOAD_PATH.unshift(path) if File.directory?(path)
        $LOAD_PATH.uniq!
      end
    end

    def framework_root_path
      defined?(::RAILS_FRAMEWORK_ROOT) ? ::RAILS_FRAMEWORK_ROOT : "#{@root}/vendor/rails"
    end
  end

  class VendorBoot < Boot
    def load_initializer
      require "rails"
      install_gem_spec_stubs
    end

    def install_gem_spec_stubs
      begin; require "rubygems"; rescue LoadError; return; end

      %w(rails activesupport activerecord actionpack actionmailer activeresource).each do |stub|
        Gem.loaded_specs[stub] ||= Gem::Specification.new do |s|
          s.name = stub
          s.version = Rails::VERSION::STRING
          s.loaded_from = ""
        end
      end
    end
  end

  class GemBoot < Boot
    def load_initializer
      load_rubygems
      load_rails_gem
      require 'rails'
    end

    def load_rails_gem
      if version = gem_version
        gem 'rails', version
      else
        gem 'rails'
      end
    rescue Gem::LoadError => load_error
      $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
      exit 1
    end

    def rubygems_version
      Gem::RubyGemsVersion rescue nil
    end

    def gem_version
      if defined? RAILS_GEM_VERSION
        RAILS_GEM_VERSION
      elsif ENV.include?('RAILS_GEM_VERSION')
        ENV['RAILS_GEM_VERSION']
      else
        parse_gem_version(read_environment_rb)
      end
    end

    def load_rubygems
      min_version = '1.3.2'
      require 'rubygems'
      unless rubygems_version >= min_version
        $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
        exit 1
      end

    rescue LoadError
      $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
      exit 1
    end

    def parse_gem_version(text)
      $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
    end

    private
      def read_environment_rb
        File.read("#{@root}/config/environment.rb")
      end
  end
end

# All that for this:
Rails.boot!