aub-cache_advance 1.1.1 → 1.1.2

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 ADDED
@@ -0,0 +1,3 @@
1
+ rdoc
2
+ pkg
3
+ *.gem
data/CHANGELOG ADDED
@@ -0,0 +1,8 @@
1
+ 1.1.2
2
+
3
+ * Strip whitespace from keys in order to avoid errors from memcache.
4
+ * Symbolize cache names.
5
+
6
+ 1.1.1
7
+
8
+ * Fixed a bug where the enabled flag would expire, causing caches to be reenabled.
data/Rakefile CHANGED
@@ -1,62 +1,22 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'rake/testtask'
4
- require 'rake/rdoctask'
5
- require 'rake/gempackagetask'
6
- require 'date'
7
4
 
8
- desc 'Default: run unit tests.'
9
- task :default => :test
5
+ FileList['tasks/**/*.rake'].each { |file| load file }
10
6
 
11
- desc 'Test the system.'
12
- Rake::TestTask.new(:test) do |t|
13
- t.libs << 'lib'
14
- t.pattern = 'test/**/*_test.rb'
15
- t.verbose = true
16
- end
17
-
18
- desc 'Generate documentation for the system.'
19
- Rake::RDocTask.new(:rdoc) do |rdoc|
20
- rdoc.rdoc_dir = 'rdoc'
21
- rdoc.title = 'Cache Advance'
22
- rdoc.options << '--line-numbers' << '--inline-source' << "--main" << "README.textile"
23
- rdoc.rdoc_files.include('README.textile')
24
- rdoc.rdoc_files.include('lib/**/*.rb')
25
- end
26
-
27
- spec = Gem::Specification.new do |s|
28
- s.name = %q{cache_advance}
29
- s.version = "1.0.0"
30
- s.summary = %q{A system for spiffy declarative caching}
31
- s.description = %q{A system for spiffy declarative caching}
32
- s.homepage = 'http://github.com/aub/cache_advance'
33
-
34
- s.files = FileList['[A-Z]*', 'lib/**/*.rb', 'rails/**/*.rb', 'test/**/*.rb']
35
- s.require_path = 'lib'
36
- s.test_files = Dir[*['test/**/*_test.rb']]
37
-
38
- s.has_rdoc = true
39
- s.extra_rdoc_files = ["README.textile"]
40
- s.rdoc_options = ['--line-numbers', '--inline-source', "--main", "README.textile"]
41
-
42
- s.authors = ["Aubrey Holland"]
43
- s.email = %q{aubrey@patch.com}
7
+ task :default => 'test'
44
8
 
45
- s.platform = Gem::Platform::RUBY
46
- s.add_dependency(%q<activesupport>, [">= 1.0"])
47
- end
48
-
49
- Rake::GemPackageTask.new spec do |pkg|
50
- pkg.need_tar = true
51
- pkg.need_zip = true
52
- end
53
-
54
- desc "Clean files generated by rake tasks"
55
- task :clobber => [:clobber_rdoc, :clobber_package]
56
-
57
- desc "Generate a gemspec file"
58
- task :gemspec do
59
- File.open("#{spec.name}.gemspec", 'w') do |f|
60
- f.write spec.to_ruby
9
+ begin
10
+ require 'jeweler'
11
+ Jeweler::Tasks.new do |gemspec|
12
+ gemspec.name = 'cache_advance'
13
+ gemspec.summary = 'A declarative system for caching with ActiveRecord'
14
+ gemspec.email = 'aubreyholland@gmail.com'
15
+ gemspec.homepage = 'http://github.com/aub/cache_advance/tree/master'
16
+ gemspec.description = 'hmm'
17
+ gemspec.authors = ['Aubrey Holland']
61
18
  end
19
+ rescue LoadError
20
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
62
21
  end
22
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.1.2
data/lib/cache_advance.rb CHANGED
@@ -1,8 +1,6 @@
1
- require 'cache_advance/cache_set'
2
- require 'cache_advance/cached_key_list'
3
- require 'cache_advance/mapper'
4
- require 'cache_advance/named_cache'
5
- require 'cache_advance/named_cache_configuration'
1
+ %w( cache_set cached_key_list lock mapper named_cache named_cache_configuration).each do |file|
2
+ require File.join(File.dirname(__FILE__), 'cache_advance', file)
3
+ end
6
4
 
7
5
  module CacheAdvance
8
6
  class UnknownNamedCacheException < Exception; end
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  gem 'activerecord'
3
- require 'active_record'
3
+ require 'active_record/observer'
4
4
 
5
5
  module CacheAdvance
6
6
  class ActiveRecordSweeper < ::ActiveRecord::Observer
@@ -13,6 +13,7 @@ module CacheAdvance
13
13
  end
14
14
 
15
15
  def apply(cache_name, request, options, &block)
