cem_acpt 0.2.8-universal-java-17 → 0.2.9-universal-java-17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3bf596ee67704455f907b1d68959a733bf938051108534dad444942de893e3cf
4
- data.tar.gz: 9d47ed4ca9975d124d2550e51bcf00c945ad5f10b21c8fb8205f27365bd7f76b
3
+ metadata.gz: d4181b3fae3e4d3f0029314896873f2f604374cc4583473b0b05e689464d346f
4
+ data.tar.gz: 5e01be5d223962785a18e685f17cc1c3cd393f705cd2b5df174327a8631e1598
5
5
  SHA512:
6
- metadata.gz: 16bdac45fb5384f85863967f64fa927a5bd610b483d6eab4f87cf45c55117cbe7fda818259f8b42fda621d9118bb46b8099fa7c7f5cd52a12d567691f729cc39
7
- data.tar.gz: a3957f255f0643f6102df4c32628d21ebfe6f51d7cba25a122be80b48e5288a2569830f1a0995298db082a4bb79e64570af9de1617c3e2ed4f812a83c33f8a02
6
+ metadata.gz: e9dc631cf11d32f85405358a8bc4e8501afc290a15ed68e80688472de838cfdd81cf09e9a10d346f396de6f1c2505188c443c60e0d4b106b346fd77f079c311c
7
+ data.tar.gz: 7866ca7c6272369e15c2fbf3f2dd69ce6d6caf6d059b08ad686e7b2fcaf5d63d5d093dbfac076c4c68f3ac7c07f4bcacc2bcd01107667531e069821c00e90313
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cem_acpt (0.2.8-universal-java-17)
4
+ cem_acpt (0.2.9-universal-java-17)
5
5
  concurrent-ruby (>= 1.1, < 2.0)
6
6
  deep_merge (>= 1.2, < 2.0)
7
7
  ed25519 (>= 1.2, < 2.0)
@@ -12,13 +12,17 @@ module CemAcpt
12
12
  class BundlerNotFoundError < StandardError; end
13
13
  class RSpecNotFoundError < StandardError; end
14
14
 
15
- # Holds and formats a RSpec command
16
- class Command
17
- include CemAcpt::LoggingAsync
18
- attr_reader :debug, :format, :test_path, :use_bundler, :pty_pid
15
+ # Holds RSpec options used by Command
16
+ class Options
17
+ OPTIONS = %i[test_path bundle rspec use_bundler bundle_install format debug quiet env].freeze
19
18
 
19
+ attr_accessor(*OPTIONS)
20
+
21
+ # @param config [CemAcpt::Config] A config object
20
22
  # @param opts [Hash] options hash for the RSpec command
21
23
  # @option opts [String] :test_path The path (or glob path) to the test file(s) to run. If blank, runs all.
24
+ # @option opts [String] :bundle The path to the `bundle` binary.
25
+ # @option opts [String] :rspec The path to the `rspec` binary.
22
26
  # @option opts [Hash] :format Format options for rspec where the key is the format (documentation, json, etc)
23
27
  # and the value is the out-file path. If you do not want to save the results of a format to a file, the
24
28
  # value should be `nil`.
@@ -30,56 +34,97 @@ module CemAcpt
30
34
  # Default is `true`.
31
35
  # @option opts [Boolean] :bundle_install Whether or not to run `bundle install` before the RSpec command
32
36
  # if `use_bundler` is `true`.
33
- # @option opts [Boolean] :use_shell Whether or not to add `$SHELL` as a prefix to the command
34
37
  # @option opts [Hash] :env Environment variables to prepend to the command
35
- def initialize(opts = {})
36
- @test_path = opts[:test_path]&.shellescape
37
- @format = opts.fetch(:format, {})
38
- @debug = opts.fetch(:debug, false)
39
- @quiet = @debug ? false : opts.fetch(:quiet, false)
40
- @use_bundler = opts.fetch(:use_bundler, false)
41
- @bundle_install = opts.fetch(:bundle_install, false)
42
- @env = opts.fetch(:env, {})
43
- @pty_pid = nil
44
- validate_and_set_bin_paths(opts)
38
+ def initialize(config, **opts)
39
+ @config = config
40
+ @opts = opts
41
+ define_option_instance_vars
42
+ end
43
+
44
+ # Finds and sets the paths to the `bundle` and `rspec` binaries. The paths can
45
+ # be either passed in as options in the `opts` Hash or interrogated from the
46
+ # system.
47
+ # @raise [CemAcpt::RSpecUtils::BundlerNotFoundError] if `@use_bundler` is true and
48
+ # `bundle` binary is not found.
49
+ # @raise [CemAcpt::RSpecUtils::RSpecNotFoundError] if `rspec` binary is not found.
50
+ def resolve_bin_paths
51
+ %i[bundle rspec].each do |bin|
52
+ bin_path = instance_variable_get("@#{bin}") || `#{ENV['SHELL']} -c 'command -v #{bin}'`.strip
53
+ bin_not_found(bin, bin_path) unless bin_path && File.exist?(bin_path)
54
+ instance_variable_set("@#{bin}", bin_path)
55
+ end
56
+ end
57
+
58
+ # Detects if the current Ruby context is JRuby
59
+ def jruby?
60
+ Object.const_defined?('JRUBY_VERSION')
45
61
  end
