shapewear 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -31,6 +31,8 @@ class MyFirstService
31
31
  wsdl_namespace 'http://services.example.com/v1'
32
32
  schema_namespace 'http://schemas.example.com/v1'
33
33
 
34
+ endpoint_url 'http://localhost:3000/my_first_service'
35
+
34
36
  operation :hello, :parameters => [[:name, String]], :returns => String
35
37
  def hello(name)
36
38
  "hello, #{name}"
data/lib/shapewear.rb CHANGED
@@ -1,13 +1,24 @@
1
1
  require 'nokogiri'
2
2
 
3
3
  require 'shapewear/version'
4
+ require 'shapewear/logging'
4
5
  require 'shapewear/dsl'
5
6
  require 'shapewear/wsdl'
7
+ require 'shapewear/request'
6
8
 
7
9
  module Shapewear
8
10
  def self.included(receiver)
11
+ receiver.extend(Shapewear::Logging)
9
12
  receiver.extend(Shapewear::DSL)
10
13
  receiver.extend(Shapewear::WSDL)
14
+ receiver.extend(Shapewear::Request)
15
+
16
+ class << receiver
17
+ def method_added(m)
18
+ # automatically creates an operation for each method added
19
+ operation m
20
+ end
21
+ end
11
22
  end
12
23
  end
13
24
 
data/lib/shapewear/dsl.rb CHANGED
@@ -1,29 +1,43 @@
1
1
  require 'builder'
2
2
 
3
- module Shapewear
4
- module DSL
5
- private
3
+ module Shapewear::DSL
4
+ private
6
5
 
7
- def options
8
- @options ||= {}
9
- end
6
+ def options
7
+ @options ||= {}
8
+ end
9
+
10
+ def operations
11
+ options[:operations] ||= {}
12
+ end
13
+
14
+ def namespaces
15
+ options[:namespaces] ||=
16
+ Hash.new { |_, k| raise "Namespace not defined: #{k}" } \
17
+ .merge! 'tns' => "http://services.example.com/#{self.name}",
18
+ 'xsd1' => "http://schema.example.com/#{self.name}",
19
+ 'wsdl' => 'http://schemas.xmlsoap.org/wsdl/',
20
+ 'soap' => 'http://schemas.xmlsoap.org/wsdl/soap/',
21
+ 'xsd' => 'http://www.w3.org/2000/10/XMLSchema',
22
+ 'env' => 'http://schemas.xmlsoap.org/soap/envelope/'
23
+ end
10
24
 
11
- protected
25
+ protected
12
26
 
13
- def wsdl_namespace(ns)
14
- options[:wsdl_namespace] = ns
15
- end
27
+ def wsdl_namespace(ns)
28
+ namespaces['tns'] = ns
29
+ end
16
30
 
17
- def schema_namespace(ns)
18
- options[:schema_namespace] = ns
19
- end
31
+ def schema_namespace(ns)
32
+ namespaces['xsd1'] = ns
33
+ end
20
34
 
21
- def endpoint_url(url)
22
- options[:endpoint_url] = url
23
- end
35
+ def endpoint_url(url)
36
+ options[:endpoint_url] = url
37
+ end
24
38
 
25
- def operation(name, ops = {})
26
- (options[:operations] ||= {})[name] = ops
27
- end
39
+ def operation(name, ops = {})
40
+ h = (operations[name] ||= {}).merge! ops
41
+ h[:public_name] ||= name.to_s.camelize
28
42
  end
29
43
  end
