ramaze 2011.07.25 → 2011.10.23
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/.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
|