rubypodder 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/bin/rubypodder +6 -0
- data/lib/rubypodder.rb +16 -5
- data/tests/tc_rubypodder.rb +25 -0
- data/tests/tc_stdout.rb +52 -0
- data/tests/ts_rubypodder.rb +4 -0
- metadata +6 -2
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rake/gempackagetask'
|
|
4
4
|
spec = Gem::Specification.new do |s|
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.name = "rubypodder"
|
7
|
-
s.version = "0.1.
|
7
|
+
s.version = "0.1.2"
|
8
8
|
s.author = "Lex Miller"
|
9
9
|
s.email = "lex.miller @nospam@ gmail.com"
|
10
10
|
s.summary = "A podcast aggregator without an interface"
|
data/bin/rubypodder
CHANGED
@@ -1,2 +1,8 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
1
2
|
require 'rubypodder'
|
3
|
+
require 'optparse'
|
4
|
+
opts = OptionParser.new
|
5
|
+
opts.on("-v", "--version") { puts RubyPodder::Version; exit }
|
6
|
+
opts.on("-h", "--help") { puts opts.to_s + "See http://rubypodder.rubyforge.org/\n"; exit }
|
7
|
+
opts.parse(*ARGV)
|
2
8
|
RubyPodder.new.run
|
data/lib/rubypodder.rb
CHANGED
@@ -17,6 +17,8 @@ end
|
|
17
17
|
|
18
18
|
class RubyPodder
|
19
19
|
|
20
|
+
Version = 'rubypodder v0.1.2'
|
21
|
+
|
20
22
|
attr_reader :conf_file, :log_file, :done_file, :date_dir
|
21
23
|
|
22
24
|
def initialize(file_base="~/.rubypodder/rp")
|
@@ -78,9 +80,13 @@ class RubyPodder
|
|
78
80
|
def download(url)
|
79
81
|
return if already_downloaded(url)
|
80
82
|
@log.info(" Downloading: #{url}")
|
81
|
-
|
82
|
-
|
83
|
-
|
83
|
+
begin
|
84
|
+
file_name = dest_file_name(url)
|
85
|
+
rio(file_name) < rio(url)
|
86
|
+
record_download(url)
|
87
|
+
rescue
|
88
|
+
@log.error(" Failed to download #{url}")
|
89
|
+
end
|
84
90
|
end
|
85
91
|
|
86
92
|
def remove_dir_if_empty(dirname)
|
@@ -94,9 +100,14 @@ class RubyPodder
|
|
94
100
|
end
|
95
101
|
|
96
102
|
def run
|
97
|
-
@log.info("Starting")
|
103
|
+
@log.info("Starting (#{Version})")
|
98
104
|
read_feeds.each do |url|
|
99
|
-
|
105
|
+
begin
|
106
|
+
http_body = rio(url).contents
|
107
|
+
rescue
|
108
|
+
@log.error(" Can't read from #{url}")
|
109
|
+
next
|
110
|
+
end
|
100
111
|
rss = parse_rss(http_body)
|
101
112
|
@log.info("Channel: #{rss.channel.title}")
|
102
113
|
rss.items.each do |item|
|
data/tests/tc_rubypodder.rb
CHANGED
@@ -189,6 +189,13 @@ class TC_RubyPodder < Test::Unit::TestCase
|
|
189
189
|
assert(!File.exists?(dest_file))
|
190
190
|
end
|
191
191
|
|
192
|
+
def test_download_error_is_logged
|
193
|
+
@rp.download("http://very.very.broken.url/oh/no/oh/dear.xml")
|
194
|
+
File.open( @rp.log_file ) do |f|
|
195
|
+
assert(f.any? { |line| line =~ /ERROR/ }, "Error in download should be logged")
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
192
199
|
def test_remove_dir_if_empty
|
193
200
|
system("mkdir -p " + @subdir)
|
194
201
|
@rp.remove_dir_if_empty(@subdir)
|
@@ -199,4 +206,22 @@ class TC_RubyPodder < Test::Unit::TestCase
|
|
199
206
|
assert(File.exists?(@subdir))
|
200
207
|
end
|
201
208
|
|
209
|
+
def test_log_contains_version
|
210
|
+
File.open("/tmp/test_rp.conf", "w") { |file| file.write("# Empty config file\n") }
|
211
|
+
@rp = RubyPodder.new("/tmp/test_rp")
|
212
|
+
@rp.run
|
213
|
+
File.open( @rp.log_file ) do |f|
|
214
|
+
assert(f.any? { |line| line =~ /Starting.+#{RubyPodder::Version}/ }, "'Starting' log entry should contain '#{RubyPodder::Version}'")
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_log_contains_error_for_unreadable_feed_url
|
219
|
+
File.open("/tmp/test_rp.conf", "w") { |file| file.write("http://very.very.broken.url/oh/no/oh/dear.xml\n") }
|
220
|
+
@rp = RubyPodder.new("/tmp/test_rp")
|
221
|
+
@rp.run
|
222
|
+
File.open( @rp.log_file ) do |f|
|
223
|
+
assert(f.any? { |line| line =~ /ERROR/ }, "Error in feed url should be logged")
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
202
227
|
end
|
data/tests/tc_stdout.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
class StringStream < String
|
4
|
+
def write(message)
|
5
|
+
self.<< message
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def wrap(&b)
|
10
|
+
raise "Expected block!" unless block_given?
|
11
|
+
s = StringStream.new
|
12
|
+
old = $stdout.clone
|
13
|
+
$stdout = s
|
14
|
+
b.call
|
15
|
+
$stdout = old
|
16
|
+
s
|
17
|
+
end
|
18
|
+
|
19
|
+
def last_log
|
20
|
+
log = '/tmp/.rubypodder/rp.log'
|
21
|
+
File.exists?(log) ? File.mtime('/tmp/.rubypodder/rp.log') : Time.at(0)
|
22
|
+
end
|
23
|
+
|
24
|
+
def exits_without_doing_anything(&b)
|
25
|
+
raise "Expected block!" unless block_given?
|
26
|
+
before = last_log
|
27
|
+
b.call
|
28
|
+
after = last_log
|
29
|
+
before == after
|
30
|
+
end
|
31
|
+
|
32
|
+
class TC_stdout < Test::Unit::TestCase
|
33
|
+
def setup
|
34
|
+
ENV['HOME'] = "/tmp"
|
35
|
+
@bindir = File.join(File.dirname(__FILE__), "..", "bin")
|
36
|
+
end
|
37
|
+
|
38
|
+
def teardown
|
39
|
+
system("rm -rf " + "/tmp/.rubypodder")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_version
|
43
|
+
assert_equal "rubypodder v0.1.2\n", wrap { puts `ruby #{@bindir}/rubypodder --version` }
|
44
|
+
assert exits_without_doing_anything { `ruby #{@bindir}/rubypodder --version` }, "--version doesn't exit immediately"
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_help
|
48
|
+
assert_match %r{See http://rubypodder.rubyforge.org/}, wrap { puts `ruby #{@bindir}/rubypodder --help` }
|
49
|
+
assert exits_without_doing_anything { `ruby #{@bindir}/rubypodder --help` }, "--help doesn't exit immediately"
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rubypodder
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2007-02-25 00:00:00 +13:00
|
8
8
|
summary: A podcast aggregator without an interface
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,11 +31,15 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- lib/rubypodder.rb
|
33
33
|
- tests/tc_rubypodder.rb
|
34
|
+
- tests/ts_rubypodder.rb
|
35
|
+
- tests/tc_stdout.rb
|
34
36
|
- Rakefile
|
35
37
|
- README
|
36
38
|
- MIT-LICENSE
|
37
39
|
test_files:
|
38
40
|
- tests/tc_rubypodder.rb
|
41
|
+
- tests/ts_rubypodder.rb
|
42
|
+
- tests/tc_stdout.rb
|
39
43
|
rdoc_options: []
|
40
44
|
extra_rdoc_files:
|
41
45
|
- README
|