sidekiq-belt 0.1.0 → 0.3.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/.rubocop.yml +16 -2
- data/CHANGELOG.md +9 -1
- data/README.md +25 -36
- data/lib/sidekiq/belt/community/files.rb +2 -0
- data/lib/sidekiq/belt/ent/files.rb +2 -0
- data/lib/sidekiq/belt/ent/periodic_pause.rb +73 -4
- data/lib/sidekiq/belt/pro/failed_batch_remove.rb +44 -0
- data/lib/sidekiq/belt/pro/files.rb +6 -4
- data/lib/sidekiq/belt/version.rb +1 -1
- data/lib/sidekiq/web_action_helper.rb +1 -5
- data/lib/sidekiq/web_router_helper.rb +3 -2
- metadata +5 -5
- data/.rubocop_todo.yml +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e20fc5c538638c6ec3efcc44f96a75e8a6a3a15906738e78990add18f15ff5a
|
4
|
+
data.tar.gz: e21c25aad43211fa210785d92c7d1e182efbec71471feb7aa48d1cc5dd802cad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 857d47d6d0dfbe7ffb7b2e97049c5a718877525212508afa787c506aa5497a4ac172a92bf9ee9218673f83bad99efbb076f7460a3b71d63cf2f9431bd34dfb2b
|
7
|
+
data.tar.gz: e14112f7c11dde264d54a5143e4d555a54206528effd0c7ae0679ef5106026b942e4e17b3d539214594b8c00e03317acd74f4514f106a526b967f17f635ee1b9
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
inherit_from: .rubocop_todo.yml
|
2
|
-
|
3
1
|
require:
|
4
2
|
- rubocop-rake
|
5
3
|
- rubocop-rspec
|
@@ -225,3 +223,19 @@ RSpec/ExampleLength:
|
|
225
223
|
|
226
224
|
RSpec/NestedGroups:
|
227
225
|
Enabled: false
|
226
|
+
|
227
|
+
Metrics/AbcSize:
|
228
|
+
Enabled: false
|
229
|
+
|
230
|
+
Naming/MethodParameterName:
|
231
|
+
Enabled: false
|
232
|
+
|
233
|
+
Naming/FileName:
|
234
|
+
Exclude:
|
235
|
+
- 'lib/sidekiq-belt.rb'
|
236
|
+
|
237
|
+
RSpec/VerifiedDoubles:
|
238
|
+
Enabled: false
|
239
|
+
|
240
|
+
RSpec/MultipleMemoizedHelpers:
|
241
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.3.0] - 2023-10-07
|
4
|
+
|
5
|
+
- Feature to add button to remove failed batches
|
6
|
+
|
7
|
+
## [0.2.0] - 2023-10-07
|
8
|
+
|
9
|
+
- Feature to Pause/Unpause Periodic Jobs
|
10
|
+
|
3
11
|
## [0.1.0] - 2023-10-07
|
4
12
|
|
5
|
-
-
|
13
|
+
- Feature to run manualy Periodic Jobs
|
data/README.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Sidekiq::Belt
|
2
2
|
|
3
|
+
|
4
|
+
<a href='http://badge.fury.io/rb/sidekiq-belt'>
|
5
|
+
<img src="https://badge.fury.io/rb/sidekiq-belt.png" alt="Gem Version" />
|
6
|
+
</a>
|
7
|
+
<a href='https://github.com/dannnylo/sidekiq-belt/workflows/CI/badge.svg'>
|
8
|
+
<img src="https://github.com/dannnylo/sidekiq-belt/workflows/CI/badge.svg" alt="Build Status" />
|
9
|
+
</a>
|
10
|
+
|
3
11
|
This Ruby gem enhances the capabilities of Sidekiq, Sidekiq Pro, and Sidekiq Enterprise by adding essential utilities.
|
4
12
|
|
5
13
|
## Installation
|
@@ -14,10 +22,6 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
14
22
|
|
15
23
|
## Features
|
16
24
|
|
17
|
-
GitHub Copilot: Sure, here's a rewritten version of the content that is easier to read for a developer:
|
18
|
-
|
19
|
-
## Features
|
20
|
-
|
21
25
|
To enable all features, add the following code to the end of the Sidekiq initializer file:
|
22
26
|
|
23
27
|
```ruby
|
@@ -45,52 +49,37 @@ To enable this feature, pass the `periodic_run` option:
|
|
45
49
|
Sidekiq::Belt.use!([:periodic_run])
|
46
50
|
```
|
47
51
|
|
48
|
-

