sinatra-soap 0.1.5 → 0.1.7

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZTQ4NzFhOWQyMzE0NDkzYjJmZDAzZjZmYzUyNGVlZTEyYzA5MzQ2Ng==
4
+ MWUwYzNjZWUyM2I2ZDZhZmFkNzM0NmVjMmQxM2QwMTJlN2E1OGIwMg==
5
5
  data.tar.gz: !binary |-
6
- ZDY2YjA5M2IwOWJmOWE0NjE0MDFhYTdhZWE4ZTFjNWJhNjgzODliYQ==
6
+ ZGRmYTMyMmYyMTFhYjI4OTU3OWNhMTc3ZmM3MjE0YTRjNTNmNzc0Yg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MjE1NGM1ODRmODU3ZmZjYjNkODhmNjM0NjE2Nzg4ZDZjZDQ5ODg0NDBjMzdm
10
- MzI5MGM0ZGMxZDJjNzI5ZjNiMjdhZWY2ZDgwMDM4MmVhNTY3MTM4ZWVkY2I2
11
- YzU4OWNiMzRiOTg2MTU3NWY1NzMxNjc3YzQ2YjEwOTU5OWUzNDc=
9
+ OTdmYWEyYWQyZjY1MWNlNzQxMjc4YzdmZjFiNTEwNTQ4NjlhNzk2NmExNjY4
10
+ ZWJkYjE2YzE4ZTlhMjI2YjNjMTVkYzRmMzg0YzQwNGFkYWYwMGY1NGIxZGVj
11
+ OWY3MzhhNmJkNmQ5YTQxZWQ2YzMzMTRhNjljNWQ3NGJkZDUzYzY=
12
12
  data.tar.gz: !binary |-
13
- ODA0YThhZTAxMzZlMDVlNGFmOWU0YWQ3MDEwYTVmMGE2YzkyMDcyY2FmMWJi
14
- ZDc0NTJkYzI0MGE3NmZiNzI1NmJhYWNkNmE3MTM1YjQwMjJlMDM4ZmYzNTg3
15
- MmI0ZjU0M2VhMzNjY2YzYmE2YTdkNTI5ZWEyYjBhNzNiNDExYjY=
13
+ NWJiZDVjZjNjM2MwZmZhYjlmMDQ5NmMxNDE4NWY5Y2FlYzBhYmExZmM0MDZm
14
+ YTUwYmFmMDM1YWVmYzcwODBmZWM2Y2Q2ZTc4MDdhODE2ZTcwN2VkMTNkMzMy
15
+ YzAxNzM3Yjk3YjEwYWY1MzI1NzFiMDE1MmMwM2E0ZTUwYzFiMWM=
data/README.md CHANGED
@@ -17,7 +17,7 @@ A classic application would work like that:
17
17
  require 'sinatra'
18
18
  require 'sinatra/soap'
19
19
 
20
- soap "SomeAction"
20
+ soap "SomeAction" do
21
21
  do_something_with_params # hash to be returned
22
22
  end
23
23
  ```
@@ -33,14 +33,82 @@ class SoapAPI < Sinatra::Base
33
33
  #remember to register extenstion if you are using modular style
34
34
  register Sinatra::Soap
35
35
 
36
- soap "SomeAction"
36
+ soap "SomeAction" do
37
37
  params # hash to be returned
38
38
  end
39
39
  end
40
40
  ```
41
41
 
42
42
 
43
+ ## Settings
43
44
 
