axtro-actionwebservice 2.3.5.1.20101118142125
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +335 -0
- data/MIT-LICENSE +21 -0
- data/README +381 -0
- data/Rakefile +184 -0
- data/TODO +32 -0
- data/examples/googlesearch/README +143 -0
- data/examples/googlesearch/autoloading/google_search_api.rb +51 -0
- data/examples/googlesearch/autoloading/google_search_controller.rb +58 -0
- data/examples/googlesearch/delegated/google_search_service.rb +109 -0
- data/examples/googlesearch/delegated/search_controller.rb +8 -0
- data/examples/googlesearch/direct/google_search_api.rb +51 -0
- data/examples/googlesearch/direct/search_controller.rb +59 -0
- data/examples/metaWeblog/README +17 -0
- data/examples/metaWeblog/apis/blogger_api.rb +61 -0
- data/examples/metaWeblog/apis/blogger_service.rb +35 -0
- data/examples/metaWeblog/apis/meta_weblog_api.rb +68 -0
- data/examples/metaWeblog/apis/meta_weblog_service.rb +49 -0
- data/examples/metaWeblog/controllers/xmlrpc_controller.rb +17 -0
- data/generators/web_service/USAGE +28 -0
- data/generators/web_service/templates/api_definition.rb +6 -0
- data/generators/web_service/templates/controller.rb +9 -0
- data/generators/web_service/templates/functional_test.rb +20 -0
- data/generators/web_service/web_service_generator.rb +30 -0
- data/lib/action_web_service.rb +61 -0
- data/lib/action_web_service/acts_as_web_service.rb +26 -0
- data/lib/action_web_service/api.rb +298 -0
- data/lib/action_web_service/base.rb +39 -0
- data/lib/action_web_service/casting.rb +160 -0
- data/lib/action_web_service/client.rb +4 -0
- data/lib/action_web_service/client/base.rb +29 -0
- data/lib/action_web_service/client/soap_client.rb +114 -0
- data/lib/action_web_service/client/xmlrpc_client.rb +59 -0
- data/lib/action_web_service/container.rb +4 -0
- data/lib/action_web_service/container/action_controller_container.rb +94 -0
- data/lib/action_web_service/container/delegated_container.rb +87 -0
- data/lib/action_web_service/container/direct_container.rb +70 -0
- data/lib/action_web_service/dispatcher.rb +3 -0
- data/lib/action_web_service/dispatcher/abstract.rb +209 -0
- data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +397 -0
- data/lib/action_web_service/invocation.rb +203 -0
- data/lib/action_web_service/protocol.rb +5 -0
- data/lib/action_web_service/protocol/abstract.rb +113 -0
- data/lib/action_web_service/protocol/discovery.rb +38 -0
- data/lib/action_web_service/protocol/soap_protocol.rb +177 -0
- data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +243 -0
- data/lib/action_web_service/protocol/soap_protocol/marshaler.rb~ +243 -0
- data/lib/action_web_service/protocol/xmlrpc_protocol.rb +124 -0
- data/lib/action_web_service/scaffolding.rb +282 -0
- data/lib/action_web_service/simple.rb +54 -0
- data/lib/action_web_service/string_to_datetime_for_soap.rb +17 -0
- data/lib/action_web_service/struct.rb +69 -0
- data/lib/action_web_service/support/class_inheritable_options.rb +27 -0
- data/lib/action_web_service/support/signature_types.rb +262 -0
- data/lib/action_web_service/templates/scaffolds/layout.html.erb +65 -0
- data/lib/action_web_service/templates/scaffolds/methods.html.erb +6 -0
- data/lib/action_web_service/templates/scaffolds/parameters.html.erb +29 -0
- data/lib/action_web_service/templates/scaffolds/result.html.erb +30 -0
- data/lib/action_web_service/test_invoke.rb +111 -0
- data/lib/action_web_service/version.rb +11 -0
- data/lib/action_web_service/version.rb~ +10 -0
- data/lib/actionwebservice.rb +2 -0
- data/setup.rb +1380 -0
- data/test/abstract_client.rb +185 -0
- data/test/abstract_dispatcher.rb +550 -0
- data/test/abstract_unit.rb +44 -0
- data/test/api_test.rb +103 -0
- data/test/apis/auto_load_api.rb +4 -0
- data/test/apis/broken_auto_load_api.rb +3 -0
- data/test/base_test.rb +43 -0
- data/test/casting_test.rb +96 -0
- data/test/client_soap_test.rb +157 -0
- data/test/client_xmlrpc_test.rb +155 -0
- data/test/container_test.rb +76 -0
- data/test/dispatcher_action_controller_soap_test.rb +147 -0
- data/test/dispatcher_action_controller_xmlrpc_test.rb +60 -0
- data/test/fixtures/db_definitions/mysql.sql +8 -0
- data/test/fixtures/db_definitions/sqlite3.sql +8 -0
- data/test/fixtures/users.yml +12 -0
- data/test/gencov +3 -0
- data/test/invocation_test.rb +187 -0
- data/test/run +6 -0
- data/test/scaffolded_controller_test.rb +148 -0
- data/test/struct_test.rb +85 -0
- data/test/test_invoke_test.rb +114 -0
- metadata +167 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module StringToDatetimeForSoap
|
3
|
+
def to_datetime
|
4
|
+
begin
|
5
|
+
if /^([+\-]?\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ self.strip
|
6
|
+
return Time.xmlschema(self).localtime
|
7
|
+
end
|
8
|
+
super
|
9
|
+
rescue
|
10
|
+
# If a invalid date is supplied, it will automatically turn it into the first Julian Day
|
11
|
+
# Jan/01 - 4712 BC - This is a simple solution, until a better one appear :)
|
12
|
+
return Date.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
String.send :include, StringToDatetimeForSoap
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module ActionWebService
|
3
|
+
# To send structured types across the wire, derive from ActionWebService::Struct,
|
4
|
+
# and use +member+ to declare structure members.
|
5
|
+
#
|
6
|
+
# ActionWebService::Struct should be used in method signatures when you want to accept or return
|
7
|
+
# structured types that have no Active Record model class representations, or you don't
|
8
|
+
# want to expose your entire Active Record model to remote callers.
|
9
|
+
#
|
10
|
+
# === Example
|
11
|
+
#
|
12
|
+
# class Person < ActionWebService::Struct
|
13
|
+
# member :id, :int
|
14
|
+
# member :firstnames, [:string]
|
15
|
+
# member :lastname, :string
|
16
|
+
# member :email, :string, :nillable => true
|
17
|
+
# end
|
18
|
+
# person = Person.new(:id => 5, :firstname => 'john', :lastname => 'doe')
|
19
|
+
#
|
20
|
+
# Active Record model classes are already implicitly supported in method
|
21
|
+
# signatures.
|
22
|
+
class Struct
|
23
|
+
# If a Hash is given as argument to an ActionWebService::Struct constructor,
|
24
|
+
# it can contain initial values for the structure member.
|
25
|
+
# Values passed within the Hash that do not reflect member within the Struct will raise
|
26
|
+
# a NoMethodError unless the optional check_hash boolean is true.
|
27
|
+
def initialize(values={}, check_hash = false)
|
28
|
+
if values.is_a?(Hash)
|
29
|
+
values.map { |k,v| __send__("#{k}=", v) unless (check_hash && !self.respond_to?("#{k}=") ) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# The member with the given name
|
34
|
+
def [](name)
|
35
|
+
send(name.to_s)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Iterates through each member
|
39
|
+
def each_pair(&block)
|
40
|
+
self.class.members.each do |name, type|
|
41
|
+
yield name, self.__send__(name)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class << self
|
46
|
+
# Creates a structure member with the specified +name+ and +type+. Additional wsdl
|
47
|
+
# schema properties may be specified in the optional hash +options+. Generates
|
48
|
+
# accessor methods for reading and writing the member value.
|
49
|
+
def member(name, type, options={})
|
50
|
+
name = name.to_sym
|
51
|
+
type = ActionWebService::SignatureTypes.canonical_signature_entry({ name => type }, 0)
|
52
|
+
write_inheritable_hash("struct_members", name => [type, options])
|
53
|
+
class_eval <<-END
|
54
|
+
def #{name}; @#{name}; end
|
55
|
+
def #{name}=(value); @#{name} = value; end
|
56
|
+
END
|
57
|
+
end
|
58
|
+
|
59
|
+
def members # :nodoc:
|
60
|
+
read_inheritable_attribute("struct_members") || {}
|
61
|
+
end
|
62
|
+
|
63
|
+
def member_type(name) # :nodoc:
|
64
|
+
type, options = members[name.to_sym]
|
65
|
+
type
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
class Class # :nodoc:
|
3
|
+
def class_inheritable_option(sym, default_value=nil)
|
4
|
+
write_inheritable_attribute sym, default_value
|
5
|
+
class_eval <<-EOS
|
6
|
+
def self.#{sym}(value=nil)
|
7
|
+
if !value.nil?
|
8
|
+
write_inheritable_attribute(:#{sym}, value)
|
9
|
+
else
|
10
|
+
read_inheritable_attribute(:#{sym})
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.#{sym}=(value)
|
15
|
+
write_inheritable_attribute(:#{sym}, value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def #{sym}
|
19
|
+
self.class.#{sym}
|
20
|
+
end
|
21
|
+
|
22
|
+
def #{sym}=(value)
|
23
|
+
self.class.#{sym} = value
|
24
|
+
end
|
25
|
+
EOS
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,262 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module ActionWebService # :nodoc:
|
3
|
+
# Action Web Service supports the following base types in a signature:
|
4
|
+
#
|
5
|
+
# [<tt>:int</tt>] Represents an integer value, will be cast to an integer using <tt>Integer(value)</tt>
|
6
|
+
# [<tt>:string</tt>] Represents a string value, will be cast to an string using the <tt>to_s</tt> method on an object
|
7
|
+
# [<tt>:base64</tt>] Represents a Base 64 value, will contain the binary bytes of a Base 64 value sent by the caller
|
8
|
+
# [<tt>:bool</tt>] Represents a boolean value, whatever is passed will be cast to boolean (<tt>true</tt>, '1', 'true', 'y', 'yes' are taken to represent true; <tt>false</tt>, '0', 'false', 'n', 'no' and <tt>nil</tt> represent false)
|
9
|
+
# [<tt>:float</tt>] Represents a floating point value, will be cast to a float using <tt>Float(value)</tt>
|
10
|
+
# [<tt>:time</tt>] Represents a timestamp, will be cast to a <tt>Time</tt> object
|
11
|
+
# [<tt>:datetime</tt>] Represents a timestamp, will be cast to a <tt>DateTime</tt> object
|
12
|
+
# [<tt>:date</tt>] Represents a date, will be cast to a <tt>Date</tt> object
|
13
|
+
#
|
14
|
+
# For structured types, you'll need to pass in the Class objects of
|
15
|
+
# ActionWebService::Struct and ActiveRecord::Base derivatives.
|
16
|
+
module SignatureTypes
|
17
|
+
def canonical_signature(signature) # :nodoc:
|
18
|
+
return nil if signature.nil?
|
19
|
+
unless signature.is_a?(Array)
|
20
|
+
raise(ActionWebServiceError, "Expected signature to be an Array")
|
21
|
+
end
|
22
|
+
i = -1
|
23
|
+
signature.map{ |spec| canonical_signature_entry(spec, i += 1) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def canonical_signature_entry(spec, i) # :nodoc:
|
27
|
+
orig_spec = spec
|
28
|
+
name = "param#{i}"
|
29
|
+
if spec.is_a?(Hash)
|
30
|
+
name, spec = spec.keys.first, spec.values.first
|
31
|
+
end
|
32
|
+
type = spec
|
33
|
+
if spec.is_a?(Array)
|
34
|
+
ArrayType.new(orig_spec, canonical_signature_entry(spec[0], 0), name)
|
35
|
+
else
|
36
|
+
type = canonical_type(type)
|
37
|
+
if type.is_a?(Symbol)
|
38
|
+
BaseType.new(orig_spec, type, name)
|
39
|
+
else
|
40
|
+
if type.is_a?(Hash)
|
41
|
+
complexity, type = type.keys.first.to_sym, type.values.first
|
42
|
+
end
|
43
|
+
element = complexity || :complex
|
44
|
+
element == :simple ? SimpleType.new(orig_spec, type, name) : StructuredType.new(orig_spec, type, name)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def canonical_type(type) # :nodoc:
|
50
|
+
type_name = symbol_name(type) || class_to_type_name(type)
|
51
|
+
type = type_name || type
|
52
|
+
return canonical_type_name(type) if type.is_a?(Symbol)
|
53
|
+
type
|
54
|
+
end
|
55
|
+
|
56
|
+
def canonical_type_name(name) # :nodoc:
|
57
|
+
name = name.to_sym
|
58
|
+
case name
|
59
|
+
when :int, :integer, :fixnum, :bignum
|
60
|
+
:int
|
61
|
+
when :string, :text
|
62
|
+
:string
|
63
|
+
when :base64, :binary
|
64
|
+
:base64
|
65
|
+
when :bool, :boolean
|
66
|
+
:bool
|
67
|
+
when :float, :double
|
68
|
+
:float
|
69
|
+
when :decimal
|
70
|
+
:decimal
|
71
|
+
when :time, :timestamp
|
72
|
+
:time
|
73
|
+
when :datetime
|
74
|
+
:datetime
|
75
|
+
when :date
|
76
|
+
:date
|
77
|
+
else
|
78
|
+
raise(TypeError, "#{name} is not a valid base type")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def canonical_type_class(type) # :nodoc:
|
83
|
+
type = canonical_type(type)
|
84
|
+
type.is_a?(Symbol) ? type_name_to_class(type) : type
|
85
|
+
end
|
86
|
+
|
87
|
+
def symbol_name(name) # :nodoc:
|
88
|
+
return name.to_sym if name.is_a?(Symbol) || name.is_a?(String)
|
89
|
+
nil
|
90
|
+
end
|
91
|
+
|
92
|
+
def class_to_type_name(klass) # :nodoc:
|
93
|
+
klass = klass.class unless klass.is_a?(Class)
|
94
|
+
if derived_from?(Integer, klass) || derived_from?(Fixnum, klass) || derived_from?(Bignum, klass)
|
95
|
+
:int
|
96
|
+
elsif klass == String
|
97
|
+
:string
|
98
|
+
elsif klass == Base64
|
99
|
+
:base64
|
100
|
+
elsif klass == TrueClass || klass == FalseClass
|
101
|
+
:bool
|
102
|
+
elsif derived_from?(Float, klass)
|
103
|
+
:float
|
104
|
+
elsif RUBY_VERSION < '1.9' && derived_from?(Precision, klass)
|
105
|
+
:float
|
106
|
+
elsif derived_from?(Numeric, klass)
|
107
|
+
:float
|
108
|
+
elsif klass == Time
|
109
|
+
:time
|
110
|
+
elsif klass == DateTime
|
111
|
+
:datetime
|
112
|
+
elsif klass == Date
|
113
|
+
:date
|
114
|
+
else
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def type_name_to_class(name) # :nodoc:
|
120
|
+
case canonical_type_name(name)
|
121
|
+
when :int
|
122
|
+
Integer
|
123
|
+
when :string
|
124
|
+
String
|
125
|
+
when :base64
|
126
|
+
Base64
|
127
|
+
when :bool
|
128
|
+
TrueClass
|
129
|
+
when :float
|
130
|
+
Float
|
131
|
+
when :decimal
|
132
|
+
BigDecimal
|
133
|
+
when :time
|
134
|
+
Time
|
135
|
+
when :date
|
136
|
+
Date
|
137
|
+
when :datetime
|
138
|
+
DateTime
|
139
|
+
else
|
140
|
+
nil
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def derived_from?(ancestor, child) # :nodoc:
|
145
|
+
child.ancestors.include?(ancestor)
|
146
|
+
end
|
147
|
+
|
148
|
+
module_function :type_name_to_class
|
149
|
+
module_function :class_to_type_name
|
150
|
+
module_function :symbol_name
|
151
|
+
module_function :canonical_type_class
|
152
|
+
module_function :canonical_type_name
|
153
|
+
module_function :canonical_type
|
154
|
+
module_function :canonical_signature_entry
|
155
|
+
module_function :canonical_signature
|
156
|
+
module_function :derived_from?
|
157
|
+
end
|
158
|
+
|
159
|
+
class BaseType # :nodoc:
|
160
|
+
include SignatureTypes
|
161
|
+
|
162
|
+
attr :spec
|
163
|
+
attr :type
|
164
|
+
attr :type_class
|
165
|
+
attr :name
|
166
|
+
|
167
|
+
def initialize(spec, type, name)
|
168
|
+
@spec = spec
|
169
|
+
@type = canonical_type(type)
|
170
|
+
@type_class = canonical_type_class(@type)
|
171
|
+
@name = name
|
172
|
+
end
|
173
|
+
|
174
|
+
def custom?
|
175
|
+
false
|
176
|
+
end
|
177
|
+
|
178
|
+
def array?
|
179
|
+
false
|
180
|
+
end
|
181
|
+
|
182
|
+
def structured?
|
183
|
+
false
|
184
|
+
end
|
185
|
+
|
186
|
+
def simple?
|
187
|
+
false
|
188
|
+
end
|
189
|
+
|
190
|
+
def human_name(show_name=true)
|
191
|
+
type_type = array? ? element_type.type.to_s : self.type.to_s
|
192
|
+
str = array? ? (type_type + '[]') : type_type
|
193
|
+
show_name ? (str + " " + name.to_s) : str
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
class ArrayType < BaseType # :nodoc:
|
198
|
+
attr :element_type
|
199
|
+
|
200
|
+
def initialize(spec, element_type, name)
|
201
|
+
super(spec, Array, name)
|
202
|
+
@element_type = element_type
|
203
|
+
end
|
204
|
+
|
205
|
+
def custom?
|
206
|
+
true
|
207
|
+
end
|
208
|
+
|
209
|
+
def array?
|
210
|
+
true
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
class StructuredType < BaseType # :nodoc:
|
215
|
+
def each_member
|
216
|
+
if @type_class.respond_to?(:members)
|
217
|
+
@type_class.members.each do |name, type_options|
|
218
|
+
type, options = type_options
|
219
|
+
yield name, type, options
|
220
|
+
end
|
221
|
+
elsif @type_class.respond_to?(:columns)
|
222
|
+
i = -1
|
223
|
+
@type_class.columns.each do |column|
|
224
|
+
yield column.name, canonical_signature_entry(column.type, i += 1)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def custom?
|
230
|
+
true
|
231
|
+
end
|
232
|
+
|
233
|
+
def structured?
|
234
|
+
true
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
class SimpleType < BaseType # :nodoc:
|
239
|
+
def base
|
240
|
+
@type_class.restriction_base if @type_class.respond_to?(:restriction_base)
|
241
|
+
end
|
242
|
+
|
243
|
+
def restrictions
|
244
|
+
if @type_class.respond_to?(:restrictions)
|
245
|
+
@type_class.restrictions.each do |name, value|
|
246
|
+
yield name, value
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def custom?
|
252
|
+
true
|
253
|
+
end
|
254
|
+
|
255
|
+
def simple?
|
256
|
+
true
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
class Base64 < String # :nodoc:
|
261
|
+
end
|
262
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title><%= @scaffold_class.wsdl_service_name %> Web Service</title>
|
4
|
+
<style>
|
5
|
+
body { background-color: #fff; color: #333; }
|
6
|
+
|
7
|
+
body, p, ol, ul, td {
|
8
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
9
|
+
font-size: 13px;
|
10
|
+
line-height: 18px;
|
11
|
+
}
|
12
|
+
|
13
|
+
pre {
|
14
|
+
background-color: #eee;
|
15
|
+
padding: 10px;
|
16
|
+
font-size: 11px;
|
17
|
+
}
|
18
|
+
|
19
|
+
a { color: #000; }
|
20
|
+
a:visited { color: #666; }
|
21
|
+
a:hover { color: #fff; background-color:#000; }
|
22
|
+
|
23
|
+
.fieldWithErrors {
|
24
|
+
padding: 2px;
|
25
|
+
background-color: red;
|
26
|
+
display: table;
|
27
|
+
}
|
28
|
+
|
29
|
+
#errorExplanation {
|
30
|
+
width: 400px;
|
31
|
+
border: 2px solid red;
|
32
|
+
padding: 7px;
|
33
|
+
padding-bottom: 12px;
|
34
|
+
margin-bottom: 20px;
|
35
|
+
background-color: #f0f0f0;
|
36
|
+
}
|
37
|
+
|
38
|
+
#errorExplanation h2 {
|
39
|
+
text-align: left;
|
40
|
+
font-weight: bold;
|
41
|
+
padding: 5px 5px 5px 15px;
|
42
|
+
font-size: 12px;
|
43
|
+
margin: -7px;
|
44
|
+
background-color: #c00;
|
45
|
+
color: #fff;
|
46
|
+
}
|
47
|
+
|
48
|
+
#errorExplanation p {
|
49
|
+
color: #333;
|
50
|
+
margin-bottom: 0;
|
51
|
+
padding: 5px;
|
52
|
+
}
|
53
|
+
|
54
|
+
#errorExplanation ul li {
|
55
|
+
font-size: 12px;
|
56
|
+
list-style: square;
|
57
|
+
}
|
58
|
+
</style>
|
59
|
+
</head>
|
60
|
+
<body>
|
61
|
+
|
62
|
+
<%= @content_for_layout %>
|
63
|
+
|
64
|
+
</body>
|
65
|
+
</html>
|