mux_tf 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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