ramaze 2011.01.30 → 2011.07.25

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.
Files changed (229) hide show
  1. data/.gitignore +2 -1
  2. data/.mailmap +2 -0
  3. data/.rvmrc +1 -0
  4. data/README.md +119 -197
  5. data/Rakefile +14 -97
  6. data/bin/ramaze +6 -14
  7. data/doc/AUTHORS +8 -4
  8. data/doc/CHANGELOG +3784 -3339
  9. data/examples/app/chat/start.rb +2 -2
  10. data/lib/proto/app.rb +2 -3
  11. data/lib/proto/config.ru +4 -5
  12. data/lib/proto/controller/init.rb +11 -4
  13. data/lib/proto/controller/main.rb +12 -7
  14. data/lib/proto/layout/default.xhtml +56 -23
  15. data/lib/proto/model/init.rb +3 -1
  16. data/lib/proto/public/css/grid.css +107 -0
  17. data/lib/proto/public/css/layout.css +81 -0
  18. data/lib/proto/public/css/reset.css +123 -0
  19. data/lib/proto/public/css/text.css +109 -0
  20. data/lib/proto/public/images/bg.png +0 -0
  21. data/lib/proto/spec/main.rb +2 -2
  22. data/lib/proto/start.rb +11 -1
  23. data/lib/proto/view/index.xhtml +27 -23
  24. data/lib/ramaze.rb +0 -1
  25. data/lib/ramaze/app.rb +85 -12
  26. data/lib/ramaze/app_graph.rb +107 -0
  27. data/lib/ramaze/bin/console.rb +87 -0
  28. data/lib/ramaze/bin/create.rb +94 -0
  29. data/lib/ramaze/bin/helper.rb +107 -0
  30. data/lib/ramaze/bin/restart.rb +95 -0
  31. data/lib/ramaze/bin/runner.rb +141 -0
  32. data/lib/ramaze/bin/start.rb +206 -0
  33. data/lib/ramaze/bin/status.rb +152 -0
  34. data/lib/ramaze/bin/stop.rb +112 -0
  35. data/lib/ramaze/cache.rb +9 -4
  36. data/lib/ramaze/cache/localmemcache.rb +10 -13
  37. data/lib/ramaze/cache/lru.rb +49 -7
  38. data/lib/ramaze/cache/memcache.rb +170 -92
  39. data/lib/ramaze/cache/sequel.rb +301 -118
  40. data/lib/ramaze/controller.rb +108 -9
  41. data/lib/ramaze/controller/default.rb +15 -2
  42. data/lib/ramaze/current.rb +14 -2
  43. data/lib/ramaze/dependencies.rb +46 -0
  44. data/lib/ramaze/files.rb +38 -3
  45. data/lib/ramaze/gestalt.rb +12 -12
  46. data/lib/ramaze/helper.rb +0 -2
  47. data/lib/ramaze/helper/auth.rb +30 -23
  48. data/lib/ramaze/helper/blue_form.rb +175 -126
  49. data/lib/ramaze/helper/csrf.rb +76 -91
  50. data/lib/ramaze/helper/email.rb +105 -0
  51. data/lib/ramaze/helper/erector.rb +16 -15
  52. data/lib/ramaze/helper/gestalt.rb +2 -2
  53. data/lib/ramaze/helper/layout.rb +89 -73
  54. data/lib/ramaze/helper/link.rb +7 -6
  55. data/lib/ramaze/helper/localize.rb +6 -5
  56. data/lib/ramaze/helper/markaby.rb +25 -23
  57. data/lib/ramaze/helper/maruku.rb +3 -3
  58. data/lib/ramaze/helper/paginate.rb +19 -27
  59. data/lib/ramaze/helper/remarkably.rb +3 -3
  60. data/lib/ramaze/helper/request_accessor.rb +3 -3
  61. data/lib/ramaze/helper/send_file.rb +12 -8
  62. data/lib/ramaze/helper/simple_captcha.rb +5 -6
  63. data/lib/ramaze/helper/stack.rb +7 -4
  64. data/lib/ramaze/helper/tagz.rb +10 -11
  65. data/lib/ramaze/helper/thread.rb +19 -16
  66. data/lib/ramaze/helper/ultraviolet.rb +7 -4
  67. data/lib/ramaze/helper/user.rb +40 -21
  68. data/lib/ramaze/helper/xhtml.rb +29 -20
  69. data/lib/ramaze/log.rb +3 -11
  70. data/lib/ramaze/log/analogger.rb +5 -4
  71. data/lib/ramaze/log/growl.rb +9 -7
  72. data/lib/ramaze/log/hub.rb +3 -5
  73. data/lib/ramaze/log/informer.rb +15 -12
  74. data/lib/ramaze/log/knotify.rb +3 -5
  75. data/lib/ramaze/log/logger.rb +3 -5
  76. data/lib/ramaze/log/logging.rb +6 -8
  77. data/lib/ramaze/log/rotatinginformer.rb +27 -17
  78. data/lib/ramaze/log/syslog.rb +7 -7
  79. data/lib/ramaze/log/xosd.rb +3 -5
  80. data/lib/ramaze/middleware_compiler.rb +27 -4
  81. data/lib/ramaze/reloader.rb +50 -12
  82. data/lib/ramaze/reloader/watch_inotify.rb +4 -5
  83. data/lib/ramaze/reloader/watch_stat.rb +3 -3
  84. data/lib/ramaze/request.rb +18 -8
  85. data/lib/ramaze/response.rb +38 -7
  86. data/lib/ramaze/rest.rb +36 -0
  87. data/lib/ramaze/setup.rb +101 -31
  88. data/lib/ramaze/spec.rb +1 -1
  89. data/lib/ramaze/spec/bacon.rb +6 -3
  90. data/lib/ramaze/spec/helper/bacon.rb +0 -1
  91. data/lib/ramaze/version.rb +1 -1
  92. data/lib/ramaze/view.rb +2 -11
  93. data/lib/ramaze/view/erector.rb +46 -31
  94. data/lib/ramaze/view/erubis.rb +7 -3
  95. data/lib/ramaze/view/ezamar.rb +7 -3
  96. data/lib/ramaze/view/gestalt.rb +9 -3
  97. data/lib/ramaze/view/haml.rb +7 -3
  98. data/lib/ramaze/view/liquid.rb +3 -3
  99. data/lib/ramaze/view/lokar.rb +7 -3
  100. data/lib/ramaze/view/mustache.rb +11 -5
  101. data/lib/ramaze/view/nagoro.rb +3 -3
  102. data/lib/ramaze/view/sass.rb +1 -1
  103. data/lib/ramaze/view/slippers.rb +40 -13
  104. data/lib/ramaze/view/tagz.rb +9 -5
  105. data/ramaze.gemspec +23 -128
  106. data/spec/helper.rb +5 -0
  107. data/spec/ramaze/bin/app/config.ru +11 -0
  108. data/spec/ramaze/bin/create.rb +28 -0
  109. data/spec/ramaze/bin/runner.rb +30 -0
  110. data/spec/ramaze/bin/start.rb +38 -0
  111. data/spec/ramaze/cache/memcache.rb +10 -3
  112. data/spec/ramaze/cache/sequel.rb +7 -0
  113. data/spec/ramaze/controller/provide_inheritance.rb +0 -10
  114. data/spec/ramaze/dispatcher/file.rb +19 -15
  115. data/spec/ramaze/helper/auth.rb +10 -9
  116. data/spec/ramaze/helper/blue_form.rb +121 -68
  117. data/spec/ramaze/helper/email.rb +69 -0
  118. data/spec/ramaze/helper/layout.rb +12 -15
  119. data/spec/ramaze/helper/layout/alternative.xhtml +5 -0
  120. data/spec/ramaze/helper/user.rb +2 -0
  121. data/spec/ramaze/log/growl.rb +14 -1
  122. data/spec/{contrib → ramaze}/rest.rb +1 -1
  123. data/spec/ramaze/session/memcache.rb +2 -2
  124. data/spec/ramaze/view/sass.rb +1 -1
  125. data/tasks/bacon.rake +3 -3
  126. data/tasks/gem.rake +17 -18
  127. data/tasks/rcov.rake +2 -3
  128. data/tasks/release.rake +8 -65
  129. data/tasks/setup.rake +10 -8
  130. data/tasks/todo.rake +9 -5
  131. data/tasks/yard.rake +3 -2
  132. metadata +105 -397
  133. data/MANIFEST +0 -532
  134. data/TODO.md +0 -19
  135. data/benchmark/bench_templates/bench.rb +0 -67
  136. data/benchmark/bench_templates/view/large.erb +0 -79
  137. data/benchmark/bench_templates/view/large.haml +0 -41
  138. data/benchmark/bench_templates/view/large.lok +0 -79
  139. data/benchmark/bench_templates/view/large.xhtml +0 -79
  140. data/benchmark/bench_templates/view/small.erb +0 -21
  141. data/benchmark/bench_templates/view/small.haml +0 -12
  142. data/benchmark/bench_templates/view/small.lok +0 -21
  143. data/benchmark/bench_templates/view/small.xhtml +0 -21
  144. data/benchmark/results.txt +0 -131
  145. data/benchmark/run.rb +0 -355
  146. data/benchmark/suite/minimal.rb +0 -11
  147. data/benchmark/suite/no_informer.rb +0 -7
  148. data/benchmark/suite/no_sessions.rb +0 -9
  149. data/benchmark/suite/no_template.rb +0 -7
  150. data/benchmark/suite/simple.rb +0 -5
  151. data/benchmark/suite/template_erubis.rb +0 -8
  152. data/benchmark/suite/template_etanni.rb +0 -8
  153. data/benchmark/suite/template_ezamar.rb +0 -8
  154. data/benchmark/suite/template_haml.rb +0 -13
  155. data/benchmark/suite/template_liquid.rb +0 -11
  156. data/benchmark/suite/template_markaby.rb +0 -9
  157. data/benchmark/suite/template_nagoro.rb +0 -8
  158. data/benchmark/suite/template_redcloth.rb +0 -13
  159. data/benchmark/suite/template_tenjin.rb +0 -8
  160. data/benchmark/test.rb +0 -35
  161. data/doc/FAQ +0 -92
  162. data/doc/INSTALL +0 -92
  163. data/doc/TODO +0 -29
  164. data/doc/meta/announcement.txt +0 -119
  165. data/doc/meta/configuration.txt +0 -163
  166. data/doc/meta/internals.txt +0 -278
  167. data/doc/meta/users.kml +0 -64
  168. data/doc/tutorial/todolist.html +0 -1512
  169. data/doc/tutorial/todolist.txt +0 -920
  170. data/examples/app/sourceview/public/coderay.css +0 -104
  171. data/examples/app/sourceview/public/images/file.gif +0 -0
  172. data/examples/app/sourceview/public/images/folder.gif +0 -0
  173. data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
  174. data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
  175. data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
  176. data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
  177. data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
  178. data/examples/app/sourceview/public/images/tv-item.gif +0 -0
  179. data/examples/app/sourceview/public/jquery.js +0 -11
  180. data/examples/app/sourceview/public/jquery.treeview.css +0 -48
  181. data/examples/app/sourceview/public/jquery.treeview.js +0 -223
  182. data/examples/app/sourceview/public/sourceview.js +0 -52
  183. data/examples/app/sourceview/start.rb +0 -79
  184. data/examples/app/sourceview/view/index.haml +0 -59
  185. data/examples/helpers/httpdigest.rb +0 -107
  186. data/lib/proto/public/css/screen.css +0 -30
  187. data/lib/proto/public/js/jquery.js +0 -7179
  188. data/lib/ramaze/contrib/addressable_route.rb +0 -56
  189. data/lib/ramaze/contrib/app_graph.rb +0 -64
  190. data/lib/ramaze/contrib/email.rb +0 -88
  191. data/lib/ramaze/contrib/facebook.rb +0 -23
  192. data/lib/ramaze/contrib/facebook/facebook.rb +0 -171
  193. data/lib/ramaze/contrib/gettext.rb +0 -113
  194. data/lib/ramaze/contrib/gettext/mo.rb +0 -155
  195. data/lib/ramaze/contrib/gettext/parser.rb +0 -46
  196. data/lib/ramaze/contrib/gettext/po.rb +0 -109
  197. data/lib/ramaze/contrib/gzip_filter.rb +0 -1
  198. data/lib/ramaze/contrib/maruku_uv.rb +0 -59
  199. data/lib/ramaze/contrib/profiling.rb +0 -36
  200. data/lib/ramaze/contrib/rest.rb +0 -23
  201. data/lib/ramaze/contrib/sequel/create_join.rb +0 -26
  202. data/lib/ramaze/contrib/sequel/form_field.rb +0 -129
  203. data/lib/ramaze/contrib/sequel/image.rb +0 -196
  204. data/lib/ramaze/contrib/sequel/relation.rb +0 -98
  205. data/lib/ramaze/helper/httpdigest.rb +0 -96
  206. data/lib/ramaze/tool/bin.rb +0 -340
  207. data/lib/ramaze/tool/create.rb +0 -48
  208. data/lib/ramaze/tool/project_creator.rb +0 -120
  209. data/lib/ramaze/view/less.rb +0 -12
  210. data/lib/ramaze/view/maruku.rb +0 -15
  211. data/lib/ramaze/view/redcloth.rb +0 -21
  212. data/spec/contrib/addressable_route.rb +0 -30
  213. data/spec/examples/helpers/httpdigest.rb +0 -64
  214. data/spec/examples/templates/template_redcloth.rb +0 -13
  215. data/spec/ramaze/bin/ramaze.rb +0 -96
  216. data/spec/ramaze/helper/httpdigest.rb +0 -176
  217. data/spec/ramaze/view/less.rb +0 -60
  218. data/spec/ramaze/view/less/file.css.less +0 -8
  219. data/spec/ramaze/view/redcloth.rb +0 -66
  220. data/spec/ramaze/view/redcloth/external.redcloth +0 -8
  221. data/tasks/copyright.rake +0 -21
  222. data/tasks/gem_setup.rake +0 -112
  223. data/tasks/git.rake +0 -46
  224. data/tasks/grancher.rake +0 -12
  225. data/tasks/jquery.rake +0 -15
  226. data/tasks/manifest.rake +0 -4
  227. data/tasks/metric_changes.rake +0 -24
  228. data/tasks/reversion.rake +0 -8
  229. data/tasks/traits.rake +0 -21
