backlog 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/History.txt +10 -0
  2. data/Rakefile +2 -1
  3. data/app/controllers/application.rb +55 -8
  4. data/app/controllers/groups_controller.rb +62 -0
  5. data/app/controllers/periods_controller.rb +13 -55
  6. data/app/controllers/tasks_controller.rb +9 -5
  7. data/app/controllers/works_controller.rb +43 -6
  8. data/app/helpers/application_helper.rb +20 -2
  9. data/app/helpers/groups_helper.rb +2 -0
  10. data/app/models/backlog.rb +19 -10
  11. data/app/models/estimate.rb +2 -1
  12. data/app/models/group.rb +11 -0
  13. data/app/models/party.rb +3 -0
  14. data/app/models/period.rb +43 -6
  15. data/app/models/task.rb +27 -14
  16. data/app/models/user.rb +37 -8
  17. data/app/models/work.rb +4 -6
  18. data/app/views/backlogs/_name_list.rhtml +5 -0
  19. data/app/views/backlogs/show.rhtml +4 -4
  20. data/app/views/groups/_form.rhtml +7 -0
  21. data/app/views/groups/edit.rhtml +31 -0
  22. data/app/views/groups/list.rhtml +27 -0
  23. data/app/views/groups/new.rhtml +8 -0
  24. data/app/views/layouts/wide.rhtml +2 -2
  25. data/app/views/periods/_burn_down_chart.rhtml +1 -1
  26. data/app/views/periods/_form.rhtml +13 -9
  27. data/app/views/periods/_show_active.rhtml +6 -12
  28. data/app/views/periods/_title.rhtml +4 -5
  29. data/app/views/periods/edit.rhtml +1 -1
  30. data/app/views/periods/new.rhtml +1 -1
  31. data/app/views/periods/show.rhtml +10 -6
  32. data/app/views/tasks/_backlog_header.rhtml +22 -0
  33. data/app/views/tasks/_description_list.rhtml +5 -0
  34. data/app/views/tasks/_form.rhtml +26 -7
  35. data/app/views/tasks/_task.rhtml +4 -4
  36. data/app/views/tasks/edit.rhtml +2 -3
  37. data/app/views/tasks/list_started.rhtml +1 -0
  38. data/app/views/tasks/new.rhtml +2 -2
  39. data/app/views/works/_buttons.rhtml +3 -0
  40. data/app/views/works/_form.rhtml +15 -10
  41. data/app/views/works/daily_work_sheet.rhtml +30 -18
  42. data/app/views/works/edit.rhtml +4 -4
  43. data/app/views/works/list.rhtml +2 -2
  44. data/app/views/works/new.rhtml +3 -2
  45. data/app/views/works/weekly_work_sheet.rhtml +2 -2
  46. data/bin/backlog +2 -0
  47. data/bin/backlog_init.d_kubosch_production +27 -0
  48. data/bin/copy_production2development.rb +33 -0
  49. data/config/database.yml +13 -7
  50. data/config/deploy_kubosch.rb +1 -0
  51. data/config/environment.rb +2 -0
  52. data/config/environments/development_mysql.rb +27 -0
  53. data/config/environments/kubosch_production_mysql.rb +21 -0
  54. data/config/routes.rb +1 -1
  55. data/db/migrate/{001_tasks.rb → 001_create_tasks.rb} +1 -1
  56. data/db/migrate/{002_backlogs.rb → 002_create_backlogs.rb} +2 -2
  57. data/db/migrate/003_add_estimation_points.rb +1 -1
  58. data/db/migrate/004_add_period.rb +2 -2
  59. data/db/migrate/013_create_estimates.rb +1 -1
  60. data/db/migrate/015_add_user_option.rb +9 -5
  61. data/db/migrate/017_insert_datek_projects.rb +13 -10
  62. data/db/migrate/018_create_groups.rb +115 -0
  63. data/db/schema.rb +72 -12
  64. data/lang/en.yaml +7 -0
  65. data/lang/no.yaml +7 -0
  66. data/lib/big_decimal_yaml_fix.rb +27 -0
  67. data/lib/class_table_inheritance.rb +163 -0
  68. data/lib/tasks/backup.rake +92 -0
  69. data/public/images/person.org.png +0 -0
  70. data/public/images/person.png +0 -0
  71. data/public/stylesheets/backlog.css +3 -1
  72. data/public/stylesheets/mwrt002.css +1 -1
  73. data/test/fixtures/groups.yml +6 -0
  74. data/test/fixtures/parties.yml +31 -0
  75. data/test/fixtures/periods.yml +2 -2
  76. data/test/fixtures/tasks.yml +2 -0
  77. data/test/fixtures/users.yml +6 -6
  78. data/test/functional/backlogs_controller_test.rb +1 -1
  79. data/test/functional/groups_controller_test.rb +120 -0
  80. data/test/functional/periods_controller_test.rb +1 -1
  81. data/test/functional/tasks_controller_test.rb +16 -1
  82. data/test/functional/user_controller_test.rb +8 -2
  83. data/test/test_helper.rb +5 -0
  84. data/test/unit/big_decimal_yaml_fix_test.rb +14 -0
  85. data/test/unit/estimate_test.rb +1 -1
  86. data/test/unit/group_test.rb +10 -0
  87. data/test/unit/user_test.rb +56 -44
  88. data/tmp/sessions/ruby_sess.22dec3e9df47fb4e +0 -0
  89. data/tmp/sessions/ruby_sess.8037e0ab58cbcf1a +0 -0
  90. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +35 -0
  91. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak +1 -0
  92. data/vendor/rails/{actionwebservice/lib/action_web_service/templates/scaffolds/layout.rhtml → railties/configs/empty.log} +0 -0
  93. metadata +36 -105
  94. data/backlog.gemspec +0 -21
  95. data/vendor/rails/actionwebservice/CHANGELOG +0 -265
  96. data/vendor/rails/actionwebservice/MIT-LICENSE +0 -21
  97. data/vendor/rails/actionwebservice/README +0 -364
  98. data/vendor/rails/actionwebservice/Rakefile +0 -171
  99. data/vendor/rails/actionwebservice/TODO +0 -32
  100. data/vendor/rails/actionwebservice/examples/googlesearch/README +0 -143
  101. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_api.rb +0 -50
  102. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_controller.rb +0 -57
  103. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/google_search_service.rb +0 -108
  104. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/search_controller.rb +0 -7
  105. data/vendor/rails/actionwebservice/examples/googlesearch/direct/google_search_api.rb +0 -50
  106. data/vendor/rails/actionwebservice/examples/googlesearch/direct/search_controller.rb +0 -58
  107. data/vendor/rails/actionwebservice/examples/metaWeblog/README +0 -17
  108. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_api.rb +0 -60
  109. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_service.rb +0 -34
  110. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_api.rb +0 -67
  111. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_service.rb +0 -48
  112. data/vendor/rails/actionwebservice/examples/metaWeblog/controllers/xmlrpc_controller.rb +0 -16
  113. data/vendor/rails/actionwebservice/install.rb +0 -30
  114. data/vendor/rails/actionwebservice/lib/action_web_service.rb +0 -66
  115. data/vendor/rails/actionwebservice/lib/action_web_service/api.rb +0 -301
  116. data/vendor/rails/actionwebservice/lib/action_web_service/base.rb +0 -42
  117. data/vendor/rails/actionwebservice/lib/action_web_service/casting.rb +0 -138
  118. data/vendor/rails/actionwebservice/lib/action_web_service/client.rb +0 -3
  119. data/vendor/rails/actionwebservice/lib/action_web_service/client/base.rb +0 -28
  120. data/vendor/rails/actionwebservice/lib/action_web_service/client/soap_client.rb +0 -113
  121. data/vendor/rails/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +0 -58
  122. data/vendor/rails/actionwebservice/lib/action_web_service/container.rb +0 -3
  123. data/vendor/rails/actionwebservice/lib/action_web_service/container/action_controller_container.rb +0 -93
  124. data/vendor/rails/actionwebservice/lib/action_web_service/container/delegated_container.rb +0 -86
  125. data/vendor/rails/actionwebservice/lib/action_web_service/container/direct_container.rb +0 -69
  126. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher.rb +0 -2
  127. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/abstract.rb +0 -207
  128. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +0 -379
  129. data/vendor/rails/actionwebservice/lib/action_web_service/invocation.rb +0 -202
  130. data/vendor/rails/actionwebservice/lib/action_web_service/protocol.rb +0 -4
  131. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/abstract.rb +0 -112
  132. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/discovery.rb +0 -37
  133. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol.rb +0 -176
  134. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +0 -235
  135. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +0 -122
  136. data/vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb +0 -283
  137. data/vendor/rails/actionwebservice/lib/action_web_service/struct.rb +0 -68
  138. data/vendor/rails/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb +0 -26
  139. data/vendor/rails/actionwebservice/lib/action_web_service/support/signature_types.rb +0 -226
  140. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/layout.erb +0 -65
  141. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.erb +0 -6
  142. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.rhtml +0 -0
  143. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.erb +0 -29
  144. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.rhtml +0 -0
  145. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.erb +0 -30
  146. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.rhtml +0 -0
  147. data/vendor/rails/actionwebservice/lib/action_web_service/test_invoke.rb +0 -110
  148. data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +0 -9
  149. data/vendor/rails/actionwebservice/setup.rb +0 -1379
  150. data/vendor/rails/actionwebservice/test/abstract_client.rb +0 -183
  151. data/vendor/rails/actionwebservice/test/abstract_dispatcher.rb +0 -551
  152. data/vendor/rails/actionwebservice/test/abstract_unit.rb +0 -45
  153. data/vendor/rails/actionwebservice/test/api_test.rb +0 -102
  154. data/vendor/rails/actionwebservice/test/apis/auto_load_api.rb +0 -3
  155. data/vendor/rails/actionwebservice/test/apis/broken_auto_load_api.rb +0 -2
  156. data/vendor/rails/actionwebservice/test/base_test.rb +0 -42
  157. data/vendor/rails/actionwebservice/test/casting_test.rb +0 -86
  158. data/vendor/rails/actionwebservice/test/client_soap_test.rb +0 -153
  159. data/vendor/rails/actionwebservice/test/client_xmlrpc_test.rb +0 -152
  160. data/vendor/rails/actionwebservice/test/container_test.rb +0 -73
  161. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_soap_test.rb +0 -137
  162. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_xmlrpc_test.rb +0 -59
  163. data/vendor/rails/actionwebservice/test/fixtures/db_definitions/mysql.sql +0 -8
  164. data/vendor/rails/actionwebservice/test/fixtures/users.yml +0 -12
  165. data/vendor/rails/actionwebservice/test/gencov +0 -3
  166. data/vendor/rails/actionwebservice/test/invocation_test.rb +0 -185
  167. data/vendor/rails/actionwebservice/test/run +0 -6
  168. data/vendor/rails/actionwebservice/test/scaffolded_controller_test.rb +0 -146
  169. data/vendor/rails/actionwebservice/test/struct_test.rb +0 -52
  170. data/vendor/rails/actionwebservice/test/test_invoke_test.rb +0 -112
