redis-breadcrumbs 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.travis.yml +9 -0
- data/LICENSE.txt +20 -0
- data/README.md +10 -2
- data/lib/redis-breadcrumbs/breadcrumb.rb +34 -23
- data/lib/redis-breadcrumbs/dsl.rb +86 -0
- data/lib/redis-breadcrumbs/key.rb +40 -0
- data/lib/redis-breadcrumbs/keys.rb +26 -0
- data/lib/redis-breadcrumbs/member_of_set_key.rb +22 -0
- data/lib/redis-breadcrumbs/owned_key.rb +16 -0
- data/lib/redis-breadcrumbs/version.rb +1 -1
- data/redis-breadcrumbs.gemspec +4 -1
- data/test/cleaning_test.rb +77 -0
- data/test/dsl_test.rb +54 -0
- data/test/tracking_test.rb +80 -0
- metadata +57 -15
- data/.rvmrc +0 -1
- data/test/breadcrumb_test.rb +0 -40
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Eoin Coffey
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/ecoffey/redis-breadcrumbs.png)](https://travis-ci.org/ecoffey/redis-breadcrumbs)
|
2
|
+
|
1
3
|
## Redis and key tracking
|
2
4
|
|
3
5
|
Redis is a bit different than a lot of other "data stores". This also means that thinking about ownership management
|
@@ -19,13 +21,19 @@ class WorkerBreadcrumb < Redis::Breadcrumb
|
|
19
21
|
owns 'resque:worker:<id>'
|
20
22
|
owns 'resque:worker:<id>:started'
|
21
23
|
|
22
|
-
member_of_set
|
24
|
+
member_of_set '<id>' => 'resque:workers'
|
23
25
|
end
|
24
26
|
```
|
25
27
|
|
26
28
|
## Usage
|
27
29
|
|
28
|
-
|
30
|
+
Either
|
31
|
+
|
32
|
+
`gem install redis-breadcrumbs`
|
33
|
+
|
34
|
+
or add the following to your Gemfile
|
35
|
+
|
36
|
+
`gem "redis-breadcrumbs", "~> 0.0.1"`
|
29
37
|
|
30
38
|
## Contributing
|
31
39
|
|
@@ -1,35 +1,46 @@
|
|
1
|
-
|
1
|
+
require 'redis-breadcrumbs/dsl'
|
2
|
+
require 'redis-breadcrumbs/keys'
|
3
|
+
|
4
|
+
class Redis
|
2
5
|
class Breadcrumb
|
3
|
-
|
4
|
-
attr_accessor :owned_keys
|
6
|
+
include Breadcrumbs::Dsl
|
5
7
|
|
6
|
-
|
7
|
-
@@redis
|
8
|
-
end
|
8
|
+
attr_reader :tracked_in
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def initialize object
|
11
|
+
@tracked_in = self.class.tracked_in_key.specialize(object).to_s
|
12
|
+
@keys = self.class.keys.specialize object
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
end
|
15
|
+
def track!
|
16
|
+
return if @tracked_in.nil? || @tracked_in == ""
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
jsons = @keys.clean_cmds.map(&:to_json)
|
19
|
+
|
20
|
+
redis.sadd @tracked_in, jsons
|
21
|
+
end
|
22
|
+
|
23
|
+
def clean!
|
24
|
+
cmds = Set.new tracked_keys.concat(@keys.clean_cmds)
|
21
25
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
cmds.each do |cmd_tuple|
|
27
|
+
cmd = cmd_tuple[0]
|
28
|
+
args = cmd_tuple[1..-1]
|
29
|
+
redis.send cmd, *args
|
26
30
|
end
|
31
|
+
end
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
33
|
+
def tracked_keys
|
34
|
+
redis.smembers(@tracked_in).map do |json|
|
35
|
+
JSON.parse(json)
|
32
36
|
end
|
33
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def redis
|
42
|
+
self.class.redis
|
43
|
+
end
|
44
|
+
|
34
45
|
end
|
35
46
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'redis-breadcrumbs/keys'
|
2
|
+
|
3
|
+
class BreadcrumbSpecializationError < Exception; end
|
4
|
+
|
5
|
+
module Breadcrumbs
|
6
|
+
module Dsl
|
7
|
+
|
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
|
+
def self.included subclass
|
21
|
+
subclass.extend ClassMethods
|
22
|
+
end
|
23
|
+
|
24
|
+
module ClassMethods
|
25
|
+
def redis
|
26
|
+
@@redis
|
27
|
+
end
|
28
|
+
|
29
|
+
def redis= redis
|
30
|
+
if defined?(Redis::Namespace) && redis.is_a?(Redis::Namespace)
|
31
|
+
redis = redis.redis # yo dawg
|
32
|
+
end
|
33
|
+
|
34
|
+
@@redis = redis
|
35
|
+
end
|
36
|
+
|
37
|
+
def tracked_in *args
|
38
|
+
args.length > 0 ? @tracked_in = args[0] : @tracked_in
|
39
|
+
end
|
40
|
+
|
41
|
+
def tracked_in_key
|
42
|
+
Key.new tracked_in
|
43
|
+
end
|
44
|
+
|
45
|
+
def owns key
|
46
|
+
owned_keys << key
|
47
|
+
keys << OwnedKey.new(key)
|
48
|
+
end
|
49
|
+
|
50
|
+
def member_of_set member_to_set
|
51
|
+
member = member_to_set.keys[0]
|
52
|
+
set = member_to_set[member]
|
53
|
+
|
54
|
+
member_of_sets << [member, set]
|
55
|
+
keys << MemberOfSetKey.new(member, set, :srem)
|
56
|
+
end
|
57
|
+
|
58
|
+
def track! object=UnspecializedDummyObject.new
|
59
|
+
new(object).tap(&:track!)
|
60
|
+
end
|
61
|
+
|
62
|
+
def clean! object=UnspecializedDummyObject.new
|
63
|
+
new(object).tap(&:clean!)
|
64
|
+
end
|
65
|
+
|
66
|
+
def tracked_keys
|
67
|
+
redis.smembers(@tracked_in).map do |json|
|
68
|
+
JSON.parse(json)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def keys
|
73
|
+
@keys ||= Keys.new
|
74
|
+
end
|
75
|
+
|
76
|
+
def owned_keys
|
77
|
+
@owned_keys ||= []
|
78
|
+
end
|
79
|
+
|
80
|
+
def member_of_sets
|
81
|
+
@member_of_sets ||= []
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Breadcrumbs
|
2
|
+
class Key
|
3
|
+
def initialize key_template
|
4
|
+
@key_template = key_template.to_s
|
5
|
+
end
|
6
|
+
|
7
|
+
def specialize object
|
8
|
+
Key.new specialize_from_template(@key_template, object)
|
9
|
+
end
|
10
|
+
|
11
|
+
def clean_cmd
|
12
|
+
raise "Can't clean this key #{@key_template}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
@key_template
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
TEMPLATE_REGEX = /(<\w+>)/
|
22
|
+
|
23
|
+
def specialize_from_template template, object
|
24
|
+
matches = TEMPLATE_REGEX.match template.to_s
|
25
|
+
|
26
|
+
return template if matches.nil?
|
27
|
+
|
28
|
+
specialized = template.dup
|
29
|
+
|
30
|
+
matches.captures.each do |method_marker|
|
31
|
+
method = method_marker[1..-2].to_sym
|
32
|
+
|
33
|
+
specialized.gsub! method_marker, object.send(method)
|
34
|
+
end
|
35
|
+
|
36
|
+
specialized
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'redis-breadcrumbs/key'
|
2
|
+
require 'redis-breadcrumbs/owned_key'
|
3
|
+
require 'redis-breadcrumbs/member_of_set_key'
|
4
|
+
|
5
|
+
module Breadcrumbs
|
6
|
+
class Keys
|
7
|
+
def initialize keys=[]
|
8
|
+
@keys = keys
|
9
|
+
end
|
10
|
+
|
11
|
+
def << key
|
12
|
+
@keys << key
|
13
|
+
end
|
14
|
+
|
15
|
+
def specialize object
|
16
|
+
Keys.new(@keys.map do |key|
|
17
|
+
key.specialize object
|
18
|
+
end)
|
19
|
+
end
|
20
|
+
|
21
|
+
def clean_cmds
|
22
|
+
@keys.map &:clean_cmd
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Breadcrumbs
|
2
|
+
class MemberOfSetKey < Key
|
3
|
+
def initialize member_template, set_template, clean_method
|
4
|
+
@member_template = member_template.to_s
|
5
|
+
@set_template = set_template.to_s
|
6
|
+
@clean_method = clean_method
|
7
|
+
end
|
8
|
+
|
9
|
+
def specialize object
|
10
|
+
MemberOfSetKey.new(
|
11
|
+
specialize_from_template(@member_template, object),
|
12
|
+
specialize_from_template(@set_template, object),
|
13
|
+
@clean_method
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
def clean_cmd
|
18
|
+
[@clean_method, @set_template, @member_template]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Breadcrumbs
|
2
|
+
class OwnedKey < Key
|
3
|
+
def initialize key_template
|
4
|
+
@key_template = key_template.to_s
|
5
|
+
end
|
6
|
+
|
7
|
+
def specialize object
|
8
|
+
OwnedKey.new specialize_from_template(@key_template, object)
|
9
|
+
end
|
10
|
+
|
11
|
+
def clean_cmd
|
12
|
+
[:del, @key_template]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/redis-breadcrumbs.gemspec
CHANGED
@@ -18,8 +18,11 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
+
s.add_dependency "json"
|
22
|
+
s.add_dependency "redis"
|
23
|
+
|
21
24
|
s.add_development_dependency "rake", ">= 0.9.2"
|
22
|
-
s.add_development_dependency "redis", "~> 3.0.0"
|
23
25
|
s.add_development_dependency "minitest", "~> 4.3.2"
|
24
26
|
s.add_development_dependency "mock_redis", "~> 0.6"
|
27
|
+
s.add_development_dependency "redis-namespace", "~> 1.2"
|
25
28
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe 'Redis::Breadcrumb' do
|
4
|
+
before do
|
5
|
+
Redis::Breadcrumb.redis = MockRedis.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'will clean up currently defined keys' do
|
9
|
+
class CleanUpCurrentKeys < Redis::Breadcrumb
|
10
|
+
owns :a_key
|
11
|
+
end
|
12
|
+
|
13
|
+
CleanUpCurrentKeys.redis.set 'a_key', 'hello'
|
14
|
+
|
15
|
+
assert_equal 'hello', CleanUpCurrentKeys.redis.get('a_key')
|
16
|
+
|
17
|
+
CleanUpCurrentKeys.clean!
|
18
|
+
|
19
|
+
assert_nil CleanUpCurrentKeys.redis.get('a_key')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'will raise if no object given for specialized template' do
|
23
|
+
class UnspecializedCleanKeys < Redis::Breadcrumb
|
24
|
+
owns 'widget:<id>'
|
25
|
+
end
|
26
|
+
|
27
|
+
assert_raises BreadcrumbSpecializationError do
|
28
|
+
UnspecializedCleanKeys.clean!
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'will clean up currently defined specialized keys' do
|
33
|
+
class CleanUpCurrentSpecializedKeys < Redis::Breadcrumb
|
34
|
+
owns 'widget:<id>'
|
35
|
+
end
|
36
|
+
|
37
|
+
obj = Object.new
|
38
|
+
class << obj
|
39
|
+
def id; 'foo'; end
|
40
|
+
end
|
41
|
+
|
42
|
+
CleanUpCurrentSpecializedKeys.redis.set 'widget:foo', 'yarg'
|
43
|
+
|
44
|
+
assert_equal 'yarg', CleanUpCurrentSpecializedKeys.redis.get('widget:foo')
|
45
|
+
|
46
|
+
CleanUpCurrentSpecializedKeys.clean! obj
|
47
|
+
|
48
|
+
assert_nil CleanUpCurrentSpecializedKeys.redis.get('widget:foo')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'will clean up previously tracked and current keys' do
|
52
|
+
class CleanUpPrevAndCurrentKeys < Redis::Breadcrumb
|
53
|
+
tracked_in 'widget:<id>:tracking'
|
54
|
+
|
55
|
+
owns 'widget:<id>'
|
56
|
+
|
57
|
+
member_of_set '<id>' => 'widgets'
|
58
|
+
end
|
59
|
+
|
60
|
+
obj = Object.new
|
61
|
+
class << obj
|
62
|
+
def id; 'foo'; end
|
63
|
+
end
|
64
|
+
|
65
|
+
CleanUpPrevAndCurrentKeys.redis.sadd 'widget:foo:tracking', [:del, 'widget:foo:blah'].to_json
|
66
|
+
|
67
|
+
CleanUpPrevAndCurrentKeys.redis.set 'widget:foo', 'hello'
|
68
|
+
CleanUpPrevAndCurrentKeys.redis.set 'widget:foo:blah', 'world'
|
69
|
+
CleanUpPrevAndCurrentKeys.redis.sadd 'widgets', 'foo'
|
70
|
+
|
71
|
+
CleanUpPrevAndCurrentKeys.clean! obj
|
72
|
+
|
73
|
+
assert_nil CleanUpPrevAndCurrentKeys.redis.get('widget:foo')
|
74
|
+
assert_nil CleanUpPrevAndCurrentKeys.redis.get('widget:foo:blah')
|
75
|
+
refute CleanUpPrevAndCurrentKeys.redis.sismember('widgets', 'foo')
|
76
|
+
end
|
77
|
+
end
|
data/test/dsl_test.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe 'Redis::Breadcrumb' do
|
4
|
+
class DslBreadcrumb < Redis::Breadcrumb
|
5
|
+
tracked_in 'tracking_key'
|
6
|
+
|
7
|
+
owns :a_owned_key
|
8
|
+
|
9
|
+
member_of_set :id => :a_set_of_things
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
redis = MockRedis.new
|
14
|
+
|
15
|
+
Redis::Breadcrumb.redis = redis
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'will unwrap a RedisNamespace to the "raw" client' do
|
19
|
+
require 'redis-namespace'
|
20
|
+
|
21
|
+
redis = MockRedis.new
|
22
|
+
rn = Redis::Namespace.new :namespaced, :redis => redis
|
23
|
+
|
24
|
+
Redis::Breadcrumb.redis = rn
|
25
|
+
|
26
|
+
Redis::Breadcrumb.redis.set 'blah', 1
|
27
|
+
|
28
|
+
assert_nil redis.get('namespaced:blah')
|
29
|
+
assert_equal "1", redis.get('blah')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'can record a key to track in' do
|
33
|
+
assert_equal 'tracking_key', DslBreadcrumb.tracked_in
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'can own a key' do
|
37
|
+
assert_equal [:a_owned_key], DslBreadcrumb.owned_keys
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'can be a member of a set' do
|
41
|
+
assert_equal [[:id, :a_set_of_things]], DslBreadcrumb.member_of_sets
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'tracks keys for each class' do
|
45
|
+
class Test2Breadcrumb < Redis::Breadcrumb
|
46
|
+
tracked_in 'different_tracking_key'
|
47
|
+
|
48
|
+
owns :a_different_key
|
49
|
+
end
|
50
|
+
|
51
|
+
refute_equal DslBreadcrumb.owned_keys, Test2Breadcrumb.owned_keys
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,80 @@
|
|
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 track tracked keys in tracked_in' do
|
9
|
+
class TrackedInBreadcrumb < Redis::Breadcrumb
|
10
|
+
tracked_in 'tracking_key'
|
11
|
+
|
12
|
+
owns :a_owned_key
|
13
|
+
|
14
|
+
member_of_set :id => :a_set_of_things
|
15
|
+
end
|
16
|
+
|
17
|
+
TrackedInBreadcrumb.track!
|
18
|
+
|
19
|
+
assert_equal [
|
20
|
+
["srem", "a_set_of_things", "id"],
|
21
|
+
["del", "a_owned_key"]
|
22
|
+
].sort, TrackedInBreadcrumb.tracked_keys.sort
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'tracked_in can be optional' do
|
26
|
+
class NoTrackedInBreadcrumb < Redis::Breadcrumb
|
27
|
+
owns :a_key
|
28
|
+
end
|
29
|
+
|
30
|
+
NoTrackedInBreadcrumb.track!
|
31
|
+
|
32
|
+
assert_equal [], NoTrackedInBreadcrumb.redis.keys('*')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'will raise if no object given for specialized template' do
|
36
|
+
class UnspecializedBreadcrumb < Redis::Breadcrumb
|
37
|
+
tracked_in 'tracking_key'
|
38
|
+
|
39
|
+
owns 'a_special_<id>_key'
|
40
|
+
end
|
41
|
+
|
42
|
+
assert_raises BreadcrumbSpecializationError do
|
43
|
+
UnspecializedBreadcrumb.track!
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'can track owned keys for a specific object' do
|
48
|
+
class OwnedBreadcrumb < Redis::Breadcrumb
|
49
|
+
tracked_in 'widget:<id>:tracking'
|
50
|
+
|
51
|
+
owns 'widget:<id>'
|
52
|
+
end
|
53
|
+
|
54
|
+
obj = Object.new
|
55
|
+
class << obj
|
56
|
+
def id; "foo"; end
|
57
|
+
end
|
58
|
+
|
59
|
+
breadcrumb = OwnedBreadcrumb.track!(obj)
|
60
|
+
|
61
|
+
assert_equal [["del", "widget:foo"]], breadcrumb.tracked_keys
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'can track member of set keys for a specific object' do
|
65
|
+
class MemberOfSetBreadcrumb < Redis::Breadcrumb
|
66
|
+
tracked_in 'widget:<id>:tracking'
|
67
|
+
|
68
|
+
member_of_set "<id>" => :a_set_of_things
|
69
|
+
end
|
70
|
+
|
71
|
+
obj = Object.new
|
72
|
+
class << obj
|
73
|
+
def id; "foo"; end
|
74
|
+
end
|
75
|
+
|
76
|
+
breadcrumb = MemberOfSetBreadcrumb.track!(obj)
|
77
|
+
|
78
|
+
assert_equal [["srem", "a_set_of_things", "foo"]], breadcrumb.tracked_keys
|
79
|
+
end
|
80
|
+
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.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,40 +9,56 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: json
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0
|
22
|
-
type: :
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0
|
29
|
+
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: redis
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
36
52
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
53
|
+
version: 0.9.2
|
38
54
|
type: :development
|
39
55
|
prerelease: false
|
40
56
|
version_requirements: !ruby/object:Gem::Requirement
|
41
57
|
none: false
|
42
58
|
requirements:
|
43
|
-
- -
|
59
|
+
- - ! '>='
|
44
60
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
61
|
+
version: 0.9.2
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: minitest
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +91,22 @@ dependencies:
|
|
75
91
|
- - ~>
|
76
92
|
- !ruby/object:Gem::Version
|
77
93
|
version: '0.6'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: redis-namespace
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.2'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.2'
|
78
110
|
description: Inherit from Redis::Breadcrumb to get going!
|
79
111
|
email:
|
80
112
|
- ecoffey@gmail.com
|
@@ -83,16 +115,24 @@ extensions: []
|
|
83
115
|
extra_rdoc_files: []
|
84
116
|
files:
|
85
117
|
- .gitignore
|
86
|
-
- .
|
118
|
+
- .travis.yml
|
87
119
|
- Gemfile
|
120
|
+
- LICENSE.txt
|
88
121
|
- README.md
|
89
122
|
- Rakefile
|
90
123
|
- lib/redis-breadcrumbs.rb
|
91
124
|
- lib/redis-breadcrumbs/breadcrumb.rb
|
125
|
+
- lib/redis-breadcrumbs/dsl.rb
|
126
|
+
- lib/redis-breadcrumbs/key.rb
|
127
|
+
- lib/redis-breadcrumbs/keys.rb
|
128
|
+
- lib/redis-breadcrumbs/member_of_set_key.rb
|
129
|
+
- lib/redis-breadcrumbs/owned_key.rb
|
92
130
|
- lib/redis-breadcrumbs/version.rb
|
93
131
|
- redis-breadcrumbs.gemspec
|
94
|
-
- test/
|
132
|
+
- test/cleaning_test.rb
|
133
|
+
- test/dsl_test.rb
|
95
134
|
- test/test_helper.rb
|
135
|
+
- test/tracking_test.rb
|
96
136
|
homepage: https://github.com/ecoffey/redis-breadcrumbs
|
97
137
|
licenses: []
|
98
138
|
post_install_message:
|
@@ -107,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
147
|
version: '0'
|
108
148
|
segments:
|
109
149
|
- 0
|
110
|
-
hash:
|
150
|
+
hash: -4237510823449836628
|
111
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
152
|
none: false
|
113
153
|
requirements:
|
@@ -116,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
156
|
version: '0'
|
117
157
|
segments:
|
118
158
|
- 0
|
119
|
-
hash:
|
159
|
+
hash: -4237510823449836628
|
120
160
|
requirements: []
|
121
161
|
rubyforge_project:
|
122
162
|
rubygems_version: 1.8.24
|
@@ -124,5 +164,7 @@ signing_key:
|
|
124
164
|
specification_version: 3
|
125
165
|
summary: A friendly DSL for tracking and cleaning up redis keys.
|
126
166
|
test_files:
|
127
|
-
- test/
|
167
|
+
- test/cleaning_test.rb
|
168
|
+
- test/dsl_test.rb
|
128
169
|
- test/test_helper.rb
|
170
|
+
- test/tracking_test.rb
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm 1.9.3@redis-breadcrumbs --create
|
data/test/breadcrumb_test.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
describe 'Redis::Breadcrumb' do
|
4
|
-
class TestBreadcrumb < Redis::Breadcrumb
|
5
|
-
tracked_in 'tracking_key'
|
6
|
-
|
7
|
-
owns :a_owned_key
|
8
|
-
end
|
9
|
-
|
10
|
-
before do
|
11
|
-
redis = MockRedis.new
|
12
|
-
|
13
|
-
Redis::Breadcrumb.redis = redis
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'can record a key to track in' do
|
17
|
-
assert_equal 'tracking_key', TestBreadcrumb.tracked_in
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'can own a key' do
|
21
|
-
assert_equal [:a_owned_key], TestBreadcrumb.owned_keys
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'will register tracked keys in tracked_in' do
|
25
|
-
TestBreadcrumb.register
|
26
|
-
|
27
|
-
assert_equal 1, Redis::Breadcrumb.redis.scard(TestBreadcrumb.tracked_in)
|
28
|
-
assert_equal [["del", "a_owned_key"]], TestBreadcrumb.tracked_keys
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'tracks keys for each class' do
|
32
|
-
class Test2Breadcrumb < Redis::Breadcrumb
|
33
|
-
tracked_in 'different_tracking_key'
|
34
|
-
|
35
|
-
owns :a_different_key
|
36
|
-
end
|
37
|
-
|
38
|
-
refute_equal TestBreadcrumb.owned_keys, Test2Breadcrumb.owned_keys
|
39
|
-
end
|
40
|
-
end
|