firefly 1.2.2 → 1.3.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/Gemfile +4 -0
- data/Gemfile.lock +53 -0
- data/HISTORY +15 -8
- data/README.md +23 -24
- data/Rakefile +3 -29
- data/config.ru.example +4 -4
- data/firefly.gemspec +24 -96
- data/firefly_test.sqlite3-journal +0 -0
- data/lib/firefly.rb +2 -1
- data/lib/firefly/code_factory.rb +23 -0
- data/lib/firefly/server.rb +77 -69
- data/lib/firefly/url.rb +25 -11
- data/lib/firefly/version.rb +2 -2
- data/public/style.css +3 -3
- data/spec/firefly/api_spec.rb +33 -33
- data/spec/firefly/base62_spec.rb +1 -1
- data/spec/firefly/code_factory_spec.rb +12 -0
- data/spec/firefly/server_spec.rb +11 -11
- data/spec/firefly/url_spec.rb +24 -12
- data/spec/spec_helper.rb +4 -1
- data/views/error.haml +11 -0
- data/views/index.haml +5 -14
- data/views/info.haml +3 -3
- data/views/layout.haml +4 -6
- metadata +23 -11
data/spec/firefly/base62_spec.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CodeFactory" do
|
4
|
+
|
5
|
+
describe "next!" do
|
6
|
+
it "should return the next code_count" do
|
7
|
+
current_count = Firefly::CodeFactory.first.count
|
8
|
+
expected_code = Firefly::Base62.encode(current_count + 1)
|
9
|
+
Firefly::CodeFactory.next_code!.should eql(expected_code)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/spec/firefly/server_spec.rb
CHANGED
@@ -6,13 +6,13 @@ describe "Firefly" do
|
|
6
6
|
def app
|
7
7
|
@@app
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
describe "/" do
|
11
11
|
it "should respond ok" do
|
12
12
|
get '/'
|
13
13
|
last_response.should be_ok
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
16
16
|
|
17
17
|
|
18
18
|
if defined? Barby
|
@@ -41,33 +41,33 @@ describe "Firefly" do
|
|
41
41
|
describe "redirecting" do
|
42
42
|
it "should redirect to the original URL" do
|
43
43
|
fake = Firefly::Url.create(:url => 'http://example.com/123', :code => 'alpha')
|
44
|
-
|
44
|
+
|
45
45
|
get '/alpha'
|
46
46
|
follow_redirect!
|
47
|
-
|
47
|
+
|
48
48
|
last_request.url.should eql('http://example.com/123')
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
it "should increase the visits counter" do
|
52
52
|
fake = Firefly::Url.create(:url => 'http://example.com/123', :code => 'alpha')
|
53
53
|
Firefly::Url.should_receive(:first).and_return(fake)
|
54
|
-
|
54
|
+
|
55
55
|
lambda {
|
56
56
|
get '/alpha'
|
57
57
|
}.should change(fake, :clicks).by(1)
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it "should redirect with a 301 Permanent redirect" do
|
61
61
|
fake = Firefly::Url.create(:url => 'http://example.com/123', :code => 'alpha')
|
62
|
-
|
62
|
+
|
63
63
|
get '/alpha'
|
64
|
-
|
64
|
+
|
65
65
|
last_response.status.should eql(301)
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
it "should throw a 404 when the code is unknown" do
|
69
69
|
get '/some_random_code_that_does_not_exist'
|
70
|
-
|
70
|
+
|
71
71
|
last_response.status.should eql(404)
|
72
72
|
end
|
73
73
|
end
|
data/spec/firefly/url_spec.rb
CHANGED
@@ -1,37 +1,37 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
describe "Url" do
|
4
|
-
|
4
|
+
|
5
5
|
describe "shortening" do
|
6
6
|
it "should generate a code after create" do
|
7
7
|
url = Firefly::Url.shorten("http://example.com/")
|
8
8
|
Firefly::Url.first(:url => "http://example.com/").code.should_not be_nil
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it "should set a clicks count of 0 for newly shortened urls" do
|
12
12
|
url = Firefly::Url.shorten("http://example.com/")
|
13
13
|
Firefly::Url.first(:url => "http://example.com/").clicks.should eql(0)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it "should create a new Firefly::Url with a new long_url" do
|
17
17
|
lambda {
|
18
18
|
Firefly::Url.shorten("http://example.com/")
|
19
19
|
}.should change(Firefly::Url, :count).by(1)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it "should return an existing Firefly::Url if the long_url exists" do
|
23
23
|
Firefly::Url.shorten("http://example.com/")
|
24
24
|
lambda {
|
25
25
|
Firefly::Url.shorten("http://example.com/")
|
26
26
|
}.should_not change(Firefly::Url, :count)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
it "should normalize urls correctly" do
|
30
30
|
# Note the trailing '/'
|
31
31
|
Firefly::Url.shorten("http://example.com/")
|
32
32
|
lambda {
|
33
33
|
Firefly::Url.shorten("http://example.com")
|
34
|
-
}.should_not change(Firefly::Url, :count)
|
34
|
+
}.should_not change(Firefly::Url, :count)
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should shortend urls containing spaces" do
|
@@ -55,8 +55,18 @@ describe "Url" do
|
|
55
55
|
url = Firefly::Url.shorten("http://example.com/?a=\11\15")
|
56
56
|
url.url.should eql("http://example.com/?a=%09%0D")
|
57
57
|
end
|
58
|
+
|
59
|
+
it "should automatically forward code to prevent duplicates" do
|
60
|
+
url = Firefly::Url.shorten("http://example.com/")
|
61
|
+
the_code = url.code.next
|
62
|
+
Firefly::Url.create(:url => "http://example.com/blah", :code => the_code)
|
63
|
+
|
64
|
+
url_correct = Firefly::Url.shorten("http://example.com/testit")
|
65
|
+
url_correct.code.should_not eql(the_code)
|
66
|
+
url_correct.code.should eql(the_code.next)
|
67
|
+
end
|
58
68
|
end
|
59
|
-
|
69
|
+
|
60
70
|
describe "long url validation" do
|
61
71
|
[ "http://ariejan.net",
|
62
72
|
"https://ariejan.net",
|
@@ -68,18 +78,20 @@ describe "Url" do
|
|
68
78
|
Firefly::Url.shorten(url).should_not be_nil
|
69
79
|
end
|
70
80
|
end
|
71
|
-
|
81
|
+
|
72
82
|
[ "ftp://ariejan.net",
|
73
83
|
"irc://freenode.org/rails",
|
74
84
|
"skype:adevroom",
|
75
85
|
"ariejan.net",
|
76
86
|
].each do |url|
|
77
87
|
it "should not accept #{url}" do
|
78
|
-
|
88
|
+
lambda {
|
89
|
+
Firefly::Url.shorten(url).should be_nil
|
90
|
+
}.should raise_error(Firefly::InvalidUrlError)
|
79
91
|
end
|
80
|
-
end
|
92
|
+
end
|
81
93
|
end
|
82
|
-
|
94
|
+
|
83
95
|
describe "clicking" do
|
84
96
|
before(:each) do
|
85
97
|
Firefly::Url.create(
|
@@ -89,7 +101,7 @@ describe "Url" do
|
|
89
101
|
)
|
90
102
|
@url = Firefly::Url.first(:code => 'alpha')
|
91
103
|
end
|
92
|
-
|
104
|
+
|
93
105
|
it "should increase the click count" do
|
94
106
|
lambda {
|
95
107
|
@url.register_click!
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'firefly.rb')
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
+
require "bundler/setup"
|
5
|
+
|
4
6
|
require 'sinatra'
|
5
7
|
require 'rack/test'
|
6
8
|
require 'spec'
|
@@ -17,7 +19,7 @@ set :logging, false
|
|
17
19
|
@@app = Firefly::Server.new do
|
18
20
|
set :hostname, "test.host"
|
19
21
|
set :api_key, "test"
|
20
|
-
set :database, "
|
22
|
+
set :database, "mysql://root@localhost/firefly_test"
|
21
23
|
end
|
22
24
|
|
23
25
|
Spec::Runner.configure do |config|
|
@@ -34,6 +36,7 @@ Spec::Runner.configure do |config|
|
|
34
36
|
config.before(:each) do
|
35
37
|
repository do |r|
|
36
38
|
transaction = DataMapper::Transaction.new(r)
|
39
|
+
Firefly::CodeFactory.first.update(:count => 0)
|
37
40
|
transaction.begin
|
38
41
|
r.adapter.push_transaction(transaction)
|
39
42
|
end
|
data/views/error.haml
ADDED
data/views/index.haml
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
- if @authenticated
|
2
|
-
|
3
2
|
.sidebox
|
4
3
|
%h2 Bookmarklet
|
5
4
|
|
@@ -7,9 +6,9 @@
|
|
7
6
|
Drag the following link to your bookmarks. Click it to shorten the URL to the page you're currently viewing.
|
8
7
|
%p
|
9
8
|
%a{ :href => "javascript:var%20d=document,w=window,enc=encodeURIComponent,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),s2=((s.toString()=='')?s:('%22'+enc(s)+'%22')),key=enc('#{@config[:api_key]}'),f='http://#{@config[:hostname]}/api/add',l=d.location,p='?visual=1&api_key='+key+'&url='+enc(l.href),u=f+p;try{if(!/^(.*\.)?tumblrzzz[^.]*$/.test(l.host))throw(0);tstbklt();}catch(z){a%20=function(){if(!w.open(u))l.href=u;};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();}void(0)" } Shorten with #{@config[:hostname]}
|
10
|
-
|
9
|
+
|
11
10
|
%h1 How about shortening a URL?
|
12
|
-
|
11
|
+
|
13
12
|
.the_form
|
14
13
|
%form{ :action => '/api/add', :method => 'post' }
|
15
14
|
%input{ :type => "hidden", :name => "visual", :value => "1" }
|
@@ -19,18 +18,10 @@
|
|
19
18
|
%input.big_url{ :type => 'text', :placeholder => "Optional short code", :name => 'short', :id => 'short', :size => 20, :autocomplete => "off", :spellcheck => 'false' }
|
20
19
|
%p
|
21
20
|
%input.big_url{ :type => 'submit', :name => 'submit', :id => 'submit', :value => "Make it short!" }
|
22
|
-
|
23
|
-
- if @error
|
24
|
-
%h2 Whoops!
|
25
|
-
|
26
|
-
%p
|
27
|
-
The URL you posted is invalid. Please post a valid HTTP url, including the protocol (http://) prefix.
|
28
21
|
|
29
|
-
%p= @url
|
30
|
-
|
31
22
|
- if @highlight
|
32
23
|
%h2 Your short URL
|
33
|
-
|
24
|
+
|
34
25
|
%table
|
35
26
|
%tr
|
36
27
|
%td.label Short URL
|
@@ -60,14 +51,14 @@
|
|
60
51
|
- @urls.each do |url|
|
61
52
|
%tr{ :class => is_highlighted?(url) ? 'highlighted' : '' }
|
62
53
|
%td.value
|
63
|
-
%input{ :type => "text", :value => short_url(url), :class => 'short_url', :size =>
|
54
|
+
%input{ :type => "text", :value => short_url(url), :class => 'short_url', :size => 31 }
|
64
55
|
%td.value.fill <a href="#{url.url}">#{url.url}</a>
|
65
56
|
%td.value.center= url.clicks
|
66
57
|
%td.value= url.created_at.strftime("%Y-%m-%d %H:%M")
|
67
58
|
%td.value
|
68
59
|
%a{ :href => "http://twitter.com/home?status=#{tweet(short_url(url))}" }
|
69
60
|
%img.twitter{ :src => "/images/twitter.png", :width => "16", :height => "16" }
|
70
|
-
|
61
|
+
|
71
62
|
:javascript
|
72
63
|
$(document).ready(function() {
|
73
64
|
$('input.short_url').each(function(index) {
|
data/views/info.haml
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
%td.label Full URL
|
10
10
|
%td.label Clicks
|
11
11
|
%td.label Shortened at
|
12
|
-
|
12
|
+
|
13
13
|
%tr
|
14
14
|
%td.value
|
15
15
|
%input{ :type => "text", :value => short_url(@url), :class => 'short_url', :size => 21 }
|
@@ -21,6 +21,6 @@
|
|
21
21
|
$(document).ready(function() {
|
22
22
|
$('input.short_url').each(function(index) {
|
23
23
|
$(this).mouseup(function() { $(this).select(); });
|
24
|
-
});
|
24
|
+
});
|
25
25
|
});
|
26
|
-
|
26
|
+
|
data/views/layout.haml
CHANGED
@@ -8,13 +8,11 @@
|
|
8
8
|
%script{ :type => "text/javascript", :src => u('jquery-1.4.2.min.js') }
|
9
9
|
%body
|
10
10
|
.header
|
11
|
-
%
|
12
|
-
|
13
|
-
%a{ :href => '/' } #{@title}
|
14
|
-
|
11
|
+
%h1= @title
|
12
|
+
|
15
13
|
#main
|
16
14
|
= yield
|
17
|
-
|
15
|
+
|
18
16
|
#footer
|
19
17
|
%p
|
20
|
-
Powered by <a href="http://github.com/ariejan/firefly">Firefly</a> v#{Firefly::
|
18
|
+
Powered by <a href="http://github.com/ariejan/firefly">Firefly</a> v#{Firefly::VERSION} | <a href="http://github.com/ariejan/firefly/tree/v#{Firefly::VERSION}">Source</a> | <a href="http://github.com/ariejan/firefly/issues">Issues</a> | Export <a href="/api/export.csv">CSV</a>, <a href="/api/export.yml">YAML</a> or <a href="/api/export.xml">XML</a>
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 1.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ariejan de Vroom
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01
|
18
|
+
date: 2011-02-01 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
type: :runtime
|
99
99
|
version_requirements: *id005
|
100
100
|
- !ruby/object:Gem::Dependency
|
101
|
-
name: dm-
|
101
|
+
name: dm-mysql-adapter
|
102
102
|
prerelease: false
|
103
103
|
requirement: &id006 !ruby/object:Gem::Requirement
|
104
104
|
none: false
|
@@ -162,16 +162,18 @@ dependencies:
|
|
162
162
|
type: :development
|
163
163
|
version_requirements: *id009
|
164
164
|
description: FireFly is a simple URL shortner for personal use. It's powered by Sinatra and can be run with any Rack-capable web server.
|
165
|
-
email:
|
165
|
+
email:
|
166
|
+
- ariejan@ariejan.net
|
166
167
|
executables: []
|
167
168
|
|
168
169
|
extensions: []
|
169
170
|
|
170
|
-
extra_rdoc_files:
|
171
|
-
|
172
|
-
- README.md
|
171
|
+
extra_rdoc_files: []
|
172
|
+
|
173
173
|
files:
|
174
174
|
- .gitignore
|
175
|
+
- Gemfile
|
176
|
+
- Gemfile.lock
|
175
177
|
- HISTORY
|
176
178
|
- LICENSE
|
177
179
|
- README.md
|
@@ -179,8 +181,10 @@ files:
|
|
179
181
|
- VERSION
|
180
182
|
- config.ru.example
|
181
183
|
- firefly.gemspec
|
184
|
+
- firefly_test.sqlite3-journal
|
182
185
|
- lib/firefly.rb
|
183
186
|
- lib/firefly/base62.rb
|
187
|
+
- lib/firefly/code_factory.rb
|
184
188
|
- lib/firefly/config.rb
|
185
189
|
- lib/firefly/server.rb
|
186
190
|
- lib/firefly/url.rb
|
@@ -195,11 +199,13 @@ files:
|
|
195
199
|
- spec/files/export.yml
|
196
200
|
- spec/firefly/api_spec.rb
|
197
201
|
- spec/firefly/base62_spec.rb
|
202
|
+
- spec/firefly/code_factory_spec.rb
|
198
203
|
- spec/firefly/server_spec.rb
|
199
204
|
- spec/firefly/url_spec.rb
|
200
205
|
- spec/fixtures/urls.yml
|
201
206
|
- spec/spec.opts
|
202
207
|
- spec/spec_helper.rb
|
208
|
+
- views/error.haml
|
203
209
|
- views/index.haml
|
204
210
|
- views/info.haml
|
205
211
|
- views/layout.haml
|
@@ -208,8 +214,8 @@ homepage: http://github.com/ariejan/firefly
|
|
208
214
|
licenses: []
|
209
215
|
|
210
216
|
post_install_message:
|
211
|
-
rdoc_options:
|
212
|
-
|
217
|
+
rdoc_options: []
|
218
|
+
|
213
219
|
require_paths:
|
214
220
|
- lib
|
215
221
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -238,8 +244,14 @@ signing_key:
|
|
238
244
|
specification_version: 3
|
239
245
|
summary: FireFly is a simple URL shortner for personal use
|
240
246
|
test_files:
|
247
|
+
- spec/files/export.csv
|
248
|
+
- spec/files/export.xml
|
249
|
+
- spec/files/export.yml
|
241
250
|
- spec/firefly/api_spec.rb
|
242
251
|
- spec/firefly/base62_spec.rb
|
252
|
+
- spec/firefly/code_factory_spec.rb
|
243
253
|
- spec/firefly/server_spec.rb
|
244
254
|
- spec/firefly/url_spec.rb
|
255
|
+
- spec/fixtures/urls.yml
|
256
|
+
- spec/spec.opts
|
245
257
|
- spec/spec_helper.rb
|