redistry 0.1.1 → 0.1.2
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/README.md +62 -6
- data/lib/redistry/{has_list → list}/collection_proxy.rb +1 -1
- data/lib/redistry/list.rb +35 -0
- data/lib/redistry/version.rb +1 -1
- data/lib/redistry.rb +2 -2
- metadata +4 -4
- data/lib/redistry/has_list.rb +0 -24
data/README.md
CHANGED
@@ -1,11 +1,67 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
Getting Started
|
2
|
+
---------------
|
3
3
|
|
4
|
-
|
4
|
+
### Rails 3
|
5
5
|
|
6
|
+
Add `redistry` to your `Gemfile`
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
gem "redistry"
|
9
|
+
|
10
|
+
|
11
|
+
#### Using has_list
|
12
|
+
|
13
|
+
Associate a Redis list with each ActiveRecord item:
|
14
|
+
|
15
|
+
class Notification < ActiveRecord::Base
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
...
|
20
|
+
|
21
|
+
class User < ActiveRecord::Base
|
22
|
+
has_list :recent_notifications, :class => Notification, :size => 10
|
23
|
+
|
24
|
+
...
|
25
|
+
end
|
26
|
+
|
27
|
+
You can add items to the list with `add`:
|
28
|
+
|
29
|
+
user.recent_notifications.add(notification)
|
30
|
+
|
31
|
+
Since you specified `:size`, Redistry will treat the list as a queue (first in, last out) with a
|
32
|
+
maximum of `size` elements. If you don't specify `:size`, the list will not limit the size at all.
|
33
|
+
|
34
|
+
You can fetch the items with `all`:
|
35
|
+
|
36
|
+
@notifications = user.recent_notifications.all
|
37
|
+
|
38
|
+
And you can clear all the notifications with `clear`:
|
39
|
+
|
40
|
+
user.recent_notifications.clear
|
41
|
+
|
42
|
+
|
43
|
+
#### Using list
|
44
|
+
|
45
|
+
Sometimes, you want to associate a list generically with an entire class (or a module)
|
46
|
+
|
47
|
+
class User
|
48
|
+
list :popular, :size => 10
|
49
|
+
...
|
50
|
+
end
|
51
|
+
|
52
|
+
Note that since we didn't specify `:class`, Redistry will assume the objects are of the same type as the outer class (in this case, `User`).
|
53
|
+
|
54
|
+
Use the same interface as `has_list` to access the items:
|
55
|
+
|
56
|
+
User.popular.add(@user)
|
57
|
+
@popular_users = User.popular.all
|
58
|
+
User.popular.clear
|
59
|
+
|
60
|
+
|
61
|
+
Known Issues / TODO
|
62
|
+
-------------------
|
9
63
|
|
10
64
|
* JSON serializer does not work with strings... not sure how to deal since this technically is not valid json
|
11
|
-
|
65
|
+
|
66
|
+
|
67
|
+
Copyright (c) 2011 Brian Smith (bsmith@swig505.com)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'redistry/list/collection_proxy'
|
2
|
+
|
3
|
+
module Redistry
|
4
|
+
module List
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
|
12
|
+
def has_list(name, options = {})
|
13
|
+
klass = options.delete(:class) || self
|
14
|
+
|
15
|
+
raise("The class `#{klass.name}` must have an unique `id` to use `has_list`") unless klass.instance_methods.include?(:id)
|
16
|
+
|
17
|
+
define_method name do
|
18
|
+
return instance_variable_get("@_#{name}_has_list") if instance_variable_get("@_#{name}_has_list")
|
19
|
+
instance_variable_set("@_#{name}_has_list", CollectionProxy.new(klass, "#{name}-#{id}", options))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def list(name, options = {})
|
24
|
+
klass = options.delete(:class) || self
|
25
|
+
|
26
|
+
instance_variable_set("@_#{name}_list".to_sym, CollectionProxy.new(klass, name, options))
|
27
|
+
class_eval <<-EOF
|
28
|
+
def self.#{name}
|
29
|
+
@_#{name}_list
|
30
|
+
end
|
31
|
+
EOF
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/redistry/version.rb
CHANGED
data/lib/redistry.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'redis'
|
2
2
|
require 'redistry/version'
|
3
|
-
require 'redistry/
|
3
|
+
require 'redistry/list'
|
4
4
|
require 'redistry/serializers/json'
|
5
5
|
|
6
6
|
module Redistry
|
@@ -20,7 +20,7 @@ module Redistry
|
|
20
20
|
|
21
21
|
def setup_active_record!
|
22
22
|
require 'redistry/serializers/activerecord'
|
23
|
-
ActiveRecord::Base.send(:include, Redistry::
|
23
|
+
ActiveRecord::Base.send(:include, Redistry::List)
|
24
24
|
@loaded_frameworks << :activerecord
|
25
25
|
end
|
26
26
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 2
|
9
|
+
version: 0.1.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brian Smith
|
@@ -81,8 +81,8 @@ extensions: []
|
|
81
81
|
extra_rdoc_files: []
|
82
82
|
|
83
83
|
files:
|
84
|
-
- lib/redistry/
|
85
|
-
- lib/redistry/
|
84
|
+
- lib/redistry/list/collection_proxy.rb
|
85
|
+
- lib/redistry/list.rb
|
86
86
|
- lib/redistry/serializers/activerecord.rb
|
87
87
|
- lib/redistry/serializers/json.rb
|
88
88
|
- lib/redistry/version.rb
|
data/lib/redistry/has_list.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'redistry/has_list/collection_proxy'
|
2
|
-
|
3
|
-
module Redistry
|
4
|
-
module HasList
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.extend(ClassMethods)
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
|
12
|
-
def has_list(name, options = {})
|
13
|
-
klass = options.delete(:class) || self
|
14
|
-
instance_variable_set("@_#{name}_has_list".to_sym, CollectionProxy.new(klass, name, options))
|
15
|
-
|
16
|
-
class_eval <<-EOF
|
17
|
-
def self.#{name}
|
18
|
-
@_#{name}_has_list
|
19
|
-
end
|
20
|
-
EOF
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|