@@ -0,0 +1,9 @@
1
+ module Shapewear::Logging
2
+ def logger
3
+ @logger ||= (::Rails.logger rescue Logger.new(STDOUT))
4
+ end
5
+
6
+ def logger=(logger)
7
+ @logger = logger
8
+ end
9
+ end
@@ -0,0 +1,66 @@
1
+ module Shapewear::Request
2
+ # @param request [Rack::Request, Hash]
3
+ def serve(request)
4
+ op_node = find_soap_operation_node(request)
5
+
6
+ begin
7
+ call_soap_operation(op_node)
8
+ rescue => e
9
+ serialize_soap_fault e
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def find_soap_operation_node(request)
16
+ body ||= request.body if request.respond_to? :body
17
+ body ||= request[:body] if request.is_a?(Hash)
18
+ body ||= request.to_s
19
+
20
+ raise "Request body could not be found" if body.nil?
21
+
22
+ doc = Nokogiri::XML(body) { |c| c.strict } rescue raise("Request body is not a valid XML")
23
+
24
+ raise "Request is not a SOAP::Envelope: #{body}" if doc.at('/env:Envelope', namespaces).nil?
25
+
26
+ # find the operation element, or raise if not found
27
+ doc.at("/env:Envelope/env:Body/tns:*", namespaces) or raise "Operation not found"
28
+ end
29
+
30
+ def call_soap_operation(node)
31
+ operations.each do |k, v|
32
+ if v[:public_name] == node.name
33
+ params = extract_parameters(node)
34
+ logger.debug "Calling #{k} with args: #{params.map(&:inspect) * ', '}"
35
+ r = self.new.send(k, *params)
36
+ logger.debug "Result: #{r.inspect}"
37
+ return serialize_soap_result v, r
38
+ end
39
+ end
40
+
41
+ raise "Operation not found: #{node.name}"
42
+ end
43
+
44
+ def extract_parameters(node)
45
+ # TODO: use the metadata collected from the DSL to reoder the parameters and perform the appropriate conversions
46
+ node.children.map { |n| n.text }
47
+ end
48
+
49
+ #noinspection RubyArgCount
50
+ def serialize_soap_result(op_options, r)
51
+ xb = Builder::XmlMarkup.new
52
+ xb.instruct!
53
+
54
+ xb.Envelope :xmlns => namespaces['env'] do |xenv|
55
+ xenv.Body do |xbody|
56
+ xbody.tag! "#{op_options[:public_name]}Response", :xmlns => namespaces['xsd1'] do |xres|
57
+ xres.body r
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ def serialize_soap_fault(ex)
64
+ raise ex
65
+ end
66
+ end
@@ -1,5 +1,5 @@
1
1
  module Shapewear
2
2
 
3
- Version = "0.0.2"
3
+ Version = "0.0.3"
4
4
 
5
5
  end
@@ -1,127 +1,137 @@
1
1
  require 'builder'
2
2
 
3
- module Shapewear
4
- #noinspection RubyArgCount,RubyResolve
5
- module WSDL
6
- # reference: http://www.w3.org/TR/wsdl
7
- def to_wsdl
8
- tns = options[:wsdl_namespace] || "http://shapewear.elementarsistemas.com.br/auto/#{self.name}.wsdl"
9
- xsd = options[:schema_namespace] || "http://shapewear.elementarsistemas.com.br/auto/#{self.name}.xsd"
3
+ #noinspection RubyArgCount,RubyResolve
4
+ module Shapewear::WSDL
5
+ # reference: http://www.w3.org/TR/wsdl
6
+ def to_wsdl
7
+ xm = Builder::XmlMarkup.new
10
8
 
11
- xm = Builder::XmlMarkup.new
9
+ xm.instruct!
10
+ xm.definitions :name => self.name, 'targetNamespace' => namespaces['tns'],
11
+ 'xmlns' => namespaces['wsdl'],
12
+ 'xmlns:soap' => namespaces['soap'],
13
+ 'xmlns:xsd1' => namespaces['xsd1'],
14
+ 'xmlns:tns' => namespaces['tns'] do |xdef|
12
15
 
