redis-breadcrumbs 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +43 -0
- data/README.md +45 -2
- data/TODO.txt +1 -0
- data/lib/redis-breadcrumbs/as_methods.rb +20 -0
- data/lib/redis-breadcrumbs/breadcrumb.rb +25 -8
- data/lib/redis-breadcrumbs/dsl.rb +29 -28
- data/lib/redis-breadcrumbs/entrance.rb +29 -0
- data/lib/redis-breadcrumbs/key.rb +3 -2
- data/lib/redis-breadcrumbs/key_proxy.rb +12 -0
- data/lib/redis-breadcrumbs/keys.rb +15 -7
- data/lib/redis-breadcrumbs/member_of_set_key.rb +15 -4
- data/lib/redis-breadcrumbs/owned_key.rb +13 -3
- data/lib/redis-breadcrumbs/unspecialized_dummy_object.rb +15 -0
- data/lib/redis-breadcrumbs/version.rb +1 -1
- data/test/as_test.rb +27 -0
- data/test/dsl_test.rb +5 -0
- data/test/reseting_test.rb +52 -0
- data/test/test_helper.rb +1 -0
- data/test/tracking_test.rb +20 -1
- metadata +14 -4
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Redis Breadcrumbs Changelog
|
2
|
+
|
3
|
+
## 0.0.3
|
4
|
+
|
5
|
+
[28 commits by 1 author](https://github.com/ecoffey/redis-breadcrumbs/compare/v0.0.2...v0.0.3)
|
6
|
+
|
7
|
+
* Add ability to track sorted set membership
|
8
|
+
[aaa36c4](https://github.com/ecoffey/redis-breadcrumbs/commit/aaa36c4)
|
9
|
+
[51b46f9](https://github.com/ecoffey/redis-breadcrumbs/commit/51b46f9)
|
10
|
+
* Introduce reseting keys
|
11
|
+
[bdc053b](https://github.com/ecoffey/redis-breadcrumbs/commit/bdc053b)
|
12
|
+
[9b863ce](https://github.com/ecoffey/redis-breadcrumbs/commit/9b863ce)
|
13
|
+
* Introduce `as` proxy methods
|
14
|
+
[9485610](https://github.com/ecoffey/redis-breadcrumbs/commit/9485610)
|
15
|
+
[b50cee1](https://github.com/ecoffey/redis-breadcrumbs/commit/b50cee1)
|
16
|
+
|
17
|
+
## 0.0.2
|
18
|
+
|
19
|
+
[40 commits by 1 author](https://github.com/ecoffey/redis-breadcrumbs/compare/v0.0.1...v0.0.2)
|
20
|
+
|
21
|
+
* Can be a member of a set
|
22
|
+
[bab7a45](https://github.com/ecoffey/redis-breadcrumbs/commit/bab7a45)
|
23
|
+
* Add support for templating in relationship declarations
|
24
|
+
[63357f4](https://github.com/ecoffey/redis-breadcrumbs/commit/63357f4)
|
25
|
+
[579f1c7](https://github.com/ecoffey/redis-breadcrumbs/commit/579f1c7)
|
26
|
+
[0df0562](https://github.com/ecoffey/redis-breadcrumbs/commit/0df0562)
|
27
|
+
* `tracked_in` is optional
|
28
|
+
[23b17ae](https://github.com/ecoffey/redis-breadcrumbs/commit/23b17ae)
|
29
|
+
* Unwraps Redis::Namespace to the raw connection
|
30
|
+
[ddc9e3f](https://github.com/ecoffey/redis-breadcrumbs/commit/ddc9e3f)
|
31
|
+
* Introduce cleaning up keys
|
32
|
+
[79b161a](https://github.com/ecoffey/redis-breadcrumbs/commit/79b161a)
|
33
|
+
[ff562c0](https://github.com/ecoffey/redis-breadcrumbs/commit/ff562c0)
|
34
|
+
[5053284](https://github.com/ecoffey/redis-breadcrumbs/commit/5053284)
|
35
|
+
|
36
|
+
## 0.0.1
|
37
|
+
|
38
|
+
[8 commits by 1 author](https://github.com/ecoffey/redis-breadcrumbs/compare/aa281857c04a4900e92888e276d2d777d71257ce...v0.0.1)
|
39
|
+
|
40
|
+
* Added ability to track keys in redis
|
41
|
+
[7342aeb](https://github.com/ecoffey/redis-breadcrumbs/commit/7342aeb)
|
42
|
+
* Added ability to own a key
|
43
|
+
[65b5767](https://github.com/ecoffey/redis-breadcrumbs/commit/65b5767)
|
data/README.md
CHANGED
@@ -25,7 +25,7 @@ class WorkerBreadcrumb < Redis::Breadcrumb
|
|
25
25
|
end
|
26
26
|
```
|
27
27
|
|
28
|
-
##
|
28
|
+
## Installation
|
29
29
|
|
30
30
|
Either
|
31
31
|
|
@@ -33,7 +33,50 @@ Either
|
|
33
33
|
|
34
34
|
or add the following to your Gemfile
|
35
35
|
|
36
|
-
`gem "redis-breadcrumbs", "~> 0.0.
|
36
|
+
`gem "redis-breadcrumbs", "~> 0.0.3"`
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
Create your breadcrumb; we'll continue with the Resque example:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
class WorkerBreadcrumb < Redis::Breadcrumb
|
44
|
+
owns 'resque:worker:<id>'
|
45
|
+
owns 'resque:worker:<id>:started'
|
46
|
+
|
47
|
+
member_of_set '<id>' => 'resque:workers'
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
Keys that have `<...>` snippets in them are **templates**. When you call `track!` or `clean!`,
|
52
|
+
the Breadcrumb will expect an object that responds to symbols in between the brackets.
|
53
|
+
|
54
|
+
You can also specify a key to track keys in with `tracked_in 'resque:worker:<id>:tracking'`
|
55
|
+
|
56
|
+
Using `tracked_in` will let your breadcrumb remember how to clean up keys that are not currently
|
57
|
+
defined in the class (because of code changes, etc).
|
58
|
+
|
59
|
+
Breadcrumb also needs to be told about a redis connection:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
# Breadcrumb always operates on the 'raw' client,
|
63
|
+
# so it will 'unwrap' Redis::Namespace
|
64
|
+
|
65
|
+
Redis::Breadcrumb.redis = Resque.redis
|
66
|
+
```
|
67
|
+
|
68
|
+
When you're ready to start tracking keys (say after the worker finished booting) you can
|
69
|
+
do:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
WorkerBreadcrumb.track!(self)
|
73
|
+
```
|
74
|
+
|
75
|
+
And when you're ready to clean up keys (say when working is shutting down, or in a clean up rake task)
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
WorkerBreadcrumb.clean!(self)
|
79
|
+
```
|
37
80
|
|
38
81
|
## Contributing
|
39
82
|
|
data/TODO.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
prefix namespace
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'redis-breadcrumbs/key_proxy'
|
2
|
+
|
3
|
+
module Breadcrumbs
|
4
|
+
module AsMethods
|
5
|
+
|
6
|
+
def self.included subclass
|
7
|
+
subclass.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def create_as_method key_template, as
|
12
|
+
instance_eval do
|
13
|
+
define_method as.to_sym do
|
14
|
+
KeyProxy.new(self.class.keys[key_template], redis)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,13 +1,24 @@
|
|
1
1
|
require 'redis-breadcrumbs/dsl'
|
2
|
+
require 'redis-breadcrumbs/as_methods'
|
3
|
+
require 'redis-breadcrumbs/entrance'
|
2
4
|
require 'redis-breadcrumbs/keys'
|
5
|
+
require 'redis-breadcrumbs/unspecialized_dummy_object'
|
3
6
|
|
4
7
|
class Redis
|
5
8
|
class Breadcrumb
|
6
9
|
include Breadcrumbs::Dsl
|
10
|
+
include Breadcrumbs::AsMethods
|
11
|
+
include Breadcrumbs::Entrance
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def method_missing mthd, *args
|
15
|
+
new.send(mthd)
|
16
|
+
end
|
17
|
+
end
|
7
18
|
|
8
19
|
attr_reader :tracked_in
|
9
20
|
|
10
|
-
def initialize object
|
21
|
+
def initialize object=Breadcrumbs::UnspecializedDummyObject.new
|
11
22
|
@tracked_in = self.class.tracked_in_key.specialize(object).to_s
|
12
23
|
@keys = self.class.keys.specialize object
|
13
24
|
end
|
@@ -20,14 +31,12 @@ class Redis
|
|
20
31
|
redis.sadd @tracked_in, jsons
|
21
32
|
end
|
22
33
|
|
23
|
-
def
|
24
|
-
|
34
|
+
def reset!
|
35
|
+
run_cmds @keys.reset_cmds
|
36
|
+
end
|
25
37
|
|
26
|
-
|
27
|
-
|
28
|
-
args = cmd_tuple[1..-1]
|
29
|
-
redis.send cmd, *args
|
30
|
-
end
|
38
|
+
def clean!
|
39
|
+
run_cmds Set.new(tracked_keys.concat(@keys.clean_cmds))
|
31
40
|
end
|
32
41
|
|
33
42
|
def tracked_keys
|
@@ -42,5 +51,13 @@ class Redis
|
|
42
51
|
self.class.redis
|
43
52
|
end
|
44
53
|
|
54
|
+
def run_cmds cmds
|
55
|
+
cmds.each do |cmd_tuple|
|
56
|
+
cmd = cmd_tuple[0]
|
57
|
+
args = cmd_tuple[1..-1]
|
58
|
+
redis.send cmd, *args
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
45
62
|
end
|
46
63
|
end
|
@@ -1,22 +1,8 @@
|
|
1
1
|
require 'redis-breadcrumbs/keys'
|
2
2
|
|
3
|
-
class BreadcrumbSpecializationError < Exception; end
|
4
|
-
|
5
3
|
module Breadcrumbs
|
6
4
|
module Dsl
|
7
5
|
|
8
|
-
class UnspecializedDummyObject
|
9
|
-
instance_methods.each do |m|
|
10
|
-
undef_method m unless m =~ /^(__|object_id|instance_eval)/
|
11
|
-
end
|
12
|
-
|
13
|
-
def method_missing method, *args
|
14
|
-
raise BreadcrumbSpecializationError, "#{method}"
|
15
|
-
end
|
16
|
-
|
17
|
-
def respond_to? *args; false; end
|
18
|
-
end
|
19
|
-
|
20
6
|
def self.included subclass
|
21
7
|
subclass.extend ClassMethods
|
22
8
|
end
|
@@ -42,27 +28,25 @@ module Breadcrumbs
|
|
42
28
|
Key.new tracked_in
|
43
29
|
end
|
44
30
|
|
45
|
-
def owns
|
46
|
-
owned_keys <<
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def member_of_set member_to_set
|
51
|
-
member = member_to_set.keys[0]
|
52
|
-
set = member_to_set[member]
|
31
|
+
def owns key_template, options={}
|
32
|
+
owned_keys << key_template
|
33
|
+
as = options.delete(:as)
|
34
|
+
key = OwnedKey.new key_template, options
|
35
|
+
keys[key_template] = OwnedKey.new(key_template, options)
|
53
36
|
|
54
|
-
|
55
|
-
keys << MemberOfSetKey.new(member, set, :srem)
|
37
|
+
create_as_method key_template, as unless as.nil?
|
56
38
|
end
|
57
39
|
|
58
|
-
def
|
59
|
-
|
40
|
+
def member_of_set options
|
41
|
+
add_member_of_set options, member_of_sets, :srem
|
60
42
|
end
|
61
43
|
|
62
|
-
def
|
63
|
-
|
44
|
+
def member_of_sorted_set options
|
45
|
+
add_member_of_set options, member_of_sorted_sets, :zrem
|
64
46
|
end
|
65
47
|
|
48
|
+
alias :member_of_zset :member_of_sorted_set
|
49
|
+
|
66
50
|
def tracked_keys
|
67
51
|
redis.smembers(@tracked_in).map do |json|
|
68
52
|
JSON.parse(json)
|
@@ -80,6 +64,23 @@ module Breadcrumbs
|
|
80
64
|
def member_of_sets
|
81
65
|
@member_of_sets ||= []
|
82
66
|
end
|
67
|
+
|
68
|
+
def member_of_sorted_sets
|
69
|
+
@member_of_sorted_sets ||= []
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def add_member_of_set options, specific_keys, clean_cmd
|
75
|
+
member_to_set = Hash[[options.to_a.shift]]
|
76
|
+
|
77
|
+
member = member_to_set.keys[0]
|
78
|
+
set = member_to_set[member]
|
79
|
+
|
80
|
+
specific_keys << [member, set]
|
81
|
+
keys[set] = MemberOfSetKey.new(member, set, clean_cmd, options)
|
82
|
+
end
|
83
|
+
|
83
84
|
end
|
84
85
|
|
85
86
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'redis-breadcrumbs/key_proxy'
|
2
|
+
require 'redis-breadcrumbs/unspecialized_dummy_object'
|
3
|
+
|
4
|
+
module Breadcrumbs
|
5
|
+
module Entrance
|
6
|
+
|
7
|
+
def self.included subclass
|
8
|
+
subclass.extend ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included subclass
|
12
|
+
subclass.extend ClassMethods
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def track! object=UnspecializedDummyObject.new
|
17
|
+
new(object).tap(&:track!)
|
18
|
+
end
|
19
|
+
|
20
|
+
def reset! object=UnspecializedDummyObject.new
|
21
|
+
new(object).tap(&:reset!)
|
22
|
+
end
|
23
|
+
|
24
|
+
def clean! object=UnspecializedDummyObject.new
|
25
|
+
new(object).tap(&:clean!)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Breadcrumbs
|
2
2
|
class Key
|
3
3
|
def initialize key_template
|
4
|
-
@key_template = key_template
|
4
|
+
@key_template = key_template
|
5
5
|
end
|
6
6
|
|
7
7
|
def specialize object
|
@@ -21,7 +21,8 @@ module Breadcrumbs
|
|
21
21
|
TEMPLATE_REGEX = /(<\w+>)/
|
22
22
|
|
23
23
|
def specialize_from_template template, object
|
24
|
-
|
24
|
+
template = template.to_s
|
25
|
+
matches = TEMPLATE_REGEX.match template
|
25
26
|
|
26
27
|
return template if matches.nil?
|
27
28
|
|
@@ -4,22 +4,30 @@ require 'redis-breadcrumbs/member_of_set_key'
|
|
4
4
|
|
5
5
|
module Breadcrumbs
|
6
6
|
class Keys
|
7
|
-
def initialize keys=
|
7
|
+
def initialize keys={}
|
8
8
|
@keys = keys
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
@keys
|
11
|
+
def [] key_template
|
12
|
+
@keys[key_template]
|
13
|
+
end
|
14
|
+
|
15
|
+
def []= key_template, key
|
16
|
+
@keys[key_template] = key
|
13
17
|
end
|
14
18
|
|
15
19
|
def specialize object
|
16
|
-
Keys.new(@keys.map do |key|
|
17
|
-
key.specialize
|
18
|
-
end)
|
20
|
+
Keys.new(Hash[@keys.map do |(key_template, key)|
|
21
|
+
[key_template, key.specialize(object)]
|
22
|
+
end])
|
19
23
|
end
|
20
24
|
|
21
25
|
def clean_cmds
|
22
|
-
@keys.map &:clean_cmd
|
26
|
+
@keys.values.map &:clean_cmd
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset_cmds
|
30
|
+
@keys.values.map(&:reset_cmd).compact
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
@@ -1,22 +1,33 @@
|
|
1
1
|
module Breadcrumbs
|
2
2
|
class MemberOfSetKey < Key
|
3
|
-
def initialize member_template, set_template, clean_method
|
4
|
-
@
|
5
|
-
@
|
3
|
+
def initialize member_template, set_template, clean_method, options
|
4
|
+
@options = options || {}
|
5
|
+
@member_template = member_template
|
6
|
+
@set_template = set_template
|
6
7
|
@clean_method = clean_method
|
8
|
+
@resetable = options[:reset]
|
7
9
|
end
|
8
10
|
|
9
11
|
def specialize object
|
10
12
|
MemberOfSetKey.new(
|
11
13
|
specialize_from_template(@member_template, object),
|
12
14
|
specialize_from_template(@set_template, object),
|
13
|
-
@clean_method
|
15
|
+
@clean_method,
|
16
|
+
@options
|
14
17
|
)
|
15
18
|
end
|
16
19
|
|
17
20
|
def clean_cmd
|
18
21
|
[@clean_method, @set_template, @member_template]
|
19
22
|
end
|
23
|
+
|
24
|
+
def reset_cmd
|
25
|
+
clean_cmd if @resetable
|
26
|
+
end
|
27
|
+
|
28
|
+
def key_name
|
29
|
+
@set_template
|
30
|
+
end
|
20
31
|
end
|
21
32
|
|
22
33
|
end
|
@@ -1,16 +1,26 @@
|
|
1
1
|
module Breadcrumbs
|
2
2
|
class OwnedKey < Key
|
3
|
-
def initialize key_template
|
4
|
-
@
|
3
|
+
def initialize key_template, options
|
4
|
+
@options = options || {}
|
5
|
+
@key_template = key_template
|
6
|
+
@resetable = options[:reset]
|
5
7
|
end
|
6
8
|
|
7
9
|
def specialize object
|
8
|
-
OwnedKey.new specialize_from_template(@key_template, object)
|
10
|
+
OwnedKey.new specialize_from_template(@key_template, object), @options
|
9
11
|
end
|
10
12
|
|
11
13
|
def clean_cmd
|
12
14
|
[:del, @key_template]
|
13
15
|
end
|
16
|
+
|
17
|
+
def reset_cmd
|
18
|
+
clean_cmd if @resetable
|
19
|
+
end
|
20
|
+
|
21
|
+
def key_name
|
22
|
+
@key_template
|
23
|
+
end
|
14
24
|
end
|
15
25
|
|
16
26
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class BreadcrumbSpecializationError < Exception; end
|
2
|
+
|
3
|
+
module Breadcrumbs
|
4
|
+
class UnspecializedDummyObject
|
5
|
+
instance_methods.each do |m|
|
6
|
+
undef_method m unless m =~ /^(__|object_id|instance_eval)/
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing method, *args
|
10
|
+
raise BreadcrumbSpecializationError, "#{method}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def respond_to? *args; false; end
|
14
|
+
end
|
15
|
+
end
|
data/test/as_test.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe 'Redis::Breadcrumb' do
|
4
|
+
before do
|
5
|
+
Redis::Breadcrumb.redis = MockRedis.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'can access as methods directly from the breadcrumb' do
|
9
|
+
class DirectAsMethod < Redis::Breadcrumb
|
10
|
+
owns :a_key, :as => :my_key
|
11
|
+
end
|
12
|
+
|
13
|
+
DirectAsMethod.my_key.set 'hello'
|
14
|
+
|
15
|
+
assert_equal 'hello', DirectAsMethod.redis.get('a_key')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'can create a method to access the key through' do
|
19
|
+
class OwnedAsMethod < Redis::Breadcrumb
|
20
|
+
owns :a_key, :as => :my_key
|
21
|
+
end
|
22
|
+
|
23
|
+
OwnedAsMethod.new.my_key.set 'hello'
|
24
|
+
|
25
|
+
assert_equal 'hello', OwnedAsMethod.redis.get('a_key')
|
26
|
+
end
|
27
|
+
end
|
data/test/dsl_test.rb
CHANGED
@@ -7,6 +7,7 @@ describe 'Redis::Breadcrumb' do
|
|
7
7
|
owns :a_owned_key
|
8
8
|
|
9
9
|
member_of_set :id => :a_set_of_things
|
10
|
+
member_of_zset :id => :a_sorted_set_of_things
|
10
11
|
end
|
11
12
|
|
12
13
|
before do
|
@@ -41,6 +42,10 @@ describe 'Redis::Breadcrumb' do
|
|
41
42
|
assert_equal [[:id, :a_set_of_things]], DslBreadcrumb.member_of_sets
|
42
43
|
end
|
43
44
|
|
45
|
+
it 'can be a member of a sorted set' do
|
46
|
+
assert_equal [[:id, :a_sorted_set_of_things]], DslBreadcrumb.member_of_sorted_sets
|
47
|
+
end
|
48
|
+
|
44
49
|
it 'tracks keys for each class' do
|
45
50
|
class Test2Breadcrumb < Redis::Breadcrumb
|
46
51
|
tracked_in 'different_tracking_key'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe 'Redis::Breadcrumb' do
|
4
|
+
before do
|
5
|
+
Redis::Breadcrumb.redis = MockRedis.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'by default resets owned key with clean command' do
|
9
|
+
class OwnedResetWithClean < Redis::Breadcrumb
|
10
|
+
owns :a_key, :reset => true
|
11
|
+
end
|
12
|
+
|
13
|
+
OwnedResetWithClean.redis.set 'a_key', 'hello'
|
14
|
+
|
15
|
+
OwnedResetWithClean.reset!
|
16
|
+
|
17
|
+
assert_nil OwnedResetWithClean.redis.get('a_key')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'by default resets member of set keys with clean command' do
|
21
|
+
class MemberOfSetResetWithClean < Redis::Breadcrumb
|
22
|
+
member_of_set :blah => :a_set, :reset => true
|
23
|
+
end
|
24
|
+
|
25
|
+
MemberOfSetResetWithClean.redis.sadd 'a_set', 'blah'
|
26
|
+
|
27
|
+
assert_equal 1, MemberOfSetResetWithClean.redis.scard('a_set')
|
28
|
+
assert MemberOfSetResetWithClean.redis.sismember 'a_set', 'blah'
|
29
|
+
|
30
|
+
MemberOfSetResetWithClean.reset!
|
31
|
+
|
32
|
+
assert_equal 0, MemberOfSetResetWithClean.redis.scard('a_set')
|
33
|
+
refute MemberOfSetResetWithClean.redis.sismember 'a_set', 'blah'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'by default resets member of sorted set keys with clean command' do
|
37
|
+
class MemberOfZsetResetWithClean < Redis::Breadcrumb
|
38
|
+
member_of_zset :blah => :a_set, :reset => true
|
39
|
+
end
|
40
|
+
|
41
|
+
MemberOfZsetResetWithClean.redis.zadd 'a_set', 1, 'blah'
|
42
|
+
|
43
|
+
assert_equal 1, MemberOfZsetResetWithClean.redis.zcard('a_set')
|
44
|
+
assert MemberOfZsetResetWithClean.redis.zrank 'a_set', 'blah'
|
45
|
+
|
46
|
+
MemberOfZsetResetWithClean.reset!
|
47
|
+
|
48
|
+
assert_equal 0, MemberOfZsetResetWithClean.redis.zcard('a_set')
|
49
|
+
refute MemberOfZsetResetWithClean.redis.zrank 'a_set', 'blah'
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/test/test_helper.rb
CHANGED
data/test/tracking_test.rb
CHANGED
@@ -12,13 +12,15 @@ describe 'Redis::Breadcrumb' do
|
|
12
12
|
owns :a_owned_key
|
13
13
|
|
14
14
|
member_of_set :id => :a_set_of_things
|
15
|
+
member_of_zset :id => :a_sorted_set_of_things
|
15
16
|
end
|
16
17
|
|
17
18
|
TrackedInBreadcrumb.track!
|
18
19
|
|
19
20
|
assert_equal [
|
20
21
|
["srem", "a_set_of_things", "id"],
|
21
|
-
["del", "a_owned_key"]
|
22
|
+
["del", "a_owned_key"],
|
23
|
+
["zrem", "a_sorted_set_of_things", "id"]
|
22
24
|
].sort, TrackedInBreadcrumb.tracked_keys.sort
|
23
25
|
end
|
24
26
|
|
@@ -77,4 +79,21 @@ describe 'Redis::Breadcrumb' do
|
|
77
79
|
|
78
80
|
assert_equal [["srem", "a_set_of_things", "foo"]], breadcrumb.tracked_keys
|
79
81
|
end
|
82
|
+
|
83
|
+
it 'can track member of sorted set keys for a specific object' do
|
84
|
+
class MemberOfZsetBreadcrumb < Redis::Breadcrumb
|
85
|
+
tracked_in 'widget:<id>:tracking'
|
86
|
+
|
87
|
+
member_of_zset "<id>" => :a_sorted_set_of_things
|
88
|
+
end
|
89
|
+
|
90
|
+
obj = Object.new
|
91
|
+
class << obj
|
92
|
+
def id; "foo"; end
|
93
|
+
end
|
94
|
+
|
95
|
+
breadcrumb = MemberOfZsetBreadcrumb.track!(obj)
|
96
|
+
|
97
|
+
assert_equal [["zrem", "a_sorted_set_of_things", "foo"]], breadcrumb.tracked_keys
|
98
|
+
end
|
80
99
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-breadcrumbs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -116,21 +116,29 @@ extra_rdoc_files: []
|
|
116
116
|
files:
|
117
117
|
- .gitignore
|
118
118
|
- .travis.yml
|
119
|
+
- CHANGELOG.md
|
119
120
|
- Gemfile
|
120
121
|
- LICENSE.txt
|
121
122
|
- README.md
|
122
123
|
- Rakefile
|
124
|
+
- TODO.txt
|
123
125
|
- lib/redis-breadcrumbs.rb
|
126
|
+
- lib/redis-breadcrumbs/as_methods.rb
|
124
127
|
- lib/redis-breadcrumbs/breadcrumb.rb
|
125
128
|
- lib/redis-breadcrumbs/dsl.rb
|
129
|
+
- lib/redis-breadcrumbs/entrance.rb
|
126
130
|
- lib/redis-breadcrumbs/key.rb
|
131
|
+
- lib/redis-breadcrumbs/key_proxy.rb
|
127
132
|
- lib/redis-breadcrumbs/keys.rb
|
128
133
|
- lib/redis-breadcrumbs/member_of_set_key.rb
|
129
134
|
- lib/redis-breadcrumbs/owned_key.rb
|
135
|
+
- lib/redis-breadcrumbs/unspecialized_dummy_object.rb
|
130
136
|
- lib/redis-breadcrumbs/version.rb
|
131
137
|
- redis-breadcrumbs.gemspec
|
138
|
+
- test/as_test.rb
|
132
139
|
- test/cleaning_test.rb
|
133
140
|
- test/dsl_test.rb
|
141
|
+
- test/reseting_test.rb
|
134
142
|
- test/test_helper.rb
|
135
143
|
- test/tracking_test.rb
|
136
144
|
homepage: https://github.com/ecoffey/redis-breadcrumbs
|
@@ -147,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
147
155
|
version: '0'
|
148
156
|
segments:
|
149
157
|
- 0
|
150
|
-
hash:
|
158
|
+
hash: 2467543944267407332
|
151
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
160
|
none: false
|
153
161
|
requirements:
|
@@ -156,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
164
|
version: '0'
|
157
165
|
segments:
|
158
166
|
- 0
|
159
|
-
hash:
|
167
|
+
hash: 2467543944267407332
|
160
168
|
requirements: []
|
161
169
|
rubyforge_project:
|
162
170
|
rubygems_version: 1.8.24
|
@@ -164,7 +172,9 @@ signing_key:
|
|
164
172
|
specification_version: 3
|
165
173
|
summary: A friendly DSL for tracking and cleaning up redis keys.
|
166
174
|
test_files:
|
175
|
+
- test/as_test.rb
|
167
176
|
- test/cleaning_test.rb
|
168
177
|
- test/dsl_test.rb
|
178
|
+
- test/reseting_test.rb
|
169
179
|
- test/test_helper.rb
|
170
180
|
- test/tracking_test.rb
|