onebox 1.0.1 → 1.1.0

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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +4 -0
  3. data/.travis.yml +4 -0
  4. data/README.md +154 -113
  5. data/lib/onebox.rb +6 -3
  6. data/lib/onebox/engine.rb +28 -26
  7. data/lib/onebox/engine/amazon_onebox.rb +4 -2
  8. data/lib/onebox/engine/bliptv_onebox.rb +4 -2
  9. data/lib/onebox/engine/clikthrough_onebox.rb +4 -2
  10. data/lib/onebox/engine/college_humor_onebox.rb +3 -2
  11. data/lib/onebox/engine/dailymotion_onebox.rb +4 -2
  12. data/lib/onebox/engine/dotsub_onebox.rb +4 -2
  13. data/lib/onebox/engine/example_onebox.rb +4 -5
  14. data/lib/onebox/engine/flickr_onebox.rb +3 -2
  15. data/lib/onebox/engine/funny_or_die_onebox.rb +4 -2
  16. data/lib/onebox/engine/github_blob_onebox.rb +28 -0
  17. data/lib/onebox/engine/github_commit_onebox.rb +43 -0
  18. data/lib/onebox/engine/github_gist_onebox.rb +33 -0
  19. data/lib/onebox/engine/github_pullrequest_onebox.rb +43 -0
  20. data/lib/onebox/engine/html.rb +1 -1
  21. data/lib/onebox/engine/hulu_onebox.rb +5 -2
  22. data/lib/onebox/engine/imgur_image_onebox.rb +26 -0
  23. data/lib/onebox/engine/itunes_onebox.rb +28 -0
  24. data/lib/onebox/engine/json.rb +11 -0
  25. data/lib/onebox/engine/kinomap_onebox.rb +27 -0
  26. data/lib/onebox/engine/nfb_onebox.rb +5 -2
  27. data/lib/onebox/engine/open_graph.rb +1 -1
  28. data/lib/onebox/engine/qik_onebox.rb +4 -2
  29. data/lib/onebox/engine/revision3_onebox.rb +3 -2
  30. data/lib/onebox/engine/slideshare_onebox.rb +4 -2
  31. data/lib/onebox/engine/sound_cloud_onebox.rb +4 -2
  32. data/lib/onebox/engine/spotify_onebox.rb +27 -0
  33. data/lib/onebox/engine/stack_exchange_onebox.rb +4 -2
  34. data/lib/onebox/engine/ted_onebox.rb +5 -2
  35. data/lib/onebox/engine/twitter_onebox.rb +31 -0
  36. data/lib/onebox/engine/viddler_onebox.rb +5 -3
  37. data/lib/onebox/engine/vimeo_onebox.rb +3 -2
  38. data/lib/onebox/engine/wikipedia_onebox.rb +4 -2
  39. data/lib/onebox/engine/yfrog_onebox.rb +5 -2
  40. data/lib/onebox/version.rb +1 -1
  41. data/lib/onebox/view.rb +21 -0
  42. data/onebox.gemspec +1 -1
  43. data/spec/fixtures/githubblob.response +922 -0
  44. data/spec/fixtures/githubcommit.response +87 -0
  45. data/spec/fixtures/githubgist.response +468 -0
  46. data/spec/fixtures/githubpullrequest.response +216 -0
  47. data/spec/fixtures/imguralbum.response +941 -0
  48. data/spec/fixtures/{imgur.response → imgurimage.response} +870 -890
  49. data/spec/fixtures/itunes.response +402 -0
  50. data/spec/fixtures/{rottentomatoes_fresh.response → rottentomatoesfresh.response} +0 -0
  51. data/spec/fixtures/{rottentomatoes_incomplete.response → rottentomatoesincomplete.response} +0 -0
  52. data/spec/fixtures/{rottentomatoes_rotten.response → rottentomatoesrotten.response} +0 -0
  53. data/spec/fixtures/spotify.response +250 -0
  54. data/spec/fixtures/{wikipedia_redirected.response → wikipediaredirected.response} +0 -0
  55. data/spec/lib/onebox/engine/{amazon_spec.rb → amazon_onebox_spec.rb} +7 -4
  56. data/spec/lib/onebox/engine/{bliptv_spec.rb → bliptv_onebox_spec.rb} +7 -4
  57. data/spec/lib/onebox/engine/{clikthrough_spec.rb → clikthrough_onebox_spec.rb} +7 -4
  58. data/spec/lib/onebox/engine/{college_humor_spec.rb → college_humor_onebox_spec.rb} +7 -4
  59. data/spec/lib/onebox/engine/{dailymotion_spec.rb → dailymotion_onebox_spec.rb} +7 -4
  60. data/spec/lib/onebox/engine/{dotsub_spec.rb → dotsub_onebox_spec.rb} +7 -4
  61. data/spec/lib/onebox/engine/example_onebox_spec.rb +21 -0
  62. data/spec/lib/onebox/engine/{flickr_spec.rb → flickr_onebox_spec.rb} +7 -4
  63. data/spec/lib/onebox/engine/{funny_or_die_spec.rb → funny_or_die_onebox_spec.rb} +7 -4
  64. data/spec/lib/onebox/engine/github_blob_onebox_spec.rb +30 -0
  65. data/spec/lib/onebox/engine/github_commit_onebox_spec.rb +61 -0
  66. data/spec/lib/onebox/engine/github_gist_onebox_spec.rb +29 -0
  67. data/spec/lib/onebox/engine/github_pullrequest_onebox_spec.rb +58 -0
  68. data/spec/lib/onebox/engine/html_spec.rb +27 -0
  69. data/spec/lib/onebox/engine/{hulu_spec.rb → hulu_onebox_spec.rb} +7 -4
  70. data/spec/lib/onebox/engine/imgur_image_onebox_spec.rb +29 -0
  71. data/spec/lib/onebox/engine/itunes_onebox_spec.rb +29 -0
  72. data/spec/lib/onebox/engine/json_spec.rb +27 -0
  73. data/spec/lib/onebox/engine/kinomap_onebox_spec.rb +37 -0
  74. data/spec/lib/onebox/engine/{nfb_spec.rb → nfb_onebox_spec.rb} +7 -4
  75. data/spec/lib/onebox/engine/open_graph_spec.rb +27 -0
  76. data/spec/lib/onebox/engine/{qik_spec.rb → qik_onebox_spec.rb} +7 -4
  77. data/spec/lib/onebox/engine/{revision3_spec.rb → revision3_onebox_spec.rb} +7 -4
  78. data/spec/lib/onebox/engine/{slideshare_spec.rb → slideshare_onebox_spec.rb} +7 -4
  79. data/spec/lib/onebox/engine/{sound_cloud_spec.rb → sound_cloud_onebox_spec.rb} +7 -4
  80. data/spec/lib/onebox/engine/spotify_onebox_spec.rb +36 -0
  81. data/spec/lib/onebox/engine/{stack_exchange_spec.rb → stack_exchange_onebox_spec.rb} +7 -4
  82. data/spec/lib/onebox/engine/{ted_spec.rb → ted_onebox_spec.rb} +7 -4
  83. data/spec/lib/onebox/engine/twitter_onebox_spec.rb +47 -0
  84. data/spec/lib/onebox/engine/{viddler_spec.rb → viddler_onebox_spec.rb} +7 -4
  85. data/spec/lib/onebox/engine/{vimeo_spec.rb → vimeo_onebox_spec.rb} +7 -4
  86. data/spec/lib/onebox/engine/{wikipedia_spec.rb → wikipedia_onebox_spec.rb} +7 -4
  87. data/spec/lib/onebox/engine/{yfrog_spec.rb → yfrog_onebox_spec.rb} +7 -4
  88. data/spec/lib/onebox/engine_spec.rb +38 -27
  89. data/spec/lib/onebox/preview_spec.rb +3 -1
  90. data/spec/lib/onebox/view_spec.rb +16 -0
  91. data/spec/lib/onebox_spec.rb +1 -1
  92. data/spec/spec_helper.rb +8 -3
  93. data/spec/support/html_spec_helper.rb +1 -1
  94. data/templates/_layout.mustache +4 -0
  95. data/templates/amazon.mustache +5 -0
  96. data/templates/bliptv.mustache +5 -0
  97. data/templates/clikthrough.mustache +4 -0
  98. data/templates/collegehumor.mustache +5 -0
  99. data/templates/dailymotion.mustache +5 -0
  100. data/templates/dotsub.mustache +5 -0
  101. data/templates/example.mustache +2 -0
  102. data/templates/flickr.mustache +4 -0
  103. data/templates/funnyordie.mustache +6 -0
  104. data/templates/githubblob.mustache +5 -0
  105. data/templates/githubcommit.mustache +11 -0
  106. data/templates/githubgist.mustache +3 -0
  107. data/templates/githubpullrequest.mustache +14 -0
  108. data/templates/hulu.mustache +6 -0
  109. data/templates/imgurimage.mustache +3 -0
  110. data/templates/itunes.mustache +4 -0
  111. data/templates/kinomap.mustache +5 -0
  112. data/templates/nfb.mustache +5 -0
  113. data/templates/qik.mustache +4 -0
  114. data/templates/revision3.mustache +5 -0
  115. data/templates/slideshare.mustache +4 -0
  116. data/templates/soundcloud.mustache +5 -0
  117. data/templates/spotify.mustache +4 -0
  118. data/templates/stackexchange.mustache +3 -0
  119. data/templates/ted.mustache +5 -0
  120. data/templates/twitter.mustache +7 -0
  121. data/templates/viddler.mustache +5 -0
  122. data/templates/vimeo.mustache +5 -0
  123. data/templates/wikipedia.mustache +4 -0
  124. data/templates/yfrog.mustache +4 -0
  125. metadata +139 -90
  126. data/spec/fixtures/apple.response +0 -391
  127. data/spec/fixtures/clickthrough.response +0 -1472
  128. data/spec/fixtures/gist.response +0 -282
  129. data/spec/fixtures/github_blob.response +0 -706
  130. data/spec/fixtures/github_commit.response +0 -881
  131. data/spec/fixtures/github_pullrequest.response +0 -1619
  132. data/spec/lib/onebox/engine/example_spec.rb +0 -18
  133. data/templates/amazon.handlebars +0 -9
  134. data/templates/bliptv.handlebars +0 -10
  135. data/templates/clickthrough.handlebars +0 -8
  136. data/templates/clikthrough.handlebars +0 -8
  137. data/templates/collegehumor.handlebars +0 -9
  138. data/templates/dailymotion.handlebars +0 -9
  139. data/templates/dotsub.handlebars +0 -9
  140. data/templates/flickr.handlebars +0 -8
  141. data/templates/funnyordie.handlebars +0 -9
  142. data/templates/hulu.handlebars +0 -9
  143. data/templates/nfb.handlebars +0 -8
  144. data/templates/qik.handlebars +0 -7
  145. data/templates/revision3.handlebars +0 -9
  146. data/templates/slideshare.handlebars +0 -8
  147. data/templates/soundcloud.handlebars +0 -9
  148. data/templates/stackexchange.handlebars +0 -7
  149. data/templates/ted.handlebars +0 -8
  150. data/templates/viddler.handlebars +0 -9
  151. data/templates/vimeo.handlebars +0 -9
  152. data/templates/wikipedia.handlebars +0 -8
  153. data/templates/yfrog.handlebars +0 -8
