guillotine 0.1.2 → 0.2.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/guillotine.gemspec +2 -2
- data/lib/guillotine/adapters/active_record_adapter.rb +20 -0
- data/lib/guillotine/adapters/memory_adapter.rb +21 -1
- data/lib/guillotine/adapters/riak_adapter.rb +50 -2
- data/lib/guillotine/adapters/sequel_adapter.rb +20 -0
- data/lib/guillotine.rb +1 -1
- data/test/active_record_adapter_test.rb +14 -0
- data/test/memory_adapter_test.rb +14 -0
- data/test/riak_adapter_test.rb +23 -0
- data/test/sequel_adapter_test.rb +5 -0
- metadata +8 -8
data/guillotine.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'guillotine'
|
16
|
-
s.version = '0.
|
17
|
-
s.date = '2011-08-
|
16
|
+
s.version = '0.2.0'
|
17
|
+
s.date = '2011-08-18'
|
18
18
|
s.rubyforge_project = 'guillotine'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
@@ -43,6 +43,26 @@ module Guillotine
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
# Public: Retrieves the code for a given URL.
|
47
|
+
#
|
48
|
+
# url - The String URL to lookup.
|
49
|
+
#
|
50
|
+
# Returns the String code, or nil if none is found.
|
51
|
+
def code_for(url)
|
52
|
+
if row = Url.select(:code).where(:url => url).first
|
53
|
+
row[:code]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Public: Removes the assigned short code for a URL.
|
58
|
+
#
|
59
|
+
# url - The String URL to remove.
|
60
|
+
#
|
61
|
+
# Returns nothing.
|
62
|
+
def clear(url)
|
63
|
+
Url.where(:url => url).delete
|
64
|
+
end
|
65
|
+
|
46
66
|
def setup
|
47
67
|
conn = Url.connection
|
48
68
|
conn.create_table :urls do |t|
|
@@ -32,10 +32,30 @@ module Guillotine
|
|
32
32
|
#
|
33
33
|
# code - The String code to lookup the URL.
|
34
34
|
#
|
35
|
-
# Returns the String URL.
|
35
|
+
# Returns the String URL, or nil if none is found.
|
36
36
|
def find(code)
|
37
37
|
@hash[code]
|
38
38
|
end
|
39
|
+
|
40
|
+
# Public: Retrieves the code for a given URL.
|
41
|
+
#
|
42
|
+
# url - The String URL to lookup.
|
43
|
+
#
|
44
|
+
# Returns the String code, or nil if none is found.
|
45
|
+
def code_for(url)
|
46
|
+
@urls[url]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Public: Removes the assigned short code for a URL.
|
50
|
+
#
|
51
|
+
# url - The String URL to remove.
|
52
|
+
#
|
53
|
+
# Returns nothing.
|
54
|
+
def clear(url)
|
55
|
+
if code = @urls.delete(url)
|
56
|
+
@hash.delete code
|
57
|
+
end
|
58
|
+
end
|
39
59
|
end
|
40
60
|
end
|
41
61
|
end
|
@@ -24,7 +24,7 @@ module Guillotine
|
|
24
24
|
# Returns the unique String code for the URL. If the URL is added
|
25
25
|
# multiple times, this should return the same code.
|
26
26
|
def add(url, code = nil)
|
27
|
-
sha =
|
27
|
+
sha = url_key url
|
28
28
|
url_obj = @url_bucket.get_or_new sha, :r => 1
|
29
29
|
url_obj.data || begin
|
30
30
|
code ||= shorten url
|
@@ -47,12 +47,60 @@ module Guillotine
|
|
47
47
|
#
|
48
48
|
# Returns the String URL.
|
49
49
|
def find(code)
|
50
|
-
if obj =
|
50
|
+
if obj = url_object(code)
|
51
51
|
obj.data
|
52
52
|
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Public: Retrieves the code for a given URL.
|
56
|
+
#
|
57
|
+
# url - The String URL to lookup.
|
58
|
+
#
|
59
|
+
# Returns the String code, or nil if none is found.
|
60
|
+
def code_for(url)
|
61
|
+
if obj = code_object(url)
|
62
|
+
obj.data
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Public: Removes the assigned short code for a URL.
|
67
|
+
#
|
68
|
+
# url - The String URL to remove.
|
69
|
+
#
|
70
|
+
# Returns nothing.
|
71
|
+
def clear(url)
|
72
|
+
if code_obj = code_object(url)
|
73
|
+
@url_bucket.delete code_obj.key
|
74
|
+
@code_bucket.delete code_obj.data
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Retrieves a URL riak value from the code.
|
79
|
+
#
|
80
|
+
# code - The String code to lookup the URL.
|
81
|
+
#
|
82
|
+
# Returns a Riak::RObject, or nil if none is found.
|
83
|
+
def url_object(code)
|
84
|
+
@code_bucket.get(code, :r => 1)
|
85
|
+
rescue Riak::FailedRequest => err
|
86
|
+
raise unless err.not_found?
|
87
|
+
end
|
88
|
+
|
89
|
+
# Retrieves the code riak value for a given URL.
|
90
|
+
#
|
91
|
+
# url - The String URL to lookup.
|
92
|
+
#
|
93
|
+
# Returns a Riak::RObject, or nil if none is found.
|
94
|
+
def code_object(url)
|
95
|
+
sha = url_key url
|
96
|
+
@url_bucket.get(sha, :r => 1)
|
53
97
|
rescue Riak::FailedRequest => err
|
54
98
|
raise unless err.not_found?
|
55
99
|
end
|
100
|
+
|
101
|
+
def url_key(url)
|
102
|
+
Digest::SHA1.hexdigest url
|
103
|
+
end
|
56
104
|
end
|
57
105
|
end
|
58
106
|
end
|
@@ -42,6 +42,26 @@ module Guillotine
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
# Public: Retrieves the code for a given URL.
|
46
|
+
#
|
47
|
+
# url - The String URL to lookup.
|
48
|
+
#
|
49
|
+
# Returns the String code, or nil if none is found.
|
50
|
+
def code_for(url)
|
51
|
+
if row = @table.select(:code).where(:url => url).first
|
52
|
+
row[:code]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Public: Removes the assigned short code for a URL.
|
57
|
+
#
|
58
|
+
# url - The String URL to remove.
|
59
|
+
#
|
60
|
+
# Returns nothing.
|
61
|
+
def clear(url)
|
62
|
+
@table.where(:url => url).delete
|
63
|
+
end
|
64
|
+
|
45
65
|
def setup
|
46
66
|
@db.create_table :urls do
|
47
67
|
string :url
|
data/lib/guillotine.rb
CHANGED
@@ -35,6 +35,20 @@ begin
|
|
35
35
|
def test_missing_code
|
36
36
|
assert_nil @db.find('missing')
|
37
37
|
end
|
38
|
+
|
39
|
+
def test_gets_code_for_url
|
40
|
+
code = @db.add 'abc'
|
41
|
+
assert_equal code, @db.code_for('abc')
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_clears_code_for_url
|
45
|
+
code = @db.add 'abc'
|
46
|
+
assert_equal 'abc', @db.find(code)
|
47
|
+
|
48
|
+
@db.clear 'abc'
|
49
|
+
|
50
|
+
assert_nil @db.find(code)
|
51
|
+
end
|
38
52
|
end
|
39
53
|
rescue LoadError
|
40
54
|
puts "skipping ActiveRecord tests: #{$!}"
|
data/test/memory_adapter_test.rb
CHANGED
@@ -30,4 +30,18 @@ class MemoryAdapterTest < Guillotine::TestCase
|
|
30
30
|
def test_missing_code
|
31
31
|
assert_nil @db.find('missing')
|
32
32
|
end
|
33
|
+
|
34
|
+
def test_gets_code_for_url
|
35
|
+
code = @db.add 'abc'
|
36
|
+
assert_equal code, @db.code_for('abc')
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_clears_code_for_url
|
40
|
+
code = @db.add 'abc'
|
41
|
+
assert_equal 'abc', @db.find(code)
|
42
|
+
|
43
|
+
@db.clear 'abc'
|
44
|
+
|
45
|
+
assert_nil @db.find(code)
|
46
|
+
end
|
33
47
|
end
|
data/test/riak_adapter_test.rb
CHANGED
@@ -58,6 +58,29 @@ begin
|
|
58
58
|
def test_missing_code
|
59
59
|
assert_nil @db.find('missing')
|
60
60
|
end
|
61
|
+
|
62
|
+
def test_gets_code_for_url
|
63
|
+
code = @db.add 'abc'
|
64
|
+
assert_equal code, @db.code_for('abc')
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_clears_code_for_url
|
68
|
+
code = @db.add 'abc'
|
69
|
+
assert_equal 'abc', @db.find(code)
|
70
|
+
|
71
|
+
@db.clear 'abc'
|
72
|
+
|
73
|
+
assert_nil @db.find(code)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_clears_code_for_url
|
77
|
+
code = @db.add 'abc'
|
78
|
+
assert_equal 'abc', @db.find(code)
|
79
|
+
|
80
|
+
@db.clear 'abc'
|
81
|
+
|
82
|
+
assert_nil @db.find(code)
|
83
|
+
end
|
61
84
|
end
|
62
85
|
rescue LoadError
|
63
86
|
puts "Skipping Riak tests: #{$!}"
|
data/test/sequel_adapter_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guillotine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-18 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &70098598402440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.2.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70098598402440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: addressable
|
27
|
-
requirement: &
|
27
|
+
requirement: &70098598401980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.2.6
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70098598401980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rack-test
|
38
|
-
requirement: &
|
38
|
+
requirement: &70098598401600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70098598401600
|
47
47
|
description: Adaptable private URL shortener
|
48
48
|
email: technoweenie@gmail.com
|
49
49
|
executables: []
|