multipart_body 0.1.0 → 0.2.0
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/lib/multipart_body/part.rb +18 -10
- data/test/file +1 -0
- data/test/file.txt +1 -0
- data/test/test.rb +40 -3
- metadata +9 -5
data/lib/multipart_body/part.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
class Part < Struct.new(:name, :body, :filename, :content_type, :encoding)
|
1
|
+
class Part < Struct.new(:name, :body, :filename, :content_disposition, :content_type, :encoding)
|
2
2
|
def initialize(*args)
|
3
3
|
if args.flatten.first.is_a? Hash
|
4
4
|
from_hash(args.flatten.first)
|
@@ -9,21 +9,29 @@ class Part < Struct.new(:name, :body, :filename, :content_type, :encoding)
|
|
9
9
|
|
10
10
|
def from_hash(hash)
|
11
11
|
hash.each_pair do |k, v|
|
12
|
-
|
12
|
+
if k.to_s == 'body' && (v.is_a?(File) || v.is_a?(Tempfile))
|
13
|
+
self[k] = v.read
|
14
|
+
self['filename'] = File.basename(v)
|
15
|
+
else
|
16
|
+
self[k] = v
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
15
20
|
|
16
21
|
def from_args(name, body, filename=nil)
|
17
|
-
self
|
18
|
-
self[:body] = body
|
19
|
-
self[:filename] = filename
|
22
|
+
self.from_hash(:name => name, :body => body, :filename => filename)
|
20
23
|
end
|
21
24
|
|
22
25
|
def header
|
23
|
-
header = "
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
header = ""
|
27
|
+
if content_disposition || name
|
28
|
+
header << "Content-Disposition: #{content_disposition || 'form-data'}"
|
29
|
+
header << "; name=\"#{name}\"" if name && !content_disposition
|
30
|
+
header << "; filename=\"#{filename}\"" if filename && !content_disposition
|
31
|
+
header << "\r\n"
|
32
|
+
end
|
33
|
+
header << "Content-Type: #{content_type}\r\n" if content_type
|
34
|
+
header << "Content-Transfer-Encoding: #{encoding}\r\n" if encoding
|
27
35
|
header
|
28
36
|
end
|
29
37
|
|
@@ -38,6 +46,6 @@ class Part < Struct.new(:name, :body, :filename, :content_type, :encoding)
|
|
38
46
|
end
|
39
47
|
|
40
48
|
def to_s
|
41
|
-
"#{header}\r\n
|
49
|
+
"#{header}\r\n#{encoded_body}"
|
42
50
|
end
|
43
51
|
end
|
data/test/file
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
hello
|
data/test/file.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
hello
|
data/test/test.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
require 'tempfile'
|
2
3
|
|
3
4
|
class MultipartBodyTest < Test::Unit::TestCase
|
4
|
-
context "
|
5
|
+
context "MultipartBody" do
|
5
6
|
setup do
|
6
7
|
@hash = {:test => 'test', :two => 'two'}
|
7
8
|
@parts = [Part.new('name', 'value'), Part.new('name2', 'value2')]
|
9
|
+
@example_text = "------multipart-boundary-307380\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nvalue\r\n------multipart-boundary-307380\r\nContent-Disposition: form-data; name=\"name2\"\r\n\r\nvalue2\r\n------multipart-boundary-307380--"
|
8
10
|
end
|
9
11
|
|
10
12
|
should "return a new multipart when sent #from_hash" do
|
@@ -51,11 +53,21 @@ class MultipartBodyTest < Test::Unit::TestCase
|
|
51
53
|
multipart = MultipartBody.new(@parts)
|
52
54
|
assert_match multipart.parts.join("\r\n--#{multipart.boundary}\r\n"), multipart.to_s
|
53
55
|
end
|
56
|
+
|
57
|
+
should "contrsuct a valid multipart text when passed #to_s" do
|
58
|
+
multipart = MultipartBody.new(@parts)
|
59
|
+
multipart.boundary = '----multipart-boundary-307380'
|
60
|
+
assert_equal @example_text, multipart.to_s
|
61
|
+
end
|
54
62
|
end
|
55
63
|
|
56
64
|
context "a Part" do
|
57
65
|
setup do
|
58
66
|
@part = Part
|
67
|
+
@file = Tempfile.new('file')
|
68
|
+
@file.write('hello')
|
69
|
+
@file.flush
|
70
|
+
@file.open
|
59
71
|
end
|
60
72
|
|
61
73
|
should "assign values when sent #new with a hash" do
|
@@ -86,7 +98,22 @@ class MultipartBodyTest < Test::Unit::TestCase
|
|
86
98
|
assert_equal nil, part.filename
|
87
99
|
end
|
88
100
|
|
89
|
-
should "include a content
|
101
|
+
should "include a content type when one is set" do
|
102
|
+
part = Part.new(:content_type => 'plain/text', :body => 'content')
|
103
|
+
assert_match "Content-Type: plain\/text\r\n", part.header
|
104
|
+
end
|
105
|
+
|
106
|
+
should "include a content disposition when sent #header and one is set" do
|
107
|
+
part = Part.new(:content_disposition => 'content-dispo', :body => 'content')
|
108
|
+
assert_match "Content-Disposition: content-dispo\r\n", part.header
|
109
|
+
end
|
110
|
+
|
111
|
+
should "not include a content disposition of form-data when nothing is set" do
|
112
|
+
part = Part.new(:body => 'content')
|
113
|
+
assert_no_match /content-disposition/i, part.header
|
114
|
+
end
|
115
|
+
|
116
|
+
should "include a content disposition when sent #header and name is set" do
|
90
117
|
part = Part.new(:name => 'key', :body => 'content')
|
91
118
|
assert_match /content-disposition: form-data; name="key"/i, part.header
|
92
119
|
end
|
@@ -116,7 +143,17 @@ class MultipartBodyTest < Test::Unit::TestCase
|
|
116
143
|
|
117
144
|
should "output the header and body when sent #to_s" do
|
118
145
|
part = Part.new(:name => 'key', :body => 'content')
|
119
|
-
assert_equal "#{part.header}\r\n
|
146
|
+
assert_equal "#{part.header}\r\n#{part.body}", part.to_s
|
147
|
+
end
|
148
|
+
|
149
|
+
should "add the files content not the file when passed a file" do
|
150
|
+
part = Part.new(:name => 'key', :body => @file)
|
151
|
+
assert_equal 'hello', part.body
|
152
|
+
end
|
153
|
+
|
154
|
+
should "automatically assign a filename when passed a file to body" do
|
155
|
+
part = Part.new(:name => 'key', :body => @file)
|
156
|
+
assert_not_nil part.filename
|
120
157
|
end
|
121
158
|
end
|
122
159
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multipart_body
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Steve Smith
|
@@ -15,12 +15,12 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-19 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
22
22
|
description: A ruby library to create multipart bodies.
|
23
|
-
email: gems@
|
23
|
+
email: gems@dynedge.co.uk
|
24
24
|
executables: []
|
25
25
|
|
26
26
|
extensions: []
|
@@ -32,6 +32,8 @@ files:
|
|
32
32
|
- lib/multipart_body/multipart_body.rb
|
33
33
|
- lib/multipart_body/part.rb
|
34
34
|
- lib/multipart_body.rb
|
35
|
+
- test/file
|
36
|
+
- test/file.txt
|
35
37
|
- test/test.rb
|
36
38
|
- test/test_helper.rb
|
37
39
|
has_rdoc: true
|
@@ -69,5 +71,7 @@ signing_key:
|
|
69
71
|
specification_version: 3
|
70
72
|
summary: MultipartBody allows you to create consistant multipart bodies
|
71
73
|
test_files:
|
74
|
+
- test/file
|
75
|
+
- test/file.txt
|
72
76
|
- test/test.rb
|
73
77
|
- test/test_helper.rb
|