lib/bauxite/core/logger.rb in bauxite-0.6.18 vs lib/bauxite/core/logger.rb in bauxite-0.6.19

- old
+ new

@@ -1,170 +1,170 @@ -#-- -# Copyright (c) 2014 Patricio Zavolinsky -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -#++ - -module Bauxite - # Test loggers module - # - # The default Logger class and all custom loggers must be included in this - # module. - # - module Loggers - # Test logger class. - # - # Test loggers handle test output format. - # - # The default logger does not provide any output logging. - # - # This default behavior can be overriden in a custom logger passed to the - # Context constructor (see Context::new). By convention, custom loggers are - # defined in the 'loggers/' directory. - # - class NullLogger - - # Constructs a new null logger instance. - # - def initialize(options) - @options = options - end - - # Executes the given block in a logging context. - # - # This default implementation does not provide any logging - # capabilities. - # - # For example: - # log.log_cmd('echo', 'Hello World!') do - # puts 'Hello World!' - # end - # # => echoes 'Hello World!' - # - def log_cmd(action) - yield - end - - # Returns the prompt shown by the debug console (see Context#debug). - # - # For example: - # log.debug_prompt - # # => returns the debug prompt - def debug_prompt - 'debug> ' - end - - # Updates the progress of the current action. - def progress(value) - end - - # Logs the specified string. - # - # +type+, if specified, should be one of +:error+, +:warning+, - # +:info+ (default), +:debug+. - # - def log(s, type = :info) - print s - end - - # Completes the log execution. - # - def finalize(ctx) - end - end - - # Report logger. - # - # This base logger class can be inherited to create reporting loggers. - # - # Descendent classes must override the #finalize method and iterate the - # <tt>@data</tt> array to produce the report. - # - # The items included in the <tt>@data</tt> array contain the - # following fields: - # [:name] - # Name of the current test. - # [:actions] - # Array of actions with the following fields - # - +:cmd+: name of the action. - # - +:args+: action arguments. - # - +:action+: action object. - # - +:status+: action execution status: +:ok+, +:skip+ or +:error+. - # - +:capture+: path to the current capture, if any. - # - # For an example of a ReportLogger implementation see the HtmlLogger - # class. - # - class ReportLogger < NullLogger - # Constructs a new report logger instance. - # - def initialize(options) - super(options) - @data = [] - end - - # Logs the specified string. - # - # +type+, if specified, should be one of +:error+, +:warning+, - # +:info+ (default), +:debug+. - # - def log(s, type = :info) - end - - # Echoes the raw action text. - def log_cmd(action) - stime = Time.new - ret = yield || false - etime = Time.new - ensure - etime ||= Time.new - status = case ret; when nil; :error; when false; :skip; else :ok; end - - test_name = action.ctx.variables['__TEST__'] || 'Main' - test = @data.find { |t| t[:name] == test_name } - unless test - test = { :name => test_name, :actions => [] } - @data << test - end - - capture = action.ctx.variables['__CAPTURE__'] - if capture == @last_capture - capture = nil - else - @last_capture = capture - end - - test[:actions] << { - :cmd => action.cmd, - :args => action.args(true), - :action => action, - :status => status, - :time => (etime - stime), - :capture => capture - } - - ret - end - - # Completes the log execution. - # - def finalize(ctx) - end - end - end +#-- +# Copyright (c) 2014 Patricio Zavolinsky +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +#++ + +module Bauxite + # Test loggers module + # + # The default Logger class and all custom loggers must be included in this + # module. + # + module Loggers + # Test logger class. + # + # Test loggers handle test output format. + # + # The default logger does not provide any output logging. + # + # This default behavior can be overriden in a custom logger passed to the + # Context constructor (see Context::new). By convention, custom loggers are + # defined in the 'loggers/' directory. + # + class NullLogger + + # Constructs a new null logger instance. + # + def initialize(options) + @options = options + end + + # Executes the given block in a logging context. + # + # This default implementation does not provide any logging + # capabilities. + # + # For example: + # log.log_cmd('echo', 'Hello World!') do + # puts 'Hello World!' + # end + # # => echoes 'Hello World!' + # + def log_cmd(action) + yield + end + + # Returns the prompt shown by the debug console (see Context#debug). + # + # For example: + # log.debug_prompt + # # => returns the debug prompt + def debug_prompt + 'debug> ' + end + + # Updates the progress of the current action. + def progress(value) + end + + # Logs the specified string. + # + # +type+, if specified, should be one of +:error+, +:warning+, + # +:info+ (default), +:debug+. + # + def log(s, type = :info) + print s + end + + # Completes the log execution. + # + def finalize(ctx) + end + end + + # Report logger. + # + # This base logger class can be inherited to create reporting loggers. + # + # Descendent classes must override the #finalize method and iterate the + # <tt>@data</tt> array to produce the report. + # + # The items included in the <tt>@data</tt> array contain the + # following fields: + # [:name] + # Name of the current test. + # [:actions] + # Array of actions with the following fields + # - +:cmd+: name of the action. + # - +:args+: action arguments. + # - +:action+: action object. + # - +:status+: action execution status: +:ok+, +:skip+ or +:error+. + # - +:capture+: path to the current capture, if any. + # + # For an example of a ReportLogger implementation see the HtmlLogger + # class. + # + class ReportLogger < NullLogger + # Constructs a new report logger instance. + # + def initialize(options) + super(options) + @data = [] + end + + # Logs the specified string. + # + # +type+, if specified, should be one of +:error+, +:warning+, + # +:info+ (default), +:debug+. + # + def log(s, type = :info) + end + + # Echoes the raw action text. + def log_cmd(action) + stime = Time.new + ret = yield || false + etime = Time.new + ensure + etime ||= Time.new + status = case ret; when nil; :error; when false; :skip; else :ok; end + + test_name = action.ctx.variables['__TEST__'] || 'Main' + test = @data.find { |t| t[:name] == test_name } + unless test + test = { :name => test_name, :actions => [] } + @data << test + end + + capture = action.ctx.variables['__CAPTURE__'] + if capture == @last_capture + capture = nil + else + @last_capture = capture + end + + test[:actions] << { + :cmd => action.cmd, + :args => action.args(true), + :action => action, + :status => status, + :time => (etime - stime), + :capture => capture + } + + ret + end + + # Completes the log execution. + # + def finalize(ctx) + end + end + end end \ No newline at end of file