wash_out 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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