timers 4.0.0 → 4.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa56588795590f6b0772c42830b2969d4c18c31b
4
- data.tar.gz: 203a266076597db814652c1b1e8d25fdca6808b2
3
+ metadata.gz: ff04e8dedf4d39bd0ff36650200e6c3537669cd8
4
+ data.tar.gz: fd2f6c05f04a626f73401ea9c06e8be89956024e
5
5
  SHA512:
6
- metadata.gz: cf717b2718394941dc03bd9bd4184a790116fff7e936b07227fe64cec0d7801ff84903ba23efd5332751919d3a9acbbff95c3a1b53f8c150cd67a94c78531763
7
- data.tar.gz: 26d41eddf5f924ac26860a09daba9af79203f32f0f7cefc93cafc5a46ffd95ad959f0281c6dbe619ca3ad8087c63e16c87ef1e860d297f6c30e98da3562c5be0
6
+ metadata.gz: 5b829c8ffc7da2676e9b32e0f16fc54135dce451825db5c669f40566d6bd8a4334dd8d6b28d06dcd191cc92cd55a27dcd3fe9476b16fcb56a80c23b335fcb2f4
7
+ data.tar.gz: 08314ad60709460ff1d4f55cf4c61ccb0333bf7d67186702d5e3268cfe9ac2ba9e511c936b63be0ed4f9d6532a5f3ca0235bd65ceba319b812ffa4564115f014
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ 4.0.1 (2014-09-10)
2
+ ------------------
3
+ * Memory leak fixes
4
+ * mathn fix for those crazy enough to use it
5
+
1
6
  4.0.0 (2014-07-27)
2
7
  ------------------
3
8
  * Replace Timers::Timeout with Timers::Wait
data/lib/timers/events.rb CHANGED
@@ -100,7 +100,7 @@ module Timers
100
100
  # a is sorted in descending order.
101
101
  def bisect_left(a, e, l = 0, u = a.length)
102
102
  while l < u
103
- m = l + (u-l)/2
103
+ m = l + (u-l).div(2)
104
104
 
105
105
  if a[m] > e
106
106
  l = m+1
data/lib/timers/timer.rb CHANGED
@@ -1,6 +1,10 @@
1
1
 
2
2
  module Timers
3
- # An individual timer set to fire a given proc at a given time
3
+ # An individual timer set to fire a given proc at a given time. A timer is
4
+ # always connected to a Timer::Group but it would ONLY be in @group.timers
5
+ # if it also has a @handle specified. Otherwise it is either PAUSED or has
6
+ # been FIRED and is not recurring. You can manually enter this state by
7
+ # calling #cancel and resume normal operation by calling #reset.
4
8
  class Timer
5
9
  include Comparable
6
10
  attr_reader :interval, :offset, :recurring
@@ -8,8 +12,6 @@ module Timers
8
12
  def initialize(group, interval, recurring = false, offset = nil, &block)
9
13
  @group = group
10
14
 
11
- @group.timers << self
12
-
13
15
  @interval = interval
14
16
  @recurring = recurring
15
17
  @block = block
@@ -38,9 +40,9 @@ module Timers
38
40
  def resume
39
41
  return unless paused?
40
42
 
41
- @group.timers.add self
42
43
  @group.paused_timers.delete self
43
44
 
45
+ # This will add us back to the group:
44
46
  reset
45
47
  end
46
48
 
@@ -54,27 +56,34 @@ module Timers
54
56
 
55
57
  @handle = @group.events.schedule(@offset, self)
56
58
  end
57
-
58
- # Cancel this timer
59
+
60
+ # Cancel this timer. Do not call while paused.
59
61
  def cancel
62
+ return unless @handle
63
+
60
64
  @handle.cancel! if @handle
61
65
  @handle = nil
62
66
 
63
67
  # This timer is no longer valid:
64
- @group.timers.delete self
65
- @group = nil
68
+ @group.timers.delete self if @group
66
69
  end
67
70
 
68
- # Reset this timer
71
+ # Reset this timer. Do not call while paused.
69
72
  def reset(offset = @group.current_offset)
70
- @handle.cancel! if @handle
73
+ # This logic allows us to minimise the interaction with @group.timers.
74
+ # A timer with a handle is always registered with the group.
75
+ if @handle
76
+ @handle.cancel!
77
+ else
78
+ @group.timers << self
79
+ end
71
80
 
72
81
  @offset = Float(offset) + @interval
73
82
 
74
83
  @handle = @group.events.schedule(@offset, self)
75
84
  end
76
85
 
77
- # Fire the block
86
+ # Fire the block.
78
87
  def fire(offset = @group.current_offset)
79
88
  if recurring == :strict
80
89
  # ... make the next interval strictly the last offset + the interval:
@@ -86,6 +95,8 @@ module Timers
86
95
  end
87
96
 
88
97
  @block.call(offset)
98
+
99
+ cancel unless recurring
89
100
  end
90
101
 
91
102
  alias_method :call, :fire
@@ -1,3 +1,3 @@
1
1
  module Timers
2
- VERSION = "4.0.0"
2
+ VERSION = "4.0.1"
3
3
  end
@@ -0,0 +1,46 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Timers::Group do
5
+ it "should be able to cancel twice" do
6
+ fired = false
7
+
8
+ timer = subject.after(0.1) { fired = true }
9
+
10
+ 2.times do
11
+ timer.cancel
12
+ subject.wait
13
+ end
14
+
15
+ expect(fired).to be false
16
+ end
17
+
18
+ it "should be possble to reset after cancel" do
19
+ fired = false
20
+
21
+ timer = subject.after(0.1) { fired = true }
22
+ timer.cancel
23
+
24
+ subject.wait
25
+
26
+ timer.reset
27
+
28
+ subject.wait
29
+
30
+ expect(fired).to be true
31
+ end
32
+
33
+ it "should cancel and remove one shot timers after they fire" do
34
+ x = 0
35
+
36
+ Timers::Wait.for(2) do |remaining|
37
+ timer = subject.every(0.2) { x += 1 }
38
+ subject.after(0.1) { timer.cancel }
39
+
40
+ subject.wait
41
+ end
42
+
43
+ expect(subject.timers).to be_empty
44
+ expect(x).to be == 0
45
+ end
46
+ end
data/spec/events_spec.rb CHANGED
@@ -9,7 +9,7 @@ RSpec.describe Timers::Events do
9
9
  fired = true
10
10
  end
11
11
 
12
- handle = subject.schedule(0.1, callback)
12
+ subject.schedule(0.1, callback)
13
13
 
14
14
  expect(subject.size).to be == 1
15
15
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timers
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-27 00:00:00.000000000 Z
11
+ date: 2014-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hitimes
@@ -75,6 +75,7 @@ files:
75
75
  - lib/timers/timer.rb
76
76
  - lib/timers/version.rb
77
77
  - lib/timers/wait.rb
78
+ - spec/cancel_spec.rb
78
79
  - spec/events_spec.rb
79
80
  - spec/every_spec.rb
80
81
  - spec/group_spec.rb
@@ -109,6 +110,7 @@ specification_version: 4
109
110
  summary: Schedule procs to run after a certain time, or at periodic intervals, using
110
111
  any API that accepts a timeout
111
112
  test_files:
113
+ - spec/cancel_spec.rb
112
114
  - spec/events_spec.rb
113
115
  - spec/every_spec.rb
114
116
  - spec/group_spec.rb