diff options
author | Florian Frank <flori@ping.de> | 2012-08-18 16:38:19 +0200 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2012-08-18 16:38:19 +0200 |
commit | 477f0831549111bae1083fe16b95e3745b681b02 (patch) | |
tree | b8d9992c7fa624a767fb293871235638834e2cee | |
parent | b2d6ee41bc6c28a44472d858f935617950447fe1 (diff) | |
download | json-477f0831549111bae1083fe16b95e3745b681b02.tar.gz |
Implement lambda replacer
-rw-r--r-- | json.gemspec | 2 | ||||
-rw-r--r-- | json_pure.gemspec | 2 | ||||
-rw-r--r-- | lib/json/pure/generator.rb | 35 | ||||
-rwxr-xr-x | tests/test_json_generate.rb | 3 |
4 files changed, 22 insertions, 20 deletions
diff --git a/json.gemspec b/json.gemspec index 39addce..361b27a 100644 --- a/json.gemspec +++ b/json.gemspec @@ -6,7 +6,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Florian Frank"] - s.date = "2012-08-17" + s.date = "2012-08-18" s.description = "This is a JSON implementation as a Ruby extension in C." s.email = "flori@ping.de" s.extensions = ["ext/json/ext/generator/extconf.rb", "ext/json/ext/parser/extconf.rb"] diff --git a/json_pure.gemspec b/json_pure.gemspec index 33b0231..f7f5981 100644 --- a/json_pure.gemspec +++ b/json_pure.gemspec @@ -6,7 +6,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Florian Frank"] - s.date = "2012-08-17" + s.date = "2012-08-18" s.description = "This is a JSON implementation in pure Ruby." s.email = "flori@ping.de" s.extra_rdoc_files = ["README.rdoc"] diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb index f5e7ae6..a93fc4f 100644 --- a/lib/json/pure/generator.rb +++ b/lib/json/pure/generator.rb @@ -210,7 +210,7 @@ module JSON # XXX def replace_nan? - @replace_nan + !!@replace_nan end # Returns true, if only ASCII characters should be generated. Otherwise @@ -282,6 +282,20 @@ module JSON def [](name) __send__ name end + + def handle_not_a_number(value) + if @allow_nan + value.to_s + elsif @replace_nan + if @replace_nan.respond_to?(:call) + @replace_nan.call(value) + else + 'null' + end + else + raise GeneratorError, "#{value} not allowed in JSON" + end + end end module GeneratorMethods @@ -380,23 +394,8 @@ module JSON # Returns a JSON string representation for this Float number. def to_json(state = nil, *) state = State.from_state(state) - case - when infinite? - if state.allow_nan? - to_s - elsif state.replace_nan? - 'null' - else - raise GeneratorError, "#{self} not allowed in JSON" - end - when nan? - if state.allow_nan? - to_s - elsif state.replace_nan? - 'null' - else - raise GeneratorError, "#{self} not allowed in JSON" - end + if infinite? || nan? + state.handle_not_a_number(self) else to_s end diff --git a/tests/test_json_generate.rb b/tests/test_json_generate.rb index 65322d5..7e61a84 100755 --- a/tests/test_json_generate.rb +++ b/tests/test_json_generate.rb @@ -262,5 +262,8 @@ EOT assert_equal '[null]', JSON.generate([ JSON::NaN ], :replace_nan => true) assert_equal '[null]', JSON.generate([ JSON::Infinity ], :replace_nan => true) assert_equal '[null]', JSON.generate([ JSON::MinusInfinity ], :replace_nan => true) + assert_equal '["NaN"]', JSON.generate([ JSON::NaN ], :replace_nan => lambda { |x| x.to_s.inspect }) + assert_equal '["Infinity"]', JSON.generate([ JSON::Infinity ], :replace_nan => lambda { |x| x.to_s.inspect }) + assert_equal '["-Infinity"]', JSON.generate([ JSON::MinusInfinity ], :replace_nan => lambda { |x| x.to_s.inspect }) end end |