httmultiparty 0.1 → 0.2
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/httmultiparty.rb +35 -18
- data/lib/httmultiparty/multipartable.rb +1 -2
- data/lib/httmultiparty/version.rb +1 -1
- metadata +8 -7
- data/lib/httmultiparty/special_hash.rb +0 -8
data/lib/httmultiparty.rb
CHANGED
@@ -4,17 +4,48 @@ require 'httparty'
|
|
4
4
|
require 'net/http/post/multipart'
|
5
5
|
|
6
6
|
module HTTMultiParty
|
7
|
+
QUERY_STRING_NORMALIZER = Proc.new do |params|
|
8
|
+
HTTMultiParty.flatten_params(params).map do |(k,v)|
|
9
|
+
[k, v.is_a?(File) ? HTTMultiParty.file_to_upload_io(v) : v]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
7
13
|
def self.included(base)
|
8
14
|
base.send :include, HTTParty
|
9
15
|
base.extend ClassMethods
|
10
16
|
end
|
11
17
|
|
18
|
+
def self.file_to_upload_io(file)
|
19
|
+
filename = File.split(file.path).last
|
20
|
+
content_type = 'application/octet-stream'
|
21
|
+
UploadIO.new(file, content_type, filename)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.flatten_params(params={}, prefix='')
|
25
|
+
flattened = []
|
26
|
+
params.each do |(k,v)|
|
27
|
+
if params.is_a?(Array)
|
28
|
+
v = k
|
29
|
+
k = ""
|
30
|
+
end
|
31
|
+
|
32
|
+
flattened_key = prefix == "" ? "#{k}" : "#{prefix}[#{k}]"
|
33
|
+
if v.is_a?(Hash) || v.is_a?(Array)
|
34
|
+
flattened += flatten_params(v, flattened_key)
|
35
|
+
else
|
36
|
+
flattened << [flattened_key, v]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
flattened
|
40
|
+
end
|
41
|
+
|
12
42
|
module ClassMethods
|
13
43
|
def post(path, options={})
|
14
44
|
method = Net::HTTP::Post
|
15
45
|
if query_contains_files?(options[:query])
|
16
46
|
method = MultipartPost
|
17
|
-
options[:body] =
|
47
|
+
options[:body] = options.delete(:query)
|
48
|
+
options[:query_string_normalizer] = HTTMultiParty::QUERY_STRING_NORMALIZER
|
18
49
|
end
|
19
50
|
perform_request method, path, options
|
20
51
|
end
|
@@ -23,34 +54,20 @@ module HTTMultiParty
|
|
23
54
|
method = Net::HTTP::Put
|
24
55
|
if query_contains_files?(options[:query])
|
25
56
|
method = MultipartPut
|
26
|
-
options[:body] =
|
57
|
+
options[:body] = options.delete(:query)
|
58
|
+
options[:query_string_normalizer] = HTTMultiParty::QUERY_STRING_NORMALIZER
|
27
59
|
end
|
28
60
|
perform_request method, path, options
|
29
61
|
end
|
30
62
|
|
31
63
|
private
|
32
64
|
def query_contains_files?(query)
|
33
|
-
query.is_a?(Hash) && query.select { |k,v| v.is_a?(File) }.length > 0
|
34
|
-
end
|
35
|
-
|
36
|
-
def map_files_to_upload_io(hash)
|
37
|
-
new_special_hash = SpecialHash.new
|
38
|
-
hash.each do |k,v|
|
39
|
-
new_special_hash[k] = v.is_a?(File) ? file_to_upload_io(v) : v
|
40
|
-
end
|
41
|
-
new_special_hash
|
42
|
-
end
|
43
|
-
|
44
|
-
def file_to_upload_io(file)
|
45
|
-
filename = File.split(file.path).last
|
46
|
-
content_type = 'application/octet-stream'
|
47
|
-
UploadIO.new(file, content_type, filename)
|
65
|
+
query.is_a?(Hash) && query.select { |k,v| v.is_a?(Hash) ? query_contains_files?(v) : v.is_a?(File) }.length > 0
|
48
66
|
end
|
49
67
|
end
|
50
68
|
end
|
51
69
|
|
52
70
|
dir = Pathname(__FILE__).dirname.expand_path
|
53
71
|
require dir + 'httmultiparty/multipartable'
|
54
|
-
require dir + 'httmultiparty/special_hash'
|
55
72
|
require dir + 'httmultiparty/multipart_post'
|
56
73
|
require dir + 'httmultiparty/multipart_put'
|
@@ -6,9 +6,8 @@ module HTTMultiParty::Multipartable
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def body=(value)
|
9
|
-
raise RuntimeError.new('body needs to be a SpecialHash') unless value.is_a?(HTTMultiParty::SpecialHash)
|
10
9
|
boundary = DEFAULT_BOUNDARY
|
11
|
-
parts = value.map {|k,v| Parts::Part.new(boundary, k, v)}
|
10
|
+
parts = value.map {|(k,v)| Parts::Part.new(boundary, k, v)}
|
12
11
|
parts << Parts::EpiloguePart.new(boundary)
|
13
12
|
self.set_content_type("multipart/form-data", { "boundary" => boundary })
|
14
13
|
self.content_length = parts.inject(0) {|sum,i| sum + i.length }
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httmultiparty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Johannes Wagener
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-25 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -25,10 +25,12 @@ dependencies:
|
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 5
|
29
29
|
segments:
|
30
30
|
- 0
|
31
|
-
|
31
|
+
- 7
|
32
|
+
- 3
|
33
|
+
version: 0.7.3
|
32
34
|
type: :runtime
|
33
35
|
version_requirements: *id001
|
34
36
|
- !ruby/object:Gem::Dependency
|
@@ -86,7 +88,6 @@ files:
|
|
86
88
|
- lib/httmultiparty/multipart_post.rb
|
87
89
|
- lib/httmultiparty/multipart_put.rb
|
88
90
|
- lib/httmultiparty/multipartable.rb
|
89
|
-
- lib/httmultiparty/special_hash.rb
|
90
91
|
- lib/httmultiparty/version.rb
|
91
92
|
- lib/httmultiparty.rb
|
92
93
|
- README.md
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# SpecialHash is a hash that is pretending to be not a Hash.
|
2
|
-
# its just a cheap way to get around the query normalization
|
3
|
-
# happening in HTTParty::Request#body in lib/httparty/request.rb:118
|
4
|
-
class HTTMultiParty::SpecialHash < Hash
|
5
|
-
def is_a?(klass)
|
6
|
-
klass == ::Hash ? false : super
|
7
|
-
end
|
8
|
-
end
|