• Stars
    star
    485
  • Rank 90,698 (Top 2 %)
  • Language
    Ruby
  • License
    MIT License
  • Created over 13 years ago
  • Updated 11 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

URL shortening hobby kit

Guillotine

Simple URL Shortener hobby kit. Currently used to shorten URLs at GitHub.com, and also available as a an installable Heroku app.

USAGE

The easiest way to use it is with the built-in memory adapter.

# app.rb
require 'guillotine'
module MyApp
  class App < Guillotine::App
    adapter = Guillotine::Adapters::MemoryAdapter.new
    set :service => Guillotine::Service.new(adapter)

    get '/' do
      redirect 'https://homepage.com'
    end
  end
end
# config.ru
require "rubygems"
require File.expand_path("../app.rb", __FILE__)
run MyApp::App

Once it's running, add URLs with a simple POST.

curl http://localhost:4567 -i \
  -F "url=http://techno-weenie.net"

You can specify your own code too:

curl http://localhost:4567 -i \
  -F "url=http://techno-weenie.net" \
  -F "code=abc"

Sequel

The memory adapter sucks though. You probably want to use a DB. Check out the Sequel gem for more examples. It'll support SQLite, MySQL, PostgreSQL, and a bunch of other databases.

require 'guillotine'
require 'sequel'
module MyApp
  class App < Guillotine::App
    db = Sequel.sqlite
    adapter = Guillotine::Adapters::SequelAdapter.new(db)
    set :service => Guillotine::Service.new(adapter)
  end
end

You'll need to initialize the DB schema with something like this (depending on which DB you use):

