shallow 0.0.0 → 0.1.1

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/Rakefile CHANGED
@@ -6,7 +6,7 @@ begin
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "shallow"
8
8
  gem.summary = %Q{A gem for creating cached response for expensive method calls}
9
- gem.description = %Q{TODO: longer description of your gem}
9
+ gem.description = %Q{A gem for creating cached response for expensive method calls}
10
10
  gem.email = "jeremy.n.friesen@gmail.com"
11
11
  gem.homepage = "http://github.com/jeremyf/shallow"
12
12
  gem.authors = ["Jeremy Friesen"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.1.1
@@ -0,0 +1,94 @@
1
+ require 'yaml'
2
+ require 'singleton'
3
+ module Shallow
4
+ CACHE_FOLDER = 'shallow'
5
+ module Method
6
+ def self.with_cache_clearing_for(context)
7
+ yield and return unless context.respond_to?(:returning_value_cache_caller)
8
+ old_method = context.method(:returning_value_cache_caller)
9
+ context.meta_def(:returning_value_cache_caller) do
10
+ Shallow::Caller::Clear
11
+ end
12
+ yield
13
+ ensure
14
+ context.meta_def(:returning_value_cache_caller, &old_method)
15
+ end
16
+
17
+ def shallow_method(method_name, options = {})
18
+ scope = options[:scope] || options['scope'] || lambda { nil }
19
+ class_eval do
20
+ define_method(:returning_value_cache_caller) do
21
+ Shallow::Caller::Base
22
+ end
23
+ old_method = instance_method(method_name.to_sym)
24
+ define_method(method_name.to_sym) do |*args, &block|
25
+ returning_value_cache_caller.new(
26
+ :args => args,
27
+ :keys => [instance_eval(&scope).to_s, method_name],
28
+ :capture => old_method.bind(self)
29
+ ).call(&block)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ class Cache
36
+ def initialize
37
+ @data_store = {}
38
+ end
39
+ include Singleton
40
+ def exist?(key)
41
+ @data_store.key?(key)
42
+ end
43
+ def fetch(key)
44
+ if @data_store.key?(key)
45
+ @data_store.fetch(key)
46
+ else
47
+ @data_store[key] = yield
48
+ end
49
+ end
50
+ def delete(key)
51
+ @data_store.delete(key)
52
+ end
53
+ def read(key)
54
+ @data_store.fetch(key)
55
+ end
56
+ end
57
+
58
+ module Caller
59
+ class Base
60
+ attr_reader :cache_key, :captured_method
61
+ def initialize(options = {})
62
+ keys = options[:keys]
63
+ @args = options[:args]
64
+ @cache_key = File.join(keys.inject([CACHE_FOLDER]){|m,v| m << v.to_s})
65
+ @captured_method = options[:capture]
66
+ end
67
+
68
+ def call(&context)
69
+ if cache.exist?(cache_key)
70
+ returning_value = YAML.load(cache.read(cache_key))
71
+ context.call(*returning_value, &context) if block_given? && !returning_value.nil?
72
+ return *returning_value
73
+ else
74
+ returning_value = nil
75
+ cache.fetch(cache_key) {
76
+ returning_value = captured_method.call(*@args, &lambda {|args| context.call(args); args })
77
+ returning_value ? [returning_value].to_yaml : nil.to_yaml
78
+ }
79
+ return *returning_value
80
+ end
81
+ end
82
+ protected
83
+ def cache
84
+ Cache.instance
85
+ end
86
+ end
87
+ class Clear < Base
88
+ def call(&context)
89
+ cache.delete(cache_key) if cache.exist?(cache_key)
90
+ super(&context)
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,51 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{shallow}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jeremy Friesen"]
12
+ s.date = %q{2010-04-01}
13
+ s.description = %q{A gem for creating cached response for expensive method calls}
14
+ s.email = %q{jeremy.n.friesen@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/shallow.rb",
27
+ "shallow.gemspec",
28
+ "test/helper.rb",
29
+ "test/test_shallow.rb"
30
+ ]
31
+ s.homepage = %q{http://github.com/jeremyf/shallow}
32
+ s.rdoc_options = ["--charset=UTF-8"]
33
+ s.require_paths = ["lib"]
34
+ s.rubygems_version = %q{1.3.6}
35
+ s.summary = %q{A gem for creating cached response for expensive method calls}
36
+ s.test_files = [
37
+ "test/helper.rb",
38
+ "test/test_shallow.rb"
39
+ ]
40
+
41
+ if s.respond_to? :specification_version then
42
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
43
+ s.specification_version = 3
44
+
45
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
46
+ else
47
+ end
48
+ else
49
+ end
50
+ end
51
+
@@ -1,7 +1,49 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestShallow < Test::Unit::TestCase
4
- def test_something_for_real
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
4
+ def setup
5
+ @klass = Class.new {
6
+ attr_accessor :value
7
+ extend Shallow::Method
8
+ def foo(msg)
9
+ msg
10
+ end
11
+ shallow_method(:foo)
12
+ def bar(*args)
13
+ yield(*args)
14
+ end
15
+ shallow_method(:bar)
16
+
17
+ def with_value
18
+ return nil if value.nil?
19
+ yield(value)
20
+ end
21
+ shallow_method(:with_value)
22
+ }
23
+ @object = @klass.new
24
+ end
25
+
26
+ def test_cache_return_value
27
+ assert_equal 'message', @object.foo('message')
28
+ assert_equal 'message', @object.foo('bob_message')
29
+ end
30
+
31
+ def test_cache_yielded_values
32
+ @yielded_value = nil
33
+ @object.bar(1,2,3) { |a,b,c| @yielded_value = [a,b,c] }
34
+ assert_equal [1,2,3], @yielded_value
35
+ @object.bar(2,3,4) { |a,b,c| @yielded_value = [a,b,c] }
36
+ assert_equal [1,2,3], @yielded_value
37
+ end
38
+
39
+ def test_cache_return_value_and_yield_value
40
+ @yielded_value = :false
41
+ @object.value = nil
42
+ assert_equal nil, @object.with_value { |val| @yielded_value = val }
43
+ assert_equal :false, @yielded_value
44
+
45
+ @object.value = 1
46
+ assert_equal nil, @object.with_value { |val| @yielded_value = val }
47
+ assert_equal :false, @yielded_value
6
48
  end
7
49
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 0
8
- - 0
9
- version: 0.0.0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jeremy Friesen
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-30 00:00:00 -04:00
17
+ date: 2010-04-01 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -35,6 +35,7 @@ files:
35
35
  - Rakefile
36
36
  - VERSION
37
37
  - lib/shallow.rb
38
+ - shallow.gemspec
38
39
  - test/helper.rb
39
40
  - test/test_shallow.rb
40
41
  has_rdoc: true