bson 4.2.2 → 4.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +25 -7
  5. data/Rakefile +16 -9
  6. data/ext/bson/{native-endian.h → bson-endian.h} +5 -99
  7. data/ext/bson/bson-native.h +125 -0
  8. data/ext/bson/bytebuf.c +133 -0
  9. data/ext/bson/endian.c +117 -0
  10. data/ext/bson/init.c +355 -0
  11. data/ext/bson/libbson-utf8.c +230 -0
  12. data/ext/bson/read.c +411 -0
  13. data/ext/bson/util.c +95 -0
  14. data/ext/bson/write.c +680 -0
  15. data/lib/bson.rb +6 -3
  16. data/lib/bson/active_support.rb +17 -0
  17. data/lib/bson/array.rb +57 -17
  18. data/lib/bson/binary.rb +185 -13
  19. data/lib/bson/boolean.rb +12 -3
  20. data/lib/bson/code.rb +16 -2
  21. data/lib/bson/code_with_scope.rb +32 -5
  22. data/lib/bson/config.rb +1 -1
  23. data/lib/bson/date.rb +12 -2
  24. data/lib/bson/date_time.rb +2 -2
  25. data/lib/bson/db_pointer.rb +110 -0
  26. data/lib/bson/decimal128.rb +17 -3
  27. data/lib/bson/decimal128/builder.rb +1 -1
  28. data/lib/bson/document.rb +152 -5
  29. data/lib/bson/environment.rb +2 -1
  30. data/lib/bson/error.rb +27 -0
  31. data/lib/bson/ext_json.rb +383 -0
  32. data/lib/bson/false_class.rb +1 -1
  33. data/lib/bson/float.rb +48 -2
  34. data/lib/bson/hash.rb +68 -17
  35. data/lib/bson/int32.rb +52 -13
  36. data/lib/bson/int64.rb +59 -15
  37. data/lib/bson/integer.rb +36 -2
  38. data/lib/bson/json.rb +1 -1
  39. data/lib/bson/max_key.rb +13 -1
  40. data/lib/bson/min_key.rb +13 -1
  41. data/lib/bson/nil_class.rb +4 -2
  42. data/lib/bson/object.rb +28 -1
  43. data/lib/bson/object_id.rb +16 -2
  44. data/lib/bson/open_struct.rb +1 -1
  45. data/lib/bson/regexp.rb +27 -4
  46. data/lib/bson/registry.rb +3 -3
  47. data/lib/bson/specialized.rb +4 -2
  48. data/lib/bson/string.rb +5 -3
  49. data/lib/bson/symbol.rb +99 -7
  50. data/lib/bson/time.rb +63 -4
  51. data/lib/bson/time_with_zone.rb +54 -0
  52. data/lib/bson/timestamp.rb +44 -6
  53. data/lib/bson/true_class.rb +1 -1
  54. data/lib/bson/undefined.rb +12 -1
  55. data/lib/bson/version.rb +2 -2
  56. data/spec/bson/array_spec.rb +18 -1
  57. data/spec/bson/binary_spec.rb +100 -3
  58. data/spec/bson/binary_uuid_spec.rb +189 -0
  59. data/spec/bson/boolean_spec.rb +1 -1
  60. data/spec/bson/byte_buffer_read_spec.rb +197 -0
  61. data/spec/bson/byte_buffer_spec.rb +121 -381
  62. data/spec/bson/byte_buffer_write_spec.rb +854 -0
  63. data/spec/bson/code_spec.rb +1 -1
  64. data/spec/bson/code_with_scope_spec.rb +1 -1
  65. data/spec/bson/date_spec.rb +1 -1
  66. data/spec/bson/date_time_spec.rb +54 -1
  67. data/spec/bson/decimal128_spec.rb +35 -35
  68. data/spec/bson/document_as_spec.rb +46 -0
  69. data/spec/bson/document_spec.rb +197 -30
  70. data/spec/bson/ext_json_parse_spec.rb +308 -0
  71. data/spec/bson/false_class_spec.rb +1 -1
  72. data/spec/bson/float_spec.rb +37 -1
  73. data/spec/bson/hash_as_spec.rb +57 -0
  74. data/spec/bson/hash_spec.rb +209 -1
  75. data/spec/bson/int32_spec.rb +180 -6
  76. data/spec/bson/int64_spec.rb +199 -6
  77. data/spec/bson/integer_spec.rb +29 -3
  78. data/spec/bson/json_spec.rb +1 -1
  79. data/spec/bson/max_key_spec.rb +1 -1
  80. data/spec/bson/min_key_spec.rb +1 -1
  81. data/spec/bson/nil_class_spec.rb +1 -1
  82. data/spec/bson/object_id_spec.rb +1 -1
  83. data/spec/bson/object_spec.rb +1 -1
  84. data/spec/bson/open_struct_spec.rb +1 -1
  85. data/spec/bson/raw_spec.rb +34 -2
  86. data/spec/bson/regexp_spec.rb +1 -1
  87. data/spec/bson/registry_spec.rb +1 -1
  88. data/spec/bson/string_spec.rb +19 -1
  89. data/spec/bson/symbol_raw_spec.rb +45 -0
  90. data/spec/bson/symbol_spec.rb +63 -3
  91. data/spec/bson/time_spec.rb +205 -2
  92. data/spec/bson/time_with_zone_spec.rb +68 -0
  93. data/spec/bson/timestamp_spec.rb +56 -1
  94. data/spec/bson/true_class_spec.rb +1 -1
  95. data/spec/bson/undefined_spec.rb +1 -1
  96. data/spec/bson_spec.rb +1 -1
  97. data/spec/{support → runners}/common_driver.rb +1 -1
  98. data/spec/runners/corpus.rb +185 -0
  99. data/spec/{support/corpus.rb → runners/corpus_legacy.rb} +41 -59
  100. data/spec/spec_helper.rb +40 -3
  101. data/spec/{bson/driver_bson_spec.rb → spec_tests/common_driver_spec.rb} +1 -0
  102. data/spec/{bson/corpus_spec.rb → spec_tests/corpus_legacy_spec.rb} +10 -7
  103. data/spec/spec_tests/corpus_spec.rb +124 -0
  104. data/spec/spec_tests/data/corpus/README.md +15 -0
  105. data/spec/spec_tests/data/corpus/array.json +49 -0
  106. data/spec/spec_tests/data/corpus/binary.json +113 -0
  107. data/spec/spec_tests/data/corpus/boolean.json +27 -0
  108. data/spec/spec_tests/data/corpus/code.json +67 -0
  109. data/spec/spec_tests/data/corpus/code_w_scope.json +78 -0
  110. data/spec/spec_tests/data/corpus/datetime.json +42 -0
  111. data/spec/spec_tests/data/corpus/dbpointer.json +56 -0
  112. data/spec/spec_tests/data/corpus/dbref.json +31 -0
  113. data/spec/spec_tests/data/corpus/decimal128-1.json +317 -0
  114. data/spec/spec_tests/data/corpus/decimal128-2.json +793 -0
  115. data/spec/spec_tests/data/corpus/decimal128-3.json +1771 -0
  116. data/spec/spec_tests/data/corpus/decimal128-4.json +117 -0
  117. data/spec/spec_tests/data/corpus/decimal128-5.json +402 -0
  118. data/spec/spec_tests/data/corpus/decimal128-6.json +119 -0
  119. data/spec/spec_tests/data/corpus/decimal128-7.json +323 -0
  120. data/spec/spec_tests/data/corpus/document.json +36 -0
  121. data/spec/spec_tests/data/corpus/double.json +87 -0
  122. data/spec/spec_tests/data/corpus/int32.json +43 -0
  123. data/spec/spec_tests/data/corpus/int64.json +43 -0
  124. data/spec/spec_tests/data/corpus/maxkey.json +12 -0
  125. data/spec/spec_tests/data/corpus/minkey.json +12 -0
  126. data/spec/spec_tests/data/corpus/multi-type-deprecated.json +15 -0
  127. data/spec/spec_tests/data/corpus/multi-type.json +11 -0
  128. data/spec/spec_tests/data/corpus/null.json +12 -0
  129. data/spec/spec_tests/data/corpus/oid.json +28 -0
  130. data/spec/spec_tests/data/corpus/regex.json +65 -0
  131. data/spec/spec_tests/data/corpus/string.json +72 -0
  132. data/spec/spec_tests/data/corpus/symbol.json +80 -0
  133. data/spec/spec_tests/data/corpus/timestamp.json +34 -0
  134. data/spec/spec_tests/data/corpus/top.json +236 -0
  135. data/spec/spec_tests/data/corpus/undefined.json +15 -0
  136. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/array.json +8 -2
  137. data/spec/{support/corpus-tests/failures → spec_tests/data/corpus_legacy}/binary.json +0 -0
  138. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/boolean.json +0 -0
  139. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/code.json +1 -1
  140. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/code_w_scope.json +1 -1
  141. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/document.json +1 -1
  142. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/double.json +1 -1
  143. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/datetime.json +0 -0
  144. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/dbpointer.json +0 -0
  145. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/int64.json +0 -0
  146. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/symbol.json +0 -0
  147. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/int32.json +1 -1
  148. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/maxkey.json +1 -1
  149. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/minkey.json +1 -1
  150. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/null.json +1 -1
  151. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/oid.json +0 -0
  152. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/regex.json +1 -1
  153. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/string.json +0 -0
  154. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/timestamp.json +1 -1
  155. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/top.json +0 -0
  156. data/spec/{support/corpus-tests/failures → spec_tests/data/corpus_legacy}/undefined.json +0 -0
  157. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-1.json +0 -0
  158. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-2.json +0 -0
  159. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-3.json +0 -0
  160. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-4.json +0 -0
  161. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-5.json +0 -0
  162. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-6.json +0 -0
  163. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-7.json +0 -0
  164. data/spec/support/shared_examples.rb +3 -5
  165. data/spec/support/spec_config.rb +16 -0
  166. data/spec/support/utils.rb +10 -0
  167. metadata +227 -124
  168. metadata.gz.sig +0 -0
  169. data/ext/bson/bson_native.c +0 -762
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -35,5 +35,58 @@ describe DateTime do
35
35
 
