mongoid 8.0.7 → 8.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +65 -41
  3. data/lib/mongoid/association/accessors.rb +5 -1
  4. data/lib/mongoid/association/eager_loadable.rb +3 -0
  5. data/lib/mongoid/atomic.rb +9 -7
  6. data/lib/mongoid/config.rb +10 -0
  7. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -1
  8. data/lib/mongoid/document.rb +8 -1
  9. data/lib/mongoid/fields.rb +11 -6
  10. data/lib/mongoid/interceptable.rb +10 -8
  11. data/lib/mongoid/timestamps/created.rb +8 -1
  12. data/lib/mongoid/traversable.rb +12 -0
  13. data/lib/mongoid/validatable/associated.rb +98 -17
  14. data/lib/mongoid/validatable.rb +8 -0
  15. data/lib/mongoid/version.rb +1 -1
  16. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +40 -0
  17. data/spec/integration/callbacks_models.rb +37 -0
  18. data/spec/integration/callbacks_spec.rb +27 -0
  19. data/spec/mongoid/association/eager_spec.rb +24 -2
  20. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -0
  21. data/spec/mongoid/association_spec.rb +60 -0
  22. data/spec/mongoid/document_spec.rb +27 -0
  23. data/spec/mongoid/interceptable_spec.rb +100 -0
  24. data/spec/mongoid/interceptable_spec_models.rb +51 -111
  25. data/spec/mongoid/serializable_spec.rb +14 -14
  26. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  27. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  28. data/spec/support/models/name.rb +10 -0
  29. metadata +4 -80
  30. checksums.yaml.gz.sig +0 -0
  31. data/spec/shared/LICENSE +0 -20
  32. data/spec/shared/bin/get-mongodb-download-url +0 -17
  33. data/spec/shared/bin/s3-copy +0 -45
  34. data/spec/shared/bin/s3-upload +0 -69
  35. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  36. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  37. data/spec/shared/lib/mrss/constraints.rb +0 -378
  38. data/spec/shared/lib/mrss/docker_runner.rb +0 -298
  39. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  40. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  41. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  42. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  43. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  44. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  45. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  46. data/spec/shared/lib/mrss/utils.rb +0 -37
  47. data/spec/shared/share/Dockerfile.erb +0 -321
  48. data/spec/shared/share/haproxy-1.conf +0 -16
  49. data/spec/shared/share/haproxy-2.conf +0 -17
  50. data/spec/shared/shlib/config.sh +0 -27
  51. data/spec/shared/shlib/distro.sh +0 -74
  52. data/spec/shared/shlib/server.sh +0 -416
  53. data/spec/shared/shlib/set_env.sh +0 -169
  54. data.tar.gz.sig +0 -4
  55. metadata.gz.sig +0 -0
@@ -37,12 +37,18 @@ describe Mongoid::Validatable::AssociatedValidator do
37
37
  User.new(name: "test")
38
38
  end
39
39
 
40
- let(:description) do
40
+ let(:description1) do
41
+ Description.new
42
+ end
43
+
44
+ let(:description2) do
41
45
  Description.new
42
46
  end
43
47
 
44
48
  before do
45
- user.descriptions << description
49
+ user.descriptions << description1
50
+ user.descriptions << description2
51
+ user.valid?
46
52
  end
47
53
 
48
54
  it "only validates the parent once" do
@@ -50,12 +56,16 @@ describe Mongoid::Validatable::AssociatedValidator do
50
56
  end
51
57
 
52
58
  it "adds the errors from the relation" do
53
- user.valid?
54
59
  expect(user.errors[:descriptions]).to_not be_nil
55
60
  end
56
61
 
62
+ it 'reports all failed validations' do
63
+ errors = user.descriptions.flat_map { |d| d.errors[:details] }
64
+ expect(errors.length).to be == 2
65
+ end
66
+
57
67
  it "only validates the child once" do
