<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,4 @@
-set(:env=&gt;:production, :logging=&gt;true)
+Sinatra::Base.set(:environment=&gt;:production, :logging=&gt;true) if defined?(Sinatra)
 DB = Sequel.connect(case(GIFTSMAS_ENV)
 when :production
   'postgres:///giftsmas'</diff>
      <filename>config.rb.example</filename>
    </modified>
    <modified>
      <diff>@@ -1,25 +1,26 @@
 #!/usr/bin/env ruby
 require 'rubygems'
-require 'sinatra'
-set(:appfile=&gt;'giftsmas.rb', :views=&gt;'views')
+require 'sinatra/base'
 require 'cgi'
-enable :sessions
-
 require 'models'
 require 'scaffolding_extensions'
-ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS[:text_to_string] = true
 
+ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS[:text_to_string] = true
 PersonSplitter = /,/ unless defined?(PersonSplitter)
 
-helpers do
+class Sinatra::Base
+  set(:appfile=&gt;'giftsmas.rb', :views=&gt;'views')
+  enable :sessions
+  disable :run
+
   def h(text)
     CGI.escapeHTML(text)
   end
-
+  
   def html_opts(hash)
     hash.map{|k,v| &quot;#{k}=\&quot;#{h(v)}\&quot;&quot;}.join(' ')
   end
-
+  
   def select(name, options, opts={})
     &quot;&lt;select name=\&quot;#{name}\&quot; #{html_opts(opts)}&gt;\n#{options.map{|t,v| &quot;&lt;option value=\&quot;#{v}\&quot;&gt;#{h(t)}&lt;/option&gt;&quot;}.join(&quot;\n&quot;)}\n&lt;/select&gt;&quot;
   end
@@ -28,108 +29,129 @@ helpers do
     meth = opts.delete(:meth)||:name
     select(name, objects.map{|o| [o.send(meth), o.id]}, opts)
   end
-end
-
-error do
-  e = request.env['sinatra.error']
-  puts e.message
-  e.backtrace.each{|x| puts x}
-  render(:erb, &quot;&lt;h3&gt;Oops, an error occurred.&lt;/h3&gt;&quot;)
-end
-
-not_found do
-  render(:erb, &quot;&lt;h3&gt;The page you are looking for does not exist.&lt;/h3&gt;&quot;)
-end
-
-before do
-  @flash = session.delete(:flash)
-  unless %w'/application.css /favicon.ico /login /logout'.include?(request.env['REQUEST_PATH'])
-    redirect('/login', 303) if !session[:user_id] or !(@user = User[session[:user_id]])
-    unless %w'/choose_event /add_event'.include?(request.env['REQUEST_PATH'])
-      @event = Event[session[:event_id]] if session[:event_id]
-      redirect('/choose_event', 303) if !session[:event_id] or !(@event = Event[session[:event_id]])
+  
+  error do
+    e = request.env['sinatra.error']
+    puts e.message
+    e.backtrace.each{|x| puts x}
+    render(:erb, &quot;&lt;h3&gt;Oops, an error occurred.&lt;/h3&gt;&quot;)
+  end
+  
+  not_found do
+    render(:erb, &quot;&lt;h3&gt;The page you are looking for does not exist.&lt;/h3&gt;&quot;)
+  end
+  
+  before do
+    @flash = session.delete(:flash)
+    unless %w'/application.css /favicon.ico /login /logout'.include?(request.env['REQUEST_PATH'])
+      redirect('/login', 303) if !session[:user_id] or !(@user = User[session[:user_id]])
+      unless %w'/choose_event /add_event'.include?(request.env['REQUEST_PATH'])
+        @event = Event[session[:event_id]] if session[:event_id]
+        redirect('/choose_event', 303) if !session[:event_id] or !(@event = Event[session[:event_id]])
+      end
     end
   end
 end
 
-get '/' do
-  render :erb, :index
-end
-
-post '/add_gift' do
-  new_senders = params[:new_senders].split(PersonSplitter).map{|name| name.strip}.reject{|name| name.empty?}
-  new_receivers = params[:new_receivers].split(PersonSplitter).map{|name| name.strip}.reject{|name| name.empty?}
-  session[:flash] = if gift = Gift.add(@event, params[:gift].strip, Array(params[:senders]), Array(params[:receivers]), new_senders, new_receivers)
-    &quot;Gift Added: #{h gift.name}&lt;br /&gt;Senders: #{gift.senders.map{|s| s.name}.join(', ')}&lt;br /&gt;Receivers: #{gift.receivers.map{|s| s.name}.join(', ')}&quot;
-  else
-    &quot;Gift Not Added: You must have at least one sender and receiver.&quot;
-  end
-  redirect('/', 303)
-end
-
-get '/reports/chronological' do
-  @gifts = @event.gifts
-  render :erb, :report_chron
-end
-
-get '/reports/crosstab' do
-  @headers, @rows = @event.gifts_crosstab
-  render :erb, :report_crosstab
-end
-
-get '/reports/summary' do
-  @senders, @receivers = @event.gifts_summary
-  render :erb, :report_summary
-end
-
-get '/reports/by_sender' do
-  @senders = @event.gifts_by_sender
-  render :erb, :report_sender
-end
-
-get '/reports/by_receiver' do
-  @receivers = @event.gifts_by_receiver
-  render :erb, :report_receiver
-end
-
-get '/reports/thank_yous' do
-  @receivers = @event.thank_you_notes
-  render :erb, :report_thank_yous
-end
-
-get '/login' do
-  render :erb, :login
-end
-
-post '/login' do
-  if i = User.login_user_id(params[:user], params[:password])
-    session[:user_id] = i
-    redirect('/choose_event', 303)
-  else
-    session[:flash] = 'Bad User/Password'
-    redirect('/login', 303)
+class Giftsmas &lt; Sinatra::Base
+  get '/' do
+    render :erb, :index
+  end
+  
+  post '/add_gift' do
+    new_senders = params[:new_senders].split(PersonSplitter).map{|name| name.strip}.reject{|name| name.empty?}
+    new_receivers = params[:new_receivers].split(PersonSplitter).map{|name| name.strip}.reject{|name| name.empty?}
+    session[:flash] = if gift = Gift.add(@event, params[:gift].strip, Array(params[:senders]), Array(params[:receivers]), new_senders, new_receivers)
+      &quot;Gift Added: #{h gift.name}&lt;br /&gt;Senders: #{gift.senders.map{|s| s.name}.join(', ')}&lt;br /&gt;Receivers: #{gift.receivers.map{|s| s.name}.join(', ')}&quot;
+    else
+      &quot;Gift Not Added: You must have at least one sender and receiver.&quot;
+    end
+    redirect('/', 303)
+  end
+  
+  get '/reports/chronological' do
+    @gifts = @event.gifts
+    render :erb, :report_chron
+  end
+  
+  get '/reports/crosstab' do
+    @headers, @rows = @event.gifts_crosstab
+    render :erb, :report_crosstab
+  end
+  
+  get '/reports/summary' do
+    @senders, @receivers = @event.gifts_summary
+    render :erb, :report_summary
+  end
+  
+  get '/reports/by_sender' do
+    @senders = @event.gifts_by_sender
+    render :erb, :report_sender
+  end
+  
+  get '/reports/by_receiver' do
+    @receivers = @event.gifts_by_receiver
+    render :erb, :report_receiver
+  end
+  
+  get '/reports/thank_yous' do
+    @receivers = @event.thank_you_notes
+    render :erb, :report_thank_yous
+  end
+  
+  get '/login' do
+    render :erb, :login
+  end
+  
+  post '/login' do
+    if i = User.login_user_id(params[:user], params[:password])
+      session[:user_id] = i
+      redirect('/choose_event', 303)
+    else
+      session[:flash] = 'Bad User/Password'
+      redirect('/login', 303)
+    end
+  end
+  
+  post '/logout' do
+    session.clear
+    redirect '/login'
+  end
+  
+  get '/choose_event' do
+    render :erb, :choose_event
+  end
+  
+  post '/choose_event' do
+    e = Event[:user_id=&gt;@user.id, :id=&gt;params[:event_id]]
+    session[:event_id] = e.id
+    redirect('/', 303)
+  end
+  
+  post '/add_event' do
+    e = Event.create(:user_id=&gt;@user.id, :name=&gt;params[:name])
+    session[:event_id] = e.id
+    redirect('/', 303)
   end
 end
 
-post '/logout' do
-  session.clear
-  redirect '/login'
-end
-
-get '/choose_event' do
-  render :erb, :choose_event
+class GiftsmasSE &lt; Sinatra::Base
+  scaffold_all_models :only=&gt;[Event, Gift, Person]
 end
 
-post '/choose_event' do
-  e = Event[:user_id=&gt;@user.id, :id=&gt;params[:event_id]]
-  session[:event_id] = e.id
-  redirect('/', 303)
+app = Rack::Builder.app do
+  map &quot;/&quot; do
+    run Giftsmas
+  end
+  map &quot;/manage&quot; do
+    run GiftsmasSE
+  end
 end
 
-post '/add_event' do
-  e = Event.create(:user_id=&gt;@user.id, :name=&gt;params[:name])
-  session[:event_id] = e.id
-  redirect('/', 303)
+puts &quot;Starting&quot;
+Rack::Handler.get('mongrel').run(app, :Host=&gt;'0.0.0.0', :Port=&gt;3002) do |server|
+  trap(:INT) do
+    server.stop
+    puts &quot;Stopping&quot;
+  end
 end
-
-scaffold_all_models('/manage', :only=&gt;[Event, Gift, Person])</diff>
      <filename>giftsmas.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,13 +3,13 @@
 &lt;table&gt;
 &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Sender\Receiver&lt;/th&gt;
 &lt;% @headers.each do |x| %&gt;
-  &lt;th&gt;&lt;%=h x.to_s%&gt;&lt;/th&gt;
+  &lt;th&gt;&lt;%=h x.to_s %&gt;&lt;/th&gt;
 &lt;% end %&gt;
 &lt;/tr&gt;&lt;/thead&gt;
 &lt;tbody&gt;
 &lt;% @rows.each do |r| %&gt;
-  &lt;tr&gt;&lt;td&gt;&lt;%=h r.shift %&gt;&lt;/td&gt;
-  &lt;% r.each do |x| %&gt;
+  &lt;tr&gt;&lt;td&gt;&lt;%=h r.first %&gt;&lt;/td&gt;
+  &lt;% r[1..-1].each do |x| %&gt;
     &lt;td&gt;&lt;%= x%&gt;&lt;/td&gt;
   &lt;% end %&gt;
   &lt;/tr&gt;</diff>
      <filename>views/report_crosstab.erb</filename>
    </modified>
    <modified>
      <diff>@@ -8,8 +8,8 @@
   &lt;% gifts.each do |g| %&gt;
     &lt;tr&gt;&lt;td&gt;&lt;%= g.inserted_at.strftime('%I:%M:%S%P') %&gt;&lt;/td&gt;
     &lt;td&gt;&lt;%=h g.name %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%= g.senders.map{|x| h x.name}.join(', ') %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%= (g.receivers.map{|x| h x.name} - [h r]).join(', ') %&gt;&lt;/td&gt;&lt;/tr&gt;
+    &lt;td&gt;&lt;%= g.senders.map{|x| h(x.name)}.join(', ') %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;%= (g.receivers.map{|x| h(x.name)} - [h(r)]).join(', ') %&gt;&lt;/td&gt;&lt;/tr&gt;
   &lt;% end %&gt;
   &lt;/tbody&gt;&lt;/table&gt;
 &lt;% end %&gt;</diff>
      <filename>views/report_receiver.erb</filename>
    </modified>
    <modified>
      <diff>@@ -8,8 +8,8 @@
   &lt;% gifts.each do |g| %&gt;
     &lt;tr&gt;&lt;td&gt;&lt;%= g.inserted_at.strftime('%I:%M:%S%P') %&gt;&lt;/td&gt;
     &lt;td&gt;&lt;%=h g.name %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%= g.receivers.map{|x| h x.name}.join(', ') %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%= (g.senders.map{|x| h x.name} - [h s]).join(', ') %&gt;&lt;/td&gt;&lt;/tr&gt;
+    &lt;td&gt;&lt;%= (g.receivers.map{|x| h(x.name)}).join(', ') %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;%= (g.senders.map{|x| h(x.name)} - [h(s)]).join(', ') %&gt;&lt;/td&gt;&lt;/tr&gt;
   &lt;% end %&gt;
   &lt;/tbody&gt;&lt;/table&gt;
 &lt;% end %&gt;</diff>
      <filename>views/report_sender.erb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>dd9ba5ef5fb58f63ebf0e2fca8defba37b26c0a6</id>
    </parent>
  </parents>
  <author>
    <name>Jeremy Evans</name>
    <email>code@jeremyevans.net</email>
  </author>
  <url>http://github.com/jeremyevans/giftsmas/commit/c68c7748bfb7144642667b3f82a08db8d0d80c3b</url>
  <id>c68c7748bfb7144642667b3f82a08db8d0d80c3b</id>
  <committed-date>2009-01-29T13:59:50-08:00</committed-date>
  <authored-date>2009-01-29T13:59:50-08:00</authored-date>
  <message>Update to Sinatra 0.9.0.4

Move most of the top level code into a Sinatra::Base subclass named
Giftsmas.  Move the scaffolded code into a Giftsmas SE subclass.
Set up Rack manually to use both subclasses at the same time,
mounted at different points.

Fix an issue in the cross tab report with the senders name's not
being displayed.

Fix some ruby warnings in the sender and receiver reports.</message>
  <tree>68ffecda9bfcc431e0d1cd9d1aabd29aa17a442a</tree>
  <committer>
    <name>Jeremy Evans</name>
    <email>code@jeremyevans.net</email>
  </committer>
</commit>
