wash_out 0.2.2 → 0.2.3

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wash_out (0.2.1)
4
+ wash_out (0.2.3)
5
5
  nori
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -18,7 +18,7 @@ action corresponds to a certain controller method; this mapping, as well as the
18
18
  by [soap_action][] method. Check the method documentation for complete info; here, only a few examples will be
19
19
  demonstrated.
20
20
 
21
- [soap_action]: http://rubydoc.info/gems/wash_out/0.2.1/WashOut/SOAP/ClassMethods#soap_action-instance_method
21
+ [soap_action]: http://rubydoc.info/gems/wash_out/WashOut/SOAP/ClassMethods#soap_action-instance_method
22
22
 
23
23
  ```ruby
24
24
  # app/controllers/api_controller.rb
@@ -42,7 +42,7 @@ class ApiController < ApplicationController
42
42
  soap_action "AddCircle",
43
43
  :args => { :circle => { :center => { :x => :integer,
44
44
  :y => :integer },
45
- :radius => :float } },
45
+ :radius => :double } },
46
46
  :return => [],
47
47
  :to => :add_circle
48
48
  def add_circle
@@ -25,11 +25,10 @@ module WashOut
25
25
  # Converts a generic externally derived Ruby value, such as String or
26
26
  # Hash, to a native Ruby object according to the definition of this type.
27
27
  def load(data)
28
+ check_if_missing(data)
29
+
28
30
  if struct?
29
- data = ActiveSupport::HashWithIndifferentAccess.new(data)
30
- @map.map do |param|
31
- param.load(data[param.name])
32
- end
31
+ map_struct(data) { |param, elem| param.load(elem) }
33
32
  else
34
33
  case type
35
34
  when 'string'; data.to_s
@@ -43,11 +42,10 @@ module WashOut
43
42
 
44
43
  # The opposite of #load.
45
44
  def store(data)
45
+ check_if_missing(data)
46
+
46
47
  if struct?
47
- data = ActiveSupport::HashWithIndifferentAccess.new(data)
48
- @map.map do |param|
49
- param.store(data[param.name])
50
- end
48
+ map_struct(data) { |param, elem| param.store(elem) }
51
49
  else
52
50
  data.to_s
53
51
  end
@@ -66,12 +64,12 @@ module WashOut
66
64
  # Parses a +definition+. The format of the definition is best described
67
65
  # by the following BNF-like grammar.
68
66
  #
69
- # simple_type := :string | :integer | :double | :boolean
70
- # nested_type := type_hash | simple_type | WashOut::Param instance
71
- # type_hash := { :parameter_name => nested_type, ... }
72
- # definition := [ WashOut::Param, ... ] |
73
- # type_hash |
74
- # simple_type
67
+ # simple_type := :string | :integer | :double | :boolean
68
+ # nested_type := type_hash | simple_type | WashOut::Param instance
69
+ # type_hash := { :parameter_name => nested_type, ... }
70
+ # definition := [ WashOut::Param, ... ] |
71
+ # type_hash |
72
+ # simple_type
75
73
  #
76
74
  # If a simple type is passed as the +definition+, a single Param is returned
77
75
  # with the +name+ set to "value".
@@ -94,5 +92,27 @@ module WashOut
94
92
  definition.to_a
95
93
  end
96
94
  end
95
+
96
+ private
97
+
98
+ # Used to load or store an entire structure.
99
+ def map_struct(data)
100
+ data = data.with_indifferent_access
101
+ struct = {}.with_indifferent_access
102
+
103
+ # RUBY18 Enumerable#each_with_object is better, but 1.9 only.
104
+ @map.map do |param|
105
+ struct[param.name] = yield param, data[param.name]
106
+ end
107
+
108
+ struct
109
+ end
110
+
111
+ # Raise an appropriate exception if a required datum is missing.
112
+ def check_if_missing(data)
113
+ if data.nil?
114
+ raise WashOut::Dispatcher::SOAPError, "Required SOAP parameter #{@name} is missing"
115
+ end
116
+ end
97
117
  end
98
118
  end
@@ -10,7 +10,10 @@ module WashOut
10
10
  controller = @controller_name.constantize
11
11
 
12
12
  soap_action = env['HTTP_SOAPACTION']
13
- soap_action.force_encoding('UTF-8')
13
+
14
+ # RUBY18 1.8 does not have force_encoding.
15
+ soap_action.force_encoding('UTF-8') if soap_action.respond_to? :force_encoding
16
+
14
17
  soap_action.gsub!(/^\"(.*)\"$/, '\1')
15
18
 
16
19
  env['wash_out.soap_action'] = soap_action
@@ -1,3 +1,3 @@
1
1
  module WashOut
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -66,6 +66,28 @@ describe WashOut do
66
66
  end.to_hash[:value].should == '420k'
67
67
  end
68
68
 
69
+ it "should understand nested parameter specifications" do
70
+ mock_controller do
71
+ soap_action "getArea", :args => { :circle => { :center => { :x => :integer,
72
+ :y => :integer },
73
+ :radius => :double } },
74
+ :return => { :area => :double,
75
+ :distance_from_o => :double },
76
+ :to => :get_area
77
+ def get_area
78
+ circle = params[:circle]
79
+ render :soap => { :area => Math::PI * circle[:radius] ** 2,
80
+ :distance_from_o => Math.sqrt(circle[:center][:x] ** 2 + circle[:center][:y] ** 2) }
81
+ end
82
+ end
83
+
84
+ client = savon_instance
85
+ client.request(:get_area) do
86
+ soap.body = { :circle => { :center => { :x => 3, :y => 4 },
87
+ :radius => 5 } }
88
+ end.to_hash.should == ({ :area => (Math::PI * 25).to_s, :distance_from_o => (5.0).to_s })
89
+ end
90
+
69
91
  it "should allow arbitrary action names" do
70
92
  mock_controller do
71
93
  soap_action "AnswerToTheUltimateQuestionOfLifeTheUniverseAndEverything",
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.2.2
4
+ version: 0.2.3
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: 2011-12-19 00:00:00.000000000 Z
13
+ date: 2011-12-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nori
17
- requirement: &70120807486540 !ruby/object:Gem::Requirement
17
+ requirement: &73419490 !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: *70120807486540
25
+ version_requirements: *73419490
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec-rails
28
- requirement: &70120807486020 !ruby/object:Gem::Requirement
28
+ requirement: &73418980 !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: *70120807486020
36
+ version_requirements: *73418980
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: appraisal
39
- requirement: &70120807485520 !ruby/object:Gem::Requirement
39
+ requirement: &73418630 !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: *70120807485520
47
+ version_requirements: *73418630
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: tzinfo
50
- requirement: &70120807484900 !ruby/object:Gem::Requirement
50
+ requirement: &73417730 !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: *70120807484900
58
+ version_requirements: *73417730
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: savon
61
- requirement: &70120807484020 !ruby/object:Gem::Requirement
61
+ requirement: &73415050 !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: *70120807484020
69
+ version_requirements: *73415050
70
70
  description: Dead simple Rails 3 SOAP server library
71
71
  email: boris@roundlake.ru
72
72
  executables: []
@@ -134,12 +134,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
134
134
  - - ! '>='
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0'
137
+ segments:
138
+ - 0
139
+ hash: -441958353
137
140
  required_rubygems_version: !ruby/object:Gem::Requirement
138
141
  none: false
139
142
  requirements:
140
143
  - - ! '>='
141
144
  - !ruby/object:Gem::Version
142
145
  version: '0'
146
+ segments:
147
+ - 0
148
+ hash: -441958353
143
149
  requirements: []
144
150
  rubyforge_project:
145
151
  rubygems_version: 1.8.10