rack-superfeedr 0.0.5 → 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/Gemfile.lock +3 -3
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/examples/sinatra_app.rb +11 -5
- data/lib/rack-superfeedr.rb +31 -17
- data/rack-superfeedr.gemspec +1 -1
- metadata +95 -90
data/Gemfile.lock
CHANGED
@@ -7,12 +7,12 @@ GEM
|
|
7
7
|
git (>= 1.2.5)
|
8
8
|
rake
|
9
9
|
mime-types (1.17.2)
|
10
|
-
nokogiri (1.5.
|
11
|
-
rack (1.
|
10
|
+
nokogiri (1.5.6)
|
11
|
+
rack (1.5.2)
|
12
12
|
rake (0.9.2.2)
|
13
13
|
rcov (0.9.11)
|
14
14
|
shoulda (2.11.3)
|
15
|
-
typhoeus (0.
|
15
|
+
typhoeus (0.6.2)
|
16
16
|
mime-types
|
17
17
|
|
18
18
|
PLATFORMS
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/examples/sinatra_app.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'sinatra'
|
2
|
-
require 'rack-superfeedr'
|
2
|
+
require(File.join(File.dirname(__FILE__), '..', 'lib', 'rack-superfeedr.rb'))
|
3
3
|
|
4
|
-
|
4
|
+
|
5
|
+
use Rack::Superfeedr, { :host => "pstx.showoff.io", :login => "demo", :password => "demo", :format => "json", :async => false } do |superfeedr|
|
5
6
|
set :superfeedr, superfeedr # so that we can use `settings.superfeedr` to access the superfeedr object in our application.
|
6
|
-
|
7
|
+
|
7
8
|
superfeedr.on_notification do |notification|
|
8
9
|
puts notification.to_s # You probably want to persist that data in some kind of data store...
|
9
10
|
end
|
10
|
-
|
11
|
+
|
11
12
|
end
|
12
13
|
|
13
14
|
get '/hi' do
|
@@ -15,7 +16,12 @@ get '/hi' do
|
|
15
16
|
end
|
16
17
|
|
17
18
|
get '/subscribe' do
|
18
|
-
settings.superfeedr.subscribe("http://push-pub.appspot.com/feed")
|
19
|
+
subscription = settings.superfeedr.subscribe("http://push-pub.appspot.com/feed")
|
20
|
+
if !subscription
|
21
|
+
settings.superfeedr.error
|
22
|
+
else
|
23
|
+
'Subscribed'
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
get '/unsubscribe' do
|
data/lib/rack-superfeedr.rb
CHANGED
@@ -3,18 +3,28 @@ require 'typhoeus'
|
|
3
3
|
require 'json'
|
4
4
|
require 'nokogiri'
|
5
5
|
|
6
|
+
|
6
7
|
module Rack
|
8
|
+
|
9
|
+
|
7
10
|
##
|
8
11
|
# This is a Rack Middleware that can be used in your rack-compatible web framework (Rails, Sinatra...) to perform subscriptions over at superfeedr
|
9
12
|
# using the PubSubHubbub API.
|
10
13
|
class Superfeedr
|
11
|
-
|
14
|
+
|
12
15
|
SUPERFEEDR_ENDPOINT = "https://superfeedr.com/hubbub"
|
13
|
-
|
16
|
+
|
17
|
+
##
|
18
|
+
# Shows the latest error received by the API.
|
19
|
+
# Useful when a subscription or unsubscription request fails.
|
20
|
+
def error
|
21
|
+
@error
|
22
|
+
end
|
23
|
+
|
14
24
|
##
|
15
25
|
# Subscribe you to a url. id is optional, but recommanded has a unique identifier for this url. It will be used to help you identify which feed
|
16
26
|
# is concerned by a notification.
|
17
|
-
# The optional block will be called to let you confirm the subscription (or not).
|
27
|
+
# The optional block will be called to let you confirm the subscription (or not).
|
18
28
|
# It returns true if the subscription was successful (or will be confirmed if you used async => true in the options), false otherwise.
|
19
29
|
# You can also pass an opts third argument that will be merged with the options used in Typhoeus's Request (https://github.com/dbalatero/typhoeus)
|
20
30
|
# A useful option is :verbose => true for example.
|
@@ -24,10 +34,10 @@ module Rack
|
|
24
34
|
@verifications[feed_id] ||= {}
|
25
35
|
@verifications[feed_id]['subscribe'] = block
|
26
36
|
end
|
27
|
-
response = Typhoeus::Request.post(SUPERFEEDR_ENDPOINT,
|
37
|
+
response = ::Typhoeus::Request.post(SUPERFEEDR_ENDPOINT,
|
28
38
|
opts.merge({
|
29
39
|
:params => {
|
30
|
-
:'hub.mode' => 'subscribe',
|
40
|
+
:'hub.mode' => 'subscribe',
|
31
41
|
:'hub.verify' => @params[:async] ? 'async' : 'sync',
|
32
42
|
:'hub.topic' => url,
|
33
43
|
:'hub.callback' => generate_callback(url, feed_id)
|
@@ -35,9 +45,9 @@ module Rack
|
|
35
45
|
:headers => {
|
36
46
|
:Accept => @params[:format] == "json" ? "application/json" : "application/atom+xml"
|
37
47
|
},
|
38
|
-
:
|
39
|
-
:password => @params[:password]
|
48
|
+
:userpwd => "#{@params[:login]}:#{@params[:password]}"
|
40
49
|
}))
|
50
|
+
@error = response.body
|
41
51
|
@params[:async] && response.code == 202 || response.code == 204 # We return true to indicate the status.
|
42
52
|
end
|
43
53
|
|
@@ -53,17 +63,17 @@ module Rack
|
|
53
63
|
@verifications[feed_id] ||= {}
|
54
64
|
@verifications[feed_id]['unsubscribe'] = block
|
55
65
|
end
|
56
|
-
response = Typhoeus::Request.post(SUPERFEEDR_ENDPOINT,
|
66
|
+
response = ::Typhoeus::Request.post(SUPERFEEDR_ENDPOINT,
|
57
67
|
opts.merge({
|
58
68
|
:params => {
|
59
|
-
:'hub.mode' => 'unsubscribe',
|
69
|
+
:'hub.mode' => 'unsubscribe',
|
60
70
|
:'hub.verify' => @params[:async] ? 'async' : 'sync',
|
61
71
|
:'hub.topic' => url,
|
62
72
|
:'hub.callback' => generate_callback(url, feed_id)
|
63
73
|
},
|
64
|
-
:
|
65
|
-
:password => @params[:password]
|
74
|
+
:userpwd => "#{@params[:login]}:#{@params[:password]}"
|
66
75
|
}))
|
76
|
+
@error = response.body
|
67
77
|
@params[:async] && response.code == 202 || response.code == 204 # We return true to indicate the status.
|
68
78
|
end
|
69
79
|
|
@@ -72,7 +82,7 @@ module Rack
|
|
72
82
|
# - the payload itself (ATOM or JSON, based on what you selected in the params)
|
73
83
|
# - the id for the feed, if you used any upon subscription
|
74
84
|
def on_notification(&block)
|
75
|
-
@callback = block
|
85
|
+
@callback = block
|
76
86
|
end
|
77
87
|
|
78
88
|
##
|
@@ -114,7 +124,11 @@ module Rack
|
|
114
124
|
elsif env['REQUEST_METHOD'] == 'POST' && feed_id = env['PATH_INFO'].match(/\/superfeedr\/feed\/(.*)/)
|
115
125
|
# Notification
|
116
126
|
content = nil
|
117
|
-
|
127
|
+
if env["CONTENT_TYPE"]
|
128
|
+
content_type = env["CONTENT_TYPE"].split(";").first
|
129
|
+
else
|
130
|
+
content_type = "application/atom+xml" #default?
|
131
|
+
end
|
118
132
|
if content_type == "application/json"
|
119
133
|
# Let's parse the body as JSON
|
120
134
|
content = JSON.parse(req.body.read)
|
@@ -130,13 +144,13 @@ module Rack
|
|
130
144
|
else
|
131
145
|
@app.call(env)
|
132
146
|
end
|
133
|
-
end
|
134
|
-
|
147
|
+
end
|
148
|
+
|
135
149
|
protected
|
136
|
-
|
150
|
+
|
137
151
|
def generate_callback(url, feed_id)
|
138
152
|
URI::HTTP.build({:host => @params[:host], :path => "/superfeedr/feed/#{feed_id}" }).to_s
|
139
153
|
end
|
140
|
-
|
154
|
+
|
141
155
|
end
|
142
156
|
end
|
data/rack-superfeedr.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["julien51"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2013-03-10"
|
13
13
|
s.description = "A gem that provides a rack middleware to interract with Superfeedr's API. "
|
14
14
|
s.email = "julien@superfeedr.com"
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,135 +1,137 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-superfeedr
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.5
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- julien51
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2013-03-10 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: rack
|
16
|
-
requirement: &
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: nokogiri
|
27
|
-
requirement: &
|
28
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version:
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
37
38
|
name: typhoeus
|
38
|
-
requirement: &
|
39
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version:
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
44
45
|
type: :runtime
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
48
49
|
name: shoulda
|
49
|
-
requirement: &
|
50
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
51
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
55
56
|
type: :development
|
56
57
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
-
- !ruby/object:Gem::Dependency
|
58
|
+
version_requirements: *id004
|
59
|
+
- !ruby/object:Gem::Dependency
|
59
60
|
name: bundler
|
60
|
-
requirement: &
|
61
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
61
62
|
none: false
|
62
|
-
requirements:
|
63
|
+
requirements:
|
63
64
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
+
- !ruby/object:Gem::Version
|
65
66
|
version: 1.0.0
|
66
67
|
type: :development
|
67
68
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
-
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: *id005
|
70
|
+
- !ruby/object:Gem::Dependency
|
70
71
|
name: jeweler
|
71
|
-
requirement: &
|
72
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
72
73
|
none: false
|
73
|
-
requirements:
|
74
|
+
requirements:
|
74
75
|
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
+
- !ruby/object:Gem::Version
|
76
77
|
version: 1.6.4
|
77
78
|
type: :development
|
78
79
|
prerelease: false
|
79
|
-
version_requirements: *
|
80
|
-
- !ruby/object:Gem::Dependency
|
80
|
+
version_requirements: *id006
|
81
|
+
- !ruby/object:Gem::Dependency
|
81
82
|
name: rcov
|
82
|
-
requirement: &
|
83
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
83
84
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version:
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
88
89
|
type: :development
|
89
90
|
prerelease: false
|
90
|
-
version_requirements: *
|
91
|
-
- !ruby/object:Gem::Dependency
|
91
|
+
version_requirements: *id007
|
92
|
+
- !ruby/object:Gem::Dependency
|
92
93
|
name: rack
|
93
|
-
requirement: &
|
94
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
94
95
|
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version:
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: "0"
|
99
100
|
type: :runtime
|
100
101
|
prerelease: false
|
101
|
-
version_requirements: *
|
102
|
-
- !ruby/object:Gem::Dependency
|
102
|
+
version_requirements: *id008
|
103
|
+
- !ruby/object:Gem::Dependency
|
103
104
|
name: nokogiri
|
104
|
-
requirement: &
|
105
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
105
106
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version:
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: "0"
|
110
111
|
type: :runtime
|
111
112
|
prerelease: false
|
112
|
-
version_requirements: *
|
113
|
-
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: *id009
|
114
|
+
- !ruby/object:Gem::Dependency
|
114
115
|
name: typhoeus
|
115
|
-
requirement: &
|
116
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
116
117
|
none: false
|
117
|
-
requirements:
|
118
|
-
- -
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version:
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: "0"
|
121
122
|
type: :runtime
|
122
123
|
prerelease: false
|
123
|
-
version_requirements: *
|
124
|
-
description:
|
125
|
-
API. '
|
124
|
+
version_requirements: *id010
|
125
|
+
description: "A gem that provides a rack middleware to interract with Superfeedr's API. "
|
126
126
|
email: julien@superfeedr.com
|
127
127
|
executables: []
|
128
|
+
|
128
129
|
extensions: []
|
129
|
-
|
130
|
+
|
131
|
+
extra_rdoc_files:
|
130
132
|
- LICENSE.txt
|
131
133
|
- README.rdoc
|
132
|
-
files:
|
134
|
+
files:
|
133
135
|
- .document
|
134
136
|
- Gemfile
|
135
137
|
- Gemfile.lock
|
@@ -143,31 +145,34 @@ files:
|
|
143
145
|
- test/helper.rb
|
144
146
|
- test/test_rack-superfeedr.rb
|
145
147
|
homepage: http://rubygems.org/gems/rack-superfeedr
|
146
|
-
licenses:
|
148
|
+
licenses:
|
147
149
|
- MIT
|
148
150
|
post_install_message:
|
149
151
|
rdoc_options: []
|
150
|
-
|
152
|
+
|
153
|
+
require_paths:
|
151
154
|
- lib
|
152
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
153
156
|
none: false
|
154
|
-
requirements:
|
155
|
-
- -
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
|
158
|
-
segments:
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
hash: 4506397640397812530
|
161
|
+
segments:
|
159
162
|
- 0
|
160
|
-
|
161
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
version: "0"
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
165
|
none: false
|
163
|
-
requirements:
|
164
|
-
- -
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version:
|
166
|
+
requirements:
|
167
|
+
- - ">="
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: "0"
|
167
170
|
requirements: []
|
171
|
+
|
168
172
|
rubyforge_project:
|
169
173
|
rubygems_version: 1.8.17
|
170
174
|
signing_key:
|
171
175
|
specification_version: 3
|
172
176
|
summary: A gem that provides a rack middleware to interract with Superfeedr's API.
|
173
177
|
test_files: []
|
178
|
+
|