Mercurial > hg > soundsoftware-site
diff .svn/pristine/ca/ca0795b70306f0c036dcfe85786cda89b037c6f0.svn-base @ 926:b73a59a6acbd luisf
Merge from cannam_integration
author | luisf <luis.figueira@eecs.qmul.ac.uk> |
---|---|
date | Fri, 11 May 2012 16:10:11 +0100 |
parents | cbb26bc654de |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.svn/pristine/ca/ca0795b70306f0c036dcfe85786cda89b037c6f0.svn-base Fri May 11 16:10:11 2012 +0100 @@ -0,0 +1,97 @@ +# An instance of Plugin is created for each plugin loaded by Rails, and +# stored in the <tt>Engines.plugins</tt> PluginList +# (see Engines::RailsExtensions::RailsInitializer for more details). +# +# Engines.plugins[:plugin_name] +# +# Other properties of the Plugin instance can also be set. +module Engines + class Plugin < Rails::Plugin + # Plugins can add paths to this attribute in init.rb if they need + # controllers loaded from additional locations. + attr_accessor :controller_paths + + # The directory in this plugin to mirror into the shared directory + # under +public+. + # + # Defaults to "assets" (see default_public_directory). + attr_accessor :public_directory + + protected + # The default set of code paths which will be added to the routing system + def default_controller_paths + %w(app/controllers components) + end + + # Attempts to detect the directory to use for public files. + # If +assets+ exists in the plugin, this will be used. If +assets+ is missing + # but +public+ is found, +public+ will be used. + def default_public_directory + Engines.select_existing_paths(%w(assets public).map { |p| File.join(directory, p) }).first + end + + public + + def initialize(directory) + super directory + @controller_paths = default_controller_paths + @public_directory = default_public_directory + end + + # Extends the superclass' load method to additionally mirror public assets + def load(initializer) + return if loaded? + super initializer + add_plugin_locale_paths + Assets.mirror_files_for(self) + end + + # select those paths that actually exist in the plugin's directory + def select_existing_paths(name) + Engines.select_existing_paths(self.send(name).map { |p| File.join(directory, p) }) + end + + def add_plugin_locale_paths + locale_path = File.join(directory, 'locales') + return unless File.exists?(locale_path) + + locale_files = Dir[File.join(locale_path, '*.{rb,yml}')] + return if locale_files.blank? + + first_app_element = + I18n.load_path.select{ |e| e =~ /^#{ RAILS_ROOT }/ }.reject{ |e| e =~ /^#{ RAILS_ROOT }\/vendor\/plugins/ }.first + app_index = I18n.load_path.index(first_app_element) || - 1 + + I18n.load_path.insert(app_index, *locale_files) + end + + # The path to this plugin's public files + def public_asset_directory + "#{File.basename(Engines.public_directory)}/#{name}" + end + + # The directory containing this plugin's migrations (<tt>plugin/db/migrate</tt>) + def migration_directory + File.join(self.directory, 'db', 'migrate') + end + + # Returns the version number of the latest migration for this plugin. Returns + # nil if this plugin has no migrations. + def latest_migration + migrations.last + end + + # Returns the version numbers of all migrations for this plugin. + def migrations + migrations = Dir[migration_directory+"/*.rb"] + migrations.map { |p| File.basename(p).match(/0*(\d+)\_/)[1].to_i }.sort + end + + # Migrate this plugin to the given version. See Engines::Plugin::Migrator for more + # information. + def migrate(version = nil) + Engines::Plugin::Migrator.migrate_plugin(self, version) + end + end +end +