mongoid 7.3.4 → 7.3.5

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: 8bbeda0aba58b991964f1d6c687a8120cdeac497c9fbeef7b376386470519b6d
4
- data.tar.gz: 4d3d62eef06a3d4502e5b846a6d38905f8bdca608598a1fb3e04945d364589d8
3
+ metadata.gz: efce0ba93d948e87b85aa1a6e1a0768ecb2bd17a052d5e34afb426c357391492
4
+ data.tar.gz: 39784e3b229e457971b79962c26e22f3f1e721c68d72268bdafafa821c245c80
5
5
  SHA512:
6
- metadata.gz: f8e5502f46048cd2f726aad05b44de638e6c3af5d3de59c33625fa0c5de6b4f8099155e643273afe17f2678239c52f2ffd3412587a6c23067ce1804eb2849c89
7
- data.tar.gz: c84fd0380200bcb1c13fb49e3baa6c095670657fdcf6cfbd60f422448327faf37bdc43f9ac5334fcf96a883ed70bb9be9c42430b06f357a98e393ef2cec77efc
6
+ metadata.gz: f690e5ca59dfdf1e658ac922c5e8c0e0de1bef099f005205cab26b4e27922ce82b64dae38e803673b32e73f9327746562548c3f9667a4d3fd275483729e6ff3d
7
+ data.tar.gz: b87aef76b5145507b5e48f8516f4b27b99f401d7afb2fa56441d1d47540eac6f3f7bf198fadfd995e9fc08b0563727b6a5c4f7ce5014456e0dd4a6d345cdf3bb
checksums.yaml.gz.sig CHANGED
Binary file
@@ -82,7 +82,8 @@ module Mongoid
82
82
  def batch_replace(docs)
83
83
  if docs.blank?
84
84
  if _assigning? && !empty?
85
- _base.delayed_atomic_sets.clear
85
+ _base.delayed_atomic_sets.delete(path)
86
+ clear_atomic_path_cache
86
87
  _base.add_atomic_unset(first)
87
88
  target_duplicate = _target.dup
88
89
  pre_process_batch_remove(target_duplicate, :delete)
@@ -94,7 +95,8 @@ module Mongoid
94
95
  _base.delayed_atomic_sets.clear unless _assigning?
95
96
  docs = normalize_docs(docs).compact
96
97
  _target.clear and _unscoped.clear
97
- _base.delayed_atomic_unsets.clear
98
+ _base.delayed_atomic_unsets.delete(path)
99
+ clear_atomic_path_cache
98
100
  inserts = execute_batch_set(docs)
99
101
  add_atomic_sets(inserts)
100
102
  end
@@ -252,7 +254,22 @@ module Mongoid
252
254
  #
253
255
  # @since 3.0.0
254
256
  def path
255
- @path ||= _unscoped.first.atomic_path
257
+ @path ||= if _unscoped.empty?
258
+ Mongoid::Atomic::Paths::Embedded::Many.position_without_document(_base, _association)
259
+ else
260
+ _unscoped.first.atomic_path
261
+ end
262
+ end
263
+
264
+ # Clear the cache for path and atomic_paths. This method is used when
265
+ # the path method is used, and the association has not been set on the
266
+ # document yet, which can cause path and atomic_paths to be calculated
267
+ # incorrectly later.
268
+ #
269
+ # @api private
270
+ def clear_atomic_path_cache
271
+ self.path = nil
272
+ _base.instance_variable_set("@atomic_paths", nil)
256
273
  end
257
274
 
258
275
  # Set the atomic path.
@@ -506,8 +506,8 @@ module Mongoid
506
506
  selector = conditions || {}
507
507
  removed = klass.send(method, selector.merge!(criteria.selector))
508
508
  _target.delete_if do |doc|
509
- if doc._matches?(selector)
510
- unbind_one(doc) and true
509
+ doc._matches?(selector).tap do |b|
510
+ unbind_one(doc) if b
511
511
  end
512
512
  end
513
513
  removed
