wash_out 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wash_out (0.1)
4
+ wash_out (0.2.1)
5
+ nori
5
6
 
6
7
  GEM
7
8
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -6,7 +6,9 @@ Wash Out is a gem that greatly simplifies creation of SOAP service providers.
6
6
  Installation
7
7
  ------------
8
8
 
9
- $ gem install wash_out
9
+ In your Gemfile, add this line:
10
+
11
+ gem 'wash_out'
10
12
 
11
13
  Usage
12
14
  -----
@@ -16,7 +18,7 @@ action corresponds to a certain controller method; this mapping, as well as the
16
18
  by [soap_action][] method. Check the method documentation for complete info; here,
17
19
  only a few examples will be demonstrated.
18
20
 
19
- [soap_action]: #
21
+ [soap_action]: http://rubydoc.info/gems/wash_out/0.2.1/WashOut/SOAP/ClassMethods#soap_action-instance_method
20
22
 
21
23
  ```ruby
22
24
  # app/controllers/api_controller.rb
@@ -26,15 +28,15 @@ class ApiController < ApplicationController
26
28
  soap_action "integer_to_string",
27
29
  :args => :integer,
28
30
  :return => :string
29
- def integer_to_string(value)
30
- render :soap => value.to_s
31
+ def integer_to_string
32
+ render :soap => params[:value].to_s
31
33
  end
32
34
 
33
35
  soap_action "concat",
34
- :args => { :a => :string, :b => :string }
36
+ :args => { :a => :string, :b => :string },
35
37
  :return => :string
36
- def concat(a, b)
37
- render :soap => (a + b)
38
+ def concat
39
+ render :soap => (params[:a] + params[:b])
38
40
  end
39
41
 
40
42
  soap_action "AddCircle",
@@ -43,7 +45,9 @@ class ApiController < ApplicationController
43
45
  :radius => :float } },
44
46
  :return => [],
45
47
  :to => :add_circle
46
- def add_circle(circle)
48
+ def add_circle
49
+ circle = params[:circle]
50
+
47
51
  raise SOAPError, "radius is too small" if circle[:radius] < 3.0
48
52
 
49
53
  Circle.new(circle[:center][:x], circle[:center][:y], circle[:radius])
@@ -60,6 +64,19 @@ HelloWorld::Application.routes.draw do
60
64
  end
61
65
  ```
62
66
 
67
+ In such a setup, the generated WSDL may be queried at path `/api/wsdl`. So, with a
68
+ gem like Savon, a request can be done using this path:
69
+
70
+ ```ruby
71
+ require 'savon'
72
+
73
+ client = Savon::Client.new("http://localhost:3000/api/wsdl")
74
+ client.wsdl.soap_actions # => [:integer_to_string, :concat]
75
+ client.request(:concat) do
76
+ soap.body = { :a => "123", :b => "abc" }
77
+ end[:value] # => "123abc"
78
+ ```
79
+
63
80
  License
64
81
  -------
65
82
 
@@ -1,3 +1,5 @@
1
+ require 'nori'
2
+
1
3
  module WashOut
2
4
  # The WashOut::Dispatcher module should be included in a controller acting
3
5
  # as a SOAP endpoint. It includes actions for generating WSDL and handling
@@ -21,19 +23,20 @@ module WashOut
21
23
  def _action
22
24
  map = self.class.soap_actions
23
25
  method = request.env['HTTP_SOAPACTION'].gsub(/^\"(.*)\"$/, '\1')
24
- @_current = map[method]
26
+ @_current = map[method.force_encoding('UTF-8')]
25
27
 
26
- raise SoapError, "Method #{method} does not exists" unless @_current
28
+ raise SOAPError, "Method #{method} does not exists" unless @_current
27
29
 
28
- xml_data = params['Envelope']['Body'][method]
30
+ params = Nori.parse(request.body)
31
+ xml_data = params[:envelope][:body][method.downcase.to_sym]
29
32
 
30
- params = (xml_data || {}).map do |opt, value|
31
- opt = opt.underscore
32
- param = @_current[:in].find { |param| param.name == opt }
33
+ @_params = HashWithIndifferentAccess.new
34
+ (xml_data || {}).map do |opt, value|
35
+ param = @_current[:in].find { |param| param.name.underscore.to_sym == opt }
33
36
  raise SOAPError, "unknown parameter #{opt}" unless param
34
- [ opt, param.load(value) ]
37
+
38
+ @_params[param.name] = param.load(value)
35
39
  end
36
- @_params.merge!(Hash[*params.flatten])
37
40
 
38
41
  send(@_current[:to])
39
42
  end
@@ -49,15 +52,23 @@ module WashOut
49
52
  :locals => { :result => result }
50
53
  end
51
54
 
55
+ # Render a SOAP error response.
56
+ #
57
+ # Rails do not support sequental rescue_from handling, that is, rescuing an
58
+ # exception from a rescue_from handler. Hence this function is a public API.
59
+ def render_soap_error(message)
60
+ render :template => 'wash_with_soap/error', :status => 500,
61
+ :locals => { :error_message => message }
62
+ end
63
+
52
64
  private
53
65
 
54
66
  def self.included(controller)
55
- controller.send :rescue_from, SOAPError, :with => :_render_soap_error
67
+ controller.send :rescue_from, SOAPError, :with => :_render_soap_exception
56
68
  end
57
69
 
58
- def _render_soap_error(error)
59
- render :template => 'wash_with_soap/error', :status => 500,
60
- :locals => { :error_message => error.message }
70
+ def _render_soap_exception(error)
71
+ render_soap_error(error.message)
61
72
  end
62
73
  end
63
74
  end
@@ -1,3 +1,3 @@
1
1
  module WashOut
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -1,3 +1,5 @@
1
+ #encoding:utf-8
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe WashOut do
@@ -95,4 +97,27 @@ describe WashOut do
95
97
  end
96
98
  }.should raise_exception(Savon::SOAP::Fault)
