addressable-rest 0.0.2 → 0.0.3

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,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