36
36
  it_behaves_like "a serializable bson element"
37
37
  end
38
+
39
+ context "when the dates don't both use Gregorian" do
40
+
41
+ let(:shakespeare_datetime) do
42
+ DateTime.iso8601('1616-04-23', Date::ENGLAND)
43
+ end
44
+
45
+ let(:gregorian_datetime) do
46
+ DateTime.iso8601('1616-04-23', Date::GREGORIAN)
47
+ end
48
+
49
+ context "when putting to bson" do
50
+
51
+ let(:shakespeare) do
52
+ { a: shakespeare_datetime }.to_bson
53
+ end
54
+
55
+ let(:gregorian) do
56
+ { a: gregorian_datetime }.to_bson
57
+ end
58
+
59
+ it "does not equal each other" do
60
+ expect(shakespeare.to_s).to_not eq(gregorian.to_s)
61
+ end
62
+
63
+ it "the english date is 10 days later" do
64
+ expect(shakespeare.to_s).to eq({ a: DateTime.iso8601('1616-05-03', Date::GREGORIAN) }.to_bson.to_s)
65
+ end
66
+ end
67
+
68
+ context "when putting and receiving from bson" do
69
+
70
+ let(:shakespeare) do
71
+ Hash.from_bson(BSON::ByteBuffer.new({ a: shakespeare_datetime }.to_bson.to_s))
72
+ end
73
+
74
+ let(:gregorian) do
75
+ Hash.from_bson(BSON::ByteBuffer.new({ a: gregorian_datetime }.to_bson.to_s))
76
+ end
77
+
78
+ it "does not equal each other" do
79
+ expect(shakespeare).to_not eq(gregorian)
80
+ end
81
+
82
+ it "the english date is 10 days later" do
83
+ expect(shakespeare[:a]).to eq(DateTime.iso8601('1616-05-03', Date::GREGORIAN).to_time)
84
+ end
85
+
86
+ it "the gregorian date is the same" do
87
+ expect(gregorian[:a]).to eq(DateTime.iso8601('1616-04-23', Date::GREGORIAN).to_time)
88
+ end
89
+ end
90
+ end
38
91
  end
