timed_lru 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6cf30083009f9f233369eea32cbbe9446ed8cb37
4
+ data.tar.gz: 0eaf174e3f28b27e20983daf5adb38a73158e0ac
5
+ SHA512:
6
+ metadata.gz: 5e8e534ba9487aab9255be94956beea7c7bec8cd1364c2c2db446258f308c4e5969b50df303ac21197be77ea5d938aeff02577a825247e7147bf76555f7c29ec
7
+ data.tar.gz: a4a8b1b83dbd3ad8d50a3d74ad6ff566f27a0ec1e9782615fadd83fdd6e3e643eaf425b4c26efe15c10ec675bcbc596f9942fd88c290bc9858150a66a8cf6029
data/.gitignore CHANGED
@@ -1 +1,4 @@
1
1
  *.gem
2
+ .yardoc/
3
+ coverage/
4
+ doc/
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ script: bundle exec rake coverage
3
+ rvm:
4
+ - 2.2
5
+ - 2.3
6
+ - 2.4
7
+ gemfile:
8
+ - Gemfile
data/Gemfile CHANGED
@@ -1,2 +1,6 @@
1
1
  source "http://rubygems.org"
2
- gemspec
2
+ gemspec
3
+
4
+ gem 'coveralls', require: false, group: :test
5
+ gem 'json', '>= 1.7.7', require: false, group: :test
6
+
data/Gemfile.lock CHANGED
@@ -1,29 +1,58 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- timed_lru (0.3.1)
4
+ timed_lru (0.3.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
- diff-lcs (1.2.1)
10
- rake (10.0.3)
11
- rspec (2.13.0)
12
- rspec-core (~> 2.13.0)
13
- rspec-expectations (~> 2.13.0)
14
- rspec-mocks (~> 2.13.0)
15
- rspec-core (2.13.0)
16
- rspec-expectations (2.13.0)
17
- diff-lcs (>= 1.1.3, < 2.0)
18
- rspec-mocks (2.13.0)
19
- yard (0.8.5.2)
9
+ coveralls (0.8.21)
10
+ json (>= 1.8, < 3)
11
+ simplecov (~> 0.14.1)
12
+ term-ansicolor (~> 1.3)
13
+ thor (~> 0.19.4)
14
+ tins (~> 1.6)
15
+ diff-lcs (1.3)
16
+ docile (1.1.5)
17
+ json (2.1.0)
18
+ rake (12.3.0)
19
+ redcarpet (3.4.0)
20
+ rspec (3.7.0)
21
+ rspec-core (~> 3.7.0)
22
+ rspec-expectations (~> 3.7.0)
23
+ rspec-mocks (~> 3.7.0)
24
+ rspec-core (3.7.0)
25
+ rspec-support (~> 3.7.0)
26
+ rspec-expectations (3.7.0)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.7.0)
29
+ rspec-mocks (3.7.0)
30
+ diff-lcs (>= 1.2.0, < 2.0)
31
+ rspec-support (~> 3.7.0)
32
+ rspec-support (3.7.0)
33
+ simplecov (0.14.1)
34
+ docile (~> 1.1.0)
35
+ json (>= 1.8, < 3)
36
+ simplecov-html (~> 0.10.0)
37
+ simplecov-html (0.10.2)
38
+ term-ansicolor (1.6.0)
39
+ tins (~> 1.0)
40
+ thor (0.19.4)
41
+ tins (1.16.3)
42
+ yard (0.9.12)
20
43
 
21
44
  PLATFORMS
22
45
  ruby
23
46
 
24
47
  DEPENDENCIES
25
48
  bundler
49
+ coveralls
50
+ json (>= 1.7.7)
26
51
  rake
52
+ redcarpet
27
53
  rspec
28
54
  timed_lru!
29
55
  yard
56
+
57
+ BUNDLED WITH
58
+ 1.16.0
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  Timed LRU
2
2
  =========
3
3
 
