class Nucleon::Plugin::Base

Public Class Methods

build_info(namespace, plugin_type, data) click to toggle source
    # File lib/core/plugin/base.rb
346 def self.build_info(namespace, plugin_type, data)
347   plugins = []
348 
349   if data.is_a?(Hash)
350     data = [ data ]
351   end
352 
353   logger.debug("Building plugin list of #{plugin_type}")
354 
355   if data.is_a?(Array)
356     data.each do |info|
357       unless Util::Data.empty?(info)
358         info = translate(info)
359 
360         if Util::Data.empty?(info[:provider])
361           info[:provider] = Nucleon.type_default(namespace, plugin_type)
362         end
363 
364         plugins << info
365       end
366     end
367   end
368   return plugins
369 end
code() click to toggle source
    # File lib/core/plugin/base.rb
142 def self.code
143   Nucleon.code
144 end
codes(*codes) click to toggle source
    # File lib/core/plugin/base.rb
150 def self.codes(*codes)
151   Nucleon.codes(*codes)
152 end
init_plugin_collection(*external_block_methods) click to toggle source
    # File lib/core/plugin/base.rb
407 def self.init_plugin_collection(*external_block_methods)
408   logger.debug("Initializing plugin collection interface at #{Time.now}")
409 
410   include Parallel
411   external_block_exec(*external_block_methods)
412 
413   include Mixin::Settings
414   include Mixin::SubConfig
415 
416   extend Mixin::Macro::PluginInterface
417 end
new(namespace, plugin_type, provider, options) click to toggle source

All Plugin classes should directly or indirectly extend Base

Calls superclass method Nucleon::Core::new
   # File lib/core/plugin/base.rb
12 def initialize(namespace, plugin_type, provider, options)
13   @actor = Nucleon.handle(self)
14 
15   config = Util::Data.clean(Config.ensure(options), false)
16   name   = Util::Data.ensure_value(config.delete(:plugin_name), config.delete(:name, provider))
17 
18   @quiet = config.delete(:quiet, false)
19 
20   set_meta(config.delete(:meta, Config.new))
21 
22   # No logging statements above this line!!
23   super(config.import({ :logger => "#{namespace}->#{plugin_type}->#{plugin_provider}" }), {}, true, false, false)
24   myself.plugin_name = name
25 
26   logger.debug("Normalizing #{namespace} #{plugin_type} plugin #{plugin_name}")
27   normalize(false)
28 
29   @initialized = true
30 end
register_ids() click to toggle source
  # File lib/core/plugin/base.rb
6 def self.register_ids
7   [ :plugin_name, :name ]
8 end
translate(data) click to toggle source
    # File lib/core/plugin/base.rb
373 def self.translate(data)
374   logger.debug("Translating input data to internal plugin structure")
375   return ( data.is_a?(Hash) ? symbol_map(data) : data )
376 end
translate_reference(reference, editable = false) click to toggle source
    # File lib/core/plugin/base.rb
380 def self.translate_reference(reference, editable = false)
381   # ex: provider:::name
382   if reference && reference.match(/^\s*([a-zA-Z0-9_-]+)(?::::)?(.*)?\s*$/)
383     provider = $1
384     name     = $2
385 
386     logger.debug("Translating plugin reference: #{provider}  #{name}")
387 
388     info = {
389       :provider => provider,
390       :name     => name
391     }
392 
393     logger.debug("Plugin reference info: #{info.inspect}")
394     return info
395   end
396   nil
397 end

Public Instance Methods

admin_exec(return_result = true, &block) click to toggle source
    # File lib/core/plugin/base.rb
