open_graph_reader 0.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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitmodules +3 -0
  3. data/.rspec +2 -0
  4. data/.yardopts +1 -0
  5. data/lib/open_graph_reader.rb +83 -0
  6. data/lib/open_graph_reader/base.rb +57 -0
  7. data/lib/open_graph_reader/builder.rb +100 -0
  8. data/lib/open_graph_reader/definitions.rb +333 -0
  9. data/lib/open_graph_reader/fetcher.rb +82 -0
  10. data/lib/open_graph_reader/object.rb +95 -0
  11. data/lib/open_graph_reader/object/dsl.rb +130 -0
  12. data/lib/open_graph_reader/object/dsl/types.rb +71 -0
  13. data/lib/open_graph_reader/object/registry.rb +54 -0
  14. data/lib/open_graph_reader/parser.rb +85 -0
  15. data/lib/open_graph_reader/parser/graph.rb +136 -0
  16. data/lib/open_graph_reader/version.rb +4 -0
  17. data/spec/fixtures/examples/apple-touch-icon-precomposed.png +0 -0
  18. data/spec/fixtures/examples/apple-touch-icon.png +0 -0
  19. data/spec/fixtures/examples/article-offset.html +25 -0
  20. data/spec/fixtures/examples/article-utc.html +25 -0
  21. data/spec/fixtures/examples/article.html +25 -0
  22. data/spec/fixtures/examples/audio-array.html +27 -0
  23. data/spec/fixtures/examples/audio-url.html +25 -0
  24. data/spec/fixtures/examples/audio.html +24 -0
  25. data/spec/fixtures/examples/book-isbn10.html +27 -0
  26. data/spec/fixtures/examples/book.html +27 -0
  27. data/spec/fixtures/examples/canadian.html +16 -0
  28. data/spec/fixtures/examples/error.html +17 -0
  29. data/spec/fixtures/examples/errors/article-date.html +25 -0
  30. data/spec/fixtures/examples/errors/book-author.html +27 -0
  31. data/spec/fixtures/examples/errors/book.html +27 -0
  32. data/spec/fixtures/examples/errors/gender.html +20 -0
  33. data/spec/fixtures/examples/errors/geo.html +23 -0
  34. data/spec/fixtures/examples/errors/type.html +16 -0
  35. data/spec/fixtures/examples/errors/video-duration.html +42 -0
  36. data/spec/fixtures/examples/favicon.ico +0 -0
  37. data/spec/fixtures/examples/filters/xss-image.html +15 -0
  38. data/spec/fixtures/examples/image-array.html +26 -0
  39. data/spec/fixtures/examples/image-toosmall.html +24 -0
  40. data/spec/fixtures/examples/image-url.html +22 -0
  41. data/spec/fixtures/examples/image.html +21 -0
  42. data/spec/fixtures/examples/index.html +67 -0
  43. data/spec/fixtures/examples/media/audio/1khz.mp3 +0 -0
  44. data/spec/fixtures/examples/media/audio/250hz.mp3 +0 -0
  45. data/spec/fixtures/examples/media/images/1.png +0 -0
  46. data/spec/fixtures/examples/media/images/50.png +0 -0
  47. data/spec/fixtures/examples/media/images/75.png +0 -0
  48. data/spec/fixtures/examples/media/images/icon.png +0 -0
  49. data/spec/fixtures/examples/media/images/logo.png +0 -0
  50. data/spec/fixtures/examples/media/images/train.jpg +0 -0
  51. data/spec/fixtures/examples/media/video/train.flv +0 -0
  52. data/spec/fixtures/examples/media/video/train.mp4 +0 -0
  53. data/spec/fixtures/examples/media/video/train.webm +0 -0
  54. data/spec/fixtures/examples/min.html +14 -0
  55. data/spec/fixtures/examples/nomedia.html +20 -0
  56. data/spec/fixtures/examples/plain.html +10 -0
  57. data/spec/fixtures/examples/profile.html +25 -0
  58. data/spec/fixtures/examples/required.html +20 -0
  59. data/spec/fixtures/examples/robots.txt +4 -0
  60. data/spec/fixtures/examples/sitemap.xml +23 -0
  61. data/spec/fixtures/examples/video-array.html +36 -0
  62. data/spec/fixtures/examples/video-movie.html +42 -0
  63. data/spec/fixtures/examples/video.html +26 -0
  64. data/spec/integration/invalid_examples_spec.rb +69 -0
  65. data/spec/integration/valid_examples_spec.rb +76 -0
  66. data/spec/open_graph_reader_spec.rb +94 -0
  67. data/spec/spec_helper.rb +35 -0
  68. metadata +247 -0
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Allow: /
3
+
4
+ Sitemap: http://examples.opengraphprotocol.us/sitemap.xml
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url><loc>http://examples.opengraphprotocol.us/</loc><priority>1</priority></url>
4
+ <url><loc>http://examples.opengraphprotocol.us/article.html</loc></url>
5
+ <url><loc>http://examples.opengraphprotocol.us/article-offset.html</loc></url>
6
+ <url><loc>http://examples.opengraphprotocol.us/article-utc.html</loc></url>
7
+ <url><loc>http://examples.opengraphprotocol.us/audio-array.html</loc></url>
8
+ <url><loc>http://examples.opengraphprotocol.us/audio-url.html</loc></url>
9
+ <url><loc>http://examples.opengraphprotocol.us/book-isbn10.html</loc></url>
10
+ <url><loc>http://examples.opengraphprotocol.us/book.html</loc></url>
11
+ <url><loc>http://examples.opengraphprotocol.us/canadian.html</loc></url>
12
+ <url><loc>http://examples.opengraphprotocol.us/image-array.html</loc></url>
13
+ <url><loc>http://examples.opengraphprotocol.us/image-toosmall.html</loc></url>
14
+ <url><loc>http://examples.opengraphprotocol.us/image-url.html</loc></url>
15
+ <url><loc>http://examples.opengraphprotocol.us/image.html</loc></url>
16
+ <url><loc>http://examples.opengraphprotocol.us/min.html</loc></url>
17
+ <url><loc>http://examples.opengraphprotocol.us/nomedia.html</loc></url>
18
+ <url><loc>http://examples.opengraphprotocol.us/profile.html</loc></url>
19
+ <url><loc>http://examples.opengraphprotocol.us/required.html</loc></url>
20
+ <url><loc>http://examples.opengraphprotocol.us/video-array.html</loc></url>
21
+ <url><loc>http://examples.opengraphprotocol.us/video-movie.html</loc></url>
22
+ <url><loc>http://examples.opengraphprotocol.us/video.html</loc></url>
23
+ </urlset>
@@ -0,0 +1,36 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head prefix="og: http://ogp.me/ns#">
4
+ <meta charset="utf-8">
5
+ <title>Structured video array</title>
6
+ <meta property="og:title" content="Structured video array">
7
+ <meta property="og:site_name" content="Open Graph protocol examples">
8
+ <meta property="og:type" content="website">
9
+ <meta property="og:locale" content="en_US">
10
+ <link rel="canonical" href="http://examples.opengraphprotocol.us/video-array.html">
11
+ <meta property="og:url" content="http://examples.opengraphprotocol.us/video-array.html">
12
+ <meta property="og:image" content="http://examples.opengraphprotocol.us/media/images/50.png">
13
+ <meta property="og:image:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/images/50.png">
14
+ <meta property="og:image:width" content="50">
15
+ <meta property="og:image:height" content="50">
16
+ <meta property="og:image:type" content="image/png">
17
+ <meta property="og:video" content="http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf?src=http%3A%2F%2Fexamples.opengraphprotocol.us%2Fmedia%2Fvideo%2Ftrain.mp4">
18
+ <meta property="og:video:secure_url" content="https://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf?src=https%3A%2F%2Fd72cgtgi6hvvl.cloudfront.net%2Fmedia%2Fvideo%2Ftrain.mp4">
19
+ <meta property="og:video:type" content="application/x-shockwave-flash">
20
+ <meta property="og:video:width" content="472">
21
+ <meta property="og:video:height" content="296">
22
+ <meta property="og:video" content="http://examples.opengraphprotocol.us/media/video/train.mp4">
23
+ <meta property="og:video:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/video/train.mp4">
24
+ <meta property="og:video:type" content="video/mp4">
25
+ <meta property="og:video:width" content="472">
26
+ <meta property="og:video:height" content="296">
27
+ <meta property="og:video" content="http://examples.opengraphprotocol.us/media/video/train.webm">
28
+ <meta property="og:video:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/video/train.webm">
29
+ <meta property="og:video:type" content="video/webm">
30
+ <meta property="og:video:width" content="480">
31
+ <meta property="og:video:height" content="320">
32
+ </head>
33
+ <body>
34
+ <p>Example of basic properties with <a href="http://ogp.me/#structured">structured</a> videos in a SWF wrapper, MP4, and WebM format.</p>
35
+ </body>
36
+ </html>
@@ -0,0 +1,42 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head prefix="og: http://ogp.me/ns# video: http://ogp.me/ns/video#">
4
+ <meta charset="utf-8">
5
+ <title>Arrival of a Train at La Ciotat</title>
6
+ <meta property="og:title" content="Arrival of a Train at La Ciotat">
7
+ <meta property="og:description" content="L'arrivée d'un train en gare de La Ciotat is an 1895 French short black-and-white silent documentary film directed and produced by Auguste and Louis Lumière. Its first public showing took place in January 1896.">
8
+ <meta property="og:site_name" content="Open Graph protocol examples">
9
+ <meta property="og:type" content="video.movie">
10
+ <meta property="og:locale" content="en_US">
11
+ <link rel="canonical" href="http://examples.opengraphprotocol.us/video-movie.html">
12
+ <meta property="og:url" content="http://examples.opengraphprotocol.us/video-movie.html">
13
+ <meta property="og:image" content="http://examples.opengraphprotocol.us/media/images/train.jpg">
14
+ <meta property="og:image:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/images/train.jpg">
15
+ <meta property="og:image:width" content="500">
16
+ <meta property="og:image:height" content="328">
17
+ <meta property="og:image:type" content="image/jpeg">
18
+ <meta property="og:video" content="http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf?src=http%3A%2F%2Fexamples.opengraphprotocol.us%2Fmedia%2Fvideo%2Ftrain.mp4">
19
+ <meta property="og:video:secure_url" content="https://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf?src=https%3A%2F%2Fd72cgtgi6hvvl.cloudfront.net%2Fmedia%2Fvideo%2Ftrain.mp4">
20
+ <meta property="og:video:type" content="application/x-shockwave-flash">
21
+ <meta property="og:video:width" content="472">
22
+ <meta property="og:video:height" content="296">
23
+ <meta property="og:video" content="http://examples.opengraphprotocol.us/media/video/train.mp4">
24
+ <meta property="og:video:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/video/train.mp4">
25
+ <meta property="og:video:type" content="video/mp4">
26
+ <meta property="og:video:width" content="472">
27
+ <meta property="og:video:height" content="296">
28
+ <meta property="og:video" content="http://examples.opengraphprotocol.us/media/video/train.webm">
29
+ <meta property="og:video:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/video/train.webm">
30
+ <meta property="og:video:type" content="video/webm">
31
+ <meta property="og:video:width" content="480">
32
+ <meta property="og:video:height" content="320">
33
+ <meta property="video:release_date" content="1895-12-28">
34
+ <meta property="video:director" content="http://examples.opengraphprotocol.us/profile.html">
35
+ <meta property="video:duration" content="50">
36
+ <meta property="video:tag" content="La Ciotat">
37
+ <meta property="video:tag" content="train">
38
+ </head>
39
+ <body>
40
+ <p>A <a href="http://ogp.me/#type_video.movie">video.movie</a> object.</p>
41
+ </body>
42
+ </html>
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head prefix="og: http://ogp.me/ns#">
4
+ <meta charset="utf-8">
5
+ <title>Structured video property</title>
6
+ <meta property="og:title" content="Structured video property">
7
+ <meta property="og:site_name" content="Open Graph protocol examples">
8
+ <meta property="og:type" content="website">
9
+ <meta property="og:locale" content="en_US">
10
+ <link rel="canonical" href="http://examples.opengraphprotocol.us/video.html">
11
+ <meta property="og:url" content="http://examples.opengraphprotocol.us/video.html">
12
+ <meta property="og:image" content="http://examples.opengraphprotocol.us/media/images/50.png">
13
+ <meta property="og:image:secure_url" content="https://d72cgtgi6hvvl.cloudfront.net/media/images/50.png">
14
+ <meta property="og:image:width" content="50">
15
+ <meta property="og:image:height" content="50">
16
+ <meta property="og:image:type" content="image/png">
17
+ <meta property="og:video" content="http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf?src=http%3A%2F%2Fexamples.opengraphprotocol.us%2Fmedia%2Fvideo%2Ftrain.mp4">
18
+ <meta property="og:video:secure_url" content="https://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf?src=https%3A%2F%2Fd72cgtgi6hvvl.cloudfront.net%2Fmedia%2Fvideo%2Ftrain.mp4">
19
+ <meta property="og:video:type" content="application/x-shockwave-flash">
20
+ <meta property="og:video:width" content="472">
21
+ <meta property="og:video:height" content="296">
22
+ </head>
23
+ <body>
24
+ <p>Example of basic properties with <a href="http://ogp.me/#structured">structured</a> videos in a SWF wrapper.</p>
25
+ </body>
26
+ </html>
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "invalid examples" do
4
+ %w(plain error).each do |example|
5
+ describe example do
6
+ it "says there are no tags" do
7
+ expect {
8
+ OpenGraphReader.parse! example_html 'plain'
9
+ }.to raise_error OpenGraphReader::NoOpenGraphDataError, /OpenGraph tags/
10
+ end
11
+ end
12
+ end
13
+
14
+ describe "filters/xss-image" do
15
+ it "errors on the invaid URL" do
16
+ expect {
17
+ OpenGraphReader.parse! example_html 'filters/xss-image'
18
+ }.to raise_error OpenGraphReader::InvalidObjectError, /does not start with http/
19
+ end
20
+ end
21
+
22
+ describe "errors/article-date" do
23
+ it "has an incorrectly formatted date" do
24
+ expect {
25
+ OpenGraphReader.parse! example_html 'errors/article-date'
26
+ }.to raise_error OpenGraphReader::InvalidObjectError, /ISO8601 datetime expected/
27
+ end
28
+ end
29
+
30
+ describe "errors/book-author" do
31
+ it "doesn't have a profile object as author" do
32
+ expect {
33
+ OpenGraphReader.parse! example_html 'errors/book-author'
34
+ }.to raise_error OpenGraphReader::InvalidObjectError, /does not start with http/
35
+ end
36
+ end
37
+
38
+ describe "errors/gender" do
39
+ it "doesn't have a valid gender" do
40
+ expect {
41
+ OpenGraphReader.parse! example_html 'errors/gender'
42
+ }.to raise_error OpenGraphReader::InvalidObjectError, /Expected one of/
43
+ end
44
+ end
45
+
46
+ describe "errors/geo" do
47
+ it "doesn't recognize the old elements" do
48
+ expect {
49
+ OpenGraphReader.parse! example_html 'errors/geo'
50
+ }.to raise_error OpenGraphReader::InvalidObjectError, /Undefined property/
51
+ end
52
+ end
53
+
54
+ describe "errors/type" do
55
+ it "doesn't handle the unkown type" do
56
+ expect {
57
+ OpenGraphReader.parse! example_html 'errors/type'
58
+ }.to raise_error OpenGraphReader::InvalidObjectError, /Undefined type/
59
+ end
60
+ end
61
+
62
+ describe "errors/video-duration" do
63
+ it "only accepts integers" do
64
+ expect {
65
+ OpenGraphReader.parse! example_html 'errors/video-duration'
66
+ }.to raise_error OpenGraphReader::InvalidObjectError, /Integer expected/
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'valid examples' do
4
+ %w(
5
+ article-offset
6
+ article-utc
7
+ audio-array
8
+ audio-url
9
+ audio
10
+ book-isbn10
11
+ book
12
+ canadian
13
+ image-array
14
+ image-toosmall
15
+ image-url
16
+ image
17
+ index
18
+ min
19
+ nomedia
20
+ profile
21
+ required
22
+ video-array
23
+ video-movie
24
+ video
25
+ ).each do |example|
26
+ describe example do
27
+ it "parses" do
28
+ expect {
29
+ OpenGraphReader.parse! example_html example
30
+ }.to_not raise_error
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "article" do
36
+ let(:object) { OpenGraphReader.parse! example_html "article" }
37
+ it "parses" do
38
+ expect {
39
+ object
40
+ }.to_not raise_error
41
+ end
42
+
43
+ it "allows access to the first tag" do
44
+ expect(object.article.tag).to eq "Watergate"
45
+ end
46
+
47
+ it "assigns correctly" do
48
+ expect(object.og.title).to eq "5 Held in Plot to Bug Office"
49
+ expect(object.og.site_name).to eq "Open Graph protocol examples"
50
+ expect(object.og.type).to eq "article"
51
+ expect(object.og.locale.to_s).to eq "en_US"
52
+ expect(object.og.url).to eq "http://examples.opengraphprotocol.us/article.html"
53
+ expect(object.og.image.content).to eq "http://examples.opengraphprotocol.us/media/images/50.png"
54
+ expect(object.og.image.url).to eq "https://d72cgtgi6hvvl.cloudfront.net/media/images/50.png"
55
+ expect(object.og.image.secure_url).to eq "https://d72cgtgi6hvvl.cloudfront.net/media/images/50.png"
56
+ expect(object.og.image.width).to eq 50
57
+ expect(object.og.image.height).to eq 50
58
+ expect(object.og.image.type).to eq "image/png"
59
+ expect(object.article.published_time).to eq DateTime.new(1972, 6, 18)
60
+ expect(object.article.author.content).to eq "http://examples.opengraphprotocol.us/profile.html"
61
+ expect(object.article.section).to eq "Front page"
62
+ expect(object.article.tag).to eq "Watergate"
63
+ expect(object.article.tags).to eq ["Watergate"]
64
+ end
65
+ end
66
+
67
+ # Examples say this is invalid, but http://ogp.me defines isbn it as string,
68
+ # so anything goes
69
+ describe "errors/book" do
70
+ it "parses" do
71
+ expect {
72
+ OpenGraphReader.parse! example_html "errors/book"
73
+ }.to_not raise_error
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe OpenGraphReader do
4
+ let (:invalid_object) { "<head><meta property='og:type' content='foobar' /></head>" }
5
+
6
+ describe "::fetch!" do
7
+ it "raises if there's no html" do
8
+ allow(OpenGraphReader::Fetcher).to receive(:new).and_return(double(html?: false))
9
+
10
+ expect {
11
+ OpenGraphReader.fetch! "http://example.org"
12
+ }.to raise_error OpenGraphReader::NoOpenGraphDataError
13
+ end
14
+
15
+ it "raises if there are no tags" do
16
+ fetcher = double(html?: true, url: "http://example.org", body: "")
17
+ allow(OpenGraphReader::Fetcher).to receive(:new).and_return(fetcher)
18
+ allow(OpenGraphReader::Parser).to receive(:new).and_return(double(has_tags?: false))
19
+ expect {
20
+ OpenGraphReader.fetch! "http://example.org"
21
+ }.to raise_error OpenGraphReader::NoOpenGraphDataError
22
+ end
23
+
24
+ it "raises if there's an invalid object" do
25
+ fetcher = double(html?: true, url: "http://example.org", body: invalid_object)
26
+ allow(OpenGraphReader::Fetcher).to receive(:new).and_return(fetcher)
27
+
28
+ expect {
29
+ OpenGraphReader.fetch! "http://example.org"
30
+ }.to raise_error OpenGraphReader::InvalidObjectError
31
+ end
32
+ end
33
+
34
+ describe "::fetch" do
35
+ it "does not raise if there's no html" do
36
+ allow(OpenGraphReader::Fetcher).to receive(:new).and_return(double(html?: false))
37
+
38
+ expect {
39
+ OpenGraphReader.fetch "http://example.org"
40
+ }.to_not raise_error
41
+ end
42
+
43
+ it "does not raise if there are no tags" do
44
+ fetcher = double(html?: true, url: "http://example.org", body: "")
45
+ allow(OpenGraphReader::Fetcher).to receive(:new).and_return(fetcher)
46
+ allow(OpenGraphReader::Parser).to receive(:new).and_return(double(has_tags?: false))
47
+
48
+ expect {
49
+ OpenGraphReader.fetch "http://example.org"
50
+ }.to_not raise_error
51
+ end
52
+
53
+ it "does not raise if there's an invalid object" do
54
+ fetcher = double(html?: true, url: "http://example.org", body: invalid_object)
55
+ allow(OpenGraphReader::Fetcher).to receive(:new).and_return(fetcher)
56
+
57
+ expect {
58
+ OpenGraphReader.fetch "http://example.org"
59
+ }.to_not raise_error
60
+ end
61
+ end
62
+
63
+ describe "::parse!" do
64
+ it "raises if there are no tags" do
65
+ allow(OpenGraphReader::Parser).to receive(:new).and_return(double(has_tags?: false))
66
+
67
+ expect {
68
+ OpenGraphReader.parse! ""
69
+ }.to raise_error OpenGraphReader::NoOpenGraphDataError
70
+ end
71
+
72
+ it "raises if there's an invalid object" do
73
+ expect {
74
+ OpenGraphReader.parse! invalid_object
75
+ }.to raise_error OpenGraphReader::InvalidObjectError
76
+ end
77
+ end
78
+
79
+ describe "::parse" do
80
+ it "does not raise if there are no tags" do
81
+ allow(OpenGraphReader::Parser).to receive(:new).and_return(double(has_tags?: false))
82
+
83
+ expect {
84
+ OpenGraphReader.parse ""
85
+ }.to_not raise_error
86
+ end
87
+
88
+ it "does not raise if there's an invalid object" do
89
+ expect {
90
+ OpenGraphReader.parse invalid_object
91
+ }.to_not raise_error
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,35 @@
1
+ require 'bundler/setup'
2
+ require 'webmock/rspec'
3
+
4
+ require 'open_graph_reader'
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |expectations|
8
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
9
+ end
10
+
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+
15
+ config.filter_run :focus
16
+ config.run_all_when_everything_filtered = true
17
+
18
+ config.disable_monkey_patching!
19
+
20
+ config.warnings = true if ENV['TRAVIS']
21
+
22
+ if config.files_to_run.one?
23
+ config.default_formatter = 'doc'
24
+ end
25
+
26
+ config.profile_examples = 10
27
+
28
+ config.order = :random
29
+ Kernel.srand config.seed
30
+ end
31
+
32
+
33
+ def example_html example
34
+ File.read File.expand_path("./fixtures/examples/#{example}.html", __dir__)
35
+ end
metadata ADDED
@@ -0,0 +1,247 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: open_graph_reader
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonne Haß
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.20'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.20'
97
+ description: A library to fetch and parse OpenGraph properties from an URL or a given
98
+ string.
99
+ email:
100
+ - me@jhass.eu
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitmodules"
106
+ - ".rspec"
107
+ - ".yardopts"
108
+ - lib/open_graph_reader.rb
109
+ - lib/open_graph_reader/base.rb
110
+ - lib/open_graph_reader/builder.rb
111
+ - lib/open_graph_reader/definitions.rb
112
+ - lib/open_graph_reader/fetcher.rb
113
+ - lib/open_graph_reader/object.rb
114
+ - lib/open_graph_reader/object/dsl.rb
115
+ - lib/open_graph_reader/object/dsl/types.rb
116
+ - lib/open_graph_reader/object/registry.rb
117
+ - lib/open_graph_reader/parser.rb
118
+ - lib/open_graph_reader/parser/graph.rb
119
+ - lib/open_graph_reader/version.rb
120
+ - spec/fixtures/examples/apple-touch-icon-precomposed.png
121
+ - spec/fixtures/examples/apple-touch-icon.png
122
+ - spec/fixtures/examples/article-offset.html
123
+ - spec/fixtures/examples/article-utc.html
124
+ - spec/fixtures/examples/article.html
125
+ - spec/fixtures/examples/audio-array.html
126
+ - spec/fixtures/examples/audio-url.html
127
+ - spec/fixtures/examples/audio.html
128
+ - spec/fixtures/examples/book-isbn10.html
129
+ - spec/fixtures/examples/book.html
130
+ - spec/fixtures/examples/canadian.html
131
+ - spec/fixtures/examples/error.html
132
+ - spec/fixtures/examples/errors/article-date.html
133
+ - spec/fixtures/examples/errors/book-author.html
134
+ - spec/fixtures/examples/errors/book.html
135
+ - spec/fixtures/examples/errors/gender.html
136
+ - spec/fixtures/examples/errors/geo.html
137
+ - spec/fixtures/examples/errors/type.html
138
+ - spec/fixtures/examples/errors/video-duration.html
139
+ - spec/fixtures/examples/favicon.ico
140
+ - spec/fixtures/examples/filters/xss-image.html
141
+ - spec/fixtures/examples/image-array.html
142
+ - spec/fixtures/examples/image-toosmall.html
143
+ - spec/fixtures/examples/image-url.html
144
+ - spec/fixtures/examples/image.html
145
+ - spec/fixtures/examples/index.html
146
+ - spec/fixtures/examples/media/audio/1khz.mp3
147
+ - spec/fixtures/examples/media/audio/250hz.mp3
148
+ - spec/fixtures/examples/media/images/1.png
149
+ - spec/fixtures/examples/media/images/50.png
150
+ - spec/fixtures/examples/media/images/75.png
151
+ - spec/fixtures/examples/media/images/icon.png
152
+ - spec/fixtures/examples/media/images/logo.png
153
+ - spec/fixtures/examples/media/images/train.jpg
154
+ - spec/fixtures/examples/media/video/train.flv
155
+ - spec/fixtures/examples/media/video/train.mp4
156
+ - spec/fixtures/examples/media/video/train.webm
157
+ - spec/fixtures/examples/min.html
158
+ - spec/fixtures/examples/nomedia.html
159
+ - spec/fixtures/examples/plain.html
160
+ - spec/fixtures/examples/profile.html
161
+ - spec/fixtures/examples/required.html
162
+ - spec/fixtures/examples/robots.txt
163
+ - spec/fixtures/examples/sitemap.xml
164
+ - spec/fixtures/examples/video-array.html
165
+ - spec/fixtures/examples/video-movie.html
166
+ - spec/fixtures/examples/video.html
167
+ - spec/integration/invalid_examples_spec.rb
168
+ - spec/integration/valid_examples_spec.rb
169
+ - spec/open_graph_reader_spec.rb
170
+ - spec/spec_helper.rb
171
+ homepage: https://github.com/jhass/opengraph_reader
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.4.1
192
+ signing_key:
193
+ specification_version: 4
194
+ summary: OpenGraph protocol parser
195
+ test_files:
196
+ - spec/fixtures/examples/apple-touch-icon-precomposed.png
197
+ - spec/fixtures/examples/apple-touch-icon.png
198
+ - spec/fixtures/examples/article-offset.html
199
+ - spec/fixtures/examples/article-utc.html
200
+ - spec/fixtures/examples/article.html
201
+ - spec/fixtures/examples/audio-array.html
202
+ - spec/fixtures/examples/audio-url.html
203
+ - spec/fixtures/examples/audio.html
204
+ - spec/fixtures/examples/book-isbn10.html
205
+ - spec/fixtures/examples/book.html
206
+ - spec/fixtures/examples/canadian.html
207
+ - spec/fixtures/examples/error.html
208
+ - spec/fixtures/examples/errors/article-date.html
209
+ - spec/fixtures/examples/errors/book-author.html
210
+ - spec/fixtures/examples/errors/book.html
211
+ - spec/fixtures/examples/errors/gender.html
212
+ - spec/fixtures/examples/errors/geo.html
213
+ - spec/fixtures/examples/errors/type.html
214
+ - spec/fixtures/examples/errors/video-duration.html
215
+ - spec/fixtures/examples/favicon.ico
216
+ - spec/fixtures/examples/filters/xss-image.html
217
+ - spec/fixtures/examples/image-array.html
218
+ - spec/fixtures/examples/image-toosmall.html
219
+ - spec/fixtures/examples/image-url.html
220
+ - spec/fixtures/examples/image.html
221
+ - spec/fixtures/examples/index.html
222
+ - spec/fixtures/examples/media/audio/1khz.mp3
223
+ - spec/fixtures/examples/media/audio/250hz.mp3
224
+ - spec/fixtures/examples/media/images/1.png
225
+ - spec/fixtures/examples/media/images/50.png
226
+ - spec/fixtures/examples/media/images/75.png
227
+ - spec/fixtures/examples/media/images/icon.png
228
+ - spec/fixtures/examples/media/images/logo.png
229
+ - spec/fixtures/examples/media/images/train.jpg
230
+ - spec/fixtures/examples/media/video/train.flv
231
+ - spec/fixtures/examples/media/video/train.mp4
232
+ - spec/fixtures/examples/media/video/train.webm
233
+ - spec/fixtures/examples/min.html
234
+ - spec/fixtures/examples/nomedia.html
235
+ - spec/fixtures/examples/plain.html
236
+ - spec/fixtures/examples/profile.html
237
+ - spec/fixtures/examples/required.html
238
+ - spec/fixtures/examples/robots.txt
239
+ - spec/fixtures/examples/sitemap.xml
240
+ - spec/fixtures/examples/video-array.html
241
+ - spec/fixtures/examples/video-movie.html
242
+ - spec/fixtures/examples/video.html
243
+ - spec/integration/invalid_examples_spec.rb
244
+ - spec/integration/valid_examples_spec.rb
245
+ - spec/open_graph_reader_spec.rb
246
+ - spec/spec_helper.rb
247
+ has_rdoc: