cache_back 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ pkg
20
20
  *.gemspec
21
21
 
22
22
  ## PROJECT::SPECIFIC
23
+ test/debug.log
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/staugaard/cache_back"
12
12
  gem.authors = ["Mick Staugaard"]
13
13
  gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ gem.add_development_dependency "mocha", ">= 0"
14
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
16
  end
16
17
  Jeweler::GemcutterTasks.new
@@ -21,7 +22,7 @@ end
21
22
  require 'rake/testtask'
22
23
  Rake::TestTask.new(:test) do |test|
23
24
  test.libs << 'lib' << 'test'
24
- test.pattern = 'test/**/test_*.rb'
25
+ test.pattern = 'test/**/*_test.rb'
25
26
  test.verbose = true
26
27
  end
27
28
 
@@ -29,7 +30,8 @@ begin
29
30
  require 'rcov/rcovtask'
30
31
  Rcov::RcovTask.new do |test|
31
32
  test.libs << 'test'
32
- test.pattern = 'test/**/test_*.rb'
33
+ test.pattern = 'test/**/*_test.rb'
34
+ test.rcov_opts << "--exclude \"test/*,gems/*,/Library/Ruby/*,config/*\" --rails"
33
35
  test.verbose = true
34
36
  end
35
37
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -3,6 +3,7 @@ require 'activesupport'
3
3
  module CacheBack
4
4
  autoload :ReadMixin, 'cache_back/read_mixin'
5
5
  autoload :WriteMixin, 'cache_back/write_mixin'
6
+ autoload :DirtyMixin, 'cache_back/dirty_mixin'
6
7
 
7
8
  module ConfigurationMixin
8
9
  def cache_back_version(version)
@@ -34,7 +35,9 @@ module CacheBack
34
35
  @cache_back_option = options
35
36
 
36
37
  include WriteMixin unless instance_methods.include?('store_in_cache_back')
37
- extend ReadMixin unless method_defined?(:find_one_with_cache_back!)
38
+ extend ReadMixin unless methods.include?('find_one_with_cache_back')
39
+ extend DirtyMixin unless methods.include?('cache_back_dirty_methods')
38
40
  end
41
+
39
42
  end
40
43
  end
@@ -0,0 +1,16 @@
1
+ module CacheBack
2
+ module DirtyMixin
3
+ def cache_back_dirty_methods(*method_names)
4
+ method_names.each do |method|
5
+ unless method_defined?("without_cache_back_update_#{method}")
6
+ alias_method("without_cache_back_update_#{method}", method)
7
+ define_method(method) do |*args|
8
+ result = send("without_cache_back_update_#{method}", *args)
9
+ store_in_cache_back
10
+ result
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -8,9 +8,9 @@ module CacheBack
8
8
  end
9
9
 
10
10
  def find_one_with_cache_back(id, options)
11
- record = CacheBack.cache.read(cache_back_key_for(id))
11
+ record = cache_safe?(options) ? CacheBack.cache.read(cache_back_key_for(id)) : nil
12
12
 
13
- unless record
13
+ if record.nil?
14
14
  record = find_one_without_cache_back(id, options)
15
15
  record.store_in_cache_back if record
16
16
  end
@@ -18,5 +18,11 @@ module CacheBack
18
18
  record
19
19
  end
20
20
 
21
+ private
22
+
23
+ def cache_safe?(options)
24
+ !options.has_key?(:select)
25
+ end
26
+
21
27
  end
22
28
  end
@@ -12,7 +12,9 @@ module CacheBack
12
12
  end
13
13
 
14
14
  def store_in_cache_back
15
- CacheBack.cache.write(cache_back_key, shallow_clone, self.class.inherited_cache_back_options) if cache_back_key
15
+ if !readonly? && cache_back_key
16
+ CacheBack.cache.write(cache_back_key, shallow_clone, self.class.inherited_cache_back_options)
17
+ end
16
18
  end
17
19
 
18
20
  def remove_from_cache_back
@@ -20,7 +22,7 @@ module CacheBack
20
22
  end
21
23
 
22
24
  def self.included(model_class)
