axtro-actionwebservice 2.3.5.1.20101118142125

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/CHANGELOG +335 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +184 -0
  5. data/TODO +32 -0
  6. data/examples/googlesearch/README +143 -0
  7. data/examples/googlesearch/autoloading/google_search_api.rb +51 -0
  8. data/examples/googlesearch/autoloading/google_search_controller.rb +58 -0
  9. data/examples/googlesearch/delegated/google_search_service.rb +109 -0
  10. data/examples/googlesearch/delegated/search_controller.rb +8 -0
  11. data/examples/googlesearch/direct/google_search_api.rb +51 -0
  12. data/examples/googlesearch/direct/search_controller.rb +59 -0
  13. data/examples/metaWeblog/README +17 -0
  14. data/examples/metaWeblog/apis/blogger_api.rb +61 -0
  15. data/examples/metaWeblog/apis/blogger_service.rb +35 -0
  16. data/examples/metaWeblog/apis/meta_weblog_api.rb +68 -0
  17. data/examples/metaWeblog/apis/meta_weblog_service.rb +49 -0
  18. data/examples/metaWeblog/controllers/xmlrpc_controller.rb +17 -0
  19. data/generators/web_service/USAGE +28 -0
  20. data/generators/web_service/templates/api_definition.rb +6 -0
  21. data/generators/web_service/templates/controller.rb +9 -0
  22. data/generators/web_service/templates/functional_test.rb +20 -0
  23. data/generators/web_service/web_service_generator.rb +30 -0
  24. data/lib/action_web_service.rb +61 -0
  25. data/lib/action_web_service/acts_as_web_service.rb +26 -0
  26. data/lib/action_web_service/api.rb +298 -0
  27. data/lib/action_web_service/base.rb +39 -0
  28. data/lib/action_web_service/casting.rb +160 -0
  29. data/lib/action_web_service/client.rb +4 -0
  30. data/lib/action_web_service/client/base.rb +29 -0
  31. data/lib/action_web_service/client/soap_client.rb +114 -0
  32. data/lib/action_web_service/client/xmlrpc_client.rb +59 -0
  33. data/lib/action_web_service/container.rb +4 -0
  34. data/lib/action_web_service/container/action_controller_container.rb +94 -0
  35. data/lib/action_web_service/container/delegated_container.rb +87 -0
  36. data/lib/action_web_service/container/direct_container.rb +70 -0
  37. data/lib/action_web_service/dispatcher.rb +3 -0
  38. data/lib/action_web_service/dispatcher/abstract.rb +209 -0
  39. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +397 -0
  40. data/lib/action_web_service/invocation.rb +203 -0
  41. data/lib/action_web_service/protocol.rb +5 -0
  42. data/lib/action_web_service/protocol/abstract.rb +113 -0
  43. data/lib/action_web_service/protocol/discovery.rb +38 -0
  44. data/lib/action_web_service/protocol/soap_protocol.rb +177 -0
  45. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +243 -0
  46. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb~ +243 -0
  47. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +124 -0
  48. data/lib/action_web_service/scaffolding.rb +282 -0
  49. data/lib/action_web_service/simple.rb +54 -0
  50. data/lib/action_web_service/string_to_datetime_for_soap.rb +17 -0
  51. data/lib/action_web_service/struct.rb +69 -0
  52. data/lib/action_web_service/support/class_inheritable_options.rb +27 -0
  53. data/lib/action_web_service/support/signature_types.rb +262 -0
  54. data/lib/action_web_service/templates/scaffolds/layout.html.erb +65 -0
  55. data/lib/action_web_service/templates/scaffolds/methods.html.erb +6 -0
  56. data/lib/action_web_service/templates/scaffolds/parameters.html.erb +29 -0
  57. data/lib/action_web_service/templates/scaffolds/result.html.erb +30 -0
  58. data/lib/action_web_service/test_invoke.rb +111 -0
  59. data/lib/action_web_service/version.rb +11 -0
  60. data/lib/action_web_service/version.rb~ +10 -0
  61. data/lib/actionwebservice.rb +2 -0
  62. data/setup.rb +1380 -0
  63. data/test/abstract_client.rb +185 -0
  64. data/test/abstract_dispatcher.rb +550 -0
  65. data/test/abstract_unit.rb +44 -0
  66. data/test/api_test.rb +103 -0
  67. data/test/apis/auto_load_api.rb +4 -0
  68. data/test/apis/broken_auto_load_api.rb +3 -0
  69. data/test/base_test.rb +43 -0
  70. data/test/casting_test.rb +96 -0
  71. data/test/client_soap_test.rb +157 -0
  72. data/test/client_xmlrpc_test.rb +155 -0
  73. data/test/container_test.rb +76 -0
  74. data/test/dispatcher_action_controller_soap_test.rb +147 -0
  75. data/test/dispatcher_action_controller_xmlrpc_test.rb +60 -0
  76. data/test/fixtures/db_definitions/mysql.sql +8 -0
  77. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  78. data/test/fixtures/users.yml +12 -0
  79. data/test/gencov +3 -0
  80. data/test/invocation_test.rb +187 -0
  81. data/test/run +6 -0
  82. data/test/scaffolded_controller_test.rb +148 -0
  83. data/test/struct_test.rb +85 -0
  84. data/test/test_invoke_test.rb +114 -0
  85. metadata +167 -0
