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.
- checksums.yaml +7 -0
- data/.gitmodules +3 -0
- data/.rspec +2 -0
- data/.yardopts +1 -0
- data/lib/open_graph_reader.rb +83 -0
- data/lib/open_graph_reader/base.rb +57 -0
- data/lib/open_graph_reader/builder.rb +100 -0
- data/lib/open_graph_reader/definitions.rb +333 -0
- data/lib/open_graph_reader/fetcher.rb +82 -0
- data/lib/open_graph_reader/object.rb +95 -0
- data/lib/open_graph_reader/object/dsl.rb +130 -0
- data/lib/open_graph_reader/object/dsl/types.rb +71 -0
- data/lib/open_graph_reader/object/registry.rb +54 -0
- data/lib/open_graph_reader/parser.rb +85 -0
- data/lib/open_graph_reader/parser/graph.rb +136 -0
- data/lib/open_graph_reader/version.rb +4 -0
- data/spec/fixtures/examples/apple-touch-icon-precomposed.png +0 -0
- data/spec/fixtures/examples/apple-touch-icon.png +0 -0
- data/spec/fixtures/examples/article-offset.html +25 -0
- data/spec/fixtures/examples/article-utc.html +25 -0
- data/spec/fixtures/examples/article.html +25 -0
- data/spec/fixtures/examples/audio-array.html +27 -0
- data/spec/fixtures/examples/audio-url.html +25 -0
- data/spec/fixtures/examples/audio.html +24 -0
- data/spec/fixtures/examples/book-isbn10.html +27 -0
- data/spec/fixtures/examples/book.html +27 -0
- data/spec/fixtures/examples/canadian.html +16 -0
- data/spec/fixtures/examples/error.html +17 -0
- data/spec/fixtures/examples/errors/article-date.html +25 -0
- data/spec/fixtures/examples/errors/book-author.html +27 -0
- data/spec/fixtures/examples/errors/book.html +27 -0
- data/spec/fixtures/examples/errors/gender.html +20 -0
- data/spec/fixtures/examples/errors/geo.html +23 -0
- data/spec/fixtures/examples/errors/type.html +16 -0
- data/spec/fixtures/examples/errors/video-duration.html +42 -0
- data/spec/fixtures/examples/favicon.ico +0 -0
- data/spec/fixtures/examples/filters/xss-image.html +15 -0
- data/spec/fixtures/examples/image-array.html +26 -0
- data/spec/fixtures/examples/image-toosmall.html +24 -0
- data/spec/fixtures/examples/image-url.html +22 -0
- data/spec/fixtures/examples/image.html +21 -0
- data/spec/fixtures/examples/index.html +67 -0
- data/spec/fixtures/examples/media/audio/1khz.mp3 +0 -0
- data/spec/fixtures/examples/media/audio/250hz.mp3 +0 -0
- data/spec/fixtures/examples/media/images/1.png +0 -0
- data/spec/fixtures/examples/media/images/50.png +0 -0
- data/spec/fixtures/examples/media/images/75.png +0 -0
- data/spec/fixtures/examples/media/images/icon.png +0 -0
- data/spec/fixtures/examples/media/images/logo.png +0 -0
- data/spec/fixtures/examples/media/images/train.jpg +0 -0
- data/spec/fixtures/examples/media/video/train.flv +0 -0
- data/spec/fixtures/examples/media/video/train.mp4 +0 -0
- data/spec/fixtures/examples/media/video/train.webm +0 -0
- data/spec/fixtures/examples/min.html +14 -0
- data/spec/fixtures/examples/nomedia.html +20 -0
- data/spec/fixtures/examples/plain.html +10 -0
- data/spec/fixtures/examples/profile.html +25 -0
- data/spec/fixtures/examples/required.html +20 -0
- data/spec/fixtures/examples/robots.txt +4 -0
- data/spec/fixtures/examples/sitemap.xml +23 -0
- data/spec/fixtures/examples/video-array.html +36 -0
- data/spec/fixtures/examples/video-movie.html +42 -0
- data/spec/fixtures/examples/video.html +26 -0
- data/spec/integration/invalid_examples_spec.rb +69 -0
- data/spec/integration/valid_examples_spec.rb +76 -0
- data/spec/open_graph_reader_spec.rb +94 -0
- data/spec/spec_helper.rb +35 -0
- metadata +247 -0
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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:
|