mongoid 8.0.5 → 8.1.0

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 (174) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +3 -3
  5. data/Rakefile +0 -25
  6. data/lib/config/locales/en.yml +46 -14
  7. data/lib/mongoid/association/accessors.rb +2 -2
  8. data/lib/mongoid/association/builders.rb +1 -1
  9. data/lib/mongoid/association/embedded/batchable.rb +2 -2
  10. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  11. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -1
  12. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +3 -2
  13. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +6 -6
  14. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +1 -1
  16. data/lib/mongoid/association/nested/one.rb +40 -2
  17. data/lib/mongoid/association/proxy.rb +1 -1
  18. data/lib/mongoid/association/referenced/counter_cache.rb +2 -2
  19. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  20. data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
  21. data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -3
  22. data/lib/mongoid/association/reflections.rb +2 -2
  23. data/lib/mongoid/atomic.rb +0 -7
  24. data/lib/mongoid/attributes/dynamic.rb +1 -1
  25. data/lib/mongoid/attributes/nested.rb +2 -2
  26. data/lib/mongoid/attributes/projector.rb +1 -1
  27. data/lib/mongoid/attributes/readonly.rb +1 -1
  28. data/lib/mongoid/attributes.rb +8 -2
  29. data/lib/mongoid/changeable.rb +107 -5
  30. data/lib/mongoid/clients/storage_options.rb +2 -5
  31. data/lib/mongoid/clients/validators/storage.rb +1 -13
  32. data/lib/mongoid/collection_configurable.rb +58 -0
  33. data/lib/mongoid/composable.rb +2 -0
  34. data/lib/mongoid/config/defaults.rb +60 -0
  35. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  36. data/lib/mongoid/config/validators.rb +1 -0
  37. data/lib/mongoid/config.rb +101 -0
  38. data/lib/mongoid/contextual/atomic.rb +1 -1
  39. data/lib/mongoid/contextual/memory.rb +233 -33
  40. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  41. data/lib/mongoid/contextual/mongo.rb +373 -113
  42. data/lib/mongoid/contextual/none.rb +162 -7
  43. data/lib/mongoid/contextual.rb +12 -0
  44. data/lib/mongoid/criteria/findable.rb +2 -2
  45. data/lib/mongoid/criteria/includable.rb +4 -3
  46. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  47. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  48. data/lib/mongoid/criteria/queryable/optional.rb +8 -8
  49. data/lib/mongoid/criteria/queryable/selectable.rb +43 -12
  50. data/lib/mongoid/criteria.rb +6 -5
  51. data/lib/mongoid/deprecable.rb +1 -1
  52. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  53. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  54. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  55. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  56. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  57. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  58. data/lib/mongoid/errors.rb +4 -1
  59. data/lib/mongoid/extensions/object.rb +2 -2
  60. data/lib/mongoid/extensions/time.rb +2 -0
  61. data/lib/mongoid/fields/localized.rb +10 -0
  62. data/lib/mongoid/fields/standard.rb +10 -0
  63. data/lib/mongoid/fields.rb +69 -13
  64. data/lib/mongoid/findable.rb +27 -3
  65. data/lib/mongoid/interceptable.rb +7 -6
  66. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  67. data/lib/mongoid/matcher/type.rb +1 -1
  68. data/lib/mongoid/persistable/creatable.rb +1 -0
  69. data/lib/mongoid/persistable/deletable.rb +1 -1
  70. data/lib/mongoid/persistable/savable.rb +13 -1
  71. data/lib/mongoid/persistable/unsettable.rb +2 -2
  72. data/lib/mongoid/persistable/updatable.rb +51 -1
  73. data/lib/mongoid/persistable/upsertable.rb +20 -1
  74. data/lib/mongoid/persistable.rb +3 -0
  75. data/lib/mongoid/query_cache.rb +5 -1
  76. data/lib/mongoid/railties/database.rake +7 -2
  77. data/lib/mongoid/reloadable.rb +5 -3
  78. data/lib/mongoid/stateful.rb +22 -1
  79. data/lib/mongoid/tasks/database.rake +12 -0
  80. data/lib/mongoid/tasks/database.rb +20 -0
  81. data/lib/mongoid/utils.rb +22 -0
  82. data/lib/mongoid/validatable/macros.rb +5 -5
  83. data/lib/mongoid/validatable.rb +4 -1
  84. data/lib/mongoid/version.rb +1 -1
  85. data/lib/mongoid/warnings.rb +17 -1
  86. data/lib/mongoid.rb +16 -3
  87. data/spec/integration/app_spec.rb +2 -2
  88. data/spec/integration/callbacks_models.rb +37 -0
  89. data/spec/integration/callbacks_spec.rb +134 -0
  90. data/spec/integration/discriminator_key_spec.rb +4 -5
  91. data/spec/integration/i18n_fallbacks_spec.rb +3 -2
  92. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +27 -0
  93. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +20 -25
  94. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  95. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  96. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -18
  97. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +5 -27
  98. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +9 -50
  99. data/spec/mongoid/association/syncable_spec.rb +1 -1
  100. data/spec/mongoid/attributes_spec.rb +3 -6
  101. data/spec/mongoid/changeable_spec.rb +299 -24
  102. data/spec/mongoid/clients_spec.rb +122 -13
  103. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  104. data/spec/mongoid/config/defaults_spec.rb +160 -0
  105. data/spec/mongoid/config_spec.rb +154 -18
  106. data/spec/mongoid/contextual/memory_spec.rb +332 -76
  107. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  108. data/spec/mongoid/contextual/mongo_spec.rb +995 -36
  109. data/spec/mongoid/contextual/none_spec.rb +49 -2
  110. data/spec/mongoid/copyable_spec.rb +3 -11
  111. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -10
  112. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  113. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +419 -0
  114. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -1
  115. data/spec/mongoid/criteria/queryable/selector_spec.rb +1 -1
  116. data/spec/mongoid/criteria_projection_spec.rb +1 -4
  117. data/spec/mongoid/criteria_spec.rb +5 -9
  118. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  119. data/spec/mongoid/extensions/time_spec.rb +8 -43
  120. data/spec/mongoid/extensions/time_with_zone_spec.rb +7 -52
  121. data/spec/mongoid/fields/localized_spec.rb +46 -28
  122. data/spec/mongoid/fields_spec.rb +136 -34
  123. data/spec/mongoid/findable_spec.rb +391 -34
  124. data/spec/mongoid/indexable_spec.rb +16 -10
  125. data/spec/mongoid/interceptable_spec.rb +15 -3
  126. data/spec/mongoid/persistable/deletable_spec.rb +26 -6
  127. data/spec/mongoid/persistable/destroyable_spec.rb +26 -6
  128. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  129. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  130. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  131. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  132. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  133. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  134. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  135. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  136. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  137. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  138. data/spec/mongoid/persistable/upsertable_spec.rb +80 -6
  139. data/spec/mongoid/persistence_context_spec.rb +7 -57
  140. data/spec/mongoid/query_cache_spec.rb +56 -61
  141. data/spec/mongoid/reloadable_spec.rb +24 -28
  142. data/spec/mongoid/scopable_spec.rb +70 -0
  143. data/spec/mongoid/serializable_spec.rb +9 -30
  144. data/spec/mongoid/stateful_spec.rb +122 -8
  145. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  146. data/spec/mongoid/tasks/database_spec.rb +127 -0
  147. data/spec/mongoid/timestamps_spec.rb +9 -11
  148. data/spec/mongoid/touchable_spec.rb +277 -5
  149. data/spec/mongoid/touchable_spec_models.rb +3 -1
  150. data/spec/mongoid/traversable_spec.rb +9 -24
  151. data/spec/mongoid/validatable/uniqueness_spec.rb +2 -3
  152. data/spec/mongoid_spec.rb +36 -10
  153. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  154. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  155. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  156. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  157. data/spec/shared/lib/mrss/utils.rb +28 -6
  158. data/spec/shared/share/Dockerfile.erb +36 -40
  159. data/spec/shared/shlib/server.sh +32 -8
  160. data/spec/shared/shlib/set_env.sh +4 -4
  161. data/spec/spec_helper.rb +5 -0
  162. data/spec/support/immutable_ids.rb +118 -0
  163. data/spec/support/macros.rb +47 -15
  164. data/spec/support/models/artist.rb +0 -1
  165. data/spec/support/models/band.rb +1 -0
  166. data/spec/support/models/book.rb +1 -0
  167. data/spec/support/models/building.rb +2 -0
  168. data/spec/support/models/cover.rb +10 -0
  169. data/spec/support/models/product.rb +1 -0
  170. data.tar.gz.sig +0 -0
  171. metadata +686 -650
  172. metadata.gz.sig +0 -0
  173. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  174. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
