savon 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ ## 0.9.4 (2011-07-03)
2
+
3
+ * Refactoring: Extracted the WSDL parser out into the [wasabi](http://rubygems.org/gems/wasabi) gem.
4
+ This should isolate upcoming improvements to the parser.
5
+
1
6
  ## 0.9.3 (2011-06-30)
2
7
 
3
8
  * Fix: [issue 138](https://github.com/rubiii/savon/issues/138) -
@@ -1,16 +1,15 @@
1
1
  require "httpi/request"
2
+ require "savon/wasabi/document"
2
3
  require "savon/soap/xml"
3
4
  require "savon/soap/request"
4
5
  require "savon/soap/response"
5
- require "savon/wsdl/document"
6
6
  require "savon/wsse"
7
7
 
8
8
  module Savon
9
9
 
10
10
  # = Savon::Client
11
11
  #
12
- # Savon::Client is the main object for connecting to a SOAP service. It includes methods to access
13
- # both the Savon::WSDL::Document and HTTPI::Request object.
12
+ # Savon::Client is the main object for connecting to a SOAP service.
14
13
  class Client
15
14
 
16
15
  # Initializes the Savon::Client for a SOAP service. Accepts a +block+ which is evaluated in the
@@ -19,13 +18,10 @@ module Savon
19
18
  # == Examples
20
19
  #
21
20
  # # Using a remote WSDL
22
- # client = Savon::Client.new { wsdl.document = "http://example.com/UserService?wsdl" }
21
+ # client = Savon::Client.new("http://example.com/UserService?wsdl")
23
22
  #
24
23
  # # Using a local WSDL
25
- # client = Savon::Client.new { wsdl.document = "../wsdl/user_service.xml" }
26
- #
27
- # # Shortcut for setting the WSDL
28
- # client = Savon::Client.new "http://example.com/UserService?wsdl"
24
+ # client = Savon::Client.new File.expand_path("../wsdl/service.xml", __FILE__)
29
25
  #
30
26
  # # Directly accessing a SOAP endpoint
31
27
  # client = Savon::Client.new do
@@ -38,9 +34,9 @@ module Savon
38
34
  wsdl.request = http
39
35
  end
40
36
 
41
- # Returns the <tt>Savon::WSDL::Document</tt>.
37
+ # Returns the <tt>Savon::Wasabi::Document</tt>.
42
38
  def wsdl
43
- @wsdl ||= WSDL::Document.new
39
+ @wsdl ||= Wasabi::Document.new
44
40
  end
45
41
 
46
42
  # Returns the <tt>HTTPI::Request</tt>.
@@ -112,7 +108,7 @@ module Savon
112
108
  soap.endpoint = wsdl.endpoint
113
109
  soap.namespace_identifier = options[0]
114
110
  soap.namespace = wsdl.namespace
115
- soap.element_form_default = wsdl.element_form_default if wsdl.present?
111
+ soap.element_form_default = wsdl.element_form_default if wsdl.document?
116
112
  soap.body = options[2].delete(:body)
117
113
 
118
114
  set_soap_action options[1]
@@ -121,16 +117,16 @@ module Savon
121
117
 
122
118
  # Expects an +input+ and sets the +SOAPAction+ HTTP headers.
123
119
  def set_soap_action(input)
124
- soap_action = wsdl.soap_action input.to_sym
120
+ soap_action = wsdl.soap_action(input.to_sym) if wsdl.document?
125
121
  soap_action ||= Gyoku::XMLKey.create(input).to_sym
126
122
  http.headers["SOAPAction"] = %{"#{soap_action}"}
127
123
  end
128
124
 
129
125
  # Expects a +namespace+, +input+ and +attributes+ and sets the SOAP input.
130
126
  def set_soap_input(namespace, input, attributes)
131
- new_input = wsdl.soap_input input.to_sym
132
- new_input ||= Gyoku::XMLKey.create(input).to_sym
133
- soap.input = [namespace, new_input, attributes].compact
127
+ new_input = wsdl.soap_input(input.to_sym) if wsdl.document?
128
+ new_input ||= Gyoku::XMLKey.create(input)
129
+ soap.input = [namespace, new_input.to_sym, attributes].compact
134
130
  end
135
131
 
136
132
  # Processes a given +block+. Yields objects if the block expects any arguments.
@@ -1,5 +1,5 @@
1
1
  module Savon
2
2
 
3
- Version = "0.9.3"
3
+ Version = "0.9.4"
4
4
 
5
5
  end
@@ -0,0 +1,41 @@
1
+ require "wasabi"
2
+ require "httpi/request"
3
+
4
+ module Savon
5
+ module Wasabi
6
+
7
+ # = Savon::Wasabi::Document
8
+ #
9
+ # Extends the <tt>Wasabi::Document</tt> to extend its document handling by
10
+ # adding support for remote and local WSDL documents.
11
+ class Document < ::Wasabi::Document
12
+
13
+ # Hooks into Wasabi and extends its document handling.
14
+ def xml
15
+ @xml ||= document.kind_of?(String) ? resolve_document : document
16
+ end
17
+
18
+ # Sets up and returns the <tt>HTTPI::Request</tt>.
19
+ def request
20
+ @request ||= HTTPI::Request.new
21
+ @request.url = document
22
+ @request
23
+ end
24
+
25
+ # Sets the <tt>HTTPI::Request</tt> for remote WSDL documents.
26
+ attr_writer :request
27
+
28
+ private
29
+
30
+ # Resolves and returns the raw WSDL document.
31
+ def resolve_document
32
+ case document
33
+ when /^http[s]?:/ then HTTPI.get(request).body
34
+ when /^</ then document
35
+ else File.read(document)
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.add_dependency "builder", ">= 2.1.2"
18
18
  s.add_dependency "nori", "~> 1.0"
19
19
  s.add_dependency "httpi", "~> 0.9"
20
+ s.add_dependency "wasabi", "~> 1.0"
20
21
  s.add_dependency "gyoku", ">= 0.4.0"
21
22
  s.add_dependency "nokogiri", ">= 1.4.0"
22
23
 
@@ -7,21 +7,21 @@ describe Savon::Client do
7
7
  context "with a String" do
8
8
  it "should set the WSDL document" do
9
9
  wsdl = "http://example.com/UserService?wsdl"
10
- client = Savon::Client.new wsdl
10
+ client = Savon::Client.new(wsdl)
11
11
  client.wsdl.instance_variable_get("@document").should == wsdl
12
12
  end
13
13
  end
14
14
 
15
15
  context "with a block expecting one argument" do
16
16
  it "should yield the WSDL object" do
17
- Savon::Client.new { |wsdl| wsdl.should be_a(Savon::WSDL::Document) }
17
+ Savon::Client.new { |wsdl| wsdl.should be_a(Savon::Wasabi::Document) }
18
18
  end
19
19
  end
20
20
 
21
21
  context "with a block expecting two arguments" do
22
22
  it "should yield the WSDL and HTTP objects" do
23
23
  Savon::Client.new do |wsdl, http|
24
- wsdl.should be_an(Savon::WSDL::Document)
24
+ wsdl.should be_an(Savon::Wasabi::Document)
25
25
  http.should be_an(HTTPI::Request)
26
26
  end
27
27
  end
@@ -30,7 +30,7 @@ describe Savon::Client do
30
30
  context "with a block expecting three arguments" do
31
31
  it "should yield the WSDL, HTTP and WSSE objects" do
32
32
  Savon::Client.new do |wsdl, http, wsse|
33
- wsdl.should be_an(Savon::WSDL::Document)
33
+ wsdl.should be_an(Savon::Wasabi::Document)
34
34
  http.should be_an(HTTPI::Request)
35
35
  wsse.should be_an(Savon::WSSE)
36
36
  end
@@ -39,7 +39,7 @@ describe Savon::Client do
39
39
 
40
40
  context "with a block expecting no arguments" do
41
41
  it "should let you access the WSDL object" do
42
- Savon::Client.new { wsdl.should be_a(Savon::WSDL::Document) }
42
+ Savon::Client.new { wsdl.should be_a(Savon::Wasabi::Document) }
43
43
  end
44
44
 
45
45
  it "should let you access the HTTP object" do
@@ -53,8 +53,8 @@ describe Savon::Client do
53
53
  end
54
54
 
55
55
  describe "#wsdl" do
56
- it "should return the Savon::WSDL::Document" do
57
- client.wsdl.should be_a(Savon::WSDL::Document)
56
+ it "should return the Savon::Wasabi::Document" do
57
+ client.wsdl.should be_a(Savon::Wasabi::Document)
58
58
  end
59
59
  end
60
60
 
@@ -150,7 +150,7 @@ describe Savon::Client do
150
150
  it "should yield the SOAP and WSDL objects" do
151
151
  client.request(:authenticate) do |soap, wsdl|
152
152
  soap.should be_a(Savon::SOAP::XML)
153
- wsdl.should be_an(Savon::WSDL::Document)
153
+ wsdl.should be_an(Savon::Wasabi::Document)
154
154
  end
155
155
  end
156
156
  end
@@ -159,7 +159,7 @@ describe Savon::Client do
159
159
  it "should yield the SOAP, WSDL and HTTP objects" do
160
160
  client.request(:authenticate) do |soap, wsdl, http|
161
161
  soap.should be_a(Savon::SOAP::XML)
162
- wsdl.should be_an(Savon::WSDL::Document)
162
+ wsdl.should be_an(Savon::Wasabi::Document)
163
163
  http.should be_an(HTTPI::Request)
164
164
  end
165
165
  end
@@ -169,7 +169,7 @@ describe Savon::Client do
169
169
  it "should yield the SOAP, WSDL, HTTP and WSSE objects" do
170
170
  client.request(:authenticate) do |soap, wsdl, http, wsse|
171
171
  soap.should be_a(Savon::SOAP::XML)
172
- wsdl.should be_a(Savon::WSDL::Document)
172
+ wsdl.should be_a(Savon::Wasabi::Document)
173
173
  http.should be_an(HTTPI::Request)
174
174
  wsse.should be_a(Savon::WSSE)
175
175
  end
@@ -190,7 +190,7 @@ describe Savon::Client do
190
190
  end
191
191
 
192
192
  it "should let you access the WSDL object" do
193
- client.request(:authenticate) { wsdl.should be_a(Savon::WSDL::Document) }
193
+ client.request(:authenticate) { wsdl.should be_a(Savon::Wasabi::Document) }
194
194
  end
195
195
  end
196
196
 
@@ -262,7 +262,7 @@ describe Savon::Client do
262
262
 
263
263
  it "should get #element_form_default from the WSDL" do
264
264
  HTTPI.stubs(:post).returns(new_response)
265
- Savon::WSDL::Document.any_instance.expects(:element_form_default).returns(:qualified)
265
+ Savon::Wasabi::Document.any_instance.expects(:element_form_default).returns(:qualified)
266
266
 
267
267
  client.request :authenticate
268
268
  end
@@ -287,7 +287,7 @@ describe Savon::Client do
287
287
  before { HTTPI.expects(:get).never }
288
288
 
289
289
  it "raise an ArgumentError when trying to access the WSDL" do
290
- lambda { client.wsdl.soap_actions }.should raise_error(ArgumentError)
290
+ lambda { client.wsdl.soap_actions }.should raise_error(ArgumentError, /Wasabi/)
291
291
  end
292
292
 
293
293
  it "adds a SOAPAction header containing the SOAP action name" do
@@ -300,7 +300,7 @@ describe Savon::Client do
300
300
 
301
301
  it "should not get #element_form_default from the WSDL" do
302
302
  HTTPI.stubs(:post).returns(new_response)
303
- Savon::WSDL::Document.any_instance.expects(:element_form_default).never
303
+ Savon::Wasabi::Document.any_instance.expects(:element_form_default).never
304
304
 
305
305
  client.request :authenticate
306
306
  end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Savon::Wasabi::Document do
4
+
5
+ context "with a remote document" do
6
+ before do
7
+ response = HTTPI::Response.new 200, {}, Fixture.wsdl(:authentication)
8
+ HTTPI.stubs(:get).returns(response)
9
+ end
10
+
11
+ it "should resolve via HTTP" do
12
+ wsdl = Savon::Wasabi::Document.new("http://example.com?wsdl")
13
+ wsdl.xml.should == Fixture.wsdl(:authentication)
14
+ end
15
+
16
+ it "should resolve via HTTPS" do
17
+ wsdl = Savon::Wasabi::Document.new("https://example.com?wsdl")
18
+ wsdl.xml.should == Fixture.wsdl(:authentication)
19
+ end
20
+ end
21
+
22
+ context "with a local document" do
23
+ before do
24
+ HTTPI.expects(:get).never
25
+ end
26
+
27
+ it "should read the file" do
28
+ wsdl = Savon::Wasabi::Document.new("spec/fixtures/wsdl/authentication.xml")
29
+ wsdl.xml.should == Fixture.wsdl(:authentication)
30
+ end
31
+ end
32
+
33
+ context "with raw XML" do
34
+ before do
35
+ HTTPI.expects(:get).never
36
+ File.expects(:read).never
37
+ end
38
+
39
+ it "should use the raw XML" do
40
+ wsdl = Savon::Wasabi::Document.new Fixture.wsdl(:authentication)
41
+ wsdl.xml.should == Fixture.wsdl(:authentication)
42
+ end
43
+ end
44
+
45
+ end
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: savon
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 51
4
5
  prerelease:
5
- version: 0.9.3
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 4
10
+ version: 0.9.4
6
11
  platform: ruby
7
12
  authors:
8
13
  - Daniel Harrington
@@ -10,7 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-06-29 00:00:00 Z
18
+ date: 2011-07-03 00:00:00 Z
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: builder
@@ -20,6 +25,11 @@ dependencies:
20
25
  requirements:
21
26
  - - ">="
22
27
  - !ruby/object:Gem::Version
28
+ hash: 15
29
+ segments:
30
+ - 2
31
+ - 1
32
+ - 2
23
33
  version: 2.1.2
24
34
  type: :runtime
25
35
  version_requirements: *id001
@@ -31,6 +41,10 @@ dependencies:
31
41
  requirements:
32
42
  - - ~>
33
43
  - !ruby/object:Gem::Version
44
+ hash: 15
45
+ segments:
46
+ - 1
47
+ - 0
34
48
  version: "1.0"
35
49
  type: :runtime
36
50
  version_requirements: *id002
@@ -42,86 +56,138 @@ dependencies:
42
56
  requirements:
43
57
  - - ~>
44
58
  - !ruby/object:Gem::Version
59
+ hash: 25
60
+ segments:
61
+ - 0
62
+ - 9
45
63
  version: "0.9"
46
64
  type: :runtime
47
65
  version_requirements: *id003
48
66
  - !ruby/object:Gem::Dependency
49
- name: gyoku
67
+ name: wasabi
50
68
  prerelease: false
51
69
  requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ hash: 15
75
+ segments:
76
+ - 1
77
+ - 0
78
+ version: "1.0"
79
+ type: :runtime
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: gyoku
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
52
85
  none: false
53
86
  requirements:
54
87
  - - ">="
55
88
  - !ruby/object:Gem::Version
89
+ hash: 15
90
+ segments:
91
+ - 0
92
+ - 4
93
+ - 0
56
94
  version: 0.4.0
57
95
  type: :runtime
58
- version_requirements: *id004
96
+ version_requirements: *id005
59
97
  - !ruby/object:Gem::Dependency
60
98
  name: nokogiri
61
99
  prerelease: false
62
- requirement: &id005 !ruby/object:Gem::Requirement
100
+ requirement: &id006 !ruby/object:Gem::Requirement
63
101
  none: false
64
102
  requirements:
65
103
  - - ">="
66
104
  - !ruby/object:Gem::Version
105
+ hash: 7
106
+ segments:
107
+ - 1
108
+ - 4
109
+ - 0
67
110
  version: 1.4.0
68
111
  type: :runtime
69
- version_requirements: *id005
112
+ version_requirements: *id006
70
113
  - !ruby/object:Gem::Dependency
71
114
  name: rake
72
115
  prerelease: false
73
- requirement: &id006 !ruby/object:Gem::Requirement
116
+ requirement: &id007 !ruby/object:Gem::Requirement
74
117
  none: false
75
118
  requirements:
76
119
  - - ~>
77
120
  - !ruby/object:Gem::Version
121
+ hash: 49
122
+ segments:
123
+ - 0
124
+ - 8
125
+ - 7
78
126
  version: 0.8.7
79
127
  type: :development
80
- version_requirements: *id006
128
+ version_requirements: *id007
81
129
  - !ruby/object:Gem::Dependency
82
130
  name: rspec
83
131
  prerelease: false
84
- requirement: &id007 !ruby/object:Gem::Requirement
132
+ requirement: &id008 !ruby/object:Gem::Requirement
85
133
  none: false
86
134
  requirements:
87
135
  - - ~>
88
136
  - !ruby/object:Gem::Version
137
+ hash: 27
138
+ segments:
139
+ - 2
140
+ - 5
141
+ - 0
89
142
  version: 2.5.0
90
143
  type: :development
91
- version_requirements: *id007
144
+ version_requirements: *id008
92
145
  - !ruby/object:Gem::Dependency
93
146
  name: mocha
94
147
  prerelease: false
95
- requirement: &id008 !ruby/object:Gem::Requirement
148
+ requirement: &id009 !ruby/object:Gem::Requirement
96
149
  none: false
97
150
  requirements:
98
151
  - - ~>
99
152
  - !ruby/object:Gem::Version
153
+ hash: 43
154
+ segments:
155
+ - 0
156
+ - 9
157
+ - 8
100
158
  version: 0.9.8
101
159
  type: :development
102
- version_requirements: *id008
160
+ version_requirements: *id009
103
161
  - !ruby/object:Gem::Dependency
104
162
  name: timecop
105
163
  prerelease: false
106
- requirement: &id009 !ruby/object:Gem::Requirement
164
+ requirement: &id010 !ruby/object:Gem::Requirement
107
165
  none: false
108
166
  requirements:
109
167
  - - ~>
110
168
  - !ruby/object:Gem::Version
169
+ hash: 25
170
+ segments:
171
+ - 0
172
+ - 3
173
+ - 5
111
174
  version: 0.3.5
112
175
  type: :development
113
- version_requirements: *id009
176
+ version_requirements: *id010
114
177
  - !ruby/object:Gem::Dependency
115
178
  name: autotest
116
179
  prerelease: false
117
- requirement: &id010 !ruby/object:Gem::Requirement
180
+ requirement: &id011 !ruby/object:Gem::Requirement
118
181
  none: false
119
182
  requirements:
120
183
  - - ">="
121
184
  - !ruby/object:Gem::Version
185
+ hash: 3
186
+ segments:
187
+ - 0
122
188
  version: "0"
123
189
  type: :development
124
- version_requirements: *id010
190
+ version_requirements: *id011
125
191
  description: Ruby's heavy metal SOAP client
126
192
  email: me@rubiii.com
127
193
  executables: []
@@ -154,9 +220,7 @@ files:
154
220
  - lib/savon/soap/response.rb
155
221
  - lib/savon/soap/xml.rb
156
222
  - lib/savon/version.rb
157
- - lib/savon/wsdl/document.rb
158
- - lib/savon/wsdl/parser.rb
159
- - lib/savon/wsdl/request.rb
223
+ - lib/savon/wasabi/document.rb
160
224
  - lib/savon/wsse.rb
161
225
  - savon.gemspec
162
226
  - spec/fixtures/gzip/message.gz
@@ -184,9 +248,7 @@ files:
184
248
  - spec/savon/soap/response_spec.rb
185
249
  - spec/savon/soap/xml_spec.rb
186
250
  - spec/savon/soap_spec.rb
187
- - spec/savon/wsdl/document_spec.rb
188
- - spec/savon/wsdl/parser_spec.rb
189
- - spec/savon/wsdl/request_spec.rb
251
+ - spec/savon/wasabi/document_spec.rb
190
252
  - spec/savon/wsse_spec.rb
191
253
  - spec/spec_helper.rb
192
254
  - spec/support/endpoint.rb
@@ -204,17 +266,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
204
266
  requirements:
205
267
  - - ">="
206
268
  - !ruby/object:Gem::Version
269
+ hash: 3
270
+ segments:
271
+ - 0
207
272
  version: "0"
208
273
  required_rubygems_version: !ruby/object:Gem::Requirement
209
274
  none: false
210
275
  requirements:
211
276
  - - ">="
212
277
  - !ruby/object:Gem::Version
278
+ hash: 3
279
+ segments:
280
+ - 0
213
281
  version: "0"
214
282
  requirements: []
215
283
 
216
284
  rubyforge_project: savon
217
- rubygems_version: 1.8.4
285
+ rubygems_version: 1.8.5
218
286
  signing_key:
219
287
  specification_version: 3
220
288
  summary: Heavy metal Ruby SOAP client
@@ -1,112 +0,0 @@
1
- require "nokogiri"
2
-
3
- require "savon/wsdl/request"
4
- require "savon/wsdl/parser"
5
-
6
- module Savon
7
- module WSDL
8
-
9
- # = Savon::WSDL::Document
10
- #
11
- # Represents the WSDL of your service, including information like the namespace URI,
12
- # the SOAP endpoint and available SOAP actions.
13
- class Document
14
-
15
- # Accepts an <tt>HTTPI::Request</tt> and a +document+.
16
- def initialize(request = nil, document = nil)
17
- self.request = request
18
- self.document = document
19
- end
20
-
21
- # Accessor for the <tt>HTTPI::Request</tt> to use.
22
- attr_accessor :request
23
-
24
- def present?
25
- !!@document
26
- end
27
-
28
- # Returns the namespace URI of the WSDL.
29
- def namespace
30
- @namespace ||= parser.namespace
31
- end
32
-
33
- # Sets the SOAP namespace.
34
- attr_writer :namespace
35
-
36
- # Returns the SOAP endpoint.
37
- def endpoint
38
- @endpoint ||= parser.endpoint
39
- end
40
-
41
- # Sets the SOAP endpoint.
42
- attr_writer :endpoint
43
-
44
- # Returns an Array of available SOAP actions.
45
- def soap_actions
46
- @soap_actions ||= parser.operations.keys
47
- end
48
-
49
- # Returns the SOAP action for a given +key+.
50
- def soap_action(key)
51
- operations[key][:action] if present? && operations[key]
52
- end
53
-
54
- # Returns the SOAP input for a given +key+.
55
- def soap_input(key)
56
- operations[key][:input].to_sym if present? && operations[key]
57
- end
58
-
59
- # Returns a Hash of SOAP operations.
60
- def operations
61
- @operations ||= parser.operations
62
- end
63
-
64
- # Returns the elementFormDefault value.
65
- def element_form_default
66
- @element_form_default ||= parser.element_form_default
67
- end
68
-
69
- # Sets the location of the WSDL document to use. This can either be a URL
70
- # or a path to a local file.
71
- attr_writer :document
72
-
73
- # Returns the raw WSDL document.
74
- def document
75
- @wsdl_document ||= begin
76
- raise ArgumentError, "No WSDL document given" if @document.blank?
77
- remote? ? http_request : read_file
78
- end
79
- end
80
-
81
- alias :to_xml :document
82
-
83
- private
84
-
85
- # Returns whether the WSDL document is located on the Web.
86
- def remote?
87
- @document =~ /^http/
88
- end
89
-
90
- # Executes an HTTP GET request to retrieve a remote WSDL document.
91
- def http_request
92
- request.url = @document
93
- Request.execute(request).body
94
- end
95
-
96
- # Reads the WSDL document from a local file.
97
- def read_file
98
- File.read @document
99
- end
100
-
101
- # Parses the WSDL document and returns the <tt>Savon::WSDL::Parser</tt>.
102
- def parser
103
- @parser ||= begin
104
- parser = Parser.new(Nokogiri::XML(document))
105
- parser.parse
106
- parser
107
- end
108
- end
109
-
110
- end
111
- end
112
- end
@@ -1,96 +0,0 @@
1
- require "savon/core_ext/object"
2
- require "savon/core_ext/string"
3
-
4
- module Savon
5
- module WSDL
6
-
7
- # = Savon::WSDL::Parser
8
- #
9
- # Parses WSDL documents and remembers the parts of them we care about.
10
- class Parser
11
-
12
- # The main sections of a WSDL document.
13
- Sections = %w(definitions types message portType binding service)
14
-
15
- def initialize(nokogiri_document)
16
- @document = nokogiri_document
17
- @path = []
18
- @operations = {}
19
- @namespaces = {}
20
- @element_form_default = :unqualified
21
- end
22
-
23
- # Returns the namespace URI.
24
- attr_reader :namespace
25
-
26
- # Returns the SOAP operations.
27
- attr_reader :operations
28
-
29
- # Returns the SOAP endpoint.
30
- attr_reader :endpoint
31
-
32
- # Returns the elementFormDefault value.
33
- attr_reader :element_form_default
34
-
35
- def parse
36
- parse_namespaces
37
- parse_endpoint
38
- parse_operations
39
- end
40
-
41
- def parse_namespaces
42
- element_form_default = @document.at_xpath(
43
- "s0:definitions/s0:types/xs:schema/@elementFormDefault",
44
- "s0" => "http://schemas.xmlsoap.org/wsdl/",
45
- "xs" => "http://www.w3.org/2001/XMLSchema")
46
- @element_form_default = element_form_default.to_s.to_sym if element_form_default
47
-
48
- namespace = @document.at_xpath(
49
- "s0:definitions/@targetNamespace",
50
- "s0" => "http://schemas.xmlsoap.org/wsdl/")
51
- @namespace = namespace.to_s if namespace
52
- end
53
-
54
- def parse_endpoint
55
- endpoint = @document.at_xpath(
56
- "s0:definitions/s0:service//soap11:address/@location",
57
- "s0" => "http://schemas.xmlsoap.org/wsdl/",
58
- "soap11" => "http://schemas.xmlsoap.org/wsdl/soap/")
59
- endpoint ||= @document.at_xpath(
60
- "s0:definitions/s0:service//soap12:address/@location",
61
- "s0" => "http://schemas.xmlsoap.org/wsdl/",
62
- "soap12" => "http://schemas.xmlsoap.org/wsdl/soap12/")
63
- @endpoint = URI(URI.escape(endpoint.to_s)) if endpoint
64
- end
65
-
66
- def parse_operations
67
- operations = @document.xpath(
68
- "s0:definitions/s0:binding/s0:operation",
69
- "s0" => "http://schemas.xmlsoap.org/wsdl/")
70
- operations.each do |operation|
71
- name = operation.attribute("name").to_s
72
-
73
- soap_action = operation.at_xpath(".//soap11:operation/@soapAction",
74
- "soap11" => "http://schemas.xmlsoap.org/wsdl/soap/"
75
- )
76
- soap_action ||= operation.at_xpath(".//soap12:operation/@soapAction",
77
- "soap12" => "http://schemas.xmlsoap.org/wsdl/soap12/"
78
- )
79
- if soap_action
80
- soap_action = soap_action.to_s
81
-
82
- action = !soap_action.blank? ? soap_action : name
83
- input = (!name || name.empty?) ? action.split("/").last : name
84
-
85
- @operations[input.snakecase.to_sym] =
86
- { :action => action, :input => input }
87
- elsif !@operations[name.snakecase.to_sym]
88
- @operations[name.snakecase.to_sym] =
89
- { :action => name, :input => name }
90
- end
91
- end
92
- end
93
-
94
- end
95
- end
96
- end
@@ -1,41 +0,0 @@
1
- require "httpi"
2
-
3
- module Savon
4
- module WSDL
5
-
6
- # = Savon::WSDL::Request
7
- #
8
- # Executes WSDL requests.
9
- class Request
10
-
11
- # Expects an <tt>HTTPI::Request</tt> to execute a WSDL request
12
- # and returns the response.
13
- def self.execute(request)
14
- new(request).response
15
- end
16
-
17
- # Expects an <tt>HTTPI::Request</tt>.
18
- def initialize(request)
19
- self.request = request
20
- end
21
-
22
- # Accessor for the <tt>HTTPI::Request</tt>.
23
- attr_accessor :request
24
-
25
- # Executes the request and returns the response.
26
- def response
27
- @response ||= with_logging { HTTPI.get request }
28
- end
29
-
30
- private
31
-
32
- # Logs the HTTP request and yields to a given +block+.
33
- def with_logging
34
- Savon.log "Retrieving WSDL from: #{request.url}"
35
- Savon.log "Using :#{request.auth.type} authentication" if request.auth?
36
- yield
37
- end
38
-
39
- end
40
- end
41
- end
@@ -1,132 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Savon::WSDL::Document do
4
-
5
- shared_examples_for "a WSDL document" do
6
- it "should be present" do
7
- wsdl.should be_present
8
- end
9
-
10
- describe "#namespace" do
11
- it "should return the namespace URI" do
12
- wsdl.namespace.should == "http://v1_0.ws.auth.order.example.com/"
13
- end
14
- end
15
-
16
- describe "#soap_actions" do
17
- it "should return an Array of available SOAP actions" do
18
- wsdl.soap_actions.should == [:authenticate]
19
- end
20
- end
21
-
22
- describe "#soap_action" do
23
- it "should return the SOAP action for a given key" do
24
- wsdl.soap_action(:authenticate).should == "authenticate"
25
- end
26
-
27
- it "should return nil if no SOAP action could be found" do
28
- wsdl.soap_action(:unknown).should be_nil
29
- end
30
- end
31
-
32
- describe "#soap_input" do
33
- it "should return the SOAP input tag for a given key" do
34
- wsdl.soap_input(:authenticate).should == :authenticate
35
- end
36
-
37
- it "should return nil if no SOAP input tag could be found" do
38
- wsdl.soap_input(:unknown).should be_nil
39
- end
40
- end
41
-
42
- describe "#operations" do
43
- it "should return a Hash of SOAP operations" do
44
- wsdl.operations.should == {
45
- :authenticate => {
46
- :input => "authenticate", :action => "authenticate"
47
- }
48
- }
49
- end
50
- end
51
-
52
- describe "#document" do
53
- it "should return the raw WSDL document" do
54
- wsdl.document.should == Fixture.wsdl(:authentication)
55
- end
56
-
57
- it "should be memoized" do
58
- wsdl.document.should equal(wsdl.document)
59
- end
60
- end
61
- end
62
-
63
- context "with a remote document" do
64
- let(:wsdl) { Savon::WSDL::Document.new HTTPI::Request.new, Endpoint.wsdl }
65
-
66
- before do
67
- response = HTTPI::Response.new 200, {}, Fixture.wsdl(:authentication)
68
- HTTPI.stubs(:get).returns(response)
69
- end
70
-
71
- it_should_behave_like "a WSDL document"
72
-
73
- describe "#element_form_default" do
74
- it "should return :unqualified" do
75
- wsdl.element_form_default.should == :unqualified
76
- end
77
- end
78
- end
79
-
80
- context "with a local document" do
81
- let(:wsdl) do
82
- wsdl = "spec/fixtures/wsdl/authentication.xml"
83
- Savon::WSDL::Document.new HTTPI::Request.new, wsdl
84
- end
85
-
86
- before { HTTPI.expects(:get).never }
87
-
88
- it_should_behave_like "a WSDL document"
89
- end
90
-
91
- context "without a WSDL document" do
92
- let(:wsdl) { Savon::WSDL::Document.new HTTPI::Request.new }
93
-
94
- it "should not be present" do
95
- wsdl.should_not be_present
96
- end
97
-
98
- describe "#soap_action" do
99
- it "should return nil" do
100
- wsdl.soap_action(:authenticate).should be_nil
101
- end
102
- end
103
-
104
- describe "#soap_input" do
105
- it "should return nil" do
106
- wsdl.soap_input(:authenticate).should be_nil
107
- end
108
- end
109
-
110
- describe "#document" do
111
- it "should raise an ArgumentError" do
112
- lambda { wsdl.document }.should raise_error(ArgumentError)
113
- end
114
- end
115
- end
116
-
117
- context "with a WSDL document containing elementFormDefault='qualified'" do
118
- let(:wsdl) { Savon::WSDL::Document.new HTTPI::Request.new, Endpoint.wsdl }
119
-
120
- before do
121
- response = HTTPI::Response.new 200, {}, Fixture.wsdl(:geotrust)
122
- HTTPI.stubs(:get).returns(response)
123
- end
124
-
125
- describe "#element_form_default" do
126
- it "should return :qualified" do
127
- wsdl.element_form_default.should == :qualified
128
- end
129
- end
130
- end
131
-
132
- end
@@ -1,107 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Savon::WSDL::Parser do
4
-
5
- context "with namespaced_actions.xml" do
6
- let(:parser) { new_parser :namespaced_actions }
7
-
8
- it "should return the target namespace" do
9
- parser.namespace.should == "http://api.example.com/api/"
10
- end
11
-
12
- it "should return the SOAP endpoint" do
13
- parser.endpoint.should == URI("https://api.example.com/api/api.asmx")
14
- end
15
-
16
- it "should return the available SOAP operations" do
17
- parser.operations.should match_operations(
18
- :get_api_key => { :input => "GetApiKey", :action => "http://api.example.com/api/User.GetApiKey" },
19
- :delete_client => { :input => "DeleteClient", :action => "http://api.example.com/api/Client.Delete" },
20
- :get_clients => { :input => "GetClients", :action => "http://api.example.com/api/User.GetClients" }
21
- )
22
- end
23
-
24
- it "should return that :element_form_default is set to :qualified" do
25
- parser.element_form_default.should == :qualified
26
- end
27
- end
28
-
29
- context "with no_namespace.xml" do
30
- let(:parser) { new_parser :no_namespace }
31
-
32
- it "should return the target namespace" do
33
- parser.namespace.should == "urn:ActionWebService"
34
- end
35
-
36
- it "should return the SOAP endpoint" do
37
- parser.endpoint.should == URI("http://example.com/api/api")
38
- end
39
-
40
- it "should return the available SOAP operations" do
41
- parser.operations.should match_operations(
42
- :search_user => { :input => "SearchUser", :action => "/api/api/SearchUser" },
43
- :get_user_login_by_id => { :input => "GetUserLoginById", :action => "/api/api/GetUserLoginById" },
44
- :get_all_contacts => { :input => "GetAllContacts", :action => "/api/api/GetAllContacts" }
45
- )
46
- end
47
-
48
- it "should return that :element_form_default is set to :unqualified" do
49
- parser.element_form_default.should == :unqualified
50
- end
51
- end
52
-
53
- context "with geotrust.xml" do
54
- let(:parser) { new_parser :geotrust }
55
-
56
- it "should return the target namespace" do
57
- parser.namespace.should == "http://api.geotrust.com/webtrust/query"
58
- end
59
-
60
- it "should return the SOAP endpoint" do
61
- parser.endpoint.should == URI("https://test-api.geotrust.com/webtrust/query.jws")
62
- end
63
-
64
- it "should return the available SOAP operations" do
65
- parser.operations.should match_operations(
66
- :get_quick_approver_list => { :input => "GetQuickApproverList", :action => "GetQuickApproverList" },
67
- :hello => { :input => "hello", :action => "hello" }
68
- )
69
- end
70
-
71
- it "should return that :element_form_default is set to :qualified" do
72
- parser.element_form_default.should == :qualified
73
- end
74
- end
75
-
76
- context "with two_bindings.xml" do
77
- let(:parser) { new_parser :two_bindings }
78
-
79
- it "should merge operations from all binding sections (until we have an example where it makes sense to do otherwise)" do
80
- parser.operations.keys.map(&:to_s).sort.should ==
81
- %w{post post11only post12only}
82
- end
83
- end
84
-
85
- context "with soap12.xml" do
86
- let(:parser) { new_parser :soap12 }
87
-
88
- it "should return the endpoint" do
89
- parser.endpoint.should == URI("http://blogsite.example.com/endpoint12")
90
- end
91
- end
92
-
93
- RSpec::Matchers.define :match_operations do |expected|
94
- match do |actual|
95
- actual.should have(expected.keys.size).items
96
- actual.keys.should include(*expected.keys)
97
- actual.each { |key, value| value.should == expected[key] }
98
- end
99
- end
100
-
101
- def new_parser(fixture)
102
- parser = Savon::WSDL::Parser.new(Nokogiri::XML(Fixture[:wsdl, fixture]))
103
- parser.parse
104
- parser
105
- end
106
-
107
- end
@@ -1,23 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Savon::WSDL::Request do
4
- let(:http_request) { HTTPI::Request.new :url => Endpoint.wsdl }
5
- let(:request) { Savon::WSDL::Request.new http_request }
6
-
7
- describe ".execute" do
8
- it "executes a WSDL request and returns the response" do
9
- response = HTTPI::Response.new 200, {}, Fixture.response(:authentication)
10
- HTTPI.expects(:get).with(http_request).returns(response)
11
- Savon::WSDL::Request.execute(http_request).should == response
12
- end
13
- end
14
-
15
- describe "#response" do
16
- it "executes an HTTP GET request and returns the HTTPI::Response" do
17
- response = HTTPI::Response.new 200, {}, Fixture.response(:authentication)
18
- HTTPI.expects(:get).with(http_request).returns(response)
19
- request.response.should == response
20
- end
21
- end
22
-
23
- end