http-form_data 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1a44d108e4522fc194181bc81f9a69852f69048a
4
- data.tar.gz: fd416ada1943d0bf92f534af8ef1ba54002105f6
2
+ SHA256:
3
+ metadata.gz: 909d3d6b05b19fec60fcea6016be93adcde0cc4c86e62d918dd47e1dc52580f1
4
+ data.tar.gz: 55cf57b3b18b038cf4b7641cd56e790f61686e77ff10589c4c2d942685f771b2
5
5
  SHA512:
6
- metadata.gz: c6a9f12d474e4265941ef81db33ba70aee2eba6754e341948fbc82b94c0d7957b3df970329cc1ca658659b605ec00d845d4777b47daa5f4d1fc702d2c0a1c5b3
7
- data.tar.gz: 0f6558ffbef78b44bf5851154de0ed8b115f67763d8aa548c5ef6544f7ba4b2c50cc136a9b0d6666b543ebf628eebf777f012277e87b94ab4450ccebe6b6103f
6
+ metadata.gz: 29b89bd6588b76241ea70d08c919ef70e68acbf8705386a0b4e99532e648cc58df298faaab1982206a7c86c27c8a1e59c28f7e60b3328459bc02f1a79ea66395
7
+ data.tar.gz: fd703850f29023873d4ecf7026a457e763a33e1cd76c97d67656eb06e6bcaf59f7599066b02d490cf83b2598e4c5e01631cd1cdb9ba2930d6cc61b90922e4b12
data/.rubocop.yml CHANGED
@@ -33,6 +33,9 @@ Style/HashSyntax:
33
33
  Style/IndentHash:
34
34
  EnforcedStyle: consistent
35
35
 
36
+ Style/IndentArray:
37
+ EnforcedStyle: consistent
38
+
36
39
  # New lambda syntax is as ugly to me as new syntax of Hash.
37
40
  Style/Lambda:
38
41
  Enabled: false