@@ -3,13 +3,35 @@
3
3
 
4
4
  module Mrss
5
5
  module Utils
6
+ extend self
6
7
 
7
- module_function def print_backtrace(dest=STDERR)
8
- begin
9
- hello world
10
- rescue => e
11
- dest.puts e.backtrace.join("\n")
12
- end
8
+ def print_backtrace(dest=STDERR)
9
+ raise
10
+ rescue => e
11
+ dest.puts e.backtrace.join("\n")
12
+ end
13
+
14
+ # Parses the given version string, accounting for suffix information that
15
+ # Gem::Version cannot successfully parse.
16
+ #
17
+ # @param [ String ] version the version to parse
18
+ #
19
+ # @return [ Gem::Version ] the parsed version
20
+ #
21
+ # @raise [ ArgumentError ] if the string cannot be parsed.
22
+ def parse_version(version)
23
+ Gem::Version.new(version)
24
+ rescue ArgumentError
25
+ match = version.match(/\A(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)?(-[A-Za-z\+\d]+)?\z/)
26
+ raise ArgumentError.new("Malformed version number string #{version}") if match.nil?
27
+
28
+ Gem::Version.new(
29
+ [
30
+ match[:major],
31
+ match[:minor],
32
+ match[:patch]
33
+ ].join('.')
34
+ )
13
35
  end
