cache_version 0.9.5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
- pkg
1
+ pkg
2
+ *~
3
+ Gemfile.lock
@@ -0,0 +1 @@
1
+ cache_version
@@ -0,0 +1 @@
1
+ ree-1.8.7-2012.02
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://www.rubygems.org"
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -1,45 +1,10 @@
1
- require 'rake'
2
1
  require 'rake/testtask'
3
- require 'rake/rdoctask'
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 << 'lib'
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.9.5
1
+ 1.0.0
@@ -1,55 +1,25 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
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 |s|
7
- s.name = %q{cache_version}
8
- s.version = "0.9.5"
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
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Justin Balthrop"]
12
- s.date = %q{2009-11-20}
13
- s.description = %q{Store the version of any class for cache invalidation}
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
- if s.respond_to? :specification_version then
43
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
- s.specification_version = 3
18
+ gem.add_dependency 'memcache', '>= 1.3.0'
19
+ gem.add_dependency 'activerecord', '~> 2.3.9'
45
20
 
46
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
47
- s.add_runtime_dependency(%q<memcache>, [">= 1.0.0"])
48
- else
49
- s.add_dependency(%q<memcache>, [">= 1.0.0"])
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
-
@@ -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
- db.send(:master)
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 key = '#{key}'").to_i
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 = key.to_s
28
- if get(key) == 0
29
- db.execute("INSERT INTO cache_versions (key, version) VALUES ('#{key}', 1)")
30
- else
31
- db.execute("UPDATE cache_versions SET version = version + 1 WHERE key = '#{key}'")
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
- @version_by_key = {}
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
@@ -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 => "postgres",
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
- version: 0.9.5
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: 2009-11-20 00:00:00 -08:00
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
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
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
- version: 1.0.0
24
- version:
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: code@justinbalthrop.com
112
+ email:
113
+ - git@justinbalthrop.com
27
114
  executables: []
28
115
 
29
116
  extensions: []
30
117
 
31
- extra_rdoc_files:
32
- - LICENSE
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: http://github.com/ninjudd/cache_version
135
+ homepage: https://github.com/ninjudd/model_set
47
136
  licenses: []
48
137
 
49
138
  post_install_message:
50
- rdoc_options:
51
- - --charset=UTF-8
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.3.5
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