@@ -5,8 +5,10 @@ module Onebox
5
5
  include HTML
6
6
 
7
7
  matches do
8
- #/^https?:\/\/(?:www\.)?amazon.(com|ca)\/.*$/
9
- find "amazon.com"
8
+ http
9
+ maybe("www.")
10
+ domain("amazon")
11
+ has(".").either("com", "ca").maybe("/")
10
12
  end
11
13
 
12
14
  private
@@ -5,8 +5,10 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?:\/\/blip.tv\/.+$/
9
- find "blip.tv"
8
+ http
9
+ maybe("www.")
10
+ domain("blip")
11
+ has(".tv").maybe("/")
10
12
  end
11
13
 
12
14
  private
@@ -5,8 +5,10 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?:\/\/(?:www.)?clikthrough.com\/theater\/video\/\d+$/
9
- find "clikthrough.com"
8
+ http
9
+ maybe("www.")
10
+ domain("clikthrough")
11
+ has(".com").either("/theater", "/video").maybe("/")
10
12
  end
11
13
 
12
14
  private
@@ -5,8 +5,9 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?:\/\/www.collegehumor.com\/video\/.*$/
9
- find "collegehumor.com"
8
+ http
9
+ domain("collegehumor")
10
+ has(".com").maybe("/video").maybe("/")
10
11
  end