39
92
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016 MongoDB Inc.
1
+ # Copyright (C) 2016-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -78,7 +78,7 @@ describe BSON::Decimal128 do
78
78
 
79
79
  context 'when a BigDecimal is passed' do
80
80
 
81
- let(:argument) { BigDecimal.new("Infinity") }
81
+ let(:argument) { BigDecimal("Infinity") }
82
82
 
83
83
  it_behaves_like 'an initialized BSON::Decimal128'
84
84
  end
@@ -98,7 +98,7 @@ describe BSON::Decimal128 do
98
98
 
99
99
  context 'when a BigDecimal is passed' do
100
100
 
101
- let(:argument) { BigDecimal.new("-Infinity") }
101
+ let(:argument) { BigDecimal("-Infinity") }
102
102
 
103
103
  it_behaves_like 'an initialized BSON::Decimal128'
104
104
  end
@@ -118,7 +118,7 @@ describe BSON::Decimal128 do
118
118
 
119
119
  context 'when a BigDecimal is passed' do
120
120
 
121
- let(:argument) { BigDecimal.new("NaN") }
121
+ let(:argument) { BigDecimal("NaN") }
122
122
 
123
123
  it_behaves_like 'an initialized BSON::Decimal128'
124
124
  end
@@ -177,7 +177,7 @@ describe BSON::Decimal128 do
177
177
 
