bson 4.8.0-java → 4.9.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +18 -6
  5. data/lib/bson-ruby.jar +0 -0
  6. data/lib/bson.rb +1 -1
  7. data/lib/bson/active_support.rb +1 -1
  8. data/lib/bson/array.rb +14 -3
  9. data/lib/bson/binary.rb +1 -1
  10. data/lib/bson/boolean.rb +9 -2
  11. data/lib/bson/code.rb +1 -1
  12. data/lib/bson/code_with_scope.rb +16 -3
  13. data/lib/bson/config.rb +1 -1
  14. data/lib/bson/date.rb +1 -1
  15. data/lib/bson/date_time.rb +1 -1
  16. data/lib/bson/db_pointer.rb +7 -1
  17. data/lib/bson/decimal128.rb +1 -1
  18. data/lib/bson/decimal128/builder.rb +1 -1
  19. data/lib/bson/document.rb +1 -1
  20. data/lib/bson/environment.rb +2 -1
  21. data/lib/bson/error.rb +4 -0
  22. data/lib/bson/ext_json.rb +4 -3
  23. data/lib/bson/false_class.rb +1 -1
  24. data/lib/bson/float.rb +1 -1
  25. data/lib/bson/hash.rb +14 -3
  26. data/lib/bson/int32.rb +1 -1
  27. data/lib/bson/int64.rb +1 -1
  28. data/lib/bson/integer.rb +1 -1
  29. data/lib/bson/json.rb +1 -1
  30. data/lib/bson/max_key.rb +1 -1
  31. data/lib/bson/min_key.rb +1 -1
  32. data/lib/bson/nil_class.rb +1 -1
  33. data/lib/bson/object.rb +1 -1
  34. data/lib/bson/object_id.rb +1 -1
  35. data/lib/bson/open_struct.rb +1 -1
  36. data/lib/bson/regexp.rb +8 -2
  37. data/lib/bson/registry.rb +1 -1
  38. data/lib/bson/specialized.rb +1 -1
  39. data/lib/bson/string.rb +1 -1
  40. data/lib/bson/symbol.rb +1 -1
  41. data/lib/bson/time.rb +40 -6
  42. data/lib/bson/time_with_zone.rb +1 -1
  43. data/lib/bson/timestamp.rb +1 -1
  44. data/lib/bson/true_class.rb +1 -1
  45. data/lib/bson/undefined.rb +1 -1
  46. data/lib/bson/version.rb +2 -2
  47. data/spec/bson/array_spec.rb +1 -1
  48. data/spec/bson/binary_spec.rb +1 -1
  49. data/spec/bson/binary_uuid_spec.rb +1 -1
  50. data/spec/bson/boolean_spec.rb +1 -1
  51. data/spec/bson/code_spec.rb +1 -1
  52. data/spec/bson/code_with_scope_spec.rb +1 -1
  53. data/spec/bson/date_spec.rb +1 -1
  54. data/spec/bson/date_time_spec.rb +1 -1
  55. data/spec/bson/decimal128_spec.rb +1 -1
  56. data/spec/bson/document_spec.rb +1 -1
  57. data/spec/bson/ext_json_parse_spec.rb +34 -2
  58. data/spec/bson/false_class_spec.rb +1 -1
  59. data/spec/bson/float_spec.rb +1 -1
  60. data/spec/bson/hash_spec.rb +1 -1
  61. data/spec/bson/int32_spec.rb +1 -1
  62. data/spec/bson/int64_spec.rb +1 -1
  63. data/spec/bson/integer_spec.rb +1 -1
  64. data/spec/bson/json_spec.rb +1 -1
  65. data/spec/bson/max_key_spec.rb +1 -1
  66. data/spec/bson/min_key_spec.rb +1 -1
  67. data/spec/bson/nil_class_spec.rb +1 -1
  68. data/spec/bson/object_id_spec.rb +1 -1
  69. data/spec/bson/object_spec.rb +1 -1
  70. data/spec/bson/open_struct_spec.rb +1 -1
  71. data/spec/bson/raw_spec.rb +12 -1
  72. data/spec/bson/regexp_spec.rb +1 -1
  73. data/spec/bson/registry_spec.rb +1 -1
  74. data/spec/bson/string_spec.rb +1 -1
  75. data/spec/bson/symbol_spec.rb +1 -1
  76. data/spec/bson/time_spec.rb +205 -2
  77. data/spec/bson/time_with_zone_spec.rb +1 -1
  78. data/spec/bson/timestamp_spec.rb +1 -1
  79. data/spec/bson/true_class_spec.rb +1 -1
  80. data/spec/bson/undefined_spec.rb +1 -1
  81. data/spec/bson_spec.rb +1 -1
  82. data/spec/runners/common_driver.rb +1 -1
  83. data/spec/runners/corpus.rb +13 -10
  84. data/spec/runners/corpus_legacy.rb +1 -1
  85. data/spec/spec_helper.rb +1 -1
  86. data/spec/spec_tests/data/corpus/top.json +0 -4
  87. data/spec/support/shared_examples.rb +1 -1
  88. metadata +79 -82
  89. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d691529718f7129a9ee438d11e85f2abc13fe81c03a43d48f528a21e05bd9e1b
