aboutsummaryrefslogtreecommitdiffstats
path: root/actionwebservice/lib/action_web_service/support
diff options
context:
space:
mode:
authorLeon Breedt <bitserf@gmail.com>2005-02-18 23:55:29 +0000
committerLeon Breedt <bitserf@gmail.com>2005-02-18 23:55:29 +0000
commitec03a601811587dd4265667aadd50c101c23b116 (patch)
treeb040f5f1488267b35bc0110efe029a789c3a350b /actionwebservice/lib/action_web_service/support
parent5760a6cb3e3f3ce3b41c25023f3fbb875590c5bc (diff)
downloadrails-ec03a601811587dd4265667aadd50c101c23b116.tar.gz
rails-ec03a601811587dd4265667aadd50c101c23b116.tar.bz2
rails-ec03a601811587dd4265667aadd50c101c23b116.zip
rename entire package to Action Web Service
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@672 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionwebservice/lib/action_web_service/support')
-rw-r--r--actionwebservice/lib/action_web_service/support/class_inheritable_options.rb26
-rw-r--r--actionwebservice/lib/action_web_service/support/signature.rb100
2 files changed, 126 insertions, 0 deletions
diff --git a/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb b/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb
new file mode 100644
index 0000000000..4d1c2ed471
--- /dev/null
+++ b/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb
@@ -0,0 +1,26 @@
+class Class # :nodoc:
+ def class_inheritable_option(sym, default_value=nil)
+ write_inheritable_attribute sym, default_value
+ class_eval <<-EOS
+ def self.#{sym}(value=nil)
+ if !value.nil?
+ write_inheritable_attribute(:#{sym}, value)
+ else
+ read_inheritable_attribute(:#{sym})
+ end
+ end
+
+ def self.#{sym}=(value)
+ write_inheritable_attribute(:#{sym}, value)
+ end
+
+ def #{sym}
+ self.class.#{sym}
+ end
+
+ def #{sym}=(value)
+ self.class.#{sym} = value
+ end
+ EOS
+ end
+end
diff --git a/actionwebservice/lib/action_web_service/support/signature.rb b/actionwebservice/lib/action_web_service/support/signature.rb
new file mode 100644
index 0000000000..00c62a2232
--- /dev/null
+++ b/actionwebservice/lib/action_web_service/support/signature.rb
@@ -0,0 +1,100 @@
+module ActionWebService # :nodoc:
+ # Action Web Service parameter specifiers may contain symbols or strings
+ # instead of Class objects, for a limited set of base types.
+ #
+ # This provides an unambiguous way to specify that a given parameter
+ # contains an integer or boolean value, for example.
+ #
+ # The allowed set of symbol/string aliases:
+ #
+ # [<tt>:int</tt>] any integer value
+ # [<tt>:float</tt>] any floating point value
+ # [<tt>:string</tt>] any string value
+ # [<tt>:bool</tt>] any boolean value
+ # [<tt>:time</tt>] any value containing both date and time
+ # [<tt>:date</tt>] any value containing only a date
+ module Signature
+ class SignatureError < StandardError # :nodoc:
+ end
+
+ private
+ def canonical_signature(params)
+ return nil if params.nil?
+ params.map do |param|
+ klass = signature_parameter_class(param)
+ if param.is_a?(Hash)
+ param[param.keys[0]] = klass
+ param
+ else
+ klass
+ end
+ end
+ end
+
+ def signature_parameter_class(param)
+ param = param.is_a?(Hash) ? param.values[0] : param
+ is_array = param.is_a?(Array)
+ param = is_array ? param[0] : param
+ param = param.is_a?(String) ? param.to_sym : param
+ param = param.is_a?(Symbol) ? signature_ruby_class(param) : param
+ is_array ? [param] : param
+ end
+
+
+ def canonical_signature_base_type(base_type)
+ base_type = base_type.to_sym
+ case base_type
+ 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(SignatureError, ":#{base_type} is not an ActionWebService base type")
+ end
+ end
+
+ def signature_ruby_class(base_type)
+ case canonical_signature_base_type(base_type)
+ when :int
+ Integer
+ when :string
+ String
+ when :bool
+ TrueClass
+ when :float
+ Float
+ when :time
+ Time
+ when :date
+ Date
+ end
+ end
+
+ def signature_base_type(ruby_class)
+ case ruby_class
+ when Bignum, Integer, Fixnum
+ :int
+ when String
+ :string
+ when TrueClass, FalseClass
+ :bool
+ when Float, Numeric, Precision
+ :float
+ when Time, DateTime
+ :time
+ when Date
+ :date
+ else
+ raise(SignatureError, "#{ruby_class.name} is not an ActionWebService base type")
+ end
+ end
+ end
+end