data/lib/ramaze/cache.rb CHANGED
@@ -1,21 +1,26 @@
1
1
  # Copyright (c) 2009 Michael Fellinger m.fellinger@gmail.com
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
-
4
3
  require 'innate/cache'
5
4
 
6
5
  module Ramaze
7
6
  Cache = Innate::Cache
8
7
 
9
- # TODO: Describe what this class does and how it can be used.
8
+ #:nodoc:
10
9
  class Cache
11
10
  autoload :LRU, 'ramaze/cache/lru'
12
11
  autoload :LocalMemCache, 'ramaze/cache/localmemcache'
13
12
  autoload :MemCache, 'ramaze/cache/memcache'
14
13
  autoload :Sequel, 'ramaze/cache/sequel'
15
14
 
15
+ ##
16
+ # Clears the cache after a file has been reloaded.
17
+ #
18
+ # @author Michael Fellinger
19
+ # @since 17-07-2009
20
+ #
16
21
  def self.clear_after_reload
17
22
  action.clear if respond_to?(:action)
18
23
  action_value.clear if respond_to?(:action_value)
19
24
  end
20
- end
21
- end
25
+ end # Cache
26
+ end # Ramaze
@@ -5,7 +5,6 @@ require 'localmemcache'
5
5
 
6
6
  module Ramaze
