OSDN Git Service

c52bbb0ce726aac670661dba23679ecf0e015ef2
[redminele/redminele.git] / redmine / vendor / plugins / engines / lib / engines / plugin.rb
1 # An instance of Plugin is created for each plugin loaded by Rails, and
2 # stored in the <tt>Engines.plugins</tt> PluginList 
3 # (see Engines::RailsExtensions::RailsInitializer for more details).
4 #
5 #   Engines.plugins[:plugin_name]
6 #
7 # Other properties of the Plugin instance can also be set.
8 module Engines
9   class Plugin < Rails::Plugin    
10     # Plugins can add paths to this attribute in init.rb if they need
11     # controllers loaded from additional locations. 
12     attr_accessor :controller_paths
13   
14     # The directory in this plugin to mirror into the shared directory
15     # under +public+.
16     #
17     # Defaults to "assets" (see default_public_directory).
18     attr_accessor :public_directory   
19     
20     protected
21       # The default set of code paths which will be added to the routing system
22       def default_controller_paths
23         %w(app/controllers components)
24       end
25
26       # Attempts to detect the directory to use for public files.
27       # If +assets+ exists in the plugin, this will be used. If +assets+ is missing
28       # but +public+ is found, +public+ will be used.
29       def default_public_directory
30         Engines.select_existing_paths(%w(assets public).map { |p| File.join(directory, p) }).first
31       end
32     
33     public
34   
35     def initialize(directory)
36       super directory
37       @controller_paths = default_controller_paths
38       @public_directory = default_public_directory
39     end
40   
41     # Extends the superclass' load method to additionally mirror public assets
42     def load(initializer)
43       return if loaded?
44       super initializer
45       add_plugin_locale_paths
46       Assets.mirror_files_for(self)
47     end    
48   
49     # select those paths that actually exist in the plugin's directory
50     def select_existing_paths(name)
51       Engines.select_existing_paths(self.send(name).map { |p| File.join(directory, p) })
52     end    
53
54     def add_plugin_locale_paths
55       locale_path = File.join(directory, 'locales')
56       return unless File.exists?(locale_path)
57
58       locale_files = Dir[File.join(locale_path, '*.{rb,yml}')]
59       return if locale_files.blank?
60
61       first_app_element = 
62         I18n.load_path.select{ |e| e =~ /^#{ RAILS_ROOT }/ }.reject{ |e| e =~ /^#{ RAILS_ROOT }\/vendor\/plugins/ }.first
63       app_index = I18n.load_path.index(first_app_element) || - 1
64
65       I18n.load_path.insert(app_index, *locale_files)
66     end
67
68     # The path to this plugin's public files
69     def public_asset_directory
70       "#{File.basename(Engines.public_directory)}/#{name}"
71     end
72     
73     # The directory containing this plugin's migrations (<tt>plugin/db/migrate</tt>)
74     def migration_directory
75       File.join(self.directory, 'db', 'migrate')
76     end
77   
78     # Returns the version number of the latest migration for this plugin. Returns
79     # nil if this plugin has no migrations.
80     def latest_migration
81       migrations.last
82     end
83     
84     # Returns the version numbers of all migrations for this plugin.
85     def migrations
86       migrations = Dir[migration_directory+"/*.rb"]
87       migrations.map { |p| File.basename(p).match(/0*(\d+)\_/)[1].to_i }.sort
88     end
89     
90     # Migrate this plugin to the given version. See Engines::Plugin::Migrator for more
91     # information.   
92     def migrate(version = nil)
93       Engines::Plugin::Migrator.migrate_plugin(self, version)
94     end
95   end
96 end
97