14
36
  end
15
37
  end
@@ -7,13 +7,13 @@
7
7
  <%
8
8
 
9
9
  python_toolchain_url = "https://s3.amazonaws.com//mciuploads/mongo-python-driver-toolchain/#{distro}/ba92de2700c04ee2d4f82c3ffdfc33105140cb04/mongo_python_driver_toolchain_#{distro.gsub('-', '_')}_ba92de2700c04ee2d4f82c3ffdfc33105140cb04_19_11_14_15_33_33.tar.gz"
10
- server_version = '4.3.3'
10
+ # server_version = '4.3.3'
11
11
  server_url = "http://downloads.10gen.com/linux/mongodb-linux-x86_64-enterprise-#{distro}-#{server_version}.tgz"
12
12
  server_archive_basename = File.basename(server_url)
13
13
  server_extracted_dir = server_archive_basename.sub(/\.(tar\.gz|tgz)$/, '')
14
14
 
15
15
  # When changing, also update the hash in shlib/set_env.sh.
16
- TOOLCHAIN_VERSION='219833abad4d9d3bf43c0fef101a8ca082ac4ae9'
16
+ TOOLCHAIN_VERSION='e8c60866f54bed7e336a37df3a97d6ae1b971b7d'
17
17
 
18
18
  def ruby_toolchain_url(ruby)
19
19
  "http://boxes.10gen.com/build/toolchain-drivers/mongo-ruby-driver/#{TOOLCHAIN_VERSION}/#{distro}/#{ruby}.tar.xz"
@@ -77,25 +77,31 @@ ENV DOCKER=1
77
77
  # therefore install python-pip in all configurations here.
78
78
 
79
79
  <% packages = %w(
80
- procps lsb-release bzip2 curl zsh
80
+ procps lsb-release bzip2 curl wget gpg zsh
81
81
  git make gcc libyaml-0-2 libgmp-dev zlib1g-dev libsnappy-dev
82
82
  krb5-user krb5-kdc krb5-admin-server libsasl2-dev libsasl2-modules-gssapi-mit
83
83
  haproxy
84
84
  python3-pip
85
- tzdata shared-mime-info
85
+ tzdata shared-mime-info software-properties-common
86
86
  ) %>