4
+ [![Build Status](https://travis-ci.org/bsm/timed_lru.png)](https://travis-ci.org/bsm/timed_lru)
5
+ [![Dependency Status](https://gemnasium.com/bsm/timed_lru.png)](https://gemnasium.com/bsm/timed_lru)
6
+ [![Coverage Status](https://coveralls.io/repos/bsm/timed_lru/badge.png)](https://coveralls.io/r/bsm/timed_lru)
7
+
4
8
  My implementation of a simple, thread-safe LRU with (optional) TTLs
5
9
  and constant time operations. There are many LRUs for Ruby available but
6
10
  I was unable to find one that matches all three requirements.
@@ -10,37 +14,42 @@ Install
10
14
 
11
15
  Install it via `gem`:
12
16
 
13
- gem install timed_lru
17
+ ```ruby
18
+ gem install timed_lru
19
+ ```
14
20
 
15
21
  Or just bundle it with your project.
16
22
 
17
23
  Usage Example
18
24
  -------------
19
25
 
20
- # Initialize with a max size (default: 100) and a TTL (default: none)
21
- lru = TimedLRU.new max_size: 3, ttl: 5
26
+ ```ruby
27
+ # Initialize with a max size (default: 100) and a TTL (default: none)
28
+ lru = TimedLRU.new max_size: 3, ttl: 5
22
29
 
23
- # Add values
24
- lru["a"] = "value 1"
25
- lru["b"] = "value 2"
26
- lru["c"] = "value 3"
27
- lru.keys # => ["a", "b"]
30
+ # Add values
31
+ lru["a"] = "value 1"
32
+ lru["b"] = "value 2"
33
+ lru["c"] = "value 3"
34
+ lru.keys # => ["a", "b"]
28
35
 
29
- # Wait a second
30
- sleep(1)
36
+ # Wait a second
37
+ sleep(1)
31
38
 
32
- # Add more values
33
- lru["d"] = "value 4"
34
- lru.keys # => ["b", "c", "d"]
39
+ # Add more values
40
+ lru["d"] = "value 4"
41
+ lru.keys # => ["b", "c", "d"]
35
42
 
36
- # Sleep a little longer
37
- sleep(4)
38
- lru["c"] # => "value 3"
39
- lru.keys # => ["c", "d"]
43
+ # Sleep a little longer
44
+ sleep(4)
45
+ lru["c"] # => "value 3"
46
+ lru.keys # => ["c", "d"]
47
+ ```
40
48
 
41
49
  Licence
42
50
  -------
43
51
 
52
+ ```
44
53
  Copyright (c) 2013 Black Square Media Ltd
45
54
 
46
55
  Permission is hereby granted, free of charge, to any person obtaining
@@ -61,3 +70,4 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
61
70
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
62
71
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
63
72
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
73
+ ```
data/Rakefile CHANGED
@@ -1,8 +1,11 @@
1
- require 'rake'
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
2
3
 
3
- require 'rspec/mocks/version'
4
4
  require 'rspec/core/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
+ RSpec::Core::RakeTask.new(:coverage) do |c|
7
+ c.ruby_opts = '-r ./spec/coverage_helper'
8
+ end
6
9
 
7
10
  require 'yard'
8
11
  YARD::Rake::YardocTask.new
data/lib/timed_lru.rb CHANGED
@@ -117,20 +117,3 @@ class TimedLRU
117
117
  end
118
118
 
119
119
  end
120
-
121
- # right ? : @tail = left
122
-
123
- # return if node == @head
124
- # if @head
125
- # @head.left = node
126
- # @head.right = right if @head.right == node
127
- # end
128
-
129
- # if right
130
- # right.left = left
131
- # end
132
-
133
- # if @tail == node
134
- # left.right = nil
135
- # @tail = left
136
- # end
@@ -0,0 +1,5 @@
1
+ require 'coveralls'
2
+
3
+ # Enable coverage
4
+ Coveralls.wear!
5
+
@@ -9,17 +9,17 @@ describe TimedLRU do
9
9
 
10
10
  res = [head]
11
11
  while curr = res.last.right
12
- curr.left.should == res.last
12
+ expect(curr.left).to eq(res.last)
13
13
  res << curr
14
14
  end
15
- head.left.should be_nil
16
- tail.right.should be_nil
17
- res.last.should == tail
15
+ expect(head.left).to be_nil
16
+ expect(tail.right).to be_nil
17
+ expect(res.last).to eq(tail)
18
18
  res
19
19
  end
20
20
 
21
21
  def chain
22
- full_chain.map &:key
22
+ full_chain.map(&:key)
23
23
  end
24
24
 
25
25
  def head
@@ -33,61 +33,76 @@ describe TimedLRU do
33
33
  describe "defaults" do
34
34
  subject { described_class.new }
35
35
 
36
- its(:max_size) { should be(100) }
37
- its(:ttl) { should be_nil }
38
- it { should be_a(MonitorMixin) }
39
- it { should_not be_a(described_class::ThreadUnsafe) }
40
- it { should respond_to(:empty?) }
41
- it { should respond_to(:keys) }
42
- it { should respond_to(:size) }
43
- it { should respond_to(:each_key) }
36
+ describe '#max_size' do
37
+ subject { super().max_size }
38
+ it { is_expected.to be(100) }
39
+ end
40
+
41
+ describe '#ttl' do
42
+ subject { super().ttl }
43
+ it { is_expected.to be_nil }
44
+ end
45
+
46
+ it { is_expected.to be_a(MonitorMixin) }
47
+ it { is_expected.not_to be_a(described_class::ThreadUnsafe) }
48
+ it { is_expected.to respond_to(:empty?) }
49
+ it { is_expected.to respond_to(:keys) }
50
+ it { is_expected.to respond_to(:size) }
51
+ it { is_expected.to respond_to(:each_key) }
44
52
  end
45
53
 
46
54
  describe "init" do
47
55
  subject { described_class.new max_size: 25, ttl: 120, thread_safe: false }
48
56
 
49
- its(:max_size) { should be(25) }
50
- its(:ttl) { should be(120) }
51
- it { should be_a(described_class::ThreadUnsafe) }
57
+ describe '#max_size' do
58
+ subject { super().max_size }
59
+ it { is_expected.to be(25) }
60
+ end
61
+
62
+ describe '#ttl' do
63
+ subject { super().ttl }
64
+ it { is_expected.to be(120) }
65
+ end
66
+ it { is_expected.to be_a(described_class::ThreadUnsafe) }
52
67
 
53
68
  it 'should assert correct option values' do
54
- lambda { described_class.new(max_size: "X") }.should raise_error(ArgumentError)
55
- lambda { described_class.new(max_size: -1) }.should raise_error(ArgumentError)
56
- lambda { described_class.new(max_size: 0) }.should raise_error(ArgumentError)
69
+ expect { described_class.new(max_size: "X") }.to raise_error(ArgumentError)
70
+ expect { described_class.new(max_size: -1) }.to raise_error(ArgumentError)
71
+ expect { described_class.new(max_size: 0) }.to raise_error(ArgumentError)
57
72
 
58
- lambda { described_class.new(ttl: "X") }.should raise_error(ArgumentError)
59
- lambda { described_class.new(ttl: true) }.should raise_error(TypeError)
60
- lambda { described_class.new(ttl: 0) }.should raise_error(ArgumentError)
73
+ expect { described_class.new(ttl: "X") }.to raise_error(ArgumentError)
74
+ expect { described_class.new(ttl: true) }.to raise_error(TypeError)
75
+ expect { described_class.new(ttl: 0) }.to raise_error(ArgumentError)
61
76
  end
62
77
  end
63
78
 
64
79
  describe "storing" do
65
80
 
66
81
  it "should set head + tail on first item" do
67
- lambda {
68
- subject.store("a", 1).should == 1
69
- }.should change { chain }.from([]).to(["a"])
82
+ expect {
83
+ expect(subject.store("a", 1)).to eq(1)
84
+ }.to change { chain }.from([]).to(["a"])
70
85
  end
71
86
 
72
87
  it "should shift chain when new items are added" do
73
88
  subject["a"] = 1
74
- lambda { subject["b"] = 2 }.should change { chain }.from(%w|a|).to(%w|b a|)
75
- lambda { subject["c"] = 3 }.should change { chain }.to(%w|c b a|)
76
- lambda { subject["d"] = 4 }.should change { chain }.to(%w|d c b a|)
89
+ expect { subject["b"] = 2 }.to change { chain }.from(%w|a|).to(%w|b a|)
90
+ expect { subject["c"] = 3 }.to change { chain }.to(%w|c b a|)
91
+ expect { subject["d"] = 4 }.to change { chain }.to(%w|d c b a|)
77
92
  end
78
93
 
79
94
  it "should expire LRU items when chain exceeds max size" do
80
95
  ("a".."d").each {|x| subject[x] = 1 }
81
- lambda { subject["e"] = 5 }.should change { chain }.to(%w|e d c b|)
82
- lambda { subject["f"] = 6 }.should change { chain }.to(%w|f e d c|)
96
+ expect { subject["e"] = 5 }.to change { chain }.to(%w|e d c b|)
97
+ expect { subject["f"] = 6 }.to change { chain }.to(%w|f e d c|)
83
98
  end
84
99
 
85
100
  it "should update items" do
86
101
  ("a".."d").each {|x| subject[x] = 1 }
87
- lambda { subject["d"] = 2 }.should_not change { chain }
88
- lambda { subject["c"] = 2 }.should change { chain }.to(%w|c d b a|)
89
- lambda { subject["b"] = 2 }.should change { chain }.to(%w|b c d a|)
90
- lambda { subject["a"] = 2 }.should change { chain }.to(%w|a b c d|)
102
+ expect { subject["d"] = 2 }.not_to change { chain }
103
+ expect { subject["c"] = 2 }.to change { chain }.to(%w|c d b a|)
104
+ expect { subject["b"] = 2 }.to change { chain }.to(%w|b c d a|)
105
+ expect { subject["a"] = 2 }.to change { chain }.to(%w|a b c d|)
91
106
  end
92
107
 
93
108
  end
@@ -95,19 +110,19 @@ describe TimedLRU do
95
110
  describe "retrieving" do
96
111
 
97
112
  it 'should fetch values' do
98
- subject.fetch("a").should be_nil
99
- subject["a"].should be_nil
113
+ expect(subject.fetch("a")).to be_nil
114
+ expect(subject["a"]).to be_nil
100
115
  subject["a"] = 1
101
- subject["a"].should == 1
116
+ expect(subject["a"]).to eq(1)
102
117
  end
103
118
 
104
119
  it 'should renew membership on access' do
105
120
  ("a".."d").each {|x| subject[x] = 1 }
106
- lambda { subject["d"] }.should_not change { chain }
107
- lambda { subject["c"] }.should change { chain }.to(%w|c d b a|)
108
- lambda { subject["b"] }.should change { chain }.to(%w|b c d a|)
109
- lambda { subject["a"] }.should change { chain }.to(%w|a b c d|)
110
- lambda { subject["x"] }.should_not change { chain }
121
+ expect { subject["d"] }.not_to change { chain }
122
+ expect { subject["c"] }.to change { chain }.to(%w|c d b a|)
123
+ expect { subject["b"] }.to change { chain }.to(%w|b c d a|)
124
+ expect { subject["a"] }.to change { chain }.to(%w|a b c d|)
125
+ expect { subject["x"] }.not_to change { chain }
111
126
  end
112
127
 
113
128
  end
@@ -115,18 +130,18 @@ describe TimedLRU do
115
130
  describe "deleting" do
116
131
 
117
132
  it 'should delete an return values' do
118
- subject.delete("a").should be_nil
133
+ expect(subject.delete("a")).to be_nil
119
134
  subject["a"] = 1
120
- subject.delete("a").should == 1
135
+ expect(subject.delete("a")).to eq(1)
121
136
  end
122
137
 
123
138
  it 'should re-arrange membership chain' do
124
139
  ("a".."d").each {|x| subject[x] = 1 }
125
- lambda { subject.delete("x") }.should_not change { chain }
126
- lambda { subject.delete("c") }.should change { chain }.to(%w|d b a|)
127
- lambda { subject.delete("a") }.should change { chain }.to(%w|d b|)
128
- lambda { subject.delete("d") }.should change { chain }.to(%w|b|)
129
- lambda { subject.delete("b") }.should change { subject.size }.from(1).to(0)
140
+ expect { subject.delete("x") }.not_to change { chain }
141
+ expect { subject.delete("c") }.to change { chain }.to(%w|d b a|)
142
+ expect { subject.delete("a") }.to change { chain }.to(%w|d b|)
143
+ expect { subject.delete("d") }.to change { chain }.to(%w|b|)
144
+ expect { subject.delete("b") }.to change { subject.size }.from(1).to(0)
130
145
  end
131
146
 
132
147
  end
@@ -135,43 +150,43 @@ describe TimedLRU do
135
150
  subject { described_class.new max_size: 4, ttl: 60 }
136
151
 
137
152
  def in_past(ago)
138
- Time.stub now: (Time.now - ago)
153
+ allow(Time).to receive_messages now: (Time.now - ago)
139
154
  yield
140
155
  ensure
141
- Time.unstub :now
156
+ allow(Time).to receive(:now).and_call_original
142
157
  end
143
158
 
144
159
  it 'should expire on access' do
145
160
  in_past(70) do
146
161
  subject["a"] = 1
147
- chain.should == %w|a|
162
+ expect(chain).to eq(%w|a|)
148
163
  end
149
164
 
150
165
  in_past(50) do
151
166
  subject["b"] = 2
152
- chain.should == %w|b a|
167
+ expect(chain).to eq(%w|b a|)
153
168
  end
154
169
 
155
170
  subject["c"] = 3
156
- chain.should == %w|c b|
171
+ expect(chain).to eq(%w|c b|)
157
172
  end
158
173
 
159
174
  it 'should renew expiration on access' do
160
175
  in_past(70) do
161
176
  subject["a"] = 1
162
177
  subject["b"] = 2
163
- chain.should == %w|b a|
178
+ expect(chain).to eq(%w|b a|)
164
179
  end
165
180
 
166
181
  in_past(50) do
167
- subject["a"].should == 1
168
- chain.should == %w|a b|
182
+ expect(subject["a"]).to eq(1)
183
+ expect(chain).to eq(%w|a b|)
169
184
  end
170
185
 
171
186
  subject["c"] = 3
172
- chain.should == %w|c a|
187
+ expect(chain).to eq(%w|c a|)
173
188
  end
174
189
 
175
190
  end
176
191
 
177
- end
192
+ end
data/timed_lru.gemspec CHANGED
@@ -1,11 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
- s.required_ruby_version = '>= 1.9.1'
3
- s.required_rubygems_version = ">= 1.8.0"
2
+ s.required_ruby_version = '>= 2.2.0'
4
3
 
5
4
  s.name = File.basename(__FILE__, '.gemspec')
6
5
  s.summary = "Timed LRU"
7
6
  s.description = "Thread-safe LRU implementation with (optional) TTL and constant time operations"
8
- s.version = "0.3.1"
7
+ s.version = "0.3.2"
9
8
 
10
9
  s.authors = ["Black Square Media"]
11
10
  s.email = "info@blacksquaremedia.com"
@@ -19,4 +18,5 @@ Gem::Specification.new do |s|
19
18
  s.add_development_dependency "bundler"
20
19
  s.add_development_dependency "rspec"
21
20
  s.add_development_dependency "yard"
21
+ s.add_development_dependency "redcarpet"
22
22
  end
metadata CHANGED
@@ -1,78 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timed_lru
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
5
- prerelease:
4
+ version: 0.3.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Black Square Media
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-04 00:00:00.000000000 Z
11
+ date: 2017-12-21 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: bundler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: yard
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: redcarpet
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
+ - - ">="
76
81
  - !ruby/object:Gem::Version
77
82
  version: '0'
78
83
  description: Thread-safe LRU implementation with (optional) TTL and constant time
@@ -82,38 +87,38 @@ executables: []
82
87
  extensions: []
83
88
  extra_rdoc_files: []
84
89
  files:
85
- - .gitignore
90
+ - ".gitignore"
91
+ - ".travis.yml"
86
92
  - Gemfile
87
93
  - Gemfile.lock
88
94
  - README.md
89
95
  - Rakefile
90
96
  - lib/timed_lru.rb
97
+ - spec/coverage_helper.rb
91
98
  - spec/spec_helper.rb
92
99
  - spec/timed_lru_spec.rb
93
100
  - timed_lru.gemspec
94
101
  homepage: https://github.com/bsm/timed_lru
95
102
  licenses: []
103
+ metadata: {}
96
104
  post_install_message:
97
105
  rdoc_options: []
98
106
  require_paths:
99
107
  - lib
100
108
  required_ruby_version: !ruby/object:Gem::Requirement
101
- none: false
102
109
  requirements:
103
- - - ! '>='
110
+ - - ">="
104
111
  - !ruby/object:Gem::Version
105
- version: 1.9.1
112
+ version: 2.2.0
106
113
  required_rubygems_version: !ruby/object:Gem::Requirement
107
- none: false
108
114
  requirements:
109
- - - ! '>='
115
+ - - ">="
110
116
  - !ruby/object:Gem::Version
111
- version: 1.8.0
117
+ version: '0'
112
118
  requirements: []
113
119
  rubyforge_project:
114
- rubygems_version: 1.8.24
120
+ rubygems_version: 2.6.14
115
121
  signing_key:
116
- specification_version: 3
122
+ specification_version: 4
117
123
  summary: Timed LRU
118
124
  test_files: []
119
- has_rdoc: