waiting_rspec_matchers 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ed0430976fc54c18c7fc029c01b368e607b74454
4
+ data.tar.gz: 4f66f94b2c64ae03a9d5c4a5bca605510dcfda37
5
+ SHA512:
6
+ metadata.gz: 2c973b928de0cf53c2a9ef231cf5b57312402c041dd18923d577639bcd0688f12400ab21092d4e9b7ece0eda0352fd35d920f8d498d0fbeceb346e678b2a228e
7
+ data.tar.gz: 142dc325c4e1e60bc626b4b2b2797e98ebbd16f361fc1d2a500305e7971bd661c909f7fccd04260b49223f7a4727f1a69e2912f43181bce1e9f9b3c16223020d
@@ -0,0 +1,119 @@
1
+ require 'waiting_rspec_matchers/version'
2
+
3
+ require 'rspec/expectations'
4
+
5
+ module WaitingRspecMatchers
6
+
7
+ class << self
8
+ attr_accessor :default_wait_time, :default_delay
9
+
10
+ def configure
11
+ yield self
12
+ end
13
+ end
14
+
15
+ WaitingRspecMatchers.configure do |config|
16
+ config.default_wait_time = 2
17
+ config.default_delay = 0.05
18
+ end
19
+
20
+ private
21
+
22
+ BECOME_REGEX = /^become_(.+)/
23
+
24
+ def method_missing(method_name, *args, &expected_block)
25
+ if m = method_name.to_s.match(BECOME_REGEX)
26
+ rspec_matcher_name = m[1]
27
+ matcher_class_name = "Become#{rspec_matcher_name.capitalize}Matcher"
28
+ if ::WaitingRspecMatchers.const_defined?(matcher_class_name)
29
+ k = ::WaitingRspecMatchers.const_get(matcher_class_name)
30
+ else
31
+ k = define_matcher_class
32
+ ::WaitingRspecMatchers.const_set(matcher_class_name, k)
33
+ end
34
+
35
+ k.new(rspec_matcher_name, *args, &expected_block)
36
+ else
37
+ super
38
+ end
39
+ end
40
+
41
+ def respond_to_missing?(method_name, *)
42
+ method_name.to_s =~ BECOME_REGEX || super
43
+ end
44
+
45
+ def define_matcher_class
46
+ Class.new do
47
+ include ::RSpec::Matchers
48
+ include ::RSpec::Matchers::Composable
49
+
50
+ def initialize(rspec_matcher_name, *args, &expected_block)
51
+ @rspec_matcher_name = rspec_matcher_name
52
+ @args = args
53
+ @expected_block = expected_block
54
+
55
+ @chains = []
56
+ end
57
+
58
+ def during(max_wait_time_in_seconds)
59
+ @max_wait_time = max_wait_time_in_seconds
60
+ self
61
+ end
62
+
63
+ def max_wait_time
64
+ @max_wait_time || WaitingRspecMatchers.default_wait_time
65
+ end
66
+
67
+ def delay(seconds)
68
+ @delay = seconds
69
+ self
70
+ end
71
+
72
+ def method_missing(method, *args)
73
+ @chains << [method, args]
74
+ self
75
+ end
76
+
77
+ def match_helper(to_or_not_to, &block)
78
+ start_time = Time.now
79
+ begin
80
+ matcher = __send__(@rspec_matcher_name.to_sym, *@args, &@expected_block)
81
+ @chains.each do |chain|
82
+ matcher = matcher.__send__(chain[0], *chain[1])
83
+ end
84
+ if matcher.supports_block_expectations?
85
+ expect { block.call }.__send__(to_or_not_to, matcher)
86
+ else
87
+ expect(block.call).__send__(to_or_not_to, matcher)
88
+ end
89
+ rescue RSpec::Expectations::ExpectationNotMetError => e
90
+ @failure_message = e.message
91
+ return false if (Time.now - start_time) >= max_wait_time
92
+ sleep @delay || WaitingRspecMatchers.default_delay
93
+ retry
94
+ end
95
+ true
96
+ end
97
+
98
+ def matches?(block)
99
+ match_helper(:to, &block)
100
+ end
101
+
102
+ def does_not_match?(block)
103
+ match_helper(:not_to, &block)
104
+ end
105
+
106
+ def failure_message
107
+ @failure_message
108
+ end
109
+
110
+ def failure_message_when_negated
111
+ @failure_message
112
+ end
113
+
114
+ def supports_block_expectations?
115
+ true
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,3 @@
1
+ module WaitingRspecMatchers
2
+ VERSION = "0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: waiting_rspec_matchers
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Andrey Botalov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec-expectations
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/waiting_rspec_matchers.rb
76
+ - lib/waiting_rspec_matchers/version.rb
77
+ homepage: https://github.com/abotalov/waiting_rspec_matchers
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.9.3
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.2.2
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: New become_* RSpec matchers that do the same as * matchers but also wait
101
+ test_files: []