pubsubhubbub 0.1.0
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/README.rdoc +27 -0
- data/VERSION +1 -0
- data/lib/pubsubhubbub.rb +10 -0
- data/lib/pubsubhubbub/client.rb +60 -0
- data/test/test_client.rb +62 -0
- metadata +78 -0
data/README.rdoc
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
= Ruby / Asynchronous PubSubHubbub Client
|
2
|
+
|
3
|
+
EventMachine based / asynchronous PubSubHubbub client. Supports posting single or multiple URLs.
|
4
|
+
|
5
|
+
Full Spec: http://code.google.com/p/pubsubhubbub
|
6
|
+
|
7
|
+
HTTP PubSub: Webhooks & PubSubHubbub: http://www.igvita.com/2009/06/29/http-pubsub-webhooks-pubsubhubbub
|
8
|
+
|
9
|
+
== Simple client example
|
10
|
+
|
11
|
+
EventMachine.run {
|
12
|
+
pub = EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/publish').publish "http://www.test.com/"
|
13
|
+
|
14
|
+
pub.callback { puts "Successfully notified hub." }
|
15
|
+
pub.errback { puts "Uh oh, something broke: #{pub.response}" }
|
16
|
+
}
|
17
|
+
|
18
|
+
== Posting multiple URL's
|
19
|
+
|
20
|
+
EventMachine.run {
|
21
|
+
feeds = ["http://www.test.com", "http://www.test.com/2"]
|
22
|
+
pub = EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/publish').publish feeds
|
23
|
+
|
24
|
+
pub.callback { puts "Successfully notified hub." }
|
25
|
+
pub.errback { puts "Uh oh, something broke: #{pub.response}" }
|
26
|
+
}
|
27
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/pubsubhubbub.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# #--
|
2
|
+
# Copyright (C)2009 Ilya Grigorik
|
3
|
+
#
|
4
|
+
# You can redistribute this under the terms of the Ruby
|
5
|
+
# #--
|
6
|
+
|
7
|
+
module EventMachine
|
8
|
+
class PubSubHubbub
|
9
|
+
include EventMachine::Deferrable
|
10
|
+
|
11
|
+
HEADERS = {"User-Agent" => "PubSubHubbub Ruby", "Content-Type" => "application/x-www-form-urlencoded"}
|
12
|
+
|
13
|
+
def initialize(hub)
|
14
|
+
@hub = hub.kind_of?(URI) ? hub : URI::parse(hub)
|
15
|
+
end
|
16
|
+
|
17
|
+
def publish(*feeds)
|
18
|
+
data = feeds.flatten.collect do |feed|
|
19
|
+
{'hub.url' => feed, 'hub.mode' => 'publish'}.to_params
|
20
|
+
end.join("&")
|
21
|
+
|
22
|
+
r = EventMachine::HttpRequest.new(@hub).post :body => data, :head => HEADERS
|
23
|
+
r.callback {
|
24
|
+
if r.response_header.status == 204
|
25
|
+
succeed r
|
26
|
+
else
|
27
|
+
fail r
|
28
|
+
end
|
29
|
+
}
|
30
|
+
|
31
|
+
r.errback { fail }
|
32
|
+
r
|
33
|
+
end
|
34
|
+
|
35
|
+
# These command will work only if the callback URL supports confirmation.
|
36
|
+
def subscribe(feed, callback, options = {}); command('subscribe', feed, callback, options); end
|
37
|
+
def unsubscribe(feed, callback, options = {}); command('unsubscribe', feed, callback, options); end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def command(cmd, feed, callback, options)
|
42
|
+
options['hub.verify'] ||= "sync"
|
43
|
+
|
44
|
+
params = {'hub.topic' => feed, 'hub.mode' => cmd, 'hub.callback' => callback}.merge(options).to_params
|
45
|
+
r = EventMachine::HttpRequest.new(@hub).post :body => params, :head => HEADERS
|
46
|
+
|
47
|
+
r.callback {
|
48
|
+
if r.response_header.status == 204
|
49
|
+
succeed r
|
50
|
+
else
|
51
|
+
fail r
|
52
|
+
end
|
53
|
+
}
|
54
|
+
|
55
|
+
r.errback { fail }
|
56
|
+
r
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'lib/pubsubhubbub'
|
5
|
+
|
6
|
+
describe EventMachine::PubSubHubbub do
|
7
|
+
|
8
|
+
def failed
|
9
|
+
EventMachine.stop
|
10
|
+
fail
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should publish single feed to hub" do
|
14
|
+
EventMachine.run {
|
15
|
+
pub = EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/publish').publish "http://www.test.com/"
|
16
|
+
|
17
|
+
pub.errback { failed }
|
18
|
+
pub.callback {
|
19
|
+
pub.response_header.status.should == 204
|
20
|
+
EventMachine.stop
|
21
|
+
}
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should publish multiple feeds to hub" do
|
26
|
+
EventMachine.run {
|
27
|
+
feeds = ['http://www.test.com', 'http://www.test.com/2']
|
28
|
+
pub = EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/publish').publish feeds
|
29
|
+
|
30
|
+
pub.errback { failed }
|
31
|
+
pub.callback {
|
32
|
+
pub.response_header.status.should == 204
|
33
|
+
EventMachine.stop
|
34
|
+
}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should subscribe a single feed to hub" do
|
39
|
+
EventMachine.run {
|
40
|
+
sub = EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/').subscribe "http://blog.superfeedr.com/atom.xml", "http://superfeedr.com/hubbub", {}
|
41
|
+
|
42
|
+
sub.errback { failed }
|
43
|
+
sub.callback {
|
44
|
+
sub.response_header.status.should == 204
|
45
|
+
EventMachine.stop
|
46
|
+
}
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should unsubscribe a single feed to hub" do
|
51
|
+
EventMachine.run {
|
52
|
+
sub = EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/').unsubscribe "http://blog.superfeedr.com/atom.xml", "http://superfeedr.com/hubbub", {}
|
53
|
+
|
54
|
+
sub.errback { failed }
|
55
|
+
sub.callback {
|
56
|
+
sub.response_header.status.should == 204
|
57
|
+
EventMachine.stop
|
58
|
+
}
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pubsubhubbub
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ilya Grigorik
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-26 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: eventmachine
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.12.9
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: em-http-request
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.1.5
|
34
|
+
version:
|
35
|
+
description: Asynchronous PubSubHubbub client for Ruby
|
36
|
+
email: ilya@igvita.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.rdoc
|
43
|
+
files:
|
44
|
+
- README.rdoc
|
45
|
+
- VERSION
|
46
|
+
- lib/pubsubhubbub.rb
|
47
|
+
- lib/pubsubhubbub/client.rb
|
48
|
+
- test/test_client.rb
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://github.com/igrigorik/pubsubhubbub
|
51
|
+
licenses: []
|
52
|
+
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options:
|
55
|
+
- --charset=UTF-8
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
version:
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
69
|
+
version:
|
70
|
+
requirements: []
|
71
|
+
|
72
|
+
rubyforge_project: pubsubhubbub
|
73
|
+
rubygems_version: 1.3.5
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: Asynchronous PubSubHubbub client for Ruby
|
77
|
+
test_files:
|
78
|
+
- test/test_client.rb
|