smacks-savon 0.0.7 → 0.0.8

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/README.rdoc CHANGED
@@ -9,12 +9,12 @@ service method to receive.
9
9
 
10
10
  == Install
11
11
 
12
- $ gem install smacks-savon --s http://gems.github.com
12
+ $ gem install smacks-savon -s http://gems.github.com
13
13
 
14
14
  == Dependencies
15
15
 
16
16
  hpricot 0.6.164 (also available for JRuby)
17
- smacks-apricoteatsgorilla >= 0.3.31
17
+ smacks-apricoteatsgorilla >= 0.3.5
18
18
 
19
19
  == How to use
20
20
 
data/lib/savon/mash.rb ADDED
@@ -0,0 +1,61 @@
1
+ module Savon
2
+
3
+ # Savon::Mash converts a given Hash into an Object.
4
+ class Mash
5
+
6
+ # Loops through a given +hash+, stores each value in an instance variable
7
+ # and creates getter and setter methods.
8
+ #
9
+ # === Parameters
10
+ #
11
+ # * +hash+ - The Hash to convert.
12
+ def initialize(hash)
13
+ hash.each do |key,value|
14
+ value = Savon::Mash.new(value) if value.is_a? Hash
15
+
16
+ if value.is_a? Array
17
+ value = value.map do |item|
18
+ if item.is_a?(Hash) then Savon::Mash.new(item) else item end
19
+ end
20
+ end
21
+
22
+ set_instance_variable key, value
23
+ define_reader key
24
+ define_writer key
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ # Sets and instance variable with a given +name+ and +value+.
31
+ #
32
+ # === Parameters
33
+ #
34
+ # * +name+ - Name of the instance variable.
35
+ # * +value+ - Value of the instance variable.
36
+ def set_instance_variable(name, value)
37
+ self.instance_variable_set("@#{name}", value)
38
+ end
39
+
40
+ # Defines a reader method for a given instance +variable+.
41
+ #
42
+ # === Parameters
43
+ #
44
+ # * +variable+ - Name of the instance variable.
45
+ def define_reader(variable)
46
+ method = proc { self.instance_variable_get("@#{variable}") }
47
+ self.class.send(:define_method, variable, method)
48
+ end
49
+
50
+ # Defines a writer method for a given instance +variable+.
51
+ #
52
+ # === Parameters
53
+ #
54
+ # * +variable+ - Name of the instance variable.
55
+ def define_writer(variable)
56
+ method = proc { |value| self.instance_variable_set("@#{variable}", value) }
57
+ self.class.send(:define_method, "#{variable}=", method)
58
+ end
59
+
60
+ end
61
+ end
@@ -32,11 +32,13 @@ module Savon
32
32
  #
33
33
  # # response as a Mash starting at a custom root node (via XPath)
34
34
  # response.to_mash("//user/email")
35
- #
36
- # ===
37
35
  class Response
38
36
 
39
- attr_reader :fault, :fault_code
37
+ # The HTTP/SOAP fault.
38
+ attr_reader :fault
39
+
40
+ # The HTTP/SOAP fault code.
41
+ attr_reader :fault_code
40
42
 
41
43
  # Initializer to set the SOAP response.
42
44
  #
@@ -55,7 +57,7 @@ module Savon
55
57
 
56
58
  # Returns true if the request was not successful, false otherwise.
57
59
  def fault?
58
- !@fault.nil?
60
+ !@fault_code.nil?
59
61
  end
60
62
 
61
63
  # Returns the SOAP response message as a Hash. Call with XPath expession
@@ -90,11 +92,10 @@ module Savon
90
92
 
91
93
  private
92
94
 
93
- # Checks for and stores HTTP and SOAP-Fault errors.
95
+ # Checks for and stores HTTP and SOAP fault errors.
94
96
  def validate
95
97
  if @response.code.to_i >= 300
96
- @fault = @response.message
97
- @fault_code = @response.code
98
+ @fault, @fault_code = @response.message, @response.code
98
99
  else
99
100
  fault = to_hash("//soap:Fault")
100
101
  @fault = fault[:faultstring] unless fault.nil?
data/lib/savon/service.rb CHANGED
@@ -40,6 +40,9 @@ module Savon
40
40
  # response.to_mash("//user/email")
41
41
  class Service
42
42
 
43
+ # The logger to use.
44
+ @@logger = nil
45
+
43
46
  # The Net::HTTP connection instance to use.
44
47
  attr_writer :http
45
48
 
@@ -58,15 +61,35 @@ module Savon
58
61
  @wsdl
59
62
  end
60
63
 
64
+ # Sets the logger to use.
65
+ def self.logger=(logger)
66
+ @@logger = logger
67
+ end
68
+
61
69
  private
62
70
 
63
71
  # Prepares and processes the SOAP request. Returns a Savon::Response object.
64
72
  def call_service
65
73
  headers = { "Content-Type" => "text/xml; charset=utf-8", "SOAPAction" => @action }
74
+
75
+ ApricotEatsGorilla.setup do |s|
76
+ s.nodes_to_namespace = wsdl.choice_elements
77
+ s.node_namespace = "wsdl"
78
+ end
66
79
  body = ApricotEatsGorilla.soap_envelope("wsdl" => wsdl.namespace_uri) do