45
+ * **:wsdl_route** — url for getting wsdl, either static or dynamically generated file
46
+ ```ruby
47
+ set :wsdl_route, '/wsdl'
48
+ ```
49
+ Defines route for app to response with wsdl. Default is '/wsdl'
50
+
51
+
52
+ * **:endpoint** — url for sending SOAP Requests
53
+ ```ruby
54
+ set :endpoint, '/action'
55
+ ```
56
+ Defines route for SOAP Requests. Default is '/action'
57
+
58
+
59
+ * **:wsdl_file** — app will send static file, if this setting specified
60
+ ```ruby
61
+ set :wsdl_file, "wsdl.xml"
62
+ ```
63
+ If wsdl_file is set, app will try to read wsdl file from ```:public_folder``` (by default ./public directory). If file does not exist, app will raise an error. You also don't need to specify ```:namespace``` or ```:service``` if you want to serve static wsdl.
64
+
65
+
66
+ * **:namespace** — wsdl setting, required for generating wsdl
67
+ ```ruby
68
+ set :namespace, "http://schemas.xmlsoap.org/wsdl/"
69
+ ```
70
+ Namespace is taking it's place in ```xmlns:tns``` and ```targetNamespace``` definitions of SOAP Envelope
71
+
72
+ * **:service** — wsdl setting, required for generating wsdl
73
+ ```ruby
74
+ set :service, "sinatra"
75
+ ```
76
+ Service involved in ```portType```, ```binding``` and ```service``` definitions as a prefix for name attribute.
77
+
78
+
79
+
80
+
81
+ ## Soap Arguments
82
+
83
+ If you want to be able to generate wsdl on a fly, you need to specify incoming and outgoing nodes with their types.
84
+
85
+ ```ruby
86
+ soap :test, in: {circle: {center: {x: :integer,
87
+ y: :integer},
88
+ radius: :double}
89
+ },
90
+ out: nil do
91
+ params #=> {circle: {center: {x: 3, y: 2}, radius: 12.0} }
92
+ nil
93
+ end
94
+ ```
44
95
 
96
+ The code above will respond to request like this:
97
+ ```xml
98
+ <?xml version="1.0" encoding="UTF-8"?>
99
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="anynamespacehere" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
100
+ <env:Body>
101
+ <wsdl:test>
102
+ <circle>
103
+ <center>
104
+ <x>3</x>
105
+ <y>2</y>
106
+ </center>
107
+ <radius>12.0</radius>
108
+ </circle>
109
+ </wsdl:test>
110
+ </env:Body>
111
+ </env:Envelope>
112
+ ```
45
113
 
46
114
 
@@ -3,7 +3,7 @@ require "sinatra/soap/version"
3
3
  require "sinatra/soap/wsdl"
4
4
  require "sinatra/soap/error"
5
5
  require "sinatra/soap/dsl_methods"
6
- require "sinatra/soap/request_context_methods"
6
+ require "sinatra/soap/helper_methods"
7
7
  require "sinatra/soap/request"
8
8
  require "sinatra/soap/response"
9
9
  require "builder"
@@ -15,21 +15,23 @@ module Sinatra
15
15
  include DslMethods
16
16
 
17
17
  def self.registered(app)
18
- app.helpers Soap::RequestContextMethods
18
+ app.helpers Soap::HelperMethods
19
19
 
20
- app.set :soap_path, '/action' unless defined?(app.settings.soap_path)
21
- app.set :wsdl_path, '/wsdl' unless defined?(app.settings.wsdl_path)
20
+ app.set :wsdl_route, '/wsdl' unless defined?(app.settings.wsdl_path)
21
+ app.set :namespace, 'http://schemas.xmlsoap.org/wsdl/' unless defined?(app.settings.namespace)
22
+ app.set :endpoint, '/action' unless defined?(app.settings.endpoint)
23
+ app.set :service, 'Sinatra' unless defined?(app.settings.service)
22
24
 
23
- app.post(app.settings.soap_path) do
25
+ app.post(app.settings.endpoint) do
24
26
  content_type 'text/xml'
25
27
  call_action_block
26
28
  end
27
29
 
28
- app.get(app.settings.wsdl_path) do
30
+ app.get(app.settings.wsdl_route) do
31
+ content_type 'text/xml'
29
32
  get_wsdl
30
33
  end
31
34
  end
32
-
33
35
  end
34
36
  Delegator.delegate :soap
35
37
  register Soap
@@ -0,0 +1,32 @@
1
+ module Sinatra
2
+ module Soap
3
+ module HelperMethods
4
+
5
+ # Return the location where we can find our views
6
+ def soap_views()
7
+ File.join(File.dirname(__FILE__), "..", "views")
8
+ end
9
+
10
+ def call_action_block
11
+ request = Soap::Request.new(env, request, params)
12
+ response = request.execute
13
+ builder :response, locals: {wsdl: response.wsdl, params: response.params}, :views => self.soap_views
14
+ rescue Soap::Error => e
15
+ builder :error, locals: {e: e}, :views => self.soap_views
16
+ end
17
+
18
+ def get_wsdl
19
+ if defined?(settings.wsdl_path)
20
+ path = File.join(settings.public_folder, settings.wsdl_path)
21
+ if File.exist?(path)
22
+ File.read(path)
23
+ else
24
+ raise "No wsdl file"
25
+ end
26
+ else
27
+ builder :wsdl, locals: {wsdl: Soap::Wsdl.actions}, :views => self.soap_views
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,5 @@
1
1
  module Sinatra
