aub-cache_advance 0.2.0 → 1.0.0

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/README.textile CHANGED
@@ -1,47 +0,0 @@
1
- h1. cache advance
2
-
3
- CacheAdvance is a wrapper around the Rails caching system that provides a simple, centralized
4
- configuration file for defining caches and an even simpler way to apply them.
5
-
6
- Written by "Aubrey Holland":mailto:aubreyholland@gmail.com.
7
-
8
- h3. download
9
-
10
- Github: "Page":http://github.com/aub/cache_advance/tree/master
11
-
12
- Gem: <pre>gem install aub-cache_advance --source http://gems.github.com</pre>
13
-
14
- Note: if you install using the gem from Github, you'll need this
15
- in your environment.rb if you want to use Rails 2.1's dependency manager:
16
-
17
- <pre><code>
18
- config.gem 'aub-cache_advance', :lib => 'cache_advance', :source => 'http://gems.github.com'
19
- </code></pre>
20
-
21
- h3. cache definition
22
-
23
- Caches are defined in the file config/caches.rb, which will be loaded automatically by the gem.
24
- This file is similar in format to the rails routes config file, allowing you to specify named
25
- caches and configure their keys and how they will be expired.
26
-
27
- <pre><code>
28
- CacheAdvance::Caches.define_caches do |config|
29
-
30
- config.qualifier(:params) do |request|
31
- request.params
32
- end
33
-
34
- config.plugin :template_handler_observer_cache_plugin
35
-
36
- config.content_block :expiration_time => 10.minutes, :qualifiers => [ :subdomain, :params ]
37
-
38
- config.change_towns_all :expiration_types => [ :publication ]
39
- config.change_towns_limited :expiration_types => [ :publication ]
40
-
41
- config.publication_twitter_update :expiration_time => 10.minutes, :qualifiers => [ :subdomain ]
42
-
43
- config.weather_widget :expiration_time => 10.minutes, :qualifiers => [ :subdomain ]
44
- end
45
- </code></pre>
46
-
47
- ..............More later.
data/TODO.textile CHANGED
@@ -1,6 +0,0 @@
1
- - Fix to allow keys of > 256 characters with memcache
2
- - Make test coverage not pitiful
3
- - Add ability for cache to expire when a specific object changes
4
- - Apply plugins only to specific caches
5
- - Test with caching strategies other than memcache
6
- - Improve documentation
@@ -1,5 +1,5 @@
1
1
  Gem::Specification.new do |s|
2
- s.version = '0.2.0'
2
+ s.version = '1.0.0'
3
3
  s.date = %q{2009-01-08}
4
4
 
5
5
  s.name = %q{cache_advance}
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.authors = ['Aubrey Holland']
8
8
  s.description = %q{A system for spiffy declarative caching}
9
9
  s.email = %q{aubrey@patch.com}
