wash_out 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -41,6 +41,7 @@ demonstrated.
41
41
  class RumbasController < ApplicationController
42
42
  include WashOut::SOAP
43
43
 
44
+ # Simple case
44
45
  soap_action "integer_to_string",
45
46
  :args => :integer,
46
47
  :return => :string
@@ -55,6 +56,7 @@ class RumbasController < ApplicationController
55
56
  render :soap => (params[:a] + params[:b])
56
57
  end
57
58
 
59
+ # Complex structures
58
60
  soap_action "AddCircle",
59
61
  :args => { :circle => { :center => { :x => :integer,
60
62
  :y => :integer },
@@ -71,6 +73,14 @@ class RumbasController < ApplicationController
71
73
  render :soap => nil
72
74
  end
73
75
 
76
+ # Arrays
77
+ soap_action "integers_to_boolean",
78
+ :args => { :data => [:integer] },
79
+ :return => [:boolean]
80
+ def integers_to_boolean
81
+ render :soap => params[:data].map{|x| x ? 1 : 0}
82
+ end
83
+
74
84
  # You can use all Rails features like filtering, too. A SOAP controller
75
85
  # is just like a normal controller with a special routing.
76
86
  before_filter :dump_parameters
@@ -7,7 +7,7 @@ module WashOut
7
7
  module Dispatcher
8
8
  # Default Type namespace
9
9
  NAMESPACE = 'urn:WashOut'
10
-
10
+
11
11
  # A SOAPError exception can be raised to return a correct SOAP error
12
12
  # response.
13
13
  class SOAPError < Exception; end
@@ -17,12 +17,18 @@ module WashOut
17
17
  soap_action = request.env['wash_out.soap_action']
18
18
  action_spec = self.class.soap_actions[soap_action]
19
19
 
20
- strip = Nori.strip_namespaces?
21
-
20
+ # Do not interfere with project-space Nori setup
21
+ strip = Nori.strip_namespaces?
22
+ convert = Nori.convert_tags?
22
23
  Nori.strip_namespaces = true
24
+ Nori.convert_tags_to { |tag| tag.snakecase.to_sym }
25
+
23
26
  params = Nori.parse(request.body)
24
27
  xml_data = params[:envelope][:body][soap_action.underscore.to_sym]
28
+
29
+ # Reset Nori setup to project-space
25
30
  Nori.strip_namespaces = strip
31
+ Nori.convert_tags_to convert
26
32
 
27
33
  @_params = HashWithIndifferentAccess.new
28
34
  (xml_data || {}).map do |opt, value|
@@ -52,7 +58,7 @@ module WashOut
52
58
 
53
59
  result = { 'value' => result } unless result.is_a? Hash
54
60
  result = HashWithIndifferentAccess.new(result)
55
-
61
+
56
62
  inject = lambda {|data, spec|
57
63
  spec.each do |param|
58
64
  if param.struct?
@@ -31,7 +31,13 @@ module WashOut
31
31
  data = Array(data) if @multiplied
32
32
 
33
33
  if struct?
34
- map_struct(data) { |param, elem| param.load(elem) }
34
+ if @multiplied
35
+ data.map do |x|
36
+ map_struct(x) { |param, elem| param.load(elem) }
37
+ end
38
+ else
39
+ map_struct(data) { |param, elem| param.load(elem) }
40
+ end
35
41
  else
36
42
  operation = case type
37
43
  when 'string'; :to_s
@@ -40,10 +46,10 @@ module WashOut
40
46
  when 'boolean'; nil # Nori handles that for us
41
47
  else raise RuntimeError, "Invalid WashOut simple type: #{type}"
42
48
  end
43
-
49
+
44
50
  if operation.nil?
45
51
  data
46
- elsif data.is_a? Array
52
+ elsif @multiplied
47
53
  data.map{|x| x.send(operation)}
48
54
  else
49
55
  data.send(operation)
@@ -80,7 +86,7 @@ module WashOut
80
86
  def self.parse_def(definition)
81
87
  raise RuntimeError, "[] should not be used in your params. Use nil if you want to mark empty set." if definition == []
82
88
  return [] if definition == nil
83
-
89
+
84
90
  if [Array, Symbol].include?(definition.class)
85
91
  definition = { :value => definition }
86
92
  end
@@ -99,7 +105,7 @@ module WashOut
99
105
  raise RuntimeError, "Wrong definition: #{type.inspect}"
100
106
  end
101
107
  end
102
-
108
+
103
109
  def clone
104
110
  copy = self.class.new(@name, @type.to_sym, @multiplied)
105
111
  copy.map = @map.map{|x| x.clone}
@@ -124,7 +130,7 @@ module WashOut
124
130
  # Raise an appropriate exception if a required datum is missing.
125
131
  def check_if_missing(data)
126
132
  if data.nil?
127
- raise WashOut::Dispatcher::SOAPError, "Required SOAP parameter #{@name} is missing"
133
+ raise WashOut::Dispatcher::SOAPError, "Required SOAP parameter '#{@name}' is missing"
128
134
  end
129
135
  end
130
136
  end
@@ -1,3 +1,3 @@
1
1
  module WashOut
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -34,7 +34,7 @@ describe WashOut do
34
34
  :distance_from_o => Math.sqrt(circle[:center][:x] ** 2 + circle[:center][:y] ** 2) }
35
35
  end
36
36
  end
37
-
37
+
38
38
  client = savon_instance
39
39
  xml = Nori.parse client.wsdl.xml
40
40
 
@@ -124,7 +124,7 @@ describe WashOut do
124
124
 
125
125
  it "should allow arbitrary action names" do
126
126
  name = 'AnswerToTheUltimateQuestionOfLifeTheUniverseAndEverything'
127
-
127
+
128
128
  mock_controller do
129
129
  soap_action name,
130
130
  :args => nil, :return => :integer, :to => :answer
@@ -182,7 +182,7 @@ describe WashOut do
182
182
  client.request(:error)
183
183
  }.should raise_exception(Savon::SOAP::Fault)
184
184
  end
185
-
185
+
186
186
  it "should handle nested returns" do
187
187
  mock_controller do
188
188
  soap_action "gogogo",
@@ -204,10 +204,10 @@ describe WashOut do
204
204
  }
