bson 4.9.5 → 4.10.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ext/bson/bson-native.h +2 -0
- data/ext/bson/init.c +28 -1
- data/ext/bson/read.c +35 -12
- data/ext/bson/write.c +32 -0
- data/lib/bson/date_time.rb +1 -1
- data/lib/bson/timestamp.rb +4 -4
- data/lib/bson/version.rb +1 -1
- data/spec/bson/byte_buffer_read_spec.rb +59 -3
- data/spec/bson/byte_buffer_spec.rb +10 -7
- data/spec/bson/byte_buffer_write_spec.rb +96 -0
- data/spec/bson/date_time_spec.rb +53 -0
- data/spec/spec_tests/data/corpus/timestamp.json +10 -0
- data/spec/spec_tests/data/corpus/top.json +3 -3
- metadata +79 -80
- metadata.gz.sig +0 -0
- data/lib/bson_native.bundle +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a62c9c51fa6fafda7b1e9a084a118fd34e25804fd97ffd504f8d00690d2eb9f0
|
4
|
+
data.tar.gz: 219e45cccac4d1d1b7f7dfad0e6f386538678d632cc9937b9f0f6c06f57e4118
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40cab24a15e3430250426e270e99700ab2527d417ac9a248976afc1e1cee5deb9bd1b7dc07112d1d772cb4e65387a3c6fab00943bc55b9d426bc29fee39aba9e
|
7
|
+
data.tar.gz: 349f013a08fc84afea777262e88f8813586621f4dc4273ebf122fd347d574dc8dee8b102ba901085b373b3479b1172c3c596a8dd3e5086e05d19b109845f6168
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/ext/bson/bson-native.h
CHANGED
@@ -76,6 +76,7 @@ VALUE rb_bson_byte_buffer_get_cstring(VALUE self);
|
|
76
76
|
VALUE rb_bson_byte_buffer_get_decimal128_bytes(VALUE self);
|
77
77
|
VALUE rb_bson_byte_buffer_get_double(VALUE self);
|
78
78
|
VALUE rb_bson_byte_buffer_get_int32(VALUE self);
|
79
|
+
VALUE rb_bson_byte_buffer_get_uint32(VALUE self);
|
79
80
|
VALUE rb_bson_byte_buffer_get_int64(VALUE self);
|
80
81
|
VALUE rb_bson_byte_buffer_get_string(VALUE self);
|
81
82
|
VALUE rb_bson_byte_buffer_get_hash(int argc, VALUE *argv, VALUE self);
|
@@ -86,6 +87,7 @@ VALUE rb_bson_byte_buffer_put_cstring(VALUE self, VALUE string);
|
|
86
87
|
VALUE rb_bson_byte_buffer_put_decimal128(VALUE self, VALUE low, VALUE high);
|
87
88
|
VALUE rb_bson_byte_buffer_put_double(VALUE self, VALUE f);
|
88
89
|
VALUE rb_bson_byte_buffer_put_int32(VALUE self, VALUE i);
|
90
|
+
VALUE rb_bson_byte_buffer_put_uint32(VALUE self, VALUE i);
|
89
91
|
VALUE rb_bson_byte_buffer_put_int64(VALUE self, VALUE i);
|
90
92
|
VALUE rb_bson_byte_buffer_put_string(VALUE self, VALUE string);
|
91
93
|
VALUE rb_bson_byte_buffer_put_symbol(VALUE self, VALUE symbol);
|
data/ext/bson/init.c
CHANGED
@@ -88,7 +88,7 @@ void Init_bson_native()
|
|
88
88
|
* call-seq:
|
89
89
|
* buffer.get_array(**options) -> Array
|
90
90
|
*
|
91
|
-
* Reads an array from the byte buffer
|
91
|
+
* Reads an array from the byte buffer.
|
92
92
|
*
|
93
93
|
* @option options [ nil | :bson ] :mode Decoding mode to use.
|
94
94
|
*
|
@@ -97,6 +97,18 @@ void Init_bson_native()
|
|
97
97
|
rb_define_method(rb_byte_buffer_class, "get_array", rb_bson_byte_buffer_get_array, -1);
|
98
98
|
|
99
99
|
rb_define_method(rb_byte_buffer_class, "get_int32", rb_bson_byte_buffer_get_int32, 0);
|
100
|
+
|
101
|
+
/*
|
102
|
+
* call-seq:
|
103
|
+
* buffer.get_uint32(buffer) -> Fixnum
|
104
|
+
*
|
105
|
+
* Reads an unsigned 32 bit number from the byte buffer.
|
106
|
+
*
|
107
|
+
* @return [ Fixnum ] The unsigned 32 bits integer from the buffer
|
108
|
+
*
|
109
|
+
* @api private
|
110
|
+
*/
|
111
|
+
rb_define_method(rb_byte_buffer_class, "get_uint32", rb_bson_byte_buffer_get_uint32, 0);
|
100
112
|
rb_define_method(rb_byte_buffer_class, "get_int64", rb_bson_byte_buffer_get_int64, 0);
|
101
113
|
rb_define_method(rb_byte_buffer_class, "get_string", rb_bson_byte_buffer_get_string, 0);
|
102
114
|
|
@@ -202,6 +214,21 @@ void Init_bson_native()
|
|
202
214
|
*/
|
203
215
|
rb_define_method(rb_byte_buffer_class, "put_int32", rb_bson_byte_buffer_put_int32, 1);
|
204
216
|
|
217
|
+
/*
|
218
|
+
* call-seq:
|
219
|
+
* buffer.put_uint32(fixnum) -> ByteBuffer
|
220
|
+
*
|
221
|
+
* Writes an unsigned 32-bit integer value to the buffer.
|
222
|
+
*
|
223
|
+
* If the argument cannot be represented in 32 bits, raises RangeError.
|
224
|
+
*
|
225
|
+
* Returns the modified +self+.
|
226
|
+
*
|
227
|
+
* @api private
|
228
|
+
*
|
229
|
+
*/
|
230
|
+
rb_define_method(rb_byte_buffer_class, "put_uint32", rb_bson_byte_buffer_put_uint32, 1);
|
231
|
+
|
205
232
|
/*
|
206
233
|
* call-seq:
|
207
234
|
* buffer.put_int64(fixnum) -> ByteBuffer
|
data/ext/bson/read.c
CHANGED
@@ -21,6 +21,7 @@ static void pvt_raise_decode_error(volatile VALUE msg);
|
|
21
21
|
static int32_t pvt_validate_length(byte_buffer_t *b);
|
22
22
|
static uint8_t pvt_get_type_byte(byte_buffer_t *b);
|
23
23
|
static VALUE pvt_get_int32(byte_buffer_t *b);
|
24
|
+
static VALUE pvt_get_uint32(byte_buffer_t *b);
|
24
25
|
static VALUE pvt_get_int64(byte_buffer_t *b, int argc, VALUE *argv);
|
25
26
|
static VALUE pvt_get_double(byte_buffer_t *b);
|
26
27
|
static VALUE pvt_get_string(byte_buffer_t *b, const char *data_type);
|
@@ -41,12 +42,12 @@ void pvt_raise_decode_error(volatile VALUE msg) {
|
|
41
42
|
int32_t pvt_validate_length(byte_buffer_t *b)
|
42
43
|
{
|
43
44
|
int32_t length;
|
44
|
-
|
45
|
+
|
45
46
|
ENSURE_BSON_READ(b, 4);
|
46
47
|
memcpy(&length, READ_PTR(b), 4);
|
47
48
|
length = BSON_UINT32_TO_LE(length);
|
48
49
|
|
49
|
-
/* minimum valid length is 4 (byte count) + 1 (terminating byte) */
|
50
|
+
/* minimum valid length is 4 (byte count) + 1 (terminating byte) */
|
50
51
|
if(length >= 5){
|
51
52
|
ENSURE_BSON_READ(b, length);
|
52
53
|
|
@@ -59,7 +60,7 @@ int32_t pvt_validate_length(byte_buffer_t *b)
|
|
59
60
|
else{
|
60
61
|
rb_raise(rb_eRangeError, "Buffer contained invalid length %d at %zu", length, b->read_position);
|
61
62
|
}
|
62
|
-
|
63
|
+
|
63
64
|
return length;
|
64
65
|
}
|
65
66
|
|
@@ -175,13 +176,13 @@ VALUE pvt_get_string(byte_buffer_t *b, const char *data_type)
|
|
175
176
|
}
|
176
177
|
ENSURE_BSON_READ(b, 4 + length);
|
177
178
|
str_ptr = READ_PTR(b) + 4;
|
178
|
-
last_byte = *(READ_PTR(b) + 4 +
|
179
|
+
last_byte = *(READ_PTR(b) + 4 + length_le - 1);
|
179
180
|
if (last_byte != 0) {
|
180
181
|
pvt_raise_decode_error(rb_sprintf("Last byte of the string is not null: 0x%x", (int) last_byte));
|
181
182
|
}
|
182
183
|
rb_bson_utf8_validate(str_ptr, length - 1, true, data_type);
|
183
184
|
string = rb_enc_str_new(str_ptr, length - 1, rb_utf8_encoding());
|
184
|
-
b->read_position += 4 +
|
185
|
+
b->read_position += 4 + length_le;
|
185
186
|
return string;
|
186
187
|
}
|
187
188
|
|
@@ -205,7 +206,7 @@ VALUE pvt_get_symbol(byte_buffer_t *b, VALUE rb_buffer, int argc, VALUE *argv)
|
|
205
206
|
klass = rb_funcall(rb_bson_registry, rb_intern("get"), 1, INT2FIX(BSON_TYPE_SYMBOL));
|
206
207
|
value = rb_funcall(klass, rb_intern("from_bson"), 1, rb_buffer);
|
207
208
|
}
|
208
|
-
|
209
|
+
|
209
210
|
RB_GC_GUARD(klass);
|
210
211
|
return value;
|
211
212
|
}
|
@@ -259,6 +260,28 @@ VALUE pvt_get_int32(byte_buffer_t *b)
|
|
259
260
|
return INT2NUM(BSON_UINT32_FROM_LE(i32));
|
260
261
|
}
|
261
262
|
|
263
|
+
/**
|
264
|
+
* Get an unsigned int32 from the buffer.
|
265
|
+
*/
|
266
|
+
VALUE rb_bson_byte_buffer_get_uint32(VALUE self)
|
267
|
+
{
|
268
|
+
byte_buffer_t *b;
|
269
|
+
|
270
|
+
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
271
|
+
return pvt_get_uint32(b);
|
272
|
+
}
|
273
|
+
|
274
|
+
VALUE pvt_get_uint32(byte_buffer_t *b)
|
275
|
+
{
|
276
|
+
uint32_t i32;
|
277
|
+
|
278
|
+
ENSURE_BSON_READ(b, 4);
|
279
|
+
memcpy(&i32, READ_PTR(b), 4);
|
280
|
+
b->read_position += 4;
|
281
|
+
return UINT2NUM(BSON_UINT32_FROM_LE(i32));
|
282
|
+
}
|
283
|
+
|
284
|
+
|
262
285
|
/**
|
263
286
|
* Get a int64 from the buffer.
|
264
287
|
*/
|
@@ -284,7 +307,7 @@ VALUE pvt_get_int64(byte_buffer_t *b, int argc, VALUE *argv)
|
|
284
307
|
memcpy(&i64, READ_PTR(b), 8);
|
285
308
|
b->read_position += 8;
|
286
309
|
num = LL2NUM(BSON_UINT64_FROM_LE(i64));
|
287
|
-
|
310
|
+
|
288
311
|
if (pvt_get_mode_option(argc, argv) == BSON_MODE_BSON) {
|
289
312
|
VALUE klass = rb_funcall(rb_bson_registry,rb_intern("get"),1, INT2FIX(BSON_TYPE_INT64));
|
290
313
|
VALUE value = rb_funcall(klass, rb_intern("new"), 1, num);
|
@@ -293,7 +316,7 @@ VALUE pvt_get_int64(byte_buffer_t *b, int argc, VALUE *argv)
|
|
293
316
|
} else {
|
294
317
|
return num;
|
295
318
|
}
|
296
|
-
|
319
|
+
|
297
320
|
RB_GC_GUARD(num);
|
298
321
|
}
|
299
322
|
|
@@ -353,11 +376,11 @@ VALUE rb_bson_byte_buffer_get_hash(int argc, VALUE *argv, VALUE self){
|
|
353
376
|
rb_hash_aset(doc, field, pvt_read_field(b, self, type, argc, argv));
|
354
377
|
RB_GC_GUARD(field);
|
355
378
|
}
|
356
|
-
|
379
|
+
|
357
380
|
if (READ_PTR(b) - start_ptr != length) {
|
358
381
|
pvt_raise_decode_error(rb_sprintf("Expected to read %d bytes for the hash but read %ld bytes", length, READ_PTR(b) - start_ptr));
|
359
382
|
}
|
360
|
-
|
383
|
+
|
361
384
|
return doc;
|
362
385
|
}
|
363
386
|
|
@@ -379,10 +402,10 @@ VALUE rb_bson_byte_buffer_get_array(int argc, VALUE *argv, VALUE self){
|
|
379
402
|
rb_ary_push(array, pvt_read_field(b, self, type, argc, argv));
|
380
403
|
}
|
381
404
|
RB_GC_GUARD(array);
|
382
|
-
|
405
|
+
|
383
406
|
if (READ_PTR(b) - start_ptr != length) {
|
384
407
|
pvt_raise_decode_error(rb_sprintf("Expected to read %d bytes for the hash but read %ld bytes", length, READ_PTR(b) - start_ptr));
|
385
408
|
}
|
386
|
-
|
409
|
+
|
387
410
|
return array;
|
388
411
|
}
|
data/ext/bson/write.c
CHANGED
@@ -27,6 +27,7 @@ static void pvt_replace_int32(byte_buffer_t *b, int32_t position, int32_t newval
|
|
27
27
|
static void pvt_put_field(byte_buffer_t *b, VALUE rb_buffer, VALUE val, VALUE validating_keys);
|
28
28
|
static void pvt_put_byte(byte_buffer_t *b, const char byte);
|
29
29
|
static void pvt_put_int32(byte_buffer_t *b, const int32_t i32);
|
30
|
+
static void pvt_put_uint32(byte_buffer_t *b, const uint32_t i32);
|
30
31
|
static void pvt_put_int64(byte_buffer_t *b, const int64_t i);
|
31
32
|
static void pvt_put_double(byte_buffer_t *b, double f);
|
32
33
|
static void pvt_put_cstring(byte_buffer_t *b, const char *str, int32_t length, const char *data_type);
|
@@ -390,6 +391,37 @@ void pvt_put_int32(byte_buffer_t *b, const int32_t i)
|
|
390
391
|
b->write_position += 4;
|
391
392
|
}
|
392
393
|
|
394
|
+
/* The docstring is in init.c. */
|
395
|
+
VALUE rb_bson_byte_buffer_put_uint32(VALUE self, VALUE i)
|
396
|
+
{
|
397
|
+
byte_buffer_t *b;
|
398
|
+
int64_t temp;
|
399
|
+
uint32_t i32;
|
400
|
+
|
401
|
+
if (RB_TYPE_P(i, T_FLOAT)) {
|
402
|
+
rb_raise(rb_eArgError, "put_uint32: incorrect type: float, expected: integer");
|
403
|
+
}
|
404
|
+
|
405
|
+
temp = NUM2LL(i);
|
406
|
+
if (temp < 0 || temp > UINT32_MAX) {
|
407
|
+
rb_raise(rb_eRangeError, "Number %lld is out of range [0, 2^32)", (long long)temp);
|
408
|
+
}
|
409
|
+
|
410
|
+
i32 = NUM2UINT(i);
|
411
|
+
|
412
|
+
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
413
|
+
pvt_put_uint32(b, i32);
|
414
|
+
return self;
|
415
|
+
}
|
416
|
+
|
417
|
+
void pvt_put_uint32(byte_buffer_t *b, const uint32_t i)
|
418
|
+
{
|
419
|
+
const uint32_t i32 = BSON_UINT32_TO_LE(i);
|
420
|
+
ENSURE_BSON_WRITE(b, 4);
|
421
|
+
memcpy(WRITE_PTR(b), &i32, 4);
|
422
|
+
b->write_position += 4;
|
423
|
+
}
|
424
|
+
|
393
425
|
/* The docstring is in init.c. */
|
394
426
|
VALUE rb_bson_byte_buffer_put_int64(VALUE self, VALUE i)
|
395
427
|
{
|
data/lib/bson/date_time.rb
CHANGED
data/lib/bson/timestamp.rb
CHANGED
@@ -124,8 +124,8 @@ module BSON
|
|
124
124
|
#
|
125
125
|
# @since 2.0.0
|
126
126
|
def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
|
127
|
-
buffer.
|
128
|
-
buffer.
|
127
|
+
buffer.put_uint32(increment)
|
128
|
+
buffer.put_uint32(seconds)
|
129
129
|
end
|
130
130
|
|
131
131
|
# Deserialize timestamp from BSON.
|
@@ -140,8 +140,8 @@ module BSON
|
|
140
140
|
#
|
141
141
|
# @since 2.0.0
|
142
142
|
def self.from_bson(buffer, **options)
|
143
|
-
increment = buffer.
|
144
|
-
seconds = buffer.
|
143
|
+
increment = buffer.get_uint32
|
144
|
+
seconds = buffer.get_uint32
|
145
145
|
new(seconds, increment)
|
146
146
|
end
|
147
147
|
|
data/lib/bson/version.rb
CHANGED
@@ -66,7 +66,7 @@ describe BSON::ByteBuffer do
|
|
66
66
|
describe '#get_double' do
|
67
67
|
|
68
68
|
let(:buffer) do
|
69
|
-
described_class.new(
|
69
|
+
described_class.new(12.5.to_bson.to_s)
|
70
70
|
end
|
71
71
|
|
72
72
|
let!(:double) do
|
@@ -85,7 +85,7 @@ describe BSON::ByteBuffer do
|
|
85
85
|
describe '#get_int32' do
|
86
86
|
|
87
87
|
let(:buffer) do
|
88
|
-
described_class.new(
|
88
|
+
described_class.new(12.to_bson.to_s)
|
89
89
|
end
|
90
90
|
|
91
91
|
let!(:int32) do
|
@@ -101,10 +101,66 @@ describe BSON::ByteBuffer do
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
+
describe '#get_uint32' do
|
105
|
+
context 'when using 2^32-1' do
|
106
|
+
let(:buffer) do
|
107
|
+
described_class.new(4294967295.to_bson.to_s)
|
108
|
+
end
|
109
|
+
|
110
|
+
let!(:int32) do
|
111
|
+
buffer.get_uint32
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'gets the uint32 from the buffer' do
|
115
|
+
expect(int32).to eq(4294967295)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'increments the position by 4' do
|
119
|
+
expect(buffer.read_position).to eq(4)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when using 2^32-2' do
|
124
|
+
let(:buffer) do
|
125
|
+
described_class.new(4294967294.to_bson.to_s)
|
126
|
+
end
|
127
|
+
|
128
|
+
let!(:int32) do
|
129
|
+
buffer.get_uint32
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'gets the uint32 from the buffer' do
|
133
|
+
expect(int32).to eq(4294967294)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'increments the position by 4' do
|
137
|
+
expect(buffer.read_position).to eq(4)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'when using 0' do
|
142
|
+
let(:buffer) do
|
143
|
+
described_class.new(0.to_bson.to_s)
|
144
|
+
end
|
145
|
+
|
146
|
+
let!(:int32) do
|
147
|
+
buffer.get_uint32
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'gets the uint32 from the buffer' do
|
151
|
+
expect(int32).to eq(0)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'increments the position by 4' do
|
155
|
+
expect(buffer.read_position).to eq(4)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
104
160
|
describe '#get_int64' do
|
105
161
|
|
106
162
|
let(:buffer) do
|
107
|
-
described_class.new(
|
163
|
+
described_class.new((Integer::MAX_64BIT - 1).to_bson.to_s)
|
108
164
|
end
|
109
165
|
|
110
166
|
let!(:int64) do
|
@@ -30,16 +30,19 @@ describe BSON::ByteBuffer do
|
|
30
30
|
let(:buffer) do
|
31
31
|
described_class.new
|
32
32
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
|
34
|
+
context '#put_int32' do
|
35
|
+
before do
|
36
|
+
buffer.put_int32(5)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the length of the buffer' do
|
40
|
+
expect(buffer.length).to eq(4)
|
41
|
+
end
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
45
|
+
|
43
46
|
context 'when the byte buffer is initialized with some bytes' do
|
44
47
|
|
45
48
|
let(:buffer) do
|
@@ -585,6 +585,102 @@ describe BSON::ByteBuffer do
|
|
585
585
|
end
|
586
586
|
end
|
587
587
|
|
588
|
+
describe '#put_uint32' do
|
589
|
+
context 'when argument is a float' do
|
590
|
+
it 'raises an Argument Error' do
|
591
|
+
expect{ buffer.put_uint32(4.934) }.to raise_error(ArgumentError, "put_uint32: incorrect type: float, expected: integer")
|
592
|
+
end
|
593
|
+
end
|
594
|
+
|
595
|
+
context 'when number is in range' do
|
596
|
+
let(:modified) do
|
597
|
+
buffer.put_uint32(5)
|
598
|
+
end
|
599
|
+
|
600
|
+
it 'returns gets the correct number from the buffer' do
|
601
|
+
expect(modified.get_uint32).to eq(5)
|
602
|
+
end
|
603
|
+
|
604
|
+
it 'returns the length of the buffer' do
|
605
|
+
expect(modified.length).to eq(4)
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
context 'when number is 0' do
|
610
|
+
let(:modified) do
|
611
|
+
buffer.put_uint32(0)
|
612
|
+
end
|
613
|
+
|
614
|
+
it 'returns gets the correct number from the buffer' do
|
615
|
+
expect(modified.get_uint32).to eq(0)
|
616
|
+
end
|
617
|
+
|
618
|
+
it 'returns the length of the buffer' do
|
619
|
+
expect(modified.length).to eq(4)
|
620
|
+
end
|
621
|
+
end
|
622
|
+
|
623
|
+
context 'when number doesn\'t fit in signed int32' do
|
624
|
+
let(:modified) do
|
625
|
+
buffer.put_uint32(4294967295)
|
626
|
+
end
|
627
|
+
|
628
|
+
let(:expected) do
|
629
|
+
[ 4294967295 ].pack(BSON::Int32::PACK)
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'appends the int32 to the byte buffer' do
|
633
|
+
expect(modified.to_s).to eq(expected)
|
634
|
+
end
|
635
|
+
|
636
|
+
it 'get returns correct number' do
|
637
|
+
expect(modified.get_uint32).to eq(4294967295)
|
638
|
+
end
|
639
|
+
|
640
|
+
it 'returns the length of the buffer' do
|
641
|
+
expect(modified.length).to eq(4)
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
645
|
+
context 'when number is 2^31' do
|
646
|
+
let(:modified) do
|
647
|
+
buffer.put_uint32(2147483648)
|
648
|
+
end
|
649
|
+
|
650
|
+
it 'returns gets the correct number from the buffer' do
|
651
|
+
expect(modified.get_uint32).to eq(2147483648)
|
652
|
+
end
|
653
|
+
|
654
|
+
it 'returns the length of the buffer' do
|
655
|
+
expect(modified.length).to eq(4)
|
656
|
+
end
|
657
|
+
end
|
658
|
+
|
659
|
+
context 'when number is 2^31-1' do
|
660
|
+
let(:modified) do
|
661
|
+
buffer.put_uint32(2147483647)
|
662
|
+
end
|
663
|
+
|
664
|
+
it 'returns gets the correct number from the buffer' do
|
665
|
+
expect(modified.get_uint32).to eq(2147483647)
|
666
|
+
end
|
667
|
+
|
668
|
+
it 'returns the length of the buffer' do
|
669
|
+
expect(modified.length).to eq(4)
|
670
|
+
end
|
671
|
+
end
|
672
|
+
|
673
|
+
context 'when number is not in range' do
|
674
|
+
it 'raises error on out of top range' do
|
675
|
+
expect{ buffer.put_uint32(4294967296) }.to raise_error(RangeError, "Number 4294967296 is out of range [0, 2^32)")
|
676
|
+
end
|
677
|
+
|
678
|
+
it 'raises error on out of bottom range' do
|
679
|
+
expect{ buffer.put_uint32(-1) }.to raise_error(RangeError, "Number -1 is out of range [0, 2^32)")
|
680
|
+
end
|
681
|
+
end
|
682
|
+
end
|
683
|
+
|
588
684
|
describe '#put_int64' do
|
589
685
|
|
590
686
|
context 'when the integer is 64 bit' do
|
data/spec/bson/date_time_spec.rb
CHANGED
@@ -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
|
@@ -13,6 +13,16 @@
|
|
13
13
|
"canonical_bson": "100000001161002A00000015CD5B0700",
|
14
14
|
"canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : 42} } }",
|
15
15
|
"degenerate_extjson": "{\"a\" : {\"$timestamp\" : {\"i\" : 42, \"t\" : 123456789} } }"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"description": "Timestamp with high-order bit set on both seconds and increment",
|
19
|
+
"canonical_bson": "10000000116100FFFFFFFFFFFFFFFF00",
|
20
|
+
"canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 4294967295, \"i\" : 4294967295} } }"
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"description": "Timestamp with high-order bit set on both seconds and increment (not UINT32_MAX)",
|
24
|
+
"canonical_bson": "1000000011610000286BEE00286BEE00",
|
25
|
+
"canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 4000000000, \"i\" : 4000000000} } }"
|
16
26
|
}
|
17
27
|
],
|
18
28
|
"decodeErrors": [
|
@@ -65,11 +65,11 @@
|
|
65
65
|
"parseErrors": [
|
66
66
|
{
|
67
67
|
"description" : "Bad $regularExpression (extra field)",
|
68
|
-
"string" : "{\"a\" : \"$regularExpression\": {\"pattern\": \"abc\", \"options\": \"\", \"unrelated\": true}}}"
|
68
|
+
"string" : "{\"a\" : {\"$regularExpression\": {\"pattern\": \"abc\", \"options\": \"\", \"unrelated\": true}}}"
|
69
69
|
},
|
70
70
|
{
|
71
71
|
"description" : "Bad $regularExpression (missing options field)",
|
72
|
-
"string" : "{\"a\" : \"$regularExpression\": {\"pattern\": \"abc\"}}}"
|
72
|
+
"string" : "{\"a\" : {\"$regularExpression\": {\"pattern\": \"abc\"}}}"
|
73
73
|
},
|
74
74
|
{
|
75
75
|
"description": "Bad $regularExpression (pattern is number, not string)",
|
@@ -81,7 +81,7 @@
|
|
81
81
|
},
|
82
82
|
{
|
83
83
|
"description" : "Bad $regularExpression (missing pattern field)",
|
84
|
-
"string" : "{\"a\" : \"$regularExpression\": {\"options\":\"ix\"}}}"
|
84
|
+
"string" : "{\"a\" : {\"$regularExpression\": {\"options\":\"ix\"}}}"
|
85
85
|
},
|
86
86
|
{
|
87
87
|
"description": "Bad $oid (number, not string)",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Brock
|
@@ -33,7 +33,7 @@ cert_chain:
|
|
33
33
|
gpvfPNWMwyBDlHaNS3GfO6cRRxBOvEG05GUCsvtTY4Bpe8yjE64wg1ymb47LMOnv
|
34
34
|
Qb1lGORmf/opg45mluKUYl7pQNZHD0d3
|
35
35
|
-----END CERTIFICATE-----
|
36
|
-
date: 2020-
|
36
|
+
date: 2020-07-17 00:00:00.000000000 Z
|
37
37
|
dependencies: []
|
38
38
|
description: A fully featured BSON specification implementation in Ruby
|
39
39
|
email:
|
@@ -99,7 +99,6 @@ files:
|
|
99
99
|
- lib/bson/true_class.rb
|
100
100
|
- lib/bson/undefined.rb
|
101
101
|
- lib/bson/version.rb
|
102
|
-
- lib/bson_native.bundle
|
103
102
|
- spec/bson/array_spec.rb
|
104
103
|
- spec/bson/binary_spec.rb
|
105
104
|
- spec/bson/binary_uuid_spec.rb
|
@@ -240,113 +239,113 @@ signing_key:
|
|
240
239
|
specification_version: 4
|
241
240
|
summary: Ruby implementation of the BSON specification
|
242
241
|
test_files:
|
242
|
+
- spec/spec_helper.rb
|
243
|
+
- spec/spec_tests/corpus_spec.rb
|
243
244
|
- spec/spec_tests/common_driver_spec.rb
|
244
|
-
- spec/spec_tests/
|
245
|
+
- spec/spec_tests/data/corpus/decimal128-7.json
|
246
|
+
- spec/spec_tests/data/corpus/top.json
|
245
247
|
- spec/spec_tests/data/corpus/array.json
|
248
|
+
- spec/spec_tests/data/corpus/null.json
|
246
249
|
- spec/spec_tests/data/corpus/document.json
|
247
|
-
- spec/spec_tests/data/corpus/decimal128-7.json
|
248
|
-
- spec/spec_tests/data/corpus/decimal128-3.json
|
249
|
-
- spec/spec_tests/data/corpus/maxkey.json
|
250
|
-
- spec/spec_tests/data/corpus/code.json
|
251
|
-
- spec/spec_tests/data/corpus/dbpointer.json
|
252
|
-
- spec/spec_tests/data/corpus/int32.json
|
253
|
-
- spec/spec_tests/data/corpus/README.md
|
254
|
-
- spec/spec_tests/data/corpus/decimal128-5.json
|
255
|
-
- spec/spec_tests/data/corpus/decimal128-4.json
|
256
250
|
- spec/spec_tests/data/corpus/decimal128-2.json
|
257
|
-
- spec/spec_tests/data/corpus/
|
258
|
-
- spec/spec_tests/data/corpus/
|
251
|
+
- spec/spec_tests/data/corpus/decimal128-6.json
|
252
|
+
- spec/spec_tests/data/corpus/boolean.json
|
253
|
+
- spec/spec_tests/data/corpus/README.md
|
254
|
+
- spec/spec_tests/data/corpus/maxkey.json
|
259
255
|
- spec/spec_tests/data/corpus/binary.json
|
256
|
+
- spec/spec_tests/data/corpus/multi-type.json
|
257
|
+
- spec/spec_tests/data/corpus/timestamp.json
|
258
|
+
- spec/spec_tests/data/corpus/multi-type-deprecated.json
|
259
|
+
- spec/spec_tests/data/corpus/dbpointer.json
|
260
260
|
- spec/spec_tests/data/corpus/oid.json
|
261
|
-
- spec/spec_tests/data/corpus/null.json
|
262
|
-
- spec/spec_tests/data/corpus/decimal128-6.json
|
263
|
-
- spec/spec_tests/data/corpus/int64.json
|
264
|
-
- spec/spec_tests/data/corpus/dbref.json
|
265
261
|
- spec/spec_tests/data/corpus/regex.json
|
266
262
|
- spec/spec_tests/data/corpus/minkey.json
|
267
|
-
- spec/spec_tests/data/corpus/multi-type.json
|
268
|
-
- spec/spec_tests/data/corpus/top.json
|
269
263
|
- spec/spec_tests/data/corpus/symbol.json
|
270
|
-
- spec/spec_tests/data/corpus/
|
264
|
+
- spec/spec_tests/data/corpus/dbref.json
|
265
|
+
- spec/spec_tests/data/corpus/decimal128-1.json
|
271
266
|
- spec/spec_tests/data/corpus/undefined.json
|
272
|
-
- spec/spec_tests/data/corpus/
|
267
|
+
- spec/spec_tests/data/corpus/double.json
|
268
|
+
- spec/spec_tests/data/corpus/decimal128-4.json
|
269
|
+
- spec/spec_tests/data/corpus/decimal128-3.json
|
270
|
+
- spec/spec_tests/data/corpus/decimal128-5.json
|
271
|
+
- spec/spec_tests/data/corpus/int32.json
|
273
272
|
- spec/spec_tests/data/corpus/string.json
|
274
|
-
- spec/spec_tests/data/corpus/
|
275
|
-
- spec/spec_tests/data/corpus/
|
276
|
-
- spec/spec_tests/data/corpus/
|
277
|
-
- spec/spec_tests/data/
|
278
|
-
- spec/spec_tests/data/
|
279
|
-
- spec/spec_tests/data/decimal128/decimal128-5.json
|
280
|
-
- spec/spec_tests/data/decimal128/decimal128-4.json
|
281
|
-
- spec/spec_tests/data/decimal128/decimal128-2.json
|
282
|
-
- spec/spec_tests/data/decimal128/decimal128-6.json
|
283
|
-
- spec/spec_tests/data/decimal128/decimal128-1.json
|
273
|
+
- spec/spec_tests/data/corpus/code.json
|
274
|
+
- spec/spec_tests/data/corpus/code_w_scope.json
|
275
|
+
- spec/spec_tests/data/corpus/int64.json
|
276
|
+
- spec/spec_tests/data/corpus/datetime.json
|
277
|
+
- spec/spec_tests/data/corpus_legacy/top.json
|
284
278
|
- spec/spec_tests/data/corpus_legacy/array.json
|
279
|
+
- spec/spec_tests/data/corpus_legacy/null.json
|
285
280
|
- spec/spec_tests/data/corpus_legacy/document.json
|
281
|
+
- spec/spec_tests/data/corpus_legacy/boolean.json
|
286
282
|
- spec/spec_tests/data/corpus_legacy/maxkey.json
|
287
|
-
- spec/spec_tests/data/corpus_legacy/code.json
|
288
|
-
- spec/spec_tests/data/corpus_legacy/int32.json
|
289
|
-
- spec/spec_tests/data/corpus_legacy/double.json
|
290
|
-
- spec/spec_tests/data/corpus_legacy/code_w_scope.json
|
291
283
|
- spec/spec_tests/data/corpus_legacy/binary.json
|
292
|
-
- spec/spec_tests/data/corpus_legacy/
|
293
|
-
- spec/spec_tests/data/corpus_legacy/null.json
|
294
|
-
- spec/spec_tests/data/corpus_legacy/regex.json
|
295
|
-
- spec/spec_tests/data/corpus_legacy/minkey.json
|
296
|
-
- spec/spec_tests/data/corpus_legacy/top.json
|
284
|
+
- spec/spec_tests/data/corpus_legacy/timestamp.json
|
297
285
|
- spec/spec_tests/data/corpus_legacy/failures/dbpointer.json
|
298
|
-
- spec/spec_tests/data/corpus_legacy/failures/int64.json
|
299
286
|
- spec/spec_tests/data/corpus_legacy/failures/symbol.json
|
287
|
+
- spec/spec_tests/data/corpus_legacy/failures/int64.json
|
300
288
|
- spec/spec_tests/data/corpus_legacy/failures/datetime.json
|
289
|
+
- spec/spec_tests/data/corpus_legacy/oid.json
|
290
|
+
- spec/spec_tests/data/corpus_legacy/regex.json
|
291
|
+
- spec/spec_tests/data/corpus_legacy/minkey.json
|
301
292
|
- spec/spec_tests/data/corpus_legacy/undefined.json
|
293
|
+
- spec/spec_tests/data/corpus_legacy/double.json
|
294
|
+
- spec/spec_tests/data/corpus_legacy/int32.json
|
302
295
|
- spec/spec_tests/data/corpus_legacy/string.json
|
303
|
-
- spec/spec_tests/data/corpus_legacy/
|
304
|
-
- spec/spec_tests/data/corpus_legacy/
|
305
|
-
- spec/spec_tests/
|
306
|
-
- spec/
|
307
|
-
- spec/
|
308
|
-
- spec/
|
309
|
-
- spec/
|
310
|
-
- spec/
|
311
|
-
- spec/
|
296
|
+
- spec/spec_tests/data/corpus_legacy/code.json
|
297
|
+
- spec/spec_tests/data/corpus_legacy/code_w_scope.json
|
298
|
+
- spec/spec_tests/data/decimal128/decimal128-7.json
|
299
|
+
- spec/spec_tests/data/decimal128/decimal128-2.json
|
300
|
+
- spec/spec_tests/data/decimal128/decimal128-6.json
|
301
|
+
- spec/spec_tests/data/decimal128/decimal128-1.json
|
302
|
+
- spec/spec_tests/data/decimal128/decimal128-4.json
|
303
|
+
- spec/spec_tests/data/decimal128/decimal128-3.json
|
304
|
+
- spec/spec_tests/data/decimal128/decimal128-5.json
|
305
|
+
- spec/spec_tests/corpus_legacy_spec.rb
|
312
306
|
- spec/support/utils.rb
|
313
|
-
- spec/
|
314
|
-
- spec/
|
315
|
-
- spec/
|
316
|
-
- spec/
|
307
|
+
- spec/support/shared_examples.rb
|
308
|
+
- spec/support/spec_config.rb
|
309
|
+
- spec/runners/common_driver.rb
|
310
|
+
- spec/runners/corpus_legacy.rb
|
311
|
+
- spec/runners/corpus.rb
|
312
|
+
- spec/bson/code_spec.rb
|
317
313
|
- spec/bson/byte_buffer_read_spec.rb
|
318
|
-
- spec/bson/config_spec.rb
|
319
314
|
- spec/bson/int32_spec.rb
|
320
|
-
- spec/bson/
|
321
|
-
- spec/bson/
|
322
|
-
- spec/bson/
|
315
|
+
- spec/bson/max_key_spec.rb
|
316
|
+
- spec/bson/time_spec.rb
|
317
|
+
- spec/bson/array_spec.rb
|
318
|
+
- spec/bson/date_time_spec.rb
|
323
319
|
- spec/bson/document_spec.rb
|
324
|
-
- spec/bson/
|
320
|
+
- spec/bson/float_spec.rb
|
321
|
+
- spec/bson/nil_class_spec.rb
|
322
|
+
- spec/bson/time_with_zone_spec.rb
|
323
|
+
- spec/bson/ext_json_parse_spec.rb
|
324
|
+
- spec/bson/string_spec.rb
|
325
|
+
- spec/bson/open_struct_spec.rb
|
326
|
+
- spec/bson/config_spec.rb
|
325
327
|
- spec/bson/false_class_spec.rb
|
326
|
-
- spec/bson/
|
327
|
-
- spec/bson/
|
328
|
-
- spec/bson/
|
328
|
+
- spec/bson/raw_spec.rb
|
329
|
+
- spec/bson/regexp_spec.rb
|
330
|
+
- spec/bson/binary_spec.rb
|
331
|
+
- spec/bson/object_spec.rb
|
329
332
|
- spec/bson/decimal128_spec.rb
|
330
|
-
- spec/bson/
|
331
|
-
- spec/bson/time_spec.rb
|
333
|
+
- spec/bson/binary_uuid_spec.rb
|
332
334
|
- spec/bson/boolean_spec.rb
|
333
335
|
- spec/bson/byte_buffer_spec.rb
|
334
|
-
- spec/bson/
|
336
|
+
- spec/bson/json_spec.rb
|
337
|
+
- spec/bson/symbol_spec.rb
|
338
|
+
- spec/bson/integer_spec.rb
|
339
|
+
- spec/bson/byte_buffer_write_spec.rb
|
340
|
+
- spec/bson/registry_spec.rb
|
341
|
+
- spec/bson/code_with_scope_spec.rb
|
342
|
+
- spec/bson/true_class_spec.rb
|
335
343
|
- spec/bson/undefined_spec.rb
|
336
|
-
- spec/bson/
|
337
|
-
- spec/bson/string_spec.rb
|
344
|
+
- spec/bson/object_id_spec.rb
|
338
345
|
- spec/bson/timestamp_spec.rb
|
339
|
-
- spec/bson/
|
340
|
-
- spec/bson/
|
346
|
+
- spec/bson/hash_spec.rb
|
347
|
+
- spec/bson/symbol_raw_spec.rb
|
348
|
+
- spec/bson/min_key_spec.rb
|
341
349
|
- spec/bson/int64_spec.rb
|
342
|
-
- spec/bson/byte_buffer_write_spec.rb
|
343
350
|
- spec/bson/date_spec.rb
|
344
|
-
- spec/bson/binary_spec.rb
|
345
|
-
- spec/bson/code_with_scope_spec.rb
|
346
|
-
- spec/bson/integer_spec.rb
|
347
|
-
- spec/bson/binary_uuid_spec.rb
|
348
|
-
- spec/bson/nil_class_spec.rb
|
349
|
-
- spec/bson/array_spec.rb
|
350
|
-
- spec/bson/time_with_zone_spec.rb
|
351
|
-
- spec/bson/float_spec.rb
|
352
351
|
- spec/bson_spec.rb
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/bson_native.bundle
DELETED
Binary file
|