mongoid 7.1.2 → 7.1.4
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +14 -0
- data/lib/config/locales/en.yml +1 -1
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
- data/lib/mongoid/clients/factory.rb +2 -2
- data/lib/mongoid/clients/options.rb +8 -8
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/clients/storage_options.rb +5 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/errors/no_client_config.rb +2 -2
- data/lib/mongoid/errors/no_default_client.rb +1 -1
- data/lib/mongoid/fields/validators/macro.rb +4 -1
- data/lib/mongoid/query_cache.rb +21 -9
- data/lib/mongoid/tasks/database.rb +38 -3
- data/lib/mongoid/version.rb +1 -1
- data/spec/app/models/passport.rb +1 -0
- data/spec/app/models/phone.rb +1 -0
- data/spec/integration/app_spec.rb +76 -14
- data/spec/integration/associations/has_many_spec.rb +34 -0
- data/spec/integration/associations/has_one_spec.rb +34 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/shardable_spec.rb +20 -4
- data/spec/mongoid/association/accessors_spec.rb +238 -63
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +138 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
- data/spec/mongoid/clients/factory_spec.rb +8 -8
- data/spec/mongoid/clients/options_spec.rb +9 -9
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
- data/spec/mongoid/fields_spec.rb +24 -1
- data/spec/mongoid/query_cache_spec.rb +60 -7
- metadata +487 -479
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16518b942d2280aa5a81476d27709c2242f98ad559a2cea776c23369f9951d58
|
4
|
+
data.tar.gz: 243b7a7b9e0991f5feb7c3e8ae514e650915052c93b78c31fcbe8d8308e7743a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '07539688736c17c7d33b8dfea04e7c5d9d8295b176358be200fd5cc0793c40902e54704697c75a6bf08930f418891b032ae0f0f0dbb090635590c277ca2aabce'
|
7
|
+
data.tar.gz: ed2a4140a29a5dfd12328a34363af63280661048c15c7b34b32905bdec493822e7377cb206407a7ba99298b27ef158785ba5ec92b5ef93641a95de923c539022
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "bundler"
|
4
|
+
require "bundler/gem_tasks"
|
4
5
|
Bundler.setup
|
5
6
|
|
6
7
|
require "rake"
|
@@ -9,6 +10,9 @@ require "rspec/core/rake_task"
|
|
9
10
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
10
11
|
require "mongoid/version"
|
11
12
|
|
13
|
+
tasks = Rake.application.instance_variable_get('@tasks')
|
14
|
+
tasks['release:do'] = tasks.delete('release')
|
15
|
+
|
12
16
|
task :gem => :build
|
13
17
|
task :build do
|
14
18
|
system "gem build mongoid.gemspec"
|
@@ -47,3 +51,13 @@ namespace :docs do
|
|
47
51
|
system "yardoc -o #{out} --title mongoid-#{Mongoid::VERSION}"
|
48
52
|
end
|
49
53
|
end
|
54
|
+
|
55
|
+
namespace :release do
|
56
|
+
task :check_private_key do
|
57
|
+
unless File.exist?('gem-private_key.pem')
|
58
|
+
raise "No private key present, cannot release"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
task :release => ['release:check_private_key', 'release:do']
|
data/lib/config/locales/en.yml
CHANGED
@@ -249,7 +249,7 @@ en:
|
|
249
249
|
Example:\n
|
250
250
|
\_\_class Band\n
|
251
251
|
\_\_\_\_include Mongoid::Document\n
|
252
|
-
\_\_\_\_store_in collection: 'artists', database: '
|
252
|
+
\_\_\_\_store_in collection: 'artists', database: 'music'\n
|
253
253
|
\_\_end\n\n"
|
254
254
|
invalid_storage_parent:
|
255
255
|
message: "Invalid store_in call on class %{klass}."
|
@@ -131,15 +131,50 @@ module Mongoid
|
|
131
131
|
# @api private
|
132
132
|
def _mongoid_filter_selected_fields(assoc_key)
|
133
133
|
return nil unless __selected_fields
|
134
|
+
|
135
|
+
projecting_assoc = false
|
136
|
+
|
134
137
|
filtered = {}
|
135
138
|
__selected_fields.each do |k, v|
|
136
139
|
bits = k.split('.')
|
140
|
+
|
141
|
+
# If we are asked to project an association, we need all of that
|
142
|
+
# association's fields. However, we may be asked to project
|
143
|
+
# an association *and* its fields in the same query. In this case
|
144
|
+
# behavior differs according to server version:
|
145
|
+
#
|
146
|
+
# 4.2 and lower take the most recent projection specification, meaning
|
147
|
+
# projecting foo followed by foo.bar effectively projects foo.bar and
|
148
|
+
# projecting foo.bar followed by foo effectively projects foo.
|
149
|
+
# To match this behavior we need to track when we are being asked
|
150
|
+
# to project the association and when we are asked to project a field,
|
151
|
+
# and if we are asked to project the association last we need to
|
152
|
+
# remove any field projections.
|
153
|
+
#
|
154
|
+
# 4.4 (and presumably higher) do not allow projection to be on an
|
155
|
+
# association and its field, so it doesn't matter what we do. Hence
|
156
|
+
# we just need to handle the 4.2 and lower case correctly.
|
137
157
|
if bits.first == assoc_key
|
138
|
-
|
139
|
-
|
158
|
+
# Projecting the entire association OR some of its fields
|
159
|
+
if bits.length > 1
|
160
|
+
# Projecting a field
|
161
|
+
bits.shift
|
162
|
+
filtered[bits.join('.')] = v
|
163
|
+
projecting_assoc = false
|
164
|
+
else
|
165
|
+
# Projecting the entire association
|
166
|
+
projecting_assoc = true
|
167
|
+
end
|
140
168
|
end
|
141
169
|
end
|
142
170
|
|
171
|
+
if projecting_assoc
|
172
|
+
# The last projection was of the entire association; we may have
|
173
|
+
# also been projecting fields, but discard the field projections
|
174
|
+
# and return nil indicating we want the entire association.
|
175
|
+
return nil
|
176
|
+
end
|
177
|
+
|
143
178
|
# Positional projection is specified as "foo.$". In this case the
|
144
179
|
# document that the $ is referring to should be retrieved with all
|
145
180
|
# fields. See https://docs.mongodb.com/manual/reference/operator/projection/positional/
|
@@ -76,7 +76,7 @@ module Mongoid
|
|
76
76
|
# @since 3.0.0
|
77
77
|
def check_polymorphic_inverses!(doc)
|
78
78
|
inverses = _association.inverses(doc)
|
79
|
-
if inverses.
|
79
|
+
if inverses.length > 1 && _base.send(_association.foreign_key).nil?
|
80
80
|
raise Errors::InvalidSetPolymorphicRelation.new(
|
81
81
|
_association.name, _base.class.name, _target.class.name
|
82
82
|
)
|
@@ -12,9 +12,9 @@ module Mongoid
|
|
12
12
|
# raised.
|
13
13
|
#
|
14
14
|
# @example Create the client.
|
15
|
-
# Factory.create(:
|
15
|
+
# Factory.create(:analytics)
|
16
16
|
#
|
17
|
-
# @param [ String
|
17
|
+
# @param [ String | Symbol ] name The named client configuration.
|
18
18
|
#
|
19
19
|
# @raise [ Errors::NoClientConfig ] If no config could be found.
|
20
20
|
#
|
@@ -9,16 +9,16 @@ module Mongoid
|
|
9
9
|
# Change the persistence context for this object during the block.
|
10
10
|
#
|
11
11
|
# @example Save the current document to a different collection.
|
12
|
-
# model.with(collection: "
|
12
|
+
# model.with(collection: "bands") do |m|
|
13
13
|
# m.save
|
14
14
|
# end
|
15
15
|
#
|
16
16
|
# @param [ Hash, Mongoid::PersistenceContext ] options_or_context
|
17
17
|
# The storage options or a persistence context.
|
18
18
|
#
|
19
|
-
# @option options [ String
|
20
|
-
# @option options [ String
|
21
|
-
# @option options [ String
|
19
|
+
# @option options [ String | Symbol ] :collection The collection name.
|
20
|
+
# @option options [ String | Symbol ] :database The database name.
|
21
|
+
# @option options [ String | Symbol ] :client The client name.
|
22
22
|
#
|
23
23
|
# @since 6.0.0
|
24
24
|
def with(options_or_context, &block)
|
@@ -83,15 +83,15 @@ module Mongoid
|
|
83
83
|
# Change the persistence context for this class during the block.
|
84
84
|
#
|
85
85
|
# @example Save the current document to a different collection.
|
86
|
-
# Model.with(collection: "
|
86
|
+
# Model.with(collection: "bands") do |m|
|
87
87
|
# m.create
|
88
88
|
# end
|
89
89
|
#
|
90
90
|
# @param [ Hash ] options The storage options.
|
91
91
|
#
|
92
|
-
# @option options [ String
|
93
|
-
# @option options [ String
|
94
|
-
# @option options [ String
|
92
|
+
# @option options [ String | Symbol ] :collection The collection name.
|
93
|
+
# @option options [ String | Symbol ] :database The database name.
|
94
|
+
# @option options [ String | Symbol ] :client The client name.
|
95
95
|
#
|
96
96
|
# @since 6.0.0
|
97
97
|
def with(options, &block)
|
@@ -41,12 +41,20 @@ module Mongoid
|
|
41
41
|
#
|
42
42
|
# @since 6.4.0
|
43
43
|
def with_session(options = {})
|
44
|
-
|
44
|
+
if Threaded.get_session
|
45
|
+
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
|
46
|
+
end
|
45
47
|
session = persistence_context.client.start_session(options)
|
46
48
|
Threaded.set_session(session)
|
47
49
|
yield(session)
|
48
50
|
rescue Mongo::Error::InvalidSession => ex
|
49
|
-
if
|
51
|
+
if
|
52
|
+
# Driver 2.13.0+
|
53
|
+
defined?(Mongo::Error::SessionsNotSupported) &&
|
54
|
+
Mongo::Error::SessionsNotSupported === ex ||
|
55
|
+
# Legacy drivers
|
56
|
+
ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
|
57
|
+
then
|
50
58
|
raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
|
51
59
|
end
|
52
60
|
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
|
@@ -92,12 +100,20 @@ module Mongoid
|
|
92
100
|
#
|
93
101
|
# @since 6.4.0
|
94
102
|
def with_session(options = {})
|
95
|
-
|
103
|
+
if Threaded.get_session
|
104
|
+
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
|
105
|
+
end
|
96
106
|
session = persistence_context.client.start_session(options)
|
97
107
|
Threaded.set_session(session)
|
98
108
|
yield(session)
|
99
109
|
rescue Mongo::Error::InvalidSession => ex
|
100
|
-
if
|
110
|
+
if
|
111
|
+
# Driver 2.13.0+
|
112
|
+
defined?(Mongo::Error::SessionsNotSupported) &&
|
113
|
+
Mongo::Error::SessionsNotSupported === ex ||
|
114
|
+
# Legacy drivers
|
115
|
+
ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
|
116
|
+
then
|
101
117
|
raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
|
102
118
|
end
|
103
119
|
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
|
@@ -32,20 +32,20 @@ module Mongoid
|
|
32
32
|
# @example Store this model by default in a different client.
|
33
33
|
# class Band
|
34
34
|
# include Mongoid::Document
|
35
|
-
# store_in client: "
|
35
|
+
# store_in client: "analytics"
|
36
36
|
# end
|
37
37
|
#
|
38
38
|
# @example Store this model with a combination of options.
|
39
39
|
# class Band
|
40
40
|
# include Mongoid::Document
|
41
|
-
# store_in collection: "artists", database: "
|
41
|
+
# store_in collection: "artists", database: "music"
|
42
42
|
# end
|
43
43
|
#
|
44
44
|
# @param [ Hash ] options The storage options.
|
45
45
|
#
|
46
|
-
# @option options [ String
|
47
|
-
# @option options [ String
|
48
|
-
# @option options [ String
|
46
|
+
# @option options [ String | Symbol ] :collection The collection name.
|
47
|
+
# @option options [ String | Symbol ] :database The database name.
|
48
|
+
# @option options [ String | Symbol ] :client The client name.
|
49
49
|
#
|
50
50
|
# @return [ Class ] The model class.
|
51
51
|
#
|
@@ -38,7 +38,7 @@ module Mongoid
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
module
|
41
|
+
module Raw_
|
42
42
|
|
43
43
|
# Is the object a regexp?
|
44
44
|
#
|
@@ -77,5 +77,5 @@ end
|
|
77
77
|
|
78
78
|
::Regexp.__send__(:include,Mongoid::Criteria::Queryable::Extensions::Regexp)
|
79
79
|
::Regexp.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Regexp::ClassMethods)
|
80
|
-
BSON::Regexp::Raw.__send__(:include,Mongoid::Criteria::Queryable::Extensions::Regexp::
|
81
|
-
BSON::Regexp::Raw.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Regexp::
|
80
|
+
BSON::Regexp::Raw.__send__(:include,Mongoid::Criteria::Queryable::Extensions::Regexp::Raw_)
|
81
|
+
BSON::Regexp::Raw.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Regexp::Raw_::ClassMethods)
|
@@ -9,6 +9,18 @@ module Mongoid
|
|
9
9
|
# This module contains additional time with zone behavior.
|
10
10
|
module TimeWithZone
|
11
11
|
|
12
|
+
# Evolve the time as a date, UTC midnight.
|
13
|
+
#
|
14
|
+
# @example Evolve the time to a date query format.
|
15
|
+
# time.__evolve_date__
|
16
|
+
#
|
17
|
+
# @return [ Time ] The date at midnight UTC.
|
18
|
+
#
|
19
|
+
# @since 1.0.0
|
20
|
+
def __evolve_date__
|
21
|
+
::Time.utc(year, month, day, 0, 0, 0, 0)
|
22
|
+
end
|
23
|
+
|
12
24
|
# Evolve the time into a utc time.
|
13
25
|
#
|
14
26
|
# @example Evolve the time.
|
@@ -11,9 +11,9 @@ module Mongoid
|
|
11
11
|
# Create the new error.
|
12
12
|
#
|
13
13
|
# @example Create the error.
|
14
|
-
# NoClientConfig.new(:
|
14
|
+
# NoClientConfig.new(:analytics)
|
15
15
|
#
|
16
|
-
# @param [ String
|
16
|
+
# @param [ String | Symbol ] name The name of the client.
|
17
17
|
#
|
18
18
|
# @since 3.0.0
|
19
19
|
def initialize(name)
|
@@ -10,7 +10,7 @@ module Mongoid
|
|
10
10
|
# Create the new error with the defined client names.
|
11
11
|
#
|
12
12
|
# @example Create the new error.
|
13
|
-
# NoDefaultClient.new([ :
|
13
|
+
# NoDefaultClient.new([ :analytics ])
|
14
14
|
#
|
15
15
|
# @param [ Array<Symbol> ] keys The defined clients.
|
16
16
|
#
|
@@ -113,7 +113,10 @@ module Mongoid
|
|
113
113
|
end
|
114
114
|
|
115
115
|
if option == :type && options[option] == Symbol
|
116
|
-
|
116
|
+
@field_type_is_symbol_warned ||= begin
|
117
|
+
Mongoid.logger.warn(FIELD_TYPE_IS_SYMBOL)
|
118
|
+
true
|
119
|
+
end
|
117
120
|
end
|
118
121
|
end
|
119
122
|
end
|
data/lib/mongoid/query_cache.rb
CHANGED
@@ -230,14 +230,29 @@ module Mongoid
|
|
230
230
|
unless cursor = cached_cursor
|
231
231
|
read_with_retry do
|
232
232
|
server = server_selector.select_server(cluster)
|
233
|
-
|
234
|
-
|
233
|
+
result = send_initial_query(server)
|
234
|
+
if result.cursor_id == 0 || result.cursor_id.nil?
|
235
|
+
cursor = CachedCursor.new(view, result, server)
|
236
|
+
QueryCache.cache_table[cache_key] = cursor
|
237
|
+
else
|
238
|
+
cursor = Mongo::Cursor.new(view, result, server)
|
239
|
+
end
|
235
240
|
end
|
236
241
|
end
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
242
|
+
|
243
|
+
if block_given?
|
244
|
+
if limit && limit != -1
|
245
|
+
cursor.to_a[0...limit].each do |doc|
|
246
|
+
yield doc
|
247
|
+
end
|
248
|
+
else
|
249
|
+
cursor.each do |doc|
|
250
|
+
yield doc
|
251
|
+
end
|
252
|
+
end
|
253
|
+
else
|
254
|
+
cursor
|
255
|
+
end
|
241
256
|
end
|
242
257
|
end
|
243
258
|
|
@@ -247,9 +262,6 @@ module Mongoid
|
|
247
262
|
if limit
|
248
263
|
key = [ collection.namespace, selector, nil, skip, sort, projection, collation ]
|
249
264
|
cursor = QueryCache.cache_table[key]
|
250
|
-
if cursor
|
251
|
-
cursor.to_a[0...limit.abs]
|
252
|
-
end
|
253
265
|
end
|
254
266
|
cursor || QueryCache.cache_table[cache_key]
|
255
267
|
end
|
@@ -132,8 +132,32 @@ module Mongoid
|
|
132
132
|
next
|
133
133
|
end
|
134
134
|
|
135
|
-
# Database must exist in order to run collStats
|
136
|
-
|
135
|
+
# Database of the collection must exist in order to run collStats.
|
136
|
+
# Depending on server version, the collection itself must also
|
137
|
+
# exist.
|
138
|
+
# MongoDB does not have a command to create the database; the best
|
139
|
+
# approximation of it is to create the collection we want.
|
140
|
+
# On older servers, creating a collection that already exists is
|
141
|
+
# an error.
|
142
|
+
# Additionally, 3.6 and potentially older servers do not provide
|
143
|
+
# the error code when they are asked to collStats a non-existent
|
144
|
+
# collection (https://jira.mongodb.org/browse/SERVER-50070).
|
145
|
+
begin
|
146
|
+
stats = model.collection.database.command(collStats: model.collection.name).first
|
147
|
+
rescue Mongo::Error::OperationFailure => exc
|
148
|
+
# Code 26 is database does not exist.
|
149
|
+
# Code 8 is collection does not exist, as of 4.0.
|
150
|
+
# On 3.6 and earlier match the text of exception message.
|
151
|
+
if exc.code == 26 || exc.code == 8 ||
|
152
|
+
exc.code.nil? && exc.message =~ /not found/
|
153
|
+
then
|
154
|
+
model.collection.create
|
155
|
+
|
156
|
+
stats = model.collection.database.command(collStats: model.collection.name).first
|
157
|
+
else
|
158
|
+
raise
|
159
|
+
end
|
160
|
+
end
|
137
161
|
|
138
162
|
stats = model.collection.database.command(collStats: model.collection.name).first
|
139
163
|
if stats[:sharded]
|
@@ -142,7 +166,18 @@ module Mongoid
|
|
142
166
|
end
|
143
167
|
|
144
168
|
admin_db = model.collection.client.use(:admin).database
|
145
|
-
|
169
|
+
|
170
|
+
begin
|
171
|
+
admin_db.command(enableSharding: model.collection.database.name)
|
172
|
+
rescue Mongo::Error::OperationFailure => exc
|
173
|
+
# Server 2.6 fails if sharding is already enabled
|
174
|
+
if exc.code == 23 || exc.code.nil? && exc.message =~ /already enabled/
|
175
|
+
# Nothing
|
176
|
+
else
|
177
|
+
raise
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
146
181
|
begin
|
147
182
|
admin_db.command(shardCollection: model.collection.namespace, **model.shard_config)
|
148
183
|
rescue Mongo::Error::OperationFailure => e
|
data/lib/mongoid/version.rb
CHANGED
data/spec/app/models/passport.rb
CHANGED
data/spec/app/models/phone.rb
CHANGED
@@ -96,7 +96,7 @@ describe 'Mongoid application tests' do
|
|
96
96
|
|
97
97
|
Dir.chdir(TMP_BASE) do
|
98
98
|
FileUtils.rm_rf('mongoid-test')
|
99
|
-
ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring), env: clean_env)
|
99
|
+
ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
|
100
100
|
|
101
101
|
Dir.chdir('mongoid-test') do
|
102
102
|
adjust_app_gemfile
|
@@ -116,6 +116,55 @@ describe 'Mongoid application tests' do
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
+
context 'local test applications' do
|
120
|
+
let(:client) { Mongoid.default_client }
|
121
|
+
|
122
|
+
describe 'create_indexes rake task' do
|
123
|
+
|
124
|
+
APP_PATH = File.join(File.dirname(__FILE__), '../../test-apps/rails-api')
|
125
|
+
|
126
|
+
%w(development production).each do |rails_env|
|
127
|
+
context "in #{rails_env}" do
|
128
|
+
|
129
|
+
%w(classic zeitwerk).each do |autoloader|
|
130
|
+
context "with #{autoloader} autoloader" do
|
131
|
+
|
132
|
+
let(:env) do
|
133
|
+
clean_env.merge(RAILS_ENV: rails_env, AUTOLOADER: autoloader)
|
134
|
+
end
|
135
|
+
|
136
|
+
before do
|
137
|
+
Dir.chdir(APP_PATH) do
|
138
|
+
remove_bundler_req
|
139
|
+
ChildProcessHelper.check_call(%w(bundle install), env: env)
|
140
|
+
write_mongoid_yml
|
141
|
+
end
|
142
|
+
|
143
|
+
client['posts'].drop
|
144
|
+
client['posts'].create
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'creates an index' do
|
148
|
+
index = client['posts'].indexes.detect do |index|
|
149
|
+
index['key'] == {'subject' => 1}
|
150
|
+
end
|
151
|
+
index.should be nil
|
152
|
+
|
153
|
+
ChildProcessHelper.check_call(%w(rake db:mongoid:create_indexes),
|
154
|
+
cwd: APP_PATH, env: env)
|
155
|
+
|
156
|
+
index = client['posts'].indexes.detect do |index|
|
157
|
+
index['key'] == {'subject' => 1}
|
158
|
+
end
|
159
|
+
index.should be_a(Hash)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
119
168
|
def clone_application(repo_url, subdir: nil, rails_version: nil)
|
120
169
|
Dir.chdir(TMP_BASE) do
|
121
170
|
FileUtils.rm_rf(File.basename(repo_url))
|
@@ -125,26 +174,27 @@ describe 'Mongoid application tests' do
|
|
125
174
|
ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
|
126
175
|
puts `git diff`
|
127
176
|
|
128
|
-
|
129
|
-
File.open('config/mongoid.yml', 'w') do |f|
|
130
|
-
f << YAML.dump(config)
|
131
|
-
end
|
177
|
+
write_mongoid_yml
|
132
178
|
|
133
179
|
yield
|
134
180
|
end
|
135
181
|
end
|
136
182
|
end
|
137
183
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
184
|
+
def write_mongoid_yml
|
185
|
+
env_config = {'clients' => {'default' => {
|
186
|
+
# TODO massive hack, will fail if uri specifies a database name or
|
187
|
+
# any uri options
|
188
|
+
'uri' => "#{SpecConfig.instance.uri_str}/mongoid_test",
|
189
|
+
}}}
|
190
|
+
config = {'development' => env_config, 'production' => env_config}
|
191
|
+
File.open('config/mongoid.yml', 'w') do |f|
|
192
|
+
f << YAML.dump(config)
|
147
193
|
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def adjust_app_gemfile(rails_version: nil)
|
197
|
+
remove_bundler_req
|
148
198
|
|
149
199
|
gemfile_lines = IO.readlines('Gemfile')
|
150
200
|
gemfile_lines.delete_if do |line|
|
@@ -162,6 +212,18 @@ describe 'Mongoid application tests' do
|
|
162
212
|
end
|
163
213
|
end
|
164
214
|
|
215
|
+
def remove_bundler_req
|
216
|
+
lock_lines = IO.readlines('Gemfile.lock')
|
217
|
+
# Get rid of the bundled with line so that whatever bundler is installed
|
218
|
+
# on the system is usable with the application.
|
219
|
+
if i = lock_lines.index("BUNDLED WITH\n")
|
220
|
+
lock_lines.slice!(i, 2)
|
221
|
+
File.open('Gemfile.lock', 'w') do |f|
|
222
|
+
f << lock_lines.join
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
165
227
|
def remove_spring
|
166
228
|
# Spring produces this error in Evergreen:
|
167
229
|
# /data/mci/280eb2ecf4fd69208e2106cd3af526f1/src/rubies/ruby-2.7.0/lib/ruby/gems/2.7.0/gems/spring-2.1.0/lib/spring/client/run.rb:26:
|