67
- ApricotEatsGorilla["wsdl:#{@action}" => namespaced_options]
80
+ ApricotEatsGorilla["wsdl:#{@action}" => @options]
81
+ end
82
+
83
+ debug do |logger|
84
+ logger.info "Request; #{@uri}"
85
+ logger.info headers.map { |key, value| "#{key}: #{value}" }.join("\n")
86
+ logger.info body
68
87
  end
69
88
  response = @http.request_post(@uri.path, body, headers)
89
+ debug do |logger|
90
+ logger.info "Response (Status #{response.code}):"
91
+ logger.info response.body
92
+ end
70
93
  Savon::Response.new(response)
71
94
  end
72
95
 
@@ -87,26 +110,17 @@ module Savon
87
110
  end
88
111
  end
89
112
 
90
- # Checks if there were any choice elements found in the WSDL and namespaces
91
- # the corresponding keys from the passed in Hash of options.
92
- def namespaced_options
93
- return @options if wsdl.choice_elements.empty?
94
-
95
- options = {}
96
- @options.each do |key, value|
97
- key = "wsdl:#{key}" if wsdl.choice_elements.include? key.to_s
98
-
99
- current = options[key]
100
- case current
101
- when Array
102
- options[key] << value
103
- when nil
104
- options[key] = value
105
- else
106
- options[key] = [current.dup, value]
113
+ # Debug method. Outputs a given +message+ to the defined @@logger or
114
+ # yields the @@logger to a +block+ in case one was given.
115
+ def debug(message = nil)
116
+ if @@logger
117
+ if message
118
+ @@logger.info(message)
119
+ end
120
+ if block_given?
121
+ yield @@logger
107
122
  end
108
123
  end
109
- options
110
124
  end
111
125
 
112
126
  # Intercepts calls to SOAP service methods.
@@ -116,8 +130,7 @@ module Savon
116
130
  # * +method+ - The SOAP service method to call.
117
131
  # * +options+ - Hash of options for the service method to receive.
118
132
  def method_missing(method, options = {})
119
- @action = method.to_s
120
- @options = options
133
+ @action, @options = method.to_s, options
121
134
  validate_action
122
135
  call_service
123
136
  end
data/lib/savon/wsdl.rb CHANGED
@@ -24,8 +24,7 @@ module Savon
24
24
  # * +uri+ - The URI to access.
25
25
  # * +http+ - The Net::HTTP connection instance to use.
26
26
  def initialize(uri, http)
27
- @uri = uri
28
- @http = http
27
+ @uri, @http = uri, http
29
28
  get_wsdl
30
29
 
31
30
  parse_namespace_uri
@@ -44,6 +43,10 @@ module Savon
44
43
  def get_wsdl
45
44
  @response = @http.get("#{@uri.path}?#{@uri.query}")
46
45
  @doc = Hpricot.XML(@response.body)
46
+
47
+ if !@doc.at("//wsdl:definitions")
48
+ raise ArgumentError, "Unable to find WSDL at given endpoint URI."
49
+ end
47
50
  end
48
51
 
49
52
  # Parses the WSDL to find and store the namespace URI.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -41,4 +41,12 @@ class SavonWsdlTest < Test::Unit::TestCase
41
41
  end
42
42
  end
43
43
 
44
+ context "Savon::Wsdl with an invalid (non-WSDL) response" do
45
+ should "raise an ArgumentError" do
46
+ assert_raise ArgumentError do
47
+ Savon::Wsdl.new(some_uri, http_mock("Non-WSDL response"))
48
+ end
49
+ end
50
+ end
51
+
44
52
  end
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smacks-savon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Harrington
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.3.31
33
+ version: 0.3.8
34
34
  version:
35
35
  description: Savon is a lightweight SOAP client.
36
36
  email:
@@ -46,6 +46,7 @@ files:
46
46
  - lib/savon/service.rb
47
47
  - lib/savon/wsdl.rb
48
48
  - lib/savon/response.rb
49
+ - lib/savon/mash.rb
49
50
  has_rdoc: true
50
51
  homepage: http://github.com/smacks/savon
51
52
  post_install_message:
@@ -74,11 +75,11 @@ signing_key:
74
75
  specification_version: 2
75
76
  summary: Savon is a lightweight SOAP client.
76
77
  test_files:
77
- - tests/savon_test.rb
78
- - tests/helper.rb
79
- - tests/factories/wsdl.rb
80
- - tests/fixtures/soap_response.rb
81
- - tests/savon/service_test.rb
82
- - tests/savon/response_test.rb
83
- - tests/savon/wsdl_test.rb
84
- - tests/savon/mash_test.rb
78
+ - test/savon_test.rb
79
+ - test/helper.rb
80
+ - test/factories/wsdl.rb
81
+ - test/fixtures/soap_response.rb
82
+ - test/savon/service_test.rb
83
+ - test/savon/response_test.rb
84
+ - test/savon/wsdl_test.rb
85
+ - test/savon/mash_test.rb