10
- s.files = %w(README.textile Rakefile TODO.textile cache_advance-1.0.9.gem cache_advance.gemspec lib/cache_advance.rb lib/cache_advance/active_record_sweeper.rb lib/cache_advance/cache_set.rb lib/cache_advance/cached_key_list.rb lib/cache_advance/lock.rb lib/cache_advance/mapper.rb lib/cache_advance/named_cache.rb lib/cache_advance/named_cache_configuration.rb rails/init.rb test/active_record_sweeper_test.rb test/cache_mock.rb test/cache_set_test.rb test/mapper_test.rb test/named_cache_test.rb test/spec/db/schema.rb test/spec/mapper_spec.rb test/spec/mocks/memcache.rb test/spec/spec_helper.rb test/test_helper.rb)
10
+ s.files = %w(cache_advance.gemspec lib/cache_advance/active_record_sweeper.rb lib/cache_advance/cache_set.rb lib/cache_advance/mapper.rb lib/cache_advance/named_cache.rb lib/cache_advance/rails_cache.rb lib/cache_advance.rb rails/init.rb Rakefile README.textile test/active_record_sweeper_test.rb test/cache_set_test.rb test/mapper_test.rb test/named_cache_test.rb test/rails_cache_test.rb test/test_helper.rb TODO.textile)
11
11
  s.homepage = %q{http://github.com/aub/cache_advance}
12
12
  s.require_paths = ['lib']
13
13
  s.rubygems_version = %q{1.2.0}
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.has_rdoc = true
16
16
  s.extra_rdoc_files = ['README.textile']
17
17
  s.rdoc_options = ['--line-numbers', '--inline-source', '--main', 'README.textile']
18
- s.test_files = %w(test/active_record_sweeper_test.rb test/cache_set_test.rb test/mapper_test.rb test/named_cache_test.rb)
18
+ s.test_files = %w(test/active_record_sweeper_test.rb test/cache_set_test.rb test/mapper_test.rb test/named_cache_test.rb test/rails_cache_test.rb)
19
19
 
20
20
  if s.respond_to? :specification_version then
21
21
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -26,7 +26,7 @@ module CacheAdvance
26
26
 
27
27
  def expire_caches_for(object)
28
28
  class_symbol = object.class.name.underscore.to_sym
29
- CacheAdvance.cache_set.expire_for_class(class_symbol)
29
+ CacheAdvance::Caches.expire_for_class(class_symbol)
30
30
  end
31
31
  end
32
32
  end
@@ -3,19 +3,19 @@ module CacheAdvance
3
3
  attr_reader :named_caches
4
4
  attr_reader :qualifiers
5
5
  attr_reader :plugins
6
+ attr_accessor :observer_type
7
+ attr_accessor :cache
6
8
 
7
- def initialize(store)
8
- @store, @named_caches, @qualifiers, @plugins = store, {}, {}, []
9
- end
10
-
11
- def setup_complete
12
-
9
+ def initialize
10
+ @named_caches = {}
11
+ @qualifiers = {}
12
+ @plugins = []
13
13
  end
14
14
 
15
15
  def apply(cache_name, request, options, &block)
16
- named_cache = @named_caches[cache_name]
17
- raise UnknownNamedCacheException if named_cache.nil?
18
- named_cache.value_for(request, options, &block)
16
+ cache = @named_caches[cache_name]
17
+ raise UnknownNamedCacheException if cache.nil?
18
+ cache.value_for(request, options, &block)
19
19
  end
20
20
 
21
21
  def add_qualifier(name, proc)
@@ -27,7 +27,7 @@ module CacheAdvance
27
27
  end
28
28
 
29
29
  def add_named_cache(name, options)
30
- @named_caches[name] = NamedCache.new(name, options, self, @store)
30
+ @named_caches[name] = NamedCache.new(name, options, self, cache)
31
31
  end
32
32
 
33
33
  def define_caches
@@ -35,17 +35,13 @@ module CacheAdvance
35
35
  end
36
36
 
37
37
  def create_sweepers
38
- @sweeper_type.initialize_observed(@named_caches.values.map { |c| c.expiration_types }.flatten.compact.uniq)
38
+ observer_type.initialize_observed(@named_caches.values.map { |c| c.expiration_types }.flatten.compact.uniq)
39
39
  end
40
40
 
41
41
  def expire_for_class(class_name)
42
- @named_caches.values.each do |named_cache|
43
- named_cache.expire_for(class_name)
42
+ @named_caches.values.each do |cache|
43
+ cache.expire_for(class_name)
44
44
  end
45
45
  end
46
-
47
- def sweeper_type=(type)
48
- @sweeper_type = type
49
- end
50
46
  end
51
47
  end
@@ -1,37 +1,51 @@
1
- module CacheAdvance
1
+ module CacheAdvance
2
2
  class NamedCache
3
-
4
- ENABLED_CHECK_INTERVAL = 60
3
+ STORED_KEY = 'STORED_CACHES'
5
4
 
6
- def initialize(name, params, cache_set, store)
5
+ def initialize(name, params, configuration, cache)
7
6
  @name = name.to_s
8
7
  @params = params
9
- @cache_set = cache_set
10
- @store = store
11
- @cached_key_list = CachedKeyList.new(@store, "#{@name}/STORED_CACHES", expiration_time)
12
- @enabled_check_time = Time.now + ENABLED_CHECK_INTERVAL
13
- @enabled = nil
8
+ @configuration = configuration
9
+ @cache = cache
14
10
  end
15
-
11
+
12
+ def key_for(request, suffix='')
13
+ key = @name.dup
14
+ key << suffix.to_s
15
+
16
+ qualifiers.each do |q|
17
+ if (qualifier = @configuration.qualifiers[q])
18
+ this_one = qualifier.call(request)
19
+ key << this_one.to_s unless this_one.nil?
20
+ end
21
+ end if qualifiers
22
+ key
23
+ end
24
+
16
25
  def value_for(request, options, &block)
17
- return block.call unless enabled?
18
-
19
26
  key = key_for(request, options[:key])
20
-
21
- if (value = read_from_store(key))
22
- each_plugin { |p| p.send('after_read', @name, key, request, value) if p.respond_to?('after_read') }
23
- return value
27
+
28
+ if (cache = @cache.read(key))
29
+ call_plugins('after_read', key, request)
30
+ return cache
24
31
  end
25
32
 
26
- each_plugin { |p| p.send('before_render', @name, key, request) if p.respond_to?('before_render') }
33
+ call_plugins('before_write', key, request)
27
34
  result = block.call
28
- each_plugin { |p| p.send('after_render', @name, key, request, result) if p.respond_to?('after_render') }
29
- each_plugin { |p| p.send('before_write', @name, key, request, result) if p.respond_to?('before_write') }
30
- write_to_store(key, result)
31
- each_plugin { |p| p.send('after_write', @name, key, request, result) if p.respond_to?('after_write') }
35
+ @cache.write(key, result, rails_options)
36
+ call_plugins('after_write', key, request)
37
+
38
+ add_to_cached_keys_list(key)
39
+
32
40
  result
33
41
  end
34
-
42
+
43
+ def rails_options
44
+ options = {}
45
+ options[:expires_in] = expiration_time if expiration_time
46
+ options
47
+ end
48
+
35
49
  def expire_for(type)
36
50
  if expiration_types.include?(type)
37
51
  expire_all
@@ -39,82 +53,43 @@ module CacheAdvance
39
53
  end
40
54
 
41
55
  def expire_all
42
- delete_all_from_store
43
- end
44
-
45
- def all_cached_keys
46
- @cached_key_list.all_keys
56
+ if (data = @cache.read(@name + STORED_KEY))
57
+ data = Array(Marshal.load(data))
58
+ data.each { |key| @cache.delete(key) }
59
+ else
60
+ @cache.delete(@name)
61
+ end
47
62
  end
48
63
 
49
64
  def expiration_types
50
65
  Array(@params[:expiration_types])
51
66
  end
52
67
 
53
- def title
54
- @params[:title] || @name.to_s
55
- end
56
-
57
- def enabled=(state)
58
- @enabled = !!state
59
- write_to_store(enabled_key, @enabled, false)
68
+ def expiration_time
69
+ @params[:expiration_time]
60
70
  end
61
71
 
62
- def enabled?
63
- if @enabled.nil? || Time.now >= @enabled_check_time
64
- @enabled = [nil, true].include?(read_from_store(enabled_key))
65
- @enabled_check_time = Time.now + ENABLED_CHECK_INTERVAL
66
- end
67
- @enabled
72
+ def qualifiers
73
+ Array(@params[:qualifiers])
68
74
  end
69
75
 
70
76
  protected
71
77
 
72
- def read_from_store(key)
73
- @store.get(key)
74
- end
75
-
76
- def write_to_store(key, value, add_to_key_list=true)
77
- expiration_time ? @store.set(key, value, expiration_time) : @store.set(key, value)
78
- if add_to_key_list
79
- @cached_key_list.add_key(key)
80
- end
81
- end
82
-
83
- def delete_from_store(key)
84
- @store.delete(key)
85
- @cached_key_list.delete_key(key)
86
- end
87
-
88
- def delete_all_from_store
89
- @cached_key_list.all_keys.each { |key| delete_from_store(key) }
90
- @cached_key_list.clear
91
- end
92
-
93
- def each_plugin
94
- @cache_set.plugins.each do |p|
95
- yield p
96
- end
78
+ def call_plugins(method, key, request)
79
+ @configuration.plugins.each { |p| p.send(method, @name, key, request) if p.respond_to?(method) }
97
80
  end
98
81
 
99
- def key_for(request, suffix='')
100
- qualifier_data = qualifiers.map do |q|
101
- if (qualifier = @cache_set.qualifiers[q])
102
- (qualifier.call(request) || '').to_s
82
+ def add_to_cached_keys_list(key)
83
+ unless expiration_types.blank? || key == @name
84
+ if (data = @cache.read(@name + STORED_KEY))
85
+ data = Array(Marshal.load(data))
86
+ else
87
+ data = []
103
88
  end
104
- end.join('/')
105
- "#{@name}/#{suffix}/[#{qualifier_data}]"
106
- end
107
-
108
- def enabled_key
109
- "#{@name}/ENABLED_STATUS"
110
- end
111
-
112
- def expiration_time
113
- @params[:expiration_time]
114
- end
115
-
116
- def qualifiers
117
- Array(@params[:qualifiers])
89
+ unless data.include?(key)
90
+ @cache.write(@name + STORED_KEY, Marshal.dump(data << key))
91
+ end
92
+ end
118
93
  end
119
94
  end
120
95
  end
@@ -0,0 +1,15 @@
1
+ module CacheAdvance
2
+ class RailsCache
3
+ def read(key)
4
+ Rails.cache.read(key)
5
+ end
6
+
7
+ def write(key, value, options={})
8
+ Rails.cache.write(key, value, options)
9
+ end
10
+
11
+ def delete(key)
12
+ Rails.cache.delete(key)
13
+ end
14
+ end
15
+ end
data/lib/cache_advance.rb CHANGED
@@ -1,19 +1,9 @@
1
+ require 'cache_advance/named_cache'
1
2
  require 'cache_advance/cache_set'
2
- require 'cache_advance/cached_key_list'
3
3
  require 'cache_advance/mapper'
4
- require 'cache_advance/named_cache'
5
- require 'cache_advance/named_cache_configuration'
6
4
 
7
5
  module CacheAdvance
8
6
  class UnknownNamedCacheException < Exception; end
9
-
10
- class << self
11
- attr_reader :cache_set
12
- end
13
-
14
- def self.define_caches(store)
15
- @cache_set = CacheSet.new(store)
16
- yield Mapper.new(@cache_set)
17
- @cache_set.setup_complete # This allows the cache set to finalize some of its configuration
18
- end
7
+
8
+ Caches = CacheSet.new
19
9
  end
data/rails/init.rb CHANGED
@@ -1,47 +1,25 @@
1
1
  require 'cache_advance'
2
- require 'cache_advance/active_record_sweeper'
3
-
4
- require "#{RAILS_ROOT}/config/caches"
2
+ require 'cache_advance/active_record_observer'
3
+ require 'cache_advance/rails_cache'
4
+ require 'config/caches'
5
5
  require 'dispatcher'
6
6
 
7
- # Setup the sweeper and cache types as appropriate for Rails.
8
- CacheAdvance.cache_set.sweeper_type = CacheAdvance::ActiveRecordSweeper
9
-
10
- # This is the helper method that can be used in rails views/controllers/helpers.
11
- # If caching is disabled, just make it yield the results of the block.
12
- if config.action_controller.perform_caching
13
- ActionController::Base.helper do
14
- def cache_it(cache, options={}, &block)
15
- CacheAdvance.cache_set.apply(cache, request, options) do
16
- capture(&block)
17
- end
18
- end
19
- end
20
- else
21
- ActionController::Base.helper do
22
- def cache_it(cache, options={}, &block)
7
+ ActionController::Base.helper do
8
+ def cache_it(cache, options={}, &block)
9
+ CacheAdvance::Caches.apply(cache, request, options) do
23
10
  capture(&block)
24
11
  end
25
12
  end
26
13
  end
27
14
 
28
- ActionMailer::Base.helper do
29
- def cache_it(cache, options={}, &block)
30
- capture(&block)
31
- end
32
- end
33
-
34
- # This will get called after the standard rails environment is initialized.
35
15
  config.after_initialize do
36
- if config.action_controller.perform_caching
37
- # This hooks the sweepers into the observer system and adds it to the list.
38
- CacheAdvance.cache_set.create_sweepers
39
- ActiveRecord::Base.observers << CacheAdvance::ActiveRecordSweeper
40
-
41
- # In development mode, the models we observe get reloaded with each request. Using
42
- # this hook allows us to reload the observer relationships each time as well.
43
- ActionController::Dispatcher.to_prepare(:cache_advance_reload) do
44
- CacheAdvance::ActiveRecordSweeper.instance.reload_sweeper
45
- end
16
+ CacheAdvance::Caches.observer_type = CacheAdvance::ActiveRecordObserver
17
+ CacheAdvance::Caches.cache = CacheAdvance::RailsCache.new
18
+
19
+ CacheAdvance::Caches.create_sweepers
20
+ ActiveRecord::Base.observers << CacheAdvance::ActiveRecordObserver
21
+
22
+ ActionController::Dispatcher.to_prepare(:cache_advance_reload) do
23
+ CacheAdvance::ActiveRecordSweeper.instance.reload_sweeper
46
24
  end
47
25
  end
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
  class Plugin; end
4
4
 
5
- require 'cache_advance/active_record_sweeper'
5
+ require 'cache_advance/active_record_observer'
6
6
 
7
7
  class CacheSetTest < Test::Unit::TestCase
8
8
  def setup
@@ -30,10 +30,10 @@ class CacheSetTest < Test::Unit::TestCase
30
30
  end
31
31
 
32
32
  def test_should_pass_expiration_types_to_the_sweeper
33
- @cache_set.sweeper_type = CacheAdvance::ActiveRecordSweeper
33
+ @cache_set.observer_type = CacheAdvance::ActiveRecordObserver
34
34
  @cache_set.add_named_cache(:kewl, { :expiration_types => [:publication, :article] })
35
35
  @cache_set.add_named_cache(:howza, { :expiration_types => [:publication] })
36
- CacheAdvance::ActiveRecordSweeper.expects(:initialize_observed).with([:publication, :article])
36
+ CacheAdvance::ActiveRecordObserver.expects(:initialize_observed).with([:publication, :article])
37
37
  @cache_set.create_sweepers
38
38
  end
39
39
  end
@@ -1,126 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
  class NamedCacheTest < Test::Unit::TestCase
4
-
5
- def setup
6
- @request = mock
7
- end
8
-
9
- def test_key_for_in_basic_case
10
- create_named_cache
11
- assert_equal 'test_cache', @named_cache.key_for(@request)
12
- assert_equal 'test_cachesuf', @named_cache.key_for(@request, 'suf')
13
- end
14
-
15
- def test_key_with_qualifiers
16
-
17
- end
18
-
19
- protected
20
-
21
- def create_named_cache(options={})
22
- @name = options[:name] || 'test_cache'
23
- @params = {}
24
- @cache_set = CacheAdvance::CacheSet.new
25
- @cache = CacheAdvance::CacheMock.new
26
- @named_cache = CacheAdvance::NamedCache.new(@name, @params, @cache_set, @cache)
4
+ def test_fake
5
+ assert true
27
6
  end
28
7
  end
29
-
30
-
31
- # module CacheAdvance
32
- # class NamedCache
33
- # STORED_KEY = 'STORED_CACHES'
34
- #
35
- # def initialize(name, params, configuration, cache)
36
- # @name = name.to_s
37
- # @params = params
38
- # @configuration = configuration
39
- # @cache = cache
40
- # end
41
- #
42
- # def key_for(request, suffix='')
43
- # key = @name.dup
44
- # key << suffix.to_s
45
- #
46
- # qualifiers.each do |q|
47
- # if (qualifier = @configuration.qualifiers[q])
48
- # this_one = qualifier.call(request)
49
- # key << this_one.to_s unless this_one.nil?
50
- # end
51
- # end if qualifiers
52
- # key
53
- # end
54
- #
55
- # def value_for(request, options, &block)
56
- # key = key_for(request, options[:key])
57
- #
58
- # if (cache = @cache.read(key))
59
- # call_plugins('after_read', key, request)
60
- # return cache
61
- # end
62
- #
63
- # call_plugins('before_write', key, request)
64
- # result = block.call
65
- # @cache.write(key, result, rails_options)
66
- # call_plugins('after_write', key, request)
67
- #
68
- # add_to_cached_keys_list(key)
69
- #
70
- # result
71
- # end
72
- #
73
- # def rails_options
74
- # options = {}
75
- # options[:expires_in] = expiration_time if expiration_time
76
- # options
77
- # end
78
- #
79
- # def expire_for(type)
80
- # if expiration_types.include?(type)
81
- # expire_all
82
- # end
83
- # end
84
- #
85
- # def expire_all
86
- # if (data = @cache.read(@name + STORED_KEY))
87
- # data = Array(Marshal.load(data))
88
- # data.each { |key| @cache.delete(key) }
89
- # else
90
- # @cache.delete(@name)
91
- # end
92
- # end
93
- #
94
- # def expiration_types
95
- # Array(@params[:expiration_types])
96
- # end
97
- #
98
- # def expiration_time
99
- # @params[:expiration_time]
100
- # end
101
- #
102
- # def qualifiers
103
- # Array(@params[:qualifiers])
104
- # end
105
- #
106
- # protected
107
- #
108
- # def call_plugins(method, key, request)
109
- # @configuration.plugins.each { |p| p.send(method, @name, key, request) if p.respond_to?(method) }
110
- # end
111
- #
112
- # def add_to_cached_keys_list(key)
113
- # unless expiration_types.blank? || key == @name
114
- # if (data = @cache.read(@name + STORED_KEY))
115
- # data = Array(Marshal.load(data))
116
- # else
117
- # data = []
118
- # end
119
- # unless data.include?(key)
120
- # @cache.write(@name + STORED_KEY, Marshal.dump(data << key))
121
- # end
122
- # end
123
- # end
124
- # end
125
- # end
126
-
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class RailsCacheTest < Test::Unit::TestCase
4
+ def test_empty
5
+ assert true
6
+ end
7
+ end
data/test/test_helper.rb CHANGED
@@ -7,4 +7,3 @@ require 'ruby-debug'
7
7
 
8
8
  require 'cache_advance'
9
9
  require 'mocha'
10
- require 'cache_mock'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aub-cache_advance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aubrey Holland
@@ -22,30 +22,23 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - README.textile
24
24
  files:
25
- - README.textile
26
- - Rakefile
27
- - TODO.textile
28
- - cache_advance-1.0.9.gem
29
25
  - cache_advance.gemspec
30
- - lib/cache_advance.rb
31
26
  - lib/cache_advance/active_record_sweeper.rb
32
27
  - lib/cache_advance/cache_set.rb
33
- - lib/cache_advance/cached_key_list.rb
34
- - lib/cache_advance/lock.rb
35
28
  - lib/cache_advance/mapper.rb
36
29
  - lib/cache_advance/named_cache.rb
37
- - lib/cache_advance/named_cache_configuration.rb
30
+ - lib/cache_advance/rails_cache.rb
31
+ - lib/cache_advance.rb
38
32
  - rails/init.rb
33
+ - Rakefile
34
+ - README.textile
39
35
  - test/active_record_sweeper_test.rb
40
- - test/cache_mock.rb
41
36
  - test/cache_set_test.rb
42
37
  - test/mapper_test.rb
43
38
  - test/named_cache_test.rb
44
- - test/spec/db/schema.rb
45
- - test/spec/mapper_spec.rb
46
- - test/spec/mocks/memcache.rb
47
- - test/spec/spec_helper.rb
39
+ - test/rails_cache_test.rb
48
40
  - test/test_helper.rb
41
+ - TODO.textile
49
42
  has_rdoc: true
50
43
  homepage: http://github.com/aub/cache_advance
51
44
  post_install_message:
@@ -80,3 +73,4 @@ test_files:
80
73
  - test/cache_set_test.rb
81
74
  - test/mapper_test.rb
82
75
  - test/named_cache_test.rb
76
+ - test/rails_cache_test.rb
@@ -1,46 +0,0 @@
1
- module CacheAdvance
2
- class CachedKeyList
3
- def initialize(store, cache_key, expiration_time=nil)
4
- @store, @cache_key, @expiration_time = store, cache_key, expiration_time
5
- end
6
-
7
- def all_keys
8
- key_list.keys
9
- end
10
-
11
- def add_key(key)
12
- Lock.new(@store).execute_locked(@cache_key) do
13
- data = key_list
14
- unless data.has_key?(key)
15
- data[key] = @expiration_time.nil? ? nil : Time.now + @expiration_time
16
- @store.set(@cache_key, data)
17
- end
18
- end
19
- end
20
-
21
- def delete_key(key)
22
- Lock.new(@store).execute_locked(@cache_key) do
23
- data = key_list
24
- if data.has_key?(key)
25
- data.delete(key)
26
- @store.set(@cache_key, data)
27
- end
28
- end
29
- end
30
-
31
- def clear
32
- @store.set(@cache_key, {})
33
- end
34
-
35
- protected
36
-
37
- def key_list
38
- list = @store.get(@cache_key) || {}
39
- if @expiration_time
40
- now = Time.now
41
- list.delete_if { |k,v| v <= now }
42
- end
43
- list
44
- end
45
- end
46
- end
@@ -1,40 +0,0 @@
1
- module CacheAdvance
2
- class Lock
3
-
4
- class LockAcquisitionFailureException < Exception; end
5
-
6
- DEFAULT_RETRIES = 5
7
- DEFAULT_EXPIRATION_TIME = 30
8
-
9
- def initialize(store)
10
- @store = store
11
- end
12
-
13
- def execute_locked(key, lock_expiry = DEFAULT_EXPIRATION_TIME, retries = DEFAULT_RETRIES)
14
- begin
15
- acquire(key, lock_expiry, retries)
16
- yield
17
- ensure
18
- release_lock(key)
19
- end
20
- end
21
-
22
- def acquire(key, lock_expiry = DEFAULT_EXPIRATION_TIME, retries = DEFAULT_RETRIES)
23
- retries.times do |count|
24
- begin
25
- return if @store.set("lock/#{key}", Process.pid, lock_expiry) == "STORED\r\n"
26
- end
27
- exponential_sleep(count) unless count == retries - 1
28
- end
29
- raise LockAcquisitionFailureException, "Couldn't acquire memcache lock for: #{key}"
30
- end
31
-
32
- def release_lock(key)
33
- @store.delete("lock/#{key}")
34
- end
35
-
36
- def exponential_sleep(count)
37
- @runtime += Benchmark::measure { sleep((2**count) / 10.0) }
38
- end
39
- end
40
- end
@@ -1,7 +0,0 @@
1
- module CacheAdvance
2
- class NamedCacheConfiguration
3
- def initialize(options)
4
- @options = options
5
- end
6
- end
7
- end
data/test/cache_mock.rb DELETED
@@ -1,15 +0,0 @@
1
- module CacheAdvance
2
- class CacheMock
3
- def read(key)
4
- 'abc'
5
- end
6
-
7
- def write(key, value)
8
-
9
- end
10
-
11
- def delete(key)
12
-
13
- end
14
- end
15
- end
@@ -1,18 +0,0 @@
1
- ActiveRecord::Schema.define(:version => 1) do
2
- create_table "publications", :force => true do |t|
3
- t.string "name", "subdomain"
4
- end
5
-
6
- create_table "articles", :force => true do |t|
7
- t.references 'publication'
8
- t.string 'title'
9
- end
10
- end
11
-
12
- class Publication < ActiveRecord::Base
13
- has_many :articles
14
- end
15
-
16
- class Article < ActiveRecord::Base
17
- belongs_to :publication
18
- end
@@ -1,16 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- module CacheAdvance
4
- before :each do
5
- @cache_set = CacheSet.new
6
- @mapper = Mapper.new(@cache_set)
7
- end
8
-
9
- describe 'Mapper' do
10
- it 'should pass qualifiers directly to the cache set' do
11
- proc = Proc.new { 2 }
12
- @cache_set.should_receive(:add_qualifier).with(proc)
13
- @mapper.qualifier(:testy, proc)
14
- end
15
- end
16
- end
@@ -1,41 +0,0 @@
1
- class MemCache
2
- attr_reader :data
3
-
4
- def initialize
5
- @data = {}
6
- end
7
-
8
- def decr(key, amount = 1)
9
- end
10
-
11
- def get(key, raw = false)
12
- return @data[key]
13
- end
14
-
15
- def get_multi(*keys)
16
- end
17
-
18
- def incr(key, amount = 1)
19
- end
20
-
21
- def set(key, value, expiry = 0, raw = false)
22
- @data[key] = value
23
- end
24
-
25
- def add(key, value, expiry = 0, raw = false)
26
- end
27
-
28
- def delete(key, expiry = 0)
29
- @data.delete(key)
30
- end
31
-
32
- def flush_all
33
- end
34
-
35
- def reset
36
- @data = {}
37
- end
38
-
39
- def stats
40
- end
41
- end
@@ -1,30 +0,0 @@
1
- $: << File.join(File.dirname(__FILE__), '..', 'lib')
2
- $: << File.join(File.dirname(__FILE__))
3
-
4
- require 'rubygems'
5
- require 'ruby-debug'
6
-
7
- gem 'sqlite3-ruby'
8
- require 'spec'
9
- require 'cache_advance'
10
-
11
- require 'activerecord'
12
-
13
- ActiveRecord::Base.establish_connection(
14
- :adapter => 'sqlite3',
15
- :dbfile => ':memory:'
16
- )
17
-
18
- require File.join(File.dirname(__FILE__), 'db', 'schema')
19
- require File.join(File.dirname(__FILE__), 'mocks', 'memcache')
20
-
21
- Spec::Runner.configure do |config|
22
- # config.mock_with :rr
23
- config.before :each do
24
- @memcache = MemCache.new
25
-
26
- CacheAdvance.define_caches(@memcache) do |cache_config|
27
- cache_config.publication
28
- end
29
- end
30
- end