awesome_spawn 1.5.0 → 1.6.0

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: 5dff33751b72552d7d01e1bfa6e024881148c8d64e309daaa2504107aa6b28f9
4
- data.tar.gz: 2d10fb491e209ba595dc1e8eb3751901d45ec427ddc56e3b3108606350881dab
3
+ metadata.gz: 1a45e9f8c95531c5305ea8f7d275d8ac81b458a5330787f2077c928266ce06c1
4
+ data.tar.gz: a61d2f6dfba0a30e79a3351f0776ec9c5ff8dd1ae433f42ac3d0f50b400d8a97
5
5
  SHA512:
6
- metadata.gz: 9b2ab733dc7226ac633d416500a8ddcec2d44a835431645560997acf3621636ad94286eb6431e92fdad88212ec151ad0046371d6c05006eed2d8dcd6e9bf1164
7
- data.tar.gz: f4754e31a144048fc5988a664d997da432ac7af5883234ffd7ee4e205d620eab9e715d7980cdb6668f1a28f369cfffeb798867a56186be2a45222bb18387b263
6
+ metadata.gz: b2bcb990402d54dc83338bf4aa85aa4a963384cdb5df6c26ff6c40d65783232a1d2425641cc892bff6b76634acf2f4fb074a02bbd15117f141b6085ddf14ffea
7
+ data.tar.gz: 1f1112bebe43856a532c0120394229ce2efebb3744b236a68ce5b8264808da11fd6f5034201937b7d2fb22071150589b1201c74182030102037388d871c75ae7
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
1
  # AwesomeSpawn
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/awesome_spawn.png)](http://badge.fury.io/rb/awesome_spawn)
4
- [![Build Status](https://travis-ci.org/ManageIQ/awesome_spawn.png)](https://travis-ci.org/ManageIQ/awesome_spawn)
4
+ [![CI](https://github.com/ManageIQ/awesome_spawn/actions/workflows/ci.yaml/badge.svg)](https://github.com/ManageIQ/awesome_spawn/actions/workflows/ci.yaml)
5
5
  [![Code Climate](https://codeclimate.com/github/ManageIQ/awesome_spawn.png)](https://codeclimate.com/github/ManageIQ/awesome_spawn)
6
6
  [![Coverage Status](https://coveralls.io/repos/ManageIQ/awesome_spawn/badge.png?branch=master)](https://coveralls.io/r/ManageIQ/awesome_spawn)
7
- [![Dependency Status](https://gemnasium.com/ManageIQ/awesome_spawn.png)](https://gemnasium.com/ManageIQ/awesome_spawn)
8
7
 
9
8
  AwesomeSpawn is a module that provides some useful features over Ruby's Kernel.spawn.
10
9
 
@@ -63,9 +63,7 @@ module AwesomeSpawn
63
63
  end
64
64
 
65
65
  def sanitize_associative_array(assoc_array)
66
- assoc_array.each.with_object([]) do |item, array|
67
- array.concat(sanitize_item(item))
68
- end
66
+ assoc_array.flat_map { |item| sanitize_item(item) }
69
67
  end
70
68
 
71
69
  def sanitize_item(item)
@@ -1,11 +1,12 @@
1
1
  module AwesomeSpawn
2
2
  class CommandResult
3
- attr_reader :command_line, :output, :error, :exit_status
3
+ attr_reader :command_line, :output, :error, :pid, :exit_status
4
4
 
5
- def initialize(command_line, output, error, exit_status)
5
+ def initialize(command_line, output, error, pid, exit_status)
6
6
  @command_line = command_line
7
7
  @output = output
8
8
  @error = error
9
+ @pid = pid
9
10
  @exit_status = exit_status
10
11
  end
11
12
 
@@ -2,6 +2,34 @@ require 'awesome_spawn'
2
2
 
3
3
  module AwesomeSpawn
4
4
  module SpecHelper
5
+ # Disable spawning for specs
6
+ #
7
+ # @example Disable spawning for all specs
8
+ # RSpec.configure do |config|
9
+ # AwesomeSpawn::SpecHelper.disable_spawning(config)
10
+ # end
11
+ #
12
+ # @example Disable spawning for specs in a specific path
13
+ # RSpec.configure do |config|
14
+ # AwesomeSpawn::SpecHelper.disable_spawning(config, file_path: "spec/models")
15
+ # end
16
+ #
17
+ # @param config [RSpec::Core::Configuration] RSpec configuration
18
+ # @param file_path [String] Restrict the disabling to a specific set of specs in the given path
19
+ def self.disable_spawning(config, file_path: nil)
20
+ if file_path
21
+ config.define_derived_metadata(:file_path => file_path) do |metadata|
22
+ metadata[:uses_awesome_spawn] = true
23
+ end
24
+ config.include AwesomeSpawn::SpecHelper, :uses_awesome_spawn => true
25
+ config.before(:each, :uses_awesome_spawn) { disable_spawning }
26
+ else
27
+ config.include AwesomeSpawn::SpecHelper
28
+ config.before { disable_spawning }
29
+ end
30
+ config
31
+ end
32
+
5
33
  def disable_spawning
6
34
  allow(Open3).to receive(:capture3)
7
35
  .and_raise("Spawning is not permitted in specs. Please change your spec to use expectations/stubs.")
@@ -33,13 +61,14 @@ module AwesomeSpawn
33
61
  options = options.dup
34
62
  output = options.delete(:output) || ""
35
63
  error = options.delete(:error) || (mode == :bad ? "Failure" : "")
64
+ pid = options.delete(:pid) || ""
36
65
  exit_status = options.delete(:exit_status) || (mode == :bad ? 1 : 0)
37
66
 
38
67
  command_line = AwesomeSpawn.build_command_line(command, options[:params])
39
68
 
40
69
  args = [command, options]
41
70
 
42
- result = CommandResult.new(command_line, output, error, exit_status)
71
+ result = CommandResult.new(command_line, output, error, pid, exit_status)
43
72
  if method == :run! && mode == :bad
44
73
  error_message = CommandResultError.default_message(command, exit_status)
45
74
  error = CommandResultError.new(error_message, result)
@@ -1,3 +1,3 @@
1
1
  module AwesomeSpawn
2
- VERSION = "1.5.0"
2
+ VERSION = "1.6.0"
3
3
  end
data/lib/awesome_spawn.rb CHANGED
@@ -17,7 +17,7 @@ module AwesomeSpawn
17
17
  end
18
18
 
19
19
  # Execute `command` synchronously via Kernel.spawn and gather the output
20
- # stream, error stream, and exit status in a {CommandResult}.
20
+ # stream, error stream, pid, and exit status in a {CommandResult}.
21
21
  #
22
22
  # @example With normal output
23
23
  # result = AwesomeSpawn.run('echo Hi')
@@ -77,12 +77,15 @@ module AwesomeSpawn
77
77
  options[:stdin_data] = in_data
78
78
  end
79
79
 
80
- output, error, status = launch(env, command_line, options)
80
+ output, error, process_status = launch(env, command_line, options)
81
+ status = process_status && process_status.exitstatus
82
+ pid = process_status.pid if process_status
83
+
81
84
  rescue Errno::ENOENT => err
82
85
  raise NoSuchFileError.new(err.message) if NoSuchFileError.detected?(err.message)
83
86
  raise
84
87
  else
85
- CommandResult.new(command_line, output, error, status)
88
+ CommandResult.new(command_line, output, error, pid, status)
86
89
  end
87
90
 
88
91
  # Same as {#run}, additionally raising a {CommandResultError} if the exit
@@ -111,6 +114,35 @@ module AwesomeSpawn
111
114
  command_result
112
115
  end
113
116
 
117
+ # Execute `command` in a detached manner
118
+ # The defalt is to spawn a new child process that sends the output to the null device
119
+ # @param [String] command the command to execute
120
+ # @param [Hash{Symbol,Object}] options the Kernel.spawn options
121
+ # by default the :err, and :out are redirected to the null device.
122
+ # For windows, default :pgroup_new is true (make a root process of a new process group)
123
+ # For others, default :pgroup is true (make a new process group)
124
+ # @returns [Integer] pid of new process
125
+ #
126
+ # @example With normal output
127
+ # AwesomeSpawn.run_detached('echo "Hi" > /tmp/out')
128
+ # # => 79901
129
+ #
130
+ # if a user defines :out or :err, it is assumed they will define both
131
+ def run_detached(command, options = {})
132
+ env, command_line, options = parse_command_options(command, options)
133
+ # maybe add support later for this
134
+ raise ArgumentError, "options cannot contain :in_data" if options.include?(:in_data)
135
+
136
+ options[[:out, :err]] = [IO::NULL, "w"] unless (options.keys.flatten & [:out, :err]).any?
137
+ if Gem.win_platform?
138
+ options[:new_pgroup] = true unless options.key?(:new_pgroup)
139
+ else
140
+ options[:pgroup] = true unless options.key?(:pgroup)
141
+ end
142
+
143
+ detach(env, command_line, options)
144
+ end
145
+
114
146
  # (see CommandLineBuilder#build)
115
147
  def build_command_line(command, params = nil)
116
148
  CommandLineBuilder.new.build(command, params)
@@ -126,7 +158,7 @@ module AwesomeSpawn
126
158
  else
127
159
  output, error, status = Open3.capture3(env, command, spawn_options)
128
160
  end
129
- return output, error, status && status.exitstatus
161
+ return output, error, status
130
162
  end
131
163
 
132
164
  def parse_command_options(command, options)
@@ -136,4 +168,8 @@ module AwesomeSpawn
136
168
 
137
169
  [env, build_command_line(command, params), options]
138
170
  end
171
+
172
+ def detach(env, command, options)
173
+ Process.detach(Kernel.spawn(env, command, options)).pid
174
+ end
139
175
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awesome_spawn
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Frey
8
8
  - Brandon Dunne
9
9
  - Joe Rafaniello
10
10
  - Mo Morsi
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-02-04 00:00:00.000000000 Z
14
+ date: 2023-11-01 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -28,7 +28,7 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: rake
31
+ name: manageiq-style
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - ">="
@@ -42,7 +42,7 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: '0'
44
44
  - !ruby/object:Gem::Dependency
45
- name: rspec
45
+ name: rake
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
@@ -56,7 +56,7 @@ dependencies:
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  - !ruby/object:Gem::Dependency
59
- name: coveralls
59
+ name: rspec
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - ">="
@@ -69,6 +69,20 @@ dependencies:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
71
  version: '0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: simplecov
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 0.21.2
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 0.21.2
72
86
  description: AwesomeSpawn is a module that provides some useful features over Ruby's
73
87
  Kernel.spawn.
74
88
  email:
@@ -95,7 +109,7 @@ homepage: https://github.com/ManageIQ/awesome_spawn
95
109
  licenses:
96
110
  - MIT
97
111
  metadata: {}
98
- post_install_message:
112
+ post_install_message:
99
113
  rdoc_options: []
100
114
  require_paths:
101
115
  - lib
@@ -110,8 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
124
  - !ruby/object:Gem::Version
111
125
  version: '0'
112
126
  requirements: []
113
- rubygems_version: 3.0.3
114
- signing_key:
127
+ rubygems_version: 3.4.20
128
+ signing_key:
115
129
  specification_version: 4
116
130
  summary: AwesomeSpawn is a module that provides some useful features over Ruby's Kernel.spawn.
117
131
  test_files: []