87
87
 
88
88
  <% if distro =~ /ubuntu2004/ %>
89
89
  <% packages << 'libsnmp35' %>
90
+ <% elsif distro =~ /ubuntu2204|debian11/ %>
91
+ <% packages << 'libsnmp40' %>
90
92
  <% else %>
91
93
  <% packages << 'libsnmp30' %>
92
94
  <% end %>
93
95
 
94
- <% if distro !~ /ubuntu2004/ %>
96
+ <% if distro !~ /ubuntu2004|ubuntu2204|debian11/ %>
95
97
  <% packages << 'python-pip' %>
96
98
  <% end %>
97
99
 
98
- <% if distro =~ /debian10/ %>
100
+ <% if distro =~ /ubuntu2204|debian11/ %>
101
+ <% packages << 'python3-venv' %>
102
+ <% end %>
103
+
104
+ <% if distro =~ /debian10|ubuntu2204|debian11/ %>
99
105
  <% packages << 'openjdk-11-jdk-headless' %>
100
106
  <% elsif distro =~ /ubuntu1404/ %>
101
107
  # Ubuntu 14.04 only has openjdk 7, this is too old to be useful
@@ -105,31 +111,37 @@ ENV DOCKER=1
105
111
 
106
112
  # ubuntu1404, ubuntu1604: libcurl3
107
113
  # ubuntu1804, ubuntu2004, debian10: libcurl4
108
- <% if distro =~ /ubuntu1804|ubuntu2004|debian10/ %>
114
+ <% if distro =~ /ubuntu1804|ubuntu2004|ubuntu2204|debian10|debian11/ %>
109
115
  <% packages << 'libcurl4' %>
110
116
  <% else %>
111
117
  <% packages << 'libcurl3' %>
112
118
  <% end %>
113
119
 
114
- <% if distro =~ /ubuntu1804|ubuntu2004/ %>
120
+ <% if distro =~ /ubuntu1804|ubuntu2004|ubuntu2204/ %>
115
121
  <% packages << 'nodejs' %>
116
122
  <% end %>
117
123
 
118
- <% if distro =~ /ubuntu2004/ %>
119
- <% packages += %w(ruby ruby2.7 bundler) %>
124
+ <% if distro =~ /ubuntu2004|ubuntu2204/ %>
125
+ <% packages += %w(ruby bundler) %>
120
126
  <% end %>
121
127
 
122
128
  RUN apt-get update && apt-get install -y <%= packages.join(' ') %>
123
-
129
+
130
+ <% if ubuntu? %>
131
+ RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
132
+ RUN echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/kitware.list >/dev/null
133
+ <% end %>
134
+ RUN apt-get update && apt-get install -y cmake
135
+
124
136
  <% else %>
125
137
 
126
138
  <% if distro =~ /rhel6/ %>
127
-
139
+
128
140
  # CentOS 6 is dead - to use it retrieve the packages from vault:
129
141
  # https://stackoverflow.com/questions/53562691/error-cannot-retrieve-repository-metadata-repomd-xml-for-repository-base-pl
130
-
142
+
131
143
  <%
132
-
144
+
133
145
  cfg = <<-CFG
134
146
  [base]
135
147
  name=CentOS-$releasever - Base
@@ -141,11 +153,11 @@ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
141
153
  CFG
142
154
 
143
155
  %>
144
-
156
+
145
157
  RUN printf "<%= cfg.gsub("\n", "\\n") %>" >/etc/yum.repos.d/CentOS-Base.repo
146
-
158
+
147
159
  <% end %>
148
-
160
+
149
161
  # Enterprise server: net-snmp
150
162
  # lsb_release: redhat-lsb-core
151
163
  # our runner scripts: which
@@ -162,23 +174,8 @@ CFG
162
174
 
163
175
  RUN yum install -y redhat-lsb-core which git gcc libyaml krb5-server \
164
176
  krb5-workstation cyrus-sasl-devel cyrus-sasl-gssapi java-1.8.0-openjdk \
165
- net-snmp python3
177
+ net-snmp python38 python38-devel cmake nodejs
166
178
 
