knock-knock 0.1.2 → 0.1.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.
- data/History.txt +5 -0
- data/lib/bubble/knock_knock/exceptions.rb +4 -0
- data/lib/bubble/knock_knock/hash.rb +1 -1
- data/lib/bubble/knock_knock/request.rb +55 -10
- data/lib/knock_knock.rb +1 -1
- data/test/test_knock_knock.rb +2 -15
- data/test/test_request.rb +37 -0
- metadata +3 -2
data/History.txt
CHANGED
@@ -5,6 +5,10 @@ module Bubble
|
|
5
5
|
class BadLogin < Exception; end
|
6
6
|
# For requests to Google services without a connection
|
7
7
|
class UnstablishedConnection < Exception; end
|
8
|
+
# Bad request at Google returns 400
|
9
|
+
class BadRequest < Exception; end
|
10
|
+
# When a 409 (HTTP Conflict) occurs. It happens when, for example, you try to create a contact but it exists.
|
11
|
+
class HTTPConflict < Exception; end
|
8
12
|
|
9
13
|
end
|
10
14
|
end
|
@@ -11,7 +11,8 @@ module Bubble
|
|
11
11
|
connection = Bubble::KnockKnock::Connection.instance
|
12
12
|
@header = {'Cookie' => "Name=#{connection.auth};Auth=#{connection.auth};Domain=.google.com;Path=/;Expires=160000000000",
|
13
13
|
'Content-length' => '0',
|
14
|
-
'Authorization' => "GoogleLogin auth=#{connection.auth}"
|
14
|
+
'Authorization' => "GoogleLogin auth=#{connection.auth}"
|
15
|
+
}
|
15
16
|
end
|
16
17
|
|
17
18
|
# Get the data from any Google Service.
|
@@ -21,18 +22,62 @@ module Bubble
|
|
21
22
|
# You must to be connected. Take a look in Connection for more information.
|
22
23
|
#
|
23
24
|
# Request.get('http://www.google.com/m8/feeds/contacts/email%40gmail.com/full')
|
24
|
-
def self.get(uri,
|
25
|
-
|
26
|
-
|
27
|
-
uri = URI.parse(uri)
|
28
|
-
|
29
|
-
http = Net::HTTP.new(uri.host, 443)
|
30
|
-
http.use_ssl = true
|
31
|
-
|
32
|
-
response, body = http.get("#{uri.path}?#{query}", @request.header)
|
25
|
+
def self.get(uri, params=nil)
|
26
|
+
response, body = action(:get, uri, params)
|
33
27
|
|
34
28
|
body
|
35
29
|
end
|
30
|
+
|
31
|
+
# Post data to any Google Service.
|
32
|
+
# You just need to indicate the URI of the API and the attributes must that be sent in the request's body.
|
33
|
+
# A Status code 201 CREATED will be return in case everything goes as planned!
|
34
|
+
# === Example
|
35
|
+
# You must to be connected. Take a look at Connection for more information.
|
36
|
+
#
|
37
|
+
# Request.post('http://www.google.com/m8/feeds/contacts/email%40gmail.com/full', body)
|
38
|
+
def self.post(uri, params=nil)
|
39
|
+
response, body = action(:post, uri, params)
|
40
|
+
|
41
|
+
case response.code.to_i
|
42
|
+
when 400; raise BadRequest
|
43
|
+
when 409; raise HTTPConflict
|
44
|
+
when 201; body
|
45
|
+
else; response.code << ' => ' << body
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
# Generates the basic setup for both GET and POST requests(later on PUT and DELETE also). Any request at Google's services
|
52
|
+
# must have SSL activated.
|
53
|
+
# POST requests at Google always use atom+xml as their content type default.
|
54
|
+
def self.setup(http_method, uri)
|
55
|
+
|
56
|
+
@request = self.new
|
57
|
+
@uri = URI.parse(uri)
|
58
|
+
|
59
|
+
case http_method
|
60
|
+
when :post
|
61
|
+
@request.header.merge!('Content-Type' => 'application/atom+xml')
|
62
|
+
when :get
|
63
|
+
@request.header.merge!('Content-Type' => 'application/xml')
|
64
|
+
end
|
65
|
+
|
66
|
+
@http = Net::HTTP.new(@uri.host, 443)
|
67
|
+
@http.use_ssl = true
|
68
|
+
end
|
69
|
+
|
70
|
+
# Responsible by makes the right request when the developer points the HTTP Method (Post, Get), adding the parameters and the right header.
|
71
|
+
def self.action(http_method, uri, params)
|
72
|
+
setup(http_method, uri)
|
73
|
+
|
74
|
+
case http_method
|
75
|
+
when :post
|
76
|
+
@http.post(@uri.path, params, @request.header)
|
77
|
+
when :get
|
78
|
+
@http.get("#{@uri.path}?#{params}", @request.header)
|
79
|
+
end
|
80
|
+
end
|
36
81
|
end
|
37
82
|
end
|
38
83
|
end
|
data/lib/knock_knock.rb
CHANGED
data/test/test_knock_knock.rb
CHANGED
@@ -8,20 +8,7 @@ class TestKnockKnock < Test::Unit::TestCase # :nodoc:
|
|
8
8
|
def test_stablish_connection
|
9
9
|
assert_raise(Bubble::KnockKnock::BadLogin) { @kk.connect('test@gmail.com', 'password', 'xapi') }
|
10
10
|
|
11
|
-
authenticate
|
12
|
-
assert @kk.auth
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_retrieving_data
|
16
|
-
authenticate
|
17
|
-
|
18
|
-
assert body = Bubble::KnockKnock::Request.get("http://www.google.com/m8/feeds/contacts/bubble.testing%40gmail.com/full")
|
19
|
-
assert_match(/^<\?xml.*/, body)
|
20
|
-
assert_equal(@kk.auth, Bubble::KnockKnock::Connection.instance.auth)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
def authenticate
|
25
11
|
@kk.connect('bubble.testing@gmail.com', 'bubblerocks', 'cp')
|
12
|
+
assert @kk.auth
|
26
13
|
end
|
27
|
-
end
|
14
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class Bubble::KnockKnock::TestRequest < Test::Unit::TestCase # :nodoc: #
|
4
|
+
include Bubble::KnockKnock
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@atom = File.open(File.dirname(__FILE__) + "/fixtures/atom_feed.atom").readlines.join
|
8
|
+
authenticate
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_retrieving_data
|
12
|
+
assert content = Request.get("http://www.google.com/m8/feeds/contacts/bubble.testing%40gmail.com/full")
|
13
|
+
assert_match(/^<\?xml.*/, content)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_retrieving_post_feed
|
17
|
+
# Cause the contact is all right created, it can't be created again. Then a 409 occurs (HTTP Conflict).
|
18
|
+
# We need to implement the DELETE HTTP Method to delete this contact.
|
19
|
+
|
20
|
+
assert_raise(HTTPConflict) do
|
21
|
+
Request.post("http://www.google.com/m8/feeds/contacts/bubble.testing%40gmail.com/full", @atom)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_bad_request
|
26
|
+
bad_atom = @atom << "this_should_get a bad request"
|
27
|
+
|
28
|
+
assert_raise(BadRequest) do
|
29
|
+
Request.post("http://www.google.com/m8/feeds/contacts/bubble.testing%40gmail.com/full", bad_atom)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def authenticate
|
35
|
+
Connection.instance.connect('bubble.testing@gmail.com', 'bubblerocks', 'cp')
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knock-knock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Azisaka Maciel
|
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements: []
|
94
94
|
|
95
95
|
rubyforge_project: knock-knock
|
96
|
-
rubygems_version: 1.3.
|
96
|
+
rubygems_version: 1.3.1
|
97
97
|
signing_key:
|
98
98
|
specification_version: 2
|
99
99
|
summary: ""
|
@@ -101,3 +101,4 @@ test_files:
|
|
101
101
|
- test/test_hash.rb
|
102
102
|
- test/test_helper.rb
|
103
103
|
- test/test_knock_knock.rb
|
104
|
+
- test/test_request.rb
|