Capcode 0.1.0
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/AUTHORS +1 -0
 - data/COPYING +340 -0
 - data/README +53 -0
 - data/doc/rdoc/classes/Capcode.html +434 -0
 - data/doc/rdoc/classes/Capcode/HTTPError.html +125 -0
 - data/doc/rdoc/classes/Capcode/Helpers.html +214 -0
 - data/doc/rdoc/classes/Capcode/ParameterError.html +125 -0
 - data/doc/rdoc/created.rid +1 -0
 - data/doc/rdoc/files/AUTHORS.html +100 -0
 - data/doc/rdoc/files/COPYING.html +524 -0
 - data/doc/rdoc/files/README.html +164 -0
 - data/doc/rdoc/files/lib/capcode_rb.html +533 -0
 - data/doc/rdoc/index.html +10 -0
 - data/doc/rdoc/permalink.gif +0 -0
 - data/doc/rdoc/rdoc-style.css +106 -0
 - data/doc/rdoc/rubyfr.png +0 -0
 - data/examples/blog.log +16 -0
 - data/examples/blog.rb +62 -0
 - data/examples/index.html +5 -0
 - data/examples/sample.rb +61 -0
 - data/examples/session.rb +47 -0
 - data/lib/capcode.rb +293 -0
 - data/lib/capcode/core_ext.rb +15 -0
 - data/setup.rb +1585 -0
 - metadata +106 -0
 
    
        data/doc/rdoc/index.html
    ADDED
    
    
| 
         Binary file 
     | 
| 
         @@ -0,0 +1,106 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
      
 2 
     | 
    
         
            +
                body {
         
     | 
| 
      
 3 
     | 
    
         
            +
                    font: normal 14px verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif;
         
     | 
| 
      
 4 
     | 
    
         
            +
                    line-height: 160%;
         
     | 
| 
      
 5 
     | 
    
         
            +
                    padding: 0; margin: 0;
         
     | 
| 
      
 6 
     | 
    
         
            +
                    margin-bottom: 30px;
         
     | 
| 
      
 7 
     | 
    
         
            +
                    /* background-color: #402; */
         
     | 
| 
      
 8 
     | 
    
         
            +
                    background-color: #CCCC99;
         
     | 
| 
      
 9 
     | 
    
         
            +
                }
         
     | 
| 
      
 10 
     | 
    
         
            +
                h1, h2, h3, h4 {
         
     | 
| 
      
 11 
     | 
    
         
            +
                    font-family: Utopia, Georgia, serif;
         
     | 
| 
      
 12 
     | 
    
         
            +
                    font-weight: bold;
         
     | 
| 
      
 13 
     | 
    
         
            +
                    letter-spacing: -0.018em;
         
     | 
| 
      
 14 
     | 
    
         
            +
                }
         
     | 
| 
      
 15 
     | 
    
         
            +
                h1 { font-size: 24px; margin: .15em 1em 0 0 }
         
     | 
| 
      
 16 
     | 
    
         
            +
                h2 { font-size: 24px }
         
     | 
| 
      
 17 
     | 
    
         
            +
                h3 { font-size: 19px }
         
     | 
| 
      
 18 
     | 
    
         
            +
                h4 { font-size: 17px; font-weight: normal; }
         
     | 
| 
      
 19 
     | 
    
         
            +
                h4.ruled { border-bottom: solid 1px #CC9; }
         
     | 
| 
      
 20 
     | 
    
         
            +
                h2.ruled { padding-top: 35px; border-top: solid 1px #AA5; }
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                /* Link styles */
         
     | 
| 
      
 23 
     | 
    
         
            +
                :link, :visited {
         
     | 
| 
      
 24 
     | 
    
         
            +
                    
         
     | 
| 
      
 25 
     | 
    
         
            +
                }
         
     | 
| 
      
 26 
     | 
    
         
            +
                :link:hover, :visited:hover {
         
     | 
| 
      
 27 
     | 
    
         
            +
                    
         
     | 
| 
      
 28 
     | 
    
         
            +
                }
         
     | 
| 
      
 29 
     | 
    
         
            +
                #fullpage {
         
     | 
| 
      
 30 
     | 
    
         
            +
                    width: 720px;
         
     | 
| 
      
 31 
     | 
    
         
            +
                    padding-top: 20px;
         
     | 
| 
      
 32 
     | 
    
         
            +
                    margin: 0 auto;
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
                .page_shade, .page {
         
     | 
| 
      
 35 
     | 
    
         
            +
                    border-left: 1px solid black;
         
     | 
| 
      
 36 
     | 
    
         
            +
                    border-right: 1px solid black;
         
     | 
| 
      
 37 
     | 
    
         
            +
                    border-bottom: 1px solid black;
         
     | 
| 
      
 38 
     | 
    
         
            +
                    background-color: #FFFFFF;
         
     | 
| 
      
 39 
     | 
    
         
            +
                }
         
     | 
| 
      
 40 
     | 
    
         
            +
                .page {
         
     | 
| 
      
 41 
     | 
    
         
            +
                    padding: 20px 35px;
         
     | 
| 
      
 42 
     | 
    
         
            +
                }
         
     | 
| 
      
 43 
     | 
    
         
            +
                .page .header {
         
     | 
| 
      
 44 
     | 
    
         
            +
                    float: right;
         
     | 
| 
      
 45 
     | 
    
         
            +
                    color: #777;
         
     | 
| 
      
 46 
     | 
    
         
            +
                    font-size: 10px;
         
     | 
| 
      
 47 
     | 
    
         
            +
                }
         
     | 
| 
      
 48 
     | 
    
         
            +
                .page h1, .page h2, .page h3 {
         
     | 
| 
      
 49 
     | 
    
         
            +
                    clear: both;
         
     | 
| 
      
 50 
     | 
    
         
            +
                    text-align: center;
         
     | 
| 
      
 51 
     | 
    
         
            +
                }
         
     | 
| 
      
 52 
     | 
    
         
            +
                #pager {
         
     | 
| 
      
 53 
     | 
    
         
            +
                    background-color: #EEEEAE;
         
     | 
| 
      
 54 
     | 
    
         
            +
                    border-top: 2px solid black;
         
     | 
| 
      
 55 
     | 
    
         
            +
                    border-left: 2px solid black;
         
     | 
| 
      
 56 
     | 
    
         
            +
                    border-right: 2px solid black;
         
     | 
| 
      
 57 
     | 
    
         
            +
                    border-bottom: 1px dashed #999966;
         
     | 
| 
      
 58 
     | 
    
         
            +
                    padding: 20px 0 20px 20px;
         
     | 
| 
      
 59 
     | 
    
         
            +
                    color: #666633;
         
     | 
| 
      
 60 
     | 
    
         
            +
                    font-size: 11px;
         
     | 
| 
      
 61 
     | 
    
         
            +
                }
         
     | 
| 
      
 62 
     | 
    
         
            +
                #pager :link, #pager :visited {
         
     | 
| 
      
 63 
     | 
    
         
            +
                    color: #8E2400;
         
     | 
| 
      
 64 
     | 
    
         
            +
                    padding: 0px 5px;
         
     | 
| 
      
 65 
     | 
    
         
            +
                }
         
     | 
