elephas 0.1.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.
Files changed (45) hide show
  1. data/.gitignore +5 -0
  2. data/.travis.yml +8 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +9 -0
  5. data/README.md +28 -0
  6. data/Rakefile +18 -0
  7. data/doc/Elephas/Cache.html +815 -0
  8. data/doc/Elephas/Entry.html +1085 -0
  9. data/doc/Elephas/Exceptions.html +115 -0
  10. data/doc/Elephas/Providers/Base.html +701 -0
  11. data/doc/Elephas/Providers/Hash.html +775 -0
  12. data/doc/Elephas/Providers/RubyOnRails.html +609 -0
  13. data/doc/Elephas/Providers.html +129 -0
  14. data/doc/Elephas/Version.html +189 -0
  15. data/doc/Elephas.html +130 -0
  16. data/doc/_index.html +207 -0
  17. data/doc/class_list.html +53 -0
  18. data/doc/css/common.css +1 -0
  19. data/doc/css/full_list.css +57 -0
  20. data/doc/css/style.css +328 -0
  21. data/doc/file.README.html +103 -0
  22. data/doc/file_list.html +55 -0
  23. data/doc/frames.html +28 -0
  24. data/doc/index.html +103 -0
  25. data/doc/js/app.js +214 -0
  26. data/doc/js/full_list.js +173 -0
  27. data/doc/js/jquery.js +4 -0
  28. data/doc/method_list.html +300 -0
  29. data/doc/top-level-namespace.html +112 -0
  30. data/elephas.gemspec +34 -0
  31. data/lib/elephas/cache.rb +89 -0
  32. data/lib/elephas/entry.rb +86 -0
  33. data/lib/elephas/provider.rb +57 -0
  34. data/lib/elephas/providers/hash.rb +65 -0
  35. data/lib/elephas/providers/ruby_on_rails.rb +57 -0
  36. data/lib/elephas/version.rb +25 -0
  37. data/lib/elephas.rb +20 -0
  38. data/spec/coverage_helper.rb +19 -0
  39. data/spec/elephas/cache_spec.rb +41 -0
  40. data/spec/elephas/entry_spec.rb +11 -0
  41. data/spec/elephas/provider_spec.rb +46 -0
  42. data/spec/elephas/providers/hash_spec.rb +80 -0
  43. data/spec/elephas/providers/ruby_on_rails_spec.rb +86 -0
  44. data/spec/spec_helper.rb +16 -0
  45. metadata +231 -0
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.8.2.1
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!" + escape(window.location.href);
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+
36
+
37
+ <span class="title">Top Level Namespace</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a class="full_list_link" id="class_list_link"
46
+ href="class_list.html">
47
+ Class List
48
+ </a>
49
+
50
+ <a class="full_list_link" id="method_list_link"
51
+ href="method_list.html">
52
+ Method List
53
+ </a>
54
+
55
+ <a class="full_list_link" id="file_list_link"
56
+ href="file_list.html">
57
+ File List
58
+ </a>
59
+
60
+ </div>
61
+ <div class="clear"></div>
62
+ </div>
63
+
64
+ <iframe id="search_frame"></iframe>
65
+
66
+ <div id="content"><h1>Top Level Namespace
67
+
68
+
69
+
70
+ </h1>
71
+
72
+ <dl class="box">
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+ </dl>
82
+ <div class="clear"></div>
83
+
84
+ <h2>Defined Under Namespace</h2>
85
+ <p class="children">
86
+
87
+
88
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Elephas.html" title="Elephas (module)">Elephas</a></span>
89
+
90
+
91
+
92
+
93
+ </p>
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ </div>
104
+
105
+ <div id="footer">
106
+ Generated on Sat Jul 28 14:29:51 2012 by
107
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
108
+ 0.8.2.1 (ruby-1.9.2).
109
+ </div>
110
+
111
+ </body>
112
+ </html>
data/elephas.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require File.expand_path('../lib/elephas/version', __FILE__)
8
+
9
+ Gem::Specification.new do |gem|
10
+ gem.name = "elephas"
11
+ gem.version = Elephas::Version::STRING
12
+ gem.homepage = "http://github.com/ShogunPanda/elephas"
13
+ gem.summary = %q{A storage agnostic caching framework.}
14
+ gem.description = %q{A storage agnostic caching framework.}
15
+ gem.rubyforge_project = "elephas"
16
+
17
+ gem.authors = ["Shogun"]
18
+ gem.email = ["shogun_panda@me.com"]
19
+
20
+ gem.files = `git ls-files`.split($\)
21
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
22
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
23
+ gem.require_paths = ["lib"]
24
+
25
+ gem.add_dependency("cowtech-extensions", "~> 2.7.0")
26
+
27
+ gem.add_development_dependency("rspec", "~> 2.11.0")
28
+ gem.add_development_dependency("rake", "~> 0.9.0")
29
+ gem.add_development_dependency("simplecov", "~> 0.6.0")
30
+ gem.add_development_dependency("pry", "~> 0.9.10")
31
+ gem.add_development_dependency("yard", "~> 0.8.0")
32
+ gem.add_development_dependency("redcarpet", "~> 2.1.0")
33
+ gem.add_development_dependency("github-markup", "~> 0.7.0")
34
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ module Elephas
8
+ # This is the main class of the framework. Use only this class to access the cache.
9
+ class Cache
10
+ class << self
11
+ # The provider used for the caching.
12
+ attr_accessor :provider
13
+
14
+ # This is the main method of the framework.
15
+ # It tries reading a key from the cache. If it doesn't find it, it uses the provided block to compute its value and then store it into the cache for later usages.
16
+ #
17
+ # @param key [String] The key to lookup.
18
+ # @return [Object|Entry] The found or newly-set value associated to the key.
19
+ def use(key, options = {})
20
+ rv = nil
21
+
22
+ # Get options
23
+ options = {} if !options.is_a?(::Hash)
24
+ options = {:ttl => 1.hour, :force => false, :as_entry => false}.merge(options)
25
+ options[:ttl] == [options[:ttl].to_integer, 0].max
26
+ options[:force] = options[:force].to_boolean
27
+ options[:prefix] = options[:prefix].present? ? options[:prefix] : "elephas-#{::Elephas::Version::STRING}-cache"
28
+
29
+ # Wrap the final key to ensure we don't have colliding namespaces.
30
+ fkey = "#{options[:prefix]}[#{key}]"
31
+
32
+ # Compute the hash key used for referencing this value
33
+ options[:hash] = options[:hash] || ::Elephas::Entry.hashify_key(fkey.ensure_string)
34
+
35
+ # Check if the storage has the value (if we don't have to skip the cache)
36
+ rv = self.provider.read(options[:hash]) if options[:force] == false && options[:ttl] > 0
37
+
38
+ if rv.nil? && block_given? then # Try to compute the value from the block
39
+ rv = yield(key, options)
40
+
41
+ if rv && options[:ttl] > 0 then # We have a value and we have to store it
42
+ rv = ::Elephas::Entry.ensure(rv, key, options) # Make sure is an entry
43
+ Elephas::Cache.write(fkey, value, options)
44
+ end
45
+ end
46
+
47
+ # Return value
48
+ options[:as_entry] ? rv : rv.value.dup
49
+ end
50
+
51
+ # Reads a value from the cache.
52
+ #
53
+ # @param key [String] The key to lookup.
54
+ # @return [Object|NilClass] The read value or `nil`.
55
+ def read(key)
56
+ self.provider.read(key)
57
+ end
58
+
59
+ # Writes a value to the cache.
60
+ #
61
+ # @param key [String] The key to associate the value with.
62
+ # @param value [Object] The value to write. Setting a value to `nil` **doesn't** mean *deleting* the value.
63
+ # @param options [Hash] A list of options for writing.
64
+ # TODO: Insert options documentation.
65
+ # @return [Object] The value itself.
66
+ def write(key, value, options = {})
67
+ # TODO: Handle options
68
+
69
+ self.provider.write(key, value, options)
70
+ end
71
+
72
+ # Deletes a value from the cache.
73
+ #
74
+ # @param key [String] The key to delete.
75
+ # @return [TrueClass|FalseClass] `true` if the key was in the cache, `false` otherwise.
76
+ def delete(key)
77
+ self.provider.delete(key)
78
+ end
79
+
80
+ # Checks if a key exists in the cache.
81
+ #
82
+ # @param key [String] The key to lookup.
83
+ # @return [TrueClass|FalseClass] `true` if the key is in the cache, `false` otherwise.
84
+ def exists?(key)
85
+ self.provider.exists?(key)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,86 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ module Elephas
8
+ # This represents a cache entry.
9
+ class Entry
10
+ # The key for this entry.
11
+ attr_accessor :key
12
+
13
+ # The hashed (unique) key for this entry.
14
+ attr_accessor :hash
15
+
16
+ # The value contained in this entry.
17
+ attr_accessor :value
18
+
19
+ # The expected TTL of the entry, in milliseconds.
20
+ attr_accessor :ttl
21
+
22
+ # The last update date of the entry, in UNIX timestamp (with milliseconds).
23
+ attr_accessor :updated_at
24
+
25
+ # Creates a new entry.
26
+ #
27
+ # @param key [String] The key for this entry.
28
+ # @param value [Object] The value contained in this entry.
29
+ # @param hash [String] The hash for this entry. Should be unique. It is automatically created if not provided.
30
+ # @param ttl [Integer] The time to live (TTL) for this entry. If set to 0 then the entry is not cached.
31
+ def initialize(key, value, hash = nil, ttl = 3600)
32
+ hash = self.class.hashify_key(key) if hash.blank?
33
+ self.key = key
34
+ self.hash = hash
35
+ self.value = value
36
+ self.ttl = ttl
37
+ self.refresh
38
+ end
39
+
40
+ # Refreshes the entry.
41
+ #
42
+ # @param save [Boolean] If to save the refresh value in the cache.
43
+ def refresh(save = false)
44
+ self.updated_at = Time.now.to_f
45
+
46
+ # TODO: Set this value in the cache
47
+ end
48
+
49
+ # Checks if the entry is still valid.
50
+ #
51
+ # @param provider [Provider::Base] The provider to use for the check.
52
+ # @return [Boolean] `true` if the entry is still valid, `false` otherwise.
53
+ def valid?(provider = nil)
54
+ provider ||= ::Elephas::Cache.provider
55
+ provider.now - self.updated_at < self.ttl
56
+ end
57
+
58
+ # Returns a unique hash for the key.
59
+ #
60
+ # @param key [String] The key to hashify.
61
+ # @return [String] An unique hash for the key.
62
+ def self.hashify_key(key)
63
+ Digest::SHA2.hexdigest(key.ensure_string)
64
+ end
65
+
66
+ # Ensure that the value is an Entry.
67
+ #
68
+ # @param value [Object] The object to check.
69
+ # @param key [Object] The key associated to this object.
70
+ # @return [Entry] The wrapped object.
71
+ def self.ensure(value, key, options = {})
72
+ rv = value
73
+
74
+ if !rv.is_a?(::Elephas::Entry) then
75
+ options = {} if !options.is_a?(Hash)
76
+
77
+ ttl = [options[:ttl].to_integer, 0].max
78
+ hash = options[:hash] || ::Elephas::Entry.hashify_key(key.ensure_string)
79
+
80
+ rv = ::Elephas::Entry.new(key, rv, hash, ttl)
81
+ end
82
+
83
+ rv
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ module Elephas
8
+ # This module hosts all the storage system for the caches.
9
+ module Providers
10
+
11
+ # The base provider, with all methods a valid provider should override.
12
+ module Base
13
+ extend ActiveSupport::Concern
14
+
15
+ # Reads a value from the cache.
16
+ #
17
+ # @param key [String] The key to lookup.
18
+ # @return [Entry|NilClass] The read value or `nil`.
19
+ def read(key)
20
+ raise ArgumentError.new("A Elephas::Providers subclass should override this module.")
21
+ end
22
+
23
+ # Writes a value to the cache.
24
+ #
25
+ # @param key [String] The key to associate the value with.
26
+ # @param value [Object] The value to write. **Setting a value to `nil` doesn't mean *deleting* the value.
27
+ # @param options [Hash] A list of options for writing. @see Elephas::Cache.write
28
+ # @return [Object] The value itself.
29
+ def write(key, value, options = {})
30
+ raise ArgumentError.new("A Elephas::Providers subclass should override this module.")
31
+ end
32
+
33
+ # Deletes a value from the cache.
34
+ #
35
+ # @param key [String] The key to delete.
36
+ # @return [TrueClass|FalseClass] `true` if the key was in the cache, `false` otherwise.
37
+ def delete(key)
38
+ raise ArgumentError.new("A Elephas::Providers subclass should override this module.")
39
+ end
40
+
41
+ # Checks if a key exists in the cache.
42
+ #
43
+ # @param key [String] The key to lookup.
44
+ # @return [TrueClass|FalseClass] `true` if the key is in the cache, `false` otherwise.
45
+ def exists?(key)
46
+ raise ArgumentError.new("A Elephas::Providers subclass should override this module.")
47
+ end
48
+
49
+ # Returns the current time for comparing with entries TTL.
50
+ #
51
+ # @return [Object] A representation of the current time.
52
+ def now
53
+ ::Time.now.to_f
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ module Elephas
8
+ module Providers
9
+ # This is a simple providers, which uses an hash for storing the values.
10
+ class Hash
11
+ include Elephas::Providers::Base
12
+
13
+ # The internal hash used by the provider.
14
+ attr_accessor :data
15
+
16
+ # Initialize the provider
17
+ # @param data [Hash] The initial data stored.
18
+ def initialize(data = nil)
19
+ data = {} if !data || !data.is_a?(::Hash)
20
+ @data = data
21
+ end
22
+
23
+ # Reads a value from the cache.
24
+ #
25
+ # @param key [String] The key to lookup.
26
+ # @return [Entry|NilClass] The read value or `nil`.
27
+ def read(key)
28
+ self.exists?(key) ? @data[key.ensure_string] : nil
29
+ end
30
+
31
+ # Writes a value to the cache.
32
+ #
33
+ # @param key [String] The key to associate the value with.
34
+ # @param value [Object] The value to write. **Setting a value to `nil` doesn't mean *deleting* the value.
35
+ # @param options [Hash] A list of options for writing. @see Elephas::Cache.write
36
+ # @return [Object] The value itself.
37
+ def write(key, value, options = {})
38
+ fvalue = ::Elephas::Entry.ensure(value, key, options)
39
+ fvalue.refresh
40
+ @data[key.ensure_string] = fvalue
41
+ value
42
+ end
43
+
44
+ # Deletes a value from the cache.
45
+ #
46
+ # @param key [String] The key to delete.
47
+ # @return [Boolean] `true` if the key was in the cache, `false` otherwise.
48
+ def delete(key)
49
+ fkey = key.ensure_string
50
+ rv = @data.has_key?(fkey)
51
+ @data.delete(fkey)
52
+ rv
53
+ end
54
+
55
+ # Checks if a key exists in the cache.
56
+ #
57
+ # @param key [String] The key to lookup.
58
+ # @return [Boolean] `true` if the key is in the cache, `false` otherwise.
59
+ def exists?(key)
60
+ fkey = key.ensure_string
61
+ @data.has_key?(fkey) && @data[fkey].valid?
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ module Elephas
8
+ module Providers
9
+ # This is a Ruby on Rails providers, which uses Rails.cache.
10
+ class RubyOnRails
11
+ include Elephas::Providers::Base
12
+
13
+ # Reads a value from the cache.
14
+ #
15
+ # @param key [String] The key to lookup.
16
+ # @return [Entry|NilClass] The read value or `nil`.
17
+ def read(key)
18
+ self.exists?(key) ? Rails.cache.read(key) : nil
19
+ end
20
+
21
+ # Writes a value to the cache.
22
+ #
23
+ # @param key [String] The key to associate the value with.
24
+ # @param value [Object] The value to write. **Setting a value to `nil` doesn't mean *deleting* the value.
25
+ # @param options [Hash] A list of options for writing. @see Elephas::Cache.write
26
+ # @return [Object] The value itself.
27
+ def write(key, value, options = {})
28
+ ttl = [options[:ttl].to_integer, 0].max
29
+ fvalue = ::Elephas::Entry.ensure(value, key, options)
30
+ fvalue.refresh
31
+
32
+ Rails.cache.write(key, value, :expires_in => ttl)
33
+ value
34
+ end
35
+
36
+ # Deletes a value from the cache.
37
+ #
38
+ # @param key [String] The key to delete.
39
+ # @return [Boolean] `true` if the key was in the cache, `false` otherwise.
40
+ def delete(key)
41
+ fkey = key.ensure_string
42
+ rv = Rails.cache.exist?(fkey)
43
+ Rails.cache.delete(fkey)
44
+ rv
45
+ end
46
+
47
+ # Checks if a key exists in the cache.
48
+ #
49
+ # @param key [String] The key to lookup.
50
+ # @return [Boolean] `true` if the key is in the cache, `false` otherwise.
51
+ def exists?(key)
52
+ fkey = key.ensure_string
53
+ Rails.cache.exist?(fkey) && Rails.cache.read(fkey).valid?
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ # This is the top level module for elephas gem.
8
+ module Elephas
9
+ # The current version of elephas, according to semantic versioning.
10
+ #
11
+ # @see http://semver.org
12
+ module Version
13
+ # The major version.
14
+ MAJOR = 0
15
+
16
+ # The minor version.
17
+ MINOR = 1
18
+
19
+ # The patch version.
20
+ PATCH = 0
21
+
22
+ # The current version of elephas.
23
+ STRING = [MAJOR, MINOR, PATCH].compact.join(".")
24
+ end
25
+ end
data/lib/elephas.rb ADDED
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ $KCODE='UTF8' if RUBY_VERSION < '1.9'
8
+
9
+ require "cowtech-extensions"
10
+ require "digest/sha2"
11
+ Cowtech::Extensions.load!("boolean", "math", "object")
12
+
13
+ require "elephas/version" if !defined?(Elephas::Version)
14
+ require "elephas/entry"
15
+ require "elephas/provider"
16
+ require "elephas/providers/hash"
17
+ require "elephas/providers/ruby_on_rails"
18
+ require "elephas/cache"
19
+
20
+ Elephas::Cache.provider = defined?(Rails) ? Elephas::Providers::RubyOnRails.new : Elephas::Providers::Hash.new
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require "simplecov"
8
+ require "pathname"
9
+
10
+ if ENV["ELEPHAS_COVERAGE"] == "TRUE" then
11
+ root = Pathname.new(File.dirname(__FILE__)) + ".."
12
+
13
+ SimpleCov.start do
14
+ add_filter do |src_file|
15
+ path = Pathname.new(src_file.filename).relative_path_from(root).to_s
16
+ path !~ /^lib/
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require "spec_helper"
8
+
9
+ describe Elephas::Cache do
10
+ pending ".use" do
11
+
12
+ end
13
+
14
+ describe ".read" do
15
+ it "should be forwarded to the provider" do
16
+ Elephas::Cache.provider.should_receive(:read)
17
+ Elephas::Cache.read("KEY")
18
+ end
19
+ end
20
+
21
+ describe ".write" do
22
+ it "should be forwarded to the provider" do
23
+ Elephas::Cache.provider.should_receive(:write)
24
+ Elephas::Cache.write("KEY", "VALUE")
25
+ end
26
+ end
27
+
28
+ describe ".delete" do
29
+ it "should be forwarded to the provider" do
30
+ Elephas::Cache.provider.should_receive(:delete)
31
+ Elephas::Cache.delete("KEY")
32
+ end
33
+ end
34
+
35
+ describe ".exists?" do
36
+ it "should be forwarded to the provider" do
37
+ Elephas::Cache.provider.should_receive(:exists?)
38
+ Elephas::Cache.exists?("KEY")
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require "spec_helper"
8
+
9
+ describe Elephas::Entry do
10
+
11
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This file is part of the elephas gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
4
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
5
+ #
6
+
7
+ require "spec_helper"
8
+
9
+ describe Elephas::Providers::Base do
10
+ class BaseProvider
11
+ include Elephas::Providers::Base
12
+ end
13
+
14
+ let(:provider) { BaseProvider.new }
15
+
16
+ describe ".read" do
17
+ it "should raise an ArgumentError exception" do
18
+ expect{ provider.read("KEY") }.to raise_error(ArgumentError)
19
+ end
20
+ end
21
+
22
+ describe ".write" do
23
+ it "should raise an ArgumentError exception" do
24
+ expect{ provider.write("KEY", "VALUE") }.to raise_error(ArgumentError)
25
+ end
26
+ end
27
+
28
+ describe ".delete" do
29
+ it "should raise an ArgumentError exception" do
30
+ expect{ provider.delete("KEY") }.to raise_error(ArgumentError)
31
+ end
32
+ end
33
+
34
+ describe ".exists?" do
35
+ it "should raise an ArgumentError exception" do
36
+ expect{ provider.exists?("KEY") }.to raise_error(ArgumentError)
37
+ end
38
+ end
39
+
40
+ describe "#now" do
41
+ it "return a representation for the current time" do
42
+ Time.stub(:now).and_return(123.456)
43
+ expect(provider.now).to eq(Time.now.to_f)
44
+ end
45
+ end
46
+ end