178
178
  context 'when a BigDecimal is passed' do
179
179
 
180
- let(:argument) { BigDecimal.new("-0") }
180
+ let(:argument) { BigDecimal("-0") }
181
181
 
182
182
  it_behaves_like 'an initialized BSON::Decimal128'
183
183
  end
@@ -197,7 +197,7 @@ describe BSON::Decimal128 do
197
197
 
198
198
  context 'when a BigDecimal is passed' do
199
199
 
200
- let(:argument) { BigDecimal.new(12) }
200
+ let(:argument) { BigDecimal(12) }
201
201
 
202
202
  it_behaves_like 'an initialized BSON::Decimal128'
203
203
  end
@@ -217,7 +217,7 @@ describe BSON::Decimal128 do
217
217
 
218
218
  context 'when a BigDecimal is passed' do
219
219
 
220
- let(:argument) { BigDecimal.new(-12) }
220
+ let(:argument) { BigDecimal(-12) }
221
221
 
222
222
  it_behaves_like 'an initialized BSON::Decimal128'
223
223
  end
@@ -237,7 +237,7 @@ describe BSON::Decimal128 do
237
237
 
238
238
  context 'when a BigDecimal is passed' do
239
239
 
240
- let(:argument) { BigDecimal.new(0.12345, 5) }
240
+ let(:argument) { BigDecimal(0.12345, 5) }
241
241
 
242
242
  it_behaves_like 'an initialized BSON::Decimal128'
243
243
  end
@@ -257,7 +257,7 @@ describe BSON::Decimal128 do
257
257
 
258
258
  context 'when a BigDecimal is passed' do
259
259
 
260
- let(:argument) { BigDecimal.new(-0.12345, 5) }
260
+ let(:argument) { BigDecimal(-0.12345, 5) }
261
261
 
262
262
  it_behaves_like 'an initialized BSON::Decimal128'
263
263
  end
@@ -277,7 +277,7 @@ describe BSON::Decimal128 do
277
277
 
278
278
  context 'when a BigDecimal is passed' do
279
279
 
280
- let(:argument) { BigDecimal.new(1234567890123456789012345678901234) }
280
+ let(:argument) { BigDecimal(1234567890123456789012345678901234) }
281
281
 
282
282
  it_behaves_like 'an initialized BSON::Decimal128'
283
283
  end
@@ -297,7 +297,7 @@ describe BSON::Decimal128 do
297
297
 
298
298
  context 'when a BigDecimal is passed' do
299
299
 
300
- let(:argument) { BigDecimal.new(-1234567890123456789012345678901234) }
300
+ let(:argument) { BigDecimal(-1234567890123456789012345678901234) }
301
301
 
302
302
  it_behaves_like 'an initialized BSON::Decimal128'
303
303
  end
@@ -1183,7 +1183,7 @@ describe BSON::Decimal128 do
1183
1183
  end
1184
1184
 
1185
1185
  it "returns false" do
1186
- expect(decimal128).to_not eq(described_class.new(BigDecimal.new('2.00')))
1186
+ expect(decimal128).to_not eq(described_class.new(BigDecimal('2.00')))
1187
1187
  end
1188
1188
  end
1189
1189
 
@@ -1198,7 +1198,7 @@ describe BSON::Decimal128 do
1198
1198
  describe "#===" do
1199
1199
 
1200
1200
  let(:decimal128) do
1201
- described_class.new(BigDecimal.new('1.23'))
1201
+ described_class.new(BigDecimal('1.23'))
1202
1202
  end
1203
1203
 
1204
1204
  context "when comparing with another decimal128" do
@@ -1217,7 +1217,7 @@ describe BSON::Decimal128 do
1217
1217
  context "when the high and low bits are not equal" do
1218
1218
 
1219
1219
  let(:other) do
1220
- described_class.new(BigDecimal.new('1000.003'))
1220
+ described_class.new(BigDecimal('1000.003'))
1221
1221
  end
1222
1222
 
1223
1223
  it "returns false" do
@@ -1251,7 +1251,7 @@ describe BSON::Decimal128 do
1251
1251
  describe "#as_json" do
1252
1252
 
1253
1253
  let(:object) do
1254
- described_class.new(BigDecimal.new('1.23'))
1254
+ described_class.new(BigDecimal('1.23'))
1255
1255
  end
1256
1256
 
1257
1257
  it "returns the decimal128 with $numberDecimal key" do
@@ -1271,7 +1271,7 @@ describe BSON::Decimal128 do
1271
1271
  describe "#bson_type" do
1272
1272
 
1273
1273
  let(:code) do
