mux_tf 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -40,13 +40,14 @@ module MuxTf
40
40
  stream_or_run_terraform(cmd, &block)
41
41
  end
42
42
 
43
- def tf_plan(out:, color: true, detailed_exitcode: nil, compact_warnings: false, input: nil, targets: [], &block)
43
+ def tf_plan(out:, color: true, detailed_exitcode: nil, compact_warnings: false, input: nil, targets: [], json: false, &block) # rubocop:disable Metrics/CyclomaticComplexity
44
44
  args = []
45
45
  args += ["-out", out]
46
46
  args << "-input=#{input.inspect}" unless input.nil?
47
47
  args << "-compact-warnings" if compact_warnings
48
48
  args << "-no-color" unless color
49
49
  args << "-detailed-exitcode" if detailed_exitcode
50
+ args << "-json" if json
50
51
  if targets && !targets.empty?
51
52
  targets.each do |target|
52
53
  args << "-target=#{target}"
@@ -54,10 +55,10 @@ module MuxTf
54
55
  end
55
56
 
56
57
  cmd = tf_prepare_command(["plan", *args], need_auth: true)
57
- stream_or_run_terraform(cmd, &block)
58
+ stream_or_run_terraform(cmd, split_streams: json, &block)
58
59
  end
59
60
 
60
- def tf_show(file, json: false)
61
+ def tf_show(file, json: false, capture: false)
61
62
  if json
62
63
  args = ["show", "-json", file]
63
64
  cmd = tf_prepare_command(args, need_auth: true)
@@ -65,7 +66,11 @@ module MuxTf
65
66
  else
66
67
  args = ["show", file]
67
68
  cmd = tf_prepare_command(args, need_auth: true)
68
- run_terraform(cmd)
69
+ if capture
70
+ capture_terraform(cmd)
71
+ else
72
+ run_terraform(cmd)
73
+ end
69
74
  end
70
75
  end
71
76
 
@@ -84,9 +89,9 @@ module MuxTf
84
89
  end
85
90
  end
86
91
 
87
- def stream_or_run_terraform(args, &block)
92
+ def stream_or_run_terraform(args, split_streams: false, &block)
88
93
  if block
89
- stream_terraform(args, &block)
94
+ stream_terraform(args, split_streams: split_streams, &block)
90
95
  else
91
96
  run_terraform(args)
92
97
  end
@@ -101,8 +106,43 @@ module MuxTf
101
106
  })
102
107
  end
103
108
 
104
- def stream_terraform(args, &block)
105
- status = run_with_each_line(args, &block)
109
+ def run_with_each_line_ex(command)
110
+ output_queue = Thread::Queue.new
111
+ output_queue << [:command, JSON.dump(command)]
112
+ command = join_cmd(command)
113
+ Open3.popen3(command) do |_stdin, stdout, stderr, wait_thr|
114
+ stdout_thread = Thread.new do
115
+ until stdout.eof?
116
+ raw_line = stdout.gets
117
+ output_queue << [:stdout, raw_line]
118
+ end
119
+ rescue IOError
120
+ # ignore
121
+ end
122
+ stderr_thread = Thread.new do
123
+ until stderr.eof?
124
+ raw_line = stderr.gets
125
+ output_queue << [:stderr, raw_line]
126
+ end
127
+ rescue IOError
128
+ # ignore
129
+ end
130
+ Thread.new do
131
+ stdout_thread.join
132
+ stderr_thread.join
133
+ output_queue.close
134
+ end
135
+ yield(output_queue.pop) until output_queue.closed?
136
+ wait_thr.value # Process::Status object returned.
137
+ end
138
+ end
139
+
140
+ def stream_terraform(args, split_streams: false, &block)
141
+ status = if split_streams
142
+ run_with_each_line_ex(args, &block)
143
+ else
144
+ run_with_each_line(args, &block)
145
+ end
106
146
  # status is a Process::Status
