bson 4.12.0 → 4.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -1
  3. data/README.md +4 -7
  4. data/ext/bson/bson-native.h +2 -0
  5. data/ext/bson/init.c +9 -0
  6. data/ext/bson/read.c +29 -0
  7. data/lib/bson/active_support.rb +1 -0
  8. data/lib/bson/array.rb +2 -1
  9. data/lib/bson/big_decimal.rb +67 -0
  10. data/lib/bson/binary.rb +5 -3
  11. data/lib/bson/boolean.rb +2 -1
  12. data/lib/bson/code.rb +2 -1
  13. data/lib/bson/code_with_scope.rb +2 -1
  14. data/lib/bson/config.rb +1 -0
  15. data/lib/bson/date.rb +1 -0
  16. data/lib/bson/date_time.rb +1 -0
  17. data/lib/bson/db_pointer.rb +2 -1
  18. data/lib/bson/dbref.rb +152 -0
  19. data/lib/bson/decimal128/builder.rb +27 -20
  20. data/lib/bson/decimal128.rb +27 -12
  21. data/lib/bson/document.rb +18 -0
  22. data/lib/bson/environment.rb +1 -0
  23. data/lib/bson/error.rb +7 -0
  24. data/lib/bson/ext_json.rb +16 -11
  25. data/lib/bson/false_class.rb +2 -1
  26. data/lib/bson/float.rb +21 -32
  27. data/lib/bson/hash.rb +15 -6
  28. data/lib/bson/int32.rb +3 -2
  29. data/lib/bson/int64.rb +3 -2
  30. data/lib/bson/integer.rb +3 -2
  31. data/lib/bson/json.rb +1 -0
  32. data/lib/bson/max_key.rb +3 -2
  33. data/lib/bson/min_key.rb +3 -2
  34. data/lib/bson/nil_class.rb +2 -1
  35. data/lib/bson/object.rb +1 -0
  36. data/lib/bson/object_id.rb +4 -3
  37. data/lib/bson/open_struct.rb +1 -0
  38. data/lib/bson/regexp.rb +17 -6
  39. data/lib/bson/registry.rb +1 -0
  40. data/lib/bson/specialized.rb +1 -0
  41. data/lib/bson/string.rb +3 -2
  42. data/lib/bson/symbol.rb +2 -1
  43. data/lib/bson/time.rb +4 -3
  44. data/lib/bson/time_with_zone.rb +1 -0
  45. data/lib/bson/timestamp.rb +3 -2
  46. data/lib/bson/true_class.rb +2 -1
  47. data/lib/bson/undefined.rb +2 -1
  48. data/lib/bson/version.rb +2 -1
  49. data/lib/bson.rb +8 -5
  50. data/spec/README.md +14 -0
  51. data/spec/bson/big_decimal_spec.rb +316 -0
  52. data/spec/bson/dbref_legacy_spec.rb +169 -0
  53. data/spec/bson/dbref_spec.rb +487 -0
  54. data/spec/bson/decimal128_spec.rb +16 -0
  55. data/spec/bson/document_as_spec.rb +46 -0
  56. data/spec/bson/document_spec.rb +7 -1
  57. data/spec/bson/ext_json_parse_spec.rb +37 -0
  58. data/spec/bson/hash_as_spec.rb +57 -0
  59. data/spec/bson/hash_spec.rb +32 -0
  60. data/spec/bson/int64_spec.rb +4 -24
  61. data/spec/bson/raw_spec.rb +7 -1
  62. data/spec/bson/regexp_spec.rb +52 -0
  63. data/spec/runners/common_driver.rb +1 -1
  64. data/spec/shared/LICENSE +20 -0
  65. data/spec/shared/bin/get-mongodb-download-url +17 -0
  66. data/spec/shared/bin/s3-copy +45 -0
  67. data/spec/shared/bin/s3-upload +69 -0
  68. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  69. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  70. data/spec/shared/lib/mrss/constraints.rb +386 -0
  71. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  72. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  73. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  74. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  75. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  76. data/spec/shared/lib/mrss/utils.rb +15 -0
  77. data/spec/shared/share/Dockerfile.erb +338 -0
  78. data/spec/shared/share/haproxy-1.conf +16 -0
  79. data/spec/shared/share/haproxy-2.conf +17 -0
  80. data/spec/shared/shlib/distro.sh +74 -0
  81. data/spec/shared/shlib/server.sh +367 -0
  82. data/spec/shared/shlib/set_env.sh +131 -0
  83. data/spec/spec_helper.rb +20 -0
  84. data/spec/spec_tests/common_driver_spec.rb +2 -1
  85. data/spec/spec_tests/data/corpus/binary.json +18 -1
  86. data/spec/spec_tests/data/corpus/dbref.json +21 -1
  87. data/spec/spec_tests/data/corpus/document.json +4 -0
  88. data/spec/spec_tests/data/corpus/regex.json +2 -2
  89. data/spec/spec_tests/data/corpus/top.json +20 -9
  90. data.tar.gz.sig +3 -3
  91. metadata +145 -93
  92. metadata.gz.sig +0 -0