97
99
  end
100
+
101
+ it "should report a SOAP error if method does not exists" do
102
+ mock_controller{}.use!
103
+
104
+ client = savon_instance
105
+ lambda {
106
+ client.request(:nonexistent)
107
+ }.should raise_exception(Savon::SOAP::Fault)
108
+ end
109
+
110
+ it "should be possible to explicitly render a SOAP error" do
111
+ mock_controller do
112
+ soap_action "error", :args => [], :return => []
113
+ def error
114
+ render_soap_error "a message"
115
+ end
116
+ end.use!
117
+
118
+ client = savon_instance
119
+ lambda {
120
+ client.request(:error)
121
+ }.should raise_exception(Savon::SOAP::Fault)
122
+ end
98
123
  end
data/wash_out.gemspec CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.require_paths = ["lib"]
15
15
 
16
+ s.add_dependency("nori")
16
17
  s.add_development_dependency("rspec-rails")
17
18
  s.add_development_dependency("appraisal")
18
19
  s.add_development_dependency("tzinfo")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wash_out
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-11-23 00:00:00.000000000 Z
13
+ date: 2011-12-09 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nori
17
+ requirement: &70328753506960 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70328753506960
15
26
  - !ruby/object:Gem::Dependency
16
27
  name: rspec-rails
17
- requirement: &70156242369620 !ruby/object:Gem::Requirement
28
+ requirement: &70328753506480 !ruby/object:Gem::Requirement
18
29
  none: false
19
30
  requirements:
20
31
  - - ! '>='
@@ -22,10 +33,10 @@ dependencies:
22
33
  version: '0'
23
34
  type: :development
24
35
  prerelease: false
25
- version_requirements: *70156242369620
36
+ version_requirements: *70328753506480
26
37
  - !ruby/object:Gem::Dependency
27
38
  name: appraisal
28
- requirement: &70156242369200 !ruby/object:Gem::Requirement
39
+ requirement: &70328753506040 !ruby/object:Gem::Requirement
29
40
  none: false
30
41
  requirements:
31
42
  - - ! '>='
@@ -33,10 +44,10 @@ dependencies:
33
44
  version: '0'
34
45
  type: :development
35
46
  prerelease: false
36
- version_requirements: *70156242369200
47
+ version_requirements: *70328753506040
37
48
  - !ruby/object:Gem::Dependency
38
49
  name: tzinfo
39
- requirement: &70156242368780 !ruby/object:Gem::Requirement
50
+ requirement: &70328753505480 !ruby/object:Gem::Requirement
40
51
  none: false
41
52
  requirements:
42
53
  - - ! '>='
@@ -44,10 +55,10 @@ dependencies:
44
55
  version: '0'
45
56
  type: :development
46
57
  prerelease: false
47
- version_requirements: *70156242368780
58
+ version_requirements: *70328753505480
48
59
  - !ruby/object:Gem::Dependency
49
60
  name: savon
50
- requirement: &70156242368360 !ruby/object:Gem::Requirement
61
+ requirement: &70328753504960 !ruby/object:Gem::Requirement
51
62
  none: false
52
63
  requirements:
53
64
  - - ! '>='
@@ -55,7 +66,7 @@ dependencies:
55
66
  version: '0'
56
67
  type: :development
57
68
  prerelease: false
58
- version_requirements: *70156242368360
69
+ version_requirements: *70328753504960
59
70
  description: Dead simple Rails 3 SOAP server library
60
71
  email: boris@roundlake.ru
61
72
  executables: []