summaryrefslogtreecommitdiffstats
path: root/vendor/plugins/engines/lib/engines/plugin.rb
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/plugins/engines/lib/engines/plugin.rb')
-rw-r--r--vendor/plugins/engines/lib/engines/plugin.rb126
1 files changed, 126 insertions, 0 deletions
diff --git a/vendor/plugins/engines/lib/engines/plugin.rb b/vendor/plugins/engines/lib/engines/plugin.rb
new file mode 100644
index 000000000..caa58f7cd
--- /dev/null
+++ b/vendor/plugins/engines/lib/engines/plugin.rb
@@ -0,0 +1,126 @@
+# 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]
+#
+# If this plugin contains paths in directories other than <tt>app/controllers</tt>,
+# <tt>app/helpers</tt>, <tt>app/models</tt> and <tt>components</tt>, authors can
+# declare this by adding extra paths to #code_paths:
+#
+# Rails.plugin[:my_plugin].code_paths << "app/sweepers" << "vendor/my_lib"
+#
+# Other properties of the Plugin instance can also be set.
+module Engines
+ class Plugin < Rails::Plugin
+ # Plugins can add code paths to this attribute in init.rb if they
+ # need plugin directories to be added to the load path, i.e.
+ #
+ # plugin.code_paths << 'app/other_classes'
+ #
+ # Defaults to ["app/controllers", "app/helpers", "app/models", "components"]
+ attr_accessor :code_paths
+
+ # 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 $LOAD_PATH
+ # and Dependencies.load_paths
+ def default_code_paths
+ # lib will actually be removed from the load paths when we call
+ # uniq! in #inject_into_load_paths, but it's important to keep it
+ # around (for the documentation tasks, for instance).
+ %w(app/controllers app/helpers app/models components lib)
+ end
+
+ # 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
+ @code_paths = default_code_paths
+ @controller_paths = default_controller_paths
+ @public_directory = default_public_directory
+ end
+
+ # Returns a list of paths this plugin wishes to make available in $LOAD_PATH
+ #
+ # Overwrites the correspondend method in the superclass
+ def load_paths
+ report_nonexistant_or_empty_plugin! unless valid?
+ select_existing_paths :code_paths
+ end
+
+ # Extends the superclass' load method to additionally mirror public assets
+ def load(initializer)
+ return if loaded?
+ super initializer
+ add_plugin_view_paths
+ Assets.mirror_files_for(self)
+ end
+
+ # for code_paths and controller_paths 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_view_paths
+ view_path = File.join(directory, 'app', 'views')
+ if File.exist?(view_path)
+ ActionController::Base.view_paths.insert(1, view_path) # push it just underneath the app
+ ActionView::TemplateFinder.process_view_paths(view_path)
+ end
+ end
+
+ # The path to this plugin's public files
+ def public_asset_directory
+ "#{File.basename(Engines.public_directory)}/#{name}"
+ end
+
+ # The path to this plugin's routes file
+ def routes_path
+ File.join(directory, "routes.rb")
+ 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 = Dir[migration_directory+"/*.rb"]
+ return nil if migrations.empty?
+ migrations.map { |p| File.basename(p) }.sort.last.match(/0*(\d+)\_/)[1].to_i
+ 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
+