46
62
 
47
- # Sets debug mode to `true`
48
- def set_debug
49
- @debug = true
50
- if @quiet
51
- async_debug('Setting :quiet to false because :debug is now true.')
52
- @quiet = false
63
+ private
64
+
65
+ def defaults
66
+ @defaults ||= { use_bundler: false,
67
+ bundle_install: false,
68
+ format: { documentation: nil },
69
+ debug: false,
70
+ quiet: false,
71
+ env: {} }
72
+ end
73
+
74
+ def define_option_instance_vars
75
+ OPTIONS.each do |o|
76
+ val = @config.get("rspec.#{o}") || @opts[o] || defaults[o] || nil
77
+ instance_variable_set("@#{o}", val)
53
78
  end
54
79
  end
55
80
 
56
- # Sets debug mode to `false`
57
- def unset_debug
58
- @debug = false
81
+ # Handles binary paths which are not found
82
+ # @param bin [Symbol] The binary that was not found, either :bundle or :rspec.
83
+ # @param bin_path [String] The path to the binary that was checked.
84
+ # @raise [CemAcpt::RSpecUtils::BundlerNotFoundError] if `@use_bundler` is true and
85
+ # `bundle` binary is not found.
86
+ # @raise [CemAcpt::RSpecUtils::RSpecNotFoundError] if `rspec` binary is not found.
87
+ # @raise [RuntimeError] if `bin` is not :bundle or :rspec.
88
+ def bin_not_found(bin, bin_path)
89
+ msg_base = "#{bin} not found."
90
+ msg = bin_path.nil? ? "#{msg_base} Path is nil." : "#{msg_base} Path: #{bin_path}"
91
+ case bin
92
+ when :bundle
93
+ raise BundlerNotFoundError, msg if opts.use_bundler
94
+ when :rspec
95
+ raise RSpecNotFoundError, msg
96
+ else
97
+ raise "bin #{bin} not recognized!"
98
+ end
59
99
  end
100
+ end
101
+
102
+ # Holds and formats a RSpec command
103
+ class Command
104
+ include CemAcpt::LoggingAsync
105
+ attr_reader :opts, :pty_pid
106
+
107
+ def initialize(opts = Options.new)
108
+ raise 'opts must be instance of CemAcpt::RSpecUtils::Options' unless opts.is_a?(CemAcpt::RSpecUtils::Options)
60
109
 
61
- def quiet
62
- @quiet && !debug
110
+ @opts = opts
111
+ @opts.resolve_bin_paths
112
+ @opts.env = @opts.env.merge({ 'RSPEC_DEBUG' => 'true' }) if @opts.debug
113
+ @pty_pid = nil
63
114
  end
64
115
 
65
116
  # Adds a new format to the RSpec command
66
117
  # @param fmt [String] The name of the format (i.e. "documentation", "json", etc.)
67
118
  # @param out [String] If specified, saves the specified format to a file at this path
68
119
  def with_format(fmt, out: nil)
69
- @format[fmt.to_sym] = out
70
- end
71
-
72
- # Environment variables that will be used for the RSpec command
73
- # @return [Hash] A Hash of environment variables with each key pair being: <var name> => <var value>
74
- def env
75
- @debug ? @env.merge({ 'RSPEC_DEBUG' => 'true' }) : @env
120
+ opts.format[fmt.to_sym] = out
76
121
  end
77
122
 
78
123
  # Returns an array representation of the RSpec command
79
124
  def to_a
80
125
  cmd = cmd_base.dup
81
- cmd << test_path if test_path
82
- format.each do |fmt, out|
126
+ cmd << opts.test_path if opts.test_path
127
+ opts.format.each do |fmt, out|
83
128
  cmd += ['--format', fmt.to_s.shellescape]
