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 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