13
- xm.instruct!
14
- xm.definitions :name => self.name, 'targetNamespace' => tns,
15
- 'xmlns' => 'http://schemas.xmlsoap.org/wsdl/',
16
- 'xmlns:soap' => 'http://schemas.xmlsoap.org/wsdl/soap/',
17
- 'xmlns:xsd1' => xsd, 'xmlns:tns' => tns do |xdef|
16
+ xdef.types do |xtypes|
17
+ xtypes.schema 'xmlns' => namespaces['xsd'], 'targetNamespace' => namespaces['xsd1'] do |xschema|
18
18
 
19
- xdef.types do |xtypes|
20
- xtypes.schema 'xmlns' => 'http://www.w3.org/2000/10/XMLSchema', 'targetNamespace' => xsd do |xschema|
21
-
22
- # define elements for each defined method
23
- instance_methods(false).each do |m|
24
- build_type_elements_for_method(m, xschema)
25
- end
19
+ # define elements for each defined method
20
+ instance_methods(false).each do |m|
21
+ build_type_elements_for_method(m, xschema)
26
22
  end
27
23
  end
24
+ end
28
25
 
29
- instance_methods(false).each do |m|
30
- xdef.message :name => "#{m.camelize}Input" do |xmsg|
31
- xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Request"
32
- end unless instance_method(m).arity == 0
33
- xdef.message :name => "#{m.camelize}Output" do |xmsg|
34
- xmsg.part :name => :body, :element => "xsd1:#{m.camelize}"
35
- end
26
+ instance_methods(false).each do |m|
27
+ xdef.message :name => "#{m.camelize}Input" do |xmsg|
28
+ xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Request"
29
+ end unless instance_method(m).arity == 0
30
+ xdef.message :name => "#{m.camelize}Output" do |xmsg|
31
+ xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Response"
36
32
  end
33
+ end
37
34
 
38
- xdef.portType :name => "#{self.name}PortType" do |xpt|
39
- instance_methods(false).each do |m|
40
- xpt.operation :name => m.camelize do |xop|
41
- xop.input :message => "tns:#{m.camelize}Input" unless instance_method(m).arity == 0
42
- xop.output :message => "tns:#{m.camelize}Output"
43
- end
35
+ xdef.portType :name => "#{self.name}PortType" do |xpt|
36
+ instance_methods(false).each do |m|
37
+ xpt.operation :name => m.camelize do |xop|
38
+ xop.input :message => "tns:#{m.camelize}Input" unless instance_method(m).arity == 0
39
+ xop.output :message => "tns:#{m.camelize}Output"
44
40
  end
45
41
  end
42
+ end
46
43
 
47
- xdef.binding :name => "#{self.name}Binding", :type => "tns:#{self.name}PortType" do |xbind|
48
- xbind.tag! 'soap:binding', :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http'
49
- instance_methods(false).each do |m|
50
- xbind.operation :name => m.camelize do |xop|
51
- xop.tag! 'soap:operation', :soapAction => "#{tns}/#{m.camelize}"
52
- xop.input { |xin| xin.tag! 'soap:body', :use => 'literal' } unless instance_method(m).arity == 0
53
- xop.output { |xin| xin.tag! 'soap:body', :use => 'literal' }
54
- end
44
+ xdef.binding :name => "#{self.name}Binding", :type => "tns:#{self.name}PortType" do |xbind|
45
+ xbind.tag! 'soap:binding', :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http'
46
+ operations.each do |op, op_opts|
47
+ xbind.operation :name => op_opts[:public_name] do |xop|
48
+ doc = op_opts[:documentation] rescue nil
49
+ xop.documentation doc unless doc.nil?
50
+ xop.tag! 'soap:operation', :soapAction => "#{namespaces['tns']}/#{op_opts[:public_name]}"
51
+ xop.input { |xin| xin.tag! 'soap:body', :use => 'literal' } unless instance_method(op).arity == 0
52
+ xop.output { |xin| xin.tag! 'soap:body', :use => 'literal' }
55
53
  end
56
54
  end