58
- expect(description).to_not be_valid
68
+ expect(description1).to_not be_valid
59
69
  end
60
70
  end
61
71
 
@@ -75,7 +85,6 @@ describe Mongoid::Validatable::AssociatedValidator do
75
85
  end
76
86
 
77
87
  it "does not run validation on them" do
78
- expect(description).to receive(:valid?).never
79
88
  expect(user).to be_valid
80
89
  end
81
90
 
@@ -84,14 +93,14 @@ describe Mongoid::Validatable::AssociatedValidator do
84
93
  end
85
94
  end
86
95
 
87
- describe "#validate_each" do
96
+ describe "#validate" do
88
97
 
89
98
  let(:person) do
90
99
  Person.new
91
100
  end
92
101
 
93
102
  let(:validator) do
94
- described_class.new(attributes: person.attributes)
103
+ described_class.new(attributes: person.relations.keys)
95
104
  end
96
105
 
97
106
  context "when the association is a one to one" do
@@ -99,7 +108,7 @@ describe Mongoid::Validatable::AssociatedValidator do
99
108
  context "when the association is nil" do
100
109
 
101
110
  before do
102
- validator.validate_each(person, :name, nil)
111
+ validator.validate(person)
103
112
  end
104
113
 
105
114
  it "adds no errors" do
@@ -108,14 +117,9 @@ describe Mongoid::Validatable::AssociatedValidator do
108
117
  end
109
118
 
110
119
  context "when the association is valid" do
111
-
112
- let(:associated) do
113
- double(valid?: true, flagged_for_destroy?: false)
114
- end
115
-
116
120
  before do
117
- expect(associated).to receive(:validated?).and_return(false)
118
- validator.validate_each(person, :name, associated)
121
+ person.name = Name.new(first_name: 'A', last_name: 'B')
122
+ validator.validate(person)
119
123
  end
120
124
 
121
125
  it "adds no errors" do
@@ -125,13 +129,9 @@ describe Mongoid::Validatable::AssociatedValidator do
125
129
 
126
130
  context "when the association is invalid" do
127
131
 
128
- let(:associated) do
129
- double(valid?: false, flagged_for_destroy?: false)
130
- end
131
-
132
132
  before do
133
- expect(associated).to receive(:validated?).and_return(false)
134
- validator.validate_each(person, :name, associated)
133
+ person.name = Name.new(first_name: 'Jamis', last_name: 'Buck')
134
+ validator.validate(person)
135
135
  end
136
136
 
137
137
  it "adds errors to the parent document" do
@@ -149,7 +149,7 @@ describe Mongoid::Validatable::AssociatedValidator do
149
149
  context "when the association is empty" do
150
150
 
151
151
  before do
152
- validator.validate_each(person, :addresses, [])
152
+ validator.validate(person)
153
153
  end
154
154
 
155
155
  it "adds no errors" do
@@ -159,13 +159,9 @@ describe Mongoid::Validatable::AssociatedValidator do
159
159
 
160
160
  context "when the association has invalid documents" do
161
161
 
162
- let(:associated) do
163
- double(valid?: false, flagged_for_destroy?: false)
164
- end
165
-
166
162
  before do
167
- expect(associated).to receive(:validated?).and_return(false)
168
- validator.validate_each(person, :addresses, [ associated ])
163
+ person.addresses << Address.new(street: '123')
164
+ validator.validate(person)
169
165
  end
170
166
 
171
167
  it "adds errors to the parent document" do
@@ -175,13 +171,10 @@ describe Mongoid::Validatable::AssociatedValidator do
175
171
 
176
172
  context "when the association has all valid documents" do
177
173
 
178
- let(:associated) do
179
- double(valid?: true, flagged_for_destroy?: false)
180
- end
181
-
182
174
  before do
