ruby-oembed 0.14.1 → 0.15.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 +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.rdoc +13 -1
- data/lib/oembed.rb +1 -0
- data/lib/oembed/provider.rb +54 -5
- data/lib/oembed/providers.rb +39 -300
- data/lib/oembed/providers/aggregators/embedly_urls.yml +167 -6
- data/lib/oembed/providers/builtin_providers.rb +292 -0
- data/lib/oembed/providers/facebook_post.rb +27 -17
- data/lib/oembed/providers/facebook_video.rb +22 -10
- data/lib/oembed/providers/instagram.rb +37 -20
- data/lib/oembed/providers/tik_tok.rb +11 -0
- data/lib/oembed/version.rb +2 -2
- data/spec/cassettes/OEmbed_Provider.yml +117 -16
- data/spec/cassettes/OEmbed_Providers_CodePen.yml +177 -0
- data/spec/cassettes/OEmbed_Providers_FacebookPost.yml +539 -0
- data/spec/cassettes/OEmbed_Providers_FacebookVideo.yml +267 -0
- data/spec/cassettes/OEmbed_Providers_Instagram.yml +1473 -0
- data/spec/cassettes/OEmbed_Providers_Slideshare.yml +420 -834
- data/spec/cassettes/OEmbed_Providers_TikTok.yml +293 -0
- data/spec/cassettes/OEmbed_Providers_Twitter.yml +84 -357
- data/spec/cassettes/OEmbed_Providers_Youtube.yml +188 -26
- data/spec/provider_spec.rb +315 -138
- data/spec/providers/code_pen_spec.rb +21 -0
- data/spec/providers/facebook_post_spec.rb +54 -0
- data/spec/providers/facebook_video_spec.rb +48 -0
- data/spec/providers/instagram_spec.rb +48 -0
- data/spec/providers/slideshare_spec.rb +2 -9
- data/spec/providers/tik_tok_spec.rb +26 -0
- data/spec/providers/twitter_spec.rb +3 -10
- data/spec/providers/youtube_spec.rb +3 -9
- data/spec/providers_spec.rb +151 -16
- data/spec/response_spec.rb +2 -2
- data/spec/spec_helper.rb +19 -1
- data/spec/support/shared_examples_for_providers.rb +32 -20
- metadata +25 -5
- data/spec/providers/facebook_spec.rb +0 -50
@@ -12,7 +12,7 @@ http_interactions:
|
|
12
12
|
Accept:
|
13
13
|
- "*/*"
|
14
14
|
User-Agent:
|
15
|
-
- Mozilla/5.0 (compatible; ruby-oembed/0.14.
|
15
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
16
16
|
response:
|
17
17
|
status:
|
18
18
|
code: 200
|
@@ -20,19 +20,73 @@ http_interactions:
|
|
20
20
|
headers:
|
21
21
|
Strict-Transport-Security:
|
22
22
|
- max-age=31536000
|
23
|
+
P3p:
|
24
|
+
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
25
|
+
for more info."
|
26
|
+
Content-Type:
|
27
|
+
- application/json
|
23
28
|
Cache-Control:
|
24
29
|
- no-cache
|
30
|
+
Expires:
|
31
|
+
- Tue, 27 Apr 1971 19:44:06 GMT
|
32
|
+
X-Content-Type-Options:
|
33
|
+
- nosniff
|
34
|
+
Date:
|
35
|
+
- Fri, 01 Jan 2021 20:36:36 GMT
|
36
|
+
Server:
|
37
|
+
- YouTube Frontend Proxy
|
38
|
+
X-Xss-Protection:
|
39
|
+
- '0'
|
40
|
+
Alt-Svc:
|
41
|
+
- h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443";
|
42
|
+
ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
|
43
|
+
Accept-Ranges:
|
44
|
+
- none
|
45
|
+
Vary:
|
46
|
+
- Accept-Encoding
|
47
|
+
Transfer-Encoding:
|
48
|
+
- chunked
|
49
|
+
body:
|
50
|
+
encoding: UTF-8
|
51
|
+
string: '{"title":"CKEditor 4.5 - Embedding Media Resources with oEmbed","author_name":"CKEditor
|
52
|
+
Ecosystem","author_url":"https://www.youtube.com/c/CKEditor","type":"video","height":270,"width":480,"version":"1.0","provider_name":"YouTube","provider_url":"https://www.youtube.com/","thumbnail_height":360,"thumbnail_width":480,"thumbnail_url":"https://i.ytimg.com/vi/pO5L6vXtxsI/hqdefault.jpg","html":"\u003ciframe
|
53
|
+
width=\u0022480\u0022 height=\u0022270\u0022 src=\u0022https://www.youtube.com/embed/pO5L6vXtxsI?feature=oembed\u0022
|
54
|
+
frameborder=\u00220\u0022 allow=\u0022accelerometer; autoplay; clipboard-write;
|
55
|
+
encrypted-media; gyroscope; picture-in-picture\u0022 allowfullscreen\u003e\u003c/iframe\u003e"}'
|
56
|
+
recorded_at: Fri, 01 Jan 2021 20:36:36 GMT
|
57
|
+
- request:
|
58
|
+
method: get
|
59
|
+
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=http://www.youtube.com/watch?v=pO5L6vXtxsI
|
60
|
+
body:
|
61
|
+
encoding: US-ASCII
|
62
|
+
string: ''
|
63
|
+
headers:
|
64
|
+
Accept-Encoding:
|
65
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
66
|
+
Accept:
|
67
|
+
- "*/*"
|
68
|
+
User-Agent:
|
69
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
70
|
+
response:
|
71
|
+
status:
|
72
|
+
code: 200
|
73
|
+
message: OK
|
74
|
+
headers:
|
25
75
|
Content-Type:
|
26
76
|
- application/json
|
77
|
+
Cache-Control:
|
78
|
+
- no-cache
|
79
|
+
Expires:
|
80
|
+
- Tue, 27 Apr 1971 19:44:06 GMT
|
27
81
|
P3p:
|
28
82
|
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
29
83
|
for more info."
|
30
|
-
Expires:
|
31
|
-
- Tue, 27 Apr 1971 19:44:06 GMT
|
32
84
|
X-Content-Type-Options:
|
33
85
|
- nosniff
|
86
|
+
Strict-Transport-Security:
|
87
|
+
- max-age=31536000
|
34
88
|
Date:
|
35
|
-
-
|
89
|
+
- Fri, 01 Jan 2021 20:36:36 GMT
|
36
90
|
Server:
|
37
91
|
- YouTube Frontend Proxy
|
38
92
|
X-Xss-Protection:
|
@@ -53,10 +107,10 @@ http_interactions:
|
|
53
107
|
width=\u0022480\u0022 height=\u0022270\u0022 src=\u0022https://www.youtube.com/embed/pO5L6vXtxsI?feature=oembed\u0022
|
54
108
|
frameborder=\u00220\u0022 allow=\u0022accelerometer; autoplay; clipboard-write;
|
55
109
|
encrypted-media; gyroscope; picture-in-picture\u0022 allowfullscreen\u003e\u003c/iframe\u003e"}'
|
56
|
-
recorded_at:
|
110
|
+
recorded_at: Fri, 01 Jan 2021 20:36:36 GMT
|
57
111
|
- request:
|
58
112
|
method: get
|
59
|
-
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=
|
113
|
+
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=https://youtu.be/pO5L6vXtxsI
|
60
114
|
body:
|
61
115
|
encoding: US-ASCII
|
62
116
|
string: ''
|
@@ -66,27 +120,135 @@ http_interactions:
|
|
66
120
|
Accept:
|
67
121
|
- "*/*"
|
68
122
|
User-Agent:
|
69
|
-
- Mozilla/5.0 (compatible; ruby-oembed/0.14.
|
123
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
70
124
|
response:
|
71
125
|
status:
|
72
126
|
code: 200
|
73
127
|
message: OK
|
74
128
|
headers:
|
129
|
+
Strict-Transport-Security:
|
130
|
+
- max-age=31536000
|
75
131
|
P3p:
|
76
132
|
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
77
133
|
for more info."
|
78
134
|
Cache-Control:
|
79
135
|
- no-cache
|
136
|
+
Expires:
|
137
|
+
- Tue, 27 Apr 1971 19:44:06 GMT
|
138
|
+
Content-Type:
|
139
|
+
- application/json
|
140
|
+
X-Content-Type-Options:
|
141
|
+
- nosniff
|
142
|
+
Date:
|
143
|
+
- Fri, 01 Jan 2021 20:36:36 GMT
|
144
|
+
Server:
|
145
|
+
- YouTube Frontend Proxy
|
146
|
+
X-Xss-Protection:
|
147
|
+
- '0'
|
148
|
+
Alt-Svc:
|
149
|
+
- h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443";
|
150
|
+
ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
|
151
|
+
Accept-Ranges:
|
152
|
+
- none
|
153
|
+
Vary:
|
154
|
+
- Accept-Encoding
|
155
|
+
Transfer-Encoding:
|
156
|
+
- chunked
|
157
|
+
body:
|
158
|
+
encoding: UTF-8
|
159
|
+
string: '{"title":"CKEditor 4.5 - Embedding Media Resources with oEmbed","author_name":"CKEditor
|
160
|
+
Ecosystem","author_url":"https://www.youtube.com/c/CKEditor","type":"video","height":270,"width":480,"version":"1.0","provider_name":"YouTube","provider_url":"https://www.youtube.com/","thumbnail_height":360,"thumbnail_width":480,"thumbnail_url":"https://i.ytimg.com/vi/pO5L6vXtxsI/hqdefault.jpg","html":"\u003ciframe
|
161
|
+
width=\u0022480\u0022 height=\u0022270\u0022 src=\u0022https://www.youtube.com/embed/pO5L6vXtxsI?feature=oembed\u0022
|
162
|
+
frameborder=\u00220\u0022 allow=\u0022accelerometer; autoplay; clipboard-write;
|
163
|
+
encrypted-media; gyroscope; picture-in-picture\u0022 allowfullscreen\u003e\u003c/iframe\u003e"}'
|
164
|
+
recorded_at: Fri, 01 Jan 2021 20:36:36 GMT
|
165
|
+
- request:
|
166
|
+
method: get
|
167
|
+
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=https://www.youtube.com/watch?v=pO5L6vXtxsI
|
168
|
+
body:
|
169
|
+
encoding: US-ASCII
|
170
|
+
string: ''
|
171
|
+
headers:
|
172
|
+
Accept-Encoding:
|
173
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
174
|
+
Accept:
|
175
|
+
- "*/*"
|
176
|
+
User-Agent:
|
177
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
178
|
+
response:
|
179
|
+
status:
|
180
|
+
code: 200
|
181
|
+
message: OK
|
182
|
+
headers:
|
183
|
+
P3p:
|
184
|
+
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
185
|
+
for more info."
|
186
|
+
Expires:
|
187
|
+
- Tue, 27 Apr 1971 19:44:06 GMT
|
80
188
|
Content-Type:
|
81
189
|
- application/json
|
82
190
|
Strict-Transport-Security:
|
83
191
|
- max-age=31536000
|
192
|
+
Cache-Control:
|
193
|
+
- no-cache
|
194
|
+
X-Content-Type-Options:
|
195
|
+
- nosniff
|
196
|
+
Date:
|
197
|
+
- Fri, 01 Jan 2021 20:36:36 GMT
|
198
|
+
Server:
|
199
|
+
- YouTube Frontend Proxy
|
200
|
+
X-Xss-Protection:
|
201
|
+
- '0'
|
202
|
+
Alt-Svc:
|
203
|
+
- h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443";
|
204
|
+
ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
|
205
|
+
Accept-Ranges:
|
206
|
+
- none
|
207
|
+
Vary:
|
208
|
+
- Accept-Encoding
|
209
|
+
Transfer-Encoding:
|
210
|
+
- chunked
|
211
|
+
body:
|
212
|
+
encoding: UTF-8
|
213
|
+
string: '{"title":"CKEditor 4.5 - Embedding Media Resources with oEmbed","author_name":"CKEditor
|
214
|
+
Ecosystem","author_url":"https://www.youtube.com/c/CKEditor","type":"video","height":270,"width":480,"version":"1.0","provider_name":"YouTube","provider_url":"https://www.youtube.com/","thumbnail_height":360,"thumbnail_width":480,"thumbnail_url":"https://i.ytimg.com/vi/pO5L6vXtxsI/hqdefault.jpg","html":"\u003ciframe
|
215
|
+
width=\u0022480\u0022 height=\u0022270\u0022 src=\u0022https://www.youtube.com/embed/pO5L6vXtxsI?feature=oembed\u0022
|
216
|
+
frameborder=\u00220\u0022 allow=\u0022accelerometer; autoplay; clipboard-write;
|
217
|
+
encrypted-media; gyroscope; picture-in-picture\u0022 allowfullscreen\u003e\u003c/iframe\u003e"}'
|
218
|
+
recorded_at: Fri, 01 Jan 2021 20:36:36 GMT
|
219
|
+
- request:
|
220
|
+
method: get
|
221
|
+
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=http://www.youtube.com/watch?v=pO5L6vXtxsI
|
222
|
+
body:
|
223
|
+
encoding: US-ASCII
|
224
|
+
string: ''
|
225
|
+
headers:
|
226
|
+
Accept-Encoding:
|
227
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
228
|
+
Accept:
|
229
|
+
- "*/*"
|
230
|
+
User-Agent:
|
231
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
232
|
+
response:
|
233
|
+
status:
|
234
|
+
code: 200
|
235
|
+
message: OK
|
236
|
+
headers:
|
237
|
+
Content-Type:
|
238
|
+
- application/json
|
84
239
|
Expires:
|
85
240
|
- Tue, 27 Apr 1971 19:44:06 GMT
|
241
|
+
P3p:
|
242
|
+
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
243
|
+
for more info."
|
244
|
+
Strict-Transport-Security:
|
245
|
+
- max-age=31536000
|
86
246
|
X-Content-Type-Options:
|
87
247
|
- nosniff
|
248
|
+
Cache-Control:
|
249
|
+
- no-cache
|
88
250
|
Date:
|
89
|
-
-
|
251
|
+
- Fri, 01 Jan 2021 20:36:36 GMT
|
90
252
|
Server:
|
91
253
|
- YouTube Frontend Proxy
|
92
254
|
X-Xss-Protection:
|
@@ -107,7 +269,7 @@ http_interactions:
|
|
107
269
|
width=\u0022480\u0022 height=\u0022270\u0022 src=\u0022https://www.youtube.com/embed/pO5L6vXtxsI?feature=oembed\u0022
|
108
270
|
frameborder=\u00220\u0022 allow=\u0022accelerometer; autoplay; clipboard-write;
|
109
271
|
encrypted-media; gyroscope; picture-in-picture\u0022 allowfullscreen\u003e\u003c/iframe\u003e"}'
|
110
|
-
recorded_at:
|
272
|
+
recorded_at: Fri, 01 Jan 2021 20:36:36 GMT
|
111
273
|
- request:
|
112
274
|
method: get
|
113
275
|
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=https://youtu.be/pO5L6vXtxsI
|
@@ -120,7 +282,7 @@ http_interactions:
|
|
120
282
|
Accept:
|
121
283
|
- "*/*"
|
122
284
|
User-Agent:
|
123
|
-
- Mozilla/5.0 (compatible; ruby-oembed/0.14.
|
285
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
124
286
|
response:
|
125
287
|
status:
|
126
288
|
code: 200
|
@@ -131,16 +293,16 @@ http_interactions:
|
|
131
293
|
P3p:
|
132
294
|
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
133
295
|
for more info."
|
134
|
-
Content-Type:
|
135
|
-
- application/json
|
136
296
|
Cache-Control:
|
137
297
|
- no-cache
|
138
|
-
X-Content-Type-Options:
|
139
|
-
- nosniff
|
140
298
|
Strict-Transport-Security:
|
141
299
|
- max-age=31536000
|
300
|
+
X-Content-Type-Options:
|
301
|
+
- nosniff
|
302
|
+
Content-Type:
|
303
|
+
- application/json
|
142
304
|
Date:
|
143
|
-
-
|
305
|
+
- Fri, 01 Jan 2021 20:36:36 GMT
|
144
306
|
Server:
|
145
307
|
- YouTube Frontend Proxy
|
146
308
|
X-Xss-Protection:
|
@@ -161,7 +323,7 @@ http_interactions:
|
|
161
323
|
width=\u0022480\u0022 height=\u0022270\u0022 src=\u0022https://www.youtube.com/embed/pO5L6vXtxsI?feature=oembed\u0022
|
162
324
|
frameborder=\u00220\u0022 allow=\u0022accelerometer; autoplay; clipboard-write;
|
163
325
|
encrypted-media; gyroscope; picture-in-picture\u0022 allowfullscreen\u003e\u003c/iframe\u003e"}'
|
164
|
-
recorded_at:
|
326
|
+
recorded_at: Fri, 01 Jan 2021 20:36:36 GMT
|
165
327
|
- request:
|
166
328
|
method: get
|
167
329
|
uri: https://www.youtube.com/oembed/?format=json&scheme=https&url=https://youtu.be/NHriYTkvd0g
|
@@ -174,29 +336,29 @@ http_interactions:
|
|
174
336
|
Accept:
|
175
337
|
- "*/*"
|
176
338
|
User-Agent:
|
177
|
-
- Mozilla/5.0 (compatible; ruby-oembed/0.14.
|
339
|
+
- Mozilla/5.0 (compatible; ruby-oembed/0.14.1)
|
178
340
|
response:
|
179
341
|
status:
|
180
342
|
code: 403
|
181
343
|
message: Forbidden
|
182
344
|
headers:
|
345
|
+
P3p:
|
346
|
+
- CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en
|
347
|
+
for more info."
|
348
|
+
X-Content-Type-Options:
|
349
|
+
- nosniff
|
183
350
|
Strict-Transport-Security:
|
184
351
|
- max-age=31536000
|
185
352
|
Content-Length:
|
186
353
|
- '9'
|
187
|
-
X-Content-Type-Options:
|
188
|
-
- nosniff
|
189
|
-
Content-Type:
|
190
|
-
- text/html; charset=utf-8
|
191
354
|
Cache-Control:
|
192
355
|
- no-cache
|
193
|
-
|
194
|
-
-
|
195
|
-
for more info."
|
356
|
+
Content-Type:
|
357
|
+
- text/html; charset=utf-8
|
196
358
|
Expires:
|
197
359
|
- Tue, 27 Apr 1971 19:44:06 GMT
|
198
360
|
Date:
|
199
|
-
-
|
361
|
+
- Fri, 01 Jan 2021 20:36:37 GMT
|
200
362
|
Server:
|
201
363
|
- YouTube Frontend Proxy
|
202
364
|
X-Xss-Protection:
|
@@ -207,5 +369,5 @@ http_interactions:
|
|
207
369
|
body:
|
208
370
|
encoding: UTF-8
|
209
371
|
string: Forbidden
|
210
|
-
recorded_at:
|
372
|
+
recorded_at: Fri, 01 Jan 2021 20:36:37 GMT
|
211
373
|
recorded_with: VCR 6.0.0
|
data/spec/provider_spec.rb
CHANGED
@@ -13,8 +13,8 @@ describe OEmbed::Provider do
|
|
13
13
|
before(:all) do
|
14
14
|
@default = OEmbed::Formatter.default
|
15
15
|
@flickr = OEmbed::Provider.new("http://www.flickr.com/services/oembed/")
|
16
|
-
@qik = OEmbed::Provider.new("http://qik.com/api/oembed.{format}", :xml)
|
17
|
-
@viddler = OEmbed::Provider.new("http://lab.viddler.com/services/oembed/", :json)
|
16
|
+
@qik = OEmbed::Provider.new("http://qik.com/api/oembed.{format}", format: :xml)
|
17
|
+
@viddler = OEmbed::Provider.new("http://lab.viddler.com/services/oembed/", format: :json)
|
18
18
|
|
19
19
|
@flickr << "http://*.flickr.com/*"
|
20
20
|
@qik << "http://qik.com/video/*"
|
@@ -22,187 +22,297 @@ describe OEmbed::Provider do
|
|
22
22
|
@viddler << "http://*.viddler.com/*"
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
describe "initialize" do
|
26
|
+
it "should by default use OEmbed::Formatter.default" do
|
27
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed/")
|
28
|
+
expect(provider.format).to eq(OEmbed::Formatter.default)
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
[:xml, :json].each do |given_format|
|
32
|
+
it "should allow #{given_format} format via positional argument" do
|
33
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed/", given_format)
|
34
|
+
expect( provider.format ).to eq(given_format)
|
35
|
+
end
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
+
it "should allow #{given_format} format via named argument" do
|
38
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed/", format: given_format)
|
39
|
+
expect( provider.format ).to eq(given_format)
|
40
|
+
end
|
41
|
+
end
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
"foo.com/oembed/"
|
43
|
-
|
44
|
-
nil, 1,
|
45
|
-
].each do |endpoint|
|
46
|
-
expect { OEmbed::Provider.new(endpoint) }.
|
47
|
-
to raise_error(ArgumentError)
|
43
|
+
it "should require a valid endpoint for a new instance" do
|
44
|
+
expect { OEmbed::Provider.new("http://foo.com/oembed/") }.
|
45
|
+
not_to raise_error
|
46
|
+
|
47
|
+
expect { OEmbed::Provider.new("https://foo.com/oembed/") }.
|
48
|
+
not_to raise_error
|
48
49
|
end
|
49
|
-
end
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
it "should allow a {format} string in the endpoint for a new instance" do
|
52
|
+
expect { OEmbed::Provider.new("http://foo.com/oembed.{format}/get") }.
|
53
|
+
not_to raise_error
|
54
|
+
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
it "should raise an ArgumentError given an invalid endpoint for a new instance" do
|
57
|
+
[
|
58
|
+
"httpx://foo.com/oembed/",
|
59
|
+
"ftp://foo.com/oembed/",
|
60
|
+
"foo.com/oembed/",
|
61
|
+
"http://not a uri",
|
62
|
+
nil, 1,
|
63
|
+
].each do |endpoint|
|
64
|
+
expect { OEmbed::Provider.new(endpoint) }.
|
65
|
+
to raise_error(ArgumentError)
|
66
|
+
end
|
67
|
+
end
|
61
68
|
|
62
|
-
|
63
|
-
|
64
|
-
|
69
|
+
it "should allow random formats on initialization" do
|
70
|
+
expect {
|
71
|
+
yaml_provider = OEmbed::Provider.new("http://foo.com/api/oembed.{format}", format: :yml)
|
72
|
+
yaml_provider << "http://foo.com/*"
|
73
|
+
}.
|
74
|
+
not_to raise_error
|
75
|
+
end
|
65
76
|
|
66
|
-
|
67
|
-
|
77
|
+
it "should not allow random formats to be parsed" do
|
78
|
+
yaml_provider = OEmbed::Provider.new("http://foo.com/api/oembed.{format}", format: :yml)
|
79
|
+
yaml_provider << "http://foo.com/*"
|
80
|
+
yaml_url = "http://foo.com/video/1"
|
68
81
|
|
69
|
-
|
70
|
-
|
71
|
-
|
82
|
+
expect(yaml_provider).to receive(:raw).
|
83
|
+
with(yaml_url, {:format=>:yml}).
|
84
|
+
and_return(valid_response(:json))
|
72
85
|
|
73
|
-
|
74
|
-
|
75
|
-
|
86
|
+
expect { yaml_provider.get(yaml_url) }.
|
87
|
+
to raise_error(OEmbed::FormatNotSupported)
|
88
|
+
end
|
76
89
|
|
77
|
-
|
78
|
-
|
79
|
-
expect(provider).to include("http://bar.foo.com/help/video/show/2")
|
90
|
+
it "should allow no URI schema to be given" do
|
91
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
80
92
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
93
|
+
expect(provider).to include("http://foo.com/1")
|
94
|
+
expect(provider).to include("http://bar.foo.com/1")
|
95
|
+
expect(provider).to include("http://bar.foo.com/show/1")
|
96
|
+
expect(provider).to include("https://bar.foo.com/1")
|
97
|
+
expect(provider).to include("http://asdf.com/1")
|
98
|
+
expect(provider).to include("asdf")
|
99
|
+
end
|
86
100
|
|
87
|
-
|
88
|
-
|
101
|
+
describe "the required_query_params option" do
|
102
|
+
let(:provider) {
|
103
|
+
OEmbed::Provider.new("http://foo.com/oembed", required_query_params: { send_with_query: 'PROVIDER_ENV_VAR' })
|
104
|
+
}
|
105
|
+
|
106
|
+
around(:example) { |example|
|
107
|
+
orig_value = ENV['PROVIDER_ENV_VAR']
|
108
|
+
ENV['PROVIDER_ENV_VAR'] = env_var_value
|
109
|
+
example.run
|
110
|
+
ENV['PROVIDER_ENV_VAR'] = orig_value
|
111
|
+
}
|
112
|
+
|
113
|
+
context "with a non-blank env var" do
|
114
|
+
let(:env_var_value) { 'non-blank-value' }
|
115
|
+
|
116
|
+
it "has a working getter" do
|
117
|
+
expect(provider.send_with_query).to eq(env_var_value)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "has a working setter" do
|
121
|
+
provider.send_with_query = env_var_value.succ
|
122
|
+
expect(provider.send_with_query).to eq(env_var_value.succ)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "still throws NoMethodError errors generally" do
|
126
|
+
expect { provider.other_query }
|
127
|
+
.to raise_error(NoMethodError)
|
128
|
+
|
129
|
+
expect { provider.other_query = 'val' }
|
130
|
+
.to raise_error(NoMethodError)
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'that requires CGI escaping' do
|
134
|
+
let(:env_var_value) { 'non-blank y *muy* especiál' }
|
135
|
+
|
136
|
+
it "has a working getter with escaping" do
|
137
|
+
expect(provider.send_with_query).to eq('non-blank+y+%2Amuy%2A+especi%C3%A1l')
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context "but no env var name for the required_query_params" do
|
142
|
+
let(:provider) {
|
143
|
+
OEmbed::Provider.new("http://foo.com/oembed", required_query_params: { send_with_query: false })
|
144
|
+
}
|
145
|
+
|
146
|
+
it "has a working getter" do
|
147
|
+
expect(provider.send_with_query).to be_nil
|
148
|
+
end
|
149
|
+
|
150
|
+
it "has a working setter" do
|
151
|
+
provider.send_with_query = 'non-blank-value'
|
152
|
+
expect(provider.send_with_query).to eq('non-blank-value')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
89
156
|
|
90
|
-
|
91
|
-
|
157
|
+
context "with a nil env var" do
|
158
|
+
let(:env_var_value) { nil }
|
92
159
|
|
93
|
-
|
94
|
-
|
160
|
+
it "has a working getter" do
|
161
|
+
expect(provider.send_with_query).to be_nil
|
162
|
+
end
|
95
163
|
|
96
|
-
|
97
|
-
|
98
|
-
|
164
|
+
it "has a working setter" do
|
165
|
+
provider.send_with_query = 'a-new-val'
|
166
|
+
expect(provider.send_with_query).to eq('a-new-val')
|
167
|
+
end
|
99
168
|
|
100
|
-
|
101
|
-
|
102
|
-
|
169
|
+
it "still throws NoMethodError errors generally" do
|
170
|
+
expect { provider.other_query }
|
171
|
+
.to raise_error(NoMethodError)
|
103
172
|
|
104
|
-
|
105
|
-
|
173
|
+
expect { provider.other_query = 'val' }
|
174
|
+
.to raise_error(NoMethodError)
|
175
|
+
end
|
176
|
+
end
|
106
177
|
|
107
|
-
|
178
|
+
context "where the required_query_param conflicts with an existing method name" do
|
179
|
+
let(:provider) {
|
180
|
+
OEmbed::Provider.new("http://foo.com/oembed", required_query_params: { get: 'PROVIDER_ENV_VAR' })
|
181
|
+
}
|
182
|
+
let(:env_var_value) { 'a-conflicted-val' }
|
183
|
+
|
184
|
+
it "does NOT override the get method" do
|
185
|
+
expect { provider.get }
|
186
|
+
.to raise_error(ArgumentError) # because get requires arguments!
|
187
|
+
end
|
188
|
+
|
189
|
+
it "still sets up the @required_query_params internals correctly" do
|
190
|
+
expect(provider.instance_variable_get('@required_query_params')).to eq({ get: env_var_value })
|
191
|
+
end
|
192
|
+
|
193
|
+
it "DOES have a working setter" do
|
194
|
+
provider.get = 'a-new-val'
|
195
|
+
expect(provider.instance_variable_get('@required_query_params')).to eq({ get: 'a-new-val' })
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
108
199
|
end
|
109
200
|
|
110
|
-
|
111
|
-
|
112
|
-
|
201
|
+
describe "<<" do
|
202
|
+
it "should add URL schemes" do
|
203
|
+
expect(@flickr.urls).to eq([%r{^http://([^\.]+\.)?flickr\.com/(.*?)}])
|
204
|
+
expect(@qik.urls).to eq([
|
205
|
+
%r{^http://qik\.com/video/(.*?)},
|
206
|
+
%r{^http://qik\.com/(.*?)}
|
207
|
+
])
|
208
|
+
end
|
113
209
|
|
114
|
-
|
115
|
-
|
116
|
-
|
210
|
+
it "should match URLs" do
|
211
|
+
expect(@flickr).to include(example_url(:flickr))
|
212
|
+
expect(@qik).to include(example_url(:qik))
|
213
|
+
end
|
117
214
|
|
118
|
-
|
119
|
-
|
120
|
-
|
215
|
+
it "should allow a String as a URI schema" do
|
216
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
217
|
+
provider << "http://bar.foo.com/*"
|
121
218
|
|
122
|
-
|
123
|
-
|
219
|
+
expect(provider).to include("http://bar.foo.com/1")
|
220
|
+
expect(provider).to include("http://bar.foo.com/show/1")
|
124
221
|
|
125
|
-
|
126
|
-
|
222
|
+
expect(provider).to_not include("https://bar.foo.com/1")
|
223
|
+
expect(provider).to_not include("http://foo.com/1")
|
224
|
+
end
|
127
225
|
|
128
|
-
|
129
|
-
|
226
|
+
it "should allow multiple path wildcards in a String URI schema" do
|
227
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
228
|
+
provider << "http://bar.foo.com/*/show/*"
|
130
229
|
|
131
|
-
|
132
|
-
|
133
|
-
|
230
|
+
expect(provider).to include("http://bar.foo.com/photo/show/1")
|
231
|
+
expect(provider).to include("http://bar.foo.com/video/show/2")
|
232
|
+
expect(provider).to include("http://bar.foo.com/help/video/show/2")
|
134
233
|
|
135
|
-
|
234
|
+
expect(provider).to_not include("https://bar.foo.com/photo/show/1")
|
235
|
+
expect(provider).to_not include("http://foo.com/video/show/2")
|
236
|
+
expect(provider).to_not include("http://bar.foo.com/show/1")
|
237
|
+
expect(provider).to_not include("http://bar.foo.com/1")
|
238
|
+
end
|
136
239
|
|
137
|
-
|
138
|
-
|
139
|
-
provider << "gopher://foo.com/*"
|
140
|
-
expect(provider).to include(gopher_url)
|
141
|
-
end
|
240
|
+
it "should NOT allow multiple domain wildcards in a String URI schema", :pending => true do
|
241
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
142
242
|
|
143
|
-
|
144
|
-
|
145
|
-
provider << %r{^https?://([^\.]*\.)?foo.com/(show/)?\d+}
|
243
|
+
expect { provider << "http://*.com/*" }.
|
244
|
+
to raise_error(ArgumentError)
|
146
245
|
|
147
|
-
|
148
|
-
|
149
|
-
expect(provider).to include("http://foo.com/1")
|
150
|
-
expect(provider).to include("https://bar.foo.com/1")
|
246
|
+
expect(provider).to_not include("http://foo.com/1")
|
247
|
+
end
|
151
248
|
|
152
|
-
|
153
|
-
|
154
|
-
|
249
|
+
it "should allow a sub-domain wildcard in String URI schema" do
|
250
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
251
|
+
provider << "http://*.foo.com/*"
|
155
252
|
|
156
|
-
|
157
|
-
|
158
|
-
|
253
|
+
expect(provider).to include("http://bar.foo.com/1")
|
254
|
+
expect(provider).to include("http://foo.foo.com/2")
|
255
|
+
expect(provider).to include("http://foo.com/3")
|
159
256
|
|
160
|
-
|
161
|
-
|
162
|
-
end
|
257
|
+
expect(provider).to_not include("https://bar.foo.com/1")
|
258
|
+
expect(provider).to_not include("http://my.bar.foo.com/1")
|
163
259
|
|
164
|
-
|
165
|
-
|
166
|
-
end
|
260
|
+
provider << "http://my.*.foo.com/*"
|
261
|
+
end
|
167
262
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
yaml_provider << "http://foo.com/*"
|
172
|
-
}.
|
173
|
-
not_to raise_error
|
174
|
-
end
|
263
|
+
it "should allow multiple sub-domain wildcards in a String URI schema" do
|
264
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
265
|
+
provider << "http://*.my.*.foo.com/*"
|
175
266
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
yaml_url = "http://foo.com/video/1"
|
267
|
+
expect(provider).to include("http://my.bar.foo.com/1")
|
268
|
+
expect(provider).to include("http://my.foo.com/2")
|
269
|
+
expect(provider).to include("http://bar.my.bar.foo.com/3")
|
180
270
|
|
181
|
-
|
182
|
-
|
183
|
-
|
271
|
+
expect(provider).to_not include("http://bar.foo.com/1")
|
272
|
+
expect(provider).to_not include("http://foo.bar.foo.com/1")
|
273
|
+
end
|
184
274
|
|
185
|
-
|
186
|
-
|
187
|
-
end
|
275
|
+
it "should NOT allow a scheme wildcard in a String URI schema", :pending => true do
|
276
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
188
277
|
|
189
|
-
|
190
|
-
|
191
|
-
expect(@qik.urls).to eq([%r{^http://qik\.com/video/(.*?)},
|
192
|
-
%r{^http://qik\.com/(.*?)}])
|
193
|
-
end
|
278
|
+
expect { provider << "*://foo.com/*" }.
|
279
|
+
to raise_error(ArgumentError)
|
194
280
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
281
|
+
expect(provider).to_not include("http://foo.com/1")
|
282
|
+
end
|
283
|
+
|
284
|
+
it "should allow a scheme other than http in a String URI schema" do
|
285
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
286
|
+
provider << "https://foo.com/*"
|
199
287
|
|
200
|
-
|
201
|
-
|
202
|
-
|
288
|
+
expect(provider).to include("https://foo.com/1")
|
289
|
+
|
290
|
+
gopher_url = "gopher://foo.com/1"
|
291
|
+
expect(provider).to_not include(gopher_url)
|
292
|
+
provider << "gopher://foo.com/*"
|
293
|
+
expect(provider).to include(gopher_url)
|
294
|
+
end
|
295
|
+
|
296
|
+
it "should allow a Regexp as a URI schema" do
|
297
|
+
provider = OEmbed::Provider.new("http://foo.com/oembed")
|
298
|
+
provider << %r{^https?://([^\.]*\.)?foo.com/(show/)?\d+}
|
299
|
+
|
300
|
+
expect(provider).to include("http://bar.foo.com/1")
|
301
|
+
expect(provider).to include("http://bar.foo.com/show/1")
|
302
|
+
expect(provider).to include("http://foo.com/1")
|
303
|
+
expect(provider).to include("https://bar.foo.com/1")
|
304
|
+
|
305
|
+
expect(provider).to_not include("http://bar.foo.com/video/1")
|
306
|
+
expect(provider).to_not include("gopher://foo.com/1")
|
307
|
+
end
|
203
308
|
end
|
204
309
|
|
205
310
|
describe "#build" do
|
311
|
+
it "should raise error if the URL is invalid" do
|
312
|
+
expect{ @flickr.send(:build, example_url(:fake)) }.to raise_error(OEmbed::NotFound)
|
313
|
+
expect{ @qik.send(:build, example_url(:fake)) }.to raise_error(OEmbed::NotFound)
|
314
|
+
end
|
315
|
+
|
206
316
|
it "should return a proper URL" do
|
207
317
|
uri = @flickr.send(:build, example_url(:flickr))
|
208
318
|
expect(uri.host).to eq("www.flickr.com")
|
@@ -357,10 +467,77 @@ describe OEmbed::Provider do
|
|
357
467
|
@viddler.get(example_url(:viddler))
|
358
468
|
end
|
359
469
|
|
470
|
+
context "with require_query_params" do
|
471
|
+
let(:provider) { OEmbed::Provider.new("http://foo.com/oembed", required_query_params: { send_with_query: 'PROVIDER_ENV_VAR' }) }
|
472
|
+
|
473
|
+
it "should add the required_query_params to the URI" do
|
474
|
+
provider.send_with_query = 'non-blank-value'
|
475
|
+
|
476
|
+
expect(provider).to receive(:http_get).
|
477
|
+
with(have_attributes(query: match(/send_with_query=non-blank-value/)), :format => @default).
|
478
|
+
and_return(valid_response(:json))
|
479
|
+
provider.get(example_url(:fake))
|
480
|
+
end
|
481
|
+
|
482
|
+
it "should claim to not match if the required_query_params are missing" do
|
483
|
+
allow(provider).to receive(:http_get).and_return(valid_response(:json))
|
484
|
+
|
485
|
+
expect { provider.get(example_url(:fake)) }.
|
486
|
+
to raise_error(OEmbed::NotFound)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
360
490
|
it "handles the :timeout option", pending: true do
|
361
491
|
expect_any_instance_of(Net::HTTP).to receive(:open_timeout=).with(5)
|
362
492
|
expect_any_instance_of(Net::HTTP).to receive(:read_timeout=).with(5)
|
363
493
|
@flickr.get(example_url(:flickr), :timeout => 5)
|
364
494
|
end
|
365
495
|
end
|
496
|
+
|
497
|
+
describe "#set_required_query_params" do
|
498
|
+
let(:provider) { OEmbed::Provider.new("http://foo.com/oembed", required_query_params: { send_with_query: 'PROVIDER_ENV_VAR' }) }
|
499
|
+
|
500
|
+
around(:example) { |example|
|
501
|
+
orig_value = ENV['PROVIDER_ENV_VAR']
|
502
|
+
ENV['PROVIDER_ENV_VAR'] = 'a non-nil value'
|
503
|
+
example.run
|
504
|
+
ENV['PROVIDER_ENV_VAR'] = orig_value
|
505
|
+
}
|
506
|
+
|
507
|
+
it 'META: the around works as expected' do
|
508
|
+
expect(provider.send_with_query).to eq('a+non-nil+value')
|
509
|
+
expect(provider.required_query_params_set?).to be_truthy
|
510
|
+
end
|
511
|
+
|
512
|
+
[
|
513
|
+
[true, 'true'],
|
514
|
+
[false, 'false'],
|
515
|
+
['one two', 'one+two'],
|
516
|
+
['a@&?%25', 'a%40%26%3F%2525'],
|
517
|
+
].each do |given_value, expected_value|
|
518
|
+
context "given #{given_value.inspect}" do
|
519
|
+
before(:each) { provider.send_with_query = given_value }
|
520
|
+
|
521
|
+
it "stringifies and escapes the value" do
|
522
|
+
expect(provider.send_with_query).to eq(expected_value)
|
523
|
+
end
|
524
|
+
|
525
|
+
it "satisfies required_query_params_set?" do
|
526
|
+
expect(provider.required_query_params_set?).to be_truthy
|
527
|
+
end
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
531
|
+
context "given nil" do
|
532
|
+
before(:each) { provider.send_with_query = nil }
|
533
|
+
|
534
|
+
it "nils the existing value" do
|
535
|
+
expect(provider.send_with_query).to be_nil
|
536
|
+
end
|
537
|
+
|
538
|
+
it "sets required_query_params_set? to falsey" do
|
539
|
+
expect(provider.required_query_params_set?).to be_falsey
|
540
|
+
end
|
541
|
+
end
|
542
|
+
end
|
366
543
|
end
|