@@ -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");
@@ -23,32 +24,32 @@ module BSON
23
24
  # A Decimal128 is type 0x13 in the BSON spec.
24
25
  #
25
26
  # @since 4.2.0
26
- BSON_TYPE = 19.chr.force_encoding(BINARY).freeze
27
+ BSON_TYPE = ::String.new(19.chr, encoding: BINARY).freeze
27
28
 
28
29
  # Exponent offset.
29
30
  #
30
31
  # @since 4.2.0
31
- EXPONENT_OFFSET = 6176.freeze
32
+ EXPONENT_OFFSET = 6176
32
33
 
33
34
  # Minimum exponent.
34
35
  #
35
36
  # @since 4.2.0
36
- MIN_EXPONENT = -6176.freeze
37
+ MIN_EXPONENT = -6176
37
38
 
38
39
  # Maximum exponent.
39
40
  #
40
41
  # @since 4.2.0
41
- MAX_EXPONENT = 6111.freeze
42
+ MAX_EXPONENT = 6111
42
43
 
43
44
  # Maximum digits of precision.
44
45
  #
45
46
  # @since 4.2.0
46
- MAX_DIGITS_OF_PRECISION = 34.freeze
47
+ MAX_DIGITS_OF_PRECISION = 34
47
48
 
48
49
  # Key for this type when converted to extended json.
49
50
  #
50
51
  # @since 4.2.0
51
- EXTENDED_JSON_KEY = "$numberDecimal".freeze
52
+ EXTENDED_JSON_KEY = "$numberDecimal"
52
53
 
53
54
  # The native type to which this object can be converted.
54
55
  #
@@ -262,7 +263,7 @@ module BSON
262
263
  # The custom error message for this error.
263
264
  #
264
265
  # @since 4.2.0
265
- MESSAGE = 'A Decimal128 can only be created from a String or BigDecimal.'.freeze
266
+ MESSAGE = 'A Decimal128 can only be created from a String or BigDecimal.'
266
267
 
267
268
  # Get the custom error message for the exception.
268
269
  #
@@ -288,7 +289,7 @@ module BSON
288
289
  # The custom error message for this error.
289
290
  #
290
291
  # @since 4.2.0
291
- MESSAGE = 'Invalid string format for creating a Decimal128 object.'.freeze
292
+ MESSAGE = 'Invalid string format for creating a Decimal128 object.'
292
293
 
293
294
  # Get the custom error message for the exception.
294
295
  #
@@ -303,9 +304,7 @@ module BSON
303
304
  end
304
305
  end
305
306
 
306
- # Raised when the exponent or significand provided is outside the valid range.
307
- #
308
- # @api private
307
+ # Raised when the exponent is outside the valid range.
309
308
  #
310
309
  # @since 4.2.0
311
310
  class InvalidRange < RuntimeError
@@ -313,7 +312,8 @@ module BSON
313
312
  # The custom error message for this error.
314
313
  #
315
314
  # @since 4.2.0