2
2
  module Soap
3
- VERSION = "0.1.5"
3
+ VERSION = "0.1.7"
4
4
  end
5
5
  end
@@ -2,11 +2,12 @@ module Sinatra
2
2
  module Soap
3
3
  class Wsdl
4
4
 
5
- # class << self
6
- # attr_accessor :actions
7
- # end
8
5
  @@actions = {}
9
6
 
7
+ def self.actions
8
+ @@actions
9
+ end
10
+
10
11
  def self.register(name, *args, &block)
11
12
  @@actions = {} if @@actions.nil?
12
13
  @@actions[name] = {}
@@ -0,0 +1,68 @@
1
+ xml.instruct!
2
+ xml.definitions 'xmlns' => 'http://schemas.xmlsoap.org/wsdl/',
3
+ 'xmlns:tns' => settings.namespace,
4
+ 'xmlns:soap' => 'http://schemas.xmlsoap.org/wsdl/soap/',
5
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
6
+ 'xmlns:soap-enc' => 'http://schemas.xmlsoap.org/soap/encoding/',
7
+ 'xmlns:wsdl' => 'http://schemas.xmlsoap.org/wsdl/',
8
+ 'name' => settings.service,
9
+ 'targetNamespace' => settings.namespace do
10
+
11
+ xml.types do
12
+ xml.tag! "schema", :targetNamespace => settings.namespace, :xmlns => 'http://www.w3.org/2001/XMLSchema' do
13
+ defined = []
14
+ wsdl.each do |operation, formats|
15
+ (formats[:in] + formats[:out]).each do |p|
16
+ wsdl_type xml, p, defined
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ xml.portType :name => "#{settings.service}_port" do
23
+ wsdl.keys.each do |operation|
24
+ xml.operation :name => operation do
25
+ xml.input :message => "tns:#{operation}"
26
+ xml.output :message => "tns:#{operation}Response"
27
+ end
28
+ end
29
+ end
30
+
31
+ xml.binding :name => "#{settings.service}_binding", :type => "tns:#{settings.service}_port" do
32
+ xml.tag! "soap:binding", :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http'
33
+ wsdl.keys.each do |operation|
34
+ xml.operation :name => operation do
35
+ xml.tag! "soap:operation", :soapAction => operation
36
+ xml.input do
37
+ xml.tag! "soap:body",
38
+ :use => "literal",
39
+ :namespace => settings.namespace
40
+ end
41
+ xml.output do
42
+ xml.tag! "soap:body",
43
+ :use => "literal",
44
+ :namespace => settings.namespace
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ xml.service :name => "service" do
51
+ xml.port :name => "#{settings.service}_port", :binding => "tns:#{settings.service}_binding" do
52
+ xml.tag! "soap:address", :location => send("#{settings.service}_action_url")
53
+ end
54
+ end
55
+
56
+ wsdl.each do |operation, formats|
57
+ xml.message :name => "#{operation}" do
58
+ formats[:in].each do |p|
59
+ xml.part wsdl_occurence(p, false, :name => p.name, :type => p.namespaced_type)
60
+ end
61
+ end
62
+ xml.message :name => "#{operation}Response}" do
63
+ formats[:out].each do |p|
64
+ xml.part wsdl_occurence(p, false, :name => p.name, :type => p.namespaced_type)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,16 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "Request" do
4
+ def app
5
+ SoapApp
6
+ end
7
+
8
+ before :each do
9
+ headers = {"HTTP_SOAPACTION" => 'test'}
10
+ message = '<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="any" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><wsdl:test><par>one</par><par2>bar</par2><foo>wat</foo></wsdl:test></env:Body></env:Envelope>'
11
+ post '/action', message, headers
12
+ @request = Sinatra::Soap::Request.new(last_request.env, last_request, last_request.params)
13
+ end
14
+
4
15
  it "should get soap_action" do
5
- pending
16
+ expect(@request.action).to eq(:test)
6
17
  end
7
18
 
