cachedis 0.0.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/.gitignore +3 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +34 -0
- data/README.md +24 -0
- data/Rakefile +7 -0
- data/cachedis.gemspec +28 -0
- data/lib/cachedis/version.rb +3 -0
- data/lib/cachedis.rb +24 -0
- data/spec/base_spec.rb +34 -0
- data/spec/spec_helper.rb +15 -0
- metadata +114 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format Fuubar
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
cachedis (0.0.1)
|
5
|
+
redis
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
diff-lcs (1.1.2)
|
11
|
+
fuubar (0.0.3)
|
12
|
+
rspec (~> 2.0)
|
13
|
+
rspec-instafail (~> 0.1.4)
|
14
|
+
ruby-progressbar (~> 0.0.9)
|
15
|
+
redis (2.1.1)
|
16
|
+
rspec (2.5.0)
|
17
|
+
rspec-core (~> 2.5.0)
|
18
|
+
rspec-expectations (~> 2.5.0)
|
19
|
+
rspec-mocks (~> 2.5.0)
|
20
|
+
rspec-core (2.5.1)
|
21
|
+
rspec-expectations (2.5.0)
|
22
|
+
diff-lcs (~> 1.1.2)
|
23
|
+
rspec-instafail (0.1.7)
|
24
|
+
rspec-mocks (2.5.0)
|
25
|
+
ruby-progressbar (0.0.9)
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
cachedis!
|
32
|
+
fuubar
|
33
|
+
redis
|
34
|
+
rspec
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Cachedis
|
2
|
+
|
3
|
+
Cachedis caches your expensive queries to a Redis instance so the next time you fire it off, it'll load directly from cache instead of being run again. Optionally you can provide a cache expirement time.
|
4
|
+
|
5
|
+
@cachedis = Cachedis.new
|
6
|
+
|
7
|
+
# performs query the first time, performs cached calls to Redis within the next 60 * 60 seconds
|
8
|
+
@cachedis.cachedis 'name-of-expensive-query', :expire => 60 * 60 do
|
9
|
+
Post.all.expensive_operation
|
10
|
+
end
|
11
|
+
|
12
|
+
## Installation and dependencies
|
13
|
+
|
14
|
+
Dependencies are: `redis-rb`
|
15
|
+
|
16
|
+
Install with: `gem install cachedis`
|
17
|
+
|
18
|
+
## Wishlist
|
19
|
+
|
20
|
+
* Tight ActiveRecord integration
|
21
|
+
* Make expirement optional
|
22
|
+
* Serialize using BERT (fall back to YAML)
|
23
|
+
* Sexify the API
|
24
|
+
- Make it easier to specialize expirement time (e.g. `:expire => 4.hours`)
|
data/Rakefile
ADDED
data/cachedis.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cachedis/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "cachedis"
|
7
|
+
s.version = Cachedis::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Simon Hørup Eskildsen"]
|
10
|
+
s.email = ["sirup@sirupsen.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Caches expensive database queries in Redis}
|
13
|
+
s.description = %q{Instead of running your expensive queries for every page load, let cachedis store them in Redis and fetch them.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "cachedis"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
# Dependencies
|
23
|
+
s.add_dependency('redis')
|
24
|
+
|
25
|
+
# Development dependencies
|
26
|
+
s.add_development_dependency('rspec')
|
27
|
+
s.add_development_dependency('fuubar')
|
28
|
+
end
|
data/lib/cachedis.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
class Cachedis
|
5
|
+
attr_reader :redis_instance
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
redis(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def cachedis(name, options = {}, &block)
|
12
|
+
result = yield
|
13
|
+
|
14
|
+
return redis.get name if redis.exists name
|
15
|
+
|
16
|
+
redis.set name, result.to_yaml
|
17
|
+
redis.expire name, options[:expire] || 60 * 60 # set expire to user specified or one minute
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def redis(options = {})
|
22
|
+
@redis_instance ||= Redis.new(options)
|
23
|
+
end
|
24
|
+
end
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cachedis do
|
4
|
+
include HelperMethods
|
5
|
+
|
6
|
+
before do
|
7
|
+
@cachedis = Cachedis.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'when setting something' do
|
11
|
+
it 'sets without errors' do
|
12
|
+
with_no_cache
|
13
|
+
@cachedis.redis_instance.should_receive(:set).exactly(1).times.and_return(['element', 'element 2'].to_yaml)
|
14
|
+
|
15
|
+
lambda {
|
16
|
+
@cachedis.cachedis 'expensive-query' do
|
17
|
+
['element', 'element 2']
|
18
|
+
end }.should_not raise_error
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'when setting and later retrieving something' do
|
23
|
+
it 'retrieves from redis cache' do
|
24
|
+
with_cache('query')
|
25
|
+
@cachedis.redis_instance.should_not_receive(:set)
|
26
|
+
|
27
|
+
result = @cachedis.cachedis 'expensive-query' do
|
28
|
+
"query"
|
29
|
+
end
|
30
|
+
|
31
|
+
result.should == "query".to_yaml
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'cachedis'
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
module HelperMethods
|
7
|
+
def with_no_cache
|
8
|
+
@cachedis.redis_instance.should_receive(:exists).exactly(1).times.and_return(nil)
|
9
|
+
end
|
10
|
+
|
11
|
+
def with_cache(cache)
|
12
|
+
@cachedis.redis_instance.should_receive(:exists).exactly(1).times.and_return(true)
|
13
|
+
@cachedis.redis_instance.should_receive(:get).exactly(1).times.and_return(cache.to_yaml)
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cachedis
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- "Simon H\xC3\xB8rup Eskildsen"
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-03-07 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: redis
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: fuubar
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
version: "0"
|
57
|
+
type: :development
|
58
|
+
version_requirements: *id003
|
59
|
+
description: Instead of running your expensive queries for every page load, let cachedis store them in Redis and fetch them.
|
60
|
+
email:
|
61
|
+
- sirup@sirupsen.com
|
62
|
+
executables: []
|
63
|
+
|
64
|
+
extensions: []
|
65
|
+
|
66
|
+
extra_rdoc_files: []
|
67
|
+
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- .rspec
|
71
|
+
- Gemfile
|
72
|
+
- Gemfile.lock
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- cachedis.gemspec
|
76
|
+
- lib/cachedis.rb
|
77
|
+
- lib/cachedis/version.rb
|
78
|
+
- spec/base_spec.rb
|
79
|
+
- spec/spec_helper.rb
|
80
|
+
has_rdoc: true
|
81
|
+
homepage: ""
|
82
|
+
licenses: []
|
83
|
+
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
requirements: []
|
106
|
+
|
107
|
+
rubyforge_project: cachedis
|
108
|
+
rubygems_version: 1.3.7
|
109
|
+
signing_key:
|
110
|
+
specification_version: 3
|
111
|
+
summary: Caches expensive database queries in Redis
|
112
|
+
test_files:
|
113
|
+
- spec/base_spec.rb
|
114
|
+
- spec/spec_helper.rb
|