addressable-rest 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,5 @@
1
1
  require "addressable/rest/version"
2
+ require "addressable/rest/to_query" unless {}.respond_to?(:to_query)
2
3
  require "addressable/uri"
3
4
  require "net/http"
4
5
  require "multi_json"
@@ -15,6 +16,17 @@ module Addressable
15
16
  decode_options[:symbolize_keys] = true if options[:symbolize_keys]
16
17
  MultiJson.decode(response.body, decode_options)
17
18
  end
19
+
20
+ def post(data, options = {})
21
+ url = dup.normalize
22
+ response = Net::HTTP.start(url.host, url.port) do |request|
23
+ request.post(url.request_uri, data.to_query)
24
+ end
25
+
26
+ decode_options = {}
27
+ decode_options[:symbolize_keys] = true if options[:symbolize_keys]
28
+ MultiJson.decode(response.body, decode_options)
29
+ end
18
30
  end
19
31
  end
20
32
 
@@ -0,0 +1,83 @@
1
+ unless {}.respond_to?(:to_query)
2
+ class Object
3
+ # Alias of <tt>to_s</tt>.
4
+ def to_param
5
+ to_s
6
+ end
7
+ end
8
+
9
+ class NilClass
10
+ def to_param
11
+ self
12
+ end
13
+ end
14
+
15
+ class TrueClass
16
+ def to_param
17
+ self
18
+ end
19
+ end
20
+
21
+ class FalseClass
22
+ def to_param
23
+ self
24
+ end
25
+ end
26
+
27
+ class Array
28
+ # Calls <tt>to_param</tt> on all its elements and joins the result with
29
+ # slashes. This is used by <tt>url_for</tt> in Action Pack.
30
+ def to_param
31
+ collect { |e| e.to_param }.join '/'
32
+ end
33
+ end
34
+
35
+ class Hash
36
+ # Returns a string representation of the receiver suitable for use as a URL
37
+ # query string:
38
+ #
39
+ # {:name => 'David', :nationality => 'Danish'}.to_param
40
+ # # => "name=David&nationality=Danish"
41
+ #
42
+ # An optional namespace can be passed to enclose the param names:
43
+ #
44
+ # {:name => 'David', :nationality => 'Danish'}.to_param('user')
45
+ # # => "user[name]=David&user[nationality]=Danish"
46
+ #
47
+ # The string pairs "key=value" that conform the query string
48
+ # are sorted lexicographically in ascending order.
49
+ #
50
+ # This method is also aliased as +to_query+.
51
+ def to_param(namespace = nil)
52
+ collect do |key, value|
53
+ value.to_query(namespace ? "#{namespace}[#{key}]" : key)
54
+ end.sort * '&'
55
+ end
56
+ end
57
+
58
+ class Object
59
+ # Converts an object into a string suitable for use as a URL query string, using the given <tt>key</tt> as the
60
+ # param name.
61
+ #
62
+ # Note: This method is defined as a default implementation for all Objects for Hash#to_query to work.
63
+ def to_query(key)
64
+ require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
65
+ "#{CGI.escape(key.to_s)}=#{CGI.escape(to_param.to_s)}"
66
+ end
67
+ end
68
+
69
+ class Array
70
+ # Converts an array into a string suitable for use as a URL query string,
71
+ # using the given +key+ as the param name.
72
+ #
73
+ # ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding"
74
+ def to_query(key)
75
+ prefix = "#{key}[]"
76
+ collect { |value| value.to_query(prefix) }.join '&'
77
+ end
78
+ end
79
+
80
+ class Hash
81
+ alias_method :to_query, :to_param
82
+ end
83
+ end
@@ -1,5 +1,5 @@
1
1
  module Addressable
2
2
  module Rest
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -1,18 +1,30 @@
1
1
  require "teststrap"
2
2
 
3
3
  context Addressable::Rest do
4
- helper(:uri) { Addressable::URI.parse("http://example.com/test_get") }
4
+ helper(:uri) { Addressable::URI.parse("http://example.com") }
5
5
 
6
6
  setup { uri }
7
7
  asserts_topic.respond_to(:get)
8
+ asserts_topic.respond_to(:post)
8
9
 
9
10
  context "#get" do
10
- setup { uri.get }
11
+ setup { uri.join("/test_get").get }
11
12
  asserts_topic.kind_of(Hash)
12
13
  asserts("success key") { topic["success"] }.equals(true)
13
14
 
14
15
  context "with :symbolize_keys as true" do
15
- setup { uri.get(:symbolize_keys => true) }
16
+ setup { uri.join("/test_get").get(:symbolize_keys => true) }
17
+ asserts("success key") { topic[:success] }.equals(true)
18
+ end
19
+ end
20
+
21
+ context "#post" do
22
+ setup { uri.join("/test_post").post(:param => 1) }
23
+ asserts_topic.kind_of(Hash)
24
+ asserts("success key") { topic["success"] }.equals(true)
25
+
26
+ context "with :symbolize_keys as true" do
27
+ setup { uri.join("/test_post").post({ :param => 1 }, :symbolize_keys => true) }
16
28
  asserts("success key") { topic[:success] }.equals(true)
17
29
  end
18
30
  end
data/test/teststrap.rb CHANGED
@@ -4,4 +4,6 @@ require "yajl"
4
4
  require "fakeweb"
5
5
  require "riot"
6
6
 
7
+ FakeWeb.allow_net_connect = false
7
8
  FakeWeb.register_uri(:get, "http://example.com/test_get", :body => "{\"success\":true}")
9
+ FakeWeb.register_uri(:post, "http://example.com/test_post", :body => "{\"success\":true}")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: addressable-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-11 00:00:00.000000000 Z
12
+ date: 2011-09-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
16
- requirement: &70323669196940 !ruby/object:Gem::Requirement
16
+ requirement: &70315087611840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.2.6
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70323669196940
24
+ version_requirements: *70315087611840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: multi_json
27
- requirement: &70323669219540 !ruby/object:Gem::Requirement
27
+ requirement: &70315087609460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70323669219540
35
+ version_requirements: *70315087609460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yajl-ruby
38
- requirement: &70323669217180 !ruby/object:Gem::Requirement
38
+ requirement: &70315087608200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.8.3
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70323669217180
46
+ version_requirements: *70315087608200
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: fakeweb
49
- requirement: &70323669215980 !ruby/object:Gem::Requirement
49
+ requirement: &70315087606200 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.3.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70323669215980
57
+ version_requirements: *70315087606200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: riot
60
- requirement: &70323669215280 !ruby/object:Gem::Requirement
60
+ requirement: &70315087619880 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 0.12.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70323669215280
68
+ version_requirements: *70315087619880
69
69
  description: A really simple HTTP client on top of Addressable::URI
70
70
  email:
71
71
  - me@rafaelss.com
@@ -79,6 +79,7 @@ files:
79
79
  - Rakefile
80
80
  - addressable-rest.gemspec
81
81
  - lib/addressable/rest.rb
82
+ - lib/addressable/rest/to_query.rb
82
83
  - lib/addressable/rest/version.rb
83
84
  - test/addressable/rest_test.rb
84
85
  - test/teststrap.rb