cache_this 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.
- checksums.yaml +7 -0
- data/lib/cache/this.rb +136 -0
- data/lib/cache_this.rb +1 -0
- metadata +129 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: b75791657ec6b43482b6a398b53407e526234290
|
|
4
|
+
data.tar.gz: 6b7cf5a008e3dfb83d7de48f01dc9100846a0617
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 93b1d9a35e27647af4df0d65bce5bbde8b8b22f5f3e446a36c98f17660505a37e5f975aa5df2663dacc9c4387c8faa467382f4eccd7e5e0a3dc0e97fda8609a4
|
|
7
|
+
data.tar.gz: c592b48a689dcd6c040016c702c0d5cbfd408425fff483ab3179fb2e2d535525a2fcdbb6babb9ce7400a67c76150390520c62ba7ed38b96d0d7cf6aab6e987b4
|
data/lib/cache/this.rb
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require 'active_support/duration'
|
|
2
|
+
require 'active_support/time'
|
|
3
|
+
|
|
4
|
+
module Cache
|
|
5
|
+
class This
|
|
6
|
+
def initialize(*args)
|
|
7
|
+
expiration, _ = args
|
|
8
|
+
expiration ||= lambda { 1.hour.from_now }
|
|
9
|
+
@expiration = expiration
|
|
10
|
+
@cache_values ||= {}
|
|
11
|
+
@cache_timeouts ||= {}
|
|
12
|
+
#test = 13wr
|
|
13
|
+
@timeout_suffix ||= ''
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def get_or_set(name, timeout = nil, value = nil, &block)
|
|
17
|
+
cached_value = get_value(name, timeout, value, &block)
|
|
18
|
+
cached_value ||= value
|
|
19
|
+
set_value(name, cached_value, &block) if cached_value.nil? or expired?(name)
|
|
20
|
+
add_expiration(name, timeout) if expired?(name)
|
|
21
|
+
value
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def get(name)
|
|
25
|
+
get_value(name, nil, nil)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def fetch(name, &block)
|
|
29
|
+
result = get(name)
|
|
30
|
+
if result.nil? and block_given?
|
|
31
|
+
result = yield block
|
|
32
|
+
end
|
|
33
|
+
result
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def delete(name)
|
|
37
|
+
@cache_timeouts.delete(timeout_key_name(name))
|
|
38
|
+
@cache_values.delete(name.to_sym)
|
|
39
|
+
end
|
|
40
|
+
alias_method :evict, :delete
|
|
41
|
+
|
|
42
|
+
def clear
|
|
43
|
+
@cache_values = {}
|
|
44
|
+
@cache_timeouts = {}
|
|
45
|
+
nil
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def to_a
|
|
49
|
+
result = []
|
|
50
|
+
@cache_values.keys.each_with_index do |name, index|
|
|
51
|
+
element = [name.to_sym, get(name), timeout_for(name)]
|
|
52
|
+
result[index] = element
|
|
53
|
+
end
|
|
54
|
+
#TODO: optionally sort this by timeout
|
|
55
|
+
result
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def key?(name)
|
|
59
|
+
@cache_values.has_key?(name.to_sym) and @cache_timeouts.has_key?(timeout_key_name(name).to_sym)
|
|
60
|
+
end
|
|
61
|
+
alias_method :has_key?, :key?
|
|
62
|
+
|
|
63
|
+
def count
|
|
64
|
+
@cache_values.keys.size
|
|
65
|
+
end
|
|
66
|
+
alias_method :size, :count
|
|
67
|
+
|
|
68
|
+
#complete eviction before enabled these
|
|
69
|
+
#def values
|
|
70
|
+
# @cache_values
|
|
71
|
+
#end
|
|
72
|
+
#
|
|
73
|
+
#def timers
|
|
74
|
+
# @cache_timeouts
|
|
75
|
+
#end
|
|
76
|
+
|
|
77
|
+
protected
|
|
78
|
+
|
|
79
|
+
def add_expiration(name, timeout = nil)
|
|
80
|
+
timeout_value = timeout.call if timeout.present? and timeout.respond_to?(:call)
|
|
81
|
+
timeout_value ||= Time.now + timeout.seconds if timeout.present? and timeout.is_a?(Fixnum)
|
|
82
|
+
timeout_value ||= @expiration.call if @expiration.lambda?
|
|
83
|
+
timeout_value ||= @expiration.send(:seconds).from_now
|
|
84
|
+
set_timeout_for(name, timeout_value)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def set_value(name, value, &block)
|
|
88
|
+
if block_given?
|
|
89
|
+
result = yield block
|
|
90
|
+
else
|
|
91
|
+
result = value.call if value.present? and value.respond_to?(:call)
|
|
92
|
+
result ||= value
|
|
93
|
+
end
|
|
94
|
+
set_value_for(name, result)
|
|
95
|
+
result
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def get_value(name, timeout, value = nil, &block)
|
|
99
|
+
timeout_value = timeout_for(name)
|
|
100
|
+
if timeout_value.nil? or expired?(name)
|
|
101
|
+
return nil
|
|
102
|
+
end
|
|
103
|
+
value_for(name.to_sym)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def timeout_key_name(name)
|
|
107
|
+
(name.to_s + @timeout_suffix.to_s).to_sym
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def timeout_for(name)
|
|
111
|
+
@cache_timeouts[timeout_key_name(name)]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def value_for(name)
|
|
115
|
+
@cache_values[name.to_sym]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def set_value_for(name, value)
|
|
119
|
+
@cache_values[name.to_sym] = value
|
|
120
|
+
@cache_values[name.to_sym]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def set_timeout_for(name, value)
|
|
124
|
+
timeout_name = timeout_key_name(name)
|
|
125
|
+
@cache_timeouts[timeout_name] = value
|
|
126
|
+
@cache_timeouts[timeout_name]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def expired?(name)
|
|
130
|
+
timer_name = timeout_key_name(name)
|
|
131
|
+
timer_value = @cache_timeouts[timer_name]
|
|
132
|
+
return true if timer_value.nil?
|
|
133
|
+
timer_value < Time.now
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
data/lib/cache_this.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'cache/this'
|
metadata
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: cache_this
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- https://github.com/scicco
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-06-08 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: activesupport
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ~>
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '4.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ~>
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '4.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rspec
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ~>
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '3.0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ~>
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '3.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec-nc
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - '>='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: guard
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '>='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: guard-rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - '>='
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: timecop
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - '>='
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - '>='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
description: This gems allow setting individual expiration date for each cache element
|
|
98
|
+
email: guido.scicolone@gmail.com
|
|
99
|
+
executables: []
|
|
100
|
+
extensions: []
|
|
101
|
+
extra_rdoc_files: []
|
|
102
|
+
files:
|
|
103
|
+
- lib/cache_this.rb
|
|
104
|
+
- lib/cache/this.rb
|
|
105
|
+
homepage: http://rubygems.org/gems/cache_this
|
|
106
|
+
licenses:
|
|
107
|
+
- MIT
|
|
108
|
+
metadata: {}
|
|
109
|
+
post_install_message:
|
|
110
|
+
rdoc_options: []
|
|
111
|
+
require_paths:
|
|
112
|
+
- lib
|
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - '>='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - '>='
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '0'
|
|
123
|
+
requirements: []
|
|
124
|
+
rubyforge_project:
|
|
125
|
+
rubygems_version: 2.1.11
|
|
126
|
+
signing_key:
|
|
127
|
+
specification_version: 4
|
|
128
|
+
summary: Cache with element level time expiration
|
|
129
|
+
test_files: []
|