@@ -39,6 +39,25 @@ module Mongoid
39
39
  locator = document.new_record? ? "" : ".#{document._index}"
40
40
  "#{pos}#{"." unless pos.blank?}#{document._association.store_as}#{locator}"
41
41
  end
42
+
43
+ class << self
44
+
45
+ # Get the position of where the document would go for the given
46
+ # association. The use case for this function is when trying to
47
+ # persist an empty list for an embedded association. All of the
48
+ # existing functions for getting the position to store a document
49
+ # require passing in a document to store, which we don't have when
50
+ # trying to store the empty list.
51
+ #
52
+ # @param [ Document ] parent The parent document to store in.
53
+ # @param [ Association ] association The association.
54
+ #
55
+ # @return [ String ] The position string.
56
+ def position_without_document(parent, association)
57
+ pos = parent.atomic_position
58
+ "#{pos}#{"." unless pos.blank?}#{association.store_as}"
59
+ end
60
+ end
42
61
  end
43
62
  end
44
63
  end
@@ -55,7 +55,7 @@ module Mongoid
55
55
  # adding them to the existing hash.
56
56
  new_value = selector[field].merge(value)
57
57
  selector.store(field, new_value)
58
- else
58
+ elsif selector[field] != value
59
59
  add_operator_expression('$and', [{field => value}])
60
60
  end
61
61
  else
@@ -23,7 +23,7 @@ module Mongoid
23
23
  # @since 3.0.0
24
24
  def upsert(options = {})
25
25
  prepare_upsert(options) do
26
- collection.find(atomic_selector).update_one(
26
+ collection.find(atomic_selector).replace_one(
27
27
  as_attributes, upsert: true, session: _session)
28
28
  end
29
29
  end
@@ -2,5 +2,5 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  module Mongoid
5
- VERSION = "7.3.4"
5
+ VERSION = "7.3.5"
6
6
  end
@@ -80,8 +80,13 @@ development:
80
80
  # (default: 10)
81
81
  # connect_timeout: 10
82
82
 
83
- # The timeout to wait to execute operations on a socket before raising an error.
84
- # (default: 5)
83
+ # How long to wait for a response for each operation sent to the
84
+ # server. This timeout should be set to a value larger than the
85
+ # processing time for the longest operation that will be executed
86
+ # by the application. Note that this is a client-side timeout;
87
+ # the server may continue executing an operation after the client
88
+ # aborts it with the SocketTimeout exception.
89
+ # (default: nil, meaning no timeout)
85
90
  # socket_timeout: 5
86
91
 
87
92
  # The name of the replica set to connect to. Servers provided as seeds that do
@@ -19,7 +19,14 @@ autoload :Timecop, 'timecop'
19
19
 
20
20
  require 'support/spec_config'
21
21
  require 'mrss/lite_constraints'
22
- require "support/session_registry"
22
+
23
+ if Gem::Version.new(Mongo::VERSION) < Gem::Version.new('2.18.0.alpha')
24
+ require "mrss/session_registry_legacy"
25
+ else
26
+ require "mrss/session_registry"
27
+ end
28
+
29
+ Mrss.patch_mongo_for_session_registry
23
30
 
24
31
  unless SpecConfig.instance.ci?
25
32
  begin
@@ -2,6 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require "spec_helper"
5
+ require_relative '../embeds_many_models.rb'
5
6
 
6
7
  describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
7
8
 
@@ -4400,4 +4401,24 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4400
4401
  end
4401
4402
  end
4402
4403
  end
4404
+
4405
+ context "when using assign_attributes with an already populated array" do
4406
+ let(:post) { EmmPost.create! }
4407
+
4408
+ before do
4409
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'a'}],
4410
+ user_tags: [{id: BSON::ObjectId.new, title: 'b'}])
4411
+ post.save!
4412
+ post.reload
4413
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'c'}],
4414
+ user_tags: [])
4415
+ post.save!
4416
+ post.reload
4417
+ end
4418
+
4419
+ it "has the correct embedded documents" do
4420
+ expect(post.company_tags.length).to eq(1)
4421
+ expect(post.company_tags.first.title).to eq("c")
4422
+ end
4423
+ end
4403
4424
  end