205
205
  end
206
206
  end
207
-
207
+
208
208
  savon_instance.request(:gogogo)[:gogogo_response].should == {:zoo=>"zoo", :boo=>{:moo=>"moo", :doo=>"doo", :"@xsi:type"=>"tns:boo"}}
209
209
  end
210
-
210
+
211
211
  it "should handle arrays" do
212
212
  mock_controller do
213
213
  soap_action "rumba",
@@ -220,29 +220,58 @@ describe WashOut do
220
220
  render :soap => nil
221
221
  end
222
222
  end
223
-
223
+
224
224
  savon_instance.request(:rumba) do
225
225
  soap.body = {
226
226
  :rumbas => [1, 2, 3]
227
227
  }
228
228
  end
229
229
  end
230
-
230
+
231
+ it "should handle complex structures inside arrays" do
232
+ mock_controller do
233
+ soap_action "rumba",
234
+ :args => {
235
+ :rumbas => [ {
236
+ :zombies => :string,
237
+ :puppies => :string
238
+ } ]
239
+ },
240
+ :return => nil
241
+ def rumba
242
+ params.should == {
243
+ "rumbas" => [
244
+ {"zombies" => 'suck', "puppies" => 'rock'},
245
+ {"zombies" => 'slow', "puppies" => 'fast'}
246
+ ]
247
+ }
248
+ render :soap => nil
249
+ end
250
+ end
251
+
252
+ savon_instance.request(:rumba) do
253
+ soap.body = {
254
+ :rumbas => [
255
+ {:zombies => 'suck', :puppies => 'rock'},
256
+ {:zombies => 'slow', :puppies => 'fast'}
257
+ ]
258
+ }
259
+ end
260
+ end
261
+
231
262
  it "should be able to return arrays" do
232
263
  mock_controller do
233
264
  soap_action "rumba",
234
265
  :args => nil,
235
- :return => {
236
- :rumbas => [:integer]
237
- }
266
+ :return => [:integer]
238
267
  def rumba
239
- render :soap => {:rumbas => [1, 2, 3]}
268
+ render :soap => [1, 2, 3]
240
269
  end
241
270
  end
242
-
243
- savon_instance.request(:rumba).to_hash[:rumba_response].should == {:rumbas => ["1", "2", "3"]}
271
+
272
+ savon_instance.request(:rumba).to_hash[:rumba_response].should == {:value => ["1", "2", "3"]}
244
273
  end
245
-
274
+
246
275
  it "should deprecate old syntax" do
247
276
  # save rspec context check
248
277
  raise_runtime_exception = raise_exception(RuntimeError)
@@ -258,5 +287,5 @@ describe WashOut do
258
287
  end
259
288
  end
260
289
  end
261
-
290
+
262
291
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wash_out
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-01-22 00:00:00.000000000 Z
13
+ date: 2012-02-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nori
17
- requirement: &70332337988240 !ruby/object:Gem::Requirement
17
+ requirement: &70307076083660 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70332337988240
25
+ version_requirements: *70307076083660
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec-rails
28
- requirement: &70332337984940 !ruby/object:Gem::Requirement
28
+ requirement: &70307076083140 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70332337984940
36
+ version_requirements: *70307076083140
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: appraisal
39
- requirement: &70332346016840 !ruby/object:Gem::Requirement
39
+ requirement: &70307076082660 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70332346016840
47
+ version_requirements: *70307076082660
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: tzinfo
50
- requirement: &70332346016420 !ruby/object:Gem::Requirement
50
+ requirement: &70307076081960 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70332346016420
58
+ version_requirements: *70307076081960
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: savon
61
- requirement: &70332346016000 !ruby/object:Gem::Requirement
61
+ requirement: &70307076081100 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70332346016000
69
+ version_requirements: *70307076081100
70
70
  description: Dead simple Rails 3 SOAP server library
71
71
  email: boris@roundlake.ru
72
72
  executables: []