popularity 0.0.1

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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +21 -0
  5. data/Gemfile.lock +126 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.rdoc +92 -0
  8. data/Rakefile +54 -0
  9. data/VERSION +1 -0
  10. data/lib/.DS_Store +0 -0
  11. data/lib/popularity.rb +92 -0
  12. data/lib/popularity/crawler.rb +76 -0
  13. data/lib/popularity/facebook.rb +26 -0
  14. data/lib/popularity/github.rb +28 -0
  15. data/lib/popularity/google_plus.rb +22 -0
  16. data/lib/popularity/medium.rb +33 -0
  17. data/lib/popularity/pinterest.rb +21 -0
  18. data/lib/popularity/reddit_comment.rb +32 -0
  19. data/lib/popularity/reddit_post.rb +47 -0
  20. data/lib/popularity/reddit_share.rb +72 -0
  21. data/lib/popularity/results_container.rb +70 -0
  22. data/lib/popularity/search.rb +79 -0
  23. data/lib/popularity/soundcloud.rb +44 -0
  24. data/lib/popularity/twitter.rb +21 -0
  25. data/popularity.gemspec +124 -0
  26. data/spec/cassettes/facebook.yml +50 -0
  27. data/spec/cassettes/github-valid.yml +105 -0
  28. data/spec/cassettes/google_plus.yml +89 -0
  29. data/spec/cassettes/medium-valid.yml +110 -0
  30. data/spec/cassettes/pinterest.yml +44 -0
  31. data/spec/cassettes/reddit-comment.yml +207 -0
  32. data/spec/cassettes/reddit-post.yml +174 -0
  33. data/spec/cassettes/reddit.yml +183 -0
  34. data/spec/cassettes/result-container-test.yml +97 -0
  35. data/spec/cassettes/search-multi.yml +1211 -0
  36. data/spec/cassettes/search.yml +598 -0
  37. data/spec/cassettes/soundcloud-valid.yml +682 -0
  38. data/spec/cassettes/twitter.yml +64 -0
  39. data/spec/cassettes/unknown-reddit-post.yml +68 -0
  40. data/spec/facebook_spec.rb +23 -0
  41. data/spec/github_spec.rb +39 -0
  42. data/spec/google_plus_spec.rb +27 -0
  43. data/spec/medium_spec.rb +47 -0
  44. data/spec/pinterest_spec.rb +27 -0
  45. data/spec/reddit_comment_spec.rb +60 -0
  46. data/spec/reddit_post_spec.rb +64 -0
  47. data/spec/reddit_spec.rb +89 -0
  48. data/spec/results_container_spec.rb +61 -0
  49. data/spec/search_spec.rb +79 -0
  50. data/spec/soundcloud_spec.rb +66 -0
  51. data/spec/spec_helper.rb +95 -0
  52. data/spec/twitter_spec.rb +19 -0
  53. data/test/facebook_test.rb +28 -0
  54. data/test/fixtures/vcr_cassettes/facebook.yml +50 -0
  55. data/test/fixtures/vcr_cassettes/google.yml +425 -0
  56. data/test/helper.rb +34 -0
  57. data/test/test_non_specific.rb +27 -0
  58. data/test/test_twitter.rb +28 -0
  59. metadata +242 -0
