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
data/lib/ramaze/bin/start.rb
CHANGED
@@ -7,11 +7,11 @@ module Ramaze
|
|
7
7
|
# directory this command will look for a Rackup file in that directory,
|
8
8
|
# otherwise it assumes the specified file is a Rackup file.
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# Usage:
|
11
11
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
12
|
+
# ramaze start
|
13
|
+
# ramaze start /home/foobar/projects/blog/config.ru
|
14
|
+
# ramaze start /home/foobar/projects/blog
|
15
15
|
#
|
16
16
|
# @author Yorick Peterse
|
17
17
|
# @since 21-07-2011
|
@@ -199,6 +199,21 @@ Example:
|
|
199
199
|
params.push("#{opt}#{value}")
|
200
200
|
end
|
201
201
|
|
202
|
+
start_server(rackup_path, rackup_config, *params)
|
203
|
+
end
|
204
|
+
|
205
|
+
##
|
206
|
+
# Starts a server baed on the rackup path, rackup configuration file and
|
207
|
+
# additional parameters.
|
208
|
+
#
|
209
|
+
# @author Yorick Peterse
|
210
|
+
# @since 21-10-2011
|
211
|
+
# @param [String] rackup_path The path to the Rackup executable.
|
212
|
+
# @param [String] rackup_config The path to the config.ru file to use.
|
213
|
+
# @param [Array] *params Additional parameters to pass to the ``exec()``
|
214
|
+
# method.
|
215
|
+
#
|
216
|
+
def start_server(rackup_path, rackup_config, *params)
|
202
217
|
exec('ruby', rackup_path, rackup_config, *params)
|
203
218
|
end
|
204
219
|
end # Start
|
data/lib/ramaze/bin/status.rb
CHANGED
@@ -5,10 +5,10 @@ module Ramaze
|
|
5
5
|
# The status command can be used to show the details, such as the PID and
|
6
6
|
# the CPU usage, of a running Ramaze application.
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# Usage:
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
10
|
+
# ramaze status
|
11
|
+
# ramaze status /home/projects/ramaze/ramaze.pid
|
12
12
|
#
|
13
13
|
# @author Yorick Peterse
|
14
14
|
# @author TJ Vanderpoel
|
data/lib/ramaze/bin/stop.rb
CHANGED
@@ -8,10 +8,10 @@ module Ramaze
|
|
8
8
|
# case this command tries to find a file of which the name matches the name
|
9
9
|
# of the current directory.
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# Usage:
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
13
|
+
# ramaze stop
|
14
|
+
# ramaze stop /home/foobar/projects/ramaze/ramaze.pid
|
15
15
|
#
|
16
16
|
# @author Yorick Peterse
|
17
17
|
# @author TJ Vanderpoel
|
data/lib/ramaze/cache.rb
CHANGED
@@ -11,6 +11,7 @@ module Ramaze
|
|
11
11
|
autoload :LocalMemCache, 'ramaze/cache/localmemcache'
|
12
12
|
autoload :MemCache, 'ramaze/cache/memcache'
|
13
13
|
autoload :Sequel, 'ramaze/cache/sequel'
|
14
|
+
autoload :Redis, 'ramaze/cache/redis'
|
14
15
|
|
15
16
|
##
|
16
17
|
# Clears the cache after a file has been reloaded.
|
data/lib/ramaze/cache/lru.rb
CHANGED
@@ -4,9 +4,13 @@
|
|
4
4
|
module Ramaze
|
5
5
|
class Cache
|
6
6
|
##
|
7
|
-
# Cache class that uses Ramaze::LRUHash as a storage engine. This cache
|
8
|
-
# the advantage that unlike Innate::Cache::Memory it does not leak
|
9
|
-
# over time.
|
7
|
+
# Cache class that uses {Ramaze::LRUHash} as a storage engine. This cache
|
8
|
+
# has the advantage that unlike Innate::Cache::Memory it does not leak
|
9
|
+
# memory over time when using the cache for sessions.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# Ramaze::Cache.options.session = Ramaze::Cache::LRU
|
13
|
+
# Ramaze.setup_dependencies
|
10
14
|
#
|
11
15
|
# @author Michael Fellinger
|
12
16
|
# @since 17-07-2009
|
@@ -28,7 +32,7 @@ module Ramaze
|
|
28
32
|
|
29
33
|
##
|
30
34
|
# Prepares the cache by creating a new instance of Ramaze::LRUHash using
|
31
|
-
# the options set in Ramaze::Cache::LRU::OPTIONS.
|
35
|
+
# the options set in {Ramaze::Cache::LRU::OPTIONS}.
|
32
36
|
#
|
33
37
|
# @author Michael Fellinger
|
34
38
|
# @since 17-07-2009
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
Ramaze.setup(:verbose => false) do
|
2
|
+
gem 'dalli'
|
3
|
+
end
|
2
4
|
|
3
5
|
# Kgio gives a nice performance boost but it isn't required
|
4
6
|
begin; require 'kgio'; rescue LoadError => e; end
|
@@ -11,7 +13,7 @@ module Ramaze
|
|
11
13
|
# Cache driver for the Memcache storage engine. Memcache is a key/value
|
12
14
|
# store that's extremely useful for caching data such as views or API
|
13
15
|
# responses. More inforamtion about Memcache can be found on it's website:
|
14
|
-
# http://memcached.org
|
16
|
+
# <http://memcached.org/>.
|
15
17
|
#
|
16
18
|
# Note that this cache driver requires the Dalli gem rather than Memcache
|
17
19
|
# Client. The reason for this is that the Memcache client hasn't been
|
@@ -23,10 +25,27 @@ module Ramaze
|
|
23
25
|
# This driver works similar to Ramaze::Cache::Sequel in that it allows you
|
24
26
|
# to specify instance specific options uisng the using() method:
|
25
27
|
#
|
26
|
-
#
|
28
|
+
# Ramaze::Cache.options.session = Ramaze::Cache::MemCache.using(
|
29
|
+
# :compression => false
|
30
|
+
# )
|
27
31
|
#
|
28
32
|
# All options sent to the using() method will be sent to Dalli.
|
29
33
|
#
|
34
|
+
# @example Using the default options
|
35
|
+
# Ramaze::Cache.options.view = Ramaze::Cache::MemCache
|
36
|
+
# Ramaze.setup_dependencies
|
37
|
+
#
|
38
|
+
# Ramaze::Cache.view.store(:my_view, 'Hello Ramaze')
|
39
|
+
#
|
40
|
+
# @example Using custom options
|
41
|
+
# Ramaze::Cache.options.view = Ramaze::Cache::MemCache.using(
|
42
|
+
# :compression => false,
|
43
|
+
# :servers => ['localhost:11211', 'localhost:112112']
|
44
|
+
# )
|
45
|
+
#
|
46
|
+
# Ramaze.setup_dependencies
|
47
|
+
# Ramaze::Cache.view.store(:my_view, 'Hello Ramaze')
|
48
|
+
#
|
30
49
|
# @author Yorick Peterse
|
31
50
|
# @since 04-05-2011
|
32
51
|
#
|
@@ -49,7 +68,7 @@ module Ramaze
|
|
49
68
|
:servers => ['localhost:11211']
|
50
69
|
}
|
51
70
|
|
52
|
-
# Hash containing all the default options merged with the user specified
|
71
|
+
# Hash containing all the default options merged with the user specified
|
53
72
|
# ones
|
54
73
|
attr_accessor :options
|
55
74
|
|
@@ -72,7 +91,7 @@ module Ramaze
|
|
72
91
|
# :compression => false,
|
73
92
|
# :username => 'ramaze',
|
74
93
|
# :password => 'ramaze123',
|
75
|
-
# :servers => ['othermachine.com:12345']
|
94
|
+
# :servers => ['othermachine.com:12345']
|
76
95
|
# )
|
77
96
|
#
|
78
97
|
# @author Yorick Peterse
|
@@ -86,31 +105,31 @@ module Ramaze
|
|
86
105
|
merged = Ramaze::Cache::MemCache.trait[:default].merge(options)
|
87
106
|
Class.new(self) { @options = merged }
|
88
107
|
end
|
89
|
-
end
|
108
|
+
end # class << self
|
90
109
|
|
91
110
|
##
|
92
111
|
# Creates a new instance of the cache class.
|
93
112
|
#
|
94
113
|
# @author Michael Fellinger
|
95
114
|
# @since 04-05-2011
|
96
|
-
# @param [Hash] options A hash with custom options, see
|
115
|
+
# @param [Hash] options A hash with custom options, see
|
97
116
|
# Ramaze::Cache::MemCache.using for all available options.
|
98
117
|
#
|
99
118
|
def initialize(options = {})
|
100
119
|
self.class.options ||= Ramaze::Cache::MemCache.trait[:default].merge(
|
101
120
|
options
|
102
121
|
)
|
103
|
-
|
122
|
+
|
104
123
|
@options = options.merge(self.class.options)
|
105
124
|
end
|
106
125
|
|
107
126
|
##
|
108
|
-
# Prepares the cache by creating the namespace and an instance of a Dalli
|
127
|
+
# Prepares the cache by creating the namespace and an instance of a Dalli
|
109
128
|
# client.
|
110
129
|
#
|
111
130
|
# @author Yorick Peterse
|
112
131
|
# @since 04-05-2011
|
113
|
-
# @param [String] hostname The hostname of the machine running the
|
132
|
+
# @param [String] hostname The hostname of the machine running the
|
114
133
|
# application.
|
115
134
|
# @param [String] username The name of the user executing the process
|
116
135
|
# @param [String] appname Unique identifier for the application.
|
@@ -125,7 +144,7 @@ module Ramaze
|
|
125
144
|
options[:namespace] = [
|
126
145
|
hostname, username, appname, cachename
|
127
146
|
].compact.join('-')
|
128
|
-
|
147
|
+
|
129
148
|
@client = ::Dalli::Client.new(options[:servers], options)
|
130
149
|
end
|
131
150
|
|
@@ -153,7 +172,7 @@ module Ramaze
|
|
153
172
|
end
|
154
173
|
|
155
174
|
##
|
156
|
-
# Fetches the specified key from the cache. It the value was nil the
|
175
|
+
# Fetches the specified key from the cache. It the value was nil the
|
157
176
|
# default value will be returned instead.
|
158
177
|
#
|
159
178
|
# @author Yorick Peterse
|
@@ -182,7 +201,7 @@ module Ramaze
|
|
182
201
|
# @param [String] key The name of the key to store.
|
183
202
|
# @param [Mixed] value The value to store in Memcache.
|
184
203
|
# @param [Fixnum] ttl The Time To Live to use for the current key.
|
185
|
-
# @param [Hash] options A hash containing options specific for the
|
204
|
+
# @param [Hash] options A hash containing options specific for the
|
186
205
|
# specified key.
|
187
206
|
# @return [Mixed]
|
188
207
|
#
|
@@ -0,0 +1,164 @@
|
|
1
|
+
Ramaze.setup(:verbose => false) do
|
2
|
+
gem 'redis'
|
3
|
+
end
|
4
|
+
|
5
|
+
module Ramaze
|
6
|
+
class Cache
|
7
|
+
##
|
8
|
+
# The Redis cache is a cache driver for Redis (http://redis.io/). Redis is a
|
9
|
+
# key/value store similar to Memcached but with the ability to flush data to
|
10
|
+
# a file among various other features.
|
11
|
+
#
|
12
|
+
# The usage of this cache is very similar to the Memcache driver. You load
|
13
|
+
# it by simply specifying the class:
|
14
|
+
#
|
15
|
+
# Ramaze::Cache.options.session = Ramaze::Cache::Redis
|
16
|
+
#
|
17
|
+
# If you want to specify custom options you can do so by calling {.using} on
|
18
|
+
# the class:
|
19
|
+
#
|
20
|
+
# Ramaze::Cache.options.session = Ramaze::Cache::Redis.using(...)
|
21
|
+
#
|
22
|
+
# @example Using a custom Redis host
|
23
|
+
# Ramaze::Cache.options.names.push(:redis)
|
24
|
+
# Ramaze::Cache.options.redis = Ramaze::Cache::Redis.using(
|
25
|
+
# :host => '123.124.125.126',
|
26
|
+
# :port => 6478
|
27
|
+
# )
|
28
|
+
#
|
29
|
+
# @author Michael Fellinger
|
30
|
+
# @since 09-10-2011
|
31
|
+
#
|
32
|
+
class Redis
|
33
|
+
include Cache::API
|
34
|
+
include Innate::Traited
|
35
|
+
|
36
|
+
# Hash containing all the default options to use when no custom ones are
|
37
|
+
# specified in .using().
|
38
|
+
trait :default => {
|
39
|
+
:expires_in => 604800,
|
40
|
+
:host => 'localhost',
|
41
|
+
:port => 6379
|
42
|
+
}
|
43
|
+
|
44
|
+
# Hash containing all the default options merged with the user specified
|
45
|
+
# ones.
|
46
|
+
attr_accessor :options
|
47
|
+
|
48
|
+
class << self
|
49
|
+
attr_accessor :options
|
50
|
+
|
51
|
+
##
|
52
|
+
# Creates a new instance of the cache class and merges the default
|
53
|
+
# options with the custom ones.
|
54
|
+
#
|
55
|
+
# Using this method you can specify custom options for various caches.
|
56
|
+
# For example, the Redis cache for your sessions could be located at
|
57
|
+
# server #1 while a custom cache is located on server #2.
|
58
|
+
#
|
59
|
+
# @author Yorick Peterse
|
60
|
+
# @since 09-10-2011
|
61
|
+
# @param [Hash] options A hash containing custom options.
|
62
|
+
# @option options [Fixnum] :expires_in The default time after which a
|
63
|
+
# key should expire.
|
64
|
+
# @option options [String] :host The hostname of the machine on which
|
65
|
+
# Redis is running.
|
66
|
+
# @option options [Fixnum] :port The port number to connect to.
|
67
|
+
#
|
68
|
+
def using(options = {})
|
69
|
+
merged = Ramaze::Cache::Redis.trait[:default].merge(options)
|
70
|
+
Class.new(self) { @options = merged }
|
71
|
+
end
|
72
|
+
end # class << self
|
73
|
+
|
74
|
+
##
|
75
|
+
# Creates a new instance of the cache and merges the options if they
|
76
|
+
# haven't already been set.
|
77
|
+
#
|
78
|
+
# @author Michael Fellinger
|
79
|
+
# @param [Hash] options A hash with custom options. See
|
80
|
+
# Ramaze::Cache::Redis.using() and the trait :default for more
|
81
|
+
# information.
|
82
|
+
#
|
83
|
+
def initialize(options = {})
|
84
|
+
self.class.options ||= Ramaze::Cache::Redis.trait[:default].merge(
|
85
|
+
options
|
86
|
+
)
|
87
|
+
|
88
|
+
@options = options.merge(self.class.options)
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# Prepares the cache by setting up the namespace and loading Redis.
|
93
|
+
#
|
94
|
+
# @author Michael Fellinger
|
95
|
+
# @since 09-10-2011
|
96
|
+
# @param [String] hostname The host of the machine that's running the
|
97
|
+
# Ramaze application.
|
98
|
+
# @param [String] username The name of the user that's running the
|
99
|
+
# application.
|
100
|
+
# @param [String] appname The name of the application (:pristine by
|
101
|
+
# default).
|
102
|
+
# @param [String] cachename The namespace to use for this cache instance.
|
103
|
+
#
|
104
|
+
def cache_setup(hostname, username, appname, cachename)
|
105
|
+
options[:namespace] = [
|
106
|
+
hostname, username, appname, cachename
|
107
|
+
].compact.join('-')
|
108
|
+
|
109
|
+
@client = ::Redis.new(options)
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Clears the entire cache.
|
114
|
+
#
|
115
|
+
# @author Michael Fellinger
|
116
|
+
# @since 09-10-2011
|
117
|
+
#
|
118
|
+
def cache_clear
|
119
|
+
@client.flushall
|
120
|
+
end
|
121
|
+
|
122
|
+
##
|
123
|
+
# Removes a number of keys from the cache.
|
124
|
+
#
|
125
|
+
# @author Michael Fellinger
|
126
|
+
# @param [Array] *keys An array of key names to remove.
|
127
|
+
#
|
128
|
+
def cache_delete(*keys)
|
129
|
+
@client.del(*keys)
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# Retrieves the value of the given key. If no value could be retrieved the
|
134
|
+
# default value (set to nil by default) will be returned instead.
|
135
|
+
#
|
136
|
+
# @author Michael Fellinger
|
137
|
+
# @param [String] key The name of the key to retrieve.
|
138
|
+
# @param [Mixed] default The default value.
|
139
|
+
# @return [Mixed]
|
140
|
+
#
|
141
|
+
def cache_fetch(key, default = nil)
|
142
|
+
value = @client.get(key)
|
143
|
+
value.nil? ? default : value
|
144
|
+
end
|
145
|
+
|
146
|
+
##
|
147
|
+
# Stores a new value under the given key.
|
148
|
+
#
|
149
|
+
# @author Michael Fellinger
|
150
|
+
# @param [String] key The name of the key to store.
|
151
|
+
# @param [Mixed] value The value of the key.
|
152
|
+
# @param [Fixnum] ttl The Time To Live of the key.
|
153
|
+
# @param [Hash] options A hash containing key specific options.
|
154
|
+
# @option options :expires_in The time after which the key should expire.
|
155
|
+
#
|
156
|
+
def cache_store(key, value, ttl = nil, options = {})
|
157
|
+
ttl = options[:ttl] || @options[:expires_in]
|
158
|
+
@client.setex(key, ttl, value)
|
159
|
+
|
160
|
+
return value
|
161
|
+
end
|
162
|
+
end # Redis
|
163
|
+
end # Cache
|
164
|
+
end # Ramaze
|
data/lib/ramaze/cache/sequel.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
Ramaze.setup(:verbose => false) do
|
2
|
+
gem 'sequel'
|
3
|
+
end
|
2
4
|
|
3
5
|
module Ramaze
|
4
6
|
class Cache
|
@@ -8,15 +10,15 @@ module Ramaze
|
|
8
10
|
# databases are MySQL, SQLite3 and so on. In order to use this cache you'd
|
9
11
|
# have to do the following:
|
10
12
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
13
|
+
# Ramaze::Cache.options.view = Ramaze::Cache::Sequel.using(
|
14
|
+
# :connection => Sequel.mysql(
|
15
|
+
# :host => 'localhost',
|
16
|
+
# :user => 'user',
|
17
|
+
# :password => 'password',
|
18
|
+
# :database => 'blog'
|
19
|
+
# ),
|
20
|
+
# :table => :blog_sessions
|
21
|
+
# )
|
20
22
|
#
|
21
23
|
# If you already have an existing connection you can just pass the object to
|
22
24
|
# the :connection option instead of creating a new connection manually.
|
@@ -24,6 +26,18 @@ module Ramaze
|
|
24
26
|
# Massive thanks to Lars Olsson for patching the original Sequel cache so
|
25
27
|
# that it supports multiple connections and other useful features.
|
26
28
|
#
|
29
|
+
# @example Setting a custom database connection
|
30
|
+
# Ramaze::Cache.options.names.push(:sequel)
|
31
|
+
# Ramaze::Cache.options.sequel = Ramaze::Cache::Sequel.using(
|
32
|
+
# :connection => Sequel.connect(
|
33
|
+
# :adapter => 'mysql2',
|
34
|
+
# :host => 'localhost',
|
35
|
+
# :username => 'cache',
|
36
|
+
# :password => 'cache123',
|
37
|
+
# :database => 'ramaze_cache'
|
38
|
+
# )
|
39
|
+
# )
|
40
|
+
#
|
27
41
|
# @author Lars Olsson
|
28
42
|
# @since 18-04-2011
|
29
43
|
#
|
@@ -46,7 +60,7 @@ module Ramaze
|
|
46
60
|
:ttl => nil
|
47
61
|
}
|
48
62
|
|
49
|
-
# Hash containing all the default options merged with the user specified
|
63
|
+
# Hash containing all the default options merged with the user specified
|
50
64
|
# ones
|
51
65
|
attr_accessor :options
|
52
66
|
|
@@ -71,9 +85,9 @@ module Ramaze
|
|
71
85
|
# #
|
72
86
|
# Ramaze.options.cache.session = Ramaze::Cache::Sequel.using(
|
73
87
|
# :connection => Sequel.mysql(
|
74
|
-
# :host =>'localhost',
|
88
|
+
# :host =>'localhost',
|
75
89
|
# :user =>'user',
|
76
|
-
# :password =>'password',
|
90
|
+
# :password =>'password',
|
77
91
|
# :database =>'blog'
|
78
92
|
# ),
|
79
93
|
# :table => :blog_sessions
|
@@ -117,21 +131,21 @@ module Ramaze
|
|
117
131
|
#
|
118
132
|
# @author Michael Fellinger
|
119
133
|
# @since 04-05-2011
|
120
|
-
# @param [Hash] options A hash with custom options, see
|
134
|
+
# @param [Hash] options A hash with custom options, see
|
121
135
|
# Ramaze::Cache::Sequel.using for all available options.
|
122
136
|
#
|
123
137
|
def initialize(options = {})
|
124
138
|
self.class.options ||= Ramaze::Cache::Sequel.trait[:default].merge(
|
125
139
|
options
|
126
140
|
)
|
127
|
-
|
141
|
+
|
128
142
|
@options = options.merge(self.class.options)
|
129
143
|
end
|
130
144
|
|
131
145
|
##
|
132
146
|
# Executed after #initialize and before any other method.
|
133
147
|
#
|
134
|
-
# Some parameters identifying the current process will be passed so caches
|
148
|
+
# Some parameters identifying the current process will be passed so caches
|
135
149
|
# that act in one global name-space can use them as a prefix.
|
136
150
|
#
|
137
151
|
# @author Lars Olsson
|
@@ -159,7 +173,7 @@ module Ramaze
|
|
159
173
|
end
|
160
174
|
|
161
175
|
##
|
162
|
-
# Remove all key/value pairs from the cache. Should behave as if #delete
|
176
|
+
# Remove all key/value pairs from the cache. Should behave as if #delete
|
163
177
|
# had been called with all +keys+ as argument.
|
164
178
|
#
|
165
179
|
# @author Lars Olsson
|
@@ -173,7 +187,7 @@ module Ramaze
|
|
173
187
|
# Remove the corresponding key/value pair for each key passed. If removing
|
174
188
|
# is not an option it should set the corresponding value to nil.
|
175
189
|
#
|
176
|
-
# If only one key was deleted, answer with the corresponding value. If
|
190
|
+
# If only one key was deleted, answer with the corresponding value. If
|
177
191
|
# multiple keys were deleted, answer with an Array containing the values.
|
178
192
|
#
|
179
193
|
# @author Lars Olsson
|
@@ -207,12 +221,12 @@ module Ramaze
|
|
207
221
|
|
208
222
|
@dataset.filter(:key => nkeys).delete
|
209
223
|
end
|
210
|
-
|
224
|
+
|
211
225
|
return result
|
212
226
|
end
|
213
227
|
|
214
228
|
##
|
215
|
-
# Answer with the value associated with the +key+, +nil+ if not found or
|
229
|
+
# Answer with the value associated with the +key+, +nil+ if not found or
|
216
230
|
# expired.
|
217
231
|
#
|
218
232
|
# @author Lars Olsson
|
@@ -251,7 +265,7 @@ module Ramaze
|
|
251
265
|
# @param [Object] key The value is stored with this key
|
252
266
|
# @param [Object] value The key points to this value
|
253
267
|
# @param [Hash] options for now, only :ttl => Fixnum is used.
|
254
|
-
# @option options [Fixnum] :ttl The time in seconds after which the cache
|
268
|
+
# @option options [Fixnum] :ttl The time in seconds after which the cache
|
255
269
|
# item should be expired.
|
256
270
|
#
|
257
271
|
def cache_store(key, value, options = {})
|
@@ -263,9 +277,9 @@ module Ramaze
|
|
263
277
|
else
|
264
278
|
ttl = Ramaze::Cache::Sequel.options[:ttl]
|
265
279
|
end
|
266
|
-
|
280
|
+
|
267
281
|
expires = Time.now + ttl if ttl
|
268
|
-
|
282
|
+
|
269
283
|
# The row already exists, update it.
|
270
284
|
if @dataset.filter(:key => nkey).count == 1
|
271
285
|
serialized_value = serialize(value)
|
@@ -284,9 +298,10 @@ module Ramaze
|
|
284
298
|
end
|
285
299
|
end
|
286
300
|
|
287
|
-
# Try to deserialize the value. If this fails we'll return a different
|
301
|
+
# Try to deserialize the value. If this fails we'll return a different
|
288
302
|
# value
|
289
|
-
deserialized = deserialize(@dataset.select(:value)
|
303
|
+
deserialized = deserialize(@dataset.select(:value) \
|
304
|
+
.filter(:key => nkey) \
|
290
305
|
.limit(1).first[:value])
|
291
306
|
|
292
307
|
if deserialized
|
@@ -295,7 +310,7 @@ module Ramaze
|
|
295
310
|
return value
|
296
311
|
end
|
297
312
|
end
|
298
|
-
|
313
|
+
|
299
314
|
##
|
300
315
|
# Prefixes the given key with current namespace.
|
301
316
|
#
|
@@ -307,7 +322,7 @@ module Ramaze
|
|
307
322
|
def namespaced(key)
|
308
323
|
return [@namespace, key].join(':')
|
309
324
|
end
|
310
|
-
|
325
|
+
|
311
326
|
##
|
312
327
|
# Deserialize method, adapted from Sequels serialize plugin
|
313
328
|
# This method will try to deserialize a value using Marshal.load
|
@@ -329,7 +344,7 @@ module Ramaze
|
|
329
344
|
Ramaze::Log::warn("Failed to deserialize #{value.inspect}")
|
330
345
|
end
|
331
346
|
|
332
|
-
return nil
|
347
|
+
return nil
|
333
348
|
end
|
334
349
|
end
|
335
350
|
end
|