elephant-cache 1.0.0

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.
data/LICENSE.txt ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2010, Jeffrey C. Reinecke
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+ * Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ * Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+ * Neither the name of the copyright holders nor the
12
+ names of its contributors may be used to endorse or promote products
13
+ derived from this software without specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL JEFFREY REINECKE BE LIABLE FOR ANY
19
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.rdoc ADDED
@@ -0,0 +1,63 @@
1
+ = Overview
2
+
3
+ Elephant provides a caching module that may be included into a class for easy
4
+ internal caching. The code for this is simple, but is common enough of a design
5
+ pattern that having a reusable module is handy.
6
+
7
+ Usage is quite simple:
8
+
9
+ 1. include Elephant::Cache.
10
+ 2. In your object's initialize method, call +initialize_cache+.
11
+ 3. Create accessors for cachable quantities, using the +cache+ method.
12
+
13
+ Example:
14
+
15
+ class Point
16
+
17
+ def initialize(x=0, y=0)
18
+ initialize_cache
19
+ self.x = x
20
+ self.y = y
21
+ end
22
+
23
+ attr_reader :x, :y
24
+
25
+ def magnitude
26
+ return cache(__method__) do
27
+ Math.sqrt(self.x**2 + self.y**2)
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ Additionally, if you were to make the point mutable, you'd want to dirty the
34
+ cache like so:
35
+
36
+ def x=(x)
37
+ dirty_cache(:magnitude)
38
+ @x = x
39
+ end
40
+
41
+ def y=(y)
42
+ dirty_cache(:magnitude)
43
+ @y = y
44
+ end
45
+
46
+ Or, if you want to dirty the entire cache, call <code>dirty_cache()</code> with
47
+ no arguments.
48
+
49
+ See the Elephant::Cache module for more information.
50
+
51
+ = Contact
52
+
53
+ If you have any questions, comments, concerns, patches, or bugs, you can contact
54
+ me via the github repository at:
55
+
56
+ http://github.com/paploo/elephant
57
+
58
+ or directly via e-mail at:
59
+
60
+ mailto:jeff@paploo.net
61
+
62
+ = Version History
63
+ [1.0.0 - 2011-Aug-28] Initial release.
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ require 'rake'
2
+ require "rake/rdoctask"
3
+
4
+ # ===== RDOC BUILDING =====
5
+ # This isn't necessary if installing from a gem.
6
+
7
+ Rake::RDocTask.new do |rdoc|
8
+ rdoc.rdoc_dir = "rdoc"
9
+ rdoc.rdoc_files.add "lib/**/*.rb", "README.rdoc"
10
+ end
11
+
12
+ # ===== SPEC TESTING =====
13
+
14
+ begin
15
+ require "spec/rake/spectask"
16
+
17
+ Spec::Rake::SpecTask.new(:spec) do |spec|
18
+ spec.spec_opts = ['-c' '-f specdoc']
19
+ spec.spec_files = ['spec']
20
+ end
21
+
22
+ Spec::Rake::SpecTask.new(:spec_with_backtrace) do |spec|
23
+ spec.spec_opts = ['-c' '-f specdoc', '-b']
24
+ spec.spec_files = ['spec']
25
+ end
26
+ rescue LoadError
27
+ task :spec do
28
+ puts "You must have rspec installed to run this task."
29
+ end
30
+ end
31
+
32
+ # ===== GEM BUILDING =====
33
+
34
+ desc "Build the gem file for this package"
35
+ task :build_gem do
36
+ STDOUT.puts `gem build elephant-cache.gemspec`
37
+ end
@@ -0,0 +1,52 @@
1
+ module Elephant
2
+ # A simple caching API.
3
+ #
4
+ # To use, initialize the cache in your object initialize method, then
5
+ # simply call <code>cache(:lookup_key){...}</code> with the block generating the value
6
+ # that should be cached. From then on, it'll use the cached value (unless
7
+ # you dirty the cache, of course).
8
+ #
9
+ # If you want to access a cached value outside of where it is created, it is
10
+ # best to cache the value in an accessor method and then call the accessor.
11
+ #
12
+ # Note: Outside of initialize_cache, the APIs are designed in a way that
13
+ # easily facilitates using any cache store, as long as it has hash-like access.
14
+ # Thus, one could make a mapper to Memcache or Mongo and override initialize_cache
15
+ # with a new implementation before calling it, and you'd be able to store anywhere.
16
+ module Cache
17
+
18
+ private
19
+
20
+ # Initializes the cache. This should be called in your object's initialize
21
+ # method. Note that this can be overriden to use any hash-like object you
22
+ # want as a cache store, allowing use of Memcache, Mongo, or SQL.
23
+ def initialize_cache
24
+ @elephant_cache = {}
25
+ end
26
+
27
+ # Retrieves the value for the given key from the cache, calculating it from
28
+ # the block if necessary.
29
+ #
30
+ # Ex:
31
+ # def foo
32
+ # return cache_value(__method__) { ...do a lot of work... }
33
+ # end
34
+ def cache_value(key)
35
+ unless(@elephant_cache.include?(key))
36
+ @elephant_cache[key] = yield if block_given?
37
+ end
38
+ return @elephant_cache[key]
39
+ end
40
+
41
+ # Given a key, it dirties the cache for that key so that the next access
42
+ # will recalculate it. If no key is given, it cleas the entire cache.
43
+ def dirty_cache(key=nil)
44
+ if(key.nil?)
45
+ @elephant_cache.clear
46
+ else
47
+ @elephant_cache.delete(key)
48
+ end
49
+ end
50
+
51
+ end
52
+ end
data/lib/elephant.rb ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), 'elephant', 'cache')
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elephant-cache
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.0
6
+ platform: ruby
7
+ authors:
8
+ - Jeff Reinecke
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-08-29 00:00:00 Z
14
+ dependencies: []
15
+
16
+ description: " A simple object caching design pattern in a reusable module.\n"
17
+ email: jeff@paploo.net
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - README.rdoc
26
+ - LICENSE.txt
27
+ - Rakefile
28
+ - lib/elephant/cache.rb
29
+ - lib/elephant.rb
30
+ homepage: http://www.github.com/paploo/elephant
31
+ licenses:
32
+ - BSD
33
+ post_install_message:
34
+ rdoc_options: []
35
+
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.8.7
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ requirements: []
51
+
52
+ rubyforge_project:
53
+ rubygems_version: 1.8.5
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: A simple object caching design pattern in a reusable module.
57
+ test_files: []
58
+