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 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