bson 5.0.0 → 5.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +91 -7
  3. data/Rakefile +63 -39
  4. data/ext/bson/read.c +18 -3
  5. data/ext/bson/util.c +5 -2
  6. data/ext/bson/write.c +4 -0
  7. data/lib/bson/array.rb +1 -1
  8. data/lib/bson/binary.rb +16 -1
  9. data/lib/bson/code.rb +1 -1
  10. data/lib/bson/code_with_scope.rb +1 -1
  11. data/lib/bson/db_pointer.rb +1 -1
  12. data/lib/bson/decimal128/builder.rb +1 -1
  13. data/lib/bson/decimal128.rb +1 -1
  14. data/lib/bson/ext_json.rb +1 -1
  15. data/lib/bson/float.rb +1 -1
  16. data/lib/bson/hash.rb +1 -1
  17. data/lib/bson/int32.rb +1 -1
  18. data/lib/bson/int64.rb +1 -1
  19. data/lib/bson/integer.rb +1 -1
  20. data/lib/bson/max_key.rb +1 -1
  21. data/lib/bson/min_key.rb +1 -1
  22. data/lib/bson/object.rb +2 -2
  23. data/lib/bson/object_id.rb +12 -2
  24. data/lib/bson/regexp.rb +1 -1
  25. data/lib/bson/symbol.rb +2 -2
  26. data/lib/bson/time.rb +1 -1
  27. data/lib/bson/timestamp.rb +1 -1
  28. data/lib/bson/undefined.rb +1 -1
  29. data/lib/bson/version.rb +2 -1
  30. data/spec/bson/binary_spec.rb +46 -7
  31. data/spec/bson/object_id_spec.rb +14 -0
  32. metadata +7 -80
  33. checksums.yaml.gz.sig +0 -0
  34. data/spec/shared/LICENSE +0 -20
  35. data/spec/shared/bin/get-mongodb-download-url +0 -17
  36. data/spec/shared/bin/s3-copy +0 -45
  37. data/spec/shared/bin/s3-upload +0 -69
  38. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  39. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  40. data/spec/shared/lib/mrss/constraints.rb +0 -378
  41. data/spec/shared/lib/mrss/docker_runner.rb +0 -298
  42. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  43. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  44. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  45. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  46. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  47. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  48. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  49. data/spec/shared/lib/mrss/utils.rb +0 -37
  50. data/spec/shared/share/Dockerfile.erb +0 -321
  51. data/spec/shared/share/haproxy-1.conf +0 -16
  52. data/spec/shared/share/haproxy-2.conf +0 -17
  53. data/spec/shared/shlib/config.sh +0 -27
  54. data/spec/shared/shlib/distro.sh +0 -74
  55. data/spec/shared/shlib/server.sh +0 -416
  56. data/spec/shared/shlib/set_env.sh +0 -169
  57. data.tar.gz.sig +0 -0
  58. metadata.gz.sig +0 -2
@@ -92,7 +92,7 @@ module BSON
92
92
  end
93
93
 
94
94
  # Converts this object to a representation directly serializable to
95
- # Extended JSON (https://github.com/mongodb/specifications/blob/master/source/extended-json.rst).
95
+ # Extended JSON (https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md).
96
96
  #
97
97
  # @option opts [ nil | :relaxed | :legacy ] :mode Serialization mode
98
98
  # (default is canonical extended JSON)
@@ -57,7 +57,7 @@ module BSON
57
57
  end
58
58
 
59
59
  # Converts this object to a representation directly serializable to
60
- # Extended JSON (https://github.com/mongodb/specifications/blob/master/source/extended-json.rst).
60
+ # Extended JSON (https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md).
61
61
  #
62
62
  # @option opts [ nil | :relaxed | :legacy ] :mode Serialization mode
63
63
  # (default is canonical extended JSON)
data/lib/bson/version.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  # rubocop:todo all
3
+
3
4
  # Copyright (C) 2009-2020 MongoDB Inc.
4
5
  #
5
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,5 +16,5 @@
15
16
  # limitations under the License.
16
17
 
17
18
  module BSON
18
- VERSION = "5.0.0"
19
+ VERSION = "5.0.2"
19
20
  end
@@ -20,17 +20,56 @@ describe BSON::Binary do
20
20
  let(:testing1) { described_class.new("testing") }
21
21
  let(:testing2) { described_class.new("testing") }
22
22
  let(:not_testing) { described_class.new("not testing") }