55
+ end
57
56
 
58
- xdef.service :name => self.name do |xsrv|
59
- xsrv.documentation "WSDL auto-generated by shapewear."
60
- xsrv.port :name => "#{self.name}Port", :binding => "#{self.name}Binding" do |xport|
61
- xport.tag! 'soap:address', :location => options[:endpoint_url]
62
- end
57
+ xdef.service :name => self.name do |xsrv|
58
+ xsrv.documentation "WSDL auto-generated by shapewear."
59
+ xsrv.port :name => "#{self.name}Port", :binding => "#{self.name}Binding" do |xport|
60
+ xport.tag! 'soap:address', :location => options[:endpoint_url]
63
61
  end
64
62
  end
65
63
  end
64
+ end
66
65
 
67
- def build_type_elements_for_method(m, xschema)
68
- # element for method arguments
69
- um = instance_method(m)
70
- op_options = options[:operations][m.to_sym] rescue nil
66
+ def build_type_elements_for_method(m, xschema)
67
+ # element for method arguments
68
+ um = instance_method(m)
69
+ op_options = options[:operations][m.to_sym] rescue nil
71
70
 
72
- if um.arity > 0
73
- xschema.element :name => "#{m.camelize}Request" do |xreq|
74
- xreq.complexType do |xct|
75
- xct.all do |xall|
76
- params = op_options[:parameters] rescue nil
77
- if params.nil?
78
- if um.respond_to?(:parameters)
79
- # with Ruby 1.9, we can create the parameters with the correct names
80
- params = um.parameters.select { |p| p.first == :in }.map { |p| [p.first, Object] }
81
- else
82
- params = (0..um.arity).map { |i| ["arg#{i}", Object] }
83
- end
71
+ if um.arity > 0
72
+ xschema.element :name => "#{op_options[:public_name]}Request" do |xreq|
73
+ xreq.complexType do |xct|
74
+ xct.all do |xall|
75
+ params = op_options[:parameters] rescue nil
76
+ if params.nil?
77
+ if um.respond_to?(:parameters)
78
+ # with Ruby 1.9, we can create the parameters with the correct names
79
+ params = um.parameters.select { |p| p.first == :in }.map { |p| [p.first, Object] }
80
+ else
81
+ params = (0..um.arity).map { |i| ["arg#{i}", Object] }
84
82
  end
83
+ end
85
84
 
86
- params.each do |p|
87
- xall.element :name => p.first, :type => to_xsd_type(p.last)
85
+ params.each do |p|
86
+ t = p.last
87
+ if t.nil?
88
+ xall.element :name => p.first, :type => 'xsd:any'
89
+ elsif t.is_a?(Class)
90
+ xall.element :name => p.first, :type => to_xsd_type(t)
91
+ elsif t.is_a?(Hash)
92
+ xall.complexType do |xct2|
93
+ xct2.all do |xall2|
94
+ t.each do |name, type|
95
+ xall2.element :name => name, :type => to_xsd_type(type)
96
+ end
97
+ end
98
+ end
99
+ else
100
+ raise "Could not interpret #{t.inspect} as a return type definition"
88
101
  end
89
102
  end
90
103
  end
91
104
  end
92
105
  end
106
+ end
93
107
 