1274
- described_class.new(BigDecimal.new('1.23'))
1274
+ described_class.new(BigDecimal('1.23'))
1275
1275
  end
1276
1276
 
1277
1277
  it "returns 0x13" do
@@ -1311,7 +1311,7 @@ describe BSON::Decimal128 do
1311
1311
  end
1312
1312
 
1313
1313
  it "returns false" do
1314
- expect(decimal128).to_not eql(described_class.new(BigDecimal.new('2')))
1314
+ expect(decimal128).to_not eql(described_class.new(BigDecimal('2')))
1315
1315
  end
1316
1316
  end
1317
1317
 
@@ -1326,7 +1326,7 @@ describe BSON::Decimal128 do
1326
1326
  describe "#hash" do
1327
1327
 
1328
1328
  let(:decimal128) do
1329
- described_class.new(BigDecimal.new('-1234E+33'))
1329
+ described_class.new(BigDecimal('-1234E+33'))
1330
1330
  end
1331
1331
 
1332
1332
  it "returns a hash of the high and low bits" do
@@ -1337,7 +1337,7 @@ describe BSON::Decimal128 do
1337
1337
  describe "#inspect" do
1338
1338
 
1339
1339
  let(:decimal128) do
1340
- described_class.new(BigDecimal.new('1.23'))
1340
+ described_class.new(BigDecimal('1.23'))
1341
1341
  end
1342
1342
 
1343
1343
  it "returns the inspection with the decimal128 to_s" do
@@ -1363,7 +1363,7 @@ describe BSON::Decimal128 do
1363
1363
  context 'when the value is Infinity' do
1364
1364
 
1365
1365
  let(:big_decimal) do
1366
- BigDecimal.new('Infinity')
1366
+ BigDecimal('Infinity')
1367
1367
  end
1368
1368
 
1369
1369
  let(:expected_big_decimal) do
@@ -1376,7 +1376,7 @@ describe BSON::Decimal128 do
1376
1376
  context 'when the value is -Infinity' do
1377
1377
 
1378
1378
  let(:big_decimal) do
1379
- BigDecimal.new('-Infinity')
1379
+ BigDecimal('-Infinity')
1380
1380
  end
1381
1381
 
1382
1382
  let(:expected_big_decimal) do
@@ -1392,7 +1392,7 @@ describe BSON::Decimal128 do
1392
1392
  context 'when the value is 1' do
1393
1393
 
1394
1394
  let(:big_decimal) do
1395
- BigDecimal.new(1)
1395
+ BigDecimal(1)
1396
1396
  end
1397
1397
 
1398
1398
  let(:expected_big_decimal) do
@@ -1405,7 +1405,7 @@ describe BSON::Decimal128 do
1405
1405
  context 'when the value is -1' do
1406
1406
 
1407
1407
  let(:big_decimal) do
1408
- BigDecimal.new(-1)
1408
+ BigDecimal(-1)
1409
1409
  end
1410
1410
 
1411
1411
  let(:expected_big_decimal) do
@@ -1418,7 +1418,7 @@ describe BSON::Decimal128 do
1418
1418
  context 'when the value is 20' do
1419
1419
 
1420
1420
  let(:big_decimal) do
1421
- BigDecimal.new(20)
1421
+ BigDecimal(20)
1422
1422
  end
1423
1423
 
1424
1424
  let(:expected_big_decimal) do
@@ -1431,7 +1431,7 @@ describe BSON::Decimal128 do
1431
1431
  context 'when the value is -20' do
1432
1432
 
1433
1433
  let(:big_decimal) do
1434
- BigDecimal.new(-20)
1434
+ BigDecimal(-20)
1435
1435
  end
1436
1436
 
1437
1437
  let(:expected_big_decimal) do
@@ -1444,7 +1444,7 @@ describe BSON::Decimal128 do
1444
1444
  context 'when the value is 12345678901234567' do
1445
1445
 
1446
1446
  let(:big_decimal) do
1447
- BigDecimal.new(12345678901234567)
1447
+ BigDecimal(12345678901234567)
1448
1448
  end
1449
1449
 
1450
1450
  let(:expected_big_decimal) do
@@ -1457,7 +1457,7 @@ describe BSON::Decimal128 do
1457
1457
  context 'when the value is -12345678901234567' do
1458
1458
 
1459
1459
  let(:big_decimal) do
1460
- BigDecimal.new(-12345678901234567)
1460
+ BigDecimal(-12345678901234567)
1461
1461
  end
1462
1462
 
1463
1463
  let(:expected_big_decimal) do