| 
      
 66 
     | 
    
         
            +
                #pager :link:hover, #pager :visited:hover {
         
     | 
| 
      
 67 
     | 
    
         
            +
                    color: #8E2400;
         
     | 
| 
      
 68 
     | 
    
         
            +
                }
         
     | 
| 
      
 69 
     | 
    
         
            +
                #pagertd {
         
     | 
| 
      
 70 
     | 
    
         
            +
                  font-size: 11px;
         
     | 
| 
      
 71 
     | 
    
         
            +
                }
         
     | 
| 
      
 72 
     | 
    
         
            +
                #logo { float: left; }
         
     | 
| 
      
 73 
     | 
    
         
            +
                #menu { 
         
     | 
| 
      
 74 
     | 
    
         
            +
                  padding: 4px 12px; 
         
     | 
| 
      
 75 
     | 
    
         
            +
                  margin: 0; 
         
     | 
| 
      
 76 
     | 
    
         
            +
                }
         
     | 
| 
      
 77 
     | 
    
         
            +
                #menu h3 { padding: 0; margin: 0; }
         
     | 
| 
      
 78 
     | 
    
         
            +
                #menu #links { float: right; }
         
     | 
| 
      
 79 
     | 
    
         
            +
                pre { font-weight: bold; color: black; }
         
     | 
| 
      
 80 
     | 
    
         
            +
                tt { color: #703; font-size: 12pt; }
         
     | 
| 
      
 81 
     | 
    
         
            +
                .dyn-source { 
         
     | 
| 
      
 82 
     | 
    
         
            +
                  background-color: #EEEEEE; 
         
     | 
| 
      
 83 
     | 
    
         
            +
                  border: 1px solid #CCCCCC; 
         
     | 
| 
      
 84 
     | 
    
         
            +
                  padding: 4px 8px; 
         
     | 
| 
      
 85 
     | 
    
         
            +
                  margin: 0; 
         
     | 
| 
      
 86 
     | 
    
         
            +
                display: none; }
         
     | 
| 
      
 87 
     | 
    
         
            +
                .dyn-source pre  { 
         
     | 
| 
      
 88 
     | 
    
         
            +
                  color: #000000; 
         
     | 
| 
      
 89 
     | 
    
         
            +
                  font-size: 8pt; 
         
     | 
| 
      
 90 
     | 
    
         
            +
                  font-familly: monospace;
         
     | 
| 
      
 91 
     | 
    
         
            +
                  
         
     | 
| 
      
 92 
     | 
    
         
            +
                }
         
     | 
| 
      
 93 
     | 
    
         
            +
                .source-link     { text-align: right; font-size: 8pt; }
         
     | 
| 
      
 94 
     | 
    
         
            +
                .ruby-comment    { color: black; font-style: italic }
         
     | 
| 
      
 95 
     | 
    
         
            +
                .ruby-constant   { color: #123456; font-weight: bold; }
         
     | 
| 
      
 96 
     | 
    
         
            +
                .ruby-identifier { color: #005599;  }
         
     | 
| 
      
 97 
     | 
    
         
            +
                .ruby-ivar       { color: orange; }
         
     | 
| 
      
 98 
     | 
    
         
            +
                .ruby-keyword    { color: red; font-weight: bold }
         
     | 
| 
      
 99 
     | 
    
         
            +
                .ruby-node       { color: #FFFFFF; }
         
     | 
| 
      
 100 
     | 
    
         
            +
                .ruby-operator   { color: #055005;  }
         
     | 
| 
      
 101 
     | 
    
         
            +
                .ruby-regexp     { color: #DDFFDD; }
         
     | 
| 
      
 102 
     | 
    
         
            +
                .ruby-value      { color: #FFAAAA; font-style: italic }
         
     | 
| 
      
 103 
     | 
    
         
            +
                .kw { color: red; font-weight: bold }
         
     | 
| 
      
 104 
     | 
    
         
            +
                .cmt { color: green; font-style: italic }
         
     | 
| 
      
 105 
     | 
    
         
            +
                .str { color: #EECCCC; font-style: italic }
         
     | 
| 
      
 106 
     | 
    
         
            +
                .re  { color: #EECCCC; }
         
     | 
    
        data/doc/rdoc/rubyfr.png
    ADDED
    
    | 
         Binary file 
     | 
    
        data/examples/blog.log
    ADDED
    
    | 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Logfile created on Thu Mar 05 14:37:14 +0100 2009 by /
         
     | 
| 
      
 2 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:17] "GET / HTTP/1.1" 200 424 0.0134
         
     | 
| 
      
 3 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:17] "GET /favicon.ico HTTP/1.1" 200 424 0.0076
         
     | 
| 
      
 4 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:19] "GET /8650ac90-ebb8-012b-4e10-002332b2a7fc/2808417976 HTTP/1.1" 302 - 0.0083
         
     | 
| 
      
 5 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:19] "GET / HTTP/1.1" 200 246 0.0077
         
     | 
| 
      
 6 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:20] "GET  HTTP/1.1" 200 280 0.0015
         
     | 
| 
      
 7 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:45] "POST  HTTP/1.1" 500 101939 0.2057
         
     | 
| 
      
 8 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:56] "POST  HTTP/1.1" 500 102076 0.1473
         
     | 
| 
      
 9 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:56] "GET /favicon.ico HTTP/1.1" 200 246 0.0068
         
     | 
| 
      
 10 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:37:59] "GET / HTTP/1.1" 200 246 0.0064
         
     | 