16
+ cache_name = cache_name.to_sym
16
17
  if CacheAdvance.caching_enabled
17
18
  named_cache = @named_caches[cache_name]
18
19
  raise UnknownNamedCacheException if named_cache.nil?
@@ -31,6 +32,7 @@ module CacheAdvance
31
32
  end
32
33
 
33
34
  def add_named_cache(name, options)
35
+ name = name.to_sym
34
36
  @named_caches[name] = NamedCache.new(name, options, self, @store)
35
37
  end
36
38
 
@@ -34,7 +34,7 @@ module CacheAdvance
34
34
  end
35
35
 
36
36
  def exponential_sleep(count)
37
- @runtime += Benchmark::measure { sleep((2**count) / 10.0) }
37
+ sleep((2**count) / 10.0)
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -1,3 +1,6 @@
1
+ gem 'activesupport'
2
+ require 'active_support/core_ext'
3
+
1
4
  module CacheAdvance
2
5
  class Mapper
3
6
  def initialize(cache_set)
@@ -102,7 +102,7 @@ module CacheAdvance
102
102
  (qualifier.call(request) || '').to_s
103
103
  end
104
104
  end.join('/')
105
- "#{@name}/#{suffix}/[#{qualifier_data}]"
105
+ "#{@name}/#{suffix}/[#{qualifier_data}]".gsub(/\s/, '')
106
106
  end
107
107
 
108
108
  def enabled_key
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
2
 
3
3
  require 'cache_advance/active_record_sweeper'
4
4
 
@@ -24,7 +24,7 @@ class ActiveRecordSweeperTest < Test::Unit::TestCase
24
24
  end
25
25
 
26
26
  def test_should_expire_caches_on_changes
27
- CacheAdvance::Caches.expects(:expire_for_class).with(:publication).times(3)
27
+ CacheAdvance.cache_set.expects(:expire_for_class).with(:publication).times(3)
28
28
  %w(after_create after_update after_destroy).each do |method|
29
29
  @sweeper.send(method, Publication.new)
30
30
  end
data/test/cache_mock.rb CHANGED
@@ -1,15 +1,21 @@
1
1
  module CacheAdvance
2
2
  class CacheMock
3
- def read(key)
4
- 'abc'
3
+ def initialize
4
+ @values = {}
5
+ end
6
+
7
+ def get(key)
8
+ @values[key]
5
9
  end
6
10
 
7
- def write(key, value)
8
-
11
+ def set(key, value, options={})
12
+ result = @values.has_key?(key) ? @values[key] : "STORED\r\n"
13
+ @values[key] = value
14
+ result
9
15
  end
10
16
 
11
17
  def delete(key)
12
-
18
+ @values[key] = nil
13
19
  end
14
20
  end
15
- end
21
+ end
@@ -6,7 +6,8 @@ require 'cache_advance/active_record_sweeper'
6
6
 
7
7
  class CacheSetTest < Test::Unit::TestCase
8
8
  def setup
9
- @cache_set = CacheAdvance::CacheSet.new
9
+ @cache = CacheAdvance::CacheMock.new
10
+ @cache_set = CacheAdvance::CacheSet.new(@cache)
10
11
  end
11
12
 
12
13
  def test_define_caches_should_yield_a_mapper
data/test/key_test.rb ADDED
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class KeyTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @cache = CacheAdvance::CacheMock.new
7
+ @cache_set = CacheAdvance::CacheSet.new(@cache)
8
+ end
9
+
10
+ def test_should_symbolize_the_cache_name
11
+ @cache_set.add_named_cache('booya', {})
12
+ assert_nothing_raised do
13
+ @cache_set.apply(:booya, nil, :key => 'abc') do
14
+ '123'
15
+ end
16
+ end
17
+ end
18
+
19
+ def test_should_symbolize_the_cache_name_when_using_it
20
+ @cache_set.add_named_cache(:booya, {})
21
+ assert_nothing_raised do
22
+ @cache_set.apply('booya', nil, :key => 'abc') do
23
+ '123'
24
+ end
25
+ end
26
+ end
27
+
28
+ def test_should_remove_whitespace_from_the_key
29
+ @cache_set.add_named_cache(:booya, {})
30
+ result = @cache_set.apply(:booya, nil, :key => 'abc def') do
31
+ '123'
32
+ end
33
+ assert_equal '123', @cache.get('booya/abcdef/[]')
34
+ assert_equal '123', result
35
+ @cache.set('booya/abcdef/[]', '234')
36
+ result = @cache_set.apply(:booya, nil, :key => 'abc def') do
37
+ '123'
38
+ end
39
+ assert_equal '234', result
40
+ end
41
+ end
data/test/mapper_test.rb CHANGED
@@ -6,7 +6,8 @@ end
6
6
  class MapperTest < Test::Unit::TestCase