@@ -1470,7 +1470,7 @@ describe BSON::Decimal128 do
1470
1470
  context 'when the value is 12345689012345789012345' do
1471
1471
 
1472
1472
  let(:big_decimal) do
1473
- BigDecimal.new(12345689012345789012345)
1473
+ BigDecimal(12345689012345789012345)
1474
1474
  end
1475
1475
 
1476
1476
  let(:expected_big_decimal) do
@@ -1483,7 +1483,7 @@ describe BSON::Decimal128 do
1483
1483
  context 'when the value is -12345689012345789012345' do
1484
1484
 
1485
1485
  let(:big_decimal) do
1486
- BigDecimal.new(-12345689012345789012345)
1486
+ BigDecimal(-12345689012345789012345)
1487
1487
  end
1488
1488
 
1489
1489
  let(:expected_big_decimal) do
@@ -1499,7 +1499,7 @@ describe BSON::Decimal128 do
1499
1499
  context 'when the value is 0.1' do
1500
1500
 
1501
1501
  let(:big_decimal) do
1502
- BigDecimal.new(0.1, 1)
1502
+ BigDecimal(0.1, 1)
1503
1503
  end
1504
1504
 
1505
1505
  let(:expected_big_decimal) do
@@ -1512,7 +1512,7 @@ describe BSON::Decimal128 do
1512
1512
  context 'when the value is -0.1' do
1513
1513
 
1514
1514
  let(:big_decimal) do
1515
- BigDecimal.new(-0.1, 1)
1515
+ BigDecimal(-0.1, 1)
1516
1516
  end
1517
1517
 
1518
1518
  let(:expected_big_decimal) do
@@ -1525,7 +1525,7 @@ describe BSON::Decimal128 do
1525
1525
  context 'when the value is 0.123' do
1526
1526
 
1527
1527
  let(:big_decimal) do
1528
- BigDecimal.new(0.123, 3)
1528
+ BigDecimal(0.123, 3)
1529
1529
  end
1530
1530
 
1531
1531
  let(:expected_big_decimal) do
@@ -1538,7 +1538,7 @@ describe BSON::Decimal128 do
1538
1538
  context 'when the value is -0.123' do
1539
1539
 
1540
1540
  let(:big_decimal) do
1541
- BigDecimal.new(-0.123, 3)
1541
+ BigDecimal(-0.123, 3)
1542
1542
  end
1543
1543
 
1544
1544
  let(:expected_big_decimal) do
@@ -1552,7 +1552,7 @@ describe BSON::Decimal128 do
1552
1552
  context 'when the value has leading zeros' do
1553
1553
 
1554
1554
  let(:big_decimal) do
1555
- BigDecimal.new(0.001234, 4)
1555
+ BigDecimal(0.001234, 4)
1556
1556
  end
1557
1557
 
1558
1558
  let(:expected_big_decimal) do
@@ -1565,7 +1565,7 @@ describe BSON::Decimal128 do
1565
1565
  context 'when the value has trailing zeros' do
1566
1566
 
1567
1567
  let(:big_decimal) do
1568
- BigDecimal.new(2.000, 4)
1568
+ BigDecimal(2.000, 4)
1569
1569
  end
1570
1570
 
1571
1571
  let(:expected_big_decimal) do
@@ -0,0 +1,46 @@
1
+ # Copyright (C) 2021 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require "spec_helper"
16
+
17
+ # BSON::Document ActiveSupport extensions
18
+ describe BSON::Document do
19
+ require_active_support
20
+
21
+ describe '#symbolize_keys' do
22
+ context 'string keys' do
23
+ let(:doc) do
24
+ described_class.new('foo' => 'bar')
25
+ end
26
+
27
+ it 'works correctly' do
28
+ doc.symbolize_keys.should == {foo: 'bar'}
29
+ end
30
+ end
31
+ end
32
+
33
+ describe '#symbolize_keys!' do
34
+ context 'string keys' do
35
+ let(:doc) do
36
+ described_class.new('foo' => 'bar')
37
+ end
38
+
39
+ it 'raises ArgumentError' do
40
+ lambda do
41
+ doc.symbolize_keys!
42
+ end.should raise_error(ArgumentError, /symbolize_keys! is not supported on BSON::Document instances/)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- # Copyright (C) 2009-2014 MongoDB Inc.
3
+ # Copyright (C) 2009-2020 MongoDB Inc.
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
@@ -49,6 +49,68 @@ describe BSON::Document do
49
49
  end
50
50
  end
51
51
 