@@ -1,42 +0,0 @@
1
- module ActionWebService # :nodoc:
2
- class ActionWebServiceError < StandardError # :nodoc:
3
- end
4
-
5
- # An Action Web Service object implements a specified API.
6
- #
7
- # Used by controllers operating in _Delegated_ dispatching mode.
8
- #
9
- # ==== Example
10
- #
11
- # class PersonService < ActionWebService::Base
12
- # web_service_api PersonAPI
13
- #
14
- # def find_person(criteria)
15
- # Person.find(:all) [...]
16
- # end
17
- #
18
- # def delete_person(id)
19
- # Person.find_by_id(id).destroy
20
- # end
21
- # end
22
- #
23
- # class PersonAPI < ActionWebService::API::Base
24
- # api_method :find_person, :expects => [SearchCriteria], :returns => [[Person]]
25
- # api_method :delete_person, :expects => [:int]
26
- # end
27
- #
28
- # class SearchCriteria < ActionWebService::Struct
29
- # member :firstname, :string
30
- # member :lastname, :string
31
- # member :email, :string
32
- # end
33
- class Base
34
- # Action WebService subclasses should be reloaded by the dispatcher in Rails
35
- # when Dependencies.mechanism = :load.
36
- include Reloadable::Deprecated
37
-
38
- # Whether to report exceptions back to the caller in the protocol's exception
39
- # format
40
- class_inheritable_option :web_service_exception_reporting, true
41
- end
42
- end
@@ -1,138 +0,0 @@
1
- require 'time'
2
- require 'date'
3
- require 'xmlrpc/datetime'
4
-
5
- module ActionWebService # :nodoc:
6
- module Casting # :nodoc:
7
- class CastingError < ActionWebServiceError # :nodoc:
8
- end
9
-
10
- # Performs casting of arbitrary values into the correct types for the signature
11
- class BaseCaster # :nodoc:
12
- def initialize(api_method)
13
- @api_method = api_method
14
- end
15
-
16
- # Coerces the parameters in +params+ (an Enumerable) into the types
17
- # this method expects
18
- def cast_expects(params)
19
- self.class.cast_expects(@api_method, params)
20
- end
21
-
22
- # Coerces the given +return_value+ into the type returned by this
23
- # method
24
- def cast_returns(return_value)
25
- self.class.cast_returns(@api_method, return_value)
26
- end
27
-
28
- class << self
29
- include ActionWebService::SignatureTypes
30
-
31
- def cast_expects(api_method, params) # :nodoc:
32
- return [] if api_method.expects.nil?
33
- api_method.expects.zip(params).map{ |type, param| cast(param, type) }
34
- end
35
-
36
- def cast_returns(api_method, return_value) # :nodoc:
37
- return nil if api_method.returns.nil?
38
- cast(return_value, api_method.returns[0])
39
- end
40
-
41
- def cast(value, signature_type) # :nodoc:
42
- return value if signature_type.nil? # signature.length != params.length
43
- return nil if value.nil?
44
- # XMLRPC protocol doesn't support nil values. It uses false instead.
45
- # It should never happen for SOAP.
46
- if signature_type.structured? && value.equal?(false)
47
- return nil
48
- end
49
- unless signature_type.array? || signature_type.structured?
50
- return value if canonical_type(value.class) == signature_type.type
51
- end
52
- if signature_type.array?
53
- unless value.respond_to?(:entries) && !value.is_a?(String)
54
- raise CastingError, "Don't know how to cast #{value.class} into #{signature_type.type.inspect}"
55
- end
56
- value.entries.map do |entry|
57
- cast(entry, signature_type.element_type)
58
- end
59
- elsif signature_type.structured?
60
- cast_to_structured_type(value, signature_type)
61
- elsif !signature_type.custom?
62
- cast_base_type(value, signature_type)
63
- end
64
- end
65
-
66
- def cast_base_type(value, signature_type) # :nodoc:
67
- # This is a work-around for the fact that XML-RPC special-cases DateTime values into its own DateTime type
68
- # in order to support iso8601 dates. This doesn't work too well for us, so we'll convert it into a Time,
69
- # with the caveat that we won't be able to handle pre-1970 dates that are sent to us.
70
- #
71
- # See http://dev.rubyonrails.com/ticket/2516
72
- value = value.to_time if value.is_a?(XMLRPC::DateTime)
73
-
74
- case signature_type.type
75
- when :int
76
- Integer(value)
77
- when :string
78
- value.to_s
79
- when :base64
80
- if value.is_a?(ActionWebService::Base64)
81
- value
82
- else
83
- ActionWebService::Base64.new(value.to_s)
84
- end
85
- when :bool
86
- return false if value.nil?
87
- return value if value == true || value == false
88
- case value.to_s.downcase
89
- when '1', 'true', 'y', 'yes'
90
- true
91
- when '0', 'false', 'n', 'no'
92
- false
93
- else
94
- raise CastingError, "Don't know how to cast #{value.class} into Boolean"
95
- end
96
- when :float
97
- Float(value)
98
- when :decimal
99
- BigDecimal(value.to_s)
100
- when :time
101
- value = "%s/%s/%s %s:%s:%s" % value.values_at(*%w[2 3 1 4 5 6]) if value.kind_of?(Hash)
102
- value.kind_of?(Time) ? value : Time.parse(value.to_s)
103
- when :date
104
- value = "%s/%s/%s" % value.values_at(*%w[2 3 1]) if value.kind_of?(Hash)
105
- value.kind_of?(Date) ? value : Date.parse(value.to_s)
106
- when :datetime
107
- value = "%s/%s/%s %s:%s:%s" % value.values_at(*%w[2 3 1 4 5 6]) if value.kind_of?(Hash)
108
- value.kind_of?(DateTime) ? value : DateTime.parse(value.to_s)
109
- end
110
- end
111
-
112
- def cast_to_structured_type(value, signature_type) # :nodoc:
113
- obj = nil
114
- obj = value if canonical_type(value.class) == canonical_type(signature_type.type)
115
- obj ||= signature_type.type_class.new
116
- if value.respond_to?(:each_pair)
117
- klass = signature_type.type_class
118
- value.each_pair do |name, val|
119
- type = klass.respond_to?(:member_type) ? klass.member_type(name) : nil
120
- val = cast(val, type) if type
121
- # See http://dev.rubyonrails.com/ticket/3567
122
- val = val.to_time if val.is_a?(XMLRPC::DateTime)
123
- obj.__send__("#{name}=", val) if obj.respond_to?(name)
124
- end
125
- elsif value.respond_to?(:attributes)
126
- signature_type.each_member do |name, type|
127
- val = value.__send__(name)
128
- obj.__send__("#{name}=", cast(val, type)) if obj.respond_to?(name)
129
- end
130
- else
131
- raise CastingError, "Don't know how to cast #{value.class} to #{signature_type.type_class}"
132
- end
133
- obj
134
- end
135
- end
136
- end
137
- end
138
- end
@@ -1,3 +0,0 @@
1
- require 'action_web_service/client/base'
2
- require 'action_web_service/client/soap_client'
3
- require 'action_web_service/client/xmlrpc_client'
@@ -1,28 +0,0 @@
1
- module ActionWebService # :nodoc:
2
- module Client # :nodoc:
3
- class ClientError < StandardError # :nodoc:
4
- end
5
-
6
- class Base # :nodoc:
7
- def initialize(api, endpoint_uri)
8
- @api = api
9
- @endpoint_uri = endpoint_uri
10
- end
11
-
12
- def method_missing(name, *args) # :nodoc:
13
- call_name = method_name(name)
14
- return super(name, *args) if call_name.nil?
15
- self.perform_invocation(call_name, args)
16
- end
17
-
18
- private
19
- def method_name(name)
20
- if @api.has_api_method?(name.to_sym)
21
- name.to_s
22
- elsif @api.has_public_api_method?(name.to_s)
23
- @api.api_method_name(name.to_s).to_s
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,113 +0,0 @@
1
- require 'soap/rpc/driver'
2
- require 'uri'
3
-
4
- module ActionWebService # :nodoc:
5
- module Client # :nodoc:
6
-
7
- # Implements SOAP client support (using RPC encoding for the messages).
8
- #
9
- # ==== Example Usage
10
- #
11
- # class PersonAPI < ActionWebService::API::Base
12
- # api_method :find_all, :returns => [[Person]]
13
- # end
14
- #
15
- # soap_client = ActionWebService::Client::Soap.new(PersonAPI, "http://...")
16
- # persons = soap_client.find_all
17
- #
18
- class Soap < Base
19
- # provides access to the underlying soap driver
20
- attr_reader :driver
21
-
22
- # Creates a new web service client using the SOAP RPC protocol.
23
- #
24
- # +api+ must be an ActionWebService::API::Base derivative, and
25
- # +endpoint_uri+ must point at the relevant URL to which protocol requests
26
- # will be sent with HTTP POST.
27
- #
28
- # Valid options:
29
- # [<tt>:namespace</tt>] If the remote server has used a custom namespace to
30
- # declare its custom types, you can specify it here. This would
31
- # be the namespace declared with a [WebService(Namespace = "http://namespace")] attribute
32
- # in .NET, for example.
33
- # [<tt>:driver_options</tt>] If you want to supply any custom SOAP RPC driver
34
- # options, you can provide them as a Hash here
35
- #
36
- # The <tt>:driver_options</tt> option can be used to configure the backend SOAP
37
- # RPC driver. An example of configuring the SOAP backend to do
38
- # client-certificate authenticated SSL connections to the server:
39
- #
40
- # opts = {}
41
- # opts['protocol.http.ssl_config.verify_mode'] = 'OpenSSL::SSL::VERIFY_PEER'
42
- # opts['protocol.http.ssl_config.client_cert'] = client_cert_file_path
43
- # opts['protocol.http.ssl_config.client_key'] = client_key_file_path
44
- # opts['protocol.http.ssl_config.ca_file'] = ca_cert_file_path
45
- # client = ActionWebService::Client::Soap.new(api, 'https://some/service', :driver_options => opts)
46
- def initialize(api, endpoint_uri, options={})
47
- super(api, endpoint_uri)
48
- @namespace = options[:namespace] || 'urn:ActionWebService'
49
- @driver_options = options[:driver_options] || {}
50
- @protocol = ActionWebService::Protocol::Soap::SoapProtocol.new @namespace
51
- @soap_action_base = options[:soap_action_base]
52
- @soap_action_base ||= URI.parse(endpoint_uri).path
53
- @driver = create_soap_rpc_driver(api, endpoint_uri)
54
- @driver_options.each do |name, value|
55
- @driver.options[name.to_s] = value
56
- end
57
- end
58
-
59
- protected
60
- def perform_invocation(method_name, args)
61
- method = @api.api_methods[method_name.to_sym]
62
- args = method.cast_expects(args.dup) rescue args
63
- return_value = @driver.send(method_name, *args)
64
- method.cast_returns(return_value.dup) rescue return_value
65
- end
66
-
67
- def soap_action(method_name)
68
- "#{@soap_action_base}/#{method_name}"
69
- end
70
-
71
- private
72
- def create_soap_rpc_driver(api, endpoint_uri)
73
- @protocol.register_api(api)
74
- driver = SoapDriver.new(endpoint_uri, nil)
75
- driver.mapping_registry = @protocol.marshaler.registry
76
- api.api_methods.each do |name, method|
77
- qname = XSD::QName.new(@namespace, method.public_name)
78
- action = soap_action(method.public_name)
79
- expects = method.expects
80
- returns = method.returns
81
- param_def = []
82
- if expects
83
- expects.each do |type|
84
- type_binding = @protocol.marshaler.lookup_type(type)
85
- if SOAP::Version >= "1.5.5"
86
- param_def << ['in', type.name.to_s, [type_binding.type.type_class.to_s]]
87
- else
88
- param_def << ['in', type.name, type_binding.mapping]
89
- end
90
- end
91
- end
92
- if returns
93
- type_binding = @protocol.marshaler.lookup_type(returns[0])
94
- if SOAP::Version >= "1.5.5"
95
- param_def << ['retval', 'return', [type_binding.type.type_class.to_s]]
96
- else
97
- param_def << ['retval', 'return', type_binding.mapping]
98
- end
99
- end
100
- driver.add_method(qname, action, method.name.to_s, param_def)
101
- end
102
- driver
103
- end
104
-
105
- class SoapDriver < SOAP::RPC::Driver # :nodoc:
106
- def add_method(qname, soapaction, name, param_def)
107
- @proxy.add_rpc_method(qname, soapaction, name, param_def)
108
- add_rpc_method_interface(name, param_def)
109
- end
110
- end
111
- end
112
- end
113
- end
@@ -1,58 +0,0 @@
1
- require 'uri'
2
- require 'xmlrpc/client'
3
-
4
- module ActionWebService # :nodoc:
5
- module Client # :nodoc:
6
-
7
- # Implements XML-RPC client support
8
- #
9
- # ==== Example Usage
10
- #
11
- # class BloggerAPI < ActionWebService::API::Base
12
- # inflect_names false
13
- # api_method :getRecentPosts, :returns => [[Blog::Post]]
14
- # end
15
- #
16
- # blog = ActionWebService::Client::XmlRpc.new(BloggerAPI, "http://.../RPC", :handler_name => "blogger")
17
- # posts = blog.getRecentPosts
18
- class XmlRpc < Base
19
-
20
- # Creates a new web service client using the XML-RPC protocol.
21
- #
22
- # +api+ must be an ActionWebService::API::Base derivative, and
23
- # +endpoint_uri+ must point at the relevant URL to which protocol requests
24
- # will be sent with HTTP POST.
25
- #
26
- # Valid options:
27
- # [<tt>:handler_name</tt>] If the remote server defines its services inside special
28
- # handler (the Blogger API uses a <tt>"blogger"</tt> handler name for example),
29
- # provide it here, or your method calls will fail
30
- def initialize(api, endpoint_uri, options={})
31
- @api = api
32
- @handler_name = options[:handler_name]
33
- @protocol = ActionWebService::Protocol::XmlRpc::XmlRpcProtocol.new
34
- @client = XMLRPC::Client.new2(endpoint_uri, options[:proxy], options[:timeout])
35
- end
36
-
37
- protected
38
- def perform_invocation(method_name, args)
39
- method = @api.api_methods[method_name.to_sym]
40
- if method.expects && method.expects.length != args.length
41
- raise(ArgumentError, "#{method.public_name}: wrong number of arguments (#{args.length} for #{method.expects.length})")
42
- end
43
- args = method.cast_expects(args.dup) rescue args
44
- if method.expects
45
- method.expects.each_with_index{ |type, i| args[i] = @protocol.value_to_xmlrpc_wire_format(args[i], type) }
46
- end
47
- ok, return_value = @client.call2(public_name(method_name), *args)
48
- return (method.cast_returns(return_value.dup) rescue return_value) if ok
49
- raise(ClientError, "#{return_value.faultCode}: #{return_value.faultString}")
50
- end
51
-
52
- def public_name(method_name)
53
- public_name = @api.public_api_method_name(method_name)
54
- @handler_name ? "#{@handler_name}.#{public_name}" : public_name
55
- end
56
- end
57
- end
58
- end
@@ -1,3 +0,0 @@
1
- require 'action_web_service/container/direct_container'
2
- require 'action_web_service/container/delegated_container'
3
- require 'action_web_service/container/action_controller_container'
@@ -1,93 +0,0 @@
1
- module ActionWebService # :nodoc:
2
- module Container # :nodoc:
3
- module ActionController # :nodoc:
4
- def self.included(base) # :nodoc:
5
- class << base
6
- include ClassMethods
7
- alias_method_chain :inherited, :api
8
- alias_method_chain :web_service_api, :require
9
- end
10
- end
11
-
12
- module ClassMethods
13
- # Creates a client for accessing remote web services, using the
14
- # given +protocol+ to communicate with the +endpoint_uri+.
15
- #
16
- # ==== Example
17
- #
18
- # class MyController < ActionController::Base
19
- # web_client_api :blogger, :xmlrpc, "http://blogger.com/myblog/api/RPC2", :handler_name => 'blogger'
20
- # end
21
- #
22
- # In this example, a protected method named <tt>blogger</tt> will
23
- # now exist on the controller, and calling it will return the
24
- # XML-RPC client object for working with that remote service.
25
- #
26
- # +options+ is the set of protocol client specific options (see
27
- # a protocol client class for details).
28
- #
29
- # If your API definition does not exist on the load path with the
30
- # correct rules for it to be found using +name+, you can pass in
31
- # the API definition class via +options+, using a key of <tt>:api</tt>
32
- def web_client_api(name, protocol, endpoint_uri, options={})
33
- unless method_defined?(name)
34
- api_klass = options.delete(:api) || require_web_service_api(name)
35
- class_eval do
36
- define_method(name) do
37
- create_web_service_client(api_klass, protocol, endpoint_uri, options)
38
- end
39
- protected name
40
- end
41
- end
42
- end
43
-
44
- def web_service_api_with_require(definition=nil) # :nodoc:
45
- return web_service_api_without_require if definition.nil?
46
- case definition
47
- when String, Symbol
48
- klass = require_web_service_api(definition)
49
- else
50
- klass = definition
51
- end
52
- web_service_api_without_require(klass)
53
- end
54
-
55
- def require_web_service_api(name) # :nodoc:
56
- case name
57
- when String, Symbol
58
- file_name = name.to_s.underscore + "_api"
59
- class_name = file_name.camelize
60
- class_names = [class_name, class_name.sub(/Api$/, 'API')]
61
- begin
62
- require_dependency(file_name)
63
- rescue LoadError => load_error
64
- requiree = / -- (.*?)(\.rb)?$/.match(load_error).to_a[1]
65
- msg = requiree == file_name ? "Missing API definition file in apis/#{file_name}.rb" : "Can't load file: #{requiree}"
66
- raise LoadError.new(msg).copy_blame!(load_error)
67
- end
68
- klass = nil
69
- class_names.each do |name|
70
- klass = name.constantize rescue nil
71
- break unless klass.nil?
72
- end
73
- unless klass
74
- raise(NameError, "neither #{class_names[0]} or #{class_names[1]} found")
75
- end
76
- klass
77
- else
78
- raise(ArgumentError, "expected String or Symbol argument")
79
- end
80
- end
81
-
82
- private
83
- def inherited_with_api(child)
84
- inherited_without_api(child)
85
- begin child.web_service_api(child.controller_path)
86
- rescue MissingSourceFile => e
87
- raise unless e.is_missing?("apis/#{child.controller_path}_api")
88
- end
89
- end
90
- end
91
- end
92
- end
93
- end