aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/plugin.rb
blob: c3b81bcd3ee039f3d2944c5e887a60d35c98afa3 (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
module Rails
  class Plugin < Railtie
    def self.all(list, paths)
      plugins = []
      paths.each do |path|
        Dir["#{path}/*"].each do |plugin_path|
          plugin = new(plugin_path)
          next unless list.include?(plugin.name) || list.include?(:all)
          plugins << plugin
        end
      end

      plugins.sort_by do |p|
        [list.index(p.name) || list.index(:all), p.name.to_s]
      end
    end

    attr_reader :name, :path

    def initialize(path)
      @name = File.basename(path).to_sym
      @path = path
    end

    def load_paths
      Dir["#{path}/{lib}", "#{path}/app/{models,controllers,helpers}"]
    end

    def load_tasks
      Dir["#{path}/{tasks,lib/tasks,rails/tasks}/**/*.rake"].sort.each { |ext| load ext }
    end

    initializer :add_to_load_path, :after => :set_autoload_paths do |app|
      load_paths.each do |path|
        $LOAD_PATH << path
        require "active_support/dependencies"

        ActiveSupport::Dependencies.load_paths << path

        unless app.config.reload_plugins
          ActiveSupport::Dependencies.load_once_paths << path
        end
      end
    end

    initializer :load_init_rb, :before => :load_application_initializers do |app|
      file   = "#{@path}/init.rb"
      config = app.config
      eval File.read(file), binding, file if File.file?(file)
    end

    initializer :add_view_paths, :after => :initialize_framework_views do
      plugin_views = "#{path}/app/views"
      if File.directory?(plugin_views)
        ActionController::Base.view_paths.concat([plugin_views]) if defined? ActionController
        ActionMailer::Base.view_paths.concat([plugin_views])     if defined? ActionMailer
      end
    end

    # TODO Isn't it supposed to be :after => "action_controller.initialize_routing" ?
    initializer :add_routing_file, :after => :initialize_routing do |app|
      routing_file = "#{path}/config/routes.rb"
      if File.exist?(routing_file)
        app.route_configuration_files << routing_file
        app.reload_routes!
      end
    end
  end
end