backlog 0.0.4 → 0.0.5

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 (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,235 +0,0 @@
1
- require 'soap/mapping'
2
-
3
- module ActionWebService
4
- module Protocol
5
- module Soap
6
- # Workaround for SOAP4R return values changing
7
- class Registry < SOAP::Mapping::Registry
8
- if SOAP::Version >= "1.5.4"
9
- def find_mapped_soap_class(obj_class)
10
- return @map.instance_eval { @obj2soap[obj_class][0] }
11
- end
12
-
13
- def find_mapped_obj_class(soap_class)
14
- return @map.instance_eval { @soap2obj[soap_class][0] }
15
- end
16
- end
17
- end
18
-
19
- class SoapMarshaler
20
- attr :namespace
21
- attr :registry
22
-
23
- def initialize(namespace=nil)
24
- @namespace = namespace || 'urn:ActionWebService'
25
- @registry = Registry.new
26
- @type2binding = {}
27
- register_static_factories
28
- end
29
-
30
- def soap_to_ruby(obj)
31
- SOAP::Mapping.soap2obj(obj, @registry)
32
- end
33
-
34
- def ruby_to_soap(obj)
35
- soap = SOAP::Mapping.obj2soap(obj, @registry)
36
- soap.elename = XSD::QName.new if SOAP::Version >= "1.5.5" && soap.elename == XSD::QName::EMPTY
37
- soap
38
- end
39
-
40
- def register_type(type)
41
- return @type2binding[type] if @type2binding.has_key?(type)
42
-
43
- if type.array?
44
- array_mapping = @registry.find_mapped_soap_class(Array)
45
- qname = XSD::QName.new(@namespace, soap_type_name(type.element_type.type_class.name) + 'Array')
46
- element_type_binding = register_type(type.element_type)
47
- @type2binding[type] = SoapBinding.new(self, qname, type, array_mapping, element_type_binding)
48
- elsif (mapping = @registry.find_mapped_soap_class(type.type_class) rescue nil)
49
- qname = mapping[2] ? mapping[2][:type] : nil
50
- qname ||= soap_base_type_name(mapping[0])
51
- @type2binding[type] = SoapBinding.new(self, qname, type, mapping)
52
- else
53
- qname = XSD::QName.new(@namespace, soap_type_name(type.type_class.name))
54
- @registry.add(type.type_class,
55
- SOAP::SOAPStruct,
56
- typed_struct_factory(type.type_class),
57
- { :type => qname })
58
- mapping = @registry.find_mapped_soap_class(type.type_class)
59
- @type2binding[type] = SoapBinding.new(self, qname, type, mapping)
60
- end
61
-
62
- if type.structured?
63
- type.each_member do |m_name, m_type|
64
- register_type(m_type)
65
- end
66
- end
67
-
68
- @type2binding[type]
69
- end
70
- alias :lookup_type :register_type
71
-
72
- def annotate_arrays(binding, value)
73
- if value.nil?
74
- return
75
- elsif binding.type.array?
76
- mark_typed_array(value, binding.element_binding.qname)
77
- if binding.element_binding.type.custom?
78
- value.each do |element|
79
- annotate_arrays(binding.element_binding, element)
80
- end
81
- end
82
- elsif binding.type.structured?
83
- binding.type.each_member do |name, type|
84
- member_binding = register_type(type)
85
- member_value = value.respond_to?('[]') ? value[name] : value.send(name)
86
- annotate_arrays(member_binding, member_value) if type.custom?
87
- end
88
- end
89
- end
90
-
91
- private
92
- def typed_struct_factory(type_class)
93
- if Object.const_defined?('ActiveRecord')
94
- if type_class.ancestors.include?(ActiveRecord::Base)
95
- qname = XSD::QName.new(@namespace, soap_type_name(type_class.name))
96
- type_class.instance_variable_set('@qname', qname)
97
- return SoapActiveRecordStructFactory.new
98
- end
99
- end
100
- SOAP::Mapping::Registry::TypedStructFactory
101
- end
102
-
103
- def mark_typed_array(array, qname)
104
- (class << array; self; end).class_eval do
105
- define_method(:arytype) do
106
- qname
107
- end
108
- end
109
- end
110
-
111
- def soap_base_type_name(type)
112
- xsd_type = type.ancestors.find{ |c| c.const_defined? 'Type' }
113
- xsd_type ? xsd_type.const_get('Type') : XSD::XSDAnySimpleType::Type
114
- end
115
-
116
- def soap_type_name(type_name)
117
- type_name.gsub(/::/, '..')
118
- end
119
-
120
- def register_static_factories
121
- @registry.add(ActionWebService::Base64, SOAP::SOAPBase64, SoapBase64Factory.new, nil)
122
- mapping = @registry.find_mapped_soap_class(ActionWebService::Base64)
123
- @type2binding[ActionWebService::Base64] =
124
- SoapBinding.new(self, SOAP::SOAPBase64::Type, ActionWebService::Base64, mapping)
125
- @registry.add(Array, SOAP::SOAPArray, SoapTypedArrayFactory.new, nil)
126
- @registry.add(::BigDecimal, SOAP::SOAPDouble, SOAP::Mapping::Registry::BasetypeFactory, {:derived_class => true})
127
- end
128
- end
129
-
130
- class SoapBinding
131
- attr :qname
132
- attr :type
133
- attr :mapping
134
- attr :element_binding
135
-
136
- def initialize(marshaler, qname, type, mapping, element_binding=nil)
137
- @marshaler = marshaler
138
- @qname = qname
139
- @type = type
140
- @mapping = mapping
141
- @element_binding = element_binding
142
- end
143
-
144
- def type_name
145
- @type.custom? ? @qname.name : nil
146
- end
147
-
148
- def qualified_type_name(ns=nil)
149
- if @type.custom?
150
- "#{ns ? ns : @qname.namespace}:#{@qname.name}"
151
- else
152
- ns = XSD::NS.new
153
- ns.assign(XSD::Namespace, SOAP::XSDNamespaceTag)
154
- ns.assign(SOAP::EncodingNamespace, "soapenc")
155
- xsd_klass = mapping[0].ancestors.find{|c| c.const_defined?('Type')}
156
- return ns.name(XSD::AnyTypeName) unless xsd_klass
157
- ns.name(xsd_klass.const_get('Type'))
158
- end
159
- end
160
-
161
- def eql?(other)
162
- @qname == other.qname
163
- end
164
- alias :== :eql?
165
-
166
- def hash
167
- @qname.hash
168
- end
169
- end
170
-
171
- class SoapActiveRecordStructFactory < SOAP::Mapping::Factory
172
- def obj2soap(soap_class, obj, info, map)
173
- unless obj.is_a?(ActiveRecord::Base)
174
- return nil
175
- end
176
- soap_obj = soap_class.new(obj.class.instance_variable_get('@qname'))
177
- obj.class.columns.each do |column|
178
- key = column.name.to_s
179
- value = obj.send(key)
180
- soap_obj[key] = SOAP::Mapping._obj2soap(value, map)
181
- end
182
- soap_obj
183
- end
184
-
185
- def soap2obj(obj_class, node, info, map)
186
- unless node.type == obj_class.instance_variable_get('@qname')
187
- return false
188
- end
189
- obj = obj_class.new
190
- node.each do |key, value|
191
- obj[key] = value.data
192
- end
193
- obj.instance_variable_set('@new_record', false)
194
- return true, obj
195
- end
196
- end
197
-
198
- class SoapTypedArrayFactory < SOAP::Mapping::Factory
199
- def obj2soap(soap_class, obj, info, map)
200
- unless obj.respond_to?(:arytype)
201
- return nil
202
- end
203
- soap_obj = soap_class.new(SOAP::ValueArrayName, 1, obj.arytype)
204
- mark_marshalled_obj(obj, soap_obj)
205
- obj.each do |item|
206
- child = SOAP::Mapping._obj2soap(item, map)
207
- soap_obj.add(child)
208
- end
209
- soap_obj
210
- end
211
-
212
- def soap2obj(obj_class, node, info, map)
213
- return false
214
- end
215
- end
216
-
217
- class SoapBase64Factory < SOAP::Mapping::Factory
218
- def obj2soap(soap_class, obj, info, map)
219
- unless obj.is_a?(ActionWebService::Base64)
220
- return nil
221
- end
222
- return soap_class.new(obj)
223
- end
224
-
225
- def soap2obj(obj_class, node, info, map)
226
- unless node.type == SOAP::SOAPBase64::Type
227
- return false
228
- end
229
- return true, obj_class.new(node.string)
230
- end
231
- end
232
-
233
- end
234
- end
235
- end
@@ -1,122 +0,0 @@
1
- require 'xmlrpc/marshal'
2
- require 'action_web_service/client/xmlrpc_client'
3
-
4
- module XMLRPC # :nodoc:
5
- class FaultException # :nodoc:
6
- alias :message :faultString
7
- end
8
-
9
- class Create
10
- def wrong_type(value)
11
- if BigDecimal === value
12
- [true, value.to_f]
13
- else
14
- false
15
- end
16
- end
17
- end
18
- end
19
-
20
- module ActionWebService # :nodoc:
21
- module API # :nodoc:
22
- class Base # :nodoc:
23
- def self.xmlrpc_client(endpoint_uri, options={})
24
- ActionWebService::Client::XmlRpc.new self, endpoint_uri, options
25
- end
26
- end
27
- end
28
-
29
- module Protocol # :nodoc:
30
- module XmlRpc # :nodoc:
31
- def self.included(base)
32
- base.register_protocol(XmlRpcProtocol)
33
- end
34
-
35
- class XmlRpcProtocol < AbstractProtocol # :nodoc:
36
- def self.create(controller)
37
- XmlRpcProtocol.new
38
- end
39
-
40
- def decode_action_pack_request(action_pack_request)
41
- service_name = action_pack_request.parameters['action']
42
- decode_request(action_pack_request.raw_post, service_name)
43
- end
44
-
45
- def decode_request(raw_request, service_name)
46
- method_name, params = XMLRPC::Marshal.load_call(raw_request)
47
- Request.new(self, method_name, params, service_name)
48
- rescue
49
- return nil
50
- end
51
-
52
- def encode_request(method_name, params, param_types)
53
- if param_types
54
- params = params.dup
55
- param_types.each_with_index{ |type, i| params[i] = value_to_xmlrpc_wire_format(params[i], type) }
56
- end
57
- XMLRPC::Marshal.dump_call(method_name, *params)
58
- end
59
-
60
- def decode_response(raw_response)
61
- [nil, XMLRPC::Marshal.load_response(raw_response)]
62
- end
63
-
64
- def encode_response(method_name, return_value, return_type, protocol_options={})
65
- if return_value && return_type
66
- return_value = value_to_xmlrpc_wire_format(return_value, return_type)
67
- end
68
- return_value = false if return_value.nil?
69
- raw_response = XMLRPC::Marshal.dump_response(return_value)
70
- Response.new(raw_response, 'text/xml', return_value)
71
- end
72
-
73
- def encode_multicall_response(responses, protocol_options={})
74
- result = responses.map do |return_value, return_type|
75
- if return_value && return_type
76
- return_value = value_to_xmlrpc_wire_format(return_value, return_type)
77
- return_value = [return_value] unless return_value.nil?
78
- end
79
- return_value = false if return_value.nil?
80
- return_value
81
- end
82
- raw_response = XMLRPC::Marshal.dump_response(result)
83
- Response.new(raw_response, 'text/xml', result)
84
- end
85
-
86
- def protocol_client(api, protocol_name, endpoint_uri, options={})
87
- return nil unless protocol_name == :xmlrpc
88
- ActionWebService::Client::XmlRpc.new(api, endpoint_uri, options)
89
- end
90
-
91
- def value_to_xmlrpc_wire_format(value, value_type)
92
- if value_type.array?
93
- value.map{ |val| value_to_xmlrpc_wire_format(val, value_type.element_type) }
94
- else
95
- if value.is_a?(ActionWebService::Struct)
96
- struct = {}
97
- value.class.members.each do |name, type|
98
- member_value = value[name]
99
- next if member_value.nil?
100
- struct[name.to_s] = value_to_xmlrpc_wire_format(member_value, type)
101
- end
102
- struct
103
- elsif value.is_a?(ActiveRecord::Base)
104
- struct = {}
105
- value.attributes.each do |key, member_value|
106
- next if member_value.nil?
107
- struct[key.to_s] = member_value
108
- end
109
- struct
110
- elsif value.is_a?(ActionWebService::Base64)
111
- XMLRPC::Base64.new(value)
112
- elsif value.is_a?(Exception) && !value.is_a?(XMLRPC::FaultException)
113
- XMLRPC::FaultException.new(2, value.message)
114
- else
115
- value
116
- end
117
- end
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,283 +0,0 @@
1
- require 'benchmark'
2
- require 'pathname'
3
-
4
- module ActionWebService
5
- module Scaffolding # :nodoc:
6
- class ScaffoldingError < ActionWebServiceError # :nodoc:
7
- end
8
-
9
- def self.included(base)
10
- base.extend(ClassMethods)
11
- end
12
-
13
- # Web service invocation scaffolding provides a way to quickly invoke web service methods in a controller. The
14
- # generated scaffold actions have default views to let you enter the method parameters and view the
15
- # results.
16
- #
17
- # Example:
18
- #
19
- # class ApiController < ActionController
20
- # web_service_scaffold :invoke
21
- # end
22
- #
23
- # This example generates an +invoke+ action in the +ApiController+ that you can navigate to from
24
- # your browser, select the API method, enter its parameters, and perform the invocation.
25
- #
26
- # If you want to customize the default views, create the following views in "app/views":
27
- #
28
- # * <tt>action_name/methods.erb</tt>
29
- # * <tt>action_name/parameters.erb</tt>
30
- # * <tt>action_name/result.erb</tt>
31
- # * <tt>action_name/layout.erb</tt>
32
- #
33
- # Where <tt>action_name</tt> is the name of the action you gave to ClassMethods#web_service_scaffold.
34
- #
35
- # You can use the default views in <tt>RAILS_DIR/lib/action_web_service/templates/scaffolds</tt> as
36
- # a guide.
37
- module ClassMethods
38
- # Generates web service invocation scaffolding for the current controller. The given action name
39
- # can then be used as the entry point for invoking API methods from a web browser.
40
- def web_service_scaffold(action_name)
41
- add_template_helper(Helpers)
42
- module_eval <<-"end_eval", __FILE__, __LINE__ + 1
43
- def #{action_name}
44
- if request.method == :get
45
- setup_invocation_assigns
46
- render_invocation_scaffold 'methods'
47
- end
48
- end
49
-
50
- def #{action_name}_method_params
51
- if request.method == :get
52
- setup_invocation_assigns
53
- render_invocation_scaffold 'parameters'
54
- end
55
- end
56
-
57
- def #{action_name}_submit
58
- if request.method == :post
59
- setup_invocation_assigns
60
- protocol_name = params['protocol'] ? params['protocol'].to_sym : :soap
61
- case protocol_name
62
- when :soap
63
- @protocol = Protocol::Soap::SoapProtocol.create(self)
64
- when :xmlrpc
65
- @protocol = Protocol::XmlRpc::XmlRpcProtocol.create(self)
66
- end
67
- bm = Benchmark.measure do
68
- @protocol.register_api(@scaffold_service.api)
69
- post_params = params['method_params'] ? params['method_params'].dup : nil
70
- params = []
71
- @scaffold_method.expects.each_with_index do |spec, i|
72
- params << post_params[i.to_s]
73
- end if @scaffold_method.expects
74
- params = @scaffold_method.cast_expects(params)
75
- method_name = public_method_name(@scaffold_service.name, @scaffold_method.public_name)
76
- @method_request_xml = @protocol.encode_request(method_name, params, @scaffold_method.expects)
77
- new_request = @protocol.encode_action_pack_request(@scaffold_service.name, @scaffold_method.public_name, @method_request_xml)
78
- prepare_request(new_request, @scaffold_service.name, @scaffold_method.public_name)
79
- self.request = new_request
80
- if @scaffold_container.dispatching_mode != :direct
81
- request.parameters['action'] = @scaffold_service.name
82
- end
83
- dispatch_web_service_request
84
- @method_response_xml = response.body
85
- method_name, obj = @protocol.decode_response(@method_response_xml)
86
- return if handle_invocation_exception(obj)
87
- @method_return_value = @scaffold_method.cast_returns(obj)
88
- end
89
- @method_elapsed = bm.real
90
- add_instance_variables_to_assigns
91
- reset_invocation_response
92
- render_invocation_scaffold 'result'
93
- end
94
- end
95
-
96
- private
97
- def setup_invocation_assigns
98
- @scaffold_class = self.class
99
- @scaffold_action_name = "#{action_name}"
100
- @scaffold_container = WebServiceModel::Container.new(self)
101
- if params['service'] && params['method']
102
- @scaffold_service = @scaffold_container.services.find{ |x| x.name == params['service'] }
103
- @scaffold_method = @scaffold_service.api_methods[params['method']]
104
- end
105
- add_instance_variables_to_assigns
106
- end
107
-
108
- def render_invocation_scaffold(action)
109
- customized_template = "\#{self.class.controller_path}/#{action_name}/\#{action}"
110
- default_template = scaffold_path(action)
111
- if template_exists?(customized_template)
112
- content = @template.render_file(customized_template)
113
- else
114
- content = @template.render_file(default_template, false)
115
- end
116
- @template.instance_variable_set("@content_for_layout", content)
117
- if self.active_layout.nil?
118
- render_file(scaffold_path("layout"))
119
- else
120
- render_file(self.active_layout, "200 OK", true)
121
- end
122
- end
123
-
124
- def scaffold_path(template_name)
125
- File.dirname(__FILE__) + "/templates/scaffolds/" + template_name + ".erb"
126
- end
127
-
128
- def reset_invocation_response
129
- erase_render_results
130
- response.headers = ::ActionController::AbstractResponse::DEFAULT_HEADERS.merge("cookie" => [])
131
- end
132
-
133
- def public_method_name(service_name, method_name)
134
- if web_service_dispatching_mode == :layered && @protocol.is_a?(ActionWebService::Protocol::XmlRpc::XmlRpcProtocol)
135
- service_name + '.' + method_name
136
- else
137
- method_name
138
- end
139
- end
140
-
141
- def prepare_request(new_request, service_name, method_name)
142
- new_request.parameters.update(request.parameters)
143
- request.env.each{ |k, v| new_request.env[k] = v unless new_request.env.has_key?(k) }
144
- if web_service_dispatching_mode == :layered && @protocol.is_a?(ActionWebService::Protocol::Soap::SoapProtocol)
145
- new_request.env['HTTP_SOAPACTION'] = "/\#{controller_name()}/\#{service_name}/\#{method_name}"
146
- end
147
- end
148
-
149
- def handle_invocation_exception(obj)
150
- exception = nil
151
- if obj.respond_to?(:detail) && obj.detail.respond_to?(:cause) && obj.detail.cause.is_a?(Exception)
152
- exception = obj.detail.cause
153
- elsif obj.is_a?(XMLRPC::FaultException)
154
- exception = obj
155
- end
156
- return unless exception
157
- reset_invocation_response
158
- rescue_action(exception)
159
- true
160
- end
161
- end_eval
162
- end
163
- end
164
-
165
- module Helpers # :nodoc:
166
- def method_parameter_input_fields(method, type, field_name_base, idx, was_structured=false)
167
- if type.array?
168
- return content_tag('em', "Typed array input fields not supported yet (#{type.name})")
169
- end
170
- if type.structured?
171
- return content_tag('em', "Nested structural types not supported yet (#{type.name})") if was_structured
172
- parameters = ""
173
- type.each_member do |member_name, member_type|
174
- label = method_parameter_label(member_name, member_type)
175
- nested_content = method_parameter_input_fields(
176
- method,
177
- member_type,
178
- "#{field_name_base}[#{idx}][#{member_name}]",
179
- idx,
180
- true)
181
- if member_type.custom?
182
- parameters << content_tag('li', label)
183
- parameters << content_tag('ul', nested_content)
184
- else
185
- parameters << content_tag('li', label + ' ' + nested_content)
186
- end
187
- end
188
- content_tag('ul', parameters)
189
- else
190
- # If the data source was structured previously we already have the index set
191
- field_name_base = "#{field_name_base}[#{idx}]" unless was_structured
192
-
193
- case type.type
194
- when :int
195
- text_field_tag "#{field_name_base}"
196
- when :string
197
- text_field_tag "#{field_name_base}"
198
- when :base64
199
- text_area_tag "#{field_name_base}", nil, :size => "40x5"
200
- when :bool
201
- radio_button_tag("#{field_name_base}", "true") + " True" +
202
- radio_button_tag("#{field_name_base}", "false") + "False"
203
- when :float
204
- text_field_tag "#{field_name_base}"
205
- when :time, :datetime
206
- time = Time.now
207
- i = 0
208
- %w|year month day hour minute second|.map do |name|
209
- i += 1
210
- send("select_#{name}", time, :prefix => "#{field_name_base}[#{i}]", :discard_type => true)
211
- end.join
212
- when :date
213
- date = Date.today
214
- i = 0
215
- %w|year month day|.map do |name|
216
- i += 1
217
- send("select_#{name}", date, :prefix => "#{field_name_base}[#{i}]", :discard_type => true)
218
- end.join
219
- end
220
- end
221
- end
222
-
223
- def method_parameter_label(name, type)
224
- name.to_s.capitalize + ' (' + type.human_name(false) + ')'
225
- end
226
-
227
- def service_method_list(service)
228
- action = @scaffold_action_name + '_method_params'
229
- methods = service.api_methods_full.map do |desc, name|
230
- content_tag("li", link_to(desc, :action => action, :service => service.name, :method => name))
231
- end
232
- content_tag("ul", methods.join("\n"))
233
- end
234
- end
235
-
236
- module WebServiceModel # :nodoc:
237
- class Container # :nodoc:
238
- attr :services
239
- attr :dispatching_mode
240
-
241
- def initialize(real_container)
242
- @real_container = real_container
243
- @dispatching_mode = @real_container.class.web_service_dispatching_mode
244
- @services = []
245
- if @dispatching_mode == :direct
246
- @services << Service.new(@real_container.controller_name, @real_container)
247
- else
248
- @real_container.class.web_services.each do |name, obj|
249
- @services << Service.new(name, @real_container.instance_eval{ web_service_object(name) })
250
- end
251
- end
252
- end
253
- end
254
-
255
- class Service # :nodoc:
256
- attr :name
257
- attr :object
258
- attr :api
259
- attr :api_methods
260
- attr :api_methods_full
261
-
262
- def initialize(name, real_service)
263
- @name = name.to_s
264
- @object = real_service
265
- @api = @object.class.web_service_api
266
- if @api.nil?
267
- raise ScaffoldingError, "No web service API attached to #{object.class}"
268
- end
269
- @api_methods = {}
270
- @api_methods_full = []
271
- @api.api_methods.each do |name, method|
272
- @api_methods[method.public_name.to_s] = method
273
- @api_methods_full << [method.to_s, method.public_name.to_s]
274
- end
275
- end
276
-
277
- def to_s
278
- self.name.camelize
279
- end
280
- end
281
- end
282
- end
283
- end