class TerraformLandscape::Printer
def process_string(plan_output) # rubocop:disable Metrics/MethodLength
def process_string(plan_output) # rubocop:disable Metrics/MethodLength scrubbed_output = strip_ansi(plan_output) # Remove initialization messages like # "- Downloading plugin for provider "aws" (1.1.0)..." # as these break the parser which thinks "-" is a resource deletion scrubbed_output.gsub!(/^- .*\.\.\.$/, '') # Remove separation lines that appear after refreshing state scrubbed_output.gsub!(/^-+$/, '') # Remove preface if (match = scrubbed_output.match(/^Path:[^\n]+/)) scrubbed_output = scrubbed_output[match.end(0)..-1] elsif (match = scrubbed_output.match(/^Terraform.+following\sactions:/)) scrubbed_output = scrubbed_output[match.end(0)..-1] elsif (match = scrubbed_output.match(/^\s*(~|\+|\-)/)) scrubbed_output = scrubbed_output[match.begin(0)..-1] elsif scrubbed_output =~ /^(No changes|This plan does nothing)/ @output.puts 'No changes' return else raise ParseError, 'Output does not contain proper preface' end # Remove postface if (match = scrubbed_output.match(/^Plan:[^\n]+/)) plan_summary = scrubbed_output[match.begin(0)..match.end(0)] scrubbed_output = scrubbed_output[0...match.begin(0)] end plan = TerraformPlan.from_output(scrubbed_output) plan.display(@output) @output.puts plan_summary end