require'cucumber/formatter/console'require'fileutils'moduleCucumbermoduleFormatter# The formatter used for <tt>--format pretty</tt> (the default formatter).## This formatter prints features to plain text - exactly how they were parsed,# just prettier. That means with proper indentation and alignment of table columns.## If the output is STDOUT (and not a file), there are bright colours to watch too.#classPretty<Ast::VisitorincludeFileUtilsincludeConsoleattr_writer:indentdefinitialize(step_mother,io,options)super(step_mother)@io=io@options=options@exceptions=[]@indent=0@prefixes=options[:prefixes]||{}enddefvisit_features(features)superprint_summary(features)unless@options[:autoformat]enddefvisit_feature(feature)@exceptions=[]@indent=0if@options[:autoformat]file=File.join(@options[:autoformat],feature.file)dir=File.dirname(file)mkdir_p(dir)unlessFile.directory?(dir)File.open(file,Cucumber.file_mode('w'))do|io|@io=iosuperendelsesuperendenddefvisit_comment(comment)comment.accept(self)enddefvisit_comment_line(comment_line)@io.puts(comment_line.indent(@indent))@io.flushenddefvisit_tags(tags)tags.accept(self)if@indent==1@io.puts@io.flushendenddefvisit_tag_name(tag_name)tag=format_string("@#{tag_name}",:tag).indent(@indent)@io.print(tag)@io.flush@indent=1enddefvisit_feature_name(name)@io.puts(name)@io.puts@io.flushenddefvisit_feature_element(feature_element)record_tag_occurrences(feature_element,@options)@indent=2@scenario_indent=2super@io.puts@io.flushenddefvisit_background(background)@indent=2@scenario_indent=2@in_background=truesuper@in_background=nil@io.puts@io.flushenddefvisit_background_name(keyword,name,file_colon_line,source_indent)visit_feature_element_name(keyword,name,file_colon_line,source_indent)enddefvisit_examples_array(examples_array)@indent=4@io.putsexamples_array[0..-2].each{|ea|super(ea)}@last_example=truesuper(examples_array.last)@last_example=nilenddefvisit_examples_name(keyword,name)names=name.strip.empty??[name.strip]:name.split("\n")@io.puts(" #{keyword}#{names[0]}")names[1..-1].each{|s|@io.puts" #{s}"}unlessnames.empty?@io.flush@indent=6@scenario_indent=6enddefvisit_outline_table(outline_table)super@indent=4@io.putsunless@last_exampleenddefvisit_scenario_name(keyword,name,file_colon_line,source_indent)visit_feature_element_name(keyword,name,file_colon_line,source_indent)enddefvisit_feature_element_name(keyword,name,file_colon_line,source_indent)@io.putsif@scenario_indent==6names=name.empty??[name]:name.split("\n")line="#{keyword}#{names[0]}".indent(@scenario_indent)@io.print(line)if@options[:source]line_comment=" # #{file_colon_line}".indent(source_indent)@io.print(format_string(line_comment,:comment))end@io.putsnames[1..-1].each{|s|@io.puts" #{s}"}@io.flushenddefvisit_step(step)@indent=6superenddefvisit_step_result(keyword,step_match,multiline_arg,status,exception,source_indent,background)ifexceptionreturnif@exceptions.index(exception)@exceptions<<exceptionendreturnifstatus!=:failed&&@in_background^background@status=statussuperenddefvisit_step_name(keyword,step_match,status,source_indent,background)source_indent=nilunless@options[:source]formatted_step_name=format_step(keyword,step_match,status,source_indent)@io.puts(formatted_step_name.indent(@scenario_indent+2))enddefvisit_multiline_arg(multiline_arg)returnif@options[:no_multiline]@table=multiline_argsuperenddefvisit_exception(exception,status)print_exception(exception,status,@indent)@io.flushenddefvisit_table_row(table_row)@col_index=0@io.print' |'.indent(@indent-2)super@io.putsiftable_row.exception&&!@exceptions.index(table_row.exception)print_exception(table_row.exception,:failed,@indent)endenddefvisit_py_string(string)s=%{"""\n#{string}\n"""}.indent(@indent)s=s.split("\n").map{|l|l=~/^\s+$/?'':l}.join("\n")@io.puts(format_string(s,@status))@io.flushenddefvisit_table_cell(cell)super@col_index+=1enddefvisit_table_cell_value(value,status)status||=@status||:passedwidth=@table.col_width(@col_index)cell_text=value.to_s||''padded=cell_text+(' '*(width-cell_text.jlength))prefix=cell_prefix(status)@io.print(' '+format_string("#{prefix}#{padded}",status)+::Term::ANSIColor.reset(" |"))@io.flushendprivatedefcell_prefix(status)@prefixes[status]enddefprint_summary(features)print_stats(features)print_snippets(@options)print_passing_wip(@options)print_tag_limit_warnings(@options)endendendend