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
data/lib/bson/error.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module BSON
2
3
  # Base exception class for all BSON-related errors.
3
4
  #
@@ -17,5 +18,17 @@ module BSON
17
18
  # Exception raised when BSON decoding fails.
18
19
  class BSONDecodeError < Error
19
20
  end
21
+
22
+ # Exception raised when serializing an Array or Hash to BSON and an
23
+ # array or hash element is of a class that does not define how to serialize
24
+ # itself to BSON.
25
+ class UnserializableClass < Error
26
+ end
27
+
28
+ # Exception raised when there is an invalid argument passed into the
29
+ # constructor of regexp object. This includes when the argument contains
30
+ # a null byte.
31
+ class InvalidRegexpPattern < Error
32
+ end
20
33
  end
21
34
  end
data/lib/bson/ext_json.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2019-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -138,7 +139,7 @@ module BSON
138
139
  return {}
139
140
  end
140
141
 
141
- if hash.key?('$ref')
142
+ if dbref?(hash)
142
143
  # Legacy dbref handling.
143
144
  # Note that according to extended json spec, only hash values (but
144
145
  # not the top-level BSON document itself) may be of type "dbref".
@@ -147,10 +148,6 @@ module BSON
147
148
  # logic to top level hashes doesn't cause harm.
148
149
  hash = hash.dup
149
150
  ref = hash.delete('$ref')
150
- # $ref can be a string value or an ObjectId
151
- unless ref.is_a?(String)
152
- raise Error::ExtJSONParseError, "Invalid $ref value: #{ref}"
153
- end
154
151
  # $id, if present, can be anything
155
152
  id = hash.delete('$id')
156
153
  if id.is_a?(Hash)
@@ -163,13 +160,9 @@ module BSON
163
160
  out = {'$ref' => ref, '$id' => id}
164
161
  if hash.key?('$db')
165
162
  # $db must always be a string, if provided
166
- db = hash.delete('$db')
167
- unless db.is_a?(String)
168
- raise Error::ExtJSONParseError, "Invalid $db value: #{db}"
169
- end
170
- out['$db'] = db
163
+ out['$db'] = hash.delete('$db')
171
164
  end
172
- return out.update(hash)
165
+ return out.update(parse_hash(hash))
173
166
  end
174
167
 
175
168
  if hash.length == 1
@@ -219,6 +212,14 @@ module BSON
219
212
  raise Error::ExtJSONParseError, "Invalid subType value in $binary: #{value}"
220
213
  end
221
214
  create_binary(encoded_value, subtype)