107
147
  ResultStruct.new({
108
148
  status: status.exitstatus,
@@ -121,7 +161,9 @@ module MuxTf
121
161
  parsed_output: parsed_output
122
162
  })
123
163
  rescue JSON::ParserError
124
- fail_with "Execution Failed! - #{result.inspect}"
164
+ message = "Execution failed with exit code: #{result.status}"
165
+ message += "\nOutput:\n#{result.output}" if result.output != ""
166
+ fail_with message
125
167
  end
126
168
  end
127
169
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MuxTf
4
- VERSION = "0.13.0"
4
+ VERSION = "0.14.0"
5
5
  end
data/lib/mux_tf.rb CHANGED
@@ -20,17 +20,25 @@ require "pastel"
20
20
  require "tty-prompt"
21
21
  require "tty-table"
22
22
  require "dotenv"
23
+ require "hashdiff"
24
+ require "awesome_print"
25
+ require "diff/lcs"
26
+ require "diff/lcs/string"
27
+ require "diff/lcs/hunk"
23
28
 
24
- require_relative "./mux_tf/version"
25
- require_relative "./mux_tf/plan_filename_generator"
26
- require_relative "./mux_tf/resource_tokenizer"
27
- require_relative "./mux_tf/cli"
28
- require_relative "./mux_tf/tmux"
29
- require_relative "./mux_tf/terraform_helpers"
30
- require_relative "./mux_tf/plan_formatter"
31
- require_relative "./mux_tf/version_check"
32
- require_relative "./mux_tf/yaml_cache"
33
- require_relative "./mux_tf/plan_summary_handler"
29
+ require_relative "mux_tf/version"
30
+ require_relative "mux_tf/coloring"
31
+ require_relative "mux_tf/plan_filename_generator"
32
+ require_relative "mux_tf/resource_tokenizer"
33
+ require_relative "mux_tf/cli"
34
+ require_relative "mux_tf/tmux"
35
+ require_relative "mux_tf/terraform_helpers"
36
+ require_relative "mux_tf/plan_formatter"
37
+ require_relative "mux_tf/version_check"
38
+ require_relative "mux_tf/yaml_cache"
39
+ require_relative "mux_tf/plan_summary_handler"
40
+ require_relative "mux_tf/plan_utils"
34
41
 
35
42
  module MuxTf
43
+ ROOT = File.expand_path(File.join(__dir__, ".."))
36
44
  end
data/mux_tf.gemspec CHANGED
@@ -30,8 +30,10 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_dependency "activesupport", "< 7.0.0"
33
+ spec.add_dependency "awesome_print"
34
+ spec.add_dependency "diff-lcs"
33
35
  spec.add_dependency "dotenv"
34
- spec.add_dependency "paint"
36
+ spec.add_dependency "hashdiff"
35
37
  spec.add_dependency "pastel"
36
38
  spec.add_dependency "piotrb_cli_utils", "~> 0.1.0"
37
39
  spec.add_dependency "stateful_parser", "~> 0.1.1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mux_tf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Banasik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-19 00:00:00.000000000 Z
11
+ date: 2023-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "<"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 7.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: awesome_print
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: diff-lcs
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: dotenv
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +67,7 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
- name: paint
70
+ name: hashdiff
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - ">="
@@ -141,9 +169,11 @@ files:
141
169
  - lib/mux_tf/cli/current.rb
142
170
  - lib/mux_tf/cli/mux.rb
143
171
  - lib/mux_tf/cli/plan_summary.rb
172
+ - lib/mux_tf/coloring.rb
144
173
  - lib/mux_tf/plan_filename_generator.rb
145
174
  - lib/mux_tf/plan_formatter.rb
146
175
  - lib/mux_tf/plan_summary_handler.rb
176
+ - lib/mux_tf/plan_utils.rb
147
177
  - lib/mux_tf/resource_tokenizer.rb
148
178
  - lib/mux_tf/terraform_helpers.rb
149
179
  - lib/mux_tf/tmux.rb