feedupdater 0.2.0 → 0.2.1
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/CHANGELOG +4 -0
- data/bin/feed_updater +1 -1
- data/example/custom_updater.rb +14 -4
- data/lib/feed_updater.rb +79 -35
- data/lib/feed_updater/version.rb +1 -1
- metadata +3 -2
data/CHANGELOG
CHANGED
data/bin/feed_updater
CHANGED
data/example/custom_updater.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
class CustomUpdater < FeedTools::FeedUpdater
|
2
|
+
on_begin do
|
3
|
+
# self.feed_href_list = [
|
4
|
+
# "http://www.gigaom.com/feed/rss2/",
|
5
|
+
# "http://feeds.feedburner.com/ManeuverMarketingCommunique",
|
6
|
+
# "http://www.afp.com/english/rss/stories.xml",
|
7
|
+
# "http://www.railheaddesign.com/rss/railhead.xml",
|
8
|
+
# "http://www.nateanddi.com/rssfeed.xml"
|
9
|
+
# ]
|
10
|
+
end
|
11
|
+
|
2
12
|
on_update do |feed, seconds|
|
3
|
-
logger.info("Loaded '#{feed.href}'.")
|
4
|
-
logger.info("=> Updated (#{feed.title}) in #{seconds} seconds.")
|
13
|
+
self.logger.info("Loaded '#{feed.href}'.")
|
14
|
+
self.logger.info("=> Updated (#{feed.title}) in #{seconds} seconds.")
|
5
15
|
end
|
6
16
|
|
7
17
|
on_error do |href, error|
|
8
|
-
logger.info("Error updating '#{href}':")
|
9
|
-
logger.info(error)
|
18
|
+
self.logger.info("Error updating '#{href}':")
|
19
|
+
self.logger.info(error)
|
10
20
|
end
|
11
21
|
|
12
22
|
on_complete do |updated_feed_hrefs|
|
data/lib/feed_updater.rb
CHANGED
@@ -64,7 +64,7 @@ class FeedUpdaterLogger < Logger
|
|
64
64
|
alias_method :old_log, :log
|
65
65
|
def log(level, message)
|
66
66
|
if defined?(@prefix) && @prefix != nil
|
67
|
-
self.old_log(level, self.prefix
|
67
|
+
self.old_log(level, "#{self.prefix}#{message}")
|
68
68
|
else
|
69
69
|
self.old_log(level, message)
|
70
70
|
end
|
@@ -94,6 +94,14 @@ end
|
|
94
94
|
module FeedTools
|
95
95
|
# A simple daemon for scheduled updating of feeds.
|
96
96
|
class FeedUpdater
|
97
|
+
# Declares an on_begin event. The given block will be called before the
|
98
|
+
# update sequence runs to allow for any setup required. The block is
|
99
|
+
# not passed any arguments.
|
100
|
+
def self.on_begin(&block)
|
101
|
+
raise "No block supplied for on_begin." if block.nil?
|
102
|
+
@@on_begin = block
|
103
|
+
end
|
104
|
+
|
97
105
|
# Declares an on_update event. The given block will be called after
|
98
106
|
# every feed update. The block is passed the feed object that was loaded
|
99
107
|
# and the time it took in seconds to successfully load it.
|
@@ -325,18 +333,25 @@ module FeedTools
|
|
325
333
|
|
326
334
|
# The main feed update loop.
|
327
335
|
loop do
|
328
|
-
result =
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
336
|
+
result = nil
|
337
|
+
sleepy_time = 1.hour
|
338
|
+
begin
|
339
|
+
result = Benchmark.measure do
|
340
|
+
self.update_feeds()
|
341
|
+
end
|
342
|
+
self.logger.info(
|
343
|
+
"#{@feed_href_list.size} feed(s) updated " +
|
344
|
+
"in #{result.real.round} seconds.")
|
345
|
+
sleepy_time = 1.hour - result.real.round
|
346
|
+
rescue Exception => error
|
347
|
+
self.logger.error("Feed update sequence errored out.")
|
348
|
+
self.logger.error(error.class.name + ": " + error.message)
|
349
|
+
self.logger.error("\n" + error.backtrace.join("\n").to_s)
|
337
350
|
end
|
351
|
+
|
352
|
+
@feed_href_list = nil
|
353
|
+
@feed_href_list_override = false
|
338
354
|
ObjectSpace.garbage_collect()
|
339
|
-
sleepy_time = 1.hour - result.real.round
|
340
355
|
if sleepy_time > 0
|
341
356
|
self.logger.info(
|
342
357
|
"Sleeping for #{(sleepy_time / 60.0).round} minutes...")
|
@@ -419,18 +434,39 @@ module FeedTools
|
|
419
434
|
|
420
435
|
# Updates all of the feeds.
|
421
436
|
def update_feeds()
|
437
|
+
self.logger.level = 0
|
422
438
|
self.logger.prefix = "FeedUpdater".ljust(20)
|
423
439
|
ObjectSpace.garbage_collect()
|
440
|
+
if defined?(@@on_begin) && @@on_begin != nil
|
441
|
+
self.logger.info("Running custom startup event...")
|
442
|
+
self.cloaker(&(@@on_begin)).bind(self).call()
|
443
|
+
end
|
424
444
|
if defined?(@feed_href_list_override) && @feed_href_list_override
|
445
|
+
self.logger.info("Using custom feed list...")
|
425
446
|
self.feed_href_list()
|
426
447
|
else
|
427
448
|
self.logger.info("Loading default feed list...")
|
428
|
-
|
429
|
-
(
|
430
|
-
|
431
|
-
|
449
|
+
begin
|
450
|
+
expire_time = (Time.now - 1.hour).utc
|
451
|
+
expire_time_string = sprintf('%04d-%02d-%02d %02d:%02d:%02d',
|
452
|
+
expire_time.year, expire_time.month, expire_time.day,
|
453
|
+
expire_time.hour, expire_time.min, expire_time.sec)
|
454
|
+
@feed_href_list =
|
455
|
+
FeedTools.feed_cache.connection.execute(
|
456
|
+
"SELECT href FROM cached_feeds WHERE " +
|
457
|
+
"last_retrieved < '#{expire_time_string}'").to_a.flatten
|
458
|
+
rescue Exception
|
459
|
+
self.logger.warn("Default feed list failed, using fallback.")
|
460
|
+
@feed_href_list =
|
461
|
+
FeedTools.feed_cache.find(:all).collect do |feed|
|
462
|
+
feed.href
|
463
|
+
end
|
464
|
+
self.logger.warn(
|
465
|
+
"Fallback succeeded. Custom feed list override recommended.")
|
466
|
+
end
|
432
467
|
end
|
433
468
|
self.logger.info("Updating #{@feed_href_list.size} feed(s)...")
|
469
|
+
self.logger.level = self.updater_options[:log_level]
|
434
470
|
ObjectSpace.garbage_collect()
|
435
471
|
|
436
472
|
threads = []
|
@@ -487,52 +523,56 @@ module FeedTools
|
|
487
523
|
href_list = thread_slices[Thread.current.thread_id]
|
488
524
|
|
489
525
|
for i in 0...href_list.size
|
490
|
-
href = nil
|
491
526
|
progress = nil
|
492
527
|
mutex.synchronize do
|
493
|
-
href = href_list[i]
|
528
|
+
Thread.current.href = href_list[i]
|
494
529
|
Thread.current.progress =
|
495
|
-
(href_list.index(href).to_f /
|
530
|
+
(href_list.index(Thread.current.href).to_f /
|
531
|
+
href_list.size.to_f) * 100
|
496
532
|
progress = sprintf("%.2f", Thread.current.progress)
|
497
533
|
end
|
498
534
|
begin
|
499
535
|
begin
|
500
|
-
feed = nil
|
536
|
+
Thread.current.feed = nil
|
501
537
|
feed_load_benchmark = Benchmark.measure do
|
502
|
-
feed =
|
538
|
+
Thread.current.feed =
|
539
|
+
FeedTools::Feed.open(Thread.current.href)
|
503
540
|
end
|
504
541
|
Thread.pass
|
505
|
-
if feed.live?
|
542
|
+
if Thread.current.feed.live?
|
506
543
|
unless @@on_update.nil?
|
507
544
|
mutex.synchronize do
|
508
545
|
progress = sprintf("%.2f", Thread.current.progress)
|
509
|
-
self.logger.prefix =
|
510
|
-
"(#{progress}%)"
|
511
|
-
|
546
|
+
self.logger.prefix =
|
547
|
+
("Thread #{Thread.current.thread_id} (#{progress}%)"
|
548
|
+
).ljust(20)
|
512
549
|
self.cloaker(&(@@on_update)).bind(self).call(
|
513
|
-
feed, feed_load_benchmark.real)
|
550
|
+
Thread.current.feed, feed_load_benchmark.real)
|
514
551
|
end
|
515
552
|
end
|
516
553
|
else
|
517
554
|
mutex.synchronize do
|
518
555
|
progress = sprintf("%.2f", Thread.current.progress)
|
519
|
-
self.logger.prefix =
|
520
|
-
"(#{progress}%)"
|
521
|
-
|
556
|
+
self.logger.prefix =
|
557
|
+
("Thread #{Thread.current.thread_id} (#{progress}%)"
|
558
|
+
).ljust(20)
|
522
559
|
self.logger.info(
|
523
|
-
"'#{href}' unchanged
|
560
|
+
"'#{Thread.current.href}' unchanged " +
|
561
|
+
"or unavailable, skipping.")
|
524
562
|
end
|
525
563
|
end
|
526
564
|
rescue Exception => error
|
527
565
|
mutex.synchronize do
|
528
566
|
progress = sprintf("%.2f", Thread.current.progress)
|
529
|
-
self.logger.prefix =
|
530
|
-
"(#{progress}%)"
|
531
|
-
|
567
|
+
self.logger.prefix =
|
568
|
+
("Thread #{Thread.current.thread_id} (#{progress}%)"
|
569
|
+
).ljust(20)
|
532
570
|
if @@on_error != nil
|
533
|
-
self.cloaker(&(@@on_error)).bind(self).call(
|
571
|
+
self.cloaker(&(@@on_error)).bind(self).call(
|
572
|
+
Thread.current.href, error)
|
534
573
|
else
|
535
|
-
self.logger.error(
|
574
|
+
self.logger.error(
|
575
|
+
"Error updating '#{Thread.current.href}':")
|
536
576
|
self.logger.error(error.class.name + ": " + error.message)
|
537
577
|
self.logger.error(error.class.backtrace)
|
538
578
|
end
|
@@ -545,7 +585,7 @@ module FeedTools
|
|
545
585
|
"(#{progress}%)"
|
546
586
|
).ljust(20)
|
547
587
|
self.logger.fatal("Critical unhandled error.")
|
548
|
-
self.logger.fatal("Error updating '#{href}':")
|
588
|
+
self.logger.fatal("Error updating '#{Thread.current.href}':")
|
549
589
|
self.logger.fatal(error.class.name + ": " + error.message)
|
550
590
|
self.logger.fatal(error.class.backtrace)
|
551
591
|
end
|
@@ -558,6 +598,8 @@ module FeedTools
|
|
558
598
|
class <<updater_thread
|
559
599
|
attr_accessor :thread_id
|
560
600
|
attr_accessor :progress
|
601
|
+
attr_accessor :href
|
602
|
+
attr_accessor :feed
|
561
603
|
end
|
562
604
|
updater_thread.thread_id = i
|
563
605
|
end
|
@@ -586,7 +628,9 @@ module FeedTools
|
|
586
628
|
unless @@on_complete.nil?
|
587
629
|
self.cloaker(&(@@on_complete)).bind(self).call(@feed_href_list)
|
588
630
|
end
|
631
|
+
self.logger.level = 0
|
589
632
|
self.logger.info("Finished updating.")
|
633
|
+
self.logger.level = self.updater_options[:log_level]
|
590
634
|
end
|
591
635
|
end
|
592
636
|
end
|
data/lib/feed_updater/version.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: feedupdater
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2006-04-
|
6
|
+
version: 0.2.1
|
7
|
+
date: 2006-04-20 00:00:00 -07:00
|
8
8
|
summary: Automatic feed updater daemon.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- bin
|
33
33
|
- CHANGELOG
|
34
34
|
- config
|
35
|
+
- doc
|
35
36
|
- example
|
36
37
|
- lib
|
37
38
|
- log
|