find_cache 0.2.1 → 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.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/{CHANGE-LOG → CHANGE_LOG.rdoc} +18 -13
  6. data/Gemfile +4 -0
  7. data/README.rdoc +5 -47
  8. data/Rakefile +4 -36
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/find_cache.gemspec +29 -0
  12. data/lib/find_cache.rb +6 -1
  13. data/lib/find_cache/cacheable.rb +37 -12
  14. data/lib/find_cache/controller_garbage_collector.rb +17 -0
  15. data/lib/find_cache/counter_cache.rb +14 -0
  16. data/lib/find_cache/key_gen.rb +10 -6
  17. data/lib/find_cache/version.rb +1 -1
  18. metadata +93 -328
  19. data/MIT-LICENSE +0 -22
  20. data/lib/tasks/find_cache_tasks.rake +0 -4
  21. data/test/dummy/README.rdoc +0 -261
  22. data/test/dummy/Rakefile +0 -7
  23. data/test/dummy/app/assets/javascripts/application.js +0 -15
  24. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  25. data/test/dummy/app/controllers/application_controller.rb +0 -3
  26. data/test/dummy/app/helpers/application_helper.rb +0 -2
  27. data/test/dummy/app/models/comment.rb +0 -6
  28. data/test/dummy/app/models/post.rb +0 -7
  29. data/test/dummy/app/models/user.rb +0 -13
  30. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  31. data/test/dummy/config.ru +0 -4
  32. data/test/dummy/config/application.rb +0 -59
  33. data/test/dummy/config/boot.rb +0 -10
  34. data/test/dummy/config/database.yml +0 -25
  35. data/test/dummy/config/environment.rb +0 -5
  36. data/test/dummy/config/environments/development.rb +0 -39
  37. data/test/dummy/config/environments/production.rb +0 -67
  38. data/test/dummy/config/environments/test.rb +0 -40
  39. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  40. data/test/dummy/config/initializers/counter_cache_patch.rb +0 -19
  41. data/test/dummy/config/initializers/inflections.rb +0 -15
  42. data/test/dummy/config/initializers/mime_types.rb +0 -5
  43. data/test/dummy/config/initializers/secret_token.rb +0 -7
  44. data/test/dummy/config/initializers/session_store.rb +0 -8
  45. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  46. data/test/dummy/config/locales/en.yml +0 -5
  47. data/test/dummy/config/routes.rb +0 -58
  48. data/test/dummy/db/development.sqlite3 +0 -0
  49. data/test/dummy/db/migrate/20120824210455_create_users.rb +0 -10
  50. data/test/dummy/db/migrate/20120824210731_create_comments.rb +0 -11
  51. data/test/dummy/db/migrate/20120824210927_create_posts.rb +0 -13
  52. data/test/dummy/db/schema.rb +0 -43
  53. data/test/dummy/db/test.sqlite3 +0 -0
  54. data/test/dummy/log/test.log +0 -1793
  55. data/test/dummy/public/404.html +0 -26
  56. data/test/dummy/public/422.html +0 -26
  57. data/test/dummy/public/500.html +0 -25
  58. data/test/dummy/public/favicon.ico +0 -0
  59. data/test/dummy/script/rails +0 -6
  60. data/test/dummy/test/fixtures/comments.yml +0 -9
  61. data/test/dummy/test/fixtures/posts.yml +0 -13
  62. data/test/dummy/test/fixtures/users.yml +0 -9
  63. data/test/dummy/test/unit/comment_test.rb +0 -7
  64. data/test/dummy/test/unit/post_test.rb +0 -7
  65. data/test/dummy/test/unit/user_test.rb +0 -7
  66. data/test/dummy/tmp/cache/26E/540/User%2F1 +0 -0
  67. data/test/dummy/tmp/cache/26F/550/User%2F2 +0 -0
  68. data/test/dummy/tmp/cache/270/560/User%2F3 +0 -0
  69. data/test/dummy/tmp/cache/271/570/User%2F4 +0 -0
  70. data/test/dummy/tmp/cache/272/580/User%2F5 +0 -0
  71. data/test/dummy/tmp/cache/273/590/User%2F6 +0 -0
  72. data/test/dummy/tmp/cache/274/5A0/User%2F7 +0 -0
  73. data/test/dummy/tmp/cache/275/5B0/User%2F8 +0 -0
  74. data/test/dummy/tmp/cache/275/6E0/Post%2F1 +0 -0
  75. data/test/dummy/tmp/cache/276/5C0/User%2F9 +0 -0
  76. data/test/dummy/tmp/cache/276/6F0/Post%2F2 +0 -0
  77. data/test/dummy/tmp/cache/277/700/Post%2F3 +0 -0
  78. data/test/dummy/tmp/cache/29E/F20/User%2F10 +0 -0
  79. data/test/dummy/tmp/cache/29F/F30/User%2F11 +0 -0
  80. data/test/dummy/tmp/cache/29F/F40/User%2F20 +0 -0
  81. data/test/dummy/tmp/cache/2A0/F40/User%2F12 +0 -0
  82. data/test/dummy/tmp/cache/2A1/F50/User%2F13 +0 -0
  83. data/test/dummy/tmp/cache/2A2/F60/User%2F14 +0 -0
  84. data/test/dummy/tmp/cache/2A3/F70/User%2F15 +0 -0
  85. data/test/dummy/tmp/cache/2A4/F80/User%2F16 +0 -0
  86. data/test/dummy/tmp/cache/2A5/F90/User%2F17 +0 -0
  87. data/test/dummy/tmp/cache/2A6/FA0/User%2F18 +0 -0
  88. data/test/dummy/tmp/cache/2A7/FB0/User%2F19 +0 -0
  89. data/test/dummy/tmp/cache/3A8/070/Comment%2F7 +0 -0
  90. data/test/dummy/tmp/cache/3A9/080/Comment%2F8 +0 -0
  91. data/test/dummy/tmp/cache/3AA/090/Comment%2F9 +0 -0
  92. data/test/dummy/tmp/cache/3D2/D30/Comment%2F10 +0 -0
  93. data/test/dummy/tmp/cache/3D3/D50/Comment%2F20 +0 -0
  94. data/test/dummy/tmp/cache/3D4/D50/Comment%2F12 +0 -0
  95. data/test/dummy/tmp/cache/3D4/D70/Comment%2F30 +0 -0
  96. data/test/dummy/tmp/cache/3D5/D60/Comment%2F13 +0 -0
  97. data/test/dummy/tmp/cache/3D5/D70/Comment%2F22 +0 -0
  98. data/test/dummy/tmp/cache/3D5/D90/Comment%2F40 +0 -0
  99. data/test/dummy/tmp/cache/3D6/D70/Comment%2F14 +0 -0
  100. data/test/dummy/tmp/cache/3D6/D80/Comment%2F23 +0 -0
  101. data/test/dummy/tmp/cache/3D6/D90/Comment%2F32 +0 -0
  102. data/test/dummy/tmp/cache/3D6/DB0/Comment%2F50 +0 -0
  103. data/test/dummy/tmp/cache/3D7/D80/Comment%2F15 +0 -0
  104. data/test/dummy/tmp/cache/3D7/D90/Comment%2F24 +0 -0
  105. data/test/dummy/tmp/cache/3D7/DA0/Comment%2F33 +0 -0
  106. data/test/dummy/tmp/cache/3D7/DB0/Comment%2F42 +0 -0
  107. data/test/dummy/tmp/cache/3D7/DD0/Comment%2F60 +0 -0
  108. data/test/dummy/tmp/cache/3D8/DA0/Comment%2F25 +0 -0
  109. data/test/dummy/tmp/cache/3D8/DB0/Comment%2F34 +0 -0
  110. data/test/dummy/tmp/cache/3D8/DC0/Comment%2F43 +0 -0
  111. data/test/dummy/tmp/cache/3D8/DD0/Comment%2F52 +0 -0
  112. data/test/dummy/tmp/cache/3D8/DF0/Comment%2F70 +0 -0
  113. data/test/dummy/tmp/cache/3D9/DA0/Comment%2F17 +0 -0
  114. data/test/dummy/tmp/cache/3D9/DC0/Comment%2F35 +0 -0
  115. data/test/dummy/tmp/cache/3D9/DD0/Comment%2F44 +0 -0
  116. data/test/dummy/tmp/cache/3D9/DE0/Comment%2F53 +0 -0
  117. data/test/dummy/tmp/cache/3D9/DF0/Comment%2F62 +0 -0
  118. data/test/dummy/tmp/cache/3D9/E10/Comment%2F80 +0 -0
  119. data/test/dummy/tmp/cache/3DA/DB0/Comment%2F18 +0 -0
  120. data/test/dummy/tmp/cache/3DA/DC0/Comment%2F27 +0 -0
  121. data/test/dummy/tmp/cache/3DA/DE0/Comment%2F45 +0 -0
  122. data/test/dummy/tmp/cache/3DA/DF0/Comment%2F54 +0 -0
  123. data/test/dummy/tmp/cache/3DA/E00/Comment%2F63 +0 -0
  124. data/test/dummy/tmp/cache/3DA/E10/Comment%2F72 +0 -0
  125. data/test/dummy/tmp/cache/3DB/DC0/Comment%2F19 +0 -0
  126. data/test/dummy/tmp/cache/3DB/DD0/Comment%2F28 +0 -0
  127. data/test/dummy/tmp/cache/3DB/DE0/Comment%2F37 +0 -0
  128. data/test/dummy/tmp/cache/3DB/E00/Comment%2F55 +0 -0
  129. data/test/dummy/tmp/cache/3DB/E10/Comment%2F64 +0 -0
  130. data/test/dummy/tmp/cache/3DB/E20/Comment%2F73 +0 -0
  131. data/test/dummy/tmp/cache/3DB/E30/Comment%2F82 +0 -0
  132. data/test/dummy/tmp/cache/3DC/DE0/Comment%2F29 +0 -0
  133. data/test/dummy/tmp/cache/3DC/DF0/Comment%2F38 +0 -0
  134. data/test/dummy/tmp/cache/3DC/E00/Comment%2F47 +0 -0
  135. data/test/dummy/tmp/cache/3DC/E20/Comment%2F65 +0 -0
  136. data/test/dummy/tmp/cache/3DC/E30/Comment%2F74 +0 -0
  137. data/test/dummy/tmp/cache/3DC/E40/Comment%2F83 +0 -0
  138. data/test/dummy/tmp/cache/3DD/E00/Comment%2F39 +0 -0
  139. data/test/dummy/tmp/cache/3DD/E10/Comment%2F48 +0 -0
  140. data/test/dummy/tmp/cache/3DD/E20/Comment%2F57 +0 -0
  141. data/test/dummy/tmp/cache/3DD/E40/Comment%2F75 +0 -0
  142. data/test/dummy/tmp/cache/3DD/E50/Comment%2F84 +0 -0
  143. data/test/dummy/tmp/cache/3DE/E20/Comment%2F49 +0 -0
  144. data/test/dummy/tmp/cache/3DE/E30/Comment%2F58 +0 -0
  145. data/test/dummy/tmp/cache/3DE/E40/Comment%2F67 +0 -0
  146. data/test/dummy/tmp/cache/3DE/E60/Comment%2F85 +0 -0
  147. data/test/dummy/tmp/cache/3DF/E40/Comment%2F59 +0 -0
  148. data/test/dummy/tmp/cache/3DF/E50/Comment%2F68 +0 -0
  149. data/test/dummy/tmp/cache/3DF/E60/Comment%2F77 +0 -0
  150. data/test/dummy/tmp/cache/3E0/E60/Comment%2F69 +0 -0
  151. data/test/dummy/tmp/cache/3E0/E70/Comment%2F78 +0 -0
  152. data/test/dummy/tmp/cache/3E1/E80/Comment%2F79 +0 -0
  153. data/test/dummy/tmp/cache/58D/B70/Post%2Fuser_id-1 +0 -1
  154. data/test/find_cache_test.rb +0 -57
  155. data/test/test_helper.rb +0 -16
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0e3782dcb68c139414274ce55f68926dda51f50d
4
+ data.tar.gz: 9ad0deb39629afb762d126f5671ffe3969e5092b
5
+ SHA512:
6
+ metadata.gz: 4f6652bc3ab5e060eddb69ef4fb1dd49ce7c2e98801a4d0027e8050cfd5b14b04a3d76b68991ef3764ec9fb7f4b0b8d6790a6296cd5dd40ebc19623f657dcfc9
7
+ data.tar.gz: 0d8a10d0ea7497e575ad210c4453eaccf9ea08064af6930d4e6053aaf743ded92e2af03d975b8c44dc4b41136a79c4994d955a4e7ad2f7f85250b3de7ffcb8b0
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.3
4
+ before_install: gem install bundler -v 1.10.6
@@ -1,34 +1,39 @@
1
- version 0.2.1
2
- # fixed expire_find_cache bug (whic occured in v0.2.0)
1
+ == CHANGE LOG
2
+ == version 0.3.0
3
+ # moved unit test to rspec tests
4
+ # auto handling counter_cache
5
+ # auto expires cache on reload
6
+ # controller based garbage collector added for find_cache data
3
7
 
