rack-superfeedr 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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.0)
11
- rack (1.4.0)
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.3.3)
15
+ typhoeus (0.6.2)
16
16
  mime-types
17
17
 
18
18
  PLATFORMS
data/Rakefile CHANGED
@@ -45,7 +45,7 @@ end
45
45
 
46
46
  task :default => :test
47
47
 
48
- require 'rake/rdoctask'
48
+ require 'rdoc/task'
49
49
  Rake::RDocTask.new do |rdoc|
50
50
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
51
51
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.1.0
@@ -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
- use Rack::Superfeedr, { :host => "1pqz.showoff.io", :login => "demo", :password => "demo", :format => "json", :async => false } do |superfeedr|
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
@@ -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
- :username => @params[:login],
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
- :username => @params[:login],
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
- content_type = env["CONTENT_TYPE"].split(";").first
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
@@ -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 = "2012-03-21"
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
- date: 2012-03-21 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2013-03-10 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: rack
16
- requirement: &2173704720 !ruby/object:Gem::Requirement
17
+ requirement: &id001 !ruby/object:Gem::Requirement
17
18
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *2173704720
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: nokogiri
27
- requirement: &2173703740 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
28
29
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *2173703740
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: typhoeus
38
- requirement: &2173702920 !ruby/object:Gem::Requirement
39
+ requirement: &id003 !ruby/object:Gem::Requirement
39
40
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
44
45
  type: :runtime
45
46
  prerelease: false
46
- version_requirements: *2173702920
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: shoulda
49
- requirement: &2173696420 !ruby/object:Gem::Requirement
50
+ requirement: &id004 !ruby/object:Gem::Requirement
50
51
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
55
56
  type: :development
56
57
  prerelease: false
57
- version_requirements: *2173696420
58
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
59
60
  name: bundler
60
- requirement: &2173694500 !ruby/object:Gem::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: *2173694500
69
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
70
71
  name: jeweler
71
- requirement: &2173692300 !ruby/object:Gem::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: *2173692300
80
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
81
82
  name: rcov
82
- requirement: &2173681780 !ruby/object:Gem::Requirement
83
+ requirement: &id007 !ruby/object:Gem::Requirement
83
84
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
88
89
  type: :development
89
90
  prerelease: false
90
- version_requirements: *2173681780
91
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
92
93
  name: rack
93
- requirement: &2173680800 !ruby/object:Gem::Requirement
94
+ requirement: &id008 !ruby/object:Gem::Requirement
94
95
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
99
100
  type: :runtime
100
101
  prerelease: false
101
- version_requirements: *2173680800
102
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
103
104
  name: nokogiri
104
- requirement: &2173679660 !ruby/object:Gem::Requirement
105
+ requirement: &id009 !ruby/object:Gem::Requirement
105
106
  none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
110
111
  type: :runtime
111
112
  prerelease: false
112
- version_requirements: *2173679660
113
- - !ruby/object:Gem::Dependency
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
114
115
  name: typhoeus
115
- requirement: &2173678620 !ruby/object:Gem::Requirement
116
+ requirement: &id010 !ruby/object:Gem::Requirement
116
117
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
121
122
  type: :runtime
122
123
  prerelease: false
123
- version_requirements: *2173678620
124
- description: ! 'A gem that provides a rack middleware to interract with Superfeedr''s
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
- extra_rdoc_files:
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
- require_paths:
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
- version: '0'
158
- segments:
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: 4506397640397812530
161
+ segments:
159
162
  - 0
160
- hash: 3721893544241889941
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: '0'
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
+