barking_iguana-cache_bucket 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c90c21ce4ef8a040fa432ce3f00a5359388039da
4
- data.tar.gz: 499b20e6a2c0bd512fc110a8fb6e2f61491d1008
3
+ metadata.gz: 37fb5d68814bf9fd29d3dfbe8edb21ae5ec08399
4
+ data.tar.gz: 44ae25e4af0c0e80625eec93b6737f8ca9e0fa7a
5
5
  SHA512:
6
- metadata.gz: 8ee6d900f6a57a301115a604ddd4fd6cb0c23ef10e9bd9621491fa7b6677e0fd7de73c79c188019f21b8ec8446ea0837d6aa82fad094bdd3620df9d03294fa80
7
- data.tar.gz: 17faf5648ae72761f58156c506b55965d50c40e170ed508db8827af80b57d680541a6077ee674d3bcb106b522e5b4819b32907d8eececb718441087174df2e92
6
+ metadata.gz: 80a3dca076566a9c5d3327b5e693769b6e77bd0f52f955744796c7aec502f3230ca5f136257116adeee4299050f984f539c820f5d0c2349f4c238ea79e3804a4
7
+ data.tar.gz: 819e4aa1809b29eb301556e78f63d17f90e99b21a6afc232e169496c1db1183ca0f3e230aaa28d15b261bb416d4fc4188078422feccf0e438d612e7232dc601f
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # BarkingIguana::CacheBucket
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/barking_iguana/cache_bucket`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Provides a naive but easy to set up cache with time based expiry.
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ Time based expiry in implemented as a maximum age that the cached objects _may_
6
+ reach. It's not a guarantee that the objects _will_ live that long.
6
7
 
7
8
  ## Installation
8
9
 
@@ -22,7 +23,86 @@ Or install it yourself as:
22
23
 
23
24
  ## Usage
24
25
 
25
- TODO: Write usage instructions here
26
+ Most likely you'll want to use the DSL in your class:
27
+
28
+ ```ruby
29
+ require 'barking_iguana/cache_bucket'
30
+
31
+ class Thing
32
+ include BarkingIguana::CacheBucket::DSL
33
+
34
+ def expensive_operation
35
+ cache_bucket.get 'expensive_operation' do
36
+ object_id
37
+ end
38
+ end
39
+ end
40
+ ```
41
+
42
+ **BEWARE!** The cache will persist across instances of the class:
43
+
44
+ ```ruby
45
+ # Create two new instances of the class
46
+ t1 = Thing.new
47
+ t2 = Thing.new
48
+
49
+ # These have different object ids:
50
+ t1.object_id #=> 70248246472260
51
+ t2.object_id #=> 70248259056820
52
+
53
+ # But the same value is returned from both:
54
+ t1.expensive_operation #=> 70248246472260
55
+ t2.expensive_operation #=> 70248246472260
56
+ ```
57
+
58
+ If you need `CacheBucket`s that are scoped to instances you should use a
59
+ `prefix`:
60
+
61
+ ```ruby
62
+ class ScopedThing
63
+ include BarkingIguana::CacheBucket::DSL
64
+
65
+ def expensive_operation
66
+ cache_bucket.get 'expensive_operation', prefix: "instance_#{id}" do
67
+ object_id
68
+ end
69
+ end
70
+ end
71
+
72
+ # Create two new instances of the class
73
+ s1 = ScopedThing.new
74
+ s2 = ScopedThing.new
75
+
76
+ # These have different object ids:
77
+ s1.object_id #=> 70248246472260
78
+ s2.object_id #=> 70248259056820
79
+
80
+ # Now a different value is returned from both:
81
+ s1.expensive_operation #=> 70248246472260
82
+ s2.expensive_operation #=> 70248259056820
83
+ ```
84
+
85
+ ### Configuration
86
+
87
+ You may configure a few things about the behaviour of the `CacheBucket`s.
88
+
89
+ #### Logging
90
+
91
+ ```ruby
92
+ BarkingIguana::CacheBucket.logger = Logger.new($stdout)
93
+ ```
94
+
95
+ It logs at `Logger::DEBUG`, so you won't see very much unless you crank the log
96
+ level of your logger _way_ up.
97
+
98
+ #### Cache Horizon
99
+
100
+ The default is 3600 seconds - one hour. You can set it to any number of seconds
101
+ though. Please note that I only support integer numbers of seconds.
102
+
103
+ ```ruby
104
+ BarkingIguana::CacheBucket.maximum_age = 7200
105
+ ```
26
106
 
27
107
  ## Development
28
108
 
@@ -32,5 +112,5 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
112
 
33
113
  ## Contributing
34
114
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/barking_iguana-cache_bucket.
115
+ Bug reports and pull requests are welcome on GitHub at https://github.com/barking_iguana/cache_bucket.
36
116
 
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_dependency "null_logger"
30
+ spec.add_dependency "barking_iguana-otk", "~> 0.1.0"
30
31
  spec.add_development_dependency "bundler", "~> 1.11"
31
32
  spec.add_development_dependency "rake", "~> 10.0"
32
33
  spec.add_development_dependency "rspec", "~> 3.0"
@@ -1,18 +1,13 @@
1
+ require "barking_iguana/otk/defaults"
1
2
  require "barking_iguana/cache_bucket/version"
2
3
  require "barking_iguana/cache_bucket/cache_bucket"
3
4
  require "barking_iguana/cache_bucket/dsl"
4
5
 
5
6
  module BarkingIguana
6
7
  module CacheBucket
7
- class << self
8
- attr_accessor :logger
9
- end
10
- self.logger = NullLogger.instance
11
-
12
- class << self
13
- attr_accessor :maximum_age
14
- end
15
- self.maximum_age = 3600
8
+ include Otk::Defaults
9
+ defaults logger: NullLogger.instance,
10
+ maximum_age: 3600
16
11
 
17
12
  def self.get name, options = {}
18
13
  buckets[name] ||= create_bucket name, options
@@ -29,5 +24,6 @@ module BarkingIguana
29
24
  o[:maximum_age] ||= maximum_age
30
25
  CacheBucket.new o
31
26
  end
27
+ private_class_method :create_bucket
32
28
  end
33
29
  end
@@ -3,7 +3,9 @@ require 'null_logger'
3
3
  module BarkingIguana
4
4
  module CacheBucket
5
5
  class CacheBucket
6
+ SHARED_PREFIX = '##shared##'.freeze
6
7
  KEY_DIVIDER = '__'.freeze
8
+ MAXIMUM_AGE = 3600
7
9
 
8
10
  attr_accessor :maximum_age
9
11
  private :maximum_age=, :maximum_age
@@ -17,16 +19,16 @@ module BarkingIguana
17
19
  attr_accessor :cache
18
20
  private :cache=, :cache
19
21
 
20
- def initialize maximum_age: 3600, logger: nil
22
+ def initialize maximum_age: MAXIMUM_AGE, logger: nil
21
23
  self.maximum_age = maximum_age.to_i
22
24
  self.logger = logger || NullLogger.instance
23
25
  self.cache = {}
24
26
  end
25
27
 
26
- def get key
27
- logger.debug { "Getting #{key}" }
28
+ def get key, prefix: SHARED_PREFIX
28
29
  evict_expired_keys
29
- k = generation_key(key)
30
+ k = generation_key(key, prefix)
31
+ logger.debug { "Getting #{k.inspect} (key: #{key.inspect}, prefix: #{prefix.inspect})" }
30
32
  if cache.key? k
31
33
  logger.debug { "Key #{k.inspect} found in the cache" }
32
34
  cache[k].tap do |v|
@@ -43,10 +45,10 @@ module BarkingIguana
43
45
  end
44
46
  end
45
47
 
46
- def set key, value
48
+ def set key, value, prefix: SHARED_PREFIX
47
49
  evict_expired_keys
48
- k = generation_key(key)
49
- logger.debug { "Setting value to #{value.inspect}" }
50
+ k = generation_key(key, prefix)
51
+ logger.debug { "Setting #{k.inspect} (key: #{key.inspect}, prefix: #{prefix.inspect}) to #{value.inspect}" }
50
52
  cache[k] = value
51
53
  end
52
54
 
@@ -68,10 +70,8 @@ module BarkingIguana
68
70
  Time.now.to_i / maximum_age
69
71
  end
70
72
 
71
- def generation_key key
72
- [ generation_id, key ].join(KEY_DIVIDER).tap do |k|
73
- logger.debug { "Current generation key for #{key.inspect} is #{k.inspect}" }
74
- end
73
+ def generation_key key, prefix
74
+ [ generation_id, prefix, key ].join(KEY_DIVIDER)
75
75
  end
76
76
  end
77
77
  end
@@ -1,5 +1,31 @@
1
1
  module BarkingIguana
2
2
  module CacheBucket
3
+ # Include this DSL in classes where you'd like to easily access a
4
+ # `CacheBucket` instance named after the class it's being included into.
5
+ #
6
+ # In each class and instance of that class you'll get access to a
7
+ # `cache_bucket` method to provide access to a `CacheBucket`.
8
+ #
9
+ #
10
+ # class Example
11
+ # def self.class_method
12
+ # cache_bucket.get 'foo' do
13
+ # 'bar_set_in_class_method'
14
+ # end
15
+ # end
16
+ #
17
+ # def instance_method
18
+ # puts cache_bucket.get 'foo'
19
+ # end
20
+ # end
21
+ #
22
+ # Given the above class definition, here's some example output:
23
+ #
24
+ # Example.class_method
25
+ # Example.new.instance_method #=> 'bar_set_in_class_method'
26
+ #
27
+ # It's hard to imagine a place where you'll actually want to use the
28
+ # instance variable of this, and it may be removed in future releases.
3
29
  module DSL
4
30
  def self.included into
5
31
  into.extend ClassMethods
@@ -7,13 +33,15 @@ module BarkingIguana
7
33
  end
8
34
 
9
35
  module InstanceMethods
10
- def class_cache options = {}
36
+ # Access the Cache Bucket for thisinstances class.
37
+ def cache_bucket options = {}
11
38
  BarkingIguana::CacheBucket.get self.class.name, options
12
39
  end
13
40
  end
14
41
 
15
42
  module ClassMethods
16
- def class_cache options = {}
43
+ # Access the Cache Bucket for this class.
44
+ def cache_bucket options = {}
17
45
  BarkingIguana::CacheBucket.get name, options
18
46
  end
19
47
  end
@@ -1,5 +1,5 @@
1
1
  module BarkingIguana
2
2
  module CacheBucket
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: barking_iguana-cache_bucket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig R Webster
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: barking_iguana-otk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement