bson 4.14.1-java → 5.0.0-java

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 (142) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -4
  4. data/Rakefile +5 -0
  5. data/lib/bson/active_support.rb +1 -0
  6. data/lib/bson/array.rb +57 -31
  7. data/lib/bson/big_decimal.rb +16 -6
  8. data/lib/bson/binary.rb +255 -128
  9. data/lib/bson/boolean.rb +1 -0
  10. data/lib/bson/code.rb +9 -11
  11. data/lib/bson/code_with_scope.rb +8 -10
  12. data/lib/bson/config.rb +1 -27
  13. data/lib/bson/date.rb +2 -1
  14. data/lib/bson/date_time.rb +2 -1
  15. data/lib/bson/db_pointer.rb +11 -12
  16. data/lib/bson/dbref.rb +11 -9
  17. data/lib/bson/decimal128/builder.rb +9 -8
  18. data/lib/bson/decimal128.rb +33 -109
  19. data/lib/bson/document.rb +1 -0
  20. data/lib/bson/environment.rb +1 -0
  21. data/lib/bson/error/bson_decode_error.rb +11 -0
  22. data/lib/bson/error/ext_json_parse_error.rb +11 -0
  23. data/lib/bson/error/illegal_key.rb +23 -0
  24. data/lib/bson/error/invalid_binary_type.rb +37 -0
  25. data/lib/bson/error/invalid_dbref_argument.rb +12 -0
  26. data/lib/bson/error/invalid_decimal128_argument.rb +25 -0
  27. data/lib/bson/error/invalid_decimal128_range.rb +27 -0
  28. data/lib/bson/error/invalid_decimal128_string.rb +26 -0
  29. data/lib/bson/error/invalid_key.rb +24 -0
  30. data/lib/bson/error/invalid_object_id.rb +11 -0
  31. data/lib/bson/error/invalid_regexp_pattern.rb +13 -0
  32. data/lib/bson/error/unrepresentable_precision.rb +19 -0
  33. data/lib/bson/error/unserializable_class.rb +13 -0
  34. data/lib/bson/error/unsupported_binary_subtype.rb +12 -0
  35. data/lib/bson/error/unsupported_type.rb +11 -0
  36. data/lib/bson/error.rb +16 -28
  37. data/lib/bson/ext_json.rb +1 -0
  38. data/lib/bson/false_class.rb +2 -1
  39. data/lib/bson/float.rb +2 -1
  40. data/lib/bson/hash.rb +127 -72
  41. data/lib/bson/int32.rb +16 -4
  42. data/lib/bson/int64.rb +16 -4
  43. data/lib/bson/integer.rb +3 -4
  44. data/lib/bson/json.rb +1 -0
  45. data/lib/bson/max_key.rb +7 -9
  46. data/lib/bson/min_key.rb +7 -9
  47. data/lib/bson/nil_class.rb +1 -0
  48. data/lib/bson/object.rb +5 -25
  49. data/lib/bson/object_id.rb +75 -121
  50. data/lib/bson/open_struct.rb +3 -2
  51. data/lib/bson/regexp.rb +35 -64
  52. data/lib/bson/registry.rb +2 -6
  53. data/lib/bson/specialized.rb +2 -1
  54. data/lib/bson/string.rb +4 -27
  55. data/lib/bson/symbol.rb +22 -19
  56. data/lib/bson/time.rb +2 -1
  57. data/lib/bson/time_with_zone.rb +13 -1
  58. data/lib/bson/timestamp.rb +2 -1
  59. data/lib/bson/true_class.rb +2 -1
  60. data/lib/bson/undefined.rb +14 -0
  61. data/lib/bson/version.rb +2 -1
  62. data/lib/bson-ruby.jar +0 -0
  63. data/lib/bson.rb +3 -2
  64. data/spec/bson/array_spec.rb +19 -60
  65. data/spec/bson/big_decimal_spec.rb +16 -4
  66. data/spec/bson/binary_spec.rb +83 -74
  67. data/spec/bson/binary_uuid_spec.rb +1 -0
  68. data/spec/bson/boolean_spec.rb +1 -0
  69. data/spec/bson/byte_buffer_read_spec.rb +1 -0
  70. data/spec/bson/byte_buffer_spec.rb +1 -0
  71. data/spec/bson/byte_buffer_write_spec.rb +1 -0
  72. data/spec/bson/code_spec.rb +5 -3
  73. data/spec/bson/code_with_scope_spec.rb +5 -3
  74. data/spec/bson/config_spec.rb +1 -35
  75. data/spec/bson/date_spec.rb +1 -0
  76. data/spec/bson/date_time_spec.rb +1 -0
  77. data/spec/bson/dbref_legacy_spec.rb +20 -3
  78. data/spec/bson/dbref_spec.rb +9 -9
  79. data/spec/bson/decimal128_spec.rb +249 -14
  80. data/spec/bson/document_as_spec.rb +1 -0
  81. data/spec/bson/document_spec.rb +1 -1
  82. data/spec/bson/ext_json_parse_spec.rb +1 -0
  83. data/spec/bson/false_class_spec.rb +8 -0
  84. data/spec/bson/float_spec.rb +8 -3
  85. data/spec/bson/hash_as_spec.rb +1 -0
  86. data/spec/bson/hash_spec.rb +87 -75
  87. data/spec/bson/int32_spec.rb +21 -6
  88. data/spec/bson/int64_spec.rb +21 -6
  89. data/spec/bson/integer_spec.rb +45 -13
  90. data/spec/bson/json_spec.rb +1 -0
  91. data/spec/bson/max_key_spec.rb +5 -3
  92. data/spec/bson/min_key_spec.rb +5 -3
  93. data/spec/bson/nil_class_spec.rb +1 -0
  94. data/spec/bson/object_id_spec.rb +43 -4
  95. data/spec/bson/object_spec.rb +2 -1
  96. data/spec/bson/open_struct_spec.rb +14 -71
  97. data/spec/bson/raw_spec.rb +9 -15
  98. data/spec/bson/regexp_spec.rb +4 -3
  99. data/spec/bson/registry_spec.rb +2 -1
  100. data/spec/bson/string_spec.rb +13 -38
  101. data/spec/bson/symbol_raw_spec.rb +25 -0
  102. data/spec/bson/symbol_spec.rb +15 -18
  103. data/spec/bson/time_spec.rb +1 -0
  104. data/spec/bson/time_with_zone_spec.rb +1 -0
  105. data/spec/bson/timestamp_spec.rb +1 -0
  106. data/spec/bson/true_class_spec.rb +8 -0
  107. data/spec/bson/undefined_spec.rb +27 -0
  108. data/spec/bson_spec.rb +1 -0
  109. data/spec/runners/common_driver.rb +6 -5
  110. data/spec/runners/corpus.rb +6 -0
  111. data/spec/runners/corpus_legacy.rb +1 -0
  112. data/spec/shared/lib/mrss/constraints.rb +8 -16
  113. data/spec/shared/lib/mrss/docker_runner.rb +30 -3
  114. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  115. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  116. data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
  117. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  118. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  119. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  120. data/spec/shared/lib/mrss/utils.rb +28 -6
  121. data/spec/shared/share/Dockerfile.erb +68 -85
  122. data/spec/shared/shlib/config.sh +27 -0
  123. data/spec/shared/shlib/server.sh +73 -24
  124. data/spec/shared/shlib/set_env.sh +39 -1
  125. data/spec/spec_helper.rb +1 -0
  126. data/spec/spec_tests/common_driver_spec.rb +9 -4
  127. data/spec/spec_tests/corpus_legacy_spec.rb +1 -0
  128. data/spec/spec_tests/corpus_spec.rb +13 -3
  129. data/spec/spec_tests/data/corpus/binary.json +5 -0
  130. data/spec/spec_tests/data/corpus/code.json +13 -13
  131. data/spec/spec_tests/data/corpus/decimal128-4.json +48 -0
  132. data/spec/spec_tests/data/corpus/decimal128-6.json +12 -0
  133. data/spec/spec_tests/data/corpus/decimal128-7.json +4 -0
  134. data/spec/spec_tests/data/corpus/document.json +20 -0
  135. data/spec/spec_tests/data/corpus/symbol.json +7 -7
  136. data/spec/spec_tests/data/corpus/top.json +18 -3
  137. data/spec/support/shared_examples.rb +28 -5
  138. data/spec/support/spec_config.rb +1 -0
  139. data/spec/support/utils.rb +49 -1
  140. data.tar.gz.sig +0 -0
  141. metadata +166 -141
  142. metadata.gz.sig +0 -0
@@ -1,6 +1,18 @@
1
1
  # This file contains functions pertaining to downloading, starting and
2
2
  # configuring a MongoDB server.
3
3
 
4
+ # Note that mlaunch is executed with (and therefore installed with) Python 2.
5
+ # The reason for this is that in the past, some of the distros we tested on
6
+ # had an ancient version of Python 3 that was unusable (e.g. it couldn't
7
+ # install anything from PyPI due to outdated TLS/SSL implementation).
8
+ # It is likely that all of the current distros we use have a recent enough
9
+ # and working Python 3 implementation, such that we could use Python 3 for
10
+ # everything.
11
+ #
12
+ # Note that some distros (e.g. ubuntu2004) do not contain a `python' binary
13
+ # at all, thus python2 or python3 must be explicitly specified depending on
14
+ # the desired version.
15
+
4
16
  set_fcv() {
5
17
  if test -n "$FCV"; then
6
18
  mongo --eval 'assert.commandWorked(db.adminCommand( { setFeatureCompatibilityVersion: "'"$FCV"'" } ));' "$MONGODB_URI"
@@ -34,44 +46,65 @@ prepare_server() {
34
46
  if test "$MONGODB_VERSION" = latest; then
35
47
  # Test on the most recent published 4.3 release.
36
48
  # https://jira.mongodb.org/browse/RUBY-1724
37
- echo 'Using "latest" server is not currently implemented' 1>&2
38
- exit 1
49
+
50
+ . $PROJECT_DIRECTORY/.mod/drivers-evergreen-tools/.evergreen/download-mongodb.sh
51
+
52
+ get_distro
53
+ get_mongodb_download_url_for "$DISTRO" "latest"
54
+ prepare_server_from_url $MONGODB_DOWNLOAD_URL
39
55
  else
40
56
  download_version="$MONGODB_VERSION"
57
+ url=`$(dirname $0)/get-mongodb-download-url $download_version $arch`
58
+ prepare_server_from_url $url
41
59
  fi
42
60
 
43
- url=`$(dirname $0)/get-mongodb-download-url $download_version $arch`
44
-
45
- prepare_server_from_url $url
46
61
  }
47
62
 
48
63
  prepare_server_from_url() {
49
64
  url=$1
50
65
 
51
- mongodb_dir="$MONGO_ORCHESTRATION_HOME"/mdb
66
+ dirname=`basename $url |sed -e s/.tgz//`
67
+ mongodb_dir="$MONGO_ORCHESTRATION_HOME"/mdb/"$dirname"
52
68
  mkdir -p "$mongodb_dir"
53
- curl --retry 3 $url |tar xz -C "$mongodb_dir" -f -
54
- BINDIR="$mongodb_dir"/`basename $url |sed -e s/.tgz//`/bin
69
+ curl --retry 3 $url | tar xz -C "$mongodb_dir" --strip-components 1 -f -
70
+ BINDIR="$mongodb_dir"/bin
55
71
  export PATH="$BINDIR":$PATH
56
72
  }
57
73
 
58
- install_mlaunch_virtualenv() {
59
- python2 -V || true
60
- if ! python2 -m virtualenv -h >/dev/null; then
74
+ install_mlaunch_venv() {
75
+ python3 -V || true
76
+ if ! python3 -m venv -h >/dev/null; then
61
77
  # Current virtualenv fails with
62
78
  # https://github.com/pypa/virtualenv/issues/1630
63
- python2 -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
64
86
  fi
65
87
  if test "$USE_SYSTEM_PYTHON_PACKAGES" = 1 &&
66
- python2 -m pip list |grep mtools-legacy
88
+ python3 -m pip list |grep mtools
67
89
  then
68
90
  # Use the existing mtools-legacy
69
91
  :
70
92
  else
71
- venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
- python2 -m virtualenv -p python2 $venvpath
73
- . $venvpath/bin/activate
74
- pip install 'mtools-legacy[mlaunch]'
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
+
101
+ # [mlaunch] does not work:
102
+ # https://github.com/rueckstiess/mtools/issues/856
103
+ # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
104
+ #pip install 'mtools==1.7' 'pymongo==4.1' python-dateutil psutil
105
+
106
+ # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
107
+ pip install 'mtools-legacy[mlaunch]' 'pymongo<4' python-dateutil
75
108
  fi
76
109
  }
77
110
 
@@ -84,7 +117,8 @@ install_mlaunch_pip() {
84
117
  python -V || true
85
118
  python3 -V || true
86
119
  pythonpath="$MONGO_ORCHESTRATION_HOME"/python
87
- pip install -t "$pythonpath" 'mtools-legacy[mlaunch]'
120
+ # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
121
+ pip install -t "$pythonpath" 'mtools-legacy[mlaunch]' 'pymongo<4' python-dateutil
88
122
  export PATH="$pythonpath/bin":$PATH
89
123
  export PYTHONPATH="$pythonpath"
90
124
  }
@@ -108,7 +142,8 @@ install_mlaunch_git() {
108
142
  virtualenv -p python3 $venvpath
109
143
  . $venvpath/bin/activate
110
144
 
111
- pip3 install psutil pymongo
145
+ # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
146
+ pip3 install psutil pymongo python-dateutil
112
147
 
113
148
  git clone $repo mlaunch
114
149
  cd mlaunch
@@ -123,16 +158,30 @@ install_mlaunch_git() {
123
158
  virtualenv $venvpath
124
159
  . $venvpath/bin/activate
125
160
 
126
- pip install psutil pymongo
161
+ # dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
162
+ pip install psutil pymongo python-dateutil
127
163
 
128
164
  git clone $repo mlaunch
129
165
  (cd mlaunch &&
130
166
  git checkout origin/$branch &&
131
- python setup.py install
167
+ python2 setup.py install
132
168
  )
133
169
  fi
134
170
  }
135
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
+
136
185
  # This function sets followong global variables:
137
186
  # server_cert_path
138
187
  # server_ca_path
@@ -148,7 +197,7 @@ calculate_server_args() {
148
197
  fi
149
198
 
150
199
  if test $mongo_version = latest; then
151
- mongo_version=49
200
+ mongo_version=70
152
201
  fi
153
202
 
154
203
  local args="--setParameter enableTestCommands=1"
@@ -309,7 +358,7 @@ launch_ocsp_mock() {
309
358
 
310
359
  launch_server() {
311
360
  local dbdir="$1"
312
- python -m mtools.mlaunch.mlaunch --dir "$dbdir" --binarypath "$BINDIR" $SERVER_ARGS
361
+ python3 -m mtools.mlaunch.mlaunch --dir "$dbdir" --binarypath "$BINDIR" $SERVER_ARGS
313
362
 
314
363
  if test "$TOPOLOGY" = sharded-cluster && test $MONGODB_VERSION = 3.6; then
315
364
  # On 3.6 server the sessions collection is not immediately available,
@@ -345,7 +394,7 @@ launch_server() {
345
394
  port="${BASH_REMATCH[1]}"
346
395
  mongoses+=("${base_url}:${port}")
347
396
  fi
348
- done < <(python -m mtools.mlaunch.mlaunch list --dir "$dbdir" --binarypath "$BINDIR")
397
+ done < <(python2 -m mtools.mlaunch.mlaunch list --dir "$dbdir" --binarypath "$BINDIR")
349
398
 
350
399
  if [ -n "$config_server" ]; then
351
400
  ${mongo_command} "$config_server" --eval 'db.adminCommand("refreshLogicalSessionCacheNow")'
@@ -1,4 +1,5 @@
1
- TOOLCHAIN_VERSION=43b0b8a644363c4052b9bf8221320a1828fe01a5
1
+ # When changing, also update the hash in share/Dockerfile.
2
+ TOOLCHAIN_VERSION=e8c60866f54bed7e336a37df3a97d6ae1b971b7d
2
3
 
3
4
  set_env_java() {
4
5
  ls -l /opt || true
@@ -44,6 +45,43 @@ set_env_java() {
44
45
  fi
45
46
  }
46
47
 
48
+ set_env_python() {
49
+ if test "$DOCKER_PRELOAD" != 1; then
50
+ if test -n "$DOCKER"; then
51
+ # If we are running in Docker and not preloading, we need to fetch the
52
+ # Python binary.
53
+ curl -fL --retry 3 https://github.com/p-mongodb/deps/raw/main/"$arch"-python37.tar.xz | \
54
+ tar xfJ - -C /opt
55
+ fi
56
+
57
+ if test -d /opt/python/3.7/bin; then
58
+ # Most Evergreen configurations.
59
+ export PATH=/opt/python/3.7/bin:$PATH
60
+ elif test -d /opt/python37/bin; then
61
+ # Configurations that use Docker in Evergreen - these don't preload.
62
+ export PATH=/opt/python37/bin:$PATH
63
+ fi
64
+
65
+ python3 -V
66
+ fi
67
+ }
68
+
69
+ set_env_node() {
70
+ if test "$DOCKER_PRELOAD" != 1; then
71
+ dir=`ls -d /opt/nodejs/node-v12* |head -1`
72
+ if test -z "$dir"; then
73
+ echo "Node 12 missing" 1>&2
74
+ exit 2
75
+ fi
76
+ export PATH="$dir/bin:$PATH"
77
+ elif test -d /opt/node/bin; then
78
+ # Node from toolchain in Evergreen
79
+ export PATH=/opt/node/bin:$PATH
80
+ fi
81
+
82
+ node -v
83
+ }
84
+
47
85
  set_env_ruby() {
48
86
  if test -z "$RVM_RUBY"; then
49
87
  echo "Empty RVM_RUBY, aborting"
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  require 'spec_helper'
2
3
  require 'runners/common_driver'
3
4
 
@@ -25,8 +26,12 @@ describe 'Driver common bson tests' do
25
26
  expect(test.from_json_string).to eq(test.object)
26
27
  end
27
28
 
29
+ it 'serializes to a string', if: test.to_ext_json? do
30
+ expect(test.document_as_extended_json).to eq(test.ext_json)
31
+ end
32
+
28
33
  it 'creates the correct extended json document from the decoded object', if: test.to_ext_json? do
29
- expect(test.document_as_json).to eq(test.ext_json)
34
+ expect(test.document_as_extended_json).to eq(test.ext_json)
30
35
  end
31
36
 
32
37
  it 'parses the string value to the same value as the decoded document', if: test.from_string? do
@@ -63,9 +68,9 @@ describe 'Driver common bson tests' do
63
68
 
64
69
  let(:valid_errors) do
65
70
  [
66
- BSON::Decimal128::InvalidString,
67
- BSON::Decimal128::InvalidRange,
68
- BSON::Decimal128::UnrepresentablePrecision,
71
+ BSON::Error::InvalidDecimal128String,
72
+ BSON::Error::InvalidDecimal128Range,
73
+ BSON::Error::UnrepresentablePrecision,
69
74
  ]
70
75
  end
71
76
 
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  require 'spec_helper'
2
3
  require 'runners/corpus_legacy'
3
4
 
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  require 'spec_helper'
2
3
  require 'runners/corpus'
3
4
 
@@ -105,8 +106,17 @@ describe 'BSON Corpus spec tests' do
105
106
 
106
107
  context("parse error: #{test.description}") do
107
108
 
108
- let(:parsed_extjson) do
109
- BSON::ExtJSON.parse(test.string, mode: :bson)
109
+ # As per:
110
+ # https://github.com/mongodb/specifications/blob/e7ee829329400786e01279b4f37d4e440d1e9cfa/source/bson-corpus/bson-corpus.rst#decimal128-type-0x13
111
+ #
112
+ # Values under test must be parsed in a type-specific manner.
113
+ let(:parsed_value) do
114
+ case spec.bson_type
115
+ when BSON::Decimal128::BSON_TYPE
116
+ BSON::Decimal128.new(test.string)
117
+ else
118
+ BSON::ExtJSON.parse(test.string, mode: :bson)
119
+ end
110
120
  end
111
121
 
112
122
  # Until bson-ruby gets an exception hierarchy, we can only rescue
@@ -114,7 +124,7 @@ describe 'BSON Corpus spec tests' do
114
124
  # https://jira.mongodb.org/browse/RUBY-1806
115
125
  it 'raises an exception' do
116
126
  expect do
117
- parsed_extjson
127
+ parsed_value
118
128
  end.to raise_error(Exception)
119
129
  end
120
130
  end
@@ -55,6 +55,11 @@
55
55
  "canonical_bson": "1D000000057800100000000773FFD26444B34C6990E8E7D1DFC035D400",
56
56
  "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"07\"}}}"
57
57
  },
58
+ {
59
+ "description": "subtype 0x08",
60
+ "canonical_bson": "1D000000057800100000000873FFD26444B34C6990E8E7D1DFC035D400",
61
+ "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"08\"}}}"
62
+ },
58
63
  {
59
64
  "description": "subtype 0x80",
60
65
  "canonical_bson": "0F0000000578000200000080FFFF00",
@@ -20,48 +20,48 @@
20
20
  },
21
21
  {
22
22
  "description": "two-byte UTF-8 (\u00e9)",
23
- "canonical_bson": "190000000261000D000000C3A9C3A9C3A9C3A9C3A9C3A90000",
24
- "canonical_extjson": "{\"a\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}"
23
+ "canonical_bson": "190000000D61000D000000C3A9C3A9C3A9C3A9C3A9C3A90000",
24
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}}"
25
25
  },
26
26
  {
27
27
  "description": "three-byte UTF-8 (\u2606)",
28
- "canonical_bson": "190000000261000D000000E29886E29886E29886E298860000",
29
- "canonical_extjson": "{\"a\" : \"\\u2606\\u2606\\u2606\\u2606\"}"
28
+ "canonical_bson": "190000000D61000D000000E29886E29886E29886E298860000",
29
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u2606\\u2606\\u2606\\u2606\"}}"
30
30
  },
31
31
  {
32
32
  "description": "Embedded nulls",
33
- "canonical_bson": "190000000261000D0000006162006261620062616261620000",
34
- "canonical_extjson": "{\"a\" : \"ab\\u0000bab\\u0000babab\"}"
33
+ "canonical_bson": "190000000D61000D0000006162006261620062616261620000",
34
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"ab\\u0000bab\\u0000babab\"}}"
35
35
  }
36
36
  ],
37
37
  "decodeErrors": [
38
38
  {
39
39
  "description": "bad code string length: 0 (but no 0x00 either)",
40
- "bson": "0C0000000261000000000000"
40
+ "bson": "0C0000000D61000000000000"
41
41
  },
42
42
  {
43
43
  "description": "bad code string length: -1",
44
- "bson": "0C000000026100FFFFFFFF00"
44
+ "bson": "0C0000000D6100FFFFFFFF00"
45
45
  },
46
46
  {
47
47
  "description": "bad code string length: eats terminator",
48
- "bson": "10000000026100050000006200620000"
48
+ "bson": "100000000D6100050000006200620000"
49
49
  },
50
50
  {
51
51
  "description": "bad code string length: longer than rest of document",
52
- "bson": "120000000200FFFFFF00666F6F6261720000"
52
+ "bson": "120000000D00FFFFFF00666F6F6261720000"
53
53
  },
54
54
  {
55
55
  "description": "code string is not null-terminated",
56
- "bson": "1000000002610004000000616263FF00"
56
+ "bson": "100000000D610004000000616263FF00"
57
57
  },
58
58
  {
59
59
  "description": "empty code string, but extra null",
60
- "bson": "0E00000002610001000000000000"
60
+ "bson": "0E0000000D610001000000000000"
61
61
  },
62
62
  {
63
63
  "description": "invalid UTF-8",
64
- "bson": "0E00000002610002000000E90000"
64
+ "bson": "0E0000000D610002000000E90000"
65
65
  }
66
66
  ]
67
67
  }
@@ -112,6 +112,54 @@
112
112
  {
113
113
  "description": "[basx563] Near-specials (Conversion_syntax)",
114
114
  "string": "NaNs"
115
+ },
116
+ {
117
+ "description": "[dqbas939] overflow results at different rounding modes (Overflow & Inexact & Rounded)",
118
+ "string": "-7e10000"
119
+ },
120
+ {
121
+ "description": "[dqbsr534] negatives (Rounded & Inexact)",
122
+ "string": "-1.11111111111111111111111111111234650"
123
+ },
124
+ {
125
+ "description": "[dqbsr535] negatives (Rounded & Inexact)",
126
+ "string": "-1.11111111111111111111111111111234551"
127
+ },
128
+ {
129
+ "description": "[dqbsr533] negatives (Rounded & Inexact)",
130
+ "string": "-1.11111111111111111111111111111234550"
131
+ },
132
+ {
133
+ "description": "[dqbsr532] negatives (Rounded & Inexact)",
134
+ "string": "-1.11111111111111111111111111111234549"
135
+ },
136
+ {
137
+ "description": "[dqbsr432] check rounding modes heeded (Rounded & Inexact)",
138
+ "string": "1.11111111111111111111111111111234549"
139
+ },
140
+ {
141
+ "description": "[dqbsr433] check rounding modes heeded (Rounded & Inexact)",
142
+ "string": "1.11111111111111111111111111111234550"
143
+ },
144
+ {
145
+ "description": "[dqbsr435] check rounding modes heeded (Rounded & Inexact)",
146
+ "string": "1.11111111111111111111111111111234551"
147
+ },
148
+ {
149
+ "description": "[dqbsr434] check rounding modes heeded (Rounded & Inexact)",
150
+ "string": "1.11111111111111111111111111111234650"
151
+ },
152
+ {
153
+ "description": "[dqbas938] overflow results at different rounding modes (Overflow & Inexact & Rounded)",
154
+ "string": "7e10000"
155
+ },
156
+ {
157
+ "description": "Inexact rounding#1",
158
+ "string": "100000000000000000000000000000000000000000000000000000000001"
159
+ },
160
+ {
161
+ "description": "Inexact rounding#2",
162
+ "string": "1E-6177"
115
163
  }
116
164
  ]
117
165
  }
@@ -75,6 +75,18 @@
75
75
  "description": "Empty string",
76
76
  "string": ""
77
77
  },
78
+ {
79
+ "description": "leading white space positive number",
80
+ "string": " 1"
81
+ },
82
+ {
83
+ "description": "leading white space negative number",
84
+ "string": " -1"
85
+ },
86
+ {
87
+ "description": "trailing white space",
88
+ "string": "1 "
89
+ },
78
90
  {
79
91
  "description": "Invalid",
80
92
  "string": "E"
@@ -267,6 +267,10 @@
267
267
  "description": "[basx570] Near-specials (Conversion_syntax)",
268
268
  "string": "9Inf"
269
269
  },
270
+ {
271
+ "description": "[basx512] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)",
272
+ "string": "12 "
273
+ },
270
274
  {
271
275
  "description": "[basx517] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)",
272
276
  "string": "12-"
@@ -17,6 +17,26 @@
17
17
  "description": "Single-character key subdoc",
18
18
  "canonical_bson": "160000000378000E0000000261000200000062000000",
19
19
  "canonical_extjson": "{\"x\" : {\"a\" : \"b\"}}"
20
+ },
21
+ {
22
+ "description": "Dollar-prefixed key in sub-document",
23
+ "canonical_bson": "170000000378000F000000022461000200000062000000",
24
+ "canonical_extjson": "{\"x\" : {\"$a\" : \"b\"}}"
25
+ },
26
+ {
27
+ "description": "Dollar as key in sub-document",
28
+ "canonical_bson": "160000000378000E0000000224000200000061000000",
29
+ "canonical_extjson": "{\"x\" : {\"$\" : \"a\"}}"
30
+ },
31
+ {
32
+ "description": "Dotted key in sub-document",
33
+ "canonical_bson": "180000000378001000000002612E62000200000063000000",
34
+ "canonical_extjson": "{\"x\" : {\"a.b\" : \"c\"}}"
35
+ },
36
+ {
37
+ "description": "Dot as key in sub-document",
38
+ "canonical_bson": "160000000378000E000000022E000200000061000000",
39
+ "canonical_extjson": "{\"x\" : {\".\" : \"a\"}}"
20
40
  }
21
41
  ],