4
- version 0.2.0
8
+ == version 0.2.1
9
+ # fixed expire_find_cache bug (which occured in v0.2.0)
10
+
11
+ == version 0.2.0
5
12
  # find_by_id and find_all_by_id methods converted to where queries for rails 4
6
13
  # id based queries replaced with primary_key based queries
7
14
 
8
- version 0.1.8
15
+ == version 0.1.8
9
16
  # local memorization on dynamic methods removed to prevent duplicate caching
10
17
 
11
- version 0.1.7
18
+ == version 0.1.7
12
19
  # code cleanup and documentation
13
20
 
14
- version 0.1.6
21
+ == version 0.1.6
15
22
  # after_commit on: :create, :update, :save instead of after_create, after_update, after_save callbacks
16
23
  # fix thread cache key for dynamic class methods
17
24
 
18
- version 0.1.5
25
+ == version 0.1.5
19
26
  # naming fix
20
27
 
21
- version 0.1.4
28
+ == version 0.1.4
22
29
  # cache key bug fix
23
30
 
24
- version 0.1.3
31
+ == version 0.1.3
25
32
  # dependency updates to make it usable for all activerecord >3.0.0
26
33
 
27
- version 0.1.0
34
+ == version 0.1.0
28
35
  # 2012-08-25 Go public