94
- # element for method result
95
- xschema.element :name => "#{m.camelize}" do |xreq|
96
- xreq.complexType do |xct|
97
- xct.all do |xall|
98
- ret = op_options[:returns] rescue nil
99
- if ret.nil?
100
- xall.element :name => 'result', :type => 'xsd:any'
101
- elsif ret.is_a?(Class)
102
- xall.element :name => 'result', :type => to_xsd_type(ret)
103
- elsif ret.is_a?(Hash)
104
- ret.each do |name, type|
105
- xall.element :name => name, :type => to_xsd_type(type)
106
- end
107
- else
108
- raise "Could not interpret #{ret.inspect} as a return type definition"
108
+ # element for method result
109
+ xschema.element :name => "#{op_options[:public_name]}" do |xreq|
110
+ xreq.complexType do |xct|
111
+ xct.all do |xall|
112
+ ret = op_options[:returns] rescue nil
113
+ if ret.nil?
114
+ xall.element :name => 'result', :type => 'xsd:any'
115
+ elsif ret.is_a?(Class)
116
+ xall.element :name => 'result', :type => to_xsd_type(ret)
117
+ elsif ret.is_a?(Hash)
118
+ ret.each do |name, type|
119
+ xall.element :name => name, :type => to_xsd_type(type)
109
120
  end
121
+ else
122
+ raise "Could not interpret #{ret.inspect} as a return type definition"
110
123
  end
111
124
  end
112
125
  end
113
126
  end
127
+ end
114
128
 
115
- def to_xsd_type(t)
116
- if t.is_a?(Class)
117
- return 'xsd:string' if t == String
118
- return 'xsd:integer' if t == Fixnum
119
- return 'xsd:dateTime' if t == DateTime
120
- return 'xsd:any' if t == Object
121
- raise "Could not convert type #{t} to a valid XSD type"
122
- elsif t.is_a?(Hash)
123
- '??'
124
- end
125
- end
129
+ # @param t [Class]
130
+ def to_xsd_type(t)
131
+ return 'xsd:string' if t == String
132
+ return 'xsd:integer' if t == Fixnum
133
+ return 'xsd:dateTime' if t == DateTime
134
+ return 'xsd:any' if t.nil? || t == Object
135
+ raise "Could not convert type #{t} to a valid XSD type"
126
136
  end
127
137
  end
data/shapewear.gemspec CHANGED
@@ -19,6 +19,10 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_development_dependency "rake", "~> 0.9.2"
21
21
  s.add_development_dependency "rspec", "~> 2.7.0"
22
+ s.add_development_dependency "rack-test"
23
+ s.add_development_dependency "savon"
24
+ s.add_development_dependency "wasabi"
25
+ s.add_development_dependency "webmock"
22
26
 
23
27
  s.files = `git ls-files`.split("\n")
24
28
  s.require_path = "lib"
@@ -5,48 +5,38 @@ describe Shapewear::DSL do
5
5
  let(:xmlns) { {'wsdl' => 'http://schemas.xmlsoap.org/wsdl/', 'soap' => 'http://schemas.xmlsoap.org/wsdl/soap/'} }
6
6
 
7
7
  describe "basic DSL" do
8
- it "should describe parameterless, 'hello world' services" do
9
- class ParameterlessHelloWorldService
10
- include Shapewear
11
-
12
- def hello_world
13
- "hello"
14
- end
15
- end
16
-
17
- wsdl = ParameterlessHelloWorldService.to_wsdl
8
+ it "should describe a minimal working service" do
9
+ wsdl = MinimalWorkingService.to_wsdl
18
10
  puts wsdl
19
- wsdl_doc = nil
20
- expect { wsdl_doc = Nokogiri::XML(wsdl) { |c| c.strict } }.not_to raise_error
21
11
 
22
- # there should be a definition with the class' name
23
- wsdl_def = wsdl_doc.xpath("/wsdl:definitions[@name='ParameterlessHelloWorldService']", xmlns)
24
- wsdl_def.should have(1).node
25
- wsdl_def.xpath("wsdl:service[@name='ParameterlessHelloWorldService']/wsdl:port[@name='ParameterlessHelloWorldServicePort']/soap:address", xmlns).should have(1).node
12
+ # wsdl should be valid XML (duh!)
13
+ expect { Nokogiri::XML(wsdl) { |c| c.strict } }.not_to raise_error
26
14
 
