mongoid 8.0.5 → 8.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) 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/lib/config/locales/en.yml +46 -14
  6. data/lib/mongoid/association/accessors.rb +2 -2
  7. data/lib/mongoid/association/builders.rb +1 -1
  8. data/lib/mongoid/association/embedded/batchable.rb +2 -2
  9. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  10. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -1
  11. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +3 -2
  12. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +6 -6
  13. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -1
  14. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +1 -1
  15. data/lib/mongoid/association/nested/one.rb +40 -2
  16. data/lib/mongoid/association/proxy.rb +1 -1
  17. data/lib/mongoid/association/referenced/counter_cache.rb +2 -2
  18. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  19. data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
  20. data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -3
  21. data/lib/mongoid/association/reflections.rb +2 -2
  22. data/lib/mongoid/attributes/dynamic.rb +1 -1
  23. data/lib/mongoid/attributes/nested.rb +2 -2
  24. data/lib/mongoid/attributes/projector.rb +1 -1
  25. data/lib/mongoid/attributes/readonly.rb +1 -1
  26. data/lib/mongoid/attributes.rb +8 -2
  27. data/lib/mongoid/changeable.rb +104 -4
  28. data/lib/mongoid/clients/storage_options.rb +2 -5
  29. data/lib/mongoid/clients/validators/storage.rb +1 -13
  30. data/lib/mongoid/collection_configurable.rb +58 -0
  31. data/lib/mongoid/composable.rb +2 -0
  32. data/lib/mongoid/config/defaults.rb +60 -0
  33. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  34. data/lib/mongoid/config/validators.rb +1 -0
  35. data/lib/mongoid/config.rb +101 -0
  36. data/lib/mongoid/contextual/atomic.rb +1 -1
  37. data/lib/mongoid/contextual/memory.rb +233 -33
  38. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  39. data/lib/mongoid/contextual/mongo.rb +373 -113
  40. data/lib/mongoid/contextual/none.rb +162 -7
  41. data/lib/mongoid/contextual.rb +12 -0
  42. data/lib/mongoid/criteria/findable.rb +2 -2
  43. data/lib/mongoid/criteria/includable.rb +4 -3
  44. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  45. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  46. data/lib/mongoid/criteria/queryable/optional.rb +8 -8
  47. data/lib/mongoid/criteria/queryable/selectable.rb +43 -12
  48. data/lib/mongoid/criteria.rb +6 -5
  49. data/lib/mongoid/deprecable.rb +1 -1
  50. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  51. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  52. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  53. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  54. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  55. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  56. data/lib/mongoid/errors.rb +4 -1
  57. data/lib/mongoid/extensions/object.rb +2 -2
  58. data/lib/mongoid/extensions/time.rb +2 -0
  59. data/lib/mongoid/fields/localized.rb +10 -0
  60. data/lib/mongoid/fields/standard.rb +10 -0
  61. data/lib/mongoid/fields.rb +69 -13
  62. data/lib/mongoid/findable.rb +27 -3
  63. data/lib/mongoid/interceptable.rb +7 -6
  64. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  65. data/lib/mongoid/matcher/type.rb +1 -1
  66. data/lib/mongoid/persistable/creatable.rb +1 -0
  67. data/lib/mongoid/persistable/deletable.rb +1 -1
  68. data/lib/mongoid/persistable/savable.rb +13 -1
  69. data/lib/mongoid/persistable/unsettable.rb +2 -2
  70. data/lib/mongoid/persistable/updatable.rb +51 -1
  71. data/lib/mongoid/persistable/upsertable.rb +20 -1
  72. data/lib/mongoid/persistable.rb +3 -0
  73. data/lib/mongoid/query_cache.rb +5 -1
  74. data/lib/mongoid/railties/database.rake +7 -2
  75. data/lib/mongoid/stateful.rb +22 -1
  76. data/lib/mongoid/tasks/database.rake +12 -0
  77. data/lib/mongoid/tasks/database.rb +20 -0
  78. data/lib/mongoid/utils.rb +22 -0
  79. data/lib/mongoid/validatable/macros.rb +5 -5
  80. data/lib/mongoid/validatable.rb +4 -1
  81. data/lib/mongoid/version.rb +1 -1
  82. data/lib/mongoid/warnings.rb +17 -1
  83. data/lib/mongoid.rb +16 -3
  84. data/spec/integration/app_spec.rb +2 -2
  85. data/spec/integration/callbacks_models.rb +37 -0
  86. data/spec/integration/callbacks_spec.rb +134 -0
  87. data/spec/integration/discriminator_key_spec.rb +4 -5
  88. data/spec/integration/i18n_fallbacks_spec.rb +3 -2
  89. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +27 -0
  90. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +20 -25
  91. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  92. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  93. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -18
  94. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +5 -27
  95. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +9 -50
  96. data/spec/mongoid/association/syncable_spec.rb +1 -1
  97. data/spec/mongoid/attributes_spec.rb +3 -6
  98. data/spec/mongoid/changeable_spec.rb +299 -24
  99. data/spec/mongoid/clients_spec.rb +122 -13
  100. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  101. data/spec/mongoid/config/defaults_spec.rb +160 -0
  102. data/spec/mongoid/config_spec.rb +154 -18
  103. data/spec/mongoid/contextual/memory_spec.rb +332 -76
  104. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  105. data/spec/mongoid/contextual/mongo_spec.rb +995 -36
  106. data/spec/mongoid/contextual/none_spec.rb +49 -2
  107. data/spec/mongoid/copyable_spec.rb +3 -11
  108. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -10
  109. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  110. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +419 -0
  111. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -1
  112. data/spec/mongoid/criteria/queryable/selector_spec.rb +1 -1
  113. data/spec/mongoid/criteria_projection_spec.rb +1 -4
  114. data/spec/mongoid/criteria_spec.rb +5 -9
  115. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  116. data/spec/mongoid/extensions/time_spec.rb +8 -43
  117. data/spec/mongoid/extensions/time_with_zone_spec.rb +7 -52
  118. data/spec/mongoid/fields/localized_spec.rb +46 -28
  119. data/spec/mongoid/fields_spec.rb +136 -34
  120. data/spec/mongoid/findable_spec.rb +391 -34
  121. data/spec/mongoid/indexable_spec.rb +16 -10
  122. data/spec/mongoid/interceptable_spec.rb +15 -3
  123. data/spec/mongoid/persistable/deletable_spec.rb +26 -6
  124. data/spec/mongoid/persistable/destroyable_spec.rb +26 -6
  125. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  126. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  127. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  128. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  129. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  130. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  131. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  132. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  133. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  134. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  135. data/spec/mongoid/persistable/upsertable_spec.rb +80 -6
  136. data/spec/mongoid/persistence_context_spec.rb +7 -57
  137. data/spec/mongoid/query_cache_spec.rb +56 -61
  138. data/spec/mongoid/reloadable_spec.rb +25 -5
  139. data/spec/mongoid/scopable_spec.rb +70 -0
  140. data/spec/mongoid/serializable_spec.rb +9 -30
  141. data/spec/mongoid/stateful_spec.rb +122 -8
  142. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  143. data/spec/mongoid/tasks/database_spec.rb +127 -0
  144. data/spec/mongoid/timestamps_spec.rb +9 -11
  145. data/spec/mongoid/touchable_spec.rb +277 -5
  146. data/spec/mongoid/touchable_spec_models.rb +3 -1
  147. data/spec/mongoid/traversable_spec.rb +9 -24
  148. data/spec/mongoid/validatable/uniqueness_spec.rb +2 -3
  149. data/spec/mongoid_spec.rb +33 -9
  150. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  151. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  152. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  153. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  154. data/spec/shared/lib/mrss/utils.rb +28 -6
  155. data/spec/shared/share/Dockerfile.erb +36 -40
  156. data/spec/shared/shlib/server.sh +32 -8
  157. data/spec/shared/shlib/set_env.sh +4 -4
  158. data/spec/spec_helper.rb +5 -0
  159. data/spec/support/immutable_ids.rb +118 -0
  160. data/spec/support/macros.rb +47 -15
  161. data/spec/support/models/artist.rb +0 -1
  162. data/spec/support/models/band.rb +1 -0
  163. data/spec/support/models/book.rb +1 -0
  164. data/spec/support/models/building.rb +2 -0
  165. data/spec/support/models/cover.rb +10 -0
  166. data/spec/support/models/product.rb +1 -0
  167. data.tar.gz.sig +0 -0
  168. metadata +42 -6
  169. metadata.gz.sig +0 -0
  170. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  171. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
@@ -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