knock-knock 0.1.3 → 0.1.4
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 +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
|