engagement 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +71 -0
  6. data/Rakefile +8 -0
  7. data/engagement.gemspec +31 -0
  8. data/lib/engagement.rb +5 -0
  9. data/lib/engagement/comment_counter.rb +20 -0
  10. data/lib/engagement/comment_counter/disqus.rb +36 -0
  11. data/lib/engagement/comment_counter/hacker_news.rb +13 -0
  12. data/lib/engagement/comment_counter/reddit.rb +32 -0
  13. data/lib/engagement/comment_counter/threaded.rb +28 -0
  14. data/lib/engagement/version.rb +3 -0
  15. data/spec/cassettes/Engagement_CommentCounter_Disqus/when_we_don_t_own_the_url/returns_zero_when_we_don_t_own_the_url.yml +48 -0
  16. data/spec/cassettes/Engagement_CommentCounter_Disqus/when_we_own_the_url/returns_the_number_of_comments_for_the_given_url.yml +89 -0
  17. data/spec/cassettes/Engagement_CommentCounter_HackerNews/returns_the_number_of_comments_for_the_given_url.yml +56 -0
  18. data/spec/cassettes/Engagement_CommentCounter_Reddit/with_a_single_listing_returned/.yml +123 -0
  19. data/spec/cassettes/Engagement_CommentCounter_Reddit/with_multiple_listings_returned/.yml +204 -0
  20. data/spec/cassettes/Engagement_CommentCounter_Reddit/with_no_results/.yml +124 -0
  21. data/spec/engagement/comment_counter/disqus_spec.rb +27 -0
  22. data/spec/engagement/comment_counter/hacker_news_spec.rb +11 -0
  23. data/spec/engagement/comment_counter/reddit_spec.rb +23 -0
  24. data/spec/engagement/comment_counter_spec.rb +33 -0
  25. data/spec/engagement/threaded_comment_counter_spec.rb +30 -0
  26. data/spec/spec_helper.rb +20 -0
  27. metadata +207 -0
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Engagement::CommentCounter::Disqus do
4
+
5
+ if disqus_forum_api_key
6
+ let(:counter) { Engagement::CommentCounter::Disqus.new(disqus_forum_api_key) }
7
+
8
+ context "when we own the url", :vcr do
9
+ let(:url) { 'http://diminishing.org/searching-for-a-hero-ruby' }
10
+
11
+ it 'returns the number of comments for the given url' do
12
+ counter.comments_count(url).should == 4
13
+ end
14
+ end
15
+
16
+ context "when we don't own the url", :vcr do
17
+ let(:url) { 'http://google.com' }
18
+
19
+ it "returns zero when we don't own the url" do
20
+ counter.comments_count(url).should == 0
21
+ end
22
+ end
23
+ else
24
+ puts 'Skipping Disqus test, please set the DISQUS_FORUM_API_KEY environment variable.'
25
+ end
26
+
27
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Engagement::CommentCounter::HackerNews, :vcr do
4
+
5
+ it 'returns the number of comments for the given url' do
6
+ url = 'http://www.90percentofeverything.com/2013/07/23/the-slippery-slope/'
7
+ counter = Engagement::CommentCounter::HackerNews.new
8
+ counter.comments_count(url).should == 18
9
+ end
10
+
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Engagement::CommentCounter::Reddit do
4
+
5
+ subject { counter.comments_count(url) }
6
+ let(:counter) { Engagement::CommentCounter::Reddit.new }
7
+
8
+ context 'with a single listing returned', :vcr do
9
+ let(:url) { 'http://i.imgur.com/VzFTsGg.png' }
10
+ it { should == 929 }
11
+ end
12
+
13
+ context 'with multiple listings returned', :vcr do
14
+ let(:url) { 'http://gaslight.co/blog/why-we-wrote-a-blog' }
15
+ it { should == 8 }
16
+ end
17
+
18
+ context 'with no results', :vcr do
19
+ let(:url) { 'http://blog.gaslight.co/blog/why-i-chose-angularjs' }
20
+ it { should == 0 }
21
+ end
22
+
23
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Engagement::CommentCounter do
4
+
5
+ class TestCommentCounter
6
+ def initialize
7
+ @counts_by_url = Hash.new(0)
8
+ end
9
+
10
+ def add_count_for_url(url, count)
11
+ @counts_by_url[url] = count
12
+ end
13
+
14
+ def comments_count(url)
15
+ @counts_by_url[url]
16
+ end
17
+ end
18
+
19
+ it 'aggregates the results from multiple counters' do
20
+ url = 'http://google.com'
21
+
22
+ counter_1 = TestCommentCounter.new
23
+ counter_1.add_count_for_url(url, 2)
24
+
25
+ counter_2 = TestCommentCounter.new
26
+ counter_2.add_count_for_url(url, 1)
27
+
28
+ counter = Engagement::CommentCounter.new([counter_1, counter_2])
29
+
30
+ counter.comments_count(url).should == 3
31
+ end
32
+
33
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'benchmark'
3
+
4
+ describe Engagement::CommentCounter::Threaded do
5
+
6
+ class TimedCounter
7
+ def initialize(seconds, value)
8
+ @seconds = seconds
9
+ @value = value
10
+ end
11
+
12
+ def comments_count(url)
13
+ sleep @seconds
14
+ @value
15
+ end
16
+ end
17
+
18
+ it 'fetches results concurrently' do
19
+ timed_counter_1 = TimedCounter.new(0.3, 1)
20
+ timed_counter_2 = TimedCounter.new(0.1, 2)
21
+ counter = Engagement::CommentCounter::Threaded.new([timed_counter_1, timed_counter_2])
22
+
23
+ time = Benchmark.realtime {
24
+ counter.comments_count('http://google.com').should == 3
25
+ }
26
+
27
+ time.should be_within(0.05).of(0.3)
28
+ end
29
+
30
+ end
@@ -0,0 +1,20 @@
1
+ require 'engagement'
2
+ require 'debugger'
3
+ require 'vcr'
4
+
5
+ def disqus_forum_api_key
6
+ ENV['DISQUS_FORUM_API_KEY']
7
+ end
8
+
9
+ VCR.configure do |c|
10
+ c.cassette_library_dir = 'spec/cassettes'
11
+ c.hook_into :webmock
12
+ c.configure_rspec_metadata!
13
+ c.filter_sensitive_data('<FILTERED>') { disqus_forum_api_key }
14
+ end
15
+
16
+ RSpec.configure do |c|
17
+ # so we can use :vcr rather than :vcr => true;
18
+ # in RSpec 3 this will no longer be necessary.
19
+ c.treat_symbols_as_metadata_keys_with_true_values = true
20
+ end
metadata ADDED
@@ -0,0 +1,207 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: engagement
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Guterl
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: vcr
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: debugger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: hacker_news_search
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 0.0.6
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.0.6
111
+ - !ruby/object:Gem::Dependency
112
+ name: snoo
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: disqus
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: A ruby gem for measuring the engagement of URLs on various social sites.
140
+ email:
141
+ - michael@diminishing.org
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - .gitignore
147
+ - Gemfile
148
+ - LICENSE.txt
149
+ - README.md
150
+ - Rakefile
151
+ - engagement.gemspec
152
+ - lib/engagement.rb
153
+ - lib/engagement/comment_counter.rb
154
+ - lib/engagement/comment_counter/disqus.rb
155
+ - lib/engagement/comment_counter/hacker_news.rb
156
+ - lib/engagement/comment_counter/reddit.rb
157
+ - lib/engagement/comment_counter/threaded.rb
158
+ - lib/engagement/version.rb
159
+ - spec/cassettes/Engagement_CommentCounter_Disqus/when_we_don_t_own_the_url/returns_zero_when_we_don_t_own_the_url.yml
160
+ - spec/cassettes/Engagement_CommentCounter_Disqus/when_we_own_the_url/returns_the_number_of_comments_for_the_given_url.yml
161
+ - spec/cassettes/Engagement_CommentCounter_HackerNews/returns_the_number_of_comments_for_the_given_url.yml
162
+ - spec/cassettes/Engagement_CommentCounter_Reddit/with_a_single_listing_returned/.yml
163
+ - spec/cassettes/Engagement_CommentCounter_Reddit/with_multiple_listings_returned/.yml
164
+ - spec/cassettes/Engagement_CommentCounter_Reddit/with_no_results/.yml
165
+ - spec/engagement/comment_counter/disqus_spec.rb
166
+ - spec/engagement/comment_counter/hacker_news_spec.rb
167
+ - spec/engagement/comment_counter/reddit_spec.rb
168
+ - spec/engagement/comment_counter_spec.rb
169
+ - spec/engagement/threaded_comment_counter_spec.rb
170
+ - spec/spec_helper.rb
171
+ homepage: https://github.com/gaslight/engagement
172
+ licenses:
173
+ - MIT
174
+ metadata: {}
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - '>='
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - '>='
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubyforge_project:
191
+ rubygems_version: 2.0.3
192
+ signing_key:
193
+ specification_version: 4
194
+ summary: Get comment counts from Reddit, HackerNews, and Disqus.
195
+ test_files:
196
+ - spec/cassettes/Engagement_CommentCounter_Disqus/when_we_don_t_own_the_url/returns_zero_when_we_don_t_own_the_url.yml
197
+ - spec/cassettes/Engagement_CommentCounter_Disqus/when_we_own_the_url/returns_the_number_of_comments_for_the_given_url.yml
198
+ - spec/cassettes/Engagement_CommentCounter_HackerNews/returns_the_number_of_comments_for_the_given_url.yml
199
+ - spec/cassettes/Engagement_CommentCounter_Reddit/with_a_single_listing_returned/.yml
200
+ - spec/cassettes/Engagement_CommentCounter_Reddit/with_multiple_listings_returned/.yml
201
+ - spec/cassettes/Engagement_CommentCounter_Reddit/with_no_results/.yml
202
+ - spec/engagement/comment_counter/disqus_spec.rb
203
+ - spec/engagement/comment_counter/hacker_news_spec.rb
204
+ - spec/engagement/comment_counter/reddit_spec.rb
205
+ - spec/engagement/comment_counter_spec.rb
206
+ - spec/engagement/threaded_comment_counter_spec.rb
207
+ - spec/spec_helper.rb