7
7
  class Cache
8
-
9
8
  # Cache based on the localmemcache library which utilizes mmap to share
10
9
  # strings in memory between ruby instances.
11
10
  class LocalMemCache
@@ -19,14 +18,12 @@ module Ramaze
19
18
 
20
19
  # Connect to localmemcache
21
20
  def cache_setup(host, user, app, name)
22
- @namespace = [host, user, app, name].compact.join('-')
23
-
24
- options = {:namespace => @namespace}.merge(OPTIONS)
21
+ @namespace = [host, user, app, name].compact.join('-')
22
+ options = {:namespace => @namespace}.merge(OPTIONS)
25
23
 
26
- @serialize = options.delete(:serialize)
24
+ @serialize = options.delete(:serialize)
27
25
  @serializer = options.delete(:serializer)
28
-
29
- @store = ::LocalMemCache.new(options)
26
+ @store = ::LocalMemCache.new(options)
30
27
  end
31
28
 
32
29
  # Wipe out _all_ data in localmemcached, use with care.
@@ -35,22 +32,22 @@ module Ramaze
35
32
  end
36
33
 
37
34
  def cache_delete(*args)
38
- super{|key| @store.delete(key.to_s); nil }
35
+ super { |key| @store.delete(key.to_s); nil }
39
36
  end
