rspec-eventually 0.1.0 → 0.2.0

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: c0572070062aed5c336c449433d973c8db9e1726
4
- data.tar.gz: 4fb01d14e5b1001849134c0a0e5234a407907c39
3
+ metadata.gz: ac1a8c6c27ec5d59a5b7d129296693c2d21dbb89
4
+ data.tar.gz: dc5f9cf13500fe274b2d828047e73a930d825c3b
5
5
  SHA512:
6
- metadata.gz: 3fda5e0da10d7062ba4826de7a4233616bbf20c87666da2105121974f103e51ef1352030791d9f9da2a79c4d8ced7a4c4312448b006cdf86119bb7ed9aa9ec58
7
- data.tar.gz: e7ace1dd7399e3bacfbaf2a497e35dd789428d2701810ab1c09b5e9de6b8d1df71befff629e1f0f5be1e38fd6d38f5eb660e88019224870238f72567dc6f147d
6
+ metadata.gz: bc83c071364e151e0d1c66b13afa6ad3c68bae7bc95c0f256d34dfe18cfaa2996299dfeb899edc1b17673f33492f0faeccbaaf659e5583b4e3aa40943cef9663
7
+ data.tar.gz: d3c7cc383897c3f8c5cb8b3d3eefe6061e2e29e2bd4920b918461bc1b3c307834ba21bd5eb4912dfdd1b976ca8407f326b31d4b8cb69fb0ef76ce33f9d0d41fb
data/README.md CHANGED
@@ -20,6 +20,9 @@ I want to be able to do something like this:
20
20
  # Change the timeout
21
21
  expect { client.get 'ZYX' }.to eventually(eq 1).within 5
22
22
 
23
+ # Change the pause between retries
24
+ expect { client.get 'ZYX' }.to eventually(eq 1).pause_for 1.5
25
+
23
26
  end
24
27
  ```
25
28
 
@@ -4,9 +4,10 @@ require 'rspec/core'
4
4
  module Rspec
5
5
  module Eventually
6
6
  class << self
7
- attr_accessor :timeout
7
+ attr_accessor :timeout, :pause
8
8
  end
9
9
  self.timeout = 5
10
+ self.pause = 0.1
10
11
 
11
12
  class FailedMatcherError < StandardError; end
12
13
 
@@ -20,12 +21,14 @@ module Rspec
20
21
  @tries = 0
21
22
  @negative = false
22
23
  @custom_msg = custom_msg
24
+ @pause = pause
23
25
  end
24
26
 
25
27
  def matches?(expected_block)
26
28
  Timeout.timeout(timeout) { eventually_matches? expected_block }
27
29
  rescue Timeout::Error
28
- @tries == 0 && raise('Timeout before first evaluation, use a longer `eventually` timeout')
30
+ @tries == 0 && raise('Timeout before first evaluation, use a longer `eventually` timeout \
31
+ or shorter `eventually` pause')
29
32
  end
30
33
 
31
34
  def does_not_match?
@@ -53,13 +56,17 @@ module Rspec
53
56
  tap { @timeout = timeout }
54
57
  end
55
58
 
59
+ def pause_for(pause)
60
+ tap { @pause = pause }
61
+ end
62
+
56
63
  private
57
64
 
58
65
  def eventually_matches?(expected_block)
59
66
  target_matches?(expected_block) || fail(FailedMatcherError)
60
67
  rescue => e
61
68
  if suppress_errors || e.is_a?(FailedMatcherError)
62
- sleep 0.1
69
+ sleep pause
63
70
  @tries += 1
64
71
  retry
65
72
  else
@@ -75,6 +82,10 @@ module Rspec
75
82
  def timeout
76
83
  @timeout || Rspec::Eventually.timeout
77
84
  end
85
+
86
+ def pause
87
+ @pause || Rspec::Eventually.pause
88
+ end
78
89
  end
79
90
 
80
91
  def eventually(target, custom_msg = nil)
@@ -1,5 +1,5 @@
1
1
  module Rspec
2
2
  module Eventually
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -51,6 +51,45 @@ module Rspec
51
51
  expect(took).to be_within(0.1).of 0.5
52
52
  end
53
53
 
54
+ it 'has a configurable default pause' do
55
+ begin
56
+ ::Rspec::Eventually.pause = 0.5
57
+ expect(::Rspec::Eventually.pause).to eq 0.5
58
+
59
+ matcher = Eventually.new(eq 1)
60
+ matcher.matches? -> { 0 }
61
+
62
+ expect(matcher.instance_variable_get('@tries')).to eq 9
63
+
64
+ ensure
65
+ ::Rspec::Eventually.pause = 0.1
66
+ end
67
+ end
68
+
69
+ it 'can have a specific pause' do
70
+ matcher = Eventually.new(eq 1)
71
+ matcher.pause_for(1.5).matches? -> { 0 }
72
+
73
+ expect(matcher.instance_variable_get('@tries')).to eq 3
74
+ end
75
+
76
+ it 'can have a specific pause and timeout' do
77
+ matcher = Eventually.new(eq 1)
78
+ matcher.pause_for(1).within(3).matches? -> { 0 }
79
+
80
+ expect(matcher.instance_variable_get('@tries')).to eq 2
81
+ end
82
+
83
+ it 'it will not pause when evaluation is true' do
84
+ before = Time.now
85
+ matcher = Eventually.new(eq 1)
86
+ matcher.pause_for(1).matches? -> { 1 }
87
+ took = Time.now - before
88
+
89
+ expect(matcher.instance_variable_get('@tries')).to eq 0
90
+ expect(took).to be < 1
91
+ end
92
+
54
93
  it 'raises errors by default' do
55
94
  block = lambda do
56
95
  Eventually.new(eq 1).matches? -> { fail 'I am throwing an error' }
@@ -98,6 +137,14 @@ module Rspec
98
137
  expect { block.call }.to raise_error(/Timeout before first evaluation/)
99
138
  end
100
139
 
140
+ it 'raises an error when timeout occurs before the first evaluation due to long pause' do
141
+ block = lambda do
142
+ Eventually.new(eq 1).pause_for(1).within(0.5).matches? -> { sleep 5 }
143
+ end
144
+
145
+ expect { block.call }.to raise_error(/Timeout before first evaluation/)
146
+ end
147
+
101
148
  it 'supports custom error messages' do
102
149
  (matcher = Eventually.new(eq(1), '0 is not within 0.5 of 1').within(0.5)).matches? -> { 0 }
103
150
  message = matcher.failure_message
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-eventually
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hawk Newton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-10 00:00:00.000000000 Z
11
+ date: 2016-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
107
  version: '0'
108
108
  requirements: []
109
109
  rubyforge_project:
110
- rubygems_version: 2.2.3
110
+ rubygems_version: 2.4.5.1
111
111
  signing_key:
112
112
  specification_version: 4
113
113
  summary: Make your matchers match eventually