rrimm 0.4.0 → 0.5.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.
- checksums.yaml +8 -8
- data/.travis.yml +3 -0
- data/CONTRIBUTING.md +8 -0
- data/Gemfile.lock +4 -1
- data/LICENSE +21 -0
- data/README.md +1 -0
- data/bin/rrimm +18 -12
- data/examples/complete_config.rb +11 -3
- data/lib/rrimm/config.rb +16 -21
- data/lib/rrimm/feed.rb +2 -1
- data/lib/rrimm/fetcher.rb +3 -2
- data/rakefile +5 -0
- data/rrimm.gemspec +2 -1
- data/script/setup +6 -0
- data/script/test +3 -0
- data/spec/config_spec.rb +37 -0
- data/spec/feed_spec.rb +20 -0
- data/spec/fetcher_spec.rb +37 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/xkcd_spec.rb +6 -3
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YjVmZjhiNTQwODZhMDc1YTFkMmE1MjU2NDdiMWMxOTFmMGRjYjQ4Yg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NGViNGJlOGFiYWYxODU2MWE1OTk3MmNkN2JjY2I4Njk5MGMyODNmYw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzEzMGE3NTIzNjU2MTViOTI4ZmNlZTRhZGI5YzYzOWM5M2M0Yzc0MGEwNDc4
|
10
|
+
MTNlMjJlZGVjNWZkMzcyYmRiZTkyOWU5ODU5YzZkZTc3N2E1NGI4YjQ2ZTYz
|
11
|
+
M2UyOGQ2ZWEzMDJmNzdkYWFjMzJiNDJiMjc1OWI2MTE5MTRkMDM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTY4YjFiMzNjYjE5ZjU1YjZiMDlmY2IzM2MzMzY4ZTJjZjJhYTU4ZmZhNDY2
|
14
|
+
OTRhMzNmOTBlZGZiNmM5ZjVlMzljODllNjZjNmVhYzliZTBjM2E4NGVjYzU1
|
15
|
+
NWU3NTNjY2VkYThjMWVkNWY1YmJhMjBlY2U4ODg3MmFlMjE3Yjc=
|
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
How-to
|
2
|
+
------
|
3
|
+
|
4
|
+
There are several ways to contribute and all kinds are welcome.
|
5
|
+
|
6
|
+
Report bugs : open a github issue, describe the issue and how to reproduce it
|
7
|
+
Feature request : open a github issue, describe the feature of your dreams
|
8
|
+
Propose a patch : open a PR
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rrimm (0.
|
4
|
+
rrimm (0.5.0)
|
5
5
|
colorize
|
6
6
|
feedzirra
|
7
7
|
open_uri_redirections
|
@@ -10,6 +10,8 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
+
codeclimate-test-reporter (0.3.0)
|
14
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
13
15
|
colorize (0.7.0)
|
14
16
|
coveralls (0.7.0)
|
15
17
|
multi_json (~> 1.3)
|
@@ -59,6 +61,7 @@ PLATFORMS
|
|
59
61
|
ruby
|
60
62
|
|
61
63
|
DEPENDENCIES
|
64
|
+
codeclimate-test-reporter
|
62
65
|
coveralls
|
63
66
|
rrimm!
|
64
67
|
rspec
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Grégoire Seux
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
CHANGED
@@ -6,6 +6,7 @@ About rrimm
|
|
6
6
|
[](http://badge.fury.io/rb/rrimm)
|
7
7
|
[](https://gemnasium.com/kamaradclimber/rrimm)
|
8
8
|
[](https://coveralls.io/r/kamaradclimber/rrimm?branch=master)
|
9
|
+
[](https://codeclimate.com/github/kamaradclimber/rrimm)
|
9
10
|
|
10
11
|
In a nutshell
|
11
12
|
-------------
|
data/bin/rrimm
CHANGED
@@ -25,6 +25,11 @@ OptionParser.new do |opts|
|
|
25
25
|
options['concurrency'] = c.to_i
|
26
26
|
end
|
27
27
|
|
28
|
+
opts.on('-q', '--quiet',
|
29
|
+
'Activate quiet mode, will only print errors') do
|
30
|
+
options['quiet'] = true
|
31
|
+
end
|
32
|
+
|
28
33
|
opts.on('-a', '--action [action]', [:sync, :show, :status],
|
29
34
|
'Specify what to do: "sync" feeds, "show" config, display feed "status"') do |action|
|
30
35
|
options['action'] = action
|
@@ -42,16 +47,17 @@ conf = RRImm::Config.new
|
|
42
47
|
conf.load(options['conf_file'])
|
43
48
|
|
44
49
|
fetcher = RRImm::Fetcher.new(conf)
|
45
|
-
|
46
|
-
case options['action']
|
47
|
-
when :sync
|
48
|
-
|
49
|
-
when :show
|
50
|
-
|
51
|
-
when :status
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
IO.open STDOUT.fileno do |ios|
|
51
|
+
case options['action']
|
52
|
+
when :sync
|
53
|
+
fetcher.fetch(options['concurrency'], options['quiet'])
|
54
|
+
when :show
|
55
|
+
conf.show(ios)
|
56
|
+
when :status
|
57
|
+
one_month = 30 * 86400
|
58
|
+
one_month_ago = Time.now.to_i - one_month
|
59
|
+
six_months_ago = Time.now.to_i - 6 * one_month
|
60
|
+
|
61
|
+
conf.status(ios, one_month_ago, six_months_ago, false)
|
62
|
+
end
|
57
63
|
end
|
data/examples/complete_config.rb
CHANGED
@@ -3,22 +3,30 @@ default_formatter RRImm::ItemFormatter::Mail.new(
|
|
3
3
|
to: 'me@me.com'
|
4
4
|
)
|
5
5
|
pipe "msmtp -t --read-envelope-from"
|
6
|
-
#pipe "cat"
|
7
6
|
|
8
|
-
feed
|
7
|
+
# most simple declaration : feed [uri]
|
9
8
|
feed "http://www.archlinux.org/feeds/news/"
|
10
|
-
feed "http://alan.petitepomme.net/cwn/cwn.rss"
|
11
9
|
|
10
|
+
# full declaration feed [name] do [block] end
|
12
11
|
feed "xkcd" do
|
13
12
|
uri "http://xkcd.com/rss.xml"
|
14
13
|
category "webcomics"
|
15
14
|
end
|
15
|
+
|
16
16
|
feed 'Cartesian comics' do
|
17
17
|
uri 'http://feeds.feedburner.com/CartesianClosedComic?format=xml'
|
18
18
|
category "webcomics"
|
19
19
|
end
|
20
|
+
|
20
21
|
feed 'SMBC' do
|
21
22
|
uri "http://www.smbc-comics.com/rss.php"
|
22
23
|
category 'webcomics'
|
23
24
|
end
|
24
25
|
|
26
|
+
# namespace by category (and soon with all attributes)
|
27
|
+
category 'languages' do
|
28
|
+
feed 'ocaml' do
|
29
|
+
uri 'http://alan.petitepomme.net/cwn/cwn.rss'
|
30
|
+
end
|
31
|
+
feed "http://planet.haskell.org/rss20.xml"
|
32
|
+
end
|
data/lib/rrimm/config.rb
CHANGED
@@ -4,6 +4,7 @@ module RRImm
|
|
4
4
|
class Config
|
5
5
|
attr :feeds, :cache
|
6
6
|
attr :default_formatter, :pipe
|
7
|
+
attr_accessor :output
|
7
8
|
|
8
9
|
def initialize
|
9
10
|
@feeds = {}
|
@@ -21,38 +22,32 @@ module RRImm
|
|
21
22
|
@cache
|
22
23
|
end
|
23
24
|
|
24
|
-
def show
|
25
|
-
|
26
|
-
|
25
|
+
def show(ios)
|
26
|
+
ios.write "Cache: #{@cache.name}\n"
|
27
|
+
ios.write " path: #{@cache.path}\n" unless @cache.path.eql? @cache.name
|
27
28
|
|
28
|
-
|
29
|
+
ios.write "Default formatter: #{default_formatter}\n" if default_formatter
|
29
30
|
|
30
|
-
|
31
|
+
ios.write "Feeds:\n"
|
31
32
|
@feeds.values.group_by { |f| f.category }.map do |cat, feeds|
|
32
|
-
|
33
|
-
puts ""
|
34
|
-
else
|
35
|
-
puts "#{cat}:"
|
36
|
-
end
|
33
|
+
ios.write "#{cat || "unamed category"}:\n"
|
37
34
|
feeds.each do |feed|
|
38
|
-
fqdn = [feed.name]
|
39
|
-
|
40
|
-
puts "- #{fqdn.join ': '}"
|
35
|
+
fqdn = [feed.name, feed.uri].uniq
|
36
|
+
ios.write "- #{fqdn.join ': '}\n"
|
41
37
|
end
|
42
38
|
end
|
43
39
|
end
|
44
40
|
|
45
|
-
def status(old_timestamp, very_old_timestamp, display_old_only)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
case el.first
|
41
|
+
def status(ios, old_timestamp, very_old_timestamp, display_old_only)
|
42
|
+
@feeds.values.map { |f| [ Time.at(get_cache.read(f)), f] }.sort_by { |el| el.first }.each do |el|
|
43
|
+
date, f = el
|
44
|
+
case date.to_i
|
50
45
|
when 0..very_old_timestamp
|
51
|
-
|
46
|
+
ios.write "#{date} #{f.name}\n".red
|
52
47
|
when very_old_timestamp..old_timestamp
|
53
|
-
|
48
|
+
ios.write "#{date} #{f.name}\n".yellow
|
54
49
|
else
|
55
|
-
|
50
|
+
ios.write "#{date} #{f.name}\n".green unless display_old_only
|
56
51
|
end
|
57
52
|
end
|
58
53
|
end
|
data/lib/rrimm/feed.rb
CHANGED
@@ -7,10 +7,11 @@ module RRImm
|
|
7
7
|
attr_accessor :category
|
8
8
|
attr_accessor :pipe
|
9
9
|
|
10
|
-
def initialize(name)
|
10
|
+
def initialize(name, &block)
|
11
11
|
@name = name
|
12
12
|
@uri = name
|
13
13
|
@formatter_class = RRImm::ItemFormatter::Default
|
14
|
+
self.instance_eval(&block) if block
|
14
15
|
end
|
15
16
|
|
16
17
|
def format(feed, item)
|
data/lib/rrimm/fetcher.rb
CHANGED
@@ -12,7 +12,8 @@ module RRImm
|
|
12
12
|
@config = config
|
13
13
|
end
|
14
14
|
|
15
|
-
def fetch(concurrency=nil)
|
15
|
+
def fetch(concurrency=nil, quiet=false)
|
16
|
+
@quiet ||= quiet
|
16
17
|
if concurrency
|
17
18
|
parallel_fetch(concurrency)
|
18
19
|
else
|
@@ -34,7 +35,7 @@ module RRImm
|
|
34
35
|
|
35
36
|
def fetch_feed(name, feed_config)
|
36
37
|
last_read = Time.at(@config.get_cache.read(feed_config))
|
37
|
-
puts name
|
38
|
+
puts name unless @quiet
|
38
39
|
feed = Feedzirra::Feed.fetch_and_parse(feed_config.uri)
|
39
40
|
items = feed.entries.select { |item| item.published > last_read }
|
40
41
|
last_read = items.collect { |item| item.published }.max unless items.empty?
|
data/rakefile
ADDED
data/rrimm.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rrimm'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.5.0'
|
4
4
|
s.licenses = ['Apache Licence v2']
|
5
5
|
s.summary = "RSS to email tool"
|
6
6
|
s.description = "imm reboot in ruby. Retrieve rss feeds and send them by email"
|
@@ -18,4 +18,5 @@ Gem::Specification.new do |s|
|
|
18
18
|
|
19
19
|
s.add_development_dependency 'rspec'
|
20
20
|
s.add_development_dependency 'coveralls'
|
21
|
+
s.add_development_dependency 'codeclimate-test-reporter'
|
21
22
|
end
|
data/script/setup
ADDED
data/script/test
ADDED
data/spec/config_spec.rb
CHANGED
@@ -8,5 +8,42 @@ describe RRImm::Config do
|
|
8
8
|
conf.load(File.join(File.dirname(__FILE__), '..', 'examples', 'most_simple_config.rb'))
|
9
9
|
expect(conf.feeds.size).to be 2
|
10
10
|
end
|
11
|
+
|
12
|
+
it 'loads feeds properly with complex conf' do
|
13
|
+
conf = RRImm::Config.new
|
14
|
+
expect(conf.feeds.size).to be 0
|
15
|
+
conf.load(File.join(File.dirname(__FILE__), '..', 'examples', 'complete_config.rb'))
|
16
|
+
expect(conf.feeds.size).to be 6
|
17
|
+
expect(conf.feeds['SMBC'].category).to eq 'webcomics'
|
18
|
+
expect(conf.feeds['ocaml'].category).to eq 'languages'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'show' do
|
23
|
+
it 'displays config properly' do
|
24
|
+
ios = StringIO.new
|
25
|
+
conf = RRImm::Config.new
|
26
|
+
conf.load(File.join(File.dirname(__FILE__), '..', 'examples', 'complete_config.rb'))
|
27
|
+
expect{ conf.show(ios) }.not_to raise_error
|
28
|
+
expect(ios.string).to include "default cache"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'status' do
|
33
|
+
it 'prints status properly' do
|
34
|
+
cache = double('cache')
|
35
|
+
allow(cache).to receive(:read).and_return(1, 4, 7)
|
36
|
+
allow(cache).to receive(:path)
|
37
|
+
ios = StringIO.new
|
38
|
+
allow(RRImm::Cache).to receive(:new).and_return(cache)
|
39
|
+
conf = RRImm::Config.new
|
40
|
+
conf.feeds['1_very_old'] = RRImm::Feed.new 'very_old'
|
41
|
+
conf.feeds['3_old'] = RRImm::Feed.new 'old'
|
42
|
+
conf.feeds['7_recent'] = RRImm::Feed.new 'recent'
|
43
|
+
expect{ conf.status(ios, 5, 3, false) }.not_to raise_error
|
44
|
+
expect(ios.string).to include "#{Time.at(1)} very_old\n".red
|
45
|
+
expect(ios.string).to include "#{Time.at(4)} old\n".yellow
|
46
|
+
expect(ios.string).to include "#{Time.at(7)} recent\n".green
|
47
|
+
end
|
11
48
|
end
|
12
49
|
end
|
data/spec/feed_spec.rb
CHANGED
@@ -6,7 +6,27 @@ describe RRImm::Feed do
|
|
6
6
|
f = RRImm::Feed.new 'a random feed'
|
7
7
|
expect(f.name).to eq('a random feed')
|
8
8
|
expect(f.uri).to eq('a random feed')
|
9
|
+
expect(f.default_name?).to be true
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'calls the block if one is specifed' do
|
13
|
+
f = RRImm::Feed.new 'a another feed' do
|
14
|
+
pipe "cat | cat"
|
15
|
+
formatter_class RRImm::ItemFormatter::Mail
|
16
|
+
end
|
17
|
+
expect(f.pipe).to eq "cat | cat"
|
18
|
+
expect(f.formatter_class).to eq RRImm::ItemFormatter::Mail
|
9
19
|
end
|
10
20
|
end
|
11
21
|
|
22
|
+
describe ".format" do
|
23
|
+
it 'calls formatter' do
|
24
|
+
formatter = double('formatter')
|
25
|
+
f = RRImm::Feed.new 'a random feed'
|
26
|
+
f.pipe "cat /dev/null"
|
27
|
+
f.formatter = formatter
|
28
|
+
expect(formatter).to receive(:format)
|
29
|
+
expect { f.format(nil, nil) }.not_to raise_error
|
30
|
+
end
|
31
|
+
end
|
12
32
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe RRImm::Fetcher do
|
4
|
+
let(:basic_conf) do
|
5
|
+
xkcd_file = File.join('file://', File.dirname(__FILE__), 'xkcd.xml')
|
6
|
+
feed = RRImm::Feed.new xkcd_file do
|
7
|
+
pipe 'cat > /dev/null'
|
8
|
+
end
|
9
|
+
cache = double('cache_mock')
|
10
|
+
allow(RRImm::Cache).to receive(:new).and_return(cache)
|
11
|
+
allow(cache).to receive(:path)
|
12
|
+
|
13
|
+
allow(cache).to receive(:read).and_return(3829)
|
14
|
+
allow(cache).to receive(:save)
|
15
|
+
|
16
|
+
config = RRImm::Config.new
|
17
|
+
config.feeds['local_xkcd'] = feed
|
18
|
+
config
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#initialize' do
|
22
|
+
it 'createscorrectly' do
|
23
|
+
expect { RRImm::Fetcher.new basic_conf }.not_to raise_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#fetch' do
|
28
|
+
it 'fetches correctly' do
|
29
|
+
fetcher = RRImm::Fetcher.new basic_conf
|
30
|
+
expect { fetcher.fetch }.not_to raise_error
|
31
|
+
end
|
32
|
+
it 'fetches correctly when using concurrency' do
|
33
|
+
fetcher = RRImm::Fetcher.new basic_conf
|
34
|
+
expect { fetcher.fetch(5) }.not_to raise_error
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/xkcd_spec.rb
CHANGED
@@ -12,11 +12,14 @@ describe RRImm::ItemFormatter::Mail do
|
|
12
12
|
expect(feed.entries.size).to be > 0
|
13
13
|
s = StringIO.new
|
14
14
|
config = double('config')
|
15
|
-
config.should_receive(:category).and_return nil
|
16
|
-
config.should_receive(:default_name?).and_return(true)
|
15
|
+
config.should_receive(:category).twice.and_return nil
|
16
|
+
config.should_receive(:default_name?).and_return(true, false)
|
17
17
|
mail_formatter.format(feed, feed.entries.first, config, s)
|
18
|
-
s.close
|
19
18
|
expect(s.string).to eq "From: RRImm <from@example.com>\nTo: to@example.com\nSubject: When You Assume\nContent-Type: text/html;\n\nhttp://xkcd.com/1339/\n\n<img src=\"http://imgs.xkcd.com/comics/when_you_assume.png\" title=\"You know what happens when you assert--you make an ass out of the emergency response team.\" alt=\"You know what happens when you assert--you make an ass out of the emergency response team.\" />\n"
|
19
|
+
s = StringIO.new
|
20
|
+
|
21
|
+
config.should_receive(:name).and_return "Randall Munroe"
|
22
|
+
mail_formatter.format(feed, feed.entries.first, config, s)
|
20
23
|
end
|
21
24
|
end
|
22
25
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rrimm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grégoire Seux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: open_uri_redirections
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ! '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: codeclimate-test-reporter
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: imm reboot in ruby. Retrieve rss feeds and send them by email
|
98
112
|
email: rrimm@familleseux.net
|
99
113
|
executables:
|
@@ -104,8 +118,10 @@ files:
|
|
104
118
|
- .coveralls.yml
|
105
119
|
- .gitignore
|
106
120
|
- .travis.yml
|
121
|
+
- CONTRIBUTING.md
|
107
122
|
- Gemfile
|
108
123
|
- Gemfile.lock
|
124
|
+
- LICENSE
|
109
125
|
- README.md
|
110
126
|
- bin/rrimm
|
111
127
|
- examples/complete_config.rb
|
@@ -118,10 +134,14 @@ files:
|
|
118
134
|
- lib/rrimm/item_formatter.rb
|
119
135
|
- lib/rrimm/item_formatter/default.rb
|
120
136
|
- lib/rrimm/item_formatter/mail.rb
|
137
|
+
- rakefile
|
121
138
|
- rrimm.gemspec
|
139
|
+
- script/setup
|
140
|
+
- script/test
|
122
141
|
- spec/cache_spec.rb
|
123
142
|
- spec/config_spec.rb
|
124
143
|
- spec/feed_spec.rb
|
144
|
+
- spec/fetcher_spec.rb
|
125
145
|
- spec/spec_helper.rb
|
126
146
|
- spec/xkcd.xml
|
127
147
|
- spec/xkcd_spec.rb
|
@@ -153,6 +173,7 @@ test_files:
|
|
153
173
|
- spec/cache_spec.rb
|
154
174
|
- spec/config_spec.rb
|
155
175
|
- spec/feed_spec.rb
|
176
|
+
- spec/fetcher_spec.rb
|
156
177
|
- spec/spec_helper.rb
|
157
178
|
- spec/xkcd.xml
|
158
179
|
- spec/xkcd_spec.rb
|