@@ -52,3 +52,140 @@ class EmmProduct
52
52
 
53
53
  field :name, type: String
54
54
  end
55
+
56
+ class EmmInner
57
+ include Mongoid::Document
58
+
59
+ embeds_many :friends, :class_name => self.name, :cyclic => true
60
+ embedded_in :parent, :class_name => self.name, :cyclic => true
61
+
62
+ field :level, :type => Integer
63
+ end
64
+
65
+ class EmmOuter
66
+ include Mongoid::Document
67
+ embeds_many :inners, class_name: 'EmmInner'
68
+
69
+ field :level, :type => Integer
70
+ end
71
+
72
+ class EmmCustomerAddress
73
+ include Mongoid::Document
74
+
75
+ embedded_in :addressable, polymorphic: true, inverse_of: :work_address
76
+ end
77
+
78
+ class EmmFriend
79
+ include Mongoid::Document
80
+
81
+ embedded_in :befriendable, polymorphic: true
82
+ end
83
+
84
+ class EmmCustomer
85
+ include Mongoid::Document
86
+
87
+ embeds_one :home_address, class_name: 'EmmCustomerAddress', as: :addressable
88
+ embeds_one :work_address, class_name: 'EmmCustomerAddress', as: :addressable
89
+
90
+ embeds_many :close_friends, class_name: 'EmmFriend', as: :befriendable
91
+ embeds_many :acquaintances, class_name: 'EmmFriend', as: :befriendable
92
+ end
93
+
94
+ class EmmUser
95
+ include Mongoid::Document
96
+ include Mongoid::Timestamps
97
+
98
+ embeds_many :orders, class_name: 'EmmOrder'
99
+ end
100
+
101
+ class EmmOrder
102
+ include Mongoid::Document
103
+
104
+ field :amount, type: Integer
105
+
106
+ embedded_in :user, class_name: 'EmmUser'
107
+ end
108
+
109
+ module EmmSpec
110
+ # There is also a top-level Car class defined.
111
+ class Car
112
+ include Mongoid::Document
113
+
114
+ embeds_many :doors
115
+ end
116
+
117
+ class Door
118
+ include Mongoid::Document
119
+
120
+ embedded_in :car
121
+ end
122
+
123
+ class Tank
124
+ include Mongoid::Document
125
+
126
+ embeds_many :guns
127
+ embeds_many :emm_turrets
128
+ # This association references a model that is not in our module,
129
+ # and it does not define class_name hence Mongoid will not be able to
130
+ # figure out the inverse for this association.
131
+ embeds_many :emm_hatches
132
+
133
+ # class_name is intentionally unqualified, references a class in the
134
+ # same module. Rails permits class_name to be unqualified like this.
135
+ embeds_many :launchers, class_name: 'Launcher'
136
+ end
137
+
138
+ class Gun
139
+ include Mongoid::Document
140
+
141
+ embedded_in :tank
142
+ end
143
+
144
+ class Launcher
145
+ include Mongoid::Document
146
+
147
+ # class_name is intentionally unqualified.
148
+ embedded_in :tank, class_name: 'Tank'
149
+ end
150
+ end
151
+
152
+ # This is intentionally on top level.
153
+ class EmmTurret
154
+ include Mongoid::Document
155
+
156
+ embedded_in :tank, class_name: 'EmmSpec::Tank'
157
+ end
158
+
159
+ # This is intentionally on top level.
160
+ class EmmHatch
161
+ include Mongoid::Document
162
+
163
+ # No :class_name option on this association intentionally.
164
+ embedded_in :tank
165
+ end
166
+
167
+ class EmmPost
168
+ include Mongoid::Document
169
+
170
+ embeds_many :company_tags, class_name: "EmmCompanyTag"
171
+ embeds_many :user_tags, class_name: "EmmUserTag"
172
+ end
173
+
174
+
175
+ class EmmCompanyTag
176
+ include Mongoid::Document
177
+
178
+ field :title, type: String
179
+
180
+ embedded_in :post, class_name: "EmmPost"
181
+ end
182
+
183
+
184
+ class EmmUserTag
185
+ include Mongoid::Document
186
+
187
+ field :title, type: String
188
+
189
+ embedded_in :post, class_name: "EmmPost"
190
+ end
191
+
@@ -2395,6 +2395,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2395
2395
  it "removes the ids from the foreign key" do
