Hello community, here is the log from the commit of package rubygem-json for openSUSE:Factory checked in at 2019-12-14 12:21:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-json (Old) and /work/SRC/openSUSE:Factory/.rubygem-json.new.4691 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-json" Sat Dec 14 12:21:48 2019 rev:26 rq:756944 version:2.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-json/rubygem-json.changes 2019-06-19 21:00:14.702080229 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-json.new.4691/rubygem-json.changes 2019-12-14 12:23:59.279193809 +0100 @@ -1,0 +2,7 @@ +Sat Dec 14 00:35:01 UTC 2019 - Manuel Schnitzer <mschnit...@suse.com> + +- updated to version 2.3.0 + + see installed CHANGES.md + +------------------------------------------------------------------- Old: ---- json-2.2.0.gem New: ---- json-2.3.0.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-json.spec ++++++ --- /var/tmp/diff_new_pack.fO7frv/_old 2019-12-14 12:24:00.091193687 +0100 +++ /var/tmp/diff_new_pack.fO7frv/_new 2019-12-14 12:24:00.095193687 +0100 @@ -24,7 +24,7 @@ # Name: rubygem-json -Version: 2.2.0 +Version: 2.3.0 Release: 0 %define mod_name json %define mod_full_name %{mod_name}-%{version} @@ -50,7 +50,7 @@ %install %gem_install \ - --doc-files="CHANGES.md README.md" \ + --doc-files="CHANGES.md LICENSE README.md" \ -f %gem_cleanup ++++++ json-2.2.0.gem -> json-2.3.0.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 2019-02-21 23:15:38.000000000 +0100 +++ new/.gitignore 2019-12-11 15:51:12.000000000 +0100 @@ -15,3 +15,4 @@ */**/Makefile */**/*.o .byebug_history +*.log diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.travis.yml new/.travis.yml --- old/.travis.yml 2019-02-21 23:15:38.000000000 +0100 +++ new/.travis.yml 2019-12-11 15:51:12.000000000 +0100 @@ -4,7 +4,6 @@ # Specify which ruby versions you wish to run your tests on, each version will be used rvm: - - 1.9.3 - 2.0.0 - 2.1 - 2.2 @@ -12,12 +11,14 @@ - 2.4 - 2.5 - 2.6 + - 2.7.0-preview3 - ruby-head - jruby + - jruby-9.2.7.0 matrix: allow_failures: - - rvm: 1.9.3 - rvm: ruby-head - rvm: jruby + - rvm: jruby-9.2.7.0 script: "bundle exec rake" sudo: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/LICENSE new/LICENSE --- old/LICENSE 1970-01-01 01:00:00.000000000 +0100 +++ new/LICENSE 2019-12-11 15:51:12.000000000 +0100 @@ -0,0 +1,56 @@ +Ruby is copyrighted free software by Yukihiro Matsumoto <m...@netlab.jp>. +You can redistribute it and/or modify it under either the terms of the +2-clause BSDL (see the file BSDL), or the conditions below: + + 1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + + 2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b) use the modified software only within your corporation or + organization. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a) distribute the binaries and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b) accompany the distribution with the machine-readable source of + the software. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + + 5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + + 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2019-02-21 23:15:38.000000000 +0100 +++ new/README.md 2019-12-11 15:51:12.000000000 +0100 @@ -406,4 +406,4 @@ Online Documentation should be located at -* http://json.rubyforge.org +* https://www.rubydoc.info/gems/json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Rakefile new/Rakefile --- old/Rakefile 2019-02-21 23:15:38.000000000 +0100 +++ new/Rakefile 2019-12-11 15:51:12.000000000 +0100 @@ -23,8 +23,13 @@ def desc(*) end end -MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') } -BUNDLE = ENV['BUNDLE'] || %w[bundle].find { |c| system(c, '-v') } +which = lambda { |c| + w = `which #{c}` + break w.chomp unless w.empty? +} + +MAKE = ENV['MAKE'] || %w[gmake make].find(&which) +BUNDLE = ENV['BUNDLE'] || %w[bundle].find(&which) PKG_NAME = 'json' PKG_TITLE = 'JSON Implementation for Ruby' PKG_VERSION = File.read('VERSION').chomp @@ -47,8 +52,8 @@ JRUBY_PARSER_JAR = File.expand_path("lib/json/ext/parser.jar") JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar") -RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') } -RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') } +RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find(&which) +RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find(&which) desc "Installing library (pure)" task :install_pure => :version do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/VERSION new/VERSION --- old/VERSION 2019-02-21 23:15:38.000000000 +0100 +++ new/VERSION 2019-12-11 15:51:12.000000000 +0100 @@ -1 +1 @@ -2.2.0 +2.3.0 Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/json/ext/generator/generator.c new/ext/json/ext/generator/generator.c --- old/ext/json/ext/generator/generator.c 2019-02-21 23:15:38.000000000 +0100 +++ new/ext/json/ext/generator/generator.c 2019-12-11 15:51:12.000000000 +0100 @@ -15,7 +15,7 @@ #endif mFloat, mString, mString_Extend, mTrueClass, mFalseClass, mNilClass, eGeneratorError, - eNestingError, CRegexp_MULTILINE, CJSON_SAFE_STATE_PROTOTYPE, + eNestingError, i_SAFE_STATE_PROTOTYPE; static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before, @@ -237,6 +237,7 @@ int escape_len; unsigned char c; char buf[6] = { '\\', 'u' }; + int ascii_only = rb_enc_str_asciionly_p(string); for (start = 0, end = 0; end < len;) { p = ptr + end; @@ -281,14 +282,17 @@ break; default: { - unsigned short clen = trailingBytesForUTF8[c] + 1; - if (end + clen > len) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "partial character in source, but hit end"); - } - if (!isLegalUTF8((UTF8 *) p, clen)) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); + unsigned short clen = 1; + if (!ascii_only) { + clen += trailingBytesForUTF8[c]; + if (end + clen > len) { + rb_raise(rb_path2class("JSON::GeneratorError"), + "partial character in source, but hit end"); + } + if (!isLegalUTF8((UTF8 *) p, clen)) { + rb_raise(rb_path2class("JSON::GeneratorError"), + "source sequence is illegal/malformed utf-8"); + } } end += clen; } @@ -692,7 +696,7 @@ if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) { return rb_funcall(self, i_send, 1, name); } else { - return rb_ivar_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name))); + return rb_attr_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name))); } } @@ -715,43 +719,83 @@ return Qnil; } -static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) +struct hash_foreach_arg { + FBuffer *buffer; + JSON_Generator_State *state; + VALUE Vstate; + int iter; +}; + +static int +json_object_i(VALUE key, VALUE val, VALUE _arg) { + struct hash_foreach_arg *arg = (struct hash_foreach_arg *)_arg; + FBuffer *buffer = arg->buffer; + JSON_Generator_State *state = arg->state; + VALUE Vstate = arg->Vstate; + char *object_nl = state->object_nl; long object_nl_len = state->object_nl_len; char *indent = state->indent; long indent_len = state->indent_len; - long max_nesting = state->max_nesting; char *delim = FBUFFER_PTR(state->object_delim); long delim_len = FBUFFER_LEN(state->object_delim); char *delim2 = FBUFFER_PTR(state->object_delim2); long delim2_len = FBUFFER_LEN(state->object_delim2); + long depth = state->depth; + int j; + VALUE klass, key_to_s; + + if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len); + if (object_nl) { + fbuffer_append(buffer, object_nl, object_nl_len); + } + if (indent) { + for (j = 0; j < depth; j++) { + fbuffer_append(buffer, indent, indent_len); + } + } + + klass = CLASS_OF(key); + if (klass == rb_cString) { + key_to_s = key; + } else if (klass == rb_cSymbol) { + key_to_s = rb_id2str(SYM2ID(key)); + } else { + key_to_s = rb_funcall(key, i_to_s, 0); + } + Check_Type(key_to_s, T_STRING); + generate_json(buffer, Vstate, state, key_to_s); + fbuffer_append(buffer, delim2, delim2_len); + generate_json(buffer, Vstate, state, val); + + arg->iter++; + return ST_CONTINUE; +} + +static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) +{ + char *object_nl = state->object_nl; + long object_nl_len = state->object_nl_len; + char *indent = state->indent; + long indent_len = state->indent_len; + long max_nesting = state->max_nesting; long depth = ++state->depth; - int i, j; - VALUE key, key_to_s, keys; + int j; + struct hash_foreach_arg arg; + if (max_nesting != 0 && depth > max_nesting) { fbuffer_free(buffer); rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth); } fbuffer_append_char(buffer, '{'); - keys = rb_funcall(obj, i_keys, 0); - for(i = 0; i < RARRAY_LEN(keys); i++) { - if (i > 0) fbuffer_append(buffer, delim, delim_len); - if (object_nl) { - fbuffer_append(buffer, object_nl, object_nl_len); - } - if (indent) { - for (j = 0; j < depth; j++) { - fbuffer_append(buffer, indent, indent_len); - } - } - key = rb_ary_entry(keys, i); - key_to_s = rb_funcall(key, i_to_s, 0); - Check_Type(key_to_s, T_STRING); - generate_json(buffer, Vstate, state, key_to_s); - fbuffer_append(buffer, delim2, delim2_len); - generate_json(buffer, Vstate, state, rb_hash_aref(obj, key)); - } + + arg.buffer = buffer; + arg.state = state; + arg.Vstate = Vstate; + arg.iter = 0; + rb_hash_foreach(obj, json_object_i, (VALUE)&arg); + depth = --state->depth; if (object_nl) { fbuffer_append(buffer, object_nl, object_nl_len); @@ -802,11 +846,22 @@ fbuffer_append_char(buffer, ']'); } +#ifdef HAVE_RUBY_ENCODING_H +static int enc_utf8_compatible_p(rb_encoding *enc) +{ + if (enc == rb_usascii_encoding()) return 1; + if (enc == rb_utf8_encoding()) return 1; + return 0; +} +#endif + static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) { fbuffer_append_char(buffer, '"'); #ifdef HAVE_RUBY_ENCODING_H - obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8); + if (!enc_utf8_compatible_p(rb_enc_get(obj))) { + obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil); + } #endif if (state->ascii_only) { convert_UTF8_to_JSON_ASCII(buffer, obj); @@ -970,6 +1025,8 @@ * * *allow_nan*: true if NaN, Infinity, and -Infinity should be * generated, otherwise an exception is thrown, if these values are * encountered. This options defaults to false. + * * *ascii_only*: true if only ASCII characters should be generated. This + * ontions defaults to false. * * *buffer_initial_length*: sets the initial length of the generator's * internal buffer. */ @@ -1025,10 +1082,8 @@ } else if (rb_obj_is_kind_of(opts, rb_cHash)) { return rb_funcall(self, i_new, 1, opts); } else { - if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) { - CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE); - } - return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0); + VALUE prototype = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE); + return rb_funcall(prototype, i_dup, 0); } } @@ -1267,7 +1322,7 @@ /* * call-seq: ascii_only? * - * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise + * Returns true, if only ASCII characters should be generated. Otherwise * returns false. */ static VALUE cState_ascii_only_p(VALUE self) @@ -1344,6 +1399,8 @@ eGeneratorError = rb_path2class("JSON::GeneratorError"); eNestingError = rb_path2class("JSON::NestingError"); + rb_gc_register_mark_object(eGeneratorError); + rb_gc_register_mark_object(eNestingError); cState = rb_define_class_under(mGenerator, "State", rb_cObject); rb_define_alloc_func(cState, cState_s_allocate); @@ -1409,7 +1466,6 @@ mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass"); rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1); - CRegexp_MULTILINE = rb_const_get(rb_cRegexp, rb_intern("MULTILINE")); i_to_s = rb_intern("to_s"); i_to_json = rb_intern("to_json"); i_new = rb_intern("new"); @@ -1440,5 +1496,4 @@ i_encode = rb_intern("encode"); #endif i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE"); - CJSON_SAFE_STATE_PROTOTYPE = Qnil; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/json/ext/parser/parser.c new/ext/json/ext/parser/parser.c --- old/ext/json/ext/parser/parser.c 2019-02-21 23:15:38.000000000 +0100 +++ new/ext/json/ext/parser/parser.c 2019-12-11 15:51:12.000000000 +0100 @@ -27,7 +27,7 @@ /* unicode */ -static const char digit_values[256] = { +static const signed char digit_values[256] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, @@ -46,7 +46,7 @@ static UTF32 unescape_unicode(const unsigned char *p) { - char b; + signed char b; UTF32 result = 0; b = digit_values[p[0]]; if (b < 0) return UNI_REPLACEMENT_CHAR; @@ -1676,10 +1676,8 @@ if (json->symbolize_names && json->parsing_name) { *result = rb_str_intern(*result); - } else { - if (RB_TYPE_P(*result, T_STRING)) { - rb_str_resize(*result, RSTRING_LEN(*result)); - } + } else if (RB_TYPE_P(*result, T_STRING)) { + rb_str_resize(*result, RSTRING_LEN(*result)); } if (cs >= JSON_string_first_final) { return p + 1; @@ -1835,7 +1833,7 @@ } else { json->max_nesting = 100; json->allow_nan = 0; - json->create_additions = 1; + json->create_additions = 0; json->create_id = rb_funcall(mJSON, i_create_id, 0); json->object_class = Qnil; json->array_class = Qnil; @@ -1850,7 +1848,7 @@ } -#line 1854 "parser.c" +#line 1852 "parser.c" enum {JSON_start = 1}; enum {JSON_first_final = 10}; enum {JSON_error = 0}; @@ -1858,7 +1856,7 @@ enum {JSON_en_main = 1}; -#line 762 "parser.rl" +#line 760 "parser.rl" /* @@ -1875,16 +1873,16 @@ GET_PARSER; -#line 1879 "parser.c" +#line 1877 "parser.c" { cs = JSON_start; } -#line 778 "parser.rl" +#line 776 "parser.rl" p = json->source; pe = p + json->len; -#line 1888 "parser.c" +#line 1886 "parser.c" { if ( p == pe ) goto _test_eof; @@ -1918,7 +1916,7 @@ cs = 0; goto _out; tr2: -#line 754 "parser.rl" +#line 752 "parser.rl" { char *np = JSON_parse_value(json, p, pe, &result, 0); if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;} @@ -1928,7 +1926,7 @@ if ( ++p == pe ) goto _test_eof10; case 10: -#line 1932 "parser.c" +#line 1930 "parser.c" switch( (*p) ) { case 13: goto st10; case 32: goto st10; @@ -2017,7 +2015,7 @@ _out: {} } -#line 781 "parser.rl" +#line 779 "parser.rl" if (cs >= JSON_first_final && p == pe) { return result; @@ -2091,14 +2089,21 @@ cParser = rb_define_class_under(mExt, "Parser", rb_cObject); eParserError = rb_path2class("JSON::ParserError"); eNestingError = rb_path2class("JSON::NestingError"); + rb_gc_register_mark_object(eParserError); + rb_gc_register_mark_object(eNestingError); rb_define_alloc_func(cParser, cJSON_parser_s_allocate); rb_define_method(cParser, "initialize", cParser_initialize, -1); rb_define_method(cParser, "parse", cParser_parse, 0); rb_define_method(cParser, "source", cParser_source, 0); CNaN = rb_const_get(mJSON, rb_intern("NaN")); + rb_gc_register_mark_object(CNaN); + CInfinity = rb_const_get(mJSON, rb_intern("Infinity")); + rb_gc_register_mark_object(CInfinity); + CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity")); + rb_gc_register_mark_object(CMinusInfinity); i_json_creatable_p = rb_intern("json_creatable?"); i_json_create = rb_intern("json_create"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/json/ext/parser/parser.rl new/ext/json/ext/parser/parser.rl --- old/ext/json/ext/parser/parser.rl 2019-02-21 23:15:38.000000000 +0100 +++ new/ext/json/ext/parser/parser.rl 2019-12-11 15:51:12.000000000 +0100 @@ -25,7 +25,7 @@ /* unicode */ -static const char digit_values[256] = { +static const signed char digit_values[256] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, @@ -44,7 +44,7 @@ static UTF32 unescape_unicode(const unsigned char *p) { - char b; + signed char b; UTF32 result = 0; b = digit_values[p[0]]; if (b < 0) return UNI_REPLACEMENT_CHAR; @@ -571,10 +571,8 @@ if (json->symbolize_names && json->parsing_name) { *result = rb_str_intern(*result); - } else { - if (RB_TYPE_P(*result, T_STRING)) { - rb_str_resize(*result, RSTRING_LEN(*result)); - } + } else if (RB_TYPE_P(*result, T_STRING)) { + rb_str_resize(*result, RSTRING_LEN(*result)); } if (cs >= JSON_string_first_final) { return p + 1; @@ -730,7 +728,7 @@ } else { json->max_nesting = 100; json->allow_nan = 0; - json->create_additions = 1; + json->create_additions = 0; json->create_id = rb_funcall(mJSON, i_create_id, 0); json->object_class = Qnil; json->array_class = Qnil; @@ -851,14 +849,21 @@ cParser = rb_define_class_under(mExt, "Parser", rb_cObject); eParserError = rb_path2class("JSON::ParserError"); eNestingError = rb_path2class("JSON::NestingError"); + rb_gc_register_mark_object(eParserError); + rb_gc_register_mark_object(eNestingError); rb_define_alloc_func(cParser, cJSON_parser_s_allocate); rb_define_method(cParser, "initialize", cParser_initialize, -1); rb_define_method(cParser, "parse", cParser_parse, 0); rb_define_method(cParser, "source", cParser_source, 0); CNaN = rb_const_get(mJSON, rb_intern("NaN")); + rb_gc_register_mark_object(CNaN); + CInfinity = rb_const_get(mJSON, rb_intern("Infinity")); + rb_gc_register_mark_object(CInfinity); + CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity")); + rb_gc_register_mark_object(CMinusInfinity); i_json_creatable_p = rb_intern("json_creatable?"); i_json_create = rb_intern("json_create"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/java/src/json/ext/Generator.java new/java/src/json/ext/Generator.java --- old/java/src/json/ext/Generator.java 2019-02-21 23:15:38.000000000 +0100 +++ new/java/src/json/ext/Generator.java 2019-12-11 15:51:12.000000000 +0100 @@ -7,6 +7,7 @@ import org.jruby.Ruby; import org.jruby.RubyArray; +import org.jruby.RubyBasicObject; import org.jruby.RubyBignum; import org.jruby.RubyBoolean; import org.jruby.RubyClass; @@ -15,6 +16,7 @@ import org.jruby.RubyHash; import org.jruby.RubyNumeric; import org.jruby.RubyString; +import org.jruby.runtime.ClassIndex; import org.jruby.runtime.ThreadContext; import org.jruby.runtime.builtin.IRubyObject; import org.jruby.util.ByteList; @@ -57,6 +59,19 @@ return handler.generateNew(session, object); } + // NOTE: drop this once Ruby 1.9.3 support is gone! + private static final int FIXNUM = 1; + private static final int BIGNUM = 2; + private static final int ARRAY = 3; + private static final int STRING = 4; + private static final int NIL = 5; + private static final int TRUE = 6; + private static final int FALSE = 7; + private static final int HASH = 10; + private static final int FLOAT = 11; + // hard-coded due JRuby 1.7 compatibility + // https://github.com/jruby/jruby/blob/1.7.27/core/src/main/java/org/jruby/runtime/ClassIndex.java + /** * Returns the best serialization handler for the given object. */ @@ -65,16 +80,24 @@ @SuppressWarnings("unchecked") private static <T extends IRubyObject> Handler<? super T> getHandlerFor(Ruby runtime, T object) { - RubyClass metaClass = object.getMetaClass(); - if (metaClass == runtime.getString()) return (Handler)STRING_HANDLER; - if (metaClass == runtime.getFixnum()) return (Handler)FIXNUM_HANDLER; - if (metaClass == runtime.getHash()) return (Handler)HASH_HANDLER; - if (metaClass == runtime.getArray()) return (Handler)ARRAY_HANDLER; - if (object.isNil()) return (Handler)NIL_HANDLER; - if (object == runtime.getTrue()) return (Handler)TRUE_HANDLER; - if (object == runtime.getFalse()) return (Handler)FALSE_HANDLER; - if (metaClass == runtime.getFloat()) return (Handler)FLOAT_HANDLER; - if (metaClass == runtime.getBignum()) return (Handler)BIGNUM_HANDLER; + switch (((RubyBasicObject) object).getNativeTypeIndex()) { + // can not use getNativeClassIndex due 1.7 compatibility + case NIL : return (Handler) NIL_HANDLER; + case TRUE : return (Handler) TRUE_HANDLER; + case FALSE : return (Handler) FALSE_HANDLER; + case FLOAT : return (Handler) FLOAT_HANDLER; + case FIXNUM : return (Handler) FIXNUM_HANDLER; + case BIGNUM : return (Handler) BIGNUM_HANDLER; + case STRING : + if (((RubyBasicObject) object).getMetaClass() != runtime.getString()) break; + return (Handler) STRING_HANDLER; + case ARRAY : + if (((RubyBasicObject) object).getMetaClass() != runtime.getArray()) break; + return (Handler) ARRAY_HANDLER; + case HASH : + if (((RubyBasicObject) object).getMetaClass() != runtime.getHash()) break; + return (Handler) HASH_HANDLER; + } return GENERIC_HANDLER; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/json-java.gemspec new/json-java.gemspec --- old/json-java.gemspec 2019-02-21 23:15:38.000000000 +0100 +++ new/json-java.gemspec 2019-12-11 15:51:12.000000000 +0100 @@ -8,9 +8,8 @@ s.description = "A JSON implementation as a JRuby extension." s.author = "Daniel Luz" s.email = "dev+r...@mernen.com" - s.homepage = "http://json-jruby.rubyforge.org/" + s.homepage = "http://flori.github.com/json" s.platform = 'java' - s.rubyforge_project = "json-jruby" s.licenses = ["Ruby"] s.files = Dir["{docs,lib,tests}/**/*"] Binary files old/json.gemspec and new/json.gemspec differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/json_pure.gemspec new/json_pure.gemspec --- old/json_pure.gemspec 2019-02-21 23:15:38.000000000 +0100 +++ new/json_pure.gemspec 2019-12-11 15:51:12.000000000 +0100 @@ -1,23 +1,23 @@ # -*- encoding: utf-8 -*- -# stub: json_pure 2.2.0 ruby lib +# stub: json_pure 2.3.0 ruby lib Gem::Specification.new do |s| s.name = "json_pure".freeze - s.version = "2.2.0" + s.version = "2.3.0" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["Florian Frank".freeze] - s.date = "2019-02-21" + s.date = "2019-12-11" s.description = "This is a JSON implementation in pure Ruby.".freeze s.email = "fl...@ping.de".freeze s.extra_rdoc_files = ["README.md".freeze] - s.files = ["./tests/test_helper.rb".freeze, ".gitignore".freeze, ".travis.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "README-json-jruby.md".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "data/example.json".freeze, "data/index.html".freeze, "data/prototype.js".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] + 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] s.homepage = "http://flori.github.com/json".freeze s.licenses = ["Ruby".freeze] s.rdoc_options = ["--title".freeze, "JSON implemention for ruby".freeze, "--main".freeze, "README.md".freeze] s.required_ruby_version = Gem::Requirement.new(">= 1.9".freeze) - s.rubygems_version = "2.7.6".freeze + s.rubygems_version = "3.0.3".freeze s.summary = "JSON Implementation for Ruby".freeze s.test_files = ["./tests/test_helper.rb".freeze] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/add/bigdecimal.rb new/lib/json/add/bigdecimal.rb --- old/lib/json/add/bigdecimal.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/add/bigdecimal.rb 2019-12-11 15:51:12.000000000 +0100 @@ -23,7 +23,7 @@ end # return the JSON value - def to_json(*) - as_json.to_json + def to_json(*args) + as_json.to_json(*args) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/add/complex.rb new/lib/json/add/complex.rb --- old/lib/json/add/complex.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/add/complex.rb 2019-12-11 15:51:12.000000000 +0100 @@ -23,7 +23,7 @@ end # Stores class name (Complex) along with real value <tt>r</tt> and imaginary value <tt>i</tt> as JSON string - def to_json(*) - as_json.to_json + def to_json(*args) + as_json.to_json(*args) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/add/rational.rb new/lib/json/add/rational.rb --- old/lib/json/add/rational.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/add/rational.rb 2019-12-11 15:51:12.000000000 +0100 @@ -22,7 +22,7 @@ end # Stores class name (Rational) along with numerator value <tt>n</tt> and denominator value <tt>d</tt> as JSON string - def to_json(*) - as_json.to_json + def to_json(*args) + as_json.to_json(*args) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/add/regexp.rb new/lib/json/add/regexp.rb --- old/lib/json/add/regexp.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/add/regexp.rb 2019-12-11 15:51:12.000000000 +0100 @@ -24,7 +24,7 @@ # Stores class name (Regexp) with options <tt>o</tt> and source <tt>s</tt> # (Regexp or String) as JSON string - def to_json(*) - as_json.to_json + def to_json(*args) + as_json.to_json(*args) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/common.rb new/lib/json/common.rb --- old/lib/json/common.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/common.rb 2019-12-11 15:51:12.000000000 +0100 @@ -153,7 +153,7 @@ # * *object_class*: Defaults to Hash # * *array_class*: Defaults to Array def parse(source, opts = {}) - Parser.new(source, opts).parse + Parser.new(source, **(opts||{})).parse end # Parse the JSON document _source_ into a Ruby data structure and return it. @@ -176,7 +176,7 @@ :max_nesting => false, :allow_nan => true }.merge(opts) - Parser.new(source, opts).parse + Parser.new(source, **(opts||{})).parse end # Generate a JSON document from the Ruby data structure _obj_ and return diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/pure/generator.rb new/lib/json/pure/generator.rb --- old/lib/json/pure/generator.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/pure/generator.rb 2019-12-11 15:51:12.000000000 +0100 @@ -250,7 +250,8 @@ if respond_to?(name) __send__(name) else - instance_variable_get("@#{name}") + instance_variable_get("@#{name}") if + instance_variables.include?("@#{name}".to_sym) # avoid warning end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/pure/parser.rb new/lib/json/pure/parser.rb --- old/lib/json/pure/parser.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/pure/parser.rb 2019-12-11 15:51:12.000000000 +0100 @@ -197,7 +197,15 @@ def parse_value case when scan(FLOAT) - @decimal_class && @decimal_class.new(self[1]) || Float(self[1]) + if @decimal_class then + if @decimal_class == BigDecimal then + BigDecimal(self[1]) + else + @decimal_class.new(self[1]) || Float(self[1]) + end + else + Float(self[1]) + end when scan(INTEGER) Integer(self[1]) when scan(TRUE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/json/version.rb new/lib/json/version.rb --- old/lib/json/version.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/lib/json/version.rb 2019-12-11 15:51:12.000000000 +0100 @@ -1,7 +1,7 @@ # frozen_string_literal: false module JSON # JSON version - VERSION = '2.2.0' + VERSION = '2.3.0' VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc: VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc: VERSION_MINOR = VERSION_ARRAY[1] # :nodoc: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2019-02-21 23:15:38.000000000 +0100 +++ new/metadata 2019-12-11 15:51:12.000000000 +0100 @@ -1,14 +1,14 @@ --- !ruby/object:Gem::Specification name: json version: !ruby/object:Gem::Version - version: 2.2.0 + version: 2.3.0 platform: ruby authors: - Florian Frank autorequire: bindir: bin cert_chain: [] -date: 2019-02-21 00:00:00.000000000 Z +date: 2019-12-11 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: rake @@ -53,6 +53,7 @@ - ".travis.yml" - CHANGES.md - Gemfile +- LICENSE - README-json-jruby.md - README.md - Rakefile @@ -177,7 +178,7 @@ - !ruby/object:Gem::Version version: '0' requirements: [] -rubygems_version: 3.0.2 +rubygems_version: 3.0.3 signing_key: specification_version: 4 summary: JSON Implementation for Ruby diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tests/json_common_interface_test.rb new/tests/json_common_interface_test.rb --- old/tests/json_common_interface_test.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/tests/json_common_interface_test.rb 2019-12-11 15:51:12.000000000 +0100 @@ -27,15 +27,15 @@ end def test_parser - assert_match /::Parser\z/, JSON.parser.name + assert_match(/::Parser\z/, JSON.parser.name) end def test_generator - assert_match /::Generator\z/, JSON.generator.name + assert_match(/::Generator\z/, JSON.generator.name) end def test_state - assert_match /::Generator::State\z/, JSON.state.name + assert_match(/::Generator::State\z/, JSON.state.name) end def test_create_id @@ -56,7 +56,7 @@ end def test_parse_bang - assert_equal [ 1, NaN, 3, ], JSON.parse!('[ 1, NaN, 3 ]') + assert_equal [ 1, Infinity, 3, ], JSON.parse!('[ 1, Infinity, 3 ]') end def test_generate diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tests/json_generator_test.rb new/tests/json_generator_test.rb --- old/tests/json_generator_test.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/tests/json_generator_test.rb 2019-12-11 15:51:12.000000000 +0100 @@ -40,6 +40,44 @@ EOT end + def silence + v = $VERBOSE + $VERBOSE = nil + yield + ensure + $VERBOSE = v + end + + def test_remove_const_segv + return if RUBY_ENGINE == 'jruby' + stress = GC.stress + const = JSON::SAFE_STATE_PROTOTYPE.dup + + bignum_too_long_to_embed_as_string = 1234567890123456789012345 + expect = bignum_too_long_to_embed_as_string.to_s + GC.stress = true + + 10.times do |i| + tmp = bignum_too_long_to_embed_as_string.to_json + raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect + end + + silence do + JSON.const_set :SAFE_STATE_PROTOTYPE, nil + end + + 10.times do |i| + assert_raise TypeError do + bignum_too_long_to_embed_as_string.to_json + end + end + ensure + GC.stress = stress + silence do + JSON.const_set :SAFE_STATE_PROTOTYPE, const + end + end if JSON.const_defined?("Ext") + def test_generate json = generate(@hash) assert_equal(parse(@json2), parse(json)) @@ -374,4 +412,10 @@ assert_equal '["foo"]', JSON.generate([s.new('foo')]) end end + + if defined?(Encoding) + def test_nonutf8_encoding + assert_equal("\"5\u{b0}\"", "5\xb0".force_encoding("iso-8859-1").to_json) + end + end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tests/json_parser_test.rb new/tests/json_parser_test.rb --- old/tests/json_parser_test.rb 2019-02-21 23:15:38.000000000 +0100 +++ new/tests/json_parser_test.rb 2019-12-11 15:51:12.000000000 +0100 @@ -91,27 +91,27 @@ assert_raise(JSON::ParserError) { parse('+23') } assert_raise(JSON::ParserError) { parse('.23') } assert_raise(JSON::ParserError) { parse('023') } - assert_equal 23, parse('23') - assert_equal -23, parse('-23') - assert_equal_float 3.141, parse('3.141') - assert_equal_float -3.141, parse('-3.141') - assert_equal_float 3.141, parse('3141e-3') - assert_equal_float 3.141, parse('3141.1e-3') - assert_equal_float 3.141, parse('3141E-3') - assert_equal_float 3.141, parse('3141.0E-3') - assert_equal_float -3.141, parse('-3141.0e-3') - assert_equal_float -3.141, parse('-3141e-3') + assert_equal(23, parse('23')) + assert_equal(-23, parse('-23')) + assert_equal_float(3.141, parse('3.141')) + assert_equal_float(-3.141, parse('-3.141')) + assert_equal_float(3.141, parse('3141e-3')) + assert_equal_float(3.141, parse('3141.1e-3')) + assert_equal_float(3.141, parse('3141E-3')) + assert_equal_float(3.141, parse('3141.0E-3')) + assert_equal_float(-3.141, parse('-3141.0e-3')) + assert_equal_float(-3.141, parse('-3141e-3')) assert_raise(ParserError) { parse('NaN') } assert parse('NaN', :allow_nan => true).nan? assert_raise(ParserError) { parse('Infinity') } - assert_equal 1.0/0, parse('Infinity', :allow_nan => true) + assert_equal(1.0/0, parse('Infinity', :allow_nan => true)) assert_raise(ParserError) { parse('-Infinity') } - assert_equal -1.0/0, parse('-Infinity', :allow_nan => true) + assert_equal(-1.0/0, parse('-Infinity', :allow_nan => true)) end def test_parse_bigdecimals - assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class) - assert_equal(BigDecimal.new("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] ) + assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class) + assert_equal(BigDecimal("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] ) end if Array.method_defined?(:permutation)