savon 0.8.0.beta.3 → 0.8.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 0.8.0.beta.4 (2010-11-20)
2
+
3
+ * Fix for issue #107 (Soap Fault regex not working for API I connect).
4
+
5
+ * Fix for issue #108 (Fixing an issue with :attributes! getting overriden by a double call).
6
+
7
+ * Replaced Savon.response_pattern with a slightly different implementation of the
8
+ Savon::SOAP::Response#to_array method. The method now accepts multiple arguments
9
+ representing the response Hash keys to traverse and returns the result as an Array
10
+ or an empty Array in case the key is nil or does not exist.
11
+
12
+ response.to_array :get_user_response, :return
13
+ # => [{ :id => 1, :name => "foo"}, { :id => 2, :name => "bar"}]
14
+
15
+ ## 0.8.0.beta.3 (2010-11-06)
16
+
17
+ * Fix for [savon_spec](http://rubygems.org/gems/savon_spec) to not send nil to Savon::SOAP::XML#body.
18
+
1
19
  ## 0.8.0.beta.2 (2010-11-05)
2
20
 
3
21
  * Added Savon.response_pattern to automatically walk deeper into the SOAP response Hash when a
data/lib/savon/global.rb CHANGED
@@ -61,14 +61,6 @@ module Savon
61
61
  # Sets whether to strip namespaces in a SOAP response Hash.
62
62
  attr_writer :strip_namespaces
63
63
 
64
- # Returns the response pattern to apply.
65
- def response_pattern
66
- @response_pattern ||= []
67
- end
68
-
69
- # Sets the response pattern (an Array of Regexps or Symbols).
70
- attr_writer :response_pattern
71
-
72
64
  # Reset to default configuration.
73
65
  def reset_config!
74
66
  self.log = true
@@ -77,7 +69,6 @@ module Savon
77
69
  self.raise_errors = true
78
70
  self.soap_version = SOAP::DefaultVersion
79
71
  self.strip_namespaces = true
80
- self.response_pattern = []
81
72
  end
82
73
 
83
74
  end
@@ -19,7 +19,7 @@ module Savon
19
19
 
20
20
  # Returns whether a SOAP fault is present.
21
21
  def present?
22
- @present ||= http.body =~ /<soap:Fault>/
22
+ @present ||= http.body =~ /<(.+:)?Body>(\s*)<(.+:)?Fault>/
23
23
  end
24
24
 
25
25
  # Returns the SOAP fault message.
@@ -44,22 +44,20 @@ module Savon
44
44
  end
45
45
 
46
46
  # Returns the SOAP response body as a Hash.
47
- def original_hash
48
- @original_hash ||= Savon::SOAP::XML.to_hash to_xml
49
- end
50
-
51
- # Returns the SOAP response body as a Hash and applies
52
- # the <tt>Savon.response_pattern</tt> if defined.
53
47
  def to_hash
54
- @hash ||= apply_response_pattern original_hash
48
+ @hash ||= Savon::SOAP::XML.to_hash to_xml
55
49
  end
56
50
 
57
- # Returns the SOAP response Hash as an Array.
58
- def to_array
59
- @array ||= begin
60
- array = to_hash.kind_of?(Array) ? to_hash : [to_hash]
61
- array.compact
51
+ # Traverses the SOAP response Hash for a given +path+ of Hash keys
52
+ # and returns the value as an Array. Defaults to return an empty Array
53
+ # in case the path does not exist or returns nil.
54
+ def to_array(*path)
55
+ value = path.inject to_hash do |memo, key|
56
+ return [] unless memo[key]
57
+ memo[key]
62
58
  end
59
+
60
+ value.kind_of?(Array) ? value.compact : [value].compact
63
61
  end
64
62
 
65
63
  # Returns the SOAP response XML.
@@ -74,20 +72,6 @@ module Savon
74
72
  raise http_error if http_error?
75
73
  end
76
74
 
77
- def apply_response_pattern(hash)
78
- return hash if Savon.response_pattern.blank?
79
-
80
- Savon.response_pattern.inject(hash) do |memo, pattern|
81
- key = case pattern
82
- when Regexp then memo.keys.find { |key| key.to_s =~ pattern }
83
- else memo.keys.find { |key| key.to_s == pattern.to_s }
84
- end
85
-
86
- return hash unless key
87
- memo[key]
88
- end
89
- end
90
-
91
75
  end
92
76
  end
93
77
  end
@@ -114,7 +114,7 @@ module Savon
114
114
 
115
115
  # Returns the SOAP header as an XML String.
116
116
  def header_for_xml
117
- header.to_soap_xml + wsse_header
117
+ @header_for_xml ||= header.to_soap_xml + wsse_header
118
118
  end
119
119
 
120
120
  # Returns the WSSE header or an empty String in case WSSE was not set.
data/lib/savon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Savon
2
2
 
3
- Version = "0.8.0.beta.3"
3
+ Version = "0.8.0.beta.4"
4
4
 
5
5
  end
data/savon.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_dependency "builder", "~> 2.1.2"
18
18
  s.add_dependency "crack", "~> 0.1.8"
19
- s.add_dependency "httpi", ">= 0.6.0"
19
+ s.add_dependency "httpi", ">= 0.7.1"
20
20
 
21
21
  s.add_development_dependency "rspec", "~> 2.0.0"
22
22
  s.add_development_dependency "mocha", "~> 0.9.7"
@@ -18,6 +18,10 @@ class ResponseFixture
18
18
  @soap_fault12 ||= load_fixture :soap_fault12
19
19
  end
20
20
 
21
+ def another_soap_fault
22
+ @another_soap_fault ||= load_fixture :another_soap_fault
23
+ end
24
+
21
25
  def multi_ref
22
26
  @multi_ref ||= load_fixture :multi_ref
23
27
  end
@@ -0,0 +1,14 @@
1
+ <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
2
+ xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
3
+ xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
6
+ <SOAP-ENV:Body>
7
+ <SOAP-ENV:Fault>
8
+ <faultcode>ERR_NO_SESSION</faultcode>
9
+ <faultfactor>doGetItemsInfo - Wrong session</faultfactor>
10
+ <faultstring>Wrong session message</faultstring>
11
+ <detail><soapVal><ERRNO xsi:type="xsd:string">80:1289245853:55</ERRNO></soapVal></detail>
12
+ </SOAP-ENV:Fault>
13
+ </SOAP-ENV:Body>
14
+ </SOAP-ENV:Envelope>
@@ -80,19 +80,6 @@ describe Savon do
80
80
  Savon.strip_namespaces?.should == false
81
81
  end
82
82
  end
83
-
84
- describe "response_pattern" do
85
- it "should default to an empty Array" do
86
- Savon.response_pattern.should == []
87
- end
88
-
89
- it "should return the response pattern to apply" do
90
- pattern = [/.+_response/, :return]
91
- Savon.configure { |config| config.response_pattern = pattern }
92
-
93
- Savon.response_pattern.should == pattern
94
- end
95
- end
96
83
  end
97
84
 
98
85
  end
@@ -3,6 +3,7 @@ require "spec_helper"
3
3
  describe Savon::SOAP::Fault do
4
4
  let(:soap_fault) { Savon::SOAP::Fault.new new_response(:body => ResponseFixture.soap_fault) }
5
5
  let(:soap_fault2) { Savon::SOAP::Fault.new new_response(:body => ResponseFixture.soap_fault12) }
6
+ let(:another_soap_fault) { Savon::SOAP::Fault.new new_response(:body => ResponseFixture.another_soap_fault) }
6
7
  let(:no_fault) { Savon::SOAP::Fault.new new_response }
7
8
 
8
9
  it "should be a Savon::Error" do
@@ -24,6 +25,10 @@ describe Savon::SOAP::Fault do
24
25
  soap_fault2.should be_present
25
26
  end
26
27
 
28
+ it "should return true if the HTTP response contains a SOAP fault with different namespaces" do
29
+ another_soap_fault.should be_present
30
+ end
31
+
27
32
  it "should return false unless the HTTP response contains a SOAP fault" do
28
33
  no_fault.should_not be_present
29
34
  end
@@ -42,6 +47,10 @@ describe Savon::SOAP::Fault do
42
47
  it "should return a SOAP 1.2 fault message" do
43
48
  soap_fault2.send(method).should == "(soap:Sender) Sender Timeout"
44
49
  end
50
+
51
+ it "should return a SOAP fault message (with different namespaces)" do
52
+ another_soap_fault.send(method).should == "(ERR_NO_SESSION) Wrong session message"
53
+ end
45
54
  end
46
55
  end
47
56
 
@@ -116,72 +116,35 @@ describe Savon::SOAP::Response do
116
116
  end
117
117
  end
118
118
 
119
- describe "#original_hash" do
119
+ describe "#to_hash" do
120
120
  it "should return the SOAP response body as a Hash" do
121
- soap_response.original_hash[:authenticate_response][:return].should ==
121
+ soap_response.to_hash[:authenticate_response][:return].should ==
122
122
  ResponseFixture.authentication(:to_hash)
123
123
  end
124
124
  end
125
125
 
126
- describe "#to_hash" do
126
+ describe "#to_array" do
127
127
  let(:response) { soap_response }
128
128
 
129
- it "should memoize the result" do
130
- response.to_hash.should equal(response.to_hash)
131
- end
132
-
133
- context "without response pattern" do
134
- it "should return the original Hash" do
135
- response.to_hash[:authenticate_response].should be_a(Hash)
129
+ context "when the given path exists" do
130
+ it "should return an Array containing the path value" do
131
+ response.to_array(:authenticate_response, :return).should == [ResponseFixture.authentication(:to_hash)]
136
132
  end
137
133
  end
138
134
 
139
- context "with response pattern" do
140
- it "should apply the response pattern" do
141
- Savon.response_pattern = [/.+_response/, :return]
142
- response.to_hash[:success].should be_true
143
-
144
- Savon.response_pattern = nil # reset to default
135
+ context "when the given path returns nil" do
136
+ it "should return an empty Array" do
137
+ response.to_array(:authenticate_response, :undefined).should == []
145
138
  end
146
139
  end
147
140
 
148
- context "with unmatched response pattern" do
149
- it "should return the original Hash" do
150
- Savon.response_pattern = [:unmatched, :pattern]
151
- response.to_hash.should == response.original_hash
152
-
153
- Savon.response_pattern = nil # reset to default
141
+ context "when the given path does not exist at all" do
142
+ it "should return an empty Array" do
143
+ response.to_array(:authenticate_response, :some, :wrong, :path).should == []
154
144
  end
155
145
  end
156
146
  end
157
147
 
158
- describe "#to_array" do
159
- let(:response) { soap_response }
160
-
161
- around do |example|
162
- Savon.response_pattern = [/.+_response/, :return]
163
- example.run
164
- Savon.response_pattern = nil # reset to default
165
- end
166
-
167
- it "should memoize the result" do
168
- response.to_array.should equal(response.to_array)
169
- end
170
-
171
- it "should return an Array for a single response element" do
172
- response.to_array.should be_an(Array)
173
- response.to_array.first[:success].should be_true
174
- end
175
-
176
- it "should return an Array for multiple response element" do
177
- Savon.response_pattern = [/.+_response/, :history, :case]
178
- list_response = soap_response :body => ResponseFixture.list
179
-
180
- list_response.to_array.should be_an(Array)
181
- list_response.to_array.should have(2).items
182
- end
183
- end
184
-
185
148
  describe "#to_xml" do
186
149
  it "should return the raw SOAP response body" do
187
150
  soap_response.to_xml.should == ResponseFixture.authentication
@@ -166,6 +166,17 @@ describe Savon::SOAP::XML do
166
166
  end
167
167
  end
168
168
 
169
+ context "with a SOAP header" do
170
+ it "should contain the given header" do
171
+ xml.header = {
172
+ :token => "secret",
173
+ :attributes! => { :token => { :xmlns => "http://example.com" } }
174
+ }
175
+
176
+ xml.to_xml.should include('<env:Header><token xmlns="http://example.com">secret</token></env:Header>')
177
+ end
178
+ end
179
+
169
180
  context "with the global SOAP version set to 1.2" do
170
181
  it "should contain the namespace for SOAP 1.2" do
171
182
  Savon.soap_version = 2
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: savon
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196261
4
+ hash: 62196267
5
5
  prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
9
  - 0
10
10
  - beta
11
- - 3
12
- version: 0.8.0.beta.3
11
+ - 4
12
+ version: 0.8.0.beta.4
13
13
  platform: ruby
14
14
  authors:
15
15
  - Daniel Harrington
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-11-06 00:00:00 +01:00
20
+ date: 2010-11-26 00:00:00 +01:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -60,12 +60,12 @@ dependencies:
60
60
  requirements:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
- hash: 7
63
+ hash: 1
64
64
  segments:
65
65
  - 0
66
- - 6
67
- - 0
68
- version: 0.6.0
66
+ - 7
67
+ - 1
68
+ version: 0.7.1
69
69
  type: :runtime
70
70
  version_requirements: *id003
71
71
  - !ruby/object:Gem::Dependency
@@ -143,6 +143,7 @@ files:
143
143
  - spec/fixtures/gzip/gzip_response_fixture.rb
144
144
  - spec/fixtures/gzip/message.gz
145
145
  - spec/fixtures/response/response_fixture.rb
146
+ - spec/fixtures/response/xml/another_soap_fault.xml
146
147
  - spec/fixtures/response/xml/authentication.xml
147
148
  - spec/fixtures/response/xml/list.xml
148
149
  - spec/fixtures/response/xml/multi_ref.xml