lib/cucumberator/commands/save.rb
module Cucumberator::Commands
class Save
class << self
def perform(scenario, step_line, last_input, saved_stack, *args, &block)
new(scenario, step_line, last_input, saved_stack).save
false
end
def save_empty_line(scenario, step_line, saved_stack)
new(scenario, step_line, "", saved_stack).force_save_empty_line
false
end
end
attr_accessor :step_line, :saved_stack
def initialize(scenario, step_line, last_input, saved_stack)
@step_line, @last_input, @saved_stack = step_line, last_input, saved_stack
@feature_file = Cucumberator::FeatureFile.new(scenario)
@scenario_line = scenario.line - 1
end
def save
if @last_input.to_s.empty?
puts "Hm... nothing to save yet?"
else
string_to_save = (" " * spaces_in_last_input) + @last_input
save_to_feature_file(string_to_save)
puts "Saved `#{@last_input}` to #{@feature_file}"
@last_input = nil
end
end
def force_save_empty_line
save_to_feature_file("")
@last_input = nil
end
def save_to_feature_file(line)
if step_line
insert_line_to_feature_file(line)
else
append_line_to_feature_file(line)
end
end
def insert_line_to_feature_file(line)
lines = @feature_file.lines
lines.insert(step_line - 1, line.to_s+$/) # $/ - default newline separator
@feature_file.overwrite(lines.join)
self.saved_stack << [step_line.number, line]
self.step_line.increment!
end
def append_line_to_feature_file(line)
@feature_file.append(line)
self.saved_stack << [@feature_file.lines.size, line]
end
def spaces_in_last_input
return scenario_child_spacing unless step_line
line = detect_last_line(@feature_file.lines)
spaces = line.to_s =~ /\S/
spaces.to_i
end
def parent_scenario_spacing
@parent_depth ||= @feature_file.lines[@scenario_line] =~ /\S/
end
def scenario_child_spacing
@child_depth ||= parent_scenario_spacing + 2
end
def detect_last_line(lines)
if step_line
line = lines[step_line-1]
lines = lines.slice(0, step_line-1) if line.to_s.empty?
end
if line.to_s.empty?
line = lines.reverse.detect { |l| !l.to_s.empty? }
end
line
end
end
end