cache_and_fetch 0.0.1
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/lib/cache_and_fetch.rb +11 -0
- data/lib/cache_and_fetch/cacheable.rb +77 -0
- data/lib/cache_and_fetch/errors.rb +10 -0
- data/lib/cache_and_fetch/fetchable.rb +29 -0
- data/lib/cache_and_fetch/version.rb +3 -0
- metadata +108 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
require "cache_and_fetch/version"
|
2
|
+
require "active_support/concern"
|
3
|
+
require "active_support/core_ext/numeric/time"
|
4
|
+
require "rails"
|
5
|
+
|
6
|
+
module CacheAndFetch
|
7
|
+
end
|
8
|
+
|
9
|
+
require "cache_and_fetch/errors.rb"
|
10
|
+
require "cache_and_fetch/cacheable"
|
11
|
+
require "cache_and_fetch/fetchable"
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module CacheAndFetch
|
2
|
+
module Cacheable
|
3
|
+
DEFAULT_CACHE_EXPIRY_TIME = 20.minutes
|
4
|
+
DEFAULT_PRIMARY_KEY_METHOD = :id
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
attr_accessor :cache_expires_at
|
10
|
+
unless self.respond_to?(:primary_key)
|
11
|
+
instance_eval do
|
12
|
+
def primary_key
|
13
|
+
self.primary_key = Cacheable::DEFAULT_PRIMARY_KEY_METHOD unless @primary_key
|
14
|
+
@primary_key
|
15
|
+
end
|
16
|
+
|
17
|
+
def primary_key=(val)
|
18
|
+
@primary_key = val
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module ClassMethods
|
25
|
+
def cache_duration
|
26
|
+
self.cache_duration = Cacheable::DEFAULT_CACHE_EXPIRY_TIME unless @cache_duration
|
27
|
+
@cache_duration
|
28
|
+
end
|
29
|
+
|
30
|
+
def cache_duration=(val)
|
31
|
+
@cache_duration = val
|
32
|
+
end
|
33
|
+
|
34
|
+
def cache_client
|
35
|
+
Rails.cache
|
36
|
+
end
|
37
|
+
|
38
|
+
def cache_key(p_key)
|
39
|
+
"#{self.name.underscore}/#{p_key}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def cache(p_key)
|
43
|
+
resource = find(p_key)
|
44
|
+
resource.cache
|
45
|
+
resource
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_cached(p_key)
|
49
|
+
cache_client.read(cache_key(p_key))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def cache_client
|
54
|
+
self.class.cache_client
|
55
|
+
end
|
56
|
+
|
57
|
+
def cache_key
|
58
|
+
self.class.cache_key(self.__send__(self.class.primary_key))
|
59
|
+
end
|
60
|
+
|
61
|
+
def cache
|
62
|
+
self.cache_expires_at = self.class.cache_duration.since.to_i
|
63
|
+
self.cache_client.write(self.cache_key, self)
|
64
|
+
end
|
65
|
+
|
66
|
+
def stale?
|
67
|
+
cache_expires_at && Time.now > Time.at(cache_expires_at)
|
68
|
+
end
|
69
|
+
|
70
|
+
def recache
|
71
|
+
Thread.new do
|
72
|
+
p_key = self.__send__(self.class.primary_key)
|
73
|
+
self.class.__send__(:find, p_key).cache
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module CacheAndFetch
|
2
|
+
class CacheAndFetchError < StandardError
|
3
|
+
end
|
4
|
+
|
5
|
+
class FinderNotFound < CacheAndFetchError
|
6
|
+
def initialize
|
7
|
+
super("There is no <model>.find method defined. Please implement a <model>.find method or a finder module in app/models/<model>/finder.rb")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CacheAndFetch
|
2
|
+
module Fetchable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include Cacheable
|
5
|
+
|
6
|
+
included do
|
7
|
+
begin
|
8
|
+
extend "#{name}::Finder".constantize
|
9
|
+
rescue NameError => ex
|
10
|
+
raise FinderNotFound.new unless respond_to?(:find)
|
11
|
+
end
|
12
|
+
private_class_method :find
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def fetch(p_key)
|
17
|
+
resource = get_cached(p_key)
|
18
|
+
if resource
|
19
|
+
if resource.stale?
|
20
|
+
block_given? ? yield(resource) : resource.recache
|
21
|
+
end
|
22
|
+
else
|
23
|
+
resource = cache(p_key)
|
24
|
+
end
|
25
|
+
resource
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cache_and_fetch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Suman Mukherjee
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-06-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: A gem that allows you to soft expire cache, use a stale resource and
|
63
|
+
fetch the fresh resource in background
|
64
|
+
email:
|
65
|
+
- sumanmukherjee03@gmail.com
|
66
|
+
executables: []
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- lib/cache_and_fetch/cacheable.rb
|
71
|
+
- lib/cache_and_fetch/errors.rb
|
72
|
+
- lib/cache_and_fetch/fetchable.rb
|
73
|
+
- lib/cache_and_fetch/version.rb
|
74
|
+
- lib/cache_and_fetch.rb
|
75
|
+
homepage: http://github.com/sumanmukherjee03/cache_and_fetch
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
hash: -3505621410664163532
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
hash: -3505621410664163532
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 1.8.25
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: This gem allows you to add a soft expiry to your cache. When the cache soft
|
106
|
+
expires, the cache provides you the stale record to work with, but fetches the fresh
|
107
|
+
record in the background.
|
108
|
+
test_files: []
|