@@ -0,0 +1,64 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://cdn.api.twitter.com/1/urls/count.json?url=http://google.com
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - "*/*; q=0.5, application/xml"
12
+ Accept-Encoding:
13
+ - gzip
14
+ User-Agent:
15
+ - unirest-ruby/1.1
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Date:
22
+ - Thu, 09 Apr 2015 17:30:25 GMT
23
+ Server:
24
+ - tsa_a
25
+ Cache-Control:
26
+ - must-revalidate, max-age=900
27
+ Content-Encoding:
28
+ - gzip
29
+ Content-Type:
30
+ - application/json;charset=utf-8
31
+ Expires:
32
+ - Thu, 09 Apr 2015 17:44:35 GMT
33
+ Last-Modified:
34
+ - Thu, 09 Apr 2015 17:29:35 GMT
35
+ Strict-Transport-Security:
36
+ - max-age=631138519
37
+ X-Connection-Hash:
38
+ - d92a3da2734891d68f5a79f0d1800a3b
39
+ X-Response-Time:
40
+ - '11'
41
+ Content-Length:
42
+ - '71'
43
+ Accept-Ranges:
44
+ - bytes
45
+ Via:
46
+ - 1.1 varnish
47
+ Age:
48
+ - '51'
49
+ X-Served-By:
50
+ - cache-tw-dfw1-cr1-3-TWDFW1
51
+ X-Cache:
52
+ - HIT
53
+ X-Cache-Hits:
54
+ - '1'
55
+ Vary:
56
+ - Accept-Encoding
57
+ body:
58
+ encoding: ASCII-8BIT
59
+ string: !binary |-
60
+ H4sIAAAAAAAAAKpWSs4vzStRsjI0NDU11FEqLcpRslLKKCkpsIrRj9FPz89P
61
+ z0nVS87PjdFXqgUAAAD//wMABIYJ+C0AAAA=
62
+ http_version:
63
+ recorded_at: Thu, 09 Apr 2015 17:30:25 GMT
64
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,68 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://www.reddit.com/r/search/search.json?q=url:http://jeffkeen.me/totallyunknown
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - "*/*; q=0.5, application/xml"
12
+ Accept-Encoding:
13
+ - gzip
14
+ User-Agent:
15
+ - unirest-ruby/1.1
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Date:
22
+ - Thu, 09 Apr 2015 21:56:46 GMT
23
+ Content-Type:
24
+ - application/json; charset=UTF-8
25
+ Transfer-Encoding:
26
+ - chunked
27
+ Connection:
28
+ - keep-alive
29
+ Set-Cookie:
30
+ - __cfduid=d50f20e6118c05422f5d59fe19256efb91428616606; expires=Fri, 08-Apr-16
31
+ 21:56:46 GMT; path=/; domain=.reddit.com; HttpOnly
32
+ X-Ua-Compatible:
33
+ - IE=edge
34
+ X-Frame-Options:
35
+ - SAMEORIGIN
36
+ X-Content-Type-Options:
37
+ - nosniff
38
+ X-Xss-Protection:
39
+ - 1; mode=block
40
+ Access-Control-Allow-Origin:
41
+ - "*"
42
+ Access-Control-Expose-Headers:
43
+ - X-Reddit-Tracking, X-Moose
44
+ X-Reddit-Tracking:
45
+ - https://pixel.redditmedia.com/pixel/of_destiny.png?v=NPjKlQn6h%2F0gWlAsQzt7u95XdyAaw8SNbh8xp5HZg3KKYA9i7jpvVCL6GuG0jB8s%2F51Z0Ey4yao%3D
46
+ X-Moose:
47
+ - majestic
48
+ Cache-Control:
49
+ - no-cache
50
+ Cf-Cache-Status:
51
+ - MISS
52
+ Vary:
53
+ - Accept-Encoding
54
+ Server:
55
+ - cloudflare-nginx
56
+ Cf-Ray:
57
+ - 1d4976c03d7903ee-DFW
58
+ Content-Encoding:
59
+ - gzip
60
+ body:
61
+ encoding: ASCII-8BIT
62
+ string: !binary |-
63
+ H4sIAAAAAAAAAy3JwQ2AIAxG4VWa/8wEzOAGxgPaIo1YEsATYXdj4vF9b+BS
64
+ Y3jCoq2rnXAEDj3A08BdOIWWvv35kTRzFYOndXOEELtUeLInZ0fYJZYqf8/5
65
+ AmghW1ZbAAAA
66
+ http_version:
67
+ recorded_at: Thu, 09 Apr 2015 21:56:47 GMT
68
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Popularity::Facebook do
4
+ context "valid url" do
5
+ use_vcr_cassette "facebook"
6
+
7
+ subject {
8
+ Popularity::Facebook.new('http://google.com')
9
+ }
10
+
11
+ it "should return correct comment count" do
12
+ expect(10121).to equal subject.comments
13
+ end
14
+
15
+ it "should return correct share count" do
16
+ expect(12085903).to equal subject.shares
17
+ end
18
+
19
+ it "should calculate the correct total" do
20
+ expect(subject.total).to equal (subject.shares + subject.comments)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Popularity::Github do
4
+ context "non-github url" do
5
+ use_vcr_cassette "github-invalid"
6
+
7
+ subject {
8
+ Popularity::Github.new('http://google.com')
9
+ }
10
+
11
+ it "should be invalid" do
12
+ expect(subject.valid?).to eq(false)
13
+ end
14
+
15
+ it "should have no response" do
16
+ expect(subject.response).to eq(false)
17
+ end
18
+ end
19
+
20
+ context "github url" do
21
+ use_vcr_cassette "github-valid"
22
+
23
+ subject {
24
+ Popularity::Github.new('http://github.com/jkeen/tracking_number')
25
+ }
26
+
27
+ it "should be valid" do
28
+ expect(subject.valid?).to eq(true)
29
+ end
30
+
31
+ it "should have response" do
32
+ expect(subject.response).to_not eq(false)
33
+ end
34
+
35
+ it "should have correct number of stars" do
36
+ expect(18).to eq(subject.stars)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Popularity::GooglePlus do
4
+ context "valid url" do
5
+ use_vcr_cassette "google_plus"
6
+
7
+ subject {
8
+ Popularity::GooglePlus.new('http://google.com')
9
+ }
10
+
11
+ it "should return correct plus-one count" do
12
+ expect(11180649).to eq subject.plus_ones
13
+ end
14
+
15
+ it "should calculate the correct total" do
16
+ expect(subject.plus_ones).to equal subject.total
17
+ end
18
+
19
+ context "json" do
20
+ let(:json) { subject.to_json }
21
+
22
+ it "should have required attributes in json" do
23
+ expect(subject.plus_ones).to eq(json["plus_ones"])
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Popularity::Medium do
4
+ context "non-medium url" do
5
+ use_vcr_cassette "medium-invalid"
6
+
7
+ subject {
8
+ Popularity::Medium.new('http://google.com')
9
+ }
10
+
11
+ it "should be invalid" do
12
+ expect(subject.valid?).to eq(false)
13
+ end
14
+
15
+ it "should have no resposne" do
16
+ expect(subject.response).to eq(false)
17
+ end
18
+ end
19
+
20
+ context "medium url" do
21
+ use_vcr_cassette "medium-valid"
22
+
23
+ subject {
24
+ Popularity::Medium.new('https://medium.com/@jeffkeen/call-me-sometime-64ed463c02f0')
25
+ }
26
+
27
+ it "should be valid" do
28
+ expect(subject.valid?).to eq(true)
29
+ end
30
+
31
+ it "should have response" do
32
+ expect(subject.response).to_not eq(false)
33
+ end
34
+
35
+ it "should have correct number of recommends" do
36
+ expect(13).to eq(subject.recommends)
37
+ end
38
+
39
+ context "json" do
40
+ let(:json) { subject.to_json }
41
+
42
+ it "should have required attributes in json" do
43
+ expect(subject.recommends).to eq(json["recommends"])
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Popularity::Pinterest do
4
+ context "valid url" do
5
+ use_vcr_cassette "pinterest"
6
+
7
+ subject {
8
+ Popularity::Pinterest.new('http://google.com')
9
+ }
10
+
11
+ it "should return correct pin count" do
12
+ expect(11278).to eq subject.pins
13
+ end
14
+
15
+ it "should calculate the correct total" do
16
+ expect(subject.total).to eq subject.pins
17
+ end
18
+
19
+ context "json" do
20
+ let(:json) { subject.to_json }
21
+
22
+ it "should have required attributes in json" do
23
+ expect(subject.pins).to eq(json["pins"])
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,60 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ describe Popularity::RedditComment do
5
+ context "non-reddit url" do
6
+ use_vcr_cassette "reddit-comment"
7
+
8
+ subject {
9
+ Popularity::RedditComment.new('http://google.com')
10
+ }
11
+
12
+ it "should be invalid" do
13
+ expect(subject.valid?).to eq(false)
14
+ end
15
+
16
+ it "should have no resposne" do
17
+ expect(subject.response).to eq(false)
18
+ end
19
+ end
20
+
21
+ context "non-comment url" do
22
+ use_vcr_cassette "reddit-comment"
23
+
24
+ subject {
25
+ Popularity::RedditComment.new('http://www.reddit.com/r/Fitness/comments/30wleu/me_and_my_wife_joined_the_gym_9_months_ago_we')
26
+ }
27
+
28
+ it "should be invalid" do
29
+ expect(subject.valid?).to eq(false)
30
+ end
31
+
32
+ it "should have no resposne" do
33
+ expect(subject.response).to eq(false)
34
+ end
35
+ end
36
+
37
+ context "reddit url" do
38
+ use_vcr_cassette "reddit-comment"
39
+
40
+ subject {
41
+ Popularity::RedditComment.new('http://www.reddit.com/r/Fitness/comments/30wleu/me_and_my_wife_joined_the_gym_9_months_ago_we/cpwrwat')
42
+ }
43
+
44
+ it "should be valid" do
45
+ expect(subject.valid?).to eq(true)
46
+ end
47
+
48
+ it "should have response" do
49
+ expect(subject.response).to_not eq(false)
50
+ end
51
+
52
+ it "should have correct score" do
53
+ expect(500).to eq(subject.score)
54
+ end
55
+
56
+ it "should have correct total" do
57
+ expect(subject.total).to eq(subject.score)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,64 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ describe Popularity::RedditPost do
5
+ context "non-reddit url" do
6
+ use_vcr_cassette "reddit-post"
7
+
8
+ subject {
9
+ Popularity::RedditPost.new('http://google.com')
10
+ }
11
+
12
+ it "should be invalid" do
13
+ expect(subject.valid?).to eq(false)
14
+ end
15
+
16
+ it "should have no resposne" do
17
+ expect(subject.response).to eq(false)
18
+ end
19
+ end
20
+
21
+ context "non-post url" do
22
+ use_vcr_cassette "reddit-post"
23
+
24
+ subject {
25
+ Popularity::RedditPost.new('http://www.reddit.com/r/Fitness/comments/30wleu/me_and_my_wife_joined_the_gym_9_months_ago_we/cpwrwat')
26
+ }
27
+
28
+ it "should be invalid" do
29
+ expect(subject.valid?).to eq(false)
30
+ end
31
+
32
+ it "should have no resposne" do
33
+ expect(subject.response).to eq(false)
34
+ end
35
+ end
36
+
37
+ context "reddit url" do
38
+ use_vcr_cassette "reddit-post"
39
+
40
+ subject {
41
+ Popularity::RedditPost.new('http://www.reddit.com/r/funny/comments/2naq2t/every_time_my_brother_leaves_me_a_voicemail_he/')
42
+ }
43
+
44
+ it "should be valid" do
45
+ expect(subject.valid?).to eq(true)
46
+ end
47
+
48
+ it "should have response" do
49
+ expect(subject.response).to_not eq(false)
50
+ end
51
+
52
+ it "should have correct number of comments" do
53
+ expect(36).to eq(subject.comments)
54
+ end
55
+
56
+ it "should have correct score" do
57
+ expect(629).to eq(subject.score)
58
+ end
59
+
60
+ it "should have correct total" do
61
+ expect(subject.total).to eq(subject.score + subject.comments)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe Popularity::RedditShare do
4
+ context "valid url" do
5
+ use_vcr_cassette "reddit"
6
+
7
+ subject {
8
+ Popularity::RedditShare.new('http://google.com')
9
+ }
10
+
11
+ it "should have multiple results" do
12
+ expect(25).to eq(subject.results.size)
13
+ end
14
+
15
+ it "should roll up score counts" do
16
+ totals = subject.results.collect { |r| r.score }
17
+ expect(totals.reduce(:+)).to eq subject.score
18
+ end
19
+
20
+ it "should roll up comment counts" do
21
+ totals = subject.results.collect { |r| r.comments }
22
+ expect(totals.reduce(:+)).to eq subject.comments
23
+ end
24
+
25
+ it "should allow access to underlying results" do
26
+ expect(4687).to eq(subject.results.first.score)
27
+ end
28
+
29
+ context "json" do
30
+ let(:json) { subject.to_json }
31
+
32
+ it "should include post count in json" do
33
+ expect(25).to eq(json["posts"])
34
+ end
35
+
36
+ it "should comments in json" do
37
+ expect(json["comments"]).to_not be_nil
38
+ end
39
+
40
+ it "should score in json" do
41
+ expect(json["score"]).to_not be_nil
42
+ end
43
+ end
44
+
45
+ context "unknown url" do
46
+ use_vcr_cassette "unknown-reddit-post"
47
+ subject {
48
+ Popularity::RedditShare.new('http://jeffkeen.me/totallyunknown')
49
+ }
50
+
51
+ it "should be valid" do
52
+ expect(subject.valid?).to eq(true)
53
+ end
54
+
55
+ it "should have response" do
56
+ expect(subject.response).to_not eq(false)
57
+ end
58
+
59
+ it "should have correct number of comments" do
60
+ expect(0).to eq(subject.comments)
61
+ end
62
+
63
+ it "should have correct score" do
64
+ expect(0).to eq(subject.score)
65
+ end
66
+
67
+ it "should have correct total" do
68
+ expect(subject.total).to eq(subject.score + subject.comments)
69
+ end
70
+
71
+ context "json" do
72
+ let(:json) { subject.to_json }
73
+
74
+ it "should include post count in json" do
75
+ expect(0).to eq(json["posts"])
76
+ end
77
+
78
+ it "should comments in json" do
79
+ expect(0).to eq(json["comments"])
80
+ end
81
+
82
+ it "should score in json" do
83
+ expect(0).to eq(json["score"])
84
+ end
85
+
86
+ end
87
+ end
88
+ end
89
+ end