23
+ let(:testing3) { described_class.new("testing", :user) }
23
24
 
24
- describe "#eql?" do
25
- context "for two equal objects" do
26
- it "returns true" do
27
- expect(testing1).to eql(testing2)
25
+ describe "Comparable" do
26
+ describe "#eql?" do
27
+ context "for two equal objects" do
28
+ it "returns true" do
29
+ expect(testing1).to eql(testing2)
30
+ end
31
+ end
32
+
33
+ context "for two different objects" do
34
+ it "returns false" do
35
+ expect(testing1).not_to eql(not_testing)
36
+ end
37
+ end
38
+
39
+ context 'for objects with identical data but different types' do
40
+ it 'returns false' do
41
+ expect(testing1).not_to eql(testing3)
42
+ end
28
43
  end
29
44
  end
30
45
 
31
- context "for two different objects" do
32
- it "returns false" do
33
- expect(testing1).not_to eql(not_testing)
46
+ describe '#<=>' do
47
+ context 'with a non-Binary object' do
48
+ it 'returns nil' do
49
+ expect(testing1 <=> 'bogus').to be_nil
50
+ end
51
+ end
52
+
53
+ context 'with identical type and data' do
54
+ it 'returns 0' do
55
+ expect(testing1 <=> testing2).to be == 0
56
+ end
57
+ end
58
+
59
+ context 'with mismatched type' do
60
+ it 'returns nil' do
61
+ expect(testing1 <=> testing3).to be_nil
62
+ end
63
+ end
64
+
65
+ context 'with identical type but mismatched data' do
66
+ it 'returns -1 when a < b' do
67
+ expect(not_testing <=> testing1).to be == -1
68
+ end
69
+
70
+ it 'returns 1 when a > b' do
71
+ expect(testing1 <=> not_testing).to be == 1
72
+ end
34
73
  end
35
74
  end
36
75
  end
@@ -622,6 +622,20 @@ describe BSON::ObjectId do
622
622
  end
623
623
  end
624
624
 
625
+ context 'when the timestamp is larger than a 32-bit integer' do
626
+ let(:distant_future) { Time.at(2 ** 32) }
627
+
628
+ before do
629
+ allow(Time).to receive(:now).and_return(distant_future)
630
+ end
631
+
632
+ let(:object_id) { BSON::ObjectId.new }
633
+
634
+ it 'wraps the timestamp to 0' do
635
+ expect(object_id.to_time).to be == Time.at(0)
636
+ end
637
+ end
638
+
625
639
  context 'when fork changes the pid' do
626
640
  before do
627
641
  skip 'requires Process.fork' unless Process.respond_to?(:fork)
