guillotine 1.0.2 → 1.0.3
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/riak_adapter.rb +20 -4
- data/lib/guillotine/app.rb +2 -1
- data/lib/guillotine.rb +1 -1
- data/test/app_test.rb +11 -0
- data/test/riak_adapter_test.rb +5 -3
- data/test/sequel_adapter_test.rb +3 -2
- metadata +9 -9
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 = '1.0.
|
17
|
-
s.date = '2011-10
|
16
|
+
s.version = '1.0.3'
|
17
|
+
s.date = '2011-11-10'
|
18
18
|
s.rubyforge_project = 'guillotine'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
@@ -4,6 +4,7 @@ module Guillotine
|
|
4
4
|
module Adapters
|
5
5
|
# Stores shortened URLs in Riak. Totally scales.
|
6
6
|
class RiakAdapter < Adapter
|
7
|
+
PLAIN = 'text/plain'.freeze
|
7
8
|
attr_reader :code_bucket, :url_bucket
|
8
9
|
|
9
10
|
# Initializes the adapter.
|
@@ -27,11 +28,13 @@ module Guillotine
|
|
27
28
|
sha = url_key url
|
28
29
|
url_obj = @url_bucket.get_or_new sha, :r => 1
|
29
30
|
if url_obj.data
|
31
|
+
fix_url_object(url_obj)
|
30
32
|
code = url_obj.data
|
31
33
|
end
|
32
34
|
|
33
|
-
code
|
34
|
-
code_obj
|
35
|
+
code ||= shorten url
|
36
|
+
code_obj = @code_bucket.get_or_new code
|
37
|
+
code_obj.content_type = url_obj.content_type = PLAIN
|
35
38
|
|
36
39
|
if existing_url = code_obj.data # key exists
|
37
40
|
raise DuplicateCodeError.new(existing_url, url, code) if existing_url != url
|
@@ -42,7 +45,6 @@ module Guillotine
|
|
42
45
|
url_obj.store
|
43
46
|
end
|
44
47
|
|
45
|
-
code_obj.content_type = url_obj.content_type = 'text/plain'
|
46
48
|
code_obj.data = url
|
47
49
|
code_obj.store
|
48
50
|
code
|
@@ -100,11 +102,25 @@ module Guillotine
|
|
100
102
|
# Returns a Riak::RObject, or nil if none is found.
|
101
103
|
def code_object(url)
|
102
104
|
sha = url_key url
|
103
|
-
@url_bucket.get(sha, :r => 1)
|
105
|
+
if o = @url_bucket.get(sha, :r => 1)
|
106
|
+
fix_url_object(o)
|
107
|
+
end
|
104
108
|
rescue Riak::FailedRequest => err
|
105
109
|
raise unless err.not_found?
|
106
110
|
end
|
107
111
|
|
112
|
+
# Fixes a bug in Guillotine 1.0.2 where the content type on url objects
|
113
|
+
# were not being set. The ruby Riak::Client defaults to JSON, so
|
114
|
+
# strings were being saved as "somecode", which is unparseable by JSON.
|
115
|
+
def fix_url_object(obj)
|
116
|
+
if obj.content_type != PLAIN
|
117
|
+
obj.content_type = PLAIN
|
118
|
+
obj.data = JSON.parse(%({"data":#{obj.raw_data}}))['data']
|
119
|
+
obj.store
|
120
|
+
end
|
121
|
+
obj
|
122
|
+
end
|
123
|
+
|
108
124
|
def url_key(url)
|
109
125
|
Digest::SHA1.hexdigest url
|
110
126
|
end
|
data/lib/guillotine/app.rb
CHANGED
@@ -6,7 +6,8 @@ module Guillotine
|
|
6
6
|
|
7
7
|
get "/:code" do
|
8
8
|
code = params[:code]
|
9
|
-
|
9
|
+
puts code.inspect
|
10
|
+
if url = settings.db.find(Addressable::URI.escape(code))
|
10
11
|
redirect settings.db.parse_url(url).to_s
|
11
12
|
else
|
12
13
|
halt 404, "No url found for #{code}"
|
data/lib/guillotine.rb
CHANGED
data/test/app_test.rb
CHANGED
@@ -38,6 +38,17 @@ class AppTest < Guillotine::TestCase
|
|
38
38
|
assert_equal url, last_response.headers['Location']
|
39
39
|
end
|
40
40
|
|
41
|
+
def test_adds_url_with_custom_code
|
42
|
+
url = 'http://github.com/abc'
|
43
|
+
post '/', :url => url, :code => '%E2%9C%88'
|
44
|
+
assert code_url = last_response.headers['Location']
|
45
|
+
assert_match /\/%E2%9C%88$/, code_url
|
46
|
+
|
47
|
+
get "/%E2%9C%88"
|
48
|
+
assert_equal 302, last_response.status
|
49
|
+
assert_equal url, last_response.headers['Location']
|
50
|
+
end
|
51
|
+
|
41
52
|
def test_redirects_to_split_url
|
42
53
|
url = "http://abc.com\nhttp//def.com"
|
43
54
|
ADAPTER.hash['split'] = url
|
data/test/riak_adapter_test.rb
CHANGED
@@ -37,11 +37,12 @@ begin
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_adds_url_with_custom_code
|
40
|
-
|
41
|
-
assert_equal
|
40
|
+
code = '%E2%9C%88'
|
41
|
+
assert_equal code, @db.add('def', code)
|
42
|
+
assert_equal 'def', @db.find(code)
|
42
43
|
|
43
44
|
URL_BUCKET.delete Digest::SHA1.hexdigest('def')
|
44
|
-
CODE_BUCKET.delete
|
45
|
+
CODE_BUCKET.delete code
|
45
46
|
end
|
46
47
|
|
47
48
|
def test_adds_url_with_missing_url_key
|
@@ -49,6 +50,7 @@ begin
|
|
49
50
|
code = "#{url}_code"
|
50
51
|
sha = @db.url_key url
|
51
52
|
url_obj = URL_BUCKET.new sha
|
53
|
+
url_obj.content_type = Guillotine::Adapters::RiakAdapter::PLAIN
|
52
54
|
url_obj.data = code
|
53
55
|
url_obj.store
|
54
56
|
|
data/test/sequel_adapter_test.rb
CHANGED
@@ -21,8 +21,9 @@ begin
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_adds_url_with_custom_code
|
24
|
-
|
25
|
-
assert_equal
|
24
|
+
code = '%E2%9C%88'
|
25
|
+
assert_equal code, @db.add('def', code)
|
26
|
+
assert_equal 'def', @db.find(code)
|
26
27
|
end
|
27
28
|
|
28
29
|
def test_clashing_urls_raises_error
|
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: 1.0.
|
4
|
+
version: 1.0.3
|
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-10
|
12
|
+
date: 2011-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &70136291836120 !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: *70136291836120
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: addressable
|
27
|
-
requirement: &
|
27
|
+
requirement: &70136291835380 !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: *70136291835380
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rack-test
|
38
|
-
requirement: &
|
38
|
+
requirement: &70136291834680 !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: *70136291834680
|
47
47
|
description: Adaptable private URL shortener
|
48
48
|
email: technoweenie@gmail.com
|
49
49
|
executables: []
|
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
88
|
version: '0'
|
89
89
|
requirements: []
|
90
90
|
rubyforge_project: guillotine
|
91
|
-
rubygems_version: 1.8.
|
91
|
+
rubygems_version: 1.8.11
|
92
92
|
signing_key:
|
93
93
|
specification_version: 2
|
94
94
|
summary: Adaptable private URL shortener
|