benny_cache 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,116 @@
1
+ require_relative "../spec_helper"
2
+
3
+ require 'mocha_standalone'
4
+
5
+ describe BennyCache::Model do
6
+ it "should exist" do
7
+ BennyCache::Model.should be_true
8
+ end
9
+
10
+ describe " " do
11
+ before(:each) do
12
+ @model = ModelCacheFake.new
13
+ @model.id = 1
14
+ @model.other_id = 123
15
+ @model.x = 12
16
+ @model.y = 36
17
+ @store = BennyCache::Cache.new
18
+ BennyCache::Config.store=@store
19
+ end
20
+
21
+ it "should fetch a model by id from cache" do
22
+ ModelCacheFake.expects(:find).with(1).returns(@model)
23
+
24
+ rv = ModelCacheFake.benny_model_cache(1)
25
+ rv.id.should == 1
26
+ end
27
+
28
+ it "should fetch a model by a lookup hash from cache" do
29
+ arel= Object.new
30
+ ModelCacheFake.expects(:where).with(:other_id => 123).returns(arel)
31
+ arel.expects(:first).returns(@model)
32
+ rv = ModelCacheFake.benny_model_cache(:other_id => 123)
33
+ rv.id.should == 1
34
+ end
35
+
36
+ it "should fire the after save callback when needed" do
37
+ ModelCacheFake.expects(:find).with(1).returns(@model)
38
+
39
+ rv = ModelCacheFake.benny_model_cache(1)
40
+ rv.id.should == 1
41
+ rv.id = 2
42
+ rv.expects(:benny_model_cache_delete)
43
+ rv.save
44
+
45
+ end
46
+
47
+ it "should clear the cache when destroyed" do
48
+ ModelCacheFake.expects(:find).with(1).returns(@model)
49
+
50
+ rv = ModelCacheFake.benny_model_cache(1)
51
+ rv.id.should == 1
52
+ rv.other_id = 123
53
+
54
+ key = 'Benny/ModelCacheFake/1'
55
+ okey = 'Benny/ModelCacheFake/other_id/123'
56
+ fkey = 'Benny/ModelCacheFake/x/12/y/36'
57
+
58
+ @store.expects(:delete).with(key)
59
+ @store.expects(:delete).with(okey)
60
+ @store.expects(:delete).with(fkey)
61
+ rv.destroy
62
+ end
63
+
64
+ it "should clear the cache when saved" do
65
+
66
+ ModelCacheFake.expects(:find).with(1).returns(@model)
67
+
68
+ rv = ModelCacheFake.benny_model_cache(1)
69
+ rv.id.should == 1
70
+ rv.other_id = 123
71
+
72
+ key = 'Benny/ModelCacheFake/1'
73
+ okey = 'Benny/ModelCacheFake/other_id/123'
74
+ fkey = 'Benny/ModelCacheFake/x/12/y/36'
75
+
76
+
77
+ @store.expects(:delete).with(key)
78
+ @store.expects(:delete).with(okey)
79
+ @store.expects(:delete).with(fkey)
80
+ rv.save
81
+ end
82
+
83
+ it "should fetch a model by a multi-field index" do
84
+ arel= Object.new
85
+ ModelCacheFake.expects(:where).with(:x => 12, :y => 36).returns(arel)
86
+ arel.expects(:first).returns(@model)
87
+ ModelCacheFake.benny_model_cache(:x => 12, :y => 36)
88
+ end
89
+
90
+ it "should fetch data with a yield block" do
91
+
92
+ stuff = @model.benny_data_cache(:stuff) do
93
+ @model.stuff
94
+ end
95
+
96
+ stuff.class.should == Array
97
+ stuff[0].should == :stuff1
98
+ end
99
+ end
100
+
101
+ it "should supports custom namespaces" do
102
+ @model = ModelCacheFakeWithNs.new
103
+ @model.id = 1
104
+
105
+ store = BennyCache::Cache.new
106
+ BennyCache::Config.store=store
107
+
108
+ ModelCacheFakeWithNs.expects(:find).with(1).returns(@model)
109
+
110
+ rv = ModelCacheFakeWithNs.benny_model_cache(1)
111
+ rv.id.should == 1
112
+
113
+ ModelCacheFakeWithNs.get_benny_model_ns.should == "Benny/custom_ns"
114
+
115
+ end
116
+ end
@@ -0,0 +1,63 @@
1
+ require_relative "../spec_helper"
2
+
3
+ require 'mocha_standalone'
4
+
5
+ describe BennyCache::Related do
6
+ it "should exist" do
7
+ BennyCache::Related.should be_true
8
+ end
9
+
10
+ describe "" do
11
+ before(:each) do
12
+ BennyCache::Config.store=BennyCache::Cache.new
13
+ end
14
+
15
+ it "should clear a related index when saved" do
16
+ @related = RelatedCacheFake.new
17
+ @related.model_id = '456'
18
+ @related.expects(:benny_cache_clear_related)
19
+ @related.save
20
+ end
21
+
22
+ it "should try to clear a related index when saved" do
23
+ @related = RelatedCacheFake.new
24
+ @related.model_id = '456'
25
+ ModelCacheFake.expects(:benny_data_cache_delete).with('456', 'stuff')
26
+ BennyCache::Config.store.expects(:delete).with('Benny/ModelCacheFake/456/method/method_to_cache')
27
+
28
+ @related.save
29
+ end
30
+
31
+ it "should clear a cache key" do
32
+ @related = RelatedCacheFake.new
33
+ @related.model_id = '456'
34
+ BennyCache::Config.store.expects(:delete).with('Benny/ModelCacheFake/456/method/method_to_cache')
35
+ BennyCache::Config.store.expects(:delete).with('Benny/ModelCacheFake/456/data/stuff')
36
+ @related.save
37
+ end
38
+
39
+ it "should clear a related method when saved" do
40
+
41
+ @model = ModelCacheFake.new
42
+
43
+ @model.id = 456
44
+ @model.method_to_cache :foo
45
+ @model.method_to_cache :bar
46
+
47
+ @related = RelatedCacheFake.new
48
+ @related.model_id = '456'
49
+
50
+ model_base_index = "Benny/ModelCacheFake/456/method/method_to_cache"
51
+ rv = BennyCache::Config.store.read(model_base_index)
52
+ rv.class.should == Array
53
+ rv.size.should == 2
54
+
55
+ @related.save
56
+
57
+ rv = BennyCache::Config.store.read(model_base_index)
58
+ rv.should be_nil
59
+
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,38 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.adapters.define 'gem' do
4
+ add_filter '/test/'
5
+ add_filter '/features/'
6
+ add_filter '/spec/'
7
+ add_filter '/autotest/'
8
+
9
+ add_group 'Binaries', '/bin/'
10
+ add_group 'Libraries', '/lib/'
11
+ add_group 'Extensions', '/ext/'
12
+ add_group 'Vendor Libraries', '/vendor/'
13
+ end
14
+
15
+ SimpleCov.start :gem
16
+ end
17
+
18
+ require_relative '../lib/benny_cache'
19
+ require_relative "./test_classes"
20
+
21
+ #
22
+ # This file was generated by the `rspec --init` command. Conventionally, all
23
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
24
+ # Require this file using `require "spec_helper"` to ensure that it is only
25
+ # loaded once.
26
+ #
27
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
28
+ RSpec.configure do |config|
29
+ config.treat_symbols_as_metadata_keys_with_true_values = true
30
+ config.run_all_when_everything_filtered = true
31
+ config.filter_run :focus
32
+ config.mock_with :mocha
33
+ # Run specs in random order to surface order dependencies. If you find an
34
+ # order dependency and want to debug it, you can fix the order by providing
35
+ # the seed, which is printed after each run.
36
+ # --seed 1234
37
+ config.order = 'random'
38
+ end
@@ -0,0 +1,73 @@
1
+ class ARFaker
2
+
3
+ def save
4
+ self.class.class_variable_get(:@@after_save_callbacks).each do |cb|
5
+ self.send(cb)
6
+ end
7
+ end
8
+
9
+ def destroy
10
+ self.class.class_variable_get(:@@after_destroy_callbacks).each do |cb|
11
+ self.send(cb)
12
+ end
13
+ end
14
+
15
+ def self.after_save(*methods)
16
+ unless self.class_variable_defined?(:@@after_save_callbacks)
17
+ self.class_variable_set(:@@after_save_callbacks, [])
18
+ end
19
+ self.class_variable_get(:@@after_save_callbacks).push(*methods)
20
+ end
21
+
22
+ def self.after_destroy(*methods)
23
+ unless self.class_variable_defined?(:@@after_destroy_callbacks)
24
+ self.class_variable_set(:@@after_destroy_callbacks, [])
25
+ end
26
+
27
+ self.class_variable_get(:@@after_destroy_callbacks).push(*methods)
28
+ end
29
+
30
+ end
31
+
32
+
33
+ class ModelCacheFake < ARFaker
34
+ include BennyCache::Model
35
+
36
+ attr_accessor :id, :other_id, :x, :y
37
+
38
+ benny_model_index :other_id, [:x, :y]
39
+ benny_data_index :stuff
40
+
41
+ def stuff
42
+ [:stuff1, :stuff2]
43
+ end
44
+
45
+ def method_to_cache_with_base_data
46
+ [:a, :b, :c]
47
+ end
48
+
49
+ def method_to_cache(*options)
50
+ return options
51
+ end
52
+ benny_method_index :method_to_cache, :method_to_cache_with_base_data
53
+
54
+ end
55
+
56
+ class ModelCacheFakeWithNs < ARFaker
57
+ include BennyCache::Model
58
+ benny_model_ns :custom_ns
59
+
60
+ attr_accessor :id, :other_id
61
+ end
62
+
63
+ class RelatedCacheFake < ARFaker
64
+ include BennyCache::Related
65
+ benny_related_index ":model_id/ModelCacheFake/stuff"
66
+
67
+ benny_related_method ":model_id/ModelCacheFake/method_to_cache"
68
+
69
+ attr_accessor :model_id
70
+
71
+ end
72
+
73
+
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: benny_cache
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steven Hilton
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mocha
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: ZenTest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: A model caching library with indirect cached clearing
79
+ email:
80
+ - mshiltonj@gmail.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - .rspec
87
+ - Gemfile
88
+ - LICENSE
89
+ - README.md
90
+ - Rakefile
91
+ - benny_cache.gemspec
92
+ - lib/benny_cache.rb
93
+ - lib/benny_cache/base.rb
94
+ - lib/benny_cache/cache.rb
95
+ - lib/benny_cache/config.rb
96
+ - lib/benny_cache/model.rb
97
+ - lib/benny_cache/related.rb
98
+ - lib/benny_cache/version.rb
99
+ - spec/models/cache_spec.rb
100
+ - spec/models/config_spec.rb
101
+ - spec/models/model_method_cache_spec.rb
102
+ - spec/models/model_spec.rb
103
+ - spec/models/related_spec.rb
104
+ - spec/spec_helper.rb
105
+ - spec/test_classes.rb
106
+ homepage: https://github.com/mshiltonj/benny_cache
107
+ licenses: []
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 1.8.24
127
+ signing_key:
128
+ specification_version: 3
129
+ summary: A model caching library with indirect cached clearing
130
+ test_files:
131
+ - spec/models/cache_spec.rb
132
+ - spec/models/config_spec.rb
133
+ - spec/models/model_method_cache_spec.rb
134
+ - spec/models/model_spec.rb
135
+ - spec/models/related_spec.rb
136
+ - spec/spec_helper.rb
137
+ - spec/test_classes.rb