40
37
 
41
38
  # NOTE:
42
39
  # * We have no way of knowing whether the value really is nil, we
43
40
  # assume you wouldn't cache nil and return the default instead.
44
41
  def cache_fetch(*args)
45
- super{|key|
42
+ super { |key|
46
43
  value = @store[key.to_s]
47
44
  @serializer.load(value) if value
48
45
  }
49
46
  end
50
47
 
51
48
  def cache_store(*args)
52
- super{|key, value| @store[key.to_s] = @serializer.dump(value) }
49
+ super { |key, value| @store[key.to_s] = @serializer.dump(value) }
53
50
  end
54
- end
55
- end
56
- end
51
+ end # LocalMemCache
52
+ end # Cache
53
+ end # Ramaze
@@ -3,9 +3,18 @@
3
3
 
4
4
  module Ramaze
5
5
  class Cache
6
+ ##
7
+ # Cache class that uses Ramaze::LRUHash as a storage engine. This cache has
8
+ # the advantage that unlike Innate::Cache::Memory it does not leak memory
9
+ # over time.
10
+ #
11
+ # @author Michael Fellinger
12
+ # @since 17-07-2009
13
+ #
6
14
  class LRU
7
15
  include Cache::API
8
16
 
17
+ # Hash containing all the options for the cache.
9
18
  OPTIONS = {
10
19
  # expiration in seconds
11
20
  :expiration => nil,
@@ -17,26 +26,59 @@ module Ramaze
17
26
  :max_value => nil,
18
27
  }
19
28
 
20
- # Connect to localmemcache
29
+ ##
30
+ # Prepares the cache by creating a new instance of Ramaze::LRUHash using
31
+ # the options set in Ramaze::Cache::LRU::OPTIONS.
32
+ #
33
+ # @author Michael Fellinger
34
+ # @since 17-07-2009
35
+ #
21
36
  def cache_setup(host, user, app, name)
22
37
  @store = Ramaze::LRUHash.new(OPTIONS)
23
38
  end
24
39
 
40
+ ##
41
+ # Clears the entire cache.
42
+ #
43
+ # @author Michael Fellinger
44
+ # @since 17-07-2009
45
+ #
25
46
  def cache_clear
26
47
  @store.clear
27
48
  end
28
49
 
50
+ ##
51
+ # Stores a set of data in the cache.
52
+ #
53
+ # @author Michael Fellinger
54
+ # @since 17-07-2009
55
+ # @see Innate::Cache::API#cache_store
56
+ #
29
57
  def cache_store(*args)
30
- super{|key, value| @store[key] = value }
58
+ super { |key, value| @store[key] = value }
31
59
  end
32
60
 
61
+ ##
62
+ # Retrieves a set of data from the cache.
63
+ #
64
+ # @author Michael Fellinger
65
+ # @since 17-07-2009
66
+ # @see Innate::Cache::API#cache_fetch
67
+ #
33
68
  def cache_fetch(*args)
34
- super{|key| @store[key] }
69
+ super { |key| @store[key] }
35
70
  end
36
71
 
72
+ ##
73
+ # Deletes a set of data from the cache
74
+ #
75
+ # @author Michael Fellinger
76
+ # @since 17-07-2009
77
+ # @see Innate::Cache::API#cache_delete
78
+ #
37
79
  def cache_delete(*args)
38
- super{|key| @store.delete(key) }
80
+ super { |key| @store.delete(key) }
39
81
  end
40
- end
41
- end
42
- end
82
+ end # LRU
83
+ end # Cache
84
+ end # Ramaze
@@ -1,124 +1,202 @@
1
- # Copyright (c) 2009 Michael Fellinger m.fellinger@gmail.com
2
- # All files in this distribution are subject to the terms of the Ruby license.
1
+ require 'dalli'
3
2
 
4
- require 'memcache'
3
+ # Kgio gives a nice performance boost but it isn't required
4
+ begin; require 'kgio'; rescue LoadError => e; end
5
5
 
6
+ #:nodoc:
6
7
  module Ramaze
8
+ #:nodoc:
7
9
  class Cache
8
-
9
- # Cache based on the memcache library which utilizes the memcache-daemon to
10
- # store key/value pairs in namespaces.
10
+ ##
11
+ # Cache driver for the Memcache storage engine. Memcache is a key/value
12
+ # store that's extremely useful for caching data such as views or API
13
+ # responses. More inforamtion about Memcache can be found on it's website:
14
+ # http://memcached.org/.
15
+ #
16
+ # Note that this cache driver requires the Dalli gem rather than Memcache
17
+ # Client. The reason for this is that the Memcache client hasn't been
18
+ # updated in over a year and Memcache has changed quite a bit. Dalli is also
19
+ # supposed to be faster and better coded. This cache driver will also try to
20
+ # load the kgio Gem if it's installed, if it's not it will just continue to
21
+ # operate but you won't get the nice speed boost.
22
+ #
23
+ # This driver works similar to Ramaze::Cache::Sequel in that it allows you
24
+ # to specify instance specific options uisng the using() method:
11
25
  #
12
- # Please read the documentation of memcache-client for further methods.
26
+ # Ramaze::Cache.options.view = Ramaze::Cache::Memcache.using(:compression => false)
13
27
  #
14
- # It is highly recommended to install memcache-client_extensions for
15
- # a bit of speedup and more functionality
28
+ # All options sent to the using() method will be sent to Dalli.
16
29
  #
17
- # NOTE: There is a big issue with persisting sessions in memcache, not only
18
- # can they be dropped at any time, essentially logging the user out
19
- # without them noticing, but there is also a low limit to the maximum
20
- # time-to-live. After 30 days, your session will be dropped, no
21
- # matter what.
22
- # Please remember that memcache is, first of all, a cache, not a
23
- # persistence mechanism.
30
+ # @author Yorick Peterse
31
+ # @since 04-05-2011
24
32
  #
25
- # NOTE: If you try to set a higher ttl than allowed, your stored key/value
26
- # will be expired immediately.
27
33
  class MemCache
34
+ include Cache::API
35
+ include Innate::Traited
36
+
37
+ # The maximum Time To Live that can be used in Memcache
28
38
  MAX_TTL = 2592000
29
39
 
30
- include Cache::API
40
+ # Hash containing the default configuration options to use for Dalli
41
+ trait :default => {
42
+ # The default TTL for each item
43
+ :expires_in => 604800,
44
+
45
+ # Compresses everything with Gzip if it's over 1K
46
+ :compression => true,
31
47
 
32
- # +:multithread+: May be turned off at your own risk.
33
- # +:readonly+: You most likely want that to be false.
34
- # +:servers+: Array containing at least one of:
35
- # MemCache::Server instance
36
- # Strings like "localhost", "localhost:11211", "localhost:11211:1"
37
- # That accord to "host:port:weight", only host is required.
38
- OPTIONS = {
39
- :multithread => true,
40
- :readonly => false,
41
- :servers => ['localhost:11211:1'],
48
+ # Array containing all default Memcache servers
49
+ :servers => ['localhost:11211']
42
50
  }
43
51
 
44
- # Connect to memcached
45
- def cache_setup(host, user, app, name)
46
- @namespace = [host, user, app, name].compact.join('-')
47
- options = {:namespace => @namespace}.merge(OPTIONS)
48
- servers = options.delete(:servers)
49
- @store = ::MemCache.new(servers, options)
50
- @warned = false
52
+ # Hash containing all the default options merged with the user specified
53
+ # ones
54
+ attr_accessor :options
55
+
56
+ class << self
57
+ attr_accessor :options
58
+
59
+ ##
60
+ # This method will create a subclass of Ramaze::Cache::MemCache with all
61
+ # the custom options set. All options set in this method will be sent to
62
+ # Dalli as well.
63
+ #
64
+ # Using this method allows you to use different memcache settings for
65
+ # various parts of Ramaze. For example, you might want to use servers A
66
+ # and B for storing the sessions but server C for only views. Most of
67
+ # the way this method works was inspired by Ramaze::Cache::Sequel which
68
+ # was contributed by Lars Olsson.
69
+ #
70
+ # @example
71
+ # Ramaze::Cache.options.session = Ramaze::Cache::MemCache.using(
72
+ # :compression => false,
73
+ # :username => 'ramaze',
74
+ # :password => 'ramaze123',
75
+ # :servers => ['othermachine.com:12345'] # Overwrites the default server
76
+ # )
77
+ #
78
+ # @author Yorick Peterse
79
+ # @since 04-05-2011
80
+ # @param [Hash] options A hash containing all configuration options to
81
+ # use for Dalli. For more information on all the available options you
82
+ # can read the README in their repository. This repository can be found
83
+ # here: https://github.com/mperham/dalli
84
+ #
85
+ def using(options = {})
86
+ merged = Ramaze::Cache::MemCache.trait[:default].merge(options)
87
+ Class.new(self) { @options = merged }
88
+ end
51
89
  end
52
90
 
53
- # Wipe out _all_ data in memcached, use with care.
54
- def cache_clear
55
- @store.flush_all
56
- rescue ::MemCache::MemCacheError => e
57
- Log.error(e)
58
- nil
91
+ ##
92
+ # Creates a new instance of the cache class.
93
+ #
94
+ # @author Michael Fellinger
95
+ # @since 04-05-2011
96
+ # @param [Hash] options A hash with custom options, see
97
+ # Ramaze::Cache::MemCache.using for all available options.
98
+ #
99
+ def initialize(options = {})
100
+ self.class.options ||= Ramaze::Cache::MemCache.trait[:default].merge(
101
+ options
102
+ )
103
+
104
+ @options = options.merge(self.class.options)
59
105
  end
60
106
 
107
+ ##
108
+ # Prepares the cache by creating the namespace and an instance of a Dalli
109
+ # client.
61
110
  #
62
- def cache_delete(*keys)
63
- super{|key| @store.delete(key); nil }
64
- rescue ::MemCache::MemCacheError => e
65
- Log.error(e)
66
- nil
67
- end
111
+ # @author Yorick Peterse
112
+ # @since 04-05-2011
113
+ # @param [String] hostname The hostname of the machine running the
114
+ # application.
115
+ # @param [String] username The name of the user executing the process
116
+ # @param [String] appname Unique identifier for the application.
117
+ # @param [String] cachename The namespace to use for this cache instance.
118
+ #
119
+ def cache_setup(hostname, username, appname, cachename)
120
+ # Validate the maximum TTL
121
+ if options[:expires_in] > MAX_TTL
122
+ raise(ArgumentError, "The maximum TTL of Memcache is 30 days")
123
+ end
68
124
 
69
- # NOTE:
70
- # * We have no way of knowing whether the value really is nil, we
71
- # assume you wouldn't cache nil and return the default instead.
72
- def cache_fetch(key, default = nil)
73
- value = @store[key]
74
- value.nil? ? default : value
75
- rescue ::MemCache::MemCacheError => e
76
- Log.error(e)
77
- nil
125
+ options[:namespace] = [
126
+ hostname, username, appname, cachename
127
+ ].compact.join('-')
128
+
129
+ @client = ::Dalli::Client.new(options[:servers], options)
78
130
  end
79
131
 
80
- def cache_store(key, value, options = {})
81
- ttl = options[:ttl] || 0
82
-
83
- if ttl > MAX_TTL
84
- unless @warned
85
- Log.warn('MemCache cannot set a ttl greater than 2592000 seconds.')
86
- Log.warn('Modify Ramaze.options.session.ttl to a value <= of that.')
87
- @warned = true
88
- end
132
+ ##
133
+ # Removes all items from the cache.
134
+ #
135
+ # @author Yorick Peterse
136
+ # @since 04-05-2011
137
+ #
138
+ def cache_clear
139
+ @client.flush
140
+ end
89
141
 
90
- ttl = MAX_TTL
142
+ ##
143
+ # Removes the specified keys from the cache.
144
+ #
145
+ # @author Yorick Peterse
146
+ # @since 04-05-2011
147
+ # @param [Array] keys The keys to remove from the cache.
148
+ #
149
+ def cache_delete(*keys)
150
+ keys.each do |key|
151
+ @client.delete(key)
91
152
  end
92
-
93
- @store.set(key, value, ttl)
94
- value
95
- rescue ::MemCache::MemCacheError => e
96
- Log.error(e)
97
- nil
98
153
  end
99
154
 
100
- # statistics about usage
101
- def stats; @store.stats; end
155
+ ##
156
+ # Fetches the specified key from the cache. It the value was nil the
157
+ # default value will be returned instead.
158
+ #
159
+ # @author Yorick Peterse
160
+ # @since 04-05-2011
161
+ # @param [String] key The name of the key to retrieve.
162
+ # @param [Mixed] default The default value.
163
+ # @return [Mixed]
164
+ #
165
+ def cache_fetch(key, default = nil)
166
+ value = @client.get(key)
102
167
 
103
- # current namespace
104
- def namespace; @store.namespace; end
168
+ if value.nil?
169
+ return default
170
+ else
171
+ return value
172
+ end
173
+ end
105
174
 
106
- # switch to different namespace
107
- def namespace=(ns) @namespace = @store.namespace = ns; end
175
+ ##
176
+ # Sets the given key to the specified value. Optionally you can specify a
177
+ # hash with options specific to the key. Once a key has been stored it's
178
+ # value will be returned.
179
+ #
180
+ # @author Yorick Peterse
181
+ # @since 04-05-2011
182
+ # @param [String] key The name of the key to store.
183
+ # @param [Mixed] value The value to store in Memcache.
184
+ # @param [Fixnum] ttl The Time To Live to use for the current key.
185
+ # @param [Hash] options A hash containing options specific for the
186
+ # specified key.
187
+ # @return [Mixed]
188
+ #
189
+ def cache_store(key, value, ttl = nil, options = {})
190
+ ttl = options.delete(:ttl) || @options[:expires_in]
108
191
 
109
- # state of compression (true/false)
110
- def compression; @store.compression; end
192
+ if ttl > MAX_TTL
193
+ raise(ArgumentError, "The maximum TTL of Memcache is 30 days")
194
+ end
111
195
 
112
- # turn compression on or off
113
- def compression=(bool); @store.compression = bool; end
196
+ @client.set(key, value, ttl, options)
114
197
 
115
- # For everything else that we don't care to document right now.
116
- def method_missing(*args, &block)
117
- @store.__send__(*args, &block)
118
- rescue ::MemCache::MemCacheError => e
119
- Log.error(e)
120
- nil
198
+ return value
121
199
  end
122
- end
123
- end
124
- end
200
+ end # MemCache
201
+ end # Cache
202
+ end # Ramaze