11
12
 
12
13
  private
@@ -5,8 +5,10 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?:\/\/(?:www\.)?dailymotion\.com\/.+$/
9
- find "dailymotion.com"
8
+ http
9
+ maybe("www.")
10
+ domain("dailymotion")
11
+ has(".com").maybe("/")
10
12
  end
11
13
 
12
14
  private
@@ -5,8 +5,10 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # matcher /^https?:\/\/(?:www\.)?dotsub\.com\/.+$/
9
- find "dotsub.com"
8
+ http
9
+ maybe("www.")
10
+ domain("dotsub")
11
+ has(".com").maybe("/")
10
12
  end
11
13
 
12
14
  private
@@ -5,7 +5,10 @@ module Onebox
5
5
  include HTML
6
6
 
7
7
  matches do
8
- find "example.com"
8
+ http
9
+ maybe("www.")
10
+ domain("example")
11
+ has(".com").maybe("/")
9
12
  end
10
13
 
11
14
  private
@@ -15,10 +18,6 @@ module Onebox
15
18
  header: raw.css("h1").inner_text
16
19
  }
17
20
  end
18
-
19
- def template
20
- %|<div class="onebox">{{header}}</div>|
21
- end
22
21
  end
23
22
  end
24
23
  end
@@ -5,8 +5,9 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?\:\/\/.*\.flickr\.com\/.*$/
9
- find "flickr.com"
8
+ http
9
+ domain("flickr")
10
+ has(".com").maybe("/")
10
11
  end