22
42
  "decodeErrors": [
@@ -50,31 +50,31 @@
50
50
  "decodeErrors": [
51
51
  {
52
52
  "description": "bad symbol length: 0 (but no 0x00 either)",
53
- "bson": "0C0000000261000000000000"
53
+ "bson": "0C0000000E61000000000000"
54
54
  },
55
55
  {
56
56
  "description": "bad symbol length: -1",
57
- "bson": "0C000000026100FFFFFFFF00"
57
+ "bson": "0C0000000E6100FFFFFFFF00"
58
58
  },
59
59
  {
60
60
  "description": "bad symbol length: eats terminator",
61
- "bson": "10000000026100050000006200620000"
61
+ "bson": "100000000E6100050000006200620000"
62
62
  },
63
63
  {
64
64
  "description": "bad symbol length: longer than rest of document",
65
- "bson": "120000000200FFFFFF00666F6F6261720000"
65
+ "bson": "120000000E00FFFFFF00666F6F6261720000"
66
66
  },
67
67
  {
68
68
  "description": "symbol is not null-terminated",
69
- "bson": "1000000002610004000000616263FF00"
69
+ "bson": "100000000E610004000000616263FF00"
70
70
  },
71
71
  {
72
72
  "description": "empty symbol, but extra null",
73
- "bson": "0E00000002610001000000000000"
73
+ "bson": "0E0000000E610001000000000000"
74
74
  },
75
75
  {
76
76
  "description": "invalid UTF-8",
77
- "bson": "0E00000002610002000000E90000"
77
+ "bson": "0E0000000E610002000000E90000"
78
78
  }
79
79
  ]
80
80
  }
