mux_tf 0.12.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.
- checksums.yaml +4 -4
- data/exe/tf_current +2 -0
- data/exe/tf_mux +2 -0
- data/exe/tf_plan_summary +2 -0
- data/lib/deps.rb +10 -1
- data/lib/mux_tf/cli/current.rb +239 -63
- data/lib/mux_tf/cli/plan_summary.rb +2 -1
- data/lib/mux_tf/cli.rb +5 -3
- data/lib/mux_tf/coloring.rb +23 -0
- data/lib/mux_tf/plan_formatter.rb +520 -54
- data/lib/mux_tf/plan_summary_handler.rb +100 -125
- data/lib/mux_tf/plan_utils.rb +360 -0
- data/lib/mux_tf/terraform_helpers.rb +52 -9
- data/lib/mux_tf/tmux.rb +2 -0
- data/lib/mux_tf/version.rb +1 -1
- data/lib/mux_tf.rb +18 -10
- data/mux_tf.gemspec +3 -1
- metadata +33 -3
@@ -3,6 +3,7 @@
|
|
3
3
|
module MuxTf
|
4
4
|
module TerraformHelpers
|
5
5
|
include PiotrbCliUtils::ShellHelpers
|
6
|
+
include PiotrbCliUtils::Util
|
6
7
|
|
7
8
|
ResultStruct = Struct.new("TerraformResponse", :status, :success?, :output, :parsed_output, keyword_init: true)
|
8
9
|
|
@@ -39,13 +40,14 @@ module MuxTf
|
|
39
40
|
stream_or_run_terraform(cmd, &block)
|
40
41
|
end
|
41
42
|
|
42
|
-
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
|
43
44
|
args = []
|
44
45
|
args += ["-out", out]
|
45
46
|
args << "-input=#{input.inspect}" unless input.nil?
|
46
47
|
args << "-compact-warnings" if compact_warnings
|
47
48
|
args << "-no-color" unless color
|
48
49
|
args << "-detailed-exitcode" if detailed_exitcode
|
50
|
+
args << "-json" if json
|
49
51
|
if targets && !targets.empty?
|
50
52
|
targets.each do |target|
|
51
53
|
args << "-target=#{target}"
|
@@ -53,10 +55,10 @@ module MuxTf
|
|
53
55
|
end
|
54
56
|
|
55
57
|
cmd = tf_prepare_command(["plan", *args], need_auth: true)
|
56
|
-
stream_or_run_terraform(cmd, &block)
|
58
|
+
stream_or_run_terraform(cmd, split_streams: json, &block)
|
57
59
|
end
|
58
60
|
|
59
|
-
def tf_show(file, json: false)
|
61
|
+
def tf_show(file, json: false, capture: false)
|
60
62
|
if json
|
61
63
|
args = ["show", "-json", file]
|
62
64
|
cmd = tf_prepare_command(args, need_auth: true)
|
@@ -64,7 +66,11 @@ module MuxTf
|
|
64
66
|
else
|
65
67
|
args = ["show", file]
|
66
68
|
cmd = tf_prepare_command(args, need_auth: true)
|
67
|
-
|
69
|
+
if capture
|
70
|
+
capture_terraform(cmd)
|
71
|
+
else
|
72
|
+
run_terraform(cmd)
|
73
|
+
end
|
68
74
|
end
|
69
75
|
end
|
70
76
|
|
@@ -83,9 +89,9 @@ module MuxTf
|
|
83
89
|
end
|
84
90
|
end
|
85
91
|
|
86
|
-
def stream_or_run_terraform(args, &block)
|
92
|
+
def stream_or_run_terraform(args, split_streams: false, &block)
|
87
93
|
if block
|
88
|
-
stream_terraform(args, &block)
|
94
|
+
stream_terraform(args, split_streams: split_streams, &block)
|
89
95
|
else
|
90
96
|
run_terraform(args)
|
91
97
|
end
|
@@ -100,8 +106,43 @@ module MuxTf
|
|
100
106
|
})
|
101
107
|
end
|
102
108
|
|
103
|
-
def
|
104
|
-
|
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
|
105
146
|
# status is a Process::Status
|
106
147
|
ResultStruct.new({
|
107
148
|
status: status.exitstatus,
|
@@ -120,7 +161,9 @@ module MuxTf
|
|
120
161
|
parsed_output: parsed_output
|
121
162
|
})
|
122
163
|
rescue JSON::ParserError
|
123
|
-
|
164
|
+
message = "Execution failed with exit code: #{result.status}"
|
165
|
+
message += "\nOutput:\n#{result.output}" if result.output != ""
|
166
|
+
fail_with message
|
124
167
|
end
|
125
168
|
end
|
126
169
|
end
|
data/lib/mux_tf/tmux.rb
CHANGED
data/lib/mux_tf/version.rb
CHANGED
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 "
|
25
|
-
require_relative "
|
26
|
-
require_relative "
|
27
|
-
require_relative "
|
28
|
-
require_relative "
|
29
|
-
require_relative "
|
30
|
-
require_relative "
|
31
|
-
require_relative "
|
32
|
-
require_relative "
|
33
|
-
require_relative "
|
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 "
|
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.
|
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-
|
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:
|
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
|