diff options
author | Leon Breedt <bitserf@gmail.com> | 2005-04-02 21:03:36 +0000 |
---|---|---|
committer | Leon Breedt <bitserf@gmail.com> | 2005-04-02 21:03:36 +0000 |
commit | aaea48fe9826b9e5d2d5b92795a297b8f238c58d (patch) | |
tree | e7c01c7f95d467f837c1f96d58dac74c3c902610 /actionwebservice/lib/action_web_service/vendor/ws/types.rb | |
parent | aa09c770e9b5400683be11952673017295246de7 (diff) | |
download | rails-aaea48fe9826b9e5d2d5b92795a297b8f238c58d.tar.gz rails-aaea48fe9826b9e5d2d5b92795a297b8f238c58d.tar.bz2 rails-aaea48fe9826b9e5d2d5b92795a297b8f238c58d.zip |
* collapse 'ws' back into protocols, it just added complexity and indirection, and was hard to extend.
* extract casting into seperate support file
* ensure casting always does the right thing for return values, should fix interoperability issues with Ecto and possibly other XML-RPC clients
* add functional unit tests for scaffolding
* represent signature items with classes instead of symbols/Class objects, much more flexible
* tweak logging to always show casted versions of parameters and return values, if possible.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1072 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionwebservice/lib/action_web_service/vendor/ws/types.rb')
-rw-r--r-- | actionwebservice/lib/action_web_service/vendor/ws/types.rb | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/actionwebservice/lib/action_web_service/vendor/ws/types.rb b/actionwebservice/lib/action_web_service/vendor/ws/types.rb deleted file mode 100644 index 88098b5bce..0000000000 --- a/actionwebservice/lib/action_web_service/vendor/ws/types.rb +++ /dev/null @@ -1,165 +0,0 @@ -require 'time' -require 'date' - -module WS - module BaseTypes - class << self - def type_name_to_class(name) - case canonical_type_name(name) - when :int - Integer - when :string - String - when :bool - TrueClass - when :float - Float - when :time - Time - when :date - Date - end - end - - def class_to_type_name(klass) - if WS.derived_from?(Integer, klass) || WS.derived_from?(Fixnum, klass) || WS.derived_from?(Bignum, klass) - :int - elsif klass == String - :string - elsif klass == TrueClass || klass == FalseClass - :bool - elsif WS.derived_from?(Float, klass) || WS.derived_from?(Precision, klass) || WS.derived_from?(Numeric, klass) - :float - elsif klass == Time || klass == DateTime - :time - elsif klass == Date - :date - else - raise(TypeError, "#{klass} is not a valid base type") - end - end - - def base_type?(klass) - !(canonical_type_class(klass) rescue nil).nil? - end - - def canonical_type_class(klass) - type_name_to_class(class_to_type_name(klass)) - end - - def canonical_param_type_class(spec) - klass = spec.is_a?(Hash) ? spec.values[0] : spec - array_element_class = klass.is_a?(Array) ? klass[0] : nil - klass = array_element_class ? array_element_class : klass - klass = type_name_to_class(klass) if klass.is_a?(Symbol) || klass.is_a?(String) - base_class = canonical_type_class(klass) rescue nil - klass = base_class unless base_class.nil? - array_element_class ? [klass] : klass - end - - def canonical_param_type_spec(spec) - klass = canonical_param_type_class(spec) - spec.is_a?(Hash) ? {spec.keys[0]=>klass} : klass - end - - def canonical_type_name(name) - name = name.to_sym - case name - when :int, :integer, :fixnum, :bignum - :int - when :string, :base64 - :string - when :bool, :boolean - :bool - when :float, :double - :float - when :time, :datetime, :timestamp - :time - when :date - :date - else - raise(TypeError, "#{name} is not a valid base type") - end - end - end - end - - class Param - attr_accessor :value - attr_accessor :info - - def initialize(value, info) - @value = value - @info = info - end - end - - class ParamInfo - attr_accessor :name - attr_accessor :type - attr_accessor :data - - def initialize(name, type, data=nil) - @name = name - @type = type - @data = data - end - - def self.create(spec, data, index=nil) - name = spec.is_a?(Hash) ? spec.keys[0].to_s : (index ? "param#{index}" : nil) - type = BaseTypes.canonical_param_type_class(spec) - ParamInfo.new(name, type, data) - end - end - - class BaseTypeCaster - def initialize - @handlers = {} - install_handlers - end - - def cast(value, klass) - type_class = BaseTypes.canonical_type_class(klass) - return value unless type_class - @handlers[type_class].call(value, type_class) - end - - protected - def install_handlers - handler = method(:cast_base_type) - [:int, :string, :bool, :float, :time, :date].each do |name| - type = BaseTypes.type_name_to_class(name) - @handlers[type] = handler - end - @handlers[Fixnum] = handler - end - - def cast_base_type(value, type_class) - desired_class = BaseTypes.canonical_type_class(type_class) - value_class = BaseTypes.canonical_type_class(value.class) - return value if desired_class == value_class - desired_name = BaseTypes.class_to_type_name(desired_class) - case desired_name - when :int - Integer(value) - when :string - value.to_s - when :bool - return false if value.nil? - int_value = Integer(value) rescue nil - return true if int_value == 1 - return false if int_value == 0 - value = value.to_s - return true if value == 'true' - return false if value == 'false' - raise(TypeError, "can't convert #{value} to boolean") - when :float - Float(value) - when :time - Time.parse(value.to_s) - when :date - Date.parse(value.to_s) - end - end - end -end |