8
19
  it "should get soap arguments" do
9
- pending
20
+ expect(@request.params).to eq({par: "one", par2: "bar", foo: "wat"})
10
21
  end
11
22
 
12
23
  it "should build response" do
13
- pending
24
+ expect(@request.execute).to be_an_instance_of(Sinatra::Soap::Response)
14
25
  end
15
26
 
16
27
  it "should validate input with WSDL" do
@@ -5,7 +5,6 @@ describe 'A default soap sinatra application' do
5
5
  def app
6
6
  SoapApp
7
7
  end
8
-
9
8
 
10
9
  it "should parse soap request and send response" do
11
10
  headers = {"HTTP_SOAPACTION" => 'test'}
@@ -23,7 +22,7 @@ describe 'A default soap sinatra application' do
23
22
  </soap:Body>
24
23
  </soap:Envelope>
25
24
  XML
26
- last_response.body.should == response
25
+ expect(last_response.body).to eq(response)
27
26
  end
28
27
 
29
28
 
@@ -42,17 +41,22 @@ describe 'A default soap sinatra application' do
42
41
  </soap:Body>
43
42
  </soap:Envelope>
44
43
  XML
45
- last_response.body.should == response
44
+ expect(last_response.body).to eq(response)
46
45
  end
47
46
 
48
47
  it "should have endpoint for soap actions" do
49
48
  endpoint = app.routes["POST"].select {|k| k[0].to_s.match('action')}.count
50
- endpoint.should eq 1
49
+ expect(endpoint).to eq 1
51
50
  end
52
51
 
53
52
  it "should have route for wsdl" do
54
53
  wsdl = app.routes["GET"].select {|k| k[0].to_s.match('wsdl')}.count
55
- wsdl.should == 1
54
+ expect(wsdl).to eq(1)
55
+ end
56
+
57
+ it "should return a usable soap views directory" do
58
+ view_search = File.join(app.views, "*.builder")
59
+ expect(Dir.glob(view_search).count).to be > 0
56
60
  end
57
61
 
58
62
  end
@@ -8,6 +8,13 @@ class SoapApp < Sinatra::Base
8
8
  soap :test do
9
9
  params
10
10
  end
11
+
12
+ soap :add_circle, in: {circle: {center: {x: :integer, y: :integer},
13
+ radius: :double}},
14
+ out: nil do
15
+ params #=> {circle: {center: {x: 3, y: 2}, radius: 12.0} }
16
+ nil
17
+ end
11
18
  end
12
19
 
13
20
  module RSpecMixin
@@ -0,0 +1,68 @@
1
+ xml.instruct!
2
+ xml.definitions 'xmlns' => 'http://schemas.xmlsoap.org/wsdl/',
3
+ 'xmlns:tns' => settings.namespace,
4
+ 'xmlns:soap' => 'http://schemas.xmlsoap.org/wsdl/soap/',
5
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
6
+ 'xmlns:soap-enc' => 'http://schemas.xmlsoap.org/soap/encoding/',
7
+ 'xmlns:wsdl' => 'http://schemas.xmlsoap.org/wsdl/',
8
+ 'name' => settings.service,
9
+ 'targetNamespace' => settings.namespace do
10
+
11
+ xml.types do
12
+ xml.tag! "schema", :targetNamespace => settings.namespace, :xmlns => 'http://www.w3.org/2001/XMLSchema' do
13
+ defined = []
14
+ wsdl.each do |operation, formats|
15
+ (formats[:in] + formats[:out]).each do |p|
16
+ wsdl_type xml, p, defined
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ xml.portType :name => "#{settings.service}_port" do
23
+ wsdl.keys.each do |operation|
24
+ xml.operation :name => operation do
25
+ xml.input :message => "tns:#{operation}"
26
+ xml.output :message => "tns:#{operation}Response"
27
+ end
28
+ end
29
+ end
30
+
31
+ xml.binding :name => "#{settings.service}_binding", :type => "tns:#{settings.service}_port" do
32
+ xml.tag! "soap:binding", :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http'
33
+ wsdl.keys.each do |operation|
34
+ xml.operation :name => operation do
35
+ xml.tag! "soap:operation", :soapAction => operation
36
+ xml.input do
37
+ xml.tag! "soap:body",
38
+ :use => "literal",
39
+ :namespace => settings.namespace
40
+ end
41
+ xml.output do
42
+ xml.tag! "soap:body",
43
+ :use => "literal",
44
+ :namespace => settings.namespace
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ xml.service :name => "service" do
51
+ xml.port :name => "#{settings.service}_port", :binding => "tns:#{settings.service}_binding" do
52
+ xml.tag! "soap:address", :location => send("#{settings.service}_action_url")
53
+ end
54
+ end
55
+
56
+ wsdl.each do |operation, formats|
57
+ xml.message :name => "#{operation}" do
58
+ formats[:in].each do |p|
59
+ xml.part wsdl_occurence(p, false, :name => p.name, :type => p.namespaced_type)
60
+ end
61
+ end
62
+ xml.message :name => "#{operation}Response}" do
63
+ formats[:out].each do |p|
64
+ xml.part wsdl_occurence(p, false, :name => p.name, :type => p.namespaced_type)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -2,7 +2,25 @@ require 'spec_helper'
2
2
 
