consummo 0.4.4 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +12 -5
  4. data/README.md +26 -5
  5. data/consummo.gemspec +8 -9
  6. data/lib/consummo.rb +10 -10
  7. data/lib/consummo/enrichers/content_scorer.rb +8 -0
  8. data/lib/consummo/enrichers/facebook_like_enricher.rb +15 -0
  9. data/lib/consummo/enrichers/keyword_hint_enricher.rb +24 -0
  10. data/lib/consummo/enrichers/readability_enricher.rb +14 -0
  11. data/lib/consummo/enrichers/simple_enricher.rb +7 -0
  12. data/lib/consummo/enrichers/social_media_metric_enricher.rb +28 -0
  13. data/lib/consummo/enrichers/twitter_share_enricher.rb +15 -0
  14. data/lib/consummo/enrichers/url_enricher.rb +12 -0
  15. data/lib/consummo/enrichers/url_resolver.rb +15 -0
  16. data/lib/consummo/enrichers/word_count_enricher.rb +8 -0
  17. data/lib/consummo/feed.rb +12 -10
  18. data/lib/consummo/feed_client.rb +7 -5
  19. data/lib/consummo/feed_fetcher.rb +19 -17
  20. data/lib/consummo/feed_item.rb +9 -7
  21. data/lib/consummo/feed_item_factory.rb +21 -19
  22. data/lib/consummo/feed_processor.rb +16 -14
  23. data/lib/consummo/http_client.rb +6 -4
  24. data/lib/consummo/item_consumer.rb +12 -10
  25. data/lib/consummo/item_producer.rb +11 -9
  26. data/lib/consummo/simple_item.rb +23 -21
  27. data/lib/consummo/version.rb +1 -1
  28. metadata +29 -44
  29. data/lib/consummo/content_scorer.rb +0 -6
  30. data/lib/consummo/facebook_like_enricher.rb +0 -13
  31. data/lib/consummo/keyword_hint_enricher.rb +0 -22
  32. data/lib/consummo/readability_enricher.rb +0 -12
  33. data/lib/consummo/simple_enricher.rb +0 -5
  34. data/lib/consummo/social_media_metric_enricher.rb +0 -26
  35. data/lib/consummo/twitter_share_enricher.rb +0 -13
  36. data/lib/consummo/url_enricher.rb +0 -10
  37. data/lib/consummo/url_resolver.rb +0 -13
  38. data/lib/consummo/word_count_enricher.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 93f3b0f28faee565a55b6d9bd3db899cc5937dce
4
- data.tar.gz: c5451ffd899436e9835b2d0cf8b1967049d9c139
2
+ SHA256:
3
+ metadata.gz: c506313299e8036dc9715ed16e8b554dc90e03dc57d4aee7c1c4300fea165049
4
+ data.tar.gz: 7f29bc1f72c4a2120a50e918de5f5bdafcccbbac50f84a41f4dc026ca29cd623
5
5
  SHA512:
6
- metadata.gz: 1186ad7f6a0b89f2440e049057c35fa006fbf527ceace2dff97563edacfcf87e4c48906d157fd3d0b740e6683b1dbce28c8b491439d8aa119fd5e7565559b45b
7
- data.tar.gz: e7ddd6d29b48451d87bdabcd25fd8eb3d793a8dce289fe4fc85b4400c8aeaedfe24815818d5d4711b1313540db10915f7e32d5e534c6b8262c32900cdcce4026
6
+ metadata.gz: fccbf7e5583f5064abd2905f1178959aefce440ebd90c3aaff90b891caadcb6bf6bb6f6a1adaa9a593e7972fb65b164692d4164777f6878059e9440055dd4f40
7
+ data.tar.gz: e1df75348d5e74476b7a123db042bd955973a610b4c60daa5368bf4bf0caf8ff5e807da062ffbbb0bcf5a9b1594eb6ccf375af6ffb32207b3cfda92c69379cb9
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.gem
@@ -1,7 +1,14 @@
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=28b27ad187b2bf12010e7cd376210d72c1ccee56494288417855970bc5e32613
1
4
  language: ruby
