1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-05 16:24:21 +01:00
fab-manager/lib/plugin/instance.rb
2020-02-26 10:19:43 +01:00

101 lines
2.4 KiB
Ruby

# frozen_string_literal: true
require 'fileutils'
require 'plugin_registry'
# Fab-manager extensible functionalities
module Plugin; end
class Plugin::Instance
attr_accessor :path
%i[assets initializers javascripts styles].each do |att|
class_eval %(
def #{att}
@#{att} ||= []
end
), __FILE__, __LINE__ - 4
end
def self.find_all(parent_path)
[].tap { |plugins|
# also follows symlinks - http://stackoverflow.com/q/357754
Dir["#{parent_path}/**/*/**/plugin.rb"].sort.each do |path|
plugins << new(nil, path)
end
}
end
def initialize(metadata=nil, path=nil)
@metadata = metadata
@path = path
@idx = 0
end
def activate!
if @path
root_path = "#{File.dirname(@path)}/assets/javascripts"
PluginRegistry.register_glob(root_path, 'coffee.erb')
end
instance_eval File.read(path), path # execute all code of the plugin main file ! (named plugin.rb)
register_assets! unless assets.blank?
Rails.configuration.assets.paths << "#{File.dirname(path)}/assets"
Rails.configuration.assets.precompile += [lambda do |_filename, path|
(Dir['plugins/*/assets/templates'].any? { |p| path.include?(p) })
end]
Rails.configuration.sass.load_paths += Dir['plugins/*/assets/stylesheets']
# Automatically include rake tasks
Rake.add_rakelib("#{File.dirname(path)}/lib/tasks")
# Automatically include migrations
Rails.configuration.paths['db/migrate'] << "#{File.dirname(path)}/db/migrate"
end
# to be used by the plugin !
def register_asset(file, opts=nil)
full_path = File.dirname(path) << '/assets/' << file
assets << [full_path, opts]
end
def register_code_insertion(key, code)
PluginRegistry.code_insertions[key] ||= []
PluginRegistry.code_insertions[key] << code
end
# useless ?
def register_css(style)
styles << style
end
def after_initialize(&block)
initializers << block
end
def notify_after_initialize
initializers.each do |callback|
begin
callback.call(self)
rescue ActiveRecord::StatementInvalid => e
# When running db:migrate for the first time on a new database, plugin initializers might
# try to use models. Tolerate it.
raise e unless e.message.try(:include?, 'PG::UndefinedTable')
end
end
end
protected
def register_assets!
assets.each do |asset, opts|
PluginRegistry.register_asset(asset, opts)
end
end
end