3
3
 
4
4
  describe "WSDL" do
5
+
6
+ def wsdl
7
+ Sinatra::Soap::Wsdl
8
+ end
9
+
5
10
  it "should hold registered actions with arguments and blocks" do
6
- pending
11
+ [:test, :add_circle].each do |action|
12
+ expect(wsdl.actions).to include(action)
13
+ end
7
14
  end
15
+
16
+ it "should hold blocks for registered actions" do
17
+ [:test, :add_circle].each do |action|
18
+ expect(wsdl.actions[action]).to include(:block)
19
+ end
20
+ end
21
+
22
+ it "should hould arguments types" do
23
+ expect(wsdl.actions[:add_circle]).to include(:in)
24
+ expect(wsdl.actions[:add_circle]).to include(:out)
25
+ end
8
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-soap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Shamatov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-02 00:00:00.000000000 Z
11
+ date: 2013-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -156,20 +156,21 @@ files:
156
156
  - lib/sinatra/soap.rb
157
157
  - lib/sinatra/soap/dsl_methods.rb
158
158
  - lib/sinatra/soap/error.rb
159
+ - lib/sinatra/soap/helper_methods.rb
159
160
  - lib/sinatra/soap/request.rb
160
- - lib/sinatra/soap/request_context_methods.rb
161
161
  - lib/sinatra/soap/response.rb
162
162
  - lib/sinatra/soap/version.rb
163
163
  - lib/sinatra/soap/wsdl.rb
164
164
  - lib/sinatra/views/error.builder
165
165
  - lib/sinatra/views/response.builder
166
+ - lib/sinatra/views/wsdl.builder
166
167
  - sinatra-soap.gemspec
167
168
  - spec/request_spec.rb
168
- - spec/response_spec.rb
169
169
  - spec/soap_spec.rb
170
170
  - spec/spec_helper.rb
171
171
  - spec/views/error.builder
172
172
  - spec/views/response.builder
173
+ - spec/views/wsdl.builder
173
174
  - spec/wsdl_spec.rb
174
175
  homepage: https://github.com/IvanShamatov/sinatra-soap
175
176
  licenses:
@@ -197,9 +198,9 @@ specification_version: 4
197
198
  summary: Handling SOAP requests for sinatra inspired by washout
198
199
  test_files:
199
200
  - spec/request_spec.rb
200
- - spec/response_spec.rb
201
201
  - spec/soap_spec.rb
202
202
  - spec/spec_helper.rb
203
203
  - spec/views/error.builder
204
204
  - spec/views/response.builder
205
+ - spec/views/wsdl.builder
205
206
  - spec/wsdl_spec.rb
@@ -1,19 +0,0 @@
1
- module Sinatra
2
- module Soap
3
- module RequestContextMethods
4
-
5
- def call_action_block
6
- request = Soap::Request.new(env, request, params)
7
- response = request.execute
8
- builder :response, locals: {wsdl: response.wsdl, params: response.params}
9
- rescue Soap::Error => e
10
- builder :error, locals: {e: e}
11
- end
12
-
13
- def get_wsdl
14
- Soap::Wsdl.generate
15
- end
16
-
17
- end
18
- end
19
- end
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Response" do
4
-
5
- it "should build response" do
6
- pending
7
- end
8
-
9
- it "should build soap faults" do
10
- pending
11
- end
12
- end