316
- MESSAGE = 'Value out of range for Decimal128 representation.'.freeze
315
+ # @deprecated
316
+ MESSAGE = 'Value out of range for Decimal128 representation.'
317
317
 
318
318
  # Get the custom error message for the exception.
319
319
  #
@@ -328,6 +328,21 @@ module BSON
328
328
  end
329
329
  end
330
330
 
331
+ # Raised when the significand provided is outside the valid range.
332
+ #
333
+ # @note This class derives from InvalidRange for backwards compatibility,
334
+ # however when RUBY-1806 is implemented it should be changed to derive
335
+ # from the base BSON exception class.
336
+ class UnrepresentablePrecision < InvalidRange
337
+
338
+ # Get the custom error message for the exception.
339
+ #
340
+ # @return [ String ] The error message.
341
+ def message
342
+ 'The value contains too much precision for Decimal128 representation'
343
+ end
344
+ end
345
+
331
346
  Registry.register(BSON_TYPE, self)
332
347
  end
333
348
  end
data/lib/bson/document.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");
@@ -315,6 +316,23 @@ module BSON
315
316
  copy
316
317
  end
317
318
 
319
+ def symbolize_keys!
320
+ raise ArgumentError, 'symbolize_keys! is not supported on BSON::Document instances. Please convert the document to hash first (using #to_h), then call #symbolize_keys! on the Hash instance'
321
+ end
322
+
323
+ # Override the Hash implementation of to_bson_normalized_value.
324
+ #
325
+ # BSON::Document is already of the correct type and already provides
326
+ # indifferent access to keys, hence no further conversions are necessary.
327
+ #
328
+ # Attempting to perform Hash's conversion on Document instances converts
329
+ # DBRefs to Documents which is wrong.
330
+ #
331
+ # @return [ BSON::Document ] The normalized hash.
332
+ def to_bson_normalized_value
333
+ self
334
+ end
335
+
318
336
  private
319
337
 
320
338
  def convert_key(key)
@@ -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/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
  #
@@ -23,5 +24,11 @@ module BSON
23
24
  # itself to BSON.
24
25
  class UnserializableClass < Error
25
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
26
33
  end
27
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
@@ -362,6 +355,9 @@ module BSON
362
355
 
363
356
  module_function def map_hash(hash, **options)
364
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
365
361
  [key, parse_obj(value, **options)]
366
362
  end]
367
363
  end
@@ -379,5 +375,14 @@ module BSON
379
375
  module_function def create_regexp(pattern, options)
380
376
  Regexp::Raw.new(pattern, options)
381
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
382
387
  end
383
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
  #
@@ -70,7 +71,7 @@ module BSON
70
71
  # @example Convert the hash to a normalized value.
71
72
  # hash.to_bson_normalized_value
72
73
  #
73
- # @return [ BSON::Document ] The normazlied hash.
74
+ # @return [ BSON::Document ] The normalized hash.
74
75
  #
75
76
  # @since 3.0.0
76
77
  def to_bson_normalized_value
@@ -88,9 +89,7 @@ module BSON
88
89
  #
89
90
  # @return [ Hash ] This hash converted to extended json representation.
90
91
  def as_extended_json(**options)
91
- ::Hash[map do |key, value|
92
- [key, value.as_extended_json(**options)]
93
- end]
92
+ transform_values { |value| value.as_extended_json(**options) }
94
93
  end
95
94
 
96
95
  module ClassMethods
@@ -101,7 +100,7 @@ module BSON
101
100
  #
102
101
  # @option options [ nil | :bson ] :mode Decoding mode to use.
103
102
  #
104
- # @return [ Array ] The decoded hash.
103
+ # @return [ Hash ] The decoded hash.
105
104
  #
106
105
  # @see http://bsonspec.org/#/specification
107
106
  #
@@ -129,6 +128,16 @@ module BSON
129
128
  if actual_byte_size != expected_byte_size
130
129
  raise Error::BSONDecodeError, "Expected hash to take #{expected_byte_size} bytes but it took #{actual_byte_size} bytes"
131
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
+
132
141
  hash
133
142
  end
134
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
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)