52
+ describe "#fetch" do
53
+
54
+ let(:document) do
55
+ described_class["key", "value", "key2", "value"]
56
+ end
57
+
58
+ context "when provided string keys" do
59
+
60
+ it "returns the value" do
61
+ expect(document.fetch("key")).to eq("value")
62
+ end
63
+ end
64
+
65
+ context "when provided symbol keys" do
66
+
67
+ it "returns the value" do
68
+ expect(document.fetch(:key)).to eq("value")
69
+ end
70
+ end
71
+
72
+ context "when key does not exist" do
73
+
74
+ it "raises KeyError" do
75
+ expect do
76
+ document.fetch(:non_existent_key)
77
+ end.to raise_exception(KeyError)
78
+ end
79
+
80
+ context "and default value is provided" do
81
+
82
+ it "returns default value" do
83
+ expect(document.fetch(:non_existent_key, false)).to eq(false)
84
+ end
85
+ end
86
+
87
+ context "and block is passed" do
88
+
89
+ it "returns result of the block" do
90
+ expect(document.fetch(:non_existent_key, &:to_s))
91
+ .to eq("non_existent_key")
92
+ end
93
+ end
94
+ end
95
+
96
+ context "when key exists" do
97
+
98
+ context "and default value is provided" do
99
+
100
+ it "returns the value" do
101
+ expect(document.fetch(:key, "other")).to eq("value")
102
+ end
103
+ end
104
+
105
+ context "and block is passed" do
106
+
107
+ it "returns the value" do
108
+ expect(document.fetch(:key, &:to_s)).to eq("value")
109
+ end
110
+ end
111
+ end
112
+ end
113
+
52
114
  describe "#[]" do
53
115
 
54
116
  let(:document) do
@@ -68,6 +130,13 @@ describe BSON::Document do
68
130
  expect(document[:key]).to eq("value")
69
131
  end
70
132
  end
133
+
134
+ context "when key does not exist" do
135
+
136
+ it "returns nil" do
137
+ expect(document[:non_existent_key]).to be nil
138
+ end
139
+ end
71
140
  end
72
141
 
73
142
  describe "#[]=" do
@@ -94,8 +163,108 @@ describe BSON::Document do
94
163
  it "sets the value" do
95
164
  expect(doc[key]).to eq(val)
96
165
  end
166
+
167
+ context 'when value is a hash' do
168
+ let(:val) do
169
+ {'foo' => {'bar' => 'baz'}}
170
+ end
171
+
172
+ it 'converts value to indifferent access' do
173
+ expect(doc[key][:foo][:bar]).to eq('baz')
174
+ end
175
+ end
176
+
177
+ context 'when value is an array with hash element' do
178
+ let(:val) do
179
+ [42, {'foo' => {'bar' => 'baz'}}]
180
+ end
181
+
182
+ it 'converts hash element to indifferent access' do
183
+ expect(doc[key][1][:foo][:bar]).to eq('baz')
184
+ end
185
+ end
186
+ end
187
+
188
+ if described_class.instance_methods.include?(:dig)
189
+ describe "#dig" do
190
+ let(:document) do
191
+ described_class.new("key1" => { :key2 => "value" })
192
+ end
193
+
194
+ context "when provided string keys" do
195
+
196
+ it "returns the value" do
197
+ expect(document.dig("key1", "key2")).to eq("value")
198
+ end
199
+ end
200
+
201
+ context "when provided symbol keys" do
202
+
203
+ it "returns the value" do
204
+ expect(document.dig(:key1, :key2)).to eq("value")
205
+ end
206
+ end
207
+ end
97
208
  end
98
209
 
210
+ if described_class.instance_methods.include?(:slice)
211
+ describe "#slice" do
212
+ let(:document) do
213
+ described_class.new("key1" => "value1", key2: "value2")
214
+ end
215
+
216
+ context "when provided string keys" do
217
+
218
+ it "is a BSON Document" do
219
+ expect(document.slice("key1")).to be_a(BSON::Document)
220
+ end
221
+
222
+ it "returns the partial document" do
223
+ expect(document.slice("key1")).to contain_exactly(['key1', 'value1'])
224
+ end
225
+ end
226
+
227
+ context "when provided symbol keys" do
228
+
229
+ it "is a BSON Document" do
230
+ expect(document.slice(:key1)).to be_a(BSON::Document)
231
+ end
232
+
233
+ it "returns the partial document" do
234
+ expect(document.slice(:key1)).to contain_exactly(['key1', 'value1'])
235
+ end
236
+ end
237
+
238
+ context "when provided keys that do not exist in the document" do
239
+
240
+ it "returns only the keys that exist in the document" do
241
+ expect(document.slice(:key1, :key3)).to contain_exactly(['key1', 'value1'])
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ describe "#except" do
248
+ let(:document) do
249
+ described_class.new("key1" => "value1", key2: "value2")
250
+ end
251
+
252
+ context "when provided string keys" do
253
+
254
+ it "returns the partial document" do
255
+ expect(document.except("key1")).to contain_exactly(['key2', 'value2'])
256
+ end
257
+ end
258
+
259
+ context "when provided symbol keys" do
260
+
261
+ it "returns the partial document" do
262
+ expect(document.except(:key1)).to contain_exactly(['key2', 'value2'])
263
+ end
264
+ end
265
+ end
266
+
267
+
99
268
  describe "#delete" do
