mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
6f5a7b2004
seperate out protocol marshaling into a small 'ws' library in vendor, so that AWS itself only does integration with ActionPack, and so we can keep protocol specific code in AWS proper to a minimum. refactor unit tests to get 95% code coverage (for a baseline). be far more relaxed about the types given to us by the remote side, don't do any poor man's type checking, just try to cast and marshal to the correct types if possible, and if not, return what they gave us anyway. this should make interoperating with fuzzy XML-RPC clients easier. if exception reporting is turned on, do best-effort error responses, so that we can avoid "Internal protocol error" with no details if there is a bug in AWS itself. also perform extensive cleanups on AWS proper. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@800 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
70 lines
2.4 KiB
Ruby
70 lines
2.4 KiB
Ruby
module ActionWebService # :nodoc:
|
|
module Container # :nodoc:
|
|
module Direct # :nodoc:
|
|
class ContainerError < ActionWebServiceError # :nodoc:
|
|
end
|
|
|
|
def self.append_features(base) # :nodoc:
|
|
super
|
|
base.extend(ClassMethods)
|
|
end
|
|
|
|
module ClassMethods
|
|
# Attaches ActionWebService API +definition+ to the calling class.
|
|
#
|
|
# Action Controllers can have a default associated API, removing the need
|
|
# to call this method if you follow the Action Web Service naming conventions.
|
|
#
|
|
# A controller with a class name of GoogleSearchController will
|
|
# implicitly load <tt>app/apis/google_search_api.rb</tt>, and expect the
|
|
# API definition class to be named <tt>GoogleSearchAPI</tt> or
|
|
# <tt>GoogleSearchApi</tt>.
|
|
#
|
|
# ==== Service class example
|
|
#
|
|
# class MyService < ActionWebService::Base
|
|
# web_service_api MyAPI
|
|
# end
|
|
#
|
|
# class MyAPI < ActionWebService::API::Base
|
|
# ...
|
|
# end
|
|
#
|
|
# ==== Controller class example
|
|
#
|
|
# class MyController < ActionController::Base
|
|
# web_service_api MyAPI
|
|
# end
|
|
#
|
|
# class MyAPI < ActionWebService::API::Base
|
|
# ...
|
|
# end
|
|
def web_service_api(definition=nil)
|
|
if definition.nil?
|
|
read_inheritable_attribute("web_service_api")
|
|
else
|
|
if definition.is_a?(Symbol)
|
|
raise(ContainerError, "symbols can only be used for #web_service_api inside of a controller")
|
|
end
|
|
unless definition.respond_to?(:ancestors) && definition.ancestors.include?(ActionWebService::API::Base)
|
|
raise(ContainerError, "#{definition.to_s} is not a valid API definition")
|
|
end
|
|
write_inheritable_attribute("web_service_api", definition)
|
|
call_web_service_api_callbacks(self, definition)
|
|
end
|
|
end
|
|
|
|
def add_web_service_api_callback(&block) # :nodoc:
|
|
write_inheritable_array("web_service_api_callbacks", [block])
|
|
end
|
|
|
|
private
|
|
def call_web_service_api_callbacks(container_class, definition)
|
|
(read_inheritable_attribute("web_service_api_callbacks") || []).each do |block|
|
|
block.call(container_class, definition)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|