multipart-post 1.1.5 → 1.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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- multipart-post (1.1.4)
4
+ multipart-post (1.2.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -1,3 +1,7 @@
1
+ === 1.2.0 / 2013-02-25
2
+
3
+ - #25: Ruby 2 compatibility (thanks mislav)
4
+
1
5
  === 1.1.5 / 2012-02-12
2
6
 
3
7
  - Fix length/bytesize of parts in 1.9 (#7, #14) (Jason Moore)
@@ -17,39 +17,40 @@ class CompositeReadIO
17
17
  # respond to #read in a manner consistent with IO.
18
18
  def initialize(*ios)
19
19
  @ios = ios.flatten
20
+ @index = 0
20
21
  end
21
22
 
22
- # Read from the IO object, overlapping across underlying streams as necessary.
23
- def read(amount = nil, buf = nil)
24
- buffer = buf || ''
25
- done = if amount; nil; else ''; end
26
- partial_amount = amount
27
- parts = @ios.dup
23
+ # Read from IOs in order until `length` bytes have been received.
24
+ def read(length = nil, outbuf = nil)
25
+ got_result = false
26
+ outbuf = outbuf ? outbuf.replace("") : ""
28
27
 
29
- loop do
30
- result = done
31
-
32
- while !parts.empty? && (result = parts.first.read(partial_amount)) == done
33
- parts.shift
28
+ while io = current_io
29
+ if result = io.read(length)
30
+ got_result ||= !result.nil?
31
+ result.force_encoding("BINARY") if result.respond_to?(:force_encoding)
32
+ outbuf << result
33
+ length -= result.length if length
34
+ break if length == 0
34
35
  end
35
-
36
- result.force_encoding("BINARY") if result.respond_to?(:force_encoding)
37
- buffer << result if result
38
- partial_amount -= result.length if partial_amount && result != done
39
-
40
- break if partial_amount && partial_amount <= 0
41
- break if result == done
42
- end
43
-
44
- if buffer.length > 0
45
- buffer
46
- else
47
- done
36
+ advance_io
48
37
  end
38
+ (!got_result && length) ? nil : outbuf
49
39
  end
50
-
40
+
51
41
  def rewind
52
42
  @ios.each { |io| io.rewind }
43
+ @index = 0
44
+ end
45
+
46
+ private
47
+
48
+ def current_io
49
+ @ios[@index]
50
+ end
51
+
52
+ def advance_io
53
+ @index += 1
53
54
  end
54
55
  end
55
56
 
@@ -1,9 +1,9 @@
1
1
  #--
2
- # Copyright (c) 2007-2012 Nick Sieger.
2
+ # Copyright (c) 2007-2013 Nick Sieger.
3
3
  # See the file README.txt included with the distribution for
4
4
  # software license details.
5
5
  #++
6
6
 
7
7
  module MultipartPost
8
- VERSION = "1.1.5"
8
+ VERSION = "1.2.0"
9
9
  end
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.email = ["nick@nicksieger.com"]
10
10
  s.homepage = "https://github.com/nicksieger/multipart-post"
11
11
  s.summary = %q{A multipart form post accessory for Net::HTTP.}
12
+ s.license = "MIT"
12
13
  s.description = %q{Use with Net::HTTP to do multipart form posts. IO values that have #content_type, #original_filename, and #local_path will be posted as a binary file.}
13
14
 
14
15
  s.rubyforge_project = "caldersphere"
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2007-2012 Nick Sieger.
2
+ # Copyright (c) 2007-2013 Nick Sieger.
3
3
  # See the file README.txt included with the distribution for
4
4
  # software license details.
5
5
  #++
@@ -7,6 +7,7 @@
7
7
  require 'composite_io'
8
8
  require 'stringio'
9
9
  require 'test/unit'
10
+ require 'timeout'
10
11
 
11
12
  class CompositeReadIOTest < Test::Unit::TestCase
12
13
  def setup
@@ -23,7 +24,10 @@ class CompositeReadIOTest < Test::Unit::TestCase
23
24
  utf8 = File.open(File.dirname(__FILE__)+'/multibyte.txt')
24
25
  binary = StringIO.new("\x86")
25
26
  @io = CompositeReadIO.new(binary,utf8)
26
- assert_equal "\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\n", @io.read
27
+
28
+ expect = "\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\n"
29
+ expect.force_encoding('BINARY') if expect.respond_to?(:force_encoding)
30
+ assert_equal expect, @io.read
27
31
  end
28
32
  end
29
33
 
@@ -74,4 +78,38 @@ class CompositeReadIOTest < Test::Unit::TestCase
74
78
  UploadIO.convert!('tmp.txt', 'text/plain', 'tmp.txt', 'tmp.txt')
75
79
  }
76
80
  end
81
+
82
+ ## FIXME excluding on JRuby due to
83
+ ## http://jira.codehaus.org/browse/JRUBY-7109
84
+ if IO.respond_to?(:copy_stream) && !defined?(JRUBY_VERSION)
85
+ def test_compatible_with_copy_stream
86
+ target_io = StringIO.new
87
+ Timeout.timeout(1) do
88
+ IO.copy_stream(@io, target_io)
89
+ end
90
+ assert_equal "the quick brown fox", target_io.string
91
+ end
92
+ end
93
+
94
+ def test_empty
95
+ io = CompositeReadIO.new
96
+ assert_equal "", io.read
97
+ end
98
+
99
+ def test_empty_limited
100
+ io = CompositeReadIO.new
101
+ assert_nil io.read(1)
102
+ end
103
+
104
+ def test_empty_parts
105
+ io = CompositeReadIO.new(StringIO.new, StringIO.new('the '), StringIO.new, StringIO.new('quick'))
106
+ assert_equal "the", io.read(3)
107
+ assert_equal " qu", io.read(3)
108
+ assert_equal "ick", io.read(4)
109
+ end
110
+
111
+ def test_all_empty_parts
112
+ io = CompositeReadIO.new(StringIO.new, StringIO.new)
113
+ assert_nil io.read(1)
114
+ end
77
115
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multipart-post
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-13 00:00:00.000000000Z
12
+ date: 2013-02-26 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'Use with Net::HTTP to do multipart form posts. IO values that have
15
15
  #content_type, #original_filename, and #local_path will be posted as a binary file.'
@@ -38,7 +38,8 @@ files:
38
38
  - test/test_composite_io.rb
39
39
  - test/test_parts.rb
40
40
  homepage: https://github.com/nicksieger/multipart-post
41
- licenses: []
41
+ licenses:
42
+ - MIT
42
43
  post_install_message:
43
44
  rdoc_options: []
44
45
  require_paths:
@@ -57,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
58
  version: '0'
58
59
  requirements: []
59
60
  rubyforge_project: caldersphere
60
- rubygems_version: 1.8.6
61
+ rubygems_version: 1.8.24
61
62
  signing_key:
62
63
  specification_version: 3
63
64
  summary: A multipart form post accessory for Net::HTTP.