ramaze 2011.07.25 → 2011.10.23
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.mailmap +3 -2
- data/.travis.yml +17 -0
- data/.yardopts +13 -0
- data/README.md +95 -352
- data/examples/app/blog/app.rb +25 -64
- data/examples/app/blog/config.ru +11 -9
- data/examples/app/blog/controller/init.rb +29 -86
- data/examples/app/blog/controller/posts.rb +232 -0
- data/examples/app/blog/controller/users.rb +160 -0
- data/examples/app/blog/layout/default.xhtml +61 -0
- data/examples/app/blog/migrations/01_create_schema.rb +50 -0
- data/examples/app/blog/model/comment.rb +41 -54
- data/examples/app/blog/model/init.rb +41 -13
- data/examples/app/blog/model/post.rb +35 -0
- data/examples/app/blog/model/user.rb +105 -0
- data/examples/app/blog/public/.htaccess +24 -0
- data/examples/app/blog/public/css/grid.css +107 -0
- data/examples/app/blog/public/css/layout.css +203 -0
- data/examples/app/blog/public/css/reset.css +123 -0
- data/examples/app/blog/public/css/text.css +109 -0
- data/examples/app/blog/public/dispatch.fcgi +11 -0
- data/examples/app/blog/public/favicon.ico +0 -0
- data/examples/app/blog/public/images/bg.png +0 -0
- data/examples/app/blog/start.rb +18 -3
- data/examples/app/blog/view/feed.xhtml +23 -0
- data/examples/app/blog/view/form.xhtml +11 -0
- data/examples/app/blog/view/index.xhtml +44 -0
- data/examples/app/blog/view/users/form.xhtml +12 -0
- data/examples/app/blog/view/users/index.xhtml +30 -0
- data/examples/app/blog/view/users/login.xhtml +8 -0
- data/examples/app/blog/view/view.xhtml +68 -0
- data/{doc → guide}/AUTHORS +5 -3
- data/{doc → guide}/CHANGELOG +428 -0
- data/{doc/GPL → guide/GPL_LICENSE} +0 -0
- data/{doc/COPYING → guide/RUBY_LICENSE} +3 -6
- data/guide/_static/logo.png +0 -0
- data/guide/_static/logo.svg +49 -0
- data/guide/_static/ramaze_console.png +0 -0
- data/guide/css/common.css +20 -0
- data/guide/general/cache.md +167 -0
- data/guide/general/configuration.md +168 -0
- data/guide/general/contributing.md +108 -0
- data/guide/general/controllers.md +115 -0
- data/guide/general/helpers.md +76 -0
- data/guide/general/installation.md +58 -0
- data/guide/general/logging.md +99 -0
- data/guide/general/middlewares.md +100 -0
- data/guide/general/models.md +78 -0
- data/guide/general/principles.md +53 -0
- data/guide/general/ramaze_command.md +155 -0
- data/guide/general/routes.md +81 -0
- data/guide/general/sessions.md +140 -0
- data/guide/general/special_thanks.md +67 -0
- data/guide/general/testing.md +61 -0
- data/guide/general/views.md +322 -0
- data/guide/tutorials/introduction.md +259 -0
- data/lib/proto/config.ru +1 -1
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/view/index.xhtml +7 -7
- data/lib/ramaze.rb +4 -4
- data/lib/ramaze/app.rb +11 -11
- data/lib/ramaze/app_graph.rb +2 -4
- data/lib/ramaze/bin/console.rb +3 -3
- data/lib/ramaze/bin/create.rb +2 -2
- data/lib/ramaze/bin/restart.rb +4 -4
- data/lib/ramaze/bin/runner.rb +5 -5
- data/lib/ramaze/bin/start.rb +19 -4
- data/lib/ramaze/bin/status.rb +3 -3
- data/lib/ramaze/bin/stop.rb +3 -3
- data/lib/ramaze/cache.rb +1 -0
- data/lib/ramaze/cache/lru.rb +8 -4
- data/lib/ramaze/cache/memcache.rb +32 -13
- data/lib/ramaze/cache/redis.rb +164 -0
- data/lib/ramaze/cache/sequel.rb +43 -28
- data/lib/ramaze/controller.rb +1 -2
- data/lib/ramaze/dependencies.rb +40 -3
- data/lib/ramaze/helper/bench.rb +26 -16
- data/lib/ramaze/helper/blue_form.rb +46 -73
- data/lib/ramaze/helper/cache.rb +10 -6
- data/lib/ramaze/helper/csrf.rb +35 -39
- data/lib/ramaze/helper/disqus.rb +5 -4
- data/lib/ramaze/helper/email.rb +35 -24
- data/lib/ramaze/helper/erector.rb +9 -13
- data/lib/ramaze/helper/flash.rb +7 -9
- data/lib/ramaze/helper/formatting.rb +194 -179
- data/lib/ramaze/helper/gravatar.rb +4 -8
- data/lib/ramaze/helper/identity.rb +3 -3
- data/lib/ramaze/helper/layout.rb +23 -8
- data/lib/ramaze/helper/markaby.rb +1 -1
- data/lib/ramaze/helper/paginate.rb +46 -39
- data/lib/ramaze/helper/request_accessor.rb +3 -1
- data/lib/ramaze/helper/simple_captcha.rb +18 -17
- data/lib/ramaze/helper/stack.rb +1 -1
- data/lib/ramaze/helper/tagz.rb +4 -2
- data/lib/ramaze/helper/upload.rb +523 -0
- data/lib/ramaze/helper/user.rb +4 -8
- data/lib/ramaze/helper/xhtml.rb +11 -15
- data/lib/ramaze/log.rb +9 -6
- data/lib/ramaze/log/rotatinginformer.rb +62 -27
- data/lib/ramaze/log/syslog.rb +20 -15
- data/lib/ramaze/log/xosd.rb +2 -1
- data/lib/ramaze/reloader.rb +2 -0
- data/lib/ramaze/request.rb +11 -10
- data/lib/ramaze/setup.rb +23 -6
- data/lib/ramaze/snippets/array/put_within.rb +3 -9
- data/lib/ramaze/snippets/binding/locals.rb +5 -10
- data/lib/ramaze/snippets/fiber.rb +1 -23
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +3 -6
- data/lib/ramaze/snippets/numeric/filesize_format.rb +3 -5
- data/lib/ramaze/snippets/numeric/time.rb +3 -7
- data/lib/ramaze/snippets/object/__dir__.rb +3 -7
- data/lib/ramaze/snippets/object/instance_variable_defined.rb +3 -6
- data/lib/ramaze/snippets/object/pretty.rb +3 -7
- data/lib/ramaze/snippets/object/scope.rb +7 -9
- data/lib/ramaze/snippets/proc/locals.rb +12 -12
- data/lib/ramaze/snippets/ramaze/acquire.rb +15 -14
- data/lib/ramaze/snippets/ramaze/deprecated.rb +1 -1
- data/lib/ramaze/snippets/ramaze/fiber.rb +1 -1
- data/lib/ramaze/snippets/ramaze/lru_hash.rb +2 -3
- data/lib/ramaze/snippets/ramaze/struct.rb +2 -4
- data/lib/ramaze/snippets/string/camel_case.rb +8 -10
- data/lib/ramaze/snippets/string/color.rb +3 -4
- data/lib/ramaze/snippets/string/end_with.rb +3 -6
- data/lib/ramaze/snippets/string/esc.rb +3 -8
- data/lib/ramaze/snippets/string/ord.rb +3 -8
- data/lib/ramaze/snippets/string/snake_case.rb +6 -9
- data/lib/ramaze/snippets/string/start_with.rb +3 -8
- data/lib/ramaze/snippets/string/unindent.rb +3 -6
- data/lib/ramaze/snippets/thread/into.rb +1 -3
- data/lib/ramaze/spec.rb +2 -31
- data/lib/ramaze/spec/bacon.rb +18 -2
- data/lib/ramaze/version.rb +1 -1
- data/lib/ramaze/view.rb +1 -1
- data/ramaze.gemspec +1 -1
- data/spec/helper.rb +2 -1
- data/spec/ramaze/bin/start.rb +16 -20
- data/spec/ramaze/cache/localmemcache.rb +4 -7
- data/spec/ramaze/cache/memcache.rb +3 -1
- data/spec/ramaze/cache/redis.rb +62 -0
- data/spec/ramaze/helper/blue_form.rb +33 -4
- data/spec/ramaze/helper/layout.rb +40 -7
- data/spec/ramaze/helper/upload.rb +149 -0
- data/spec/ramaze/helper/uploads/text_1.txt +1 -0
- data/spec/ramaze/helper/uploads/text_2.txt +1 -0
- data/spec/ramaze/log/growl.rb +4 -6
- data/spec/ramaze/log/syslog.rb +6 -0
- data/spec/ramaze/view/lokar.rb +5 -0
- data/spec/ramaze/view/nagoro.rb +5 -0
- data/tasks/authors.rake +1 -1
- data/tasks/bacon.rake +14 -5
- data/tasks/changelog.rake +1 -1
- data/tasks/yard.rake +12 -4
- metadata +277 -239
- data/doc/LEGAL +0 -26
- data/examples/app/blog/README +0 -3
- data/examples/app/blog/controller/comment.rb +0 -45
- data/examples/app/blog/controller/entry.rb +0 -85
- data/examples/app/blog/controller/main.rb +0 -20
- data/examples/app/blog/controller/tag.rb +0 -9
- data/examples/app/blog/layout/default.nag +0 -31
- data/examples/app/blog/model/entry.rb +0 -89
- data/examples/app/blog/model/tag.rb +0 -36
- data/examples/app/blog/public/css/screen.css +0 -273
- data/examples/app/blog/spec/blog.rb +0 -87
- data/examples/app/blog/view/comment/form.nag +0 -10
- data/examples/app/blog/view/comment/show.nag +0 -16
- data/examples/app/blog/view/entry/edit.nag +0 -14
- data/examples/app/blog/view/entry/feed.atom.nag +0 -8
- data/examples/app/blog/view/entry/feed.rss.nag +0 -7
- data/examples/app/blog/view/entry/index.nag +0 -7
- data/examples/app/blog/view/entry/new.nag +0 -13
- data/examples/app/blog/view/entry/show.nag +0 -36
- data/examples/app/blog/view/feed.atom.nag +0 -18
- data/examples/app/blog/view/feed.rss.nag +0 -25
- data/examples/app/blog/view/index.nag +0 -6
- data/examples/app/blog/view/tag/index.nag +0 -5
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/ramaze/rest.rb +0 -36
- data/spec/ramaze/rest.rb +0 -28
- data/tasks/rcov.rake +0 -22
File without changes
|
@@ -38,15 +38,12 @@ version 2 (see the file GPL), or the conditions below:
|
|
38
38
|
d) make other distribution arrangements with the author.
|
39
39
|
|
40
40
|
4. You may modify and include the part of the software into any other
|
41
|
-
software (possibly commercial).
|
41
|
+
software (possibly commercial). But some files in the distribution
|
42
42
|
are not written by the author, so that they are not under these terms.
|
43
43
|
|
44
|
-
|
45
|
-
file LEGAL.
|
46
|
-
|
47
|
-
5. The scripts and library files supplied as input to or produced as
|
44
|
+
5. The scripts and library files supplied as input to or produced as
|
48
45
|
output from the software do not automatically fall under the
|
49
|
-
copyright of the software, but belong to whomever generated them,
|
46
|
+
copyright of the software, but belong to whomever generated them,
|
50
47
|
and may be sold commercially, and may be aggregated with this
|
51
48
|
software.
|
52
49
|
|
Binary file
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1"
|
5
|
+
id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="ramaze_circle_logo.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" inkscape:version="0.48.1 r9760"
|
6
|
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="300px" height="300px"
|
7
|
+
viewBox="-64.75 -65.013 300 300" enable-background="new -64.75 -65.013 300 300" xml:space="preserve">
|
8
|
+
<sodipodi:namedview id="base" fit-margin-bottom="0" fit-margin-right="0" fit-margin-left="0" fit-margin-top="0" inkscape:window-y="19" inkscape:window-x="0" showgrid="false" inkscape:current-layer="layer1" inkscape:document-units="px" inkscape:cy="304.76131" inkscape:pageopacity="0.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#ffffff" inkscape:cx="174.2785" inkscape:zoom="0.35355339" inkscape:window-height="747" inkscape:pageshadow="2" inkscape:window-width="1364" inkscape:window-maximized="0">
|
9
|
+
</sodipodi:namedview>
|
10
|
+
<g id="layer1" transform="translate(-48.0832, -566.213)" inkscape:groupmode="layer" inkscape:label="Layer 1">
|
11
|
+
<g id="g3090" transform="matrix(0.382148, 0, 0, 0.382148, 29.7083, 471.954)">
|
12
|
+
<path id="path2985-0-2-9" inkscape:connector-curvature="0" fill="#4D4D4D" d="M478.606,340.975L377.809,399.19
|
13
|
+
c9.905,17.125,15.573,37.008,15.573,58.215c0,32.151-13.043,61.245-34.115,82.315l82.347,82.344
|
14
|
+
C516.135,547.542,531.305,432.248,478.606,340.975z"/>
|
15
|
+
|
16
|
+
<radialGradient id="path4022_1_" cx="1471.6052" cy="-11840.3555" r="258.7954" gradientTransform="matrix(0.3821 0 0 -0.0439 -299.9709 175.6774)" gradientUnits="userSpaceOnUse">
|
17
|
+
<stop offset="0" style="stop-color:#000000"/>
|
18
|
+
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
|
19
|
+
</radialGradient>
|
20
|
+
|
21
|
+
<path id="path4022" sodipodi:type="arc" sodipodi:cx="148.49242" sodipodi:cy="779.41895" sodipodi:rx="258.80109" sodipodi:ry="29.698484" fill="url(#path4022_1_)" d="
|
22
|
+
M521.2,694.912c0,16.404-115.87,29.697-258.801,29.697S3.598,711.316,3.598,694.912c0-16.403,115.87-29.697,258.801-29.697
|
23
|
+
S521.2,678.509,521.2,694.912z"/>
|
24
|
+
<path id="path2985-0-1" inkscape:connector-curvature="0" fill="#B3B3B3" d="M359.266,539.719
|
25
|
+
c-21.067,21.07-50.164,34.113-82.314,34.113v116.429c61.758,0,120.988-24.53,164.661-68.197L359.266,539.719z"/>
|
26
|
+
<path id="path2985-3" inkscape:connector-curvature="0" fill="#FF0000" d="M276.952,224.547
|
27
|
+
c-128.603,0-232.857,104.254-232.857,232.857c0,128.602,104.254,232.857,232.857,232.857V573.832
|
28
|
+
c-64.302,0-116.429-52.126-116.429-116.428s52.128-116.429,116.429-116.429c43.095,0,80.724,23.413,100.856,58.215l100.797-58.215
|
29
|
+
C437.011,268.929,360.145,224.547,276.952,224.547z"/>
|
30
|
+
|
31
|
+
<linearGradient id="path2985-2-4_1_" gradientUnits="userSpaceOnUse" x1="1924.123" y1="-878.1219" x2="1924.123" y2="-1276.0308" gradientTransform="matrix(0.3821 0 0 -0.3821 -458.3633 -76.8066)">
|
32
|
+
<stop offset="0" style="stop-color:#000000;stop-opacity:0.4902"/>
|
33
|
+
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.4902"/>
|
34
|
+
</linearGradient>
|
35
|
+
<path id="path2985-2-4" inkscape:connector-curvature="0" fill="url(#path2985-2-4_1_)" d="M276.95,258.097
|
36
|
+
c-110.061,0-199.305,89.244-199.305,199.306c0,110.064,89.244,199.277,199.305,199.277c110.063,0,199.28-89.214,199.28-199.277
|
37
|
+
C476.229,347.341,387.013,258.097,276.95,258.097z M276.95,340.764c64.418,0,116.641,52.221,116.641,116.639
|
38
|
+
S341.368,574.042,276.95,574.042c-64.417,0-116.637-52.221-116.637-116.639S212.533,340.764,276.95,340.764z"/>
|
39
|
+
<path id="path2985-0-2" inkscape:connector-curvature="0" fill="#4D4D4D" d="M493.453,332.404l-108.219,62.5
|
40
|
+
c10.633,18.385,16.718,39.732,16.718,62.5c0,34.518-14.004,65.753-36.625,88.374l88.406,88.409
|
41
|
+
C533.743,554.176,550.029,430.397,493.453,332.404z"/>
|
42
|
+
<path id="path2985" inkscape:connector-curvature="0" fill="#FF0000" d="M276.952,207.404c-138.071,0-250,111.929-250,250
|
43
|
+
c0,138.073,111.929,250.002,250,250.002V582.403c-69.036,0-125-55.964-125-124.999c0-69.036,55.964-125,125-125
|
44
|
+
c46.266,0,86.668,25.137,108.282,62.5l108.219-62.5C448.794,255.054,366.268,207.404,276.952,207.404z"/>
|
45
|
+
<path id="path2985-0" inkscape:connector-curvature="0" fill="#B3B3B3" d="M365.328,545.778
|
46
|
+
c-22.621,22.621-53.859,36.625-88.375,36.625v125.003c66.304,0,129.896-26.337,176.781-73.219L365.328,545.778z"/>
|
47
|
+
</g>
|
48
|
+
</g>
|
49
|
+
</svg>
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
body
|
2
|
+
{
|
3
|
+
font-size: 14px;
|
4
|
+
line-height: 1.6;
|
5
|
+
margin: 0 auto;
|
6
|
+
max-width: 960px;
|
7
|
+
}
|
8
|
+
|
9
|
+
code
|
10
|
+
{
|
11
|
+
background: #f2f2f2;
|
12
|
+
padding-left: 3px;
|
13
|
+
padding-right: 3px;
|
14
|
+
}
|
15
|
+
|
16
|
+
pre.code
|
17
|
+
{
|
18
|
+
font-size: 13px;
|
19
|
+
line-height: 1.4;
|
20
|
+
}
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# Caching Data
|
2
|
+
|
3
|
+
Caching data such as API responses, compiled templates or database results can
|
4
|
+
give your application a big performance boost. Ramaze tries to make this as easy
|
5
|
+
as possible by providing an API that allows you to use different cache
|
6
|
+
mechanisms such as Memcache or Sequel using the same syntax.
|
7
|
+
|
8
|
+
## Available Drivers
|
9
|
+
|
10
|
+
* {Ramaze::Cache::Sequel}
|
11
|
+
* {Ramaze::Cache::LRU}
|
12
|
+
* {Ramaze::Cache::MemCache}
|
13
|
+
* {Ramaze::Cache::Redis}
|
14
|
+
* {Ramaze::Cache::LocalMemCache}
|
15
|
+
* {Innate::Cache::FileBased}
|
16
|
+
* {Innate::Cache::DRb}
|
17
|
+
* {Innate::Cache::Marshal}
|
18
|
+
* {Innate::Cache::Memory}
|
19
|
+
* {Innate::Cache::YAML}
|
20
|
+
|
21
|
+
## Manually Caching Data
|
22
|
+
|
23
|
+
Besides making it easy to automatically cache various forms of data Ramaze also
|
24
|
+
allows you to manually cache something using your favorite storage engine. In
|
25
|
+
order to do this you'll first have to configure Ramaze so that it knows that you
|
26
|
+
want to cache something, this can be done as following:
|
27
|
+
|
28
|
+
Ramaze::Cache.options.names.push(:custom)
|
29
|
+
Ramaze::Cache.options.custom = Ramaze::Cache::MemCache
|
30
|
+
|
31
|
+
# Now we can cache the data
|
32
|
+
Ramaze::Cache.custom.store('usernames', ['Pistos', 'Michael Fellinger'])
|
33
|
+
|
34
|
+
From this point on you can cache your data by calling methods on
|
35
|
+
``Ramaze::Cache.custom``.
|
36
|
+
|
37
|
+
## Creating Drivers
|
38
|
+
|
39
|
+
Odds are there's a cache driver out there that's not supported out of the box.
|
40
|
+
Don't worry, adding your own cache driver is pretty easy and I'll try to explain
|
41
|
+
it as best as I can.
|
42
|
+
|
43
|
+
The first step is creating a basic skeleton for our cache class. In it's most
|
44
|
+
basic form it looks like the following:
|
45
|
+
|
46
|
+
# It's not required to declare the cache under the Ramaze namespace, feel free
|
47
|
+
# to use a different name.
|
48
|
+
module Ramaze
|
49
|
+
# Note that Ramaze::Cache is a class, not a module.
|
50
|
+
class Cache
|
51
|
+
# This is our own custom cache class
|
52
|
+
class CustomCache
|
53
|
+
# Pre defines the required methods. This ensures all cache drivers can
|
54
|
+
# be used in the same way
|
55
|
+
include Cache::API
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
The next step is to override the methods that were created by including
|
62
|
+
Ramaze::Cache::API. The first step is adding the method that prepares the cache
|
63
|
+
by loading the driver provided by an external Rubygem (e.g. Dalli::Client for
|
64
|
+
the Memcache driver) and creating the namespace for the cache. Assuming our gem
|
65
|
+
is called "custom-cache" and the class it provides CustomCacheGem our
|
66
|
+
cache_setup (that's the name of the setup method) method would look like the
|
67
|
+
following:
|
68
|
+
|
69
|
+
def cache_setup(hostname, username, appname, cachename)
|
70
|
+
@namespace = [hostname, username, appname, cachename].compact.join('-')
|
71
|
+
@client = CustomCacheGem.new(:namespace => @namespace)
|
72
|
+
end
|
73
|
+
|
74
|
+
The next step is to add the remaining methods so that we can actually use the
|
75
|
+
cache.
|
76
|
+
|
77
|
+
# Removes *all* keys from the cache
|
78
|
+
def cache_clear
|
79
|
+
@client.delete_all
|
80
|
+
end
|
81
|
+
|
82
|
+
# Removes the specified keys from the cache
|
83
|
+
def cache_delete(*keys)
|
84
|
+
keys.each do |k|
|
85
|
+
@client.delete(k)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Retrieves the specified key or returns the default value
|
90
|
+
def cache_fetch(key, default = nil)
|
91
|
+
value = @client.get(key)
|
92
|
+
|
93
|
+
if !value.nil?
|
94
|
+
return value
|
95
|
+
else
|
96
|
+
return default
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Stores the data in the cache and return the value
|
101
|
+
def cache_store(key, value)
|
102
|
+
@client.set(key, value)
|
103
|
+
return value
|
104
|
+
end
|
105
|
+
|
106
|
+
Depending on the API of your cache mechanism the method names and the way
|
107
|
+
they're used may vary.
|
108
|
+
|
109
|
+
The entire cache class now looks like the following:
|
110
|
+
|
111
|
+
# It's not required to declare the cache under the Ramaze namespace, feel free
|
112
|
+
# to use a different name.
|
113
|
+
module Ramaze
|
114
|
+
# Note that Ramaze::Cache is a class, not a module.
|
115
|
+
class Cache
|
116
|
+
# This is our own custom cache class
|
117
|
+
class CustomCache
|
118
|
+
# Pre defines the required methods. This ensures all cache drivers can
|
119
|
+
# be used in the same way
|
120
|
+
include Cache::API
|
121
|
+
|
122
|
+
# Prepares the cache
|
123
|
+
def cache_setup(hostname, username, appname, cachename)
|
124
|
+
@namespace = [hostname, username, appname, cachename].compact.join('-')
|
125
|
+
@client = CustomCacheGem.new(:namespace => @namespace)
|
126
|
+
end
|
127
|
+
|
128
|
+
# Removes *all* keys from the cache
|
129
|
+
def cache_clear
|
130
|
+
@client.delete_all
|
131
|
+
end
|
132
|
+
|
133
|
+
# Removes the specified keys from the cache
|
134
|
+
def cache_delete(*keys)
|
135
|
+
keys.each do |k|
|
136
|
+
@client.delete(k)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Retrieves the specified key or returns the default value
|
141
|
+
def cache_fetch(key, default = nil)
|
142
|
+
value = @client.get(key)
|
143
|
+
|
144
|
+
if !value.nil?
|
145
|
+
return value
|
146
|
+
else
|
147
|
+
return default
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Stores the data in the cache and return the value
|
152
|
+
def cache_store(key, value)
|
153
|
+
@client.set(key, value)
|
154
|
+
return value
|
155
|
+
end
|
156
|
+
end # CustomCache
|
157
|
+
end # Cache
|
158
|
+
end # Ramaze
|
159
|
+
|
160
|
+
There really isn't that much to it when it comes to creating a cache driver. The
|
161
|
+
important thing to remember is that the following methods are always required:
|
162
|
+
|
163
|
+
* cache_setup
|
164
|
+
* cache_clear
|
165
|
+
* cache_delete
|
166
|
+
* cache_fetch
|
167
|
+
* cache_store
|
@@ -0,0 +1,168 @@
|
|
1
|
+
# Configuration
|
2
|
+
|
3
|
+
Ramaze provides two ways of setting configuration options, using
|
4
|
+
``Ramaze::Optioned`` and ``Ramaze::Traited``.
|
5
|
+
|
6
|
+
Both Ramaze::Optioned and Ramaze::Traited are aliases for Innate::Optioned and
|
7
|
+
Innate::Traited respectively.
|
8
|
+
|
9
|
+
## Traits using Ramaze::Traited
|
10
|
+
|
11
|
+
Traits provide a way of setting configuration options in a class similar to
|
12
|
+
class variables. The advantage of using traits is that they are inherited in
|
13
|
+
classes which allows you to use different values for a trait in a parent and
|
14
|
+
child class. On top of that you can access traits outside of a class' scope
|
15
|
+
(class variables are private). Ramaze uses traits for various configuration
|
16
|
+
settings that are specific to a certain class' instance or module.
|
17
|
+
``Ramaze::Optioned`` can't be used for this since the options set would be the
|
18
|
+
same for all instances whereas traits can have their own values.
|
19
|
+
|
20
|
+
Using traits is quite simple and can be done by including the module
|
21
|
+
Ramaze::Traited into your class:
|
22
|
+
|
23
|
+
class Something
|
24
|
+
include Ramaze::Traited
|
25
|
+
end
|
26
|
+
|
27
|
+
This module can be included into controllers, models or any other class. Once
|
28
|
+
this module has been included into a class you can define a trait using the
|
29
|
+
method ``trait()``. This method takes a hash where the key is the name of the
|
30
|
+
trait and the value the value for that trait:
|
31
|
+
|
32
|
+
class Something
|
33
|
+
include Ramaze::Traited
|
34
|
+
|
35
|
+
trait :language => 'ruby'
|
36
|
+
end
|
37
|
+
|
38
|
+
Inside a class instance traits can also be retrieved using this method by simply
|
39
|
+
specifying the name of the trait:
|
40
|
+
|
41
|
+
class Something
|
42
|
+
include Ramaze::Traited
|
43
|
+
|
44
|
+
trait :language => 'ruby'
|
45
|
+
|
46
|
+
def language
|
47
|
+
puts "Language: #{trait[:language]}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Outside of a class' instance you can still retrieve a trait but you need to call
|
52
|
+
``class_trait()`` instead:
|
53
|
+
|
54
|
+
Something.class_trait[:language] # => "ruby"
|
55
|
+
|
56
|
+
Another cool feature of ``Ramaze::Traited`` is that you can get a list of all
|
57
|
+
traits of a class and all it's parent classes using ``ancestral_trait()``. This
|
58
|
+
method retrieves all traits where each trait that's redefined will overwrite the
|
59
|
+
existing one. Example:
|
60
|
+
|
61
|
+
class Foo
|
62
|
+
include Ramaze::Traited
|
63
|
+
trait :one => :eins, :first => :erstes
|
64
|
+
end
|
65
|
+
|
66
|
+
class Bar < Foo
|
67
|
+
trait :two => :zwei
|
68
|
+
end
|
69
|
+
|
70
|
+
class Foobar < Bar
|
71
|
+
trait :three => :drei, :first => :overwritten
|
72
|
+
end
|
73
|
+
|
74
|
+
Foobar.ancestral_trait
|
75
|
+
# => {:three => :drei, :two => :zwei, :one => :eins, :first => :overwritten}
|
76
|
+
|
77
|
+
## Options using Ramaze::Optioned
|
78
|
+
|
79
|
+
Ramaze::Optioned can be used to set global options regardless of the instance of
|
80
|
+
a class. Options set using this module are also inherited but you can't set
|
81
|
+
different values for different instances. A good use case for Ramaze::Optioned
|
82
|
+
is the helper ``Ramaze::Helper::Email``. This helper specifies certain options
|
83
|
+
such as the SMTP host and username. These options don't change in a request or
|
84
|
+
in an instance of a controller so using traits would be useless. It's also quite
|
85
|
+
rare that you want to use different settings in a sub controller.
|
86
|
+
|
87
|
+
Settings options using Ramaze::Optioned works a bit different compared to traits
|
88
|
+
but don't worry, it's very easy. First you must include the module and then call
|
89
|
+
``options.dsl()`` as shown below.
|
90
|
+
|
91
|
+
class Something
|
92
|
+
include Ramaze::Optioned
|
93
|
+
|
94
|
+
options.dsl do
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
Inside the block passed to ``options.dsl()`` you can call the ``option`` method
|
100
|
+
(aliased as ``o`` so you have to write less code). This method has the following
|
101
|
+
syntax:
|
102
|
+
|
103
|
+
option(description, name, default value)
|
104
|
+
|
105
|
+
Say we want to define a option that allows the user to change a username, this
|
106
|
+
can be done as following:
|
107
|
+
|
108
|
+
class Something
|
109
|
+
include Ramaze::Optioned
|
110
|
+
|
111
|
+
options.dsl do
|
112
|
+
o 'Defines the username', :username, 'ramaze'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
Once an option is set it can be retrieved by calling ``options`` on the class
|
117
|
+
(regardless of whether or not the call was made inside an instance):
|
118
|
+
|
119
|
+
# Outside of the class
|
120
|
+
Something.options.username # => "ramaze"
|
121
|
+
|
122
|
+
# Inside the class
|
123
|
+
options.username # => "ramaze"
|
124
|
+
|
125
|
+
Dumping the entire options object to the command line using ``puts`` (or
|
126
|
+
something similar) will also show the description of each option, the default
|
127
|
+
value, etc:
|
128
|
+
|
129
|
+
Something.options # => {:username=>{:doc=>"Defines the username", :value=>"ramaze"}}
|
130
|
+
|
131
|
+
## Configuring Paths
|
132
|
+
|
133
|
+
While Ramaze is a very flexible framework it requires some basic information
|
134
|
+
about the location of your views, layouts and so on. Ramaze does not
|
135
|
+
automatically tries to locate these but instead uses a set of defined locations
|
136
|
+
to look for. These paths are set using ``Ramaze::Optioned`` and can be found in
|
137
|
+
the following options:
|
138
|
+
|
139
|
+
* Ramaze.options.views
|
140
|
+
* Ramaze.options.publics
|
141
|
+
* Ramaze.options.layouts
|
142
|
+
* Ramaze.options.roots
|
143
|
+
|
144
|
+
Helpers aren't defined in these paths as they're considered a separate part of
|
145
|
+
Ramaze. Instead of using ``Ramaze.options`` you'll have to update
|
146
|
+
``Ramaze::HelpersHelper.options.paths``.
|
147
|
+
|
148
|
+
Note that ``Ramaze.options.roots`` and ``Ramaze::HelpersHelper.options.paths``
|
149
|
+
are the only two options that use absolute paths, all other paths are relative
|
150
|
+
to the root directories.
|
151
|
+
|
152
|
+
Let's say you want to have an extra view directory called "templates", this
|
153
|
+
directory can be added as following:
|
154
|
+
|
155
|
+
Ramaze.options.views.push('templates')
|
156
|
+
|
157
|
+
If the "templates" directory is located a level above the application root you'd
|
158
|
+
do the following instead:
|
159
|
+
|
160
|
+
Ramaze.options.views.push('../templates')
|
161
|
+
|
162
|
+
As mentioned before the root directories are absolute, this means that if you
|
163
|
+
want to add a root directory you have to specify the full path to it:
|
164
|
+
|
165
|
+
Ramaze.options.roots.push('/path/to/another/root/directory')
|
166
|
+
|
167
|
+
Technically you can specify relative paths but this might lead to unexpected
|
168
|
+
behavior so it's not recommended.
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Contributing To Ramaze
|
2
|
+
|
3
|
+
Everybody is welcome to contribute to Ramaze and/or the guide. This guide is
|
4
|
+
meant to be a starting point for those interested in contributing code, writing
|
5
|
+
documentation or advertising Ramaze.
|
6
|
+
|
7
|
+
## Coding Standards
|
8
|
+
|
9
|
+
* 2 spaces per indentation level for Ruby code.
|
10
|
+
* Document your code as much as you can.
|
11
|
+
* Write Bacon specifications for each change you make, especially when adding
|
12
|
+
new features.
|
13
|
+
* Use Markdown for markup, both when documenting source code as well as when
|
14
|
+
writing pages for the guide.
|
15
|
+
* Code should be hard wrapped at 80 characters.
|
16
|
+
* Variables and methods are ``lower_cased`` while constants such as those used
|
17
|
+
to store version numbers use ``SCREAMING_SNAKE_CASE``. An example of this is
|
18
|
+
``Ramaze::VERSION``. Class names and the like are ``PascalCased``.
|
19
|
+
|
20
|
+
## Git Usage and Standards
|
21
|
+
|
22
|
+
Ramaze uses [Git][git] as it's version control system. In order to contribute to
|
23
|
+
Ramaze using Git there are a few things to keep in mind and a few standards to
|
24
|
+
follow.
|
25
|
+
|
26
|
+
### Commit Messages
|
27
|
+
|
28
|
+
Commit messages should be splitted up in two parts, a short description of the
|
29
|
+
commit in 50 characters or less. This short description should be followed by an
|
30
|
+
empty line which in turn is followed by a long description. The short
|
31
|
+
description can be seen as an Email subject while the long description would be
|
32
|
+
the actual Email body. An example of such a commit message is the following:
|
33
|
+
|
34
|
+
Moved some chapters around.
|
35
|
+
|
36
|
+
The chapters on helpers and logging data have been moved to their own file
|
37
|
+
instead of being displayed in the README. Next up is writing the actual
|
38
|
+
documentation on logging data.
|
39
|
+
|
40
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
41
|
+
|
42
|
+
Each commit should only contain a related set of changes. If you're adding a
|
43
|
+
feature but found a bug and fixed it it's easier to keep track of changes if the
|
44
|
+
bug and the feature are divided into two separate commits (if possible). This
|
45
|
+
makes it easier to revert certain changes when needed or pick specific commits
|
46
|
+
from a branch (using ``git cherry-pick``).
|
47
|
+
|
48
|
+
### Branching
|
49
|
+
|
50
|
+
When working on code your changes should be made in a separate branch. The name
|
51
|
+
of this branch should be related to the changes you're making and should be
|
52
|
+
short. For example, if you're working on a chapter for the guide you could name
|
53
|
+
it "documentation". Or maybe you're working on a helper, in that case you could
|
54
|
+
name it "example-helper". In the end it doesn't really matter, just keep the
|
55
|
+
length down a bit. Putting your changes in a separate branch makes it easier to
|
56
|
+
manage them and pull them into the main (master) branch.
|
57
|
+
|
58
|
+
### Pull Requests
|
59
|
+
|
60
|
+
Once you've finished working on your changes you should notify us about the
|
61
|
+
changes. The easiest way to do this is to send a pull request on Github.
|
62
|
+
Information about sending and handling pull requests can be found on the [Pull
|
63
|
+
request][pull requests] page on Github.
|
64
|
+
|
65
|
+
## Writing Documentation
|
66
|
+
|
67
|
+
The documentation (both the guides and the API documentation) use
|
68
|
+
[Markdown][markdown] as its markup engine. All the text should be written in
|
69
|
+
English. Try writing as clear as possible and remove as much spelling/grammar
|
70
|
+
errors as you can find before submitting it to Ramaze.
|
71
|
+
|
72
|
+
Linking to classes and methods can be done by wrapping the namespace/method in
|
73
|
+
``{}``:
|
74
|
+
|
75
|
+
{Ramaze::VERSION}
|
76
|
+
|
77
|
+
If you want to link to an internal file you should use the following syntax
|
78
|
+
instead:
|
79
|
+
|
80
|
+
{file:path/to/file Title}
|
81
|
+
|
82
|
+
Markdown files should be lower cased, spaces should be replaced with
|
83
|
+
underscores. Examples of this are ``ramaze_command.md`` and
|
84
|
+
``special_thanks.md``. Just like the Ruby code the text for the guide should be
|
85
|
+
wrapped at 80 characters.
|
86
|
+
|
87
|
+
## Spreading The Word
|
88
|
+
|
89
|
+
Maybe you're not familiar with Git or perhaps you just don't have the time to
|
90
|
+
contribute code. In both cases there are things you can do to help Ramaze grow.
|
91
|
+
The easiest way is to just tell people about it. Talk to co-workers, give
|
92
|
+
presentations or just suggest it whenever you think it could be useful for
|
93
|
+
people.
|
94
|
+
|
95
|
+
If you like to use the Ramaze logo for a presentation or something else you can
|
96
|
+
freely use the official Ramaze logo displayed below. The logo is licensed under
|
97
|
+
a [Creative Commons][cc license] license. The logo comes in two formats, a SVG
|
98
|
+
file and a PNG of which both are displayed below.
|
99
|
+
|
100
|
+
![Logo SVG][logo svg]
|
101
|
+
![Logo PNG][logo png]
|
102
|
+
|
103
|
+
[git]: http://git-scm.com/
|
104
|
+
[pull requests]: http://help.github.com/send-pull-requests/
|
105
|
+
[markdown]: http://daringfireball.net/projects/markdown/
|
106
|
+
[cc license]: http://creativecommons.org/licenses/by-sa/3.0/
|
107
|
+
[logo svg]: _static/logo.svg "The logo in SVG format"
|
108
|
+
[logo png]: _static/logo.png "The logo in PNG format"
|