From abe8fa73a91b72e79717673393a4f5bc5cd341f7 Mon Sep 17 00:00:00 2001 From: Kent Sibilev Date: Sun, 3 Dec 2006 20:30:34 +0000 Subject: [PATCH] Added support for decimal types. Closes #6676. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5670 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionwebservice/CHANGELOG | 2 ++ actionwebservice/lib/action_web_service/casting.rb | 2 ++ .../protocol/soap_protocol/marshaler.rb | 14 ++++---------- .../action_web_service/protocol/xmlrpc_protocol.rb | 10 ++++++++++ .../action_web_service/support/signature_types.rb | 4 ++++ actionwebservice/test/client_soap_test.rb | 1 + actionwebservice/test/client_xmlrpc_test.rb | 1 + .../test/fixtures/db_definitions/mysql.sql | 1 + actionwebservice/test/fixtures/users.yml | 2 ++ 9 files changed, 27 insertions(+), 10 deletions(-) diff --git a/actionwebservice/CHANGELOG b/actionwebservice/CHANGELOG index a07042d1d5..2ed40aac48 100644 --- a/actionwebservice/CHANGELOG +++ b/actionwebservice/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added support for decimal types. Closes #6676. [Kent Sibilev] + * Removed deprecated end_form_tag helper. [Kent Sibilev] * Removed deprecated @request and @response usages. [Kent Sibilev] diff --git a/actionwebservice/lib/action_web_service/casting.rb b/actionwebservice/lib/action_web_service/casting.rb index 71cdf4e055..71f422eaea 100644 --- a/actionwebservice/lib/action_web_service/casting.rb +++ b/actionwebservice/lib/action_web_service/casting.rb @@ -95,6 +95,8 @@ def cast_base_type(value, signature_type) # :nodoc: end when :float Float(value) + when :decimal + BigDecimal(value.to_s) when :time value = "%s/%s/%s %s:%s:%s" % value.values_at(*%w[2 3 1 4 5 6]) if value.kind_of?(Hash) value.kind_of?(Time) ? value : Time.parse(value.to_s) diff --git a/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb b/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb index 351c9da159..1873396277 100644 --- a/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +++ b/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb @@ -118,18 +118,12 @@ def soap_type_name(type_name) end def register_static_factories - @registry.add(ActionWebService::Base64, - SOAP::SOAPBase64, - SoapBase64Factory.new, - nil) + @registry.add(ActionWebService::Base64, SOAP::SOAPBase64, SoapBase64Factory.new, nil) mapping = @registry.find_mapped_soap_class(ActionWebService::Base64) @type2binding[ActionWebService::Base64] = - SoapBinding.new(self, SOAP::SOAPBase64::Type, - ActionWebService::Base64, mapping) - @registry.add(Array, - SOAP::SOAPArray, - SoapTypedArrayFactory.new, - nil) + SoapBinding.new(self, SOAP::SOAPBase64::Type, ActionWebService::Base64, mapping) + @registry.add(Array, SOAP::SOAPArray, SoapTypedArrayFactory.new, nil) + @registry.add(::BigDecimal, SOAP::SOAPDouble, SOAP::Mapping::Registry::BasetypeFactory, {:derived_class => true}) end end diff --git a/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb b/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb index a3abc6a24d..8ec36a29f1 100644 --- a/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +++ b/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb @@ -5,6 +5,16 @@ module XMLRPC # :nodoc: class FaultException # :nodoc: alias :message :faultString end + + class Create + def wrong_type(value) + if BigDecimal === value + [true, value.to_f] + else + false + end + end + end end module ActionWebService # :nodoc: diff --git a/actionwebservice/lib/action_web_service/support/signature_types.rb b/actionwebservice/lib/action_web_service/support/signature_types.rb index 36224c645e..66c86bf6da 100644 --- a/actionwebservice/lib/action_web_service/support/signature_types.rb +++ b/actionwebservice/lib/action_web_service/support/signature_types.rb @@ -61,6 +61,8 @@ def canonical_type_name(name) # :nodoc: :bool when :float, :double :float + when :decimal + :decimal when :time, :timestamp :time when :datetime @@ -117,6 +119,8 @@ def type_name_to_class(name) # :nodoc: TrueClass when :float Float + when :decimal + BigDecimal when :time Time when :date diff --git a/actionwebservice/test/client_soap_test.rb b/actionwebservice/test/client_soap_test.rb index c03c24141f..914bf377ea 100644 --- a/actionwebservice/test/client_soap_test.rb +++ b/actionwebservice/test/client_soap_test.rb @@ -126,6 +126,7 @@ def test_model_return assert user.active? assert_kind_of Date, user.created_on assert_equal Date.today, user.created_on + assert_equal BigDecimal('12.2'), user.balance end def test_with_model diff --git a/actionwebservice/test/client_xmlrpc_test.rb b/actionwebservice/test/client_xmlrpc_test.rb index 0abd5898d8..896ec5951c 100644 --- a/actionwebservice/test/client_xmlrpc_test.rb +++ b/actionwebservice/test/client_xmlrpc_test.rb @@ -125,6 +125,7 @@ def test_model_return assert user.active? assert_kind_of Time, user.created_on assert_equal Time.utc(Time.now.year, Time.now.month, Time.now.day), user.created_on + assert_equal BigDecimal('12.2'), user.balance end def test_with_model diff --git a/actionwebservice/test/fixtures/db_definitions/mysql.sql b/actionwebservice/test/fixtures/db_definitions/mysql.sql index 026f2a2c64..8e01eef453 100644 --- a/actionwebservice/test/fixtures/db_definitions/mysql.sql +++ b/actionwebservice/test/fixtures/db_definitions/mysql.sql @@ -2,6 +2,7 @@ CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `name` varchar(30) default NULL, `active` tinyint(4) default NULL, + `balance` decimal(5, 2) default NULL, `created_on` date default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; diff --git a/actionwebservice/test/fixtures/users.yml b/actionwebservice/test/fixtures/users.yml index a97d8c8486..926d6015f5 100644 --- a/actionwebservice/test/fixtures/users.yml +++ b/actionwebservice/test/fixtures/users.yml @@ -2,9 +2,11 @@ user1: id: 1 name: Kent active: 1 + balance: 12.2 created_on: <%= Date.today %> user2: id: 2 name: David active: 1 + balance: 16.4 created_on: <%= Date.today %> -- GitLab