| 
      
 11 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:38:00] "GET  HTTP/1.1" 200 280 0.0019
         
     | 
| 
      
 12 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:38:08] "POST  HTTP/1.1" 302 - 0.0093
         
     | 
| 
      
 13 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:38:08] "GET / HTTP/1.1" 200 416 0.0110
         
     | 
| 
      
 14 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:38:45] "GET  HTTP/1.1" 200 280 0.0030
         
     | 
| 
      
 15 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:39:23] "POST  HTTP/1.1" 500 102140 0.1681
         
     | 
| 
      
 16 
     | 
    
         
            +
            ::1 - - [05/Mar/2009 14:41:01] "GET / HTTP/1.1" 200 416 0.0081
         
     | 
    
        data/examples/blog.rb
    ADDED
    
    | 
         @@ -0,0 +1,62 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $:.unshift( "../lib" )
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'capcode'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'couch_foo'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            CouchFoo::Base.set_database(:host => "http://localhost:5984", :database => "my_blog")
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            class Story < CouchFoo::Base
         
     | 
| 
      
 9 
     | 
    
         
            +
              property :title, String
         
     | 
| 
      
 10 
     | 
    
         
            +
              property :body, String
         
     | 
| 
      
 11 
     | 
    
         
            +
              property :date, String
         
     | 
| 
      
 12 
     | 
    
         
            +
            end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            module Capcode
         
     | 
| 
      
 15 
     | 
    
         
            +
              class HTTPError
         
     | 
| 
      
 16 
     | 
    
         
            +
                def r404(f)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  "Pas glop !!! #{f} est inconnu !!!"
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
              
         
     | 
| 
      
 21 
     | 
    
         
            +
              class Index < Route '/'
         
     | 
| 
      
 22 
     | 
    
         
            +
                def get
         
     | 
| 
      
 23 
     | 
    
         
            +
                  r = "<html><body>"
         
     | 
| 
      
 24 
     | 
    
         
            +
                  
         
     | 
| 
      
 25 
     | 
    
         
            +
                  story = Story.find( :all )
         
     | 
| 
      
 26 
     | 
    
         
            +
                  
         
     | 
| 
      
 27 
     | 
    
         
            +
                  story.each do |s|
         
     | 
| 
      
 28 
     | 
    
         
            +
                    r += "<h2>#{s.title}</h2><small>#{s.date} - <a href='#{URL( Remove, s.id, s.rev )}'>Delete this entry</a></small><p>#{s.body}</p>"
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  
         
     | 
| 
      
 31 
     | 
    
         
            +
                  r+"<hr /><a href='#{URL(Add)}'>Add a new entry</a></body></html>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
              
         
     | 
| 
      
 35 
     | 
    
         
            +
              class Remove < Route '/remove/([^\/]*)/(.*)'
         
     | 
| 
      
 36 
     | 
    
         
            +
                def get( id, rev )
         
     | 
| 
      
 37 
     | 
    
         
            +
                  Story.delete(id, rev)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  redirect( Index )
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
              
         
     | 
| 
      
 42 
     | 
    
         
            +
              class Add < Route '/add'
         
     | 
| 
      
 43 
     | 
    
         
            +
                def get
         
     | 
| 
      
 44 
     | 
    
         
            +
                  '
         
     | 
| 
      
 45 
     | 
    
         
            +
                    <html><body>
         
     | 
| 
      
 46 
     | 
    
         
            +
                      <h1>Add a new entry</h1>
         
     | 
| 
      
 47 
     | 
    
         
            +
                      <form method="POST">
         
     | 
| 
      
 48 
     | 
    
         
            +
                        Titre : <input type="text" name="title"><br />
         
     | 
| 
      
 49 
     | 
    
         
            +
                        <textarea name="body"></textarea><br />
         
     | 
| 
      
 50 
     | 
    
         
            +
                        <input type="submit">
         
     | 
| 
      
 51 
     | 
    
         
            +
                      </form>
         
     | 
| 
      
 52 
     | 
    
         
            +
                    </body></html>
         
     | 
| 
      
 53 
     | 
    
         
            +
                  '
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
                def post
         
     | 
| 
      
 56 
     | 
    
         
            +
                  Story.create( :title => params['title'], :body => params['body'], :date => Time.now.to_s )
         
     | 
| 
      
 57 
     | 
    
         
            +
                  redirect( Index )
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
            end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            Capcode.run( :port => 3001, :host => "localhost", :log => "blog.log" )
         
     | 
    
        data/examples/index.html
    ADDED
    
    
    
        data/examples/sample.rb
    ADDED
    
    | 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $:.unshift( "../lib" )
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'capcode'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Capcode
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Helpers
         
     | 
| 
      
 6 
     | 
    
         
            +
                def bold( &b )
         
     | 
| 
      
 7 
     | 
    
         
            +
                  "<b>"+yield+"</b>"
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            module Capcode
         
     | 
| 
      
 13 
     | 
    
         
            +
              class HTTPError
         
     | 
| 
      
 14 
     | 
    
         
            +
                def r404(f)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  "Pas glop !!! #{f} est inconnu !!!"
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
              
         
     | 
| 
      
 19 
     | 
    
         
            +
              class Hello < Route '/hello/(.*)'
         
     | 
| 
      
 20 
     | 
    
         
            +
                def get( you )
         
     | 
| 
      
 21 
     | 
    
         
            +
                  you = "you" if you.nil?
         
     | 
| 
      
 22 
     | 
    
         
            +
                  
         
     | 