183
- expect(associated).to receive(:validated?).and_return(false)
184
- validator.validate_each(person, :addresses, [ associated ])
175
+ person.addresses << Address.new(street: '123 First St')
176
+ person.addresses << Address.new(street: '456 Second St')
177
+ validator.validate(person)
185
178
  end
186
179
 
187
180
  it "adds no errors" do
@@ -4,6 +4,8 @@ class Name
4
4
  include Mongoid::Document
5
5
  include Mongoid::Attributes::Dynamic
6
6
 
7
+ validate :is_not_jamis
8
+
7
9
  field :_id, type: String, overwrite: true, default: ->{
8
10
  "#{first_name}-#{last_name}"
9
11
  }
@@ -23,4 +25,12 @@ class Name
23
25
  def set_parent=(set = false)
24
26
  self.parent_title = namable.title if set
25
27
  end
28
+
29
+ private
30
+
31
+ def is_not_jamis
32
+ if first_name == 'Jamis' && last_name == 'Buck'
33
+ errors.add(:base, :invalid)
34
+ end
35
+ end
26
36
  end
metadata CHANGED
@@ -1,41 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.7
4
+ version: 8.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - The MongoDB Ruby Team
8
- autorequire:
9
8
  bindir: bin
10
- cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMREwDwYDVQQDDAhkYngt
14
- cnVieTEXMBUGCgmSJomT8ixkARkWB21vbmdvZGIxEzARBgoJkiaJk/IsZAEZFgNj
15
- b20wHhcNMjMwMTMxMTE1NjM1WhcNMjQwMTMxMTE1NjM1WjBBMREwDwYDVQQDDAhk
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
- MBaBFGRieC1ydWJ5QG1vbmdvZGIuY29tMA0GCSqGSIb3DQEBCwUAA4IBgQAVSlgM
29
- nFDWCCNLOCqG5/Lj4U62XoALkdCI+OZ30+WrA8qiRLSL9ZEziVK9AV7ylez+sriQ
30
- m8XKZKsCN5ON4+zXw1S+6Ftz/R4zDg7nTb9Wgw8ibzsoiP6e4pRW3Fls3ZdaG4pW
31
- +qMTbae9OiSrgI2bxNTII+v+1FcbQjOlMu8HPZ3ZfXnurXPgN5GxSyyclZI1QONO
32
- HbUoKHRirZu0F7JCvQQq4EkSuLWPplRJfYEeJIYm05zhhFeEyqea2B/TTlCtXa42
33
- 84vxXsxGzumuO8F2Q9m6/p95sNhqCp0B/SkKXIrRGJ7FBzupoORNRXHviS2OC3ty
34
- 4lwUzOlLTF/yO0wwYYfmtQOALQwKnW838vbYthMXvTjxB0EgVZ5PKto99WbjsXzy
35
- wkeAWhd5b+5JS0zgDL4SvGB8/W2IY+y0zELkojBMgJPyrpAWHL/WSsSBMuhyI2Pv
36
- xxaBVLklnJJ/qCCOZ3lG2MyVc/Nb0Mmq8ygWNsfwHmKKYuuWcviit0D0Tek=
37
- -----END CERTIFICATE-----
38
- date: 2023-10-23 00:00:00.000000000 Z
9
+ cert_chain: []
10
+ date: 2025-01-29 00:00:00.000000000 Z
39
11
  dependencies:
40
12
  - !ruby/object:Gem::Dependency
41
13
  name: activemodel
@@ -858,29 +830,6 @@ files:
858
830
  - spec/mongoid_spec.rb
859
831
  - spec/rails/controller_extension/controller_runtime_spec.rb
860
832
  - spec/rails/mongoid_spec.rb
