mongoid 8.0.7 → 8.0.9

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.
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