From b14c060ddabfad99deff3e56d847034f7d0946be Mon Sep 17 00:00:00 2001 From: naruse Date: Tue, 30 Aug 2011 02:23:12 +0000 Subject: * ext/json: Merge json gem 1.5.4+ (2149f4185c598fb97db1). [Bug #5173] [ruby-core:38866] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33122 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/json/lib/json/add/core.rb | 42 ++++++++++++++++++++-- ext/json/lib/json/common.rb | 82 +++++++++++++++++++++++++------------------ ext/json/lib/json/ext.rb | 17 ++------- 3 files changed, 89 insertions(+), 52 deletions(-) (limited to 'ext/json/lib/json') diff --git a/ext/json/lib/json/add/core.rb b/ext/json/lib/json/add/core.rb index e9850af8f6..fde53a4d01 100644 --- a/ext/json/lib/json/add/core.rb +++ b/ext/json/lib/json/add/core.rb @@ -5,6 +5,8 @@ unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED require 'json' end require 'date' +require 'complex' +require 'rational' # Symbol serialization/deserialization class Symbol @@ -230,8 +232,8 @@ class Regexp def as_json(*) { JSON.create_id => self.class.name, - 'o' => options, - 's' => source, + 'o' => options, + 's' => source, } end @@ -241,3 +243,39 @@ class Regexp as_json.to_json end end + +class Rational + def self.json_create(object) + Rational(object['n'], object['d']) + end + + def as_json(*) + { + JSON.create_id => self.class.name, + 'n' => numerator, + 'd' => denominator, + } + end + + def to_json(*) + as_json.to_json + end +end + +class Complex + def self.json_create(object) + Complex(object['r'], object['i']) + end + + def as_json(*) + { + JSON.create_id => self.class.name, + 'r' => real, + 'i' => imag, + } + end + + def to_json(*) + as_json.to_json + end +end diff --git a/ext/json/lib/json/common.rb b/ext/json/lib/json/common.rb index 1a5f0481e8..43e249c954 100644 --- a/ext/json/lib/json/common.rb +++ b/ext/json/lib/json/common.rb @@ -2,11 +2,11 @@ require 'json/version' module JSON class << self - # If _object_ is string-like parse the string and return the parsed result + # If _object_ is string-like, parse the string and return the parsed result # as a Ruby data structure. Otherwise generate a JSON text from the Ruby # data structure object and return it. # - # The _opts_ argument is passed through to generate/parse respectively, see + # The _opts_ argument is passed through to generate/parse respectively. See # generate and parse for their documentation. def [](object, opts = {}) if object.respond_to? :to_str @@ -16,7 +16,7 @@ module JSON end end - # Returns the JSON parser class, that is used by JSON. This might be either + # Returns the JSON parser class that is used by JSON. This is either # JSON::Ext::Parser or JSON::Pure::Parser. attr_reader :parser @@ -28,7 +28,7 @@ module JSON end # Return the constant located at _path_. The format of _path_ has to be - # either ::A::B::C or A::B::C. In any case A has to be located at the top + # either ::A::B::C or A::B::C. In any case, A has to be located at the top # level (absolute namespace path?). If there doesn't exist a constant at # the given path, an ArgumentError is raised. def deep_const_get(path) # :nodoc: @@ -81,15 +81,15 @@ module JSON $VERBOSE = old end - # Returns the JSON generator modul, that is used by JSON. This might be + # Returns the JSON generator module that is used by JSON. This is # either JSON::Ext::Generator or JSON::Pure::Generator. attr_reader :generator - # Returns the JSON generator state class, that is used by JSON. This might - # be either JSON::Ext::Generator::State or JSON::Pure::Generator::State. + # Returns the JSON generator state class that is used by JSON. This is + # either JSON::Ext::Generator::State or JSON::Pure::Generator::State. attr_accessor :state - # This is create identifier, that is used to decide, if the _json_create_ + # This is create identifier, which is used to decide if the _json_create_ # hook of a class should be called. It defaults to 'json_class'. attr_accessor :create_id end @@ -104,10 +104,10 @@ module JSON # The base exception for JSON errors. class JSONError < StandardError; end - # This exception is raised, if a parser error occurs. + # This exception is raised if a parser error occurs. class ParserError < JSONError; end - # This exception is raised, if the nesting of parsed datastructures is too + # This exception is raised if the nesting of parsed data structures is too # deep. class NestingError < ParserError; end @@ -115,13 +115,13 @@ module JSON class CircularDatastructure < NestingError; end # :startdoc: - # This exception is raised, if a generator or unparser error occurs. + # This exception is raised if a generator or unparser error occurs. class GeneratorError < JSONError; end # For backwards compatibility UnparserError = GeneratorError - # This exception is raised, if the required unicode support is missing on the - # system. Usually this means, that the iconv library is not installed. + # This exception is raised if the required unicode support is missing on the + # system. Usually this means that the iconv library is not installed. class MissingUnicodeSupport < JSONError; end module_function @@ -131,16 +131,16 @@ module JSON # _opts_ can have the following # keys: # * *max_nesting*: The maximum depth of nesting allowed in the parsed data - # structures. Disable depth checking with :max_nesting => false, it defaults + # structures. Disable depth checking with :max_nesting => false. It defaults # to 19. # * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in # defiance of RFC 4627 to be parsed by the Parser. This option defaults # to false. # * *symbolize_names*: If set to true, returns symbols for the names - # (keys) in a JSON object. Otherwise strings are returned, which is also + # (keys) in a JSON object. Otherwise strings are returned. Strings are # the default. # * *create_additions*: If set to false, the Parser doesn't create - # additions even if a matchin class and create_id was found. This option + # additions even if a matching class and create_id was found. This option # defaults to true. # * *object_class*: Defaults to Hash # * *array_class*: Defaults to Array @@ -149,19 +149,19 @@ module JSON end # Parse the JSON document _source_ into a Ruby data structure and return it. - # The bang version of the parse method, defaults to the more dangerous values + # The bang version of the parse method defaults to the more dangerous values # for the _opts_ hash, so be sure only to parse trusted _source_ documents. # # _opts_ can have the following keys: # * *max_nesting*: The maximum depth of nesting allowed in the parsed data # structures. Enable depth checking with :max_nesting => anInteger. The parse! - # methods defaults to not doing max depth checking: This can be dangerous, + # methods defaults to not doing max depth checking: This can be dangerous # if someone wants to fill up your stack. # * *allow_nan*: If set to true, allow NaN, Infinity, and -Infinity in # defiance of RFC 4627 to be parsed by the Parser. This option defaults # to true. # * *create_additions*: If set to false, the Parser doesn't create - # additions even if a matchin class and create_id was found. This option + # additions even if a matching class and create_id was found. This option # defaults to true. def parse!(source, opts = {}) opts = { @@ -188,7 +188,7 @@ module JSON # * *object_nl*: a string that is put at the end of a JSON object (default: ''), # * *array_nl*: a string that is put at the end of a JSON array (default: ''), # * *allow_nan*: true if NaN, Infinity, and -Infinity should be - # generated, otherwise an exception is thrown, if these values are + # generated, otherwise an exception is thrown if these values are # encountered. This options defaults to false. # * *max_nesting*: The maximum depth of nesting allowed in the data # structures from which JSON is to be generated. Disable depth checking @@ -196,9 +196,13 @@ module JSON # # See also the fast_generate for the fastest creation method with the least # amount of sanity checks, and the pretty_generate method for some - # defaults for a pretty output. + # defaults for pretty output. def generate(obj, opts = nil) - state = SAFE_STATE_PROTOTYPE.dup + if State === opts + state, opts = opts, nil + else + state = SAFE_STATE_PROTOTYPE.dup + end if opts if opts.respond_to? :to_hash opts = opts.to_hash @@ -223,9 +227,13 @@ module JSON # This method disables the checks for circles in Ruby objects. # # *WARNING*: Be careful not to pass any Ruby data structures with circles as - # _obj_ argument, because this will cause JSON to go into an infinite loop. + # _obj_ argument because this will cause JSON to go into an infinite loop. def fast_generate(obj, opts = nil) - state = FAST_STATE_PROTOTYPE.dup + if State === opts + state, opts = opts, nil + else + state = FAST_STATE_PROTOTYPE.dup + end if opts if opts.respond_to? :to_hash opts = opts.to_hash @@ -249,10 +257,14 @@ module JSON # The returned document is a prettier form of the document returned by # #unparse. # - # The _opts_ argument can be used to configure the generator, see the + # The _opts_ argument can be used to configure the generator. See the # generate method for a more detailed explanation. def pretty_generate(obj, opts = nil) - state = PRETTY_STATE_PROTOTYPE.dup + if State === opts + state, opts = opts, nil + else + state = PRETTY_STATE_PROTOTYPE.dup + end if opts if opts.respond_to? :to_hash opts = opts.to_hash @@ -273,7 +285,7 @@ module JSON # :startdoc: # Load a ruby data structure from a JSON _source_ and return it. A source can - # either be a string-like object, an IO like object, or an object responding + # either be a string-like object, an IO-like object, or an object responding # to the read method. If _proc_ was given, it will be called with any nested # Ruby object as an argument recursively in depth first order. # @@ -312,10 +324,10 @@ module JSON # Dumps _obj_ as a JSON string, i.e. calls generate on the object and returns # the result. # - # If anIO (an IO like object or an object that responds to the write method) + # If anIO (an IO-like object or an object that responds to the write method) # was given, the resulting JSON is written to it. # - # If the number of nested arrays or objects exceeds _limit_ an ArgumentError + # If the number of nested arrays or objects exceeds _limit_, an ArgumentError # exception is raised. This argument is similar (but not exactly the # same!) to the _limit_ argument in Marshal.dump. # @@ -396,11 +408,11 @@ module ::Kernel nil end - # If _object_ is string-like parse the string and return the parsed result as - # a Ruby data structure. Otherwise generate a JSON text from the Ruby data + # If _object_ is string-like, parse the string and return the parsed result as + # a Ruby data structure. Otherwise, generate a JSON text from the Ruby data # structure object and return it. # - # The _opts_ argument is passed through to generate/parse respectively, see + # The _opts_ argument is passed through to generate/parse respectively. See # generate and parse for their documentation. def JSON(object, *args) if object.respond_to? :to_str @@ -413,10 +425,10 @@ end # Extends any Class to include _json_creatable?_ method. class ::Class - # Returns true, if this class can be used to create an instance + # Returns true if this class can be used to create an instance # from a serialised JSON string. The class has to implement a class - # method _json_create_ that expects a hash as first parameter, which includes - # the required data. + # method _json_create_ that expects a hash as first parameter. The hash + # should include the required data. def json_creatable? respond_to?(:json_create) end diff --git a/ext/json/lib/json/ext.rb b/ext/json/lib/json/ext.rb index 1fbc3fd7d1..7264a857fa 100644 --- a/ext/json/lib/json/ext.rb +++ b/ext/json/lib/json/ext.rb @@ -4,21 +4,8 @@ module JSON # This module holds all the modules/classes that implement JSON's # functionality as C extensions. module Ext - begin - if defined?(RUBY_ENGINE) == 'constant' and RUBY_ENGINE == 'ruby' and RUBY_VERSION =~ /\A1\.9\./ - require 'json/ext/1.9/parser' - require 'json/ext/1.9/generator' - elsif !defined?(RUBY_ENGINE) && RUBY_VERSION =~ /\A1\.8\./ - require 'json/ext/1.8/parser' - require 'json/ext/1.8/generator' - else - require 'json/ext/parser' - require 'json/ext/generator' - end - rescue LoadError - require 'json/ext/parser' - require 'json/ext/generator' - end + require 'json/ext/parser' + require 'json/ext/generator' $DEBUG and warn "Using Ext extension for JSON." JSON.parser = Parser JSON.generator = Generator -- cgit v1.2.3