27
- # the message element for the input should not be there, as the method does not accept parameters
28
- wsdl_def.xpath("wsdl:message[@name='HelloWorldInput']", xmlns).should have(0).node
15
+ # wasabi should be able to parse it
16
+ wdoc = nil
17
+ expect { wdoc = Wasabi.document wsdl }.not_to raise_error
29
18
 
30
- # the message element for the output must be there, as a simple string
31
- wsdl_def.xpath("wsdl:message[@name='HelloWorldOutput']/wsdl:part[@name='body']", xmlns).should have(1).node
19
+ wdoc.namespace.should match /MinimalWorkingService/
20
+ wdoc.soap_actions.should == [:hello_world]
32
21
 
33
- # there must be an operation named 'HelloWorld'
34
- wsdl_def.xpath("wsdl:portType/wsdl:operation[@name='HelloWorld']", xmlns).should have(1).node
35
- wsdl_def.xpath("wsdl:binding/wsdl:operation[@name='HelloWorld']", xmlns).should have(1).node
22
+ wdoc.operations[:hello_world].should_not be_nil
23
+ wdoc.operations[:hello_world][:input].should == 'HelloWorld'
24
+ wdoc.operations[:hello_world][:input].should match /HelloWorld$/
36
25
  end
37
- it "should describe services with basic parameters and return values"
38
- it "should describe services with array parameters"
39
26
  end
40
27
 
41
28
  describe "complex types DSL" do
42
- it "should allow definition of complex types using class introspection"
43
- it "should allow definition of complex types using a builder-like DSL"
44
29
  it "should accept complex types as input"
45
30
  it "should accept complex types as output"
31
+ it "should accept arrays as input"
32
+ it "should accept arrays as output"
33
+ it "should allow definition of complex types using class introspection"
34
+ it "should allow definition of complex types using a DSL"
46
35
  end
47
36
 
48
37
  describe "WSDL customization" do
49
- it "should allow customization of namespace"
38
+ it "should allow customization of target namespace"
39
+ it "should allow customization of schema namespace"
50
40
  end
51
41
 
52
42
  describe "existing WSDL" do
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Shapewear do
4
+ describe "usage with SOAP clients" do
5
+ before do
6
+ stub_request(:get, "http://services.example.com/complete/soap/wsdl") \
7
+ .to_return :body => CompleteService.to_wsdl, :headers => {'Content-Type' => 'application/xml'}
8
+
9
+ stub_request(:post, "http://services.example.com/complete/soap") \
10
+ .to_return :body => lambda { |r| CompleteService.serve(r) }, :headers => {'Content-Type' => 'application/xml'}
11
+ end
12
+
13
+ it "should work with Savon" do
14
+ client = Savon::Client.new 'http://services.example.com/complete/soap/wsdl'
15
+ response = client.request :echo_in_uppercase, :xmlns => 'http://services.example.com/v1' do
16
+ soap.body = {:text => 'uppercase text'}
17
+ end
18
+
19
+ puts response.inspect
20
+ puts response.body.inspect
21
+
22
+ response.body[:echo_in_uppercase_response][:body].should == 'UPPERCASE TEXT'
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,56 @@
1
+ # This class represents a fully customized service.
2
+ # It is used to test the extensiveness of the Shapewear DSL.
3
+ class CompleteService
4
+ include Shapewear
5
+
6
+ wsdl_namespace 'http://services.example.com/v1'
7
+ schema_namespace 'http://schemas.example.com/v1'
8
+
9
+ endpoint_url 'http://services.example.com/complete/soap'
10
+
11
+ operation :echo_in_uppercase, :documentation => 'Echoes back the parameter, in uppercase',
12
+ :parameters => [[:text, String]], :returns => String
13
+
14
+ operation :sum, :documentation => 'Adds two numbers',
15
+ :parameters => [[:x, Fixnum], [:y, Fixnum]],
16
+ :returns => Fixnum
17
+
18
+ operation :get_structured_data, :documentation => 'Returns structured data. 0 uses a Hash, 1 uses a struct, any other value raises a fault',
19
+ :parameters => [[:id, Fixnum]],
20
+ :returns => {:text => String, :random_value => Fixnum, :created_at => DateTime}
21
+
22
+ def echo_in_uppercase(text)
23
+ text.upcase
24
+ end
25
+
26
+ def sum(x, y)
27
+ x + y
28
+ end
29
+
30
+ def get_structured_data(id)
31
+ case id
32
+ when 0 then
33
+ Structured.new('text from the struct')
34
+ when 1 then
35
+ {:text => 'text from a hash', :random_value => rand(999), @created_at => DateTime.now}
36
+ else
37
+ raise "ID must be 0 or 1"
38
+ end
39
+ end
40
+
41
+ def reset(chave)
42
+ raise "Operação não permitida" if ::Rails.env.production?
43
+ c = Conector::Registro.find_by_chave_registro(chave)
44
+ c.reset!
45
+
46
+ 'ok'
47
+ end
48
+
49
+ class Structured < Struct.new(:text, :random_value, :created_at)
50
+ def initialize(text)
51
+ @text = text
52
+ @random_value = rand(999)
53
+ @created_at = DateTime.now
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,9 @@
1
+ # This class represents a minimal working service, without the use of any of the Shapewear specific DSL.
2
+ # It is used to test the Convention-over-Configuration-ness of Shapewear.
3
+ class MinimalWorkingService
4
+ include Shapewear
5
+
6
+ def hello_world
7
+ "hello"
8
+ end
9
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  require "bundler"
2
2
  Bundler.require :default, :development
3
3
 
4
+ require 'webmock/rspec'
5
+
4
6
  RSpec.configure do |config|
5
7
  end
8
+
9
+ Dir[File.join File.dirname(__FILE__), 'shapewear', 'service_definitions', '*.rb'].each { |f| require f }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shapewear
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - "F\xC3\xA1bio Batista"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-03 00:00:00 Z
18
+ date: 2012-01-05 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: builder
@@ -81,6 +81,62 @@ dependencies:
81
81
  version: 2.7.0
82
82
  type: :development
83
83
  version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: rack-test
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ type: :development
97
+ version_requirements: *id005
98
+ - !ruby/object:Gem::Dependency
99
+ name: savon
100
+ prerelease: false
101
+ requirement: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ hash: 3
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ type: :development
111
+ version_requirements: *id006
112
+ - !ruby/object:Gem::Dependency
113
+ name: wasabi
114
+ prerelease: false
115
+ requirement: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ type: :development
125
+ version_requirements: *id007
126
+ - !ruby/object:Gem::Dependency
127
+ name: webmock
128
+ prerelease: false
129
+ requirement: &id008 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ hash: 3
135
+ segments:
136
+ - 0
137
+ version: "0"
138
+ type: :development
139
+ version_requirements: *id008
84
140
  description: Shapewear is a Ruby library for handling SOAP requests from within your Rails or Sinatra application. It makes your fat services look skinny.
85
141
  email: fabio@elementarsistemas.com.br
86
142
  executables: []
@@ -101,10 +157,15 @@ files:
101
157
  - Rakefile
102
158
  - lib/shapewear.rb
103
159
  - lib/shapewear/dsl.rb
160
+ - lib/shapewear/logging.rb
161
+ - lib/shapewear/request.rb
104
162
  - lib/shapewear/version.rb
105
163
  - lib/shapewear/wsdl.rb
106
164
  - shapewear.gemspec
107
165
  - spec/shapewear/dsl_spec.rb
166
+ - spec/shapewear/savon_usage_spec.rb
167
+ - spec/shapewear/service_definitions/complete_service.rb
168
+ - spec/shapewear/service_definitions/minimal_working_service.rb
108
169
  - spec/spec_helper.rb
109
170
  homepage: https://github.com/elementar/shapewear
110
171
  licenses: []