redmemo 0.1.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +14 -5
- data/bin/console +5 -4
- data/bin/setup +0 -0
- data/lib/redmemo.rb +70 -1
- data/lib/redmemo/version.rb +1 -1
- data/redmemo.gemspec +5 -0
- metadata +43 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6019fd115f496fbe7112652a7c9b054fc2075614
|
4
|
+
data.tar.gz: b11f648088c65c44255d118fa0e2615d507aafae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c07975da2a7f1a1d6ddd18a8058aa2b7a01edf0701615a58dbc1940e676d921289740e8fcd18ed1d9f01d580c411727dc9fe4b1aaff6254140913857b45cc6c
|
7
|
+
data.tar.gz: 76b5d46672a664f4c22b382edf402b54fabad1a3af45fb9f1929b486726210fc8d500eae2ca6836728a5ea239e72742f5059de394a76a7c8ac4097d1696e2502
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# Redmemo
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Redis based memoization, which should replace your counter caches and caches in
|
4
|
+
your views/view models/decorators/exhibits.
|
6
5
|
|
7
6
|
## Installation
|
8
7
|
|
@@ -22,7 +21,17 @@ Or install it yourself as:
|
|
22
21
|
|
23
22
|
## Usage
|
24
23
|
|
25
|
-
|
24
|
+
~~~ruby
|
25
|
+
require 'redmemo'
|
26
|
+
class Group
|
27
|
+
def intesive_method
|
28
|
+
# intensive work
|
29
|
+
"awesome result"
|
30
|
+
end
|
31
|
+
|
32
|
+
cache_method :intensive_method, cache_key: :id
|
33
|
+
end
|
34
|
+
~~~
|
26
35
|
|
27
36
|
## Development
|
28
37
|
|
@@ -32,7 +41,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
41
|
|
33
42
|
## Contributing
|
34
43
|
|
35
|
-
1. Fork it ( https://github.com/
|
44
|
+
1. Fork it ( https://github.com/minhajuddin/redmemo/fork )
|
36
45
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
37
46
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
38
47
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/bin/console
CHANGED
@@ -7,8 +7,9 @@ require "redmemo"
|
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
|
11
|
-
|
10
|
+
require "pry"
|
11
|
+
require "pry-doc"
|
12
|
+
Pry.start
|
12
13
|
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|
14
|
+
#require "irb"
|
15
|
+
#IRB.start
|
data/bin/setup
CHANGED
File without changes
|
data/lib/redmemo.rb
CHANGED
@@ -1,5 +1,74 @@
|
|
1
1
|
require "redmemo/version"
|
2
2
|
|
3
|
+
require 'redis'
|
4
|
+
require 'base64'
|
5
|
+
$redis = Redis.new
|
6
|
+
|
3
7
|
module Redmemo
|
4
|
-
|
8
|
+
module Cache
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
base.include(InstanceMethods)
|
12
|
+
base.extend(ClassMethods)
|
13
|
+
# creates a custom cache module for the base class
|
14
|
+
# this module will hold the overriding methods
|
15
|
+
base.prepend(const_set("#{base.name}Cache", Module.new))
|
16
|
+
end
|
17
|
+
|
18
|
+
# start of instance methods
|
19
|
+
module InstanceMethods
|
20
|
+
def encode_for_cache(val)
|
21
|
+
Base64.encode64(Marshal.dump(val))
|
22
|
+
end
|
23
|
+
|
24
|
+
def decode_for_cache(encoded_val)
|
25
|
+
Marshal.load(Base64.decode64(encoded_val))
|
26
|
+
end
|
27
|
+
|
28
|
+
def cached_value_for(key, lazy_val)
|
29
|
+
cached_val = $redis.get(key)
|
30
|
+
return decode_for_cache(cached_val) if cached_val
|
31
|
+
|
32
|
+
# cache miss: first execution
|
33
|
+
lazy_val.().tap do |val|
|
34
|
+
$redis.set(key, encode_for_cache(val))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
# end of instance methods
|
39
|
+
|
40
|
+
# start of class methods
|
41
|
+
module ClassMethods
|
42
|
+
DEFAULT_OPTIONS = {cache_key: :cache_key}
|
43
|
+
# usage:
|
44
|
+
# cache_method :m1, :cache_key => :your_custom_cache_key
|
45
|
+
# :cache_key is set to :cache_key by default, this is the activerecord cache key method
|
46
|
+
def cache_method(method_name, options = {})
|
47
|
+
options = DEFAULT_OPTIONS.merge(options || {})
|
48
|
+
cache_module = const_get("#{self.name}Cache")
|
49
|
+
cache_key_method = options[:cache_key] || options["cache_key"]
|
50
|
+
cache_module.class_eval do
|
51
|
+
define_method(method_name) do
|
52
|
+
key = "#{self.class.name}/#{method_name}/#{self.send(cache_key_method)}"
|
53
|
+
cached_value_for(key, ->{super()})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# usage:
|
60
|
+
# cache_methods :m1, :m2, :m3, :cache_key => :your_custom_cache_key
|
61
|
+
# :cache_key is set to :cache_key by default, this is the activerecord cache key method
|
62
|
+
def cache_methods(args)
|
63
|
+
options = args.pop if args.last.is_a?(Hash)
|
64
|
+
methods = args
|
65
|
+
|
66
|
+
methods.each do |method|
|
67
|
+
self.cache_method(method, options)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
# end of class methods
|
72
|
+
|
73
|
+
end
|
5
74
|
end
|
data/lib/redmemo/version.rb
CHANGED
data/redmemo.gemspec
CHANGED
@@ -19,6 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
+
# dependencies
|
23
|
+
spec.add_dependency "redis", "~> 3"
|
24
|
+
|
22
25
|
spec.add_development_dependency "bundler", "~> 1.8"
|
23
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
spec.add_development_dependency "pry", "~> 0.10"
|
28
|
+
spec.add_development_dependency "pry-doc", "~> 0.6"
|
24
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmemo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Khaja Minhajuddin
|
@@ -10,6 +10,20 @@ bindir: exe
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,34 @@ dependencies:
|
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.10'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-doc
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.6'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.6'
|
41
83
|
description: Redis based memoization, which should replace your counter caches.
|
42
84
|
email:
|
43
85
|
- minhajuddink@gmail.com
|