aub-cache_advance 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
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