rssly 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rssly/article.rb +16 -11
- data/lib/rssly/cli.rb +15 -5
- data/lib/rssly/collection.rb +18 -4
- data/lib/rssly/feed.rb +7 -1
- data/lib/rssly/http_error.rb +3 -0
- data/lib/rssly/serializers.rb +7 -0
- data/lib/rssly/version.rb +1 -1
- data/lib/rssly.rb +14 -9
- data/rssly.gemspec +2 -0
- data/spec/collection_spec.rb +0 -4
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25eaa53235e3ff7b4810a2d4a6b4dd900f5610ad
|
4
|
+
data.tar.gz: 38602296454922cea9ff3d0ec88a5b840a626762
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a99bc70e2a15a275fd315d1553c1c82e880d3583ab646c922c69a2f90d756549b2706fed9d2ccc521db296941485bdac2c00ab90b7a0918e1cc3c84cb835fab9
|
7
|
+
data.tar.gz: 5a95cd19d6b3cf6a7e6eabee10ebfbc29b6b94fd45fe587888c68ff93165f0976a80f8d8ee1f0a2164ba2d8c4e12ebd69efa4a9dc0b51b82b1353b6b0a1bff0b
|
data/lib/rssly/article.rb
CHANGED
@@ -13,21 +13,17 @@ module Rssly
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
SUMMARY_RATIO = 35
|
17
|
-
|
18
16
|
attr_accessor :title
|
19
17
|
attr_accessor :url
|
20
18
|
attr_accessor :summary
|
21
19
|
attr_accessor :topics
|
22
20
|
attr_accessor :published
|
23
21
|
|
24
|
-
def initialize(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
topics: nil
|
30
|
-
)
|
22
|
+
def initialize(title: nil,
|
23
|
+
url: nil,
|
24
|
+
published: nil,
|
25
|
+
summary: nil,
|
26
|
+
topics: nil)
|
31
27
|
self.title = title
|
32
28
|
self.url = url
|
33
29
|
self.published = published
|
@@ -41,7 +37,7 @@ module Rssly
|
|
41
37
|
|
42
38
|
def summary
|
43
39
|
@summary ||= summarized.summarize(
|
44
|
-
percent:
|
40
|
+
percent: Rssly::CONFIG[:summary_ratio]
|
45
41
|
).reduce('') do |text, o|
|
46
42
|
text << o[:sentence].strip + ' '
|
47
43
|
end.strip
|
@@ -60,7 +56,13 @@ module Rssly
|
|
60
56
|
@published ||= Time.now
|
61
57
|
end
|
62
58
|
|
63
|
-
|
59
|
+
def to_h
|
60
|
+
{ title: title,
|
61
|
+
url: url,
|
62
|
+
summary: summary,
|
63
|
+
topics: topics,
|
64
|
+
published: published }
|
65
|
+
end
|
64
66
|
|
65
67
|
def summarized
|
66
68
|
@summarized ||= begin
|
@@ -74,6 +76,9 @@ module Rssly
|
|
74
76
|
source = open(url).read
|
75
77
|
Readability::Document.new(source)
|
76
78
|
end
|
79
|
+
rescue OpenURI::HTTPError
|
80
|
+
raise Rssly::HTTPError,
|
81
|
+
"Could not retrieve document for arcitle at: #{url}"
|
77
82
|
end
|
78
83
|
end
|
79
84
|
end
|
data/lib/rssly/cli.rb
CHANGED
@@ -4,25 +4,35 @@ require 'rssly'
|
|
4
4
|
module Rssly
|
5
5
|
# The rssly CLI
|
6
6
|
class CLI < Thor
|
7
|
-
desc 'fetch URL1 URL2',
|
7
|
+
desc 'fetch URL1 [URL2...]',
|
8
|
+
'Fetch feeds and output them in a given format.'
|
8
9
|
|
9
10
|
option :format, default: 'text', desc: <<-EOT
|
10
11
|
Choose from one of the following serializers:
|
11
12
|
|
12
13
|
`text` : Output articles in a simple text layout.
|
13
14
|
`html` : Output articles in an html format.
|
15
|
+
`json` : Ouput articles with a json representation.
|
16
|
+
EOT
|
17
|
+
|
18
|
+
option :summary_ratio, default: 50, type: :numeric, desc: <<-EOT
|
19
|
+
Choose the summary ratio in a percentage.
|
20
|
+
EOT
|
21
|
+
|
22
|
+
option :discover, default: true, type: :boolean, desc: <<-EOT
|
23
|
+
Whether rss feed urls should be auto discovered from the given url.
|
14
24
|
EOT
|
15
25
|
|
16
26
|
def fetch(*feed_urls)
|
17
|
-
|
18
|
-
|
19
|
-
end
|
27
|
+
Rssly::CONFIG[:summary_ratio] = options[:summary_ratio]
|
28
|
+
Rssly::CONFIG[:discover_feeds] = options[:discover]
|
20
29
|
|
30
|
+
feeds = feed_urls.map { |url| Rssly::Feed.new url: url }
|
21
31
|
collection = Rssly::Collection.create_from_feeds(*feeds)
|
22
|
-
|
23
32
|
serializer = case options[:format]
|
24
33
|
when 'text' then Rssly::Serializers::Text
|
25
34
|
when 'html' then Rssly::Serializers::HTML
|
35
|
+
when 'json' then Rssly::Serializers::JSON
|
26
36
|
else fail "Serializer #{options[:format]} not found."
|
27
37
|
end
|
28
38
|
|
data/lib/rssly/collection.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
module Rssly
|
2
4
|
# Represents a collection of articles
|
3
5
|
class Collection
|
@@ -18,20 +20,32 @@ module Rssly
|
|
18
20
|
self.articles = items
|
19
21
|
end
|
20
22
|
|
21
|
-
def each(&block)
|
22
|
-
articles.each(&block)
|
23
|
-
end
|
24
|
-
|
25
23
|
def length
|
26
24
|
articles.length
|
27
25
|
end
|
28
26
|
|
29
27
|
def articles
|
30
28
|
@articles ||= []
|
29
|
+
|
30
|
+
# Remove all the inaccessible ones
|
31
|
+
@articles.select! do |a|
|
32
|
+
begin
|
33
|
+
a.extracted
|
34
|
+
true
|
35
|
+
rescue Rssly::HTTPError
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
@articles
|
31
41
|
end
|
32
42
|
|
33
43
|
def filter(filter, **opts)
|
34
44
|
self.articles = filter.parse(articles, **opts)
|
35
45
|
end
|
46
|
+
|
47
|
+
def to_json
|
48
|
+
JSON.generate(articles.map { |a| a.to_h })
|
49
|
+
end
|
36
50
|
end
|
37
51
|
end
|
data/lib/rssly/feed.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'feedjira'
|
2
|
+
require 'feedbag'
|
2
3
|
|
3
4
|
module Rssly
|
4
5
|
# Represents a single rss feed and it's metadata
|
@@ -22,11 +23,16 @@ module Rssly
|
|
22
23
|
private
|
23
24
|
|
24
25
|
def fetch_articles
|
25
|
-
|
26
|
+
urls = [@url]
|
27
|
+
urls = Feedbag.find(@url) if Rssly::CONFIG[:discover_feeds]
|
28
|
+
result = Feedjira::Feed.fetch_and_parse(*urls)
|
26
29
|
self.title = result.title
|
27
30
|
result.entries.map do |obj|
|
28
31
|
Article.create_from_feedjira_entry(obj)
|
29
32
|
end
|
33
|
+
rescue RuntimeError
|
34
|
+
raise Rssly::HTTPError,
|
35
|
+
"Could not fetch articles for feed: #{url}"
|
30
36
|
end
|
31
37
|
end
|
32
38
|
end
|
data/lib/rssly/serializers.rb
CHANGED
data/lib/rssly/version.rb
CHANGED
data/lib/rssly.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
-
require '
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
1
|
+
require 'rssly/version'
|
2
|
+
require 'rssly/article'
|
3
|
+
require 'rssly/feed'
|
4
|
+
require 'rssly/deserializers'
|
5
|
+
require 'rssly/serializers'
|
6
|
+
require 'rssly/http_error'
|
7
|
+
require 'rssly/collection'
|
8
|
+
require 'rssly/collection/unique_filter'
|
9
|
+
require 'rssly/collection/age_filter'
|
10
10
|
|
11
|
+
# Rssly namespace
|
11
12
|
module Rssly
|
13
|
+
CONFIG = {
|
14
|
+
summary_ratio: 35,
|
15
|
+
discover_feeds: false
|
16
|
+
}
|
12
17
|
end
|
data/rssly.gemspec
CHANGED
@@ -28,6 +28,8 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency "ots", "~> 0.5"
|
29
29
|
spec.add_dependency "addressable", "~> 2.3"
|
30
30
|
spec.add_dependency "bloomfilter-rb", "~> 2.1"
|
31
|
+
spec.add_dependency "redis", "~> 3.0.7"
|
32
|
+
spec.add_dependency "json", "~> 1.8.1"
|
31
33
|
spec.add_dependency "thor"
|
32
34
|
|
33
35
|
spec.add_development_dependency "bundler", "~> 1.3"
|
data/spec/collection_spec.rb
CHANGED
@@ -38,10 +38,6 @@ describe 'Rssly::Collection' do
|
|
38
38
|
@collection = Rssly::Collection.new(@articles)
|
39
39
|
end
|
40
40
|
|
41
|
-
it 'should respond to #each' do
|
42
|
-
expect(@collection.respond_to?(:each)).to eq(true)
|
43
|
-
end
|
44
|
-
|
45
41
|
it 'should respond to #length' do
|
46
42
|
expect(@collection.length).to eq(3)
|
47
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rssly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Kot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: feedbag
|
@@ -108,6 +108,34 @@ dependencies:
|
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '2.1'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: redis
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.0.7
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.0.7
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: json
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.8.1
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.8.1
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: thor
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -188,6 +216,7 @@ files:
|
|
188
216
|
- lib/rssly/collection/unique_filter.rb
|
189
217
|
- lib/rssly/deserializers.rb
|
190
218
|
- lib/rssly/feed.rb
|
219
|
+
- lib/rssly/http_error.rb
|
191
220
|
- lib/rssly/serializers.rb
|
192
221
|
- lib/rssly/version.rb
|
193
222
|
- rssly.gemspec
|