summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2012-08-18 16:38:19 +0200
committerFlorian Frank <flori@ping.de>2012-08-18 16:38:19 +0200
commit477f0831549111bae1083fe16b95e3745b681b02 (patch)
treeb8d9992c7fa624a767fb293871235638834e2cee
parentb2d6ee41bc6c28a44472d858f935617950447fe1 (diff)
downloadjson-477f0831549111bae1083fe16b95e3745b681b02.tar.gz
Implement lambda replacer
-rw-r--r--json.gemspec2
-rw-r--r--json_pure.gemspec2
-rw-r--r--lib/json/pure/generator.rb35
-rwxr-xr-xtests/test_json_generate.rb3
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