cache_back 0.2.0 → 0.3.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/.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