muck-raker 0.1.45 → 0.1.46
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/app/controllers/muck/topics_controller.rb +49 -3
- data/app/helpers/muck_raker_google_helper.rb +3 -2
- data/app/models/feed.rb +13 -0
- data/app/models/google_feed_request.rb +51 -2
- data/app/models/service.rb +120 -5
- data/app/views/google/_combined_feed.html.erb +0 -19
- data/app/views/topics/_entry.html.erb +19 -0
- data/app/views/topics/_feed.html.erb +24 -0
- data/app/views/topics/_simple_entry.html.erb +7 -0
- data/app/views/topics/show.html.erb +14 -1
- data/muck-raker.gemspec +5 -2
- data/public/javascripts/muck_raker.js +19 -0
- data/test/rails_root/app/views/layouts/default.html.erb +1 -0
- data/test/rails_root/public/javascripts/muck_raker.js +19 -0
- data/test/rails_root/test/unit/google_feed_request_test.rb +9 -0
- data/test/rails_root/test/unit/service_test.rb +69 -0
- metadata +5 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.46
|
@@ -4,10 +4,13 @@ class Muck::TopicsController < ApplicationController
|
|
4
4
|
before_filter :adjust_format_for_iphone
|
5
5
|
before_filter :check_terms, :except => [:new]
|
6
6
|
before_filter :build_tag_feeds, :only => [:show, :rss_discovery]
|
7
|
+
before_filter :configure_feed_loading, :only => [:show]
|
7
8
|
|
8
9
|
def show
|
9
|
-
|
10
|
-
|
10
|
+
|
11
|
+
load_feeds
|
12
|
+
load_combined_feeds
|
13
|
+
|
11
14
|
respond_to do |format|
|
12
15
|
format.html do
|
13
16
|
@opml_path = topic_path(params[:id], :service_ids => params[:service_ids], :format => 'opml')
|
@@ -81,15 +84,58 @@ class Muck::TopicsController < ApplicationController
|
|
81
84
|
@video_feeds = Service.build_video_feeds(@terms, current_user, params[:service_ids])
|
82
85
|
@bookmark_feeds = Service.build_bookmark_feeds(@terms, current_user, params[:service_ids])
|
83
86
|
@music_feeds = Service.build_music_feeds(@terms, current_user, params[:service_ids])
|
87
|
+
@news_feeds = Service.build_news_feeds(@terms, current_user, params[:service_ids])
|
88
|
+
@blog_feeds = Service.build_blog_feeds(@terms, current_user, params[:service_ids])
|
89
|
+
@search_feeds = Service.build_search_feeds(@terms, current_user, params[:service_ids])
|
90
|
+
|
84
91
|
@general_feeds = Service.build_general_feeds(@terms, current_user, params[:service_ids])
|
85
92
|
|
86
93
|
@discovered_feeds = GoogleFeedRequest.find_feeds(@terms)
|
87
94
|
|
88
|
-
@feeds = @photo_feeds + @video_feeds + @bookmark_feeds + @music_feeds + @general_feeds + @discovered_feeds
|
95
|
+
@feeds = @photo_feeds + @video_feeds + @bookmark_feeds + @music_feeds + @news_feeds + @blog_feeds + @search_feeds + @general_feeds + @discovered_feeds
|
89
96
|
|
90
97
|
@number_of_items = 6
|
91
98
|
@number_of_images = 12
|
92
99
|
@number_of_videos = 6
|
93
100
|
end
|
94
101
|
|
102
|
+
def load_feeds
|
103
|
+
if @load_feeds_on_server
|
104
|
+
@server_loaded_general_feeds = GoogleFeedRequest.load_feeds(@general_feeds + @discovered_feeds)
|
105
|
+
@server_loaded_photo_feeds = GoogleFeedRequest.load_feeds(@photo_feeds)
|
106
|
+
@server_loaded_video_feeds = GoogleFeedRequest.load_feeds(@video_feeds)
|
107
|
+
@server_loaded_bookmark_feeds = GoogleFeedRequest.load_feeds(@bookmark_feeds)
|
108
|
+
@server_loaded_music_feeds = GoogleFeedRequest.load_feeds(@music_feeds)
|
109
|
+
@server_loaded_news_feeds = GoogleFeedRequest.load_feeds(@news_feeds)
|
110
|
+
@server_loaded_blog_feeds = GoogleFeedRequest.load_feeds(@blog_feeds)
|
111
|
+
@server_loaded_search_feeds = GoogleFeedRequest.load_feeds(@search_feeds)
|
112
|
+
if @show_combined
|
113
|
+
@server_loaded_general_feeds = Feed.combine_sort(@server_loaded_general_feeds)
|
114
|
+
@server_loaded_photo_feeds = Feed.combine_sort(@server_loaded_photo_feeds)
|
115
|
+
@server_loaded_video_feeds = Feed.combine_sort(@server_loaded_video_feeds)
|
116
|
+
@server_loaded_bookmark_feeds = Feed.combine_sort(@server_loaded_bookmark_feeds)
|
117
|
+
@server_loaded_music_feeds = Feed.combine_sort(@server_loaded_music_feeds)
|
118
|
+
@server_loaded_news_feeds = Feed.combine_sort(@server_loaded_news_feeds)
|
119
|
+
@server_loaded_blog_feeds = Feed.combine_sort(@server_loaded_blog_feeds)
|
120
|
+
@server_loaded_search_feeds = Feed.combine_sort(@server_loaded_search_feeds)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def load_combined_feeds
|
126
|
+
return unless @load_feeds_on_server && @show_combined
|
127
|
+
@server_loaded_feeds = Feed.sort_entries(@server_loaded_general_feeds + @server_loaded_news_feeds +
|
128
|
+
@server_loaded_blog_feeds + @server_loaded_search_feeds +
|
129
|
+
@server_loaded_photo_feeds + @server_loaded_video_feeds +
|
130
|
+
@server_loaded_bookmark_feeds + @server_loaded_music_feeds)
|
131
|
+
@server_loaded_data_feeds = Feed.sort_entries(@server_loaded_general_feeds + @server_loaded_news_feeds + @server_loaded_blog_feeds + @server_loaded_search_feeds)
|
132
|
+
@server_loaded_extended_data_feeds = Feed.sort_entries(@server_loaded_data_feeds + @server_loaded_bookmark_feeds)
|
133
|
+
end
|
134
|
+
|
135
|
+
def configure_feed_loading
|
136
|
+
@show_google_search = true
|
137
|
+
@show_combined = false
|
138
|
+
@load_feeds_on_server = false
|
139
|
+
end
|
140
|
+
|
95
141
|
end
|
@@ -238,11 +238,12 @@ module MuckRakerGoogleHelper
|
|
238
238
|
</script>}
|
239
239
|
end
|
240
240
|
|
241
|
-
|
241
|
+
# Renders a partial with the latest trends from google.
|
242
|
+
def google_hot_trends(limit = 10)
|
242
243
|
feed = Feed.fetch_feed('http://www.google.com/trends/hottrends/atom/hourly')
|
243
244
|
result = Nokogiri::HTML(feed.entries[0].content)
|
244
245
|
google_hot_trends_terms = result.css('a').collect{ |a| change_chars(a.text) }.compact
|
245
|
-
render :partial => 'google/hot_trends', :locals => { :google_hot_trends_terms => google_hot_trends_terms }
|
246
|
+
render :partial => 'google/hot_trends', :locals => { :google_hot_trends_terms => google_hot_trends_terms[0, limit] }
|
246
247
|
end
|
247
248
|
|
248
249
|
def change_chars(term)
|
data/app/models/feed.rb
CHANGED
@@ -208,4 +208,17 @@ class Feed < ActiveRecord::Base
|
|
208
208
|
uris.collect { |uri| Feed.find_or_create(uri, '', '', '', service.id, user, uri) }
|
209
209
|
end
|
210
210
|
|
211
|
+
# Combines entries in a collection of feeds together and sorts the entries by date
|
212
|
+
def self.combine_sort(feeds)
|
213
|
+
return [] if feeds.nil? || feeds.blank?
|
214
|
+
entries = feeds.collect{|feed| feed.entries}.flatten!
|
215
|
+
sort_entries(entries)
|
216
|
+
end
|
217
|
+
|
218
|
+
# Sorts a collection of entries by date
|
219
|
+
def self.sort_entries(entries)
|
220
|
+
return [] if entries.nil? || entries.blank?
|
221
|
+
entries.sort { |a,b| b.published_at <=> a.published_at }
|
222
|
+
end
|
223
|
+
|
211
224
|
end
|
@@ -19,17 +19,66 @@ class GoogleFeedRequest
|
|
19
19
|
get('http://ajax.googleapis.com/ajax/services/feed/lookup', :query => build_google_query({:q => uri}))
|
20
20
|
end
|
21
21
|
|
22
|
+
# Requests entries for a single feed
|
22
23
|
def self.load_feed(uri)
|
23
24
|
get('http://ajax.googleapis.com/ajax/services/feed/load', :query => build_google_query({:q => uri}))
|
24
25
|
end
|
25
26
|
|
27
|
+
# Requests a set of feeds from Google
|
28
|
+
#
|
29
|
+
# feeds: An array of objects with the attributes 'uri' and 'service_id' defined
|
30
|
+
def self.load_feeds(feeds)
|
31
|
+
feeds = feeds.collect do |feed|
|
32
|
+
json = load_feed(feed.uri)
|
33
|
+
new_feed = convert_google_feed_json_to_feed(feed, json)
|
34
|
+
new_feed.entries << convert_google_feed_json_to_entries(new_feed, json).compact if new_feed
|
35
|
+
new_feed
|
36
|
+
end
|
37
|
+
if feeds
|
38
|
+
feeds.compact!
|
39
|
+
else
|
40
|
+
[]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Converts json returned from google into a feed object
|
45
|
+
def self.convert_google_feed_json_to_feed(feed, json)
|
46
|
+
if json['responseStatus'] == 200
|
47
|
+
if json['responseData']['feed']
|
48
|
+
Feed.new( :uri => feed.uri,
|
49
|
+
:service_id => feed.service_id,
|
50
|
+
:display_uri => json['responseData']['feed']['link'],
|
51
|
+
:title => json['responseData']['feed']['title'],
|
52
|
+
:service => feed.service)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Converts json returned from google into an array of entries
|
58
|
+
def self.convert_google_feed_json_to_entries(feed, json)
|
59
|
+
if json['responseData']['feed']['entries']
|
60
|
+
json['responseData']['feed']['entries'].collect do |entry|
|
61
|
+
published_at = DateTime.parse(entry['publishedDate']) rescue DateTime.now - 1.day
|
62
|
+
Entry.new(:permalink => entry['link'],
|
63
|
+
:author => entry['author'],
|
64
|
+
:title => entry['title'],
|
65
|
+
:description => entry['contentSnippet'],
|
66
|
+
:content => entry['content'],
|
67
|
+
:published_at => published_at,
|
68
|
+
:tag_list => entry['categories'],
|
69
|
+
:direct_link => entry['link'],
|
70
|
+
:feed => feed)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
26
75
|
# Search for feeds using google. This will return
|
27
76
|
# a collection of 'Feed' objects
|
28
77
|
def self.find_feeds(query)
|
29
78
|
query = query.join('+') if query.is_a?(Array)
|
30
79
|
feed_response = find_google_feeds(query)
|
31
80
|
if 200 == feed_response['responseStatus']
|
32
|
-
|
81
|
+
convert_google_find_feeds_json_to_feeds(feed_response)
|
33
82
|
else
|
34
83
|
[]
|
35
84
|
end
|
@@ -42,7 +91,7 @@ class GoogleFeedRequest
|
|
42
91
|
end
|
43
92
|
|
44
93
|
# convert the result of a google query to 'Feed' objects
|
45
|
-
def self.
|
94
|
+
def self.convert_google_find_feeds_json_to_feeds(google_feeds)
|
46
95
|
google_feeds['responseData']['entries'].collect do |google_feed|
|
47
96
|
Feed.new( :uri => google_feed['url'],
|
48
97
|
:display_uri => google_feed['link'],
|
data/app/models/service.rb
CHANGED
@@ -25,7 +25,7 @@ class Service < ActiveRecord::Base
|
|
25
25
|
named_scope :identity_services, :conditions => ['use_for = ?', 'identity']
|
26
26
|
named_scope :tag_services, :conditions => ['use_for = ?', 'tags']
|
27
27
|
named_scope :photo_services, :conditions => ["service_categories.id = services.service_category_id AND service_categories.name = 'Photos'"], :include => ['service_category']
|
28
|
-
|
28
|
+
|
29
29
|
# Indicates whether service is primarily a photo service ie from flick, picasa, etc
|
30
30
|
#
|
31
31
|
# refresh_services: Optional parameter indicating whether or not to reload values from the database before checking service type
|
@@ -54,6 +54,27 @@ class Service < ActiveRecord::Base
|
|
54
54
|
Service.get_music_services(refresh_services).include?(self)
|
55
55
|
end
|
56
56
|
|
57
|
+
# Indicates whether service is primarily news
|
58
|
+
#
|
59
|
+
# refresh_services: Optional parameter indicating whether or not to reload values from the database before checking service type
|
60
|
+
def news?(refresh_services = false)
|
61
|
+
Service.get_news_services(refresh_services).include?(self)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Indicates whether service is primarily blog related
|
65
|
+
#
|
66
|
+
# refresh_services: Optional parameter indicating whether or not to reload values from the database before checking service type
|
67
|
+
def blog?(refresh_services = false)
|
68
|
+
Service.get_blog_services(refresh_services).include?(self)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Indicates whether service is primarily search related
|
72
|
+
#
|
73
|
+
# refresh_services: Optional parameter indicating whether or not to reload values from the database before checking service type
|
74
|
+
def search?(refresh_services = false)
|
75
|
+
Service.get_search_services(refresh_services).include?(self)
|
76
|
+
end
|
77
|
+
|
57
78
|
# Indicates whether service is general (ie not video, photo, music or bookmark)
|
58
79
|
#
|
59
80
|
# refresh_services: Optional parameter indicating whether or not to reload values from the database before checking service type
|
@@ -120,7 +141,9 @@ class Service < ActiveRecord::Base
|
|
120
141
|
uris = service.generate_uris(username, password, uri)
|
121
142
|
uris.collect{ |u| Feed.find_or_create(u.url, u.title, username, password, service.id, contributor) } if uris
|
122
143
|
end
|
123
|
-
|
144
|
+
|
145
|
+
|
146
|
+
|
124
147
|
def self.build_photo_feeds(terms, user, service_ids = nil, refresh_services = false)
|
125
148
|
if service_ids.nil?
|
126
149
|
service_ids = get_photo_tag_services(refresh_services).map(&:id)
|
@@ -157,6 +180,33 @@ class Service < ActiveRecord::Base
|
|
157
180
|
build_tag_feeds(terms, user, service_ids, refresh_services)
|
158
181
|
end
|
159
182
|
|
183
|
+
def self.build_news_feeds(terms, user, service_ids = nil, refresh_services = false)
|
184
|
+
if service_ids.nil?
|
185
|
+
service_ids = get_news_tag_services(refresh_services).map(&:id)
|
186
|
+
else
|
187
|
+
service_ids = make_int_array(service_ids) & get_news_tag_services(refresh_services).map(&:id)
|
188
|
+
end
|
189
|
+
build_tag_feeds(terms, user, service_ids, refresh_services)
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.build_blog_feeds(terms, user, service_ids = nil, refresh_services = false)
|
193
|
+
if service_ids.nil?
|
194
|
+
service_ids = get_blog_tag_services(refresh_services).map(&:id)
|
195
|
+
else
|
196
|
+
service_ids = make_int_array(service_ids) & get_blog_tag_services(refresh_services).map(&:id)
|
197
|
+
end
|
198
|
+
build_tag_feeds(terms, user, service_ids, refresh_services)
|
199
|
+
end
|
200
|
+
|
201
|
+
def self.build_search_feeds(terms, user, service_ids = nil, refresh_services = false)
|
202
|
+
if service_ids.nil?
|
203
|
+
service_ids = get_search_tag_services(refresh_services).map(&:id)
|
204
|
+
else
|
205
|
+
service_ids = make_int_array(service_ids) & get_search_tag_services(refresh_services).map(&:id)
|
206
|
+
end
|
207
|
+
build_tag_feeds(terms, user, service_ids, refresh_services)
|
208
|
+
end
|
209
|
+
|
160
210
|
def self.build_general_feeds(terms, user, service_ids = nil, refresh_services = false)
|
161
211
|
if service_ids.nil?
|
162
212
|
service_ids = get_general_tag_services(refresh_services).map(&:id)
|
@@ -166,6 +216,8 @@ class Service < ActiveRecord::Base
|
|
166
216
|
build_tag_feeds(terms, user, service_ids, refresh_services)
|
167
217
|
end
|
168
218
|
|
219
|
+
|
220
|
+
|
169
221
|
# Get all photo services
|
170
222
|
#
|
171
223
|
# refresh_services: By default all tag services are cached. Setting this value to true
|
@@ -202,15 +254,44 @@ class Service < ActiveRecord::Base
|
|
202
254
|
@music_services ||= get_services(refresh_services).find_all{|service| service.service_category.name == 'Music' }
|
203
255
|
end
|
204
256
|
|
257
|
+
# Get all news services
|
258
|
+
#
|
259
|
+
# refresh_services: By default all tag services are cached. Setting this value to true
|
260
|
+
# will result in the values being repopulated from the database
|
261
|
+
def self.get_news_services(refresh_services = false)
|
262
|
+
@news_services = nil if refresh_services
|
263
|
+
@news_services ||= get_services(refresh_services).find_all{|service| service.service_category.name == 'News' }
|
264
|
+
end
|
265
|
+
|
266
|
+
# Get all blog services
|
267
|
+
#
|
268
|
+
# refresh_services: By default all tag services are cached. Setting this value to true
|
269
|
+
# will result in the values being repopulated from the database
|
270
|
+
def self.get_blog_services(refresh_services = false)
|
271
|
+
@blog_services = nil if refresh_services
|
272
|
+
@blog_services ||= get_services(refresh_services).find_all{|service| service.service_category.name == 'Blogging' }
|
273
|
+
end
|
274
|
+
|
275
|
+
# Get all search services
|
276
|
+
#
|
277
|
+
# refresh_services: By default all tag services are cached. Setting this value to true
|
278
|
+
# will result in the values being repopulated from the database
|
279
|
+
def self.get_search_services(refresh_services = false)
|
280
|
+
@search_services = nil if refresh_services
|
281
|
+
@search_services ||= get_services(refresh_services).find_all{|service| service.service_category.name == 'Search' }
|
282
|
+
end
|
283
|
+
|
205
284
|
# Get all general services. These are all services except photo, video, bookmark and music.
|
206
285
|
#
|
207
286
|
# refresh_services: By default all tag services are cached. Setting this value to true
|
208
287
|
# will result in the values being repopulated from the database
|
209
288
|
def self.get_general_services(refresh_services = false)
|
210
289
|
@general_services = nil if refresh_services
|
211
|
-
@general_services ||= get_services(refresh_services).find_all{|service| !
|
290
|
+
@general_services ||= get_services(refresh_services).find_all{|service| !non_general_categories.include?(service.service_category.name) }
|
212
291
|
end
|
213
|
-
|
292
|
+
|
293
|
+
|
294
|
+
|
214
295
|
# Get all photo services that are used to generate tag feeds
|
215
296
|
#
|
216
297
|
# refresh_services: By default all tag services are cached. Setting this value to true
|
@@ -247,15 +328,45 @@ class Service < ActiveRecord::Base
|
|
247
328
|
@music_services ||= get_tag_services(nil, refresh_services).find_all{|service| service.service_category.name == 'Music' }
|
248
329
|
end
|
249
330
|
|
331
|
+
# Get all news services that are used to generate tag feeds
|
332
|
+
#
|
333
|
+
# refresh_services: By default all tag services are cached. Setting this value to true
|
334
|
+
# will result in the values being repopulated from the database
|
335
|
+
def self.get_news_tag_services(refresh_services = false)
|
336
|
+
@news_services = nil if refresh_services
|
337
|
+
@news_services ||= get_tag_services(nil, refresh_services).find_all{|service| service.service_category.name == 'News' }
|
338
|
+
end
|
339
|
+
|
340
|
+
# Get all blog services that are used to generate tag feeds
|
341
|
+
#
|
342
|
+
# refresh_services: By default all tag services are cached. Setting this value to true
|
343
|
+
# will result in the values being repopulated from the database
|
344
|
+
def self.get_blog_tag_services(refresh_services = false)
|
345
|
+
@blog_services = nil if refresh_services
|
346
|
+
@blog_services ||= get_tag_services(nil, refresh_services).find_all{|service| service.service_category.name == 'Blogging' }
|
347
|
+
end
|
348
|
+
|
349
|
+
# Get all search services that are used to generate tag feeds
|
350
|
+
#
|
351
|
+
# refresh_services: By default all tag services are cached. Setting this value to true
|
352
|
+
# will result in the values being repopulated from the database
|
353
|
+
def self.get_search_tag_services(refresh_services = false)
|
354
|
+
@search_services = nil if refresh_services
|
355
|
+
@search_services ||= get_tag_services(nil, refresh_services).find_all{|service| service.service_category.name == 'Search' }
|
356
|
+
end
|
357
|
+
|
250
358
|
# Get all general services that are used to generate tag feeds
|
251
359
|
#
|
252
360
|
# refresh_services: By default all tag services are cached. Setting this value to true
|
253
361
|
# will result in the values being repopulated from the database
|
254
362
|
def self.get_general_tag_services(refresh_services = false)
|
255
363
|
@general_services = nil if refresh_services
|
256
|
-
@general_services ||= get_tag_services(nil, refresh_services).find_all{|service| !
|
364
|
+
@general_services ||= get_tag_services(nil, refresh_services).find_all{|service| !non_general_categories.include?(service.service_category.name) }
|
257
365
|
end
|
258
366
|
|
367
|
+
|
368
|
+
|
369
|
+
|
259
370
|
# Builds tag based feeds for the given term. Feeds are not saved to the database.
|
260
371
|
#
|
261
372
|
# terms: Terms for which to generate feeds. This value can be an array, a single string,
|
@@ -362,4 +473,8 @@ class Service < ActiveRecord::Base
|
|
362
473
|
Service.find_by_name('rss') # this will return the default rss service
|
363
474
|
end
|
364
475
|
|
476
|
+
def self.non_general_categories
|
477
|
+
['Photos', 'Videos', 'Bookmarks', 'Music', 'News', 'Blogging', 'Search']
|
478
|
+
end
|
479
|
+
|
365
480
|
end
|
@@ -46,25 +46,6 @@
|
|
46
46
|
}
|
47
47
|
return 'feed.png';
|
48
48
|
}
|
49
|
-
|
50
|
-
function apply_show_content(){
|
51
|
-
jQuery('.combined-feed-list .feed-item .feed-title').hover(
|
52
|
-
function () {
|
53
|
-
jQuery(this).next('.combined-feed-list .feed-item .feed-content').show();
|
54
|
-
},
|
55
|
-
function () {
|
56
|
-
jQuery(this).next('.combined-feed-list .feed-item .feed-content').hide();
|
57
|
-
}
|
58
|
-
);
|
59
|
-
jQuery('.combined-feed-list .feed-item .feed-content').hover(
|
60
|
-
function () {
|
61
|
-
jQuery(this).show();
|
62
|
-
},
|
63
|
-
function () {
|
64
|
-
jQuery(this).hide();
|
65
|
-
}
|
66
|
-
);
|
67
|
-
}
|
68
49
|
</script>
|
69
50
|
|
70
51
|
<div id="<%= content_id %>" class="combined-feed">
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% if entry.feed.service.video? -%>
|
2
|
+
<% link = Nokogiri::HTML(entry.content).css('a').detect{ |link| !link.css('img').blank? } -%>
|
3
|
+
<% link.to_s.gsub('<a', 'class="feed-video" rel="video_' + content_id) if link -%>
|
4
|
+
<%= link %>
|
5
|
+
<% elsif entry.feed.service.photo? -%>
|
6
|
+
<% link = Nokogiri::HTML(entry.content).css('a').detect{ |link| !link.css('img').blank? } -%>
|
7
|
+
<% link.to_s.gsub('<a', 'class="feed-photo" rel="photo_' + content_id) if link -%>
|
8
|
+
<%= link %>
|
9
|
+
<% elsif entry.feed.service.bookmark? -%>
|
10
|
+
<div class="hentry <%= cycle("even", "odd") -%>"><h4 class="title"><a class="bookmark-link" href="<%= entry.permalink %>" target="_blank"><%= entry.title %></a></h4></div>
|
11
|
+
<% else -%>
|
12
|
+
<div class="hentry <%= cycle("even", "odd") -%>">
|
13
|
+
<h4 class="title"><a class="entry-link" href="#" target="blank"><%= entry.title %></a><span class="entry-close"><a class="entry-link-close" href="#"><%= t('muck.raker.close') %></a></span></h4>
|
14
|
+
<div class="entry">
|
15
|
+
<%= entry.content %>
|
16
|
+
<p><a href="<%= entry.permalink %>"><%= t('muck.raker.read_more') %></a></p>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<% end -%>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<% content_id ||= feed_content_id(feed) -%>
|
2
|
+
<div class="feed">
|
3
|
+
<div class="feed-header">
|
4
|
+
<h3 <%= service_icon_background(feed.service) %>>
|
5
|
+
<%= link_to "#{feed.title.humanize}", feed.display_uri, :target => 'blank' %>
|
6
|
+
<%= link_to "(rss)", feed.uri, :target => 'blank' %>
|
7
|
+
<% if defined?(show_controls) && show_controls -%>
|
8
|
+
<span class="remove-feed feed-control">
|
9
|
+
<%= link_to t('muck.raker.remove'), aggregation_feed_path(0, :aggregation_id => @aggregation.id, :feed_id => feed.id), :class => 'delete-link' %>
|
10
|
+
</span>
|
11
|
+
<% if use_uri_for_control -%>
|
12
|
+
<%= hidden_field_tag "uris[]", feed.uri -%>
|
13
|
+
<% else -%>
|
14
|
+
<%= hidden_field_tag "service_ids[]", feed.service.id -%>
|
15
|
+
<% end -%>
|
16
|
+
<% end -%>
|
17
|
+
</h3>
|
18
|
+
</div>
|
19
|
+
<div class="feed-content">
|
20
|
+
<div id="<%= content_id %>" class="feed-item <%= feed_class(feed) %>">
|
21
|
+
<%= render :partial => 'topics/entry', :collection => feed.entries, :locals => { :content_id => content_id } %>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<li class="feed-item" <%= service_icon_background(simple_entry.feed.service) %>>
|
2
|
+
<div class="feed-title"><a href="<%= simple_entry.permalink %>" target="_blank"><%= h simple_entry.title %></a></div>
|
3
|
+
<div class="feed-content" style="display:none;">
|
4
|
+
<h3><a href="<%= simple_entry.permalink %>" target="_blank"><%= h simple_entry.title %></a></h3>
|
5
|
+
<%= simple_entry.content %>
|
6
|
+
</div>
|
7
|
+
</li>
|
@@ -22,7 +22,20 @@
|
|
22
22
|
</div>
|
23
23
|
<% end -%>
|
24
24
|
|
25
|
-
<% if @
|
25
|
+
<% if @load_feeds_on_server -%>
|
26
|
+
<% if @show_combined -%>
|
27
|
+
<ul class="combined-feed-list">
|
28
|
+
<%= render :partial => 'topics/simple_entry', :collection => @server_loaded_data_feeds %>
|
29
|
+
</ul>
|
30
|
+
<script type="text/javascript">
|
31
|
+
jQuery(document).ready(function() {
|
32
|
+
apply_show_entry_content();
|
33
|
+
});
|
34
|
+
</script>
|
35
|
+
<% else -%>
|
36
|
+
<%= render :partial => 'topics/feed', :collection => @server_loaded_general_feeds %>
|
37
|
+
<% end -%>
|
38
|
+
<% elsif @show_combined -%>
|
26
39
|
<%= google_combined_feeds(@general_feeds + @discovered_feeds) %>
|
27
40
|
<% else -%>
|
28
41
|
<div id="calculated-feeds">
|
data/muck-raker.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{muck-raker}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.46"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Joel Duffin Justin Ball"]
|
12
|
-
s.date = %q{2009-10-
|
12
|
+
s.date = %q{2009-10-23}
|
13
13
|
s.description = %q{The aggregation and recommendation engine for the muck system.}
|
14
14
|
s.email = %q{justinball@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -325,9 +325,12 @@ Gem::Specification.new do |s|
|
|
325
325
|
"app/views/services/_new_service.html.erb",
|
326
326
|
"app/views/services/_summary.html.erb",
|
327
327
|
"app/views/services/_view_service.html.erb",
|
328
|
+
"app/views/topics/_entry.html.erb",
|
329
|
+
"app/views/topics/_feed.html.erb",
|
328
330
|
"app/views/topics/_feed_preview.html.erb",
|
329
331
|
"app/views/topics/_form.html.erb",
|
330
332
|
"app/views/topics/_rss_discover.html.erb",
|
333
|
+
"app/views/topics/_simple_entry.html.erb",
|
331
334
|
"app/views/topics/new.html.erb",
|
332
335
|
"app/views/topics/photos.html.erb",
|
333
336
|
"app/views/topics/show.html.erb",
|
@@ -1,3 +1,22 @@
|
|
1
|
+
function apply_show_entry_content(){
|
2
|
+
jQuery('.combined-feed-list .feed-item .feed-title').hover(
|
3
|
+
function () {
|
4
|
+
jQuery(this).next('.combined-feed-list .feed-item .feed-content').show();
|
5
|
+
},
|
6
|
+
function () {
|
7
|
+
jQuery(this).next('.combined-feed-list .feed-item .feed-content').hide();
|
8
|
+
}
|
9
|
+
);
|
10
|
+
jQuery('.combined-feed-list .feed-item .feed-content').hover(
|
11
|
+
function () {
|
12
|
+
jQuery(this).show();
|
13
|
+
},
|
14
|
+
function () {
|
15
|
+
jQuery(this).hide();
|
16
|
+
}
|
17
|
+
);
|
18
|
+
}
|
19
|
+
|
1
20
|
function show_tool(tool) {
|
2
21
|
jQuery('.tool').hide();
|
3
22
|
jQuery("#content_iframe").width('75%');
|
@@ -23,6 +23,7 @@
|
|
23
23
|
jquery/jquery.easing.js
|
24
24
|
jquery/jquery.fancybox.js
|
25
25
|
muck.js
|
26
|
+
muck_raker.js
|
26
27
|
application.js }, :cache => 'all_js_cached' %>
|
27
28
|
<%= javascript_tag %[var AUTH_TOKEN = #{form_authenticity_token.inspect};] if protect_against_forgery? %>
|
28
29
|
<%= yield :head -%>
|
@@ -1,3 +1,22 @@
|
|
1
|
+
function apply_show_entry_content(){
|
2
|
+
jQuery('.combined-feed-list .feed-item .feed-title').hover(
|
3
|
+
function () {
|
4
|
+
jQuery(this).next('.combined-feed-list .feed-item .feed-content').show();
|
5
|
+
},
|
6
|
+
function () {
|
7
|
+
jQuery(this).next('.combined-feed-list .feed-item .feed-content').hide();
|
8
|
+
}
|
9
|
+
);
|
10
|
+
jQuery('.combined-feed-list .feed-item .feed-content').hover(
|
11
|
+
function () {
|
12
|
+
jQuery(this).show();
|
13
|
+
},
|
14
|
+
function () {
|
15
|
+
jQuery(this).hide();
|
16
|
+
}
|
17
|
+
);
|
18
|
+
}
|
19
|
+
|
1
20
|
function show_tool(tool) {
|
2
21
|
jQuery('.tool').hide();
|
3
22
|
jQuery("#content_iframe").width('75%');
|
@@ -43,6 +43,15 @@ class GoogleFeedRequestTest < ActiveSupport::TestCase
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
context "load an array of feeds" do
|
47
|
+
setup do
|
48
|
+
@feeds = [ Factory(:feed, :uri => 'http://www.justinball.com/feed'), Factory(:feed, :uri => 'http://www.engadget.com/rss.xml'), Factory(:feed, :uri => 'http://www.example.com') ]
|
49
|
+
end
|
50
|
+
should "load feeds" do
|
51
|
+
@feeds = GoogleFeedRequest.load_feeds(@feeds)
|
52
|
+
assert @feeds.entries.length > 0
|
53
|
+
end
|
54
|
+
end
|
46
55
|
end
|
47
56
|
|
48
57
|
end
|
@@ -68,6 +68,36 @@ class ServiceTest < ActiveSupport::TestCase
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
context "news" do
|
72
|
+
setup do
|
73
|
+
service_category = Factory(:service_category, :name => 'News')
|
74
|
+
@service = Factory(:service, :service_category_id => service_category.id)
|
75
|
+
end
|
76
|
+
should "be a news service" do
|
77
|
+
assert @service.news?(true)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "blog" do
|
82
|
+
setup do
|
83
|
+
service_category = Factory(:service_category, :name => 'Blogging')
|
84
|
+
@service = Factory(:service, :service_category_id => service_category.id)
|
85
|
+
end
|
86
|
+
should "be a blog service" do
|
87
|
+
assert @service.blog?(true)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "search" do
|
92
|
+
setup do
|
93
|
+
service_category = Factory(:service_category, :name => 'Search')
|
94
|
+
@service = Factory(:service, :service_category_id => service_category.id)
|
95
|
+
end
|
96
|
+
should "be a search service" do
|
97
|
+
assert @service.search?(true)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
71
101
|
context "general" do
|
72
102
|
setup do
|
73
103
|
service_category = Factory(:service_category, :name => 'RSS')
|
@@ -228,6 +258,33 @@ class ServiceTest < ActiveSupport::TestCase
|
|
228
258
|
assert @feeds.all? { |feed| feed.service.service_category.name == "Music" }
|
229
259
|
end
|
230
260
|
end
|
261
|
+
context "news feeds" do
|
262
|
+
setup do
|
263
|
+
@feeds = Service.build_news_feeds(@terms, @user.id, nil, true) # We build the news service above so we have to force a cache refresh
|
264
|
+
end
|
265
|
+
should "only create news feeds" do
|
266
|
+
assert @feeds.length > 0
|
267
|
+
assert @feeds.all? { |feed| feed.service.service_category.name == "News" }
|
268
|
+
end
|
269
|
+
end
|
270
|
+
context "blog feeds" do
|
271
|
+
setup do
|
272
|
+
@feeds = Service.build_blog_feeds(@terms, @user.id, nil, true) # We build the blog service above so we have to force a cache refresh
|
273
|
+
end
|
274
|
+
should "only create blog feeds" do
|
275
|
+
assert @feeds.length > 0
|
276
|
+
assert @feeds.all? { |feed| feed.service.service_category.name == "Blogging" }
|
277
|
+
end
|
278
|
+
end
|
279
|
+
context "search feeds" do
|
280
|
+
setup do
|
281
|
+
@feeds = Service.build_search_feeds(@terms, @user.id, nil, true) # We build the search service above so we have to force a cache refresh
|
282
|
+
end
|
283
|
+
should "only create search feeds" do
|
284
|
+
assert @feeds.length > 0
|
285
|
+
assert @feeds.all? { |feed| feed.service.service_category.name == "Search" }
|
286
|
+
end
|
287
|
+
end
|
231
288
|
end
|
232
289
|
|
233
290
|
context "service types" do
|
@@ -250,6 +307,18 @@ class ServiceTest < ActiveSupport::TestCase
|
|
250
307
|
assert Service.get_music_tag_services(true).length > 0
|
251
308
|
assert Service.get_music_tag_services.all? { |service| service.service_category.name == "Music" }
|
252
309
|
end
|
310
|
+
should "get news services" do
|
311
|
+
assert Service.get_news_tag_services(true).length > 0
|
312
|
+
assert Service.get_news_tag_services.all? { |service| service.service_category.name == "News" }
|
313
|
+
end
|
314
|
+
should "get blog services" do
|
315
|
+
assert Service.get_blog_tag_services(true).length > 0
|
316
|
+
assert Service.get_blog_tag_services.all? { |service| service.service_category.name == "Blogging" }
|
317
|
+
end
|
318
|
+
should "get search services" do
|
319
|
+
assert Service.get_search_tag_services(true).length > 0
|
320
|
+
assert Service.get_search_tag_services.all? { |service| service.service_category.name == "Search" }
|
321
|
+
end
|
253
322
|
should "get general services" do
|
254
323
|
assert Service.get_general_tag_services(true).length > 0
|
255
324
|
assert !Service.get_general_tag_services.any? { |service| service.service_category.name == "Photos" }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muck-raker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.46
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Duffin Justin Ball
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-23 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -430,9 +430,12 @@ files:
|
|
430
430
|
- app/views/services/_new_service.html.erb
|
431
431
|
- app/views/services/_summary.html.erb
|
432
432
|
- app/views/services/_view_service.html.erb
|
433
|
+
- app/views/topics/_entry.html.erb
|
434
|
+
- app/views/topics/_feed.html.erb
|
433
435
|
- app/views/topics/_feed_preview.html.erb
|
434
436
|
- app/views/topics/_form.html.erb
|
435
437
|
- app/views/topics/_rss_discover.html.erb
|
438
|
+
- app/views/topics/_simple_entry.html.erb
|
436
439
|
- app/views/topics/new.html.erb
|
437
440
|
- app/views/topics/photos.html.erb
|
438
441
|
- app/views/topics/show.html.erb
|