guillotine 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
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.2'
17
- s.date = '2011-10-11'
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 ||= shorten url
34
- code_obj = @code_bucket.get_or_new code
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
@@ -6,7 +6,8 @@ module Guillotine
6
6
 
7
7
  get "/:code" do
8
8
  code = params[:code]
9
- if url = settings.db.find(code)
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
@@ -3,7 +3,7 @@ require 'digest/md5'
3
3
  require 'addressable/uri'
4
4
 
5
5
  module Guillotine
6
- VERSION = "1.0.2"
6
+ VERSION = "1.0.3"
7
7
 
8
8
  dir = File.expand_path '../guillotine', __FILE__
9
9
  autoload :App, "#{dir}/app"
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
@@ -37,11 +37,12 @@ begin
37
37
  end
38
38
 
39
39
  def test_adds_url_with_custom_code
40
- assert_equal 'code', @db.add('def', 'code')
41
- assert_equal 'def', @db.find('code')
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 'code'
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
 
@@ -21,8 +21,9 @@ begin
21
21
  end
22
22
 
23
23
  def test_adds_url_with_custom_code
24
- assert_equal 'code', @db.add('def', 'code')
25
- assert_equal 'def', @db.find('code')
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.2
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-11 00:00:00.000000000Z
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: &70100650093440 !ruby/object:Gem::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: *70100650093440
24
+ version_requirements: *70136291836120
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: addressable
27
- requirement: &70100650092860 !ruby/object:Gem::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: *70100650092860
35
+ version_requirements: *70136291835380
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rack-test
38
- requirement: &70100650092080 !ruby/object:Gem::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: *70100650092080
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.10
91
+ rubygems_version: 1.8.11
92
92
  signing_key:
93
93
  specification_version: 2
94
94
  summary: Adaptable private URL shortener