|
52
|
+

|
53
|
+

|
52
54
|
|
53
|
-
This feature is not yet implemented.
|
54
55
|
|
55
|
-
###
|
56
|
-
|
57
|
-
This feature is not yet implemented.
|
58
|
-
```
|
59
|
-
Sidekiq::Belt.use!
|
60
|
-
```
|
56
|
+
### Pause Periodic Jobs (sidekiq-enterprise)
|
61
57
|
|
62
|
-
|
58
|
+
This option adds a button to pause and unpause the cron of a periodic job.
|
59
|
+
When a periodic job is paused, the perform is skiped and on server this content is logged.
|
63
60
|
|
64
61
|
```
|
65
|
-
|
62
|
+
2023-10-12T19:24:00.001Z pid=127183 tid=2ian INFO: Job SomeHourlyWorkerClass is paused by Periodic Pause
|
66
63
|
```
|
67
64
|
|
68
|
-
To enable
|
65
|
+
To enable this feature, pass the `periodic_pause` option:
|
69
66
|
|
67
|
+
```ruby
|
68
|
+
Sidekiq::Belt.use!([:periodic_pause])
|
70
69
|
```
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
### Run manualy Periodic Jobs (sidekiq-enterprise)
|
70
|
+

|
71
|
+

|
75
72
|
|
76
|
-
|
73
|
+
### Delete an Unfinished Batch (sidekiq-pro)
|
77
74
|
|
78
|
-
|
75
|
+
This option adds a button to remove failed batches.
|
79
76
|
|
77
|
+
To enable this feature, pass the `failed_batch_remove` option:
|
78
|
+
```ruby
|
79
|
+
Sidekiq::Belt.use!([:failed_batch_remove])
|
80
80
|
```
|
81
|
-
|
82
|
-
```
|
83
|
-
|
84
|
-

|
85
|
-

|
86
|
-
|
87
|
-
### Pause Periodic Jobs (sidekiq-enterprise)
|
88
|
-
|
89
|
-
It will be implemented in upcoming versions.
|
90
|
-
|
91
|
-
### Delete a not finished Batch (sidekiq-pro)
|
81
|
+

|
92
82
|
|
93
|
-
It will be implemented in upcoming versions.
|
94
83
|
|
95
84
|
## Development
|
96
85
|
|
@@ -1,15 +1,84 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "sidekiq/web/helpers"
|
4
|
+
|
3
5
|
module Sidekiq
|
4
6
|
module Belt
|
5
7
|
module Ent
|
6
8
|
module PeriodicPause
|
9
|
+
def paused?
|
10
|
+
Sidekiq.redis { |r| r.hget("PeriodicPaused", @lid.to_s) }.to_s == "p"
|
11
|
+
end
|
12
|
+
|
13
|
+
def pause!
|
14
|
+
Sidekiq.redis { |r| r.hset("PeriodicPaused", @lid.to_s, "p") }
|
15
|
+
end
|
16
|
+
|
17
|
+
def unpause!
|
18
|
+
Sidekiq.redis { |r| r.hdel("PeriodicPaused", @lid.to_s) }
|
19
|
+
end
|
20
|
+
|
21
|
+
module SidekiqLoopsPeriodicPause
|
22
|
+
PAUSE_BUTTON = <<~ERB
|
23
|
+
<form action="<%= root_path %>loops/<%= loup.lid %>/pause" method="post">
|
24
|
+
<%= csrf_tag %>
|
25
|
+
<input class="btn btn-danger" type="submit" name="pause" value="<%= t('Pause') %>"
|
26
|
+
data-confirm="Pause the job <%= loup.klass %>? <%= t('AreYouSure') %>" />
|
27
|
+
</form>
|
28
|
+
ERB
|
29
|
+
|
30
|
+
UNPAUSE_BUTTON = <<~ERB
|
31
|
+
<form action="<%= root_path %>loops/<%= loup.lid %>/unpause" method="post">
|
32
|
+
<%= csrf_tag %>
|
33
|
+
<input class="btn btn-danger" type="submit" name="pause" value="<%= t('Unpause') %>"
|
34
|
+
data-confirm="Unpause the job <%= loup.klass %>? <%= t('AreYouSure') %>" />
|
35
|
+
</form>
|
36
|
+
ERB
|
37
|
+
|
38
|
+
def self.registered(app)
|
39
|
+
app.replace_content("/loops") do |content|
|
40
|
+
# Add the top of the table
|
41
|
+
content.gsub!("</th>\n </tr>", "</th><th><%= t('Pause/Unpause') %></th></th>\n </tr>")
|
42
|
+
|
43
|
+
# Add the run button
|
44
|
+
content.gsub!(
|
45
|
+
"</td>\n </tr>\n <% end %>",
|
46
|
+
"</td>\n<td>" \
|
47
|
+
"<% if (loup.paused?) %>#{UNPAUSE_BUTTON}<% else %>#{PAUSE_BUTTON}<% end %>" \
|
48
|
+
"</td>\n </tr>\n <% end %>"
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
app.post("/loops/:lid/pause") do
|
53
|
+
Sidekiq::Periodic::Loop.new(params[:lid]).pause!
|
54
|
+
|
55
|
+
return redirect "#{root_path}loops"
|
56
|
+
end
|
57
|
+
|
58
|
+
app.post("/loops/:lid/unpause") do
|
59
|
+
Sidekiq::Periodic::Loop.new(params[:lid]).unpause!
|
60
|
+
|
61
|
+
return redirect "#{root_path}loops"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
module PauseServer
|
67
|
+
def enqueue_job(cycle, ts)
|
68
|
+
cycle.paused? ? logger.info("Job #{cycle.klass} is paused by Periodic Pause") : super
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
7
72
|
def self.use!
|
8
|
-
|
9
|
-
|
73
|
+
require("sidekiq-ent/web")
|
74
|
+
require("sidekiq-ent/periodic")
|
75
|
+
require("sidekiq-ent/periodic/manager")
|
76
|
+
require("sidekiq-ent/periodic/static_loop")
|
10
77
|
|
11
|
-
|
12
|
-
|
78
|
+
Sidekiq::Web.register(Sidekiq::Belt::Ent::PeriodicPause::SidekiqLoopsPeriodicPause)
|
79
|
+
Sidekiq::Periodic::Loop.prepend(Sidekiq::Belt::Ent::PeriodicPause)
|
80
|
+
Sidekiq::Periodic::StaticLoop.prepend(Sidekiq::Belt::Ent::PeriodicPause)
|
81
|
+
Sidekiq::Periodic::Manager.prepend(Sidekiq::Belt::Ent::PeriodicPause::PauseServer)
|
13
82
|
end
|
14
83
|
end
|
15
84
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "sidekiq/web/helpers"
|
4
|
+
|
5
|
+
module Sidekiq
|
6
|
+
module Belt
|
7
|
+
module Pro
|
8
|
+
module FailedBatchRemove
|
9
|
+
module SidekiqFailedBatchRemove
|
10
|
+
REMOVE_BUTTON = <<~ERB
|
11
|
+
<form action="<%= root_path %>batches/<%= bid %>/remove" method="post">
|
12
|
+
<%= csrf_tag %>
|
13
|
+
<input class="btn btn-danger" type="submit" name="remove" value="<%= t('Remove') %>"
|
14
|
+
data-confirm="Do you want to remove batch <%= bid %>? <%= t('AreYouSure') %>" />
|
15
|
+
</form>
|
16
|
+
ERB
|
17
|
+
|
18
|
+
def self.registered(app)
|
19
|
+
app.replace_content("/batches") do |content|
|
20
|
+
content.gsub!("</th>\n <%", "</th><th><%= t('Delete') %></th>\n <%")
|
21
|
+
|
22
|
+
content.gsub!(
|
23
|
+
"</td>\n </tr>\n <% end %>",
|
24
|
+
"</td>\n<td>#{REMOVE_BUTTON}</td>\n </tr>\n <% end %>"
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
app.post("/batches/:bid/remove") do
|
29
|
+
Sidekiq::Batch::Status.new(params[:bid]).delete
|
30
|
+
|
31
|
+
return redirect "#{root_path}batches"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.use!
|
37
|
+
require("sidekiq/web")
|
38
|
+
|
39
|
+
Sidekiq::Web.register(Sidekiq::Belt::Pro::FailedBatchRemove::SidekiqFailedBatchRemove)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -2,18 +2,20 @@
|
|
2
2
|
|
3
3
|
require "sidekiq"
|
4
4
|
|
5
|
-
|
5
|
+
require_relative "failed_batch_remove"
|
6
6
|
|
7
7
|
module Sidekiq
|
8
8
|
module Belt
|
9
9
|
module Pro
|
10
10
|
module Files
|
11
|
-
def self.use!(
|
11
|
+
def self.use!(options = [:all])
|
12
12
|
return unless Sidekiq.pro?
|
13
13
|
|
14
|
+
all = options.include?(:all)
|
15
|
+
|
16
|
+
Sidekiq::Belt::Pro::FailedBatchRemove.use! if all || options.include?(:failed_batch_remove)
|
17
|
+
|
14
18
|
true
|
15
|
-
# all = options.include?(:all)
|
16
|
-
# Sidekiq::Belt::Pro::Feature.load! if all || options.include?(:feature)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
data/lib/sidekiq/belt/version.rb
CHANGED
@@ -5,10 +5,6 @@ require "sidekiq/web/action"
|
|
5
5
|
|
6
6
|
module Sidekiq
|
7
7
|
module WebActionHelper
|
8
|
-
def self.blocks
|
9
|
-
@blocks ||= {}
|
10
|
-
end
|
11
|
-
|
12
8
|
def render(engine, content, options = {})
|
13
9
|
begin
|
14
10
|
path_info = /"([^"]*)"/.match(block.source.to_s)[1]
|
@@ -18,7 +14,7 @@ module Sidekiq
|
|
18
14
|
|
19
15
|
path_info ||= ::Rack::Utils.unescape(env["PATH_INFO"])
|
20
16
|
|
21
|
-
Sidekiq::
|
17
|
+
Sidekiq::Config::DEFAULTS[:replace_views].fetch(path_info.to_s, []).each do |content_block|
|
22
18
|
content_block.call(content)
|
23
19
|
end
|
24
20
|
|
@@ -7,8 +7,9 @@ require_relative "web_action_helper"
|
|
7
7
|
module Sidekiq
|
8
8
|
module WebRouterHelper
|
9
9
|
def replace_content(path, &block)
|
10
|
-
Sidekiq::
|
11
|
-
Sidekiq::
|
10
|
+
Sidekiq::Config::DEFAULTS[:replace_views] ||= {}
|
11
|
+
Sidekiq::Config::DEFAULTS[:replace_views][path.to_s] ||= []
|
12
|
+
Sidekiq::Config::DEFAULTS[:replace_views][path.to_s] << block
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-belt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danilo Jeremias da Silva
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 7.1.4
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 7.1.4
|
27
27
|
description: This Ruby gem enhances the capabilities of Sidekiq, Sidekiq Pro, and
|
28
28
|
Sidekiq Enterprise by adding essential utilities.
|
29
29
|
email:
|
@@ -34,7 +34,6 @@ extra_rdoc_files: []
|
|
34
34
|
files:
|
35
35
|
- ".rspec"
|
36
36
|
- ".rubocop.yml"
|
37
|
-
- ".rubocop_todo.yml"
|
38
37
|
- CHANGELOG.md
|
39
38
|
- CODE_OF_CONDUCT.md
|
40
39
|
- LICENSE
|
@@ -46,6 +45,7 @@ files:
|
|
46
45
|
- lib/sidekiq/belt/ent/files.rb
|
47
46
|
- lib/sidekiq/belt/ent/periodic_pause.rb
|
48
47
|
- lib/sidekiq/belt/ent/periodic_run.rb
|
48
|
+
- lib/sidekiq/belt/pro/failed_batch_remove.rb
|
49
49
|
- lib/sidekiq/belt/pro/files.rb
|
50
50
|
- lib/sidekiq/belt/version.rb
|
51
51
|
- lib/sidekiq/web_action_helper.rb
|
data/.rubocop_todo.yml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on 2023-10-11 15:02:29 UTC using RuboCop version 1.56.4.
|
4
|
-
# The point is for the user to remove these configuration records
|
5
|
-
# one by one as the offenses are removed from the code base.
|
6
|
-
# Note that changes in the inspected code, or installation of new
|
7
|
-
# versions of RuboCop, may require this file to be generated again.
|
8
|
-
|
9
|
-
# Offense count: 1
|
10
|
-
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
11
|
-
# CheckDefinitionPathHierarchyRoots: lib, spec, test, src
|
12
|
-
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
|
13
|
-
Naming/FileName:
|
14
|
-
Exclude:
|
15
|
-
- 'lib/sidekiq-belt.rb'
|