redis-breadcrumbs 0.0.1 → 0.0.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/.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
|
+
[](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
|