bean_counter 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/bean_counter/core.rb +67 -41
- data/lib/bean_counter/enqueued_expectation.rb +61 -20
- data/lib/bean_counter/spec_matchers.rb +21 -8
- data/lib/bean_counter/strategies/stalk_climber_strategy.rb +67 -46
- data/lib/bean_counter/strategy.rb +101 -77
- data/lib/bean_counter/test_assertions.rb +148 -98
- data/lib/bean_counter/tube_expectation.rb +50 -18
- data/lib/bean_counter/version.rb +1 -1
- data/test/unit/core_test.rb +2 -3
- metadata +2 -2
data/README.md
CHANGED
@@ -312,7 +312,7 @@ verify that the exports tube is paused:
|
|
312
312
|
For more detailed explanations and more examples make sure to check out the
|
313
313
|
docs, expectations, and respective tests:
|
314
314
|
|
315
|
-
- [docs](http://rubydoc.info/gems/bean_counter/0.0.
|
315
|
+
- [docs](http://rubydoc.info/gems/bean_counter/0.0.4/frames)
|
316
316
|
- [enqueued_expectation](https://github.com/gemeraldbeanstalk/bean_counter/tree/master/lib/bean_counter/enqueued_expectation.rb)
|
317
317
|
- [tube_expectation](https://github.com/gemeraldbeanstalk/bean_counter/tree/master/lib/bean_counter/tube_expectation.rb)
|
318
318
|
- [test_assertions](https://github.com/gemeraldbeanstalk/bean_counter/tree/master/lib/bean_counter/test_assertions.rb)
|
data/lib/bean_counter/core.rb
CHANGED
@@ -3,38 +3,52 @@ module BeanCounter
|
|
3
3
|
# Use StalkClimberStrategy by default because it works with standard Beanstalkd
|
4
4
|
DEFAULT_STRATEGY = :'BeanCounter::Strategy::StalkClimberStrategy'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
# Sets the Beanstalkd server URLs to be used by BeanCounter.
|
7
|
+
#
|
8
|
+
# @param value [String, Array<String>] The new value to to assign to beanstalkd_urls
|
9
|
+
# @return [Object] Returns the value given
|
10
|
+
def self.beanstalkd_url=(value)
|
11
|
+
@beanstalkd_url = value
|
9
12
|
end
|
10
13
|
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# Returns an array of parsed beanstalkd urls.
|
15
|
-
# Server urls provided via the environment variable +BEANSTALKD_URL+ are given
|
14
|
+
# Returns an Array of parsed Beanstalkd URLs.
|
15
|
+
# Server URLs provided via the environment variable `BEANSTALKD_URL` are given
|
16
16
|
# precedence. When setting beanstalkd_url from the environment, urls are
|
17
|
-
# expected in a comma separated list. If ENV['BEANSTALKD_URL'] is not set
|
18
|
-
# BeanCounter
|
19
|
-
# BeanCounter
|
20
|
-
# checked and parsed. If no
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# * beanstalk://127.0.0.1:11300 (host and port prefixed by beanstalk scheme)
|
17
|
+
# expected in a comma separated list. If `ENV['BEANSTALKD_URL']` is not set,
|
18
|
+
# the BeanCounter.beanstalkd_url instance variable is checked and parsed next.
|
19
|
+
# Finally, if the BeanCounter.beanstalkd_url instance variable has not been
|
20
|
+
# set, the configuration for Beaneater is checked and parsed. If no
|
21
|
+
# beanstalkd_url can be determined a RuntimeError is raised.
|
22
|
+
# Beanstalkd URLs can be provided in any of three supported formats shown in
|
23
|
+
# in the examples below.
|
25
24
|
#
|
26
25
|
# In short, a host is the only required component. If no port is provided, the default
|
27
|
-
# beanstalkd port of 11300 is assumed. If a scheme other than beanstalk
|
28
|
-
#
|
26
|
+
# beanstalkd port of 11300 is assumed. If a URI scheme other than beanstalk
|
27
|
+
# is provided the strategy in use will likely raise an error.
|
28
|
+
#
|
29
|
+
# @return [Array<String>] An Array of Beanstalkd URLs.
|
30
|
+
# @example Valid beanstalkd_url formats
|
31
|
+
# # host only:
|
32
|
+
# 'localhost'
|
33
|
+
#
|
34
|
+
# # host and port:
|
35
|
+
# '192.168.1.100:11300'
|
36
|
+
#
|
37
|
+
# # host and port prefixed by beanstalk URI scheme:
|
38
|
+
# 'beanstalk://127.0.0.1:11300'
|
39
|
+
#
|
40
|
+
# @example BeanCounter.beanstalkd_url provided via ENV['BEANSTALKD_URL']
|
41
|
+
# # $ BEANSTALKD_URL='127.0.0.1,beanstalk://localhost:11300,localhost:11301' rake test
|
29
42
|
#
|
30
|
-
# $ BEANSTALKD_URL='127.0.0.1,beanstalk://localhost:11300,localhost:11301' rake test
|
31
43
|
# BeanCounter.beanstalkd_url
|
32
44
|
# #=> ['127.0.0.1', 'beanstalk://localhost:11300', 'localhost:11301']
|
33
45
|
#
|
46
|
+
# @example BeanCounter.beanstalkd_url set explicitly
|
34
47
|
# BeanCounter.beanstalkd_url = 'beanstalk://localhost'
|
35
48
|
# BeanCounter.beanstalkd_url
|
36
49
|
# #=> 'beanstalk://localhost'
|
37
50
|
#
|
51
|
+
# @example BeanCounter.beanstalkd_url provided by Beaneater
|
38
52
|
# Beaneater.configure do |config|
|
39
53
|
# config.beanstalkd_url = ['localhost', 'localhost:11301']
|
40
54
|
# end
|
@@ -46,33 +60,35 @@ module BeanCounter
|
|
46
60
|
@hosts_from_env = @hosts_from_env.split(',').map!(&:strip) unless @hosts_from_env.nil?
|
47
61
|
beanstalkd_url = @hosts_from_env || @beanstalkd_url || Beaneater.configuration.beanstalkd_url
|
48
62
|
raise 'Could not determine beanstalkd url' if beanstalkd_url.to_s == ''
|
49
|
-
return beanstalkd_url
|
63
|
+
return beanstalkd_url.is_a?(Array) ? beanstalkd_url : [beanstalkd_url]
|
50
64
|
end
|
51
65
|
|
52
66
|
|
53
|
-
#
|
54
|
-
#
|
67
|
+
# Returns a previously materialized strategy or materializes a new default
|
68
|
+
# strategy for use.
|
69
|
+
#
|
70
|
+
# See {BeanCounter::Strategy.materialize_strategy} for more information on the
|
71
|
+
# materialization process.
|
55
72
|
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
# information on the materialization process.
|
73
|
+
# @see BeanCounter::Strategy.materialize_strategy
|
74
|
+
# @return [BeanCounter::Strategy] An existing or newly materialized default strategy
|
59
75
|
def self.default_strategy
|
60
76
|
return @default_strategy ||= BeanCounter::Strategy.materialize_strategy(DEFAULT_STRATEGY)
|
61
77
|
end
|
62
78
|
|
63
79
|
|
64
|
-
#
|
65
|
-
#
|
66
|
-
# Uses the strategy to delete all jobs from the +tube_name+ tube. If +tube_name+
|
67
|
-
# is not provided, all jobs on the beanstalkd server are deleted.
|
80
|
+
# Uses strategy to delete all jobs from the beanstalkd pool or from the tube
|
81
|
+
# specified by `tube_name`.
|
68
82
|
#
|
69
83
|
# It should be noted that jobs that are reserved can only be deleted by the
|
70
84
|
# reserving connection and thus cannot be deleted via this method. As such,
|
71
85
|
# care may need to be taken to ensure that jobs are not left in a reserved
|
72
86
|
# state.
|
73
87
|
#
|
74
|
-
#
|
75
|
-
#
|
88
|
+
# @param tube_name [String] a particular tube to clear all jobs from. If not
|
89
|
+
# given, all jobs in the Beanstalkd pool will be} deleted.
|
90
|
+
# @return [Boolean] Returns true if all encountered jobs were deleted successfully. Returns
|
91
|
+
# false if any of the jobs enumerated could not be deleted.
|
76
92
|
def self.reset!(tube_name = nil)
|
77
93
|
partial_failure = false
|
78
94
|
strategy.jobs.each do |job|
|
@@ -83,19 +99,26 @@ module BeanCounter
|
|
83
99
|
end
|
84
100
|
|
85
101
|
|
86
|
-
# Returns a list of known subclasses of BeanCounter::Strategy.
|
87
|
-
#
|
88
|
-
#
|
102
|
+
# Returns a list of known subclasses of BeanCounter::Strategy. Typically this
|
103
|
+
# list represents the strategies available for interacting with Beanstalkd.
|
104
|
+
#
|
105
|
+
# @return [Array<BeanCounter::Strategy>] Returns a list of known subclasses of
|
106
|
+
# BeanCounter::Strategy
|
89
107
|
def self.strategies
|
90
108
|
return BeanCounter::Strategy.strategies
|
91
109
|
end
|
92
110
|
|
93
111
|
|
94
|
-
# Sets the strategy that BeanCounter should use when interacting with
|
95
|
-
#
|
112
|
+
# Sets the strategy that BeanCounter should use when interacting with Beanstalkd.
|
113
|
+
# The value provided for `strategy_identifier` will be used to
|
96
114
|
# materialize an instance of the matching strategy class. If the provided
|
97
|
-
#
|
98
|
-
# the next call to BeanCounter
|
115
|
+
# `strategy_identifier` is nil, any existing strategy will be cleared and
|
116
|
+
# the next call to BeanCounter.strategy will use the default strategy.
|
117
|
+
#
|
118
|
+
# @param strategy_identifier [Object] A class or an Object that responds to
|
119
|
+
# :to_sym identifying the subclass of BeanCounter::Strategy to use
|
120
|
+
# when communicating with the beanstalkd pool
|
121
|
+
# @return [Object] Returns the value given
|
99
122
|
def self.strategy=(strategy_identifier)
|
100
123
|
if strategy_identifier.nil?
|
101
124
|
@strategy = nil
|
@@ -105,9 +128,12 @@ module BeanCounter
|
|
105
128
|
end
|
106
129
|
|
107
130
|
|
108
|
-
# Returns a previously materialized strategy
|
109
|
-
# strategy exists, a new instance of
|
110
|
-
# and returned.
|
131
|
+
# Returns a previously materialized strategy or instantiates a new instance
|
132
|
+
# of the default strategy. If no previous strategy exists, a new instance of
|
133
|
+
# the default strategy is instantiated and returned.
|
134
|
+
#
|
135
|
+
# @return [BeanCounter::Strategy] Returns the existing strategy or a new
|
136
|
+
# instance of the default strategy
|
111
137
|
def self.strategy
|
112
138
|
return @strategy ||= default_strategy.new
|
113
139
|
end
|
@@ -4,18 +4,27 @@ class BeanCounter::EnqueuedExpectation
|
|
4
4
|
|
5
5
|
def_delegators BeanCounter, :strategy
|
6
6
|
|
7
|
-
# The
|
7
|
+
# The Hash of options given at instantiation that the expectation expects when
|
8
|
+
# matching.
|
9
|
+
# @return [Hash]
|
8
10
|
attr_reader :expected
|
9
11
|
|
10
12
|
# The number of matching jobs the expectation expects
|
13
|
+
# @return [Numeric, Range]
|
11
14
|
attr_reader :expected_count
|
12
15
|
|
13
16
|
# The jobs found by the expecation during matching
|
17
|
+
# @return [Array<Strategy::Job>]
|
14
18
|
attr_reader :found
|
15
19
|
|
16
20
|
|
17
21
|
# Iterates over the provided collection searching for jobs matching the
|
18
|
-
# Hash of expected options provided
|
22
|
+
# Hash of expected options provided during instantiation.
|
23
|
+
#
|
24
|
+
# @param collection [Array<Strategy::Job>] A collection of jobs as
|
25
|
+
# implemented by the strategy to evaluate for a match.
|
26
|
+
# @return [Boolean] true if the collection matches the expected options and
|
27
|
+
# count
|
19
28
|
def collection_matcher(collection)
|
20
29
|
@found = collection.send(expected_count? ? :select : :detect) do |job|
|
21
30
|
strategy.job_matches?(job, expected)
|
@@ -28,13 +37,19 @@ class BeanCounter::EnqueuedExpectation
|
|
28
37
|
|
29
38
|
|
30
39
|
# Returns a Boolean indicating whether a specific number of jobs are expected.
|
40
|
+
#
|
41
|
+
# @return [Boolean] true if a specifc number of jobs are expected, otherwise
|
42
|
+
# false
|
31
43
|
def expected_count?
|
32
44
|
return !!expected_count
|
33
45
|
end
|
34
46
|
|
35
47
|
|
36
48
|
# Builds the failure message used in the event of a positive expectation
|
37
|
-
# failure
|
49
|
+
# failure.
|
50
|
+
#
|
51
|
+
# @return [String] The failure message for use in the event of a positive
|
52
|
+
# expectation failure.
|
38
53
|
def failure_message
|
39
54
|
if found.nil?
|
40
55
|
found_count = 'none'
|
@@ -52,18 +67,28 @@ class BeanCounter::EnqueuedExpectation
|
|
52
67
|
end
|
53
68
|
|
54
69
|
|
55
|
-
# Create a new enqueued expectation. Uses the given
|
70
|
+
# Create a new enqueued expectation. Uses the given `expected` Hash to determine
|
56
71
|
# if any jobs are enqueued that match the expected options.
|
57
72
|
#
|
58
|
-
# Each
|
59
|
-
# of a job that the corresponding
|
60
|
-
# comparisons are performed using the triple
|
61
|
-
# the given
|
73
|
+
# Each `key` in `expected` is a String or a Symbol that identifies an attribute
|
74
|
+
# of a job that the corresponding `value` should be compared against. All attribute
|
75
|
+
# comparisons are performed using the triple-equal (===) operator/method of
|
76
|
+
# the given `value`.
|
62
77
|
#
|
63
|
-
#
|
78
|
+
# `expected` may additionally include a `count` key of 'count' or :count that
|
64
79
|
# can be used to specify that a particular number of matching jobs are found.
|
65
80
|
#
|
66
|
-
# See BeanCounter::
|
81
|
+
# See {BeanCounter::Strategy::MATCHABLE_JOB_ATTRIBUTES} for a list of
|
82
|
+
# attributes that can be used when matching.
|
83
|
+
#
|
84
|
+
# @see BeanCounter::Strategy::MATCHABLE_JOB_ATTRIBUTES
|
85
|
+
# @see BeanCounter::TestAssertions
|
86
|
+
# @see BeanCounter::SpecMatchers
|
87
|
+
# @param expected
|
88
|
+
# [Hash{String, Symbol => Numeric, Proc, Range, Regexp, String, Symbol}]
|
89
|
+
# Options expected when evaluating match
|
90
|
+
# @option expected [Numeric, Range] :count (nil) A particular number of matching
|
91
|
+
# jobs expected
|
67
92
|
def initialize(expected)
|
68
93
|
@expected = expected
|
69
94
|
@expected_count = [expected.delete(:count), expected.delete('count')].compact.first
|
@@ -73,12 +98,12 @@ class BeanCounter::EnqueuedExpectation
|
|
73
98
|
# Checks the beanstalkd pool for jobs matching the Hash of expected options
|
74
99
|
# provided at instantiation.
|
75
100
|
#
|
76
|
-
# If no
|
101
|
+
# If no `count` option is provided, the expectation succeeds if any job is found
|
77
102
|
# that matches all of the expected options. If no jobs are found that match the
|
78
103
|
# expected options, the expecation fails.
|
79
104
|
#
|
80
|
-
# If a
|
81
|
-
# (===) operator/method of the value of
|
105
|
+
# If a `count` option is provided the expectation only succeeds if the triple-equal
|
106
|
+
# (===) operator/method of the value of `count` evaluates to true when given the
|
82
107
|
# total number of matching jobs. Otherwise the expecation fails. The use of ===
|
83
108
|
# allows for more advanced comparisons using Procs, Ranges, Regexps, etc.
|
84
109
|
#
|
@@ -86,8 +111,17 @@ class BeanCounter::EnqueuedExpectation
|
|
86
111
|
# in use for more detailed information on how it is determined whether or not
|
87
112
|
# a job matches the options expected.
|
88
113
|
#
|
89
|
-
# See
|
90
|
-
#
|
114
|
+
# See {BeanCounter::Strategy::MATCHABLE_JOB_ATTRIBUTES} for a list of
|
115
|
+
# attributes that can be used when matching.
|
116
|
+
#
|
117
|
+
# @see BeanCounter::Strategy::MATCHABLE_JOB_ATTRIBUTES
|
118
|
+
# @see BeanCounter::TestAssertions
|
119
|
+
# @see BeanCounter::SpecMatchers
|
120
|
+
# @param given [Proc] If a Proc is provided, only jobs enqueued during the
|
121
|
+
# execution of the Proc are considered when looking for a match. Otherwise
|
122
|
+
# all jobs available to the strategy will be evaluated for a match.
|
123
|
+
# @return [Boolean] If a match is found, returns true. Otherwise, returns
|
124
|
+
# false.
|
91
125
|
def matches?(given = nil)
|
92
126
|
if given.kind_of?(Proc)
|
93
127
|
return proc_matcher(given)
|
@@ -99,6 +133,9 @@ class BeanCounter::EnqueuedExpectation
|
|
99
133
|
|
100
134
|
# Builds the failure message used in the event of a negative expectation
|
101
135
|
# failure
|
136
|
+
#
|
137
|
+
# @return [String] The failure message for use in the event of a negative
|
138
|
+
# expectation failure.
|
102
139
|
def negative_failure_message
|
103
140
|
return '' if found.nil? || found == []
|
104
141
|
|
@@ -119,13 +156,17 @@ class BeanCounter::EnqueuedExpectation
|
|
119
156
|
end
|
120
157
|
|
121
158
|
|
122
|
-
#
|
123
|
-
#
|
124
|
-
#
|
125
|
-
#
|
159
|
+
# Evaluates jobs enqueued during the execution of the provided block to
|
160
|
+
# determine if any jobs were enqueued that match the expected options provided
|
161
|
+
# at instantiation
|
162
|
+
#
|
163
|
+
# @param block [Proc] A Proc that when executed should demonstrate that
|
164
|
+
# expected behavior.
|
165
|
+
# @return [Boolean] If the jobs enqueued during the execution of the `block`
|
166
|
+
# include a match, returns true. Otherwise, returns false.
|
126
167
|
def proc_matcher(block)
|
127
168
|
new_jobs = strategy.collect_new_jobs(&block)
|
128
|
-
collection_matcher(new_jobs)
|
169
|
+
return collection_matcher(new_jobs)
|
129
170
|
end
|
130
171
|
|
131
172
|
end
|
@@ -1,23 +1,36 @@
|
|
1
1
|
module BeanCounter::SpecMatchers
|
2
2
|
|
3
|
-
# Creates a new BeanCounter::EnqueuedExpectation with
|
4
|
-
# later use when matching. Most of the time the value provided for
|
5
|
-
# will be ignored, the only exception is when
|
6
|
-
# When a block is provided for
|
3
|
+
# Creates a new {BeanCounter::EnqueuedExpectation} with `expected` stored for
|
4
|
+
# later use when matching. Most of the time the value provided for `expected`
|
5
|
+
# will be ignored, the only exception is when `expected` is given a block.
|
6
|
+
# When a block is provided for `expected`, only jobs enqueued during the
|
7
7
|
# execution of the block will be considered when matching.
|
8
8
|
#
|
9
|
-
# See BeanCounter::EnqueuedExpectation for additional information and usage
|
9
|
+
# See {BeanCounter::EnqueuedExpectation} for additional information and usage
|
10
10
|
# patterns.
|
11
|
+
#
|
12
|
+
# @see BeanCounter::EnqueuedExpectation
|
13
|
+
# @param expected
|
14
|
+
# [Hash{String, Symbol => Numeric, Proc, Range, Regexp, String, Symbol}]
|
15
|
+
# options used for evaluating match.
|
16
|
+
# @return [BeanCounter::EnqueuedExpectation] an expectation to be used for
|
17
|
+
# matching.
|
11
18
|
def have_enqueued(expected)
|
12
19
|
BeanCounter::EnqueuedExpectation.new(expected)
|
13
20
|
end
|
14
21
|
|
15
|
-
# Creates a new BeanCounter::TubeExpectation with
|
16
|
-
# later use when matching. However,
|
22
|
+
# Creates a new {BeanCounter::TubeExpectation} with `expected` stored for
|
23
|
+
# later use when matching. However, `expected` is never used when matching.
|
17
24
|
# Instead, all tubes are matched against until a match is found.
|
18
25
|
#
|
19
|
-
# See BeanCounter::TubeExpectation for additional information and usage
|
26
|
+
# See {BeanCounter::TubeExpectation} for additional information and usage
|
20
27
|
# patterns.
|
28
|
+
#
|
29
|
+
# @param expected
|
30
|
+
# [Hash{String, Symbol => Numeric, Proc, Range, Regexp, String, Symbol}]
|
31
|
+
# options used for evaluating match.
|
32
|
+
# @see BeanCounter::TubeExpectation
|
33
|
+
# @return [BeanCounter::TubeExpectation] an expectation to be used for matching.
|
21
34
|
def have_tube(expected)
|
22
35
|
BeanCounter::TubeExpectation.new(expected)
|
23
36
|
end
|
@@ -16,24 +16,26 @@ class BeanCounter::Strategy::StalkClimberStrategy < BeanCounter::Strategy
|
|
16
16
|
attr_methods
|
17
17
|
end
|
18
18
|
|
19
|
-
# Default tube used by StalkClimber when probing the
|
19
|
+
# Default tube used by StalkClimber when probing the Beanstalkd pool
|
20
20
|
TEST_TUBE = 'bean_counter_stalk_climber_test'
|
21
21
|
|
22
|
-
# The tube that will be used by StalkClimber when probing the
|
23
|
-
# Uses TEST_TUBE if no value provided.
|
22
|
+
# The tube that will be used by StalkClimber when probing the Beanstalkd pool.
|
23
|
+
# Uses {TEST_TUBE} if no value provided.
|
24
24
|
attr_writer :test_tube
|
25
25
|
|
26
26
|
def_delegators :climber, :jobs, :tubes
|
27
27
|
|
28
28
|
|
29
|
-
#
|
30
|
-
# collect_new_jobs { block } => Array[StalkClimber::Job]
|
31
|
-
#
|
32
|
-
# Collects all jobs enqueued during the execution of the provided +block+.
|
29
|
+
# Collects all jobs enqueued during the execution of the provided `block`.
|
33
30
|
# Returns an Array of StalkClimber::Job.
|
34
31
|
#
|
35
|
-
# Fulfills Strategy#collect_new_jobs contract.
|
36
|
-
#
|
32
|
+
# Fulfills {BeanCounter::Strategy#collect_new_jobs} contract.
|
33
|
+
#
|
34
|
+
# @see BeanCounter::Strategy#collect_new_jobs
|
35
|
+
# @yield Nothing is yielded to the provided `block`
|
36
|
+
# @raise [ArgumentError] if a block is not provided.
|
37
|
+
# @return [Array<StalkClimber::Job>] all jobs enqueued during the execution
|
38
|
+
# of the provided `block`
|
37
39
|
def collect_new_jobs
|
38
40
|
raise ArgumentError, 'Block required' unless block_given?
|
39
41
|
|
@@ -49,15 +51,16 @@ class BeanCounter::Strategy::StalkClimberStrategy < BeanCounter::Strategy
|
|
49
51
|
end
|
50
52
|
|
51
53
|
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
# Attempts to delete the given StalkClimber::Job +job+. Returns true if
|
56
|
-
# deletion succeeds or if +job+ does not exist. Returns false if +job+ could
|
54
|
+
# Attempts to delete the given StalkClimber::Job `job`. Returns true if
|
55
|
+
# deletion succeeds or if `job` does not exist. Returns false if `job` could
|
57
56
|
# not be deleted (typically due to it being reserved by another connection).
|
58
57
|
#
|
59
|
-
# Fulfills Strategy#delete_job contract.
|
60
|
-
#
|
58
|
+
# Fulfills {BeanCounter::Strategy#delete_job} contract.
|
59
|
+
#
|
60
|
+
# @see BeanCounter::Strategy#delete_job
|
61
|
+
# @param job [StalkClimber::Job] the job to be deleted
|
62
|
+
# @return [Boolean] If the given job was successfully deleted or does not
|
63
|
+
# exist, returns true. Otherwise returns false.
|
61
64
|
def delete_job(job)
|
62
65
|
job.delete
|
63
66
|
return true
|
@@ -66,67 +69,84 @@ class BeanCounter::Strategy::StalkClimberStrategy < BeanCounter::Strategy
|
|
66
69
|
end
|
67
70
|
|
68
71
|
|
69
|
-
#
|
70
|
-
#
|
72
|
+
# Returns a Boolean indicating whether or not the provided Sta`kClimber::Job
|
73
|
+
# `job` matches the given Hash of `options`.
|
71
74
|
#
|
72
|
-
#
|
73
|
-
#
|
75
|
+
# See {MATCHABLE_JOB_ATTRIBUTES} for a list of
|
76
|
+
# attributes that can be used when matching.
|
74
77
|
#
|
75
|
-
# Fulfills Strategy#job_matches? contract.
|
76
|
-
#
|
77
|
-
|
78
|
-
|
78
|
+
# Fulfills {BeanCounter::Strategy#job_matches?} contract.
|
79
|
+
#
|
80
|
+
# @see MATCHABLE_JOB_ATTRIBUTES
|
81
|
+
# @see BeanCounter::Strategy#job_matches?
|
82
|
+
# @param job [StalkClimber::Job] the job to evaluate if matches.
|
83
|
+
# @param options
|
84
|
+
# [Hash{String, Symbol => Numeric, Proc, Range, Regexp, String, Symbol}]
|
85
|
+
# Options to be used to evaluate a match.
|
86
|
+
# @return [Boolean] If job matches the provided options, returns true.
|
87
|
+
# Otherwise, returns false.
|
88
|
+
def job_matches?(job, options = {})
|
89
|
+
return matcher(MATCHABLE_JOB_ATTRIBUTES, job, options)
|
79
90
|
end
|
80
91
|
|
81
92
|
|
82
|
-
#
|
83
|
-
# pretty_print_job(job) => String
|
84
|
-
#
|
85
|
-
# Returns a String representation of the StalkClimber::Job +job+ in a pretty,
|
93
|
+
# Returns a String representation of the StalkClimber::Job `job` in a pretty,
|
86
94
|
# human readable format.
|
87
95
|
#
|
88
|
-
# Fulfills Strategy#pretty_print_job contract.
|
89
|
-
#
|
96
|
+
# Fulfills {BeanCounter::Strategy#pretty_print_job} contract.
|
97
|
+
#
|
98
|
+
# @see BeanCounter::Strategy#pretty_print_job
|
99
|
+
# @param job [StalkClimber::Job] the job to print in a more readable format.
|
100
|
+
# @return [String] A more human-readable representation of `job`.
|
90
101
|
def pretty_print_job(job)
|
91
102
|
return job.to_h.to_s
|
92
103
|
end
|
93
104
|
|
94
105
|
|
95
|
-
#
|
96
|
-
# pretty_print_tube(tube) => String
|
106
|
+
# Returns a String representation of `tube` in a pretty, human readable format.
|
97
107
|
#
|
98
|
-
#
|
108
|
+
# Fulfills {BeanCounter::Strategy#pretty_print_tube} contract.
|
99
109
|
#
|
100
|
-
#
|
101
|
-
#
|
110
|
+
# @see BeanCounter::Strategy#pretty_print_tube
|
111
|
+
# @param tube [StalkClimber::Tube] the tube to print in a more readable format.
|
112
|
+
# @return [String] A more human-readable representation of `tube`.
|
102
113
|
def pretty_print_tube(tube)
|
103
114
|
return tube.to_h.to_s
|
104
115
|
end
|
105
116
|
|
106
117
|
|
107
|
-
#
|
108
|
-
#
|
118
|
+
# Returns a boolean indicating whether or not the provided StalkClimber `tube`
|
119
|
+
# matches the given Hash of `options`.
|
120
|
+
#
|
121
|
+
# See {MATCHABLE_TUBE_ATTRIBUTES} for a list of attributes that can be used
|
122
|
+
# when evaluating a match.
|
109
123
|
#
|
110
|
-
#
|
111
|
-
# matches the given Hash of +options.
|
124
|
+
# Fulfills {BeanCounter::Strategy#tube_matches?} contract.
|
112
125
|
#
|
113
|
-
#
|
114
|
-
#
|
115
|
-
|
116
|
-
|
126
|
+
# @see BeanCounter::Strategy#tube_matches?
|
127
|
+
# @param tube [StalkClimber::Tube] the tube to evaluate a match against.
|
128
|
+
# @param options
|
129
|
+
# [Hash{String, Symbol => Numeric, Proc, Range, Regexp, String, Symbol}]
|
130
|
+
# a Hash of options to use when evaluating a match.
|
131
|
+
# @return [Boolean] If `tube` matches against the provided options, returns
|
132
|
+
# true. Otherwise returns false.
|
133
|
+
def tube_matches?(tube, options = {})
|
134
|
+
return matcher(MATCHABLE_TUBE_ATTRIBUTES, tube, options)
|
117
135
|
end
|
118
136
|
|
119
137
|
private
|
120
138
|
|
121
139
|
# StalkClimber instance used to climb/crawl beanstalkd pool
|
140
|
+
# @return [StalkClimber::Climber]
|
122
141
|
def climber
|
123
142
|
return @climber ||= StalkClimber::Climber.new(BeanCounter.beanstalkd_url, test_tube)
|
124
143
|
end
|
125
144
|
|
126
145
|
|
127
|
-
# Given the set of valid attributes,
|
128
|
-
#
|
129
|
-
#
|
146
|
+
# Given the set of valid attributes, `valid_attributes`, determines if every
|
147
|
+
# `value` of `opts` evaluates to true when compared to the attribute of
|
148
|
+
# `matchable` identified by the corresponding `opts` `key`.
|
149
|
+
# @return [Boolean]
|
130
150
|
def matcher(valid_attributes, matchable, opts = {})
|
131
151
|
# Refresh state/stats before checking match
|
132
152
|
return false unless matchable.exists?
|
@@ -137,6 +157,7 @@ class BeanCounter::Strategy::StalkClimberStrategy < BeanCounter::Strategy
|
|
137
157
|
|
138
158
|
|
139
159
|
# Simplify lookup of what method to call to retrieve requested stat
|
160
|
+
# @return [Symbol]
|
140
161
|
def stats_method_name(stats_attr)
|
141
162
|
return STATS_METHOD_NAMES[stats_attr.to_sym]
|
142
163
|
end
|