redis-breadcrumbs 0.0.2 → 0.0.3
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 +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
|