data/CHANGES.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## 2.1.0 (2018-03-05)
2
+
3
+ * [#21](https://github.com/httprb/form_data/pull/21)
4
+ Rewind content at the end of `Readable#to_s`.
5
+ [@janko-m][]
6
+
7
+ * [#19](https://github.com/httprb/form_data/pull/19)
8
+ Fix buffer encoding.
9
+ [@HoneyryderChuck][]
10
+
11
+
1
12
  ## 2.0.0 (2017-10-01)
2
13
 
3
14
  * [#17](https://github.com/httprb/form_data/pull/17)
@@ -59,3 +70,4 @@
59
70
  [@abotalov]: https://github.com/abotalov
60
71
  [@janko-m]: https://github.com/janko-m
61
72
  [@mhickman]: https://github.com/mhickman
73
+ [@HoneyryderChuck]: https://github.com/HoneyryderChuck
data/Gemfile CHANGED
@@ -18,7 +18,7 @@ group :test do
18
18
  end
19
19
 
20
20
  group :doc do
21
- gem "redcarpet"
21
+ gem "redcarpet", :platform => :mri
22
22
  gem "yard"
23
23
  end
24
24
 
@@ -9,7 +9,7 @@ module HTTP
9
9
  # @param [Array<IO>] ios Array of IO objects
10
10
  def initialize(ios)
11
11
  @index = 0
12
- @buffer = String.new
12
+ @buffer = "".b
13
13
  @ios = ios.map do |io|
14
14
  if io.is_a?(String)
15
15
  StringIO.new(io)
@@ -29,14 +29,16 @@ module HTTP
29
29
  #
30
30
  # @return [String, nil]
31
31
  def read(length = nil, outbuf = nil)
32
- outbuf = outbuf.to_s.replace("")
32
+ outbuf = outbuf.to_s.clear
33
+ # buffer in JRuby is sometimes US-ASCII, force to ASCII-8BIT
34
+ outbuf.force_encoding(Encoding::BINARY)
33
35
 
34
36
  while current_io
35
37
  current_io.read(length, @buffer)
36
- outbuf << @buffer
38
+ outbuf << @buffer.force_encoding(Encoding::BINARY)
37
39
 
38
40
  if length
39
- length -= @buffer.length
41
+ length -= @buffer.bytesize
40
42
  break if length.zero?
41
43
  end
42
44
 
@@ -62,7 +62,7 @@ module HTTP
62
62
  private
63
63
 
64
64
  def header
65
- header = String.new
65
+ header = "".b
66
66
  header << "Content-Disposition: form-data; #{parameters}#{CRLF}"
67
67
  header << "Content-Type: #{content_type}#{CRLF}" if content_type
68
68
  header << CRLF
@@ -9,7 +9,9 @@ module HTTP
9
9
  # @return [String]
10
10
  def to_s
11
11
  rewind
12
- read
12
+ content = read
13
+ rewind
14
+ content
13
15
  end
14
16
 
15
17
  # Reads and returns part of IO content.
@@ -3,6 +3,6 @@
3
3
  module HTTP
4
4
  module FormData
5
5
  # Gem version.
6
- VERSION = "2.0.0"
6
+ VERSION = "2.1.0"
7
7
  end
8
8
  end
@@ -65,6 +65,27 @@ RSpec.describe HTTP::FormData::CompositeIO do
65
65
  expect(composite_io.read(3, outbuf)).to eq nil
66
66
  expect(outbuf).to eq ""
67
67
  end
68
+
69
+ it "returns data in binary encoding" do
70
+ io = HTTP::FormData::CompositeIO.new(%w[Janko Marohnić])
71
+
72
+ expect(io.read(5).encoding).to eq Encoding::BINARY
73
+ expect(io.read(9).encoding).to eq Encoding::BINARY
74
+
75
+ io.rewind
76
+ expect(io.read.encoding).to eq Encoding::BINARY
77
+ expect(io.read.encoding).to eq Encoding::BINARY
78
+ end
79
+
80
+ it "reads data in bytes" do
81
+ emoji = "😃"
82
+ io = HTTP::FormData::CompositeIO.new([emoji])
83
+
84
+ expect(io.read(1)).to eq emoji.b[0]
85
+ expect(io.read(1)).to eq emoji.b[1]
86
+ expect(io.read(1)).to eq emoji.b[2]
87
+ expect(io.read(1)).to eq emoji.b[3]
88
+ end
68
89
  end
69
90
 
70
91
  describe "#rewind" do
@@ -2,10 +2,11 @@
2
2
  # coding: utf-8
3
3
 
4
4
  RSpec.describe HTTP::FormData::File do
5
- let(:opts) { nil }
5
+ let(:opts) { nil }
6
+ let(:form_file) { described_class.new(file, opts) }
6
7
 
7
8
  describe "#size" do
8
- subject { described_class.new(file, opts).size }
9
+ subject { form_file.size }
9
10
 
10
11
  context "when file given as a String" do
11
12
  let(:file) { fixture("the-http-gem.info").to_s }
@@ -30,32 +31,56 @@ RSpec.describe HTTP::FormData::File do
30
31
  end
31
32
 
32
33
  describe "#to_s" do
33
- subject { described_class.new(file, opts).to_s }
34
+ subject { form_file.to_s }
34
35
 
35
36
  context "when file given as a String" do
36
37
  let(:file) { fixture("the-http-gem.info").to_s }
37
38
  it { is_expected.to eq fixture("the-http-gem.info").read(:mode => "rb") }
39
+
40
+ it "rewinds content" do
41
+ content = form_file.read
42
+ expect(form_file.to_s).to eq content
43
+ expect(form_file.read).to eq content
44
+ end
38
45
  end
39
46
 
40
47
  context "when file given as a Pathname" do
41
48
  let(:file) { fixture("the-http-gem.info") }
42
49
  it { is_expected.to eq fixture("the-http-gem.info").read(:mode => "rb") }
50
+
51
+ it "rewinds content" do
52
+ content = form_file.read
53
+ expect(form_file.to_s).to eq content
54
+ expect(form_file.read).to eq content
55
+ end
43
56
  end
44
57
 
45
58
  context "when file given as File" do
46
59
  let(:file) { fixture("the-http-gem.info").open("rb") }
47
60
  after { file.close }
48
61
  it { is_expected.to eq fixture("the-http-gem.info").read(:mode => "rb") }
62
+
63
+ it "rewinds content" do
64
+ content = form_file.read
65
+ expect(form_file.to_s).to eq content
66
+ expect(form_file.read).to eq content
67
+ end
49
68
  end
50
69
 
51
70
  context "when file given as IO" do
52
71
  let(:file) { StringIO.new "привет мир!" }
53
72
  it { is_expected.to eq "привет мир!" }
73
+
74
+ it "rewinds content" do
75
+ content = form_file.read
76
+ expect(form_file.to_s).to eq content
77
+ expect(form_file.read).to eq content
78
+ end
54
79
  end
55
80
  end
56
81
 
57
82
  describe "#read" do
58
- subject { described_class.new(file, opts).read }
83
+ subject { form_file.read }
59
84
 
60
85
  context "when file given as a String" do
61
86
  let(:file) { fixture("the-http-gem.info").to_s }
@@ -80,15 +105,13 @@ RSpec.describe HTTP::FormData::File do
80
105
  end
81
106
 
82
107
  describe "#rewind" do
83
- subject { described_class.new(file, opts) }
84
-
85
108
  context "when file given as a String" do
86
109
  let(:file) { fixture("the-http-gem.info").to_s }
87
110
 
88
111
  it "rewinds the underlying IO object" do
89
- content = subject.read
90
- subject.rewind
91
- expect(subject.read).to eq content
112
+ content = form_file.read
113
+ form_file.rewind
114
+ expect(form_file.read).to eq content
92
115
  end
93
116
  end
94
117
 
@@ -96,9 +119,9 @@ RSpec.describe HTTP::FormData::File do
96
119
  let(:file) { fixture("the-http-gem.info") }
97
120
 
98
121
  it "rewinds the underlying IO object" do
99
- content = subject.read
100
- subject.rewind
101
- expect(subject.read).to eq content
122
+ content = form_file.read
123
+ form_file.rewind
124
+ expect(form_file.read).to eq content
102
125
  end
103
126
  end
104
127
 
@@ -107,9 +130,9 @@ RSpec.describe HTTP::FormData::File do
107
130
  after { file.close }
108
131
 
109
132
  it "rewinds the underlying IO object" do
110
- content = subject.read
111
- subject.rewind
112
- expect(subject.read).to eq content
133
+ content = form_file.read
134
+ form_file.rewind
135
+ expect(form_file.read).to eq content
113
136
  end
114
137
  end
115
138
 
@@ -117,15 +140,15 @@ RSpec.describe HTTP::FormData::File do
117
140
  let(:file) { StringIO.new "привет мир!" }
118
141
 
119
142
  it "rewinds the underlying IO object" do
120
- content = subject.read
121
- subject.rewind
122
- expect(subject.read).to eq content
143
+ content = form_file.read
144
+ form_file.rewind
145
+ expect(form_file.read).to eq content
123
146
  end
124
147
  end
125
148
  end
126
149
 
127
150
  describe "#filename" do
128
- subject { described_class.new(file, opts).filename }
151
+ subject { form_file.filename }
129
152
 
130
153
  context "when file given as a String" do
131
154
  let(:file) { fixture("the-http-gem.info").to_s }
@@ -174,7 +197,8 @@ RSpec.describe HTTP::FormData::File do
174
197
  end
175
198
 
176
199
  describe "#content_type" do
177
- subject { described_class.new(StringIO.new, opts).content_type }
200
+ let(:file) { StringIO.new }
201
+ subject { form_file.content_type }
178
202
 
179
203
  it { is_expected.to eq "application/octet-stream" }
180
204
 
@@ -30,6 +30,12 @@ RSpec.describe HTTP::FormData::Multipart do
30
30
  ].join("")
31
31
  end
32
32
 
33
+ it "rewinds content" do
34
+ content = form_data.read
35
+ expect(form_data.to_s).to eq content
36
+ expect(form_data.read).to eq content
37
+ end
38
+
33
39
  context "with user-defined boundary" do
34
40
  subject(:form_data) do
35
41
  HTTP::FormData::Multipart.new params, :boundary => "my-boundary"
@@ -20,6 +20,12 @@ RSpec.describe HTTP::FormData::Part do
20
20
  context "when body given as String" do
21
21
  let(:body) { "привет мир!" }
22
22
  it { is_expected.to eq "привет мир!" }
23
+
24
+ it "rewinds content" do
25
+ content = part.read
26
+ expect(part.to_s).to eq content
27
+ expect(part.read).to eq content
28
+ end
23
29
  end
24
30
  end
25
31
 
@@ -28,6 +28,12 @@ RSpec.describe HTTP::FormData::Urlencoded do
28
28
  let(:data) { { "foo[bar]" => "тест" } }
29
29
  it { is_expected.to eq "foo%5Bbar%5D=%D1%82%D0%B5%D1%81%D1%82" }
30
30
  end
31
+
32
+ it "rewinds content" do
33
+ content = form_data.read
34
+ expect(form_data.to_s).to eq content
35
+ expect(form_data.read).to eq content
36
+ end
31
37
  end
32
38
 
33
39
  describe "#size" do
data/spec/spec_helper.rb CHANGED
@@ -3,10 +3,10 @@
3
3
  require "simplecov"
4
4
  require "coveralls"
5
5
 
6
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
6
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
7
7
  SimpleCov::Formatter::HTMLFormatter,
8
8
  Coveralls::SimpleCov::Formatter
9
- ]
9
+ ])
10
10
 
11
11
  SimpleCov.start { add_filter "/spec/" }
12
12
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http-form_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksey V Zapparov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-01 00:00:00.000000000 Z
11
+ date: 2018-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,10 +84,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  version: '0'
85
85
  requirements: []
86
86
  rubyforge_project:
87
- rubygems_version: 2.6.13
87
+ rubygems_version: 2.7.1
88
88
  signing_key:
89
89
  specification_version: 4
90
- summary: http-form_data-2.0.0
90
+ summary: http-form_data-2.1.0
91
91
  test_files:
92
92
  - spec/fixtures/expected-multipart-body.tpl
93
93
  - spec/fixtures/the-http-gem.info