11
12
 
12
13
  private
@@ -5,8 +5,10 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?\:\/\/(www\.)?funnyordie\.com\/videos\/.*$/$/
9
- find "funnyordie.com"
8
+ http
9
+ maybe("www.")
10
+ domain("funnyordie")
11
+ has(".com").maybe("/videos").maybe("/")
10
12
  end
11
13
 
12
14
  private
@@ -0,0 +1,28 @@
1
+ module Onebox
2
+ module Engine
3
+ class GithubBlobOnebox
4
+ include Engine
5
+ include HTML
6
+
7
+ matches do
8
+ http
9
+ maybe("www")
10
+ domain("github")
11
+ tld("com")
12
+ anything
13
+ with("/blob/")
14
+ end
15
+
16
+ private
17
+
18
+ def data
19
+ {
20
+ url: @url,
21
+ filename: raw.css(".final-path").inner_text,
22
+ lines: raw.css("#files .file .info .mode + span").inner_text,
23
+ file: raw.css("#files .file .blob-wrapper").inner_text
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ module Onebox
2
+ module Engine
3
+ class GithubCommitOnebox
4
+ include Engine
5
+ include JSON
6
+
7
+ matches do
8
+ http
9
+ maybe("www.")
10
+ domain("github")
11
+ tld("com")
12
+ anything
13
+ with("/commit/")
14
+ end
15
+
16
+ def url
17
+ "https://api.github.com/repos/#{match[:owner]}/#{match[:repo]}/commits/#{match[:number]}"
18
+ end
19
+
20
+ private
21
+
22
+ def match
23
+ @url.match(/github\.com\/(?<owner>[^\/]+)\/(?<repo>[^\/]+)\/commit\/(?<number>[^\/]+)/)
24
+ end
25
+
26
+ def data
27
+ {
28
+ url: @url,
29
+ owner: match[:owner],
30
+ repo: match[:repo],
31
+ sha: raw["sha"],
32
+ gravatar: raw["author"]["avatar_url"],
33
+ message: raw["commit"]["message"],
34
+ author: raw["author"]["login"],
35
+ time_date: raw["commit"]["committer"]["date"],
36
+ files_changed: raw["files"].length,
37
+ additions: raw["stats"]["additions"],
38
+ deletions: raw["stats"]["deletions"]
39
+ }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,33 @@
1
+ module Onebox
2
+ module Engine
3
+ class GithubGistOnebox
4
+ include Engine
5
+ include JSON
6
+
7
+ matches do
8
+ http
9
+ with("gist.")
10
+ domain("github")
11
+ tld("com")
12
+ end
13
+
14
+ def url
15
+ "https://api.github.com/gists/#{match[:number]}"
16
+ end
17
+
18
+ private
19
+
20
+ def match
21
+ @url.match(/gist\.github\.com\/([^\/]+\/)?(?<number>[0-9a-f]+)/)
22
+ end
23
+
24
+ def data
25
+ {
26
+ url: @url,
27
+ content: raw["files"].first[1]["content"],
28
+ author: raw["user"]["login"]
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ module Onebox
2
+ module Engine
3
+ class GithubPullRequestOnebox
4
+ include Engine
5
+ include JSON
6
+
7
+ matches do
8
+ http
9
+ maybe("www.")
10
+ domain("github")
11
+ tld("com")
12
+ anything
13
+ with("/pull/")
14
+ end
15
+
16
+ def url
17
+ "https://api.github.com/repos/#{match[:owner]}/#{match[:repo]}/pulls/#{match[:number]}"
18
+ end
19
+
20
+ private
21
+
22
+ def match
23
+ @url.match(/github\.com\/(?<owner>[^\/]+)\/(?<repo>[^\/]+)\/pull\/(?<number>[^\/]+)/)
24
+ end
25
+
26
+ def data
27
+ {
28
+ url: @url,
29
+ author: raw["user"]["login"],
30
+ gravatar: raw["user"]["avatar_url"],
31
+ title: raw["title"],
32
+ repo: raw["base"]["repo"]["full_name"],
33
+ time_date: raw["created_at"],
34
+ commits: raw["commits"],
35
+ additions: raw["additions"],
36
+ deletions: raw["deletions"],
37
+ changed_files: raw["changed_files"],
38
+ description: raw["body"]
39
+ }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -4,7 +4,7 @@ module Onebox
4
4
  private
5
5
 
6
6
  def raw
7
- @raw ||= Nokogiri::HTML(open(@url))
7
+ @raw ||= Nokogiri::HTML(open(url, read_timeout: timeout))
8
8
  end
9
9
  end
10
10
  end
@@ -5,8 +5,11 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- #/^https?\:\/\/www\.hulu\.com\/watch\/.*$/
9
- find "hulu.com"
8
+ http
9
+ maybe("www.")
10
+ domain("hulu")
11
+ tld("com")
12
+ with("/watch/")
10
13
  end
11
14
 
12
15
  private
@@ -0,0 +1,26 @@
1
+ module Onebox
2
+ module Engine
3
+ class ImgurImageOnebox
4
+ include Engine
5
+ include HTML
6
+
7
+ matches do
8
+ http
9
+ domain("imgur")
10
+ tld("com")
11
+ with("/gallery")
12
+ end
13
+
14
+ private
15
+
16
+ def data
17
+ {
18
+ url: @url,
19
+ title: raw.css("h2#image-title").inner_text,
20
+ image: raw.css("#image img").first["src"]
21
+ }
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,28 @@
1
+ module Onebox
2
+ module Engine
3
+ class ItunesOnebox
4
+ include Engine
5
+ include OpenGraph
6
+
7
+ matches do
8
+ # matcher /^https?:\/\/itunes.apple.com\/.+$/
9
+ http
10
+ domain("itunes")
11
+ has(".")
12
+ domain("apple")
13
+ tld("com")
14
+ end
15
+
16
+ private
17
+
18
+ def data
19
+ {
20
+ url: @url,
21
+ title: raw.title,
22
+ image: raw.images.first,
23
+ description: raw.description,
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module Onebox
2
+ module Engine
3
+ module JSON
4
+ private
5
+
6
+ def raw
7
+ @raw ||= ::MultiJson.load(open(url, read_timeout: timeout))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module Onebox
2
+ module Engine
3
+ class KinomapOnebox
4
+ include Engine
5
+ include OpenGraph
6
+
7
+ matches do
8
+ http
9
+ domain("kinomap")
10
+ tld("com")
11
+ with("/watch/")
12
+ end
13
+
14
+ private
15
+
16
+ def data
17
+ {
18
+ url: @url,
19
+ title: raw.title,
20
+ image: raw.images.first,
21
+ description: raw.description,
22
+ video: raw.metadata[:video].first[:_value]
23
+ }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -5,8 +5,11 @@ module Onebox
5
5
  include OpenGraph
6
6
 
7
7
  matches do
8
- # /^https?:\/\/(?:www\.)?nfb\.ca\/film\/[-\w]+\/?/
9
- find "nfb.ca"
8
+ http
9
+ maybe("www.")
10
+ domain("nfb")
11
+ tld("ca")
12
+ with("/film")
10
13
  end
11
14
 
12
15
  private
@@ -4,7 +4,7 @@ module Onebox
4
4
  private
5
5
 
6
6
  def raw
7
- @raw ||= ::OpenGraph.new(@url)
7
+ @raw ||= ::OpenGraph.new(url)
8
8
  end
9
9
  end
10
10
  end
@@ -5,8 +5,10 @@ module Onebox
5
5
  include HTML
6
6
 
7
7
  matches do
8
- # /^https?\:\/\/qik\.com\/video\/.*$/
9
- find "qik.com"
8
+ http
9
+ domain("qik")
10
+ tld("com")
11
+ with("/video")
10
12
  end
11
13
 
12
14
  private