bson 4.9.0 → 4.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +15 -6
  4. data/ext/bson/bson-native.h +4 -0
  5. data/ext/bson/init.c +75 -23
  6. data/ext/bson/read.c +63 -11
  7. data/ext/bson/write.c +42 -3
  8. data/lib/bson/active_support.rb +1 -0
  9. data/lib/bson/array.rb +5 -1
  10. data/lib/bson/big_decimal.rb +67 -0
  11. data/lib/bson/binary.rb +8 -5
  12. data/lib/bson/boolean.rb +2 -1
  13. data/lib/bson/code.rb +2 -1
  14. data/lib/bson/code_with_scope.rb +2 -1
  15. data/lib/bson/config.rb +1 -0
  16. data/lib/bson/date.rb +1 -0
  17. data/lib/bson/date_time.rb +2 -1
  18. data/lib/bson/db_pointer.rb +2 -1
  19. data/lib/bson/dbref.rb +152 -0
  20. data/lib/bson/decimal128/builder.rb +27 -20
  21. data/lib/bson/decimal128.rb +39 -14
  22. data/lib/bson/document.rb +61 -18
  23. data/lib/bson/environment.rb +1 -0
  24. data/lib/bson/error.rb +13 -0
  25. data/lib/bson/ext_json.rb +24 -11
  26. data/lib/bson/false_class.rb +2 -1
  27. data/lib/bson/float.rb +21 -32
  28. data/lib/bson/hash.rb +18 -6
  29. data/lib/bson/int32.rb +3 -2
  30. data/lib/bson/int64.rb +3 -2
  31. data/lib/bson/integer.rb +3 -2
  32. data/lib/bson/json.rb +1 -0
  33. data/lib/bson/max_key.rb +3 -2
  34. data/lib/bson/min_key.rb +3 -2
  35. data/lib/bson/nil_class.rb +2 -1
  36. data/lib/bson/object.rb +1 -0
  37. data/lib/bson/object_id.rb +4 -3
  38. data/lib/bson/open_struct.rb +1 -0
  39. data/lib/bson/regexp.rb +24 -7
  40. data/lib/bson/registry.rb +1 -0
  41. data/lib/bson/specialized.rb +1 -0
  42. data/lib/bson/string.rb +3 -2
  43. data/lib/bson/symbol.rb +2 -1
  44. data/lib/bson/time.rb +4 -3
  45. data/lib/bson/time_with_zone.rb +1 -0
  46. data/lib/bson/timestamp.rb +7 -6
  47. data/lib/bson/true_class.rb +2 -1
  48. data/lib/bson/undefined.rb +2 -1
  49. data/lib/bson/version.rb +2 -1
  50. data/lib/bson.rb +8 -5
  51. data/spec/README.md +14 -0
  52. data/spec/bson/array_spec.rb +17 -0
  53. data/spec/bson/big_decimal_spec.rb +316 -0
  54. data/spec/bson/binary_spec.rb +1 -1
  55. data/spec/bson/binary_uuid_spec.rb +12 -0
  56. data/spec/bson/byte_buffer_read_spec.rb +59 -3
  57. data/spec/bson/byte_buffer_spec.rb +129 -6
  58. data/spec/bson/byte_buffer_write_spec.rb +96 -0
  59. data/spec/bson/date_time_spec.rb +53 -0
  60. data/spec/bson/dbref_legacy_spec.rb +169 -0
  61. data/spec/bson/dbref_spec.rb +487 -0
  62. data/spec/bson/decimal128_spec.rb +231 -0
  63. data/spec/bson/document_as_spec.rb +46 -0
  64. data/spec/bson/document_spec.rb +43 -1
  65. data/spec/bson/ext_json_parse_spec.rb +37 -0
  66. data/spec/bson/hash_as_spec.rb +57 -0
  67. data/spec/bson/hash_spec.rb +105 -0
  68. data/spec/bson/int64_spec.rb +4 -24
  69. data/spec/bson/raw_spec.rb +18 -1
  70. data/spec/bson/regexp_spec.rb +52 -0
  71. data/spec/runners/common_driver.rb +1 -1
  72. data/spec/shared/LICENSE +20 -0
  73. data/spec/shared/bin/get-mongodb-download-url +17 -0
  74. data/spec/shared/bin/s3-copy +45 -0
  75. data/spec/shared/bin/s3-upload +69 -0
  76. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  77. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  78. data/spec/shared/lib/mrss/constraints.rb +386 -0
  79. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  80. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  81. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  82. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  83. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  84. data/spec/shared/lib/mrss/utils.rb +15 -0
  85. data/spec/shared/share/Dockerfile.erb +338 -0
  86. data/spec/shared/share/haproxy-1.conf +16 -0
  87. data/spec/shared/share/haproxy-2.conf +17 -0
  88. data/spec/shared/shlib/distro.sh +74 -0
  89. data/spec/shared/shlib/server.sh +367 -0
  90. data/spec/shared/shlib/set_env.sh +131 -0
  91. data/spec/spec_helper.rb +31 -0
  92. data/spec/spec_tests/common_driver_spec.rb +2 -1
  93. data/spec/spec_tests/data/corpus/binary.json +33 -0
  94. data/spec/spec_tests/data/corpus/dbref.json +21 -1
  95. data/spec/spec_tests/data/corpus/document.json +4 -0
  96. data/spec/spec_tests/data/corpus/regex.json +2 -2
  97. data/spec/spec_tests/data/corpus/timestamp.json +10 -0
  98. data/spec/spec_tests/data/corpus/top.json +23 -12
  99. data/spec/support/spec_config.rb +8 -1
  100. data.tar.gz.sig +0 -0
  101. metadata +168 -93
  102. metadata.gz.sig +1 -0