2396
2396
  expect(person.preference_ids).to eq([ preference_two.id ])
2397
2397
  end
2398
+
2399
+ it "sets the association locally" do
2400
+ expect(person.preferences).to eq([preference_two])
2401
+ end
2398
2402
  end
2399
2403
 
2400
2404
  context "when conditions are not provided" do
@@ -2421,6 +2425,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2421
2425
  it "returns the number of documents deleted" do
2422
2426
  expect(deleted).to eq(2)
2423
2427
  end
2428
+
2429
+ it "sets the association locally" do
2430
+ expect(person.preferences).to eq([])
2431
+ end
2424
2432
  end
2425
2433
  end
2426
2434
  end
@@ -2214,10 +2214,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2214
2214
  Person.create(username: 'durran')
2215
2215
  end
2216
2216
 
2217
- before do
2218
- person.posts.create(title: "Testing")
2219
- person.posts.create(title: "Test")
2220
- end
2217
+ let!(:post1) { person.posts.create!(title: "Testing") }
2218
+ let!(:post2) { person.posts.create!(title: "Test") }
2221
2219
 
2222
2220
  it "removes the correct posts" do
2223
2221
  person.posts.send(method, { title: "Testing" })
@@ -2233,6 +2231,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2233
2231
  it "returns the number of documents deleted" do
2234
2232
  expect(person.posts.send(method, { title: "Testing" })).to eq(1)
2235
2233
  end
2234
+
2235
+ it "sets the association locally" do
2236
+ person.posts.send(method, { title: "Testing" })
2237
+ expect(person.posts).to eq([post2])
2238
+ end
2236
2239
  end
2237
2240
 
2238
2241
  context "when conditions are not provided" do
@@ -2259,6 +2262,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2259
2262
  it "returns the number of documents deleted" do
2260
2263
  expect(person.posts.send(method)).to eq(2)
2261
2264
  end
2265
+
2266
+ it "sets the association locally" do
2267
+ person.posts.send(method)
2268
+ expect(person.posts).to eq([])
2269
+ end
2262
2270
  end
2263
2271
  end
2264
2272
 
@@ -2270,10 +2278,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2270
2278
  Movie.create(title: "Bladerunner")
2271
2279
  end
2272
2280
 
2273
- before do
2274
- movie.ratings.create(value: 1)
2275
- movie.ratings.create(value: 2)
2276
- end
2281
+ let!(:rating1) { movie.ratings.create!(value: 1) }
2282
+ let!(:rating2) { movie.ratings.create!(value: 2) }
2277
2283
 
2278
2284
  it "removes the correct ratings" do
2279
2285
  movie.ratings.send(method, { value: 1 })
@@ -2288,6 +2294,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2288
2294
  it "returns the number of documents deleted" do
2289
2295
  expect(movie.ratings.send(method, { value: 1 })).to eq(1)
2290
2296
  end
2297
+
2298
+ it "sets the association locally" do
2299
+ movie.ratings.send(method, { value: 1 })
2300
+ expect(movie.ratings).to eq([rating2])
2301
+ end
2291
2302
  end
2292
2303
 
2293
2304
  context "when conditions are not provided" do
@@ -2314,6 +2325,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2314
2325
  it "returns the number of documents deleted" do
2315
2326
  expect(movie.ratings.send(method)).to eq(2)
2316
2327
  end
2328
+
2329
+ it "sets the association locally" do
2330
+ movie.ratings.send(method)
2331
+ expect(movie.ratings).to eq([])
2332
+ end
2317
2333
  end
2318
2334
  end
2319
2335
  end