metadata CHANGED
@@ -1,41 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bson
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - The MongoDB Ruby Team
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
- cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMREwDwYDVQQDDAhkYngt
14
- cnVieTEXMBUGCgmSJomT8ixkARkWB21vbmdvZGIxEzARBgoJkiaJk/IsZAEZFgNj
15
- b20wHhcNMjQwMjA5MTc0NzIyWhcNMjUwMjA4MTc0NzIyWjBBMREwDwYDVQQDDAhk
16
- YngtcnVieTEXMBUGCgmSJomT8ixkARkWB21vbmdvZGIxEzARBgoJkiaJk/IsZAEZ
17
- FgNjb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC0/Veq9l47cTfX
18
- tQ+kHq2NOCwJuJGt1iXWQ/vH/yp7pZ/bLej7gPDl2CfIngAXRjM7r1FkR9ya7VAm
19
- IneBFcVU3HhpIXWi4ByXGjBOXFD1Dfbz4C4zedIWRk/hNzXa+rQY4KPwpOwG/hZg
20
- id+rSXWSbNlkyN97XfonweVh7JsIa9X/2JY9ADYjhCfEZF+b0+Wl7+jgwzLWb46I
21
- 0WH0bZBIZ0BbKAwUXIgvq5mQf9PzukmMVYCwnkJ/P4wrHO22HuwnbMyvJuGjVwqi
22
- j1NRp/2vjmKBFWxIfhlSXEIiqAmeEVNXzhPvTVeyo+rma+7R3Bo+4WHkcnPpXJJZ
23
- Jd63qXMvTB0GplEcMJPztWhrJOmcxIOVoQyigEPSQT8JpzFVXby4SGioizv2eT7l
24
- VYSiCHuc3yEDyq5M+98WGX2etbj6esYtzI3rDevpIAHPB6HQmtoJIA4dSl3gjFb+
25
- D+YQSuB2qYu021FI9zeY9sbZyWysEXBxhwrmTk+XUV0qz+OQZkMCAwEAAaN7MHkw
26
- CQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFH4nnr4tYlatU57RbExW
27
- jG86YM5nMB8GA1UdEQQYMBaBFGRieC1ydWJ5QG1vbmdvZGIuY29tMB8GA1UdEgQY
28
- MBaBFGRieC1ydWJ5QG1vbmdvZGIuY29tMA0GCSqGSIb3DQEBCwUAA4IBgQBKGtHA
29
- fpi3N/BL1J5O4CBsAjtF4jHDiw2r5MwK+66NzMh3uedjgPI7MoosemLy++SB+8BR
30
- SE8bDkb6gfDQQzrI6KSXXyqH2TbQXpY5Tac7/yqXRiu8G2qOrOj4czB/Hq7j09CV
31
- YoH88v6hL11i5jt6jPjFh8hXYG0hDQxhi3atRz5Wwd98tUf2DSbyJXJiRgCBeZjl
32
- rP7AnKsWMu0C+zPlL+nXtQr+nTFtkKXRWfUJMqePpBqtriQvgQ+Y1ItqYVTSLuiM
33
- iwUMcn/rGhdCMBSaKDXdFkIveCHQE2f2WBo2EdErrcTrgEKYYdNfzcb/43j7L1kx
34
- AUwyTtk+HFrviBynQbKN82rjbZE+5gukVea5c7idQPkqacPYsoU37DI+hTlUyJkV
35
- dcTtfEg44lLlfNukBslfiQf54r+uWbyB0m0rDUN/py7/Ghyzt5GLBU91uCO3dGoI
36
- 55uFRHMvEcJMTDeImC/nuucPCAiEGMHggr9+NPC0tqpxjGKTo7lS7GzUFjg=
37
- -----END CERTIFICATE-----
38
- date: 2024-02-13 00:00:00.000000000 Z
10
+ cert_chain: []
11
+ date: 2024-11-19 00:00:00.000000000 Z
39
12
  dependencies: []
40
13
  description: A fully featured BSON specification implementation in Ruby
41
14
  email: dbx-ruby@mongodb.com
@@ -167,29 +140,6 @@ files:
167
140
  - spec/runners/common_driver.rb
168
141
  - spec/runners/corpus.rb
169
142
  - spec/runners/corpus_legacy.rb
170
- - spec/shared/LICENSE
171
- - spec/shared/bin/get-mongodb-download-url
172
- - spec/shared/bin/s3-copy
173
- - spec/shared/bin/s3-upload
174
- - spec/shared/lib/mrss/child_process_helper.rb
175
- - spec/shared/lib/mrss/cluster_config.rb
176
- - spec/shared/lib/mrss/constraints.rb
177
- - spec/shared/lib/mrss/docker_runner.rb
178
- - spec/shared/lib/mrss/eg_config_utils.rb
179
- - spec/shared/lib/mrss/event_subscriber.rb
180
- - spec/shared/lib/mrss/lite_constraints.rb
181
- - spec/shared/lib/mrss/server_version_registry.rb
182
- - spec/shared/lib/mrss/session_registry.rb
183
- - spec/shared/lib/mrss/session_registry_legacy.rb
184
- - spec/shared/lib/mrss/spec_organizer.rb
185
- - spec/shared/lib/mrss/utils.rb
186
- - spec/shared/share/Dockerfile.erb
187
- - spec/shared/share/haproxy-1.conf
188
- - spec/shared/share/haproxy-2.conf
189
- - spec/shared/shlib/config.sh
190
- - spec/shared/shlib/distro.sh
191
- - spec/shared/shlib/server.sh
192
- - spec/shared/shlib/set_env.sh
193
143
  - spec/spec_helper.rb
194
144
  - spec/spec_tests/common_driver_spec.rb
195
145
  - spec/spec_tests/corpus_legacy_spec.rb
@@ -266,7 +216,7 @@ metadata:
266
216
  documentation_uri: https://www.mongodb.com/docs/ruby-driver/current/tutorials/bson-v4/
267
217
  homepage_uri: https://www.mongodb.com/docs/ruby-driver/current/tutorials/bson-v4/
268
218
  source_code_uri: https://github.com/mongodb/bson-ruby
