Capcode 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -68,6 +68,7 @@
68
68
  <a href="../../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -68,6 +68,7 @@
68
68
  <a href="../../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -127,21 +128,21 @@ then
127
128
  <p class="source-link">[ <a href="javascript:toggleSource('M000011_source')" id="l_M000011_source">show source</a> ]</p>
128
129
  <div id="M000011_source" class="dyn-source">
129
130
  <pre>
130
- <span class="ruby-comment cmt"># File lib/capcode.rb, line 60</span>
131
- 60: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">URL</span>( <span class="ruby-identifier">klass</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span> )
132
- 61: <span class="ruby-identifier">path</span> = <span class="ruby-keyword kw">nil</span>
133
- 62: <span class="ruby-identifier">a</span> = <span class="ruby-identifier">a</span>.<span class="ruby-identifier">delete_if</span>{ <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">nil?</span> }
134
- 63:
135
- 64: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Class</span>
136
- 65: <span class="ruby-constant">Capcode</span>.<span class="ruby-identifier">routes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span>, <span class="ruby-identifier">k</span><span class="ruby-operator">|</span>
137
- 66: <span class="ruby-identifier">path</span> = <span class="ruby-identifier">p</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">klass</span>
138
- 67: <span class="ruby-keyword kw">end</span>
139
- 68: <span class="ruby-keyword kw">else</span>
140
- 69: <span class="ruby-identifier">path</span> = <span class="ruby-identifier">klass</span>
141
- 70: <span class="ruby-keyword kw">end</span>
142
- 71:
143
- 72: <span class="ruby-identifier">path</span><span class="ruby-operator">+</span>((<span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span><span class="ruby-operator">&gt;</span><span class="ruby-value">0</span>)<span class="ruby-operator">?</span>(<span class="ruby-value str">&quot;/&quot;</span><span class="ruby-operator">+</span><span class="ruby-identifier">a</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;/&quot;</span>))<span class="ruby-operator">:</span>(<span class="ruby-value str">&quot;&quot;</span>))
144
- 73: <span class="ruby-keyword kw">end</span>
131
+ <span class="ruby-comment cmt"># File lib/capcode.rb, line 63</span>
132
+ 63: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">URL</span>( <span class="ruby-identifier">klass</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span> )
133
+ 64: <span class="ruby-identifier">path</span> = <span class="ruby-keyword kw">nil</span>
134
+ 65: <span class="ruby-identifier">a</span> = <span class="ruby-identifier">a</span>.<span class="ruby-identifier">delete_if</span>{ <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">nil?</span> }
135
+ 66:
136
+ 67: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Class</span>
137
+ 68: <span class="ruby-constant">Capcode</span>.<span class="ruby-identifier">routes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span>, <span class="ruby-identifier">k</span><span class="ruby-operator">|</span>
138
+ 69: <span class="ruby-identifier">path</span> = <span class="ruby-identifier">p</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">klass</span>
139
+ 70: <span class="ruby-keyword kw">end</span>
140
+ 71: <span class="ruby-keyword kw">else</span>
141
+ 72: <span class="ruby-identifier">path</span> = <span class="ruby-identifier">klass</span>
142
+ 73: <span class="ruby-keyword kw">end</span>
143
+ 74:
144
+ 75: <span class="ruby-identifier">path</span><span class="ruby-operator">+</span>((<span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span><span class="ruby-operator">&gt;</span><span class="ruby-value">0</span>)<span class="ruby-operator">?</span>(<span class="ruby-value str">&quot;/&quot;</span><span class="ruby-operator">+</span><span class="ruby-identifier">a</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;/&quot;</span>))<span class="ruby-operator">:</span>(<span class="ruby-value str">&quot;&quot;</span>))
145
+ 76: <span class="ruby-keyword kw">end</span>
145
146
  </pre>
146
147
  </div>
147
148
  </div>
@@ -165,11 +166,11 @@ Help you to return a JSON response
165
166
  <p class="source-link">[ <a href="javascript:toggleSource('M000009_source')" id="l_M000009_source">show source</a> ]</p>
166
167
  <div id="M000009_source" class="dyn-source">
167
168
  <pre>
