json_pure 2.0.4 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGES.md +3 -0
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/ext/json/ext/parser/parser.c +93 -76
- data/ext/json/ext/parser/parser.h +1 -0
- data/ext/json/ext/parser/parser.rl +20 -3
- data/java/src/json/ext/Parser.java +92 -77
- data/java/src/json/ext/Parser.rl +24 -9
- data/json.gemspec +0 -0
- data/json_pure.gemspec +3 -3
- data/lib/json/pure/parser.rb +5 -1
- data/lib/json/version.rb +1 -1
- data/tests/json_encoding_test.rb +2 -2
- data/tests/json_parser_test.rb +5 -0
- metadata +2 -2
data/java/src/json/ext/Parser.rl
CHANGED
@@ -52,7 +52,8 @@ public class Parser extends RubyObject {
|
|
52
52
|
private boolean symbolizeNames;
|
53
53
|
private RubyClass objectClass;
|
54
54
|
private RubyClass arrayClass;
|
55
|
-
private
|
55
|
+
private RubyClass decimalClass;
|
56
|
+
private RubyHash match_string;
|
56
57
|
|
57
58
|
private static final int DEFAULT_MAX_NESTING = 100;
|
58
59
|
|
@@ -131,6 +132,10 @@ public class Parser extends RubyObject {
|
|
131
132
|
* <dt><code>:array_class</code>
|
132
133
|
* <dd>Defaults to Array.
|
133
134
|
*
|
135
|
+
* <dt><code>:decimal_class</code>
|
136
|
+
* <dd>Specifies which class to use instead of the default (Float) when
|
137
|
+
* parsing decimal numbers. This class must accept a single string argument
|
138
|
+
* in its constructor.
|
134
139
|
* </dl>
|
135
140
|
*/
|
136
141
|
@JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
|
@@ -157,7 +162,8 @@ public class Parser extends RubyObject {
|
|
157
162
|
this.createAdditions = opts.getBool("create_additions", false);
|
158
163
|
this.objectClass = opts.getClass("object_class", runtime.getHash());
|
159
164
|
this.arrayClass = opts.getClass("array_class", runtime.getArray());
|
160
|
-
this.
|
165
|
+
this.decimalClass = opts.getClass("decimal_class", null);
|
166
|
+
this.match_string = opts.getHash("match_string");
|
161
167
|
|
162
168
|
if(symbolizeNames && createAdditions) {
|
163
169
|
throw runtime.newArgumentError(
|
@@ -489,13 +495,13 @@ public class Parser extends RubyObject {
|
|
489
495
|
|
490
496
|
return p;
|
491
497
|
}
|
492
|
-
|
498
|
+
|
493
499
|
RubyInteger createInteger(int p, int new_p) {
|
494
500
|
Ruby runtime = getRuntime();
|
495
501
|
ByteList num = absSubSequence(p, new_p);
|
496
502
|
return bytesToInum(runtime, num);
|
497
503
|
}
|
498
|
-
|
504
|
+
|
499
505
|
RubyInteger bytesToInum(Ruby runtime, ByteList num) {
|
500
506
|
return runtime.is1_9() ?
|
501
507
|
ConvertBytes.byteListToInum19(runtime, num, 10, true) :
|
@@ -525,7 +531,9 @@ public class Parser extends RubyObject {
|
|
525
531
|
res.update(null, p);
|
526
532
|
return;
|
527
533
|
}
|
528
|
-
|
534
|
+
IRubyObject number = parser.decimalClass == null ?
|
535
|
+
createFloat(p, new_p) : createCustomDecimal(p, new_p);
|
536
|
+
|
529
537
|
res.update(number, new_p + 1);
|
530
538
|
return;
|
531
539
|
}
|
@@ -540,16 +548,23 @@ public class Parser extends RubyObject {
|
|
540
548
|
if (cs < JSON_float_first_final) {
|
541
549
|
return -1;
|
542
550
|
}
|
543
|
-
|
551
|
+
|
544
552
|
return p;
|
545
553
|
}
|
546
|
-
|
554
|
+
|
547
555
|
RubyFloat createFloat(int p, int new_p) {
|
548
556
|
Ruby runtime = getRuntime();
|
549
557
|
ByteList num = absSubSequence(p, new_p);
|
550
558
|
return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
|
551
559
|
}
|
552
560
|
|
561
|
+
IRubyObject createCustomDecimal(int p, int new_p) {
|
562
|
+
Ruby runtime = getRuntime();
|
563
|
+
ByteList num = absSubSequence(p, new_p);
|
564
|
+
IRubyObject numString = runtime.newString(num.toString());
|
565
|
+
return parser.decimalClass.callMethod(context, "new", numString);
|
566
|
+
}
|
567
|
+
|
553
568
|
%%{
|
554
569
|
machine JSON_string;
|
555
570
|
include JSON_common;
|
@@ -616,7 +631,7 @@ public class Parser extends RubyObject {
|
|
616
631
|
}
|
617
632
|
}
|
618
633
|
|
619
|
-
if (cs >= JSON_string_first_final && result != null) {
|
634
|
+
if (cs >= JSON_string_first_final && result != null) {
|
620
635
|
if (result instanceof RubyString) {
|
621
636
|
((RubyString)result).force_encoding(context, info.utf8.get());
|
622
637
|
}
|
@@ -734,7 +749,7 @@ public class Parser extends RubyObject {
|
|
734
749
|
fhold;
|
735
750
|
fbreak;
|
736
751
|
}
|
737
|
-
|
752
|
+
|
738
753
|
pair = ignore* begin_name >parse_name ignore* name_separator
|
739
754
|
ignore* begin_value >parse_value;
|
740
755
|
next_pair = ignore* value_separator pair;
|
data/json.gemspec
CHANGED
Binary file
|
data/json_pure.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: json_pure 2.0
|
2
|
+
# stub: json_pure 2.1.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "json_pure".freeze
|
6
|
-
s.version = "2.0
|
6
|
+
s.version = "2.1.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Florian Frank".freeze]
|
11
|
-
s.date = "2017-04-
|
11
|
+
s.date = "2017-04-18"
|
12
12
|
s.description = "This is a JSON implementation in pure Ruby.".freeze
|
13
13
|
s.email = "flori@ping.de".freeze
|
14
14
|
s.extra_rdoc_files = ["README.md".freeze]
|
data/lib/json/pure/parser.rb
CHANGED
@@ -70,6 +70,9 @@ module JSON
|
|
70
70
|
# option defaults to false.
|
71
71
|
# * *object_class*: Defaults to Hash
|
72
72
|
# * *array_class*: Defaults to Array
|
73
|
+
# * *decimal_class*: Specifies which class to use instead of the default
|
74
|
+
# (Float) when parsing decimal numbers. This class must accept a single
|
75
|
+
# string argument in its constructor.
|
73
76
|
def initialize(source, opts = {})
|
74
77
|
opts ||= {}
|
75
78
|
source = convert_encoding source
|
@@ -94,6 +97,7 @@ module JSON
|
|
94
97
|
@create_id = @create_additions ? JSON.create_id : nil
|
95
98
|
@object_class = opts[:object_class] || Hash
|
96
99
|
@array_class = opts[:array_class] || Array
|
100
|
+
@decimal_class = opts[:decimal_class]
|
97
101
|
@match_string = opts[:match_string]
|
98
102
|
end
|
99
103
|
|
@@ -193,7 +197,7 @@ module JSON
|
|
193
197
|
def parse_value
|
194
198
|
case
|
195
199
|
when scan(FLOAT)
|
196
|
-
Float(self[1])
|
200
|
+
@decimal_class && @decimal_class.new(self[1]) || Float(self[1])
|
197
201
|
when scan(INTEGER)
|
198
202
|
Integer(self[1])
|
199
203
|
when scan(TRUE)
|
data/lib/json/version.rb
CHANGED
data/tests/json_encoding_test.rb
CHANGED
@@ -79,8 +79,8 @@ class JSONEncodingTest < Test::Unit::TestCase
|
|
79
79
|
json = '["\ud840\udc01"]'
|
80
80
|
assert_equal json, generate(utf8, :ascii_only => true)
|
81
81
|
assert_equal utf8, parse(json)
|
82
|
-
|
83
|
-
|
82
|
+
assert_raise(JSON::ParserError) { parse('"\u"') }
|
83
|
+
assert_raise(JSON::ParserError) { parse('"\ud800"') }
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_chars
|
data/tests/json_parser_test.rb
CHANGED
@@ -108,6 +108,11 @@ class JSONParserTest < Test::Unit::TestCase
|
|
108
108
|
assert_equal -1.0/0, parse('-Infinity', :allow_nan => true)
|
109
109
|
end
|
110
110
|
|
111
|
+
def test_parse_bigdecimals
|
112
|
+
assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
|
113
|
+
assert_equal(BigDecimal.new("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
|
114
|
+
end
|
115
|
+
|
111
116
|
if Array.method_defined?(:permutation)
|
112
117
|
def test_parse_more_complex_arrays
|
113
118
|
a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_pure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|