From 755a0c813f4c000c29f6e79370f81162ff8052f6 Mon Sep 17 00:00:00 2001 From: Christopher Durtschi Date: Sat, 26 Feb 2011 01:33:16 -0700 Subject: [PATCH] Numeric types can be casted from strings with leading or trailing whitespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcos Tapajós --- lib/couchrest/model/typecast.rb | 2 +- spec/couchrest/property_spec.rb | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/couchrest/model/typecast.rb b/lib/couchrest/model/typecast.rb index 45a3114..6e9499a 100644 --- a/lib/couchrest/model/typecast.rb +++ b/lib/couchrest/model/typecast.rb @@ -79,7 +79,7 @@ module CouchRest # Match numeric string def typecast_to_numeric(value, method) if value.respond_to?(:to_str) - if value.gsub(/,/, '.').gsub(/\.(?!\d*\Z)/, '').to_str =~ /\A(-?(?:0|[1-9]\d*)(?:\.\d+)?|(?:\.\d+))\z/ + if value.strip.gsub(/,/, '.').gsub(/\.(?!\d*\Z)/, '').to_str =~ /\A(-?(?:0|[1-9]\d*)(?:\.\d+)?|(?:\.\d+))\z/ $1.send(method) else value diff --git a/spec/couchrest/property_spec.rb b/spec/couchrest/property_spec.rb index 2c4eab0..1e3548d 100644 --- a/spec/couchrest/property_spec.rb +++ b/spec/couchrest/property_spec.rb @@ -340,6 +340,11 @@ describe "Model properties" do @course.estimate.should eql(1232434123.323) end + it "should handle numbers with whitespace" do + @course.estimate = " 24.35 " + @course.estimate.should eql(24.35) + end + [ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |value| it "does not typecast non-numeric value #{value.inspect}" do @course.estimate = value @@ -426,6 +431,11 @@ describe "Model properties" do @course['hours'].should eql(-24) end + it "should handle numbers with whitespace" do + @course.hours = " 24 " + @course['hours'].should eql(24) + end + [ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |value| it "does not typecast non-numeric value #{value.inspect}" do @course.hours = value @@ -511,6 +521,11 @@ describe "Model properties" do @course['profit'].should eql(BigDecimal('-24.35')) end + it "should handle numbers with whitespace" do + @course.profit = " 24.35 " + @course['profit'].should eql(BigDecimal('24.35')) + end + [ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |value| it "does not typecast non-numeric value #{value.inspect}" do @course.profit = value