168
- <span class="ruby-comment cmt"># File lib/capcode.rb, line 25</span>
169
- 25: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">json</span>( <span class="ruby-identifier">d</span> )
170
- 26: <span class="ruby-ivar">@response</span>[<span class="ruby-value str">'Content-Type'</span>] = <span class="ruby-value str">'application/json'</span>
171
- 27: <span class="ruby-identifier">d</span>.<span class="ruby-identifier">to_json</span>
172
- 28: <span class="ruby-keyword kw">end</span>
169
+ <span class="ruby-comment cmt"># File lib/capcode.rb, line 28</span>
170
+ 28: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">json</span>( <span class="ruby-identifier">d</span> )
171
+ 29: <span class="ruby-ivar">@response</span>[<span class="ruby-value str">'Content-Type'</span>] = <span class="ruby-value str">'application/json'</span>
172
+ 30: <span class="ruby-identifier">d</span>.<span class="ruby-identifier">to_json</span>
173
+ 31: <span class="ruby-keyword kw">end</span>
173
174
  </pre>
174
175
  </div>
175
176
  </div>
@@ -197,10 +198,10 @@ Send a <a href="Helpers.html#M000010">redirect</a> response
197
198
  <p class="source-link">[ <a href="javascript:toggleSource('M000010_source')" id="l_M000010_source">show source</a> ]</p>
198
199
  <div id="M000010_source" class="dyn-source">
199
200
  <pre>