| 
      
 23 
     | 
    
         
            +
                  session = { :user => you }
         
     | 
| 
      
 24 
     | 
    
         
            +
                  
         
     | 
| 
      
 25 
     | 
    
         
            +
                  "Hello " + bold { you } + " it's '#{Time.now} !"
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
              
         
     | 
| 
      
 29 
     | 
    
         
            +
              class Redir < Route '/r'
         
     | 
| 
      
 30 
     | 
    
         
            +
                def get
         
     | 
| 
      
 31 
     | 
    
         
            +
                  redirect( Hello, "Greg" )
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
              
         
     | 
| 
      
 35 
     | 
    
         
            +
              class Glop < Route '/glop/(.*)', '/glop/code/([^\/]*)/(.*)'
         
     | 
| 
      
 36 
     | 
    
         
            +
                def get( r, v )
         
     | 
| 
      
 37 
     | 
    
         
            +
                  "Glop receive #{r}, type #{r.class} and #{v}, type #{v.class} from #{URL(Glop)}"
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
              
         
     | 
| 
      
 41 
     | 
    
         
            +
              class Js < Route '/toto'
         
     | 
| 
      
 42 
     | 
    
         
            +
                def get
         
     | 
| 
      
 43 
     | 
    
         
            +
                  json( { :some => 'json', :stuff => ['here'] } )
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
              
         
     | 
| 
      
 47 
     | 
    
         
            +
              class Env < Route '/env'
         
     | 
| 
      
 48 
     | 
    
         
            +
                def get
         
     | 
| 
      
 49 
     | 
    
         
            +
                  x = env.map do |k,v|
         
     | 
| 
      
 50 
     | 
    
         
            +
                    "#{k} => #{v}"
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end.join( "<br />\n" )      
         
     | 
| 
      
 52 
     | 
    
         
            +
                  x
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            Capcode.map( "/file" ) do
         
     | 
| 
      
 58 
     | 
    
         
            +
              Rack::File.new( "." )
         
     | 
| 
      
 59 
     | 
    
         
            +
            end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            Capcode.run( :port => 3001, :host => "localhost" )
         
     | 
    
        data/examples/session.rb
    ADDED
    
    | 
         @@ -0,0 +1,47 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $:.unshift( "../lib" )
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'capcode'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Capcode
         
     | 
| 
      
 5 
     | 
    
         
            +
              class HTTPError
         
     | 
| 
      
 6 
     | 
    
         
            +
                def r404(f)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  "#{f} not found !!!"
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
              
         
     | 
| 
      
 11 
     | 
    
         
            +
              class Index < Route '/'
         
     | 
| 
      
 12 
     | 
    
         
            +
                def get
         
     | 
| 
      
 13 
     | 
    
         
            +
                  redirect( Hello, session[:user] )
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
              class Hello < Route '/hello/(.*)'
         
     | 
| 
      
 18 
     | 
    
         
            +
                def get( you )
         
     | 
| 
      
 19 
     | 
    
         
            +
                  if you.nil?
         
     | 
| 
      
 20 
     | 
    
         
            +
                    redirect( WhoAreYou )
         
     | 
| 
      
 21 
     | 
    
         
            +
                  else
         
     | 
| 
      
 22 
     | 
    
         
            +
                    " 
         
     | 
| 
      
 23 
     | 
    
         
            +
                      Hello #{you}<br />
         
     | 
| 
      
 24 
     | 
    
         
            +
                      Clic <a href='#{URL(Hello)}'>here</a> if hou want to change your name
         
     | 
| 
      
 25 
     | 
    
         
            +
                    "
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
              
         
     | 
| 
      
 30 
     | 
    
         
            +
              class WhoAreYou < Route '/who_are_you'
         
     | 
| 
      
 31 
     | 
    
         
            +
                def get
         
     | 
| 
      
 32 
     | 
    
         
            +
                  '
         
     | 
| 
      
 33 
     | 
    
         
            +
                    Please, enter your name :<br />
         
     | 
| 
      
 34 
     | 
    
         
            +
                    <form method="POST">
         
     | 
| 
      
 35 
     | 
    
         
            +
                      <input type="text", name="user"><br />
         
     | 
| 
      
 36 
     | 
    
         
            +
                      <input type="submit">
         
     | 
| 
      
 37 
     | 
    
         
            +
                    </form>
         
     | 
| 
      
 38 
     | 
    
         
            +
                  '
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
                def post
         
     | 
| 
      
 41 
     | 
    
         
            +
                  session[:user] = params['user']
         
     | 
| 
      
 42 
     | 
    
         
            +
                  redirect( Index )
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            Capcode.run( :port => 3000, :host => "localhost" )
         
     | 
    
        data/lib/capcode.rb
    ADDED
    
    | 
         @@ -0,0 +1,293 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rack'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'logger'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'capcode/core_ext'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module Capcode
         
     | 
| 
      
 8 
     | 
    
         
            +
              CAPCOD_VERION="0.2.0"
         
     | 
| 
      
 9 
     | 
    
         
            +
              @@__ROUTES = {}
         
     | 
| 
      
 10 
     | 
    
         
            +
              
         
     | 
| 
      
 11 
     | 
    
         
            +
              class ParameterError < ArgumentError
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
              
         
     | 
| 
      
 14 
     | 
    
         
            +
              # Helpers contains methods available in your controllers
         
     | 
| 
      
 15 
     | 
    
         
            +
              module Helpers
         
     | 
| 
      
 16 
     | 
    
         
            +
                # Help you to return a JSON response
         
     | 
| 
      
 17 
     | 
    
         
            +
                #
         
     | 
| 
      
 18 
     | 
    
         
            +
                #   module Capcode
         
     | 
| 
      
 19 
     | 
    
         
            +
                #     class JsonResponse < Route '/json/([^\/]*)/(.*)'
         
     | 
| 
      
 20 
     | 
    
         
            +
                #       def get( arg1, arg2 )
         
     | 
| 
      
 21 
     | 
    
         
            +
                #         json( { :1 => arg1, :2 => arg2 })
         
     | 
