knock-knock 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -2
- data/Manifest.txt +0 -1
- data/README.rdoc +1 -0
- data/Rakefile +3 -2
- data/lib/bubble/knock_knock/connection.rb +3 -1
- data/lib/bubble/knock_knock/exceptions.rb +10 -10
- data/lib/bubble/knock_knock/request.rb +52 -12
- data/lib/knock_knock.rb +1 -1
- data/test/test_helper.rb +1 -0
- data/test/test_knock_knock.rb +5 -2
- data/test/test_request.rb +25 -7
- metadata +12 -4
- data/PostInstall.txt +0 -0
data/History.txt
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
+
== 0.1.4 2008-12-08
|
2
|
+
|
3
|
+
* New features
|
4
|
+
* Put method included
|
5
|
+
* Delete method included
|
6
|
+
|
1
7
|
== 0.1.3 2008-12-07
|
2
8
|
|
3
9
|
* New features
|
4
|
-
* Post method
|
10
|
+
* Post method included
|
5
11
|
|
6
12
|
== 0.1.2 2008-12-07
|
7
13
|
|
8
14
|
* Bug fix
|
9
|
-
|
15
|
+
* Fixing a problem with namespaces
|
10
16
|
|
11
17
|
== 0.1.1 2008-12-07
|
12
18
|
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -9,10 +9,11 @@ $hoe = Hoe.new('knock-knock', Bubble::KnockKnock::VERSION) do |p|
|
|
9
9
|
# p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
10
10
|
p.rubyforge_name = 'knock-knock' # TODO this is default value
|
11
11
|
p.extra_deps = [
|
12
|
-
['activesupport','>= 2.0.2']
|
12
|
+
['activesupport','>= 2.0.2']
|
13
13
|
]
|
14
14
|
p.extra_dev_deps = [
|
15
|
-
['newgem', ">= #{::Newgem::VERSION}"]
|
15
|
+
['newgem', ">= #{::Newgem::VERSION}"],
|
16
|
+
['xml-object', '>= 0.9.8']
|
16
17
|
]
|
17
18
|
|
18
19
|
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
@@ -10,6 +10,8 @@ module Bubble
|
|
10
10
|
# It's a Singleton class, turning the management of the connection easier. Just one connection will be created during all your script.
|
11
11
|
class Connection
|
12
12
|
include Singleton
|
13
|
+
include Bubble::KnockKnock
|
14
|
+
include Bubble::KnockKnock::Exceptions
|
13
15
|
|
14
16
|
attr_accessor :email, :service
|
15
17
|
attr_reader :password, :auth
|
@@ -48,7 +50,7 @@ module Bubble
|
|
48
50
|
'Email' => @email,
|
49
51
|
'Passwd' => @password,
|
50
52
|
'service' => @service,
|
51
|
-
'source' =>
|
53
|
+
'source' => APP_NAME }
|
52
54
|
|
53
55
|
@http = Net::HTTP.new(@uri.host, 443)
|
54
56
|
@http.use_ssl = true
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module Bubble
|
2
2
|
module KnockKnock
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
module Exceptions
|
4
|
+
# For login errors
|
5
|
+
class BadLogin < Exception; end
|
6
|
+
# For requests to Google services without a connection
|
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
|
12
|
+
end
|
13
13
|
end
|
14
14
|
end
|
@@ -2,13 +2,16 @@ module Bubble
|
|
2
2
|
module KnockKnock
|
3
3
|
# This class gives you an easy way to request informations from Google.
|
4
4
|
class Request
|
5
|
+
include Bubble::KnockKnock
|
6
|
+
include Bubble::KnockKnock::Exceptions
|
7
|
+
|
5
8
|
attr_reader :header
|
6
9
|
|
7
10
|
# Finds the Singleton Connection and creates the header structure to requesting informations.
|
8
11
|
def initialize
|
9
|
-
raise
|
12
|
+
raise UnstablishedConnection if Connection.instance.auth.nil?
|
10
13
|
|
11
|
-
connection =
|
14
|
+
connection = Connection.instance
|
12
15
|
@header = {'Cookie' => "Name=#{connection.auth};Auth=#{connection.auth};Domain=.google.com;Path=/;Expires=160000000000",
|
13
16
|
'Content-length' => '0',
|
14
17
|
'Authorization' => "GoogleLogin auth=#{connection.auth}"
|
@@ -23,8 +26,7 @@ module Bubble
|
|
23
26
|
#
|
24
27
|
# Request.get('http://www.google.com/m8/feeds/contacts/email%40gmail.com/full')
|
25
28
|
def self.get(uri, params=nil)
|
26
|
-
response, body = action(:get, uri, params)
|
27
|
-
|
29
|
+
response, body = action(:get, uri, params)
|
28
30
|
body
|
29
31
|
end
|
30
32
|
|
@@ -36,14 +38,32 @@ module Bubble
|
|
36
38
|
#
|
37
39
|
# Request.post('http://www.google.com/m8/feeds/contacts/email%40gmail.com/full', body)
|
38
40
|
def self.post(uri, params=nil)
|
39
|
-
response, body = action(:post, uri, params)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
@response, @body = action(:post, uri, params)
|
42
|
+
handling
|
43
|
+
end
|
44
|
+
|
45
|
+
# Delete data at any Google Service.
|
46
|
+
# You just need to indicate the URI of the API and also get the entity's ID you're trying to delete.
|
47
|
+
# For more information on how to get the entity's ID,go to google code and check it out.
|
48
|
+
# === Example
|
49
|
+
# You must to be connected. Take a look at Connection for more information.
|
50
|
+
#
|
51
|
+
# Request.delete('http://www.google.com/m8/feeds/contacts/email%40gmail.com/full/6f669dbb0f3d75ce/1228698987605000')
|
52
|
+
def self.delete(uri,params=nil)
|
53
|
+
@response, body = action(:delete, uri, params)
|
54
|
+
handling
|
55
|
+
end
|
56
|
+
|
57
|
+
# Update data at any Google Service.
|
58
|
+
# You just need to indicate the URI of the API and also get the entity's ID you're trying to delete.
|
59
|
+
# For more information on how to get the entity's ID,go to google code and check it out.
|
60
|
+
# === Example
|
61
|
+
# You must to be connected. Take a look at Connection for more information.
|
62
|
+
#
|
63
|
+
# Request.put('http://www.google.com/m8/feeds/contacts/email%40gmail.com/full/6f669dbb0f3d75ce/1228698987605000')
|
64
|
+
def self.put(uri,params=nil)
|
65
|
+
@response, @body = action(:put, uri, params)
|
66
|
+
handling
|
47
67
|
end
|
48
68
|
|
49
69
|
protected
|
@@ -61,6 +81,10 @@ module Bubble
|
|
61
81
|
@request.header.merge!('Content-Type' => 'application/atom+xml')
|
62
82
|
when :get
|
63
83
|
@request.header.merge!('Content-Type' => 'application/xml')
|
84
|
+
when :delete
|
85
|
+
@request.header.merge!('Content-Type' => 'application/atom+xml')
|
86
|
+
when :put
|
87
|
+
@request.header.merge!('X-HTTP-Method-Override' =>'PUT', 'Content-Type' => 'application/atom+xml')
|
64
88
|
end
|
65
89
|
|
66
90
|
@http = Net::HTTP.new(@uri.host, 443)
|
@@ -76,8 +100,24 @@ module Bubble
|
|
76
100
|
@http.post(@uri.path, params, @request.header)
|
77
101
|
when :get
|
78
102
|
@http.get("#{@uri.path}?#{params}", @request.header)
|
103
|
+
when :delete
|
104
|
+
@http.delete(@uri.path, @request.header)
|
105
|
+
when :put
|
106
|
+
@http.post(@uri.path, params, @request.header)
|
79
107
|
end
|
80
108
|
end
|
109
|
+
|
110
|
+
# Returns the request's response, might be a error or XML
|
111
|
+
def self.handling
|
112
|
+
|
113
|
+
case @response.code.to_i
|
114
|
+
when 400; raise BadRequest
|
115
|
+
when 409; raise HTTPConflict
|
116
|
+
else; @body
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
81
121
|
end
|
82
122
|
end
|
83
123
|
end
|
data/lib/knock_knock.rb
CHANGED
data/test/test_helper.rb
CHANGED
data/test/test_knock_knock.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
2
|
|
3
3
|
class TestKnockKnock < Test::Unit::TestCase # :nodoc:
|
4
|
+
include Bubble::KnockKnock
|
5
|
+
include Bubble::KnockKnock::Exceptions
|
6
|
+
|
4
7
|
def setup
|
5
|
-
@kk =
|
8
|
+
@kk = Connection.instance
|
6
9
|
end
|
7
10
|
|
8
11
|
def test_stablish_connection
|
9
|
-
assert_raise(
|
12
|
+
assert_raise(BadLogin) { @kk.connect('test@gmail.com', 'password', 'xapi') }
|
10
13
|
|
11
14
|
@kk.connect('bubble.testing@gmail.com', 'bubblerocks', 'cp')
|
12
15
|
assert @kk.auth
|
data/test/test_request.rb
CHANGED
@@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
2
|
|
3
3
|
class Bubble::KnockKnock::TestRequest < Test::Unit::TestCase # :nodoc: #
|
4
4
|
include Bubble::KnockKnock
|
5
|
+
include Bubble::KnockKnock::Exceptions
|
5
6
|
|
6
7
|
def setup
|
7
8
|
@atom = File.open(File.dirname(__FILE__) + "/fixtures/atom_feed.atom").readlines.join
|
@@ -10,18 +11,30 @@ class Bubble::KnockKnock::TestRequest < Test::Unit::TestCase # :nodoc: #
|
|
10
11
|
|
11
12
|
def test_retrieving_data
|
12
13
|
assert content = Request.get("http://www.google.com/m8/feeds/contacts/bubble.testing%40gmail.com/full")
|
13
|
-
assert_match(/^<\?xml
|
14
|
+
assert_match(/^<\?xml.*$/, content)
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
-
|
18
|
-
# We need to implement the DELETE HTTP Method to delete this contact.
|
17
|
+
def test_deleting_contact
|
18
|
+
create_contact
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
end
|
20
|
+
assert content = Request.delete(@contact.delete_uri)
|
21
|
+
assert_match(/^<\?xml.*$/, content)
|
23
22
|
end
|
24
23
|
|
24
|
+
def test_updating_contact
|
25
|
+
create_contact
|
26
|
+
@contact.change_title
|
27
|
+
|
28
|
+
content = Request.put(@contact.edit_uri,@contact.content)
|
29
|
+
assert_match(/^<\?xml.*$/, content)
|
30
|
+
|
31
|
+
# Everytime you update something at Google, your edit url changes, which means
|
32
|
+
# you have to instanciate a new contact in order to work
|
33
|
+
@contact = Contact.new(content)
|
34
|
+
assert content = Request.delete(@contact.delete_uri)
|
35
|
+
assert_match(/^<\?xml.*$/, content)
|
36
|
+
end
|
37
|
+
|
25
38
|
def test_bad_request
|
26
39
|
bad_atom = @atom << "this_should_get a bad request"
|
27
40
|
|
@@ -34,4 +47,9 @@ class Bubble::KnockKnock::TestRequest < Test::Unit::TestCase # :nodoc: #
|
|
34
47
|
def authenticate
|
35
48
|
Connection.instance.connect('bubble.testing@gmail.com', 'bubblerocks', 'cp')
|
36
49
|
end
|
50
|
+
|
51
|
+
def create_contact
|
52
|
+
@content = Request.post("http://www.google.com/m8/feeds/contacts/bubble.testing%40gmail.com/full", @atom)
|
53
|
+
@contact = Contact.new(@content)
|
54
|
+
end
|
37
55
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Azisaka Maciel
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-08 00:00:00 -02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,16 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.1.0
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: xml-object
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.8
|
44
|
+
version:
|
35
45
|
- !ruby/object:Gem::Dependency
|
36
46
|
name: hoe
|
37
47
|
type: :development
|
@@ -52,12 +62,10 @@ extensions: []
|
|
52
62
|
extra_rdoc_files:
|
53
63
|
- History.txt
|
54
64
|
- Manifest.txt
|
55
|
-
- PostInstall.txt
|
56
65
|
- README.rdoc
|
57
66
|
files:
|
58
67
|
- History.txt
|
59
68
|
- Manifest.txt
|
60
|
-
- PostInstall.txt
|
61
69
|
- README.rdoc
|
62
70
|
- Rakefile
|
63
71
|
- lib/knock_knock.rb
|
data/PostInstall.txt
DELETED
File without changes
|