200
- <span class="ruby-comment cmt"># File lib/capcode.rb, line 43</span>
201
- 43: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">redirect</span>( <span class="ruby-identifier">klass</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span> )
202
- 44: [<span class="ruby-value">302</span>, {<span class="ruby-value str">'Location'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">URL</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)}, <span class="ruby-value str">''</span>]
203
- 45: <span class="ruby-keyword kw">end</span>
201
+ <span class="ruby-comment cmt"># File lib/capcode.rb, line 46</span>
202
+ 46: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">redirect</span>( <span class="ruby-identifier">klass</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span> )
203
+ 47: [<span class="ruby-value">302</span>, {<span class="ruby-value str">'Location'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">URL</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">a</span>)}, <span class="ruby-value str">''</span>]
204
+ 48: <span class="ruby-keyword kw">end</span>
204
205
  </pre>
205
206
  </div>
206
207
  </div>
@@ -68,6 +68,7 @@
68
68
  <a href="../../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -0,0 +1,126 @@
1
+
2
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
3
+ <html>
4
+ <head>
5
+ <title>
6
+ Capcode, the Documentation &raquo; Class: Capcode::RouteError
7
+ </title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
+ <script language="JavaScript" type="text/javascript">
11
+ // <![CDATA[
12
+
13
+ function toggleSource( id )
14
+ {
15
+ var elem
16
+ var link
17
+
18
+ if( document.getElementById )
19
+ {
20
+ elem = document.getElementById( id )
21
+ link = document.getElementById( "l_" + id )
22
+ }
23
+ else if ( document.all )
24
+ {
25
+ elem = eval( "document.all." + id )
26
+ link = eval( "document.all.l_" + id )
27
+ }
28
+ else
29
+ return false;
30
+
31
+ if( elem.style.display == "block" )
32
+ {
33
+ elem.style.display = "none"
34
+ link.innerHTML = "show source"
35
+ }
36
+ else
37
+ {
38
+ elem.style.display = "block"
39
+ link.innerHTML = "hide source"
40
+ }
41
+ }
42
+
43
+ function openCode( url )
44
+ {
45
+ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
46
+ }
47
+ // ]]>
48
+ </script>
49
+ </head>
50
+ <body>
51
+ <!--
52
+ <div id="menu">
53
+ <h3 class="title">Class: Capcode::RouteError</h3>
54
+ </div>
55
+ -->
56
+ <div id="fullpage">
57
+ <div id="pager">
58
+ <table>
59
+ <tr><td><img src="../../rubyfr.png" /></td>
60
+ <td id="pagertd">
61
+ <strong># Class: Capcode::RouteError<br />
62
+ [
63
+ "<a href="../../files/README.html" value="File: README">README</a>",
64
+ "<a href="../../files/AUTHORS.html" value="File: AUTHORS">AUTHORS</a>",
65
+ "<a href="../../files/COPYING.html" value="File: COPYING">COPYING</a>",
66
+ "<a href="../../files/lib/capcode_rb.html" value="File: capcode.rb">lib/capcode.rb</a>",
67
+ <a href="http://greg.rubyfr.net">nil</a>].each do<br />
68
+ <a href="../../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
+ <a href="../../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
+ <a href="../../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
72
+ <a href="../../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
73
+ end</strong>
74
+ </td></tr>
75
+ </table>
76
+ </ul>
77
+ </div>
78
+
79
+
80
+ <div id="Capcode::RouteError" class="page_shade">
81
+ <div class="page">
82
+ <h3>Class Capcode::RouteError &lt; ArgumentError</h3>
83
+
84
+ (in files
85
+ <a href="../../files/lib/capcode_rb.html">lib/capcode.rb</a>
86
+ )
87
+
88
+ <p>
89
+ <a href="HTTPError.html">HTTPError</a> help you to create your own 404, 500
90
+ and/or 501 response
91
+ </p>
92
+ <p>
93
+ To create a custom 404 reponse, create a fonction HTTPError.r404 in your
94
+ application :
95
+ </p>
96
+ <pre>
97
+ module Capcode
98
+ class HTTPError
99
+ def r404(f)
100
+ &quot;#{f} not found :(&quot;
101
+ end
102
+ end
103
+ end
104
+ </pre>
105
+ <p>
106
+ Do the same (r500 and r501) to customize 500 and 501 errors
107
+ </p>
108
+
109
+
110
+
111
+
112
+ <h4>Includes</h4>
113
+ <ul>
114
+ <li>Rack</li>
115
+ <li><a href="Capcode/Helpers.html">Capcode::Helpers</a></li>
116
+ </ul>
117
+
118
+
119
+
120
+ </div>
121
+ </div>
122
+
123
+
124
+ </div>
125
+ </body>
126
+ </html>
@@ -1 +1 @@
1
- Sun, 08 Mar 2009 14:07:55 +0100
1
+ Mon, 16 Mar 2009 12:39:42 +0100
@@ -68,6 +68,7 @@
68
68
  <a href="../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -68,6 +68,7 @@
68
68
  <a href="../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -68,6 +68,7 @@
68
68
  <a href="../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -78,7 +79,7 @@ end</strong>
78
79
  <div id="README" class="page_shade">
79
80
  <div class="page">
80
81
  <div class="header">
81
- <div class="path">README / Sun Mar 08 14:07:47 +0100 2009</div>
82
+ <div class="path">README / Mon Mar 16 12:31:45 +0100 2009</div>
82
83
  </div>
83
84
 
84
85
  <h1><a href="../classes/Capcode.html">Capcode</a></h1>
@@ -95,6 +96,18 @@ Copyright (C) 2009 Gregoire Lejeune
95
96
  <a href="../classes/Capcode.html">Capcode</a> is a web microframework
96
97
  </p>
97
98
  <h2>FEATURES/PROBLEMS:</h2>
99
+ <h3>0.2.0</h3>
100
+ <ul>
101
+ <li>Add models with DataMapper and couch_foo
102
+
103
+ </li>
104
+ <li>Add two new options : :daemonize and :pid
105
+
106
+ </li>
107
+ <li>Bug correction in Route.
108
+
109
+ </li>
110
+ </ul>
98
111
  <h3>0.1.0</h3>
99
112
  <ul>
100
113
  <li>First public release
@@ -129,6 +142,25 @@ Copyright (C) 2009 Gregoire Lejeune
129
142
 
130
143
  </li>
131
144
  </ul>
145
+ <h2>Create model</h2>
146
+ <pre>
147
+ require 'rubygems'
148
+ require 'capcode'
149
+ require 'capcode/base/dm' # or require 'capcode/base/couchdb'
150
+
151
+ class Story &lt; Capcode::Base
152
+ include Capcode::Resource
153
+
154
+ property :id, Integer, :serial =&gt; true # only with DataMapper !
155
+ property :title, String
156
+ property :body, String
157
+ property :date, String
158
+ end
159
+ </pre>
160
+ <p>
161
+ See <tt>examples/blog-dm.rb</tt> and/or <tt>examples/blog-couchdb.rb</tt>
162
+ for complete examples.
163
+ </p>
132
164
  <h2>REQUIREMENTS:</h2>
133
165
  <ul>
134
166
  <li>rack
@@ -68,6 +68,7 @@
68
68
  <a href="../../classes/Capcode.html" title="Module: Capcode">Capcode</a>.view_html<br />
69
69
  <a href="../../classes/Capcode/Helpers.html" title="Module: Capcode::Helpers">Capcode::Helpers</a>.view_html<br />
70
70
  <a href="../../classes/Capcode/HTTPError.html" title="Class: Capcode::HTTPError">Capcode::HTTPError</a>.view_html<br />
71
+ <a href="../../classes/Capcode/RouteError.html" title="Class: Capcode::RouteError">Capcode::RouteError</a>.view_html<br />
71
72
  <a href="../../classes/Capcode/ParameterError.html" title="Class: Capcode::ParameterError">Capcode::ParameterError</a>.view_html<br />
72
73
  end</strong>
73
74
  </td></tr>
@@ -78,7 +79,7 @@ end</strong>
78
79
  <div id="lib/capcode.rb" class="page_shade">
79
80
  <div class="page">
80
81
  <div class="header">
81
- <div class="path">lib/capcode.rb / Thu Mar 05 17:42:43 +0100 2009</div>
82
+ <div class="path">lib/capcode.rb / Mon Mar 16 12:38:20 +0100 2009</div>
82
83
  </div>
83
84
 
84
85
  <pre>
@@ -516,6 +517,7 @@ License instead of this License.
516
517
  <li>rack</li>
517
518
  <li>json</li>
518
519
  <li>logger</li>
520
+ <li>capcode/version</li>
519
521
  <li>capcode/core_ext</li>
520
522
  <li>mongrel</li>
521
523
  </ul>
@@ -1,11 +1,11 @@
1
1
  $:.unshift( "../lib" )
2
2
  require 'rubygems'
3
3
  require 'capcode'
4
- require 'couch_foo'
4
+ require 'capcode/base/couchdb'
5
5
 
6
- CouchFoo::Base.set_database(:host => "http://localhost:5984", :database => "my_blog")
7
-
8
- class Story < CouchFoo::Base
6
+ class Story < Capcode::Base
7
+ include Capcode::Resource
8
+
9
9
  property :title, String
10
10
  property :body, String
11
11
  property :date, String
@@ -59,4 +59,4 @@ module Capcode
59
59
  end
60
60
  end
61
61
 
62
- Capcode.run( :port => 3001, :host => "localhost", :log => "blog.log" )
62
+ Capcode.run( :port => 3001, :host => "localhost", :db_config => "blog-couchdb.yml" )
@@ -0,0 +1,2 @@
1
+ host: http://localhost:5984
2
+ database: my_blog
@@ -0,0 +1,63 @@
1
+ $:.unshift( "../lib" )
2
+ require 'rubygems'
3
+ require 'capcode'
4
+ require 'capcode/base/dm'
5
+
6
+ class Story < Capcode::Base
7
+ include Capcode::Resource
8
+
9
+ property :id, Integer, :serial => true
10
+ property :title, String
11
+ property :body, String
12
+ property :date, String
13
+ end
14
+
15
+ module Capcode
16
+ class HTTPError
17
+ def r404(f)
18
+ "Pas glop !!! #{f} est inconnu !!!"
19
+ end
20
+ end
21
+
22
+ class Index < Route '/'
23
+ def get
24
+ r = "<html><body>"
25
+
26
+ story = Story.all
27
+
28
+ story.each do |s|
29
+ r += "<h2>#{s.title}</h2><small>#{s.date} - <a href='#{URL( Remove, s.id )}'>Delete this entry</a></small><p>#{s.body}</p>"
30
+ end
31
+
32
+ r+"<hr /><a href='#{URL(Add)}'>Add a new entry</a></body></html>"
33
+ end
34
+ end
35
+
36
+ class Remove < Route '/remove/([^\/]*)'
37
+ def get( id )
38
+ Story.get!(id).destroy
39
+ redirect( Index )
40
+ end
41
+ end
42
+
43
+ class Add < Route '/add'
44
+ def get
45
+ '
46
+ <html><body>
47
+ <h1>Add a new entry</h1>
48
+ <form method="POST">
49
+ Titre : <input type="text" name="title"><br />
50
+ <textarea name="body"></textarea><br />
51
+ <input type="submit">
52
+ </form>
53
+ </body></html>
54
+ '
55
+ end
56
+ def post
57
+ Story.new( :title => params['title'], :body => params['body'], :date => Time.now.to_s ).save
58
+ redirect( Index )
59
+ end
60
+ end
61
+ end
62
+
63
+ Capcode.run( :port => 3001, :host => "localhost", :db_config => "blog-dm.yml" )
@@ -0,0 +1,2 @@
1
+ adapter: sqlite3
2
+ database: my_blog.db
Binary file
@@ -2,15 +2,18 @@ require 'rubygems'
2
2
  require 'rack'
3
3
  require 'json'
4
4
  require 'logger'
5
+ require 'capcode/version'
5
6
  require 'capcode/core_ext'
6
7
 
7
8
  module Capcode
8
- CAPCOD_VERION="0.2.0"
9
9
  @@__ROUTES = {}
10
10
 
11
11
  class ParameterError < ArgumentError
12
12
  end
13
13
 
14
+ class RouteError < ArgumentError
15
+ end
16
+
14
17
  # Helpers contains methods available in your controllers
15
18
  module Helpers
16
19
  # Help you to return a JSON response
@@ -134,9 +137,13 @@ module Capcode
134
137
  u.each do |_u|
135
138
  m = /\/([^\/]*\(.*)/.match( _u )
136
139
  if m.nil?
140
+ raise Capcode::RouteError, "Route `#{_u}' already defined with regexp `#{h[_u]}' !", caller if h.keys.include?(_u)
137
141
  h[_u] = ''
138
142
  else
139
- h[m.pre_match] = m.captures[0]
143
+ _pre = m.pre_match
144
+ _pre = "/" if _pre.size == 0
145
+ raise Capcode::RouteError, "Route `#{_pre}' already defined with regexp `#{h[_pre]}' !", caller if h.keys.include?(_pre)
146
+ h[_pre] = m.captures[0]
140
147
  max = Regexp.new(m.captures[0]).number_of_captures if max < Regexp.new(m.captures[0]).number_of_captures
141
148
  end
142
149
  end
@@ -229,13 +236,18 @@ module Capcode
229
236
  # * <tt>:server</tt> = Server type (webrick or mongrel)
230
237
  # * <tt>:log</tt> = Output logfile (default: STDOUT)
231
238
  # * <tt>:session</tt> = Session parameters. See Rack::Session for more informations
239
+ # * <tt>:pid</tt> = PID file (default: $0.pid)
240
+ # * <tt>:daemonize</tt> = Daemonize application (default: false)
232
241
  def run( args = {} )
233
242
  conf = {
234
243
  :port => args[:port]||3000,
235
244
  :host => args[:host]||"localhost",
236
245
  :server => args[:server]||nil,
237
246
  :log => args[:log]||$stdout,
238
- :session => args[:session]||{}
247
+ :session => args[:session]||{},
248
+ :pid => args[:pid]||"#{$0}.pid",
249
+ :daemonize => args[:daemonize]||false,
250
+ :db_config => args[:db_config]||"database.yml"
239
251
  }
240
252
 
241
253
  # Check that mongrel exists
@@ -254,6 +266,7 @@ module Capcode
254
266
  if eval "Capcode::#{k}.public_methods(true).include?( '__urls__' )"
255
267
  u, m, c = eval "Capcode::#{k}.__urls__"
256
268
  u.keys.each do |_u|
269
+ raise Capcode::RouteError, "Route `#{_u}' already define !", caller if @@__ROUTES.keys.include?(_u)
257
270
  @@__ROUTES[_u] = c.new
258
271
  end
259
272
  end
@@ -271,7 +284,31 @@ module Capcode
271
284
  # app = Rack::Reloader.new(app) ## -- NE RELOAD QUE capcode.rb -- So !!!
272
285
  app = Rack::CommonLogger.new( app, Logger.new(conf[:log]) )
273
286
 
287
+ # From rackup !!!
288
+ if conf[:daemonize]
289
+ if RUBY_VERSION < "1.9"
290
+ exit if fork
291
+ Process.setsid
292
+ exit if fork
293
+ # Dir.chdir "/"
294
+ File.umask 0000
295
+ STDIN.reopen "/dev/null"
296
+ STDOUT.reopen "/dev/null", "a"
297
+ STDERR.reopen "/dev/null", "a"
298
+ else
299
+ Process.daemon
300
+ end
301
+
302
+ File.open(conf[:pid], 'w'){ |f| f.write("#{Process.pid}") }
303
+ at_exit { File.delete(conf[:pid]) if File.exist?(conf[:pid]) }
304
+ end
305
+
306
+ # Start database
307
+ if self.methods.include? "db_connect"
308
+ db_connect( conf[:db_config], conf[:log] )
309
+ end
274
310
 
311
+ # Start server
275
312
  case conf[:server]
276
313
  when "mongrel"
277
314
  puts "** Starting Mongrel on #{conf[:host]}:#{conf[:port]}"