time_window_drop_collector 0.3.2 → 0.3.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.
- checksums.yaml +7 -0
- data/Gemfile +1 -1
- data/README.md +4 -1
- data/lib/time_window_drop_collector.rb +9 -0
- data/lib/time_window_drop_collector/storage.rb +8 -2
- data/lib/time_window_drop_collector/utils.rb +6 -10
- data/lib/time_window_drop_collector/version.rb +1 -1
- data/lib/time_window_drop_collector/wrappers/memcache.rb +8 -0
- data/lib/time_window_drop_collector/wrappers/mock.rb +23 -17
- data/lib/time_window_drop_collector/wrappers/rails_cache.rb +22 -16
- data/lib/time_window_drop_collector/wrappers/redis.rb +16 -7
- data/test/memcache_wrapper_test.rb +7 -1
- data/test/mock_wrapper_test.rb +8 -1
- data/test/rails_cache_wrapper_test.rb +9 -1
- data/test/redis_wrapper_test.rb +14 -1
- data/test/storage_test.rb +23 -5
- data/test/time_window_drop_collector_test.rb +51 -6
- data/time_window_drop_collector.gemspec +3 -3
- metadata +21 -34
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 34b9b2de8a482fd8222318926c3e386f55a73b17
|
4
|
+
data.tar.gz: b813b99402ffc1a28c55cb5e972775667e30a1e2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 699bf75c79b1e6eab0ce40f52bdff4c6ed913b3a7005f058a8d29770636b892d4469e8915069b02a68466ed1140522c94a44ad0713dc093ef1417035e14b7326
|
7
|
+
data.tar.gz: 05a93a25754cc7c977d206de6d79b21bc0158cb9feceb2656d5c52cb628ec7a195ca2a1a0d5523d81ae2cb40cf0ac465241d482e7647a3d67d6b87ac1239832f
|
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
data/README.md
CHANGED
@@ -43,11 +43,14 @@ Can be:
|
|
43
43
|
twdc.drop( "id1" )
|
44
44
|
twdc.drop( "id1" )
|
45
45
|
twdc.drop( "id2" )
|
46
|
-
twdc.drop( "id1", 4 )
|
46
|
+
ts = twdc.drop( "id1", 4 )
|
47
47
|
|
48
48
|
twdc.count( "id1" ) # => 6
|
49
49
|
twdc.count( "id2" ) # => 1
|
50
50
|
|
51
|
+
twdc.pick( ts, "id1", 2)
|
52
|
+
twdc.count( "id1" ) # => 4
|
53
|
+
|
51
54
|
# after 10 minutes
|
52
55
|
twdc.count( "id1" ) # => 0
|
53
56
|
|
@@ -41,6 +41,15 @@ class TimeWindowDropCollector
|
|
41
41
|
storage.incr( keys, amount )
|
42
42
|
end
|
43
43
|
|
44
|
+
def pick( time, keys, amount=1)
|
45
|
+
keys = [keys] unless keys.is_a? Array
|
46
|
+
keys = keys.map(&:to_s)
|
47
|
+
|
48
|
+
TimeWindowDropCollector::Logger.log "PICK keys: #{keys.join(", ")}, amount: #{amount}"
|
49
|
+
|
50
|
+
storage.decr( time, keys, amount )
|
51
|
+
end
|
52
|
+
|
44
53
|
def count( orig_keys )
|
45
54
|
keys = orig_keys.is_a?(Array) ? orig_keys : [orig_keys]
|
46
55
|
keys = keys.map(&:to_s)
|
@@ -10,7 +10,13 @@ class TimeWindowDropCollector::Storage
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def incr( keys, amount=1 )
|
13
|
-
|
13
|
+
now = Time.now
|
14
|
+
wrapper.incr( timestamp_key_multi( keys, now), window, amount )
|
15
|
+
now
|
16
|
+
end
|
17
|
+
|
18
|
+
def decr( timestamp, keys, amount=1 )
|
19
|
+
wrapper.decr(timestamp_key_multi( keys, timestamp), window, amount)
|
14
20
|
end
|
15
21
|
|
16
22
|
def count( keys )
|
@@ -21,4 +27,4 @@ class TimeWindowDropCollector::Storage
|
|
21
27
|
|
22
28
|
grouping_count( keys_values )
|
23
29
|
end
|
24
|
-
end
|
30
|
+
end
|
@@ -15,22 +15,18 @@ module TimeWindowDropCollector::Utils
|
|
15
15
|
"drop_window_#{key}_#{slice_start_timestamp( time )}"
|
16
16
|
end
|
17
17
|
|
18
|
-
def timestamp_key_multi( keys )
|
19
|
-
|
20
|
-
|
21
|
-
keys.map { |key| timestamp_key( key, now ) }.flatten
|
18
|
+
def timestamp_key_multi( keys, time = timestamp)
|
19
|
+
keys.map { |key| timestamp_key( key, time) }.flatten
|
22
20
|
end
|
23
21
|
|
24
|
-
def window_keys( key,
|
22
|
+
def window_keys( key, time = timestamp )
|
25
23
|
( 0..( slices - 1 ) ).map{ |i|
|
26
|
-
timestamp_key( key,
|
24
|
+
timestamp_key( key, time - ( ( i*slice_milliseconds ) / 1000 ) )
|
27
25
|
}
|
28
26
|
end
|
29
27
|
|
30
28
|
def window_keys_multi( keys )
|
31
|
-
|
32
|
-
|
33
|
-
keys.map { |key| window_keys( key, now ) }.flatten
|
29
|
+
keys.map { |key| window_keys( key ) }.flatten
|
34
30
|
end
|
35
31
|
|
36
32
|
def timestamp
|
@@ -46,4 +42,4 @@ module TimeWindowDropCollector::Utils
|
|
46
42
|
|
47
43
|
( time_milliseconds / slice_milliseconds ) * slice_milliseconds
|
48
44
|
end
|
49
|
-
end
|
45
|
+
end
|
@@ -15,6 +15,14 @@ class TimeWindowDropCollector
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def decr( keys, expire_time, amount )
|
19
|
+
client.multi do
|
20
|
+
keys.each do |key|
|
21
|
+
client.decr( key, amount, expire_time, -1 )
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
18
26
|
def get( keys )
|
19
27
|
client.get_multi( keys )
|
20
28
|
end
|
@@ -1,25 +1,31 @@
|
|
1
1
|
class TimeWindowDropCollector
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
module Wrappers
|
3
|
+
class Mock
|
4
|
+
attr_reader :client
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
def initialize( opts )
|
7
|
+
@client = MemcacheMock.new
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def incr( keys, expire_time, amount )
|
11
|
+
keys.each do |key|
|
12
|
+
client.incr( key, amount, nil, 1 )
|
13
|
+
end
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def decr( keys, expire_time, amount )
|
17
|
+
keys.each do |key|
|
18
|
+
client.decr( key, amount, nil, -1 )
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def get( keys )
|
23
|
+
client.get_multi( keys )
|
24
|
+
end
|
19
25
|
|
20
26
|
def reset
|
21
27
|
client.flush
|
22
28
|
end
|
23
|
-
|
24
|
-
|
25
|
-
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,26 +1,32 @@
|
|
1
1
|
class TimeWindowDropCollector
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
module Wrappers
|
3
|
+
class RailsCache
|
4
|
+
attr_reader :client
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
def initialize( opts )
|
7
|
+
@client = Rails.cache
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def incr( keys, expire_time, amount )
|
11
|
+
keys.each do |key|
|
12
|
+
client.increment( key, amount, :expires_in => expire_time )
|
13
|
+
end
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def decr( keys, expire_time, amount )
|
17
|
+
keys.each do |key|
|
18
|
+
client.decrement( key, amount, :expires_in => expire_time )
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def get( keys )
|
23
|
+
client.read_multi( keys )
|
24
|
+
end
|
19
25
|
|
20
26
|
def reset
|
21
27
|
client.reset
|
22
28
|
end
|
23
|
-
|
24
|
-
|
29
|
+
end
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
@@ -1,23 +1,32 @@
|
|
1
1
|
class TimeWindowDropCollector
|
2
2
|
module Wrappers
|
3
3
|
class Redis
|
4
|
-
|
4
|
+
attr_reader :client
|
5
5
|
|
6
6
|
def initialize( opts )
|
7
7
|
@client = ::Redis.new( opts )
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
def incr( keys, expire_time, amount )
|
11
11
|
client.pipelined do
|
12
12
|
keys.each do |key|
|
13
13
|
client.incrby( key, amount )
|
14
14
|
client.expire( key, expire_time )
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
def decr( keys, expire_time, amount )
|
20
|
+
client.pipelined do
|
21
|
+
keys.each do |key|
|
22
|
+
client.decrby( key, amount )
|
23
|
+
client.expire( key, expire_time )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def get( keys )
|
29
|
+
values = client.mget( *keys )
|
21
30
|
|
22
31
|
result = {}
|
23
32
|
|
@@ -26,12 +35,12 @@ class TimeWindowDropCollector
|
|
26
35
|
end
|
27
36
|
|
28
37
|
result
|
29
|
-
|
38
|
+
end
|
30
39
|
|
31
40
|
def reset
|
32
41
|
client.quit
|
33
42
|
end
|
34
|
-
|
43
|
+
end
|
35
44
|
end
|
36
45
|
end
|
37
46
|
|
@@ -12,4 +12,10 @@ class MemcacheWrapperTest < Test::Unit::TestCase
|
|
12
12
|
wrapper.client.expects( :incr ).with( "key", 5, "expire_time", 1)
|
13
13
|
wrapper.incr( ["key"], "expire_time", 5 )
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
|
+
def test_decr
|
17
|
+
wrapper = TimeWindowDropCollector::Wrappers::Memcache.new( ["arg1"] )
|
18
|
+
wrapper.client.expects( :decr ).with( "key", 5, "expire_time", -1)
|
19
|
+
wrapper.decr( ["key"], "expire_time", 5 )
|
20
|
+
end
|
21
|
+
end
|
data/test/mock_wrapper_test.rb
CHANGED
@@ -14,6 +14,13 @@ class MockWrapperTest < Test::Unit::TestCase
|
|
14
14
|
wrapper.incr( ["key1", "key2"], "expire_time", 2 )
|
15
15
|
end
|
16
16
|
|
17
|
+
def test_decr
|
18
|
+
wrapper = TimeWindowDropCollector::Wrappers::Mock.new( ["arg1"] )
|
19
|
+
wrapper.client.expects( :decr ).with( "key1", 2, nil, -1 )
|
20
|
+
wrapper.client.expects( :decr ).with( "key2", 2, nil, -1 )
|
21
|
+
wrapper.decr( ["key1", "key2"], "expire_time", 2 )
|
22
|
+
end
|
23
|
+
|
17
24
|
def test_values_for
|
18
25
|
wrapper = TimeWindowDropCollector::Wrappers::Mock.new( ["arg1"] )
|
19
26
|
wrapper.client.expects( :get_multi ).with( "keys" ).returns( "keys_values" )
|
@@ -25,4 +32,4 @@ class MockWrapperTest < Test::Unit::TestCase
|
|
25
32
|
wrapper.client.expects( :flush )
|
26
33
|
wrapper.reset
|
27
34
|
end
|
28
|
-
end
|
35
|
+
end
|
@@ -20,6 +20,14 @@ class MemcacheWrapperTest < Test::Unit::TestCase
|
|
20
20
|
wrapper.incr( ["key1", "key2"], "expire_time", 5 )
|
21
21
|
end
|
22
22
|
|
23
|
+
def test_decr
|
24
|
+
wrapper = TimeWindowDropCollector::Wrappers::RailsCache.new( ["arg1"] )
|
25
|
+
wrapper.client.expects( :decrement ).with( "key1", 5, :expires_in => "expire_time" )
|
26
|
+
wrapper.client.expects( :decrement ).with( "key2", 5, :expires_in => "expire_time" )
|
27
|
+
|
28
|
+
wrapper.decr( ["key1", "key2"], "expire_time", 5 )
|
29
|
+
end
|
30
|
+
|
23
31
|
def test_values_for
|
24
32
|
wrapper = TimeWindowDropCollector::Wrappers::RailsCache.new( ["arg1"] )
|
25
33
|
wrapper.client.expects( :read_multi ).with( "keys" ).returns( "keys_values" )
|
@@ -31,4 +39,4 @@ class MemcacheWrapperTest < Test::Unit::TestCase
|
|
31
39
|
wrapper.client.expects( :reset )
|
32
40
|
wrapper.reset
|
33
41
|
end
|
34
|
-
end
|
42
|
+
end
|
data/test/redis_wrapper_test.rb
CHANGED
@@ -33,6 +33,19 @@ class RedisWrapperTest < Test::Unit::TestCase
|
|
33
33
|
wrapper.incr( ["key1", "key2"], "expire_time", 10 )
|
34
34
|
end
|
35
35
|
|
36
|
+
def test_decr
|
37
|
+
Redis.expects( :new ).returns( RedisMock.new )
|
38
|
+
wrapper = TimeWindowDropCollector::Wrappers::Redis.new( nil )
|
39
|
+
|
40
|
+
wrapper.client.expects( :decrby ).with( "key1", 10 )
|
41
|
+
wrapper.client.expects( :expire ).with( "key1", "expire_time" )
|
42
|
+
|
43
|
+
wrapper.client.expects( :decrby ).with( "key2", 10 )
|
44
|
+
wrapper.client.expects( :expire ).with( "key2", "expire_time" )
|
45
|
+
|
46
|
+
wrapper.decr( ["key1", "key2"], "expire_time", 10 )
|
47
|
+
end
|
48
|
+
|
36
49
|
def test_incr_agregates_commands_under_pipelined
|
37
50
|
Redis.expects( :new ).returns( RedisMock.new )
|
38
51
|
wrapper = TimeWindowDropCollector::Wrappers::Redis.new( nil )
|
@@ -59,4 +72,4 @@ class RedisWrapperTest < Test::Unit::TestCase
|
|
59
72
|
wrapper.reset
|
60
73
|
end
|
61
74
|
|
62
|
-
end
|
75
|
+
end
|
data/test/storage_test.rb
CHANGED
@@ -36,17 +36,35 @@ class StorageTest < Test::Unit::TestCase
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_incr
|
39
|
-
|
39
|
+
Time.expects(:now).returns('now')
|
40
|
+
@storage.expects( :timestamp_key_multi ).with( ["keys"], 'now' ).returns( "timestamp_keys" )
|
40
41
|
@wrapper.expects( :incr ).with( "timestamp_keys", 600, 1 )
|
41
42
|
|
42
|
-
@storage.incr( ["keys"] )
|
43
|
+
result = @storage.incr( ["keys"] )
|
44
|
+
assert_equal result, 'now'
|
43
45
|
end
|
44
46
|
|
45
47
|
def test_incr_with_val
|
46
|
-
|
48
|
+
Time.expects(:now).returns('now')
|
49
|
+
@storage.expects( :timestamp_key_multi ).with( ["keys"], 'now' ).returns( "timestamp_keys" )
|
47
50
|
@wrapper.expects( :incr ).with( "timestamp_keys", 600, 30.5 )
|
48
51
|
|
49
|
-
@storage.incr( ["keys"], 30.5 )
|
52
|
+
result = @storage.incr( ["keys"], 30.5 )
|
53
|
+
assert_equal result, 'now'
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_decr
|
57
|
+
@storage.expects( :timestamp_key_multi ).with( ["keys"], 'now' ).returns( "timestamp_keys" )
|
58
|
+
@wrapper.expects( :decr ).with( "timestamp_keys", 600, 1 )
|
59
|
+
|
60
|
+
@storage.decr( 'now', ["keys"] )
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_decr_with_val
|
64
|
+
@storage.expects( :timestamp_key_multi ).with( ["keys"], 'now' ).returns( "timestamp_keys" )
|
65
|
+
@wrapper.expects( :decr ).with( "timestamp_keys", 600, 30.5 )
|
66
|
+
|
67
|
+
@storage.decr( 'now', ["keys"], 30.5 )
|
50
68
|
end
|
51
69
|
|
52
70
|
def test_count
|
@@ -271,4 +289,4 @@ class StorageTest < Test::Unit::TestCase
|
|
271
289
|
assert_equal( nil, storage.count( ["key_1"] )["key_1"] )
|
272
290
|
end
|
273
291
|
end
|
274
|
-
end
|
292
|
+
end
|
@@ -51,6 +51,26 @@ class TimeWindowDropCollectorTest < Test::Unit::TestCase
|
|
51
51
|
twdc.drop( "key", 15 )
|
52
52
|
end
|
53
53
|
|
54
|
+
def test_pick
|
55
|
+
storage = mock()
|
56
|
+
storage.expects( :decr ).with( "time", ["key"], 1 )
|
57
|
+
|
58
|
+
twdc = TimeWindowDropCollector.new
|
59
|
+
twdc.stubs( :storage ).returns( storage )
|
60
|
+
|
61
|
+
twdc.pick( "time", "key" )
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_pick_with_custom_amount
|
65
|
+
storage = mock()
|
66
|
+
storage.expects( :decr ).with( "time", ["key"], 15 )
|
67
|
+
|
68
|
+
twdc = TimeWindowDropCollector.new
|
69
|
+
twdc.stubs( :storage ).returns( storage )
|
70
|
+
|
71
|
+
twdc.pick( "time", "key", 15 )
|
72
|
+
end
|
73
|
+
|
54
74
|
def test_count
|
55
75
|
storage = mock()
|
56
76
|
storage.expects( :count ).with( ["key"] ).returns( { "key" => 10 } )
|
@@ -77,10 +97,10 @@ class TimeWindowDropCollectorTest < Test::Unit::TestCase
|
|
77
97
|
assert_equal( 20, twdc.storage.slices )
|
78
98
|
end
|
79
99
|
|
80
|
-
def
|
100
|
+
def test_integration_drop_and_pick_and_count
|
81
101
|
twdc = TimeWindowDropCollector.new { client :mock }
|
82
102
|
|
83
|
-
twdc.drop( "key_1" )
|
103
|
+
ts = twdc.drop( "key_1" )
|
84
104
|
twdc.drop( "key_1" )
|
85
105
|
twdc.drop( "key_2" )
|
86
106
|
twdc.drop( "key_2" )
|
@@ -97,25 +117,50 @@ class TimeWindowDropCollectorTest < Test::Unit::TestCase
|
|
97
117
|
assert_equal( 2, twdc.count( ["key_1", "key_2"] )["key_1"] )
|
98
118
|
assert_equal( 3, twdc.count( ["key_1", "key_2"] )["key_2"] )
|
99
119
|
assert_equal( 0, twdc.count( ["key_6"] )["key_6"] )
|
120
|
+
|
121
|
+
twdc.pick(ts, "key_1" )
|
122
|
+
assert_equal( 1, twdc.count( "key_1" ) )
|
123
|
+
|
124
|
+
twdc.pick(ts, "key_2" )
|
125
|
+
assert_equal( 2, twdc.count( "key_2" ) )
|
126
|
+
|
127
|
+
twdc.pick(ts, ["key_2"] )
|
128
|
+
assert_equal( 1, twdc.count( "key_2" ) )
|
129
|
+
|
130
|
+
twdc.pick(ts, ["key_3", "key_4", "key_5"] )
|
131
|
+
assert_equal( 0, twdc.count( "key_3" ) )
|
132
|
+
assert_equal( 0, twdc.count( "key_4" ) )
|
133
|
+
assert_equal( 0, twdc.count( "key_5" ) )
|
100
134
|
end
|
101
135
|
|
102
|
-
def
|
136
|
+
def test_integration_drop_and_pick_array_keys
|
103
137
|
twdc = TimeWindowDropCollector.new { client :mock }
|
104
138
|
|
105
|
-
twdc.drop( ["key_1", "key_2"] )
|
139
|
+
ts = twdc.drop( ["key_1", "key_2"] )
|
106
140
|
|
107
141
|
assert_equal( 1, twdc.count( "key_1" ) )
|
108
142
|
assert_equal( 1, twdc.count( "key_2" ) )
|
143
|
+
|
144
|
+
twdc.pick(ts, ["key_1", "key_2"] )
|
145
|
+
|
146
|
+
assert_equal( 0, twdc.count( "key_1" ) )
|
147
|
+
assert_equal( 0, twdc.count( "key_2" ) )
|
109
148
|
end
|
110
149
|
|
111
|
-
def
|
150
|
+
def test_integration_drop_and_pick_and_count_with_numerical_keys
|
112
151
|
twdc = TimeWindowDropCollector.new { client :mock }
|
113
152
|
|
114
|
-
twdc.drop( 1000 )
|
153
|
+
ts = twdc.drop( 1000 )
|
115
154
|
twdc.drop( [1001])
|
116
155
|
|
117
156
|
assert_equal( 1, twdc.count( 1000 ) )
|
118
157
|
assert_equal( 1, twdc.count( 1001 ) )
|
158
|
+
|
159
|
+
twdc.pick( ts, 1000 )
|
160
|
+
twdc.pick( ts, [1001])
|
161
|
+
|
162
|
+
assert_equal( 0, twdc.count( 1000 ) )
|
163
|
+
assert_equal( 0, twdc.count( 1001 ) )
|
119
164
|
end
|
120
165
|
|
121
166
|
def test_reset
|
@@ -5,8 +5,8 @@ require "time_window_drop_collector/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "time_window_drop_collector"
|
7
7
|
s.version = TimeWindowDropCollector::VERSION
|
8
|
-
s.authors = ["Fernando Guillen", "Carlos Moutinho"]
|
9
|
-
s.email = ["fguillen.mail@gmail.com", "carlosmoutinho@gmail.com"]
|
8
|
+
s.authors = ["Fernando Guillen", "Carlos Moutinho", "Krzysztof Jablonski"]
|
9
|
+
s.email = ["fguillen.mail@gmail.com", "carlosmoutinho@gmail.com", "jablko@gmail.com"]
|
10
10
|
s.homepage = "https://github.com/fguillen/TimeWindowDropCollector"
|
11
11
|
s.summary = "Counter storage system for a concrete time window"
|
12
12
|
s.description = "Counter storage system for a concrete time window"
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
|
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"
|
25
|
-
s.add_development_dependency "memcache_mock", "0.0.
|
25
|
+
s.add_development_dependency "memcache_mock", "0.0.14"
|
26
26
|
|
27
27
|
s.add_dependency "dalli"
|
28
28
|
end
|
metadata
CHANGED
@@ -1,117 +1,106 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_window_drop_collector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Fernando Guillen
|
9
8
|
- Carlos Moutinho
|
9
|
+
- Krzysztof Jablonski
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
17
|
-
prerelease: false
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
18
|
requirements:
|
20
|
-
- -
|
19
|
+
- - '>='
|
21
20
|
- !ruby/object:Gem::Version
|
22
21
|
version: '0'
|
23
|
-
none: false
|
24
22
|
type: :development
|
23
|
+
prerelease: false
|
25
24
|
version_requirements: !ruby/object:Gem::Requirement
|
26
25
|
requirements:
|
27
|
-
- -
|
26
|
+
- - '>='
|
28
27
|
- !ruby/object:Gem::Version
|
29
28
|
version: '0'
|
30
|
-
none: false
|
31
29
|
- !ruby/object:Gem::Dependency
|
32
30
|
name: rake
|
33
|
-
prerelease: false
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
32
|
requirements:
|
36
33
|
- - '='
|
37
34
|
- !ruby/object:Gem::Version
|
38
35
|
version: 0.9.2.2
|
39
|
-
none: false
|
40
36
|
type: :development
|
37
|
+
prerelease: false
|
41
38
|
version_requirements: !ruby/object:Gem::Requirement
|
42
39
|
requirements:
|
43
40
|
- - '='
|
44
41
|
- !ruby/object:Gem::Version
|
45
42
|
version: 0.9.2.2
|
46
|
-
none: false
|
47
43
|
- !ruby/object:Gem::Dependency
|
48
44
|
name: mocha
|
49
|
-
prerelease: false
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
46
|
requirements:
|
52
47
|
- - '='
|
53
48
|
- !ruby/object:Gem::Version
|
54
49
|
version: 0.10.0
|
55
|
-
none: false
|
56
50
|
type: :development
|
51
|
+
prerelease: false
|
57
52
|
version_requirements: !ruby/object:Gem::Requirement
|
58
53
|
requirements:
|
59
54
|
- - '='
|
60
55
|
- !ruby/object:Gem::Version
|
61
56
|
version: 0.10.0
|
62
|
-
none: false
|
63
57
|
- !ruby/object:Gem::Dependency
|
64
58
|
name: delorean
|
65
|
-
prerelease: false
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
60
|
requirements:
|
68
61
|
- - '='
|
69
62
|
- !ruby/object:Gem::Version
|
70
63
|
version: 1.2.0
|
71
|
-
none: false
|
72
64
|
type: :development
|
65
|
+
prerelease: false
|
73
66
|
version_requirements: !ruby/object:Gem::Requirement
|
74
67
|
requirements:
|
75
68
|
- - '='
|
76
69
|
- !ruby/object:Gem::Version
|
77
70
|
version: 1.2.0
|
78
|
-
none: false
|
79
71
|
- !ruby/object:Gem::Dependency
|
80
72
|
name: memcache_mock
|
81
|
-
prerelease: false
|
82
73
|
requirement: !ruby/object:Gem::Requirement
|
83
74
|
requirements:
|
84
75
|
- - '='
|
85
76
|
- !ruby/object:Gem::Version
|
86
|
-
version: 0.0.
|
87
|
-
none: false
|
77
|
+
version: 0.0.14
|
88
78
|
type: :development
|
79
|
+
prerelease: false
|
89
80
|
version_requirements: !ruby/object:Gem::Requirement
|
90
81
|
requirements:
|
91
82
|
- - '='
|
92
83
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0.0.
|
94
|
-
none: false
|
84
|
+
version: 0.0.14
|
95
85
|
- !ruby/object:Gem::Dependency
|
96
86
|
name: dalli
|
97
|
-
prerelease: false
|
98
87
|
requirement: !ruby/object:Gem::Requirement
|
99
88
|
requirements:
|
100
|
-
- -
|
89
|
+
- - '>='
|
101
90
|
- !ruby/object:Gem::Version
|
102
91
|
version: '0'
|
103
|
-
none: false
|
104
92
|
type: :runtime
|
93
|
+
prerelease: false
|
105
94
|
version_requirements: !ruby/object:Gem::Requirement
|
106
95
|
requirements:
|
107
|
-
- -
|
96
|
+
- - '>='
|
108
97
|
- !ruby/object:Gem::Version
|
109
98
|
version: '0'
|
110
|
-
none: false
|
111
99
|
description: Counter storage system for a concrete time window
|
112
100
|
email:
|
113
101
|
- fguillen.mail@gmail.com
|
114
102
|
- carlosmoutinho@gmail.com
|
103
|
+
- jablko@gmail.com
|
115
104
|
executables: []
|
116
105
|
extensions: []
|
117
106
|
extra_rdoc_files: []
|
@@ -147,27 +136,26 @@ files:
|
|
147
136
|
- time_window_drop_collector.gemspec
|
148
137
|
homepage: https://github.com/fguillen/TimeWindowDropCollector
|
149
138
|
licenses: []
|
139
|
+
metadata: {}
|
150
140
|
post_install_message:
|
151
141
|
rdoc_options: []
|
152
142
|
require_paths:
|
153
143
|
- lib
|
154
144
|
required_ruby_version: !ruby/object:Gem::Requirement
|
155
145
|
requirements:
|
156
|
-
- -
|
146
|
+
- - '>='
|
157
147
|
- !ruby/object:Gem::Version
|
158
148
|
version: '0'
|
159
|
-
none: false
|
160
149
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
150
|
requirements:
|
162
|
-
- -
|
151
|
+
- - '>='
|
163
152
|
- !ruby/object:Gem::Version
|
164
153
|
version: '0'
|
165
|
-
none: false
|
166
154
|
requirements: []
|
167
155
|
rubyforge_project: time_window_drop_collector
|
168
|
-
rubygems_version: 1.
|
156
|
+
rubygems_version: 2.1.11
|
169
157
|
signing_key:
|
170
|
-
specification_version:
|
158
|
+
specification_version: 4
|
171
159
|
summary: Counter storage system for a concrete time window
|
172
160
|
test_files:
|
173
161
|
- test/config_test.rb
|
@@ -180,4 +168,3 @@ test_files:
|
|
180
168
|
- test/test_helper.rb
|
181
169
|
- test/time_window_drop_collector_test.rb
|
182
170
|
- test/wrapper_test.rb
|
183
|
-
has_rdoc:
|