cache_version 0.9.5 → 1.0.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 +3 -1
- data/.rbenv-gemsets +1 -0
- data/.rbenv-version +1 -0
- data/Gemfile +3 -0
- data/Rakefile +2 -37
- data/VERSION +1 -1
- data/cache_version.gemspec +20 -50
- data/lib/cache_version.rb +49 -20
- data/test/test_helper.rb +2 -2
- metadata +112 -18
data/.gitignore
CHANGED
data/.rbenv-gemsets
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
cache_version
|
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ree-1.8.7-2012.02
|
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,45 +1,10 @@
|
|
1
|
-
require 'rake'
|
2
1
|
require 'rake/testtask'
|
3
|
-
require '
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'jeweler'
|
7
|
-
Jeweler::Tasks.new do |s|
|
8
|
-
s.name = "cache_version"
|
9
|
-
s.summary = %Q{Store the version of any class for cache invalidation}
|
10
|
-
s.email = "code@justinbalthrop.com"
|
11
|
-
s.homepage = "http://github.com/ninjudd/cache_version"
|
12
|
-
s.description = "Store the version of any class for cache invalidation"
|
13
|
-
s.authors = ["Justin Balthrop"]
|
14
|
-
s.add_dependency('memcache', '>= 1.0.0')
|
15
|
-
end
|
16
|
-
Jeweler::GemcutterTasks.new
|
17
|
-
rescue LoadError
|
18
|
-
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
19
|
-
end
|
2
|
+
require 'bundler/gem_tasks'
|
20
3
|
|
21
4
|
Rake::TestTask.new do |t|
|
22
|
-
t.libs
|
5
|
+
t.libs = ['lib', 'test']
|
23
6
|
t.pattern = 'test/**/*_test.rb'
|
24
7
|
t.verbose = false
|
25
8
|
end
|
26
9
|
|
27
|
-
Rake::RDocTask.new do |rdoc|
|
28
|
-
rdoc.rdoc_dir = 'rdoc'
|
29
|
-
rdoc.title = 'cache_version'
|
30
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
31
|
-
rdoc.rdoc_files.include('README*')
|
32
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
33
|
-
end
|
34
|
-
|
35
|
-
begin
|
36
|
-
require 'rcov/rcovtask'
|
37
|
-
Rcov::RcovTask.new do |t|
|
38
|
-
t.libs << 'test'
|
39
|
-
t.test_files = FileList['test/**/*_test.rb']
|
40
|
-
t.verbose = true
|
41
|
-
end
|
42
|
-
rescue LoadError
|
43
|
-
end
|
44
|
-
|
45
10
|
task :default => :test
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/cache_version.gemspec
CHANGED
@@ -1,55 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
3
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "cache_version"
|
6
|
+
gem.version = IO.read('VERSION')
|
7
|
+
gem.authors = ["Justin Balthrop"]
|
8
|
+
gem.email = ["git@justinbalthrop.com"]
|
9
|
+
gem.description = %q{Store the version of any class for cache invalidation}
|
10
|
+
gem.summary = gem.description
|
11
|
+
gem.homepage = "https://github.com/ninjudd/model_set"
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.email = %q{code@justinbalthrop.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".gitignore",
|
21
|
-
"LICENSE",
|
22
|
-
"README.rdoc",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"cache_version.gemspec",
|
26
|
-
"examples/sample_migration.rb",
|
27
|
-
"lib/cache_version.rb",
|
28
|
-
"test/cache_version_test.rb",
|
29
|
-
"test/test_helper.rb"
|
30
|
-
]
|
31
|
-
s.homepage = %q{http://github.com/ninjudd/cache_version}
|
32
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
-
s.require_paths = ["lib"]
|
34
|
-
s.rubygems_version = %q{1.3.5}
|
35
|
-
s.summary = %q{Store the version of any class for cache invalidation}
|
36
|
-
s.test_files = [
|
37
|
-
"test/cache_version_test.rb",
|
38
|
-
"test/test_helper.rb",
|
39
|
-
"examples/sample_migration.rb"
|
40
|
-
]
|
13
|
+
gem.add_development_dependency 'shoulda', '3.0.1'
|
14
|
+
gem.add_development_dependency 'mocha'
|
15
|
+
gem.add_development_dependency 'rake'
|
16
|
+
gem.add_development_dependency 'activerecord-postgresql-adapter'
|
41
17
|
|
42
|
-
|
43
|
-
|
44
|
-
s.specification_version = 3
|
18
|
+
gem.add_dependency 'memcache', '>= 1.3.0'
|
19
|
+
gem.add_dependency 'activerecord', '~> 2.3.9'
|
45
20
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
else
|
52
|
-
s.add_dependency(%q<memcache>, [">= 1.0.0"])
|
53
|
-
end
|
21
|
+
gem.files = `git ls-files`.split($/)
|
22
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
23
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
24
|
+
gem.require_paths = ["lib"]
|
54
25
|
end
|
55
|
-
|
data/lib/cache_version.rb
CHANGED
@@ -5,13 +5,10 @@ require 'active_record'
|
|
5
5
|
module CacheVersion
|
6
6
|
def self.db
|
7
7
|
db = ActiveRecord::Base.connection
|
8
|
-
if defined?(DataFabric::ConnectionProxy) and db.kind_of?(DataFabric::ConnectionProxy)
|
9
|
-
|
10
|
-
else
|
11
|
-
db
|
12
|
-
end
|
8
|
+
db = db.send(:master) if defined?(DataFabric::ConnectionProxy) and db.kind_of?(DataFabric::ConnectionProxy)
|
9
|
+
db
|
13
10
|
end
|
14
|
-
|
11
|
+
|
15
12
|
def self.cache
|
16
13
|
CACHE
|
17
14
|
end
|
@@ -19,19 +16,16 @@ module CacheVersion
|
|
19
16
|
def self.get(key)
|
20
17
|
key = key.to_s
|
21
18
|
version_by_key[key] ||= CACHE.get_or_add(cache_key(key)) do
|
22
|
-
db.select_value("SELECT version FROM cache_versions WHERE
|
19
|
+
db.select_value("SELECT version FROM cache_versions WHERE #{key_column} = '#{key}'").to_i
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
26
23
|
def self.increment(key)
|
27
|
-
key
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
invalidate_cache(key)
|
34
|
-
get(key)
|
24
|
+
alter(key, 1, 'version + 1')
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.set(key, value)
|
28
|
+
alter(key, value.to_i)
|
35
29
|
end
|
36
30
|
|
37
31
|
def self.invalidate_cache(key)
|
@@ -39,19 +33,49 @@ module CacheVersion
|
|
39
33
|
cache.delete(cache_key(key))
|
40
34
|
version_by_key.delete(key)
|
41
35
|
end
|
42
|
-
|
43
|
-
def self.clear_cache
|
44
|
-
|
36
|
+
|
37
|
+
def self.clear_cache(force = false)
|
38
|
+
if v = cache.get(vkey)
|
39
|
+
if force == true or @version.nil? or v > @version
|
40
|
+
@version = v
|
41
|
+
version_by_key.clear
|
42
|
+
end
|
43
|
+
else
|
44
|
+
@version = cache.get_or_add(vkey, Time.now.to_i)
|
45
|
+
end
|
45
46
|
end
|
46
47
|
|
47
48
|
private
|
49
|
+
|
50
|
+
def self.alter(key, init, update = init)
|
51
|
+
key = key.to_s
|
52
|
+
|
53
|
+
if get(key) == 0
|
54
|
+
db.execute("INSERT INTO cache_versions (#{key_column}, version) VALUES ('#{key}', #{init})")
|
55
|
+
else
|
56
|
+
db.execute("UPDATE cache_versions SET version = #{update} WHERE #{key_column} = '#{key}'")
|
57
|
+
end
|
58
|
+
|
59
|
+
cache.set(vkey, Time.now.to_i)
|
60
|
+
invalidate_cache(key)
|
61
|
+
get(key)
|
62
|
+
end
|
63
|
+
|
48
64
|
def self.version_by_key
|
49
65
|
@version_by_key ||= {}
|
50
|
-
end
|
51
|
-
|
66
|
+
end
|
67
|
+
|
52
68
|
def self.cache_key(key)
|
53
69
|
"v:#{key}"
|
54
70
|
end
|
71
|
+
|
72
|
+
def self.vkey
|
73
|
+
"v:CacheVersion"
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.key_column
|
77
|
+
@key_column ||= db.quote_column_name('key')
|
78
|
+
end
|
55
79
|
end
|
56
80
|
|
57
81
|
class Module
|
@@ -64,6 +88,11 @@ class Module
|
|
64
88
|
key = [self, context].compact.join('_')
|
65
89
|
CacheVersion.increment(key)
|
66
90
|
end
|
91
|
+
|
92
|
+
def set_version(value, context = nil)
|
93
|
+
key = [self, context].compact.join('_')
|
94
|
+
CacheVersion.set(key, value)
|
95
|
+
end
|
67
96
|
end
|
68
97
|
|
69
98
|
class CacheVersionMigration < ActiveRecord::Migration
|
data/test/test_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'test/unit'
|
3
3
|
require 'shoulda'
|
4
|
-
require 'mocha'
|
4
|
+
require 'mocha/setup'
|
5
5
|
|
6
6
|
$LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib"
|
7
7
|
$LOAD_PATH.unshift File.dirname(__FILE__) + "/../../memcache/lib"
|
@@ -15,7 +15,7 @@ CACHE = Memcache.new(:servers => 'localhost')
|
|
15
15
|
ActiveRecord::Base.establish_connection(
|
16
16
|
:adapter => "postgresql",
|
17
17
|
:host => "localhost",
|
18
|
-
:username =>
|
18
|
+
:username => `whoami`.chomp,
|
19
19
|
:password => "",
|
20
20
|
:database => "test"
|
21
21
|
)
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cache_version
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Justin Balthrop
|
@@ -9,30 +15,113 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2013-06-03 00:00:00 -07:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: shoulda
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - "="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 1
|
34
|
+
version: 3.0.1
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: mocha
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: rake
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: activerecord-postgresql-adapter
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
type: :development
|
78
|
+
version_requirements: *id004
|
15
79
|
- !ruby/object:Gem::Dependency
|
16
80
|
name: memcache
|
17
|
-
|
18
|
-
|
19
|
-
|
81
|
+
prerelease: false
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
20
84
|
requirements:
|
21
85
|
- - ">="
|
22
86
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
87
|
+
hash: 27
|
88
|
+
segments:
|
89
|
+
- 1
|
90
|
+
- 3
|
91
|
+
- 0
|
92
|
+
version: 1.3.0
|
93
|
+
type: :runtime
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: activerecord
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 17
|
104
|
+
segments:
|
105
|
+
- 2
|
106
|
+
- 3
|
107
|
+
- 9
|
108
|
+
version: 2.3.9
|
109
|
+
type: :runtime
|
110
|
+
version_requirements: *id006
|
25
111
|
description: Store the version of any class for cache invalidation
|
26
|
-
email:
|
112
|
+
email:
|
113
|
+
- git@justinbalthrop.com
|
27
114
|
executables: []
|
28
115
|
|
29
116
|
extensions: []
|
30
117
|
|
31
|
-
extra_rdoc_files:
|
32
|
-
|
33
|
-
- README.rdoc
|
118
|
+
extra_rdoc_files: []
|
119
|
+
|
34
120
|
files:
|
35
121
|
- .gitignore
|
122
|
+
- .rbenv-gemsets
|
123
|
+
- .rbenv-version
|
124
|
+
- Gemfile
|
36
125
|
- LICENSE
|
37
126
|
- README.rdoc
|
38
127
|
- Rakefile
|
@@ -43,34 +132,39 @@ files:
|
|
43
132
|
- test/cache_version_test.rb
|
44
133
|
- test/test_helper.rb
|
45
134
|
has_rdoc: true
|
46
|
-
homepage:
|
135
|
+
homepage: https://github.com/ninjudd/model_set
|
47
136
|
licenses: []
|
48
137
|
|
49
138
|
post_install_message:
|
50
|
-
rdoc_options:
|
51
|
-
|
139
|
+
rdoc_options: []
|
140
|
+
|
52
141
|
require_paths:
|
53
142
|
- lib
|
54
143
|
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
55
145
|
requirements:
|
56
146
|
- - ">="
|
57
147
|
- !ruby/object:Gem::Version
|
148
|
+
hash: 3
|
149
|
+
segments:
|
150
|
+
- 0
|
58
151
|
version: "0"
|
59
|
-
version:
|
60
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
61
154
|
requirements:
|
62
155
|
- - ">="
|
63
156
|
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
64
160
|
version: "0"
|
65
|
-
version:
|
66
161
|
requirements: []
|
67
162
|
|
68
163
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.
|
164
|
+
rubygems_version: 1.5.2
|
70
165
|
signing_key:
|
71
166
|
specification_version: 3
|
72
167
|
summary: Store the version of any class for cache invalidation
|
73
168
|
test_files:
|
74
169
|
- test/cache_version_test.rb
|
75
170
|
- test/test_helper.rb
|
76
|
-
- examples/sample_migration.rb
|