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.
@@ -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
- run_terraform(cmd)
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 stream_terraform(args, &block)
104
- 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
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
- 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
124
167
  end
125
168
  end
126
169
  end
data/lib/mux_tf/tmux.rb CHANGED
@@ -4,6 +4,8 @@ require "shellwords"
4
4
 
5
5
  module MuxTf
6
6
  module Tmux
7
+ extend PiotrbCliUtils::Util
8
+
7
9
  class << self
8
10
  def session_running?(name)
9
11
  tmux("has-session -t #{name.inspect} 2>/dev/null", raise_on_error: false)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MuxTf
4
- VERSION = "0.12.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.12.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-12 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