@@ -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
@@ -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
@@ -0,0 +1,169 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+ require 'json'
6
+
7
+ # These tests are copied from driver when the driver implemented Mongo:DBRef
8
+ # class, and are intended to verify that the current DBRef implementation is
9
+ # compatible with the legacy driver DBRef interface.
10
+
11
+ describe BSON::DBRef do
12
+
13
+ let(:object_id) do
14
+ BSON::ObjectId.new
15
+ end
16
+
17
+ describe '#as_json' do
18
+
19
+ context 'when the database is not provided' do
20
+
21
+ let(:dbref) do
22
+ described_class.new('users', object_id)
23
+ end
24
+
25
+ it 'returns the json document without database' do
26
+ expect(dbref.as_json).to eq({ '$ref' => 'users', '$id' => object_id })
27
+ end
28
+ end
29
+
30
+ context 'when the database is provided' do
31
+
32
+ let(:dbref) do
33
+ described_class.new('users', object_id, 'database')
34
+ end
35
+
36
+ it 'returns the json document with database' do
37
+ expect(dbref.as_json).to eq({
38
+ '$ref' => 'users',
39
+ '$id' => object_id,
40
+ '$db' => 'database'
41
+ })
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#initialize' do
47
+
48
+ let(:dbref) do
49
+ described_class.new('users', object_id)
50
+ end
51
+
52
+ it 'sets the collection' do
53
+ expect(dbref.collection).to eq('users')
54
+ end
55
+
56
+ it 'sets the id' do
57
+ expect(dbref.id).to eq(object_id)
58
+ end
59
+
60
+ context 'when a database is provided' do
61
+
62
+ let(:dbref) do
63
+ described_class.new('users', object_id, 'db')
64
+ end
65
+
66
+ it 'sets the database' do
67
+ expect(dbref.database).to eq('db')
68
+ end
69
+
70
+ context 'when id is not provided' do
71
+
72
+ let(:dbref) do
73
+ described_class.new('users', nil, 'db')
74
+ end
75
+
76
+ it 'raises ArgumentError' do
77
+ lambda do
78
+ dbref
79
+ end.should raise_error(ArgumentError)
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ describe '#to_bson' do
86
+
87
+ let(:dbref) do
88
+ described_class.new('users', object_id, 'database')
89
+ end
90
+
91
+ it 'converts the underlying document to bson' do
92
+ expect(dbref.to_bson.to_s).to eq(dbref.as_json.to_bson.to_s)
93
+ end
94
+ end
95
+
96
+ describe '#to_json' do
97
+
98
+ context 'when the database is not provided' do
99
+
100
+ let(:dbref) do
101
+ described_class.new('users', object_id)
102
+ end
103
+
104
+ it 'returns the json document without database' do
105
+ expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json}}")
106
+ end
107
+ end
108
+
109
+ context 'when the database is provided' do
110
+
111
+ let(:dbref) do
112
+ described_class.new('users', object_id, 'database')
113
+ end
114
+
115
+ it 'returns the json document with database' do
116
+ expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json},\"$db\":\"database\"}")
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#from_bson' do
122
+
123
+ let(:buffer) do
124
+ dbref.to_bson
125
+ end
126
+
127
+ let(:decoded) do
128
+ BSON::Document.from_bson(BSON::ByteBuffer.new(buffer.to_s))
129
+ end
130
+
131
+ context 'when a database exists' do
132
+
133
+ let(:dbref) do
134
+ described_class.new('users', object_id, 'database')
135
+ end
136
+
137
+ it 'decodes the ref' do
138
+ expect(decoded.collection).to eq('users')
139
+ end
140
+
141
+ it 'decodes the id' do
142
+ expect(decoded.id).to eq(object_id)
143
+ end
144
+
145
+ it 'decodes the database' do
146
+ expect(decoded.database).to eq('database')
147
+ end
148
+ end
149
+
150
+ context 'when no database exists' do
151
+
152
+ let(:dbref) do
153
+ described_class.new('users', object_id)
154
+ end
155
+
156
+ it 'decodes the ref' do
157
+ expect(decoded.collection).to eq('users')
158
+ end
159
+
160
+ it 'decodes the id' do
161
+ expect(decoded.id).to eq(object_id)
162
+ end
163
+
164
+ it 'sets the database to nil' do
165
+ expect(decoded.database).to be_nil
166
+ end
167
+ end
168
+ end
169
+ end