2
5
  rvm:
3
- - 2.3.0
4
- before_install: gem install bundler -v 1.11.2
5
- addons:
6
- code_climate:
7
- repo_token: b88e21fff712be545a536cef38d27e541c56f41542da3524bd3e11d19d156d84
6
+ - 2.7.0
7
+ before_script:
8
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
9
+ - chmod +x ./cc-test-reporter
10
+ - ./cc-test-reporter before-build
11
+ script:
12
+ - bundle exec rspec
13
+ after_script:
14
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/README.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Consummo
2
2
 
3
+ [![Build Status](http://img.shields.io/travis/clayton/consummo.svg?style=flat-square)](https://travis-ci.org/clayton/consummo)
4
+ [![Dependency Status](http://img.shields.io/gemnasium/clayton/consummo.svg?style=flat-square)](https://gemnasium.com/clayton/consummo)
5
+ [![Code Climate](http://img.shields.io/codeclimate/github/clayton/consummo.svg?style=flat-square)](https://codeclimate.com/github/clayton/consummo)
6
+ [![Test Coverage](https://codeclimate.com/github/clayton/consummo/badges/coverage.svg)](https://codeclimate.com/github/clayton/consummo/coverage)
7
+ [![Issue Count](https://codeclimate.com/github/clayton/consummo/badges/issue_count.svg)](https://codeclimate.com/github/clayton/consummo)
8
+ [![Gem Version](http://img.shields.io/gem/v/consummo.svg?style=flat-square)](https://rubygems.org/gems/consummo)
9
+ [![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://clayton.mit-license.org)
10
+
3
11
  Consummo is an engine for consuming, enriching and producing pieces of content from RSS feeds.
4
12
 
5
13
  ## Quick Start
@@ -50,6 +58,23 @@ An `Item Enricher` enriches the details and data from a `Feed Item`. For example
50
58
 
51
59
  The intent of `Item Enrichers` is that they are extensible and easy to implement such that multiple custom enrichments are possible.
52
60
 
61
+ ## Existing Enrichers
62
+
63
+ ### Working
64
+
65
+ | Name | Description | Class |
66
+ |:---------------|:-----------------------------------------------------------------------------------------------------------------------------------|:-----------------------|
67
+ | Facebook Likes | Enriches the item with the current number of Facebook likes based on the items's `URI` | `FacebookLikeEnricher` |
68
+ | Readability | Enriches the item with the [Flesch–Kincaid readability test](https://en.wikipedia.org/wiki/Flesch–Kincaid_readability_tests) score | `ReadabilityEnricher` |
69
+ | URL | Enriches the item with the true final URI by following all redirects | `UrlEnricher` |
70
+ | Keyword Hint | Enriches the item by wrapping any discovered keywords (passed in to the enrichment) with `<strong>` tags | `KeywordHintEnricher` |
71
+
72
+ ### In Need of Updates
73
+
74
+ | Name | Description | Class | Needs |
75
+ |:---------------|:------------------------------------------------------------|:-----------------------|:-----------------------------------------|
76
+ | Twitter Shares | Enriches the item with the current number of twitter shares | `TwitterShareEnricher` | Update to work with the Twitter v1.1 API |
77
+
53
78
  ## Custom Enrichment
54
79
 
55
80
  Enrichers follow a very simple interface:
@@ -79,10 +104,6 @@ Or install it yourself as:
79
104
 
80
105
  $ gem install consummo
81
106
 
82
- ## Usage
83
-
84
- TODO: Write usage instructions here
85
-
86
107
  ## Development
87
108
 
88
109
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -91,7 +112,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
91
112
 
92
113
  ## Contributing
93
114
 
94
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/consummo.
115
+ Bug reports and pull requests are welcome on GitHub at https://github.com/clayton/consummo.
95
116
 
96
117
 
97
118
  ## License
@@ -20,14 +20,13 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_runtime_dependency "feedjira", "~> 2.0"
23
- spec.add_runtime_dependency "activesupport", "~> 4.2"
24
- spec.add_runtime_dependency "odyssey", "~> 0.2"
25
- spec.add_runtime_dependency "httparty", "~> 0.13"
23
+ spec.add_runtime_dependency "activesupport", "~> 6"
24
+ spec.add_runtime_dependency "odyssey", "~> 0.3"
25
+ spec.add_runtime_dependency "httparty", "~> 0.18"
26
26
 
27
- spec.add_development_dependency "bundler", "~> 1.11"
28
- spec.add_development_dependency "rake", "~> 10.0"
29
- spec.add_development_dependency "rspec", "~> 3.0"
30
- spec.add_development_dependency "vcr", "~> 3.0"
31
- spec.add_development_dependency "simplecov", "~> 0.9"
32
- spec.add_development_dependency "codeclimate-test-reporter", "~> 0.5"
27
+ spec.add_development_dependency "bundler", "~> 2"
28
+ spec.add_development_dependency "rake", "~> 13.0"
29
+ spec.add_development_dependency "rspec", "~> 3"
30
+ spec.add_development_dependency "vcr", "~> 6"
31
+ spec.add_development_dependency "simplecov", "~> 0.18"
33
32
  end
@@ -3,9 +3,9 @@ require 'active_support/core_ext/object/blank'
3
3
 
4
4
  require "consummo/version"
5
5
 
6
- require "consummo/social_media_metric_enricher"
7
- require "consummo/content_scorer"
8
- require "consummo/facebook_like_enricher"
6
+ require "consummo/enrichers/social_media_metric_enricher"
7
+ require "consummo/enrichers/content_scorer"
8
+ require "consummo/enrichers/facebook_like_enricher"
9
9
  require "consummo/feed"
10
10
  require "consummo/feed_client"
11
11
  require "consummo/feed_fetcher"
@@ -15,15 +15,15 @@ require "consummo/feed_processor"
15
15
  require "consummo/http_client"
16
16
  require "consummo/item_consumer"
17
17
  require "consummo/item_producer"
18
- require "consummo/keyword_hint_enricher"
19
- require "consummo/readability_enricher"
18
+ require "consummo/enrichers/keyword_hint_enricher"
19
+ require "consummo/enrichers/readability_enricher"
20
20
  require "consummo/simple_item"
21
- require "consummo/social_media_metric_enricher"
22
- require "consummo/twitter_share_enricher"
23
- require "consummo/url_enricher"
24
- require "consummo/url_resolver"
21
+ require "consummo/enrichers/social_media_metric_enricher"
22
+ require "consummo/enrichers/twitter_share_enricher"
23
+ require "consummo/enrichers/url_enricher"
24
+ require "consummo/enrichers/url_resolver"
25
25
  require "consummo/version"
26
- require "consummo/word_count_enricher"
26
+ require "consummo/enrichers/word_count_enricher"
27
27
 
28
28
 
29
29
  module Consummo
@@ -0,0 +1,8 @@
1
+ module Consummo
2
+ class ContentScorer
3
+ def score(text)
4
+ return 0 if text.blank?
5
+ Odyssey.flesch_kincaid_re(text, false)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ module Consummo
2
+ class FacebookLikeEnricher < SocialMediaMetricEnricher
3
+ def metric_endpoint
4
+ "http://graph.facebook.com/?id="
5
+ end
6
+
7
+ def metric_name
8
+ "facebook_likes"
9
+ end
10
+
11
+ def metric_key
12
+ "shares"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ module Consummo
2
+ class KeywordHintEnricher
3
+ def initialize(keywords:[])
4
+ @keywords = keywords
5
+ end
6
+
7
+ def enrich(item, keywords=[])
8
+ modified = item.title
9
+ list = keywords.empty? ? @keywords : keywords
10
+
11
+ for keyword in list do
12
+ modified = make_replacements(modified, keyword)
13
+ end
14
+ {hinted_title: modified}
15
+ end
16
+
17
+ private
18
+ def make_replacements(text, keyword)
19
+ return nil if text.blank?
20
+ return text unless text.match(/#{keyword}/i)
21
+ text.gsub(/(#{keyword})/i, '<strong>\1</strong>')
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ require "odyssey"
2
+
3
+ module Consummo
4
+ class ReadabilityEnricher
5
+ def initialize(scorer: ContentScorer.new)
6
+ @scorer = scorer
7
+ end
8
+
9
+ def enrich(item)
10
+ score = @scorer.score(item.content)
11
+ {:readability_score => score}
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ module Consummo
2
+ class SimpleEnricher
3
+ def enrich(item)
4
+ { "simple" => "enrichment" }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ module Consummo
2
+ class SocialMediaMetricEnricher
3
+ def initialize(client: HttpClient.new)
4
+ @client = client
5
+ end
6
+
7
+ def enrich(item)
8
+ begin
9
+ result = @client.get("#{metric_endpoint}#{URI.encode(item.url)}")
10
+ {metric_name.to_sym => result[metric_key]}
11
+ rescue Exception => e
12
+ {}
13
+ end
14
+ end
15
+
16
+ def metric_endpoint
17
+ "http://example.com?id="
18
+ end
19
+
20
+ def metric_name
21
+ "shares"
22
+ end
23
+
24
+ def metric_key
25
+ metric_name
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module Consummo
2
+ class TwitterShareEnricher < SocialMediaMetricEnricher
3
+ def metric_endpoint
4
+ "http://urls.api.twitter.com/1/urls/count.json?url="
5
+ end
6
+
7
+ def metric_name
8
+ "twitter_shares"
9
+ end
10
+
11
+ def metric_key
12
+ "count"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Consummo
2
+ class UrlEnricher
3
+ def initialize(resolver: UrlResolver.new)
4
+ @resolver = resolver
5
+ end
6
+
7
+ def enrich(item)
8
+ resolved = @resolver.resolve(item.url)
9
+ {url: resolved.to_s}
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ require 'httparty'
2
+
3
+ module Consummo
4
+ class UrlResolver
5
+ def resolve(url)
6
+ return url if url.blank?
7
+ begin
8
+ response = HTTParty.head(url, follow_redirects: true)
9
+ response.request.last_uri
10
+ rescue Errno::ECONNREFUSED, URI::InvalidURIError, HTTParty::RedirectionTooDeep
11
+ url
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module Consummo
2
+ class WordCountEnricher
3
+ def enrich(item)
4
+ wc = item.content.scan(/[[:alpha:]]+/).count
5
+ {:word_count => wc}
6
+ end
7
+ end
8
+ end
@@ -1,15 +1,17 @@
1
- class Feed
2
- attr_accessor :uri
1
+ module Consummo
2
+ class Feed
3
+ attr_accessor :uri
3
4
 
4
- def self.create(args={})
5
- Feed.new(args)
6
- end
5
+ def self.create(args={})
6
+ Feed.new(args)
7
+ end
7
8
 
8
- def initialize(attrs={})
9
- self.uri = attrs[:uri]
10
- end
9
+ def initialize(attrs={})
10
+ self.uri = attrs[:uri]
11
+ end
11
12
 
12
- def id
13
- return self.to_s
13
+ def id
14
+ return self.to_s
15
+ end
14
16
  end
15
17
  end
@@ -1,9 +1,11 @@
1
1
  require 'feedjira'
2
2
 
3
- class FeedClient
4
- def fetch_and_parse(uri)
5
- feed = Feedjira::Feed.fetch_and_parse(uri)
6
- return [] if feed.is_a?(Fixnum)
7
- feed.entries
3
+ module Consummo
4
+ class FeedClient
5
+ def fetch_and_parse(uri)
6
+ feed = Feedjira::Feed.fetch_and_parse(uri)
7
+ return [] if feed.is_a?(Fixnum)
8
+ feed.entries
9
+ end
8
10
  end
9
11
  end
@@ -1,22 +1,24 @@
1
- class FeedFetcher
2
- def initialize(client: FeedClient.new, factory: FeedItemFactory.new)
3
- @client = client
4
- @factory = factory
5
- end
1
+ module Consummo
2
+ class FeedFetcher
3
+ def initialize(client: FeedClient.new, factory: FeedItemFactory.new)
4
+ @client = client
5
+ @factory = factory
6
+ end
6
7
 
7
- def fetch(feed, last_modified = nil)
8
- @client.fetch_and_parse(feed.uri).map do |entry|
9
- next if old_entry?(entry, last_modified)
10
- item = @factory.build(entry)
11
- item.attributes = {:feed_id => feed.id}
8
+ def fetch(feed, last_modified = nil)
9
+ @client.fetch_and_parse(feed.uri).map do |entry|
10
+ next if old_entry?(entry, last_modified)
11
+ item = @factory.build(entry)
12
+ item.attributes = {:feed_id => feed.id}
12
13
 
13
- item
14
- end.compact
15
- end
14
+ item
15
+ end.compact
16
+ end
16
17
 
17
- private
18
- def old_entry?(entry, last_modified)
19
- return false if last_modified.nil?
20
- last_modified > entry.last_modified
18
+ private
19
+ def old_entry?(entry, last_modified)
20
+ return false if last_modified.nil?
21
+ last_modified > entry.last_modified
22
+ end
21
23
  end
22
24
  end
@@ -1,11 +1,13 @@
1
- class FeedItem
2
- attr_accessor :title
1
+ module Consummo
2
+ class FeedItem
3
+ attr_accessor :title
3
4
 
4
- def initialize(attrs={})
5
- self.title = attrs[:title]
6
- end
5
+ def initialize(attrs={})
6
+ self.title = attrs[:title]
7
+ end
7
8
 
8
- def self.create(attributes={})
9
- #
9
+ def self.create(attributes={})
10
+ #
11
+ end
10
12
  end
11
13
  end
@@ -1,24 +1,26 @@
1
- class FeedItemFactory
2
- def build(entry)
3
- item = SimpleItem.new({
4
- :title => entry.title,
5
- :hinted_title => entry.title,
6
- :url => entry.url,
7
- :author => entry.author,
8
- :summary => entry.summary,
9
- :published_at => sanitize_published_at(entry.published),
10
- :guid => entry.id
11
- })
1
+ module Consummo
2
+ class FeedItemFactory
3
+ def build(entry)
4
+ item = SimpleItem.new({
5
+ :title => entry.title,
6
+ :hinted_title => entry.title,
7
+ :url => entry.url,
8
+ :author => entry.author,
9
+ :summary => entry.summary,
10
+ :published_at => sanitize_published_at(entry.published),
11
+ :guid => entry.id
12
+ })
12
13
 
13
- item.attributes = {:categories => entry.categories.join(";")} unless entry.is_a?(Feedjira::Parser::ITunesRSSItem)
14
+ item.attributes = {:categories => entry.categories.join(";")} unless entry.is_a?(Feedjira::Parser::ITunesRSSItem)
14
15
 
15
- item
16
- end
16
+ item
17
+ end
17
18
 
18
- private
19
- def sanitize_published_at(published)
20
- return Time.now if published.blank?
21
- return Time.now if Time.parse(published.to_s) < Time.parse('1979-01-01-01 00:00:00')
22
- published
19
+ private
20
+ def sanitize_published_at(published)
21
+ return Time.now if published.blank?
22
+ return Time.now if Time.parse(published.to_s) < Time.parse('1979-01-01-01 00:00:00')
23
+ published
24
+ end
23
25
  end
24
26
  end
@@ -1,19 +1,21 @@
1
- class FeedProcessor
2
- def initialize(feeds = [], enrichers: [])
3
- @feeds = feeds
4
- @enrichers = enrichers
5
- end
1
+ module Consummo
2
+ class FeedProcessor
3
+ def initialize(feeds = [], enrichers: [])
4
+ @feeds = feeds
5
+ @enrichers = enrichers
6
+ end
6
7
 
7
- def process
8
- producer = ItemProducer.new(feeds: @feeds)
9
- consumer = ItemConsumer.new(items: producer.produce, enrichers: @enrichers)
10
- persist(consumer.consume)
11
- end
8
+ def process
9
+ producer = ItemProducer.new(feeds: @feeds)
10
+ consumer = ItemConsumer.new(items: producer.produce, enrichers: @enrichers)
11
+ persist(consumer.consume)
12
+ end
12
13
 
13
- private
14
- def persist(items)
15
- items.each do |item|
16
- FeedItem.create(item.attributes)
14
+ private
15
+ def persist(items)
16
+ items.each do |item|
17
+ FeedItem.create(item.attributes)
18
+ end
17
19
  end
18
20
  end
19
21
  end
@@ -1,6 +1,8 @@
1
- class HttpClient
2
- def get(uri)
3
- response = HTTParty.get(uri)
4
- response.to_h
1
+ module Consummo
2
+ class HttpClient
3
+ def get(uri)
4
+ response = HTTParty.get(uri)
5
+ response.to_h
6
+ end
5
7
  end
6
8
  end
@@ -1,15 +1,17 @@
1
- class ItemConsumer
2
- def initialize(items: [], enrichers: [])
3
- @items = items
4
- @enrichers = enrichers
5
- end
1
+ module Consummo
2
+ class ItemConsumer
3
+ def initialize(items: [], enrichers: [])
4
+ @items = items
5
+ @enrichers = enrichers
6
+ end
6
7
 
7
- def consume
8
- @items.flat_map do |item|
9
- @enrichers.each do |enricher|
10
- item.attributes = enricher.enrich(item)
8
+ def consume
9
+ @items.flat_map do |item|
10
+ @enrichers.each do |enricher|
11
+ item.attributes = enricher.enrich(item)
12
+ end
13
+ item
11
14
  end
12
- item
13
15
  end
14
16
  end
15
17
  end
@@ -1,12 +1,14 @@
1
- class ItemProducer
2
- def initialize(feeds: [], fetcher: FeedFetcher.new)
3
- @feeds = feeds
4
- @fetcher = fetcher
5
- end
1
+ module Consummo
2
+ class ItemProducer
3
+ def initialize(feeds: [], fetcher: FeedFetcher.new)
4
+ @feeds = feeds
5
+ @fetcher = fetcher
6
+ end
6
7
 
7
- def produce
8
- @feeds.flat_map do |feed|
9
- @fetcher.fetch(feed)
10
- end.shuffle
8
+ def produce
9
+ @feeds.flat_map do |feed|
10
+ @fetcher.fetch(feed)
11
+ end.shuffle
12
+ end
11
13
  end
12
14
  end
@@ -1,29 +1,31 @@
1
- class SimpleItem
2
- def initialize(attributes={})
3
- @attributes = attributes
4
- end
1
+ module Consummo
2
+ class SimpleItem
3
+ def initialize(attributes={})
4
+ @attributes = attributes
5
+ end
5
6
 
6
- def attributes
7
- @attributes
8
- end
7
+ def attributes
8
+ @attributes
9
+ end
9
10
 
10
- def attributes=(attrs)
11
- @attributes.merge!(attrs)
12
- end
11
+ def attributes=(attrs)
12
+ @attributes.merge!(attrs)
13
+ end
13
14
 
14
- def title
15
- @attributes[:title]
16
- end
15
+ def title
16
+ @attributes[:title]
17
+ end
17
18
 
18
- def url
19
- @attributes[:url]
20
- end
19
+ def url
20
+ @attributes[:url]
21
+ end
21
22
 
22
- def guid
23
- @attributes[:guid] || @attributes[:url] || nil
24
- end
23
+ def guid
24
+ @attributes[:guid] || @attributes[:url] || nil
25
+ end
25
26
 
26
- def content
27
- @attributes[:content] || ""
27
+ def content
28
+ @attributes[:content] || ""
29
+ end
28
30
  end
29
31
  end
@@ -1,3 +1,3 @@
1
1
  module Consummo
2
- VERSION = "0.4.4"
2
+ VERSION = "1.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consummo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clayton Lengel-Zigich
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-22 00:00:00.000000000 Z
11
+ date: 2020-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: feedjira
@@ -30,126 +30,112 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '4.2'
33
+ version: '6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '4.2'
40
+ version: '6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: odyssey
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.2'
47
+ version: '0.3'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.2'
54
+ version: '0.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: httparty
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.13'
61
+ version: '0.18'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.13'
68
+ version: '0.18'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.11'
75
+ version: '2'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.11'
82
+ version: '2'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '10.0'
89
+ version: '13.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '10.0'
96
+ version: '13.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.0'
103
+ version: '3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.0'
110
+ version: '3'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: vcr
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '3.0'
117
+ version: '6'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '3.0'
124
+ version: '6'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: simplecov
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0.9'
131
+ version: '0.18'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0.9'
139
- - !ruby/object:Gem::Dependency
140
- name: codeclimate-test-reporter
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '0.5'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '0.5'
138
+ version: '0.18'
153
139
  description: Consummo is a small ruby library that provides item producers, consumers
154
140
  and enrichers to take items from RSS feeds and turn them into persistable feed items.
155
141
  Consummo was extracted from https://consummo.io where it was used to find and process
@@ -174,8 +160,16 @@ files:
174
160
  - consummo.gemspec
175
161
  - lib/consummo.rb
176
162
  - lib/consummo/.keep
177
- - lib/consummo/content_scorer.rb
178
- - lib/consummo/facebook_like_enricher.rb
163
+ - lib/consummo/enrichers/content_scorer.rb
164
+ - lib/consummo/enrichers/facebook_like_enricher.rb
165
+ - lib/consummo/enrichers/keyword_hint_enricher.rb
166
+ - lib/consummo/enrichers/readability_enricher.rb
167
+ - lib/consummo/enrichers/simple_enricher.rb
168
+ - lib/consummo/enrichers/social_media_metric_enricher.rb
169
+ - lib/consummo/enrichers/twitter_share_enricher.rb
170
+ - lib/consummo/enrichers/url_enricher.rb
171
+ - lib/consummo/enrichers/url_resolver.rb
172
+ - lib/consummo/enrichers/word_count_enricher.rb
179
173
  - lib/consummo/feed.rb
180
174
  - lib/consummo/feed_client.rb
181
175
  - lib/consummo/feed_fetcher.rb
@@ -185,16 +179,8 @@ files:
185
179
  - lib/consummo/http_client.rb
186
180
  - lib/consummo/item_consumer.rb
187
181
  - lib/consummo/item_producer.rb
188
- - lib/consummo/keyword_hint_enricher.rb
189
- - lib/consummo/readability_enricher.rb
190
- - lib/consummo/simple_enricher.rb
191
182
  - lib/consummo/simple_item.rb
192
- - lib/consummo/social_media_metric_enricher.rb
193
- - lib/consummo/twitter_share_enricher.rb
194
- - lib/consummo/url_enricher.rb
195
- - lib/consummo/url_resolver.rb
196
183
  - lib/consummo/version.rb
197
- - lib/consummo/word_count_enricher.rb
198
184
  homepage: https://github.com/clayton/consummo
199
185
  licenses:
200
186
  - MIT
@@ -214,8 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
200
  - !ruby/object:Gem::Version
215
201
  version: '0'
216
202
  requirements: []
217
- rubyforge_project:
218
- rubygems_version: 2.5.1
203
+ rubygems_version: 3.1.3
219
204
  signing_key:
220
205
  specification_version: 4
221
206
  summary: An engine for producing, consuming and enriching items from RSS Feeds.
@@ -1,6 +0,0 @@
1
- class ContentScorer
2
- def score(text)
3
- return 0 if text.blank?
4
- Odyssey.flesch_kincaid_re(text, false)
5
- end
6
- end
@@ -1,13 +0,0 @@
1
- class FacebookLikeEnricher < SocialMediaMetricEnricher
2
- def metric_endpoint
3
- "http://graph.facebook.com/?id="
4
- end
5
-
6
- def metric_name
7
- "facebook_likes"
8
- end
9
-
10
- def metric_key
11
- "shares"
12
- end
13
- end
@@ -1,22 +0,0 @@
1
- class KeywordHintEnricher
2
- def initialize(keywords:[])
3
- @keywords = keywords
4
- end
5
-
6
- def enrich(item, keywords=[])
7
- modified = item.title
8
- list = keywords.empty? ? @keywords : keywords
9
-
10
- for keyword in list do
11
- modified = make_replacements(modified, keyword)
12
- end
13
- {hinted_title: modified}
14
- end
15
-
16
- private
17
- def make_replacements(text, keyword)
18
- return nil if text.blank?
19
- return text unless text.match(/#{keyword}/i)
20
- text.gsub(/(#{keyword})/i, '<strong>\1</strong>')
21
- end
22
- end
@@ -1,12 +0,0 @@
1
- require "odyssey"
2
-
3
- class ReadabilityEnricher
4
- def initialize(scorer: ContentScorer.new)
5
- @scorer = scorer
6
- end
7
-
8
- def enrich(item)
9
- score = @scorer.score(item.content)
10
- {:readability_score => score}
11
- end
12
- end
@@ -1,5 +0,0 @@
1
- class SimpleEnricher
2
- def enrich(item)
3
- { "simple" => "enrichment" }
4
- end
5
- end
@@ -1,26 +0,0 @@
1
- class SocialMediaMetricEnricher
2
- def initialize(client: HttpClient.new)
3
- @client = client
4
- end
5
-
6
- def enrich(item)
7
- begin
8
- result = @client.get("#{metric_endpoint}#{URI.encode(item.url)}")
9
- {metric_name.to_sym => result[metric_key]}
10
- rescue Exception => e
11
- {}
12
- end
13
- end
14
-
15
- def metric_endpoint
16
- "http://example.com?id="
17
- end
18
-
19
- def metric_name
20
- "shares"
21
- end
22
-
23
- def metric_key
24
- metric_name
25
- end
26
- end
@@ -1,13 +0,0 @@
1
- class TwitterShareEnricher < SocialMediaMetricEnricher
2
- def metric_endpoint
3
- "http://urls.api.twitter.com/1/urls/count.json?url="
4
- end
5
-
6
- def metric_name
7
- "twitter_shares"
8
- end
9
-
10
- def metric_key
11
- "count"
12
- end
13
- end
@@ -1,10 +0,0 @@
1
- class UrlEnricher
2
- def initialize(resolver: UrlResolver.new)
3
- @resolver = resolver
4
- end
5
-
6
- def enrich(item)
7
- resolved = @resolver.resolve(item.url)
8
- {url: resolved.to_s}
9
- end
10
- end
@@ -1,13 +0,0 @@
1
- require 'httparty'
2
-
3
- class UrlResolver
4
- def resolve(url)
5
- return url if url.blank?
6
- begin
7
- response = HTTParty.head(url, follow_redirects: true)
8
- response.request.last_uri
9
- rescue Errno::ECONNREFUSED, URI::InvalidURIError, HTTParty::RedirectionTooDeep
10
- url
11
- end
12
- end
13
- end
@@ -1,6 +0,0 @@
1
- class WordCountEnricher
2
- def enrich(item)
3
- wc = item.content.scan(/[[:alpha:]]+/).count
4
- {:word_count => wc}
5
- end
6
- end