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.
- data/Gemfile +17 -0
- data/Gemfile-renee +8 -0
- data/Gemfile-renee-core +8 -0
- data/Gemfile-renee-render +9 -0
- data/Gemfile-renee-session +9 -0
- data/Gemfile-renee-url-generation +8 -0
- data/MIT-LICENSE.txt +7 -0
- data/README-renee-core.md +242 -0
- data/README-renee-render.md +38 -0
- data/README-renee-session.md +3 -0
- data/README-renee-url-generation.md +3 -0
- data/README.md +131 -6
- data/Rakefile +109 -9
- data/TODO.txt +45 -0
- data/config.ru +26 -0
- data/examples/blog/blog.rb +3 -1
- data/examples/blog/config.ru +24 -19
- data/examples/blog/views/edit.erb +10 -1
- data/examples/blog/views/show.erb +5 -0
- data/lib/renee.rb +11 -4
- data/lib/renee/core.rb +98 -0
- data/lib/renee/core/chaining.rb +66 -0
- data/lib/renee/core/env_accessors.rb +72 -0
- data/lib/renee/core/exceptions.rb +15 -0
- data/lib/renee/core/matcher.rb +61 -0
- data/lib/renee/core/plugins.rb +31 -0
- data/lib/renee/core/rack_interaction.rb +50 -0
- data/lib/renee/core/request_context.rb +56 -0
- data/lib/renee/core/responding.rb +112 -0
- data/lib/renee/core/response.rb +78 -0
- data/lib/renee/core/routing.rb +319 -0
- data/lib/renee/core/transform.rb +18 -0
- data/lib/renee/render.rb +221 -0
- data/lib/renee/session.rb +50 -0
- data/lib/renee/url_generation.rb +117 -0
- data/lib/renee/util.rb +7 -0
- data/lib/renee/version.rb +2 -4
- data/plan.txt +19 -0
- data/renee-core.gemspec +26 -0
- data/renee-render.gemspec +30 -0
- data/renee-session.gemspec +28 -0
- data/renee-url-generation.gemspec +24 -0
- data/renee.gemspec +5 -6
- data/site/MIT-LICENSE.txt +7 -0
- data/site/public/css/app.css +75 -0
- data/site/public/docs/renee-core/Renee.html +208 -0
- data/site/public/docs/renee-core/Renee/Core.html +366 -0
- data/site/public/docs/renee-core/Renee/Core/Chaining.html +192 -0
- data/site/public/docs/renee-core/Renee/Core/ClassMethods.html +725 -0
- data/site/public/docs/renee-core/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee-core/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee-core/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee-core/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee-core/Renee/Core/Plugins.html +475 -0
- data/site/public/docs/renee-core/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee-core/Renee/Core/RequestContext.html +511 -0
- data/site/public/docs/renee-core/Renee/Core/Responding.html +877 -0
- data/site/public/docs/renee-core/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee-core/Renee/Core/Routing.html +1589 -0
- data/site/public/docs/renee-core/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee-core/Renee/Core/URLGeneration.html +597 -0
- data/site/public/docs/renee-core/_index.html +244 -0
- data/site/public/docs/renee-core/class_list.html +47 -0
- data/site/public/docs/renee-core/css/common.css +1 -0
- data/site/public/docs/renee-core/css/full_list.css +55 -0
- data/site/public/docs/renee-core/css/style.css +322 -0
- data/site/public/docs/renee-core/file.README-renee-core.html +341 -0
- data/site/public/docs/renee-core/file.README.html +212 -0
- data/site/public/docs/renee-core/file_list.html +49 -0
- data/site/public/docs/renee-core/frames.html +13 -0
- data/site/public/docs/renee-core/index.html +341 -0
- data/site/public/docs/renee-core/js/app.js +205 -0
- data/site/public/docs/renee-core/js/full_list.js +167 -0
- data/site/public/docs/renee-core/js/jquery.js +16 -0
- data/site/public/docs/renee-core/method_list.html +590 -0
- data/site/public/docs/renee-core/top-level-namespace.html +103 -0
- data/site/public/docs/renee-render/Renee.html +116 -0
- data/site/public/docs/renee-render/Renee/Core.html +346 -0
- data/site/public/docs/renee-render/Renee/Core/Chaining.html +125 -0
- data/site/public/docs/renee-render/Renee/Core/ClassMethods.html +620 -0
- data/site/public/docs/renee-render/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee-render/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee-render/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee-render/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee-render/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee-render/Renee/Core/RequestContext.html +421 -0
- data/site/public/docs/renee-render/Renee/Core/Responding.html +873 -0
- data/site/public/docs/renee-render/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee-render/Renee/Core/Routing.html +1682 -0
- data/site/public/docs/renee-render/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee-render/Renee/Core/URLGeneration.html +597 -0
- data/site/public/docs/renee-render/Renee/Render.html +873 -0
- data/site/public/docs/renee-render/Renee/Render/ClassMethods.html +382 -0
- data/site/public/docs/renee-render/Renee/Render/TemplateNotFound.html +126 -0
- data/site/public/docs/renee-render/_index.html +143 -0
- data/site/public/docs/renee-render/class_list.html +47 -0
- data/site/public/docs/renee-render/css/common.css +1 -0
- data/site/public/docs/renee-render/css/full_list.css +55 -0
- data/site/public/docs/renee-render/css/style.css +322 -0
- data/site/public/docs/renee-render/file.README-renee-render.html +104 -0
- data/site/public/docs/renee-render/file.README.html +212 -0
- data/site/public/docs/renee-render/file_list.html +49 -0
- data/site/public/docs/renee-render/frames.html +13 -0
- data/site/public/docs/renee-render/index.html +104 -0
- data/site/public/docs/renee-render/js/app.js +205 -0
- data/site/public/docs/renee-render/js/full_list.js +167 -0
- data/site/public/docs/renee-render/js/jquery.js +16 -0
- data/site/public/docs/renee-render/method_list.html +110 -0
- data/site/public/docs/renee-render/top-level-namespace.html +103 -0
- data/site/public/docs/renee-session/Renee.html +106 -0
- data/site/public/docs/renee-session/Renee/Session.html +173 -0
- data/site/public/docs/renee-session/Renee/Session/ClassMethods.html +470 -0
- data/site/public/docs/renee-session/_index.html +136 -0
- data/site/public/docs/renee-session/class_list.html +47 -0
- data/site/public/docs/renee-session/css/common.css +1 -0
- data/site/public/docs/renee-session/css/full_list.css +55 -0
- data/site/public/docs/renee-session/css/style.css +322 -0
- data/site/public/docs/renee-session/file.README-renee-core.html +341 -0
- data/site/public/docs/renee-session/file.README-renee-session.html +69 -0
- data/site/public/docs/renee-session/file_list.html +49 -0
- data/site/public/docs/renee-session/frames.html +13 -0
- data/site/public/docs/renee-session/index.html +69 -0
- data/site/public/docs/renee-session/js/app.js +205 -0
- data/site/public/docs/renee-session/js/full_list.js +167 -0
- data/site/public/docs/renee-session/js/jquery.js +16 -0
- data/site/public/docs/renee-session/method_list.html +102 -0
- data/site/public/docs/renee-session/top-level-namespace.html +103 -0
- data/site/public/docs/renee-url-generation/Renee.html +208 -0
- data/site/public/docs/renee-url-generation/Renee/Core.html +366 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Chaining.html +192 -0
- data/site/public/docs/renee-url-generation/Renee/Core/ClassMethods.html +725 -0
- data/site/public/docs/renee-url-generation/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Plugins.html +475 -0
- data/site/public/docs/renee-url-generation/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee-url-generation/Renee/Core/RequestContext.html +511 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Responding.html +877 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Routing.html +1589 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee-url-generation/_index.html +244 -0
- data/site/public/docs/renee-url-generation/class_list.html +47 -0
- data/site/public/docs/renee-url-generation/css/common.css +1 -0
- data/site/public/docs/renee-url-generation/css/full_list.css +55 -0
- data/site/public/docs/renee-url-generation/css/style.css +322 -0
- data/site/public/docs/renee-url-generation/file.README-renee-url-generation.html +69 -0
- data/site/public/docs/renee-url-generation/file_list.html +49 -0
- data/site/public/docs/renee-url-generation/frames.html +13 -0
- data/site/public/docs/renee-url-generation/index.html +69 -0
- data/site/public/docs/renee-url-generation/js/app.js +205 -0
- data/site/public/docs/renee-url-generation/js/full_list.js +167 -0
- data/site/public/docs/renee-url-generation/js/jquery.js +16 -0
- data/site/public/docs/renee-url-generation/method_list.html +590 -0
- data/site/public/docs/renee-url-generation/top-level-namespace.html +103 -0
- data/site/public/docs/renee/Renee.html +232 -0
- data/site/public/docs/renee/Renee/Application.html +367 -0
- data/site/public/docs/renee/Renee/Core.html +370 -0
- data/site/public/docs/renee/Renee/Core/Chaining.html +192 -0
- data/site/public/docs/renee/Renee/Core/ClassMethods.html +725 -0
- data/site/public/docs/renee/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee/Renee/Core/Plugins.html +475 -0
- data/site/public/docs/renee/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee/Renee/Core/RequestContext.html +511 -0
- data/site/public/docs/renee/Renee/Core/Responding.html +877 -0
- data/site/public/docs/renee/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee/Renee/Core/Routing.html +1589 -0
- data/site/public/docs/renee/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee/Renee/Core/URLGeneration.html +597 -0
- data/site/public/docs/renee/Renee/Render.html +877 -0
- data/site/public/docs/renee/Renee/Render/ClassMethods.html +382 -0
- data/site/public/docs/renee/Renee/Render/TemplateNotFound.html +126 -0
- data/site/public/docs/renee/Renee/Session.html +177 -0
- data/site/public/docs/renee/Renee/Session/ClassMethods.html +470 -0
- data/site/public/docs/renee/Renee/URLGeneration.html +142 -0
- data/site/public/docs/renee/Renee/URLGeneration/ClassMethods.html +593 -0
- data/site/public/docs/renee/Renee/Util.html +163 -0
- data/site/public/docs/renee/_index.html +336 -0
- data/site/public/docs/renee/class_list.html +47 -0
- data/site/public/docs/renee/css/common.css +1 -0
- data/site/public/docs/renee/css/full_list.css +55 -0
- data/site/public/docs/renee/css/style.css +322 -0
- data/site/public/docs/renee/file.README.html +212 -0
- data/site/public/docs/renee/file_list.html +49 -0
- data/site/public/docs/renee/frames.html +13 -0
- data/site/public/docs/renee/index.html +212 -0
- data/site/public/docs/renee/js/app.js +205 -0
- data/site/public/docs/renee/js/full_list.js +167 -0
- data/site/public/docs/renee/js/jquery.js +16 -0
- data/site/public/docs/renee/method_list.html +758 -0
- data/site/public/docs/renee/top-level-namespace.html +202 -0
- data/site/public/img/favicon.ico +0 -0
- data/site/public/img/reneeclean.png +0 -0
- data/site/public/img/russiangithub.png +0 -0
- data/site/public/img/stoneposter.png +0 -0
- data/site/public/img/vospit.jpeg +0 -0
- data/site/views/chaining.md +32 -0
- data/site/views/index.md +219 -0
- data/site/views/layouts/app.haml +16 -0
- data/site/views/rack-integration.md +51 -0
- data/site/views/responding.md +103 -0
- data/site/views/route-generation.md +82 -0
- data/site/views/routing.md +261 -0
- data/site/views/settings.md +19 -0
- data/site/views/team-renee.md +13 -0
- data/site/views/tutorial.md +57 -0
- data/site/views/variable-types.md +57 -0
- data/test.watchr +61 -0
- data/test/renee-core/chaining_test.rb +33 -0
- data/test/renee-core/env_accessors_test.rb +43 -0
- data/test/renee-core/include_test.rb +14 -0
- data/test/renee-core/request_context_test.rb +70 -0
- data/test/renee-core/responding_test.rb +128 -0
- data/test/renee-core/routing_test.rb +443 -0
- data/test/renee-core/test_helper.rb +4 -0
- data/test/renee-core/variable_type_test.rb +57 -0
- data/test/renee-render/render_test.rb +162 -0
- data/test/renee-render/test_helper.rb +9 -0
- data/test/renee-session/session_test.rb +31 -0
- data/test/renee-session/test_helper.rb +9 -0
- data/test/renee-url-generation/test_helper.rb +10 -0
- data/test/renee-url-generation/url_generation_test.rb +63 -0
- data/test/{blog_test.rb → renee/blog_test.rb} +10 -5
- data/test/renee/test_helper.rb +56 -0
- data/test/test_helper.rb +23 -10
- metadata +333 -156
- 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
|
+
— 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> »
|
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>(&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>(&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'>"</span><span class='tstring_content'>hello renee</span><span class='tstring_end'>"</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'>&</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'>&</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`.
|
data/site/views/index.md
ADDED
@@ -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
|
+
[↪ Read about Configuration](/settings)
|
189
|
+
|
190
|
+
[↪ Read about Responding and Rendering](/responding)
|
191
|
+
|
192
|
+
[↪ Read about Routing](/routing)
|
193
|
+
|
194
|
+
[↪ Read about Route generation](/route-generation)
|
195
|
+
|
196
|
+
## API documentation
|
197
|
+
|
198
|
+
Renee is also well-documented with YARD:
|
199
|
+
|
200
|
+
[↪ renee](/docs/renee/index.html)
|
201
|
+
|
202
|
+
[↪ renee-core](/docs/renee-core/index.html)
|
203
|
+
|
204
|
+
[↪ renee-render](/docs/renee-render/index.html)
|
205
|
+
|
206
|
+
[↪ renee-url-generation](/docs/renee-url-generation/index.html)
|
207
|
+
|
208
|
+
[↪ 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). ♥
|