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.
@@ -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 :rubygems
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
- wrapper.incr( timestamp_key_multi( keys ), window, amount )
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
- now = timestamp
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, now = timestamp )
22
+ def window_keys( key, time = timestamp )
25
23
  ( 0..( slices - 1 ) ).map{ |i|
26
- timestamp_key( key, now - ( ( i*slice_milliseconds ) / 1000 ) )
24
+ timestamp_key( key, time - ( ( i*slice_milliseconds ) / 1000 ) )
27
25
  }
28
26
  end
29
27
 
30
28
  def window_keys_multi( keys )
31
- now = timestamp
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
@@ -1,3 +1,3 @@
1
1
  class TimeWindowDropCollector
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  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
- module Wrappers
3
- class Mock
4
- attr_reader :client
2
+ module Wrappers
3
+ class Mock
4
+ attr_reader :client
5
5
 
6
- def initialize( opts )
7
- @client = MemcacheMock.new
8
- end
6
+ def initialize( opts )
7
+ @client = MemcacheMock.new
8
+ end
9
9
 
10
- def incr( keys, expire_time, amount )
11
- keys.each do |key|
12
- client.incr( key, amount, nil, 1 )
13
- end
14
- end
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
- def get( keys )
17
- client.get_multi( keys )
18
- end
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
- end
24
- end
25
- end
29
+ end
30
+ end
31
+ end
@@ -1,26 +1,32 @@
1
1
  class TimeWindowDropCollector
2
- module Wrappers
3
- class RailsCache
4
- attr_reader :client
2
+ module Wrappers
3
+ class RailsCache
4
+ attr_reader :client
5
5
 
6
- def initialize( opts )
7
- @client = Rails.cache
8
- end
6
+ def initialize( opts )
7
+ @client = Rails.cache
8
+ end
9
9
 
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
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
- def get( keys )
17
- client.read_multi( keys )
18
- end
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
- end
24
- end
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
- attr_reader :client
4
+ attr_reader :client
5
5
 
6
6
  def initialize( opts )
7
7
  @client = ::Redis.new( opts )
8
8
  end
9
9
 
10
- def incr( keys, expire_time, amount )
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
- end
17
+ end
18
18
 
19
- def get( keys )
20
- values = client.mget( *keys )
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
- end
38
+ end
30
39
 
31
40
  def reset
32
41
  client.quit
33
42
  end
34
- end
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
- end
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
@@ -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
@@ -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
@@ -36,17 +36,35 @@ class StorageTest < Test::Unit::TestCase
36
36
  end
37
37
 
38
38
  def test_incr
39
- @storage.expects( :timestamp_key_multi ).with( ["keys"] ).returns( "timestamp_keys" )
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
- @storage.expects( :timestamp_key_multi ).with( ["keys"] ).returns( "timestamp_keys" )
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 test_integration_drop_and_count
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 test_integration_drop_array_keys
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 test_integration_drop_and_count_with_numerical_keys
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.1"
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.2
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: 2013-10-24 00:00:00.000000000 Z
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.1
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.1
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.8.24
156
+ rubygems_version: 2.1.11
169
157
  signing_key:
170
- specification_version: 3
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: