feed2email 0.0.1 → 0.1.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.
- data/.gitignore +0 -1
- data/CHANGELOG.md +13 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +50 -0
- data/README.md +6 -8
- data/bin/feed2email +6 -1
- data/lib/feed2email/core_ext.rb +6 -0
- data/lib/feed2email/entry.rb +10 -4
- data/lib/feed2email/feed.rb +15 -11
- data/lib/feed2email/mail.rb +7 -5
- data/lib/feed2email/version.rb +1 -1
- data/lib/feed2email.rb +1 -0
- metadata +5 -2
data/CHANGELOG.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
### 0.1.0
|
2
|
+
|
3
|
+
* Skip entry if pubDate is in the future
|
4
|
+
* Fix feed fetching by accepting compression
|
5
|
+
* Fix crashing for missing multi-level directories in config path
|
6
|
+
* Accept recipient address as the first command-line argument
|
7
|
+
* Append feed2email signature to email body
|
8
|
+
* Use full HTTPS address for RubyGems source in Gemfile
|
9
|
+
* Add this changelog
|
10
|
+
|
11
|
+
### 0.0.1
|
12
|
+
|
13
|
+
* Initial release
|
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
feed2email (0.0.2)
|
5
|
+
feedzirra
|
6
|
+
mail
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activesupport (3.1.12)
|
12
|
+
multi_json (~> 1.0)
|
13
|
+
builder (3.2.0)
|
14
|
+
curb (0.7.18)
|
15
|
+
feedzirra (0.1.3)
|
16
|
+
activesupport (~> 3.1.1)
|
17
|
+
builder (>= 2.1.2)
|
18
|
+
curb (~> 0.7.15)
|
19
|
+
i18n (>= 0.5.0)
|
20
|
+
loofah (~> 1.2.0)
|
21
|
+
nokogiri (>= 1.4.4)
|
22
|
+
rake (>= 0.8.7)
|
23
|
+
rdoc (~> 3.8)
|
24
|
+
sax-machine (~> 0.1.0)
|
25
|
+
i18n (0.6.4)
|
26
|
+
json (1.7.7)
|
27
|
+
loofah (1.2.1)
|
28
|
+
nokogiri (>= 1.4.4)
|
29
|
+
mail (2.5.3)
|
30
|
+
i18n (>= 0.4.0)
|
31
|
+
mime-types (~> 1.16)
|
32
|
+
treetop (~> 1.4.8)
|
33
|
+
mime-types (1.22)
|
34
|
+
multi_json (1.7.2)
|
35
|
+
nokogiri (1.5.9)
|
36
|
+
polyglot (0.3.3)
|
37
|
+
rake (10.0.4)
|
38
|
+
rdoc (3.12.2)
|
39
|
+
json (~> 1.4)
|
40
|
+
sax-machine (0.1.0)
|
41
|
+
nokogiri (> 0.0.0)
|
42
|
+
treetop (1.4.12)
|
43
|
+
polyglot
|
44
|
+
polyglot (>= 0.3.1)
|
45
|
+
|
46
|
+
PLATFORMS
|
47
|
+
ruby
|
48
|
+
|
49
|
+
DEPENDENCIES
|
50
|
+
feed2email!
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ RSS/Atom feed updates in your email
|
|
6
6
|
|
7
7
|
I don't like having a separate application for feeds when I'm already checking my email. I also never read a thing when feeds are kept in a separate place.
|
8
8
|
|
9
|
-
The script was written primarily as a replacement of
|
9
|
+
The script was written primarily as a replacement of [rss2email][] and aims to be simpler, faster, smaller and easier to use.
|
10
10
|
|
11
11
|
[rss2email]: http://www.allthingsrss.com/rss2email/
|
12
12
|
|
@@ -32,24 +32,22 @@ Create `~/.feed2email/feeds.yml` and add the address of each feed you want to su
|
|
32
32
|
When run for the first time, the script enters "dry run" mode and exits almost immediately. During dry run mode:
|
33
33
|
|
34
34
|
* No feeds are fetched and, thus, no email is sent (existing feed entries are considered already seen)
|
35
|
-
* `~/.feed2email/
|
35
|
+
* `~/.feed2email/state.yml` is created containing the timestamp of when each feed was last fetched
|
36
36
|
|
37
|
-
If you want to receive existing entries from a specific feed, you can alter the timestamp for that feed in `
|
37
|
+
If you want to receive existing entries from a specific feed, you can manually alter the timestamp for that feed in `state.yml` to a value in the past. Next time you run the script, all entries published past that timestamp will be sent with email.
|
38
38
|
|
39
|
-
|
39
|
+
To run the script:
|
40
40
|
|
41
41
|
~~~ sh
|
42
|
-
$
|
42
|
+
$ feed2email name@example.com
|
43
43
|
~~~
|
44
44
|
|
45
45
|
It's also possible to override the path to the [Sendmail][] binary:
|
46
46
|
|
47
47
|
~~~ sh
|
48
|
-
$ SENDMAIL=/path/to/sendmail
|
48
|
+
$ SENDMAIL=/path/to/sendmail feed2email name@example.com
|
49
49
|
~~~
|
50
50
|
|
51
|
-
**Note:** Email symbols in the above examples have been replaced with words to avoid spam.
|
52
|
-
|
53
51
|
You can use [cron][] to run the script e.g. once every hour.
|
54
52
|
|
55
53
|
[cron]: http://en.wikipedia.org/wiki/Cron
|
data/bin/feed2email
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
if %w{-h --help}.include?(ARGV[0]) || (ARGV[0].nil? && ENV['MAILTO'].nil?)
|
4
|
+
$stderr.puts "usage: #{$0} <recipient>"
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
|
3
8
|
require 'feed2email'
|
4
9
|
|
5
|
-
Feed2Email::Feed.process_all
|
10
|
+
Feed2Email::Feed.process_all(:recipient => ARGV[0] || ENV['MAILTO'])
|
data/lib/feed2email/core_ext.rb
CHANGED
data/lib/feed2email/entry.rb
CHANGED
@@ -20,21 +20,27 @@ module Feed2Email
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def process
|
23
|
-
to_mail.send if
|
23
|
+
to_mail.send if to_be_sent?
|
24
24
|
end
|
25
25
|
|
26
26
|
def title
|
27
27
|
@data.title
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def uri
|
31
31
|
@data.url
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
-
def
|
37
|
-
@data.published
|
36
|
+
def published_at
|
37
|
+
@data.published
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_be_sent?
|
41
|
+
published_at &&
|
42
|
+
published_at.past? && # respect entry future pubDate
|
43
|
+
published_at > @feed.fetch_time
|
38
44
|
end
|
39
45
|
|
40
46
|
def to_mail
|
data/lib/feed2email/feed.rb
CHANGED
@@ -1,26 +1,29 @@
|
|
1
1
|
module Feed2Email
|
2
2
|
FEEDS_FILE = File.expand_path('~/.feed2email/feeds.yml')
|
3
|
-
|
3
|
+
STATE_FILE = File.expand_path('~/.feed2email/state.yml')
|
4
4
|
USER_AGENT = "feed2email/#{VERSION}"
|
5
5
|
|
6
6
|
class Feed
|
7
|
-
def self.process(uri)
|
8
|
-
Feed.new(uri).process
|
7
|
+
def self.process(uri, options)
|
8
|
+
Feed.new(uri, options).process
|
9
9
|
end
|
10
10
|
|
11
|
-
def self.process_all
|
12
|
-
|
11
|
+
def self.process_all(options)
|
12
|
+
FileUtils.mkdir_p(File.dirname(STATE_FILE)) rescue nil
|
13
13
|
|
14
|
-
@@fetch_times = YAML.load(open(
|
14
|
+
@@fetch_times = YAML.load(open(STATE_FILE)) rescue {}
|
15
15
|
|
16
16
|
feed_uris = YAML.load(open(FEEDS_FILE)) rescue []
|
17
|
-
feed_uris.each {|uri| Feed.process(uri) }
|
17
|
+
feed_uris.each {|uri| Feed.process(uri, options) }
|
18
18
|
|
19
|
-
open(
|
19
|
+
open(STATE_FILE, 'w') {|f| f.write(@@fetch_times.to_yaml) }
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
attr_reader :options
|
23
|
+
|
24
|
+
def initialize(uri, options)
|
23
25
|
@uri = uri
|
26
|
+
@options = options
|
24
27
|
end
|
25
28
|
|
26
29
|
def fetch_time
|
@@ -40,7 +43,8 @@ module Feed2Email
|
|
40
43
|
|
41
44
|
def data
|
42
45
|
@fetched_at ||= Time.now
|
43
|
-
|
46
|
+
fetch_opts = { :user_agent => USER_AGENT, :compress => true }
|
47
|
+
@data ||= Feedzirra::Feed.fetch_and_parse(@uri, fetch_opts)
|
44
48
|
end
|
45
49
|
|
46
50
|
def entries
|
@@ -52,7 +56,7 @@ module Feed2Email
|
|
52
56
|
end
|
53
57
|
|
54
58
|
def have_entries?
|
55
|
-
|
59
|
+
entries.any?
|
56
60
|
end
|
57
61
|
|
58
62
|
def process_entries
|
data/lib/feed2email/mail.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Feed2Email
|
2
2
|
SENDMAIL = ENV['SENDMAIL'] || '/usr/sbin/sendmail'
|
3
|
-
MAILTO = ENV['MAILTO'] || ENV['USER']
|
4
3
|
|
5
4
|
class Mail
|
6
5
|
def initialize(entry)
|
@@ -9,16 +8,19 @@ module Feed2Email
|
|
9
8
|
|
10
9
|
def body
|
11
10
|
body_data = {
|
12
|
-
:
|
11
|
+
:uri => @entry.uri.escape_html,
|
13
12
|
:title => @entry.title.escape_html,
|
14
13
|
:content => @entry.content,
|
15
14
|
}
|
16
15
|
%{
|
17
16
|
<html>
|
18
17
|
<body>
|
19
|
-
<h1><a href="%{
|
18
|
+
<h1><a href="%{uri}">%{title}</a></h1>
|
20
19
|
%{content}
|
21
|
-
<p><a href="%{
|
20
|
+
<p><a href="%{uri}">%{uri}</a></p>
|
21
|
+
<p>--<br>
|
22
|
+
Sent by <a href="https://github.com/agorf/feed2email">feed2email
|
23
|
+
#{VERSION}</a> at #{Time.now}</p>
|
22
24
|
</body>
|
23
25
|
</html>
|
24
26
|
}.gsub(/^\s+/, '') % body_data
|
@@ -64,7 +66,7 @@ module Feed2Email
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def to
|
67
|
-
|
69
|
+
@entry.feed.options[:recipient]
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
data/lib/feed2email/version.rb
CHANGED
data/lib/feed2email.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: feed2email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: feedzirra
|
@@ -52,7 +52,9 @@ extensions: []
|
|
52
52
|
extra_rdoc_files: []
|
53
53
|
files:
|
54
54
|
- .gitignore
|
55
|
+
- CHANGELOG.md
|
55
56
|
- Gemfile
|
57
|
+
- Gemfile.lock
|
56
58
|
- LICENSE.txt
|
57
59
|
- README.md
|
58
60
|
- Rakefile
|
@@ -90,3 +92,4 @@ signing_key:
|
|
90
92
|
specification_version: 3
|
91
93
|
summary: RSS/Atom feed updates in your email
|
92
94
|
test_files: []
|
95
|
+
has_rdoc:
|