Class: TerraformLandscape::Printer

Inherits:
Object
  • Object
show all
Defined in:
lib/terraform_landscape/printer.rb

Overview

Takes output from Terraform executable nad outputs it in a prettified format.

Instance Method Summary collapse

Constructor Details

#initialize(output) ⇒ Printer

Returns a new instance of Printer.



7
8
9
# File 'lib/terraform_landscape/printer.rb', line 7

def initialize(output)
  @output = output
end

Instance Method Details

#process_stream(io) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/terraform_landscape/printer.rb', line 11

def process_stream(io)
  buffer = StringIO.new
  begin
    block_size = 1024

    done = false
    until done
      readable_fds, = IO.select([io])
      next unless readable_fds

      readable_fds.each do |f|
        begin
          buffer << f.read_nonblock(block_size)
        rescue IO::WaitReadable # rubocop:disable Lint/HandleExceptions
          # Ignore; we'll call IO.select again
        rescue EOFError
          done = true
        end
      end
    end
  ensure
    io.close
  end

  process_string(buffer.string)
end

#process_string(plan_output) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/terraform_landscape/printer.rb', line 38

def process_string(plan_output)
  scrubbed_output = plan_output.gsub(/\e\[\d+m/, '')

  # 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