bson 4.12.0-java → 4.14.1-java
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +4 -7
- data/lib/bson/active_support.rb +1 -0
- data/lib/bson/array.rb +2 -1
- data/lib/bson/big_decimal.rb +67 -0
- data/lib/bson/binary.rb +5 -3
- data/lib/bson/boolean.rb +2 -1
- data/lib/bson/code.rb +2 -1
- data/lib/bson/code_with_scope.rb +2 -1
- data/lib/bson/config.rb +1 -0
- data/lib/bson/date.rb +1 -0
- data/lib/bson/date_time.rb +1 -0
- data/lib/bson/db_pointer.rb +2 -1
- data/lib/bson/dbref.rb +152 -0
- data/lib/bson/decimal128/builder.rb +27 -20
- data/lib/bson/decimal128.rb +27 -12
- data/lib/bson/document.rb +18 -0
- data/lib/bson/environment.rb +1 -0
- data/lib/bson/error.rb +7 -0
- data/lib/bson/ext_json.rb +16 -11
- data/lib/bson/false_class.rb +2 -1
- data/lib/bson/float.rb +21 -32
- data/lib/bson/hash.rb +15 -6
- data/lib/bson/int32.rb +3 -2
- data/lib/bson/int64.rb +3 -2
- data/lib/bson/integer.rb +3 -2
- data/lib/bson/json.rb +1 -0
- data/lib/bson/max_key.rb +3 -2
- data/lib/bson/min_key.rb +3 -2
- data/lib/bson/nil_class.rb +2 -1
- data/lib/bson/object.rb +1 -0
- data/lib/bson/object_id.rb +4 -3
- data/lib/bson/open_struct.rb +1 -0
- data/lib/bson/regexp.rb +17 -6
- data/lib/bson/registry.rb +1 -0
- data/lib/bson/specialized.rb +1 -0
- data/lib/bson/string.rb +3 -2
- data/lib/bson/symbol.rb +2 -1
- data/lib/bson/time.rb +4 -3
- data/lib/bson/time_with_zone.rb +1 -0
- data/lib/bson/timestamp.rb +3 -2
- data/lib/bson/true_class.rb +2 -1
- data/lib/bson/undefined.rb +2 -1
- data/lib/bson/version.rb +2 -1
- data/lib/bson-ruby.jar +0 -0
- data/lib/bson.rb +8 -5
- data/spec/README.md +14 -0
- data/spec/bson/big_decimal_spec.rb +316 -0
- data/spec/bson/dbref_legacy_spec.rb +169 -0
- data/spec/bson/dbref_spec.rb +487 -0
- data/spec/bson/decimal128_spec.rb +16 -0
- data/spec/bson/document_as_spec.rb +46 -0
- data/spec/bson/document_spec.rb +7 -1
- data/spec/bson/ext_json_parse_spec.rb +37 -0
- data/spec/bson/hash_as_spec.rb +57 -0
- data/spec/bson/hash_spec.rb +32 -0
- data/spec/bson/int64_spec.rb +4 -24
- data/spec/bson/raw_spec.rb +7 -1
- data/spec/bson/regexp_spec.rb +52 -0
- data/spec/runners/common_driver.rb +1 -1
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +386 -0
- data/spec/shared/lib/mrss/docker_runner.rb +271 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +338 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +367 -0
- data/spec/shared/shlib/set_env.sh +131 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/spec_tests/common_driver_spec.rb +2 -1
- data/spec/spec_tests/data/corpus/binary.json +18 -1
- data/spec/spec_tests/data/corpus/dbref.json +21 -1
- data/spec/spec_tests/data/corpus/document.json +4 -0
- data/spec/spec_tests/data/corpus/regex.json +2 -2
- data/spec/spec_tests/data/corpus/top.json +20 -9
- data.tar.gz.sig +0 -0
- metadata +141 -89
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f4951837e5f28b97a1f50f8ec70be9b0459c5edbd2d10afb459ee474997e9e0
|
4
|
+
data.tar.gz: d5748994a56696ee51d2a5194808fb1da8281fa423afe1fbfbb2369bf2e72448
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8bfcd9352906e92e0930178a86e3dda9360f85f33220dfeb3fee430db2d14bb8df4b13480d3210877725ed70a0328e84a9948dc8dc0bfbd34a6a678711becd2
|
7
|
+
data.tar.gz: 003bc34bdab69009c5d16cbaf73db1e764ac1d70b7313f9a650a8c88be63a0151f32debc5d145ade96e4db40807a49b26b1e7a7a92dcaeb786898ce831da4538
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
BSON
|
2
2
|
[![Gem Version][rubygems-img]][rubygems-url]
|
3
|
-
[![Build Status][
|
4
|
-
[![Build status Windows][appveyor-img]][appveyor-url]
|
3
|
+
[![Build Status][ghactions-img]][ghactions-url]
|
5
4
|
[![Coverage Status][coveralls-img]][coveralls-url]
|
6
5
|
[![Inline docs][inch-img]][inch-url]
|
7
6
|
====
|
@@ -11,7 +10,7 @@ An implementation of the BSON specification in Ruby.
|
|
11
10
|
Compatibility
|
12
11
|
-------------
|
13
12
|
|
14
|
-
BSON is tested against MRI (2.
|
13
|
+
BSON is tested against MRI (2.5) and JRuby (9.2+).
|
15
14
|
|
16
15
|
Documentation
|
17
16
|
-------------
|
@@ -55,10 +54,8 @@ limitations under the License.
|
|
55
54
|
|
56
55
|
[rubygems-img]: https://badge.fury.io/rb/bson.svg
|
57
56
|
[rubygems-url]: http://badge.fury.io/rb/bson
|
58
|
-
[
|
59
|
-
[
|
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
|
57
|
+
[ghactions-img]: https://github.com/mongodb/bson-ruby/actions/workflows/bson-ruby.yml/badge.svg?query=branch%3Amaster
|
58
|
+
[ghactions-url]: https://github.com/mongodb/bson-ruby/actions/workflows/bson-ruby.yml?query=branch%3Amaster
|
62
59
|
[coveralls-img]: https://coveralls.io/repos/mongodb/bson-ruby/badge.svg?branch=master
|
63
60
|
[coveralls-url]: https://coveralls.io/r/mongodb/bson-ruby?branch=master
|
64
61
|
[inch-img]: http://inch-ci.org/github/mongodb/bson-ruby.svg?branch=master
|
data/lib/bson/active_support.rb
CHANGED
data/lib/bson/array.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
|
# An array is type 0x04 in the BSON spec.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
BSON_TYPE = 4.chr
|
29
|
+
BSON_TYPE = ::String.new(4.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# Get the array as encoded BSON.
|
31
32
|
#
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2009-2021 MongoDB Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
module BSON
|
17
|
+
|
18
|
+
# Injects behaviour for encoding and decoding BigDecimals
|
19
|
+
# to and from raw bytes as specified by the BSON spec.
|
20
|
+
#
|
21
|
+
# @see http://bsonspec.org/#/specification
|
22
|
+
module BigDecimal
|
23
|
+
|
24
|
+
# BigDecimals are serialized as Decimal128s under the hood. A Decimal128
|
25
|
+
# is type 0x13 in the BSON spec.
|
26
|
+
BSON_TYPE = ::String.new(19.chr, encoding: BINARY).freeze
|
27
|
+
|
28
|
+
# Get the BigDecimal as encoded BSON.
|
29
|
+
#
|
30
|
+
# @example Get the BigDecimal as encoded BSON.
|
31
|
+
# BigDecimal("1").to_bson
|
32
|
+
#
|
33
|
+
# @return [ BSON::ByteBuffer ] The buffer with the encoded object.
|
34
|
+
#
|
35
|
+
# @see http://bsonspec.org/#/specification
|
36
|
+
def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
|
37
|
+
BSON::Decimal128.new(to_s).to_bson(buffer, validating_keys)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get the BSON type for BigDecimal. This is the same BSON type as
|
41
|
+
# BSON::Decimal128.
|
42
|
+
def bson_type
|
43
|
+
BSON_TYPE
|
44
|
+
end
|
45
|
+
|
46
|
+
module ClassMethods
|
47
|
+
|
48
|
+
# Deserialize the BigDecimal from raw BSON bytes.
|
49
|
+
#
|
50
|
+
# @example Get the BigDecimal from BSON.
|
51
|
+
# BigDecimal.from_bson(bson)
|
52
|
+
#
|
53
|
+
# @param [ ByteBuffer ] buffer The byte buffer.
|
54
|
+
#
|
55
|
+
# @option options [ nil | :bson ] :mode Decoding mode to use.
|
56
|
+
#
|
57
|
+
# @return [ BigDecimal ] The decimal object.
|
58
|
+
def from_bson(buffer, **options)
|
59
|
+
Decimal128.from_bson(buffer, **options).to_big_decimal
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Enrich the core BigDecimal class with this module.
|
65
|
+
::BigDecimal.send(:include, BigDecimal)
|
66
|
+
::BigDecimal.send(:extend, BigDecimal::ClassMethods)
|
67
|
+
end
|
data/lib/bson/binary.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");
|
@@ -27,7 +28,7 @@ module BSON
|
|
27
28
|
# A binary is type 0x05 in the BSON spec.
|
28
29
|
#
|
29
30
|
# @since 2.0.0
|
30
|
-
BSON_TYPE = 5.chr
|
31
|
+
BSON_TYPE = ::String.new(5.chr, encoding: BINARY).freeze
|
31
32
|
|
32
33
|
# The mappings of subtypes to their single byte identifiers.
|
33
34
|
#
|
@@ -46,7 +47,8 @@ module BSON
|
|
46
47
|
:uuid => 4.chr,
|
47
48
|
:md5 => 5.chr,
|
48
49
|
:ciphertext => 6.chr,
|
49
|
-
:
|
50
|
+
:column => 7.chr,
|
51
|
+
:user => 128.chr,
|
50
52
|
}.freeze
|
51
53
|
|
52
54
|
# The mappings of single byte subtypes to their symbol counterparts.
|
@@ -169,7 +171,7 @@ module BSON
|
|
169
171
|
#
|
170
172
|
# @since 2.3.0
|
171
173
|
def inspect
|
172
|
-
"<BSON::Binary:0x#{object_id} type=#{type} data=0x#{data[0, 8].
|
174
|
+
"<BSON::Binary:0x#{object_id} type=#{type} data=0x#{data[0, 8].unpack1('H*')}...>"
|
173
175
|
end
|
174
176
|
|
175
177
|
# Returns a string representation of the UUID stored in this Binary.
|
data/lib/bson/boolean.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 boolean is type 0x08 in the BSON spec.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
BSON_TYPE = 8.chr
|
29
|
+
BSON_TYPE = ::String.new(8.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# Deserialize a boolean from BSON.
|
31
32
|
#
|
data/lib/bson/code.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 code is type 0x0D in the BSON spec.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
BSON_TYPE = 13.chr
|
29
|
+
BSON_TYPE = ::String.new(13.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# @!attribute javascript
|
31
32
|
# @return [ String ] The javascript code.
|
data/lib/bson/code_with_scope.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,7 +27,7 @@ module BSON
|
|
26
27
|
# A code with scope is type 0x0F in the BSON spec.
|
27
28
|
#
|
28
29
|
# @since 2.0.0
|
29
|
-
BSON_TYPE = 15.chr
|
30
|
+
BSON_TYPE = ::String.new(15.chr, encoding: BINARY).freeze
|
30
31
|
|
31
32
|
# @!attribute javascript
|
32
33
|
# @return [ String ] The javascript code.
|
data/lib/bson/config.rb
CHANGED
data/lib/bson/date.rb
CHANGED
data/lib/bson/date_time.rb
CHANGED
data/lib/bson/db_pointer.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -22,7 +23,7 @@ module BSON
|
|
22
23
|
include JSON
|
23
24
|
|
24
25
|
# A DBPointer is type 0x0C in the BSON spec.
|
25
|
-
BSON_TYPE = 0x0C.chr
|
26
|
+
BSON_TYPE = ::String.new(0x0C.chr, encoding: BINARY).freeze
|
26
27
|
|
27
28
|
# Create a new DBPointer object.
|
28
29
|
#
|
data/lib/bson/dbref.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2015-2021 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the 'License');
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an 'AS IS' BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module BSON
|
19
|
+
|
20
|
+
# Represents a DBRef document in the database.
|
21
|
+
class DBRef < Document
|
22
|
+
include JSON
|
23
|
+
|
24
|
+
# The constant for the collection reference field.
|
25
|
+
#
|
26
|
+
# @deprecated
|
27
|
+
COLLECTION = '$ref'.freeze
|
28
|
+
|
29
|
+
# The constant for the id field.
|
30
|
+
#
|
31
|
+
# @deprecated
|
32
|
+
ID = '$id'.freeze
|
33
|
+
|
34
|
+
# The constant for the database field.
|
35
|
+
#
|
36
|
+
# @deprecated
|
37
|
+
DATABASE = '$db'.freeze
|
38
|
+
|
39
|
+
# @return [ String ] collection The collection name.
|
40
|
+
def collection
|
41
|
+
self['$ref']
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [ BSON::ObjectId ] id The referenced document id.
|
45
|
+
def id
|
46
|
+
self['$id']
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [ String ] database The database name.
|
50
|
+
def database
|
51
|
+
self['$db']
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get the DBRef as a JSON document
|
55
|
+
#
|
56
|
+
# @example Get the DBRef as a JSON hash.
|
57
|
+
# dbref.as_json
|
58
|
+
#
|
59
|
+
# @return [ Hash ] The max key as a JSON hash.
|
60
|
+
def as_json(*args)
|
61
|
+
{}.update(self)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Instantiate a new DBRef.
|
65
|
+
#
|
66
|
+
# @example Create the DBRef - hash API.
|
67
|
+
# BSON::DBRef.new({'$ref' => 'users', '$id' => id, '$db' => 'database'})
|
68
|
+
#
|
69
|
+
# @example Create the DBRef - legacy API.
|
70
|
+
# BSON::DBRef.new('users', id, 'database')
|
71
|
+
#
|
72
|
+
# @param [ Hash | String ] hash_or_collection The DBRef hash, when using
|
73
|
+
# the hash API. It must contain $ref and $id. When using the legacy API,
|
74
|
+
# this parameter must be a String containing the collection name.
|
75
|
+
# @param [ Object ] id The object id, when using the legacy API.
|
76
|
+
# @param [ String ] database The database name, when using the legacy API.
|
77
|
+
def initialize(hash_or_collection, id = nil, database = nil)
|
78
|
+
if hash_or_collection.is_a?(Hash)
|
79
|
+
hash = hash_or_collection
|
80
|
+
|
81
|
+
unless id.nil? && database.nil?
|
82
|
+
raise ArgumentError, 'When using the hash API, DBRef constructor accepts only one argument'
|
83
|
+
end
|
84
|
+
else
|
85
|
+
warn("BSON::DBRef constructor called with the legacy API - please use the hash API instead")
|
86
|
+
|
87
|
+
if id.nil?
|
88
|
+
raise ArgumentError, 'When using the legacy constructor API, id must be provided'
|
89
|
+
end
|
90
|
+
|
91
|
+
hash = {
|
92
|
+
:$ref => hash_or_collection,
|
93
|
+
:$id => id,
|
94
|
+
:$db => database,
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
hash = reorder_fields(hash)
|
99
|
+
%w($ref $id).each do |key|
|
100
|
+
unless hash[key]
|
101
|
+
raise ArgumentError, "DBRef must have #{key}: #{hash}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
unless hash['$ref'].is_a?(String)
|
106
|
+
raise ArgumentError, "The value for key $ref must be a string, got: #{hash['$ref']}"
|
107
|
+
end
|
108
|
+
|
109
|
+
if db = hash['$db']
|
110
|
+
unless db.is_a?(String)
|
111
|
+
raise ArgumentError, "The value for key $db must be a string, got: #{hash['$db']}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
super(hash)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Converts the DBRef to raw BSON.
|
119
|
+
#
|
120
|
+
# @example Convert the DBRef to raw BSON.
|
121
|
+
# dbref.to_bson
|
122
|
+
#
|
123
|
+
# @param [ BSON::ByteBuffer ] buffer The encoded BSON buffer to append to.
|
124
|
+
# @param [ true, false ] validating_keys Whether keys should be validated when serializing.
|
125
|
+
#
|
126
|
+
# @return [ BSON::ByteBuffer ] The buffer with the encoded object.
|
127
|
+
def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
|
128
|
+
as_json.to_bson(buffer, validating_keys)
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
# Reorder the fields of the given Hash to have $ref first, $id second,
|
134
|
+
# and $db third. The rest of the fields in the hash can come in any
|
135
|
+
# order after that.
|
136
|
+
#
|
137
|
+
# @param [ Hash ] hash The input hash. Must be a valid dbref.
|
138
|
+
#
|
139
|
+
# @return [ Hash ] The hash with it's fields reordered.
|
140
|
+
def reorder_fields(hash)
|
141
|
+
hash = BSON::Document.new(hash)
|
142
|
+
reordered = {}
|
143
|
+
reordered['$ref'] = hash.delete('$ref')
|
144
|
+
reordered['$id'] = hash.delete('$id')
|
145
|
+
if db = hash.delete('$db')
|
146
|
+
reordered['$db'] = db
|
147
|
+
end
|
148
|
+
|
149
|
+
reordered.update(hash)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -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");
|
@@ -26,27 +27,27 @@ module BSON
|
|
26
27
|
# Infinity mask.
|
27
28
|
#
|
28
29
|
# @since 4.2.0
|
29
|
-
INFINITY_MASK = 0x7800000000000000
|
30
|
+
INFINITY_MASK = 0x7800000000000000
|
30
31
|
|
31
32
|
# NaN mask.
|
32
33
|
#
|
33
34
|
# @since 4.2.0
|
34
|
-
NAN_MASK = 0x7c00000000000000
|
35
|
+
NAN_MASK = 0x7c00000000000000
|
35
36
|
|
36
37
|
# SNaN mask.
|
37
38
|
#
|
38
39
|
# @since 4.2.0
|
39
|
-
SNAN_MASK = (1 << 57)
|
40
|
+
SNAN_MASK = (1 << 57)
|
40
41
|
|
41
42
|
# Signed bit mask.
|
42
43
|
#
|
43
44
|
# @since 4.2.0
|
44
|
-
SIGN_BIT_MASK = (1 << 63)
|
45
|
+
SIGN_BIT_MASK = (1 << 63)
|
45
46
|
|
46
47
|
# The two highest bits of the 64 high order bits.
|
47
48
|
#
|
48
49
|
# @since 4.2.0
|
49
|
-
TWO_HIGHEST_BITS_SET = (3 << 61)
|
50
|
+
TWO_HIGHEST_BITS_SET = (3 << 61)
|
50
51
|
|
51
52
|
extend self
|
52
53
|
|
@@ -84,9 +85,13 @@ module BSON
|
|
84
85
|
private
|
85
86
|
|
86
87
|
def validate_range!(exponent, significand)
|
87
|
-
unless
|
88
|
+
unless valid_exponent?(exponent)
|
88
89
|
raise Decimal128::InvalidRange.new
|
89
90
|
end
|
91
|
+
|
92
|
+
unless valid_significand?(significand)
|
93
|
+
raise Decimal128::UnrepresentablePrecision.new
|
94
|
+
end
|
90
95
|
end
|
91
96
|
|
92
97
|
def valid_significand?(significand)
|
@@ -109,14 +114,14 @@ module BSON
|
|
109
114
|
# @return [ Regex ] A regex matching a NaN string.
|
110
115
|
#
|
111
116
|
# @since 4.2.0
|
112
|
-
NAN_REGEX = /^(\-)?(S)?NaN$/i
|
117
|
+
NAN_REGEX = /^(\-)?(S)?NaN$/i
|
113
118
|
|
114
119
|
# Regex matching a string representing positive or negative Infinity.
|
115
120
|
#
|
116
121
|
# @return [ Regex ] A regex matching a positive or negative Infinity string.
|
117
122
|
#
|
118
123
|
# @since 4.2.0
|
119
|
-
INFINITY_REGEX = /^(\+|\-)?Inf(inity)?$/i
|
124
|
+
INFINITY_REGEX = /^(\+|\-)?Inf(inity)?$/i
|
120
125
|
|
121
126
|
# Regex for the fraction, including leading zeros.
|
122
127
|
#
|
@@ -124,33 +129,33 @@ module BSON
|
|
124
129
|
# including leading zeros.
|
125
130
|
#
|
126
131
|
# @since 4.2.0
|
127
|
-
SIGNIFICAND_WITH_LEADING_ZEROS_REGEX = /(0*)(\d+)
|
132
|
+
SIGNIFICAND_WITH_LEADING_ZEROS_REGEX = /(0*)(\d+)/
|
128
133
|
|
129
134
|
# Regex for separating a negative sign from the significands.
|
130
135
|
#
|
131
136
|
# @return [ Regex ] The regex for separating a sign from significands.
|
132
137
|
#
|
133
138
|
# @since 4.2.0
|
134
|
-
SIGN_AND_DIGITS_REGEX = /^(\-)?(\S+)
|
139
|
+
SIGN_AND_DIGITS_REGEX = /^(\-)?(\S+)/
|
135
140
|
|
136
141
|
# Regex matching a scientific exponent.
|
137
142
|
#
|
138
143
|
# @return [ Regex ] A regex matching E, e, E+, e+.
|
139
144
|
#
|
140
145
|
# @since 4.2.0
|
141
|
-
SCIENTIFIC_EXPONENT_REGEX = /E\+?/i
|
146
|
+
SCIENTIFIC_EXPONENT_REGEX = /E\+?/i
|
142
147
|
|
143
148
|
# Regex for capturing trailing zeros.
|
144
149
|
#
|
145
150
|
# @since 4.2.0
|
146
|
-
TRAILING_ZEROS_REGEX = /[1-9]*(0+)
|
151
|
+
TRAILING_ZEROS_REGEX = /[1-9]*(0+)$/
|
147
152
|
|
148
153
|
# Regex for a valid decimal128 string format.
|
149
154
|
#
|
150
155
|
# @return [ Regex ] The regex for a valid decimal128 string.
|
151
156
|
#
|
152
157
|
# @since 4.2.0
|
153
|
-
VALID_DECIMAL128_STRING_REGEX = /^[\-\+]?(\d+(\.\d*)?|\.\d+)(E[\-\+]?\d+)?$/i
|
158
|
+
VALID_DECIMAL128_STRING_REGEX = /^[\-\+]?(\d+(\.\d*)?|\.\d+)(E[\-\+]?\d+)?$/i
|
154
159
|
|
155
160
|
# Initialize the FromString Builder object.
|
156
161
|
#
|
@@ -301,11 +306,11 @@ module BSON
|
|
301
306
|
|
302
307
|
def to_special_bits
|
303
308
|
case @big_decimal.sign
|
304
|
-
when BigDecimal::SIGN_POSITIVE_INFINITE
|
309
|
+
when ::BigDecimal::SIGN_POSITIVE_INFINITE
|
305
310
|
high = INFINITY_MASK
|
306
|
-
when BigDecimal::SIGN_NEGATIVE_INFINITE
|
311
|
+
when ::BigDecimal::SIGN_NEGATIVE_INFINITE
|
307
312
|
high = INFINITY_MASK | SIGN_BIT_MASK
|
308
|
-
when BigDecimal::SIGN_NaN
|
313
|
+
when ::BigDecimal::SIGN_NaN
|
309
314
|
high = NAN_MASK
|
310
315
|
end
|
311
316
|
[ 0, high ]
|
@@ -314,7 +319,7 @@ module BSON
|
|
314
319
|
def to_bits
|
315
320
|
sign, significand_str, base, exp = @big_decimal.split
|
316
321
|
exponent = @big_decimal.zero? ? 0 : exp - significand_str.length
|
317
|
-
is_negative = (sign == BigDecimal::SIGN_NEGATIVE_FINITE || sign == BigDecimal::SIGN_NEGATIVE_ZERO)
|
322
|
+
is_negative = (sign == ::BigDecimal::SIGN_NEGATIVE_FINITE || sign == ::BigDecimal::SIGN_NEGATIVE_ZERO)
|
318
323
|
Builder.parts_to_bits(significand_str.to_i,
|
319
324
|
exponent,
|
320
325
|
is_negative)
|
@@ -337,14 +342,14 @@ module BSON
|
|
337
342
|
# @return [ String ] The string representing NaN.
|
338
343
|
#
|
339
344
|
# @since 4.2.0
|
340
|
-
NAN_STRING = 'NaN'
|
345
|
+
NAN_STRING = 'NaN'
|
341
346
|
|
342
347
|
# String representing an Infinity value.
|
343
348
|
#
|
344
349
|
# @return [ String ] The string representing Infinity.
|
345
350
|
#
|
346
351
|
# @since 4.2.0
|
347
|
-
INFINITY_STRING = 'Infinity'
|
352
|
+
INFINITY_STRING = 'Infinity'
|
348
353
|
|
349
354
|
# Initialize the FromBigDecimal Builder object.
|
350
355
|
#
|
@@ -366,11 +371,13 @@ module BSON
|
|
366
371
|
#
|
367
372
|
# @return [ String ] The string representing the decimal128 object.
|
368
373
|
#
|
374
|
+
# @note The returned string may be frozen.
|
375
|
+
#
|
369
376
|
# @since 4.2.0
|
370
377
|
def string
|
371
378
|
return NAN_STRING if nan?
|
372
379
|
str = infinity? ? INFINITY_STRING : create_string
|
373
|
-
negative? ?
|
380
|
+
negative? ? "-#{str}" : str
|
374
381
|
end
|
375
382
|
|
376
383
|
private
|
data/lib/bson/decimal128.rb
CHANGED
@@ -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
|
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
|
32
|
+
EXPONENT_OFFSET = 6176
|
32
33
|
|
33
34
|
# Minimum exponent.
|
34
35
|
#
|
35
36
|
# @since 4.2.0
|
36
|
-
MIN_EXPONENT = -6176
|
37
|
+
MIN_EXPONENT = -6176
|
37
38
|
|
38
39
|
# Maximum exponent.
|
39
40
|
#
|
40
41
|
# @since 4.2.0
|
41
|
-
MAX_EXPONENT = 6111
|
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
|
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"
|
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.'
|
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.'
|
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
|
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
|
-
|
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
|