rack-superfeedr 0.3.0 → 0.4.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/VERSION +1 -1
- data/lib/rack-superfeedr.rb +47 -4
- data/rack-superfeedr.gemspec +2 -2
- data/test/test_rack-superfeedr.rb +28 -5
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/rack-superfeedr.rb
CHANGED
@@ -50,7 +50,7 @@ module Rack
|
|
50
50
|
# Subscribe you to a url. id is optional but strongly recommanded has a unique identifier for this url. It will be used to help you identify which feed
|
51
51
|
# is concerned by a notification.
|
52
52
|
# A 3rd options argument can be supplied with
|
53
|
-
# -
|
53
|
+
# - retrieve => true if you want to retrieve the previous items in the feed
|
54
54
|
# - format => 'json' or 'atom' to specify the format of the notifications, defaults to atom
|
55
55
|
# - secret => a secret string used to compyte HMAC signatures so you can check that the data is coming from Superfeedr
|
56
56
|
# - sync => true (defaults to false) if you want to perfrom a verification of intent syncrhonously
|
@@ -85,6 +85,42 @@ module Rack
|
|
85
85
|
blk.call(response.body, opts[:async] && Integer(response.code) == 202 || Integer(response.code) == 204 || opts[:retrieve] && Integer(response.code) == 200, response) if blk
|
86
86
|
end
|
87
87
|
|
88
|
+
##
|
89
|
+
# Retrieve the content of a resource at Superfeedr
|
90
|
+
# A 2nd options argument can be supplied with
|
91
|
+
# - format => 'json' or 'atom' to specify the format of the notifications, defaults to atom
|
92
|
+
# - count => Integer (number of items to retrieve)
|
93
|
+
# - before => The id of an entry in the feed. The response will only include entries published before this one.
|
94
|
+
# - after => The id of an entry in the feed. The response will only include entries published after this one.
|
95
|
+
# It yields 3 arguments to a block (if block is supplied. If not, just returns the triplet)
|
96
|
+
# - body of the response (useful if you used the retrieve option)
|
97
|
+
# - success flag
|
98
|
+
# - response (useful to debug failed requests mostly)
|
99
|
+
def self.retrieve_by_topic_url(url, opts = {}, &blk)
|
100
|
+
endpoint = opts[:hub] || @@superfeedr_endpoint
|
101
|
+
request = prep_request(url, '', endpoint, opts)
|
102
|
+
|
103
|
+
if opts[:format] == "json"
|
104
|
+
request['format'] = "json"
|
105
|
+
end
|
106
|
+
|
107
|
+
if opts[:count]
|
108
|
+
request['count'] = opts[:count]
|
109
|
+
else
|
110
|
+
request['count'] = 10
|
111
|
+
end
|
112
|
+
|
113
|
+
request['hub.mode'] = 'retrieve'
|
114
|
+
|
115
|
+
response = http_get(endpoint, request)
|
116
|
+
|
117
|
+
if blk
|
118
|
+
blk.call(response.body, Integer(response.code) == 200, response) if blk
|
119
|
+
else
|
120
|
+
[response.body, Integer(response.code) == 200, response]
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
88
124
|
##
|
89
125
|
# Unsubscribes a url. If you used an id for the susbcription, you need to use _the same_.
|
90
126
|
# The optional block will be called to let you confirm the subscription (or not). This is not applicable for if you use params[:async] => true
|
@@ -168,9 +204,6 @@ module Rack
|
|
168
204
|
def call(env)
|
169
205
|
req = Rack::Request.new(env)
|
170
206
|
if env['REQUEST_METHOD'] == 'GET' && feed_id = env['PATH_INFO'].match(/#{@@base_path}(.*)/)
|
171
|
-
puts "----"
|
172
|
-
puts req.params['hub.mode'], feed_id[1], req.params['hub.topic']
|
173
|
-
puts "----"
|
174
207
|
if @verification.call(req.params['hub.mode'], feed_id[1], req.params['hub.topic'], req)
|
175
208
|
Rack::Response.new(req.params['hub.challenge'], 200).finish
|
176
209
|
else
|
@@ -209,6 +242,16 @@ module Rack
|
|
209
242
|
request
|
210
243
|
end
|
211
244
|
|
245
|
+
def self.http_get(url, opts)
|
246
|
+
uri = URI.parse URI.encode(url)
|
247
|
+
uri.query = URI.encode_www_form opts || {}
|
248
|
+
uri.path=='/' if uri.path.empty?
|
249
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
250
|
+
http.use_ssl = true
|
251
|
+
request = Net::HTTP::Get.new uri.request_uri
|
252
|
+
http.request(request)
|
253
|
+
end
|
254
|
+
|
212
255
|
def self.http_post(url, opts)
|
213
256
|
uri = URI.parse URI.encode(url)
|
214
257
|
uri.path=='/' if uri.path.empty?
|
data/rack-superfeedr.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "rack-superfeedr"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
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 = "2015-04-15"
|
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 = [
|
@@ -1,8 +1,9 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'rack'
|
2
3
|
require_relative 'helper.rb'
|
3
4
|
|
4
5
|
# To run tests locally, we're using runscope's passageway which proxies requests inside the firewall. (make sure you bind to port 4567)
|
5
|
-
HOST = '
|
6
|
+
HOST = '5f83728c358.b.passageway.io'
|
6
7
|
PORT = 80
|
7
8
|
# Also, we need superfeedr credentials.
|
8
9
|
LOGIN = 'demo'
|
@@ -11,13 +12,12 @@ PASSWORD = '8ac38a53cc32f71a6445e880f76fc865'
|
|
11
12
|
|
12
13
|
class MyRackApp
|
13
14
|
def call(env)
|
14
|
-
puts env.inspect
|
15
15
|
[ 200, {'Content-Type' => 'text/plain'}, ['hello world'] ]
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def notified(url, feed_id, details)
|
20
|
-
puts url, feed_id, details
|
20
|
+
# puts url, feed_id, details
|
21
21
|
end
|
22
22
|
|
23
23
|
# Run an app in a thread
|
@@ -39,7 +39,7 @@ Thread.new do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
|
42
|
-
end, :Port => 4567)
|
42
|
+
end, :Port => 4567, Logger: WEBrick::Log.new("/dev/null"), AccessLog: [],)
|
43
43
|
end
|
44
44
|
sleep 3
|
45
45
|
|
@@ -61,7 +61,6 @@ class TestRackSuperfeedr < Test::Unit::TestCase
|
|
61
61
|
|
62
62
|
should "support sync mode and call the verification callback before yielding true" do
|
63
63
|
Rack::Superfeedr.subscribe('http://push-pub.appspot.com/feed', 'accept-subscribe', {:sync => true}) do |body, success, response|
|
64
|
-
puts body
|
65
64
|
success || flunk("Fail")
|
66
65
|
end
|
67
66
|
end
|
@@ -122,6 +121,30 @@ class TestRackSuperfeedr < Test::Unit::TestCase
|
|
122
121
|
end
|
123
122
|
end
|
124
123
|
|
124
|
+
context "Retrieving" do
|
125
|
+
should 'yield content from Superfeedr in Atom when asking for no specific format' do
|
126
|
+
Rack::Superfeedr.retrieve_by_topic_url('http://push-pub.appspot.com/feed') do |body, success, response|
|
127
|
+
success || flunk("Fail")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
should 'yield content from Superfeedr in JSON when asking for JSON' do
|
132
|
+
Rack::Superfeedr.retrieve_by_topic_url('http://push-pub.appspot.com/feed', {:format => 'json'}) do |body, success, response|
|
133
|
+
success || flunk("Fail")
|
134
|
+
hash = JSON.parse body
|
135
|
+
hash['status'] || flunk("Not JSON")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
should 'yield content from Superfeedr in JSON when asking for JSON and only yield the right number of items' do
|
140
|
+
Rack::Superfeedr.retrieve_by_topic_url('http://push-pub.appspot.com/feed', {:format => 'json', :count => 3}) do |body, success, response|
|
141
|
+
success || flunk("Fail")
|
142
|
+
hash = JSON.parse body
|
143
|
+
hash['items'].length == 3 || flunk("Not the right number of items")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
125
148
|
context "Notifications" do
|
126
149
|
should 'handle json notifications'
|
127
150
|
should 'handle atom notifications'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-superfeedr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-04-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -159,7 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
159
|
version: '0'
|
160
160
|
segments:
|
161
161
|
- 0
|
162
|
-
hash:
|
162
|
+
hash: 3582772756696706427
|
163
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
164
|
none: false
|
165
165
|
requirements:
|