269
- post_install_message:
219
+ post_install_message:
270
220
  rdoc_options: []
271
221
  require_paths:
272
222
  - lib
@@ -281,8 +231,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
231
  - !ruby/object:Gem::Version
282
232
  version: 1.3.6
283
233
  requirements: []
284
- rubygems_version: 3.3.15
285
- signing_key:
234
+ rubygems_version: 3.4.19
235
+ signing_key:
286
236
  specification_version: 4
287
237
  summary: Ruby implementation of the BSON specification
288
238
  test_files:
@@ -335,29 +285,6 @@ test_files:
335
285
  - spec/runners/common_driver.rb
336
286
  - spec/runners/corpus.rb
337
287
  - spec/runners/corpus_legacy.rb
338
- - spec/shared/LICENSE
339
- - spec/shared/bin/get-mongodb-download-url
340
- - spec/shared/bin/s3-copy
341
- - spec/shared/bin/s3-upload
342
- - spec/shared/lib/mrss/child_process_helper.rb
343
- - spec/shared/lib/mrss/cluster_config.rb
344
- - spec/shared/lib/mrss/constraints.rb
345
- - spec/shared/lib/mrss/docker_runner.rb
346
- - spec/shared/lib/mrss/eg_config_utils.rb
347
- - spec/shared/lib/mrss/event_subscriber.rb
348
- - spec/shared/lib/mrss/lite_constraints.rb
349
- - spec/shared/lib/mrss/server_version_registry.rb
350
- - spec/shared/lib/mrss/session_registry.rb
351
- - spec/shared/lib/mrss/session_registry_legacy.rb
352
- - spec/shared/lib/mrss/spec_organizer.rb
353
- - spec/shared/lib/mrss/utils.rb
354
- - spec/shared/share/Dockerfile.erb
355
- - spec/shared/share/haproxy-1.conf
356
- - spec/shared/share/haproxy-2.conf
357
- - spec/shared/shlib/config.sh
358
- - spec/shared/shlib/distro.sh
359
- - spec/shared/shlib/server.sh
360
- - spec/shared/shlib/set_env.sh
361
288
  - spec/spec_helper.rb
362
289
  - spec/spec_tests/common_driver_spec.rb
363
290
  - spec/spec_tests/corpus_legacy_spec.rb
