cache_this 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/cache/this.rb +136 -0
  3. data/lib/cache_this.rb +1 -0
  4. 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: []