rrimm 0.9.0 → 0.11.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 +13 -5
- data/.gitignore +1 -0
- data/README.md +5 -0
- data/bin/rrimm +8 -3
- data/lib/rrimm/config.rb +20 -13
- data/lib/rrimm/feed.rb +10 -5
- data/lib/rrimm/fetcher.rb +10 -4
- data/rrimm.gemspec +2 -1
- data/spec/xkcd_spec.rb +3 -3
- metadata +38 -25
- data/Gemfile.lock +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
M2UwODJmOTk2M2IwMzljZDg3NTc3NmJkZGNkNjRmMWNhNjRjZTM1Mg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDEyNWQ3NDgzN2ZjM2VmZWVlNDI0ZDZiNTg3YjYxYmFkMjg4YWMwYQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NDQyMDk4MWJkZTQ3MjAxOWVlZTgzY2ZiZjAxZTZlODQzMjI0ZGFmMjMyNmZj
|
10
|
+
NDJiOTIzZDY2NzYzNzE1OWQzYzc0NTk4MDdhNDRkNjQ5MGJhZDFlNmVlMmEz
|
11
|
+
NWIxMGU1ZTA4NTY3Mjc3YmViOGRhZmQ5NDk5OGQxZWZlYzA2ODA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NTc2NmEwNmE4Y2FiNjljYmM2YzNiNDllOWYxNjZlYzA0NDBjYTRlYzI4MjFj
|
14
|
+
YmVjY2Y1NDVkYjljNThlYjQ0YmE3ZjgwZmI5NzI5MTg2NDFiYjgzYTVmNWYx
|
15
|
+
ZDQ4YjQ3YzIwNzYwYjFiYWNmNjNiM2YxYWNkMmQyODkxYjg5YzQ=
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -73,4 +73,9 @@ Getting started
|
|
73
73
|
To get started, please fill the configuration file at ``~/.config/rrimm/rrimm.rb`` with your feeds list and settings. An example configuration file is provided with the package. Configuring *rrimm* requires virtually no knowledge of *Ruby* language.
|
74
74
|
|
75
75
|
|
76
|
+
One step further
|
77
|
+
-----
|
78
|
+
|
79
|
+
To streamline the process of adding feeds, one can use columbus or feedbag gems in his `rrimm.rb` config file. It would help keeping it very simple.
|
80
|
+
|
76
81
|
.. _rubygems: https://rubygems.org/gems/rrimm
|
data/bin/rrimm
CHANGED
@@ -30,6 +30,11 @@ OptionParser.new do |opts|
|
|
30
30
|
options['quiet'] = true
|
31
31
|
end
|
32
32
|
|
33
|
+
opts.on('--category CATEGORY',
|
34
|
+
'Run action only on one category"') do |cat|
|
35
|
+
options['category'] = cat
|
36
|
+
end
|
37
|
+
|
33
38
|
opts.on('-a', '--action [action]', [:sync, :show, :status],
|
34
39
|
'Specify what to do: "sync" feeds, "show" config, display feed "status"') do |action|
|
35
40
|
options['action'] = action
|
@@ -50,14 +55,14 @@ fetcher = RRImm::Fetcher.new(conf)
|
|
50
55
|
IO.open STDOUT.fileno do |ios|
|
51
56
|
case options['action']
|
52
57
|
when :sync
|
53
|
-
fetcher.fetch(options['concurrency'], options['quiet'])
|
58
|
+
fetcher.fetch(options['concurrency'], options['quiet'], options['category'])
|
54
59
|
when :show
|
55
|
-
conf.show(ios)
|
60
|
+
conf.show(ios, options['category'])
|
56
61
|
when :status
|
57
62
|
one_month = 30 * 86400
|
58
63
|
one_month_ago = Time.now.to_i - one_month
|
59
64
|
six_months_ago = Time.now.to_i - 6 * one_month
|
60
65
|
|
61
|
-
conf.status(ios, one_month_ago, six_months_ago, false)
|
66
|
+
conf.status(ios, one_month_ago, six_months_ago, false, options['category'])
|
62
67
|
end
|
63
68
|
end
|
data/lib/rrimm/config.rb
CHANGED
@@ -22,14 +22,17 @@ module RRImm
|
|
22
22
|
@cache
|
23
23
|
end
|
24
24
|
|
25
|
-
def show(ios)
|
25
|
+
def show(ios, category=nil)
|
26
26
|
ios.write "Cache: #{@cache.name}\n"
|
27
27
|
ios.write " path: #{@cache.path}\n" unless @cache.path.eql? @cache.name
|
28
28
|
|
29
29
|
ios.write "Default formatter: #{default_formatter}\n" if default_formatter
|
30
30
|
|
31
31
|
ios.write "Feeds:\n"
|
32
|
-
@feeds.values.
|
32
|
+
@feeds.values.
|
33
|
+
group_by { |f| f.category }.
|
34
|
+
select { |cat, feeds| category.nil? || cat == category }.
|
35
|
+
map do |cat, feeds|
|
33
36
|
ios.write "#{cat || "unamed category"}:\n"
|
34
37
|
feeds.each do |feed|
|
35
38
|
fqdn = [feed.name, feed.uri].uniq
|
@@ -38,18 +41,22 @@ module RRImm
|
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
|
-
def status(ios, old_timestamp, very_old_timestamp, display_old_only)
|
42
|
-
@feeds.values.
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
def status(ios, old_timestamp, very_old_timestamp, display_old_only, category=nil)
|
45
|
+
@feeds.values.
|
46
|
+
select { |f| category.nil? || f.category == category }.
|
47
|
+
map { |f| [ Time.at(get_cache.read(f)), f] }.
|
48
|
+
sort_by { |el| el.first }.
|
49
|
+
each do |el|
|
50
|
+
date, f = el
|
51
|
+
case date.to_i
|
52
|
+
when 0..very_old_timestamp
|
53
|
+
ios.write "#{date} #{f.name}\n".red
|
54
|
+
when very_old_timestamp..old_timestamp
|
55
|
+
ios.write "#{date} #{f.name}\n".yellow
|
56
|
+
else
|
57
|
+
ios.write "#{date} #{f.name}\n".green unless display_old_only
|
58
|
+
end
|
51
59
|
end
|
52
|
-
end
|
53
60
|
end
|
54
61
|
|
55
62
|
def evaluate_feed_definition(feed_name, &block)
|
data/lib/rrimm/feed.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'mixlib/shellout'
|
2
|
+
require 'stringio'
|
3
|
+
|
1
4
|
module RRImm
|
2
5
|
class Feed
|
3
6
|
|
@@ -16,12 +19,14 @@ module RRImm
|
|
16
19
|
|
17
20
|
def format(feed, item)
|
18
21
|
@formatter ||= @formatter_class.new
|
19
|
-
|
20
|
-
|
21
|
-
@formatter.format(feed,
|
22
|
-
pipe.close_write
|
23
|
-
pipe.read.split("\n").each { |l| puts l }
|
22
|
+
s = ""
|
23
|
+
StringIO.open(s) do |str|
|
24
|
+
@formatter.format(feed,item, self, str)
|
24
25
|
end
|
26
|
+
cmd = Mixlib::ShellOut.new(pipe, :input => s)
|
27
|
+
cmd.run_command
|
28
|
+
puts cmd.stderr if cmd.error?
|
29
|
+
cmd.error!
|
25
30
|
end
|
26
31
|
|
27
32
|
def category(arg=nil)
|
data/lib/rrimm/fetcher.rb
CHANGED
@@ -13,8 +13,9 @@ module RRImm
|
|
13
13
|
@config = config
|
14
14
|
end
|
15
15
|
|
16
|
-
def fetch(concurrency=nil, quiet=false)
|
16
|
+
def fetch(concurrency=nil, quiet=false, category=nil)
|
17
17
|
@quiet ||= quiet
|
18
|
+
@category ||= category
|
18
19
|
if concurrency
|
19
20
|
parallel_fetch(concurrency)
|
20
21
|
else
|
@@ -23,18 +24,22 @@ module RRImm
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def parallel_fetch(concurrency)
|
26
|
-
Parallel.map(
|
27
|
+
Parallel.map(feeds, :in_threads => concurrency, :progress => "fetching") do |name,feed_config|
|
27
28
|
@quiet = true
|
28
29
|
fetch_feed(name, feed_config)
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
33
|
def linear_fetch
|
33
|
-
|
34
|
+
feeds.map do |name,feed_config|
|
34
35
|
fetch_feed(name, feed_config)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
39
|
+
def feeds
|
40
|
+
@config.feeds.select { |f,conf| @category.nil? || conf.category == @category }
|
41
|
+
end
|
42
|
+
|
38
43
|
def fetch_feed(name, feed_config)
|
39
44
|
begin
|
40
45
|
Timeout::timeout(30) do
|
@@ -48,7 +53,8 @@ module RRImm
|
|
48
53
|
def fetch_feed_no_timeout(name, feed_config)
|
49
54
|
last_read = Time.at(@config.get_cache.read(feed_config))
|
50
55
|
print name unless @quiet
|
51
|
-
|
56
|
+
options = { compress: true }
|
57
|
+
feed = Feedjira::Feed.fetch_and_parse(feed_config.uri, options)
|
52
58
|
if feed.respond_to? :entries
|
53
59
|
items = feed.entries.select { |item| item.published > last_read }
|
54
60
|
last_read = items.collect { |item| item.published }.max unless items.empty?
|
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.11.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"
|
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_dependency 'ruby-progressbar'
|
17
17
|
s.add_dependency 'feedjira'
|
18
18
|
s.add_dependency 'colorize'
|
19
|
+
s.add_dependency 'mixlib-shellout'
|
19
20
|
|
20
21
|
s.add_development_dependency 'rspec'
|
21
22
|
s.add_development_dependency 'coveralls'
|
data/spec/xkcd_spec.rb
CHANGED
@@ -12,13 +12,13 @@ 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.
|
16
|
-
config.
|
15
|
+
expect(config).to receive(:category).twice.and_return nil
|
16
|
+
expect(config).to receive(:default_name?).and_return(true, false)
|
17
17
|
mail_formatter.format(feed, feed.entries.first, config, s)
|
18
18
|
expect(s.string).to eq "From: RRImm <from@example.com>\nTo: to@example.com\nDate: Fri, 07 Mar 2014 05:00:00 -0000\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
19
|
s = StringIO.new
|
20
20
|
|
21
|
-
config.
|
21
|
+
expect(config).to receive(:name).and_return "Randall Munroe"
|
22
22
|
mail_formatter.format(feed, feed.entries.first, config, s)
|
23
23
|
end
|
24
24
|
end
|
metadata
CHANGED
@@ -1,125 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rrimm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.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:
|
11
|
+
date: 2015-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: open_uri_redirections
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: parallel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: ruby-progressbar
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: feedjira
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: colorize
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ! '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mixlib-shellout
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rspec
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - ! '>='
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - ! '>='
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: coveralls
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
|
-
- -
|
115
|
+
- - ! '>='
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: '0'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
|
-
- -
|
122
|
+
- - ! '>='
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: codeclimate-test-reporter
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- -
|
129
|
+
- - ! '>='
|
116
130
|
- !ruby/object:Gem::Version
|
117
131
|
version: '0'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- -
|
136
|
+
- - ! '>='
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
139
|
description: imm reboot in ruby. Retrieve rss feeds and send them by email
|
@@ -129,12 +143,11 @@ executables:
|
|
129
143
|
extensions: []
|
130
144
|
extra_rdoc_files: []
|
131
145
|
files:
|
132
|
-
-
|
133
|
-
-
|
134
|
-
-
|
146
|
+
- .coveralls.yml
|
147
|
+
- .gitignore
|
148
|
+
- .travis.yml
|
135
149
|
- CONTRIBUTING.md
|
136
150
|
- Gemfile
|
137
|
-
- Gemfile.lock
|
138
151
|
- LICENSE
|
139
152
|
- README.md
|
140
153
|
- bin/rrimm
|
@@ -169,17 +182,17 @@ require_paths:
|
|
169
182
|
- lib
|
170
183
|
required_ruby_version: !ruby/object:Gem::Requirement
|
171
184
|
requirements:
|
172
|
-
- -
|
185
|
+
- - ! '>='
|
173
186
|
- !ruby/object:Gem::Version
|
174
187
|
version: '0'
|
175
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
189
|
requirements:
|
177
|
-
- -
|
190
|
+
- - ! '>='
|
178
191
|
- !ruby/object:Gem::Version
|
179
192
|
version: '0'
|
180
193
|
requirements: []
|
181
194
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.
|
195
|
+
rubygems_version: 2.4.5
|
183
196
|
signing_key:
|
184
197
|
specification_version: 4
|
185
198
|
summary: RSS to email tool
|
data/Gemfile.lock
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
rrimm (0.9.0)
|
5
|
-
colorize
|
6
|
-
feedjira
|
7
|
-
open_uri_redirections
|
8
|
-
parallel
|
9
|
-
ruby-progressbar
|
10
|
-
|
11
|
-
GEM
|
12
|
-
remote: https://rubygems.org/
|
13
|
-
specs:
|
14
|
-
codeclimate-test-reporter (0.3.0)
|
15
|
-
simplecov (>= 0.7.1, < 1.0.0)
|
16
|
-
colorize (0.7.3)
|
17
|
-
coveralls (0.7.0)
|
18
|
-
multi_json (~> 1.3)
|
19
|
-
rest-client
|
20
|
-
simplecov (>= 0.7)
|
21
|
-
term-ansicolor
|
22
|
-
thor
|
23
|
-
curb (0.8.6)
|
24
|
-
diff-lcs (1.2.5)
|
25
|
-
docile (1.1.3)
|
26
|
-
feedjira (1.4.0)
|
27
|
-
curb (~> 0.8)
|
28
|
-
loofah (~> 2.0)
|
29
|
-
sax-machine (~> 1.0)
|
30
|
-
loofah (2.0.1)
|
31
|
-
nokogiri (>= 1.5.9)
|
32
|
-
mime-types (2.1)
|
33
|
-
mini_portile (0.6.0)
|
34
|
-
multi_json (1.9.0)
|
35
|
-
nokogiri (1.6.3.1)
|
36
|
-
mini_portile (= 0.6.0)
|
37
|
-
open_uri_redirections (0.1.4)
|
38
|
-
parallel (1.3.2)
|
39
|
-
rest-client (1.6.7)
|
40
|
-
mime-types (>= 1.16)
|
41
|
-
rspec (2.14.1)
|
42
|
-
rspec-core (~> 2.14.0)
|
43
|
-
rspec-expectations (~> 2.14.0)
|
44
|
-
rspec-mocks (~> 2.14.0)
|
45
|
-
rspec-core (2.14.7)
|
46
|
-
rspec-expectations (2.14.5)
|
47
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
48
|
-
rspec-mocks (2.14.6)
|
49
|
-
ruby-progressbar (1.6.0)
|
50
|
-
sax-machine (1.0.2)
|
51
|
-
simplecov (0.8.2)
|
52
|
-
docile (~> 1.1.0)
|
53
|
-
multi_json
|
54
|
-
simplecov-html (~> 0.8.0)
|
55
|
-
simplecov-html (0.8.0)
|
56
|
-
term-ansicolor (1.3.0)
|
57
|
-
tins (~> 1.0)
|
58
|
-
thor (0.18.1)
|
59
|
-
tins (1.0.0)
|
60
|
-
|
61
|
-
PLATFORMS
|
62
|
-
ruby
|
63
|
-
|
64
|
-
DEPENDENCIES
|
65
|
-
codeclimate-test-reporter
|
66
|
-
coveralls
|
67
|
-
rrimm!
|
68
|
-
rspec
|