checksums.yaml.gz.sig DELETED
Binary file
data/spec/shared/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright (c) 2020 MongoDB, Inc.
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- desired_version, arch = ARGV
4
- if arch.nil?
5
- STDERR.puts "Usage: get-mongodb-download-url desired-version arch"
6
- exit 1
7
- end
8
-
9
- $: << File.join(File.dirname(__FILE__), '../lib')
10
- require 'mrss/server_version_registry'
11
-
12
- begin
13
- puts Mrss::ServerVersionRegistry.new(desired_version, arch).download_url
14
- rescue Mrss::ServerVersionRegistry::Error => exc
15
- STDERR.puts "Error: #{exc}"
16
- exit 2
17
- end
@@ -1,45 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
- require 'aws-sdk-s3'
5
-
6
- options = {}
7
- OptionParser.new do |opts|
8
- opts.banner = "Usage: s3-copy options"
9
-
10
- opts.on("-r", "--region=REGION", "AWS region to use (default us-east-1)") do |v|
11
- options[:region] = v
12
- end
13
-
14
- opts.on("-p", "--param=KEY=VALUE", "Specify parameter for new files") do |v|
15
- options[:params] ||= {}
16
- k, v = v.split('=', 2)
17
- options[:params][k.to_sym] = v
18
- end
19
-
20
- opts.on("-f", "--from=BUCKET:PATH", "Bucket name and key (or path) to copy from") do |v|
21
- options[:from] = v
22
- end
23
-
24
- opts.on("-t", "--to=BUCKET:PATH", "Bucket name and key (or path) to write to (may be specified more than once)") do |v|
25
- options[:to] ||= []
26
- options[:to] << v
27
- end
28
- end.parse!
29
-
30
- ENV['AWS_REGION'] ||= options[:region] || 'us-east-1'
31
-
32
- bucket, key = options.fetch(:from).split(':', 2)
33
-
34
- s3 = Aws::S3::Client.new
35
-
36
- options.fetch(:to).each do |dest|
37
- STDERR.puts "Copying to #{dest}"
38
- dbucket, dkey = dest.split(':', 2)
39
- s3.copy_object(
40
- bucket: dbucket,
41
- key: dkey,
42
- copy_source: "/#{bucket}/#{key}",
43
- **options[:params] || {},
44
- )
45
- end
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
- require 'aws-sdk-s3'
5
-
6
- options = {}
7
- OptionParser.new do |opts|
8
- opts.banner = "Usage: s3-upload options"
9
-
10
- opts.on("-r", "--region=REGION", "AWS region to use (default us-east-1)") do |v|
11
- options[:region] = v
12
- end
13
-
14
- opts.on("-p", "--param=KEY=VALUE", "Specify parameter for S3 upload") do |v|
15
- options[:params] ||= {}
16
- k, v = v.split('=', 2)
17
- options[:params][k.to_sym] = v
18
- end
19
-
20
- opts.on("-f", "--file=PATH", "Path to the file to upload, - to upload standard input") do |v|
21
- options[:file] = v
22
- end
23
-
24
- opts.on("-w", "--write=BUCKET:PATH", "Bucket name and key (or path) to upload to") do |v|
25
- options[:write] = v
26
- end
27
-
28
- opts.on("-c", "--copy=BUCKET:PATH", "Bucket name and key (or path) to copy to (may be specified more than once)") do |v|
29
- options[:copy] ||= []
30
- options[:copy] << v
31
- end
32
- end.parse!
33
-
34
- ENV['AWS_REGION'] ||= options[:region] || 'us-east-1'
35
-
36
- def upload(f, options)
37
- s3 = Aws::S3::Client.new
38
- write = options.fetch(:write)
39
- STDERR.puts "Writing #{write}"
40
- bucket, key = write.split(':', 2)
41
- s3.put_object(
42
- body: f.read,
43
- bucket: bucket,
44
- key: key,
45
- **options[:params] || {},
46
- )
47
- if copy = options[:copy]
48
- copy.each do |dest|
49
- STDERR.puts "Copying to #{dest}"
50
- dbucket, dkey = dest.split(':', 2)
51
- s3.copy_object(
52
- bucket: dbucket,
53
- key: dkey,
54
- copy_source: "/#{bucket}/#{key}",
55
- **options[:params] || {},
56
- )
57
- end
58
- end
59
- end
60
-
61
- if options[:file] == '-'
62
- upload(STDIN, options)
63
- elsif options[:file]
64
- File.open(options[:file]) do |f|
65
- upload(f, options)
66
- end
67
- else
68
- upload(STDIN, options)
69
- end
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- autoload :ChildProcess, 'childprocess'
5
- autoload :Tempfile, 'tempfile'
6
-
7
- module Mrss
8
- module ChildProcessHelper
9
- class SpawnError < StandardError; end
10
-
11
- module_function def call(cmd, env: nil, cwd: nil)
12
- process = ChildProcess.new(*cmd)
13
- process.io.inherit!
14
- if cwd
15
- process.cwd = cwd
16
- end
17
- if env
18
- env.each do |k, v|
19
- process.environment[k.to_s] = v
20
- end
21
- end
22
- process.start
23
- process.wait
24
- process
25
- end
26
-
27
- module_function def check_call(cmd, env: nil, cwd: nil)
28
- process = call(cmd, env: env, cwd: cwd)
29
- unless process.exit_code == 0
30
- raise SpawnError, "Failed to execute: #{cmd}"
31
- end
32
- end
33
-
34
- module_function def get_output(cmd, env: nil, cwd: nil)
35
- process = ChildProcess.new(*cmd)
36
- process.io.inherit!
37
- if cwd
38
- process.cwd = cwd
39
- end
40
- if env
41
- env.each do |k, v|
42
- process.environment[k.to_s] = v
43
- end
44
- end
45
-
46
- output = ''
47
- r, w = IO.pipe
48
-
49
- begin
50
- process.io.stdout = w
51
- process.start
52
- w.close
53
-
54
- thread = Thread.new do
55
- begin
56
- loop do
57
- output << r.readpartial(16384)
58
- end
59
- rescue EOFError
60
- end
61
- end
62
-
63
- process.wait
64
- thread.join
65
- ensure
66
- r.close
67
- end
68
-
69
- [process, output]
70
- end
71
-
72
- module_function def check_output(*args)
73
- process, output = get_output(*args)
74
- unless process.exit_code == 0
75
- raise SpawnError,"Failed to execute: #{args}"
76
- end
77
- output
78
- end
79
- end
80
- end