100
269
 
101
270
  shared_examples_for "a document with deletable pairs" do
@@ -756,6 +925,24 @@ describe BSON::Document do
756
925
  end
757
926
  end
758
927
 
928
+ context "when the hash contains an array of hashes" do
929
+ let(:obj) do
930
+ described_class["key",[{"a" => 1}, {"b" => 2}]]
931
+ end
932
+
933
+ let(:bson) do
934
+ "#{45.to_bson}#{Array::BSON_TYPE}key#{BSON::NULL_BYTE}" +
935
+ "#{35.to_bson}"+
936
+ "#{BSON::Document::BSON_TYPE}0#{BSON::NULL_BYTE}#{12.to_bson}#{BSON::Int32::BSON_TYPE}a#{BSON::NULL_BYTE}#{1.to_bson}#{BSON::NULL_BYTE}" +
937
+ "#{BSON::Document::BSON_TYPE}1#{BSON::NULL_BYTE}#{12.to_bson}#{BSON::Int32::BSON_TYPE}b#{BSON::NULL_BYTE}#{2.to_bson}#{BSON::NULL_BYTE}" +
938
+ "#{BSON::NULL_BYTE}" +
939
+ "#{BSON::NULL_BYTE}"
940
+ end
941
+
942
+ it_behaves_like "a serializable bson element"
943
+ it_behaves_like "a deserializable bson element"
944
+ end
945
+
759
946
  context "when the hash is a single level" do
760
947
 
761
948
  let(:obj) do
@@ -867,51 +1054,31 @@ describe BSON::Document do
867
1054
  it_behaves_like "a document able to handle utf-8"
868
1055
  end
869
1056
 
870
- context "when utf-8 values exist in wrong encoding" do
1057
+ context "given a utf-8-encodable string in another encoding" do
871
1058
 
872
1059
  let(:string) { "gültig" }
873
1060
  let(:document) do
874
1061
  described_class["type", string.encode("iso-8859-1")]
875
1062
  end
876
1063
 
877
- it "raises an exception", unless: BSON::Environment.jruby? do
878
- expect {
879
- document.to_bson
880
- }.to raise_error(ArgumentError)
881
- end
882
-
883
- it 'converts the values', if: BSON::Environment.jruby? do
884
- expect(
885
- BSON::Document.from_bson(BSON::ByteBuffer.new(document.to_bson.to_s))
886
- ).to eq({ "type" => string })
887
- end
888
- end
889
-
890
- context "when binary strings with utf-8 values exist", if: BSON::Environment.jruby? && (JRUBY_VERSION < '9') do
891
-
892
- let(:string) { "europäisch" }
893
- let(:document) do
894
- described_class["type", string.encode("binary")]
895
- end
896
-
897
- it "encodes and decodes the document properly" do
1064
+ it 'converts the values to utf-8' do
898
1065
  expect(
899
1066
  BSON::Document.from_bson(BSON::ByteBuffer.new(document.to_bson.to_s))
900
1067
  ).to eq({ "type" => string })
901
1068
  end
902
1069
  end
903
1070
 
904
- context "when binary strings with utf-8 values exist", unless: BSON::Environment.jruby? do
1071
+ context "given a binary string with utf-8 values" do
905
1072
 
906
- let(:string) { "europäisch" }
1073
+ let(:string) { "europäisch".force_encoding('binary') }
907
1074
  let(:document) do
908
- described_class["type", string.encode("binary", "binary")]
1075
+ described_class["type", string]
909
1076
  end
910
1077
 
911
- it "encodes and decodes the document properly" do
912
- expect(
913
- BSON::Document.from_bson(BSON::ByteBuffer.new(document.to_bson.to_s))
914
- ).to eq({ "type" => string })
1078
+ it "raises encoding error" do
1079
+ expect do
1080
+ document.to_bson
1081
+ end.to raise_error(Encoding::UndefinedConversionError, /from ASCII-8BIT to UTF-8/)
915
1082
  end
916
1083
  end
917
1084
  end