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

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/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