1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00
puma--puma/examples/camping/tepee.rb
why 909120d40d Moving the Tepee example into a Camping directory.
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@11 19e92222-5c0b-0410-8929-a290d50e31e9
2006-01-29 01:04:36 +00:00

178 lines
4.9 KiB
Ruby

#!/usr/bin/ruby
$:.unshift File.dirname(__FILE__) + "/../../lib"
%w(rubygems redcloth camping acts_as_versioned).each { |lib| require lib }
Camping.goes :Tepee
module Tepee::Models
def self.schema(&block)
@@schema = block if block_given?
@@schema
end
class Page < Base
PAGE_LINK = /\[\[([^\]|]*)[|]?([^\]]*)\]\]/
validates_uniqueness_of :title
before_save { |r| r.title = r.title.underscore }
acts_as_versioned
end
end
Tepee::Models.schema do
create_table :pages, :force => true do |t|
t.column :title, :string, :limit => 255
t.column :body, :text
end
Tepee::Models::Page.create_versioned_table
end
module Tepee::Controllers
class Index < R '/'
def get
redirect Show, 'home_page'
end
end
class List < R '/list'
def get
@pages = Page.find :all, :order => 'title'
render :list
end
end
class Show < R '/s/(\w+)', '/s/(\w+)/(\d+)'
def get page_name, version = nil
redirect(Edit, page_name, 1) and return unless @page = Page.find_by_title(page_name)
@version = (version.nil? or version == @page.version.to_s) ? @page : @page.versions.find_by_version(version)
render :show
end
end
class Edit < R '/e/(\w+)/(\d+)', '/e/(\w+)'
def get page_name, version = nil
@page = Page.find_or_create_by_title(page_name)
@page = @page.versions.find_by_version(version) unless version.nil? or version == @page.version.to_s
render :edit
end
def post page_name
Page.find_or_create_by_title(page_name).update_attributes :body => input.post_body and redirect Show, page_name
end
end
end
module Tepee::Views
def layout
html do
head do
title 'test'
end
body do
p do
small do
span "welcome to " ; a 'tepee', :href => "http://code.whytheluckystiff.net/svn/camping/trunk/examples/tepee/"
span '. go ' ; a 'home', :href => R(Show, 'home_page')
span '. list all ' ; a 'pages', :href => R(List)
end
end
div.content do
self << yield
end
end
end
end
def show
h1 @page.title
div { _markup @version.body }
p do
a 'edit', :href => R(Edit, @version.title, @version.version)
a 'back', :href => R(Show, @version.title, @version.version-1) unless @version.version == 1
a 'next', :href => R(Show, @version.title, @version.version+1) unless @version.version == @page.version
a 'current', :href => R(Show, @version.title) unless @version.version == @page.version
end
end
def edit
form :method => 'post', :action => R(Edit, @page.title) do
p do
label 'Body' ; br
textarea @page.body, :name => 'post_body', :rows => 50, :cols => 100
end
p do
input :type => 'submit'
a 'cancel', :href => R(Show, @page.title, @page.version)
end
end
end
def list
h1 'all pages'
ul { @pages.each { |p| li { a p.title, :href => R(Show, p.title) } } }
end
def _markup body
return '' if body.blank?
body.gsub!(Tepee::Models::Page::PAGE_LINK) do
page = title = $1.underscore
title = $2 unless $2.empty?
if Tepee::Models::Page.find(:all, :select => 'title').collect { |p| p.title }.include?(page)
%Q{<a href="#{$docroot}#{R Show, page}">#{title}</a>}
else
%Q{<span>#{title}<a href="#{$docroot}#{R Edit, page, 1}">?</a></span>}
end
end
RedCloth.new(body, [ :hard_breaks ]).to_html
end
end
module Tepee
class << self
def mongrel_run(request, response)
req = StringIO.new(request.body)
status = 500
resp = ""
begin
klass, path = Controllers.D request.params["PATH_INFO"]
method = request.params['REQUEST_METHOD']||"GET"
klass.class_eval { include C; include Controllers::Base; include Models }
controller = klass.new
resp = controller.service(req, request.params, method, path)
status = controller.status
rescue => e
req.rewind
resp = Controllers::ServerError.new.service(req, request.params, "GET", [klass,method,e])
end
response.socket.write("HTTP/1.1 #{status} OK\r\n")
response.socket.write(resp)
end
end
end
require 'thread'
class CampingHandler < Mongrel::HttpHandler
def process(request, response)
Tepee.mongrel_run(request, response)
end
end
if __FILE__ == $0
$docroot = "/blog"
db_exists = File.exists?('tepee.db')
Tepee::Models::Base.establish_connection :adapter => 'sqlite3', :database => 'tepee.db'
Tepee::Models::Base.logger = Logger.new('camping.log')
Tepee::Models::Base.threaded_connections=false
ActiveRecord::Schema.define(&Tepee::Models.schema) unless db_exists
h = Mongrel::HttpServer.new("0.0.0.0", "3000")
h.register("/blog", CampingHandler.new)
h.register("/favicon.ico", Mongrel::Error404Handler.new(""))
h.run.join
end