link_shrink 0.0.1 → 0.0.2
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.
- data/.autotest +1 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +7 -7
- data/Changelog.md +27 -0
- data/README.md +11 -1
- data/Rakefile +8 -1
- data/lib/link_shrink/cli.rb +6 -1
- data/lib/link_shrink/json_parser.rb +19 -0
- data/lib/link_shrink/options.rb +18 -0
- data/lib/link_shrink/request.rb +56 -0
- data/lib/link_shrink/shrinkers/base.rb +54 -0
- data/lib/link_shrink/shrinkers/google.rb +31 -0
- data/lib/link_shrink/version.rb +1 -1
- data/lib/link_shrink.rb +23 -27
- data/link_shrink.gemspec +6 -1
- data/spec/fixtures/response_qr_code.json +1 -0
- data/spec/fixtures/response_qr_code_custom.json +1 -0
- data/spec/link_shrink/google_spec.rb +52 -0
- data/spec/link_shrink/json_parser_spec.rb +21 -0
- data/spec/link_shrink/link_shrink_spec.rb +77 -0
- data/spec/link_shrink/options_spec.rb +81 -0
- data/spec/link_shrink/request_spec.rb +58 -0
- data/spec/link_shrink/shrinker_base_spec.rb +50 -0
- data/spec/shared_examples.rb +22 -0
- data/spec/spec_helper.rb +7 -6
- metadata +110 -7
- data/spec/link_shrink_spec.rb +0 -56
data/.autotest
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'autotest/fsevent'
|
data/.rspec
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-1.9.3-
|
1
|
+
ruby-1.9.3-p448
|
data/.travis.yml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
+
---
|
1
2
|
language: ruby
|
2
3
|
rvm:
|
3
|
-
|
4
|
-
script:
|
5
|
-
before_install:
|
6
|
-
- gem install bundler
|
7
|
-
rvm:
|
8
|
-
- 1.9.3
|
4
|
+
- 1.9.3
|
5
|
+
script: bundle exec rake test
|
9
6
|
notifications:
|
10
7
|
email: false
|
11
8
|
irc:
|
12
9
|
on_success: change
|
13
10
|
on_failure: always
|
14
11
|
channels:
|
15
|
-
|
12
|
+
- irc.freenode.org#rubyonadhd
|
13
|
+
env:
|
14
|
+
global:
|
15
|
+
secure: bPqqN6twAJeRIpUEGozFIV3+dW2TSRxYQRrQhpzJ6Bx2ZXmk8UWl1O57Scf9/ZrCjo23MSvWKY1Rt1eyncaUVfzr4PjR6GjUwwdE7SPHQFKvGeNLIlJElzcz1ywcX6RU8+6JPYnx3NxR2O5VM8rf7wLwma00nuaDunM5NgKMMdQ=
|
data/Changelog.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# LinkShrink Changelog
|
2
|
+
|
3
|
+
## 0.0.2
|
4
|
+
|
5
|
+
Released July 16, 2013 ([0.0.2](https://github.com/jonahoffline/link_shrink/tree/v0.0.2)).
|
6
|
+
|
7
|
+
* Add :qr_code, and :image_size options to the shrink_url.
|
8
|
+
* Add new generate_qr_code method to LinkShrink.
|
9
|
+
* Add method for using API key.
|
10
|
+
* Refactor LinkShrink module.
|
11
|
+
* Move code from LinkShrink into new Request module.
|
12
|
+
* Move json-related code into new JSONParser module.
|
13
|
+
* Add new Options class.
|
14
|
+
* Add Shrinker::Base abstract class for defining other URL APIs.
|
15
|
+
* Move Google URL API related code into its own class implemeting new Base class.
|
16
|
+
* Add --qrcode option into CLI for command-line application.
|
17
|
+
* Update README.
|
18
|
+
* Add Changelog.
|
19
|
+
* Update gemspec development-dependencies (RSpec)
|
20
|
+
* Add new gemspec development-dependencies (autotest-test, rspec-nc, simplecov)
|
21
|
+
* Add BadgeFury, Gemnasium, CodeClimate and Travis-CI badges to README.
|
22
|
+
|
23
|
+
## 0.0.1
|
24
|
+
|
25
|
+
Released June 24, 2013 ([0.0.1](https://github.com/jonahoffline/link_shrink/tree/v0.0.1)).
|
26
|
+
|
27
|
+
* Initial Release.
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
LinkShrink [](https://travis-ci.org/jonahoffline/link_shrink) [](http://badge.fury.io/rb/link_shrink) [](https://gemnasium.com/jonahoffline/link_shrink)
|
1
|
+
LinkShrink [](https://travis-ci.org/jonahoffline/link_shrink) [](http://badge.fury.io/rb/link_shrink) [](https://gemnasium.com/jonahoffline/link_shrink) [](https://codeclimate.com/github/jonahoffline/link_shrink)
|
2
2
|
=================
|
3
3
|
|
4
4
|
A Ruby Gem and Command-Line Application for shrinking those long and nasty links into a shorter URL
|
@@ -20,6 +20,15 @@ LinkShrink.shrink_url("http://www.ruby-lang.org")
|
|
20
20
|
|
21
21
|
LinkShrink.shrink_url("http://www.ruby-lang.org", { :json => true })
|
22
22
|
=> "{\"kind\":\"urlshortener#url\",\"id\":\"http://goo.gl/MprR\",\"longUrl\":\"http://www.ruby-lang.org/\"}"
|
23
|
+
|
24
|
+
LinkShrink.shrink_url("http://www.ruby-lang.org", { :qr_code => true })
|
25
|
+
=> "http://goo.gl/QuXj.qr"
|
26
|
+
|
27
|
+
LinkShrink.shrink_url("http://www.ruby-lang.org", { :qr_code => true, image_size: '200x200' })
|
28
|
+
=> "http://chart.googleapis.com/chart?cht=qr&chs=200x200&choe=UTF-8&chld=H&chl=http://goo.gl/MprR"
|
29
|
+
|
30
|
+
LinkShrink.shrink_url("http://www.ruby-lang.org", { json: true, qr_code: true, image_size: '300x300' })
|
31
|
+
=> "{\"kind\":\"urlshortener#url\",\"id\":\"http://goo.gl/MprR\",\"longUrl\":\"http://www.ruby-lang.org/\",\"qr_code\":\"http://chart.googleapis.com/chart?cht=qr&chs=300x300&choe=UTF-8&chld=H&chl=http://goo.gl/MprR\"}"
|
23
32
|
```
|
24
33
|
|
25
34
|
|
@@ -31,6 +40,7 @@ In your terminal:
|
|
31
40
|
### Command-Line Options ###
|
32
41
|
|
33
42
|
* -j, --json - return JSON response
|
43
|
+
* -q, --qrcode - return QR Code
|
34
44
|
* -h, --help - show help message
|
35
45
|
|
36
46
|
## Author
|
data/Rakefile
CHANGED
@@ -4,4 +4,11 @@ require 'rspec/core/rake_task'
|
|
4
4
|
RSpec::Core::RakeTask.new
|
5
5
|
|
6
6
|
task :default => :spec
|
7
|
-
task :test => :spec
|
7
|
+
task :test => :spec
|
8
|
+
|
9
|
+
desc 'Run All specs and generate simplecov report'
|
10
|
+
task :cov do |t|
|
11
|
+
ENV['COVERAGE'] = 'true'
|
12
|
+
Rake::Task['spec'].execute
|
13
|
+
`open coverage/index.html`
|
14
|
+
end
|
data/lib/link_shrink/cli.rb
CHANGED
@@ -14,6 +14,7 @@ module LinkShrink
|
|
14
14
|
# @param opts [OptionParser]
|
15
15
|
def set_options(opts)
|
16
16
|
@json = false
|
17
|
+
@qr_code = false
|
17
18
|
opts.version = LinkShrink::VERSION
|
18
19
|
opts.banner = <<MSG
|
19
20
|
Usage: link_shrink [OPTION] [URL]
|
@@ -27,6 +28,10 @@ MSG
|
|
27
28
|
@json = :true
|
28
29
|
end
|
29
30
|
|
31
|
+
opts.on_head('-q', '--qrcode', 'return QR Code') do
|
32
|
+
@qr_code = :true
|
33
|
+
end
|
34
|
+
|
30
35
|
opts.on_tail('-v', '--version', 'display the version of LinkShrink and exit') do
|
31
36
|
puts opts.version
|
32
37
|
exit
|
@@ -48,7 +53,7 @@ MSG
|
|
48
53
|
end
|
49
54
|
|
50
55
|
def process_url
|
51
|
-
LinkShrink.shrink_url(@args.last, { json: @json })
|
56
|
+
LinkShrink.shrink_url(@args.last, { json: @json, qr_code: @qr_code })
|
52
57
|
end
|
53
58
|
|
54
59
|
def url_present?
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module LinkShrink
|
4
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
5
|
+
# Wraps JSON class
|
6
|
+
module JSONParser
|
7
|
+
def self.included(base)
|
8
|
+
base.extend self
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.parse_json(data)
|
12
|
+
JSON.load(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.cleanup_json(data)
|
16
|
+
data.gsub(/\s+/, '')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module LinkShrink
|
2
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
3
|
+
# Inherits from Hash to add predicate methods
|
4
|
+
class Options < Hash
|
5
|
+
def initialize(*args)
|
6
|
+
super(*args)
|
7
|
+
self.merge!(self.default)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Dynamically defines three predicate methods
|
11
|
+
# @return [Trueclass] return true or false if no key found
|
12
|
+
[:qr_code, :json, :image_size].map do |method|
|
13
|
+
define_method "#{method}?" do
|
14
|
+
self.fetch(method, false)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'typhoeus'
|
2
|
+
|
3
|
+
module LinkShrink
|
4
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
5
|
+
# Handles request and calls parser
|
6
|
+
module Request
|
7
|
+
def self.included(base)
|
8
|
+
base.extend self
|
9
|
+
end
|
10
|
+
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def process_request(url, options, shrinker = LinkShrink::Shrinkers::Google.new)
|
14
|
+
process_response(request(url, shrinker).body, options, shrinker)
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_response(response, options, shrinker, json = JSONParser)
|
18
|
+
option = Options.new(options)
|
19
|
+
parsed_json = json.parse_json(response)
|
20
|
+
plain = parsed_json['id']
|
21
|
+
|
22
|
+
if option.json? && option.qr_code?
|
23
|
+
if option.image_size?
|
24
|
+
return parsed_json.merge(qr_code: shrinker.generate_chart_url(plain, options.fetch(:image_size))).to_json
|
25
|
+
end
|
26
|
+
return parsed_json.merge(qr_code: shrinker.generate_chart_url(plain)).to_json
|
27
|
+
end
|
28
|
+
|
29
|
+
case
|
30
|
+
when option.json?
|
31
|
+
json.cleanup_json(response)
|
32
|
+
when option.qr_code?
|
33
|
+
if option.image_size?
|
34
|
+
return shrinker.generate_chart_url(plain, options.fetch(:image_size))
|
35
|
+
end
|
36
|
+
shrinker.generate_chart_url(plain)
|
37
|
+
when option.image_size?
|
38
|
+
shrinker.generate_chart_url(plain, options.fetch(:image_size))
|
39
|
+
else
|
40
|
+
plain
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Calls URL API
|
45
|
+
# @see LinkShrink::Shrinkers::Base#api_url
|
46
|
+
# @see LinkShrink::Shrinkers::Base#body_parameters
|
47
|
+
def request(url, shrinker)
|
48
|
+
Typhoeus::Request.new(
|
49
|
+
shrinker.api_url,
|
50
|
+
method: :post,
|
51
|
+
body: shrinker.body_parameters(url),
|
52
|
+
headers: { 'Content-Type' => 'application/json' }
|
53
|
+
).run
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module LinkShrink
|
4
|
+
module Shrinkers
|
5
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
6
|
+
# an Abstract Base class for implementing other URL APIs
|
7
|
+
class Base
|
8
|
+
# Callback method that dynamically defines a sub_klass method for reference
|
9
|
+
# @return [String] inherited class name
|
10
|
+
def self.inherited(sub_klass)
|
11
|
+
define_method 'sub_klass' do
|
12
|
+
"#{sub_klass.name}"[/::(\w+)::(\w+)/, 2]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# URL base for API
|
17
|
+
def base_url
|
18
|
+
fail "#{__method__} not implemented"
|
19
|
+
end
|
20
|
+
|
21
|
+
# URL query parameters
|
22
|
+
def api_query_parameter
|
23
|
+
fail "#{__method__} not implemented"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Parameters to be used in API request
|
27
|
+
def body_parameters(url)
|
28
|
+
fail "#{__method__} not implemented"
|
29
|
+
end
|
30
|
+
|
31
|
+
# Complete URL with query parameters
|
32
|
+
def api_url
|
33
|
+
api_key? ? base_url.concat(api_query_parameter) : base_url
|
34
|
+
end
|
35
|
+
|
36
|
+
# Predicate method for checking if the API key exists
|
37
|
+
# @return [TrueClass, FalseClass]
|
38
|
+
def api_key?
|
39
|
+
ENV.has_key?("#{sub_klass.upcase}_URL_KEY")
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns API Key
|
43
|
+
# @return [String] API key or nil
|
44
|
+
def api_key
|
45
|
+
api_key? ? ENV["#{sub_klass.upcase}_URL_KEY"] : nil
|
46
|
+
end
|
47
|
+
|
48
|
+
# Encodes URL
|
49
|
+
def sanitize_url(url)
|
50
|
+
URI.encode(url)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module LinkShrink
|
4
|
+
module Shrinkers
|
5
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
6
|
+
# Implements Google's URL Shortener API
|
7
|
+
class Google < Base
|
8
|
+
def base_url
|
9
|
+
'https://www.googleapis.com/urlshortener/v1/url'
|
10
|
+
end
|
11
|
+
|
12
|
+
def api_query_parameter
|
13
|
+
"?key=#{api_key}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def body_parameters(url)
|
17
|
+
{ 'longUrl' => sanitize_url(url) }.to_json
|
18
|
+
end
|
19
|
+
|
20
|
+
# Generates QR code URL
|
21
|
+
# @return [String] QR code url with '150x150' or custom image size
|
22
|
+
def generate_chart_url(url, image_size = {})
|
23
|
+
return "#{url}.qr" if image_size.empty?
|
24
|
+
|
25
|
+
chart_url = 'http://chart.googleapis.com/chart'
|
26
|
+
params = "?cht=qr&chs=#{image_size}&choe=UTF-8&chld=H&chl=#{url}"
|
27
|
+
chart_url.concat(params)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/link_shrink/version.rb
CHANGED
data/lib/link_shrink.rb
CHANGED
@@ -1,40 +1,36 @@
|
|
1
1
|
require 'link_shrink/version'
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
2
|
+
require 'link_shrink/options'
|
3
|
+
require 'link_shrink/request'
|
4
|
+
require 'link_shrink/json_parser'
|
5
|
+
require 'link_shrink/shrinkers/base'
|
6
|
+
require 'link_shrink/shrinkers/google'
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
9
|
+
# Creates a short URL and QR codes
|
8
10
|
module LinkShrink
|
9
|
-
|
11
|
+
include LinkShrink::Request
|
10
12
|
# Returns a short URL or JSON response
|
13
|
+
# example: shrink_url('http://www.wtf.com', { json: true, qr_code: true })
|
14
|
+
# example: shrink_url('http://www.wtf.com', { qr_code: true })
|
11
15
|
#
|
12
16
|
# @param url [String] long URL to be shortened
|
13
17
|
# @param options [Hash] format to be returned
|
14
18
|
# @return [String] generated short URL or JSON response
|
15
|
-
def self.shrink_url(url, options = {:
|
16
|
-
|
17
|
-
options.fetch(:json, nil) ? cleanup_json(res.body) : parse_json(res.body)['id']
|
19
|
+
def self.shrink_url(url, options = { json: false, qr_code: false })
|
20
|
+
process_request(url, options)
|
18
21
|
rescue
|
19
22
|
'Problem generating short URL. Try again.'
|
20
23
|
end
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
)
|
31
|
-
|
32
|
-
|
33
|
-
def self.parse_json(data)
|
34
|
-
JSON.parse(data)
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.cleanup_json(data)
|
38
|
-
data.gsub(/\s+/, '')
|
25
|
+
# Returns a QR code URL
|
26
|
+
# example: generate_qr_code('http://www.wtf.com', { image_size: '300x300' })
|
27
|
+
#
|
28
|
+
# @param url [String] long URL to be shortened
|
29
|
+
# @param options [Hash] image_size: '300x300' for a custom size
|
30
|
+
# @return [String] QR code URL using default or custom size
|
31
|
+
def self.generate_qr_code(url, options = {})
|
32
|
+
new_url = process_request(url, {})
|
33
|
+
image_size = options.fetch(:image_size, {})
|
34
|
+
LinkShrink::Shrinkers::Google.new.generate_chart_url(new_url, image_size)
|
39
35
|
end
|
40
|
-
end
|
36
|
+
end
|
data/link_shrink.gemspec
CHANGED
@@ -22,6 +22,11 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency 'typhoeus', '~> 0.6.3'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
|
-
spec.add_development_dependency 'rspec', '~> 2.
|
25
|
+
spec.add_development_dependency 'rspec', '~> 2.14.1'
|
26
26
|
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'autotest-standalone', '~> 4.5.11'
|
28
|
+
spec.add_development_dependency 'autotest-fsevent', '~> 0.2.8'
|
29
|
+
spec.add_development_dependency 'rspec-nc', '~> 0.0.6'
|
30
|
+
spec.add_development_dependency 'simplecov', '~> 0.7.1'
|
31
|
+
spec.add_development_dependency 'simplecov-gem-adapter', '~> 1.0.1'
|
27
32
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"kind":"urlshortener#url","id":"http://goo.gl/fbsS","longUrl":"http://www.google.com/","qr_code":"http://goo.gl/fbsS.qr"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"kind":"urlshortener#url","id":"http://goo.gl/fbsS","longUrl":"http://www.google.com/","qr_code":"http://chart.googleapis.com/chart?cht=qr&chs=300x300&choe=UTF-8&chld=H&chl=http://goo.gl/fbsS"}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink::Shrinkers::Google do
|
4
|
+
include_examples 'shared_examples'
|
5
|
+
|
6
|
+
let(:link_shrink) { described_class.new }
|
7
|
+
let(:google_url) { 'https://www.googleapis.com/urlshortener/v1/url' }
|
8
|
+
let(:key) { ENV['GOOGLE_URL_KEY'] }
|
9
|
+
|
10
|
+
describe '#sub_klass' do
|
11
|
+
it 'returns the inherited subclass name' do
|
12
|
+
expect(link_shrink.sub_klass).to eq('Google')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#base_url' do
|
17
|
+
it 'returns the base_url for the API' do
|
18
|
+
expect(link_shrink.base_url)
|
19
|
+
.to eq(google_url)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#api_key' do
|
24
|
+
it 'returns the API key' do
|
25
|
+
expect(link_shrink.api_key)
|
26
|
+
.to eq(key)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#generate_chart_url' do
|
31
|
+
let(:chart_url) { "http://chart.googleapis.com/chart?cht=qr&chs=300x300&choe=UTF-8&chld=H&chl=http://goo.gl/fbsS" }
|
32
|
+
|
33
|
+
it 'returns a QR code' do
|
34
|
+
expect(link_shrink.generate_chart_url(short_url))
|
35
|
+
.to eq(qrcode_url)
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when called with optional image_size argument' do
|
39
|
+
it 'returns a QR code with custom image size' do
|
40
|
+
expect(link_shrink.generate_chart_url(short_url, '300x300'))
|
41
|
+
.to eq(chart_url)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#body_parameters' do
|
47
|
+
it 'returns body parameters for API request' do
|
48
|
+
expect(link_shrink.body_parameters("http://www.google.com"))
|
49
|
+
.to eq("{\"longUrl\":\"http://www.google.com\"}")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink::JSONParser do
|
4
|
+
include_examples 'shared_examples'
|
5
|
+
|
6
|
+
describe '.parse_json' do
|
7
|
+
it 'delegates to the JSON parser' do
|
8
|
+
expect(link_shrink.parse_json(json_response))
|
9
|
+
.to eq(parsed_json)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '.cleanup_json' do
|
14
|
+
let(:json) { "{\n \"kind\": \"urlshortener#url\",\n \"id\": \"http://goo.gl/fbsS\",\n \"longUrl\": \"http://www.google.com/\"\n}\n" }
|
15
|
+
|
16
|
+
it 'cleans JSON response' do
|
17
|
+
expect(link_shrink.cleanup_json(json))
|
18
|
+
.to eq('{"kind":"urlshortener#url","id":"http://goo.gl/fbsS","longUrl":"http://www.google.com/"}')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink do
|
4
|
+
include_examples 'shared_examples'
|
5
|
+
|
6
|
+
describe '.shrink_url' do
|
7
|
+
it 'creates a short url' do
|
8
|
+
expect(link_shrink.shrink_url(url)).to eq(short_url)
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when called with additional options' do
|
12
|
+
context 'json option' do
|
13
|
+
it 'returns JSON when set to true' do
|
14
|
+
expect(link_shrink.shrink_url(url, { :json => true }))
|
15
|
+
.to eq(json_response)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns default response when set to false' do
|
19
|
+
expect(link_shrink.shrink_url(url, { json: false }))
|
20
|
+
.to eq(short_url)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'qr_code option' do
|
25
|
+
it 'returns QR code when set to true' do
|
26
|
+
expect(link_shrink.shrink_url(url, { qr_code: true }))
|
27
|
+
.to eq(qrcode_url)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns default response when set to false' do
|
31
|
+
expect(link_shrink.shrink_url(url, { qr_code: false }))
|
32
|
+
.to eq(short_url)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'returns default response when called with empty hash' do
|
37
|
+
expect(link_shrink.shrink_url(url, {})).to eq(short_url)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when called with json and qr_code options' do
|
42
|
+
it 'returns qr_code in JSON' do
|
43
|
+
expect(link_shrink.shrink_url(url, { :json => true, :qr_code => true }))
|
44
|
+
.to eq(json_qr_code)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when called with image_size: 200x200' do
|
49
|
+
it 'returns QR code link with custom size' do
|
50
|
+
expect(link_shrink.shrink_url(url, {:qr_code => true, :image_size => "200x200"}))
|
51
|
+
.to eq(chart_url)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when called with json, qr_code and image_size: 300x300' do
|
56
|
+
let(:options) { { json: true, qr_code: true, image_size: "300x300" }}
|
57
|
+
|
58
|
+
it 'returns QR code in JSON with custom size' do
|
59
|
+
expect(link_shrink.shrink_url(url, options))
|
60
|
+
.to eq(json_qr_code_custom)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '.generate_qr_code' do
|
66
|
+
it 'creates a QR code' do
|
67
|
+
expect(link_shrink.generate_qr_code(url)).to eq(qrcode_url)
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when called with image_size: 200x200' do
|
71
|
+
it 'returns QR code with custom size' do
|
72
|
+
expect(link_shrink.generate_qr_code(url, { image_size: "200x200" }))
|
73
|
+
.to eq(chart_url)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink::Options do
|
4
|
+
let(:options_class) { described_class }
|
5
|
+
let(:empty_hash) { described_class.new({}) }
|
6
|
+
|
7
|
+
describe '#initialize' do
|
8
|
+
it 'inherits from Hash' do
|
9
|
+
expect(options_class.superclass).to be(Hash)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#json?' do
|
14
|
+
context 'when :json is set to true in the options hash' do
|
15
|
+
it 'returns true' do
|
16
|
+
options = options_class.new(json: true)
|
17
|
+
expect(options.json?).to be_true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when :json is set to false in the options hash' do
|
22
|
+
it 'returns false' do
|
23
|
+
options = options_class.new(json: false)
|
24
|
+
expect(options.json?).to be_false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when called with empty hash' do
|
29
|
+
it 'returns false' do
|
30
|
+
expect(empty_hash.json?).to be_false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#qr_code?' do
|
36
|
+
context 'when :qr_code is set to true in the options hash' do
|
37
|
+
it 'returns true' do
|
38
|
+
options = options_class.new(qr_code: true)
|
39
|
+
expect(options.qr_code?).to be_true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when :qr_code is set to false in the options hash' do
|
44
|
+
it 'returns false' do
|
45
|
+
options = options_class.new(qr_code: false)
|
46
|
+
expect(options.qr_code?).to be_false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#qr_code?' do
|
52
|
+
context 'when :qr_code is set to true in the options hash' do
|
53
|
+
it 'returns true' do
|
54
|
+
options = options_class.new(qr_code: true)
|
55
|
+
expect(options.qr_code?).to be_true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when :qr_code is set to false in the options hash' do
|
60
|
+
it 'returns false' do
|
61
|
+
options = options_class.new(qr_code: false)
|
62
|
+
expect(options.qr_code?).to be_false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#image_size?' do
|
68
|
+
context 'when :image_size has a custom size' do
|
69
|
+
it 'returns true' do
|
70
|
+
options = options_class.new(qr_code: '300x300')
|
71
|
+
expect(options.qr_code?).to be_true
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when :image_size is not defined in the options hash' do
|
76
|
+
it 'returns false' do
|
77
|
+
expect(empty_hash.image_size?).to be_false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink::Request do
|
4
|
+
include_examples 'shared_examples'
|
5
|
+
let(:shrinker) { LinkShrink::Shrinkers::Google.new }
|
6
|
+
let(:json_default) {{ :json => false }}
|
7
|
+
|
8
|
+
describe '.process_request' do
|
9
|
+
it 'calls request and returns short link' do
|
10
|
+
expect(link_shrink.process_request(url, json_default)).to eq(short_url)
|
11
|
+
end
|
12
|
+
|
13
|
+
#it 'calls request and returns short link' do
|
14
|
+
# expect(link_shrink.process_request(url)).to eq(short_url)
|
15
|
+
#end
|
16
|
+
|
17
|
+
context 'when called with qr_code true, image_size 300x300' do
|
18
|
+
it 'returns QR code with custom size' do
|
19
|
+
options = { json: true, qr_code: true, image_size: '300x300' }
|
20
|
+
expect(link_shrink.process_request(url, options))
|
21
|
+
.to eq(json_qr_code_custom)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '.process_response' do
|
27
|
+
context 'when called with json true' do
|
28
|
+
it 'returns json' do
|
29
|
+
response = link_shrink.request(url, shrinker).body
|
30
|
+
expect(link_shrink.process_response(response, {json: true}, shrinker))
|
31
|
+
.to eq(json_response)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when called with json false or no options' do
|
36
|
+
it 'returns link' do
|
37
|
+
response = link_shrink.request(url, shrinker).body
|
38
|
+
expect(link_shrink.process_response(response, json_default, shrinker))
|
39
|
+
.to eq(short_url)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when called with qr_code true' do
|
44
|
+
it 'returns QR code' do
|
45
|
+
response = link_shrink.request(url, shrinker).body
|
46
|
+
expect(link_shrink.process_response(response, { qr_code: true }, shrinker))
|
47
|
+
.to eq(qrcode_url)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '.request' do
|
53
|
+
it 'is a Typhoeus::Request instance' do
|
54
|
+
expect(link_shrink.request(url, shrinker))
|
55
|
+
.to be_kind_of(Typhoeus::Response)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink::Shrinkers::Base do
|
4
|
+
let(:link_shrink) { described_class.new }
|
5
|
+
|
6
|
+
describe '#base_url' do
|
7
|
+
it 'raise error when not overriden' do
|
8
|
+
expect{ link_shrink.base_url }.to raise_error 'base_url not implemented'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#api_query_parameter' do
|
13
|
+
it 'raises error due to other methods not being overridden' do
|
14
|
+
expect{ link_shrink.api_query_parameter }.to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#body_parameters' do
|
19
|
+
it 'raises error due to other methods not being overridden' do
|
20
|
+
expect{ link_shrink.body_parameters }.to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#api_url' do
|
25
|
+
it 'raises error due to other methods not being overridden' do
|
26
|
+
expect{ link_shrink.base_url }.to raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
#
|
30
|
+
describe '#api_key?' do
|
31
|
+
it 'returns false when API is not found' do
|
32
|
+
link_shrink.stub(:sub_klass).and_return('blahblah')
|
33
|
+
expect(link_shrink.api_key?).to be_false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#api_key' do
|
38
|
+
it 'returns the api key' do
|
39
|
+
link_shrink.stub(:sub_klass).and_return('blahblah')
|
40
|
+
expect(link_shrink.api_key).to eq(nil)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#sanitize_url' do
|
45
|
+
it 'cleans URL' do
|
46
|
+
expect(link_shrink.sanitize_url("http://www.google.com/ "))
|
47
|
+
.to eq("http://www.google.com/%20")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
4
|
+
# Shared examples used in specs
|
5
|
+
shared_context 'shared_examples' do
|
6
|
+
# Helper method for loading fixtures
|
7
|
+
def fixture(file)
|
8
|
+
file_path = File.join(File.dirname(__FILE__), 'fixtures', "#{file}")
|
9
|
+
File.open(file_path).read
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:link_shrink) { described_class }
|
13
|
+
let(:url) { 'http://www.google.com' }
|
14
|
+
let(:short_url) { "http://goo.gl/fbsS" }
|
15
|
+
let(:qrcode_url) { 'http://goo.gl/fbsS.qr' }
|
16
|
+
|
17
|
+
let(:json_response) { fixture('response.json') }
|
18
|
+
let(:json_qr_code) { fixture('response_qr_code.json') }
|
19
|
+
let(:json_qr_code_custom) { fixture('response_qr_code_custom.json') }
|
20
|
+
let(:parsed_json) { { "kind" => "urlshortener#url", "id" => "http://goo.gl/fbsS", "longUrl" => "http://www.google.com/" } }
|
21
|
+
let(:chart_url) { "http://chart.googleapis.com/chart?cht=qr&chs=200x200&choe=UTF-8&chld=H&chl=http://goo.gl/fbsS" }
|
22
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'simplecov-gem-adapter'
|
3
|
+
|
4
|
+
SimpleCov.start 'gem'
|
5
|
+
require 'shared_examples'
|
1
6
|
require 'link_shrink'
|
2
7
|
|
3
8
|
RSpec.configure do |config|
|
4
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
#config.treat_symbols_as_metadata_keys_with_true_values = true
|
10
|
+
config.run_all_when_everything_filtered = true
|
5
11
|
config.order = 'random'
|
6
12
|
end
|
7
|
-
|
8
|
-
def fixture(file)
|
9
|
-
file_path = File.join(File.dirname(__FILE__), 'fixtures', "#{file}")
|
10
|
-
File.open(file_path).read
|
11
|
-
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: link_shrink
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: typhoeus
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 2.
|
53
|
+
version: 2.14.1
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.
|
61
|
+
version: 2.14.1
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: rake
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +75,86 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: autotest-standalone
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 4.5.11
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 4.5.11
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: autotest-fsevent
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.2.8
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.2.8
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec-nc
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.0.6
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.0.6
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: simplecov
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.7.1
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.7.1
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: simplecov-gem-adapter
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.0.1
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.0.1
|
78
158
|
description: Shrink those long and nasty links into a shorter URL
|
79
159
|
email:
|
80
160
|
- jonah@pixelhipsters.com
|
@@ -83,11 +163,13 @@ executables:
|
|
83
163
|
extensions: []
|
84
164
|
extra_rdoc_files: []
|
85
165
|
files:
|
166
|
+
- .autotest
|
86
167
|
- .gitignore
|
87
168
|
- .rspec
|
88
169
|
- .ruby-gemset
|
89
170
|
- .ruby-version
|
90
171
|
- .travis.yml
|
172
|
+
- Changelog.md
|
91
173
|
- Gemfile
|
92
174
|
- LICENSE
|
93
175
|
- README.md
|
@@ -95,10 +177,23 @@ files:
|
|
95
177
|
- bin/linkshrink
|
96
178
|
- lib/link_shrink.rb
|
97
179
|
- lib/link_shrink/cli.rb
|
180
|
+
- lib/link_shrink/json_parser.rb
|
181
|
+
- lib/link_shrink/options.rb
|
182
|
+
- lib/link_shrink/request.rb
|
183
|
+
- lib/link_shrink/shrinkers/base.rb
|
184
|
+
- lib/link_shrink/shrinkers/google.rb
|
98
185
|
- lib/link_shrink/version.rb
|
99
186
|
- link_shrink.gemspec
|
100
187
|
- spec/fixtures/response.json
|
101
|
-
- spec/
|
188
|
+
- spec/fixtures/response_qr_code.json
|
189
|
+
- spec/fixtures/response_qr_code_custom.json
|
190
|
+
- spec/link_shrink/google_spec.rb
|
191
|
+
- spec/link_shrink/json_parser_spec.rb
|
192
|
+
- spec/link_shrink/link_shrink_spec.rb
|
193
|
+
- spec/link_shrink/options_spec.rb
|
194
|
+
- spec/link_shrink/request_spec.rb
|
195
|
+
- spec/link_shrink/shrinker_base_spec.rb
|
196
|
+
- spec/shared_examples.rb
|
102
197
|
- spec/spec_helper.rb
|
103
198
|
homepage: https://github.com/jonahoffline/link_shrink
|
104
199
|
licenses:
|
@@ -121,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
216
|
version: '0'
|
122
217
|
segments:
|
123
218
|
- 0
|
124
|
-
hash:
|
219
|
+
hash: 1699152346401212239
|
125
220
|
requirements: []
|
126
221
|
rubyforge_project:
|
127
222
|
rubygems_version: 1.8.25
|
@@ -130,5 +225,13 @@ specification_version: 3
|
|
130
225
|
summary: Shrink those long and nasty links using Google's URL Shortner API
|
131
226
|
test_files:
|
132
227
|
- spec/fixtures/response.json
|
133
|
-
- spec/
|
228
|
+
- spec/fixtures/response_qr_code.json
|
229
|
+
- spec/fixtures/response_qr_code_custom.json
|
230
|
+
- spec/link_shrink/google_spec.rb
|
231
|
+
- spec/link_shrink/json_parser_spec.rb
|
232
|
+
- spec/link_shrink/link_shrink_spec.rb
|
233
|
+
- spec/link_shrink/options_spec.rb
|
234
|
+
- spec/link_shrink/request_spec.rb
|
235
|
+
- spec/link_shrink/shrinker_base_spec.rb
|
236
|
+
- spec/shared_examples.rb
|
134
237
|
- spec/spec_helper.rb
|
data/spec/link_shrink_spec.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe LinkShrink do
|
4
|
-
let(:link_shrink) { LinkShrink }
|
5
|
-
let(:url) { 'http://www.google.com' }
|
6
|
-
let(:short_url) { 'http://goo.gl/fbsS' }
|
7
|
-
let(:json) { fixture('response.json') }
|
8
|
-
|
9
|
-
|
10
|
-
describe '.shrink_url' do
|
11
|
-
it 'creates a short url using the API' do
|
12
|
-
expect(link_shrink.shrink_url(url)).to eq(short_url)
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'when called with additional options' do
|
16
|
-
it 'returns response in JSON format when set to true' do
|
17
|
-
expect(link_shrink.shrink_url(url, { json: true })).to eq(json)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'returns default response when set to false' do
|
21
|
-
expect(link_shrink.shrink_url(url, { :json => false })).to eq(short_url)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
describe '.request' do
|
28
|
-
it 'is a Typhoeus::Request instance' do
|
29
|
-
expect(link_shrink.request(url))
|
30
|
-
.to be_kind_of(Typhoeus::Response)
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'sends request to the Google URL Shortner API' do
|
34
|
-
response = link_shrink.request(url)
|
35
|
-
|
36
|
-
expect(response.return_code).to eq(:ok)
|
37
|
-
expect(response.response_code).to eq(200)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe '.parse_json' do
|
42
|
-
it 'delegates to the JSON parser' do
|
43
|
-
expect(link_shrink.parse_json(json))
|
44
|
-
.to eq( {"kind" => "urlshortener#url", "id" => "http://goo.gl/fbsS", "longUrl" => "http://www.google.com/" } )
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe '.cleanup_json' do
|
49
|
-
let(:json) {"{\n \"kind\": \"urlshortener#url\",\n \"id\": \"http://goo.gl/fbsS\",\n \"longUrl\": \"http://www.google.com/\"\n}\n"}
|
50
|
-
|
51
|
-
it 'cleans JSON response' do
|
52
|
-
expect(link_shrink.cleanup_json(json))
|
53
|
-
.to eq('{"kind":"urlshortener#url","id":"http://goo.gl/fbsS","longUrl":"http://www.google.com/"}')
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|