renee 0.3.11 → 0.4.0.pre1
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/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,16 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title Renee #{title_part}
|
5
|
+
%link{ :href => "/css/app.css", :rel => "stylesheet" }
|
6
|
+
%link{ :rel => 'icon', :href => "/img/favicon.ico" }
|
7
|
+
%script{ :type => 'text/javascript', :src => "/js/jquery-1.6.4.min.js" }
|
8
|
+
%script{ :type => 'text/javascript', :src => "/js/app.js" }
|
9
|
+
%body
|
10
|
+
%a{ :href => "https://github.com/renee-project/renee" }
|
11
|
+
%img{ :src => '/img/russiangithub.png', :style => 'position: absolute; top: 0; left: 0; border: 0;'}
|
12
|
+
.container
|
13
|
+
.logo
|
14
|
+
%a{ :href => "/" }
|
15
|
+
%img{ :src => "/img/reneeclean.png", :title => 'IN COMMUNIST RUSSIA RENEE FRAMEWORK YOU'}
|
16
|
+
= preserve(yield)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Rack integration
|
2
|
+
|
3
|
+
Renee loves Rack. To create a new Renee application, create a rackup file (typically `config.ru`) and load it using [shotgun](https://rubygems.org/gems/shotgun).
|
4
|
+
|
5
|
+
:::ruby
|
6
|
+
# config.ru
|
7
|
+
run Renee do
|
8
|
+
# ...
|
9
|
+
end
|
10
|
+
|
11
|
+
From here, you can start consuming parts of the path. Consider:
|
12
|
+
|
13
|
+
:::ruby
|
14
|
+
# config.ru
|
15
|
+
run Renee do
|
16
|
+
puts env['SCRIPT_NAME'] # /
|
17
|
+
puts env['PATH_INFO'] # /blog/something
|
18
|
+
path 'blog' do
|
19
|
+
puts env['SCRIPT_NAME'] # /blog
|
20
|
+
puts env['PATH_INFO'] # /something
|
21
|
+
# ..
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
The path is being shifted from PATH_INFO and onto the SCRIPT_NAME. This makes it easy to stop what you're doing, and call into a Rack application, as your `env` will be in the correct state for dispatching to another Rack application. To dispatch at any point you can use `#run!`. Example:
|
26
|
+
|
27
|
+
:::ruby
|
28
|
+
# config.ru
|
29
|
+
OtherApp = proc { |env| [200, {}, [env['SCRIPT_NAME'], env['PATH_INFO']]]}
|
30
|
+
|
31
|
+
run Renee do
|
32
|
+
path 'blog' do
|
33
|
+
run! OtherApp
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Now, any request starting with `/blog` will be dispatched to `OtherApp`.
|
38
|
+
|
39
|
+
If you'd like to use a full Rack::Builder, you can use `#build!`.
|
40
|
+
|
41
|
+
:::ruby
|
42
|
+
run Renee do
|
43
|
+
path 'blog' do
|
44
|
+
build! do
|
45
|
+
use SomeMiddleware
|
46
|
+
run SomeRackApplication
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Full documentation can be found under the YARD docs for [`Renee::Core::Application::RackIntegration`](http://reneerb.com/doc/core/Renee/Core/Application/RackInteraction.html).
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# Responding
|
2
|
+
|
3
|
+
## A note about bang methods
|
4
|
+
|
5
|
+
Any method that ends with ! (a bang method) will do whatever the non-bang version of that method will do,
|
6
|
+
but in addition, it will halt with that response.
|
7
|
+
|
8
|
+
## `#halt`
|
9
|
+
|
10
|
+
Halt will immediately stop processing and respond with the value passed to it. It will respond
|
11
|
+
in different ways depending on what was passed to it.
|
12
|
+
|
13
|
+
### `Symbol`
|
14
|
+
|
15
|
+
If it's a symbol, it will attempt to look it up in [`Renee::Core::Application::Responding::HTTP_CODES`](http://reneerb.com/doc/core/Renee/Core/Application/Responding.html).
|
16
|
+
|
17
|
+
:::ruby
|
18
|
+
# Return status with symbol
|
19
|
+
halt :not_found
|
20
|
+
|
21
|
+
### `String`
|
22
|
+
|
23
|
+
It will use this to create a Rack::Response object and call `#finish` on it.
|
24
|
+
|
25
|
+
:::ruby
|
26
|
+
# Return 200 with body
|
27
|
+
halt "hello!"
|
28
|
+
|
29
|
+
### `Array`
|
30
|
+
|
31
|
+
It will attempt to interpret this as a Rack response.
|
32
|
+
|
33
|
+
:::ruby
|
34
|
+
# Return 200 with body
|
35
|
+
halt [200, {}, 'body']
|
36
|
+
|
37
|
+
### `Integer`
|
38
|
+
|
39
|
+
It will return this as a status code.
|
40
|
+
|
41
|
+
:::ruby
|
42
|
+
# Return just 200 status code
|
43
|
+
halt 200
|
44
|
+
|
45
|
+
## `#respond` (and `#respond!`)
|
46
|
+
|
47
|
+
The `respond` command makes returning a rack response very explicit,
|
48
|
+
you can respond as if you were constructing a Rack::Response
|
49
|
+
|
50
|
+
:::ruby
|
51
|
+
run Renee {
|
52
|
+
get { respond!("hello!", 403, "foo" => "bar") }
|
53
|
+
}
|
54
|
+
|
55
|
+
or use the block DSL for convenience:
|
56
|
+
|
57
|
+
:::ruby
|
58
|
+
run Renee {
|
59
|
+
get { respond! { status 403; headers :foo => "bar"; body "hello!" } }
|
60
|
+
}
|
61
|
+
|
62
|
+
## `#redirect` (and `#redirect!`)
|
63
|
+
|
64
|
+
This will return a rack-response to the path supplied and an optional HTTP status code.
|
65
|
+
|
66
|
+
:::ruby
|
67
|
+
get {
|
68
|
+
redirect!('/hello')
|
69
|
+
}
|
70
|
+
|
71
|
+
You can also specify the status code for the redirect:
|
72
|
+
|
73
|
+
:::ruby
|
74
|
+
get {
|
75
|
+
redirect!('/hello', 303)
|
76
|
+
}
|
77
|
+
|
78
|
+
## `#render` (and `#render!`)
|
79
|
+
|
80
|
+
This will render a template based on the rendering options supplied. The simplest render is just:
|
81
|
+
|
82
|
+
:::ruby
|
83
|
+
render! "index"
|
84
|
+
|
85
|
+
Assuming you have a views_path setup (see [Settings](/settings)), this will render the first template named `index`.
|
86
|
+
You can also specify the template engine explicitly with:
|
87
|
+
|
88
|
+
:::ruby
|
89
|
+
render! "index.haml"
|
90
|
+
|
91
|
+
This will locate and render the haml template (`index.haml`) within views. You can also pass local variables to
|
92
|
+
the template:
|
93
|
+
|
94
|
+
:::ruby
|
95
|
+
render! "index", :locals => { :foo => "bar" }
|
96
|
+
|
97
|
+
and then access them as expected within the template. Using a layout is also as simple as specifying the
|
98
|
+
layout template with a render:
|
99
|
+
|
100
|
+
:::ruby
|
101
|
+
render! "index", :layout => "base"
|
102
|
+
|
103
|
+
This will render the index template within the base template in the views folder.
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Route generation
|
2
|
+
|
3
|
+
To register paths for later generation, you have four methods at your disposal: `#register`, `#prefix`, `#path`, and `#url`.
|
4
|
+
|
5
|
+
## `#register`
|
6
|
+
|
7
|
+
This allows you to register a route for later generation:
|
8
|
+
|
9
|
+
:::ruby
|
10
|
+
app = Renee.new
|
11
|
+
app.register(:path, '/path')
|
12
|
+
app.path(:path) # Would return '/path'
|
13
|
+
|
14
|
+
This also allows for named variables in the path:
|
15
|
+
|
16
|
+
:::ruby
|
17
|
+
app = Renee.new
|
18
|
+
app.register(:path, '/path/:id')
|
19
|
+
app.path(:path, 123) # Would return '/path/123'
|
20
|
+
app.path(:path, :id => 123) # This would also return '/path/123'
|
21
|
+
|
22
|
+
If you have default values for variables, you can pass them in on the `#register` call:
|
23
|
+
|
24
|
+
:::ruby
|
25
|
+
app = Renee.new
|
26
|
+
app.register(:blog_get, '/blog/:page', :page => 1)
|
27
|
+
app.path(:blog_get) # Would return '/blog/1'
|
28
|
+
app.path(:blog_get, 5) # Would return '/blog/5'
|
29
|
+
|
30
|
+
## `#prefix`
|
31
|
+
|
32
|
+
This allows you to define common parts for nicer re-use:
|
33
|
+
|
34
|
+
:::ruby
|
35
|
+
app = Renee.new
|
36
|
+
app.prefix("http://mydomain.com") {
|
37
|
+
app.register(:test, "/test")
|
38
|
+
app.register(:test2, "/test2")
|
39
|
+
}
|
40
|
+
app.url(:test) # Would return http://mydomain.com/test
|
41
|
+
app.url(:test2) # Would return http://mydomain.com/test2
|
42
|
+
|
43
|
+
You can even store the objects created by `#prefix` and use them later. In the above example, this would also be equivalent:
|
44
|
+
|
45
|
+
:::ruby
|
46
|
+
app = Renee.new
|
47
|
+
domain_prefix = app.prefix("http://mydomain.com")
|
48
|
+
domain_prefix.register(:test, "/test")
|
49
|
+
domain_prefix.register(:test, "/test2")
|
50
|
+
|
51
|
+
This makes registering similar routes more concise.
|
52
|
+
|
53
|
+
## `#path`
|
54
|
+
|
55
|
+
This creates paths for the paths you have registered. The first parameter is the name of the route. After that an optional hash can be
|
56
|
+
supplied to dictate the value of variables in the path. Any key-values not consumed by the path will be appended as a query string to
|
57
|
+
the generated path.
|
58
|
+
|
59
|
+
Example:
|
60
|
+
|
61
|
+
:::ruby
|
62
|
+
app = Renee.new
|
63
|
+
app.register(:blog, '/blog')
|
64
|
+
app.path(:blog) # Would return '/blog'
|
65
|
+
app.path(:blog, :page => 1) # Would return '/blog?page=1'
|
66
|
+
|
67
|
+
## `#url`
|
68
|
+
|
69
|
+
This is identical to path with one special consideration. If the registered path had a scheme, host or port, it will be added to the generated path:
|
70
|
+
|
71
|
+
:::ruby
|
72
|
+
app = Renee.new
|
73
|
+
app.register(:blog, 'http://localhost/blog')
|
74
|
+
app.url(:blog) # Would return 'http://localhost/blog'
|
75
|
+
|
76
|
+
If you leave off the scheme, this will create scheme in-variant URLs:
|
77
|
+
|
78
|
+
:::ruby
|
79
|
+
app = Renee.new
|
80
|
+
app.register(:blog, '://localhost/blog')
|
81
|
+
app.url(:blog) # Would return '://localhost/blog',
|
82
|
+
# did I mention, these are awesome?
|
@@ -0,0 +1,261 @@
|
|
1
|
+
# Routing
|
2
|
+
|
3
|
+
## Rack integration
|
4
|
+
|
5
|
+
### `#run` (and `#run!`)
|
6
|
+
|
7
|
+
This method will take whatever is passed to it and send `#call` to it.
|
8
|
+
|
9
|
+
### `#build` (and `#build!`)
|
10
|
+
|
11
|
+
This method will take run the code block passed to it and wrap it with a Rack::Builder, then run it.
|
12
|
+
|
13
|
+
Example:
|
14
|
+
|
15
|
+
:::ruby
|
16
|
+
Renee {
|
17
|
+
build! {
|
18
|
+
use Rack::ContentLength
|
19
|
+
run proc {|env| [200, {}, ["hello rack!"]]}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
## Request context
|
24
|
+
|
25
|
+
The most basic part of Renee is the request context. This gives you access to the current env,
|
26
|
+
a Rack::Request wrapped version of the env.
|
27
|
+
|
28
|
+
## Path-based
|
29
|
+
|
30
|
+
All path based routing proceeds by removing the matched part from `PATH_INFO`, and adding it to the end of
|
31
|
+
`SCRIPT_NAME` before executing the block passed to it. Therefore, only the path based routing method mutate
|
32
|
+
the rack environment, and they are the only methods that do so.
|
33
|
+
|
34
|
+
### `#path`
|
35
|
+
|
36
|
+
This will match the part supplied to it.
|
37
|
+
|
38
|
+
Example:
|
39
|
+
|
40
|
+
:::ruby
|
41
|
+
Renee {
|
42
|
+
path('test') {
|
43
|
+
halt 'i got /test!' # your path must start with /test to get here.
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
Paths can also be nested within one another:
|
48
|
+
|
49
|
+
:::ruby
|
50
|
+
Renee {
|
51
|
+
path('blog') {
|
52
|
+
path('foo') { get { halt "path is /blog/foo" } }
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
If the part supplied doesn't start with a `/`, one will be added. If there is a trailing slash, and consuming it would
|
57
|
+
cause `PATH_INFO` to be empty, it will be consumed as well. In the above example, `/test/` would also match.
|
58
|
+
|
59
|
+
### `#exact_path`
|
60
|
+
|
61
|
+
This is identical to `#path`, except trailing slashes will not be matched. For example:
|
62
|
+
|
63
|
+
:::ruby
|
64
|
+
Renee {
|
65
|
+
exact_path('test') {
|
66
|
+
halt 'i got /test!' # your path must be /test to get here.
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
### `#whole_path`
|
71
|
+
|
72
|
+
This is identical to `#path`, except it will not execute the block unless it consumes the entire path.
|
73
|
+
Trailing slashes will be ignored.
|
74
|
+
|
75
|
+
:::ruby
|
76
|
+
Renee {
|
77
|
+
whole_path('test') {
|
78
|
+
halt 'i got /test!' # your path must be exactly /test to get here.
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
### `#part`
|
83
|
+
|
84
|
+
This is similar to `#path`, except it's used for parts of the path instead of a whole part delimited by `/`'s. For example:
|
85
|
+
|
86
|
+
:::ruby
|
87
|
+
Renee {
|
88
|
+
part('one') {
|
89
|
+
part('two') {
|
90
|
+
part('three') {
|
91
|
+
halt "onetwothree" # this will only match /onetwothree
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
### `#extension`
|
98
|
+
|
99
|
+
You can also use `extension` as a way to define formats:
|
100
|
+
|
101
|
+
:::ruby
|
102
|
+
path '/test' do
|
103
|
+
extension 'html' do
|
104
|
+
halt 'html'
|
105
|
+
end
|
106
|
+
extension 'json' do
|
107
|
+
halt 'json'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
This will have `test.html` respond with 'html' and `test.json` respond with 'json'.
|
112
|
+
|
113
|
+
### `#var` (also `#variable`)
|
114
|
+
|
115
|
+
This will match a part of path (delimited by `/`'s) and yield that value back to the block passed to it. Example:
|
116
|
+
|
117
|
+
:::ruby
|
118
|
+
Renee {
|
119
|
+
var { |id|
|
120
|
+
# this will match /one and return "the id is `one'"
|
121
|
+
halt "the id is `#{id}'"
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
You can access the variables (passed into the request) using the local variables yielded to the block. Variables are a powerful
|
126
|
+
way to express expected parameters for a given set of requests. You can specify variables that match a regex:
|
127
|
+
|
128
|
+
:::ruby
|
129
|
+
path('blog') {
|
130
|
+
var(/\d+/) { |id| get { halt "path is /blog/#{id}" } }
|
131
|
+
}
|
132
|
+
|
133
|
+
and even explicitly cast your variable types:
|
134
|
+
|
135
|
+
:::ruby
|
136
|
+
path('blog') {
|
137
|
+
var :integer do |id|
|
138
|
+
get { halt "path is /blog/#{id} and id is an integer" }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
### `#part_var` (also `#partial_variable`)
|
143
|
+
|
144
|
+
This will match a part of path and yield that value back to the block passed to it.
|
145
|
+
It will consume partial parts of the path like `#part`.
|
146
|
+
|
147
|
+
### `#remainder`
|
148
|
+
|
149
|
+
This will consume the remaining part of the path and yield that value to the block passed to it. Example:
|
150
|
+
|
151
|
+
:::ruby
|
152
|
+
Renee {
|
153
|
+
remainder {|p|
|
154
|
+
# this will match anything and yield the result.
|
155
|
+
halt "I got #{p} back."
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
Notice this allows you to handle the cases within a particular route scope and manage them based on the "rest" of the uri yielded in the `remainder` block. You
|
160
|
+
can handle different remainders in all the different path blocks.
|
161
|
+
|
162
|
+
### `#complete`
|
163
|
+
|
164
|
+
This will only match if the `PATH_INFO` has been entirely consumed. If the PATH_INFO was only `/`, it
|
165
|
+
will be consumed by this method. Example:
|
166
|
+
|
167
|
+
:::ruby
|
168
|
+
Renee {
|
169
|
+
complete {
|
170
|
+
halt "consumption is complete" # this will only match '/' and ''
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
## Request method-based
|
175
|
+
|
176
|
+
Request methods can be defined easily:
|
177
|
+
|
178
|
+
:::ruby
|
179
|
+
run Renee {
|
180
|
+
get { halt "a get!" }
|
181
|
+
post { halt "a post!" }
|
182
|
+
put { halt "a put!" }
|
183
|
+
delete { halt "a delete!" }
|
184
|
+
}
|
185
|
+
|
186
|
+
### `#get`
|
187
|
+
|
188
|
+
This will match if the path is complete and the request method is `GET`. Optionally,
|
189
|
+
you can pass it a path, which will match using `complete_path` and then perform the request method matching.
|
190
|
+
|
191
|
+
### `#put`
|
192
|
+
|
193
|
+
This is the same as `#get`, except for the request method `PUT`.
|
194
|
+
|
195
|
+
### `#post`
|
196
|
+
|
197
|
+
This is the same as `#get`, except for the request method `POST`.
|
198
|
+
|
199
|
+
### `#delete`
|
200
|
+
|
201
|
+
This is the same as `#get`, except for the request method `DELETE`.
|
202
|
+
|
203
|
+
## Query-based
|
204
|
+
|
205
|
+
### `#query`
|
206
|
+
|
207
|
+
Query allows you either match a hash of key-value pairs from the query path.
|
208
|
+
Or, it will match a list of keys. If one of the keys is not present, this this will not yield
|
209
|
+
the values corresponding to the keys supplied.
|
210
|
+
|
211
|
+
Example:
|
212
|
+
|
213
|
+
:::ruby
|
214
|
+
Renee {
|
215
|
+
query(:key => 'value') {
|
216
|
+
halt "The query string contained key=value"
|
217
|
+
}
|
218
|
+
|
219
|
+
query :key, :secret { |key_value, secret_value|
|
220
|
+
halt "Key is #{key_value}, secret_value is
|
221
|
+
#{secret_value} (and these will never be nil)"
|
222
|
+
}
|
223
|
+
}
|
224
|
+
|
225
|
+
### `#query_string`
|
226
|
+
|
227
|
+
This will match an exact query string. It's equivalent to `match === env['QUERY_STRING']`
|
228
|
+
where match is the value passed in.
|
229
|
+
|
230
|
+
:::ruby
|
231
|
+
path 'foo' do
|
232
|
+
query_string 'bar' do
|
233
|
+
get { halt 'BAR!' }
|
234
|
+
end
|
235
|
+
|
236
|
+
query_string 'baz' do
|
237
|
+
get { halt 'BAZ!' }
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
This will respond to `/foo?bar` with "BAR!" and `/foo?baz` with "BAZ!".
|
242
|
+
You can also specify query_string in a variety of other ways:
|
243
|
+
|
244
|
+
:::ruby
|
245
|
+
# Check key and value of query param
|
246
|
+
query_string 'foo=bar' do
|
247
|
+
post { halt [200,{},'foo'] }
|
248
|
+
end
|
249
|
+
|
250
|
+
# Declare query params as a hash
|
251
|
+
query :foo => "bar" do
|
252
|
+
halt 200
|
253
|
+
end
|
254
|
+
|
255
|
+
# Switch based on a query parameter
|
256
|
+
query :foo do |var|
|
257
|
+
case var
|
258
|
+
when 'bar' then halt 200
|
259
|
+
when 'bar2' then halt 500
|
260
|
+
end
|
261
|
+
end
|