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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e7668f11f0cec7ba5f1da6674e516a46df57bef
4
- data.tar.gz: 4969418e2ef5a9d8e55433988a02b8342bc1ee41
3
+ metadata.gz: 25eaa53235e3ff7b4810a2d4a6b4dd900f5610ad
4
+ data.tar.gz: 38602296454922cea9ff3d0ec88a5b840a626762
5
5
  SHA512:
6
- metadata.gz: 788e43bd09c3f51e61a7693efaf292ffe434979444b543828ded0141390fde2273ba61d4396033c38b8785c7ccb41837c349649609c4d5d06c2375ce2e460f21
7
- data.tar.gz: ae3af50267214d349159fb09a9412779ef81f2b05a5d5fbbb6b1a265dc0473c10d44032eee981a9c8ab5c5a3be068b99b930c113d1868119a37da15c664a1654
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
- title: nil,
26
- url: nil,
27
- published: nil,
28
- summary: nil,
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: SUMMARY_RATIO
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
- private
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', 'Fetch feeds and output them in a given format.'
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
- feeds = feed_urls.map do |url|
18
- Rssly::Feed.new url: url
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
 
@@ -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
- result = Feedjira::Feed.fetch_and_parse @url
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
@@ -0,0 +1,3 @@
1
+ module Rssly
2
+ class HTTPError < RuntimeError; end
3
+ end
@@ -52,5 +52,12 @@ module Rssly
52
52
  </article>
53
53
  EOT
54
54
  end
55
+
56
+ # Transforms a collection into a json representation
57
+ class JSON < Serializer
58
+ def perform
59
+ @collection.to_json
60
+ end
61
+ end
55
62
  end
56
63
  end
data/lib/rssly/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rssly
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/rssly.rb CHANGED
@@ -1,12 +1,17 @@
1
- require 'active_support'
2
- require "rssly/version"
3
- require "rssly/article"
4
- require "rssly/feed"
5
- require "rssly/deserializers"
6
- require "rssly/serializers"
7
- require "rssly/collection"
8
- require "rssly/collection/unique_filter"
9
- require "rssly/collection/age_filter"
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"
@@ -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.1
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-02 00:00:00.000000000 Z
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