@@ -3,9 +3,24 @@
3
3
  "bson_type": "0x00",
4
4
  "valid": [
5
5
  {
6
- "description": "Document with keys that start with $",
6
+ "description": "Dollar-prefixed key in top-level document",
7
7
  "canonical_bson": "0F00000010246B6579002A00000000",
8
8
  "canonical_extjson": "{\"$key\": {\"$numberInt\": \"42\"}}"
9
+ },
10
+ {
11
+ "description": "Dollar as key in top-level document",
12
+ "canonical_bson": "0E00000002240002000000610000",
13
+ "canonical_extjson": "{\"$\": \"a\"}"
14
+ },
15
+ {
16
+ "description": "Dotted key in top-level document",
17
+ "canonical_bson": "1000000002612E620002000000630000",
18
+ "canonical_extjson": "{\"a.b\": \"c\"}"
19
+ },
20
+ {
21
+ "description": "Dot as key in top-level document",
22
+ "canonical_bson": "0E000000022E0002000000610000",
23
+ "canonical_extjson": "{\".\": \"a\"}"
9
24
  }
10
25
  ],
11
26
  "decodeErrors": [
@@ -77,11 +92,11 @@
77
92
  },
78
93
  {
79
94
  "description": "Bad $regularExpression (pattern is number, not string)",
80
- "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": 42, \"$options\" : \"\"}}}"
95
+ "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": 42, \"options\" : \"\"}}}"
81
96
  },
