bson 4.11.1-java → 4.14.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -7
  4. data/lib/bson/active_support.rb +1 -0
  5. data/lib/bson/array.rb +2 -1
  6. data/lib/bson/big_decimal.rb +67 -0
  7. data/lib/bson/binary.rb +8 -5
  8. data/lib/bson/boolean.rb +2 -1
  9. data/lib/bson/code.rb +2 -1
  10. data/lib/bson/code_with_scope.rb +2 -1
  11. data/lib/bson/config.rb +1 -0
  12. data/lib/bson/date.rb +1 -0
  13. data/lib/bson/date_time.rb +1 -0
  14. data/lib/bson/db_pointer.rb +2 -1
  15. data/lib/bson/dbref.rb +125 -0
  16. data/lib/bson/decimal128/builder.rb +27 -20
  17. data/lib/bson/decimal128.rb +27 -12
  18. data/lib/bson/document.rb +61 -18
  19. data/lib/bson/environment.rb +1 -0
  20. data/lib/bson/error.rb +7 -0
  21. data/lib/bson/ext_json.rb +24 -11
  22. data/lib/bson/false_class.rb +2 -1
  23. data/lib/bson/float.rb +21 -32
  24. data/lib/bson/hash.rb +15 -6
  25. data/lib/bson/int32.rb +3 -2
  26. data/lib/bson/int64.rb +3 -2
  27. data/lib/bson/integer.rb +3 -2
  28. data/lib/bson/json.rb +1 -0
  29. data/lib/bson/max_key.rb +3 -2
  30. data/lib/bson/min_key.rb +3 -2
  31. data/lib/bson/nil_class.rb +2 -1
  32. data/lib/bson/object.rb +1 -0
  33. data/lib/bson/object_id.rb +4 -3
  34. data/lib/bson/open_struct.rb +1 -0
  35. data/lib/bson/regexp.rb +17 -6
  36. data/lib/bson/registry.rb +1 -0
  37. data/lib/bson/specialized.rb +1 -0
  38. data/lib/bson/string.rb +3 -2
  39. data/lib/bson/symbol.rb +2 -1
  40. data/lib/bson/time.rb +4 -3
  41. data/lib/bson/time_with_zone.rb +1 -0
  42. data/lib/bson/timestamp.rb +3 -2
  43. data/lib/bson/true_class.rb +2 -1
  44. data/lib/bson/undefined.rb +2 -1
  45. data/lib/bson/version.rb +2 -1
  46. data/lib/bson-ruby.jar +0 -0
  47. data/lib/bson.rb +8 -5
  48. data/lib/bson_native.bundle +0 -0
  49. data/spec/README.md +14 -0
  50. data/spec/bson/big_decimal_spec.rb +316 -0
  51. data/spec/bson/binary_spec.rb +1 -1
  52. data/spec/bson/binary_uuid_spec.rb +12 -0
  53. data/spec/bson/dbref_spec.rb +461 -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 +43 -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 +33 -0
  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/spec/support/spec_config.rb +2 -1
  91. data.tar.gz.sig +0 -0
  92. metadata +156 -105
  93. metadata.gz.sig +0 -0
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");
@@ -269,27 +270,69 @@ module BSON
269
270
  end
270
271
  end
271
272
 
272
- if instance_methods.include?(:slice)
273
- # Slices a document to include only the given keys.
274
- # Will normalize symbol keys into strings.
275
- # (this method is backported from ActiveSupport::Hash)
276
- #
277
- # @example Get a document/hash with only the `name` and `age` fields present
278
- # document # => { _id: <ObjectId>, :name => 'John', :age => 30, :location => 'Earth' }
279
- # document.slice(:name, 'age') # => { name: 'John', age: 30 }
280
- # document.slice('name') # => { name: 'John' }
281
- # document.slice(:foo) # => nil
282
- #
283
- # @param [ Array<String, Symbol> ] *keys Keys, that will be kept in the resulting document
284
- #
285
- # @return [ BSON::Document ] The document with only the selected keys
286
- #
287
- # @since 4.3.1
288
- def slice(*keys)
289
- super(*keys.map{|key| convert_key(key)})
273
+ # Slices a document to include only the given keys.
274
+ # Will normalize symbol keys into strings.
275
+ # (this method is backported from ActiveSupport::Hash)
276
+ #
277
+ # @example Get a document/hash with only the `name` and `age` fields present
278
+ # document # => { _id: <ObjectId>, :name => "John", :age => 30, :location => "Earth" }
279
+ # document.slice(:name, 'age') # => { "name": "John", "age" => 30 }
280
+ # document.slice('name') # => { "name" => "John" }
281
+ # document.slice(:foo) # => {}
282
+ #
283
+ # @param [ Array<String, Symbol> ] *keys Keys, that will be kept in the resulting document
284
+ #
285
+ # @return [ BSON::Document ] The document with only the selected keys
286
+ #
287
+ # @since 4.3.1
288
+ def slice(*keys)
289
+ keys.each_with_object(self.class.new) do |key, hash|
290
+ if key?(key)
291
+ hash[key] = self[key]
292
+ end
290
293
  end
291
294
  end
292
295
 
296
+ # Returns a new document consisting of the current document minus the
297
+ # specified keys.
298
+ #
299
+ # The keys to be removed can be specified as either strings or symbols.
300
+ #
301
+ # @example Get a document/hash with only the `name` and `age` fields removed
302
+ # document # => { _id: <ObjectId>, :name => 'John', :age => 30, :location => 'Earth' }
303
+ # document.except(:name, 'age') # => { _id: <ObjectId>, location: 'Earth' }
304
+ #
305
+ # @param [ Array<String, Symbol> ] *keys Keys, that will be removed in the resulting document
306
+ #
307
+ # @return [ BSON::Document ] The document with the specified keys removed.
308
+ #
309
+ # @note This method is always defined, even if Hash already contains a
310
+ # definition of #except, because ActiveSupport unconditionally defines
311
+ # its version of #except which doesn't work for BSON::Document which
312
+ # causes problems if ActiveSupport is loaded after bson-ruby is.
313
+ def except(*keys)
314
+ copy = dup
315
+ keys.each {|key| copy.delete(key)}
316
+ copy
317
+ end
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
+
293
336
  private
294
337
 
295
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
@@ -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
  #
@@ -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)
@@ -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");