http-form_data 1.0.1 → 1.0.2

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
2
  SHA1:
3
- metadata.gz: 788affbb0d574fec16562406b9301be14de53a72
4
- data.tar.gz: c0c571ab8fec7eeacad188170c4c373cc2195146
3
+ metadata.gz: f646dc5084304effdd12a91b73151a0ee750db06
4
+ data.tar.gz: 3514cd9ed1b7c91df984c26dc586d1882ad8196d
5
5
  SHA512:
6
- metadata.gz: 6d9de3b49d6e6ecab67b1d504c1d7e9e987d3e80b8e057f567f375f1068eb6c6734dd17ee756ce77a653abd641a053c444e70556a40cdf3dd83001096867446e
7
- data.tar.gz: 7c35c3aa828a47f988ecfa4a817c86c5b1b1a535fe3ea2467c9c588c8101c4df43d54c56374a6a6a06ffdd4e828a63c67232cb0098f10e5bc6e2a792f16b7754
6
+ metadata.gz: 3faf8f17dc3f2a25997de4e9014009f706e336ab9f6948ec729a65dd2d6a71d4721e5d56d4e9f53e2f28827219c72ecda5213de18a05b30314e1bc9bf24b22ba
7
+ data.tar.gz: aa5d4520dfe7a3febf86c6fdcc33db318d7a40089545c86380d65f341c181dcdb2359af5d33e48d45960ba5fc52558550fcfaa7e56435eba474418827b54e546
data/.rubocop.yml CHANGED
@@ -1,3 +1,18 @@
1
+ AllCops:
2
+ DisplayCopNames: true
3
+ TargetRubyVersion: 2.4
4
+
5
+ ## Metrics #####################################################################
6
+
7
+ Metrics/BlockLength:
8
+ Exclude:
9
+ - "Guardfile"
10
+ - "spec/**/*"
11
+
12
+ Metrics/MethodLength:
13
+ CountComments: false
14
+ Max: 15
15
+
1
16
  ## Styles ######################################################################
2
17
 
3
18
  Style/AlignParameters:
@@ -6,12 +21,6 @@ Style/AlignParameters:
6
21
  Style/BracesAroundHashParameters:
7
22
  Enabled: false
8
23
 
9
- # Broken (2014-12-15). Use `yardstick` gem instead.
10
- # See: https://github.com/bbatsov/rubocop/issues/947
11
- # TODO: Enable back once cop is fixed.
12
- Style/Documentation:
13
- Enabled: false
14
-
15
24
  Style/EmptyLineBetweenDefs:
16
25
  AllowAdjacentOneLineDefs: true
17
26
 
@@ -31,18 +40,12 @@ Style/Lambda:
31
40
  Style/MultilineOperationIndentation:
32
41
  EnforcedStyle: indented
33
42
 
34
- # A bit useless restriction, that makes impossible aligning code like this:
35
- #
36
- # redis do |conn|
37
- # conn.hset :k1, now
38
- # conn.hincrby :k2, 123
39
- # end
40
- SingleSpaceBeforeFirstArg:
41
- Enabled: false
42
-
43
43
  Style/StringLiterals:
44
44
  EnforcedStyle: double_quotes
45
45
 
46
+ Style/EmptyCaseCondition:
47
+ Enabled: false
48
+
46
49
  # Not all trivial readers/writers can be defined with attr_* methods
47
50
  #
48
51
  # class Example < SimpleDelegator
@@ -56,9 +59,3 @@ Style/StringLiterals:
56
59
  # end
57
60
  Style/TrivialAccessors:
58
61
  Enabled: false
59
-
60
- ## Metrics #####################################################################
61
-
62
- Metrics/MethodLength:
63
- CountComments: false
64
- Max: 15
data/.travis.yml CHANGED
@@ -1,20 +1,33 @@
1
- bundler_args: --without development doc
2
- env:
3
- global:
4
- - JRUBY_OPTS="$JRUBY_OPTS --debug"
5
1
  language: ruby
