rubyjedi-actionwebservice 2.3.5.20100615120735

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.
Files changed (85) hide show
  1. data/CHANGELOG +335 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +180 -0
  5. data/TODO +32 -0
  6. data/examples/googlesearch/README +143 -0
  7. data/examples/googlesearch/autoloading/google_search_api.rb +50 -0
  8. data/examples/googlesearch/autoloading/google_search_controller.rb +57 -0
  9. data/examples/googlesearch/delegated/google_search_service.rb +108 -0
  10. data/examples/googlesearch/delegated/search_controller.rb +7 -0
  11. data/examples/googlesearch/direct/google_search_api.rb +50 -0
  12. data/examples/googlesearch/direct/search_controller.rb +58 -0
  13. data/examples/metaWeblog/README +17 -0
  14. data/examples/metaWeblog/apis/blogger_api.rb +60 -0
  15. data/examples/metaWeblog/apis/blogger_service.rb +34 -0
  16. data/examples/metaWeblog/apis/meta_weblog_api.rb +67 -0
  17. data/examples/metaWeblog/apis/meta_weblog_service.rb +48 -0
  18. data/examples/metaWeblog/controllers/xmlrpc_controller.rb +16 -0
  19. data/generators/web_service/USAGE +28 -0
  20. data/generators/web_service/templates/api_definition.rb +5 -0
  21. data/generators/web_service/templates/controller.rb +8 -0
  22. data/generators/web_service/templates/functional_test.rb +19 -0
  23. data/generators/web_service/web_service_generator.rb +29 -0
  24. data/lib/action_web_service/acts_as_web_service.rb +24 -0
  25. data/lib/action_web_service/api.rb +297 -0
  26. data/lib/action_web_service/base.rb +38 -0
  27. data/lib/action_web_service/casting.rb +151 -0
  28. data/lib/action_web_service/client/base.rb +28 -0
  29. data/lib/action_web_service/client/soap_client.rb +113 -0
  30. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  31. data/lib/action_web_service/client.rb +3 -0
  32. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  33. data/lib/action_web_service/container/delegated_container.rb +86 -0
  34. data/lib/action_web_service/container/direct_container.rb +69 -0
  35. data/lib/action_web_service/container.rb +3 -0
  36. data/lib/action_web_service/dispatcher/abstract.rb +208 -0
  37. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +396 -0
  38. data/lib/action_web_service/dispatcher.rb +2 -0
  39. data/lib/action_web_service/invocation.rb +202 -0
  40. data/lib/action_web_service/protocol/abstract.rb +112 -0
  41. data/lib/action_web_service/protocol/discovery.rb +37 -0
  42. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  43. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  44. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +123 -0
  45. data/lib/action_web_service/protocol.rb +4 -0
  46. data/lib/action_web_service/scaffolding.rb +281 -0
  47. data/lib/action_web_service/simple.rb +53 -0
  48. data/lib/action_web_service/string_to_datetime_for_soap.rb +16 -0
  49. data/lib/action_web_service/struct.rb +68 -0
  50. data/lib/action_web_service/support/class_inheritable_options.rb +26 -0
  51. data/lib/action_web_service/support/signature_types.rb +261 -0
  52. data/lib/action_web_service/templates/scaffolds/layout.html.erb +65 -0
  53. data/lib/action_web_service/templates/scaffolds/methods.html.erb +6 -0
  54. data/lib/action_web_service/templates/scaffolds/parameters.html.erb +29 -0
  55. data/lib/action_web_service/templates/scaffolds/result.html.erb +30 -0
  56. data/lib/action_web_service/test_invoke.rb +110 -0
  57. data/lib/action_web_service/version.rb +9 -0
  58. data/lib/action_web_service.rb +60 -0
  59. data/lib/actionwebservice.rb +1 -0
  60. data/setup.rb +1379 -0
  61. data/test/abstract_client.rb +184 -0
  62. data/test/abstract_dispatcher.rb +549 -0
  63. data/test/abstract_unit.rb +43 -0
  64. data/test/actionwebservice_unittest.db +0 -0
  65. data/test/api_test.rb +102 -0
  66. data/test/apis/auto_load_api.rb +3 -0
  67. data/test/apis/broken_auto_load_api.rb +2 -0
  68. data/test/base_test.rb +42 -0
  69. data/test/casting_test.rb +95 -0
  70. data/test/client_soap_test.rb +156 -0
  71. data/test/client_xmlrpc_test.rb +154 -0
  72. data/test/container_test.rb +75 -0
  73. data/test/debug.log +12305 -0
  74. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  75. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -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 +186 -0
  81. data/test/run +6 -0
  82. data/test/scaffolded_controller_test.rb +147 -0
  83. data/test/struct_test.rb +84 -0
  84. data/test/test_invoke_test.rb +113 -0
  85. metadata +182 -0
