tmin 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,55 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'firefly.rb')
2
+
3
+ require 'rubygems'
4
+ require "bundler/setup"
5
+
6
+ require 'sinatra'
7
+ require 'rack/test'
8
+ require 'yaml'
9
+ require 'database_cleaner'
10
+
11
+ # set test environment
12
+ set :environment, :test
13
+ set :run, false
14
+ set :raise_errors, true
15
+ set :logging, false
16
+
17
+ @@app = Firefly::Server.new do
18
+ set :hostname, "test.host"
19
+ set :api_key, "test"
20
+ set :database, "sqlite3::memory:"
21
+
22
+ set :sharing_key, "asdfasdf"
23
+ set :sharing_targets, [:twitter, :hyves, :facebook]
24
+ set :sharing_domains, ["example.com", "example.net"]
25
+ end
26
+
27
+ RSpec.configure do |config|
28
+
29
+ config.before(:suite) do
30
+ DatabaseCleaner.strategy = :truncation
31
+ DatabaseCleaner.clean_with(:truncation)
32
+ Firefly::CodeFactory.create(:count => 0)
33
+ end
34
+
35
+ config.before(:each) do
36
+ DatabaseCleaner.start
37
+ end
38
+
39
+ config.after(:each) do
40
+ DatabaseCleaner.clean
41
+ Firefly::CodeFactory.create(:count => 0)
42
+ end
43
+
44
+ # Loads the urls.yml fixtures.
45
+ def load_fixtures
46
+ Firefly::Url.destroy
47
+ urls = YAML::load(File.open('spec/fixtures/urls.yml'))
48
+ urls.each { |key, url| Firefly::Url.create(url) }
49
+ end
50
+
51
+ # Load a spec file and return its contents
52
+ def spec_file(filename)
53
+ File.open('spec/files/'+filename) { |f| f.read }
54
+ end
55
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'tmin'
16
+
17
+ class Test::Unit::TestCase
18
+ end
data/test/test_tmin.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestTmin < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
data/tmin.gemspec ADDED
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "tmin/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "tmin"
7
+ s.version = Tminus::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["drobs"]
10
+ s.email = ["duggan@uncarbonatedsoftware.com"]
11
+ s.homepage = "http://uncarbonatedsoftware.com"
12
+ s.summary = %q{tminusit is your own personal URL shortener for your own domain.}
13
+ s.description = %q{tminusit is your own personal URL shortener for your own domain. It's written in Ruby and powered by Sinatra. You can run it with any Rack-capable web server.}
14
+
15
+ s.rubyforge_project = "tminusit"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_runtime_dependency("sinatra", ["~> 1.2.0"])
23
+ s.add_runtime_dependency("dm-core", ["~> 1.2.0"])
24
+ s.add_runtime_dependency("dm-migrations", ["~> 1.2.0"])
25
+ s.add_runtime_dependency("dm-transactions", ["~> 1.2.0"])
26
+ s.add_runtime_dependency("dm-aggregates", ["~> 1.2.0"])
27
+ s.add_runtime_dependency("dm-mysql-adapter", ["~> 1.2.0"])
28
+ s.add_runtime_dependency("haml", ["~> 3.0.18"])
29
+ s.add_runtime_dependency("escape_utils", ["~> 0.2.3"])
30
+
31
+ s.add_development_dependency("rspec", ["~> 2.5.0"])
32
+ s.add_development_dependency("rack-test", ["~> 0.5.4"])
33
+ s.add_development_dependency("dm-sqlite-adapter", ["~> 1.2.0"])
34
+ s.add_development_dependency("database_cleaner", ["~> 0.6.6"])
35
+ end
data/views/error.haml ADDED
@@ -0,0 +1,11 @@
1
+ %h1 Whoops!
2
+
3
+ %p
4
+ There was an error processing your request:
5
+
6
+ %p
7
+ %blockquote
8
+ = @result
9
+
10
+ %p
11
+ %a(href='/') Go back
data/views/index.haml ADDED
@@ -0,0 +1,91 @@
1
+ - if @authenticated
2
+ .sidebox
3
+ %h2 Bookmarklet
4
+
5
+ %p
6
+ Drag the following link to your bookmarks. Click it to shorten the URL to the page you're currently viewing.
7
+ %p
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]}
9
+
10
+ %h1 How about shortening a URL?
11
+
12
+ .the_form
13
+ %form{ :action => '/api/add', :method => 'post' }
14
+ %input{ :type => "hidden", :name => "visual", :value => "1" }
15
+ %p
16
+ %input.big_url{ :type => 'text', :placeholder => "Paste your long URL here...", :name => 'url', :id => 'url', :size => 40, :autocomplete => "off", :spellcheck => 'false' }
17
+ %span{ :style => "font-size: 1.8em;" }= '>'
18
+ %input.big_url{ :type => 'text', :placeholder => "Optional short code", :name => 'short', :id => 'short', :size => 20, :autocomplete => "off", :spellcheck => 'false' }
19
+ %p
20
+ %input.big_url{ :type => 'submit', :name => 'submit', :id => 'submit', :value => "Make it short!" }
21
+
22
+ - if @highlight
23
+ %h2 Your short URL
24
+
25
+ %table
26
+ %tr
27
+ %td.label Short URL
28
+ %td.label Full URL
29
+ %td.label Clicks
30
+ %td.label Shortened at
31
+ %td.label &nbsp;
32
+ %tr.highlighted
33
+ %td.value
34
+ %input{ :type => "text", :value => short_url(@highlight), :class => 'short_url', :size => 21 }
35
+ %td.value.fill <a href="#{@highlight.url}">#{truncate @highlight.url, 130}</a>
36
+ %td.value.center= @highlight.clicks
37
+ %td.value= @highlight.created_at.strftime("%Y-%m-%d %H:%M")
38
+ %td.value
39
+ %a{ :href => "http://twitter.com/home?status=#{tweet(short_url(@highlight))}" }
40
+ %img.twitter{ :src => "/images/twitter.png", :width => "16", :height => "16" }
41
+
42
+ %h2 Recently shortened
43
+
44
+ %table
45
+ %tr
46
+ %td.label(nowrap='nowrap') Short URL <a href="/?s=code&d=asc">▲</a> <a href="/?s=code&d=desc">▼</a>
47
+ %td.label(nowrap='nowrap') Full URL <a href="/?s=url&d=asc">▲</a> <a href="/?s=url&d=desc">▼</a>
48
+ %td.label(nowrap='nowrap') Clicks <a href="/?s=clicks&d=asc">▲</a> <a href="/?s=clicks&d=desc">▼</a>
49
+ %td.label(nowrap='nowrap') Shortened At <a href="/?s=created_at&d=asc">▲</a> <a href="/?s=created_at&d=desc">▼</a>
50
+ %td.label &nbsp;
51
+ - @urls.each do |url|
52
+ %tr{ :class => is_highlighted?(url) ? 'highlighted' : '' }
53
+ %td.value
54
+ %input{ :type => "text", :value => short_url(url), :class => 'short_url', :size => 31 }
55
+ %td.value.fill <a href="#{url.url}">#{truncate url.url, 130}</a>
56
+ %td.value.center= url.clicks
57
+ %td.value= url.created_at.strftime("%Y-%m-%d %H:%M")
58
+ %td.value
59
+ %a{ :href => "http://twitter.com/home?status=#{tweet(short_url(url))}" }
60
+ %img.twitter{ :src => "/images/twitter.png", :width => "16", :height => "16" }
61
+
62
+ :javascript
63
+ $(document).ready(function() {
64
+ $('input.short_url').each(function(index) {
65
+ $(this).mouseup(function() { $(this).select(); });
66
+ });
67
+
68
+ if (window.location.search == "") {
69
+ var pathname = window.location.pathname + '?s=created_at&d=desc';
70
+ } else {
71
+ var pathname = window.location.pathname + window.location.search;
72
+ }
73
+
74
+ $('#main table tr td.label a').each(function(index) {
75
+ if ($(this).attr('href') == pathname) {
76
+ $(this).addClass('highlight');
77
+ }
78
+ });
79
+ });
80
+ - else
81
+ %h1 Please enter your API key
82
+
83
+ %p
84
+ Please enter your API key below to make sure only you can shorten URLs here.
85
+
86
+ %form{ :action => '/api/set', :method => 'post' }
87
+ %p
88
+ %label{ :for => 'api_key' } API Key
89
+ %input{ :type => 'password', :name => 'api_key', :id => 'api_key' }
90
+ %p
91
+ %input{ :type => 'submit', :name => 'submit', :id => 'submit', :value => "Let me in" }
data/views/info.haml ADDED
@@ -0,0 +1,26 @@
1
+ %p.link
2
+ %a{ :href => "/" } &laquo; Back
3
+
4
+ %h1 http://#{@config[:hostname]}/#{@url.code}
5
+
6
+ %table
7
+ %tr
8
+ %td.label Short URL
9
+ %td.label Full URL
10
+ %td.label Clicks
11
+ %td.label Shortened at
12
+
13
+ %tr
14
+ %td.value
15
+ %input{ :type => "text", :value => short_url(@url), :class => 'short_url', :size => 21 }
16
+ %td.value.fill <a href="#{@url.url}">#{@url.url}</a>
17
+ %td.value.center= @url.clicks
18
+ %td.value= @url.created_at.strftime("%Y-%m-%d %H:%M")
19
+
20
+ :javascript
21
+ $(document).ready(function() {
22
+ $('input.short_url').each(function(index) {
23
+ $(this).mouseup(function() { $(this).select(); });
24
+ });
25
+ });
26
+
data/views/layout.haml ADDED
@@ -0,0 +1,17 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title #{@title}
5
+ %meta(charset="UTF-8")
6
+ %link{ :rel => "stylesheet", :href => u('reset.css') }
7
+ %link{ :rel => "stylesheet", :href => u('style.css') }
8
+ %script{ :type => "text/javascript", :src => u('jquery-1.4.2.min.js') }
9
+ %body
10
+ .header
11
+ %h1= @title
12
+
13
+ #main
14
+ = yield
15
+
16
+ #footer
17
+ %p
metadata ADDED
@@ -0,0 +1,308 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tmin
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - drobs
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-13 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: sinatra
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 31
30
+ segments:
31
+ - 1
32
+ - 2
33
+ - 0
34
+ version: 1.2.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: dm-core
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 31
46
+ segments:
47
+ - 1
48
+ - 2
49
+ - 0
50
+ version: 1.2.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: dm-migrations
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 31
62
+ segments:
63
+ - 1
64
+ - 2
65
+ - 0
66
+ version: 1.2.0
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: dm-transactions
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ hash: 31
78
+ segments:
79
+ - 1
80
+ - 2
81
+ - 0
82
+ version: 1.2.0
83
+ type: :runtime
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: dm-aggregates
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 31
94
+ segments:
95
+ - 1
96
+ - 2
97
+ - 0
98
+ version: 1.2.0
99
+ type: :runtime
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: dm-mysql-adapter
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ hash: 31
110
+ segments:
111
+ - 1
112
+ - 2
113
+ - 0
114
+ version: 1.2.0
115
+ type: :runtime
116
+ version_requirements: *id006
117
+ - !ruby/object:Gem::Dependency
118
+ name: haml
119
+ prerelease: false
120
+ requirement: &id007 !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ hash: 35
126
+ segments:
127
+ - 3
128
+ - 0
129
+ - 18
130
+ version: 3.0.18
131
+ type: :runtime
132
+ version_requirements: *id007
133
+ - !ruby/object:Gem::Dependency
134
+ name: escape_utils
135
+ prerelease: false
136
+ requirement: &id008 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ hash: 17
142
+ segments:
143
+ - 0
144
+ - 2
145
+ - 3
146
+ version: 0.2.3
147
+ type: :runtime
148
+ version_requirements: *id008
149
+ - !ruby/object:Gem::Dependency
150
+ name: rspec
151
+ prerelease: false
152
+ requirement: &id009 !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ hash: 27
158
+ segments:
159
+ - 2
160
+ - 5
161
+ - 0
162
+ version: 2.5.0
163
+ type: :development
164
+ version_requirements: *id009
165
+ - !ruby/object:Gem::Dependency
166
+ name: rack-test
167
+ prerelease: false
168
+ requirement: &id010 !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ hash: 3
174
+ segments:
175
+ - 0
176
+ - 5
177
+ - 4
178
+ version: 0.5.4
179
+ type: :development
180
+ version_requirements: *id010
181
+ - !ruby/object:Gem::Dependency
182
+ name: dm-sqlite-adapter
183
+ prerelease: false
184
+ requirement: &id011 !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ hash: 31
190
+ segments:
191
+ - 1
192
+ - 2
193
+ - 0
194
+ version: 1.2.0
195
+ type: :development
196
+ version_requirements: *id011
197
+ - !ruby/object:Gem::Dependency
198
+ name: database_cleaner
199
+ prerelease: false
200
+ requirement: &id012 !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ hash: 11
206
+ segments:
207
+ - 0
208
+ - 6
209
+ - 6
210
+ version: 0.6.6
211
+ type: :development
212
+ version_requirements: *id012
213
+ description: tminusit is your own personal URL shortener for your own domain. It's written in Ruby and powered by Sinatra. You can run it with any Rack-capable web server.
214
+ email:
215
+ - duggan@uncarbonatedsoftware.com
216
+ executables: []
217
+
218
+ extensions: []
219
+
220
+ extra_rdoc_files: []
221
+
222
+ files:
223
+ - .document
224
+ - .gitignore
225
+ - Gemfile
226
+ - Gemfile.lock
227
+ - LICENSE.txt
228
+ - README.rdoc
229
+ - Rakefile
230
+ - config.ru.example
231
+ - lib/tmin.rb
232
+ - lib/tmin/base62.rb
233
+ - lib/tmin/code_factory.rb
234
+ - lib/tmin/config.rb
235
+ - lib/tmin/server.rb
236
+ - lib/tmin/url.rb
237
+ - lib/tmin/version.rb
238
+ - public/favicon.ico
239
+ - public/images/twitter.png
240
+ - public/jquery-1.4.2.min.js
241
+ - public/reset.css
242
+ - public/style.css
243
+ - spec/firefly/api_spec.rb
244
+ - spec/firefly/base62_spec.rb
245
+ - spec/firefly/code_factory_spec.rb
246
+ - spec/firefly/server_spec.rb
247
+ - spec/firefly/sharing_facebook_spec.rb
248
+ - spec/firefly/sharing_hyves_spec.rb
249
+ - spec/firefly/sharing_twitter_spec.rb
250
+ - spec/firefly/url_spec.rb
251
+ - spec/fixtures/urls.yml
252
+ - spec/spec.opts
253
+ - spec/spec_helper.rb
254
+ - test/helper.rb
255
+ - test/test_tmin.rb
256
+ - tmin.gemspec
257
+ - views/error.haml
258
+ - views/index.haml
259
+ - views/info.haml
260
+ - views/layout.haml
261
+ has_rdoc: true
262
+ homepage: http://uncarbonatedsoftware.com
263
+ licenses: []
264
+
265
+ post_install_message:
266
+ rdoc_options: []
267
+
268
+ require_paths:
269
+ - lib
270
+ required_ruby_version: !ruby/object:Gem::Requirement
271
+ none: false
272
+ requirements:
273
+ - - ">="
274
+ - !ruby/object:Gem::Version
275
+ hash: 3
276
+ segments:
277
+ - 0
278
+ version: "0"
279
+ required_rubygems_version: !ruby/object:Gem::Requirement
280
+ none: false
281
+ requirements:
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ hash: 3
285
+ segments:
286
+ - 0
287
+ version: "0"
288
+ requirements: []
289
+
290
+ rubyforge_project: tminusit
291
+ rubygems_version: 1.3.7
292
+ signing_key:
293
+ specification_version: 3
294
+ summary: tminusit is your own personal URL shortener for your own domain.
295
+ test_files:
296
+ - spec/firefly/api_spec.rb
297
+ - spec/firefly/base62_spec.rb
298
+ - spec/firefly/code_factory_spec.rb
299
+ - spec/firefly/server_spec.rb
300
+ - spec/firefly/sharing_facebook_spec.rb
301
+ - spec/firefly/sharing_hyves_spec.rb
302
+ - spec/firefly/sharing_twitter_spec.rb
303
+ - spec/firefly/url_spec.rb
304
+ - spec/fixtures/urls.yml
305
+ - spec/spec.opts
306
+ - spec/spec_helper.rb
307
+ - test/helper.rb
308
+ - test/test_tmin.rb