| 
      
 22 
     | 
    
         
            +
                #       end
         
     | 
| 
      
 23 
     | 
    
         
            +
                #     end
         
     | 
| 
      
 24 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 25 
     | 
    
         
            +
                def json( d )
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @response['Content-Type'] = 'application/json'
         
     | 
| 
      
 27 
     | 
    
         
            +
                  d.to_json
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
                
         
     | 
| 
      
 30 
     | 
    
         
            +
                # Send a redirect response
         
     | 
| 
      
 31 
     | 
    
         
            +
                #
         
     | 
| 
      
 32 
     | 
    
         
            +
                #   module Capcode
         
     | 
| 
      
 33 
     | 
    
         
            +
                #     class Hello < Route '/hello/(.*)'
         
     | 
| 
      
 34 
     | 
    
         
            +
                #       def get( you )
         
     | 
| 
      
 35 
     | 
    
         
            +
                #         if you.nil?
         
     | 
| 
      
 36 
     | 
    
         
            +
                #           redirect( WhoAreYou )
         
     | 
| 
      
 37 
     | 
    
         
            +
                #         else
         
     | 
| 
      
 38 
     | 
    
         
            +
                #           ...
         
     | 
| 
      
 39 
     | 
    
         
            +
                #         end
         
     | 
| 
      
 40 
     | 
    
         
            +
                #       end
         
     | 
| 
      
 41 
     | 
    
         
            +
                #     end    
         
     | 
| 
      
 42 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 43 
     | 
    
         
            +
                def redirect( klass, *a )
         
     | 
| 
      
 44 
     | 
    
         
            +
                  [302, {'Location' => URL(klass, *a)}, '']
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
                
         
     | 
| 
      
 47 
     | 
    
         
            +
                # Builds an URL route to a controller or a path
         
     | 
| 
      
 48 
     | 
    
         
            +
                #
         
     | 
| 
      
 49 
     | 
    
         
            +
                # if you declare the controller Hello :
         
     | 
| 
      
 50 
     | 
    
         
            +
                # 
         
     | 
| 
      
 51 
     | 
    
         
            +
                #   module Capcode
         
     | 
| 
      
 52 
     | 
    
         
            +
                #     class Hello < Route '/hello/(.*)'
         
     | 
| 
      
 53 
     | 
    
         
            +
                #       ...
         
     | 
| 
      
 54 
     | 
    
         
            +
                #     end
         
     | 
| 
      
 55 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 56 
     | 
    
         
            +
                # 
         
     | 
| 
      
 57 
     | 
    
         
            +
                # then
         
     | 
| 
      
 58 
     | 
    
         
            +
                # 
         
     | 
| 
      
 59 
     | 
    
         
            +
                #   URL( Hello, "you" ) # => /hello/you
         
     | 
| 
      
 60 
     | 
    
         
            +
                def URL( klass, *a )
         
     | 
| 
      
 61 
     | 
    
         
            +
                  path = nil
         
     | 
| 
      
 62 
     | 
    
         
            +
                  a = a.delete_if{ |x| x.nil? }
         
     | 
| 
      
 63 
     | 
    
         
            +
                  
         
     | 
| 
      
 64 
     | 
    
         
            +
                  if klass.class == Class
         
     | 
| 
      
 65 
     | 
    
         
            +
                    Capcode.routes.each do |p, k|
         
     | 
| 
      
 66 
     | 
    
         
            +
                      path = p if k.class == klass
         
     | 
| 
      
 67 
     | 
    
         
            +
                    end
         
     | 
| 
      
 68 
     | 
    
         
            +
                  else
         
     | 
| 
      
 69 
     | 
    
         
            +
                    path = klass
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                  
         
     | 
| 
      
 72 
     | 
    
         
            +
                  path+((a.size>0)?("/"+a.join("/")):(""))
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
              end
         
     | 
| 
      
 75 
     | 
    
         
            +
              
         
     | 
| 
      
 76 
     | 
    
         
            +
              include Rack
         
     | 
| 
      
 77 
     | 
    
         
            +
              
         
     | 
| 
      
 78 
     | 
    
         
            +
              # HTTPError help you to create your own 404, 500 and/or 501 response
         
     | 
| 
      
 79 
     | 
    
         
            +
              # 
         
     | 
| 
      
 80 
     | 
    
         
            +
              # To create a custom 404 reponse, create a fonction HTTPError.r404 in
         
     | 
| 
      
 81 
     | 
    
         
            +
              # your application :
         
     | 
| 
      
 82 
     | 
    
         
            +
              #
         
     | 
| 
      
 83 
     | 
    
         
            +
              #   module Capcode
         
     | 
| 
      
 84 
     | 
    
         
            +
              #     class HTTPError
         
     | 
| 
      
 85 
     | 
    
         
            +
              #       def r404(f)
         
     | 
| 
      
 86 
     | 
    
         
            +
              #         "#{f} not found :("
         
     | 
| 
      
 87 
     | 
    
         
            +
              #       end
         
     | 
| 
      
 88 
     | 
    
         
            +
              #     end
         
     | 
| 
      
 89 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 90 
     | 
    
         
            +
              #
         
     | 
| 
      
 91 
     | 
    
         
            +
              # Do the same (r500 and r501) to customize 500 and 501 errors
         
     | 
| 
      
 92 
     | 
    
         
            +
              class HTTPError
         
     | 
| 
      
 93 
     | 
    
         
            +
                def initialize(app)#:nodoc:
         
     | 
| 
      
 94 
     | 
    
         
            +
                  @app = app
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                def call(env) #:nodoc:
         
     | 
| 
      
 98 
     | 
    
         
            +
                  status, headers, body = @app.call(env)
         
     | 
| 
      
 99 
     | 
    
         
            +
                  
         
     | 
| 
      
 100 
     | 
    
         
            +
                  if self.methods.include? "r#{status}"
         
     | 
| 
      
 101 
     | 
    
         
            +
                    body = self.call "r#{status}", env['REQUEST_PATH']
         
     | 