167
- <% if distro =~ /rhel6/ %>
168
-
169
- # RHEL 6 ships with Python 2.6.
170
-
171
- RUN yum install -y centos-release-scl && \
172
- yum install -y python27-python python27-python-devel
173
- ENV PATH=/opt/rh/python27/root/usr/bin:$PATH \
174
- LD_LIBRARY_PATH=/opt/rh/python27/root/usr/lib64
175
-
176
- <% else %>
177
-
178
- RUN yum install -y python-devel
179
-
180
- <% end %>
181
-
182
179
  <% end %>
183
180
 
184
181
  <% if preload? %>
@@ -220,7 +217,7 @@ CFG
220
217
  <% when 'git' %>
221
218
  # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
222
219
  RUN python3 -m pip install virtualenv 'pymongo>=4' python-dateutil psutil
223
-
220
+
224
221
  # Install mtools from git because released versions do not work with pymongo 4.0
225
222
  RUN git clone https://github.com/p-mongodb/mtools && \
226
223
  cd mtools && \
@@ -234,7 +231,7 @@ CFG
234
231
  <% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
235
232
  # ubuntu1604 installs MarkupSafe 0.0.0 here instead of 2.0.0+
236
233
  # as specified by dependencies, causing OCSP mock to not work.
237
- RUN python3 -mpip install asn1crypto oscrypto flask --upgrade
234
+ RUN python3 -mpip install asn1crypto oscrypto flask --upgrade --ignore-installed
238
235
  <% end %>
239
236
 
240
237
  # FLE is tested against 4.0+ servers.
@@ -243,7 +240,7 @@ CFG
243
240
  # boto3~=1.19 cryptography~=3.4.8 pykmip~=0.10.0
244
241
  # cryptography does not install due to lacking setuptools_rust
245
242
  # (either that version or anything that isn't part of system packages)
246
- RUN python3 -mpip install boto3~=1.19 cryptography pykmip~=0.10.0
243
+ RUN python3 -mpip install boto3~=1.19 cryptography pykmip~=0.10.0 'sqlalchemy<2.0.0'
247
244
  <% end %>
248
245
 
249
246
  <% unless ruby_head? || system_ruby? %>
@@ -255,10 +252,6 @@ CFG
255
252
 
256
253
  <% end %>
257
254
 
258
- RUN curl --retry 3 -fL <%= server_download_url %> |tar xzf - && \
259
- mv mongo*/ /opt/mongodb
260
- ENV USE_OPT_MONGODB=1 USE_SYSTEM_PYTHON_PACKAGES=1
261
-
262
255
  <% end %>
263
256
 
264
257
  <% if distro =~ /debian|ubuntu/ %>
@@ -308,6 +301,9 @@ ENV MONGO_ORCHESTRATION_HOME=/tmpfs \
308
301
 
309
302
  COPY . .
310
303
 
304
+ RUN bash -c '. .evergreen/download-mongodb.sh && get_distro && get_mongodb_download_url_for "$DISTRO" "<%= server_version %>" && curl --retry 3 -fL $MONGODB_DOWNLOAD_URL |tar xzf - && mv mongo*/ /opt/mongodb'
305
+ ENV USE_OPT_MONGODB=1 USE_SYSTEM_PYTHON_PACKAGES=1
306
+
311
307
  <% if expose? %>
312
308
 
313
309
  <% ports = [] %>
@@ -71,12 +71,18 @@ prepare_server_from_url() {
71
71
  export PATH="$BINDIR":$PATH
72
72
  }
73
73
 