CREATE TABLE IF NOT EXISTS `urls` (
  `url` varchar(255) DEFAULT NULL,
  `code` varchar(255) DEFAULT NULL,
  UNIQUE KEY `url` (`url`),
  UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Redis

Redis works well, too. The sample below is adapted from Katana, a hosted wrapper around Guillotine designed for Heroku.

require 'guillotine'
require 'redis'

module MyApp
  class App < Guillotine::App
    # use redis adapter with redistogo on Heroku
    uri = URI.parse(ENV["REDISTOGO_URL"])
    redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
    adapter = Guillotine::Adapters::RedisAdapter.new(redis)
    set :service => Guillotine::Service.new(adapter)
  end
end

Riak

If you need to scale out your url shortening services across the cloud, you can use Riak!

require 'guillotine'
require 'riak/client'
module MyApp
  class App < Guillotine::App
    client = Riak::Client.new :protocol => 'pbc', :pb_port => 8087
    bucket = client['guillotine']
    adapter = Guillotine::Adapters::RiakAdapter.new(bucket)
    set :service => Guillotine::Service.new(adapter)
  end
end

Cassandra

you can use Cassandra!

require 'guillotine'
require 'cassandra'

module MyApp
  class App < Guillotine::App
    cassandra = Cassandra.new('url_shortener', '127.0.0.1:9160')
    adapter = Guillotine::Adapters::CassandraAdapter.new(cassandra)

    set :service => Guillotine::Service.new(adapter)
  end
end

You need to create keyspace and column families as below

CREATE KEYSPACE url_shortener;
USE url_shortener;

CREATE COLUMN FAMILY urls
WITH comparator = UTF8Type
AND key_validation_class=UTF8Type
AND column_metadata = [{column_name: code, validation_class: UTF8Type}];

CREATE COLUMN FAMILY codes
WITH comparator = UTF8Type
AND key_validation_class=UTF8Type
AND column_metadata = [{column_name: url, validation_class: UTF8Type}];

Domain Restriction

You can restrict what domains that Guillotine will shorten.

require 'guillotine'
module MyApp
  class App < Guillotine::App
    adapter = Guillotine::Adapters::MemoryAdapter.new
    # only this domain
    set :service => Guillotine::Service.new(adapter,
      :required_host => 'github.com')

    # or, any *.github.com domain
    set :service => Guillotine::Service.new(adapter,
      :required_host => /(^|\.)github\.com$/)

    # or set a simple wildcard
    set :service => Guillotine::Servicew.new(adapter,
      :required_host => '*.github.com')
  end
end

Not TODO

  • Statistics
  • Authentication

More Repositories

1

restful-authentication

inactive project
Ruby
1,573
star
2

attachment_fu

Treat an ActiveRecord model as a file attachment, storing its patch, size, content type, etc.
Ruby
1,026
star
3

coffee-resque

CoffeeScript
545
star
4

twitter-node

Discontinued: check out nTwitter
JavaScript
445
star
5

acts_as_versioned

ActiveRecord plugin for versioning your models.
Ruby
408
star
6

permalink_fu

ActiveRecord plugin for automatically converting fields to permalinks.
Ruby
264
star
7

masochism

ActiveRecord connection proxy for master/slave connections
Ruby
248
star
8

grohl

Combination logging, exception reporting, and metrics library for Go.
Go
165
star
9

madrox

Distributed Twitter implementation in Git.
Ruby
153
star
10

nubnub

Node.js PubSubHubbub client/server implementation
CoffeeScript
144
star
11

jquery.doubletap

This jquery plugin adds custom touch-screen events to the given HTML elements.
JavaScript
137
star
12

wheres-waldo

track what users are on which pages with redis
JavaScript
119
star
13

cronwtf

silly cron => english translator
JavaScript
94
star
14

can_search

Build common named scopes automatically, and provide a simple way to merge them with a single #search call.
Ruby
93
star
15

node-scoped-http-client

Unmaintained. Free push/npm access to anyone interested.
CoffeeScript
84
star
16

node-chain-gang

CoffeeScript
81
star
17

serialized_attributes

kind of a bridge between using AR and a full blown schema-free db
Ruby
61
star
18

model_stubbing

Replacement for ActiveRecord fixtures using an extremely flexible ruby-based approach.
Ruby
55
star
19

viking

Discontinued, see https://github.com/dimelo/viking
Ruby
53
star
20

go-scientist

Go
49
star
21

faraday-zeromq

Ruby
47
star
22

relative_time_helpers

ActionView helpers for showing relative time spans like "Jan 1 - 5" or "Jan 1 - Feb 5"
Ruby
45
star
23

multipartstreamer

Go
44
star
24

sentry

Painless encryption wrapper library
Ruby
32
star
25

model_iterator

Ruby
32
star
26

twitter-server

ruby/sinatra extensions for implementing the twitter api
Ruby
31
star
27

yajl-rails

Rails plugin for using YAJL with Rails 3
Ruby
29
star
28

app_bootstrap

app:bootstrap rake task providing a command line menu to setup a rails app.
Ruby
29
star
29

emoji-css-builder

Quick Ruby rake task for generating CSS and tiled image for displaying emoji in browsers.
Ruby
29
star
30

sparkplug

Ruby Rack module for generating sparkline graphs on the fly
Ruby
26
star
31

astrotrain

email => http_post
Ruby
26
star
32

duplikate

Syncs one directory to another (example: a git project to an svn repo)
Ruby
25
star
33

running_man

Ruby
23
star
34

dealer.js

JavaScript
21
star
35

chat_gram

Barebones Instagram realtime endpoint for posting images to a chat service (Campfire).
Ruby
19
star
36

github_twitter_server

wrap github with a twitter api.
Ruby
18
star
37

islostonyet.com

no really, i need to know
Ruby
18
star
38

will_sign

Small module for creating time-based hashes based on URLs.
Ruby
17
star
39

horcrux

A Horcrux is a powerful object in which a Dark wizard or witch has hidden a fragment of his or her soul for the purpose of attaining immortality.
Ruby
16
star
40

weatherhue

Ruby
13
star
41

queue_kit

Ruby
11
star
42

zcollab

Rad ZeroMQ scripts to supercharge your cloud.
JavaScript
11
star
43

context_on_crack

experimental macros for testing rails controllers. port of rspec_on_rails_on_crack
11
star
44

ultraviolence

web service for formatting text with the ultraviolet lib. ruby 1.9 only
Ruby
10
star
45

schemagram

Generate JSON Schema files from Ruby.
Ruby
9
star
46

go-httppipe

Go
9
star
47

service-queue

experimental ZeroMQ task worker thing.
CoffeeScript
9
star
48

activesupport_notifications_backport

Ruby
9
star
49

httpretry

Go
9
star
50

flappy-atom

CoffeeScript
8
star
51

urban_api

quick and dirty urban dictionary scraper
Ruby
8
star
52

dangerroom

Go
7
star
53

git-nosql-talk

Git is a Stupid NOSQL Database - talk given at Ruby and Rails.eu 2010
Ruby
7
star
54

rack-sparklines

DISCONTINUED, SEE http://github.com/technoweenie/sparkplug
Ruby
7
star
55

markup_cloud

Render text into markup through local and zeromq endpoints
Ruby
7
star
56

coffee-sprites

simple html 5 animation/sprites system heavily inspired by http://gamesinhtml5.blogspot.com/2010/07/game-in-progress-sprites-and-animation.html
JavaScript
6
star
57

go-contentaddressable

Go
5
star
58

unique_content_set

Check for uniquely created content in a Redis set
Ruby
5
star
59

elixir-rubyports

Elixir
5
star
60

fantomex

[ALPHA] Small, per-process persistent queue.
CoffeeScript
4
star
61

camo.go

Go
4
star
62

http_token_authentication

Rails plugin for parsing http token authorization headers
Ruby
4
star
63

active_record_context

simple identity map for active record. eager loading associations FTL
Ruby
4
star
64

go-passthrough

Simple package for passing responses untouched from an internal API
Go
4
star
65

pylists

Python
4
star
66

zue

Ruby
4
star
67

pki

Ruby
4
star
68

rubysweetsixteen

i'm probably jumping the shark by posting this...
Ruby
4
star
69

lighthouse-notifier

Ruby
3
star
70

ud

Ruby
3
star
71

15

3
star
72

redis_active_set

Tracks the number of active objects during a certain time period in a Redis sorted set.
Ruby
3
star
73

guillotine-zeromq

ZeroMQ API for Guillotine
Ruby
2
star
74

hubot-zeromq

proof-of-concept zeromq adapter for Hubot
CoffeeScript
2
star
75

apub

experimental golang package for parsing ActivityPub objects
Go
2
star
76

pdxjs-twitter-node

JavaScript
2
star
77

fantomex.rb

[ALPHA] Small, per-process persistent queue.
Ruby
1
star
78

tender_sync

sync Tender FAQs to and from Tender
Ruby
1
star
79

dummy-repo

1
star
80

playground

1
star
81

go-ronn

Go
1
star