tmin 0.0.2

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