23
- model_class.after_save :store_in_cache_back
25
+ #model_class.after_save :store_in_cache_back
24
26
  model_class.after_destroy :remove_from_cache_back
25
27
  end
26
28
  end
data/lib/cache_back.rb CHANGED
@@ -13,4 +13,9 @@ module CacheBack
13
13
  end
14
14
 
15
15
  ActiveRecord::Base.extend(CacheBack::ConfigurationMixin)
16
- ActionController::Dispatcher.middleware.use(CacheBack::Middleware)
16
+ begin
17
+ ActionController::Dispatcher.middleware.use(CacheBack::Middleware)
18
+ rescue NameError => e
19
+
20
+ end
21
+
data/test/database.yml ADDED
@@ -0,0 +1,7 @@
1
+ test:
2
+ adapter: mysql
3
+ encoding: utf8
4
+ database: cache_back_test
5
+ username: root
6
+ password:
7
+ socket: /tmp/mysql.sock
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class DirtyTest < ActiveSupport::TestCase
4
+ fixtures :blogs, :posts
5
+
6
+ Post.has_cache_back
7
+ Post.cache_back_dirty_methods :make_dirty!
8
+
9
+ should "update the cache when a dirty method is called" do
10
+ post = Post.first
11
+
12
+ pots = Post.find(post.id)
13
+ assert(Rails.cache.read(post.cache_back_key))
14
+
15
+ CacheBack.cache.expects(:write)
16
+ post.make_dirty!
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class FindOneTest < ActiveSupport::TestCase
4
+ fixtures :blogs, :posts
5
+
6
+ Post.has_cache_back
7
+
8
+ should "cache find(id) calls" do
9
+ post = Post.first
10
+ assert_nil(Rails.cache.read(post.cache_back_key))
11
+ Post.find(post.id)
12
+ assert(Rails.cache.read(post.cache_back_key))
13
+ Post.connection.expects(:select_all).never
14
+ Post.find(post.id)
15
+ end
16
+
17
+ should "not use cache when using the :select option" do
18
+ post = Post.first
19
+ assert_nil(Rails.cache.read(post.cache_back_key))
20
+
21
+ Post.find(post.id, :select => 'title')
22
+ assert_nil(Rails.cache.read(post.cache_back_key))
23
+
24
+ Post.find(post.id)
25
+ assert(Rails.cache.read(post.cache_back_key))
26
+
27
+ CacheBack.cache.expects(:read).never
28
+ Post.find(post.id, :select => 'title')
29
+ end
30
+ end
@@ -0,0 +1,2 @@
1
+ a_blog:
2
+ name: My Blog
@@ -0,0 +1,14 @@
1
+ few_comments_1:
2
+ post: has_two_comments
3
+ body: what ever body 1
4
+
5
+ few_comments_2:
6
+ post: has_two_comments
7
+ body: what ever body 2
8
+
9
+ <% (1..10000).each do |i| %>
10
+ many_comments_<%= i %>:
11
+ post: has_many_comments
12
+ body: what ever body <%= i %>
13
+ <% end %>
14
+
@@ -0,0 +1,11 @@
1
+ no_comments:
2
+ blog: a_blog
3
+ title: This post has no comments
4
+
5
+ has_two_comments:
6
+ blog: a_blog
7
+ title: This post has a few comments
8
+
9
+ has_many_comments:
10
+ blog: a_blog
11
+ title: A shit load of comments on this one
data/test/helper.rb CHANGED
@@ -1,10 +1,75 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
+ require 'mocha'
3
4
  require 'shoulda'
5
+ require 'active_support'
6
+ require 'active_record'
7
+ require 'active_record/fixtures'
8
+
9
+ ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
10
+ ActiveRecord::Base.establish_connection('test')
11
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
12
+
13
+ load(File.dirname(__FILE__) + "/schema.rb")
4
14
 
5
15
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
16
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
17
  require 'cache_back'
8
18
 