29
36
  # 2012-08-24 Added some tests
30
37
  # 2012-08-23 Added thread safe cache method KeyGen.global_cache_key
31
38
 
32
- version 0.0.1 (private)
33
- # 2012-07-14 First release for http://videofork.com/
34
- # YYYY-MM-DD Date format
39
+ == version 0.0.1 (private)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in find_cache.gemspec
4
+ gemspec
@@ -1,6 +1,6 @@
1
1
  == FindCache
2
2
 
3
- It is simply an ActiveRecord object caching gem using Rails.cache methods.
3
+ It is simply a thread-safe ActiveRecord object caching gem using Rails.cache methods.
4
4
 
5
5
  It makes "ActiveRecord 'find_by_id, find_by_(attr)' methods and 'has_one, belongs_to' relations" cacheable by PrimaryKey(PK) or any referenced columns using Rails.cache methods. It also supports fetching multiple records using PKs(ids) with find_all_cache method(if cache store supports multiple reads [hint: memcached_store, dalli_store supports.]).
6
6
 
@@ -47,58 +47,16 @@ Or install it yourself as:
47
47
  user.user_detail # fetches from DB
48
48
 
49
49
  == For fetching multiple ids
50
-
50
+
51
51
  users = User.find_all_cache([1,2,3,4,5])
52
-
52
+ users_ordered_desc = User.find_all_cache([4,5,1,2,3], 'id DESC')
53
+ users_ordered_asc = User.find_all_cache([4,5,1,2,3], 'id ASC')
54
+
53
55
  == For fetching a record by attribute
54
56
 
55
57
  user_detail = UserDetail.find_by_user_id(1) # from db
56
58
  user_detail = UserDetail.find_cache_by_ref(:user_id, 1) # from cache store
57
59
 