7
7
 
8
8
  def setup
9
- @cache_set = CacheAdvance::CacheSet.new
9
+ @cache = CacheAdvance::CacheMock.new
10
+ @cache_set = CacheAdvance::CacheSet.new(@cache)
10
11
  @mapper = CacheAdvance::Mapper.new(@cache_set)
11
12
  end
12
13
 
@@ -8,8 +8,8 @@ class NamedCacheTest < Test::Unit::TestCase
8
8
 
9
9
  def test_key_for_in_basic_case
10
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')
11
+ assert_equal 'test_cache//[]', @named_cache.send(:key_for, @request)
12
+ assert_equal 'test_cache/suf/[]', @named_cache.send(:key_for, @request, 'suf')
13
13
  end
14
14
 
15
15
  def test_key_with_qualifiers
@@ -21,106 +21,9 @@ class NamedCacheTest < Test::Unit::TestCase
21
21
  def create_named_cache(options={})
22
22
  @name = options[:name] || 'test_cache'
23
23
  @params = {}
24
- @cache_set = CacheAdvance::CacheSet.new
25
24
  @cache = CacheAdvance::CacheMock.new
25
+ @cache_set = CacheAdvance::CacheSet.new(@cache)
26
26
  @named_cache = CacheAdvance::NamedCache.new(@name, @params, @cache_set, @cache)
27
27
  end
28
28
  end
29
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
-
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: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aubrey Holland
@@ -9,12 +9,12 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-08 00:00:00 -08:00
12
+ date: 2009-05-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: A system for spiffy declarative caching
17
- email: aubrey@patch.com
16
+ description: hmm
17
+ email: aubreyholland@gmail.com
18
18
  executables: []
19
19
 
20
20
  extensions: []
@@ -22,10 +22,12 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - README.textile
24
24
  files:
25
+ - .gitignore
26
+ - CHANGELOG
25
27
  - README.textile
26
28
  - Rakefile
27
29
  - TODO.textile
28
- - cache_advance.gemspec
30
+ - VERSION
29
31
  - lib/cache_advance.rb
30
32
  - lib/cache_advance/active_record_sweeper.rb
31
33
  - lib/cache_advance/cache_set.rb
@@ -38,21 +40,15 @@ files:
38
40
  - test/active_record_sweeper_test.rb
39
41
  - test/cache_mock.rb
40
42
  - test/cache_set_test.rb
43
+ - test/key_test.rb
41
44
  - test/mapper_test.rb
42
45
  - test/named_cache_test.rb
43
- - test/spec/db/schema.rb
44
- - test/spec/mapper_spec.rb
45
- - test/spec/mocks/memcache.rb
46
- - test/spec/spec_helper.rb
47
46
  - test/test_helper.rb
48
- has_rdoc: true
49
- homepage: http://github.com/aub/cache_advance
47
+ has_rdoc: false
48
+ homepage: http://github.com/aub/cache_advance/tree/master
50
49
  post_install_message:
51
50
  rdoc_options:
52
- - --line-numbers
53
- - --inline-source
54
- - --main
55
- - README.textile
51
+ - --charset=UTF-8
56
52
  require_paths:
57
53
  - lib
58
54
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -72,10 +68,13 @@ requirements: []
72
68
  rubyforge_project:
73
69
  rubygems_version: 1.2.0
74
70
  signing_key:
75
- specification_version: 2
76
- summary: A system for spiffy declarative caching
71
+ specification_version: 3
72
+ summary: A declarative system for caching with ActiveRecord
77
73
  test_files:
78
74
  - test/active_record_sweeper_test.rb
75
+ - test/cache_mock.rb
79
76
  - test/cache_set_test.rb
77
+ - test/key_test.rb
80
78
  - test/mapper_test.rb
81
79
  - test/named_cache_test.rb
80
+ - test/test_helper.rb
@@ -1,24 +0,0 @@
1
- Gem::Specification.new do |s|
2
- s.version = '1.1.1'
3
- s.date = %q{2009-01-08}
4
-
5
- s.name = %q{cache_advance}
6
- s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
7
- s.authors = ['Aubrey Holland']
8
- s.description = %q{A system for spiffy declarative caching}
9
- s.email = %q{aubrey@patch.com}
10
- s.files = %w(README.textile Rakefile TODO.textile 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)
11
- s.homepage = %q{http://github.com/aub/cache_advance}
12
- s.require_paths = ['lib']
13
- s.rubygems_version = %q{1.2.0}
14
- s.summary = %q{A system for spiffy declarative caching}
15
- s.has_rdoc = true
16
- s.extra_rdoc_files = ['README.textile']
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)
19
-
20
- if s.respond_to? :specification_version then
21
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
22
- s.specification_version = 2
23
- end
24
- 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