| 
      
 102 
     | 
    
         
            +
                    headers['Content-Length'] = body.length.to_s
         
     | 
| 
      
 103 
     | 
    
         
            +
                  end
         
     | 
| 
      
 104 
     | 
    
         
            +
                  
         
     | 
| 
      
 105 
     | 
    
         
            +
                  [status, headers, body]
         
     | 
| 
      
 106 
     | 
    
         
            +
                end
         
     | 
| 
      
 107 
     | 
    
         
            +
              end
         
     | 
| 
      
 108 
     | 
    
         
            +
              
         
     | 
| 
      
 109 
     | 
    
         
            +
              class << self
         
     | 
| 
      
 110 
     | 
    
         
            +
                # Add routes to a controller class
         
     | 
| 
      
 111 
     | 
    
         
            +
                # 
         
     | 
| 
      
 112 
     | 
    
         
            +
                #   module Capcode
         
     | 
| 
      
 113 
     | 
    
         
            +
                #     class Hello < Route '/hello/(.*)', '/hello/([^#]*)#(.*)'
         
     | 
| 
      
 114 
     | 
    
         
            +
                #       def get( arg1, arg2 )
         
     | 
| 
      
 115 
     | 
    
         
            +
                #         ...
         
     | 
| 
      
 116 
     | 
    
         
            +
                #       end
         
     | 
| 
      
 117 
     | 
    
         
            +
                #     end
         
     | 
| 
      
 118 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 119 
     | 
    
         
            +
                #
         
     | 
| 
      
 120 
     | 
    
         
            +
                # In the <tt>get</tt> method, you will receive the maximum of parameters declared
         
     | 
| 
      
 121 
     | 
    
         
            +
                # by the routes. In this example, you will receive 2 parameters. So if you
         
     | 
| 
      
 122 
     | 
    
         
            +
                # go to <tt>/hello/world#friend</tt> then <tt>arg1</tt> will be set to <tt>world</tt> and <tt>arg2</tt>
         
     | 
| 
      
 123 
     | 
    
         
            +
                # will be set to <tt>friend</tt>. Now if you go to <tt>/hello/you</tt>, then <tt>arg1</tt> will
         
     | 
| 
      
 124 
     | 
    
         
            +
                # be set to <tt>you</tt> and <tt>arg2</tt> will be set to <tt>nil</tt>
         
     | 
| 
      
 125 
     | 
    
         
            +
                # 
         
     | 
| 
      
 126 
     | 
    
         
            +
                # If the regexp in the route does not match, all arguments will be <tt>nil</tt>
         
     | 
| 
      
 127 
     | 
    
         
            +
                def Route *u
         
     | 
