cachetastic 2.1.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +21 -0
- data/README +57 -43
- data/doc/classes/Cachetastic/Adapters.html +180 -0
- data/doc/classes/Cachetastic/Adapters/Base.html +206 -123
- data/doc/classes/Cachetastic/Adapters/File.html +17 -130
- data/doc/classes/Cachetastic/Adapters/LocalMemory.html +7 -228
- data/doc/classes/Cachetastic/Adapters/Memcached.html +193 -0
- data/doc/classes/Cachetastic/Cache.html +425 -0
- data/doc/classes/Cachetastic/Cacheable.html +26 -30
- data/doc/classes/Cachetastic/Cacheable/ClassAndInstanceMethods.html +66 -62
- data/doc/classes/Cachetastic/Cacheable/ClassOnlyMethods.html +30 -30
- data/doc/classes/Cachetastic/Logger.html +31 -33
- data/doc/created.rid +1 -1
- data/doc/files/{lib/cachetastic/adapters/html_file_rb.html → LICENSE.html} +29 -34
- data/doc/files/README.html +91 -57
- data/doc/files/lib/cachetastic/adapters/base_rb.html +1 -39
- data/doc/files/lib/cachetastic/adapters/file_rb.html +1 -21
- data/doc/files/lib/cachetastic/adapters/local_memory_rb.html +1 -9
- data/doc/files/lib/cachetastic/{ruby_extensions/kernel_rb.html → adapters/memcached_rb.html} +4 -4
- data/doc/files/lib/cachetastic/{ruby_extensions/string_rb.html → cache_rb.html} +5 -5
- data/doc/files/lib/cachetastic/cacheable_rb.html +1 -1
- data/doc/files/lib/cachetastic/{caches/base_rb.html → extensions/string_rb.html} +5 -5
- data/doc/files/lib/cachetastic/logger_rb.html +1 -7
- data/doc/files/lib/cachetastic/{adapters/store_object_rb.html → store_object_rb.html} +3 -3
- data/doc/files/lib/cachetastic_rb.html +4 -95
- data/doc/fr_class_index.html +3 -15
- data/doc/fr_file_index.html +5 -16
- data/doc/fr_method_index.html +26 -78
- data/lib/cachetastic.rb +16 -70
- data/lib/cachetastic/adapters/base.rb +178 -76
- data/lib/cachetastic/adapters/file.rb +63 -46
- data/lib/cachetastic/adapters/local_memory.rb +36 -67
- data/lib/cachetastic/adapters/memcached.rb +114 -0
- data/lib/cachetastic/cache.rb +165 -0
- data/lib/cachetastic/cacheable.rb +19 -15
- data/lib/cachetastic/extensions/string.rb +8 -0
- data/lib/cachetastic/logger.rb +41 -41
- data/lib/cachetastic/store_object.rb +22 -0
- metadata +43 -64
- data/bin/cachetastic_drb_server +0 -115
- data/doc/classes/ActiveRecord/Base.html +0 -194
- data/doc/classes/CGI/Session/CachetasticStore.html +0 -124
- data/doc/classes/Cachetastic/Adapters/Drb.html +0 -332
- data/doc/classes/Cachetastic/Adapters/FileBase.html +0 -309
- data/doc/classes/Cachetastic/Adapters/HtmlFile.html +0 -224
- data/doc/classes/Cachetastic/Adapters/Memcache.html +0 -498
- data/doc/classes/Cachetastic/Caches/Base.html +0 -643
- data/doc/classes/Cachetastic/Caches/Base/RegisteredCaches.html +0 -179
- data/doc/classes/Cachetastic/Caches/MackSessionCache.html +0 -119
- data/doc/classes/Cachetastic/Caches/PageCache.html +0 -121
- data/doc/classes/Cachetastic/Caches/RailsSessionCache.html +0 -154
- data/doc/classes/Cachetastic/Connection.html +0 -212
- data/doc/classes/Cachetastic/Errors/UnsupportedAdapter.html +0 -146
- data/doc/classes/Object.html +0 -222
- data/doc/classes/String.html +0 -172
- data/doc/files/lib/cachetastic/adapters/drb_rb.html +0 -115
- data/doc/files/lib/cachetastic/adapters/file_base_rb.html +0 -109
- data/doc/files/lib/cachetastic/adapters/memcache_rb.html +0 -127
- data/doc/files/lib/cachetastic/caches/mack_session_cache_rb.html +0 -107
- data/doc/files/lib/cachetastic/caches/page_cache_rb.html +0 -109
- data/doc/files/lib/cachetastic/caches/rails_session_cache_rb.html +0 -107
- data/doc/files/lib/cachetastic/connection_rb.html +0 -107
- data/doc/files/lib/cachetastic/errors/unsupported_adapter_rb.html +0 -101
- data/doc/files/lib/cachetastic/rails_extensions/active_record_base_rb.html +0 -101
- data/doc/files/lib/cachetastic/rails_extensions/cgi_session_store_rb.html +0 -109
- data/doc/files/lib/cachetastic/ruby_extensions/object_rb.html +0 -101
- data/lib/cachetastic/adapters/drb.rb +0 -51
- data/lib/cachetastic/adapters/file_base.rb +0 -86
- data/lib/cachetastic/adapters/html_file.rb +0 -68
- data/lib/cachetastic/adapters/memcache.rb +0 -114
- data/lib/cachetastic/adapters/store_object.rb +0 -28
- data/lib/cachetastic/caches/base.rb +0 -238
- data/lib/cachetastic/caches/mack_session_cache.rb +0 -3
- data/lib/cachetastic/caches/page_cache.rb +0 -6
- data/lib/cachetastic/caches/rails_session_cache.rb +0 -12
- data/lib/cachetastic/connection.rb +0 -24
- data/lib/cachetastic/errors/unsupported_adapter.rb +0 -7
- data/lib/cachetastic/rails_extensions/active_record_base.rb +0 -24
- data/lib/cachetastic/rails_extensions/cgi_session_store.rb +0 -59
- data/lib/cachetastic/ruby_extensions/kernel.rb +0 -25
- data/lib/cachetastic/ruby_extensions/object.rb +0 -22
- data/lib/cachetastic/ruby_extensions/string.rb +0 -15
- data/test/active_record_test.rb +0 -89
- data/test/cacheable_test.rb +0 -88
- data/test/cachetastic_unit_test.rb +0 -74
- data/test/config.rb +0 -30
- data/test/drb_adapter_test.rb +0 -14
- data/test/file_adapter_test.rb +0 -49
- data/test/memcache_adapter_test.rb +0 -18
- data/test/test_helper.rb +0 -75
@@ -1,68 +0,0 @@
|
|
1
|
-
# This adapter uses the file system as it's backing.
|
2
|
-
# Caches are stored in files called index.html.
|
3
|
-
# At the beginning of the html the following html comments are pre-pended:
|
4
|
-
# <!-- cachetastic: expires_at: Fri Feb 01 20:51:45 -0500 2008 -->
|
5
|
-
# <!-- cachetastic: key: /channels/1-arts-humanities -->
|
6
|
-
# Obviously the expires_at date will be the ACTUAL expire date,
|
7
|
-
# same goes for the key.
|
8
|
-
# The configuration for this should look something like this:
|
9
|
-
# my_awesome_cache_options:
|
10
|
-
# debug: false
|
11
|
-
# adapter: html_file
|
12
|
-
# marshall_method: none
|
13
|
-
# default_expiry: <%= 24.hours %>
|
14
|
-
# store_options:
|
15
|
-
# dir: /usr/local/caches/
|
16
|
-
# logging:
|
17
|
-
# logger_1:
|
18
|
-
# type: file
|
19
|
-
# file: log/file_store_cache.log
|
20
|
-
require 'time'
|
21
|
-
class Cachetastic::Adapters::HtmlFile < Cachetastic::Adapters::FileBase
|
22
|
-
|
23
|
-
def get(key)
|
24
|
-
full_path = full_path_from_dir(get_key_directoy(key, false))
|
25
|
-
return nil unless File.exists?(full_path)
|
26
|
-
so = html_to_store_object(File.open(full_path).read)
|
27
|
-
if so
|
28
|
-
if so.invalid?
|
29
|
-
self.delete(key)
|
30
|
-
return nil
|
31
|
-
end
|
32
|
-
return so.value
|
33
|
-
end
|
34
|
-
return nil
|
35
|
-
end
|
36
|
-
|
37
|
-
def set(key, value, expiry = 0)
|
38
|
-
so = Cachetastic::Adapters::StoreObject.new(key.to_s, value, expiry)
|
39
|
-
File.open(full_path_from_key(key), "w") do |f|
|
40
|
-
f.puts store_object_to_html(so)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
protected
|
45
|
-
def store_file_name
|
46
|
-
return STORE_FILE_NAME
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
def html_to_store_object(html)
|
51
|
-
key = html.match(/<!-- cachetastic: key: (.*) -->/).captures.first
|
52
|
-
expires_at = html.match(/<!-- cachetastic: expires_at: (.*) -->/).captures.first
|
53
|
-
html.gsub!(/<!-- cachetastic: key: .* -->/, '')
|
54
|
-
html.gsub!(/<!-- cachetastic: expires_at: .* -->/, '')
|
55
|
-
so = Cachetastic::Adapters::StoreObject.new(key, html, 0)
|
56
|
-
so.expires_at = Time.parse(expires_at)
|
57
|
-
so
|
58
|
-
end
|
59
|
-
|
60
|
-
def store_object_to_html(so)
|
61
|
-
x = so.value
|
62
|
-
x << "\n<!-- cachetastic: expires_at: #{so.expires_at} -->"
|
63
|
-
x << "\n<!-- cachetastic: key: #{so.key} -->"
|
64
|
-
end
|
65
|
-
|
66
|
-
STORE_FILE_NAME = "index.html"
|
67
|
-
|
68
|
-
end
|
@@ -1,114 +0,0 @@
|
|
1
|
-
# This adapter uses Memcache as it's backing.
|
2
|
-
# The configuration for this should look something like this:
|
3
|
-
# my_awesome_cache_options:
|
4
|
-
# debug: false
|
5
|
-
# adapter: memcache
|
6
|
-
# marshall_method: none
|
7
|
-
# default_expiry: <%= 24.hours %>
|
8
|
-
# store_options:
|
9
|
-
# c_threshold: 10_000
|
10
|
-
# compression: true
|
11
|
-
# debug: false
|
12
|
-
# readonly: false
|
13
|
-
# urlencode: false
|
14
|
-
# logging:
|
15
|
-
# logger_1:
|
16
|
-
# type: file
|
17
|
-
# file: log/memcached.log
|
18
|
-
# servers:
|
19
|
-
# - 127.0.0.1:11211
|
20
|
-
class Cachetastic::Adapters::Memcache < Cachetastic::Adapters::Base
|
21
|
-
|
22
|
-
def setup
|
23
|
-
self.conn = MemCache.new([configuration.servers].flatten, configuration.store_options.to_hash.merge({:namespace => self.namespace}))
|
24
|
-
self.version = self.get_version(self.name)
|
25
|
-
end
|
26
|
-
|
27
|
-
def set(key, value, expiry = 0, raw = false)
|
28
|
-
self.conn.set(key, value, expiry, raw)
|
29
|
-
end
|
30
|
-
|
31
|
-
def delete(key, delay = 0)
|
32
|
-
self.conn.delete(key, delay)
|
33
|
-
end
|
34
|
-
|
35
|
-
def get(key, raw = false)
|
36
|
-
self.conn.get(key, raw)
|
37
|
-
end
|
38
|
-
|
39
|
-
def expire_all
|
40
|
-
self.increment_version(self.name)
|
41
|
-
end
|
42
|
-
|
43
|
-
def inspect
|
44
|
-
self.conn.inspect + " <version: #{self.version}> #{self.conn.stats.inspect}"
|
45
|
-
end
|
46
|
-
|
47
|
-
def valid?
|
48
|
-
begin
|
49
|
-
return (self.conn.active? && self.version == self.get_version(self.name))
|
50
|
-
rescue Exception => e
|
51
|
-
puts e.message
|
52
|
-
puts e.backtrace.join("\n")
|
53
|
-
return false
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def stats
|
58
|
-
super
|
59
|
-
begin
|
60
|
-
puts "Memcache stats for all caches:"
|
61
|
-
memc = self.conn
|
62
|
-
puts Kernel.pp_to_s(memc.stats)
|
63
|
-
paths = `sh -c 'echo $PATH'`
|
64
|
-
paths = paths.split(':')
|
65
|
-
memcached_tool_found = false
|
66
|
-
paths.each do |path|
|
67
|
-
cmd_path = File.expand_path(File.join(path,'memcached_tool'))
|
68
|
-
if File.exists?(cmd_path)
|
69
|
-
memcached_tool_found = true
|
70
|
-
break
|
71
|
-
end
|
72
|
-
end
|
73
|
-
if memcached_tool_found
|
74
|
-
configuration.memcache_servers.each do |server|
|
75
|
-
puts `memcached_tool #{server}`
|
76
|
-
end
|
77
|
-
end
|
78
|
-
rescue
|
79
|
-
end
|
80
|
-
puts ""
|
81
|
-
end
|
82
|
-
|
83
|
-
protected
|
84
|
-
attr_accessor :conn
|
85
|
-
attr_accessor :version
|
86
|
-
|
87
|
-
def namespace
|
88
|
-
v = self.get_version(self.name)
|
89
|
-
return "#{name}.#{v}"
|
90
|
-
end
|
91
|
-
|
92
|
-
def ns_versions
|
93
|
-
ivar_cache do
|
94
|
-
ns_conn = MemCache.new([configuration.servers].flatten, configuration.store_options.to_hash.merge({:namespace => :namespace_versions}))
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def increment_version(name)
|
99
|
-
name = name.to_s
|
100
|
-
v = get_version(name)
|
101
|
-
self.ns_versions.set(name, v + 1)
|
102
|
-
end
|
103
|
-
|
104
|
-
def get_version(name)
|
105
|
-
name = name.to_s
|
106
|
-
v = self.ns_versions.get(name)
|
107
|
-
if v.nil?
|
108
|
-
self.ns_versions.set(name, 1)
|
109
|
-
v = 1
|
110
|
-
end
|
111
|
-
v
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
class Cachetastic::Adapters::StoreObject #:nodoc:#
|
2
|
-
attr_accessor :key
|
3
|
-
attr_accessor :value
|
4
|
-
attr_accessor :expires_at
|
5
|
-
|
6
|
-
def initialize(key, value, expiry)
|
7
|
-
self.key = key
|
8
|
-
self.value = value
|
9
|
-
begin
|
10
|
-
self.expires_at = (Time.now + (expiry == 0 ? (31536000) : expiry)) # 31536000 = one year
|
11
|
-
rescue RangeError => e
|
12
|
-
self.expires_at = Time.at(expiry)
|
13
|
-
end
|
14
|
-
# puts "now: #{Time.now}"
|
15
|
-
# puts "expiry: #{expiry}"
|
16
|
-
# puts "expires_at: #{self.expires_at}"
|
17
|
-
end
|
18
|
-
|
19
|
-
def size
|
20
|
-
return self.value.size if self.value.respond_to?(:size)
|
21
|
-
-1
|
22
|
-
end
|
23
|
-
|
24
|
-
def invalid?
|
25
|
-
Time.now >= self.expires_at
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
@@ -1,238 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
# When creating a new 'Cache' this class should be extended.
|
3
|
-
# Once extended you'll only need to override just the methods
|
4
|
-
# that are different for your cache.
|
5
|
-
# class MyAwesomeCache < Cachetastic::Caches::Base
|
6
|
-
# end
|
7
|
-
# MyAwesomeCache.set(1, "One")
|
8
|
-
# MyAwesomeCache.get(1) # => "One"
|
9
|
-
# MyAwesomeCache.update(1, "One!!")
|
10
|
-
# MyAwesomeCache.get(1) # => "One!!"
|
11
|
-
# MyAwesomeCache.delete(1)
|
12
|
-
# MyAwesomeCache.get(1) # => nil
|
13
|
-
#
|
14
|
-
# class MyAwesomeCache < Cachetastic::Caches::Base
|
15
|
-
# class << self
|
16
|
-
# def get(key)
|
17
|
-
# super(key) do
|
18
|
-
# set(key, key * 10)
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
# end
|
23
|
-
# MyAwesomeCache.set(1, "One")
|
24
|
-
# MyAwesomeCache.get(1) # => "One"
|
25
|
-
# MyAwesomeCache.delete(1)
|
26
|
-
# MyAwesomeCache.get(1) # => 10
|
27
|
-
class Cachetastic::Caches::Base
|
28
|
-
|
29
|
-
# Used to store a list of all the caches registered with the system.
|
30
|
-
# In order for a cache to be registered it must extend Cachetastic::Caches::Base.
|
31
|
-
class RegisteredCaches
|
32
|
-
include Singleton
|
33
|
-
|
34
|
-
# list of all caches registered with the system.
|
35
|
-
attr_reader :list
|
36
|
-
|
37
|
-
def initialize
|
38
|
-
@list = []
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
# everything is done at the class level. there won't be any 'instances of it'
|
44
|
-
# using class << self means we don't have to prefix each method with 'self.'
|
45
|
-
class << self
|
46
|
-
|
47
|
-
# Returns a list of all registered caches in the system.
|
48
|
-
def all_registered_caches
|
49
|
-
RegisteredCaches.instance.list
|
50
|
-
end
|
51
|
-
|
52
|
-
# Returns an object from the cache for a given key.
|
53
|
-
# If the object comes back as nil and a block is given
|
54
|
-
# that block will be run and the results of the block
|
55
|
-
# will be run. This can be used to JIT caches, just make
|
56
|
-
# sure in the block to call the set method because the
|
57
|
-
# results of the block are not automatically cached.
|
58
|
-
def get(key, &block)
|
59
|
-
res = nil
|
60
|
-
do_with_logging(:get, key) do
|
61
|
-
retryable(:on => ArgumentError) do
|
62
|
-
begin
|
63
|
-
res = adapter.get(key.to_s)
|
64
|
-
if res.nil?
|
65
|
-
res = yield key if block_given?
|
66
|
-
else
|
67
|
-
res = unmarshall(res)
|
68
|
-
end
|
69
|
-
res
|
70
|
-
rescue ArgumentError => e
|
71
|
-
m = e.message.match(/class\/module .*/)
|
72
|
-
if m
|
73
|
-
m = m.to_s
|
74
|
-
m.gsub!("class/module", '')
|
75
|
-
m.gsub!("(ArgumentError)", '')
|
76
|
-
require m.strip.underscore
|
77
|
-
raise e
|
78
|
-
end
|
79
|
-
rescue Exception => e
|
80
|
-
raise e
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
res
|
85
|
-
end
|
86
|
-
|
87
|
-
# Set a particular object info the cache for the given key.
|
88
|
-
# An optional third parameter sets the expiry time for the object in the cache.
|
89
|
-
# The default for this expiry is set as either 0, meaning it never expires, or
|
90
|
-
# if there's a default_expiry time set in the config file, that file will be
|
91
|
-
# used.
|
92
|
-
# If there is an expiry_swing set in the config file it will be +/- to the
|
93
|
-
# expiry time. See also: calculate_expiry_time
|
94
|
-
def set(key, value, expiry = adapter.configuration.retrieve(:default_expiry, 0))
|
95
|
-
do_with_logging(:set, key) do
|
96
|
-
expiry = calculate_expiry_time(expiry)
|
97
|
-
adapter.set(key.to_s, marshall(value), expiry.to_i)
|
98
|
-
logger.info('', '', :expiry, cache_name, key, expiry.to_i)
|
99
|
-
value
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
alias_method :put, :set
|
104
|
-
|
105
|
-
# Deletes an object from the cache. The optional delay parameter
|
106
|
-
# sets an offset, in seconds, for when the object should get deleted.
|
107
|
-
# The default of 0 means the object gets deleted right away.
|
108
|
-
def delete(key, delay = 0)
|
109
|
-
do_with_logging(:delete, key) do
|
110
|
-
adapter.delete(key.to_s, delay)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Expires all objects for this cache.
|
115
|
-
def expire_all
|
116
|
-
adapter.expire_all
|
117
|
-
logger.info('', '', :expired, cache_name)
|
118
|
-
end
|
119
|
-
|
120
|
-
# Raises a MethodNotImplemented exception. This method should be overridden
|
121
|
-
# in the child class to enable a populating the cache with all things that
|
122
|
-
# should be in there.
|
123
|
-
needs_method :populate_all
|
124
|
-
|
125
|
-
# A convenience method that returns statistics for the underlying Cachetastic::Adapters::Base for the cache.
|
126
|
-
def stats
|
127
|
-
adapter.stats
|
128
|
-
end
|
129
|
-
|
130
|
-
# Returns a 'methodize' version of the cache's class name. This gets used in logging,
|
131
|
-
# namespacing, and as the key in the Cachetastic::Connection class.
|
132
|
-
# MyAwesomeCache.cache # => "my_awesome_cache"
|
133
|
-
# Cachetastic::Caches::Base # => "cachetastic_caches_base"
|
134
|
-
def cache_name
|
135
|
-
self.name.methodize
|
136
|
-
end
|
137
|
-
|
138
|
-
# Returns the underlying Cachetastic::Adapters::Base for this cache.
|
139
|
-
def adapter
|
140
|
-
a = cache_conn_instance.get(cache_name)
|
141
|
-
if adapter_supported?(a.class)
|
142
|
-
return a
|
143
|
-
else
|
144
|
-
raise Cachetastic::Errors::UnsupportedAdapter.new(cache_name, a.class)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
# Returns the Cachetastic::Logger for the underlying Cachetastic::Adapters::Base.
|
149
|
-
def logger
|
150
|
-
adapter.logger
|
151
|
-
end
|
152
|
-
|
153
|
-
# Returns an array of unsupported adapters for this cache. Defaults to an empty
|
154
|
-
# array which will let any adapter be used by the cache. Override in your specific
|
155
|
-
# cache to prevent certain adapters.
|
156
|
-
def unsupported_adapters
|
157
|
-
[]
|
158
|
-
end
|
159
|
-
|
160
|
-
# Returns true/false on whether the adapter you want to use is supported for the cache.
|
161
|
-
def adapter_supported?(a = cache_conn_instance.get(cache_name).class)
|
162
|
-
return !unsupported_adapters.include?(a)
|
163
|
-
end
|
164
|
-
|
165
|
-
def marshall(value)
|
166
|
-
return value if value.nil?
|
167
|
-
return case adapter.configuration.retrieve(:marshall_method, :none).to_sym
|
168
|
-
when :yaml
|
169
|
-
YAML.dump(value)
|
170
|
-
when :ruby
|
171
|
-
Marshal.dump(value)
|
172
|
-
else
|
173
|
-
value
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def unmarshall(value)
|
178
|
-
return value if value.nil?
|
179
|
-
return case adapter.configuration.retrieve(:marshall_method, :none).to_sym
|
180
|
-
when :yaml
|
181
|
-
YAML.load(value)
|
182
|
-
when :ruby
|
183
|
-
Marshal.load(value)
|
184
|
-
else
|
185
|
-
value
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
private
|
190
|
-
# If the expiry time is set to 60 minutes and the expiry_swing time is set to
|
191
|
-
# 15 minutes, this method will return a number between 45 minutes and 75 minutes.
|
192
|
-
def calculate_expiry_time(expiry) # :doc:
|
193
|
-
exp_swing = adapter.configuration.retrieve(:expiry_swing, 0)
|
194
|
-
if exp_swing && exp_swing != 0
|
195
|
-
swing = rand(exp_swing.to_i)
|
196
|
-
case rand(2)
|
197
|
-
when 0
|
198
|
-
expiry = (expiry.to_i + swing)
|
199
|
-
when 1
|
200
|
-
expiry = (expiry.to_i - swing)
|
201
|
-
end
|
202
|
-
end
|
203
|
-
expiry
|
204
|
-
end
|
205
|
-
|
206
|
-
def inherited(child)
|
207
|
-
# puts "child: #{child.inspect}"
|
208
|
-
all_registered_caches << child.to_s
|
209
|
-
# puts "all_registered_caches: #{all_registered_caches.inspect}"
|
210
|
-
end
|
211
|
-
|
212
|
-
def cache_conn_instance
|
213
|
-
Cachetastic::Connection.instance
|
214
|
-
end
|
215
|
-
|
216
|
-
def do_with_logging(action, key)
|
217
|
-
start_time = Time.now
|
218
|
-
logger.info(:starting, action, cache_name, key)
|
219
|
-
res = yield if block_given?
|
220
|
-
end_time = Time.now
|
221
|
-
str = ""
|
222
|
-
unless res.nil?
|
223
|
-
str = "[#{res.class.name}]"
|
224
|
-
str << "\t[Size = #{res.size}]" if res.respond_to? :size
|
225
|
-
str << "\t" << res.inspect if adapter.debug?
|
226
|
-
end
|
227
|
-
logger.info(:finished, action, cache_name, key, (end_time - start_time), str)
|
228
|
-
res
|
229
|
-
end
|
230
|
-
|
231
|
-
# make sure people can't instaniate this object!
|
232
|
-
def new(*args)
|
233
|
-
raise NoMethodError.new("You can not instaniate this class!")
|
234
|
-
end
|
235
|
-
|
236
|
-
end
|
237
|
-
|
238
|
-
end
|