@@ -3490,6 +3490,38 @@ describe Mongoid::Criteria do
3490
3490
  'foo' => 1, '$and' => [{'foo' => 2}], 'bar' => 3)
3491
3491
  end
3492
3492
  end
3493
+
3494
+ context "when duplicating where conditions" do
3495
+ let(:criteria) { Sound.where(active: true).where(active: true) }
3496
+
3497
+ it 'does not duplicate criteria' do
3498
+ expect(criteria.selector).to eq('active' => true)
3499
+ end
3500
+ end
3501
+
3502
+ context "when duplicating where conditions with different values" do
3503
+ let(:criteria) { Sound.where(active: true).where(active: false).where(active: true).where(active: false) }
3504
+
3505
+ it 'does not duplicate criteria' do
3506
+ expect(criteria.selector).to eq(
3507
+ 'active' => true, '$and' => [{'active' => false}])
3508
+ end
3509
+ end
3510
+
3511
+ # Used to test MONGOID-5251 where the find command was adding unnecessary
3512
+ # and clauses. Since the find command creates the criteria and executes it,
3513
+ # it is difficult to analyze the criteria used. For this reason, I have
3514
+ # extracted the crux of the issue, adding an _id to the the criteria twice,
3515
+ # and used that for the test case.
3516
+ context "when searching by _id twice" do
3517
+ let(:_id) { BSON::ObjectId.new }
3518
+ let(:criteria) { Band.where(_id: _id) }
3519
+ let(:dup_criteria) { criteria.where(_id: _id)}
3520
+
3521
+ it "does not duplicate the criteria" do
3522
+ expect(dup_criteria.selector).to eq({ "_id" => _id })
3523
+ end
3524
+ end
3493
3525
  end
3494
3526
 
3495
3527
  describe "#for_js" do
@@ -17,11 +17,11 @@ describe Mongoid::QueryCache do
17
17
  # occur only within the scope of these tests.
18
18
  #
19
19
  # Other session leaks will be detected and addressed as part of RUBY-2391.
20
- SessionRegistry.instance.clear_registry
20
+ Mrss::SessionRegistry.instance.clear_registry
21
21
  end
22
22
 
23
23
  after do
24
- SessionRegistry.instance.verify_sessions_ended!
24
+ Mrss::SessionRegistry.instance.verify_sessions_ended!
25
25
  end
26
26
 
27
27
  let(:reset_legacy_qc_warning) do
@@ -111,6 +111,17 @@ describe Mongoid::Scopable do
111
111
  expect(Band).to be_default_scoping
112
112
  end
113
113
  end
114
+
115
+ context "when parent class has default scope" do
116
+
117
+ let (:selector) do
118
+ AudibleSound.all.selector
119
+ end
120
+
121
+ it "the subclass doesn't duplicate the default scope in the selector" do
122
+ expect(selector).to eq({'active' => true})
123
+ end
124
+ end
114
125
  end
115
126
 
116
127
  describe ".default_scopable?" do
@@ -209,7 +209,12 @@ module Mrss
209
209
  @server_version = build_info['version']
210
210
  @enterprise = build_info['modules'] && build_info['modules'].include?('enterprise')
211
211
 
212
- @server_parameters = client.use(:admin).command(getParameter: '*').first
212
+ @server_parameters = begin
213
+ client.use(:admin).command(getParameter: '*').first
214
+ rescue => e
215
+ STDERR.puts("WARNING: Failed to obtain server parameters: #{e.class}: #{e.message}")
216
+ {}
217
+ end
213
218
 
214
219
  if !sharded_ish? && short_server_version >= '3.4'
