redis-objects-rmap 0.0.1 → 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.
- data/Gemfile +5 -2
- data/README.md +19 -5
- data/lib/redis/objects/rmap/version.rb +1 -1
- data/lib/redis/objects/rmap.rb +33 -6
- data/redis-objects-rmap.gemspec +1 -0
- data/spec/lib/redis/objects/rmap_spec.rb +84 -0
- data/spec/spec_helper.rb +10 -0
- metadata +20 -5
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -25,12 +25,26 @@ class Foo < ActiveRecord::Base
|
|
25
25
|
end
|
26
26
|
|
27
27
|
Foo.create! :title => 'foo'
|
28
|
-
Foo.rmap # {
|
29
|
-
Foo.rmap # {
|
28
|
+
Foo.rmap # {1 => 'foo'} <- Does SQL request and puts to Redis
|
29
|
+
Foo.rmap # {1 => 'foo'} <- Gets from Redis without an SQL query
|
30
|
+
```
|
31
|
+
|
32
|
+
You can specify field to use as an ID source:
|
30
33
|
|
31
|
-
|
32
|
-
Foo
|
33
|
-
|
34
|
+
```ruby
|
35
|
+
class Foo < ActiveRecord::Base
|
36
|
+
include Redis::Objects::RMap
|
37
|
+
has_rmap :title, :my_id
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
Or even specify lambdas to prepare your cache:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
class Foo < ActiveRecord::Base
|
45
|
+
include Redis::Objects::RMap
|
46
|
+
has_rmap :title => lambda{|x| x.camelize}, :id => lambda{|x| x.to_s}
|
47
|
+
end
|
34
48
|
```
|
35
49
|
|
36
50
|
## Contributing
|
data/lib/redis/objects/rmap.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/concern'
|
1
2
|
require 'redis/objects'
|
2
3
|
require 'pry'
|
3
4
|
|
@@ -7,7 +8,7 @@ class Redis
|
|
7
8
|
included do
|
8
9
|
include Redis::Objects
|
9
10
|
|
10
|
-
|
11
|
+
class << self; attr_accessor :rmap_options; end
|
11
12
|
value :rmap_storage, :global => true, :marshal => true
|
12
13
|
|
13
14
|
after_save do
|
@@ -20,14 +21,40 @@ class Redis
|
|
20
21
|
end
|
21
22
|
|
22
23
|
module ClassMethods
|
23
|
-
def has_rmap(
|
24
|
-
|
24
|
+
def has_rmap(title=nil, id=nil)
|
25
|
+
options = {
|
26
|
+
:title => title,
|
27
|
+
:id => id || :id
|
28
|
+
}.with_indifferent_access
|
29
|
+
|
30
|
+
raise "title can not be blank" if options[:title].blank?
|
31
|
+
|
32
|
+
self.rmap_options = {}.with_indifferent_access
|
33
|
+
|
34
|
+
%w(id title).each do |x|
|
35
|
+
if options[x].is_a?(Hash)
|
36
|
+
self.rmap_options["#{x}_field"] = options[x].keys[0].to_sym
|
37
|
+
self.rmap_options["#{x}_proc"] = options[x].values[0]
|
38
|
+
else
|
39
|
+
self.rmap_options["#{x}_field"] = options[x].to_sym
|
40
|
+
self.rmap_options["#{x}_proc"] = nil
|
41
|
+
end
|
42
|
+
end
|
25
43
|
end
|
26
44
|
|
27
45
|
def rmap_cache
|
28
|
-
models = self.select([:
|
29
|
-
[
|
30
|
-
|
46
|
+
models = self.select([rmap_options[:id_field], rmap_options[:title_field]]).map do |a|
|
47
|
+
data = []
|
48
|
+
|
49
|
+
%w(id title).each do |x|
|
50
|
+
value = a.send(rmap_options["#{x}_field"])
|
51
|
+
value = rmap_options["#{x}_proc"].call(value) unless rmap_options["#{x}_proc"].blank?
|
52
|
+
|
53
|
+
data << value
|
54
|
+
end
|
55
|
+
|
56
|
+
data
|
57
|
+
end
|
31
58
|
|
32
59
|
self.rmap_storage = Hash[*models.flatten]
|
33
60
|
end
|
data/redis-objects-rmap.gemspec
CHANGED
@@ -0,0 +1,84 @@
|
|
1
|
+
require_relative '../../../spec_helper'
|
2
|
+
|
3
|
+
describe Redis::Objects::RMap do
|
4
|
+
describe "Module" do
|
5
|
+
it "includes" do
|
6
|
+
class Model < ActiveRecord::Base
|
7
|
+
include Redis::Objects::RMap
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "requires title" do
|
12
|
+
expect {
|
13
|
+
class Foo < ActiveRecord::Base
|
14
|
+
include Redis::Objects::RMap
|
15
|
+
has_rmap
|
16
|
+
end
|
17
|
+
}.to raise_error
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "Declaration" do
|
22
|
+
it "can be simple" do
|
23
|
+
class Foo < ActiveRecord::Base
|
24
|
+
include Redis::Objects::RMap
|
25
|
+
has_rmap 'foo'
|
26
|
+
end
|
27
|
+
|
28
|
+
Foo.rmap_options.should == {
|
29
|
+
"id_field" => :id,
|
30
|
+
"id_proc" => nil,
|
31
|
+
"title_field" => :foo,
|
32
|
+
"title_proc" => nil
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can contain id" do
|
37
|
+
class Foo < ActiveRecord::Base
|
38
|
+
include Redis::Objects::RMap
|
39
|
+
has_rmap 'foo', :bar
|
40
|
+
end
|
41
|
+
|
42
|
+
Foo.rmap_options.should == {
|
43
|
+
"id_field" => :bar,
|
44
|
+
"id_proc" => nil,
|
45
|
+
"title_field" => :foo,
|
46
|
+
"title_proc" => nil
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can contain lambdas" do
|
51
|
+
class Foo < ActiveRecord::Base
|
52
|
+
include Redis::Objects::RMap
|
53
|
+
has_rmap 'foo' => lambda{|x| x.to_s}
|
54
|
+
end
|
55
|
+
|
56
|
+
Foo.rmap_options[:title_proc].call(:test).should == 'test'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "Cache" do
|
61
|
+
it "works" do
|
62
|
+
class Foo < ActiveRecord::Base
|
63
|
+
include Redis::Objects::RMap
|
64
|
+
has_rmap 'name', :id => lambda{|x| x.to_s}
|
65
|
+
end
|
66
|
+
|
67
|
+
Foo.rmap_clear
|
68
|
+
Foo.rmap.should == {}
|
69
|
+
|
70
|
+
Foo.create! :name => "test1"
|
71
|
+
Foo.should_receive(:rmap_cache)
|
72
|
+
Foo.rmap
|
73
|
+
Foo.rspec_reset
|
74
|
+
|
75
|
+
Foo.rmap.should == {"1" => "test1"}
|
76
|
+
Foo.should_not_receive(:rmap_cache)
|
77
|
+
Foo.rmap
|
78
|
+
Foo.rspec_reset
|
79
|
+
|
80
|
+
Foo.destroy_all
|
81
|
+
Foo.rmap.should == {}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-objects-rmap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70093162372080 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70093162372080
|
14
25
|
- !ruby/object:Gem::Dependency
|
15
26
|
name: redis-objects
|
16
|
-
requirement: &
|
27
|
+
requirement: &70093162387240 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ! '>='
|
@@ -21,7 +32,7 @@ dependencies:
|
|
21
32
|
version: '0'
|
22
33
|
type: :runtime
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70093162387240
|
25
36
|
description: Adds fast-map to a AR model
|
26
37
|
email:
|
27
38
|
- boris@roundlake.ru
|
@@ -38,6 +49,8 @@ files:
|
|
38
49
|
- lib/redis/objects/rmap.rb
|
39
50
|
- lib/redis/objects/rmap/version.rb
|
40
51
|
- redis-objects-rmap.gemspec
|
52
|
+
- spec/lib/redis/objects/rmap_spec.rb
|
53
|
+
- spec/spec_helper.rb
|
41
54
|
homepage: http://github.com/inossidabile/redis-objects-rmap
|
42
55
|
licenses: []
|
43
56
|
post_install_message:
|
@@ -62,5 +75,7 @@ rubygems_version: 1.8.15
|
|
62
75
|
signing_key:
|
63
76
|
specification_version: 3
|
64
77
|
summary: Adds fast-map to a AR model
|
65
|
-
test_files:
|
78
|
+
test_files:
|
79
|
+
- spec/lib/redis/objects/rmap_spec.rb
|
80
|
+
- spec/spec_helper.rb
|
66
81
|
has_rdoc:
|