84
129
  cmd += ['--out', out.to_s.shellescape] if out
85
130
  end
@@ -112,12 +157,12 @@ module CemAcpt
112
157
  # @return [Integer] The exit code of the RSpec command
113
158
  def execute_pty(log_prefix: 'RSPEC')
114
159
  async_debug("Executing RSpec command '#{self}' in PTY...", log_prefix)
115
- PTY.spawn(env, ENV['SHELL']) do |r, w, pid|
160
+ PTY.spawn(opts.env, ENV['SHELL']) do |r, w, pid|
116
161
  @pty_pid = pid
117
162
  async_debug("Spawned RSpec PTY with PID #{@pty_pid}", log_prefix)
118
163
  export_envs(w)
119
164
  w.puts "#{self}; exit $?"
120
- quiet ? wait_io(r) : read_io(r, log_prefix: log_prefix)
165
+ handle_io(r, log_prefix: log_prefix)
121
166
  end
122
167
  $CHILD_STATUS
123
168
  end
@@ -130,9 +175,9 @@ module CemAcpt
130
175
  def execute_no_pty(log_prefix: 'RSPEC')
131
176
  async_info("Executing RSpec command '#{self}' with Open3.popen2e()...", log_prefix)
132
177
  exit_status = nil
133
- Open3.popen2e(env, to_s) do |stdin, std_out_err, wait_thr|
178
+ Open3.popen2e(opts.env, to_s) do |stdin, std_out_err, wait_thr|
134
179
  stdin.close
135
- quiet ? wait_io(std_out_err) : read_io(std_out_err, log_prefix: log_prefix)
180
+ handle_io(std_out_err, log_prefix: log_prefix)
136
181
  exit_status = wait_thr.value
137
182
  end
138
183
  exit_status
@@ -147,26 +192,21 @@ module CemAcpt
147
192
 
148
193
  private
149
194
 
150
- # Detects if the current Ruby context is JRuby
151
- def jruby?
152
- File.basename(RbConfig.ruby) == 'jruby'
153
- end
154
-
155
195
  # The base RSpec command
156
196
  def cmd_base
157
- use_bundler ? cmd_base_bundler : cmd_base_rspec
197
+ opts.use_bundler ? cmd_base_bundler : cmd_base_rspec
158
198
  end
159
199
 
160
200
  # The base RSpec command if `:use_bundler` is `true`.
161
201
  def cmd_base_bundler
162
- base = [@bundle, 'exec', 'rspec']
163
- base.unshift("#{@bundle} install;") if @bundle_install
202
+ base = [opts.bundle, 'exec', 'rspec']
203
+ base.unshift("#{opts.bundle} install;") if opts.bundle_install
164
204
  base
165
205
  end
166
206
 
167
207
  # The base RSpec command if `:use_bundler` is `false`
168
208
  def cmd_base_rspec
169
- [@rspec]
209
+ [opts.rspec]
170
210
  end
171
211
 
172
212
  # Puts export statements for each key-value pair in `env` to the given writer.
@@ -174,46 +214,14 @@ module CemAcpt
174
214
  # pass the statements to a shell.
175
215
  # @param writer [IO] An IO object that supprts `puts` and can send statements to a shell
176
216
  def export_envs(writer)
177
- env.each do |key, val|
217
+ @opts.env.each do |key, val|
178
218
  writer.puts "export #{key}=#{val}"
179
219
  end
180
220
  end
181
221
 