438 def admin_exec(return_result = true, &block)
439   if Nucleon.admin?
440     safe_exec(return_result, &block)
441   else
442     warn("The #{plugin_provider} action must be run as a machine administrator", { :i18n => false })
443     myself.status = code.access_denied
444   end
445 end
ask(message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
217 def ask(message, options = {})
218   ui.ask(message, options)
219 end
code() click to toggle source
    # File lib/core/plugin/base.rb
146 def code
147   self.class.code
148 end
codes(*codes) click to toggle source
    # File lib/core/plugin/base.rb
154 def codes(*codes)
155   self.class.codes(*codes)
156 end
error(message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
314 def error(message, options = {})
315   config = Config.new(options).import({ :operation => :error })
316 
317   unless quiet?
318     message = render_message(message, config)
319     ui.error(message, config.export)
320   end
321   message
322 end
extended_config(type, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
190 def extended_config(type, options = {})
191   config = Nucleon.config(type, Config.ensure(options).import({ :plugin => myself }))
192   config.delete(:plugin)
193   config
194 end
extension(hook, options = {}, &code) click to toggle source
    # File lib/core/plugin/base.rb
184 def extension(hook, options = {}, &code)
185   Nucleon.exec(hook_method(hook), Config.ensure(options).import({ :plugin => myself }), &code)
186 end
extension_check(hook, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
198 def extension_check(hook, options = {})
199   Nucleon.check(hook_method(hook), Config.ensure(options).import({ :plugin => myself }))
200 end
extension_collect(hook, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
210 def extension_collect(hook, options = {})
211   Nucleon.collect(hook_method(hook), Config.ensure(options).import({ :plugin => myself }))
212 end
extension_set(hook, value, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
204 def extension_set(hook, value, options = {})
205   Nucleon.value(hook_method(hook), value, Config.ensure(options).import({ :plugin => myself }))
206 end
hook_method(hook) click to toggle source
    # File lib/core/plugin/base.rb
178 def hook_method(hook)
179   "#{plugin_type}_#{plugin_provider}_#{hook}"
180 end
info(message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
290 def info(message, options = {})
291   config = Config.new(options).import({ :operation => :info })
292 
293   unless quiet?
294     message = render_message(message, config)
295     ui.info(message, config.export)
296   end
297   message
298 end
me()
Alias for: myself
meta() click to toggle source
   # File lib/core/plugin/base.rb
73 def meta
74   return @meta
75 end
method_missing(method, *args, &block) click to toggle source
   # File lib/core/plugin/base.rb
40 def method_missing(method, *args, &block)
41   return nil
42 end
myself() click to toggle source
   # File lib/core/plugin/base.rb
60 def myself
61   @actor
62 end
Also aliased as: me
normalize(reload) click to toggle source
    # File lib/core/plugin/base.rb
171 def normalize(reload)
172   # Implement in sub classes
173 end
parallel_finalize() click to toggle source
   # File lib/core/plugin/base.rb
34 def parallel_finalize
35   remove_plugin
36 end
password(type, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
223 def password(type, options = {})
224   ui.password(type, options)
225 end
plugin_directory() click to toggle source
    # File lib/core/plugin/base.rb
113 def plugin_directory
114   return meta.get(:directory)
115 end
plugin_file() click to toggle source
    # File lib/core/plugin/base.rb
119 def plugin_file
120   return meta.get(:file)
121 end
plugin_instance_name() click to toggle source
    # File lib/core/plugin/base.rb
125 def plugin_instance_name
126   return meta.get(:instance_name)
127 end
plugin_name() click to toggle source
    # File lib/core/plugin/base.rb
103 def plugin_name
104   return meta.get(:name)
105 end
plugin_name=(plugin_name) click to toggle source
    # File lib/core/plugin/base.rb
107 def plugin_name=plugin_name
108   meta.set(:name, string(plugin_name))
109 end
plugin_namespace() click to toggle source
   # File lib/core/plugin/base.rb
85 def plugin_namespace
86   return meta.get(:namespace)
87 end
plugin_parent() click to toggle source
    # File lib/core/plugin/base.rb
135 def plugin_parent
136   return meta.get(:parent)
137 end
plugin_parent=(parent) click to toggle source
    # File lib/core/plugin/base.rb
131 def plugin_parent=parent
132   meta.set(:parent, parent) if parent.is_a?(Nucleon::Plugin::Base)
133 end
plugin_provider() click to toggle source
   # File lib/core/plugin/base.rb
97 def plugin_provider
98   return meta.get(:provider)
99 end
plugin_type() click to toggle source
   # File lib/core/plugin/base.rb
91 def plugin_type
92   return meta.get(:type)
93 end
prefixed_message(type, prefix, message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
338 def prefixed_message(type, prefix, message, options = {})
339   return unless [ :info, :warn, :error, :success ].include?(type.to_sym)
340   send(type, prefix.to_s + render_message(message, Config.new(options).import({ :prefix => false, :operation => type.to_sym }).export), Config.new(options).import({ :i18n => false }).export)
341 end
quiet=(quiet) click to toggle source
   # File lib/core/plugin/base.rb
67 def quiet=quiet
68   @quiet = quiet
69 end
quiet?() click to toggle source
   # File lib/core/plugin/base.rb
53 def quiet?
54   @quiet
55 end
remove_plugin() click to toggle source
   # File lib/core/plugin/base.rb
46 def remove_plugin
47   # Implement in sub classes if needed for cleanup
48 end
render(data, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
275 def render(data, options = {})
276   config = Config.ensure(options)
277 
278   if ! quiet? || config[:silent]
279     translator  = nil
280     translator  = Nucleon.translator({}, config[:format]) if config[:format]
281     data        = translator.generate(data) if translator
282 
283     ui.dump(data, options) unless data.strip.empty? || config[:silent]
284   end
285   data
286 end
safe_exec(return_result = true, &code) click to toggle source
    # File lib/core/plugin/base.rb
421 def safe_exec(return_result = true, &code)
422   begin
423     result = code.call
424     return result if return_result
425     return true
426 
427   rescue => error
428     logger.error(error.inspect)
429     logger.error(error.message)
430 
431     error(error.message, { :prefix => false, :i18n => false }) if error.message
432   end
433   return false
434 end
set_meta(meta) click to toggle source
   # File lib/core/plugin/base.rb
79 def set_meta(meta)
80   @meta = Config.ensure(meta)
81 end
status() click to toggle source
    # File lib/core/plugin/base.rb
164 def status
165   meta.get(:status, code.unknown_status)
166 end
status=(status) click to toggle source
    # File lib/core/plugin/base.rb
160 def status=status
161   meta.set(:status, status)
162 end
success(message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
326 def success(message, options = {})
327   config = Config.new(options).import({ :operation => :success })
328 
329   unless quiet?
330     message = render_message(message, config)
331     ui.success(message, config.export)
332   end
333   message
334 end
translate_reference(reference, editable = false) click to toggle source
    # File lib/core/plugin/base.rb
401 def translate_reference(reference, editable = false)
402   myself.class.translate_reference(reference, editable)
403 end
warn(message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
302 def warn(message, options = {})
303   config = Config.new(options).import({ :operation => :warn })
304 
305   unless quiet?
306     message = render_message(message, config)
307     ui.warn(message, config.export)
308   end
309   message
310 end

Protected Instance Methods

render_message(message, options = {}) click to toggle source
    # File lib/core/plugin/base.rb
248 def render_message(message, options = {})
249   config     = Config.ensure(options)
250   use_prefix = true
251 
252   if config.delete(:i18n, true)
253     Nucleon.namespaces.each do |namespace|
254       if message =~ /^#{namespace.to_s.downcase}\./
255         use_prefix = false
256         break
257       end
258     end
259 
260     if use_prefix
261       plugin_namespace = self.class.namespace if self.class.respond_to?(:namespace)
262       operation_id     = config.has_key?(:operation) ? config[:operation] : ''
263       prefix           = "#{plugin_namespace}.#{plugin_type}.#{render_provider.to_s.gsub('_', '.')}."
264 
265       message = prefix + ( operation_id.empty? ? '' : "#{operation_id}." ) + message.sub(/^#{prefix}/, '')
266     end
267     message = I18n.t(message, Util::Data.merge([ Config.ensure(render_options).export, config.export ], true))
268   end
269   message
270 end
render_options() click to toggle source
    # File lib/core/plugin/base.rb
237 def render_options
238   export.merge({
239     :plugin_namespace => self.class.respond_to?(:namespace) ? self.class.namespace : plugin_namespace,
240     :plugin_type      => plugin_type,
241     :plugin_provider  => render_provider
242   })
243 end
render_provider() click to toggle source
    # File lib/core/plugin/base.rb
230 def render_provider
231   plugin_provider
232 end