215
220
  rv = @server_parameters['featureCompatibilityVersion']
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'singleton'
5
+
6
+ module Mrss
7
+
8
+ def self.patch_mongo_for_session_registry
9
+
10
+ Mongo::Client.class_eval do
11
+ alias :get_session_without_tracking :get_session
12
+
13
+ def get_session(options = {})
14
+ get_session_without_tracking(options).tap do |session|
15
+ SessionRegistry.instance.register(session) if session&.materialized?
16
+ end
17
+ end
18
+ end
19
+
20
+ Mongo::Session.class_eval do
21
+ alias :end_session_without_tracking :end_session
22
+
23
+ def end_session
24
+ SessionRegistry.instance.unregister(self)
25
+ end_session_without_tracking
26
+ end
27
+
28
+ alias :materialize_if_needed_without_tracking :materialize_if_needed
29
+
30
+ def materialize_if_needed
31
+ materialize_if_needed_without_tracking.tap do
32
+ SessionRegistry.instance.register(self)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ module Mrss
40
+ class SessionRegistry
41
+ include Singleton
42
+
43
+ def initialize
44
+ @registry = {}
45
+ end
46
+
47
+ def register(session)
48
+ @registry[session.session_id] = session if session
49
+ end
50
+
51
+ def unregister(session)
52
+ return if session.ended? || !session.materialized?
53
+ @registry.delete(session.session_id)
54
+ end
55
+
56
+ def verify_sessions_ended!
57
+ @registry.delete_if { |_, session| session.ended? }
58
+
59
+ unless @registry.empty?
60
+ sessions = @registry.map { |_, session| session }
61
+ raise "Session registry contains live sessions: #{sessions.join(', ')}"
62
+ end
63
+ end
64
+
65
+ def clear_registry
66
+ @registry = {}
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'singleton'
5
+
6
+ module Mrss
7
+
8
+ def self.patch_mongo_for_session_registry
9
+
10
+ Mongo::Client.class_eval do
11
+ alias :get_session_without_tracking :get_session
12
+
13
+ def get_session(options = {})
14
+ get_session_without_tracking(options).tap do |session|
15
+ SessionRegistry.instance.register(session)
16
+ end
17
+ end
18
+ end
19
+
20
+ Mongo::Session.class_eval do
21
+ alias :end_session_without_tracking :end_session
22
+
23
+ def end_session
24
+ SessionRegistry.instance.unregister(self)
25
+ end_session_without_tracking
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module Mrss
32
+ class SessionRegistry
33
+ include Singleton
34
+
35
+ def initialize
36
+ @registry = {}
37
+ end
38
+
39
+ def register(session)
40
+ @registry[session.session_id] = session if session
41
+ end
42
+
43
+ def unregister(session)
44
+ @registry.delete(session.session_id) unless session.ended?
45
+ end
46
+
47
+ def verify_sessions_ended!
48
+ @registry.delete_if { |_, session| session.ended? }
49
+
50
+ unless @registry.empty?
51
+ sessions = @registry.map { |_, session| session }
52
+ raise "Session registry contains live sessions: #{sessions.join(', ')}"
53
+ end
54
+ end
55
+
56
+ def clear_registry
57
+ @registry = {}
58
+ end
59
+ end
60
+ end
@@ -233,13 +233,13 @@ CFG
233
233
  # Current virtualenv fails with
234
234
  # https://github.com/pypa/virtualenv/issues/1630
235
235
  <% if distro =~ /ubuntu2004/ %>
236
- RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
236
+ RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]==1.5.5'
237
237
  <% else %>
238
- RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
238
+ RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]==1.5.5'
239
239
  <% end %>
240
240
 
241
241
  RUN pip --version && \
242
- pip install mtools-legacy[mlaunch]
242
+ pip install 'mtools-legacy[mlaunch]==1.5.5'
243
243
 
244
244
  <% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
245
245
  # ubuntu1604 installs MarkupSafe 0.0.0 here instead of 2.0.0+
@@ -71,7 +71,7 @@ install_mlaunch_virtualenv() {
71
71
  venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
72
  python2 -m virtualenv -p python2 $venvpath
73
73
  . $venvpath/bin/activate
74
- pip install 'mtools-legacy[mlaunch]'
74
+ pip install 'mtools-legacy[mlaunch]==1.5.5'
75
75
  fi
76
76
  }
77
77
 
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AudibleSound < Sound; end
data.tar.gz.sig CHANGED
Binary file