58
- == For counter_cache 'cache invalidation'
59
-
60
- ### Create a ruby file under config/initializers and add the following codes:
61
-
62
- module ActiveRecord
63
- module CounterCache
64
- def increment_counter(counter_name, id)
65
- expire_find_cache(name, id)
66
- update_counters(id, counter_name => 1)
67
- end
68
-
69
- def decrement_counter(counter_name, id)
70
- expire_find_cache(name, id)
71
- update_counters(id, counter_name => -1)
72
- end
73
-
74
- def expire_find_cache(name, id)
75
- key = FindCache::KeyGen.cache_key(name, id)
76
- Rails.cache.delete(key)
77
- $find_cache_store[FindCache::KeyGen.global_cache_key].delete(key)
78
- end
79
- end
80
- end
81
-
82
- == Notes
83
-
84
- If your worker thread does not kill itself after execution you should clean the find_cache_store manually. It can be done simple in ApplicationController of your rails app adding this method as after_filter
85
-
86
- after_filter :clear_find_cache_store
87
-
88
- def clear_find_cache_store
89
- FindCache::KeyGen.clear_find_cache_store
90
- end
91
-
92
- Tested with dalli (https://github.com/mperham/dalli).
93
-
94
- == Todo
95
-
96
- More tests!
97
-
98
- == Credits
99
-
100
- FindCache is part of http://videofork.com project.
101
-
102
60
  == Contributing
103
61
 
104
62
  1. Fork it
data/Rakefile CHANGED
@@ -1,38 +1,6 @@
1
- #!/usr/bin/env rake
2
- begin
3
- require 'bundler/setup'
4
- rescue LoadError
5
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
- end
7
- begin
8
- require 'rdoc/task'
9
- rescue LoadError
10
- require 'rdoc/rdoc'
11
- require 'rake/rdoctask'
12
- RDoc::Task = Rake::RDocTask
13
- end
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
14
3
 
15
- RDoc::Task.new(:rdoc) do |rdoc|
16
- rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = 'FindCache'
18
- rdoc.options << '--line-numbers'
19
- rdoc.rdoc_files.include('README.rdoc')
20
- rdoc.rdoc_files.include('lib/**/*.rb')
21
- end
4
+ RSpec::Core::RakeTask.new(:spec)
22
5
 
23
-
24
-
25
-
26
- Bundler::GemHelper.install_tasks
27
-
28
- require 'rake/testtask'
29
-
30
- Rake::TestTask.new(:test) do |t|
31
- t.libs << 'lib'
32
- t.libs << 'test'
33
- t.pattern = 'test/**/*_test.rb'
34
- t.verbose = false
35
- end
36
-
37
-
38
- task :default => :test
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "find_cache"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'find_cache/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "find_cache"
8
+ spec.version = FindCache::VERSION
9
+ spec.authors = ["Mustafa Turan"]
10
+ spec.email = ["mustafaturan.net@gmail.com"]
11
+ spec.homepage = "https://github.com/mustafaturan/find_cache"
12
+ spec.summary = "Thread-safe cache for ActiveRecord >=3.0.0 find_by_PrimaryKey(id) and find_by_(attr) methods and models based on Rails.cache methods."
13
+ spec.description = "Makes ActiveRecord 'find_by_id, find_by_(attr)' methods and 'has_one, belongs_to' relations are cacheable by PrimaryKey(PK) or any referenced columns using Rails.cache methods. It also supports fetching multiple records using PKs(ids) with find_all_cache method(if cache store supports multiple reads [hint: memcached_store, dalli_store supports.])."
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "activerecord", [">= 3.0.0"]
21
+ spec.add_dependency "activesupport", [">= 3.0.0"]
22
+ spec.add_dependency "railties", [">= 3.0.0"]
23
+ spec.add_development_dependency "bundler", "~> 1.10"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.4.0"
26
+ spec.add_development_dependency "factory_girl", "~> 4.5.0"
27
+ spec.add_development_dependency "sqlite3", "~> 1.3.11"
28
+ spec.add_development_dependency "database_cleaner", "~> 1.5.1"
29
+ end
@@ -1,6 +1,11 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ require "rails"
2
3
  require "active_support"
3
4
  require "active_record"
5
+ require "action_controller"
6
+ require "find_cache/version"
4
7
  require "find_cache/init"
5
8
  require "find_cache/key_gen"
6
- require "find_cache/cacheable"
9
+ require "find_cache/counter_cache"
10
+ require "find_cache/cacheable"
11
+ require "find_cache/controller_garbage_collector"
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module FindCache
3
-
3
+
4
4
  # = FindCache Cachable
5
5
  module Cacheable
6
6
  extend ActiveSupport::Concern
@@ -16,14 +16,14 @@ module FindCache
16
16
  #
17
17
  # ==== Examples
18
18
  #
19
- # # For User model with user_id FroeignKey in UserDetail model
19
+ # # For User model with user_id ForeignKey in UserDetail model
20
20
  # find_cache_has_one :user_detail, UserDetail, :user_id
21
21
  def find_cache_has_one(attribute, model, foreign_key)
22
22
  send :define_method, attribute.to_sym do |*args|
23
23
  model.find_cache_by_ref(foreign_key, self.send(self.class.primary_key.to_sym))
24
24
  end
25
25
  end
26
-
26
+
27
27
  # belongs_to relational caching with find_cache
28
28
  #
29
29
  # ==== Parameters
@@ -34,7 +34,7 @@ module FindCache
34
34
  #
35
35
  # ==== Examples
36
36
  #
37
- # # In UserDetail model with user_id FroeignKey of User model
37
+ # # In UserDetail model with user_id ForeignKey of User model
38
38
  # find_cache_belongs_to :user, User, :user_id
39
39
  def find_cache_belongs_to(attribute, model, foreign_key)
40
40
  send :define_method, attribute.to_sym do |*args|
@@ -88,7 +88,6 @@ module FindCache
88
88
  end
89
89
  end
90
90
 
91
-
92
91
  # To find all Active Record objects using id list
93
92
  #
94
93
  # ==== Parameters
@@ -127,16 +126,42 @@ module FindCache
127
126
  all_new_cache.each do |cached_item|
128
127
  $find_cache_store[KeyGen.global_cache_key][KeyGen.cache_key(name, cached_item.send(primary_key.to_sym))] = cached_item
129
128
  end
130
- end
129
+ order_attr, order_direction = order_by.split(' ')
130
+ ordered_cache = all_new_cache.sort_by { |item| item.send(order_attr) }
131
+ order_direction.eql?('DESC') ? ordered_cache.reverse : ordered_cache
132
+ end
133
+
134
+ # Expire cache for given name and pk val
135
+ #
136
+ # ==== Parameters
137
+ #
138
+ # * +pk_val+ - pk val
139
+ #
140
+ def expire_find_cache(pk_val)
141
+ key = KeyGen.cache_key(name, pk_val)
142
+ Rails.cache.delete(key)
143
+ $find_cache_store[KeyGen.global_cache_key].delete(key)
144
+ end
131
145
  end
132
-
146
+
133
147
  included do
134
- after_commit :expire_find_cache
135
-
148
+ after_save :expire_find_cache
149
+ after_destroy :expire_find_cache
150
+
151
+ # Expires the cache on reload
152
+ #
153
+ def reload
154
+ expire_find_cache
155
+ super
156
+ end
157
+
158
+ # Expires the cache
159
+ #
136
160
  def expire_find_cache
137
- key = KeyGen.cache_key(self.class.name, self.send(self.class.primary_key.to_sym))
138
- Rails.cache.delete(key)
139
- $find_cache_store[KeyGen.global_cache_key].delete(key)
161
+ return if self.class.primary_key.blank?
162
+ self.class.expire_find_cache(
163
+ self.send(self.class.primary_key.to_sym)
164
+ )
140
165
  end
141
166
  end
142
167
  end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module FindCache
3
+ # = FindCache ControllerGarbageCollector
4
+ module ControllerGarbageCollector
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ # Garbage collector for current thread
9
+ after_filter :clear_find_cache_store
10
+
11
+ def clear_find_cache_store
12
+ FindCache::KeyGen.clear_find_cache_store
13
+ end
14
+ end
15
+ end
16
+ end
17
+ ActionController::Base.send :include, FindCache::ControllerGarbageCollector
@@ -0,0 +1,14 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module FindCache
3
+ # = FindCache ControllerGarbageCollector
4
+ module CounterCache
5
+ extend ActiveSupport::Concern
6
+ module ClassMethods
7
+ def update_counters(id, counters)
8
+ super
9
+ expire_find_cache(id)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ ActiveRecord::Base.send :include, FindCache::CounterCache
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module FindCache
3
+ # = FindCache KeyGen
3
4
  class KeyGen
4
- require "simple_uuid"
5
5
 
6
6
  # cache_key generator for model items
7
7
  #
@@ -46,11 +46,7 @@ module FindCache
46
46
  # FindCache::KeyGen.global_cache_key(true)
47
47
  def self.global_cache_key(clear = false)
48
48
  return (Thread.current[:global_cache_key] = nil) if clear
49
- Thread.current[:global_cache_key] ||= (
50
- t = SimpleUUID::UUID.new(Time.now).to_i.to_s(16).rjust(32, "0")
51
- $find_cache_store[t] = {}
52
- t
53
- )
49
+ Thread.current[:global_cache_key] ||= generate_uuid_and_init_cache_hash
54
50
  end
55
51
 
56
52
  # Cleaning all caches of the current Thread not the Rails.cache
@@ -59,5 +55,13 @@ module FindCache
59
55
  $find_cache_store.delete(KeyGen.global_cache_key)
60
56
  KeyGen.global_cache_key(true)
61
57
  end
58
+
59
+ private
60
+ #nodoc
61
+ def self.generate_uuid_and_init_cache_hash
62
+ uuid = SecureRandom.uuid.gsub('-', '')
63
+ $find_cache_store[uuid] = {}
64
+ uuid
65
+ end
62
66
  end
63
67
  end
@@ -1,4 +1,4 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module FindCache
3
- VERSION = "0.2.1"
3
+ VERSION = "0.3.0"
4
4
  end
metadata CHANGED
@@ -1,426 +1,191 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: find_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mustafa Turan
9
8
  autorequire:
10
- bindir: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
- date: 2012-09-23 00:00:00.000000000 Z
11
+ date: 2015-11-21 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activerecord
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: 3.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 3.0.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activesupport
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: 3.0.0
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: 3.0.0
46
41
  - !ruby/object:Gem::Dependency
47
- name: simple_uuid
42
+ name: railties
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
- version: 0.2.0
47
+ version: 3.0.0
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
60
67
  - !ruby/object:Gem::Version
61
- version: 0.2.0
68
+ version: '1.10'
62
69
  - !ruby/object:Gem::Dependency
63
- name: rails
70
+ name: rake
64
71
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
72
  requirements:
67
- - - ~>
73
+ - - "~>"
68
74
  - !ruby/object:Gem::Version
69
- version: 3.2.0
75
+ version: '10.0'
70
76
  type: :development
71
77
  prerelease: false
72
78
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
79
  requirements:
75
- - - ~>
80
+ - - "~>"
76
81
  - !ruby/object:Gem::Version
77
- version: 3.2.0
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.4.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.4.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_girl
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 4.5.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 4.5.0
78
111
  - !ruby/object:Gem::Dependency
79
112
  name: sqlite3
80
113
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
114
  requirements:
83
- - - ! '>='
115
+ - - "~>"
84
116
  - !ruby/object:Gem::Version
85
- version: '0'
117
+ version: 1.3.11
86
118
  type: :development
87
119
  prerelease: false
88
120
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
121
  requirements:
91
- - - ! '>='
122
+ - - "~>"
92
123
  - !ruby/object:Gem::Version
93
- version: '0'
124
+ version: 1.3.11
94
125
  - !ruby/object:Gem::Dependency
95
- name: dalli
126
+ name: database_cleaner
96
127
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
128
  requirements:
99
- - - ~>
129
+ - - "~>"
100
130
  - !ruby/object:Gem::Version
101
- version: 2.1.0
131
+ version: 1.5.1
102
132
  type: :development
103
133
  prerelease: false
104
134
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
135
  requirements:
107
- - - ~>
136
+ - - "~>"
108
137
  - !ruby/object:Gem::Version
109
- version: 2.1.0
110
- description: ! 'Makes ActiveRecord >=3.0.0 ''find_by_id, find_by_(attr)'' methods
111
- and ''has_one, belongs_to relations'' cacheable by PK(id) or any referenced columns
138
+ version: 1.5.1
139
+ description: 'Makes ActiveRecord ''find_by_id, find_by_(attr)'' methods and ''has_one,
140
+ belongs_to'' relations are cacheable by PrimaryKey(PK) or any referenced columns
112
141
  using Rails.cache methods. It also supports fetching multiple records using PKs(ids)
113
- with find_all_cache method(if cache store supports multiple reads [hint: memcache_store,
114
- dalli_store support.]).'
142
+ with find_all_cache method(if cache store supports multiple reads [hint: memcached_store,
143
+ dalli_store supports.]).'
115
144
  email:
116
145
  - mustafaturan.net@gmail.com
117
146
  executables: []
118
147
  extensions: []
119
148
  extra_rdoc_files: []
120
149
  files:
150
+ - ".gitignore"
151
+ - ".rspec"
152
+ - ".travis.yml"
153
+ - CHANGE_LOG.rdoc
154
+ - Gemfile
155
+ - README.rdoc
156
+ - Rakefile
157
+ - bin/console
158
+ - bin/setup
159
+ - find_cache.gemspec
160
+ - lib/find_cache.rb
121
161
  - lib/find_cache/cacheable.rb
162
+ - lib/find_cache/controller_garbage_collector.rb
163
+ - lib/find_cache/counter_cache.rb
122
164
  - lib/find_cache/init.rb
123
165
  - lib/find_cache/key_gen.rb
124
166
  - lib/find_cache/version.rb
125
- - lib/find_cache.rb
126
- - lib/tasks/find_cache_tasks.rake
127
- - CHANGE-LOG
128
- - MIT-LICENSE
129
- - Rakefile
130
- - README.rdoc
131
- - test/dummy/app/assets/javascripts/application.js
132
- - test/dummy/app/assets/stylesheets/application.css
133
- - test/dummy/app/controllers/application_controller.rb
134
- - test/dummy/app/helpers/application_helper.rb
135
- - test/dummy/app/models/comment.rb
136
- - test/dummy/app/models/post.rb
137
- - test/dummy/app/models/user.rb
138
- - test/dummy/app/views/layouts/application.html.erb
139
- - test/dummy/config/application.rb
140
- - test/dummy/config/boot.rb
141
- - test/dummy/config/database.yml
142
- - test/dummy/config/environment.rb
143
- - test/dummy/config/environments/development.rb
144
- - test/dummy/config/environments/production.rb
145
- - test/dummy/config/environments/test.rb
146
- - test/dummy/config/initializers/backtrace_silencers.rb
147
- - test/dummy/config/initializers/counter_cache_patch.rb
148
- - test/dummy/config/initializers/inflections.rb
149
- - test/dummy/config/initializers/mime_types.rb
150
- - test/dummy/config/initializers/secret_token.rb
151
- - test/dummy/config/initializers/session_store.rb
152
- - test/dummy/config/initializers/wrap_parameters.rb
153
- - test/dummy/config/locales/en.yml
154
- - test/dummy/config/routes.rb
155
- - test/dummy/config.ru
156
- - test/dummy/db/development.sqlite3
157
- - test/dummy/db/migrate/20120824210455_create_users.rb
158
- - test/dummy/db/migrate/20120824210731_create_comments.rb
159
- - test/dummy/db/migrate/20120824210927_create_posts.rb
160
- - test/dummy/db/schema.rb
161
- - test/dummy/db/test.sqlite3
162
- - test/dummy/log/test.log
163
- - test/dummy/public/404.html
164
- - test/dummy/public/422.html
165
- - test/dummy/public/500.html
166
- - test/dummy/public/favicon.ico
167
- - test/dummy/Rakefile
168
- - test/dummy/README.rdoc
169
- - test/dummy/script/rails
170
- - test/dummy/test/fixtures/comments.yml
171
- - test/dummy/test/fixtures/posts.yml
172
- - test/dummy/test/fixtures/users.yml
173
- - test/dummy/test/unit/comment_test.rb
174
- - test/dummy/test/unit/post_test.rb
175
- - test/dummy/test/unit/user_test.rb
176
- - test/dummy/tmp/cache/26E/540/User%2F1
177
- - test/dummy/tmp/cache/26F/550/User%2F2
178
- - test/dummy/tmp/cache/270/560/User%2F3
179
- - test/dummy/tmp/cache/271/570/User%2F4
180
- - test/dummy/tmp/cache/272/580/User%2F5
181
- - test/dummy/tmp/cache/273/590/User%2F6
182
- - test/dummy/tmp/cache/274/5A0/User%2F7
183
- - test/dummy/tmp/cache/275/5B0/User%2F8
184
- - test/dummy/tmp/cache/275/6E0/Post%2F1
185
- - test/dummy/tmp/cache/276/5C0/User%2F9
186
- - test/dummy/tmp/cache/276/6F0/Post%2F2
187
- - test/dummy/tmp/cache/277/700/Post%2F3
188
- - test/dummy/tmp/cache/29E/F20/User%2F10
189
- - test/dummy/tmp/cache/29F/F30/User%2F11
190
- - test/dummy/tmp/cache/29F/F40/User%2F20
191
- - test/dummy/tmp/cache/2A0/F40/User%2F12
192
- - test/dummy/tmp/cache/2A1/F50/User%2F13
193
- - test/dummy/tmp/cache/2A2/F60/User%2F14
194
- - test/dummy/tmp/cache/2A3/F70/User%2F15
195
- - test/dummy/tmp/cache/2A4/F80/User%2F16
196
- - test/dummy/tmp/cache/2A5/F90/User%2F17
197
- - test/dummy/tmp/cache/2A6/FA0/User%2F18
198
- - test/dummy/tmp/cache/2A7/FB0/User%2F19
199
- - test/dummy/tmp/cache/3A8/070/Comment%2F7
200
- - test/dummy/tmp/cache/3A9/080/Comment%2F8
201
- - test/dummy/tmp/cache/3AA/090/Comment%2F9
202
- - test/dummy/tmp/cache/3D2/D30/Comment%2F10
203
- - test/dummy/tmp/cache/3D3/D50/Comment%2F20
204
- - test/dummy/tmp/cache/3D4/D50/Comment%2F12
205
- - test/dummy/tmp/cache/3D4/D70/Comment%2F30
206
- - test/dummy/tmp/cache/3D5/D60/Comment%2F13
207
- - test/dummy/tmp/cache/3D5/D70/Comment%2F22
208
- - test/dummy/tmp/cache/3D5/D90/Comment%2F40
209
- - test/dummy/tmp/cache/3D6/D70/Comment%2F14
210
- - test/dummy/tmp/cache/3D6/D80/Comment%2F23
211
- - test/dummy/tmp/cache/3D6/D90/Comment%2F32
212
- - test/dummy/tmp/cache/3D6/DB0/Comment%2F50
213
- - test/dummy/tmp/cache/3D7/D80/Comment%2F15
214
- - test/dummy/tmp/cache/3D7/D90/Comment%2F24
215
- - test/dummy/tmp/cache/3D7/DA0/Comment%2F33
216
- - test/dummy/tmp/cache/3D7/DB0/Comment%2F42
217
- - test/dummy/tmp/cache/3D7/DD0/Comment%2F60
218
- - test/dummy/tmp/cache/3D8/DA0/Comment%2F25
219
- - test/dummy/tmp/cache/3D8/DB0/Comment%2F34
220
- - test/dummy/tmp/cache/3D8/DC0/Comment%2F43
221
- - test/dummy/tmp/cache/3D8/DD0/Comment%2F52
222
- - test/dummy/tmp/cache/3D8/DF0/Comment%2F70
223
- - test/dummy/tmp/cache/3D9/DA0/Comment%2F17
224
- - test/dummy/tmp/cache/3D9/DC0/Comment%2F35
225
- - test/dummy/tmp/cache/3D9/DD0/Comment%2F44
226
- - test/dummy/tmp/cache/3D9/DE0/Comment%2F53
227
- - test/dummy/tmp/cache/3D9/DF0/Comment%2F62
228
- - test/dummy/tmp/cache/3D9/E10/Comment%2F80
229
- - test/dummy/tmp/cache/3DA/DB0/Comment%2F18
230
- - test/dummy/tmp/cache/3DA/DC0/Comment%2F27
231
- - test/dummy/tmp/cache/3DA/DE0/Comment%2F45
232
- - test/dummy/tmp/cache/3DA/DF0/Comment%2F54
233
- - test/dummy/tmp/cache/3DA/E00/Comment%2F63
234
- - test/dummy/tmp/cache/3DA/E10/Comment%2F72
235
- - test/dummy/tmp/cache/3DB/DC0/Comment%2F19
236
- - test/dummy/tmp/cache/3DB/DD0/Comment%2F28
237
- - test/dummy/tmp/cache/3DB/DE0/Comment%2F37
238
- - test/dummy/tmp/cache/3DB/E00/Comment%2F55
239
- - test/dummy/tmp/cache/3DB/E10/Comment%2F64
240
- - test/dummy/tmp/cache/3DB/E20/Comment%2F73
241
- - test/dummy/tmp/cache/3DB/E30/Comment%2F82
242
- - test/dummy/tmp/cache/3DC/DE0/Comment%2F29
243
- - test/dummy/tmp/cache/3DC/DF0/Comment%2F38
244
- - test/dummy/tmp/cache/3DC/E00/Comment%2F47
245
- - test/dummy/tmp/cache/3DC/E20/Comment%2F65
246
- - test/dummy/tmp/cache/3DC/E30/Comment%2F74
247
- - test/dummy/tmp/cache/3DC/E40/Comment%2F83
248
- - test/dummy/tmp/cache/3DD/E00/Comment%2F39
249
- - test/dummy/tmp/cache/3DD/E10/Comment%2F48
250
- - test/dummy/tmp/cache/3DD/E20/Comment%2F57
251
- - test/dummy/tmp/cache/3DD/E40/Comment%2F75
252
- - test/dummy/tmp/cache/3DD/E50/Comment%2F84
253
- - test/dummy/tmp/cache/3DE/E20/Comment%2F49
254
- - test/dummy/tmp/cache/3DE/E30/Comment%2F58
255
- - test/dummy/tmp/cache/3DE/E40/Comment%2F67
256
- - test/dummy/tmp/cache/3DE/E60/Comment%2F85
257
- - test/dummy/tmp/cache/3DF/E40/Comment%2F59
258
- - test/dummy/tmp/cache/3DF/E50/Comment%2F68
259
- - test/dummy/tmp/cache/3DF/E60/Comment%2F77
260
- - test/dummy/tmp/cache/3E0/E60/Comment%2F69
261
- - test/dummy/tmp/cache/3E0/E70/Comment%2F78
262
- - test/dummy/tmp/cache/3E1/E80/Comment%2F79
263
- - test/dummy/tmp/cache/58D/B70/Post%2Fuser_id-1
264
- - test/find_cache_test.rb
265
- - test/test_helper.rb
266
167
  homepage: https://github.com/mustafaturan/find_cache
267
168
  licenses: []
169
+ metadata: {}
268
170
  post_install_message:
269
171
  rdoc_options: []
270
172
  require_paths:
271
173
  - lib
272
174
  required_ruby_version: !ruby/object:Gem::Requirement
273
- none: false
274
175
  requirements:
275
- - - ! '>='
176
+ - - ">="
276
177
  - !ruby/object:Gem::Version
277
178
  version: '0'
278
179
  required_rubygems_version: !ruby/object:Gem::Requirement
279
- none: false
280
180
  requirements:
281
- - - ! '>='
181
+ - - ">="
282
182
  - !ruby/object:Gem::Version
283
183
  version: '0'
284
184
  requirements: []
285
185
  rubyforge_project:
286
- rubygems_version: 1.8.23
186
+ rubygems_version: 2.4.5.1
287
187
  signing_key:
288
- specification_version: 3
289
- summary: Cache for ActiveRecord >=3.0.0 find_by_PrimaryKey(id) and find_by_(attr)
290
- methods based on Rails.cache methods.
291
- test_files:
292
- - test/dummy/app/assets/javascripts/application.js
293
- - test/dummy/app/assets/stylesheets/application.css
294
- - test/dummy/app/controllers/application_controller.rb
295
- - test/dummy/app/helpers/application_helper.rb
296
- - test/dummy/app/models/comment.rb
297
- - test/dummy/app/models/post.rb
298
- - test/dummy/app/models/user.rb
299
- - test/dummy/app/views/layouts/application.html.erb
300
- - test/dummy/config/application.rb
301
- - test/dummy/config/boot.rb
302
- - test/dummy/config/database.yml
303
- - test/dummy/config/environment.rb
304
- - test/dummy/config/environments/development.rb
305
- - test/dummy/config/environments/production.rb
306
- - test/dummy/config/environments/test.rb
307
- - test/dummy/config/initializers/backtrace_silencers.rb
308
- - test/dummy/config/initializers/counter_cache_patch.rb
309
- - test/dummy/config/initializers/inflections.rb
310
- - test/dummy/config/initializers/mime_types.rb
311
- - test/dummy/config/initializers/secret_token.rb
312
- - test/dummy/config/initializers/session_store.rb
313
- - test/dummy/config/initializers/wrap_parameters.rb
314
- - test/dummy/config/locales/en.yml
315
- - test/dummy/config/routes.rb
316
- - test/dummy/config.ru
317
- - test/dummy/db/development.sqlite3
318
- - test/dummy/db/migrate/20120824210455_create_users.rb
319
- - test/dummy/db/migrate/20120824210731_create_comments.rb
320
- - test/dummy/db/migrate/20120824210927_create_posts.rb
321
- - test/dummy/db/schema.rb
322
- - test/dummy/db/test.sqlite3
323
- - test/dummy/log/test.log
324
- - test/dummy/public/404.html
325
- - test/dummy/public/422.html
326
- - test/dummy/public/500.html
327
- - test/dummy/public/favicon.ico
328
- - test/dummy/Rakefile
329
- - test/dummy/README.rdoc
330
- - test/dummy/script/rails
331
- - test/dummy/test/fixtures/comments.yml
332
- - test/dummy/test/fixtures/posts.yml
333
- - test/dummy/test/fixtures/users.yml
334
- - test/dummy/test/unit/comment_test.rb
335
- - test/dummy/test/unit/post_test.rb
336
- - test/dummy/test/unit/user_test.rb
337
- - test/dummy/tmp/cache/26E/540/User%2F1
338
- - test/dummy/tmp/cache/26F/550/User%2F2
339
- - test/dummy/tmp/cache/270/560/User%2F3
340
- - test/dummy/tmp/cache/271/570/User%2F4
341
- - test/dummy/tmp/cache/272/580/User%2F5
342
- - test/dummy/tmp/cache/273/590/User%2F6
343
- - test/dummy/tmp/cache/274/5A0/User%2F7
344
- - test/dummy/tmp/cache/275/5B0/User%2F8
345
- - test/dummy/tmp/cache/275/6E0/Post%2F1
346
- - test/dummy/tmp/cache/276/5C0/User%2F9
347
- - test/dummy/tmp/cache/276/6F0/Post%2F2
348
- - test/dummy/tmp/cache/277/700/Post%2F3
349
- - test/dummy/tmp/cache/29E/F20/User%2F10
350
- - test/dummy/tmp/cache/29F/F30/User%2F11
351
- - test/dummy/tmp/cache/29F/F40/User%2F20
352
- - test/dummy/tmp/cache/2A0/F40/User%2F12
353
- - test/dummy/tmp/cache/2A1/F50/User%2F13
354
- - test/dummy/tmp/cache/2A2/F60/User%2F14
355
- - test/dummy/tmp/cache/2A3/F70/User%2F15
356
- - test/dummy/tmp/cache/2A4/F80/User%2F16
357
- - test/dummy/tmp/cache/2A5/F90/User%2F17
358
- - test/dummy/tmp/cache/2A6/FA0/User%2F18
359
- - test/dummy/tmp/cache/2A7/FB0/User%2F19
360
- - test/dummy/tmp/cache/3A8/070/Comment%2F7
361
- - test/dummy/tmp/cache/3A9/080/Comment%2F8
362
- - test/dummy/tmp/cache/3AA/090/Comment%2F9
363
- - test/dummy/tmp/cache/3D2/D30/Comment%2F10
364
- - test/dummy/tmp/cache/3D3/D50/Comment%2F20
365
- - test/dummy/tmp/cache/3D4/D50/Comment%2F12
366
- - test/dummy/tmp/cache/3D4/D70/Comment%2F30
367
- - test/dummy/tmp/cache/3D5/D60/Comment%2F13
368
- - test/dummy/tmp/cache/3D5/D70/Comment%2F22
369
- - test/dummy/tmp/cache/3D5/D90/Comment%2F40
370
- - test/dummy/tmp/cache/3D6/D70/Comment%2F14
371
- - test/dummy/tmp/cache/3D6/D80/Comment%2F23
372
- - test/dummy/tmp/cache/3D6/D90/Comment%2F32
373
- - test/dummy/tmp/cache/3D6/DB0/Comment%2F50
374
- - test/dummy/tmp/cache/3D7/D80/Comment%2F15
375
- - test/dummy/tmp/cache/3D7/D90/Comment%2F24
376
- - test/dummy/tmp/cache/3D7/DA0/Comment%2F33
377
- - test/dummy/tmp/cache/3D7/DB0/Comment%2F42
378
- - test/dummy/tmp/cache/3D7/DD0/Comment%2F60
379
- - test/dummy/tmp/cache/3D8/DA0/Comment%2F25
380
- - test/dummy/tmp/cache/3D8/DB0/Comment%2F34
381
- - test/dummy/tmp/cache/3D8/DC0/Comment%2F43
382
- - test/dummy/tmp/cache/3D8/DD0/Comment%2F52
383
- - test/dummy/tmp/cache/3D8/DF0/Comment%2F70
384
- - test/dummy/tmp/cache/3D9/DA0/Comment%2F17
385
- - test/dummy/tmp/cache/3D9/DC0/Comment%2F35
386
- - test/dummy/tmp/cache/3D9/DD0/Comment%2F44
387
- - test/dummy/tmp/cache/3D9/DE0/Comment%2F53
388
- - test/dummy/tmp/cache/3D9/DF0/Comment%2F62
389
- - test/dummy/tmp/cache/3D9/E10/Comment%2F80
390
- - test/dummy/tmp/cache/3DA/DB0/Comment%2F18
391
- - test/dummy/tmp/cache/3DA/DC0/Comment%2F27
392
- - test/dummy/tmp/cache/3DA/DE0/Comment%2F45
393
- - test/dummy/tmp/cache/3DA/DF0/Comment%2F54
394
- - test/dummy/tmp/cache/3DA/E00/Comment%2F63
395
- - test/dummy/tmp/cache/3DA/E10/Comment%2F72
396
- - test/dummy/tmp/cache/3DB/DC0/Comment%2F19
397
- - test/dummy/tmp/cache/3DB/DD0/Comment%2F28
398
- - test/dummy/tmp/cache/3DB/DE0/Comment%2F37
399
- - test/dummy/tmp/cache/3DB/E00/Comment%2F55
400
- - test/dummy/tmp/cache/3DB/E10/Comment%2F64
401
- - test/dummy/tmp/cache/3DB/E20/Comment%2F73
402
- - test/dummy/tmp/cache/3DB/E30/Comment%2F82
403
- - test/dummy/tmp/cache/3DC/DE0/Comment%2F29
404
- - test/dummy/tmp/cache/3DC/DF0/Comment%2F38
405
- - test/dummy/tmp/cache/3DC/E00/Comment%2F47
406
- - test/dummy/tmp/cache/3DC/E20/Comment%2F65
407
- - test/dummy/tmp/cache/3DC/E30/Comment%2F74
408
- - test/dummy/tmp/cache/3DC/E40/Comment%2F83
409
- - test/dummy/tmp/cache/3DD/E00/Comment%2F39
410
- - test/dummy/tmp/cache/3DD/E10/Comment%2F48
411
- - test/dummy/tmp/cache/3DD/E20/Comment%2F57
412
- - test/dummy/tmp/cache/3DD/E40/Comment%2F75
413
- - test/dummy/tmp/cache/3DD/E50/Comment%2F84
414
- - test/dummy/tmp/cache/3DE/E20/Comment%2F49
415
- - test/dummy/tmp/cache/3DE/E30/Comment%2F58
416
- - test/dummy/tmp/cache/3DE/E40/Comment%2F67
417
- - test/dummy/tmp/cache/3DE/E60/Comment%2F85
418
- - test/dummy/tmp/cache/3DF/E40/Comment%2F59
419
- - test/dummy/tmp/cache/3DF/E50/Comment%2F68
420
- - test/dummy/tmp/cache/3DF/E60/Comment%2F77
421
- - test/dummy/tmp/cache/3E0/E60/Comment%2F69
422
- - test/dummy/tmp/cache/3E0/E70/Comment%2F78
423
- - test/dummy/tmp/cache/3E1/E80/Comment%2F79
424
- - test/dummy/tmp/cache/58D/B70/Post%2Fuser_id-1
425
- - test/find_cache_test.rb
426
- - test/test_helper.rb
188
+ specification_version: 4
189
+ summary: Thread-safe cache for ActiveRecord >=3.0.0 find_by_PrimaryKey(id) and find_by_(attr)
190
+ methods and models based on Rails.cache methods.
191
+ test_files: []