embiggen 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6af561209a387ec502e579b6917f6bf3984fd7c3
4
+ data.tar.gz: 8a53fba0f9b2879df685ddfc8e82647b6c51411b
5
+ SHA512:
6
+ metadata.gz: ae5a3f54a1c89cf969d8a0d292c23163becc1a31ab8c45bb218b7b93f998a9b838d0e457dd37bd03d05cd4954becbd7580d37ea95894e157d472c117e1ca9462
7
+ data.tar.gz: c858db7c641918040855a9ede16b3c3ccee88840f860667860172d50629e81324d0c2356be4f787ace159e129987cf6d8b7c12ccfd5c6c382b6794924ecc3d86
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Altmetric LLP
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,57 @@
1
+ # Embiggen [![Build Status](https://travis-ci.org/altmetric/embiggen.svg?branch=master)](https://travis-ci.org/altmetric/embiggen)
2
+
3
+ A Ruby library to expand shortened URLs.
4
+
5
+ ## Usage
6
+ ```ruby
7
+ require 'embiggen'
8
+
9
+ # Basic usage
10
+ Embiggen::URI('https://youtu.be/dQw4w9WgXcQ').expand
11
+ #=> #<URI:HTTPS https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be>
12
+
13
+ # Longer-form usage
14
+ uri = Embiggen::URI.new(URI('https://youtu.be/dQw4w9WgXcQ'))
15
+ uri.shortened?
16
+ #=> true
17
+ uri.expand
18
+ #=> #<URI:HTTPS https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be>
19
+
20
+ # Gracefully deals with unshortened URIs
21
+ uri = Embiggen::URI('http://www.altmetric.com')
22
+ uri.shortened?
23
+ #=> false
24
+ uri.expand
25
+ #=> #<URI:HTTP http://www.altmetric.com>
26
+
27
+ # Noisier expand! for explicit error handling
28
+ Embiggen::URI('http://bit.ly/bad').expand!
29
+ #=> TooManyRedirects: http://bit.ly/bad redirected too many times
30
+ # or...
31
+ #=> BadShortenedURI: following http://bit.ly/bad did not redirect
32
+
33
+ # Optionally specify a timeout in seconds for expansion (default is 1)
34
+ Embiggen::URI('https://youtu.be/dQw4w9WgXcQ').expand(:timeout => 5)
35
+
36
+ # Optionally specify a number of redirects to follow (default is 5)
37
+ Embiggen::URI('https://youtu.be/dQw4w9WgXcQ').expand(:redirects => 2)
38
+
39
+ # Override the default configuration for all expansions and add your own
40
+ # shorteners
41
+ Embiggen.configure do |config|
42
+ config.timeout = 5
43
+ config.redirects = 2
44
+ config.shorteners += %w(myshorten.er anoth.er)
45
+ end
46
+ ```
47
+
48
+ ## Acknowledgements
49
+
50
+ * The list of shorteners comes from [LongURL.org's curated
51
+ list](http://longurl.org/services).
52
+
53
+ ## License
54
+
55
+ Copyright © 2015 Altmetric LLP
56
+
57
+ Distributed under the MIT License.
@@ -0,0 +1,14 @@
1
+ require 'embiggen/configuration'
2
+ require 'embiggen/uri'
3
+
4
+ module Embiggen
5
+ def URI(uri)
6
+ uri.is_a?(URI) ? uri : URI.new(uri)
7
+ end
8
+
9
+ def configure
10
+ yield(Configuration)
11
+ end
12
+
13
+ module_function :URI, :configure
14
+ end
@@ -0,0 +1,68 @@
1
+ # encoding: utf-8
2
+ require 'set'
3
+
4
+ module Embiggen
5
+ class Configuration
6
+ class << self
7
+ attr_writer :timeout, :redirects, :shorteners
8
+ end
9
+
10
+ def self.timeout
11
+ @timeout ||= 1
12
+ end
13
+
14
+ def self.redirects
15
+ @redirects ||= 5
16
+ end
17
+
18
+ # From http://longurl.org/services
19
+ def self.shorteners
20
+ @shorteners ||= Set.new(%w(
21
+ 0rz.tw 1link.in 1url.com 2.gp 2big.at 2tu.us 3.ly 307.to 4ms.me
22
+ 4sq.com 4url.cc 6url.com 7.ly a.gg a.nf aa.cx abcurl.net ad.vu adf.ly
23
+ adjix.com afx.cc all.fuseurl.com alturl.com amzn.to ar.gy arst.ch
24
+ atu.ca azc.cc b23.ru b2l.me bacn.me bcool.bz binged.it bit.ly bizj.us
25
+ bloat.me bravo.ly bsa.ly budurl.com canurl.com chilp.it chzb.gr cl.lk
26
+ cl.ly clck.ru cli.gs cliccami.info clickthru.ca clop.in conta.cc
27
+ cort.as cot.ag crks.me ctvr.us cutt.us dai.ly decenturl.com dfl8.me
28
+ digbig.com digg.com disq.us dld.bz dlvr.it do.my doiop.com dopen.us
29
+ easyuri.com easyurl.net eepurl.com eweri.com fa.by fav.me fb.me
30
+ fbshare.me ff.im fff.to fire.to firsturl.de firsturl.net flic.kr
31
+ flq.us fly2.ws fon.gs freak.to fuseurl.com fuzzy.to fwd4.me fwib.net
32
+ g.ro.lt gizmo.do gl.am go.9nl.com go.ign.com go.usa.gov goo.gl
33
+ goshrink.com gurl.es hex.io hiderefer.com hmm.ph href.in hsblinks.com
34
+ htxt.it huff.to hulu.com hurl.me hurl.ws icanhaz.com idek.net ilix.in
35
+ is.gd its.my ix.lt j.mp jijr.com kl.am klck.me korta.nu krunchd.com
36
+ l9k.net lat.ms liip.to liltext.com linkbee.com linkbun.ch liurl.cn
37
+ ln-s.net ln-s.ru lnk.gd lnk.ms lnkd.in lnkurl.com lru.jp lt.tl lurl.no
38
+ macte.ch mash.to merky.de migre.me miniurl.com minurl.fr mke.me
39
+ moby.to moourl.com mrte.ch myloc.me myurl.in n.pr nbc.co nblo.gs nn.nf
40
+ not.my notlong.com nsfw.in nutshellurl.com nxy.in nyti.ms o-x.fr
41
+ oc1.us om.ly omf.gd omoikane.net on.cnn.com on.mktw.net onforb.es
42
+ orz.se ow.ly ping.fm pli.gs pnt.me politi.co post.ly pp.gg profile.to
43
+ ptiturl.com pub.vitrue.com qlnk.net qte.me qu.tc qy.fi r.im rb6.me
44
+ read.bi readthis.ca reallytinyurl.com redir.ec stub_redirects.ca
45
+ redirx.com retwt.me ri.ms rickroll.it riz.gd rt.nu ru.ly rubyurl.com
46
+ rurl.org rww.tw s4c.in s7y.us safe.mn sameurl.com sdut.us shar.es
47
+ shink.de shorl.com short.ie short.to shortlinks.co.uk shorturl.com
48
+ shout.to show.my shrinkify.com shrinkr.com shrt.fr shrt.st shrten.com
49
+ shrunkin.com simurl.com slate.me smallr.com smsh.me smurl.name sn.im
50
+ snipr.com snipurl.com snurl.com sp2.ro spedr.com srnk.net srs.li
51
+ starturl.com su.pr surl.co.uk surl.hu t.cn t.co t.lh.com ta.gd tbd.ly
52
+ tcrn.ch tgr.me tgr.ph tighturl.com tiniuri.com tiny.cc tiny.ly tiny.pl
53
+ tinylink.in tinyuri.ca tinyurl.com tk tl.gd tmi.me tnij.org tnw.to
54
+ tny.com to to.ly togoto.us totc.us toysr.us tpm.ly tr.im tra.kz
55
+ trunc.it twhub.com twirl.at twitclicks.com twitterurl.net
56
+ twitterurl.org twiturl.de twurl.cc twurl.nl u.mavrev.com u.nu u76.org
57
+ ub0.cc ulu.lu updating.me ur1.ca url.az url.co.uk url.ie url360.me
58
+ url4.eu urlborg.com urlbrief.com urlcover.com urlcut.com urlenco.de
59
+ urli.nl urls.im urlshorteningservicefortwitter.com urlx.ie urlzen.com
60
+ usat.ly use.my vb.ly vgn.am vl.am vm.lc w55.de wapo.st wapurl.co.uk
61
+ wipi.es wp.me x.vu xr.com xrl.in xrl.us xurl.es xurl.jp y.ahoo.it
62
+ yatuc.com ye.pe yep.it yfrog.com yhoo.it yiyd.com youtu.be yuarel.com
63
+ z0p.de zi.ma zi.mu zipmyurl.com zud.me zurl.ws zz.gd zzang.kr ›.ws
64
+ ✩.ws ✿.ws ❥.ws ➔.ws ➞.ws ➡.ws ➨.ws ➯.ws ➹.ws ➽.ws
65
+ ))
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,81 @@
1
+ require 'embiggen/configuration'
2
+ require 'net/http'
3
+
4
+ module Embiggen
5
+ class URI
6
+ attr_reader :uri
7
+
8
+ def initialize(uri)
9
+ @uri = uri.is_a?(::URI::Generic) ? uri : URI(uri.to_s)
10
+ end
11
+
12
+ def expand(request_options = {})
13
+ expand!(request_options)
14
+ rescue TooManyRedirects => error
15
+ error.uri
16
+ rescue Error, ::Timeout::Error, ::Errno::ECONNRESET
17
+ uri
18
+ end
19
+
20
+ def expand!(request_options = {})
21
+ return uri unless shortened?
22
+
23
+ redirects = request_options.fetch(:redirects) { Configuration.redirects }
24
+ check_redirects(redirects)
25
+
26
+ location = head_location(request_options)
27
+ check_location(location)
28
+
29
+ URI.new(location).
30
+ expand!(request_options.merge(:redirects => redirects - 1))
31
+ end
32
+
33
+ def shortened?
34
+ Configuration.shorteners.any? { |domain| uri.host =~ /\b#{domain}\z/i }
35
+ end
36
+
37
+ private
38
+
39
+ def check_redirects(redirects)
40
+ return unless redirects.zero?
41
+
42
+ fail TooManyRedirects.new("#{uri} redirected too many times", uri)
43
+ end
44
+
45
+ def check_location(location)
46
+ return if location
47
+
48
+ fail BadShortenedURI, "following #{uri} did not redirect"
49
+ end
50
+
51
+ def head_location(request_options = {})
52
+ timeout = request_options.fetch(:timeout) { Configuration.timeout }
53
+
54
+ http.open_timeout = timeout
55
+ http.read_timeout = timeout
56
+
57
+ response = http.head(uri.request_uri)
58
+
59
+ response.fetch('Location') if response.is_a?(::Net::HTTPRedirection)
60
+ end
61
+
62
+ def http
63
+ http = ::Net::HTTP.new(uri.host, uri.port)
64
+ http.use_ssl = true if uri.scheme == 'https'
65
+
66
+ http
67
+ end
68
+ end
69
+
70
+ class Error < ::StandardError; end
71
+ class BadShortenedURI < Error; end
72
+
73
+ class TooManyRedirects < Error
74
+ attr_reader :uri
75
+
76
+ def initialize(message, uri)
77
+ super(message)
78
+ @uri = uri
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,52 @@
1
+ require 'embiggen'
2
+
3
+ module Embiggen
4
+ RSpec.describe Configuration do
5
+ describe '#timeout' do
6
+ it 'defaults to 1 second' do
7
+ expect(described_class.timeout).to eq(1)
8
+ end
9
+
10
+ it 'can be overridden' do
11
+ described_class.timeout = 10
12
+
13
+ expect(described_class.timeout).to eq(10)
14
+ end
15
+
16
+ after do
17
+ described_class.timeout = 1
18
+ end
19
+ end
20
+
21
+ describe '#redirects' do
22
+ it 'defaults to 5' do
23
+ expect(described_class.redirects).to eq(5)
24
+ end
25
+
26
+ it 'can be overridden' do
27
+ described_class.redirects = 2
28
+
29
+ expect(described_class.redirects).to eq(2)
30
+ end
31
+
32
+ after do
33
+ described_class.redirects = 5
34
+ end
35
+ end
36
+
37
+ describe '#shorteners' do
38
+ it 'defaults to a list of shorteners' do
39
+ expect(described_class.shorteners).to_not be_empty
40
+ end
41
+
42
+ it 'can be overridden' do
43
+ expect { described_class.shorteners << 'foo.bar' }.
44
+ to change { described_class.shorteners.size }.by(1)
45
+ end
46
+
47
+ after do
48
+ described_class.shorteners.delete('foo.bar')
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,221 @@
1
+ require 'embiggen'
2
+
3
+ module Embiggen
4
+ RSpec.describe URI do
5
+ describe '#expand' do
6
+ it 'expands HTTP URIs' do
7
+ stub_redirect('http://bit.ly/1ciyUPh',
8
+ 'http://us.macmillan.com/books/9781466879980')
9
+
10
+ uri = described_class.new(URI('http://bit.ly/1ciyUPh'))
11
+
12
+ expect(uri.expand).to eq(URI('http://us.macmillan.com/books/9781466879980'))
13
+ end
14
+
15
+ it 'expands HTTPS URIs' do
16
+ stub_redirect('https://youtu.be/dQw4w9WgXcQ',
17
+ 'https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be')
18
+
19
+ uri = described_class.new(URI('https://youtu.be/dQw4w9WgXcQ'))
20
+
21
+ expect(uri.expand).to eq(URI('https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be'))
22
+ end
23
+
24
+ it 'expands URIs passed as strings' do
25
+ stub_redirect('http://bit.ly/1ciyUPh',
26
+ 'http://us.macmillan.com/books/9781466879980')
27
+
28
+ uri = described_class.new('http://bit.ly/1ciyUPh')
29
+
30
+ expect(uri.expand).to eq(URI('http://us.macmillan.com/books/9781466879980'))
31
+ end
32
+
33
+ it 'does not expand unshortened URIs' do
34
+ uri = described_class.new(URI('http://www.altmetric.com'))
35
+
36
+ expect(uri.expand).to eq(URI('http://www.altmetric.com'))
37
+ end
38
+
39
+ it 'does not make requests for unshortened URIs' do
40
+ uri = described_class.new(URI('http://www.altmetric.com'))
41
+
42
+ expect { uri.expand }.to_not raise_error
43
+ end
44
+
45
+ it 'does not expand erroring URIs' do
46
+ stub_request(:head, 'http://bit.ly/bad').to_return(:status => 500)
47
+ uri = described_class.new(URI('http://bit.ly/bad'))
48
+
49
+ expect(uri.expand).to eq(URI('http://bit.ly/bad'))
50
+ end
51
+
52
+ it 'does not expand URIs that time out' do
53
+ stub_request(:head, 'http://bit.ly/bad').to_timeout
54
+ uri = described_class.new(URI('http://bit.ly/bad'))
55
+
56
+ expect(uri.expand).to eq(URI('http://bit.ly/bad'))
57
+ end
58
+
59
+ it 'does not expand URIs whose connection resets' do
60
+ stub_request(:head, 'http://bit.ly/bad').to_raise(Errno::ECONNRESET)
61
+ uri = described_class.new(URI('http://bit.ly/bad'))
62
+
63
+ expect(uri.expand).to eq(URI('http://bit.ly/bad'))
64
+ end
65
+
66
+ it 'takes an optional timeout' do
67
+ stub_request(:head, 'http://bit.ly/bad').to_timeout
68
+ uri = described_class.new(URI('http://bit.ly/bad'))
69
+
70
+ expect(uri.expand(:timeout => 5)).to eq(URI('http://bit.ly/bad'))
71
+ end
72
+
73
+ it 'expands redirects to other shorteners' do
74
+ stub_redirect('http://bit.ly/98K8eH',
75
+ 'https://youtu.be/dQw4w9WgXcQ')
76
+ stub_redirect('https://youtu.be/dQw4w9WgXcQ',
77
+ 'https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be')
78
+ uri = described_class.new(URI('http://bit.ly/98K8eH'))
79
+
80
+ expect(uri.expand).to eq(URI('https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be'))
81
+ end
82
+
83
+ it 'stops expanding redirects after a default threshold of 5' do
84
+ stub_redirect('http://bit.ly/1', 'http://bit.ly/2')
85
+ stub_redirect('http://bit.ly/2', 'http://bit.ly/3')
86
+ stub_redirect('http://bit.ly/3', 'http://bit.ly/4')
87
+ stub_redirect('http://bit.ly/4', 'http://bit.ly/5')
88
+ stub_redirect('http://bit.ly/5', 'http://bit.ly/6')
89
+ stub_redirect('http://bit.ly/6', 'http://bit.ly/7')
90
+ uri = described_class.new(URI('http://bit.ly/1'))
91
+
92
+ expect(uri.expand).to eq(URI('http://bit.ly/6'))
93
+ end
94
+
95
+ it 'takes an optional redirect threshold' do
96
+ stub_redirect('http://bit.ly/1', 'http://bit.ly/2')
97
+ stub_redirect('http://bit.ly/2', 'http://bit.ly/3')
98
+ stub_redirect('http://bit.ly/3', 'http://bit.ly/4')
99
+ uri = described_class.new(URI('http://bit.ly/1'))
100
+
101
+ expect(uri.expand(:redirects => 2)).to eq(URI('http://bit.ly/3'))
102
+ end
103
+
104
+ it 'uses the threshold from the configuration' do
105
+ stub_redirect('http://bit.ly/1', 'http://bit.ly/2')
106
+ stub_redirect('http://bit.ly/2', 'http://bit.ly/3')
107
+ stub_redirect('http://bit.ly/3', 'http://bit.ly/4')
108
+ uri = described_class.new(URI('http://bit.ly/1'))
109
+ Configuration.redirects = 2
110
+
111
+ expect(uri.expand).to eq(URI('http://bit.ly/3'))
112
+ end
113
+
114
+ it 'uses shorteners from the configuration' do
115
+ stub_redirect('http://altmetric.it', 'http://www.altmetric.com')
116
+ Configuration.shorteners << 'altmetric.it'
117
+ uri = described_class.new(URI('http://altmetric.it'))
118
+
119
+ expect(uri.expand).to eq(URI('http://www.altmetric.com'))
120
+ end
121
+
122
+ after do
123
+ Configuration.redirects = 5
124
+ Configuration.shorteners.delete('altmetric.it')
125
+ end
126
+ end
127
+
128
+ describe '#expand!' do
129
+ it 'expands shortened URLs' do
130
+ stub_redirect('https://youtu.be/dQw4w9WgXcQ',
131
+ 'https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be')
132
+ uri = described_class.new(URI('https://youtu.be/dQw4w9WgXcQ'))
133
+
134
+ expect(uri.expand!).to eq(URI('https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be'))
135
+ end
136
+
137
+ it 'does not expand unshortened URIs' do
138
+ uri = described_class.new(URI('http://www.altmetric.com'))
139
+
140
+ expect(uri.expand!).to eq(URI('http://www.altmetric.com'))
141
+ end
142
+
143
+ it 'raises an error if the URI redirects too many times' do
144
+ stub_redirect('http://bit.ly/1', 'http://bit.ly/2')
145
+ stub_redirect('http://bit.ly/2', 'http://bit.ly/3')
146
+ stub_redirect('http://bit.ly/3', 'http://bit.ly/4')
147
+ uri = described_class.new(URI('http://bit.ly/1'))
148
+
149
+ expect { uri.expand!(:redirects => 2) }.
150
+ to raise_error(TooManyRedirects)
151
+ end
152
+
153
+ it 'raises an error if a shortened URI does not redirect' do
154
+ stub_request(:head, 'http://bit.ly/bad').to_return(:status => 500)
155
+ uri = described_class.new(URI('http://bit.ly/bad'))
156
+
157
+ expect { uri.expand! }.to raise_error(BadShortenedURI)
158
+ end
159
+
160
+ it 'raises an error if the URI times out' do
161
+ stub_request(:head, 'http://bit.ly/bad').to_timeout
162
+ uri = described_class.new(URI('http://bit.ly/bad'))
163
+
164
+ expect { uri.expand! }.to raise_error(::Timeout::Error)
165
+ end
166
+
167
+ it 'raises an error if the URI errors' do
168
+ stub_request(:head, 'http://bit.ly/bad').to_raise(::Errno::ECONNRESET)
169
+ uri = described_class.new(URI('http://bit.ly/bad'))
170
+
171
+ expect { uri.expand! }.to raise_error(::Errno::ECONNRESET)
172
+ end
173
+ end
174
+
175
+ describe '#uri' do
176
+ it 'returns the original URI' do
177
+ uri = described_class.new(URI('http://www.altmetric.com'))
178
+
179
+ expect(uri.uri).to eq(URI('http://www.altmetric.com'))
180
+ end
181
+
182
+ it 'returns a URI even if a string was passed' do
183
+ uri = described_class.new('http://www.altmetric.com')
184
+
185
+ expect(uri.uri).to eq(URI('http://www.altmetric.com'))
186
+ end
187
+ end
188
+
189
+ describe '#shortened?' do
190
+ it 'returns true if the link has been shortened' do
191
+ uri = described_class.new('http://bit.ly/1ciyUPh')
192
+
193
+ expect(uri).to be_shortened
194
+ end
195
+
196
+ it 'returns false if the link has not been shortened' do
197
+ uri = described_class.new('http://www.altmetric.com')
198
+
199
+ expect(uri).to_not be_shortened
200
+ end
201
+
202
+ it 'returns true if the link has been shortened with the wrong case' do
203
+ uri = described_class.new('http://BIT.LY/1ciyUPh')
204
+
205
+ expect(uri).to be_shortened
206
+ end
207
+
208
+ it 'returns false if the link is not shortened but uses a similar ' \
209
+ 'domain' do
210
+ uri = described_class.new('http://notbit.ly/1ciyUPh')
211
+
212
+ expect(uri).to_not be_shortened
213
+ end
214
+ end
215
+
216
+ def stub_redirect(short_url, expanded_url, status = 301)
217
+ stub_request(:head, short_url).
218
+ to_return(:status => status, :headers => { 'Location' => expanded_url })
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,31 @@
1
+ require 'embiggen'
2
+
3
+ RSpec.describe Embiggen do
4
+ describe '#URI' do
5
+ it 'returns an Embiggen::URI' do
6
+ uri = described_class::URI('http://www.altmetric.com')
7
+
8
+ expect(uri).to be_a(described_class::URI)
9
+ end
10
+
11
+ it 'accepts an existing Embiggen::URI' do
12
+ uri = described_class::URI.new('http://www.altmetric.com')
13
+
14
+ expect(described_class::URI(uri)).to be_a(described_class::URI)
15
+ end
16
+ end
17
+
18
+ describe '#configure' do
19
+ it 'can be used to set global configuration' do
20
+ described_class.configure do |config|
21
+ config.timeout = 10
22
+ end
23
+
24
+ expect(described_class::Configuration.timeout).to eq(10)
25
+ end
26
+
27
+ after do
28
+ described_class::Configuration.timeout = 1
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ require 'webmock/rspec'
2
+
3
+ RSpec.configure do |config|
4
+ config.filter_run :focus
5
+ config.run_all_when_everything_filtered = true
6
+ config.disable_monkey_patching!
7
+ config.warnings = true
8
+ config.order = :random
9
+ Kernel.srand config.seed
10
+
11
+ config.default_formatter = 'doc' if config.files_to_run.one?
12
+
13
+ config.expect_with :rspec do |expectations|
14
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
15
+ end
16
+
17
+ config.mock_with :rspec do |mocks|
18
+ mocks.verify_partial_doubles = true
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: embiggen
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Paul Mucur
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: webmock
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.21'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.21'
41
+ description: |2
42
+ A library to expand shortened URIs, respecting timeouts, following
43
+ multiple redirects and leaving unshortened URIs intact.
44
+ email: support@altmetric.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - LICENSE
50
+ - README.md
51
+ - lib/embiggen.rb
52
+ - lib/embiggen/configuration.rb
53
+ - lib/embiggen/uri.rb
54
+ - spec/embiggen/configuration_spec.rb
55
+ - spec/embiggen/uri_spec.rb
56
+ - spec/embiggen_spec.rb
57
+ - spec/spec_helper.rb
58
+ homepage: https://github.com/altmetric/embiggen
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.4.5
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: A library to expand shortened URLs
82
+ test_files:
83
+ - spec/embiggen/configuration_spec.rb
84
+ - spec/embiggen/uri_spec.rb
85
+ - spec/embiggen_spec.rb
86
+ - spec/spec_helper.rb
87
+ has_rdoc: