sidekiq_portal 0.1.1 → 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 +4 -4
- data/.gitignore +1 -1
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +4 -0
- data/LICENSE.txt +1 -1
- data/README.md +11 -7
- data/lib/portal/config.rb +23 -2
- data/lib/portal/job_manager.rb +1 -1
- data/lib/portal/job_manager/builder.rb +5 -6
- data/lib/portal/job_runner.rb +61 -1
- data/lib/portal/job_runner/builder.rb +4 -1
- data/lib/portal/version.rb +1 -1
- data/sidekiq_portal.gemspec +8 -8
- metadata +32 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23dc75354e3f173ffc8fdaa30634f08509374eaecb190226344073c5e1ba0bbe
|
4
|
+
data.tar.gz: c457e2865d1fac05fc1822f4ba4fea2121b29c7649ffabcff91039cb50abde02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a156ef577a6b09f906819c16b31234ee6e053f2d4a179acdaf84089433b99669ea14101ded51cd211c45d01367acdd81d4eb5c2a389f6bdddb96c78db48f6dd9
|
7
|
+
data.tar.gz: 92e396e45095fe17dd02f2ad2c1b58fc3f5e342ec45771b78d8a89cba6491d54b22037fd697378234ce202e5fadeea505a42acadb8b3ca620c2b0bd8e2450148
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -54,9 +54,10 @@ require 'sidekiq_portal'
|
|
54
54
|
|
55
55
|
## Configuration
|
56
56
|
|
57
|
-
- `default_timezone`
|
58
|
-
- `
|
59
|
-
- `
|
57
|
+
- `default_timezone` - global time zone for your jobs (`UTC` by default);
|
58
|
+
- `retry_count` - Sidekiq's built-in retry mechanism simulation (`0` by default);
|
59
|
+
- `retry_on` - retry only on a set of exceptions (`[StandardError]` by default);
|
60
|
+
- `scheduler_config` - `sidekiq-scheduler`-based scheduler configuration (`{}` by default (non-configured));
|
60
61
|
- `Sidekiq::Portal.reload!(&configuration)` - reload portal configurations;
|
61
62
|
|
62
63
|
In your `spec_helper.rb`:
|
@@ -64,8 +65,9 @@ In your `spec_helper.rb`:
|
|
64
65
|
```ruby
|
65
66
|
# portal configuration
|
66
67
|
Sidekiq::Portal.setup! do |config|
|
67
|
-
config.default_timezone = 'UTC'
|
68
|
-
config.
|
68
|
+
config.default_timezone = 'UTC' # 'UTC' by default
|
69
|
+
config.retry_count = 3 # 0 by default
|
70
|
+
config.retry_on = [StandardError] # [StandardError] by default
|
69
71
|
|
70
72
|
# pre-defined sidekiq-scheduler configs (Rails example)
|
71
73
|
config.scheduler_cofnig = Rails.application.config_for(:sidekiq)[:schedule]
|
@@ -146,8 +148,7 @@ end
|
|
146
148
|
|
147
149
|
- `Sidekiq::Testing.portal!` test mode with support for `:inline` and `:fake`;
|
148
150
|
(`Sidekiq::Testing.inline!` and `Sidekiq::Testing.fake` respectively);
|
149
|
-
- support for `ActiveSupport::
|
150
|
-
- support for retries;
|
151
|
+
- support for `ActiveSupport::TimeZone` instances in `default_timezone` config;
|
151
152
|
- rspec matchers;
|
152
153
|
- `#reload!` should use previosly defined settings?;
|
153
154
|
- support for `Sidekiq::Worker` job backend;
|
@@ -155,6 +156,9 @@ end
|
|
155
156
|
- more specs;
|
156
157
|
- documentation and examples for instance-based portals (`Sidekiq::Portal.new(&configuration)`);
|
157
158
|
- job execution randomization (for jobs which should be invoked at the same time);
|
159
|
+
- configurable in-line invokations (with job list config);
|
160
|
+
- configurable and conditional portal invokation (run over all specs or only over the one or etc)
|
161
|
+
(suitable for unit tests);
|
158
162
|
|
159
163
|
## License
|
160
164
|
|
data/lib/portal/config.rb
CHANGED
@@ -21,14 +21,35 @@ class Sidekiq::Portal::Config < Qonfig::DataSet
|
|
21
21
|
# @since 0.1.0
|
22
22
|
DEFAUL_RETRIES_COUNT = 0
|
23
23
|
|
24
|
+
# @return [Array<Exception>]
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
# @since 0.1.0
|
28
|
+
RETRY_ON_EXCEPTIONS = [StandardError].freeze
|
29
|
+
|
30
|
+
# @since 0.1.0
|
24
31
|
setting :default_timezone, DEFAULT_TIMEZONE
|
25
|
-
|
32
|
+
# @since 0.1.0
|
33
|
+
setting :retry_count, DEFAUL_RETRIES_COUNT
|
34
|
+
# @since 0.1.0
|
35
|
+
setting :retry_on, RETRY_ON_EXCEPTIONS
|
36
|
+
# @since 0.1.0
|
26
37
|
setting :scheduler_config, EMPTY_SCHEDULER_CONFIG
|
27
38
|
|
39
|
+
# @since 0.1.0
|
28
40
|
validate :default_timezone do |value|
|
29
41
|
value.is_a?(String) && !ActiveSupport::TimeZone[value].nil?
|
30
42
|
end
|
31
43
|
|
32
|
-
|
44
|
+
# @since 0.1.0
|
45
|
+
validate :retry_on do |value|
|
46
|
+
value.is_a?(Array) && (value.all? do |exception_klass|
|
47
|
+
exception_klass.is_a?(Class) && exception_klass <= ::Exception
|
48
|
+
end)
|
49
|
+
end
|
50
|
+
|
51
|
+
# @since 0.1.0
|
52
|
+
validate :retry_count, :integer, strict: true
|
53
|
+
# @since 0.1.0
|
33
54
|
validate :scheduler_config, :hash, strict: true
|
34
55
|
end
|
data/lib/portal/job_manager.rb
CHANGED
@@ -10,19 +10,18 @@ class Sidekiq::Portal::JobManager::Builder
|
|
10
10
|
# @api private
|
11
11
|
# @since 0.1.0
|
12
12
|
def build(config)
|
13
|
-
new(config
|
13
|
+
new(config).build
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
# @param
|
18
|
-
# @param timezone [String]
|
17
|
+
# @param config [Sidekiq::Portal::Config]
|
19
18
|
# @return [void]
|
20
19
|
#
|
21
20
|
# @api private
|
22
21
|
# @since 0.1.0
|
23
|
-
def initialize(
|
24
|
-
@scheduled_jobs_config =
|
25
|
-
@timezone =
|
22
|
+
def initialize(config)
|
23
|
+
@scheduled_jobs_config = config.settings.scheduler_config
|
24
|
+
@timezone = config.settings.default_timezone
|
26
25
|
end
|
27
26
|
|
28
27
|
# @return [Sidekiq::Portal::Manager]
|
data/lib/portal/job_runner.rb
CHANGED
@@ -5,14 +5,74 @@
|
|
5
5
|
class Sidekiq::Portal::JobRunner
|
6
6
|
require_relative 'job_runner/builder'
|
7
7
|
|
8
|
+
# @param retry_count [Integer]
|
9
|
+
# @parma retry_on_exceptions [Array<Class<Exception>>]
|
10
|
+
# @return [void]
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
# @since 0.1.0
|
14
|
+
def initialize(retry_count, retry_on_exceptions)
|
15
|
+
@retry_count = retry_count
|
16
|
+
@retry_on_exceptions = retry_on_exceptions
|
17
|
+
end
|
18
|
+
|
8
19
|
# @param job [Sidekiq::Portal::Job]
|
9
20
|
#
|
10
21
|
# @api private
|
11
22
|
# @since 0.1.0
|
12
23
|
def run(job)
|
13
|
-
return unless
|
24
|
+
return unless time_has_come?(job)
|
25
|
+
actualize_internal_job_state(job)
|
26
|
+
perform(job)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# @return [Integer]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
# @since 0.1.0
|
35
|
+
attr_reader :retry_count
|
36
|
+
|
37
|
+
# @return [Arrray<Class<Exception>>]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
# @since 0.1.0
|
41
|
+
attr_reader :retry_on_exceptions
|
42
|
+
|
43
|
+
# @param job [Sidekiq::Portal::Job]
|
44
|
+
# @return [Boolean]
|
45
|
+
#
|
46
|
+
# @api private
|
47
|
+
# @since 0.1.0
|
48
|
+
def time_has_come?(job)
|
49
|
+
job.timeline.time_has_come?
|
50
|
+
end
|
14
51
|
|
52
|
+
# @param job [Sidekiq::Portal::Job]
|
53
|
+
# @return [void]
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
# @since 0.1.0
|
57
|
+
def actualize_internal_job_state(job)
|
15
58
|
job.timeline.actualize_time!
|
59
|
+
end
|
60
|
+
|
61
|
+
# @param job [Sidekiq::Portal::Job]
|
62
|
+
# @param perform_attempt [Integer]
|
63
|
+
# @return [void]
|
64
|
+
#
|
65
|
+
# @raise [Exception]
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
# @since 0.1.0
|
69
|
+
def perform(job, perform_attempt = 1)
|
16
70
|
job.klass.perform_later
|
71
|
+
rescue => error
|
72
|
+
if retry_on_exceptions.include?(error.class)
|
73
|
+
(perform_attempt == retry_count) ? raise(error) : perform(job, perform_attempt.next)
|
74
|
+
else
|
75
|
+
raise(error)
|
76
|
+
end
|
17
77
|
end
|
18
78
|
end
|
@@ -10,7 +10,10 @@ module Sidekiq::Portal::JobRunner::Builder
|
|
10
10
|
# @api private
|
11
11
|
# @since 0.1.0
|
12
12
|
def build(config)
|
13
|
-
Sidekiq::Portal::JobRunner.new
|
13
|
+
Sidekiq::Portal::JobRunner.new(
|
14
|
+
config.settings.retry_count,
|
15
|
+
config.settings.retry_on
|
16
|
+
)
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
data/lib/portal/version.rb
CHANGED
data/sidekiq_portal.gemspec
CHANGED
@@ -13,9 +13,9 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.email = ['iamdaiver@icloud.com']
|
14
14
|
|
15
15
|
spec.summary =
|
16
|
-
'Sidekiq::Portal -
|
16
|
+
'Sidekiq::Portal - scheduled jobs invocation emulation for test environments '
|
17
17
|
spec.description =
|
18
|
-
'Sidekiq::Portal - emulate job activity in tests when you work with time traveling.'
|
18
|
+
'Sidekiq::Portal - emulate scheduled job activity in tests when you work with time traveling.'
|
19
19
|
|
20
20
|
spec.homepage = 'https://github.com/0exp/sidekiq_portal'
|
21
21
|
spec.license = 'MIT'
|
@@ -30,16 +30,16 @@ Gem::Specification.new do |spec|
|
|
30
30
|
|
31
31
|
spec.add_dependency 'qonfig', '~> 0.23'
|
32
32
|
spec.add_dependency 'fugit', '~> 1.3'
|
33
|
-
spec.add_dependency 'activesupport', '>= 4'
|
33
|
+
spec.add_dependency 'activesupport', '>= 4', '< 7'
|
34
34
|
|
35
|
-
spec.add_development_dependency 'armitage-rubocop', '~> 0.
|
35
|
+
spec.add_development_dependency 'armitage-rubocop', '~> 0.78'
|
36
36
|
spec.add_development_dependency 'rspec', '~> 3.9.0'
|
37
37
|
spec.add_development_dependency 'simplecov', '~> 0.17.1'
|
38
38
|
|
39
|
-
spec.add_development_dependency 'sidekiq', '>= 5'
|
39
|
+
spec.add_development_dependency 'sidekiq', '>= 5', '< 7'
|
40
40
|
spec.add_development_dependency 'timecop', '~> 0.9'
|
41
41
|
|
42
|
-
spec.add_development_dependency 'bundler'
|
43
|
-
spec.add_development_dependency 'rake'
|
44
|
-
spec.add_development_dependency 'pry'
|
42
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
43
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
44
|
+
spec.add_development_dependency 'pry', '~> 0.12'
|
45
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq_portal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rustam Ibragimov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: qonfig
|
@@ -45,6 +45,9 @@ dependencies:
|
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '4'
|
48
|
+
- - "<"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '7'
|
48
51
|
type: :runtime
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -52,20 +55,23 @@ dependencies:
|
|
52
55
|
- - ">="
|
53
56
|
- !ruby/object:Gem::Version
|
54
57
|
version: '4'
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '7'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: armitage-rubocop
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
67
|
+
version: '0.78'
|
62
68
|
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
74
|
+
version: '0.78'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: rspec
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,6 +107,9 @@ dependencies:
|
|
101
107
|
- - ">="
|
102
108
|
- !ruby/object:Gem::Version
|
103
109
|
version: '5'
|
110
|
+
- - "<"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '7'
|
104
113
|
type: :development
|
105
114
|
prerelease: false
|
106
115
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -108,6 +117,9 @@ dependencies:
|
|
108
117
|
- - ">="
|
109
118
|
- !ruby/object:Gem::Version
|
110
119
|
version: '5'
|
120
|
+
- - "<"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '7'
|
111
123
|
- !ruby/object:Gem::Dependency
|
112
124
|
name: timecop
|
113
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,46 +138,46 @@ dependencies:
|
|
126
138
|
name: bundler
|
127
139
|
requirement: !ruby/object:Gem::Requirement
|
128
140
|
requirements:
|
129
|
-
- - "
|
141
|
+
- - "~>"
|
130
142
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
143
|
+
version: '2.1'
|
132
144
|
type: :development
|
133
145
|
prerelease: false
|
134
146
|
version_requirements: !ruby/object:Gem::Requirement
|
135
147
|
requirements:
|
136
|
-
- - "
|
148
|
+
- - "~>"
|
137
149
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
150
|
+
version: '2.1'
|
139
151
|
- !ruby/object:Gem::Dependency
|
140
152
|
name: rake
|
141
153
|
requirement: !ruby/object:Gem::Requirement
|
142
154
|
requirements:
|
143
|
-
- - "
|
155
|
+
- - "~>"
|
144
156
|
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
157
|
+
version: '13.0'
|
146
158
|
type: :development
|
147
159
|
prerelease: false
|
148
160
|
version_requirements: !ruby/object:Gem::Requirement
|
149
161
|
requirements:
|
150
|
-
- - "
|
162
|
+
- - "~>"
|
151
163
|
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
164
|
+
version: '13.0'
|
153
165
|
- !ruby/object:Gem::Dependency
|
154
166
|
name: pry
|
155
167
|
requirement: !ruby/object:Gem::Requirement
|
156
168
|
requirements:
|
157
|
-
- - "
|
169
|
+
- - "~>"
|
158
170
|
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
171
|
+
version: '0.12'
|
160
172
|
type: :development
|
161
173
|
prerelease: false
|
162
174
|
version_requirements: !ruby/object:Gem::Requirement
|
163
175
|
requirements:
|
164
|
-
- - "
|
176
|
+
- - "~>"
|
165
177
|
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
description: Sidekiq::Portal - emulate job activity in tests when you work
|
168
|
-
traveling.
|
178
|
+
version: '0.12'
|
179
|
+
description: Sidekiq::Portal - emulate scheduled job activity in tests when you work
|
180
|
+
with time traveling.
|
169
181
|
email:
|
170
182
|
- iamdaiver@icloud.com
|
171
183
|
executables: []
|
@@ -225,8 +237,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
237
|
- !ruby/object:Gem::Version
|
226
238
|
version: '0'
|
227
239
|
requirements: []
|
228
|
-
rubygems_version: 3.
|
240
|
+
rubygems_version: 3.1.2
|
229
241
|
signing_key:
|
230
242
|
specification_version: 4
|
231
|
-
summary: Sidekiq::Portal -
|
243
|
+
summary: Sidekiq::Portal - scheduled jobs invocation emulation for test environments
|
232
244
|
test_files: []
|