861
- - spec/shared/LICENSE
862
- - spec/shared/bin/get-mongodb-download-url
863
- - spec/shared/bin/s3-copy
864
- - spec/shared/bin/s3-upload
865
- - spec/shared/lib/mrss/child_process_helper.rb
866
- - spec/shared/lib/mrss/cluster_config.rb
867
- - spec/shared/lib/mrss/constraints.rb
868
- - spec/shared/lib/mrss/docker_runner.rb
869
- - spec/shared/lib/mrss/eg_config_utils.rb
870
- - spec/shared/lib/mrss/event_subscriber.rb
871
- - spec/shared/lib/mrss/lite_constraints.rb
872
- - spec/shared/lib/mrss/server_version_registry.rb
873
- - spec/shared/lib/mrss/session_registry.rb
874
- - spec/shared/lib/mrss/session_registry_legacy.rb
875
- - spec/shared/lib/mrss/spec_organizer.rb
876
- - spec/shared/lib/mrss/utils.rb
877
- - spec/shared/share/Dockerfile.erb
878
- - spec/shared/share/haproxy-1.conf
879
- - spec/shared/share/haproxy-2.conf
880
- - spec/shared/shlib/config.sh
881
- - spec/shared/shlib/distro.sh
882
- - spec/shared/shlib/server.sh
883
- - spec/shared/shlib/set_env.sh
884
833
  - spec/spec_helper.rb
885
834
  - spec/support/authorization.rb
886
835
  - spec/support/client_registry.rb
@@ -1163,7 +1112,6 @@ metadata:
1163
1112
  documentation_uri: https://docs.mongodb.com/mongoid/
1164
1113
  homepage_uri: https://mongoid.org/
1165
1114
  source_code_uri: https://github.com/mongodb/mongoid
1166
- post_install_message:
1167
1115
  rdoc_options: []
1168
1116
  require_paths:
1169
1117
  - lib
@@ -1178,8 +1126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1178
1126
  - !ruby/object:Gem::Version
1179
1127
  version: 1.3.6
1180
1128
  requirements: []
1181
- rubygems_version: 3.4.21
1182
- signing_key:
1129
+ rubygems_version: 3.6.3
1183
1130
  specification_version: 4
1184
1131
  summary: Elegant Persistence in Ruby for MongoDB.
1185
1132
  test_files:
@@ -1573,29 +1520,6 @@ test_files:
1573
1520
  - spec/mongoid_spec.rb
1574
1521
  - spec/rails/controller_extension/controller_runtime_spec.rb
1575
1522
  - spec/rails/mongoid_spec.rb
1576
- - spec/shared/LICENSE
1577
- - spec/shared/bin/get-mongodb-download-url
1578
- - spec/shared/bin/s3-copy
1579
- - spec/shared/bin/s3-upload
1580
- - spec/shared/lib/mrss/child_process_helper.rb
1581
- - spec/shared/lib/mrss/cluster_config.rb
1582
- - spec/shared/lib/mrss/constraints.rb
1583
- - spec/shared/lib/mrss/docker_runner.rb
1584
- - spec/shared/lib/mrss/eg_config_utils.rb
1585
- - spec/shared/lib/mrss/event_subscriber.rb
1586
- - spec/shared/lib/mrss/lite_constraints.rb
1587
- - spec/shared/lib/mrss/server_version_registry.rb
1588
- - spec/shared/lib/mrss/session_registry.rb
1589
- - spec/shared/lib/mrss/session_registry_legacy.rb
1590
- - spec/shared/lib/mrss/spec_organizer.rb
1591
- - spec/shared/lib/mrss/utils.rb
1592
- - spec/shared/share/Dockerfile.erb
1593
- - spec/shared/share/haproxy-1.conf
1594
- - spec/shared/share/haproxy-2.conf
1595
- - spec/shared/shlib/config.sh
1596
- - spec/shared/shlib/distro.sh
1597
- - spec/shared/shlib/server.sh
1598
- - spec/shared/shlib/set_env.sh
1599
1523
  - spec/spec_helper.rb
1600
1524
  - spec/support/authorization.rb
1601
1525
  - spec/support/client_registry.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