4
- data.tar.gz: 5ab219503040fe8826b1d58bcc51bdad454fa84420609474b6315c18f54a5db0
3
+ metadata.gz: 3ae7d935612a364378aee53925f0808382ff92b3d23416ede0344ca5262d6e7e
4
+ data.tar.gz: f2abf5668f22d7bfee56bcdf132076acbfc7e416e0daad20b06ccec9f393d465
5
5
  SHA512:
6
- metadata.gz: b00a7c8078bf9d05a94ecb6d4052eb195df77115a6d11568d84db513da65ace9ec15ce91ca403680d1a029f615ac80e41b4e98aee44133c3a4b488d56f6075fc
7
- data.tar.gz: 83a6195af39949c91379888f7c97d244b42248824de696248fb958825725a711b6ea414da93b3bac7f581c55999b33c633114e2d057366ea2e1d9c838a1002f4
6
+ metadata.gz: b685a003e81eb3a63b521ad4836c6ecb055ca5b768237230636767447805be0ce9a2d2867a42fbea435b0367123230090139a7a8186a41e13b54ff87b021c9e0
7
+ data.tar.gz: 564392a677bb9f8db3f44fcf734aac5c5100756efb5a43d1a6e71535eb35c27989031deb0a1f212a2b5bbe1f63443f7eae86c020499bf66841f26930b723b89b
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
- BSON [![Build Status](https://secure.travis-ci.org/mongodb/bson-ruby.svg?branch=master)](http://travis-ci.org/mongodb/bson-ruby)
2
- [![Build status Windows](https://ci.appveyor.com/api/projects/status/p5aqko7umsx351nm?svg=true)](https://ci.appveyor.com/project/p-mongo/bson-ruby/branch/master)
3
- [![Code Climate](https://codeclimate.com/github/mongodb/bson-ruby.svg)](https://codeclimate.com/github/mongodb/bson-ruby)
4
- [![Coverage Status](https://coveralls.io/repos/mongodb/bson-ruby/badge.svg?branch=master)](https://coveralls.io/r/mongodb/bson-ruby?branch=master)
5
- [![Inline docs](http://inch-ci.org/github/mongodb/bson-ruby.svg?branch=master)](http://inch-ci.org/github/mongodb/bson-ruby)
1
+ BSON
2
+ [![Gem Version][rubygems-img]][rubygems-url]
3
+ [![Build Status][travis-img]][travis-url]
4
+ [![Build status Windows][appveyor-img]][appveyor-url]
5
+ [![Coverage Status][coveralls-img]][coveralls-url]
6
+ [![Inline docs][inch-img]][inch-url]
6
7
  ====
7
8
 
8
9
  An implementation of the BSON specification in Ruby.
@@ -38,7 +39,7 @@ As of 2.0.0, this project adheres to the
38
39
  License
39
40
  -------
40
41
 
41
- Copyright (C) 2009-2019 MongoDB Inc.
42
+ Copyright (C) 2009-2020 MongoDB Inc.
42
43
 
43
44
  Licensed under the Apache License, Version 2.0 (the "License");
44
45
  you may not use this file except in compliance with the License.
@@ -51,3 +52,14 @@ distributed under the License is distributed on an "AS IS" BASIS,
51
52
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
52
53
  See the License for the specific language governing permissions and
53
54
  limitations under the License.
55
+
56
+ [rubygems-img]: https://badge.fury.io/rb/bson.svg
57
+ [rubygems-url]: http://badge.fury.io/rb/bson
58
+ [travis-img]: https://secure.travis-ci.org/mongodb/bson-ruby.svg?branch=master
59
+ [travis-url]: http://travis-ci.org/mongodb/bson-ruby
60
+ [appveyor-img]: https://ci.appveyor.com/api/projects/status/p5aqko7umsx351nm?svg=true
61
+ [appveyor-url]: https://ci.appveyor.com/project/p-mongo/bson-ruby/branch/master
62
+ [coveralls-img]: https://coveralls.io/repos/mongodb/bson-ruby/badge.svg?branch=master
63
+ [coveralls-url]: https://coveralls.io/r/mongodb/bson-ruby?branch=master
64
+ [inch-img]: http://inch-ci.org/github/mongodb/bson-ruby.svg?branch=master
65
+ [inch-url]: http://inch-ci.org/github/mongodb/bson-ruby
Binary file
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2018-2019 MongoDB Inc.
1
+ # Copyright (C) 2018-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -119,10 +119,21 @@ module BSON
119
119
  buffer.get_array(**options)
120
120
  else
121
121
  array = new
122
- buffer.get_int32 # throw away the length
122
+ start_position = buffer.read_position
123
+ expected_byte_size = buffer.get_int32
123
124
  while (type = buffer.get_byte) != NULL_BYTE
124
125
  buffer.get_cstring
125
- array << BSON::Registry.get(type).from_bson(buffer, **options)
126
+ cls = BSON::Registry.get(type)
127
+ value = if options.empty?
128
+ cls.from_bson(buffer)
129
+ else
130
+ cls.from_bson(buffer, **options)
131
+ end
132
+ array << value
133
+ end
134
+ actual_byte_size = buffer.read_position - start_position
135
+ if actual_byte_size != expected_byte_size
136
+ raise Error::BSONDecodeError, "Expected array to take #{expected_byte_size} bytes but it took #{actual_byte_size} bytes"
126
137
  end
127
138
  array
128
139
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -39,7 +39,14 @@ module BSON
39
39
  #
40
40
  # @since 2.0.0
41
41
  def self.from_bson(buffer, **options)
42
- buffer.get_byte == TrueClass::TRUE_BYTE
42
+ case v = buffer.get_byte
43
+ when TrueClass::TRUE_BYTE
44
+ true
45
+ when FalseClass::FALSE_BYTE
46
+ false
47
+ else
48
+ raise Error::BSONDecodeError, "Invalid boolean byte value: #{v}"
49
+ end
43
50
  end
44
51
 
45
52
  # Register this type when the module is loaded.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -119,8 +119,21 @@ module BSON
119
119
  #
120
120
  # @since 2.0.0
121
121
  def self.from_bson(buffer, **options)
122
- buffer.get_int32 # Throw away the total length.
123
- new(buffer.get_string, ::Hash.from_bson(buffer, **options))
122
+ # Code with scope has a length (?) field which is not needed for
123
+ # decoding, but spec tests want this field validated.
124
+ start_position = buffer.read_position
125
+ length = buffer.get_int32
126
+ javascript = buffer.get_string
127
+ scope = if options.empty?
128
+ ::Hash.from_bson(buffer)
129
+ else
130
+ ::Hash.from_bson(buffer, **options)
131
+ end
132
+ read_bytes = buffer.read_position - start_position
133
+ if read_bytes != length
134
+ raise Error::BSONDecodeError, "CodeWithScope invalid: claimed length #{length}, actual length #{read_bytes}"
135
+ end
136
+ new(javascript, scope)
124
137
  end
125
138
 
126
139
  # Register this type when the module is loaded.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016-2019 MongoDB Inc.
1
+ # Copyright (C) 2016-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -95,7 +95,13 @@ module BSON
95
95
  #
96
96
  # @see http://bsonspec.org/#/specification
97
97
  def self.from_bson(buffer, **options)
98
- new(buffer.get_string, ObjectId.from_bson(buffer, **options))
98
+ ref = buffer.get_string
99
+ id = if options.empty?
100
+ ObjectId.from_bson(buffer)
101
+ else
102
+ ObjectId.from_bson(buffer, **options)
103
+ end
104
+ new(ref, id)
99
105
  end
100
106
 
101
107
  # Register this type when the module is loaded.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016-2019 MongoDB Inc.
1
+ # Copyright (C) 2016-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016-2019 MongoDB Inc.
1
+ # Copyright (C) 2016-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -41,6 +41,7 @@ module BSON
41
41
  # @return [ true, false ] If the Ruby version is 1.9.
42
42
  #
43
43
  # @since 4.2.0
44
+ # @deprecated
44
45
  def ruby_1_9?
45
46
  @ruby_1_9 ||= RUBY_VERSION < '2.0.0'
46
47
  end
@@ -13,5 +13,9 @@ module BSON
13
13
  # unsupported binary subtype.
14
14
  class UnsupportedBinarySubtype < Error
15
15
  end
16
+
17
+ # Exception raised when BSON decoding fails.
18
+ class BSONDecodeError < Error
19
+ end
16
20
  end
17
21
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2019 MongoDB Inc.
1
+ # Copyright (C) 2019-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -251,12 +251,13 @@ module BSON
251
251
  when '$date'
252
252
  case value
253
253
  when String
254
- ::Time.parse(value)
254
+ ::Time.parse(value).utc
255
255
  when Hash
256
256
  unless value.keys.sort == %w($numberLong)
257
257
  raise Error::ExtJSONParseError, "Invalid value for $date: #{value}"
258
258
  end
259
- ::Time.at(value.values.first.to_i.to_f / 1000)
259
+ sec, msec = value.values.first.to_i.divmod(1000)
260
+ ::Time.at(sec, msec*1000).utc
260
261
  else
261
262
  raise Error::ExtJSONParseError, "Invalid value for $date: #{value}"
262
263
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -108,13 +108,24 @@ module BSON
108
108
  buffer.get_hash(**options)
109
109
  else
110
110
  hash = Document.allocate
111
- buffer.get_int32 # Throw away the size.
111
+ start_position = buffer.read_position
112
+ expected_byte_size = buffer.get_int32
112
113
  while (type = buffer.get_byte) != NULL_BYTE
113
114
  field = buffer.get_cstring
114
115
  cls = BSON::Registry.get(type, field)
115
- value = cls.from_bson(buffer, **options)
116
+ value = if options.empty?
117
+ # Compatibility with the older Ruby driver versions which define
118
+ # a DBRef class with from_bson accepting a single argument.
119
+ cls.from_bson(buffer)
120
+ else
121
+ cls.from_bson(buffer, **options)
122
+ end
116
123
  hash.store(field, value)
117
124
  end
125
+ actual_byte_size = buffer.read_position - start_position
126
+ if actual_byte_size != expected_byte_size
127
+ raise Error::BSONDecodeError, "Expected hash to take #{expected_byte_size} bytes but it took #{actual_byte_size} bytes"
128
+ end
118
129
  hash
119
130
  end
120
131
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016-2019 MongoDB Inc.
1
+ # Copyright (C) 2016-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -165,7 +165,13 @@ module BSON
165
165
  #
166
166
  # @since 3.1.0
167
167
  def respond_to?(method, include_private = false)
168
- compile.respond_to?(method, include_private) || super
168
+ if defined?(@pattern)
169
+ compile.respond_to?(method, include_private) || super
170
+ else
171
+ # YAML calls #respond_to? during deserialization, before the object
172
+ # is initialized.
173
+ super
174
+ end
169
175
  end
170
176
 
171
177
  # Encode the Raw Regexp object to BSON.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2009-2019 MongoDB Inc.
2
+ # Copyright (C) 2009-2020 MongoDB Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2019 MongoDB Inc.
1
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -17,6 +17,20 @@ module BSON
17
17
  # Injects behaviour for encoding and decoding time values to
18
18
  # and from raw bytes as specified by the BSON spec.
19
19
  #
20
+ # @note
21
+ # Ruby time can have nanosecond precision:
22
+ # +Time.utc(2020, 1, 1, 0, 0, 0, 999_999_999/1000r)+
23
+ # +Time#usec+ returns the number of microseconds in the time, and
24
+ # if the time has nanosecond precision the sub-microsecond part is
25
+ # truncated (the value is floored to the nearest millisecond).
26
+ # MongoDB only supports millisecond precision; we truncate the
27
+ # sub-millisecond part of microseconds (floor to the nearest millisecond).
28
+ # Note that if a time is constructed from a floating point value,
29
+ # the microsecond value may round to the starting floating point value
30
+ # but due to flooring, the time after serialization may end up to
31
+ # be different than the starting floating point value.
32
+ # It is recommended that time calculations use integer math only.
33
+ #
20
34
  # @see http://bsonspec.org/#/specification
21
35
  #
22
36
  # @since 2.0.0
@@ -29,6 +43,8 @@ module BSON
29
43
 
30
44
  # Get the time as encoded BSON.
31
45
  #
46
+ # @note The time is floored to the nearest millisecond.
47
+ #
32
48
  # @example Get the time as encoded BSON.
33
49
  # Time.new(2012, 1, 1, 0, 0, 0).to_bson
34
50
  #
@@ -38,15 +54,15 @@ module BSON
38
54
  #
39
55
  # @since 2.0.0
40
56
  def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
41
- # A previous version of this method used the following implementation:
42
- # buffer.put_int64((to_i * 1000) + (usec / 1000))
43
- # Turns out, usec returned incorrect value - 999 for 1 millisecond.
44
- buffer.put_int64((to_f * 1000).round)
57
+ value = _bson_to_i * 1000 + usec.divmod(1000).first
58
+ buffer.put_int64(value)
45
59
  end
46
60
 
47
61
  # Converts this object to a representation directly serializable to
48
62
  # Extended JSON (https://github.com/mongodb/specifications/blob/master/source/extended-json.rst).
49
63
  #
64
+ # @note The time is floored to the nearest millisecond.
65
+ #
50
66
  # @option options [ true | false ] :relaxed Whether to produce relaxed
51
67
  # extended JSON representation.
52
68
  #
@@ -55,12 +71,30 @@ module BSON
55
71
  utc_time = utc
56
72
  if options[:mode] == :relaxed && (1970..9999).include?(utc_time.year)
57
73
  if utc_time.usec != 0
74
+ if utc_time.respond_to?(:floor)
75
+ # Ruby 2.7+
76
+ utc_time = utc_time.floor(3)
77
+ else
78
+ utc_time -= utc_time.usec.divmod(1000).last.to_r / 1000000
79
+ end
58
80
  {'$date' => utc_time.strftime('%Y-%m-%dT%H:%M:%S.%LZ')}
59
81
  else
60
82
  {'$date' => utc_time.strftime('%Y-%m-%dT%H:%M:%SZ')}
61
83
  end
62
84
  else
63
- {'$date' => {'$numberLong' => (utc_time.to_f * 1000).round.to_s}}
85
+ sec = utc_time._bson_to_i
86
+ msec = utc_time.usec.divmod(1000).first
87
+ {'$date' => {'$numberLong' => (sec * 1000 + msec).to_s}}
88
+ end
89
+ end
90
+
91
+ def _bson_to_i
92
+ # Workaround for JRuby's #to_i rounding negative timestamps up
93
+ # rather than down (https://github.com/jruby/jruby/issues/6104)
94
+ if BSON::Environment.jruby?
95
+ (self - usec.to_r/1000000).to_i
96
+ else
97
+ to_i
64
98
  end
65
99
  end
66
100