9
- class Test::Unit::TestCase
19
+ class ActiveSupport::TestCase
20
+ include ActiveRecord::TestFixtures
21
+
22
+ fixtures :all
23
+
24
+ setup :clear_cache
25
+
26
+ def create_fixtures(*table_names)
27
+ if block_given?
28
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) { yield }
29
+ else
30
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
31
+ end
32
+ end
33
+
34
+ # Turn off transactional fixtures if you're working with MyISAM tables in MySQL
35
+ self.use_transactional_fixtures = true
36
+
37
+ # Instantiated fixtures are slow, but give you @david where you otherwise would need people(:david)
38
+ self.use_instantiated_fixtures = false
39
+
40
+ # Add more helper methods to be used by all tests here...
41
+ def clear_cache
42
+ CacheBack.cache.reset!
43
+ Rails.cache.clear
44
+ end
45
+ end
46
+
47
+ ActiveSupport::TestCase.fixture_path = File.dirname(__FILE__) + "/fixtures/"
48
+ $LOAD_PATH.unshift(ActiveSupport::TestCase.fixture_path)
49
+
50
+ module Rails
51
+ module_function
52
+ CACHE = ActiveSupport::Cache::MemoryStore.new
53
+
54
+ def cache
55
+ CACHE
56
+ end
57
+ end
58
+
59
+ class Comment < ActiveRecord::Base
60
+ belongs_to :post
61
+ end
62
+
63
+ class Post < ActiveRecord::Base
64
+ belongs_to :blog
65
+ has_many :comments
66
+
67
+ def make_dirty!
68
+ self.updated_at = Time.now
69
+ self.connection.execute("UPDATE posts SET updated_at = '#{updated_at.utc.to_s(:db)}' WHERE id = #{id}")
70
+ end
71
+ end
72
+
73
+ class Blog < ActiveRecord::Base
74
+ has_many :posts
10
75
  end
data/test/schema.rb ADDED
@@ -0,0 +1,35 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of Active Record to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+
12
+ ActiveRecord::Schema.define(:version => 1) do
13
+
14
+ create_table "comments", :force => true do |t|
15
+ t.text "body"
16
+ t.integer "post_id"
17
+ t.datetime "created_at"
18
+ t.datetime "updated_at"
19
+ end
20
+
21
+ create_table "posts", :force => true do |t|
22
+ t.string "title"
23
+ t.integer "blog_id"
24
+ t.string "comments_cache_key"
25
+ t.datetime "created_at"
26
+ t.datetime "updated_at"
27
+ end
28
+
29
+ create_table "blogs", :force => true do |t|
30
+ t.string "name"
31
+ t.datetime "created_at"
32
+ t.datetime "updated_at"
33
+ end
34
+
35
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache_back
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mick Staugaard
@@ -22,6 +22,16 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: "0"
24
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
25
35
  description: A rewrite of cache money
26
36
  email: mick@staugaard.com
27
37
  executables: []
@@ -41,11 +51,18 @@ files:
41
51
  - lib/cache_back.rb
42
52
  - lib/cache_back/cache.rb
43
53
  - lib/cache_back/configuration_mixin.rb
54
+ - lib/cache_back/dirty_mixin.rb
44
55
  - lib/cache_back/middleware.rb
45
56
  - lib/cache_back/read_mixin.rb
46
57
  - lib/cache_back/write_mixin.rb
58
+ - test/database.yml
59
+ - test/dirty_test.rb
60
+ - test/find_one_test.rb
61
+ - test/fixtures/blogs.yml
62
+ - test/fixtures/comments.yml
63
+ - test/fixtures/posts.yml
47
64
  - test/helper.rb
48
- - test/test_cache_back.rb
65
+ - test/schema.rb
49
66
  has_rdoc: true
50
67
  homepage: http://github.com/staugaard/cache_back
51
68
  licenses: []
@@ -75,5 +92,7 @@ signing_key:
75
92
  specification_version: 3
76
93
  summary: A write back caching layer on active record
77
94
  test_files:
95
+ - test/dirty_test.rb
96
+ - test/find_one_test.rb
78
97
  - test/helper.rb
79
- - test/test_cache_back.rb
98
+ - test/schema.rb
@@ -1,7 +0,0 @@
1
- require 'helper'
2
-
3
- class TestCacheBack < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end