74
- install_mlaunch_virtualenv() {
74
+ install_mlaunch_venv() {
75
75
  python3 -V || true
76
- if ! python3 -m virtualenv -h >/dev/null; then
76
+ if ! python3 -m venv -h >/dev/null; then
77
77
  # Current virtualenv fails with
78
78
  # https://github.com/pypa/virtualenv/issues/1630
79
- python3 -m pip install 'virtualenv<20' --user
79
+ python3 -m pip install venv --user
80
+ fi
81
+ if ! python3 -m ensurepip -h > /dev/null; then
82
+ # Debian11/Ubuntu2204 have venv installed, but it is nonfunctional unless
83
+ # the python3-venv package is also installed (it lacks the ensurepip
84
+ # module).
85
+ sudo apt-get install --yes python3-venv
80
86
  fi
81
87
  if test "$USE_SYSTEM_PYTHON_PACKAGES" = 1 &&
82
88
  python3 -m pip list |grep mtools
@@ -84,14 +90,19 @@ install_mlaunch_virtualenv() {
84
90
  # Use the existing mtools-legacy
85
91
  :
86
92
  else
87
- venvpath="$MONGO_ORCHESTRATION_HOME"/venv
88
- python3 -m virtualenv -p python3 $venvpath
89
- . $venvpath/bin/activate
93
+ # Spawn a virtual environment, but only if one is not already
94
+ # active...
95
+ if test -z "$VIRTUAL_ENV"; then
96
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
97
+ python3 -m venv $venvpath
98
+ . $venvpath/bin/activate
99
+ fi
100
+
90
101
  # [mlaunch] does not work:
91
102
  # https://github.com/rueckstiess/mtools/issues/856
92
103
  # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
93
104
  #pip install 'mtools==1.7' 'pymongo==4.1' python-dateutil psutil
94
-
105
+
95
106
  # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
96
107
  pip install 'mtools-legacy[mlaunch]' 'pymongo<4' python-dateutil
97
108
  fi
@@ -158,6 +169,19 @@ install_mlaunch_git() {
158
169
  fi
159
170
  }
160
171
 
172
+ install_cmake() {
173
+ if ! command -v cmake &> /dev/null; then
174
+ if ! command -v apt-get &> /dev/null; then
175
+ # no apt-get; assume RHEL
176
+ sudo yum -y install cmake libarchive
177
+ else
178
+ sudo apt-get install --yes cmake
179
+ fi
180
+ else
181
+ echo 'cmake is present'
182
+ fi
183
+ }
184
+
161
185
  # This function sets followong global variables:
162
186
  # server_cert_path
163
187
  # server_ca_path
@@ -173,7 +197,7 @@ calculate_server_args() {
173
197
  fi
174
198
 
175
199
  if test $mongo_version = latest; then
176
- mongo_version=60
200
+ mongo_version=70
177
201
  fi
178
202
 
179
203
  local args="--setParameter enableTestCommands=1"
@@ -1,5 +1,5 @@
1
1
  # When changing, also update the hash in share/Dockerfile.
2
- TOOLCHAIN_VERSION=219833abad4d9d3bf43c0fef101a8ca082ac4ae9
2
+ TOOLCHAIN_VERSION=e8c60866f54bed7e336a37df3a97d6ae1b971b7d
3
3
 
4
4
  set_env_java() {
5
5
  ls -l /opt || true
@@ -53,7 +53,7 @@ set_env_python() {
53
53
  curl -fL --retry 3 https://github.com/p-mongodb/deps/raw/main/"$arch"-python37.tar.xz | \
54
54
  tar xfJ - -C /opt
55
55
  fi
56
-
56
+
57
57
  if test -d /opt/python/3.7/bin; then
58
58
  # Most Evergreen configurations.
59
59
  export PATH=/opt/python/3.7/bin:$PATH
@@ -61,7 +61,7 @@ set_env_python() {
61
61
  # Configurations that use Docker in Evergreen - these don't preload.
62
62
  export PATH=/opt/python37/bin:$PATH
63
63
  fi
64
-
64
+
65
65
  python3 -V
66
66
  fi
67
67
  }
@@ -78,7 +78,7 @@ set_env_node() {
78
78
  # Node from toolchain in Evergreen
79
79
  export PATH=/opt/node/bin:$PATH
80
80
  fi
81
-
81
+
82
82
  node -v
83
83
  }
84
84
 
data/spec/spec_helper.rb CHANGED
@@ -124,6 +124,11 @@ end
124
124
 
125
125
  I18n.config.enforce_available_locales = false
126
126
 
127
+
128
+ if %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
129
+ require "i18n/backend/fallbacks"
130
+ end
131
+
127
132
  # The user must be created before any of the tests are loaded, until
128
133
  # https://jira.mongodb.org/browse/MONGOID-4827 is implemented.
129
134
  client = Mongo::Client.new(SpecConfig.instance.addresses, server_selection_timeout: 3.03)
@@ -0,0 +1,118 @@
1
+ module Mongoid
2
+ module ImmutableIds
3
+ def immutable_id_examples_as(name)
4
+ shared_examples_for name do
5
+ shared_examples 'a persisted document' do
6
+ it 'should ignore the change and issue a warning' do
7
+ expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
8
+ expect { invoke_operation! }.not_to raise_error
9
+ expect(id_is_unchanged).not_to be legacy_behavior_expects_id_to_change
10
+ end
11
+
12
+ context 'when immutable_ids is true' do
13
+ before { Mongoid::Config.immutable_ids = true }
14
+ after { Mongoid::Config.immutable_ids = false }
15
+
16
+ it 'should disallow _id to be updated' do
17
+ expect { invoke_operation! }
18
+ .to raise_error(Mongoid::Errors::ImmutableAttribute)
19
+ end
20
+
21
+ context 'when id is set to the existing value' do
22
+ let(:new_id_value) { object._id }
23
+
24
+ it 'should allow the update to proceed' do
25
+ expect { invoke_operation! }
26
+ .not_to raise_error
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ context 'when the field is _id' do
33
+ let(:new_id_value) { 1234 }
34
+
35
+ context 'when the document is top-level' do
36
+ let(:legacy_behavior_expects_id_to_change) { false }
37
+
38
+ context 'when the document is new' do
39
+ let(:object) { Person.new }
40
+
41
+ it 'should allow _id to be updated' do
42
+ invoke_operation!
43
+ expect(object.new_record?).to be false
44
+ expect(object.reload._id).to be == new_id_value
45
+ end
46
+ end
47
+
48
+ context 'when the document has been persisted' do
49
+ let(:object) { Person.create }
50
+ let!(:original_id) { object._id }
51
+ let(:id_is_unchanged) { Person.exists?(original_id) }
52
+
53
+ it_behaves_like 'a persisted document'
54
+ end
55
+ end
56
+
57
+ context 'when the document is embedded' do
58
+ let(:parent) { Person.create }
59
+ let(:legacy_behavior_expects_id_to_change) { true }
60
+
61
+ context 'when the document is new' do
62
+ let(:object) { parent.favorites.new }
63
+
64
+ it 'should allow _id to be updated' do
65
+ invoke_operation!
66
+ expect(object.new_record?).to be false
67
+ expect(parent.reload.favorites.first._id).to be == new_id_value
68
+ end
69
+ end
70
+
71
+ context 'when the document has been persisted' do
72
+ let(:object) { parent.favorites.create }
73
+ let!(:original_id) { object._id }
74
+ let(:id_is_unchanged) { parent.favorites.where(_id: original_id).exists? }
75
+
76
+ it_behaves_like 'a persisted document'
77
+
78
+ context 'updating embeds_one via parent' do
79
+ context 'when immutable_ids is false' do
80
+ before { expect(Mongoid::Config.immutable_ids).to be false }
81
+
82
+ it 'should ignore the change' do
83
+ expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
84
+
85
+ parent.pet = pet = Pet.new
86
+ parent.save
87
+
88
+ original_id = pet._id
89
+ new_id = BSON::ObjectId.new
90
+
91
+ expect { parent.update(pet: { _id: new_id }) }.not_to raise_error
92
+ expect(parent.reload.pet._id.to_s).to be == original_id.to_s
93
+ end
94
+ end
95
+
96
+ context 'when immutable_ids is true' do
97
+ before { Mongoid::Config.immutable_ids = true }
98
+ after { Mongoid::Config.immutable_ids = false }
99
+
100
+ it 'should raise an exception' do
101
+ parent.pet = pet = Pet.new
102
+ parent.save
103
+
104
+ original_id = pet._id
105
+ new_id = BSON::ObjectId.new
106
+
107
+ expect { parent.update(pet: { _id: new_id }) }
108
+ .to raise_error(Mongoid::Errors::ImmutableAttribute)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -2,9 +2,6 @@
2
2
 
3
3
  module Mongoid
4
4
  module Macros
5
- class I18nBackendWithFallbacks < I18n::Backend::Simple
6
- include I18n::Backend::Fallbacks
7
- end
8
5
 
9
6
  def use_spec_mongoid_config
10
7
  around do |example|
@@ -43,18 +40,6 @@ module Mongoid
43
40
  end
44
41
  end
45
42
 
46
- def with_i18n_fallbacks
47
- require_fallbacks
48
-
49
- around do |example|
50
- old_backend = I18n.backend
51
- I18n.backend = I18nBackendWithFallbacks.new
52
- example.run
53
- ensure
54
- I18n.backend = old_backend
55
- end
56
- end
57
-
58
43
  def driver_config_override(key, value)
59
44
  around do |example|
60
45
  existing = Mongo.send(key)
@@ -93,5 +78,52 @@ module Mongoid
93
78
  end
94
79
  end
95
80
  end
81
+
82
+ def override_query_cache(enabled)
83
+ around do |example|
84
+ cache_enabled = Mongo::QueryCache.enabled?
85
+ Mongo::QueryCache.enabled = enabled
86
+ example.run
87
+ Mongo::QueryCache.enabled = cache_enabled
88
+ end
89
+ end
90
+
91
+ # Override the global persistence context.
92
+ #
93
+ # @param [ :client, :database ] component The component to override.
94
+ # @param [ Object ] value The value to override to.
95
+ def persistence_context_override(component, value)
96
+ around do |example|
97
+ meth = "#{component}_override"
98
+ old_value = Mongoid::Threaded.send(meth)
99
+ Mongoid::Threaded.send("#{meth}=", value)
100
+ example.run
101
+ Mongoid::Threaded.send("#{meth}=", old_value)
102
+ end
103
+ end
104
+
105
+ def time_zone_override(tz)
106
+ around do |example|
107
+ old_tz = Time.zone
108
+ Time.zone = tz
109
+ example.run
110
+ Time.zone = old_tz
111
+ end
112
+ end
113
+
114
+ def with_default_i18n_configs
115
+ around do |example|
116
+ I18n.locale = :en
117
+ I18n.default_locale = :en
118
+ I18n.try(:fallbacks=, I18n::Locale::Fallbacks.new)
119
+ I18n.enforce_available_locales = false
120
+ example.run
121
+ ensure
122
+ I18n.locale = :en
123
+ I18n.default_locale = :en
124
+ I18n.try(:fallbacks=, I18n::Locale::Fallbacks.new)
125
+ I18n.enforce_available_locales = false
126
+ end
127
+ end
96
128
  end
97
129
  end
@@ -87,5 +87,4 @@ class Artist
87
87
  def after_remove_album(album)
88
88
  @after_remove_referenced_called = true
89
89
  end
90
-
91
90
  end
@@ -21,6 +21,7 @@ class Band
21
21
  field :founded, type: Date
22
22
  field :deleted, type: Boolean
23
23
  field :mojo, type: Object
24
+ field :tags, type: Hash
24
25
  field :fans
25
26
 
26
27
  embeds_many :records, cascade_callbacks: true
@@ -15,4 +15,5 @@ class Book
15
15
  end
16
16
 
17
17
  embeds_many :pages, cascade_callbacks: true
18
+ embeds_many :covers, cascade_callbacks: true
18
19
  end
@@ -3,6 +3,8 @@
3
3
  class Building
4
4
  include Mongoid::Document
5
5
 
6
+ field :name, type: String
7
+
6
8
  embeds_one :building_address, validate: false
7
9
  embeds_many :contractors
8
10
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Cover
4
+ include Mongoid::Document
5
+ include Mongoid::Timestamps
6
+
7
+ field :title, type: String
8
+
9
+ embedded_in :book
10
+ end
@@ -10,6 +10,7 @@ class Product
10
10
  field :website, localize: true
11
11
  field :sku, as: :stock_keeping_unit
12
12
  field :tl, as: :tagline, localize: true
13
+ field :title, localize: :present
13
14
  alias_attribute :cost, :price
14
15
 
15
16
  validates :name, presence: true
data.tar.gz.sig CHANGED
Binary file