rssly 0.0.1 → 0.0.2
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 +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
|