data/test/base_test.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'abstract_unit'
2
+
3
+ module BaseTest
4
+ class API < ActionWebService::API::Base
5
+ api_method :add, :expects => [:int, :int], :returns => [:int]
6
+ api_method :void
7
+ end
8
+
9
+ class PristineAPI < ActionWebService::API::Base
10
+ inflect_names false
11
+
12
+ api_method :add
13
+ api_method :under_score
14
+ end
15
+
16
+ class Service < ActionWebService::Base
17
+ web_service_api API
18
+
19
+ def add(a, b)
20
+ end
21
+
22
+ def void
23
+ end
24
+ end
25
+
26
+ class PristineService < ActionWebService::Base
27
+ web_service_api PristineAPI
28
+
29
+ def add
30
+ end
31
+
32
+ def under_score
33
+ end
34
+ end
35
+ end
36
+
37
+ class TC_Base < ActiveSupport::TestCase
38
+ def test_options
39
+ assert(BaseTest::PristineService.web_service_api.inflect_names == false)
40
+ assert(BaseTest::Service.web_service_api.inflect_names == true)
41
+ end
42
+ end
@@ -0,0 +1,95 @@
1
+ require 'abstract_unit'
2
+
3
+ module CastingTest
4
+ class A < ActionWebService::Struct; end
5
+ class B < A; end
6
+ class API < ActionWebService::API::Base
7
+ api_method :int, :expects => [:int]
8
+ api_method :str, :expects => [:string]
9
+ api_method :base64, :expects => [:base64]
10
+ api_method :bool, :expects => [:bool]
11
+ api_method :float, :expects => [:float]
12
+ api_method :time, :expects => [:time]
13
+ api_method :datetime, :expects => [:datetime]
14
+ api_method :date, :expects => [:date]
15
+
16
+ api_method :int_array, :expects => [[:int]]
17
+ api_method :str_array, :expects => [[:string]]
18
+ api_method :bool_array, :expects => [[:bool]]
19
+
20
+ api_method :a, :expects => [A]
21
+ end
22
+ end
23
+
24
+ class TC_Casting < Test::Unit::TestCase
25
+ include CastingTest
26
+
27
+ def test_base_type_casting_valid
28
+ assert_equal 10000, cast_expects(:int, '10000')[0]
29
+ assert_equal '10000', cast_expects(:str, 10000)[0]
30
+ base64 = cast_expects(:base64, 10000)[0]
31
+ assert_equal '10000', base64
32
+ assert_instance_of ActionWebService::Base64, base64
33
+ [1, '1', 'true', 'y', 'yes'].each do |val|
34
+ assert_equal true, cast_expects(:bool, val)[0]
35
+ end
36
+ [0, '0', 'false', 'n', 'no'].each do |val|
37
+ assert_equal false, cast_expects(:bool, val)[0]
38
+ end
39
+ assert_equal 3.14159, cast_expects(:float, '3.14159')[0]
40
+ now = Time.at(Time.now.tv_sec)
41
+ casted = cast_expects(:time, now.to_s)[0]
42
+ assert_equal now, casted
43
+ now = DateTime.now
44
+ assert_equal now.to_s, cast_expects(:datetime, now.to_s)[0].to_s
45
+ today = Date.today
46
+ assert_equal today, cast_expects(:date, today.to_s)[0]
47
+ end
48
+
49
+ def test_base_type_casting_invalid
50
+ assert_raises ArgumentError do
51
+ cast_expects(:int, 'this is not a number')
52
+ end
53
+ assert_raises ActionWebService::Casting::CastingError do
54
+ # neither true or false ;)
55
+ cast_expects(:bool, 'i always lie')
56
+ end
57
+ assert_raises ArgumentError do
58
+ cast_expects(:float, 'not a float')
59
+ end
60
+ # not sure why this test fails but too lazy to find out why :-(
61
+ # assert_raises ArgumentError do
62
+ # cast_expects(:time, '111111111111111111111111111111111')
63
+ # end
64
+ assert_raises ArgumentError do
65
+ cast_expects(:datetime, '-1')
66
+ end
67
+ assert_raises ArgumentError do
68
+ cast_expects(:date, '')
69
+ end
70
+ end
71
+
72
+ def test_array_type_casting
73
+ assert_equal [1, 2, 3213992, 4], cast_expects(:int_array, ['1', '2', '3213992', '4'])[0]
74
+ assert_equal ['one', 'two', '5.0', '200', nil, 'true'], cast_expects(:str_array, [:one, 'two', 5.0, 200, nil, true])[0]
75
+ assert_equal [true, nil, true, true, false], cast_expects(:bool_array, ['1', nil, 'y', true, 'false'])[0]
76
+ end
77
+
78
+ def test_array_type_casting_failure
79
+ assert_raises ActionWebService::Casting::CastingError do
80
+ cast_expects(:bool_array, ['false', 'blahblah'])
81
+ end
82
+ assert_raises ArgumentError do
83
+ cast_expects(:int_array, ['1', '2.021', '4'])
84
+ end
85
+ end
86
+
87
+ def test_structured_type_casting_with_polymorphism
88
+ assert cast_expects(:a, B.new)[0].is_a?(B)
89
+ end
90
+
91
+ private
92
+ def cast_expects(method_name, *args)
93
+ API.api_method_instance(method_name.to_sym).cast_expects([*args])
94
+ end
95
+ end
@@ -0,0 +1,156 @@
1
+ require 'abstract_client'
2
+
3
+
4
+ module ClientSoapTest
5
+ PORT = 8998
6
+
7
+ class SoapClientLet < ClientTest::AbstractClientLet
8
+ def do_POST(req, res)
9
+ test_request = ActionController::TestRequest.new
10
+ test_request.request_parameters['action'] = req.path.gsub(/^\//, '').split(/\//)[1]
11
+ test_request.env['REQUEST_METHOD'] = "POST"
12
+ test_request.env['HTTP_CONTENTTYPE'] = 'text/xml'
13
+ test_request.env['HTTP_SOAPACTION'] = req.header['soapaction'][0]
14
+ test_request.env['RAW_POST_DATA'] = req.body
15
+ response = ActionController::TestResponse.new
16
+ @controller.process(test_request, response)
17
+ res.header['content-type'] = 'text/xml'
18
+ res.body = response.body
19
+ rescue Exception => e
20
+ $stderr.puts e.message
21
+ $stderr.puts e.backtrace.join("\n")
22
+ ensure
23
+ ActiveRecord::Base.clear_active_connections!
24
+ end
25
+ end
26
+
27
+ class ClientContainer < ActionController::Base
28
+ acts_as_web_service
29
+ web_client_api :client, :soap, "http://localhost:#{PORT}/client/api", :api => ClientTest::API
30
+ web_client_api :invalid, :null, "", :api => true
31
+
32
+ def get_client
33
+ client
34
+ end
35
+
36
+ def get_invalid
37
+ invalid
38
+ end
39
+ end
40
+
41
+ class SoapServer < ClientTest::AbstractServer
42
+ def create_clientlet(controller)
43
+ SoapClientLet.new(controller)
44
+ end
45
+
46
+ def server_port
47
+ PORT
48
+ end
49
+ end
50
+ end
51
+
52
+ class TC_ClientSoap < ActiveSupport::TestCase
53
+ include ClientTest
54
+ include ClientSoapTest
55
+
56
+ fixtures :users
57
+
58
+ def setup
59
+ @server = SoapServer.instance
60
+ @container = @server.container
61
+ @client = ActionWebService::Client::Soap.new(API, "http://localhost:#{@server.server_port}/client/api")
62
+ end
63
+
64
+ def test_void
65
+ assert(@container.value_void.nil?)
66
+ @client.void
67
+ assert(!@container.value_void.nil?)
68
+ end
69
+
70
+ def test_normal
71
+ assert(@container.value_normal.nil?)
72
+ assert_equal(5, @client.normal(5, 6))
73
+ assert_equal([5, 6], @container.value_normal)
74
+ assert_equal(5, @client.normal("7", "8"))
75
+ assert_equal([7, 8], @container.value_normal)
76
+ assert_equal(5, @client.normal(true, false))
77
+ end
78
+
79
+ def test_array_return
80
+ assert(@container.value_array_return.nil?)
81
+ new_person = Person.new
82
+ new_person.firstnames = ["one", "two"]
83
+ new_person.lastname = "last"
84
+ assert_equal([new_person], @client.array_return)
85
+ assert_equal([new_person], @container.value_array_return)
86
+ end
87
+
88
+ def test_struct_pass
89
+ assert(@container.value_struct_pass.nil?)
90
+ new_person = Person.new
91
+ new_person.firstnames = ["one", "two"]
92
+ new_person.lastname = "last"
93
+ assert_equal(true, @client.struct_pass([new_person]))
94
+ assert_equal([[new_person]], @container.value_struct_pass)
95
+ end
96
+
97
+ def test_nil_struct_return
98
+ assert_nil @client.nil_struct_return
99
+ end
100
+
101
+ def test_inner_nil
102
+ outer = @client.inner_nil
103
+ assert_equal 'outer', outer.name
104
+ assert_nil outer.inner
105
+ end
106
+
107
+ def test_client_container
108
+ assert_equal(50, ClientContainer.new.get_client.client_container)
109
+ assert(ClientContainer.new.get_invalid.nil?)
110
+ end
111
+
112
+ def test_named_parameters
113
+ assert(@container.value_named_parameters.nil?)
114
+ assert(@client.named_parameters("key", 5).nil?)
115
+ assert_equal(["key", 5], @container.value_named_parameters)
116
+ end
117
+
118
+ def test_capitalized_method_name
119
+ @container.value_normal = nil
120
+ assert_equal(5, @client.Normal(5, 6))
121
+ assert_equal([5, 6], @container.value_normal)
122
+ @container.value_normal = nil
123
+ end
124
+
125
+ def test_model_return
126
+ user = @client.user_return
127
+ assert_equal 1, user.id
128
+ assert_equal 'Kent', user.name
129
+ assert user.active?
130
+ assert_kind_of Date, user.created_on
131
+ assert_equal Date.today, user.created_on
132
+ assert_equal BigDecimal('12.2'), user.balance
133
+ end
134
+
135
+ def test_with_model
136
+ with_model = @client.with_model_return
137
+ assert_equal 'Kent', with_model.user.name
138
+ assert_equal 2, with_model.users.size
139
+ with_model.users.each do |user|
140
+ assert_kind_of User, user
141
+ end
142
+ end
143
+
144
+ def test_scoped_model_return
145
+ scoped_model = @client.scoped_model_return
146
+ assert_kind_of Accounting::User, scoped_model
147
+ assert_equal 'Kent', scoped_model.name
148
+ end
149
+
150
+ def test_multi_dim_return
151
+ md_struct = @client.multi_dim_return
152
+ assert_kind_of Array, md_struct.pref
153
+ assert_equal 2, md_struct.pref.size
154
+ assert_kind_of Array, md_struct.pref[0]
155
+ end
156
+ end
@@ -0,0 +1,154 @@
1
+ require 'abstract_client'
2
+
3
+
4
+ module ClientXmlRpcTest
5
+ PORT = 8999
6
+
7
+ class XmlRpcClientLet < ClientTest::AbstractClientLet
8
+ def do_POST(req, res)
9
+ test_request = ActionController::TestRequest.new
10
+ test_request.request_parameters['action'] = req.path.gsub(/^\//, '').split(/\//)[1]
11
+ test_request.env['REQUEST_METHOD'] = "POST"
12
+ test_request.env['HTTP_CONTENT_TYPE'] = 'text/xml'
13
+ test_request.env['RAW_POST_DATA'] = req.body
14
+ response = ActionController::TestResponse.new
15
+ @controller.process(test_request, response)
16
+ res.header['content-type'] = 'text/xml'
17
+ res.body = response.body
18
+ rescue Exception => e
19
+ $stderr.puts e.message
20
+ $stderr.puts e.backtrace.join("\n")
21
+ ensure
22
+ ActiveRecord::Base.clear_active_connections!
23
+ end
24
+ end
25
+
26
+ class ClientContainer < ActionController::Base
27
+ acts_as_web_service
28
+ web_client_api :client, :xmlrpc, "http://localhost:#{PORT}/client/api", :api => ClientTest::API
29
+
30
+ def get_client
31
+ client
32
+ end
33
+ end
34
+
35
+ class XmlRpcServer < ClientTest::AbstractServer
36
+ def create_clientlet(controller)
37
+ XmlRpcClientLet.new(controller)
38
+ end
39
+
40
+ def server_port
41
+ PORT
42
+ end
43
+ end
44
+ end
45
+
46
+ class TC_ClientXmlRpc < ActiveSupport::TestCase
47
+ include ClientTest
48
+ include ClientXmlRpcTest
49
+
50
+ fixtures :users
51
+
52
+ def setup
53
+ @server = XmlRpcServer.instance
54
+ @container = @server.container
55
+ @client = ActionWebService::Client::XmlRpc.new(API, "http://localhost:#{@server.server_port}/client/api")
56
+ end
57
+
58
+ def test_void
59
+ assert(@container.value_void.nil?)
60
+ @client.void
61
+ assert(!@container.value_void.nil?)
62
+ end
63
+
64
+ def test_normal
65
+ assert(@container.value_normal.nil?)
66
+ assert_equal(5, @client.normal(5, 6))
67
+ assert_equal([5, 6], @container.value_normal)
68
+ assert_equal(5, @client.normal("7", "8"))
69
+ assert_equal([7, 8], @container.value_normal)
70
+ assert_equal(5, @client.normal(true, false))
71
+ end
72
+
73
+ def test_array_return
74
+ assert(@container.value_array_return.nil?)
75
+ new_person = Person.new
76
+ new_person.firstnames = ["one", "two"]
77
+ new_person.lastname = "last"
78
+ assert_equal([new_person], @client.array_return)
79
+ assert_equal([new_person], @container.value_array_return)
80
+ end
81
+
82
+ def test_struct_pass
83
+ assert(@container.value_struct_pass.nil?)
84
+ new_person = Person.new
85
+ new_person.firstnames = ["one", "two"]
86
+ new_person.lastname = "last"
87
+ assert_equal(true, @client.struct_pass([new_person]))
88
+ assert_equal([[new_person]], @container.value_struct_pass)
89
+ end
90
+
91
+ def test_nil_struct_return
92
+ assert_equal false, @client.nil_struct_return
93
+ end
94
+
95
+ def test_inner_nil
96
+ outer = @client.inner_nil
97
+ assert_equal 'outer', outer.name
98
+ assert_nil outer.inner
99
+ end
100
+
101
+ def test_client_container
102
+ assert_equal(50, ClientContainer.new.get_client.client_container)
103
+ end
104
+
105
+ def test_named_parameters
106
+ assert(@container.value_named_parameters.nil?)
107
+ assert_equal(false, @client.named_parameters("xxx", 7))
108
+ assert_equal(["xxx", 7], @container.value_named_parameters)
109
+ end
110
+
111
+ def test_exception
112
+ assert_raises(ActionWebService::Client::ClientError) do
113
+ assert(@client.thrower)
114
+ end
115
+ end
116
+
117
+ def test_invalid_signature
118
+ assert_raises(ArgumentError) do
119
+ @client.normal
120
+ end
121
+ end
122
+
123
+ def test_model_return
124
+ user = @client.user_return
125
+ assert_equal 1, user.id
126
+ assert_equal 'Kent', user.name
127
+ assert user.active?
128
+ assert_kind_of Time, user.created_on
129
+ assert_equal Time.utc(Time.now.year, Time.now.month, Time.now.day), user.created_on
130
+ assert_equal BigDecimal('12.2'), user.balance
131
+ end
132
+
133
+ def test_with_model
134
+ with_model = @client.with_model_return
135
+ assert_equal 'Kent', with_model.user.name
136
+ assert_equal 2, with_model.users.size
137
+ with_model.users.each do |user|
138
+ assert_kind_of User, user
139
+ end
140
+ end
141
+
142
+ def test_scoped_model_return
143
+ scoped_model = @client.scoped_model_return
144
+ assert_kind_of Accounting::User, scoped_model
145
+ assert_equal 'Kent', scoped_model.name
146
+ end
147
+
148
+ def test_multi_dim_return
149
+ md_struct = @client.multi_dim_return
150
+ assert_kind_of Array, md_struct.pref
151
+ assert_equal 2, md_struct.pref.size
152
+ assert_kind_of Array, md_struct.pref[0]
153
+ end
154
+ end
@@ -0,0 +1,75 @@
1
+ require 'abstract_unit'
2
+
3
+ module ContainerTest
4
+ $immediate_service = Object.new
5
+ $deferred_service = Object.new
6
+
7
+ class DelegateContainer < ActionController::Base
8
+ acts_as_web_service
9
+ web_service_dispatching_mode :delegated
10
+
11
+ attr :flag
12
+ attr :previous_flag
13
+
14
+ def initialize
15
+ @previous_flag = nil
16
+ @flag = true
17
+ end
18
+
19
+ web_service :immediate_service, $immediate_service
20
+ web_service(:deferred_service) { @previous_flag = @flag; @flag = false; $deferred_service }
21
+ end
22
+
23
+ class DirectContainer < ActionController::Base
24
+ acts_as_web_service
25
+ web_service_dispatching_mode :direct
26
+ end
27
+
28
+ class InvalidContainer
29
+ include ActionWebService::Container::Direct
30
+ end
31
+ end
32
+
33
+ class TC_Container < Test::Unit::TestCase
34
+ include ContainerTest
35
+
36
+ def setup
37
+ @delegate_container = DelegateContainer.new
38
+ @direct_container = DirectContainer.new
39
+ end
40
+
41
+ def test_registration
42
+ assert(DelegateContainer.has_web_service?(:immediate_service))
43
+ assert(DelegateContainer.has_web_service?(:deferred_service))
44
+ assert(!DelegateContainer.has_web_service?(:fake_service))
45
+ assert_raises(ActionWebService::Container::Delegated::ContainerError) do
46
+ DelegateContainer.web_service('invalid')
47
+ end
48
+ end
49
+
50
+ def test_service_object
51
+ assert_raises(ActionWebService::Container::Delegated::ContainerError) do
52
+ @delegate_container.web_service_object(:nonexistent)
53
+ end
54
+ assert(@delegate_container.flag == true)
55
+ assert(@delegate_container.web_service_object(:immediate_service) == $immediate_service)
56
+ assert(@delegate_container.previous_flag.nil?)
57
+ assert(@delegate_container.flag == true)
58
+ assert(@delegate_container.web_service_object(:deferred_service) == $deferred_service)
59
+ assert(@delegate_container.previous_flag == true)
60
+ assert(@delegate_container.flag == false)
61
+ end
62
+
63
+ def test_direct_container
64
+ assert(DirectContainer.web_service_dispatching_mode == :direct)
65
+ end
66
+
67
+ def test_validity
68
+ assert_raises(ActionWebService::Container::Direct::ContainerError) do
69
+ InvalidContainer.web_service_api :test
70
+ end
71
+ assert_raises(ActionWebService::Container::Direct::ContainerError) do
72
+ InvalidContainer.web_service_api 50.0
73
+ end
74
+ end
75
+ end