aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/railtie/configuration.rb
blob: 28d7b2f9ae9c164cf1f4d56dc0f36598168077fb (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
require 'rails/configuration'

module Rails
  class Railtie
    class Configuration
      def middleware
        @@default_middleware_stack ||= default_middleware
      end

      # Holds generators configuration:
      #
      #   config.generators do |g|
      #     g.orm             :datamapper, :migration => true
      #     g.template_engine :haml
      #     g.test_framework  :rspec
      #   end
      #
      # If you want to disable color in console, do:
      #
      #   config.generators.colorize_logging = false
      #
      def generators
        @@generators ||= Rails::Configuration::Generators.new
        if block_given?
          yield @@generators
        else
          @@generators
        end
      end

      def after_initialize_blocks
        @@after_initialize_blocks ||= []
      end

      def after_initialize(&blk)
        after_initialize_blocks << blk if blk
      end

      def to_prepare_blocks
        @@to_prepare_blocks ||= []
      end

      def to_prepare(&blk)
        to_prepare_blocks << blk if blk
      end

      def respond_to?(name)
        super || name.to_s =~ config_key_regexp
      end

      def metal_loader
        @metal_loader ||= Rails::Application::MetalLoader.new
      end

    private

      def method_missing(name, *args, &blk)
        if name.to_s =~ config_key_regexp
          return $2 == '=' ? options[$1] = args.first : options[$1]
        end
        super
      end

      def config_key_regexp
        bits = config_keys.map { |n| Regexp.escape(n.to_s) }.join('|')
        /^(#{bits})(?:=)?$/
      end

      def config_keys
        (Railtie.railtie_names + Engine.engine_names).map { |n| n.to_s }.uniq
      end

      def options
        @@options ||= Hash.new { |h,k| h[k] = ActiveSupport::OrderedOptions.new }
      end

      def default_middleware
        require 'action_dispatch'
        ActionDispatch::MiddlewareStack.new.tap do |middleware|
          middleware.use('::ActionDispatch::Static', lambda { Rails.public_path }, :if => lambda { serve_static_assets })
          middleware.use('::Rack::Lock', :if => lambda { !allow_concurrency })
          middleware.use('::Rack::Runtime')
          middleware.use('::Rails::Rack::Logger')
          middleware.use('::ActionDispatch::ShowExceptions', lambda { consider_all_requests_local })
          middleware.use("::ActionDispatch::RemoteIp", lambda { action_dispatch.ip_spoofing_check }, lambda { action_dispatch.trusted_proxies })
          middleware.use('::Rack::Sendfile', lambda { action_dispatch.x_sendfile_header })
          middleware.use('::ActionDispatch::Callbacks', lambda { !cache_classes })
          middleware.use('::ActionDispatch::Cookies')
          middleware.use(lambda { ActionController::SessionManagement.session_store_for(action_dispatch.session_store) }, lambda { action_dispatch.session })
          middleware.use('::ActionDispatch::Flash', :if => lambda { action_dispatch.session_store })
          middleware.use(lambda { metal_loader.build_middleware(metals) }, :if => lambda { metal_loader.metals.any? })
          middleware.use('ActionDispatch::ParamsParser')
          middleware.use('::Rack::MethodOverride')
          middleware.use('::ActionDispatch::Head')
        end
      end
    end
  end
end