lib/core/core.rb in nucleon-0.2.2 vs lib/core/core.rb in nucleon-0.2.3

- old
+ new

@@ -1,99 +1,261 @@ - module Nucleon +# +# == Core Nucleon object +# +# The Nucleon::Core class defines a minimal base class for creating other +# capable objects, combining configurations, console capabilities, and logging +# capabilities. +# +# All of the plugins build off of the Core object, as do some utility classes. +# +# Five main goals with this object: +# +# 1. Global and instance Nucleon::Util::Logger interfaces +# 2. Global and instance Nucleon::Util::Console interfaces +# 3. Include color methods +# 4. Provide contextually prefixed UI groups for console output operations +# 5. Provide an initialized lookup +# class Core < Config - + + # + # Provide colored text rendering methods + # + # See: + # - Nucleon::Mixin::Colors + # - Nucleon::Util::Console + # include Mixin::Colors - - #----------------------------------------------------------------------------- + + #***************************************************************************** # Properties - - @@logger = Util::Logger.new('core') - @@ui = Util::Console.new('core') + + # + # Global logger instance + # + # See: + # - Nucleon::Util::Logger + # + @@logger = Util::Logger.new('core') + # + # Global console instance + # + # See: + # - Nucleon::Util::Console + # + @@ui = Util::Console.new('core') + # + # Global UI Mutex + # + # TODO: This may not be needed? + # @@ui_lock = Mutex.new - - #----------------------------------------------------------------------------- + + #***************************************************************************** # Constructor / Destructor - + + # Initialize a new core Nucleon object + # + # TODO: Figure out some way to make the console and logging systems pluggable? + # + # * *Parameters* + # - [nil, Hash, Nucleon::Config] *data* Configurations to import + # - [Hash] *defaults* Configuration defaults that may be overridden by config data + # - [Boolean] *force* Whether or not to force override of values where types don't match during merge + # - [Boolean] *set_initialized* Whether or not to the initialized flag is set after this object is constructed + # - [Boolean] *basic_merge* Whether or not to perform a basic merge or deep (recursive) merge + # + # * *Returns* + # - [Void] This method does not return a value + # + # * *Errors* + # + # See also: + # - Nucleon::Config::new + # - Nucleon::Config#delete + # - Nucleon::Config#export + # - Nucleon::Config#defaults + # - Nucleon::Util::Data::ensure_value + # - Nucleon::Util::Console::colorize + # def initialize(data = {}, defaults = {}, force = true, set_initialized = true, basic_merge = true) - super(data, defaults, force, basic_merge) - + super(data, defaults, force, basic_merge) + + @initialized = false @class_color = Util::Data.ensure_value(delete(:class_color, :cyan), :cyan) @class_label = self.class.to_s.downcase.gsub(/^nucleon::/, '') - + self.logger = delete(:logger, @class_label) self.ui = Config.new(export).defaults({ :resource => Util::Console.colorize(@class_label, @class_color) }) - + logger.debug('Initialized instance logger and interface') @initialized = true if set_initialized end - - #----------------------------------------------------------------------------- + + #***************************************************************************** # Checks - + + # Check if object is initialized? + # + # The initialized flag must be set from a method within the class. It can not + # be set externally. + # + # * *Parameters* + # + # * *Returns* + # - [Boolean] Whether or not object has been marked as initialized + # + # * *Errors* + # def initialized? @initialized end - - #----------------------------------------------------------------------------- + + #***************************************************************************** # Accessor / Modifiers - - attr_reader :logger, :ui - - #--- - + + # + # [Nucleon::Util::Logger] Instance logger + # + attr_reader :logger + # + # [Nucleon::Util::Console] Instance console + # + attr_reader :ui + + # Return global logger instance + # + # * *Parameters* + # + # * *Returns* + # - [Nucleon::Util::Logger] Global logger instance + # + # * *Errors* + # def self.logger return @@logger end - + + # Set current object logger instance + # + # * *Parameters* + # - [String, Nucleon::Util::Logger] *logger* Logger instance or resource name for new logger + # + # * *Returns* + # - [Void] This method does not return a value + # + # * *Errors* + # + # See also: + # - Nucleon::Util::Logger::loggers + # - Nucleon::Util::Logger::new + # def logger=logger Util::Logger.loggers.delete(self.logger.resource) if self.logger - + if logger.is_a?(Util::Logger) @logger = logger else @logger = Util::Logger.new(logger) end end - - #--- - + + # Return global console instance + # + # This is named ui for historical reasons. It might change to console in the + # future. + # + # * *Parameters* + # + # * *Returns* + # - [Nucleon::Util::Console] Global console instance + # + # * *Errors* + # def self.ui return @@ui end - + + # Set current object console instance + # + # * *Parameters* + # - [String, Nucleon::Util::Console] *ui* Console instance or resource name for new console + # + # * *Returns* + # - [Void] This method does not return a value + # + # * *Errors* + # + # See also: + # - Nucleon::Util::Console::new + # def ui=ui if ui.is_a?(Util::Console) @ui = ui else @ui = Util::Console.new(ui) - end + end end - - #----------------------------------------------------------------------------- + + #***************************************************************************** # General utilities - - def self.ui_group(resource, color = :cyan) + + # Contextualize console operations in a code block with a given resource name. + # + # TODO: May not need Mutex synchronization? + # + # * *Parameters* + # - [String, Symbol] *resource* Console resource identifier (prefix) + # - [Symbol] *color* Color to use; *:black*, *:red*, *:green*, *:yellow*, *:blue*, *:purple*, *:cyan*, *:grey* + # + # * *Returns* + # - [Void] This method does not return a value + # + # * *Errors* + # + # * *Yields* + # - [Nucleon::Util::Console] *ui* Current global console instance + # + # See also: + # - Nucleon::Util::Console::colorize + # + def self.ui_group(resource, color = :cyan) # :yields: ui @@ui_lock.synchronize do begin ui_resource = ui.resource ui.resource = Util::Console.colorize(resource, color) yield(ui) - + ensure ui.resource = ui_resource end - end - end - - #--- - - def ui_group(resource, color = :cyan) + end + end + + # Contextualize console operations in a code block with a given resource name. + # + # * *Parameters* + # - [String, Symbol] *resource* Console resource identifier (prefix) + # - [Symbol] *color* Color to use; *:black*, *:red*, *:green*, *:yellow*, *:blue*, *:purple*, *:cyan*, *:grey* + # + # * *Returns* + # - [Void] This method does not return a value + # + # * *Errors* + # + # * *Yields* + # - [Nucleon::Util::Console] *ui* Current object console instance + # + # See also: + # - Nucleon::Util::Console::colorize + # + def ui_group(resource, color = :cyan) # :yields: ui ui_resource = ui.resource ui.resource = Util::Console.colorize(resource, color) yield(ui) - + ensure - ui.resource = ui_resource - end + ui.resource = ui_resource + end end end \ No newline at end of file