json 1.8.3 → 2.4.0
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 +5 -5
- data/.gitignore +2 -0
- data/.travis.yml +9 -12
- data/{CHANGES → CHANGES.md} +219 -90
- data/Gemfile +10 -6
- data/{COPYING-json-jruby → LICENSE} +5 -6
- data/{README-json-jruby.markdown → README-json-jruby.md} +0 -0
- data/{README.rdoc → README.md} +201 -134
- data/Rakefile +35 -113
- data/VERSION +1 -1
- data/ext/json/ext/fbuffer/fbuffer.h +0 -3
- data/ext/json/ext/generator/generator.c +255 -101
- data/ext/json/ext/generator/generator.h +12 -4
- data/ext/json/ext/parser/extconf.rb +28 -0
- data/ext/json/ext/parser/parser.c +410 -462
- data/ext/json/ext/parser/parser.h +5 -5
- data/ext/json/ext/parser/parser.rl +166 -181
- data/ext/json/extconf.rb +1 -1
- data/java/src/json/ext/ByteListTranscoder.java +1 -2
- data/java/src/json/ext/Generator.java +39 -36
- data/java/src/json/ext/GeneratorMethods.java +1 -2
- data/java/src/json/ext/GeneratorService.java +1 -2
- data/java/src/json/ext/GeneratorState.java +33 -56
- data/java/src/json/ext/OptionsReader.java +2 -3
- data/java/src/json/ext/Parser.java +146 -417
- data/java/src/json/ext/Parser.rl +62 -126
- data/java/src/json/ext/ParserService.java +1 -2
- data/java/src/json/ext/RuntimeInfo.java +1 -6
- data/java/src/json/ext/StringDecoder.java +1 -2
- data/java/src/json/ext/StringEncoder.java +13 -2
- data/java/src/json/ext/Utils.java +1 -2
- data/json-java.gemspec +22 -7
- data/json.gemspec +0 -0
- data/json_pure.gemspec +22 -29
- data/lib/json/add/bigdecimal.rb +3 -2
- data/lib/json/add/complex.rb +4 -4
- data/lib/json/add/core.rb +1 -0
- data/lib/json/add/date.rb +1 -1
- data/lib/json/add/date_time.rb +1 -1
- data/lib/json/add/exception.rb +1 -1
- data/lib/json/add/ostruct.rb +3 -3
- data/lib/json/add/range.rb +1 -1
- data/lib/json/add/rational.rb +3 -3
- data/lib/json/add/regexp.rb +3 -3
- data/lib/json/add/set.rb +29 -0
- data/lib/json/add/struct.rb +1 -1
- data/lib/json/add/symbol.rb +1 -1
- data/lib/json/add/time.rb +1 -1
- data/lib/json/common.rb +350 -152
- data/lib/json/ext.rb +0 -6
- data/lib/json/generic_object.rb +5 -4
- data/lib/json/pure/generator.rb +83 -126
- data/lib/json/pure/parser.rb +62 -84
- data/lib/json/pure.rb +2 -8
- data/lib/json/version.rb +2 -1
- data/lib/json.rb +550 -29
- data/references/rfc7159.txt +899 -0
- data/tests/fixtures/obsolete_fail1.json +1 -0
- data/tests/{test_json_addition.rb → json_addition_test.rb} +28 -25
- data/tests/json_common_interface_test.rb +169 -0
- data/tests/json_encoding_test.rb +107 -0
- data/tests/json_ext_parser_test.rb +15 -0
- data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +13 -8
- data/tests/{test_json_generate.rb → json_generator_test.rb} +134 -39
- data/tests/{test_json_generic_object.rb → json_generic_object_test.rb} +15 -8
- data/tests/json_parser_test.rb +497 -0
- data/tests/json_string_matching_test.rb +38 -0
- data/tests/test_helper.rb +17 -0
- data/tools/diff.sh +18 -0
- data/tools/fuzz.rb +1 -9
- metadata +47 -53
- data/COPYING +0 -58
- data/GPL +0 -340
- data/TODO +0 -1
- data/data/example.json +0 -1
- data/data/index.html +0 -38
- data/data/prototype.js +0 -4184
- data/tests/fixtures/fail1.json +0 -1
- data/tests/setup_variant.rb +0 -11
- data/tests/test_json.rb +0 -553
- data/tests/test_json_encoding.rb +0 -65
- data/tests/test_json_string_matching.rb +0 -39
- data/tests/test_json_unicode.rb +0 -72
data/java/src/json/ext/Parser.rl
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -51,9 +50,10 @@ public class Parser extends RubyObject {
|
|
51
50
|
private int maxNesting;
|
52
51
|
private boolean allowNaN;
|
53
52
|
private boolean symbolizeNames;
|
54
|
-
private boolean
|
53
|
+
private boolean freeze;
|
55
54
|
private RubyClass objectClass;
|
56
55
|
private RubyClass arrayClass;
|
56
|
+
private RubyClass decimalClass;
|
57
57
|
private RubyHash match_string;
|
58
58
|
|
59
59
|
private static final int DEFAULT_MAX_NESTING = 100;
|
@@ -122,10 +122,6 @@ public class Parser extends RubyObject {
|
|
122
122
|
* <dd>If set to <code>true</code>, returns symbols for the names (keys) in
|
123
123
|
* a JSON object. Otherwise strings are returned, which is also the default.
|
124
124
|
*
|
125
|
-
* <dt><code>:quirks_mode?</code>
|
126
|
-
* <dd>If set to <code>true</code>, if the parse is in quirks_mode, false
|
127
|
-
* otherwise.
|
128
|
-
*
|
129
125
|
* <dt><code>:create_additions</code>
|
130
126
|
* <dd>If set to <code>false</code>, the Parser doesn't create additions
|
131
127
|
* even if a matching class and <code>create_id</code> was found. This option
|
@@ -137,9 +133,10 @@ public class Parser extends RubyObject {
|
|
137
133
|
* <dt><code>:array_class</code>
|
138
134
|
* <dd>Defaults to Array.
|
139
135
|
*
|
140
|
-
* <dt><code>:
|
141
|
-
* <dd>
|
142
|
-
*
|
136
|
+
* <dt><code>:decimal_class</code>
|
137
|
+
* <dd>Specifies which class to use instead of the default (Float) when
|
138
|
+
* parsing decimal numbers. This class must accept a single string argument
|
139
|
+
* in its constructor.
|
143
140
|
* </dl>
|
144
141
|
*/
|
145
142
|
@JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
|
@@ -162,15 +159,22 @@ public class Parser extends RubyObject {
|
|
162
159
|
this.maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
|
163
160
|
this.allowNaN = opts.getBool("allow_nan", false);
|
164
161
|
this.symbolizeNames = opts.getBool("symbolize_names", false);
|
165
|
-
this.
|
162
|
+
this.freeze = opts.getBool("freeze", false);
|
166
163
|
this.createId = opts.getString("create_id", getCreateId(context));
|
167
164
|
this.createAdditions = opts.getBool("create_additions", false);
|
168
165
|
this.objectClass = opts.getClass("object_class", runtime.getHash());
|
169
166
|
this.arrayClass = opts.getClass("array_class", runtime.getArray());
|
167
|
+
this.decimalClass = opts.getClass("decimal_class", null);
|
170
168
|
this.match_string = opts.getHash("match_string");
|
171
169
|
|
170
|
+
if(symbolizeNames && createAdditions) {
|
171
|
+
throw runtime.newArgumentError(
|
172
|
+
"options :symbolize_names and :create_additions cannot be " +
|
173
|
+
" used in conjunction"
|
174
|
+
);
|
175
|
+
}
|
172
176
|
this.vSource = args[0].convertToString();
|
173
|
-
|
177
|
+
this.vSource = convertEncoding(context, vSource);
|
174
178
|
|
175
179
|
return this;
|
176
180
|
}
|
@@ -181,33 +185,16 @@ public class Parser extends RubyObject {
|
|
181
185
|
* Returns the source string if no conversion is needed.
|
182
186
|
*/
|
183
187
|
private RubyString convertEncoding(ThreadContext context, RubyString source) {
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
return (RubyString)source.encode(context, info.utf8.get());
|
195
|
-
}
|
196
|
-
|
197
|
-
String sniffedEncoding = sniffByteList(bl);
|
198
|
-
if (sniffedEncoding == null) return source; // assume UTF-8
|
199
|
-
return reinterpretEncoding(context, source, sniffedEncoding);
|
200
|
-
}
|
201
|
-
|
202
|
-
String sniffedEncoding = sniffByteList(bl);
|
203
|
-
if (sniffedEncoding == null) return source; // assume UTF-8
|
204
|
-
Ruby runtime = context.getRuntime();
|
205
|
-
return (RubyString)info.jsonModule.get().
|
206
|
-
callMethod(context, "iconv",
|
207
|
-
new IRubyObject[] {
|
208
|
-
runtime.newString("utf-8"),
|
209
|
-
runtime.newString(sniffedEncoding),
|
210
|
-
source});
|
188
|
+
RubyEncoding encoding = (RubyEncoding)source.encoding(context);
|
189
|
+
if (encoding == info.ascii8bit.get()) {
|
190
|
+
if (source.isFrozen()) {
|
191
|
+
source = (RubyString) source.dup();
|
192
|
+
}
|
193
|
+
source.force_encoding(context, info.utf8.get());
|
194
|
+
} else {
|
195
|
+
source = (RubyString) source.encode(context, info.utf8.get());
|
196
|
+
}
|
197
|
+
return source;
|
211
198
|
}
|
212
199
|
|
213
200
|
/**
|
@@ -260,17 +247,6 @@ public class Parser extends RubyObject {
|
|
260
247
|
return checkAndGetSource().dup();
|
261
248
|
}
|
262
249
|
|
263
|
-
/**
|
264
|
-
* <code>Parser#quirks_mode?()</code>
|
265
|
-
*
|
266
|
-
* <p>If set to <code>true</code>, if the parse is in quirks_mode, false
|
267
|
-
* otherwise.
|
268
|
-
*/
|
269
|
-
@JRubyMethod(name = "quirks_mode?")
|
270
|
-
public IRubyObject quirks_mode_p(ThreadContext context) {
|
271
|
-
return context.getRuntime().newBoolean(quirksMode);
|
272
|
-
}
|
273
|
-
|
274
250
|
public RubyString checkAndGetSource() {
|
275
251
|
if (vSource != null) {
|
276
252
|
return vSource;
|
@@ -394,7 +370,7 @@ public class Parser extends RubyObject {
|
|
394
370
|
}
|
395
371
|
}
|
396
372
|
action parse_number {
|
397
|
-
if (pe > fpc +
|
373
|
+
if (pe > fpc + 8 &&
|
398
374
|
absSubSequence(fpc, fpc + 9).equals(JSON_MINUS_INFINITY)) {
|
399
375
|
|
400
376
|
if (parser.allowNaN) {
|
@@ -478,6 +454,9 @@ public class Parser extends RubyObject {
|
|
478
454
|
%% write exec;
|
479
455
|
|
480
456
|
if (cs >= JSON_value_first_final && result != null) {
|
457
|
+
if (parser.freeze) {
|
458
|
+
result.setFrozen(true);
|
459
|
+
}
|
481
460
|
res.update(result, p);
|
482
461
|
} else {
|
483
462
|
res.update(null, p);
|
@@ -521,13 +500,13 @@ public class Parser extends RubyObject {
|
|
521
500
|
|
522
501
|
return p;
|
523
502
|
}
|
524
|
-
|
503
|
+
|
525
504
|
RubyInteger createInteger(int p, int new_p) {
|
526
505
|
Ruby runtime = getRuntime();
|
527
506
|
ByteList num = absSubSequence(p, new_p);
|
528
507
|
return bytesToInum(runtime, num);
|
529
508
|
}
|
530
|
-
|
509
|
+
|
531
510
|
RubyInteger bytesToInum(Ruby runtime, ByteList num) {
|
532
511
|
return runtime.is1_9() ?
|
533
512
|
ConvertBytes.byteListToInum19(runtime, num, 10, true) :
|
@@ -557,7 +536,9 @@ public class Parser extends RubyObject {
|
|
557
536
|
res.update(null, p);
|
558
537
|
return;
|
559
538
|
}
|
560
|
-
|
539
|
+
IRubyObject number = parser.decimalClass == null ?
|
540
|
+
createFloat(p, new_p) : createCustomDecimal(p, new_p);
|
541
|
+
|
561
542
|
res.update(number, new_p + 1);
|
562
543
|
return;
|
563
544
|
}
|
@@ -572,16 +553,23 @@ public class Parser extends RubyObject {
|
|
572
553
|
if (cs < JSON_float_first_final) {
|
573
554
|
return -1;
|
574
555
|
}
|
575
|
-
|
556
|
+
|
576
557
|
return p;
|
577
558
|
}
|
578
|
-
|
559
|
+
|
579
560
|
RubyFloat createFloat(int p, int new_p) {
|
580
561
|
Ruby runtime = getRuntime();
|
581
562
|
ByteList num = absSubSequence(p, new_p);
|
582
563
|
return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
|
583
564
|
}
|
584
565
|
|
566
|
+
IRubyObject createCustomDecimal(int p, int new_p) {
|
567
|
+
Ruby runtime = getRuntime();
|
568
|
+
ByteList num = absSubSequence(p, new_p);
|
569
|
+
IRubyObject numString = runtime.newString(num.toString());
|
570
|
+
return parser.decimalClass.callMethod(context, "new", numString);
|
571
|
+
}
|
572
|
+
|
585
573
|
%%{
|
586
574
|
machine JSON_string;
|
587
575
|
include JSON_common;
|
@@ -624,11 +612,11 @@ public class Parser extends RubyObject {
|
|
624
612
|
%% write exec;
|
625
613
|
|
626
614
|
if (parser.createAdditions) {
|
627
|
-
RubyHash
|
628
|
-
if (
|
615
|
+
RubyHash matchString = parser.match_string;
|
616
|
+
if (matchString != null) {
|
629
617
|
final IRubyObject[] memoArray = { result, null };
|
630
618
|
try {
|
631
|
-
|
619
|
+
matchString.visitAll(new RubyHash.Visitor() {
|
632
620
|
@Override
|
633
621
|
public void visit(IRubyObject pattern, IRubyObject klass) {
|
634
622
|
if (pattern.callMethod(context, "===", memoArray[0]).isTrue()) {
|
@@ -648,11 +636,18 @@ public class Parser extends RubyObject {
|
|
648
636
|
}
|
649
637
|
}
|
650
638
|
|
651
|
-
if (cs >= JSON_string_first_final && result != null) {
|
652
|
-
if (
|
653
|
-
(
|
639
|
+
if (cs >= JSON_string_first_final && result != null) {
|
640
|
+
if (result instanceof RubyString) {
|
641
|
+
RubyString string = (RubyString)result;
|
642
|
+
string.force_encoding(context, info.utf8.get());
|
643
|
+
if (parser.freeze) {
|
644
|
+
string.setFrozen(true);
|
645
|
+
string = getRuntime().freezeAndDedupString(string);
|
646
|
+
}
|
647
|
+
res.update(string, p + 1);
|
648
|
+
} else {
|
649
|
+
res.update(result, p + 1);
|
654
650
|
}
|
655
|
-
res.update(result, p + 1);
|
656
651
|
} else {
|
657
652
|
res.update(null, p + 1);
|
658
653
|
}
|
@@ -766,7 +761,7 @@ public class Parser extends RubyObject {
|
|
766
761
|
fhold;
|
767
762
|
fbreak;
|
768
763
|
}
|
769
|
-
|
764
|
+
|
770
765
|
pair = ignore* begin_name >parse_name ignore* name_separator
|
771
766
|
ignore* begin_value >parse_value;
|
772
767
|
next_pair = ignore* value_separator pair;
|
@@ -836,60 +831,6 @@ public class Parser extends RubyObject {
|
|
836
831
|
|
837
832
|
write data;
|
838
833
|
|
839
|
-
action parse_object {
|
840
|
-
currentNesting = 1;
|
841
|
-
parseObject(res, fpc, pe);
|
842
|
-
if (res.result == null) {
|
843
|
-
fhold;
|
844
|
-
fbreak;
|
845
|
-
} else {
|
846
|
-
result = res.result;
|
847
|
-
fexec res.p;
|
848
|
-
}
|
849
|
-
}
|
850
|
-
|
851
|
-
action parse_array {
|
852
|
-
currentNesting = 1;
|
853
|
-
parseArray(res, fpc, pe);
|
854
|
-
if (res.result == null) {
|
855
|
-
fhold;
|
856
|
-
fbreak;
|
857
|
-
} else {
|
858
|
-
result = res.result;
|
859
|
-
fexec res.p;
|
860
|
-
}
|
861
|
-
}
|
862
|
-
|
863
|
-
main := ignore*
|
864
|
-
( begin_object >parse_object
|
865
|
-
| begin_array >parse_array )
|
866
|
-
ignore*;
|
867
|
-
}%%
|
868
|
-
|
869
|
-
public IRubyObject parseStrict() {
|
870
|
-
int cs = EVIL;
|
871
|
-
int p, pe;
|
872
|
-
IRubyObject result = null;
|
873
|
-
ParserResult res = new ParserResult();
|
874
|
-
|
875
|
-
%% write init;
|
876
|
-
p = byteList.begin();
|
877
|
-
pe = p + byteList.length();
|
878
|
-
%% write exec;
|
879
|
-
|
880
|
-
if (cs >= JSON_first_final && p == pe) {
|
881
|
-
return result;
|
882
|
-
} else {
|
883
|
-
throw unexpectedToken(p, pe);
|
884
|
-
}
|
885
|
-
}
|
886
|
-
|
887
|
-
%%{
|
888
|
-
machine JSON_quirks_mode;
|
889
|
-
include JSON_common;
|
890
|
-
|
891
|
-
write data;
|
892
|
-
|
893
834
|
action parse_value {
|
894
835
|
parseValue(res, fpc, pe);
|
895
836
|
if (res.result == null) {
|
@@ -906,7 +847,7 @@ public class Parser extends RubyObject {
|
|
906
847
|
ignore*;
|
907
848
|
}%%
|
908
849
|
|
909
|
-
public IRubyObject
|
850
|
+
public IRubyObject parseImplemetation() {
|
910
851
|
int cs = EVIL;
|
911
852
|
int p, pe;
|
912
853
|
IRubyObject result = null;
|
@@ -917,7 +858,7 @@ public class Parser extends RubyObject {
|
|
917
858
|
pe = p + byteList.length();
|
918
859
|
%% write exec;
|
919
860
|
|
920
|
-
if (cs >=
|
861
|
+
if (cs >= JSON_first_final && p == pe) {
|
921
862
|
return result;
|
922
863
|
} else {
|
923
864
|
throw unexpectedToken(p, pe);
|
@@ -925,12 +866,7 @@ public class Parser extends RubyObject {
|
|
925
866
|
}
|
926
867
|
|
927
868
|
public IRubyObject parse() {
|
928
|
-
|
929
|
-
return parseQuirksMode();
|
930
|
-
} else {
|
931
|
-
return parseStrict();
|
932
|
-
}
|
933
|
-
|
869
|
+
return parseImplemetation();
|
934
870
|
}
|
935
871
|
|
936
872
|
/**
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -91,10 +90,6 @@ final class RuntimeInfo {
|
|
91
90
|
}
|
92
91
|
}
|
93
92
|
|
94
|
-
public boolean encodingsSupported() {
|
95
|
-
return utf8 != null && utf8.get() != null;
|
96
|
-
}
|
97
|
-
|
98
93
|
public RubyEncoding getEncoding(ThreadContext context, String name) {
|
99
94
|
synchronized (encodings) {
|
100
95
|
WeakReference<RubyEncoding> encoding = encodings.get(name);
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -1,3 +1,8 @@
|
|
1
|
+
/*
|
2
|
+
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
|
+
*
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
5
|
+
*/
|
1
6
|
package json.ext;
|
2
7
|
|
3
8
|
import org.jruby.exceptions.RaiseException;
|
@@ -10,7 +15,7 @@ import org.jruby.util.ByteList;
|
|
10
15
|
* and throws a GeneratorError if any problem is found.
|
11
16
|
*/
|
12
17
|
final class StringEncoder extends ByteListTranscoder {
|
13
|
-
private final boolean asciiOnly;
|
18
|
+
private final boolean asciiOnly, escapeSlash;
|
14
19
|
|
15
20
|
// Escaped characters will reuse this array, to avoid new allocations
|
16
21
|
// or appending them byte-by-byte
|
@@ -32,9 +37,10 @@ final class StringEncoder extends ByteListTranscoder {
|
|
32
37
|
new byte[] {'0', '1', '2', '3', '4', '5', '6', '7',
|
33
38
|
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
|
34
39
|
|
35
|
-
StringEncoder(ThreadContext context, boolean asciiOnly) {
|
40
|
+
StringEncoder(ThreadContext context, boolean asciiOnly, boolean escapeSlash) {
|
36
41
|
super(context);
|
37
42
|
this.asciiOnly = asciiOnly;
|
43
|
+
this.escapeSlash = escapeSlash;
|
38
44
|
}
|
39
45
|
|
40
46
|
void encode(ByteList src, ByteList out) {
|
@@ -68,6 +74,11 @@ final class StringEncoder extends ByteListTranscoder {
|
|
68
74
|
case '\b':
|
69
75
|
escapeChar('b');
|
70
76
|
break;
|
77
|
+
case '/':
|
78
|
+
if(escapeSlash) {
|
79
|
+
escapeChar((char)c);
|
80
|
+
break;
|
81
|
+
}
|
71
82
|
default:
|
72
83
|
if (c >= 0x20 && c <= 0x7f ||
|
73
84
|
(c >= 0x80 && !asciiOnly)) {
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
data/json-java.gemspec
CHANGED
@@ -1,19 +1,34 @@
|
|
1
|
-
|
2
|
-
require "rubygems"
|
1
|
+
# -*- encoding: utf-8 -*-
|
3
2
|
|
4
3
|
spec = Gem::Specification.new do |s|
|
5
4
|
s.name = "json"
|
6
5
|
s.version = File.read("VERSION").chomp
|
7
|
-
|
6
|
+
|
7
|
+
s.summary = "JSON Implementation for Ruby"
|
8
8
|
s.description = "A JSON implementation as a JRuby extension."
|
9
|
+
s.licenses = ["Ruby"]
|
9
10
|
s.author = "Daniel Luz"
|
10
11
|
s.email = "dev+ruby@mernen.com"
|
11
|
-
|
12
|
+
|
12
13
|
s.platform = 'java'
|
13
|
-
s.rubyforge_project = "json-jruby"
|
14
|
-
s.licenses = ["Ruby"]
|
15
14
|
|
16
|
-
s.files = Dir["{docs,lib,tests}/**/*"]
|
15
|
+
s.files = Dir["{docs,lib,tests}/**/*", "LICENSE"]
|
16
|
+
|
17
|
+
s.homepage = "http://flori.github.com/json"
|
18
|
+
s.metadata = {
|
19
|
+
'bug_tracker_uri' => 'https://github.com/flori/json/issues',
|
20
|
+
'changelog_uri' => 'https://github.com/flori/json/blob/master/CHANGES.md',
|
21
|
+
'documentation_uri' => 'http://flori.github.io/json/doc/index.html',
|
22
|
+
'homepage_uri' => 'http://flori.github.io/json/',
|
23
|
+
'source_code_uri' => 'https://github.com/flori/json',
|
24
|
+
'wiki_uri' => 'https://github.com/flori/json/wiki'
|
25
|
+
}
|
26
|
+
|
27
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.0")
|
28
|
+
s.test_files = ["tests/test_helper.rb"]
|
29
|
+
|
30
|
+
s.add_development_dependency("rake", [">= 0"])
|
31
|
+
s.add_development_dependency("test-unit", [">= 2.0", "< 4.0"])
|
17
32
|
end
|
18
33
|
|
19
34
|
if $0 == __FILE__
|
data/json.gemspec
CHANGED
Binary file
|
data/json_pure.gemspec
CHANGED
@@ -1,40 +1,33 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: json_pure 1.8.3 ruby lib
|
3
2
|
|
4
3
|
Gem::Specification.new do |s|
|
5
|
-
s.name = "json_pure"
|
6
|
-
s.version = "
|
4
|
+
s.name = "json_pure".freeze
|
5
|
+
s.version = File.read("VERSION").chomp
|
7
6
|
|
8
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
-
s.require_paths = ["lib"]
|
10
|
-
s.authors = ["Florian Frank"]
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.rubygems_version = "
|
20
|
-
s.summary = "JSON Implementation for Ruby"
|
21
|
-
s.test_files = ["./tests/
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
8
|
+
s.require_paths = ["lib".freeze]
|
9
|
+
s.authors = ["Florian Frank".freeze]
|
10
|
+
s.description = "This is a JSON implementation in pure Ruby.".freeze
|
11
|
+
s.email = "flori@ping.de".freeze
|
12
|
+
s.extra_rdoc_files = ["README.md".freeze]
|
13
|
+
s.files = ["./tests/test_helper.rb".freeze, ".gitignore".freeze, ".travis.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README-json-jruby.md".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "diagrams/.keep".freeze, "ext/json/ext/fbuffer/fbuffer.h".freeze, "ext/json/ext/generator/depend".freeze, "ext/json/ext/generator/extconf.rb".freeze, "ext/json/ext/generator/generator.c".freeze, "ext/json/ext/generator/generator.h".freeze, "ext/json/ext/parser/depend".freeze, "ext/json/ext/parser/extconf.rb".freeze, "ext/json/ext/parser/parser.c".freeze, "ext/json/ext/parser/parser.h".freeze, "ext/json/ext/parser/parser.rl".freeze, "ext/json/extconf.rb".freeze, "install.rb".freeze, "java/src/json/ext/ByteListTranscoder.java".freeze, "java/src/json/ext/Generator.java".freeze, "java/src/json/ext/GeneratorMethods.java".freeze, "java/src/json/ext/GeneratorService.java".freeze, "java/src/json/ext/GeneratorState.java".freeze, "java/src/json/ext/OptionsReader.java".freeze, "java/src/json/ext/Parser.java".freeze, "java/src/json/ext/Parser.rl".freeze, "java/src/json/ext/ParserService.java".freeze, "java/src/json/ext/RuntimeInfo.java".freeze, "java/src/json/ext/StringDecoder.java".freeze, "java/src/json/ext/StringEncoder.java".freeze, "java/src/json/ext/Utils.java".freeze, "json-java.gemspec".freeze, "json.gemspec".freeze, "json_pure.gemspec".freeze, "lib/json.rb".freeze, "lib/json/add/bigdecimal.rb".freeze, "lib/json/add/complex.rb".freeze, "lib/json/add/core.rb".freeze, "lib/json/add/date.rb".freeze, "lib/json/add/date_time.rb".freeze, "lib/json/add/exception.rb".freeze, "lib/json/add/ostruct.rb".freeze, "lib/json/add/range.rb".freeze, "lib/json/add/rational.rb".freeze, "lib/json/add/regexp.rb".freeze, "lib/json/add/set.rb".freeze, "lib/json/add/struct.rb".freeze, "lib/json/add/symbol.rb".freeze, "lib/json/add/time.rb".freeze, "lib/json/common.rb".freeze, "lib/json/ext.rb".freeze, "lib/json/ext/.keep".freeze, "lib/json/generic_object.rb".freeze, "lib/json/pure.rb".freeze, "lib/json/pure/generator.rb".freeze, "lib/json/pure/parser.rb".freeze, "lib/json/version.rb".freeze, "references/rfc7159.txt".freeze, "tests/fixtures/fail10.json".freeze, "tests/fixtures/fail11.json".freeze, "tests/fixtures/fail12.json".freeze, "tests/fixtures/fail13.json".freeze, "tests/fixtures/fail14.json".freeze, "tests/fixtures/fail18.json".freeze, "tests/fixtures/fail19.json".freeze, "tests/fixtures/fail2.json".freeze, "tests/fixtures/fail20.json".freeze, "tests/fixtures/fail21.json".freeze, "tests/fixtures/fail22.json".freeze, "tests/fixtures/fail23.json".freeze, "tests/fixtures/fail24.json".freeze, "tests/fixtures/fail25.json".freeze, "tests/fixtures/fail27.json".freeze, "tests/fixtures/fail28.json".freeze, "tests/fixtures/fail3.json".freeze, "tests/fixtures/fail4.json".freeze, "tests/fixtures/fail5.json".freeze, "tests/fixtures/fail6.json".freeze, "tests/fixtures/fail7.json".freeze, "tests/fixtures/fail8.json".freeze, "tests/fixtures/fail9.json".freeze, "tests/fixtures/obsolete_fail1.json".freeze, "tests/fixtures/pass1.json".freeze, "tests/fixtures/pass15.json".freeze, "tests/fixtures/pass16.json".freeze, "tests/fixtures/pass17.json".freeze, "tests/fixtures/pass2.json".freeze, "tests/fixtures/pass26.json".freeze, "tests/fixtures/pass3.json".freeze, "tests/json_addition_test.rb".freeze, "tests/json_common_interface_test.rb".freeze, "tests/json_encoding_test.rb".freeze, "tests/json_ext_parser_test.rb".freeze, "tests/json_fixtures_test.rb".freeze, "tests/json_generator_test.rb".freeze, "tests/json_generic_object_test.rb".freeze, "tests/json_parser_test.rb".freeze, "tests/json_string_matching_test.rb".freeze, "tests/test_helper.rb".freeze, "tools/diff.sh".freeze, "tools/fuzz.rb".freeze, "tools/server.rb".freeze]
|
14
|
+
s.homepage = "http://flori.github.com/json".freeze
|
15
|
+
s.licenses = ["Ruby".freeze]
|
16
|
+
s.rdoc_options = ["--title".freeze, "JSON implemention for ruby".freeze, "--main".freeze, "README.md".freeze]
|
17
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
|
18
|
+
s.rubygems_version = "3.1.2".freeze
|
19
|
+
s.summary = "JSON Implementation for Ruby".freeze
|
20
|
+
s.test_files = ["./tests/test_helper.rb".freeze]
|
22
21
|
|
23
22
|
if s.respond_to? :specification_version then
|
24
23
|
s.specification_version = 4
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
|
30
|
-
else
|
31
|
-
s.add_dependency(%q<permutation>, [">= 0"])
|
32
|
-
s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
|
33
|
-
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
34
|
-
end
|
26
|
+
if s.respond_to? :add_runtime_dependency then
|
27
|
+
s.add_development_dependency(%q<rake>.freeze, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<test-unit>.freeze, [">= 2.0", "< 4.0"])
|
35
29
|
else
|
36
|
-
s.add_dependency(%q<
|
37
|
-
s.add_dependency(%q<
|
38
|
-
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
30
|
+
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
31
|
+
s.add_dependency(%q<test-unit>.freeze, [">= 2.0", "< 4.0"])
|
39
32
|
end
|
40
33
|
end
|
data/lib/json/add/bigdecimal.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
#frozen_string_literal: false
|
1
2
|
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
|
2
3
|
require 'json'
|
3
4
|
end
|
@@ -22,7 +23,7 @@ class BigDecimal
|
|
22
23
|
end
|
23
24
|
|
24
25
|
# return the JSON value
|
25
|
-
def to_json(*)
|
26
|
-
as_json.to_json
|
26
|
+
def to_json(*args)
|
27
|
+
as_json.to_json(*args)
|
27
28
|
end
|
28
29
|
end
|
data/lib/json/add/complex.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
+
#frozen_string_literal: false
|
1
2
|
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
|
2
3
|
require 'json'
|
3
4
|
end
|
4
|
-
defined?(::Complex) or require 'complex'
|
5
5
|
|
6
6
|
class Complex
|
7
7
|
|
@@ -22,7 +22,7 @@ class Complex
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# Stores class name (Complex) along with real value <tt>r</tt> and imaginary value <tt>i</tt> as JSON string
|
25
|
-
def to_json(*)
|
26
|
-
as_json.to_json
|
25
|
+
def to_json(*args)
|
26
|
+
as_json.to_json(*args)
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
data/lib/json/add/core.rb
CHANGED
data/lib/json/add/date.rb
CHANGED
data/lib/json/add/date_time.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
+
#frozen_string_literal: false
|
1
2
|
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
|
2
3
|
require 'json'
|
3
4
|
end
|
4
5
|
require 'date'
|
5
6
|
|
6
|
-
# DateTime serialization/deserialization
|
7
7
|
class DateTime
|
8
8
|
|
9
9
|
# Deserializes JSON string by converting year <tt>y</tt>, month <tt>m</tt>,
|
data/lib/json/add/exception.rb
CHANGED