rrimm 0.9.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c42c07425e1b028e898d4c64689e6fa2ec799d09
4
- data.tar.gz: 0013f94a2a64982c3cf6dd21c0566b2561a1da8c
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2UwODJmOTk2M2IwMzljZDg3NTc3NmJkZGNkNjRmMWNhNjRjZTM1Mg==
5
+ data.tar.gz: !binary |-
6
+ MDEyNWQ3NDgzN2ZjM2VmZWVlNDI0ZDZiNTg3YjYxYmFkMjg4YWMwYQ==
5
7
  SHA512:
6
- metadata.gz: a4e8d1fc6cb0e9ffbc6263011bb32dd635f42bd15b926dcc819946789c4b7cfe75f4a0fe9ed11337175a28df6029e33f0ad534111b88548b8ed7f14a9ef723ff
7
- data.tar.gz: 3f2a69c9f8c8fa8b9598270db124cadc71701ad147c914baee7e1b8f67c3ffe7a98bb0d3e9e2e3f18ae33de2952bb85be2f28e6d0631916dbaf8880df4580f41
8
+ metadata.gz: !binary |-
9
+ NDQyMDk4MWJkZTQ3MjAxOWVlZTgzY2ZiZjAxZTZlODQzMjI0ZGFmMjMyNmZj
10
+ NDJiOTIzZDY2NzYzNzE1OWQzYzc0NTk4MDdhNDRkNjQ5MGJhZDFlNmVlMmEz
11
+ NWIxMGU1ZTA4NTY3Mjc3YmViOGRhZmQ5NDk5OGQxZWZlYzA2ODA=
12
+ data.tar.gz: !binary |-
13
+ NTc2NmEwNmE4Y2FiNjljYmM2YzNiNDllOWYxNjZlYzA0NDBjYTRlYzI4MjFj
14
+ YmVjY2Y1NDVkYjljNThlYjQ0YmE3ZjgwZmI5NzI5MTg2NDFiYjgzYTVmNWYx
15
+ ZDQ4YjQ3YzIwNzYwYjFiYWNmNjNiM2YxYWNkMmQyODkxYjg5YzQ=
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  coverage/
2
2
  *gem
3
+ Gemfile.lock
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.group_by { |f| f.category }.map do |cat, feeds|
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.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
45
- when 0..very_old_timestamp
46
- ios.write "#{date} #{f.name}\n".red
47
- when very_old_timestamp..old_timestamp
48
- ios.write "#{date} #{f.name}\n".yellow
49
- else
50
- ios.write "#{date} #{f.name}\n".green unless display_old_only
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
- cmd = %Q<#{pipe}>
20
- IO.popen(cmd,'w+') do |pipe|
21
- @formatter.format(feed, item, self, pipe)
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(@config.feeds, :in_threads => concurrency, :progress => "fetching") do |name,feed_config|
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
- @config.feeds.map do |name,feed_config|
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
- feed = Feedjira::Feed.fetch_and_parse(feed_config.uri)
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.9.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.should_receive(:category).twice.and_return nil
16
- config.should_receive(:default_name?).and_return(true, false)
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.should_receive(:name).and_return "Randall Munroe"
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.9.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: 2014-09-28 00:00:00.000000000 Z
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
- - ".coveralls.yml"
133
- - ".gitignore"
134
- - ".travis.yml"
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.2.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