lib/carioca/services/output.rb in carioca-2.0.4 vs lib/carioca/services/output.rb in carioca-2.0.5

- old
+ new

@@ -1,189 +1,187 @@ +# frozen_string_literal: false + module Carioca - module Services - module Output - - module FormatsMapping - COLORS = { - :unknown => :red, - :fatal => :red, - :error => :red, - :ko => :yellow, - :warn => :yellow, - :item => :white, - :arrow => :white, - :sending => :white, - :calling => :white, - :scheduling => :white, - :trigger => :white, - :receive => :white, - :info => :cyan, - :ok => :green, - :success => :green, - :debug => :magenta, - :flat => :white - } - - EMOJI = { - :unknown => {:value => "\u{1F4A5}", :alt => '[!!]', :text => "(UNKNOWN)"}, - :fatal => {:value => "\u{26D4}", :alt => '[!!]', :text => "(FATAL)"}, - :error => {:value => "\u{1F6AB}", :alt => '[!]', :text => "(ERROR)"}, - :ko => {:value => "\u{1F44E}", :alt => '[-]', :text => "(KO)"}, - :warn => {:value => "\u{26A0}", :alt => '[/!\]', :text => "(WARNING)"}, - :info => {:value => "\u{2139}", :alt => '[i]', :text => "(INFO)"}, - :item => {:value => " \u{1F539}", :alt => '', :text => " *"}, - :arrow => {:value => " \u{27A1}", :alt => '', :text => " =>"}, - :calling => {:value => "\u{1F4DE}" , :alt => '[C]', :text => "(CALLING)"}, - :scheduling => {:value => "\u{23F2}" , :alt => '[S]', :text => "{SCHEDULING})"}, - :trigger => {:value => "\u{23F0}", :alt => '[T]', :text => "(TRIGGER)"}, - :sending => {:value => "\u{1F4E4}", :alt => '[>]', :text => "(SENDING)"}, - :receive => {:value => "\u{1F4E5}" , :alt => '[<]', :text => "(RECEIVE)"}, - :ok => {:value => "\u{1F44D}" , :alt => '[+]', :text => "(OK)"}, - :success => {:value => "\u{1F4AA}" , :alt => '[+]', :text => "(SUCCESS)"}, - :debug => {:value => "\u{1F41B}" , :alt => '[D]', :text => "(DEBUG)"}, - :flat => {:value => "", :alt => ""} - } - LEVELS = [:debug, :info, :warn, :error, :fatal, :unknown ] - ALIAS = { - :flat => :info, - :item => :info, - :ok => :info, - :ko => :error, - :trigger => :info, - :scheduling => :info, - :arrow => :info, - :sending => :info, - :calling => :info, - :receive => :info, - :success => :info - - } - end - class Provider - include FormatsMapping - - attr_accessor :mode, :emoji, :color - - @@alias = ALIAS.dup - @@colors = COLORS.dup - @@emoji = EMOJI.dup - - MODE = [:mono, :dual] - - LEVELS.each do |method| - define_method(method) do |message, session = '', source = 'Carioca->Output'| - self.display(level: method, message: message, session: session, source: source) - end - end - @@alias.keys.each do |method| - define_method(method) do |message, session = '',source = 'Carioca->Output'| - self.display( level: method, message: message, session: session, source: source) - end - end - - def map_color(color: , analias: ) - raise "Color must be a Symbol" unless color.class == Symbol - raise "Missing alias : #{analias}" unless LEVELS.include? analias - @@alias[analias] = color - end - - def map_emoji(emoji: , analias: ) - raise "Emoji must be a String" unless color.class == String - raise "Missing alias : #{analias}" unless LEVELS.include? analias - @@alias[analias] = emoji - end - - - def add_alias(newalias:, level:) - raise "Alias must be a Symbol" unless newalias.class == Symbol - raise "Bad Level : #{level}" unless LEVELS.include? level - self.class.define_method(newalias) do |message, session = ''| - self.display({ level: newalias, message: message, session: session}) - end - end - - - # constructor - def initialize(level: :debug, mode: :mono , emoji: true, colors: true) - registry = Carioca::Registry.get - @logger = registry.get_service name: :logger - @i18n = registry.get_service name: :i18n - @debug = Carioca::Registry.config.debug? - self.level = level - @mode = mode - @emoji = (check_unicode_term)? emoji : false - @color = colors - set = []; set.push mode; set.push :emoji if @emoji ; set.push :colors if @color - @logger.debug("Carioca->Output") { @i18n.t('output.load.context', confset: set.to_s ) } if @debug - raise "Unknown output mode : #{@mode}" unless MODE.include? @mode - end - - # build a session number - # @return [String] Session number - def get_session - return "#{Time.now.to_i.to_s}#{rand(999)}" - end - - # getter for the current level - # @return [Symbol] level - def level - return @active_levels.first - end - - # virtual setter for level, set the current level - # @raise a badLevel in case of bad level - # @param [Symbol] level - def level=(level) - raise "Bad Level : #{level}" unless LEVELS.include? level - @active_levels = LEVELS.dup - @active_levels.shift(LEVELS.index(level)) - end - - # check if unicode must be used with term ENV - # @return [Boolean] - def check_unicode_term - return false unless ENV.include? "TERM" - if ENV.values_at("LC_ALL","LC_CTYPE","LANG").compact.first.include?("UTF-8") and ENV.values_at('TERM').first.include? "xterm" then - return true - else - return false - end - end + module Services + module Output + module FormatsMapping + COLORS = { + unknown: :red, + fatal: :red, + error: :red, + ko: :yellow, + warn: :yellow, + item: :white, + arrow: :white, + sending: :white, + calling: :white, + scheduling: :white, + trigger: :white, + receive: :white, + info: :cyan, + ok: :green, + success: :green, + debug: :magenta, + flat: :white + }.freeze - - # abstract method for log wrapper - # @param [Hash] params - # @option params [Symbol] :level, a valid level in LEVELS or ALIAS - # @option params [String] :message text - def display(level: , message: , session:, source:) - save = message.dup - target_level = (@@alias.keys.include? level)? @@alias[level] : level - if @active_levels.include? target_level then - if @color then - pastel = ::Pastel.new - message = pastel.send @@colors[level], message - end - if @@emoji.include? level - pattern = (@emoji)? @@emoji[level][:value] : @@emoji[level][:alt] - pattern = "#{pattern} #{@@emoji[level][:text]}" if @@emoji[level].include? :text and !@emoji - message = pattern + " " + message unless pattern.empty? - end - if @mode == :dual - - pattern = @@emoji[level][:alt] - unless LEVELS.include? level - save = "#{@@emoji[level][:text]} #{save}" if @@emoji[level].include? :text - end - block = Proc::new {save} - @logger.send target_level, source, &block - end - puts message - end - end - + EMOJI = { + unknown: { value: "\u{1F4A5}", alt: '[!!]', text: '(UNKNOWN)' }, + fatal: { value: "\u{26D4}", alt: '[!!]', text: '(FATAL)' }, + error: { value: "\u{1F6AB}", alt: '[!]', text: '(ERROR)' }, + ko: { value: "\u{1F44E}", alt: '[-]', text: '(KO)' }, + warn: { value: "\u{26A0}", alt: '[/!\]', text: '(WARNING)' }, + info: { value: "\u{2139}", alt: '[i]', text: '(INFO)' }, + item: { value: " \u{1F539}", alt: '', text: ' *' }, + arrow: { value: " \u{27A1}", alt: '', text: ' =>' }, + calling: { value: "\u{1F4DE}", alt: '[C]', text: '(CALLING)' }, + scheduling: { value: "\u{23F2}", alt: '[S]', text: '{SCHEDULING})' }, + trigger: { value: "\u{23F0}", alt: '[T]', text: '(TRIGGER)' }, + sending: { value: "\u{1F4E4}", alt: '[>]', text: '(SENDING)' }, + receive: { value: "\u{1F4E5}", alt: '[<]', text: '(RECEIVE)' }, + ok: { value: "\u{1F44D}", alt: '[+]', text: '(OK)' }, + success: { value: "\u{1F4AA}", alt: '[+]', text: '(SUCCESS)' }, + debug: { value: "\u{1F41B}", alt: '[D]', text: '(DEBUG)' }, + flat: { value: '', alt: '' } + }.freeze + LEVELS = %i[debug info warn error fatal unknown].freeze + ALIAS = { + flat: :info, + item: :info, + ok: :info, + ko: :error, + trigger: :info, + scheduling: :info, + arrow: :info, + sending: :info, + calling: :info, + receive: :info, + success: :info + + }.freeze + end + + class Provider + include FormatsMapping + + attr_accessor :mode, :emoji, :color + + @@alias = ALIAS.dup + @@colors = COLORS.dup + @@emoji = EMOJI.dup + + MODE = %i[mono dual].freeze + + LEVELS.each do |method| + define_method(method) do |message, session = '', source = 'Carioca->Output'| + display(level: method, message: message, session: session, source: source) + end + end + @@alias.each_key do |method| + define_method(method) do |message, session = '', source = 'Carioca->Output'| + display(level: method, message: message, session: session, source: source) + end + end + + def map_color(color:, analias:) + raise 'Color must be a Symbol' unless color.instance_of?(Symbol) + raise "Missing alias : #{analias}" unless LEVELS.include? analias + + @@alias[analias] = color + end + + def map_emoji(emoji:, analias:) + raise 'Emoji must be a String' unless color.instance_of?(String) + raise "Missing alias : #{analias}" unless LEVELS.include? analias + + @@alias[analias] = emoji + end + + def add_alias(newalias:, level:) + raise 'Alias must be a Symbol' unless newalias.instance_of?(Symbol) + raise "Bad Level : #{level}" unless LEVELS.include? level + + self.class.define_method(newalias) do |message, session = ''| + display({ level: newalias, message: message, session: session }) + end + end + + # constructor + def initialize(level: :debug, mode: :mono, emoji: true, colors: true) + registry = Carioca::Registry.get + @logger = registry.get_service name: :logger + @i18n = registry.get_service name: :i18n + @debug = Carioca::Registry.config.debug? + self.level = level + @mode = mode + @emoji = check_unicode_term ? emoji : false + @color = colors + set = [] + set.push mode + set.push :emoji if @emoji + set.push :colors if @color + @logger.debug('Carioca->Output') { @i18n.t('output.load.context', confset: set.to_s) } if @debug + raise "Unknown output mode : #{@mode}" unless MODE.include? @mode + end + + # build a session number + # @return [String] Session number + def generate_session + "#{Time.now.to_i}#{rand(999)}" + end + + # getter for the current level + # @return [Symbol] level + def level + @active_levels.first + end + + # virtual setter for level, set the current level + # @raise a badLevel in case of bad level + # @param [Symbol] level + def level=(level) + raise "Bad Level : #{level}" unless LEVELS.include? level + + @active_levels = LEVELS.dup + @active_levels.shift(LEVELS.index(level)) + end + + # check if unicode must be used with term ENV + # @return [Boolean] + def check_unicode_term + return false unless ENV.include? 'TERM' + + ENV.values_at('LC_ALL', 'LC_CTYPE', + 'LANG').compact.first.include?('UTF-8') && ENV.values_at('TERM').first.include?('xterm') + end + + # abstract method for log wrapper + # @param [Hash] params + # @option params [Symbol] :level, a valid level in LEVELS or ALIAS + # @option params [String] :message text + # @option params [String] :session an id/timestamp of session + def display(level:, message:, session:, source:) + message << "(#{session})" if session + save = message.dup + target_level = @@alias.keys.include?(level) ? @@alias[level] : level + if @active_levels.include? target_level + if @color + pastel = ::Pastel.new + message = pastel.send @@colors[level], message end - - + if @@emoji.include? level + pattern = @emoji ? @@emoji[level][:value] : @@emoji[level][:alt] + pattern = "#{pattern} #{@@emoji[level][:text]}" if @@emoji[level].include?(:text) && !@emoji + message = "#{pattern} #{message}" unless pattern.empty? + end + if @mode == :dual + save = "#{@@emoji[level][:text]} #{save}" if !LEVELS.include?(level) && (@@emoji[level].include? :text) + block = proc { save } + @logger.send target_level, source, &block + end + puts message + end end + end end + end end -