82
97
  {
83
98
  "description": "Bad $regularExpression (options are number, not string)",
84
- "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": \"a\", \"$options\" : 0}}}"
99
+ "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": \"a\", \"options\" : 0}}}"
85
100
  },
86
101
  {
87
102
  "description" : "Bad $regularExpression (missing pattern field)",
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -63,6 +64,28 @@ shared_examples_for "a JSON serializable object" do
63
64
  end
64
65
  end
65
66
 
67
+ shared_examples_for "an Extended JSON serializable object" do
68
+
69
+ it "serializes the Extended JSON from #as_extended_json" do
70
+ expect(object.to_extended_json).to eq(object.as_extended_json.to_json)
71
+ end
72
+ end
73
+
74
+ shared_examples_for '#as_extended_json returns self' do
75
+
76
+ it 'returns self' do
77
+ expect(object.as_extended_json).to eq(object)
78
+ end
79
+ end
80
+
81
+ shared_examples_for '#as_json calls #as_extended_json' do
82
+
83
+ it 'calls #as_extended_json' do
84
+ expect(object).to receive(:as_extended_json).with(no_args)
85
+ object.as_json
86
+ end
87
+ end
88
+
66
89
  shared_examples_for "immutable when frozen" do |block|
67
90
 
68
91
  context "when the document is frozen" do
@@ -122,7 +145,7 @@ shared_examples_for "a validated BSON key" do
122
145
  end
123
146
  end
124
147
 
125
- context "when the string is invalid" do
148
+ context "when the string has dots/dollars" do
126
149
 
127
150
  context "when the string starts with $" do
128
151
 
@@ -130,10 +153,10 @@ shared_examples_for "a validated BSON key" do
130
153
  "$testing"
131
154
  end
132
155
 
133
- it "raises an exception" do
156
+ it "does not raise an exception" do
134
157
  expect {
135
158
  validated
136
- }.to raise_error(BSON::String::IllegalKey)
159
+ }.to_not raise_error
137
160
  end
138
161
  end
139
162
 
@@ -143,10 +166,10 @@ shared_examples_for "a validated BSON key" do
143
166
  "testing.testing"
144
167
  end
145
168
 
146
- it "raises an exception" do
169
+ it "does not raise an exception" do
147
170
  expect {
148
171
  validated
149
- }.to raise_error(BSON::String::IllegalKey)
172
+ }.to_not raise_error
150
173
  end
151
174
  end
152
175
  end
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  require 'singleton'
2
3
 
3
4
  class SpecConfig