renee 0.3.11 → 0.4.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. data/Gemfile +17 -0
  2. data/Gemfile-renee +8 -0
  3. data/Gemfile-renee-core +8 -0
  4. data/Gemfile-renee-render +9 -0
  5. data/Gemfile-renee-session +9 -0
  6. data/Gemfile-renee-url-generation +8 -0
  7. data/MIT-LICENSE.txt +7 -0
  8. data/README-renee-core.md +242 -0
  9. data/README-renee-render.md +38 -0
  10. data/README-renee-session.md +3 -0
  11. data/README-renee-url-generation.md +3 -0
  12. data/README.md +131 -6
  13. data/Rakefile +109 -9
  14. data/TODO.txt +45 -0
  15. data/config.ru +26 -0
  16. data/examples/blog/blog.rb +3 -1
  17. data/examples/blog/config.ru +24 -19
  18. data/examples/blog/views/edit.erb +10 -1
  19. data/examples/blog/views/show.erb +5 -0
  20. data/lib/renee.rb +11 -4
  21. data/lib/renee/core.rb +98 -0
  22. data/lib/renee/core/chaining.rb +66 -0
  23. data/lib/renee/core/env_accessors.rb +72 -0
  24. data/lib/renee/core/exceptions.rb +15 -0
  25. data/lib/renee/core/matcher.rb +61 -0
  26. data/lib/renee/core/plugins.rb +31 -0
  27. data/lib/renee/core/rack_interaction.rb +50 -0
  28. data/lib/renee/core/request_context.rb +56 -0
  29. data/lib/renee/core/responding.rb +112 -0
  30. data/lib/renee/core/response.rb +78 -0
  31. data/lib/renee/core/routing.rb +319 -0
  32. data/lib/renee/core/transform.rb +18 -0
  33. data/lib/renee/render.rb +221 -0
  34. data/lib/renee/session.rb +50 -0
  35. data/lib/renee/url_generation.rb +117 -0
  36. data/lib/renee/util.rb +7 -0
  37. data/lib/renee/version.rb +2 -4
  38. data/plan.txt +19 -0
  39. data/renee-core.gemspec +26 -0
  40. data/renee-render.gemspec +30 -0
  41. data/renee-session.gemspec +28 -0
  42. data/renee-url-generation.gemspec +24 -0
  43. data/renee.gemspec +5 -6
  44. data/site/MIT-LICENSE.txt +7 -0
  45. data/site/public/css/app.css +75 -0
  46. data/site/public/docs/renee-core/Renee.html +208 -0
  47. data/site/public/docs/renee-core/Renee/Core.html +366 -0
  48. data/site/public/docs/renee-core/Renee/Core/Chaining.html +192 -0
  49. data/site/public/docs/renee-core/Renee/Core/ClassMethods.html +725 -0
  50. data/site/public/docs/renee-core/Renee/Core/ClientError.html +317 -0
  51. data/site/public/docs/renee-core/Renee/Core/EnvAccessors.html +152 -0
  52. data/site/public/docs/renee-core/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  53. data/site/public/docs/renee-core/Renee/Core/Matcher.html +675 -0
  54. data/site/public/docs/renee-core/Renee/Core/Plugins.html +475 -0
  55. data/site/public/docs/renee-core/Renee/Core/RackInteraction.html +488 -0
  56. data/site/public/docs/renee-core/Renee/Core/RequestContext.html +511 -0
  57. data/site/public/docs/renee-core/Renee/Core/Responding.html +877 -0
  58. data/site/public/docs/renee-core/Renee/Core/Response.html +691 -0
  59. data/site/public/docs/renee-core/Renee/Core/Routing.html +1589 -0
  60. data/site/public/docs/renee-core/Renee/Core/Transform.html +249 -0
  61. data/site/public/docs/renee-core/Renee/Core/URLGeneration.html +597 -0
  62. data/site/public/docs/renee-core/_index.html +244 -0
  63. data/site/public/docs/renee-core/class_list.html +47 -0
  64. data/site/public/docs/renee-core/css/common.css +1 -0
  65. data/site/public/docs/renee-core/css/full_list.css +55 -0
  66. data/site/public/docs/renee-core/css/style.css +322 -0
  67. data/site/public/docs/renee-core/file.README-renee-core.html +341 -0
  68. data/site/public/docs/renee-core/file.README.html +212 -0
  69. data/site/public/docs/renee-core/file_list.html +49 -0
  70. data/site/public/docs/renee-core/frames.html +13 -0
  71. data/site/public/docs/renee-core/index.html +341 -0
  72. data/site/public/docs/renee-core/js/app.js +205 -0
  73. data/site/public/docs/renee-core/js/full_list.js +167 -0
  74. data/site/public/docs/renee-core/js/jquery.js +16 -0
  75. data/site/public/docs/renee-core/method_list.html +590 -0
  76. data/site/public/docs/renee-core/top-level-namespace.html +103 -0
  77. data/site/public/docs/renee-render/Renee.html +116 -0
  78. data/site/public/docs/renee-render/Renee/Core.html +346 -0
  79. data/site/public/docs/renee-render/Renee/Core/Chaining.html +125 -0
  80. data/site/public/docs/renee-render/Renee/Core/ClassMethods.html +620 -0
  81. data/site/public/docs/renee-render/Renee/Core/ClientError.html +317 -0
  82. data/site/public/docs/renee-render/Renee/Core/EnvAccessors.html +152 -0
  83. data/site/public/docs/renee-render/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  84. data/site/public/docs/renee-render/Renee/Core/Matcher.html +675 -0
  85. data/site/public/docs/renee-render/Renee/Core/RackInteraction.html +488 -0
  86. data/site/public/docs/renee-render/Renee/Core/RequestContext.html +421 -0
  87. data/site/public/docs/renee-render/Renee/Core/Responding.html +873 -0
  88. data/site/public/docs/renee-render/Renee/Core/Response.html +691 -0
  89. data/site/public/docs/renee-render/Renee/Core/Routing.html +1682 -0
  90. data/site/public/docs/renee-render/Renee/Core/Transform.html +249 -0
  91. data/site/public/docs/renee-render/Renee/Core/URLGeneration.html +597 -0
  92. data/site/public/docs/renee-render/Renee/Render.html +873 -0
  93. data/site/public/docs/renee-render/Renee/Render/ClassMethods.html +382 -0
  94. data/site/public/docs/renee-render/Renee/Render/TemplateNotFound.html +126 -0
  95. data/site/public/docs/renee-render/_index.html +143 -0
  96. data/site/public/docs/renee-render/class_list.html +47 -0
  97. data/site/public/docs/renee-render/css/common.css +1 -0
  98. data/site/public/docs/renee-render/css/full_list.css +55 -0
  99. data/site/public/docs/renee-render/css/style.css +322 -0
  100. data/site/public/docs/renee-render/file.README-renee-render.html +104 -0
  101. data/site/public/docs/renee-render/file.README.html +212 -0
  102. data/site/public/docs/renee-render/file_list.html +49 -0
  103. data/site/public/docs/renee-render/frames.html +13 -0
  104. data/site/public/docs/renee-render/index.html +104 -0
  105. data/site/public/docs/renee-render/js/app.js +205 -0
  106. data/site/public/docs/renee-render/js/full_list.js +167 -0
  107. data/site/public/docs/renee-render/js/jquery.js +16 -0
  108. data/site/public/docs/renee-render/method_list.html +110 -0
  109. data/site/public/docs/renee-render/top-level-namespace.html +103 -0
  110. data/site/public/docs/renee-session/Renee.html +106 -0
  111. data/site/public/docs/renee-session/Renee/Session.html +173 -0
  112. data/site/public/docs/renee-session/Renee/Session/ClassMethods.html +470 -0
  113. data/site/public/docs/renee-session/_index.html +136 -0
  114. data/site/public/docs/renee-session/class_list.html +47 -0
  115. data/site/public/docs/renee-session/css/common.css +1 -0
  116. data/site/public/docs/renee-session/css/full_list.css +55 -0
  117. data/site/public/docs/renee-session/css/style.css +322 -0
  118. data/site/public/docs/renee-session/file.README-renee-core.html +341 -0
  119. data/site/public/docs/renee-session/file.README-renee-session.html +69 -0
  120. data/site/public/docs/renee-session/file_list.html +49 -0
  121. data/site/public/docs/renee-session/frames.html +13 -0
  122. data/site/public/docs/renee-session/index.html +69 -0
  123. data/site/public/docs/renee-session/js/app.js +205 -0
  124. data/site/public/docs/renee-session/js/full_list.js +167 -0
  125. data/site/public/docs/renee-session/js/jquery.js +16 -0
  126. data/site/public/docs/renee-session/method_list.html +102 -0
  127. data/site/public/docs/renee-session/top-level-namespace.html +103 -0
  128. data/site/public/docs/renee-url-generation/Renee.html +208 -0
  129. data/site/public/docs/renee-url-generation/Renee/Core.html +366 -0
  130. data/site/public/docs/renee-url-generation/Renee/Core/Chaining.html +192 -0
  131. data/site/public/docs/renee-url-generation/Renee/Core/ClassMethods.html +725 -0
  132. data/site/public/docs/renee-url-generation/Renee/Core/ClientError.html +317 -0
  133. data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors.html +152 -0
  134. data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  135. data/site/public/docs/renee-url-generation/Renee/Core/Matcher.html +675 -0
  136. data/site/public/docs/renee-url-generation/Renee/Core/Plugins.html +475 -0
  137. data/site/public/docs/renee-url-generation/Renee/Core/RackInteraction.html +488 -0
  138. data/site/public/docs/renee-url-generation/Renee/Core/RequestContext.html +511 -0
  139. data/site/public/docs/renee-url-generation/Renee/Core/Responding.html +877 -0
  140. data/site/public/docs/renee-url-generation/Renee/Core/Response.html +691 -0
  141. data/site/public/docs/renee-url-generation/Renee/Core/Routing.html +1589 -0
  142. data/site/public/docs/renee-url-generation/Renee/Core/Transform.html +249 -0
  143. data/site/public/docs/renee-url-generation/_index.html +244 -0
  144. data/site/public/docs/renee-url-generation/class_list.html +47 -0
  145. data/site/public/docs/renee-url-generation/css/common.css +1 -0
  146. data/site/public/docs/renee-url-generation/css/full_list.css +55 -0
  147. data/site/public/docs/renee-url-generation/css/style.css +322 -0
  148. data/site/public/docs/renee-url-generation/file.README-renee-url-generation.html +69 -0
  149. data/site/public/docs/renee-url-generation/file_list.html +49 -0
  150. data/site/public/docs/renee-url-generation/frames.html +13 -0
  151. data/site/public/docs/renee-url-generation/index.html +69 -0
  152. data/site/public/docs/renee-url-generation/js/app.js +205 -0
  153. data/site/public/docs/renee-url-generation/js/full_list.js +167 -0
  154. data/site/public/docs/renee-url-generation/js/jquery.js +16 -0
  155. data/site/public/docs/renee-url-generation/method_list.html +590 -0
  156. data/site/public/docs/renee-url-generation/top-level-namespace.html +103 -0
  157. data/site/public/docs/renee/Renee.html +232 -0
  158. data/site/public/docs/renee/Renee/Application.html +367 -0
  159. data/site/public/docs/renee/Renee/Core.html +370 -0
  160. data/site/public/docs/renee/Renee/Core/Chaining.html +192 -0
  161. data/site/public/docs/renee/Renee/Core/ClassMethods.html +725 -0
  162. data/site/public/docs/renee/Renee/Core/ClientError.html +317 -0
  163. data/site/public/docs/renee/Renee/Core/EnvAccessors.html +152 -0
  164. data/site/public/docs/renee/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  165. data/site/public/docs/renee/Renee/Core/Matcher.html +675 -0
  166. data/site/public/docs/renee/Renee/Core/Plugins.html +475 -0
  167. data/site/public/docs/renee/Renee/Core/RackInteraction.html +488 -0
  168. data/site/public/docs/renee/Renee/Core/RequestContext.html +511 -0
  169. data/site/public/docs/renee/Renee/Core/Responding.html +877 -0
  170. data/site/public/docs/renee/Renee/Core/Response.html +691 -0
  171. data/site/public/docs/renee/Renee/Core/Routing.html +1589 -0
  172. data/site/public/docs/renee/Renee/Core/Transform.html +249 -0
  173. data/site/public/docs/renee/Renee/Core/URLGeneration.html +597 -0
  174. data/site/public/docs/renee/Renee/Render.html +877 -0
  175. data/site/public/docs/renee/Renee/Render/ClassMethods.html +382 -0
  176. data/site/public/docs/renee/Renee/Render/TemplateNotFound.html +126 -0
  177. data/site/public/docs/renee/Renee/Session.html +177 -0
  178. data/site/public/docs/renee/Renee/Session/ClassMethods.html +470 -0
  179. data/site/public/docs/renee/Renee/URLGeneration.html +142 -0
  180. data/site/public/docs/renee/Renee/URLGeneration/ClassMethods.html +593 -0
  181. data/site/public/docs/renee/Renee/Util.html +163 -0
  182. data/site/public/docs/renee/_index.html +336 -0
  183. data/site/public/docs/renee/class_list.html +47 -0
  184. data/site/public/docs/renee/css/common.css +1 -0
  185. data/site/public/docs/renee/css/full_list.css +55 -0
  186. data/site/public/docs/renee/css/style.css +322 -0
  187. data/site/public/docs/renee/file.README.html +212 -0
  188. data/site/public/docs/renee/file_list.html +49 -0
  189. data/site/public/docs/renee/frames.html +13 -0
  190. data/site/public/docs/renee/index.html +212 -0
  191. data/site/public/docs/renee/js/app.js +205 -0
  192. data/site/public/docs/renee/js/full_list.js +167 -0
  193. data/site/public/docs/renee/js/jquery.js +16 -0
  194. data/site/public/docs/renee/method_list.html +758 -0
  195. data/site/public/docs/renee/top-level-namespace.html +202 -0
  196. data/site/public/img/favicon.ico +0 -0
  197. data/site/public/img/reneeclean.png +0 -0
  198. data/site/public/img/russiangithub.png +0 -0
  199. data/site/public/img/stoneposter.png +0 -0
  200. data/site/public/img/vospit.jpeg +0 -0
  201. data/site/views/chaining.md +32 -0
  202. data/site/views/index.md +219 -0
  203. data/site/views/layouts/app.haml +16 -0
  204. data/site/views/rack-integration.md +51 -0
  205. data/site/views/responding.md +103 -0
  206. data/site/views/route-generation.md +82 -0
  207. data/site/views/routing.md +261 -0
  208. data/site/views/settings.md +19 -0
  209. data/site/views/team-renee.md +13 -0
  210. data/site/views/tutorial.md +57 -0
  211. data/site/views/variable-types.md +57 -0
  212. data/test.watchr +61 -0
  213. data/test/renee-core/chaining_test.rb +33 -0
  214. data/test/renee-core/env_accessors_test.rb +43 -0
  215. data/test/renee-core/include_test.rb +14 -0
  216. data/test/renee-core/request_context_test.rb +70 -0
  217. data/test/renee-core/responding_test.rb +128 -0
  218. data/test/renee-core/routing_test.rb +443 -0
  219. data/test/renee-core/test_helper.rb +4 -0
  220. data/test/renee-core/variable_type_test.rb +57 -0
  221. data/test/renee-render/render_test.rb +162 -0
  222. data/test/renee-render/test_helper.rb +9 -0
  223. data/test/renee-session/session_test.rb +31 -0
  224. data/test/renee-session/test_helper.rb +9 -0
  225. data/test/renee-url-generation/test_helper.rb +10 -0
  226. data/test/renee-url-generation/url_generation_test.rb +63 -0
  227. data/test/{blog_test.rb → renee/blog_test.rb} +10 -5
  228. data/test/renee/test_helper.rb +56 -0
  229. data/test/test_helper.rb +23 -10
  230. metadata +333 -156
  231. data/.yardopts +0 -6
@@ -0,0 +1,202 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.7.4
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html">Index</a> &raquo;
37
+
38
+
39
+ <span class="title">Top Level Namespace</span>
40
+
41
+
42
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
43
+ </div>
44
+
45
+ <div id="search">
46
+
47
+ <a id="class_list_link" href="#">Class List</a>
48
+
49
+ <a id="method_list_link" href="#">Method List</a>
50
+
51
+ <a id="file_list_link" href="#">File List</a>
52
+
53
+ </div>
54
+ <div class="clear"></div>
55
+ </div>
56
+
57
+ <iframe id="search_frame"></iframe>
58
+
59
+ <div id="content"><h1>Top Level Namespace
60
+
61
+
62
+
63
+ </h1>
64
+
65
+ <dl class="box">
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ </dl>
75
+ <div class="clear"></div>
76
+
77
+ <h2>Defined Under Namespace</h2>
78
+ <p class="children">
79
+
80
+
81
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Renee.html" title="Renee (module)">Renee</a></span>
82
+
83
+
84
+
85
+
86
+ </p>
87
+
88
+
89
+
90
+
91
+
92
+
93
+ <h2>
94
+ Instance Method Summary
95
+ <small>(<a href="#" class="summary_toggle">collapse</a>)</small>
96
+ </h2>
97
+
98
+ <ul class="summary">
99
+
100
+ <li class="public ">
101
+ <span class="summary_signature">
102
+
103
+ <a href="#Renee-instance_method" title="#Renee (instance method)">- (Object) <strong>Renee</strong>(&amp;blk) </a>
104
+
105
+
106
+
107
+ </span>
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+ <span class="summary_desc"><div class='inline'><p>Method for creating new Renee applications.</p>
117
+ </div></span>
118
+
119
+ </li>
120
+
121
+
122
+ </ul>
123
+
124
+
125
+
126
+
127
+ <div id="instance_method_details" class="method_details_list">
128
+ <h2>Instance Method Details</h2>
129
+
130
+
131
+ <div class="method_details first">
132
+ <p class="signature first" id="Renee-instance_method">
133
+
134
+ - (<tt>Object</tt>) <strong>Renee</strong>(&amp;blk)
135
+
136
+
137
+
138
+ </p><div class="docstring">
139
+ <div class="discussion">
140
+ <p>Method for creating new Renee applications.</p>
141
+
142
+
143
+ </div>
144
+ </div>
145
+ <div class="tags">
146
+
147
+ <div class="examples">
148
+ <h3>Examples:</h3>
149
+
150
+ <h4><div class='inline'>
151
+ </div></h4>
152
+ <pre class="example code"><span class='id identifier rubyid_run'>run</span> <span class='const'>Renee</span> <span class='lbrace'>{</span>
153
+ <span class='id identifier rubyid_halt'>halt</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>hello renee</span><span class='tstring_end'>&quot;</span></span>
154
+ <span class='rbrace'>}</span></pre>
155
+
156
+ </div>
157
+
158
+
159
+ <h3>See Also:</h3>
160
+ <ul class="see">
161
+
162
+ <li><a href="http://reneerb.com" target="_parent" title="http://reneerb.com">http://reneerb.com</a></li>
163
+
164
+ </ul>
165
+
166
+ </div><table class="source_code">
167
+ <tr>
168
+ <td>
169
+ <pre class="lines">
170
+
171
+
172
+ 13
173
+ 14
174
+ 15
175
+ 16
176
+ 17</pre>
177
+ </td>
178
+ <td>
179
+ <pre class="code"><span class="info file"># File 'lib/renee.rb', line 13</span>
180
+
181
+ <span class='kw'>def</span> <span class='const'>Renee</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span><span class='rparen'>)</span>
182
+ <span class='id identifier rubyid_app_class'>app_class</span> <span class='op'>=</span> <span class='const'>Class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>Renee</span><span class='op'>::</span><span class='const'>Application</span><span class='rparen'>)</span>
183
+ <span class='id identifier rubyid_app_class'>app_class</span><span class='period'>.</span><span class='id identifier rubyid_app'>app</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span><span class='rparen'>)</span>
184
+ <span class='id identifier rubyid_app_class'>app_class</span>
185
+ <span class='kw'>end</span></pre>
186
+ </td>
187
+ </tr>
188
+ </table>
189
+ </div>
190
+
191
+ </div>
192
+
193
+ </div>
194
+
195
+ <div id="footer">
196
+ Generated on Mon Jan 23 11:10:34 2012 by
197
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
198
+ 0.7.4 (ruby-1.9.2).
199
+ </div>
200
+
201
+ </body>
202
+ </html>
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,32 @@
1
+ # Chaining
2
+
3
+ Renee makes it easy to chain together any of the [routing](/routing) methods. Take this example:
4
+
5
+ :::ruby
6
+ run Renee {
7
+ path 'test' do
8
+ get do
9
+ halt "hi"
10
+ end
11
+ end
12
+ }
13
+
14
+ This is nice, but, it could be nicer. With chaining, any method that takes a block can simply be chained to the next one. We could re-write this in the following way.
15
+
16
+ :::ruby
17
+ run Renee { path('test').get.halt "hi" }
18
+
19
+ ## Passing around chaining contexts
20
+
21
+ Chains you build up are re-usable as well. In the above example, if we wanted we could save that chaining context and re-use it as many times as we wanted. Here is an example:
22
+
23
+ :::ruby
24
+ run Renee {
25
+ test_path = path('test')
26
+ test_path.get.halt "this is a get"
27
+ test_path.post.halt "this is a post"
28
+ }
29
+
30
+ ## Implementing chains for your own modules
31
+
32
+ If you wish to use chaining yourself in your own modules, simple include Application::Chaining. Then, mark chainable methods with `chain_method :method_name`.
@@ -0,0 +1,219 @@
1
+ # Welcome to Renee!
2
+
3
+ *Renee is the super-friendly Rack based web framework.*
4
+
5
+ :::ruby
6
+ run Renee {
7
+ path('/') { halt "Hello Renee!" }
8
+ }
9
+
10
+ This site was built using Renee and is [available on Github](https://github.com/renee-project/renee/site).
11
+
12
+ Want the 2 minute intro? Try out this deadly simple [tutorial](/tutorial).
13
+
14
+ ## Concept (Why Renee?)
15
+
16
+ **Renee is a new way to think about writing web applications.**
17
+
18
+ ### Hierarchical
19
+
20
+ Traditionally, routing and controller logic have been separate. In Rails, for instance, your path is matched to a controller and an action. This does not reflect the hierarchical nature of REST.
21
+
22
+ Consider a simple example. The route `/posts/45/comments`. Typically, you'd expect this to load the post with the id 45, and then load the comments on that post. In [Rails](http://rubyonrails.org/), your code to load a post and understand that parameter would have to be in both your posts controller and your comments controller. [Sinatra](http://www.sinatrarb.com/) does no better as it searches linearly though a list of path to find a matching path, and then executes the block associated with it.
23
+
24
+ To model this same idea in Renee, you could do the following:
25
+
26
+ :::ruby
27
+ run Renee do
28
+ path 'posts' do
29
+ var :int do |id|
30
+ post = Posts.find(id)
31
+ path 'comments' do
32
+ get { render! "comments", :comments => post.comments }
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ Suddenly, you have access to the previously referred to part of the path, namely, the `/posts/45` part. It's a locally scoped variable, as is the id, so you don't have to worry about anyone outside of it's scope having access to it.
39
+
40
+ To find out more, take a look at the [routing methods](/routing) available to you.
41
+
42
+ ### Composability
43
+
44
+ Renee lives and breathes inside of [Rack](http://rack.rubyforge.org/). Let's take a look at the example above and understand a little better what's going on. We'll modify it slightly for the sake of clarity:
45
+
46
+ :::ruby
47
+ run Renee do
48
+ p request.path_info # printing
49
+ path "posts" do
50
+ p request.path_info # printing
51
+ var :int do |id|
52
+ p request.path_info # printing
53
+ halt :ok
54
+ end
55
+ end
56
+ end
57
+
58
+ If you run a request with the path `/posts/12` through here, you'll get three print statements:
59
+
60
+ :::ruby
61
+ "/posts/123"
62
+ "/123"
63
+ ""
64
+
65
+ The PATH_INFO is being consumed by each scope. If you don't halt, don't worry, your request will get put back together again after it falls out of each block. This let's you move parts of your application around without fearing how the route is being consumed.
66
+
67
+ ### Rack integration
68
+
69
+ Renee loves Rack. To run a arbitrary rack end point, you can use `#run!` to stop execution and pass off your request to an Rack application. An example:
70
+
71
+ :::ruby
72
+ run Renee do
73
+ path "posts" do
74
+ run! PostsEndpoint # this can be any Rack application
75
+ end
76
+ end
77
+
78
+ To find out more about integrating with rack, take a look at [rack integration](/rack-integration) to find out more!
79
+
80
+ ### Type validation
81
+
82
+ Converting your variable and returning 400's or 404's can get tedious, so why not do it all in one place? Renee allows you to register
83
+ arbitrary variable types, transform them, and handle error cases in one, easy place. Here is an example!
84
+
85
+ :::ruby
86
+ run Renee {
87
+ path "color" do
88
+ var :hex do |color|
89
+ get { halt "<body bgcolor='##{color.to_s(16)}'></body>" }
90
+ end
91
+ end
92
+ }.setup {
93
+ register_variable_type(:hex, /[0-9a-f]{6}/).
94
+ on_transform { |v| v.to_i(16) }.
95
+ raise_on_error!
96
+ }
97
+
98
+ Now, let's throw some requests against this. If we go to `http://127.0.0.1:9393/color/ff99ff`, we'll get a nice fuchsia. Try `http://127.0.0.1:9393/color/blue` and you'll get a 400. Too bad.
99
+
100
+ To find out more about [variable types](/variable-types), read all about them!
101
+
102
+ ### Chaining
103
+
104
+ Okay, so, writing blocks is fun, but, it can get a bit indent-y when we don't really need it to be. Feel free to chain together whatever methods you'd like. For instance the above example could have been written:
105
+
106
+ :::ruby
107
+ run Renee {
108
+ path("color").var(:hex).get { |color| halt "<body bgcolor='##{color.to_s(16)}'></body>" }
109
+ }.setup {
110
+ register_variable_type(:hex, /[0-9a-f]{6}/).
111
+ on_transform { |v| v.to_i(16) }.
112
+ raise_on_error!
113
+ }
114
+
115
+ You can easily consume chaining yourself, if you want to implement your own routing methods. Find out [more](/chaining)!
116
+
117
+ ### Subclassing for great justice
118
+
119
+ Not happy with what Renee gives you? You can easily subclass to define whatever you need.
120
+
121
+ :::ruby
122
+ class MyApp < Renee::Application
123
+ app {
124
+ path('justice/great').get.for_great_justice!
125
+ halt 404, "justice not found"
126
+ }
127
+
128
+ def for_great_justice!
129
+ halt "for great justice!"
130
+ end
131
+ end
132
+
133
+ run MyApp
134
+
135
+ # curl http://localhost:9393/justice/great
136
+ # for great justice
137
+ # curl http://localhost:9393/justice/good
138
+ # justice not found
139
+
140
+
141
+ ## Getting started
142
+
143
+ ### Installation
144
+
145
+ Renee is gem-based. If you're using rubygems, you can simply:
146
+
147
+ $> gem install renee
148
+
149
+ If you're using [Bundler](http://gembundler.com/), you can add
150
+
151
+ :::ruby
152
+ gem 'renee', '~> 0.3.0'
153
+
154
+ to your `Gemfile`.
155
+
156
+ ### Overview
157
+
158
+ Renee has (hopefully) a small number of keywords divided between several components:
159
+
160
+ * *Routing* is done either on the path, the query string, or other parts of the request headers.
161
+ * *Responding* makes it easy to respond to a request.
162
+ * *Rendering* gives you access to [Tilt](https://github.com/rtomayko/tilt) for rendering templates.
163
+ * *Rack interaction* makes it easy to call into [Rack](http://rack.rubyforge.org/)-based applications.
164
+ * *Request context* gives you access to the request and gives the basis for responding.
165
+
166
+ ## Usage
167
+
168
+ Using Renee is as simple as understanding how to *configure settings*, *define routes*, and *respond to requests*.
169
+ Renee usage in a nutshell:
170
+
171
+ :::ruby
172
+ run Renee {
173
+ path 'blog' do
174
+ get { render! "posts/index" }
175
+ post { Blog.create(request.params); halt :created }
176
+ var do |id|
177
+ @blog = Blog.get(id)
178
+ get { render! "posts/show" }
179
+ put { @blog.update(request.params); halt :ok }
180
+ end
181
+ end
182
+ }.setup {
183
+ views_path "./views"
184
+ }
185
+
186
+ Check out detailed guides for each aspect below:
187
+
188
+ [&#8618; Read about Configuration](/settings)
189
+
190
+ [&#8618; Read about Responding and Rendering](/responding)
191
+
192
+ [&#8618; Read about Routing](/routing)
193
+
194
+ [&#8618; Read about Route generation](/route-generation)
195
+
196
+ ## API documentation
197
+
198
+ Renee is also well-documented with YARD:
199
+
200
+ [&#8618; renee](/docs/renee/index.html)
201
+
202
+ [&#8618; renee-core](/docs/renee-core/index.html)
203
+
204
+ [&#8618; renee-render](/docs/renee-render/index.html)
205
+
206
+ [&#8618; renee-url-generation](/docs/renee-url-generation/index.html)
207
+
208
+ [&#8618; renee-session](/docs/renee-session/index.html)
209
+
210
+ ## Development
211
+
212
+ Renee's structure is pretty simple so far. The basic Rack DSL is contained in
213
+ [renee-core](https://github.com/renee-project/renee/tree/master/renee-core). This gem has no other dependencies other than Rack.
214
+
215
+ The rendering side is in [renee-render](https://github.com/renee-project/renee/tree/master/renee-render),
216
+ which depends on [Tilt](https://github.com/rtomayko/tilt).
217
+
218
+ The kitchen-sink gem which incorporates all of the others is [renee](https://github.com/renee-project/renee/tree/master/renee).
219
+ Please, any bugs, any ideas, I'd love to hear any of it. Love, [Team Renee](/team-renee). &hearts;