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.
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: []