@@ -0,0 +1,8 @@
1
+ CREATE TABLE `users` (
2
+ `id` int(11) NOT NULL,
3
+ `name` varchar(30) default NULL,
4
+ `active` tinyint(4) default NULL,
5
+ `balance` decimal(5, 2) default NULL,
6
+ `created_on` date default NULL,
7
+ PRIMARY KEY (`id`)
8
+ ) ;
@@ -0,0 +1,12 @@
1
+ user1:
2
+ id: 1
3
+ name: Kent
4
+ active: 1
5
+ balance: 12.2
6
+ created_on: <%= Date.today %>
7
+ user2:
8
+ id: 2
9
+ name: David
10
+ active: 1
11
+ balance: 16.4
12
+ created_on: <%= Date.today %>
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ rcov -x '.*_test\.rb,rubygems,abstract_,/run,/apis' ./run
@@ -0,0 +1,187 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ module InvocationTest
5
+ class API < ActionWebService::API::Base
6
+ api_method :add, :expects => [:int, :int], :returns => [:int]
7
+ api_method :transmogrify, :expects_and_returns => [:string]
8
+ api_method :fail_with_reason
9
+ api_method :fail_generic
10
+ api_method :no_before
11
+ api_method :no_after
12
+ api_method :only_one
13
+ api_method :only_two
14
+ end
15
+
16
+ class Interceptor
17
+ attr :args
18
+
19
+ def initialize
20
+ @args = nil
21
+ end
22
+
23
+ def intercept(*args)
24
+ @args = args
25
+ end
26
+ end
27
+
28
+ InterceptorClass = Interceptor.new
29
+
30
+ class Service < ActionController::Base
31
+ acts_as_web_service
32
+ web_service_api API
33
+
34
+ before_invocation :intercept_before, :except => [:no_before]
35
+ after_invocation :intercept_after, :except => [:no_after]
36
+ prepend_after_invocation :intercept_after_first, :except => [:no_after]
37
+ prepend_before_invocation :intercept_only, :only => [:only_one, :only_two]
38
+ after_invocation(:only => [:only_one]) do |*args|
39
+ args[0].instance_variable_set('@block_invoked', args[1])
40
+ end
41
+ after_invocation InterceptorClass, :only => [:only_one]
42
+
43
+ attr_accessor :before_invoked
44
+ attr_accessor :after_invoked
45
+ attr_accessor :after_first_invoked
46
+ attr_accessor :only_invoked
47
+ attr_accessor :block_invoked
48
+ attr_accessor :invocation_result
49
+
50
+ def initialize
51
+ @before_invoked = nil
52
+ @after_invoked = nil
53
+ @after_first_invoked = nil
54
+ @only_invoked = nil
55
+ @invocation_result = nil
56
+ @block_invoked = nil
57
+ end
58
+
59
+ def add(a, b)
60
+ a + b
61
+ end
62
+
63
+ def transmogrify(str)
64
+ str.upcase
65
+ end
66
+
67
+ def fail_with_reason
68
+ end
69
+
70
+ def fail_generic
71
+ end
72
+
73
+ def no_before
74
+ 5
75
+ end
76
+
77
+ def no_after
78
+ end
79
+
80
+ def only_one
81
+ end
82
+
83
+ def only_two
84
+ end
85
+
86
+ protected
87
+ def intercept_before(name, args)
88
+ @before_invoked = name
89
+ return [false, "permission denied"] if name == :fail_with_reason
90
+ return false if name == :fail_generic
91
+ end
92
+
93
+ def intercept_after(name, args, result)
94
+ @after_invoked = name
95
+ @invocation_result = result
96
+ end
97
+
98
+ def intercept_after_first(name, args, result)
99
+ @after_first_invoked = name
100
+ end
101
+
102
+ def intercept_only(name, args)
103
+ raise "Interception error" unless name == :only_one || name == :only_two
104
+ @only_invoked = name
105
+ end
106
+ end
107
+ end
108
+
109
+ class TC_Invocation < Test::Unit::TestCase
110
+ include ActionWebService::Invocation
111
+
112
+ def setup
113
+ @service = InvocationTest::Service.new
114
+ end
115
+
116
+ def test_invocation
117
+ assert(perform_invocation(:add, 5, 10) == 15)
118
+ assert(perform_invocation(:transmogrify, "hello") == "HELLO")
119
+ assert_raises(NoMethodError) do
120
+ perform_invocation(:nonexistent_method_xyzzy)
121
+ end
122
+ end
123
+
124
+ def test_interceptor_registration
125
+ assert(InvocationTest::Service.before_invocation_interceptors.length == 2)
126
+ assert(InvocationTest::Service.after_invocation_interceptors.length == 4)
127
+ assert_equal(:intercept_only, InvocationTest::Service.before_invocation_interceptors[0])
128
+ assert_equal(:intercept_after_first, InvocationTest::Service.after_invocation_interceptors[0])
129
+ end
130
+
131
+ def test_interception
132
+ assert(@service.before_invoked.nil?)
133
+ assert(@service.after_invoked.nil?)
134
+ assert(@service.only_invoked.nil?)
135
+ assert(@service.block_invoked.nil?)
136
+ assert(@service.invocation_result.nil?)
137
+ perform_invocation(:add, 20, 50)
138
+ assert(@service.before_invoked == :add)
139
+ assert(@service.after_invoked == :add)
140
+ assert(@service.invocation_result == 70)
141
+ end
142
+
143
+ def test_interception_canceling
144
+ reason = nil
145
+ perform_invocation(:fail_with_reason){|r| reason = r}
146
+ assert(@service.before_invoked == :fail_with_reason)
147
+ assert(@service.after_invoked.nil?)
148
+ assert(@service.invocation_result.nil?)
149
+ assert(reason == "permission denied")
150
+ reason = true
151
+ @service.before_invoked = @service.after_invoked = @service.invocation_result = nil
152
+ perform_invocation(:fail_generic){|r| reason = r}
153
+ assert(@service.before_invoked == :fail_generic)
154
+ assert(@service.after_invoked.nil?)
155
+ assert(@service.invocation_result.nil?)
156
+ assert(reason == true)
157
+ end
158
+
159
+ def test_interception_except_conditions
160
+ perform_invocation(:no_before)
161
+ assert(@service.before_invoked.nil?)
162
+ assert(@service.after_first_invoked == :no_before)
163
+ assert(@service.after_invoked == :no_before)
164
+ assert(@service.invocation_result == 5)
165
+ @service.before_invoked = @service.after_invoked = @service.invocation_result = nil
166
+ perform_invocation(:no_after)
167
+ assert(@service.before_invoked == :no_after)
168
+ assert(@service.after_invoked.nil?)
169
+ assert(@service.invocation_result.nil?)
170
+ end
171
+
172
+ def test_interception_only_conditions
173
+ assert(@service.only_invoked.nil?)
174
+ perform_invocation(:only_one)
175
+ assert(@service.only_invoked == :only_one)
176
+ assert(@service.block_invoked == :only_one)
177
+ assert(InvocationTest::InterceptorClass.args[1] == :only_one)
178
+ @service.only_invoked = nil
179
+ perform_invocation(:only_two)
180
+ assert(@service.only_invoked == :only_two)
181
+ end
182
+
183
+ private
184
+ def perform_invocation(method_name, *args, &block)
185
+ @service.perform_invocation(method_name, args, &block)
186
+ end
187
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
4
+ args = Dir[File.join(File.dirname(__FILE__), '*_test.rb')] + Dir[File.join(File.dirname(__FILE__), 'ws/*_test.rb')]
5
+ (r = Test::Unit::AutoRunner.new(true)).process_args(args)
6
+ exit r.run
@@ -0,0 +1,148 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ ActionController::Routing::Routes.draw do |map|
5
+ map.connect '', :controller => 'scaffolded'
6
+ map.connect ':controller/:action/:id'
7
+ end
8
+
9
+ ActionController::Base.view_paths = [ '.' ]
10
+
11
+ class ScaffoldPerson < ActionWebService::Struct
12
+ member :id, :int
13
+ member :name, :string
14
+ member :birth, :date
15
+
16
+ def ==(other)
17
+ self.id == other.id && self.name == other.name
18
+ end
19
+ end
20
+
21
+ class ScaffoldedControllerTestAPI < ActionWebService::API::Base
22
+ api_method :hello, :expects => [{:integer=>:int}, :string], :returns => [:bool]
23
+ api_method :hello_struct_param, :expects => [{:person => ScaffoldPerson}], :returns => [:bool]
24
+ api_method :date_of_birth, :expects => [ScaffoldPerson], :returns => [:string]
25
+ api_method :bye, :returns => [[ScaffoldPerson]]
26
+ api_method :date_diff, :expects => [{:start_date => :date}, {:end_date => :date}], :returns => [:int]
27
+ api_method :time_diff, :expects => [{:start_time => :time}, {:end_time => :time}], :returns => [:int]
28
+ api_method :base64_upcase, :expects => [:base64], :returns => [:base64]
29
+ end
30
+
31
+ class ScaffoldedController < ActionController::Base
32
+ acts_as_web_service
33
+ web_service_api ScaffoldedControllerTestAPI
34
+ web_service_scaffold :scaffold_invoke
35
+
36
+ def hello(int, string)
37
+ 0
38
+ end
39
+
40
+ def hello_struct_param(person)
41
+ 0
42
+ end
43
+
44
+ def date_of_birth(person)
45
+ person.birth.to_s
46
+ end
47
+
48
+ def bye
49
+ [ScaffoldPerson.new(:id => 1, :name => "leon"), ScaffoldPerson.new(:id => 2, :name => "paul")]
50
+ end
51
+
52
+ def rescue_action(e)
53
+ raise e
54
+ end
55
+
56
+ def date_diff(start_date, end_date)
57
+ end_date - start_date
58
+ end
59
+
60
+ def time_diff(start_time, end_time)
61
+ end_time - start_time
62
+ end
63
+
64
+ def base64_upcase(data)
65
+ data.upcase
66
+ end
67
+ end
68
+
69
+ class ScaffoldedControllerTest < ActionController::TestCase
70
+ # def setup
71
+ # @controller = ScaffoldedController.new
72
+ # @request = ActionController::TestRequest.new
73
+ # @response = ActionController::TestResponse.new
74
+ # end
75
+
76
+ def test_scaffold_invoke
77
+ get :scaffold_invoke
78
+ assert_template 'methods.html.erb'
79
+ end
80
+
81
+ def test_scaffold_invoke_method_params
82
+ get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'Hello'
83
+ assert_template 'parameters.html.erb'
84
+ end
85
+
86
+ def test_scaffold_invoke_method_params_with_struct
87
+ get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'HelloStructParam'
88
+ assert_template 'parameters.html.erb'
89
+ assert_tag :tag => 'form'
90
+ assert_tag :tag => 'input', :attributes => {:name => "method_params[0][name]"}
91
+ end
92
+
93
+ def test_scaffold_invoke_submit_hello
94
+ post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'Hello', :method_params => {'0' => '5', '1' => 'hello world'}
95
+ assert_template 'result.html.erb'
96
+ assert_equal false, @controller.instance_eval{ @method_return_value }
97
+ end
98
+
99
+ def test_scaffold_invoke_submit_bye
100
+ post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'Bye'
101
+ assert_template 'result.html.erb'
102
+ persons = [ScaffoldPerson.new(:id => 1, :name => "leon"), ScaffoldPerson.new(:id => 2, :name => "paul")]
103
+ assert_equal persons, @controller.instance_eval{ @method_return_value }
104
+ end
105
+
106
+ def test_scaffold_date_params
107
+ get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'DateDiff'
108
+ (0..1).each do |param|
109
+ (1..3).each do |date_part|
110
+ assert_tag :tag => 'select', :attributes => {:name => "method_params[#{param}][#{date_part}]"},
111
+ :children => {:greater_than => 1, :only => {:tag => 'option'}}
112
+ end
113
+ end
114
+
115
+ post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'DateDiff',
116
+ :method_params => {'0' => {'1' => '2006', '2' => '2', '3' => '1'}, '1' => {'1' => '2006', '2' => '2', '3' => '2'}}
117
+ assert_equal 1, @controller.instance_eval{ @method_return_value }
118
+ end
119
+
120
+ def test_scaffold_struct_date_params
121
+ post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'DateOfBirth',
122
+ :method_params => {'0' => {'birth' => {'1' => '2006', '2' => '2', '3' => '1'}, 'id' => '1', 'name' => 'person'}}
123
+ assert_equal '2006-02-01', @controller.instance_eval{ @method_return_value }
124
+ end
125
+
126
+ def test_scaffold_time_params
127
+ get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'TimeDiff'
128
+ (0..1).each do |param|
129
+ (1..6).each do |date_part|
130
+ assert_tag :tag => 'select', :attributes => {:name => "method_params[#{param}][#{date_part}]"},
131
+ :children => {:greater_than => 1, :only => {:tag => 'option'}}
132
+ end
133
+ end
134
+
135
+ post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'TimeDiff',
136
+ :method_params => {'0' => {'1' => '2006', '2' => '2', '3' => '1', '4' => '1', '5' => '1', '6' => '1'},
137
+ '1' => {'1' => '2006', '2' => '2', '3' => '2', '4' => '1', '5' => '1', '6' => '1'}}
138
+ assert_equal 86400, @controller.instance_eval{ @method_return_value }
139
+ end
140
+
141
+ def test_scaffold_base64
142
+ get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'Base64Upcase'
143
+ assert_tag :tag => 'textarea', :attributes => {:name => 'method_params[0]'}
144
+
145
+ post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'Base64Upcase', :method_params => {'0' => 'scaffold'}
146
+ assert_equal 'SCAFFOLD', @controller.instance_eval{ @method_return_value }
147
+ end
148
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ module StructTest
5
+ class Struct < ActionWebService::Struct
6
+ member :id, Integer
7
+ member :name, String
8
+ member :items, [String]
9
+ member :deleted, :bool
10
+ member :emails, [:string]
11
+ end
12
+ end
13
+
14
+ class TC_Struct < Test::Unit::TestCase
15
+ include StructTest
16
+
17
+ def setup
18
+ @struct = Struct.new(:id => 5,
19
+ :name => 'hello',
20
+ :items => ['one', 'two'],
21
+ :deleted => true,
22
+ :emails => ['test@test.com'])
23
+ end
24
+
25
+ def test_members
26
+ assert_equal(5, Struct.members.size)
27
+ assert_equal(Integer, Struct.members[:id][0].type_class)
28
+ assert_equal(String, Struct.members[:name][0].type_class)
29
+ assert_equal(String, Struct.members[:items][0].element_type.type_class)
30
+ assert_equal(TrueClass, Struct.members[:deleted][0].type_class)
31
+ assert_equal(String, Struct.members[:emails][0].element_type.type_class)
32
+ end
33
+
34
+ def test_initializer_and_lookup
35
+ assert_equal(5, @struct.id)
36
+ assert_equal('hello', @struct.name)
37
+ assert_equal(['one', 'two'], @struct.items)
38
+ assert_equal(true, @struct.deleted)
39
+ assert_equal(['test@test.com'], @struct.emails)
40
+ assert_equal(5, @struct['id'])
41
+ assert_equal('hello', @struct['name'])
42
+ assert_equal(['one', 'two'], @struct['items'])
43
+ assert_equal(true, @struct['deleted'])
44
+ assert_equal(['test@test.com'], @struct['emails'])
45
+ end
46
+
47
+ def test_initializing_with_invalid_hash_and_not_checking
48
+
49
+ attrib_hash = { :id => 5,
50
+ :name => 'hello',
51
+ :items => ['one', 'two'],
52
+ :deleted => true,
53
+ :emails => ['test@test.com'],
54
+ :extra => "extra_field"
55
+ }
56
+
57
+ assert_raise NoMethodError do
58
+ struct = Struct.new(attrib_hash)
59
+ end
60
+ end
61
+
62
+ def test_initializing_with_invalid_hash_and_with_hash_checking
63
+
64
+ attrib_hash = { :id => 5,
65
+ :name => 'hello',
66
+ :items => ['one', 'two'],
67
+ :deleted => true,
68
+ :emails => ['test@test.com'],
69
+ :extra => "extra_field"
70
+ }
71
+
72
+ assert_nothing_raised do
73
+ struct = Struct.new(attrib_hash, true)
74
+ end
75
+ struct = Struct.new(attrib_hash, true)
76
+ assert_equal(5, struct['id'])
77
+ end
78
+
79
+ def test_each_pair
80
+ @struct.each_pair do |name, value|
81
+ assert_equal @struct.__send__(name), value
82
+ assert_equal @struct[name], value
83
+ end
84
+ end
85
+ end