lru_qache 0.1.0 → 0.1.2
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 +4 -4
- data/README.md +1 -1
- data/lib/lru_qache.rb +19 -25
- data/lib/lru_qache/version.rb +1 -1
- data/lru_qache.gemspec +3 -3
- metadata +4 -6
- data/lib/lru_qache/lru_queue.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce54ab1353d2238480ec292912794f944f54346c01ef056e09b0d423b0a4b523
|
4
|
+
data.tar.gz: 3a7717a5d6c8d3b59a4c1a153b2d5b2748a44c356bf76a02e7cae5acc9cd8abb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29cc291ab8a88eb1de5d07217a632de206e3d9ecda03a4ea86bcb0b12e8c46254999d5dc3be8527c838f55b4b536cf2b802e664f8fad31722edb4f825b1b613f
|
7
|
+
data.tar.gz: c37522b2aefa7c9b6aecde01472db8c46b05677572425f33b73e4e6fa6d8079f856d02ed53210968523fa9e1ed596b8f34de7ac97aaad1d0dcb4959f227935d6
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# LRUQache
|
2
2
|
|
3
|
-
The LRU(least recently used) caching scheme is to remove the least recently used item when the cache reaches it's defined capacity. This gem implements this cache using a
|
3
|
+
The LRU(least recently used) caching scheme is to remove the least recently used item when the cache reaches it's defined capacity. This gem implements this cache using a core Hash which is [ordered hash](https://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/). But this will work only if Ruby version is greater than 1.9.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
data/lib/lru_qache.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
|
-
require "lru_qache/lru_queue"
|
2
|
-
|
3
|
-
class LRUQache # LRU cache is caching technique based on recently used data.
|
1
|
+
# require "lru_qache/lru_queue"
|
2
|
+
class LruQache # LRU cache is caching technique based on recently used data.
|
4
3
|
MAX_CAPACITY = 5
|
5
4
|
DEFAULT_VAL = -1
|
6
5
|
|
7
6
|
InvalidCapacityError = Class.new RuntimeError
|
8
7
|
INVALID_CAPACITY = 'Capacity must be valid number'.freeze
|
9
8
|
|
10
|
-
attr_reader :options, :cache
|
9
|
+
attr_reader :options, :cache, :capacity
|
11
10
|
|
12
11
|
# @param capacity [Integer] Takes a number as an input and
|
13
12
|
# @param options [Hash] optional hash for some settings like custom value if \
|
@@ -17,7 +16,7 @@ class LRUQache # LRU cache is caching technique based on recently used data.
|
|
17
16
|
raise InvalidLimitError, INVALID_CAPACITY unless capacity.is_a?(Integer)
|
18
17
|
@cache = {}
|
19
18
|
@options = options
|
20
|
-
@
|
19
|
+
@capacity = capacity
|
21
20
|
end
|
22
21
|
|
23
22
|
# This gets the value based on the key is provided, updates the key usage
|
@@ -26,9 +25,9 @@ class LRUQache # LRU cache is caching technique based on recently used data.
|
|
26
25
|
# @return value [Object] if key is present
|
27
26
|
# @example get(x)
|
28
27
|
def get(key)
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
value = retrieve(key)
|
29
|
+
update_lru(key) unless value == options[:default_val]
|
30
|
+
value
|
32
31
|
end
|
33
32
|
|
34
33
|
# Sets the value of cache's key
|
@@ -36,46 +35,41 @@ class LRUQache # LRU cache is caching technique based on recently used data.
|
|
36
35
|
# @param key any valid object
|
37
36
|
# @param key any valid object
|
38
37
|
# @example set('a', 1)
|
39
|
-
|
40
38
|
# @todo Add validation to the key e.g. only Symbol, String or Integer etc.
|
41
39
|
def set(key, val)
|
42
|
-
|
40
|
+
@cache.delete(key) if cache.has_key?(key)
|
43
41
|
@cache[key] = val
|
42
|
+
remove_lru_if_needed
|
43
|
+
val
|
44
44
|
end
|
45
45
|
|
46
46
|
alias [] get
|
47
47
|
alias []= set
|
48
48
|
|
49
49
|
private
|
50
|
-
|
51
|
-
# Logic to handle whether to set a key, now it only checks if key present
|
52
|
-
#
|
53
|
-
# @param Takes key the input, it can be any valid Object needed for hash
|
54
|
-
def need_to_set?(key)
|
55
|
-
retrieve(key).nil?
|
56
|
-
end
|
57
|
-
|
58
50
|
# This is used for not modifying the 'last_used' key when using internal logic
|
59
51
|
#
|
60
52
|
# @param key input parameter
|
61
53
|
# @return value [Object] if key is present
|
62
54
|
def retrieve(key)
|
63
|
-
cache[
|
55
|
+
cache.fetch(key) { options[:default_val] }
|
64
56
|
end
|
65
57
|
|
66
58
|
# This removes the least recently used key from cache and also updates queue
|
67
59
|
#
|
68
60
|
# @param key input parameter
|
69
|
-
def remove_lru_if_needed
|
70
|
-
|
71
|
-
@cache.delete(@lru_queue.last_popped) if @lru_queue.full?
|
61
|
+
def remove_lru_if_needed
|
62
|
+
# update the queue with new key
|
72
63
|
# remove LRU key if capacity is full.
|
64
|
+
cache.shift if cache.size > capacity
|
73
65
|
end
|
74
66
|
|
75
|
-
# Updates the
|
67
|
+
# Updates the lru with the key, removes key and sets again so key goes
|
68
|
+
# to the last
|
76
69
|
#
|
77
70
|
# @param Takes key the input, it can be any valid Object needed for hash
|
78
|
-
def
|
79
|
-
|
71
|
+
def update_lru(key)
|
72
|
+
val = cache.delete(key)
|
73
|
+
cache[key] = val
|
80
74
|
end
|
81
75
|
end
|
data/lib/lru_qache/version.rb
CHANGED
data/lru_qache.gemspec
CHANGED
@@ -5,15 +5,15 @@ Gem::Specification.new do |spec|
|
|
5
5
|
spec.version = LRUQache::VERSION
|
6
6
|
spec.date = '2020-08-03'
|
7
7
|
spec.summary = 'LRU Cache using a queue.'
|
8
|
-
spec.description = 'A simple LRU(Least Recently Used) Cache implementation using
|
8
|
+
spec.description = 'A simple LRU(Least Recently Used) Cache implementation using Ruby Hash'
|
9
9
|
spec.authors = ['Datt Dongare']
|
10
10
|
spec.email = 'duttdongare30@gmail.com'
|
11
11
|
spec.homepage = 'https://rubygems.org/gems/lru-qache'
|
12
|
-
spec.metadata['homepage_uri'] = 'https://rubygems.org/gems/
|
12
|
+
spec.metadata['homepage_uri'] = 'https://rubygems.org/gems/lru_qache'
|
13
13
|
spec.metadata['source_code_uri'] = 'https://github.com/datt/lru_qache'
|
14
14
|
spec.require_paths = ['lib']
|
15
15
|
spec.license = 'MIT'
|
16
|
-
spec.required_ruby_version = Gem::Requirement.new('>=
|
16
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 1.9')
|
17
17
|
# Specify which files should be added to the gem when it is released.
|
18
18
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
19
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lru_qache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datt Dongare
|
@@ -38,8 +38,7 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.9.25
|
41
|
-
description: A simple LRU(Least Recently Used) Cache implementation using
|
42
|
-
queue.
|
41
|
+
description: A simple LRU(Least Recently Used) Cache implementation using Ruby Hash
|
43
42
|
email: duttdongare30@gmail.com
|
44
43
|
executables: []
|
45
44
|
extensions: []
|
@@ -53,14 +52,13 @@ files:
|
|
53
52
|
- bin/console
|
54
53
|
- bin/setup
|
55
54
|
- lib/lru_qache.rb
|
56
|
-
- lib/lru_qache/lru_queue.rb
|
57
55
|
- lib/lru_qache/version.rb
|
58
56
|
- lru_qache.gemspec
|
59
57
|
homepage: https://rubygems.org/gems/lru-qache
|
60
58
|
licenses:
|
61
59
|
- MIT
|
62
60
|
metadata:
|
63
|
-
homepage_uri: https://rubygems.org/gems/
|
61
|
+
homepage_uri: https://rubygems.org/gems/lru_qache
|
64
62
|
source_code_uri: https://github.com/datt/lru_qache
|
65
63
|
post_install_message:
|
66
64
|
rdoc_options: []
|
@@ -70,7 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
68
|
requirements:
|
71
69
|
- - ">="
|
72
70
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
71
|
+
version: '1.9'
|
74
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
73
|
requirements:
|
76
74
|
- - ">="
|
data/lib/lru_qache/lru_queue.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
class LRUQueue # Maintains a fixed size queue with unique keys
|
2
|
-
attr_reader :max_size, :last_popped
|
3
|
-
attr_accessor :queue
|
4
|
-
ARG_ERROR = 'ArgError:: Passing Max Size is mandatory and must be a number' \
|
5
|
-
.freeze
|
6
|
-
|
7
|
-
# @param max_size [Integer] Takes a number as an input, for queue size
|
8
|
-
def initialize(max_size)
|
9
|
-
raise ARG_ERROR if max_size.nil? || !max_size.is_a?(Integer)
|
10
|
-
@max_size = max_size
|
11
|
-
@queue = []
|
12
|
-
@last_popped = nil
|
13
|
-
end
|
14
|
-
|
15
|
-
# removes last item from the queue
|
16
|
-
def pop
|
17
|
-
@last_popped = queue.pop
|
18
|
-
end
|
19
|
-
|
20
|
-
# Pushes item in the queue based on some conditions
|
21
|
-
# 1. If item is repeated it pushed at first, removes duplicate
|
22
|
-
# 2. If full, remove least used item i.e. last item and push
|
23
|
-
# @param item [Object] takes any object and pushes in queue
|
24
|
-
def push(item)
|
25
|
-
queue.delete(item) if queue.include?(item) # deletes the key if present
|
26
|
-
pop if full? # delete last item if queue is full
|
27
|
-
queue.unshift(item) # insert at the start
|
28
|
-
end
|
29
|
-
|
30
|
-
# tells whether the queue is full or not
|
31
|
-
def full?
|
32
|
-
max_size == queue.size
|
33
|
-
end
|
34
|
-
end
|