savon-multipart 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - ruby-head
5
+ - ree
6
+ - rbx
7
+ # - rbx-2.0
8
+ - jruby
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ ## 0.9.7 (UPCOMING)
2
+
3
+ * Initial version. Adds multipart support (SOAP with Attachments) to Savon v0.9.7.
4
+ Please test and provide feedback so we can merge this into Savon proper.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+ gemspec
3
+
4
+ #gem "savon", :path => "../savon"
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Martin Westin, 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,15 @@
1
+ Savon Multipart [![Build Status](http://travis-ci.org/rubiii/savon-multipart.png)](http://travis-ci.org/rubiii/savon-multipart)
2
+ ===============
3
+
4
+ Adds multipart support (SOAP with Attachments) to [Savon](https://github.com/rubiii/savon).
5
+ Please test and provide feedback so we can merge this into Savon proper.
6
+
7
+
8
+ Installation
9
+ ------------
10
+
11
+ Savon Multipart is available through [Rubygems](http://rubygems.org/gems/savon-multipart) and can be installed via:
12
+
13
+ ```
14
+ $ gem install savon-multipart
15
+ ```
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new do |t|
7
+ t.rspec_opts = %w(-c)
8
+ end
9
+
10
+ task :default => :spec
11
+ task :test => :spec
@@ -0,0 +1,14 @@
1
+ require "mail"
2
+
3
+ module Savon
4
+ module SOAP
5
+
6
+ # = Savon::SOAP::Part
7
+ #
8
+ # Represents a part in a multipart SOAP request.
9
+ class Part < Mail::Part
10
+ # placeholder for SOAP-sepcific improvements... some day.
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ module Savon
2
+ module SOAP
3
+ class Request
4
+
5
+ private
6
+
7
+ def configure(http)
8
+ http.url = soap.endpoint
9
+ if soap.has_parts? # do multipart stuff if soap has parts
10
+ request_message = soap.request_message
11
+ # takes relevant http headers from the "Mail" message and makes
12
+ # them Net::HTTP compatible
13
+ request_message.header.fields.each do |field|
14
+ http.headers[field.name] = field.to_s
15
+ end
16
+ #request.headers["Content-Type"] << %|; start="<savon_soap_xml_part>"|
17
+ request_message.body.set_sort_order soap.parts_sort_order if soap.parts_sort_order && soap.parts_sort_order.any?
18
+ http.body = request_message.body.encoded
19
+ else
20
+ http.body = soap.to_xml
21
+ end
22
+ http.headers["Content-Type"] ||= CONTENT_TYPE[soap.version]
23
+ http.headers["Content-Length"] = http.body.bytesize.to_s
24
+ http
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,68 @@
1
+ require "savon/multipart/soap/part"
2
+
3
+ module Savon
4
+ module SOAP
5
+ class Response
6
+
7
+ # Overwrite to +decode_multipart+.
8
+ def initialize(config, response)
9
+ self.http = response
10
+ decode_multipart
11
+ raise_errors if config.raise_errors
12
+ end
13
+
14
+ def parts
15
+ @parts || []
16
+ end
17
+
18
+ attr_writer :parts
19
+
20
+ # Returns +true+ if this is a multipart response.
21
+ def multipart?
22
+ http.headers["Content-Type"] =~ /^multipart/
23
+ end
24
+
25
+ # Returns the boundary declaration of the multipart response.
26
+ def boundary
27
+ return unless multipart?
28
+ @boundary ||= Mail::Field.new("Content-Type", http.headers["Content-Type"]).parameters['boundary']
29
+ end
30
+
31
+ # Returns the Array of attachments if it was a multipart response.
32
+ def attachments
33
+ parts.attachments
34
+ end
35
+
36
+ # Overwrite to work with multipart response.
37
+ def to_xml
38
+ if multipart?
39
+ parts.first.body.decoded # we just assume the first part is the XML
40
+ else
41
+ http.body
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ # Decoding multipart responses.
48
+ #
49
+ # <tt>response.to_xml</tt> will point to the first part, hopefully the SOAP part of the multipart.
50
+ # All attachments are available in the <tt>response.parts</tt> Array. Each is a Part from the mail gem.
51
+ # See the docs there for details but:
52
+ #
53
+ # * response.parts[0].body is the contents
54
+ # * response.parts[0].headers are the mime headers
55
+ #
56
+ # And you can do nesting:
57
+ #
58
+ # * response.parts[0].parts[2].body
59
+ def decode_multipart
60
+ return unless multipart?
61
+ part_of_parts = Part.new(:headers => http.headers, :body => http.body)
62
+ part_of_parts.body.split!(boundary)
63
+ self.parts = part_of_parts.parts
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,50 @@
1
+ require "savon/multipart/soap/part"
2
+
3
+ module Savon
4
+ module SOAP
5
+ class XML
6
+
7
+ # Use sort functionality in Mail::Body.sort!() to order parts.
8
+ # An array of mime types is expected.
9
+ # E.g. this makes the xml appear before an attached image: ["text/xml", "image/jpeg"]
10
+ attr_accessor :parts_sort_order
11
+
12
+ # Adds a Part object to the current SOAP "message".
13
+ # Parts are really attachments.
14
+ def add_part(part)
15
+ @parts ||= Array.new
16
+ @parts << part
17
+ end
18
+
19
+ # Check if any parts have been added.
20
+ def has_parts?
21
+ @parts ||= Array.new
22
+ !@parts.empty?
23
+ end
24
+
25
+ # Returns the mime message for a multipart request.
26
+ def request_message
27
+ return if @parts.empty?
28
+
29
+ @request_message = Part.new do
30
+ content_type 'multipart/related; type="text/xml"'
31
+ end
32
+
33
+ soap_body = self.to_xml
34
+ soap_message = Part.new do
35
+ content_type 'text/xml; charset=utf-8'
36
+ add_content_transfer_encoding
37
+ body soap_body
38
+ end
39
+ soap_message.add_content_id "<savon_soap_xml_part>"
40
+ @request_message.add_part(soap_message)
41
+ @parts.each do |part|
42
+ @request_message.add_part(part)
43
+ end
44
+ #puts @request_message
45
+ @request_message
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ module Savon
2
+ module Multipart
3
+
4
+ VERSION = "1.0.0"
5
+
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ require "savon"
2
+ require "savon/multipart/version"
3
+ require "savon/multipart/soap/request"
4
+ require "savon/multipart/soap/response"
5
+ require "savon/multipart/soap/xml"
@@ -0,0 +1,26 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $:.unshift lib unless $:.include? lib
3
+
4
+ require "savon/multipart/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "savon-multipart"
8
+ s.version = Savon::Multipart::VERSION
9
+ s.authors = ["Martin Westin", "Daniel Harrington"]
10
+ s.email = ["martin@eimermusic.com", "me@rubiii.com"]
11
+ s.homepage = "http://savonrb.com"
12
+ s.summary = "Heavy metal Ruby SOAP client with multipart support"
13
+ s.description = "Adds multipart support (SOAP with Attachments) to Savon"
14
+
15
+ s.rubyforge_project = s.name
16
+
17
+ s.add_dependency "savon", "1.0.0"
18
+ s.add_dependency "mail"
19
+
20
+ s.add_development_dependency "rake", "~> 0.8.7"
21
+ s.add_development_dependency "rspec", "~> 2.5.0"
22
+ s.add_development_dependency "autotest"
23
+
24
+ s.files = `git ls-files`.split("\n")
25
+ s.require_path = "lib"
26
+ end
@@ -0,0 +1,103 @@
1
+ ----==_mimepart_4d416ae62fd32_201a8043814c4724
2
+ Date: Thu, 27 Jan 2011 13:53:58 +0100
3
+ Message-ID: <4d416ae631391_201a8043814c482c@Martin-iMac.local.mail>
4
+ Mime-Version: 1.0
5
+ Content-Type: text/xml;
6
+ charset=utf-8
7
+ Content-Transfer-Encoding: 7bit
8
+ content-id: soap_xml_part
9
+
10
+ <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:wsdl="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><ns1:TransactionID soapenv:actor="" soapenv:mustUnderstand="1" xsi:type="xsd:string" xmlns:ns1="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">2011012713535811111111111</ns1:TransactionID></soapenv:Header><soapenv:Body><SubmitReq xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2"><MM7Version>5.3.0</MM7Version><SenderIdentification><VASPID>messaging</VASPID><VASID>ADM</VASID><SenderAddress><ShortCode>1111</ShortCode></SenderAddress></SenderIdentification><Recipients><To><Number>11111111111</Number></To></Recipients><ServiceCode>1</ServiceCode><MessageClass>Personal</MessageClass><ExpiryDate>2011-01-28T13:53:58Z</ExpiryDate><DeliveryReport>false</DeliveryReport><ReadReply>false</ReadReply><Priority>Normal</Priority><Subject>Test MMS via Savon</Subject><ChargedParty>Sender</ChargedParty><Content href="cid:attachment_1" allowAdaptations="true"/></SubmitReq></soapenv:Body></soapenv:Envelope>
11
+
12
+ ----==_mimepart_4d416ae62fd32_201a8043814c4724
13
+ Date: Thu, 27 Jan 2011 13:53:58 +0100
14
+ Message-ID: <4d416ae63586d_201a8043814c518@Martin-iMac.local.mail>
15
+ Mime-Version: 1.0
16
+ Content-Type: multipart/mixed;
17
+ boundary="--==_mimepart_4d416ae628621_201a8043814c46ea";
18
+ charset=UTF-8
19
+ Content-Transfer-Encoding: 7bit
20
+ content-id: <attachment_1>
21
+
22
+
23
+
24
+ ----==_mimepart_4d416ae628621_201a8043814c46ea
25
+ Date: Thu, 27 Jan 2011 13:53:58 +0100
26
+ Message-ID: <4d416ae635039_201a8043814c507d@Martin-iMac.local.mail>
27
+ Mime-Version: 1.0
28
+ Content-Type: application/smil;
29
+ charset=UTF-8
30
+ Content-Transfer-Encoding: 7bit
31
+ content-id: smil_1.smil
32
+
33
+ <smil>
34
+ <head>
35
+ <layout>
36
+ <root-layout width="240" height="320"/>
37
+ <region id="Image" top="0%" left="0%" height="70%" width="100%" fit="meet"/>
38
+ <region id="Text" top="70%" left="0%" height="30%" width="100%" fit="scroll"/>
39
+ </layout>
40
+ </head>
41
+ <body>
42
+ <par dur="5s"><img src="cid:github_logo.gif" region="Image"></img><text src="cid:text_0.txt" region="Text"><param name="hAlign" value="right"/><param name="textsize" value="small"/></text></par>
43
+ </body>
44
+ </smil>
45
+
46
+ ----==_mimepart_4d416ae628621_201a8043814c46ea
47
+ Date: Thu, 27 Jan 2011 13:53:58 +0100
48
+ Mime-Version: 1.0
49
+ Content-Type: image/gif;
50
+ charset=UTF-8;
51
+ filename=mobile_baby_logo.gif
52
+ Content-Transfer-Encoding: base64
53
+ Content-Disposition: attachment;
54
+ filename=github_logo.gif
55
+ content-id: github_logo.gif
56
+
57
+ R0lGODlhZQAtALMAAPz8/MTExFBQUPn5+ZaWlgAAAPf393x8fNTU1LKysqKi
58
+ ouXl5YuLiyUlJTg4OGNjYyH5BAAAAAAALAAAAABlAC0AAAT/EMhJq7046827
59
+ /xLSFIUDAgKpnl+gkgf7GW8JHrXcLXWid4xaAfHBvX6cWgC5Mb6WHieJqVFS
60
+ M8EaMZq7XqxeC+9lKnbDFDCaglA5BhPDYT5XWKSFdfqpFxssNTEVeH0SaoUZ
61
+ gXdneoeIXy+CFISFjh4JBw4ODwwLFAkCEnRzBAALB1ludFCECwx0WxQBowdQ
62
+ E7SlAFaYdXAZCUIkDw8OK7ovDwAuwSqCeA9CDp4TCop7boYvKUIMGNXMQhIj
63
+ zcrgMKLmL7HLKnYUxdjH6QWhFd/zUwDw5+zMzvgFGkzoV8CWhH025M3zMWEA
64
+ QGMIYxAU8g+gIIIG9ZHJBtAXAAI1/5KZGqeigciIAAwEIPhgZYBpeEgI2PZC
65
+ YDk+7zYqLPmAZLsJNANSGKOCoUZyE6xNCumrTY+bKjIiLCPEFjSdR4VV8CkJ
66
+ ZdJIi45QuMfP0VSOJDL6zHMQWQWvWQtI2jkXndhrJExgfKvT0VUVWxDa/Fp0
67
+ Aly6YY3lxLZ3cV60BQeBwePuY40/bZFCrguAkmMbjQ33xTkBGE6iJR2srZf5
68
+ HGHXS++KZmx2dNQKqdJO+GtuWmu5eIFLlv1bb+14jvAYXCuk8u+5Sm8xKg6V
69
+ hPO4VEn/LuARwICYhflqRjxc8ezHO0WeT3gIdT4KQfMywCwe9k7W0oljh1zA
70
+ t2nkNU0zAP9CBYg0wIHuPXDgggweGBGDaxEwQAACBPBdDQ0OSMaB8cmlAG95
71
+ HRjMAwcwZyGDBGWY4YMLEvjEhS+suOEAZKXzhkMA3YhiDQqoyCCLB+amBIwq
72
+ yOjGgg/d+NCJDLon1wI+athMk+BYiIeRRR44ETNK4tOjiiCqIMB8DTLFYI1R
73
+ EUlChkKcGUwDPr2RYDBfqigkRT9qoomCDVJIBgEGDECMnjou2AChhQ6wADFw
74
+ CtDjoHtOiOiEAujZiY//pSNAlJx26umnoIbqFEAShmrqqaiaSqACCGgJ4qYD
75
+ IKCaAwkoWuKhpdKoWgMEgNLqdw3UOoCvGRKwa60I9HSohQgIMMz/Aa02mwAB
76
+ DZzY7AEDyAEnrQz2kKEUN6qWCQMDHqosttSatAm1J6rGJ7sNMgAnMQQssK0A
77
+ cCYggiZwIiACAdQ6EGgAJg2ArwO3CotjlvHO2ACsA1AL6wKqidAAlBPCSzCc
78
+ UMK7oL3SZJtsA9gOe+i/Jjvwb7oKivBAAgXHWiGSL+S6YFCwziphT78OIG+J
79
+ JR9Ibas9Udujxwcq0AC5hjbAIL4wlwo1rxLz6jLPPgox5koMEMj0yCb1xGC6
80
+ vI7dQKsPG3BoxNWabfPaC/akdKlyU302vkoP47TBcO6t5jyBfgxniQr3VCLE
81
+ bCOg9CYcD80gzEGXi3G5UTtYrd0IUDwvoeHDyquj2gB9KYKF+S67QMDlYjvL
82
+ 0O4+gO8BRr90oAGq9RiAAocvsKhJIkBr+MpnTzgvzCEDzaABHTa3oMVwkntr
83
+ 38juapLRDxvqANlMC9+3hPj2rTLz1RMMcNs+F/z8oZMv31M0ZDKIwAEP1IkJ
84
+ J5OfTiLX0zI57bQAM6koAyRqlQE+FL9Ana5/CGIA1yZHogPND1CeWkDgUkXB
85
+ ClowQxEAADs=
86
+
87
+
88
+ ----==_mimepart_4d416ae628621_201a8043814c46ea
89
+ Date: Thu, 27 Jan 2011 13:53:58 +0100
90
+ Message-ID: <4d416ae633ce8_201a8043814c49c7@Martin-iMac.local.mail>
91
+ Mime-Version: 1.0
92
+ Content-Type: text/plain;
93
+ charset=UTF-8
94
+ Content-Transfer-Encoding: 7bit
95
+ content-id: text_0.txt
96
+
97
+ This is a test message from Github
98
+
99
+ ----==_mimepart_4d416ae628621_201a8043814c46ea--
100
+
101
+
102
+ ----==_mimepart_4d416ae62fd32_201a8043814c4724--
103
+
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe Savon::SOAP::Response do
4
+
5
+ before do
6
+ @header = { "Content-Type" => 'multipart/related; boundary="--==_mimepart_4d416ae62fd32_201a8043814c4724"; charset=UTF-8; type="text/xml"' }
7
+ path = File.expand_path("../../../fixtures/response/multipart.txt", __FILE__)
8
+ raise ArgumentError, "Unable to load: #{path}" unless File.exist? path
9
+ @body = File.read(path)
10
+ end
11
+
12
+ it "parses without Exception" do
13
+ response = soap_response :headers => @header, :body => @body
14
+ response.to_xml.should == '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:wsdl="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><ns1:TransactionID soapenv:actor="" soapenv:mustUnderstand="1" xsi:type="xsd:string" xmlns:ns1="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">2011012713535811111111111</ns1:TransactionID></soapenv:Header><soapenv:Body><SubmitReq xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2"><MM7Version>5.3.0</MM7Version><SenderIdentification><VASPID>messaging</VASPID><VASID>ADM</VASID><SenderAddress><ShortCode>1111</ShortCode></SenderAddress></SenderIdentification><Recipients><To><Number>11111111111</Number></To></Recipients><ServiceCode>1</ServiceCode><MessageClass>Personal</MessageClass><ExpiryDate>2011-01-28T13:53:58Z</ExpiryDate><DeliveryReport>false</DeliveryReport><ReadReply>false</ReadReply><Priority>Normal</Priority><Subject>Test MMS via Savon</Subject><ChargedParty>Sender</ChargedParty><Content href="cid:attachment_1" allowAdaptations="true"/></SubmitReq></soapenv:Body></soapenv:Envelope>'
15
+ response.parts.length.should == 2
16
+ response.parts[1].parts.length.should == 3
17
+ response.parts[1].parts[2].body.should == "This is a test message from Github"
18
+ end
19
+
20
+ it "returns the attachments" do
21
+ response = soap_response :headers => @header, :body => @body
22
+ response.attachments.size.should == 1
23
+ end
24
+
25
+ def soap_response(options = {})
26
+ defaults = { :code => 200, :headers => {}, :body => "" }
27
+ response = defaults.merge options
28
+
29
+ Savon::SOAP::Response.new Savon.config, HTTPI::Response.new(response[:code], response[:headers], response[:body])
30
+ end
31
+
32
+ end
@@ -0,0 +1,10 @@
1
+ require "bundler"
2
+ Bundler.require :default, :development
3
+
4
+ require "savon-multipart"
5
+
6
+ # Disable logging and deprecations for specs.
7
+ Savon.configure do |config|
8
+ config.log = false
9
+ # config.deprecate = false
10
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: savon-multipart
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Martin Westin
9
+ - Daniel Harrington
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-06-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: savon
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - '='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - '='
29
+ - !ruby/object:Gem::Version
30
+ version: 1.0.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: mail
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.8.7
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 0.8.7
63
+ - !ruby/object:Gem::Dependency
64
+ name: rspec
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 2.5.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 2.5.0
79
+ - !ruby/object:Gem::Dependency
80
+ name: autotest
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ description: Adds multipart support (SOAP with Attachments) to Savon
96
+ email:
97
+ - martin@eimermusic.com
98
+ - me@rubiii.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - .gitignore
104
+ - .rspec
105
+ - .travis.yml
106
+ - CHANGELOG.md
107
+ - Gemfile
108
+ - LICENSE
109
+ - README.md
110
+ - Rakefile
111
+ - lib/savon-multipart.rb
112
+ - lib/savon/multipart/soap/part.rb
113
+ - lib/savon/multipart/soap/request.rb
114
+ - lib/savon/multipart/soap/response.rb
115
+ - lib/savon/multipart/soap/xml.rb
116
+ - lib/savon/multipart/version.rb
117
+ - savon-multipart.gemspec
118
+ - spec/fixtures/response/multipart.txt
119
+ - spec/savon/soap/response_spec.rb
120
+ - spec/spec_helper.rb
121
+ homepage: http://savonrb.com
122
+ licenses: []
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project: savon-multipart
141
+ rubygems_version: 1.8.24
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Heavy metal Ruby SOAP client with multipart support
145
+ test_files: []