182
- # Finds and sets the paths to the `bundle` and `rspec` binaries. The paths can
183
- # be either passed in as options in the `opts` Hash or interrogated from the
184
- # system.
185
- # @param opts [Hash] The options hash
186
- # @option opts [String] :bundle An absolute path on the system to the `bundle` binary.
187
- # @option opts [String] :rspec An absolute path on the system to the `rspec` binary.
188
- # @raise [CemAcpt::RSpecUtils::BundlerNotFoundError] if `@use_bundler` is true and
189
- # `bundle` binary is not found.
190
- # @raise [CemAcpt::RSpecUtils::RSpecNotFoundError] if `rspec` binary is not found.
191
- def validate_and_set_bin_paths(opts = {})
192
- %i[bundle rspec].each do |bin|
193
- bin_path = opts[bin] || `command -v #{bin}`.strip
194
- bin_not_found(bin, bin_path) unless bin_path && File.exist?(bin_path)
195
- instance_variable_set("@#{bin}", bin_path)
196
- end
197
- end
198
-
199
- # Handles binary paths which are not found
200
- # @param bin [Symbol] The binary that was not found, either :bundle or :rspec.
201
- # @param bin_path [String] The path to the binary that was checked.
202
- # @raise [CemAcpt::RSpecUtils::BundlerNotFoundError] if `@use_bundler` is true and
203
- # `bundle` binary is not found.
204
- # @raise [CemAcpt::RSpecUtils::RSpecNotFoundError] if `rspec` binary is not found.
205
- # @raise [RuntimeError] if `bin` is not :bundle or :rspec.
206
- def bin_not_found(bin, bin_path)
207
- msg_base = "#{bin} not found."
208
- msg = bin_path.nil? ? "#{msg_base} Path is nil." : "#{msg_base} Path: #{bin_path}"
209
- case bin
210
- when :bundle
211
- raise BundlerNotFoundError, msg if @use_bundler
212
- when :rspec
213
- raise RSpecNotFoundError, msg
214
- else
215
- raise "bin #{bin} not recognized!"
216
- end
222
+ # Handles IO output
223
+ def handle_io(io_stream, **kwargs)
224
+ opts.quiet ? wait_io(io_stream) : read_io(io_stream, log_prefix: kwargs[:log_prefix])
217
225
  end
218
226
 
219
227
  # Blocking wait on an IO stream. Wait stops once the IO stream has reached
@@ -145,12 +145,12 @@ module CemAcpt
145
145
  async_info("Running test #{@node.test_data[:test_name]} on node #{@node.node_name}...", log_prefix('RSPEC'))
146
146
  @node.run_tests do |cmd_env|
147
147
  cmd_opts = rspec_opts
148
- cmd_opts[:env].merge!(cmd_env) if cmd_env
148
+ cmd_opts.env = cmd_opts.env.merge(cmd_env) if cmd_env
149
149
  # Documentation format gets logged in real time, JSON file is read after the fact
150
150
  begin
151
151
  @rspec_cmd = CemAcpt::RSpecUtils::Command.new(cmd_opts)
152
- @rspec_cmd.execute(log_prefix: log_prefix('RSPEC'))
153
- @run_result.from_json_file(cmd_opts[:format][:json])
152
+ @rspec_cmd.execute(pty: false, log_prefix: log_prefix('RSPEC'))
153
+ @run_result.from_json_file(cmd_opts.format[:json])
154
154
  rescue Errno::EIO => e
155
155
  async_error("failed to run rspec: #{@node.test_data[:test_name]}: #{$ERROR_INFO}", log_prefix('RSPEC'))
156
156
  @run_result.from_error(e)
@@ -191,19 +191,21 @@ module CemAcpt
191
191
 
192
192
  # Options used with RSpec
193
193
  def rspec_opts
194
- opts = {
195
- test_path: @node.test_data[:test_file],
196
- use_bundler: @context.config.get('rspec.use_bundler') || false,
197
- bundle_install: @context.config.get('rspec.bundle_install') || false,
198
- format: @context.config.get('rspec.format') || { json: "results_#{@node.test_data[:test_name]}.json" },
199
- debug: (@debug_mode && @context.config.get('verbose')),
200
- quiet: @context.config.get('quiet'),
201
- env: {
202
- 'TARGET_HOST' => @node.node_name,
203
- }
204
- }
205
- opts[:format][:documentation] = nil unless @context.config.get('verbose') || @context.config.get('rspec.format')
206
- opts
194
+ opts_test_path = @node.test_data[:test_file]
195
+ opts_env = { 'TARGET_HOST' => @node.node_name }
196
+ opts_debug = (@debug_mode && @context.config.get('verbose'))
197
+ opts_quiet = @context.config.get('quiet')
198
+ opts_format = if @context.config.get('verbose')
199
+ { json: "results_#{@node.test_data[:test_name]}.json", documentation: nil }
200
+ else
201
+ { json: "results_#{@node.test_data[:test_name]}.json" }
202
+ end
203
+ CemAcpt::RSpecUtils::Options.new(@context.config,
204
+ test_path: opts_test_path,
205
+ env: opts_env,
206
+ debug: opts_debug,
207
+ quiet: opts_quiet,
208
+ format: opts_format)
207
209
  end
208
210
  end
209
211
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CemAcpt
4
- VERSION = '0.2.8'
4
+ VERSION = '0.2.9'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cem_acpt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: universal-java-17
6
6
  authors:
7
7
  - puppetlabs