caleb-shorturl 0.8.7 → 0.8.9
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/Rakefile +61 -0
- data/VERSION.yml +4 -0
- data/doc/classes/InvalidService.html +111 -0
- data/doc/classes/Service.html +202 -0
- data/doc/classes/Service.src/M000003.html +28 -0
- data/doc/classes/Service.src/M000004.html +26 -0
- data/doc/classes/ShortURL.html +227 -0
- data/doc/classes/ShortURL.src/M000001.html +18 -0
- data/doc/classes/ShortURL.src/M000002.html +22 -0
- data/doc/created.rid +1 -0
- data/doc/files/ChangeLog.html +190 -0
- data/doc/files/MIT-LICENSE.html +129 -0
- data/doc/files/README.html +289 -0
- data/doc/files/TODO.html +113 -0
- data/doc/files/lib/shorturl_rb.html +119 -0
- data/doc/fr_class_index.html +29 -0
- data/doc/fr_file_index.html +31 -0
- data/doc/fr_method_index.html +30 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/examples/shorten.rb +27 -0
- data/lib/shorturl.rb +217 -0
- data/shorturl.gemspec +75 -0
- data/test/tc_service.rb +50 -0
- data/test/tc_shorturl.rb +35 -0
- metadata +42 -11
data/examples/shorten.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "shorturl"
|
3
|
+
|
4
|
+
|
5
|
+
def usage
|
6
|
+
puts "Usage: #$0 <url> [<service>]"
|
7
|
+
puts "Valid services:"
|
8
|
+
ShortURL.valid_services.map { |s| s.to_s }.sort.each { |s| puts "\t#{s}" }
|
9
|
+
end
|
10
|
+
|
11
|
+
def main
|
12
|
+
begin
|
13
|
+
case ARGV.length
|
14
|
+
when 0: usage
|
15
|
+
when 1: puts ShortURL.shorten(ARGV[0])
|
16
|
+
else puts ShortURL.shorten(ARGV[0], ARGV[1].to_sym)
|
17
|
+
end
|
18
|
+
rescue InvalidService
|
19
|
+
puts "Invalid service"
|
20
|
+
usage
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
if $0 == __FILE__
|
26
|
+
main
|
27
|
+
end
|
data/lib/shorturl.rb
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
# shorturl.rb
|
2
|
+
#
|
3
|
+
# Created by Vincent Foley on 2005-06-02
|
4
|
+
#
|
5
|
+
|
6
|
+
require "net/http"
|
7
|
+
require "cgi"
|
8
|
+
require "uri"
|
9
|
+
|
10
|
+
class InvalidService < Exception
|
11
|
+
end
|
12
|
+
|
13
|
+
class Service
|
14
|
+
attr_accessor :port, :code, :method, :action, :field, :block
|
15
|
+
|
16
|
+
# Intialize the service with a hostname (required parameter) and you
|
17
|
+
# can override the default values for the HTTP port, expected HTTP
|
18
|
+
# return code, the form method to use, the form action, the form
|
19
|
+
# field which contains the long URL, and the block of what to do
|
20
|
+
# with the HTML code you get.
|
21
|
+
def initialize(hostname) # :yield: service
|
22
|
+
@hostname = hostname
|
23
|
+
@port = 80
|
24
|
+
@code = 200
|
25
|
+
@method = :post
|
26
|
+
@action = "/"
|
27
|
+
@field = "url"
|
28
|
+
@block = lambda { |body| }
|
29
|
+
|
30
|
+
if block_given?
|
31
|
+
yield self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Now that our service is set up, call it with all the parameters to
|
36
|
+
# (hopefully) return only the shortened URL.
|
37
|
+
def call(url)
|
38
|
+
Net::HTTP.start(@hostname, @port) { |http|
|
39
|
+
response = case @method
|
40
|
+
when :post then http.post(@action, "#{@field}=#{url}")
|
41
|
+
when :get then http.get("#{@action}?#{@field}=#{CGI.escape(url)}")
|
42
|
+
end
|
43
|
+
if response.code == @code.to_s
|
44
|
+
@block.call(response.read_body)
|
45
|
+
end
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class ShortURL
|
51
|
+
# Hash table of all the supported services. The key is a symbol
|
52
|
+
# representing the service (usually the hostname minus the .com,
|
53
|
+
# .net, etc.) The value is an instance of Service with all the
|
54
|
+
# parameters set so that when +instance+.call is invoked, the
|
55
|
+
# shortened URL is returned.
|
56
|
+
@@services = {
|
57
|
+
:rubyurl => Service.new("rubyurl.com") { |s|
|
58
|
+
s.action = "/rubyurl/remote"
|
59
|
+
s.field = "website_url"
|
60
|
+
s.block = lambda { |body| URI.extract(body).grep(/rubyurl/)[0] }
|
61
|
+
},
|
62
|
+
|
63
|
+
:tinyurl => Service.new("tinyurl.com") { |s|
|
64
|
+
s.action = "/api-create.php"
|
65
|
+
s.method = :get
|
66
|
+
s.block = lambda { |body| URI.extract(body).grep(/tinyurl/)[0] }
|
67
|
+
},
|
68
|
+
|
69
|
+
:shorl => Service.new("shorl.com") { |s|
|
70
|
+
s.action = "/create.php"
|
71
|
+
s.block = lambda { |body| URI.extract(body)[2] }
|
72
|
+
},
|
73
|
+
|
74
|
+
:snipurl => Service.new("snipurl.com") { |s|
|
75
|
+
s.action = "/index.php"
|
76
|
+
s.field = "link"
|
77
|
+
s.block = lambda { |body|
|
78
|
+
line = body.split("\n").grep(/txt/)[0]
|
79
|
+
short_url = URI.extract(line)[1][0..-2] # Remove trailing '
|
80
|
+
}
|
81
|
+
},
|
82
|
+
|
83
|
+
:metamark => Service.new("metamark.net") { |s|
|
84
|
+
s.action = "/add"
|
85
|
+
s.field = "long_url"
|
86
|
+
s.block = lambda { |body| URI.extract(body).grep(/xrl.us/)[0] }
|
87
|
+
},
|
88
|
+
|
89
|
+
:makeashorterlink => Service.new("makeashorterlink.com") { |s|
|
90
|
+
s.action = "/index.php"
|
91
|
+
s.block = lambda { |body| URI.extract(body).grep(/makeashorterlink/)[0] }
|
92
|
+
},
|
93
|
+
|
94
|
+
:skinnylink => Service.new("skinnylink.com") { |s|
|
95
|
+
s.block = lambda { |body| URI.extract(body).grep(/skinnylink/)[0] }
|
96
|
+
},
|
97
|
+
|
98
|
+
:linktrim => Service.new("linktrim.com") { |s|
|
99
|
+
s.method = :get
|
100
|
+
s.action = "/lt/generate"
|
101
|
+
s.block = lambda { |body| URI.extract(body).grep(/\/linktrim/)[1] }
|
102
|
+
},
|
103
|
+
|
104
|
+
:shorterlink => Service.new("shorterlink.com") { |s|
|
105
|
+
s.method = :get
|
106
|
+
s.action = "/add_url.html"
|
107
|
+
s.block = lambda { |body| URI.extract(body).grep(/shorterlink/)[0] }
|
108
|
+
},
|
109
|
+
|
110
|
+
:minilink => Service.new("minilink.org") { |s|
|
111
|
+
s.method = :get
|
112
|
+
s.block = lambda { |body| URI.extract(body)[-1] }
|
113
|
+
},
|
114
|
+
|
115
|
+
:lns => Service.new("ln-s.net") { |s|
|
116
|
+
s.method = :get
|
117
|
+
s.action = "/home/api.jsp"
|
118
|
+
s.block = lambda { |body| URI.extract(body)[0] }
|
119
|
+
},
|
120
|
+
|
121
|
+
:fyad => Service.new("fyad.org") { |s|
|
122
|
+
s.method = :get
|
123
|
+
s.block = lambda { |body| URI.extract(body).grep(/fyad.org/)[2] }
|
124
|
+
},
|
125
|
+
|
126
|
+
:d62 => Service.new("d62.net") { |s|
|
127
|
+
s.method = :get
|
128
|
+
s.block = lambda { |body| URI.extract(body)[0] }
|
129
|
+
},
|
130
|
+
|
131
|
+
:shiturl => Service.new("shiturl.com") { |s|
|
132
|
+
s.method = :get
|
133
|
+
s.action = "/make.php"
|
134
|
+
s.block = lambda { |body| URI.extract(body).grep(/shiturl/)[0] }
|
135
|
+
},
|
136
|
+
|
137
|
+
:littlink => Service.new("littlink.com") { |s|
|
138
|
+
s.block = lambda { |body| URI.extract(body).grep(/littlink/)[0] }
|
139
|
+
},
|
140
|
+
|
141
|
+
:clipurl => Service.new("clipurl.com") { |s|
|
142
|
+
s.action = "/create.asp"
|
143
|
+
s.block = lambda { |body| URI.extract(body).grep(/clipurl/)[0] }
|
144
|
+
},
|
145
|
+
|
146
|
+
:shortify => Service.new("shortify.com") { |s|
|
147
|
+
s.method = :get
|
148
|
+
s.action = "/shorten.php"
|
149
|
+
s.block = lambda { |body| URI.extract(body).grep(/shortify/)[0] }
|
150
|
+
},
|
151
|
+
|
152
|
+
:orz => Service.new("0rz.net") { |s|
|
153
|
+
s.action = "/create.php"
|
154
|
+
s.block = lambda { |body| URI.extract(body).grep(/0rz/)[0] }
|
155
|
+
},
|
156
|
+
|
157
|
+
:moourl => Service.new("moourl.com") { |s|
|
158
|
+
s.code = 302
|
159
|
+
s.action = "/create/"
|
160
|
+
s.method = :get
|
161
|
+
s.field = "source"
|
162
|
+
s.block = lambda { |body| body.gsub('Location/woot/?moo=','http://moourl.com/') }
|
163
|
+
},
|
164
|
+
|
165
|
+
:urltea => Service.new("urltea.com") { |s|
|
166
|
+
s.method = :get
|
167
|
+
s.action = "/create/"
|
168
|
+
s.block = lambda { |body| URI.extract(body).grep(/urltea/)[6] }
|
169
|
+
}
|
170
|
+
}
|
171
|
+
|
172
|
+
# Array containing symbols representing all the implemented URL
|
173
|
+
# shortening services
|
174
|
+
@@valid_services = @@services.keys
|
175
|
+
|
176
|
+
# Returns @@valid_services
|
177
|
+
def self.valid_services
|
178
|
+
@@valid_services
|
179
|
+
end
|
180
|
+
|
181
|
+
# Main method of ShortURL, its usage is quite simple, just give an
|
182
|
+
# url to shorten and an optional service. If no service is
|
183
|
+
# selected, RubyURL.com will be used. An invalid service symbol
|
184
|
+
# will raise an ArgumentError exception
|
185
|
+
#
|
186
|
+
# Valid +service+ values:
|
187
|
+
#
|
188
|
+
# * <tt>:rubyurl</tt>
|
189
|
+
# * <tt>:tinyurl</tt>
|
190
|
+
# * <tt>:shorl</tt>
|
191
|
+
# * <tt>:snipurl</tt>
|
192
|
+
# * <tt>:metamark</tt>
|
193
|
+
# * <tt>:makeashorterlink</tt>
|
194
|
+
# * <tt>:skinnylink</tt>
|
195
|
+
# * <tt>:linktrim</tt>
|
196
|
+
# * <tt>:shorterlink</tt>
|
197
|
+
# * <tt>:minlink</tt>
|
198
|
+
# * <tt>:lns</tt>
|
199
|
+
# * <tt>:fyad</tt>
|
200
|
+
# * <tt>:d62</tt>
|
201
|
+
# * <tt>:shiturl</tt>
|
202
|
+
# * <tt>:littlink</tt>
|
203
|
+
# * <tt>:clipurl</tt>
|
204
|
+
# * <tt>:shortify</tt>
|
205
|
+
# * <tt>:orz</tt>
|
206
|
+
#
|
207
|
+
# call-seq:
|
208
|
+
# ShortURL.shorten("http://mypage.com") => Uses RubyURL
|
209
|
+
# ShortURL.shorten("http://mypage.com", :tinyurl)
|
210
|
+
def self.shorten(url, service = :rubyurl)
|
211
|
+
if valid_services.include? service
|
212
|
+
@@services[service].call(url)
|
213
|
+
else
|
214
|
+
raise InvalidService
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
data/shorturl.gemspec
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{shorturl}
|
8
|
+
s.version = "0.8.9"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Robby Russell"]
|
12
|
+
s.date = %q{2009-09-09}
|
13
|
+
s.default_executable = %q{shorturl}
|
14
|
+
s.description = %q{Shortens URLs using services such as RubyURL, urlTea, and TinyURL}
|
15
|
+
s.email = %q{robby@planetargon.com}
|
16
|
+
s.executables = ["shorturl"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"ChangeLog",
|
19
|
+
"README"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
"ChangeLog",
|
23
|
+
"MIT-LICENSE",
|
24
|
+
"README",
|
25
|
+
"Rakefile",
|
26
|
+
"TODO",
|
27
|
+
"VERSION.yml",
|
28
|
+
"bin/shorturl",
|
29
|
+
"doc/classes/InvalidService.html",
|
30
|
+
"doc/classes/Service.html",
|
31
|
+
"doc/classes/Service.src/M000003.html",
|
32
|
+
"doc/classes/Service.src/M000004.html",
|
33
|
+
"doc/classes/ShortURL.html",
|
34
|
+
"doc/classes/ShortURL.src/M000001.html",
|
35
|
+
"doc/classes/ShortURL.src/M000002.html",
|
36
|
+
"doc/created.rid",
|
37
|
+
"doc/files/ChangeLog.html",
|
38
|
+
"doc/files/MIT-LICENSE.html",
|
39
|
+
"doc/files/README.html",
|
40
|
+
"doc/files/TODO.html",
|
41
|
+
"doc/files/lib/shorturl_rb.html",
|
42
|
+
"doc/fr_class_index.html",
|
43
|
+
"doc/fr_file_index.html",
|
44
|
+
"doc/fr_method_index.html",
|
45
|
+
"doc/index.html",
|
46
|
+
"doc/rdoc-style.css",
|
47
|
+
"examples/shorten.rb",
|
48
|
+
"lib/shorturl.rb",
|
49
|
+
"shorturl.gemspec",
|
50
|
+
"test/tc_service.rb",
|
51
|
+
"test/tc_shorturl.rb",
|
52
|
+
"test/ts_all.rb"
|
53
|
+
]
|
54
|
+
s.homepage = %q{http://github.com/robbyrussell/shorturl}
|
55
|
+
s.rdoc_options = ["--title", "ShortURL Documentation", "--main", "README", "-S", "-N", "--all"]
|
56
|
+
s.require_paths = ["lib"]
|
57
|
+
s.rubygems_version = %q{1.3.5}
|
58
|
+
s.summary = %q{Shortens URLs using services such as RubyURL, urlTea, and TinyURL}
|
59
|
+
s.test_files = [
|
60
|
+
"test/tc_service.rb",
|
61
|
+
"test/tc_shorturl.rb",
|
62
|
+
"test/ts_all.rb",
|
63
|
+
"examples/shorten.rb"
|
64
|
+
]
|
65
|
+
|
66
|
+
if s.respond_to? :specification_version then
|
67
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
68
|
+
s.specification_version = 3
|
69
|
+
|
70
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
71
|
+
else
|
72
|
+
end
|
73
|
+
else
|
74
|
+
end
|
75
|
+
end
|
data/test/tc_service.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# tc_service.rb
|
2
|
+
#
|
3
|
+
# Created by Vincent Foley on 2005-06-01
|
4
|
+
|
5
|
+
$test_lib_dir = File.join(File.dirname(__FILE__), "..", "lib")
|
6
|
+
$:.unshift($test_lib_dir)
|
7
|
+
|
8
|
+
require "test/unit"
|
9
|
+
require "shorturl"
|
10
|
+
|
11
|
+
|
12
|
+
class TestService < Test::Unit::TestCase
|
13
|
+
|
14
|
+
def test_call
|
15
|
+
service = Service.new("oasdasobf")
|
16
|
+
assert_raise(SocketError) { service.call(nil) }
|
17
|
+
|
18
|
+
service = Service.new("tinyurl.com") { |s|
|
19
|
+
s.code = 404
|
20
|
+
s.action = "/create.php"
|
21
|
+
s.block = lambda { |body|
|
22
|
+
URI.extract(body).grep(/tinyurl/)[-1]
|
23
|
+
}
|
24
|
+
}
|
25
|
+
assert_nil service.call("http://www.google.com")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_initialize
|
29
|
+
service = Service.new("rubyurl.com")
|
30
|
+
assert_equal(service.port, 80)
|
31
|
+
assert_equal(service.code, 200)
|
32
|
+
assert_equal(service.method, :post)
|
33
|
+
assert_equal(service.action, "/")
|
34
|
+
assert_equal(service.field, "url")
|
35
|
+
|
36
|
+
service = Service.new("rubyurl.com") { |s|
|
37
|
+
s.port = 8080
|
38
|
+
s.code = 302
|
39
|
+
s.method = :get
|
40
|
+
s.action = "/create.php"
|
41
|
+
s.field = "link"
|
42
|
+
}
|
43
|
+
assert_equal(service.port, 8080)
|
44
|
+
assert_equal(service.code, 302)
|
45
|
+
assert_equal(service.method, :get)
|
46
|
+
assert_equal(service.action, "/create.php")
|
47
|
+
assert_equal(service.field, "link")
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/test/tc_shorturl.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# tc_shortcut.rb
|
2
|
+
#
|
3
|
+
# Created by Vincent Foley on 2005-06-01
|
4
|
+
|
5
|
+
$test_lib_dir = File.join(File.dirname(__FILE__), "..", "lib")
|
6
|
+
$:.unshift($test_lib_dir)
|
7
|
+
|
8
|
+
require "test/unit"
|
9
|
+
require "shorturl"
|
10
|
+
|
11
|
+
class String
|
12
|
+
def url?
|
13
|
+
self[0..6].downcase == "http://"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class TestShortURL < Test::Unit::TestCase
|
18
|
+
def setup
|
19
|
+
@url = "http://groups.google.com/group/comp.lang.ruby/"
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_shorten
|
23
|
+
# Default service (RubyURL)
|
24
|
+
assert ShortURL.shorten(@url).url?
|
25
|
+
|
26
|
+
# All the services (I can't test exact URLs since they seem to
|
27
|
+
# # change semi regularly)
|
28
|
+
# ShortURL.valid_services.each do |service|
|
29
|
+
# assert ShortURL.shorten(@url, service).url?
|
30
|
+
# end
|
31
|
+
|
32
|
+
# An invalid service
|
33
|
+
assert_raise(InvalidService) { ShortURL.shorten(@url, :foobar) }
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,33 +1,61 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caleb-shorturl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robby Russell
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-09-09 00:00:00 -07:00
|
13
13
|
default_executable: shorturl
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description:
|
16
|
+
description: Shortens URLs using services such as RubyURL, urlTea, and TinyURL
|
17
17
|
email: robby@planetargon.com
|
18
18
|
executables:
|
19
19
|
- shorturl
|
20
20
|
extensions: []
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
|
+
- ChangeLog
|
23
24
|
- README
|
24
|
-
|
25
|
-
- MIT-LICENSE
|
25
|
+
files:
|
26
26
|
- ChangeLog
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
- MIT-LICENSE
|
28
|
+
- README
|
29
|
+
- Rakefile
|
30
|
+
- TODO
|
31
|
+
- VERSION.yml
|
32
|
+
- bin/shorturl
|
33
|
+
- doc/classes/InvalidService.html
|
34
|
+
- doc/classes/Service.html
|
35
|
+
- doc/classes/Service.src/M000003.html
|
36
|
+
- doc/classes/Service.src/M000004.html
|
37
|
+
- doc/classes/ShortURL.html
|
38
|
+
- doc/classes/ShortURL.src/M000001.html
|
39
|
+
- doc/classes/ShortURL.src/M000002.html
|
40
|
+
- doc/created.rid
|
41
|
+
- doc/files/ChangeLog.html
|
42
|
+
- doc/files/MIT-LICENSE.html
|
43
|
+
- doc/files/README.html
|
44
|
+
- doc/files/TODO.html
|
45
|
+
- doc/files/lib/shorturl_rb.html
|
46
|
+
- doc/fr_class_index.html
|
47
|
+
- doc/fr_file_index.html
|
48
|
+
- doc/fr_method_index.html
|
49
|
+
- doc/index.html
|
50
|
+
- doc/rdoc-style.css
|
51
|
+
- examples/shorten.rb
|
52
|
+
- lib/shorturl.rb
|
53
|
+
- shorturl.gemspec
|
54
|
+
- test/tc_service.rb
|
55
|
+
- test/tc_shorturl.rb
|
56
|
+
- test/ts_all.rb
|
57
|
+
has_rdoc: false
|
58
|
+
homepage: http://github.com/robbyrussell/shorturl
|
31
59
|
post_install_message:
|
32
60
|
rdoc_options:
|
33
61
|
- --title
|
@@ -56,7 +84,10 @@ requirements: []
|
|
56
84
|
rubyforge_project:
|
57
85
|
rubygems_version: 1.2.0
|
58
86
|
signing_key:
|
59
|
-
specification_version:
|
87
|
+
specification_version: 3
|
60
88
|
summary: Shortens URLs using services such as RubyURL, urlTea, and TinyURL
|
61
89
|
test_files:
|
90
|
+
- test/tc_service.rb
|
91
|
+
- test/tc_shorturl.rb
|
62
92
|
- test/ts_all.rb
|
93
|
+
- examples/shorten.rb
|