savon_with_adapter 2.4.1
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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +11 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +1042 -0
- data/CONTRIBUTING.md +46 -0
- data/Gemfile +18 -0
- data/LICENSE +20 -0
- data/README.md +81 -0
- data/Rakefile +14 -0
- data/donate.png +0 -0
- data/lib/savon.rb +27 -0
- data/lib/savon/block_interface.rb +26 -0
- data/lib/savon/builder.rb +166 -0
- data/lib/savon/client.rb +89 -0
- data/lib/savon/core_ext/string.rb +29 -0
- data/lib/savon/header.rb +70 -0
- data/lib/savon/http_error.rb +27 -0
- data/lib/savon/log_message.rb +48 -0
- data/lib/savon/message.rb +35 -0
- data/lib/savon/mock.rb +5 -0
- data/lib/savon/mock/expectation.rb +71 -0
- data/lib/savon/mock/spec_helper.rb +62 -0
- data/lib/savon/model.rb +80 -0
- data/lib/savon/operation.rb +127 -0
- data/lib/savon/options.rb +336 -0
- data/lib/savon/qualified_message.rb +49 -0
- data/lib/savon/request.rb +89 -0
- data/lib/savon/request_logger.rb +48 -0
- data/lib/savon/response.rb +112 -0
- data/lib/savon/soap_fault.rb +48 -0
- data/lib/savon/version.rb +3 -0
- data/savon.gemspec +52 -0
- data/spec/fixtures/gzip/message.gz +0 -0
- data/spec/fixtures/response/another_soap_fault.xml +14 -0
- data/spec/fixtures/response/authentication.xml +14 -0
- data/spec/fixtures/response/header.xml +13 -0
- data/spec/fixtures/response/list.xml +18 -0
- data/spec/fixtures/response/multi_ref.xml +39 -0
- data/spec/fixtures/response/soap_fault.xml +8 -0
- data/spec/fixtures/response/soap_fault12.xml +18 -0
- data/spec/fixtures/response/taxcloud.xml +1 -0
- data/spec/fixtures/ssl/client_cert.pem +16 -0
- data/spec/fixtures/ssl/client_encrypted_key.pem +30 -0
- data/spec/fixtures/ssl/client_encrypted_key_cert.pem +24 -0
- data/spec/fixtures/ssl/client_key.pem +15 -0
- data/spec/fixtures/wsdl/authentication.xml +63 -0
- data/spec/fixtures/wsdl/betfair.xml +2981 -0
- data/spec/fixtures/wsdl/edialog.xml +15416 -0
- data/spec/fixtures/wsdl/interhome.xml +2137 -0
- data/spec/fixtures/wsdl/lower_camel.xml +52 -0
- data/spec/fixtures/wsdl/multiple_namespaces.xml +92 -0
- data/spec/fixtures/wsdl/multiple_types.xml +60 -0
- data/spec/fixtures/wsdl/taxcloud.xml +934 -0
- data/spec/fixtures/wsdl/team_software.xml +1 -0
- data/spec/fixtures/wsdl/vies.xml +176 -0
- data/spec/fixtures/wsdl/wasmuth.xml +153 -0
- data/spec/integration/centra_spec.rb +72 -0
- data/spec/integration/email_example_spec.rb +32 -0
- data/spec/integration/random_quote_spec.rb +23 -0
- data/spec/integration/ratp_example_spec.rb +28 -0
- data/spec/integration/stockquote_example_spec.rb +28 -0
- data/spec/integration/support/application.rb +82 -0
- data/spec/integration/support/server.rb +84 -0
- data/spec/integration/temperature_example_spec.rb +46 -0
- data/spec/integration/zipcode_example_spec.rb +42 -0
- data/spec/savon/builder_spec.rb +86 -0
- data/spec/savon/client_spec.rb +198 -0
- data/spec/savon/core_ext/string_spec.rb +37 -0
- data/spec/savon/features/message_tag_spec.rb +61 -0
- data/spec/savon/http_error_spec.rb +49 -0
- data/spec/savon/log_message_spec.rb +33 -0
- data/spec/savon/message_spec.rb +40 -0
- data/spec/savon/mock_spec.rb +157 -0
- data/spec/savon/model_spec.rb +154 -0
- data/spec/savon/observers_spec.rb +92 -0
- data/spec/savon/operation_spec.rb +211 -0
- data/spec/savon/options_spec.rb +772 -0
- data/spec/savon/request_spec.rb +493 -0
- data/spec/savon/response_spec.rb +258 -0
- data/spec/savon/soap_fault_spec.rb +126 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/support/endpoint.rb +25 -0
- data/spec/support/fixture.rb +39 -0
- data/spec/support/integration.rb +9 -0
- data/spec/support/stdout.rb +25 -0
- metadata +310 -0
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Contribution Guide
|
2
|
+
|
3
|
+
This page describes how to contribute changes to Savon.
|
4
|
+
|
5
|
+
Please do not create a pull request without reading this guide first.
|
6
|
+
Make sure to read the documentation for your version at [savonrb.com](http://savonrb.com/)
|
7
|
+
and post questions to the [mailing list](https://groups.google.com/forum/#!forum/savonrb).
|
8
|
+
|
9
|
+
**Bug fixes**
|
10
|
+
|
11
|
+
If you really think you found a bug, please make sure to add as many information as possible
|
12
|
+
to the ticket. You're a developer, we are developers and you know we need tests to reproduce
|
13
|
+
problems and make sure they don't come back.
|
14
|
+
|
15
|
+
So if you can reproduce your problem in a spec, that would be awesome! If you can't, please
|
16
|
+
let us know how we could make this easier for you. Also, provide code and the WSDL of the
|
17
|
+
service you're working with so others can try to come up with a spec for your problem.
|
18
|
+
|
19
|
+
After we have a failing spec, it obviously needs to be fixed. Make sure your new spec is the
|
20
|
+
only failing one under the `spec` directory. Travis only runs the "unit tests" at `spec/savon`,
|
21
|
+
but Savon actually has with some additional "integration/example specs" at `spec/integration`,
|
22
|
+
which you need to run locally to make sure the integration with real world services still works.
|
23
|
+
|
24
|
+
Notice that these specs are not run by Travis, because the service's are not guaranteed to work
|
25
|
+
all the time and the specs will timeout after a few seconds when the service is currently down.
|
26
|
+
|
27
|
+
Please follow this basic workflow for pull requests:
|
28
|
+
|
29
|
+
* [Fork the project](https://help.github.com/articles/fork-a-repo)
|
30
|
+
* Create a feature branch and make your bug fix
|
31
|
+
* Add tests for it!
|
32
|
+
* Update the [Changelog](https://github.com/savonrb/savon/blob/master/CHANGELOG.md)
|
33
|
+
* [Send a pull request](https://help.github.com/articles/using-pull-requests)
|
34
|
+
* [Check that your pull request passes the build](https://travis-ci.org/savonrb/savon/pull_requests)
|
35
|
+
|
36
|
+
|
37
|
+
**Improvements and feature requests**
|
38
|
+
|
39
|
+
If you have an idea for an improvement or a new feature, please feel free to
|
40
|
+
[create a new issue](https://github.com/savonrb/savon/issues/new) and describe your idea
|
41
|
+
so that other people can give their insights and opinions. This is also important to avoid
|
42
|
+
duplicate work.
|
43
|
+
|
44
|
+
Pull requests and issues on GitHub are meant to be used to discuss problems and ideas,
|
45
|
+
so please make sure to participate and follow up on questions. In case noone comments
|
46
|
+
on your ticket, please keep updating the ticket with additional information.
|
data/Gemfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
gemspec
|
3
|
+
|
4
|
+
gem "httpclient", "~> 2.3.4"
|
5
|
+
|
6
|
+
gem "simplecov", :require => false
|
7
|
+
gem "coveralls", :require => false
|
8
|
+
|
9
|
+
platform :rbx do
|
10
|
+
gem 'json'
|
11
|
+
gem 'racc'
|
12
|
+
gem 'rubysl'
|
13
|
+
gem 'rubinius-coverage'
|
14
|
+
end
|
15
|
+
|
16
|
+
platform :jruby do
|
17
|
+
gem 'json'
|
18
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Daniel Harrington
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# Savon
|
2
|
+
|
3
|
+
Heavy metal SOAP client
|
4
|
+
|
5
|
+
[Documentation](http://savonrb.com) | [RDoc](http://rubydoc.info/gems/savon) |
|
6
|
+
[Mailing list](https://groups.google.com/forum/#!forum/savonrb) | [Twitter](http://twitter.com/savonrb)
|
7
|
+
|
8
|
+
[](http://travis-ci.org/savonrb/savon)
|
9
|
+
[](http://badge.fury.io/rb/savon)
|
10
|
+
[](https://codeclimate.com/github/savonrb/savon)
|
11
|
+
[](https://coveralls.io/r/savonrb/savon)
|
12
|
+
|
13
|
+
|
14
|
+
## Version 2
|
15
|
+
|
16
|
+
Savon version 2 is available through [Rubygems](http://rubygems.org/gems/savon) and can be installed via:
|
17
|
+
|
18
|
+
```
|
19
|
+
$ gem install savon
|
20
|
+
```
|
21
|
+
|
22
|
+
or add it to your Gemfile like this:
|
23
|
+
|
24
|
+
```
|
25
|
+
gem 'savon', '~> 2.3.0'
|
26
|
+
```
|
27
|
+
|
28
|
+
|
29
|
+
## Maintainer needed
|
30
|
+
|
31
|
+
So I've been maintaining Savon and its dependant projects for the last four years and it's become quite
|
32
|
+
apparent now with my schedule I do not have the time to keep this project going single-handed.
|
33
|
+
|
34
|
+
Luckily there are numerous people helping out from time to time, but maintaining this project is pretty
|
35
|
+
much a full-time job and it keeps me from working on the next major version.
|
36
|
+
|
37
|
+
I'll be able to contribute on a small scale going forward, and will do my best in the meantime to catch
|
38
|
+
up with everything I am behind on.
|
39
|
+
|
40
|
+
If you are interested, please email me at [me at rubiii dot com].
|
41
|
+
I'll do everything I can to help you get started.
|
42
|
+
|
43
|
+
|
44
|
+
## Usage example
|
45
|
+
|
46
|
+
``` ruby
|
47
|
+
require 'savon'
|
48
|
+
|
49
|
+
# create a client for the service
|
50
|
+
client = Savon.client(wsdl: 'http://service.example.com?wsdl')
|
51
|
+
|
52
|
+
client.operations
|
53
|
+
# => [:find_user, :list_users]
|
54
|
+
|
55
|
+
# call the 'findUser' operation
|
56
|
+
response = client.call(:find_user, message: { id: 42 })
|
57
|
+
|
58
|
+
response.body
|
59
|
+
# => { find_user_response: { id: 42, name: 'Hoff' } }
|
60
|
+
```
|
61
|
+
|
62
|
+
For more examples, you should check out the
|
63
|
+
[integration tests](https://github.com/savonrb/savon/tree/version2/spec/integration).
|
64
|
+
|
65
|
+
|
66
|
+
## Give back
|
67
|
+
|
68
|
+
If you're using Savon and you or your company is making money from it, then please consider
|
69
|
+
donating via [Gittip](https://www.gittip.com/rubiii/) so that I can continue to improve it.
|
70
|
+
|
71
|
+
[](https://www.gittip.com/rubiii/)
|
72
|
+
|
73
|
+
|
74
|
+
## Documentation
|
75
|
+
|
76
|
+
Please make sure to [read the documentation](http://savonrb.com/version2/).
|
77
|
+
|
78
|
+
And if you find any problems with it or if you think something's missing,
|
79
|
+
feel free to [help out and improve the documentation](https://github.com/savonrb/savonrb.com).
|
80
|
+
|
81
|
+
Donate icon from the [Noun Project](http://thenounproject.com/noun/donate/#icon-No285).
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new do |t|
|
5
|
+
t.pattern = "spec/savon/**/*_spec.rb"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Run RSpec integration examples"
|
9
|
+
RSpec::Core::RakeTask.new "spec:integration" do |t|
|
10
|
+
t.pattern = "spec/integration/**/*_spec.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
task :default => :spec
|
14
|
+
task :test => :spec
|
data/donate.png
ADDED
Binary file
|
data/lib/savon.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Savon
|
2
|
+
|
3
|
+
Error = Class.new(RuntimeError)
|
4
|
+
InitializationError = Class.new(Error)
|
5
|
+
UnknownOptionError = Class.new(Error)
|
6
|
+
UnknownOperationError = Class.new(Error)
|
7
|
+
InvalidResponseError = Class.new(Error)
|
8
|
+
|
9
|
+
def self.client(globals = {}, &block)
|
10
|
+
Client.new(globals, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.observers
|
14
|
+
@observers ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.notify_observers(operation_name, builder, globals, locals)
|
18
|
+
observers.inject(nil) do |response, observer|
|
19
|
+
observer.notify(operation_name, builder, globals, locals)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
require "savon/version"
|
26
|
+
require "savon/client"
|
27
|
+
require "savon/model"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Savon
|
2
|
+
class BlockInterface
|
3
|
+
|
4
|
+
def initialize(target)
|
5
|
+
@target = target
|
6
|
+
end
|
7
|
+
|
8
|
+
def evaluate(block)
|
9
|
+
if block.arity > 0
|
10
|
+
block.call(@target)
|
11
|
+
else
|
12
|
+
@original = eval("self", block.binding)
|
13
|
+
instance_eval(&block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def method_missing(method, *args, &block)
|
20
|
+
@target.send(method, *args, &block)
|
21
|
+
rescue NoMethodError
|
22
|
+
@original.send(method, *args, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require "savon/header"
|
2
|
+
require "savon/message"
|
3
|
+
require "nokogiri"
|
4
|
+
require "builder"
|
5
|
+
require "gyoku"
|
6
|
+
|
7
|
+
module Savon
|
8
|
+
class Builder
|
9
|
+
|
10
|
+
SCHEMA_TYPES = {
|
11
|
+
"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema",
|
12
|
+
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance"
|
13
|
+
}
|
14
|
+
|
15
|
+
SOAP_NAMESPACE = {
|
16
|
+
1 => "http://schemas.xmlsoap.org/soap/envelope/",
|
17
|
+
2 => "http://www.w3.org/2003/05/soap-envelope"
|
18
|
+
}
|
19
|
+
|
20
|
+
def initialize(operation_name, wsdl, globals, locals)
|
21
|
+
@operation_name = operation_name
|
22
|
+
|
23
|
+
@wsdl = wsdl
|
24
|
+
@globals = globals
|
25
|
+
@locals = locals
|
26
|
+
|
27
|
+
@types = convert_type_definitions_to_hash
|
28
|
+
@used_namespaces = convert_type_namespaces_to_hash
|
29
|
+
end
|
30
|
+
|
31
|
+
def pretty
|
32
|
+
Nokogiri.XML(to_s).to_xml(:indent => 2)
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
return @locals[:xml] if @locals.include? :xml
|
37
|
+
|
38
|
+
tag(builder, :Envelope, namespaces_with_globals) do |xml|
|
39
|
+
tag(xml, :Header) { xml << header.to_s } unless header.empty?
|
40
|
+
tag(xml, :Body) { xml.tag!(*namespaced_message_tag) { xml << message.to_s } }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def convert_type_definitions_to_hash
|
47
|
+
@wsdl.type_definitions.inject({}) do |memo, (path, type)|
|
48
|
+
memo[path] = type
|
49
|
+
memo
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def convert_type_namespaces_to_hash
|
54
|
+
@wsdl.type_namespaces.inject({}) do |memo, (path, uri)|
|
55
|
+
key, value = use_namespace(path, uri)
|
56
|
+
memo[key] = value
|
57
|
+
memo
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def use_namespace(path, uri)
|
62
|
+
@internal_namespace_count ||= 0
|
63
|
+
|
64
|
+
unless identifier = namespace_by_uri(uri)
|
65
|
+
identifier = "ins#{@internal_namespace_count}"
|
66
|
+
namespaces["xmlns:#{identifier}"] = uri
|
67
|
+
@internal_namespace_count += 1
|
68
|
+
end
|
69
|
+
|
70
|
+
[path, identifier]
|
71
|
+
end
|
72
|
+
|
73
|
+
def namespaces_with_globals
|
74
|
+
namespaces.merge @globals[:namespaces]
|
75
|
+
end
|
76
|
+
|
77
|
+
def namespaces
|
78
|
+
@namespaces ||= begin
|
79
|
+
namespaces = SCHEMA_TYPES.dup
|
80
|
+
|
81
|
+
if namespace_identifier == nil
|
82
|
+
namespaces["xmlns"] = @globals[:namespace] || @wsdl.namespace
|
83
|
+
else
|
84
|
+
namespaces["xmlns:#{namespace_identifier}"] = @globals[:namespace] || @wsdl.namespace
|
85
|
+
end
|
86
|
+
|
87
|
+
key = ["xmlns"]
|
88
|
+
key << env_namespace if env_namespace && env_namespace != ""
|
89
|
+
namespaces[key.join(":")] = SOAP_NAMESPACE[@globals[:soap_version]]
|
90
|
+
|
91
|
+
namespaces
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def env_namespace
|
96
|
+
@env_namespace ||= @globals[:env_namespace] || :env
|
97
|
+
end
|
98
|
+
|
99
|
+
def header
|
100
|
+
@header ||= Header.new(@globals, @locals)
|
101
|
+
end
|
102
|
+
|
103
|
+
def namespaced_message_tag
|
104
|
+
tag_name = message_tag
|
105
|
+
if namespace_identifier == nil
|
106
|
+
[tag_name, message_attributes]
|
107
|
+
elsif @used_namespaces[[tag_name.to_s]]
|
108
|
+
[@used_namespaces[[tag_name.to_s]], tag_name, message_attributes]
|
109
|
+
else
|
110
|
+
[namespace_identifier, tag_name, message_attributes]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def message_tag
|
115
|
+
message_tag = @locals[:message_tag]
|
116
|
+
message_tag ||= @wsdl.soap_input(@operation_name.to_sym) if @wsdl.document?
|
117
|
+
message_tag ||= Gyoku.xml_tag(@operation_name, :key_converter => @globals[:convert_request_keys_to])
|
118
|
+
|
119
|
+
@message_tag = message_tag.to_sym
|
120
|
+
end
|
121
|
+
|
122
|
+
def message_attributes
|
123
|
+
@locals[:attributes] || {}
|
124
|
+
end
|
125
|
+
|
126
|
+
def message
|
127
|
+
element_form_default = @globals[:element_form_default] || @wsdl.element_form_default
|
128
|
+
# TODO: clean this up! [dh, 2012-12-17]
|
129
|
+
Message.new(message_tag, namespace_identifier, @types, @used_namespaces, @locals[:message],
|
130
|
+
element_form_default, @globals[:convert_request_keys_to])
|
131
|
+
end
|
132
|
+
|
133
|
+
def namespace_identifier
|
134
|
+
return @globals[:namespace_identifier] if @globals.include? :namespace_identifier
|
135
|
+
return @namespace_identifier if @namespace_identifier
|
136
|
+
|
137
|
+
operation = @wsdl.operations[@operation_name] if @wsdl.document?
|
138
|
+
namespace_identifier = operation[:namespace_identifier] if operation
|
139
|
+
namespace_identifier ||= "wsdl"
|
140
|
+
|
141
|
+
@namespace_identifier = namespace_identifier.to_sym
|
142
|
+
end
|
143
|
+
|
144
|
+
def namespace_by_uri(uri)
|
145
|
+
namespaces.each do |candidate_identifier, candidate_uri|
|
146
|
+
return candidate_identifier.gsub(/^xmlns:/, '') if candidate_uri == uri
|
147
|
+
end
|
148
|
+
nil
|
149
|
+
end
|
150
|
+
|
151
|
+
def builder
|
152
|
+
builder = ::Builder::XmlMarkup.new
|
153
|
+
builder.instruct!(:xml, :encoding => @globals[:encoding])
|
154
|
+
builder
|
155
|
+
end
|
156
|
+
|
157
|
+
def tag(xml, name, namespaces = {}, &block)
|
158
|
+
if env_namespace && env_namespace != ""
|
159
|
+
xml.tag! env_namespace, name, namespaces, &block
|
160
|
+
else
|
161
|
+
xml.tag! name, namespaces, &block
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
end
|
data/lib/savon/client.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require "savon/operation"
|
2
|
+
require "savon/request"
|
3
|
+
require "savon/options"
|
4
|
+
require "savon/block_interface"
|
5
|
+
require "wasabi"
|
6
|
+
|
7
|
+
module Savon
|
8
|
+
class Client
|
9
|
+
|
10
|
+
def initialize(globals = {}, &block)
|
11
|
+
unless globals.kind_of? Hash
|
12
|
+
raise_version1_initialize_error! globals
|
13
|
+
end
|
14
|
+
|
15
|
+
set_globals(globals, block)
|
16
|
+
|
17
|
+
unless wsdl_or_endpoint_and_namespace_specified?
|
18
|
+
raise_initialization_error!
|
19
|
+
end
|
20
|
+
|
21
|
+
build_wsdl_document
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :globals
|
25
|
+
|
26
|
+
def operations
|
27
|
+
raise_missing_wsdl_error! unless @wsdl.document?
|
28
|
+
@wsdl.soap_actions
|
29
|
+
end
|
30
|
+
|
31
|
+
def operation(operation_name)
|
32
|
+
Operation.create(operation_name, @wsdl, @globals)
|
33
|
+
end
|
34
|
+
|
35
|
+
def call(operation_name, locals = {}, &block)
|
36
|
+
operation(operation_name).call(locals, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def service_name
|
40
|
+
raise_missing_wsdl_error! unless @wsdl.document?
|
41
|
+
@wsdl.service_name
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def set_globals(globals, block)
|
47
|
+
globals = GlobalOptions.new(globals)
|
48
|
+
BlockInterface.new(globals).evaluate(block) if block
|
49
|
+
|
50
|
+
@globals = globals
|
51
|
+
end
|
52
|
+
|
53
|
+
def build_wsdl_document
|
54
|
+
@wsdl = Wasabi::Document.new
|
55
|
+
|
56
|
+
@wsdl.document = @globals[:wsdl] if @globals.include? :wsdl
|
57
|
+
@wsdl.endpoint = @globals[:endpoint] if @globals.include? :endpoint
|
58
|
+
@wsdl.namespace = @globals[:namespace] if @globals.include? :namespace
|
59
|
+
@wsdl.servicename = @globals[:servicename] if @globals.include? :servicename
|
60
|
+
@wsdl.adapter = @globals[:adapter] if @globals.include? :adapter
|
61
|
+
|
62
|
+
@wsdl.request = WSDLRequest.new(@globals).build
|
63
|
+
end
|
64
|
+
|
65
|
+
def wsdl_or_endpoint_and_namespace_specified?
|
66
|
+
@globals.include?(:wsdl) || (@globals.include?(:endpoint) && @globals.include?(:namespace))
|
67
|
+
end
|
68
|
+
|
69
|
+
def raise_version1_initialize_error!(object)
|
70
|
+
raise InitializationError,
|
71
|
+
"Some code tries to initialize Savon with the #{object.inspect} (#{object.class}) \n" \
|
72
|
+
"Savon 2 expects a Hash of options for creating a new client and executing requests.\n" \
|
73
|
+
"Please read the updated documentation for version 2: http://savonrb.com/version2.html"
|
74
|
+
end
|
75
|
+
|
76
|
+
def raise_initialization_error!
|
77
|
+
raise InitializationError,
|
78
|
+
"Expected either a WSDL document or the SOAP endpoint and target namespace options.\n\n" \
|
79
|
+
"Savon.client(wsdl: '/Users/me/project/service.wsdl') # to use a local WSDL document\n" \
|
80
|
+
"Savon.client(wsdl: 'http://example.com?wsdl') # to use a remote WSDL document\n" \
|
81
|
+
"Savon.client(endpoint: 'http://example.com', namespace: 'http://v1.example.com') # if you don't have a WSDL document"
|
82
|
+
end
|
83
|
+
|
84
|
+
def raise_missing_wsdl_error!
|
85
|
+
raise "Unable to inspect the service without a WSDL document."
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|