| 
      
 128 
     | 
    
         
            +
                  Class.new {
         
     | 
| 
      
 129 
     | 
    
         
            +
                    meta_def(:__urls__){
         
     | 
| 
      
 130 
     | 
    
         
            +
                      # < Route '/hello/world/([^\/]*)/id(\d*)', '/hello/(.*)'
         
     | 
| 
      
 131 
     | 
    
         
            +
                      # # => [ {'/hello/world' => '([^\/]*)/id(\d*)', '/hello' => '(.*)'}, 2, <Capcode::Klass> ]
         
     | 
| 
      
 132 
     | 
    
         
            +
                      h = {}
         
     | 
| 
      
 133 
     | 
    
         
            +
                      max = 0
         
     | 
| 
      
 134 
     | 
    
         
            +
                      u.each do |_u|
         
     | 
| 
      
 135 
     | 
    
         
            +
                        m = /\/([^\/]*\(.*)/.match( _u )
         
     | 
| 
      
 136 
     | 
    
         
            +
                        if m.nil?
         
     | 
| 
      
 137 
     | 
    
         
            +
                          h[_u] = ''
         
     | 
| 
      
 138 
     | 
    
         
            +
                        else
         
     | 
| 
      
 139 
     | 
    
         
            +
                          h[m.pre_match] = m.captures[0]
         
     | 
| 
      
 140 
     | 
    
         
            +
                          max = Regexp.new(m.captures[0]).number_of_captures if max < Regexp.new(m.captures[0]).number_of_captures
         
     | 
| 
      
 141 
     | 
    
         
            +
                        end
         
     | 
| 
      
 142 
     | 
    
         
            +
                      end
         
     | 
| 
      
 143 
     | 
    
         
            +
                      [h, max, self]
         
     | 
| 
      
 144 
     | 
    
         
            +
                    }
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
                    # Hash containing all the request parameters (GET or POST)
         
     | 
| 
      
 147 
     | 
    
         
            +
                    def params
         
     | 
| 
      
 148 
     | 
    
         
            +
                      @request.params
         
     | 
| 
      
 149 
     | 
    
         
            +
                    end
         
     | 
| 
      
 150 
     | 
    
         
            +
                    
         
     | 
| 
      
 151 
     | 
    
         
            +
                    # Hash containing all the environment variables
         
     | 
| 
      
 152 
     | 
    
         
            +
                    def env
         
     | 
| 
      
 153 
     | 
    
         
            +
                      @env
         
     | 
| 
      
 154 
     | 
    
         
            +
                    end
         
     | 
| 
      
 155 
     | 
    
         
            +
                    
         
     | 
| 
      
 156 
     | 
    
         
            +
                    # Hash session
         
     | 
| 
      
 157 
     | 
    
         
            +
                    def session
         
     | 
| 
      
 158 
     | 
    
         
            +
                      @env['rack.session']
         
     | 
| 
      
 159 
     | 
    
         
            +
                    end
         
     | 
| 
      
 160 
     | 
    
         
            +
                    
         
     | 
| 
      
 161 
     | 
    
         
            +
                    # Return the Rack::Request object
         
     | 
| 
      
 162 
     | 
    
         
            +
                    def request
         
     | 
| 
      
 163 
     | 
    
         
            +
                      @request
         
     | 
| 
      
 164 
     | 
    
         
            +
                    end
         
     | 
| 
      
 165 
     | 
    
         
            +
                    
         
     | 
| 
      
 166 
     | 
    
         
            +
                    # Return the Rack::Response object
         
     | 
| 
      
 167 
     | 
    
         
            +
                    def response
         
     | 
| 
      
 168 
     | 
    
         
            +
                      @response
         
     | 
| 
      
 169 
     | 
    
         
            +
                    end
         
     | 
| 
      
 170 
     | 
    
         
            +
                    
         
     | 
| 
      
 171 
     | 
    
         
            +
                    def call( e ) #:nodoc:
         
     | 
| 
      
 172 
     | 
    
         
            +
                      @env = e
         
     | 
| 
      
 173 
     | 
    
         
            +
                      @response = Rack::Response.new
         
     | 
| 
      
 174 
     | 
    
         
            +
                      @request = Rack::Request.new(@env)
         
     | 
| 
      
 175 
     | 
    
         
            +
             
     | 
| 
      
 176 
     | 
    
         
            +
                      r = case @env["REQUEST_METHOD"]
         
     | 
| 
      
 177 
     | 
    
         
            +
                        when "GET"
         
     | 
| 
      
 178 
     | 
    
         
            +
                          sc = @request.script_name
         
     | 
| 
      
 179 
     | 
    
         
            +
                          sc = "/" if sc.size == 0
         
     | 
| 
      
 180 
     | 
    
         
            +
                          regexp = Regexp.new( self.class.__urls__[0][sc] )
         
     | 
| 
      
 181 
     | 
    
         
            +
                          nargs = self.class.__urls__[1]
         
     | 
| 
      
 182 
     | 
    
         
            +
                          
         
     | 
| 
      
 183 
     | 
    
         
            +
                          args = regexp.match( Rack::Utils.unescape(@request.path_info).gsub( /^\//, "" ) )
         
     | 
| 
      
 184 
     | 
    
         
            +
                          if args.nil?
         
     | 
| 
      
 185 
     | 
    
         
            +
                            raise Capcode::ParameterError, "Path info `#{@request.path_info}' does not match route regexp `#{regexp.source}'"
         
     | 
| 
      
 186 
     | 
    
         
            +
                          else
         
     | 
| 
      
 187 
     | 
    
         
            +
                            args = args.captures
         
     | 
| 
      
 188 
     | 
    
         
            +
                          end
         
     | 
| 
      
 189 
     | 
    
         
            +
                          
         
     | 
| 
      
 190 
     | 
    
         
            +
                          while args.size < nargs
         
     | 
| 
      
 191 
     | 
    
         
            +
                            args << nil
         
     | 
| 
      
 192 
     | 
    
         
            +
                          end
         
     | 
| 
      
 193 
     | 
    
         
            +
                                                      
         
     | 
| 
      
 194 
     | 
    
         
            +
                          get( *args )
         
     | 
| 
      
 195 
     | 
    
         
            +
                        when "POST"
         
     | 
| 
      
 196 
     | 
    
         
            +
                          post
         
     | 
| 
      
 197 
     | 
    
         
            +
                      end
         
     | 
| 
      
 198 
     | 
    
         
            +
                      if r.respond_to?(:to_ary)
         
     | 
| 
      
 199 
     | 
    
         
            +
                        @response.status = r[0]
         
     | 
| 
      
 200 
     | 
    
         
            +
                        r[1].each do |k,v|
         
     | 
| 
      
 201 
     | 
    
         
            +
                          @response[k] = v
         
     | 
| 
      
 202 
     | 
    
         
            +
                        end
         
     | 
| 
      
 203 
     | 
    
         
            +
                        @response.body = r[2]
         
     | 
| 
      
 204 
     | 
    
         
            +
                      else
         
     | 
| 
      
 205 
     | 
    
         
            +
                        @response.write r
         
     | 
| 
      
 206 
     | 
    
         
            +
                      end
         
     | 
| 
      
 207 
     | 
    
         
            +
                      
         
     | 
| 
      
 208 
     | 
    
         
            +
                      @response.finish
         
     | 
| 
      
 209 
     | 
    
         
            +
                    end
         
     | 
| 
      
 210 
     | 
    
         
            +
                            
         
     | 
| 
      
 211 
     | 
    
         
            +
                    include Capcode::Helpers
         
     | 
| 
      
 212 
     | 
    
         
            +
                  }      
         
     | 
| 
      
 213 
     | 
    
         
            +
                end
         
     | 
| 
      
 214 
     | 
    
         
            +
              
         
     | 
| 
      
 215 
     | 
    
         
            +
                # This method help you to map and URL to a Rack or What you want Helper
         
     | 
| 
      
 216 
     | 
    
         
            +
                # 
         
     | 
| 
      
 217 
     | 
    
         
            +
                #   Capcode.map( "/file" ) do
         
     | 
| 
      
 218 
     | 
    
         
            +
                #     Rack::File.new( "." )
         
     | 
| 
      
 219 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 220 
     | 
    
         
            +
                def map( r, &b )
         
     | 
| 
      
 221 
     | 
    
         
            +
                  @@__ROUTES[r] = yield
         
     | 
| 
      
 222 
     | 
    
         
            +
                end
         
     | 
| 
      
 223 
     | 
    
         
            +
              
         
     | 
| 
      
 224 
     | 
    
         
            +
                # Start your application.
         
     | 
| 
      
 225 
     | 
    
         
            +
                # 
         
     | 
| 
      
 226 
     | 
    
         
            +
                # Options :
         
     | 
| 
      
 227 
     | 
    
         
            +
                # * <tt>:port</tt> = Listen port 
         
     | 
| 
      
 228 
     | 
    
         
            +
                # * <tt>:host</tt> = Listen host
         
     | 
| 
      
 229 
     | 
    
         
            +
                # * <tt>:server</tt> = Server type (webrick or mongrel)
         
     | 
| 
      
 230 
     | 
    
         
            +
                # * <tt>:log</tt> = Output logfile (default: STDOUT)
         
     | 
| 
      
 231 
     | 
    
         
            +
                # * <tt>:session</tt> = Session parameters. See Rack::Session for more informations
         
     | 
| 
      
 232 
     | 
    
         
            +
                def run( args = {} )
         
     | 
| 
      
 233 
     | 
    
         
            +
                  conf = {
         
     | 
| 
      
 234 
     | 
    
         
            +
                    :port => args[:port]||3000, 
         
     | 
| 
      
 235 
     | 
    
         
            +
                    :host => args[:host]||"localhost",
         
     | 
| 
      
 236 
     | 
    
         
            +
                    :server => args[:server]||nil,
         
     | 
| 
      
 237 
     | 
    
         
            +
                    :log => args[:log]||$stdout,
         
     | 
| 
      
 238 
     | 
    
         
            +
                    :session => args[:session]||{}
         
     | 
| 
      
 239 
     | 
    
         
            +
                  }
         
     | 
| 
      
 240 
     | 
    
         
            +
                  
         
     | 
| 
      
 241 
     | 
    
         
            +
                  # Check that mongrel exists 
         
     | 
| 
      
 242 
     | 
    
         
            +
                  if conf[:server].nil? || conf[:server] == "mongrel"
         
     | 
| 
      
 243 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 244 
     | 
    
         
            +
                      require 'mongrel'
         
     | 
| 
      
 245 
     | 
    
         
            +
                      conf[:server] = "mongrel"
         
     | 
| 
      
 246 
     | 
    
         
            +
                    rescue LoadError 
         
     | 
| 
      
 247 
     | 
    
         
            +
                      puts "!! could not load mongrel. Falling back to webrick."
         
     | 
| 
      
 248 
     | 
    
         
            +
                      conf[:server] = "webrick"
         
     | 
| 
      
 249 
     | 
    
         
            +
                    end
         
     | 
| 
      
 250 
     | 
    
         
            +
                  end
         
     | 
| 
      
 251 
     | 
    
         
            +
                      
         
     | 
| 
      
 252 
     | 
    
         
            +
                  Capcode.constants.each do |k|
         
     | 
| 
      
 253 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 254 
     | 
    
         
            +
                      if eval "Capcode::#{k}.public_methods(true).include?( '__urls__' )"
         
     | 
| 
      
 255 
     | 
    
         
            +
                        u, m, c = eval "Capcode::#{k}.__urls__"
         
     | 
| 
      
 256 
     | 
    
         
            +
                        u.keys.each do |_u|
         
     | 
| 
      
 257 
     | 
    
         
            +
                          @@__ROUTES[_u] = c.new
         
     | 
| 
      
 258 
     | 
    
         
            +
                        end
         
     | 
| 
      
 259 
     | 
    
         
            +
                      end
         
     | 
| 
      
 260 
     | 
    
         
            +
                    rescue => e
         
     | 
| 
      
 261 
     | 
    
         
            +
                      raise e.message
         
     | 
| 
      
 262 
     | 
    
         
            +
                    end
         
     | 
| 
      
 263 
     | 
    
         
            +
                  end
         
     | 
| 
      
 264 
     | 
    
         
            +
                  
         
     | 
| 
      
 265 
     | 
    
         
            +
                  app = Rack::URLMap.new(@@__ROUTES)
         
     | 
| 
      
 266 
     | 
    
         
            +
                  app = Rack::Session::Cookie.new( app, conf[:session] )
         
     | 
| 
      
 267 
     | 
    
         
            +
                  app = Capcode::HTTPError.new(app)
         
     | 
| 
      
 268 
     | 
    
         
            +
                  app = Rack::ContentLength.new(app)
         
     | 
| 
      
 269 
     | 
    
         
            +
                  app = Rack::Lint.new(app)
         
     | 
| 
      
 270 
     | 
    
         
            +
                  app = Rack::ShowExceptions.new(app)
         
     | 
| 
      
 271 
     | 
    
         
            +
            #      app = Rack::Reloader.new(app) ## -- NE RELOAD QUE capcode.rb -- So !!!
         
     | 
| 
      
 272 
     | 
    
         
            +
                  app = Rack::CommonLogger.new( app, Logger.new(conf[:log]) )
         
     | 
| 
      
 273 
     | 
    
         
            +
                  
         
     | 
| 
      
 274 
     | 
    
         
            +
                  
         
     | 
| 
      
 275 
     | 
    
         
            +
                  case conf[:server]
         
     | 
| 
      
 276 
     | 
    
         
            +
                  when "mongrel"
         
     | 
| 
      
 277 
     | 
    
         
            +
                    puts "** Starting Mongrel on #{conf[:host]}:#{conf[:port]}"
         
     | 
| 
      
 278 
     | 
    
         
            +
                    Rack::Handler::Mongrel.run( app, {:Port => conf[:port], :Host => conf[:host]} ) { |server|
         
     | 
| 
      
 279 
     | 
    
         
            +
                      trap "SIGINT", proc { server.stop }
         
     | 
| 
      
 280 
     | 
    
         
            +
                    }
         
     | 
| 
      
 281 
     | 
    
         
            +
                  when "webrick"
         
     | 
| 
      
 282 
     | 
    
         
            +
                    puts "** Starting WEBrick on #{conf[:host]}:#{conf[:port]}"
         
     | 
| 
      
 283 
     | 
    
         
            +
                    Rack::Handler::WEBrick.run( app, {:Port => conf[:port], :BindAddress => conf[:host]} ) { |server|
         
     | 
| 
      
 284 
     | 
    
         
            +
                      trap "SIGINT", proc { server.shutdown }
         
     | 
| 
      
 285 
     | 
    
         
            +
                    }
         
     | 
| 
      
 286 
     | 
    
         
            +
                  end
         
     | 
| 
      
 287 
     | 
    
         
            +
                end
         
     | 
| 
      
 288 
     | 
    
         
            +
             
     | 
| 
      
 289 
     | 
    
         
            +
                def routes #:nodoc:
         
     | 
| 
      
 290 
     | 
    
         
            +
                  @@__ROUTES
         
     | 
| 
      
 291 
     | 
    
         
            +
                end
         
     | 
| 
      
 292 
     | 
    
         
            +
              end
         
     | 
| 
      
 293 
     | 
    
         
            +
            end
         
     |