2
+ sudo: false
3
+
4
+ before_install:
5
+ - gem update --system
6
+ - gem --version
7
+ - gem install bundler --no-rdoc --no-ri
8
+ - bundle --version
9
+
10
+ install: bundle install --without development doc
11
+
12
+ script: bundle exec rake
13
+
14
+ env: JRUBY_OPTS="$JRUBY_OPTS --debug"
15
+
6
16
  rvm:
7
- - 1.9.3
17
+ # Include JRuby first because it takes the longest
18
+ - jruby-9.1.8.0
8
19
  - 2.0.0
9
20
  - 2.1
10
21
  - 2.2
11
- - jruby-19mode
12
- - jruby-head
13
- - rbx-2
14
- - ruby-head
22
+ - 2.3.4
23
+ - 2.4.1
24
+
15
25
  matrix:
16
- allow_failures:
17
- - rvm: jruby-head
18
- - rvm: ruby-head
19
26
  fast_finish: true
20
- sudo: false
27
+ include:
28
+ - rvm: 2.4.1
29
+ env: SUITE="rubocop"
30
+
31
+ branches:
32
+ only:
33
+ - master
data/CHANGES.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 1.0.2 (2017-05-08)
2
+
3
+ * [#5](https://github.com/httprb/form_data.rb/issues/5)
4
+ Allow setting Content-Type non-file parts
5
+ [@abotalov]
6
+
7
+ * [#6](https://github.com/httprb/form_data.rb/issues/6)
8
+ Creation of file parts without filename
9
+ [@abotalov]
10
+
11
+ * [#11](https://github.com/httprb/form_data.rb/pull/11)
12
+ Deprecate `HTTP::FormData::File#mime_type`. Use `#content_type` instead.
13
+ [@ixti]
14
+
15
+
1
16
  ## 1.0.1 (2015-03-31)
2
17
 
3
18
  * Fix usage of URI module.
@@ -18,3 +33,6 @@
18
33
  ## 0.0.1 (2014-12-15)
19
34
 
20
35
  * First release ever!
36
+
37
+ [@ixti] https://github.com/ixti
38
+ [@abotalov] https://github.com/abotalov
data/Gemfile CHANGED
@@ -1,23 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gem "rake"
4
6
 
5
7
  group :development do
6
- gem "pry"
7
8
  gem "guard"
8
9
  gem "guard-rspec", :require => false
10
+ gem "pry"
9
11
  end
10
12
 
11
13
  group :test do
12
14
  gem "coveralls"
13
15
  gem "rspec", "~> 3.1"
16
+ gem "rubocop", "= 0.48.1"
14
17
  gem "simplecov", ">= 0.9"
15
- gem "rubocop", "~> 0.28.0"
16
18
  end
17
19
 
18
20
  group :doc do
19
- gem "yard"
20
21
  gem "redcarpet"
22
+ gem "yard"
21
23
  end
22
24
 
23
25
  # Specify your gem's dependencies in form_data.gemspec
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  guard :rspec, :cmd => "bundle exec rspec" do
2
4
  require "guard/rspec/dsl"
3
5
  dsl = Guard::RSpec::Dsl.new(self)
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015 Aleksey V Zapparov
1
+ Copyright (c) 2015-2017 Alexey V Zapparov
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -44,16 +44,25 @@ socket << "\r\n"
44
44
  socket << form.to_s
45
45
  ```
46
46
 
47
+ It's also possible to create a non-file part with Content-Type:
48
+
49
+ ``` ruby
50
+ form = HTTP::FormData.create({
51
+ :username => HTTP::FormData::Part.new('{"a": 1}', content_type: 'application/json'),
52
+ :avatar_file => HTTP::FormData::File.new("/home/ixti/avatar.png")
53
+ })
54
+ ```
47
55
 
48
56
  ## Supported Ruby Versions
49
57
 
50
58
  This library aims to support and is [tested against][ci] the following Ruby
51
59
  versions:
52
60
 
53
- * Ruby 1.9.3
54
- * Ruby 2.0.0
55
61
  * Ruby 2.1.x
56
62
  * Ruby 2.2.x
63
+ * Ruby 2.3.x
64
+ * Ruby 2.4.x
65
+ * JRuby 9.1.x.x
57
66
 
58
67
  If something doesn't work on one of these versions, it's a bug.
59
68
 
@@ -80,7 +89,7 @@ dropped.
80
89
 
81
90
  ## Copyright
82
91
 
83
- Copyright (c) 2015 Aleksey V Zapparov.
92
+ Copyright (c) 2015-2017 Alexey V Zapparov.
84
93
  See [LICENSE.txt][license] for further details.
85
94
 
86
95
 
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env rake
1
+ # frozen_string_literal: true
2
2
 
3
3
  require "bundler/gem_tasks"
4
4
 
@@ -14,4 +14,11 @@ rescue LoadError
14
14
  end
15
15
  end
16
16
 
17
- task :default => [:spec, :rubocop]
17
+ if ENV["CI"].nil?
18
+ task :default => %i[spec rubocop]
19
+ else
20
+ case ENV["SUITE"]
21
+ when "rubocop" then task :default => :rubocop
22
+ else task :default => :spec
23
+ end
24
+ end
data/appveyor.yml ADDED
@@ -0,0 +1,8 @@
1
+ version: "#{build}"
2
+ build: off
3
+ install:
4
+ - set PATH=C:\Ruby23\bin;%PATH%
5
+ - bundle install
6
+ test_script:
7
+ - bundle exec rake
8
+ skip_tags: true
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require "http/form_data/version"
@@ -11,15 +12,15 @@ Gem::Specification.new do |spec|
11
12
  spec.email = ["ixti@member.fsf.org"]
12
13
  spec.license = "MIT"
13
14
  spec.summary = "http-form_data-#{HTTP::FormData::VERSION}"
14
- spec.description = <<-DESC.gsub(/^\s+> /m, "").gsub("\n", " ").strip
15
+ spec.description = <<-DESC.gsub(/^\s+> /m, "").tr("\n", " ").strip
15
16
  > Utility-belt to build form data request bodies.
16
17
  > Provides support for `application/x-www-form-urlencoded` and
17
18
  > `multipart/form-data` types.
18
19
  DESC
19
20
 
20
21
  spec.files = `git ls-files -z`.split("\x0")
21
- spec.executables = spec.files.grep(/^bin\//).map { |f| File.basename(f) }
22
- spec.test_files = spec.files.grep(/^(test|spec|features)\//)
22
+ spec.executables = spec.files.grep(%r{^bin\/}).map { |f| File.basename(f) }
23
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)\/})
23
24
  spec.require_paths = ["lib"]
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.7"
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "http/form_data/part"
1
4
  require "http/form_data/file"
2
5
  require "http/form_data/multipart"
3
6
  require "http/form_data/urlencoded"
4
7
  require "http/form_data/version"
5
8
 
6
- # http.rb namespace.
7
- # @see https://github.com/httprb/http.rb
9
+ # http gem namespace.
10
+ # @see https://github.com/httprb/http
8
11
  module HTTP
9
12
  # Utility-belt to build form data request bodies.
10
13
  # Provides support for `application/x-www-form-urlencoded` and
@@ -26,7 +29,7 @@ module HTTP
26
29
  # socket << form.to_s
27
30
  module FormData
28
31
  # CRLF
29
- CRLF = "\r\n".freeze
32
+ CRLF = "\r\n"
30
33
 
31
34
  # Generic FormData error.
32
35
  class Error < StandardError; end
@@ -55,7 +58,7 @@ module HTTP
55
58
  when obj.nil? then {}
56
59
  when obj.is_a?(Hash) then obj
57
60
  when obj.respond_to?(:to_h) then obj.to_h
58
- else fail Error, "#{obj.inspect} is neither Hash nor responds to :to_h"
61
+ else raise Error, "#{obj.inspect} is neither Hash nor responds to :to_h"
59
62
  end
60
63
  end
61
64
 
@@ -67,8 +70,8 @@ module HTTP
67
70
  # @return [Boolean]
68
71
  def multipart?(data)
69
72
  data.any? do |_, v|
70
- next true if v.is_a? FormData::File
71
- v.respond_to?(:to_ary) && v.to_ary.any? { |e| e.is_a? FormData::File }
73
+ next true if v.is_a? FormData::Part
74
+ v.respond_to?(:to_ary) && v.to_ary.any? { |e| e.is_a? FormData::Part }
72
75
  end
73
76
  end
74
77
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HTTP
2
4
  module FormData
3
5
  # Represents file form param.
@@ -16,27 +18,33 @@ module HTTP
16
18
  # @example Usage with pathname
17
19
  #
18
20
  # FormData::File.new "/home/ixti/avatar.png"
19
- class File
21
+ class File < Part
20
22
  # Default MIME type
21
- DEFAULT_MIME = "application/octet-stream".freeze
23
+ DEFAULT_MIME = "application/octet-stream"
22
24
 
23
- attr_reader :mime_type, :filename
25
+ # @deprecated Use #content_type instead
26
+ alias mime_type content_type
24
27
 
25
28
  # @see DEFAULT_MIME
26
29
  # @param [String, StringIO, File] file_or_io Filename or IO instance.
27
30
  # @param [#to_h] opts
28
- # @option opts [#to_s] :mime_type (DEFAULT_MIME)
31
+ # @option opts [#to_s] :content_type (DEFAULT_MIME)
32
+ # Value of Content-Type header
29
33
  # @option opts [#to_s] :filename
30
34
  # When `file` is a String, defaults to basename of `file`.
31
35
  # When `file` is a File, defaults to basename of `file`.
32
36
  # When `file` is a StringIO, defaults to `"stream-{object_id}"`
33
37
  def initialize(file_or_io, opts = {})
34
- @file_or_io = file_or_io
38
+ opts = FormData.ensure_hash(opts)
35
39
 
36
- opts = FormData.ensure_hash opts
40
+ if opts.key? :mime_type
41
+ warn "[DEPRECATED] :mime_type option deprecated, use :content_type"
42
+ opts[:content_type] = opts[:mime_type]
43
+ end
37
44
 
38
- @mime_type = opts.fetch(:mime_type) { DEFAULT_MIME }
39
- @filename = opts.fetch :filename do
45
+ @file_or_io = file_or_io
46
+ @content_type = opts.fetch(:content_type, DEFAULT_MIME).to_s
47
+ @filename = opts.fetch :filename do
40
48
  case file_or_io
41
49
  when String then ::File.basename file_or_io
42
50
  when ::File then ::File.basename file_or_io.path
@@ -47,7 +55,7 @@ module HTTP
47
55
 
48
56
  # Returns content size.
49
57
  #
50
- # @return [Fixnum]
58
+ # @return [Integer]
51
59
  def size
52
60
  with_io(&:size)
53
61
  end
@@ -67,7 +75,7 @@ module HTTP
67
75
  if @file_or_io.is_a?(::File) || @file_or_io.is_a?(StringIO)
68
76
  yield @file_or_io
69
77
  else
70
- ::File.open(@file_or_io) { |io| yield io }
78
+ ::File.open(@file_or_io, "rb") { |io| yield io }
71
79
  end
72
80
  end
73
81
  end
@@ -1,7 +1,7 @@
1
- # stdlib
1
+ # frozen_string_literal: true
2
+
2
3
  require "securerandom"
3
4
 
4
- # internal
5
5
  require "http/form_data/multipart/param"
6
6
 
7
7
  module HTTP
@@ -11,7 +11,7 @@ module HTTP
11
11
  # @param [#to_h, Hash] data form data key-value Hash
12
12
  def initialize(data)
13
13
  @parts = Param.coerce FormData.ensure_hash data
14
- @boundary = ("-" * 21) << SecureRandom.hex(21)
14
+ @boundary = (Array.new(21, "-") << SecureRandom.hex(21)).join("")
15
15
  @content_length = nil
16
16
  end
17
17
 
@@ -32,7 +32,7 @@ module HTTP
32
32
  # Returns form data content size to be used for HTTP request
33
33
  # `Content-Length` header.
34
34
  #
35
- # @return [Fixnum]
35
+ # @return [Integer]
36
36
  def content_length
37
37
  unless @content_length
38
38
  @content_length = head.bytesize + tail.bytesize
@@ -1,20 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HTTP
2
4
  module FormData
3
5
  class Multipart
4
6
  # Utility class to represent multi-part chunks
5
7
  class Param
6
8
  # @param [#to_s] name
7
- # @param [FormData::File, #to_s] value
9
+ # @param [FormData::File, FormData::Part, #to_s] value
8
10
  def initialize(name, value)
9
- @name, @value = name.to_s, value
11
+ @name = name.to_s
12
+
13
+ @part =
14
+ if value.is_a?(FormData::Part)
15
+ value
16
+ else
17
+ FormData::Part.new(value)
18
+ end
10
19
 
11
- @header = "Content-Disposition: form-data; name=#{@name.inspect}"
20
+ parameters = { :name => @name }
21
+ parameters[:filename] = @part.filename if @part.filename
22
+ parameters = parameters.map { |k, v| "#{k}=#{v.inspect}" }.join("; ")
12
23
 
13
- return unless file?
24
+ @header = "Content-Disposition: form-data; #{parameters}"
14
25
 
15
- @header << "; filename=#{value.filename.inspect}"
16
- @header << CRLF
17
- @header << "Content-Type: #{value.mime_type}"
26
+ return unless @part.content_type
27
+
28
+ @header += "#{CRLF}Content-Type: #{@part.content_type}"
18
29
  end
19
30
 
20
31
  # Returns body part with headers and data.
@@ -34,20 +45,14 @@ module HTTP
34
45
  #
35
46
  # @return [String]
36
47
  def to_s
37
- "#{@header}#{CRLF * 2}#{@value}"
48
+ "#{@header}#{CRLF * 2}#{@part}"
38
49
  end
39
50
 
40
51
  # Calculates size of a part (headers + body).
41
52
  #
42
- # @return [Fixnum]
53
+ # @return [Integer]
43
54
  def size
44
- size = @header.bytesize + (CRLF.bytesize * 2)
45
-
46
- if file?
47
- size + @value.size
48
- else
49
- size + @value.to_s.bytesize
50
- end
55
+ @header.bytesize + (CRLF.bytesize * 2) + @part.size
51
56
  end
52
57
 
53
58
  # Flattens given `data` Hash into an array of `Param`'s.
@@ -67,15 +72,6 @@ module HTTP
67
72
 
68
73
  params
69
74
  end
70
-
71
- private
72
-
73
- # Tells whenever value is a {FormData::File} or not.
74
- #
75
- # @return [Boolean]
76
- def file?
77
- @value.is_a? FormData::File
78
- end
79
75
  end
80
76
  end
81
77
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HTTP
4
+ module FormData
5
+ # Represents a body part of multipart/form-data request.
6
+ #
7
+ # @example Usage with String
8
+ #
9
+ # body = "Message"
10
+ # FormData::Part.new body, :content_type => 'foobar.txt; charset="UTF-8"'
11
+ class Part
12
+ attr_reader :content_type, :filename
13
+
14
+ # @param [#to_s] body
15
+ # @param [String] content_type Value of Content-Type header
16
+ # @param [String] filename Value of filename parameter
17
+ def initialize(body, content_type: nil, filename: nil)
18
+ @body = body.to_s
19
+ @content_type = content_type
20
+ @filename = filename
21
+ end
22
+
23
+ # Returns content size.
24
+ #
25
+ # @return [Integer]
26
+ def size
27
+ @body.bytesize
28
+ end
29
+
30
+ # Returns content of a file of IO.
31
+ #
32
+ # @return [String]
33
+ def to_s
34
+ @body
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "uri"
2
4
 
3
5
  module HTTP
@@ -26,7 +28,7 @@ module HTTP
26
28
  # Returns form data content size to be used for HTTP request
27
29
  # `Content-Length` header.
28
30
  #
29
- # @return [Fixnum]
31
+ # @return [Integer]
30
32
  def content_length
31
33
  to_s.bytesize
32
34
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HTTP
2
4
  module FormData
3
5
  # Gem version.
4
- VERSION = "1.0.1"
6
+ VERSION = "1.0.2"
5
7
  end
6
8
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # coding: utf-8
2
3
 
3
4
  RSpec.describe HTTP::FormData::File do
@@ -28,7 +29,7 @@ RSpec.describe HTTP::FormData::File do
28
29
 
29
30
  context "when file given as a String" do
30
31
  let(:file) { fixture("the-http-gem.info").to_s }
31
- it { is_expected.to eq fixture("the-http-gem.info").read }
32
+ it { is_expected.to eq fixture("the-http-gem.info").read(:mode => "rb") }
32
33
  end
33
34
 
34
35
  context "when file given as StringIO" do
@@ -37,9 +38,9 @@ RSpec.describe HTTP::FormData::File do
37
38
  end
38
39
 
39
40
  context "when file given as File" do
40
- let(:file) { fixture("the-http-gem.info").open }
41
+ let(:file) { fixture("the-http-gem.info").open("rb") }
41
42
  after { file.close }
42
- it { is_expected.to eq fixture("the-http-gem.info").read }
43
+ it { is_expected.to eq fixture("the-http-gem.info").read(:mode => "rb") }
43
44
  end
44
45
  end
45
46
 
@@ -81,14 +82,21 @@ RSpec.describe HTTP::FormData::File do
81
82
  end
82
83
  end
83
84
 
84
- describe "#mime_type" do
85
- subject { described_class.new(StringIO.new, opts).mime_type }
85
+ describe "#content_type" do
86
+ subject { described_class.new(StringIO.new, opts).content_type }
86
87
 
87
88
  it { is_expected.to eq "application/octet-stream" }
88
89
 
89
90
  context "when it was given with options" do
90
- let(:opts) { { :mime_type => "application/json" } }
91
+ let(:opts) { { :content_type => "application/json" } }
91
92
  it { is_expected.to eq "application/json" }
92
93
  end
93
94
  end
95
+
96
+ describe "#mime_type" do
97
+ it "should be an alias of #content_type" do
98
+ expect(described_class.instance_method(:mime_type))
99
+ .to eq(described_class.instance_method(:content_type))
100
+ end
101
+ end
94
102
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe HTTP::FormData::Multipart do
2
4
  let(:file) { HTTP::FormData::File.new fixture "the-http-gem.info" }
3
5
  let(:params) { { :foo => :bar, :baz => file } }
@@ -6,7 +8,10 @@ RSpec.describe HTTP::FormData::Multipart do
6
8
 
7
9
  describe "#content_type" do
8
10
  subject { form_data.content_type }
9
- it { is_expected.to match(/^multipart\/form-data; boundary=#{boundary}$/) }
11
+
12
+ let(:content_type) { %r{^multipart\/form-data; boundary=#{boundary}$} }
13
+
14
+ it { is_expected.to match(content_type) }
10
15
  end
11
16
 
12
17
  describe "#content_length" do
@@ -36,5 +41,21 @@ RSpec.describe HTTP::FormData::Multipart do
36
41
  "--#{boundary_value}--"
37
42
  ].join("")
38
43
  end
44
+
45
+ context "with filename set to nil" do
46
+ let(:part) { HTTP::FormData::Part.new("s", :filename => nil) }
47
+ let(:form_data) { HTTP::FormData::Multipart.new(:foo => part) }
48
+
49
+ it "doesn't include a filename" do
50
+ boundary_value = form_data.content_type[/(#{boundary})$/, 1]
51
+
52
+ expect(form_data.to_s).to eq [
53
+ "--#{boundary_value}#{crlf}",
54
+ "#{disposition 'name' => 'foo'}#{crlf}",
55
+ "#{crlf}s#{crlf}",
56
+ "--#{boundary_value}--"
57
+ ].join("")
58
+ end
59
+ end
39
60
  end
40
61
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe HTTP::FormData::Part do
4
+ let(:body) { "" }
5
+ let(:opts) { {} }
6
+
7
+ describe "#size" do
8
+ subject { described_class.new(body, opts).size }
9
+
10
+ context "when body given as a String" do
11
+ let(:body) { "привет мир!" }
12
+ it { is_expected.to eq 20 }
13
+ end
14
+ end
15
+
16
+ describe "#to_s" do
17
+ subject { described_class.new(body, opts).to_s }
18
+
19
+ context "when body given as String" do
20
+ let(:body) { "привет мир!" }
21
+ it { is_expected.to eq "привет мир!" }
22
+ end
23
+ end
24
+
25
+ describe "#filename" do
26
+ subject { described_class.new(body, opts).filename }
27
+
28
+ it { is_expected.to eq nil }
29
+
30
+ context "when it was given with options" do
31
+ let(:opts) { { :filename => "foobar.txt" } }
32
+ it { is_expected.to eq "foobar.txt" }
33
+ end
34
+ end
35
+
36
+ describe "#content_type" do
37
+ subject { described_class.new(body, opts).content_type }
38
+
39
+ it { is_expected.to eq nil }
40
+
41
+ context "when it was given with options" do
42
+ let(:opts) { { :content_type => "application/json" } }
43
+ it { is_expected.to eq "application/json" }
44
+ end
45
+ end
46
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # coding: utf-8
2
3
 
3
4
  RSpec.describe HTTP::FormData::Urlencoded do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe HTTP::FormData do
2
4
  describe ".create" do
3
5
  subject { HTTP::FormData.create params }
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require "simplecov"
4
4
  require "coveralls"
@@ -1,4 +1,4 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require "pathname"
4
4
 
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: 1.0.1
4
+ version: 1.0.2
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: 2015-03-31 00:00:00.000000000 Z
11
+ date: 2017-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -43,17 +43,20 @@ files:
43
43
  - LICENSE.txt
44
44
  - README.md
45
45
  - Rakefile
46
+ - appveyor.yml
46
47
  - http-form_data.gemspec
47
48
  - lib/http/form_data.rb
48
49
  - lib/http/form_data/file.rb
49
50
  - lib/http/form_data/multipart.rb
50
51
  - lib/http/form_data/multipart/param.rb
52
+ - lib/http/form_data/part.rb
51
53
  - lib/http/form_data/urlencoded.rb
52
54
  - lib/http/form_data/version.rb
53
55
  - spec/fixtures/expected-multipart-body.tpl
54
56
  - spec/fixtures/the-http-gem.info
55
57
  - spec/lib/http/form_data/file_spec.rb
56
58
  - spec/lib/http/form_data/multipart_spec.rb
59
+ - spec/lib/http/form_data/part_spec.rb
57
60
  - spec/lib/http/form_data/urlencoded_spec.rb
58
61
  - spec/lib/http/form_data_spec.rb
59
62
  - spec/spec_helper.rb
@@ -78,17 +81,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
81
  version: '0'
79
82
  requirements: []
80
83
  rubyforge_project:
81
- rubygems_version: 2.2.2
84
+ rubygems_version: 2.6.11
82
85
  signing_key:
83
86
  specification_version: 4
84
- summary: http-form_data-1.0.1
87
+ summary: http-form_data-1.0.2
85
88
  test_files:
86
89
  - spec/fixtures/expected-multipart-body.tpl
87
90
  - spec/fixtures/the-http-gem.info
88
91
  - spec/lib/http/form_data/file_spec.rb
89
92
  - spec/lib/http/form_data/multipart_spec.rb
93
+ - spec/lib/http/form_data/part_spec.rb
90
94
  - spec/lib/http/form_data/urlencoded_spec.rb
91
95
  - spec/lib/http/form_data_spec.rb
92
96
  - spec/spec_helper.rb
93
97
  - spec/support/fixtures_helper.rb
94
- has_rdoc: