time_window_drop_collector 0.1.15 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +3 -2
- data/lib/time_window_drop_collector.rb +3 -3
- data/lib/time_window_drop_collector/storage.rb +2 -2
- data/lib/time_window_drop_collector/version.rb +1 -1
- data/lib/time_window_drop_collector/wrappers/memcache.rb +2 -2
- data/lib/time_window_drop_collector/wrappers/mock.rb +2 -2
- data/lib/time_window_drop_collector/wrappers/rails_cache.rb +2 -2
- data/lib/time_window_drop_collector/wrappers/redis.rb +2 -2
- data/test/memcache_wrapper_test.rb +2 -2
- data/test/mock_wrapper_test.rb +3 -3
- data/test/rails_cache_wrapper_test.rb +3 -3
- data/test/redis_wrapper_test.rb +5 -5
- data/test/storage_test.rb +8 -1
- data/test/time_window_drop_collector_test.rb +11 -1
- data/time_window_drop_collector.gemspec +1 -1
- metadata +16 -16
data/README.md
CHANGED
@@ -43,9 +43,9 @@ Can be:
|
|
43
43
|
twdc.drop( "id1" )
|
44
44
|
twdc.drop( "id1" )
|
45
45
|
twdc.drop( "id2" )
|
46
|
-
twdc.drop( "id1" )
|
46
|
+
twdc.drop( "id1", 4 )
|
47
47
|
|
48
|
-
twdc.count( "id1" ) # =>
|
48
|
+
twdc.count( "id1" ) # => 6
|
49
49
|
twdc.count( "id2" ) # => 1
|
50
50
|
|
51
51
|
# after 10 minutes
|
@@ -80,3 +80,4 @@ It uses the `Rails.cache` accesible
|
|
80
80
|
TimeWindowDropCollector.new do
|
81
81
|
client :redis, { :host => "host", :port => "port" }
|
82
82
|
end
|
83
|
+
|
@@ -33,12 +33,12 @@ class TimeWindowDropCollector
|
|
33
33
|
@storage = TimeWindowDropCollector::Storage.new( wrapper, config[:window], config[:slices] )
|
34
34
|
end
|
35
35
|
|
36
|
-
def drop( keys )
|
36
|
+
def drop( keys, amount=1 )
|
37
37
|
keys = [keys] unless keys.is_a? Array
|
38
38
|
keys = keys.map(&:to_s)
|
39
39
|
|
40
|
-
TimeWindowDropCollector::Logger.log "DROP keys: #{keys.join(", ")}"
|
41
|
-
storage.incr( keys )
|
40
|
+
TimeWindowDropCollector::Logger.log "DROP keys: #{keys.join(", ")}, amount: #{amount}"
|
41
|
+
storage.incr( keys, amount )
|
42
42
|
end
|
43
43
|
|
44
44
|
def count( orig_keys )
|
@@ -9,8 +9,8 @@ class TimeWindowDropCollector::Storage
|
|
9
9
|
@slices = slices
|
10
10
|
end
|
11
11
|
|
12
|
-
def incr( keys )
|
13
|
-
wrapper.incr( timestamp_key_multi( keys ), window )
|
12
|
+
def incr( keys, amount=1 )
|
13
|
+
wrapper.incr( timestamp_key_multi( keys ), window, amount )
|
14
14
|
end
|
15
15
|
|
16
16
|
def count( keys )
|
@@ -7,10 +7,10 @@ class TimeWindowDropCollector
|
|
7
7
|
@client = Dalli::Client.new( opts )
|
8
8
|
end
|
9
9
|
|
10
|
-
def incr( keys, expire_time )
|
10
|
+
def incr( keys, expire_time, amount )
|
11
11
|
client.multi do
|
12
12
|
keys.each do |key|
|
13
|
-
client.incr( key,
|
13
|
+
client.incr( key, amount, expire_time, 1 )
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -7,9 +7,9 @@ class TimeWindowDropCollector
|
|
7
7
|
@client = Rails.cache
|
8
8
|
end
|
9
9
|
|
10
|
-
def incr( keys, expire_time )
|
10
|
+
def incr( keys, expire_time, amount )
|
11
11
|
keys.each do |key|
|
12
|
-
client.increment( key,
|
12
|
+
client.increment( key, amount, :expires_in => expire_time )
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -7,10 +7,10 @@ class TimeWindowDropCollector
|
|
7
7
|
@client = ::Redis.new( opts )
|
8
8
|
end
|
9
9
|
|
10
|
-
def incr( keys, expire_time )
|
10
|
+
def incr( keys, expire_time, amount )
|
11
11
|
client.pipelined do
|
12
12
|
keys.each do |key|
|
13
|
-
client.
|
13
|
+
client.incrby( key, amount )
|
14
14
|
client.expire( key, expire_time )
|
15
15
|
end
|
16
16
|
end
|
@@ -9,8 +9,8 @@ class MemcacheWrapperTest < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
def test_incr
|
11
11
|
wrapper = TimeWindowDropCollector::Wrappers::Memcache.new( ["arg1"] )
|
12
|
-
wrapper.client.expects( :incr ).with( "key",
|
13
|
-
wrapper.incr( "key", "expire_time" )
|
12
|
+
wrapper.client.expects( :incr ).with( "key", 5, "expire_time", 1 )
|
13
|
+
wrapper.incr( "key", "expire_time", 5 )
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_values_for
|
data/test/mock_wrapper_test.rb
CHANGED
@@ -9,9 +9,9 @@ class MockWrapperTest < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
def test_incr
|
11
11
|
wrapper = TimeWindowDropCollector::Wrappers::Mock.new( ["arg1"] )
|
12
|
-
wrapper.client.expects( :incr ).with( "key1",
|
13
|
-
wrapper.client.expects( :incr ).with( "key2",
|
14
|
-
wrapper.incr( ["key1", "key2"], "expire_time" )
|
12
|
+
wrapper.client.expects( :incr ).with( "key1", 2, nil, 1 )
|
13
|
+
wrapper.client.expects( :incr ).with( "key2", 2, nil, 1 )
|
14
|
+
wrapper.incr( ["key1", "key2"], "expire_time", 2 )
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_values_for
|
@@ -14,10 +14,10 @@ class MemcacheWrapperTest < Test::Unit::TestCase
|
|
14
14
|
|
15
15
|
def test_incr
|
16
16
|
wrapper = TimeWindowDropCollector::Wrappers::RailsCache.new( ["arg1"] )
|
17
|
-
wrapper.client.expects( :increment ).with( "key1",
|
18
|
-
wrapper.client.expects( :increment ).with( "key2",
|
17
|
+
wrapper.client.expects( :increment ).with( "key1", 5, :expires_in => "expire_time" )
|
18
|
+
wrapper.client.expects( :increment ).with( "key2", 5, :expires_in => "expire_time" )
|
19
19
|
|
20
|
-
wrapper.incr( ["key1", "key2"], "expire_time" )
|
20
|
+
wrapper.incr( ["key1", "key2"], "expire_time", 5 )
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_values_for
|
data/test/redis_wrapper_test.rb
CHANGED
@@ -4,7 +4,7 @@ class RedisMock
|
|
4
4
|
def multi
|
5
5
|
yield
|
6
6
|
end
|
7
|
-
def
|
7
|
+
def incrby(key,amount);end
|
8
8
|
def expire(key);end
|
9
9
|
def mget(keys);end
|
10
10
|
def pipelined
|
@@ -24,13 +24,13 @@ class RedisWrapperTest < Test::Unit::TestCase
|
|
24
24
|
Redis.expects( :new ).returns( RedisMock.new )
|
25
25
|
wrapper = TimeWindowDropCollector::Wrappers::Redis.new( nil )
|
26
26
|
|
27
|
-
wrapper.client.expects( :
|
27
|
+
wrapper.client.expects( :incrby ).with( "key1", 10 )
|
28
28
|
wrapper.client.expects( :expire ).with( "key1", "expire_time" )
|
29
29
|
|
30
|
-
wrapper.client.expects( :
|
30
|
+
wrapper.client.expects( :incrby ).with( "key2", 10 )
|
31
31
|
wrapper.client.expects( :expire ).with( "key2", "expire_time" )
|
32
32
|
|
33
|
-
wrapper.incr( ["key1", "key2"], "expire_time" )
|
33
|
+
wrapper.incr( ["key1", "key2"], "expire_time", 10 )
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_incr_agregates_commands_under_pipelined
|
@@ -39,7 +39,7 @@ class RedisWrapperTest < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
wrapper.client.expects( :pipelined )
|
41
41
|
|
42
|
-
wrapper.incr( nil, nil )
|
42
|
+
wrapper.incr( nil, nil, nil )
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_get
|
data/test/storage_test.rb
CHANGED
@@ -37,11 +37,18 @@ class StorageTest < Test::Unit::TestCase
|
|
37
37
|
|
38
38
|
def test_incr
|
39
39
|
@storage.expects( :timestamp_key_multi ).with( ["keys"] ).returns( "timestamp_keys" )
|
40
|
-
@wrapper.expects( :incr ).with( "timestamp_keys", 600 )
|
40
|
+
@wrapper.expects( :incr ).with( "timestamp_keys", 600, 1 )
|
41
41
|
|
42
42
|
@storage.incr( ["keys"] )
|
43
43
|
end
|
44
44
|
|
45
|
+
def test_incr_with_val
|
46
|
+
@storage.expects( :timestamp_key_multi ).with( ["keys"] ).returns( "timestamp_keys" )
|
47
|
+
@wrapper.expects( :incr ).with( "timestamp_keys", 600, 30.5 )
|
48
|
+
|
49
|
+
@storage.incr( ["keys"], 30.5 )
|
50
|
+
end
|
51
|
+
|
45
52
|
def test_count
|
46
53
|
@storage.expects( :window_keys_multi ).with( "keys" ).returns( "window_keys" )
|
47
54
|
@wrapper.expects( :get ).with( "window_keys" ).returns( "keys_values" )
|
@@ -33,7 +33,7 @@ class TimeWindowDropCollectorTest < Test::Unit::TestCase
|
|
33
33
|
|
34
34
|
def test_drop
|
35
35
|
storage = mock()
|
36
|
-
storage.expects( :incr ).with( ["key"] )
|
36
|
+
storage.expects( :incr ).with( ["key"], 1 )
|
37
37
|
|
38
38
|
twdc = TimeWindowDropCollector.new
|
39
39
|
twdc.stubs( :storage ).returns( storage )
|
@@ -41,6 +41,16 @@ class TimeWindowDropCollectorTest < Test::Unit::TestCase
|
|
41
41
|
twdc.drop( "key" )
|
42
42
|
end
|
43
43
|
|
44
|
+
def test_drop_with_custom_amount
|
45
|
+
storage = mock()
|
46
|
+
storage.expects( :incr ).with( ["key"], 15 )
|
47
|
+
|
48
|
+
twdc = TimeWindowDropCollector.new
|
49
|
+
twdc.stubs( :storage ).returns( storage )
|
50
|
+
|
51
|
+
twdc.drop( "key", 15 )
|
52
|
+
end
|
53
|
+
|
44
54
|
def test_count
|
45
55
|
storage = mock()
|
46
56
|
storage.expects( :count ).with( ["key"] ).returns( { "key" => 10 } )
|
@@ -18,7 +18,7 @@ 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_development_dependency "bundler"
|
21
|
+
s.add_development_dependency "bundler"
|
22
22
|
s.add_development_dependency "rake", "0.9.2.2"
|
23
23
|
s.add_development_dependency "mocha", "0.10.0"
|
24
24
|
s.add_development_dependency "delorean", "1.2.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_window_drop_collector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,22 +10,22 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-12-19 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
17
|
-
requirement: &
|
17
|
+
requirement: &70353016535360 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
|
-
- -
|
20
|
+
- - ! '>='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70353016535360
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rake
|
28
|
-
requirement: &
|
28
|
+
requirement: &70353016534860 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - =
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.9.2.2
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70353016534860
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: mocha
|
39
|
-
requirement: &
|
39
|
+
requirement: &70353016534360 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - =
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 0.10.0
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70353016534360
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: delorean
|
50
|
-
requirement: &
|
50
|
+
requirement: &70353016533900 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - =
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 1.2.0
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70353016533900
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: memcache_mock
|
61
|
-
requirement: &
|
61
|
+
requirement: &70353016533440 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - =
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 0.0.1
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70353016533440
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: dalli
|
72
|
-
requirement: &
|
72
|
+
requirement: &70353016533060 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *70353016533060
|
81
81
|
description: Counter storage system for a concrete time window
|
82
82
|
email:
|
83
83
|
- fguillen.mail@gmail.com
|