Working with lipsiadmin: 1) Proof of concept for the Sinatra Framework 2) Adding in additional features to the current sinatra_more (more generators, helpers, etc) 3) Split plugin up into individual gems for better organization 4) Porting of lipsiadmin over to sinatra 5) First produciton application 6) Build Sinatra Framework Website Use Bundler for managing dependencies: * http://github.com/wycats/bundler * http://www.engineyard.com/blog/2009/using-the-rubygems-bundler-for-your-app/ Framework structure: * sinatra-core (the existing sinatra framework) <= from Sinatra * sinatra-helpers (adds the markup and renderer helpers) <= from MarkupPlugin, RenderPlugin * sinatra-mailer (mail handling for sinatra applications) <= from MailerPlugin * sinatra-gen (easy generation of and for sinatra apps) <= from Generator * sinatra-admin (admin management dashboard for content) <= from Lipsiadmin (ported) * sinatra-routing (sinatra route mapping system) <= from RoutingPlugin * sinatra-cache (page and fragment caching support) 'sinatra-cache' Caching concept: # in models class Person def something_expensive Sinatra::Cache.get('key') Sinatra::Cache.set('key', value) Sinatra::Cache.fetch('key') { 'value' } end end # fragment in route get '/cache2' do cache 'cache2', :expiry => 10 do 'Hello Cache2' end end # fragment in view # /views/test.haml - cache 'test', :expiry => 10 do = partial 'item', :collection => @items # page get '/example', :cache => true do haml_template 'accounts/index' end 'sinatra-routing' Routing Concept: namespace :admin do get :show do ... end end get :accounts do ... end map(:admin, :show).to("/my-admin/:id/show") map(:accounts).to("/show-me-my/accounts") # or map :admin do |namespace| namespace.map(:show).to("/my-admin/:id/show") end # and to use link_to "Show Admin", url_for(:admin, :show, :id => 5) link_to "Accounts", url_for(:accounts)