215
+
216
+ when '$uuid'
217
+ unless /\A[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\z/.match(value)
218
+ raise Error::ExtJSONParseError, "Invalid $uuid value: #{value}"
219
+ end
220
+
221
+ return Binary.from_uuid(value)
222
+
222
223
  when '$code'
223
224
  unless value.is_a?(String)
224
225
  raise Error::ExtJSONParseError, "Invalid $code value: #{value}"
@@ -354,6 +355,9 @@ module BSON
354
355
 
355
356
  module_function def map_hash(hash, **options)
356
357
  ::Hash[hash.map do |key, value|
358
+ if (key.is_a?(String) || key.is_a?(Symbol)) && key.to_s.include?(NULL_BYTE)
359
+ raise Error::ExtJSONParseError, "Hash key cannot contain a null byte: #{key}"
360
+ end
357
361
  [key, parse_obj(value, **options)]
358
362
  end]
359
363
  end
@@ -371,5 +375,14 @@ module BSON
371
375
  module_function def create_regexp(pattern, options)
372
376
  Regexp::Raw.new(pattern, options)
373
377
  end
378
+
379
+ module_function def dbref?(hash)
380
+ if db = hash.key?('$db')
381
+ unless db.is_a?(String)
382
+ return false
383
+ end
384
+ end
385
+ return hash['$ref']&.is_a?(String) && hash.key?('$id')
386
+ end
374
387
  end
375
388
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +26,7 @@ module BSON
25
26
  # A false value in the BSON spec is 0x00.
26
27
  #
27
28
  # @since 2.0.0
28
- FALSE_BYTE = 0.chr.force_encoding(BINARY).freeze
29
+ FALSE_BYTE = String.new(0.chr, encoding: BINARY).freeze
29
30
 
30
31
  # The BSON type for false values is the general boolean type of 0x08.
31
32
  #
data/lib/bson/float.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,7 +16,7 @@
15
16
  module BSON
16
17
 
17
18
  # Injects behaviour for encoding and decoding floating point values
18
- # to and from # raw bytes as specified by the BSON spec.
19
+ # to and from raw bytes as specified by the BSON spec.
19
20
  #
20
21
  # @see http://bsonspec.org/#/specification
21
22
  #
@@ -25,12 +26,12 @@ module BSON
25
26
  # A floating point is type 0x01 in the BSON spec.
26
27
  #
27
28
  # @since 2.0.0
28
- BSON_TYPE = 1.chr.force_encoding(BINARY).freeze
29
+ BSON_TYPE = ::String.new(1.chr, encoding: BINARY).freeze
29
30
 
30
31
  # The pack directive is for 8 byte floating points.
31
32
  #
32
33
  # @since 2.0.0
33
- PACK = "E".freeze
34
+ PACK = "E"
34
35
 
35
36
  # Get the floating point as encoded BSON.
36
37
  #
@@ -57,36 +58,24 @@ module BSON
57
58
  #
58
59
  # @return [ Hash | Float ] The extended json representation.
59
60
  def as_extended_json(**options)
60
- case infinite?
61
- when 1
62
- {'$numberDouble' => 'Infinity'}
63
- when -1
64
- {'$numberDouble' => '-Infinity'}
61
+ if infinite? == 1
62
+ { '$numberDouble' => 'Infinity' }
63
+ elsif infinite? == -1
64
+ { '$numberDouble' => '-Infinity' }
65
+ elsif nan?
66
+ { '$numberDouble' => 'NaN' }
67
+ elsif options[:mode] == :relaxed || options[:mode] == :legacy
68
+ self
69
+ elsif BSON::Environment.jruby? && abs > 1e15
70
+ # Hack to make bson corpus spec tests pass.
71
+ # JRuby serializes -1.2345678901234568e+18 as
72
+ # -1234567890123456770.0, which is valid but differs from MRI
73
+ # serialization. Extended JSON spec does not define precise
74
+ # stringification of floats.
75
+ # https://jira.mongodb.org/browse/SPEC-1536
76
+ { '$numberDouble' => ('%.17g' % to_s).upcase }
65
77
  else
66
- if nan?
67
- {'$numberDouble' => 'NaN'}
68
- else
69
- if options[:mode] == :relaxed || options[:mode] == :legacy
70
- self
71
- else
72
- value = if BSON::Environment.jruby?
73
- # Hack to make bson corpus spec tests pass.
74
- # JRuby serializes -1.2345678901234568e+18 as
75
- # -1234567890123456770.0, which is valid but differs from MRI
76
- # serialization. Extended JSON spec does not define precise
77
- # stringification of floats.
78
- # https://jira.mongodb.org/browse/SPEC-1536
79
- if abs > 1e15
80
- '%.17g' % to_s
81
- else
82
- to_s
83
- end
84
- else
85
- to_s
86
- end
87
- {'$numberDouble' => value.upcase}
88
- end
89
- end
78
+ { '$numberDouble' => to_s.upcase }
90
79
  end
91
80
  end
92
81
 
data/lib/bson/hash.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +26,7 @@ module BSON
25
26
  # A hash, also called an embedded document, is type 0x03 in the BSON spec.
26
27
  #
27
28
  # @since 2.0.0
28
- BSON_TYPE = 3.chr.force_encoding(BINARY).freeze
29
+ BSON_TYPE = ::String.new(3.chr, encoding: BINARY).freeze
29
30
 
30
31
  # Get the hash as encoded BSON.
31
32
  #
@@ -44,6 +45,9 @@ module BSON
44
45
  position = buffer.length
45
46
  buffer.put_int32(0)
46
47
  each do |field, value|
48
+ unless value.respond_to?(:bson_type)
49
+ raise Error::UnserializableClass, "Hash value for key '#{field}' does not define its BSON serialized type: #{value}"
50
+ end
47
51
  buffer.put_byte(value.bson_type)
48
52
  key = field.to_bson_key(validating_keys)
49
53
  begin
@@ -67,7 +71,7 @@ module BSON
67
71
  # @example Convert the hash to a normalized value.
68
72
  # hash.to_bson_normalized_value
69
73
  #
70
- # @return [ BSON::Document ] The normazlied hash.
74
+ # @return [ BSON::Document ] The normalized hash.
71
75
  #
72
76
  # @since 3.0.0
73
77
  def to_bson_normalized_value
@@ -85,9 +89,7 @@ module BSON
85
89
  #
86
90
  # @return [ Hash ] This hash converted to extended json representation.
87
91
  def as_extended_json(**options)
88
- ::Hash[map do |key, value|
89
- [key, value.as_extended_json(**options)]
90
- end]
92
+ transform_values { |value| value.as_extended_json(**options) }
91
93
  end
92
94
 
93
95
  module ClassMethods
@@ -98,7 +100,7 @@ module BSON
98
100
  #
99
101
  # @option options [ nil | :bson ] :mode Decoding mode to use.
100
102
  #
101
- # @return [ Array ] The decoded hash.
103
+ # @return [ Hash ] The decoded hash.
102
104
  #
103
105
  # @see http://bsonspec.org/#/specification
104
106
  #
@@ -126,6 +128,16 @@ module BSON
126
128
  if actual_byte_size != expected_byte_size
127
129
  raise Error::BSONDecodeError, "Expected hash to take #{expected_byte_size} bytes but it took #{actual_byte_size} bytes"
128
130
  end
131
+
132
+ if hash['$ref'] && hash['$id']
133
+ # We're doing implicit decoding here. If the document is an invalid
134
+ # dbref, we should decode it as a BSON::Document.
135
+ begin
136
+ hash = DBRef.new(hash)
137
+ rescue ArgumentError
138
+ end
139
+ end
140
+
129
141
  hash
130
142
  end
131
143
  end
data/lib/bson/int32.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +25,7 @@ module BSON
24
25
  # A boolean is type 0x08 in the BSON spec.
25
26
  #
26
27
  # @since 2.0.0
27
- BSON_TYPE = 16.chr.force_encoding(BINARY).freeze
28
+ BSON_TYPE = ::String.new(16.chr, encoding: BINARY).freeze
28
29
 
29
30
  # The number of bytes constant.
30
31
  #
@@ -34,7 +35,7 @@ module BSON
34
35
  # Constant for the int 32 pack directive.
35
36
  #
36
37
  # @since 2.0.0
37
- PACK = "l<".freeze
38
+ PACK = "l<"
38
39
 
39
40
  # Deserialize an Integer from BSON.
40
41
  #
data/lib/bson/int64.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,12 +25,12 @@ module BSON
24
25
  # A boolean is type 0x08 in the BSON spec.
25
26
  #
26
27
  # @since 2.0.0
27
- BSON_TYPE = 18.chr.force_encoding(BINARY).freeze
28
+ BSON_TYPE = ::String.new(18.chr, encoding: BINARY).freeze
28
29
 
29
30
  # Constant for the int 64 pack directive.
30
31
  #
31
32
  # @since 2.0.0
32
- PACK = "q<".freeze
33
+ PACK = "q<"
33
34
 
34
35
  # Deserialize an Integer from BSON.
35
36
  #
data/lib/bson/integer.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,13 +46,13 @@ module BSON
45
46
  # The BSON index size.
46
47
  #
47
48
  # @since 2.0.0
48
- BSON_INDEX_SIZE = 1024.freeze
49
+ BSON_INDEX_SIZE = 1024
49
50
 
50
51
  # A hash of index values for array optimization.
51
52
  #
52
53
  # @since 2.0.0
53
54
  BSON_ARRAY_INDEXES = ::Array.new(BSON_INDEX_SIZE) do |i|
54
- (i.to_s.force_encoding(BINARY) << NULL_BYTE).freeze
55
+ (i.to_s.b << NULL_BYTE).freeze
55
56
  end.freeze
56
57
 
57
58
  # Is this integer a valid BSON 32 bit value?
data/lib/bson/json.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
data/lib/bson/max_key.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,12 +29,12 @@ module BSON
28
29
  # A $maxKey is type 0x7F in the BSON spec.
29
30
  #
30
31
  # @since 2.0.0
31
- BSON_TYPE = 127.chr.force_encoding(BINARY).freeze
32
+ BSON_TYPE = ::String.new(127.chr, encoding: BINARY).freeze
32
33
 
33
34
  # Constant for always evaluating greater in a comparison.
34
35
  #
35
36
  # @since 2.0.0
36
- GREATER = 1.freeze
37
+ GREATER = 1
37
38
 
38
39
  # When comparing a max key with any other object, the max key will always
39
40
  # be greater.
data/lib/bson/min_key.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,12 +29,12 @@ module BSON
28
29
  # A $minKey is type 0xFF in the BSON spec.
29
30
  #
30
31
  # @since 2.0.0
31
- BSON_TYPE = 255.chr.force_encoding(BINARY).freeze
32
+ BSON_TYPE = ::String.new(255.chr, encoding: BINARY).freeze
32
33
 
33
34
  # Constant for always evaluating lesser in a comparison.
34
35
  #
35
36
  # @since 2.0.0
36
- LESSER = -1.freeze
37
+ LESSER = -1
37
38
 
38
39
  # When comparing a min key with any other object, the min key will always
39
40
  # be lesser.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,7 +27,7 @@ module BSON
26
27
  # A nil is type 0x0A in the BSON spec.
27
28
  #
28
29
  # @since 2.0.0
29
- BSON_TYPE = 10.chr.force_encoding(BINARY).freeze
30
+ BSON_TYPE = ::String.new(10.chr, encoding: BINARY).freeze
30
31
 
31
32
  module ClassMethods
32
33
 
data/lib/bson/object.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
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
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -30,7 +31,7 @@ module BSON
30
31
  # A object_id is type 0x07 in the BSON spec.
31
32
  #
32
33
  # @since 2.0.0
33
- BSON_TYPE = 7.chr.force_encoding(BINARY).freeze
34
+ BSON_TYPE = ::String.new(7.chr, encoding: BINARY).freeze
34
35
 
35
36
  # Check equality of the object id with another object.
36
37
  #
@@ -112,7 +113,7 @@ module BSON
112
113
  #
113
114
  # @since 2.0.0
114
115
  def generation_time
115
- ::Time.at(generate_data.unpack("N")[0]).utc
116
+ ::Time.at(generate_data.unpack1("N")).utc
116
117
  end
117
118
  alias :to_time :generation_time
118
119
 
@@ -352,7 +353,7 @@ module BSON
352
353
  # @since 2.0.0
353
354
  def initialize
354
355
  @counter = rand(0x1000000)
355
- @machine_id = Digest::MD5.digest(Socket.gethostname).unpack("N")[0]
356
+ @machine_id = Digest::MD5.digest(Socket.gethostname).unpack1("N")
356
357
  @mutex = Mutex.new
357
358
  end
358
359
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2016-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
data/lib/bson/regexp.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,34 +27,34 @@ module BSON
26
27
  # A regular expression is type 0x0B in the BSON spec.
27
28
  #
28
29
  # @since 2.0.0
29
- BSON_TYPE = 11.chr.force_encoding(BINARY).freeze
30
+ BSON_TYPE = ::String.new(11.chr, encoding: BINARY).freeze
30
31
 
31
32
  # Extended value constant.
32
33
  #
33
34
  # @since 3.2.6
34
- EXTENDED_VALUE = 'x'.freeze
35
+ EXTENDED_VALUE = 'x'
35
36
 
36
37
  # Ignore case constant.
37
38
  #
38
39
  # @since 3.2.6
39
- IGNORECASE_VALUE = 'i'.freeze
40
+ IGNORECASE_VALUE = 'i'
40
41
 
41
42
  # Multiline constant.
42
43
  #
43
44
  # @since 3.2.6
44
- MULTILINE_VALUE = 'm'.freeze
45
+ MULTILINE_VALUE = 'm'
45
46
 
46
47
  # Newline constant.
47
48
  #
48
49
  # @since 3.2.6
49
- NEWLINE_VALUE = 's'.freeze
50
+ NEWLINE_VALUE = 's'
50
51
 
51
52
  # Ruby multiline constant.
52
53
  #
53
54
  # @since 3.2.6
54
55
  #
55
56
  # @deprecated Will be removed in 5.0
56
- RUBY_MULTILINE_VALUE = 'ms'.freeze
57
+ RUBY_MULTILINE_VALUE = 'ms'
57
58
 
58
59
  # Get the regexp as JSON hash data.
59
60
  #
@@ -154,6 +155,16 @@ module BSON
154
155
  #
155
156
  # @since 3.0.0
156
157
  def initialize(pattern, options = '')
158
+ if pattern.include?(NULL_BYTE)
159
+ raise Error::InvalidRegexpPattern, "Regexp pattern cannot contain a null byte: #{pattern}"
160
+ elsif options.is_a?(String) || options.is_a?(Symbol)
161
+ if options.to_s.include?(NULL_BYTE)
162
+ raise Error::InvalidRegexpPattern, "Regexp options cannot contain a null byte: #{options}"
163
+ end
164
+ elsif !options.is_a?(Integer)
165
+ raise ArgumentError, "Regexp options must be a String, Symbol, or Integer"
166
+ end
167
+
157
168
  @pattern = pattern
158
169
  @options = options
159
170
  end
@@ -165,7 +176,13 @@ module BSON
165
176
  #
166
177
  # @since 3.1.0
167
178
  def respond_to?(method, include_private = false)
168
- compile.respond_to?(method, include_private) || super
179
+ if defined?(@pattern)
180
+ compile.respond_to?(method, include_private) || super
181
+ else
182
+ # YAML calls #respond_to? during deserialization, before the object
183
+ # is initialized.
184
+ super
185
+ end
169
186
  end
170
187
 
171
188
  # Encode the Raw Regexp object to BSON.
data/lib/bson/registry.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
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
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
data/lib/bson/string.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  # Copyright (C) 2009-2020 MongoDB Inc.
3
4
  #
4
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,12 +27,12 @@ module BSON
26
27
  # A string is type 0x02 in the BSON spec.
27
28
  #
28
29
  # @since 2.0.0
29
- BSON_TYPE = 2.chr.force_encoding(BINARY).freeze
30
+ BSON_TYPE = ::String.new(2.chr, encoding: BINARY).freeze
30
31
 
31
32
  # Regex for matching illegal BSON keys.
32
33
  #
33
34
  # @since 4.1.0
34
- ILLEGAL_KEY = /(\A[$])|(\.)/.freeze
35
+ ILLEGAL_KEY = /(\A[$])|(\.)/
35
36
 
36
37
  # Get the string as encoded BSON.
37
38
  #
data/lib/bson/symbol.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,7 +29,7 @@ module BSON
28
29
  # A symbol is type 0x0E in the BSON spec.
29
30
  #
30
31
  # @since 2.0.0
31
- BSON_TYPE = 14.chr.force_encoding(BINARY).freeze
32
+ BSON_TYPE = ::String.new(14.chr, encoding: BINARY).freeze
32
33
 
33
34
  # Symbols are serialized as strings as symbols are now removed from the
34
35
  # BSON specification. Therefore the bson_type when serializing must be a
data/lib/bson/time.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,7 +40,7 @@ module BSON
39
40
  # A time is type 0x09 in the BSON spec.
40
41
  #
41
42
  # @since 2.0.0
42
- BSON_TYPE = 9.chr.force_encoding(BINARY).freeze
43
+ BSON_TYPE = ::String.new(9.chr, encoding: BINARY).freeze
43
44
 
44
45
  # Get the time as encoded BSON.
45
46
  #
@@ -63,8 +64,8 @@ module BSON
63
64
  #
64
65
  # @note The time is floored to the nearest millisecond.
65
66
  #
66
- # @option options [ true | false ] :relaxed Whether to produce relaxed
67
- # extended JSON representation.
67
+ # @option opts [ nil | :relaxed | :legacy ] :mode Serialization mode
68
+ # (default is canonical extended JSON)
68
69
  #
69
70
  # @return [ Hash ] The extended json representation.
70
71
  def as_extended_json(**options)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2018-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,12 +27,12 @@ module BSON
26
27
  # A timestamp is type 0x11 in the BSON spec.
27
28
  #
28
29
  # @since 2.0.0
29
- BSON_TYPE = 17.chr.force_encoding(BINARY).freeze
30
+ BSON_TYPE = ::String.new(17.chr, encoding: BINARY).freeze
30
31
 
31
32
  # Error message if an object other than a Timestamp is compared with this object.
32
33
  #
33
34
  # @since 4.3.0
34
- COMPARISON_ERROR_MESSAGE = 'comparison of %s with Timestamp failed'.freeze
35
+ COMPARISON_ERROR_MESSAGE = 'comparison of %s with Timestamp failed'
35
36
 
36
37
  # @!attribute seconds
37
38
  # @return [ Integer ] The number of seconds.
@@ -124,8 +125,8 @@ module BSON
124
125
  #
125
126
  # @since 2.0.0
126
127
  def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
127
- buffer.put_int32(increment)
128
- buffer.put_int32(seconds)
128
+ buffer.put_uint32(increment)
129
+ buffer.put_uint32(seconds)
129
130
  end
130
131
 
131
132
  # Deserialize timestamp from BSON.
@@ -140,8 +141,8 @@ module BSON
140
141
  #
141
142
  # @since 2.0.0
142
143
  def self.from_bson(buffer, **options)
143
- increment = buffer.get_int32
144
- seconds = buffer.get_int32
144
+ increment = buffer.get_uint32
145
+ seconds = buffer.get_uint32
145
146
  new(seconds, increment)
146
147
  end
147
148
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +26,7 @@ module BSON
25
26
  # A true value in the BSON spec is 0x01.
26
27
  #
27
28
  # @since 2.0.0
28
- TRUE_BYTE = 1.chr.force_encoding(BINARY).freeze
29
+ TRUE_BYTE = ::String.new(1.chr, encoding: BINARY).freeze
29
30
 
30
31
  # The BSON type for true values is the general boolean type of 0x08.
31
32
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +26,7 @@ module BSON
25
26
  # Undefined is type 0x06 in the BSON spec.
26
27
  #
27
28
  # @since 2.0.0
28
- BSON_TYPE = 6.chr.force_encoding(BINARY).freeze
29
+ BSON_TYPE = ::String.new(6.chr, encoding: BINARY).freeze
29
30
 
30
31
  # Determine if undefined is equal to another object.
31
32
  #
data/lib/bson/version.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,5 +14,5 @@
13
14
  # limitations under the License.
14
15
 
15
16
  module BSON
16
- VERSION = "4.9.0".freeze
17
+ VERSION = "4.15.0"
17
18
  end