is-gd-shrinker 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.
- data/LICENSE +20 -0
- data/README.rdoc +14 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/is-gd-shrinker.gemspec +53 -0
- data/lib/shrinker.rb +54 -0
- data/spec/is-gd-shrinker_spec.rb +28 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- metadata +92 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Jeff Sutherland
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
= is-gd-shrinker
|
2
|
+
|
3
|
+
A small gem to shorten URLs using is.gd.
|
4
|
+
|
5
|
+
== Usage
|
6
|
+
require "shrinker"
|
7
|
+
|
8
|
+
<tt>Shrinker.shrink("http://www.google.com")</tt>
|
9
|
+
|
10
|
+
<tt>Shrinker.expand("http://is.gd/xxx")</tt> where xxx is your shrunken URL
|
11
|
+
|
12
|
+
== Copyright
|
13
|
+
|
14
|
+
Copyright (c) 2010 Jeff Sutherland. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "is-gd-shrinker"
|
8
|
+
gem.summary = %Q{A simple is.gd URL shrinker and expander for Ruby}
|
9
|
+
gem.description = %Q{Use is.gd to shrink and expand URLs for your Ruby application. A one-liner does it all.}
|
10
|
+
gem.email = "jefferey.sutherland@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/drpentode/is-gd-shrinker"
|
12
|
+
gem.authors = ["Jeff Sutherland"]
|
13
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'spec/rake/spectask'
|
22
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
23
|
+
spec.libs << 'lib' << 'spec'
|
24
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
25
|
+
end
|
26
|
+
|
27
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
28
|
+
spec.libs << 'lib' << 'spec'
|
29
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
30
|
+
spec.rcov = true
|
31
|
+
end
|
32
|
+
|
33
|
+
task :spec => :check_dependencies
|
34
|
+
|
35
|
+
task :default => :spec
|
36
|
+
|
37
|
+
require 'rake/rdoctask'
|
38
|
+
Rake::RDocTask.new do |rdoc|
|
39
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
+
|
41
|
+
rdoc.rdoc_dir = 'rdoc'
|
42
|
+
rdoc.title = "is-gd-shrinker #{version}"
|
43
|
+
rdoc.rdoc_files.include('README*')
|
44
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
45
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{is-gd-shrinker}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jeff Sutherland"]
|
12
|
+
s.date = %q{2010-06-17}
|
13
|
+
s.description = %q{Use is.gd to shrink and expand URLs for your Ruby application. A one-liner does it all.}
|
14
|
+
s.email = %q{jefferey.sutherland@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"LICENSE",
|
21
|
+
"README.rdoc",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"is-gd-shrinker.gemspec",
|
25
|
+
"lib/shrinker.rb",
|
26
|
+
"spec/is-gd-shrinker_spec.rb",
|
27
|
+
"spec/spec.opts",
|
28
|
+
"spec/spec_helper.rb"
|
29
|
+
]
|
30
|
+
s.homepage = %q{http://github.com/drpentode/is-gd-shrinker}
|
31
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
s.rubygems_version = %q{1.3.7}
|
34
|
+
s.summary = %q{A simple is.gd URL shrinker and expander for Ruby}
|
35
|
+
s.test_files = [
|
36
|
+
"spec/is-gd-shrinker_spec.rb",
|
37
|
+
"spec/spec_helper.rb"
|
38
|
+
]
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
42
|
+
s.specification_version = 3
|
43
|
+
|
44
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
45
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
46
|
+
else
|
47
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
48
|
+
end
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
data/lib/shrinker.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
class Shrinker
|
2
|
+
require "open-uri"
|
3
|
+
require "net/http"
|
4
|
+
|
5
|
+
IS_GD_URL = "http://is.gd/api.php?longurl="
|
6
|
+
|
7
|
+
def self.shrink(url)
|
8
|
+
unless url.match(/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix)
|
9
|
+
raise ShrinkError.new("Supplied URL was not formatted as a URL. Please format it as http://www.domain.com/")
|
10
|
+
end
|
11
|
+
|
12
|
+
encoded_url = URI.encode(IS_GD_URL + url)
|
13
|
+
|
14
|
+
begin
|
15
|
+
shrunken_url = OpenURI.open_uri(encoded_url, 'r') { |file| file.read }
|
16
|
+
rescue OpenURI::HTTPError => e
|
17
|
+
shrunken_url = nil
|
18
|
+
raise ShrinkError.new("No URL was returned from is.gd. There was an error accessing the service.")
|
19
|
+
rescue Exception => e
|
20
|
+
raise ShrinkError.new("No URL was returned from is.gd. #{e.message} #{e.backtrace}")
|
21
|
+
end
|
22
|
+
|
23
|
+
# We might not get an exception, but the service doesn't return a URL.
|
24
|
+
unless shrunken_url == nil || shrunken_url == ""
|
25
|
+
return shrunken_url
|
26
|
+
else
|
27
|
+
raise ShrinkError.new("No URL was returned from is.gd")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.expand(url)
|
32
|
+
url_obj = URI.parse(url)
|
33
|
+
unless url.match(/^(http|https):\/\/is.gd\/[a-z0-9]*/)
|
34
|
+
raise ShrinkError.new("Supplied URL was not an is.gd URL. Please use a valid is.gd URL.")
|
35
|
+
end
|
36
|
+
|
37
|
+
expanded_url = nil
|
38
|
+
|
39
|
+
Net::HTTP.start(url_obj.host, url_obj.port) do |http|
|
40
|
+
response = http.request_head(url_obj.request_uri)
|
41
|
+
|
42
|
+
if response.kind_of?(Net::HTTPMovedPermanently)
|
43
|
+
expanded_url = response["location"]
|
44
|
+
else
|
45
|
+
raise ShrinkError.new("Supplied URL was not in the is.gd system. Please us a valid is.gd URL.")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
return expanded_url
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class ShrinkError < StandardError
|
54
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Shrinker" do
|
4
|
+
it "should shorten a URL" do
|
5
|
+
new_url = Shrinker.shrink("http://www.google.com/")
|
6
|
+
new_url.should match(/http:\/\/is.gd\/[a-z]*/)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should raise a ShrinkError if input URL is not valid" do
|
10
|
+
lambda {Shrinker.shrink("boogers")}.should raise_error(ShrinkError, "Supplied URL was not formatted as a URL. Please format it as http://www.domain.com/")
|
11
|
+
end
|
12
|
+
|
13
|
+
# Any Rspec Gurus know how to stub OpenURI.open_uri without passing around a mocked kernel?
|
14
|
+
# it "should raise an error if is.gd cannot be reached" do
|
15
|
+
# OpenURI.stub!(:open_uri).with(any_args()).and_raise(OpenURI::HTTPError)
|
16
|
+
# lambda {Shrinker.shrink("http://www.google.com/")}.should raise_error(ShrinkError, "No URL was returned from is.gd. There was an error accessing the service.")
|
17
|
+
# end
|
18
|
+
|
19
|
+
it "should expand a URL" do
|
20
|
+
shrunken_url = Shrinker.shrink("http://www.on-site.com/")
|
21
|
+
new_url = Shrinker.expand(shrunken_url)
|
22
|
+
new_url.should == "http://www.on-site.com/"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should raise a ShrinkError if the input URL is not valid" do
|
26
|
+
lambda {Shrinker.expand("boogers")}.should raise_error(ShrinkError, "Supplied URL was not an is.gd URL. Please use a valid is.gd URL.")
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: is-gd-shrinker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jeff Sutherland
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-06-17 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 13
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 2
|
33
|
+
- 9
|
34
|
+
version: 1.2.9
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
description: Use is.gd to shrink and expand URLs for your Ruby application. A one-liner does it all.
|
38
|
+
email: jefferey.sutherland@gmail.com
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files:
|
44
|
+
- LICENSE
|
45
|
+
- README.rdoc
|
46
|
+
files:
|
47
|
+
- LICENSE
|
48
|
+
- README.rdoc
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- is-gd-shrinker.gemspec
|
52
|
+
- lib/shrinker.rb
|
53
|
+
- spec/is-gd-shrinker_spec.rb
|
54
|
+
- spec/spec.opts
|
55
|
+
- spec/spec_helper.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://github.com/drpentode/is-gd-shrinker
|
58
|
+
licenses: []
|
59
|
+
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options:
|
62
|
+
- --charset=UTF-8
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.7
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: A simple is.gd URL shrinker and expander for Ruby
|
90
|
+
test_files:
|
91
|
+
- spec/is-gd-shrinker_spec.rb
|
92
|
+
- spec/spec_helper.rb
|