lib/cucumber/formatter/json.rb in cucumber-0.8.5 vs lib/cucumber/formatter/json.rb in cucumber-0.8.6
- old
+ new
@@ -1,166 +1,29 @@
-require "json"
-require "cucumber/formatter/io"
+require 'cucumber/formatter/gherkin_formatter_adapter'
+require 'cucumber/formatter/io'
+require 'gherkin/formatter/argument'
+require 'gherkin/formatter/json_formatter'
module Cucumber
module Formatter
# The formatter used for <tt>--format json</tt>
- class Json
- class Error < StandardError
- end
-
+ class Json < GherkinFormatterAdapter
include Io
def initialize(step_mother, io, options)
- @io = ensure_io(io, "json")
- @options = options
+ @io = ensure_io(io, "json")
+ @obj = {'features' => []}
+ super(Gherkin::Formatter::JSONFormatter.new(nil), false)
end
- def before_features(features)
- @json = {:features => []}
+ def after_feature(feature)
+ super
+ @obj['features'] << @gf.gherkin_object
end
- def before_feature(feature)
- @current_object = {:file => feature.file, :name => feature.name}
- @json[:features] << @current_object
- end
-
- def before_tags(tags)
- @current_object[:tags] = tags.tag_names.to_a
- end
-
- def before_background(background)
- background = {}
- @current_object[:background] = background
- @current_object = background
- end
-
- def after_background(background)
- @current_object = last_feature
- end
-
- def before_feature_element(feature_element)
- elements = @current_object[:elements] ||= []
-
- # change current object to the feature_element
- @current_object = {}
- elements << @current_object
- end
-
- def scenario_name(keyword, name, file_colon_line, source_indent)
- @current_object[:keyword] = keyword
- @current_object[:name] = name
- @current_object[:file_colon_line] = file_colon_line
- end
-
- def before_steps(steps)
- @current_object[:steps] = []
- end
-
- def before_step(step)
- @current_step = {}
- @current_object[:steps] << @current_step
- end
-
- def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
- if exception
- @current_step[:exception] = exception_hash_for(exception)
- end
- end
-
- def step_name(keyword, step_match, status, source_indent, background)
- @current_step[:status] = status
- @current_step[:keyword] = keyword
- @current_step[:name] = "#{step_match.name || step_match.format_args}"
- @current_step[:file_colon_line] = step_match.file_colon_line
- end
-
- def after_step(step)
- @current_step = nil
- end
-
- def before_examples(examples)
- @current_object[:examples] = {}
- end
-
- def examples_name(keyword, name)
- @current_object[:examples][:name] = "#{keyword} #{name}"
- end
-
- def before_outline_table(*args)
- @current_object[:examples][:table] = []
- end
-
- def before_table_row(row)
- @current_row = {:cells => []}
-
- if @current_object.member? :examples
- @current_object[:examples][:table] << @current_row
- elsif @current_step
- (@current_step[:table] ||= []) << @current_row
- else
- internal_error
- end
- end
-
- def table_cell_value(value, status)
- @current_row[:cells] << {:text => value, :status => status}
- end
-
- def after_table_row(row)
- if row.exception
- @current_row[:exception] = exception_hash_for(row.exception)
- end
- @current_row = nil
- end
-
- def py_string(string)
- @current_step[:py_string] = string
- end
-
- def after_feature_element(feature_element)
- # change current object back to the last feature
- @current_object = last_feature
- end
-
def after_features(features)
- @io.write json_string
- @io.flush
+ @io.write(@obj.to_json)
end
-
- def embed(file, mime_type)
- obj = @current_step || @current_object
- obj[:embedded] ||= []
-
- obj[:embedded] << {
- :file => file,
- :mime_type => mime_type,
- :data => [File.read(file)].pack("m*") # base64
- }
- end
-
- private
-
- def json_string
- @json.to_json
- end
-
- def last_feature
- @json[:features].last
- end
-
- def exception_hash_for(e)
- {
- :class => e.class.name,
- :message => e.message,
- :backtrace => e.backtrace
- }
- end
-
- def internal_error
- raise Error, "you've found a bug in the JSON formatter!"
- end
-
- end # Json
- end # Formatter
-end # Cucumber
+ end
+ end
+end