sidekiq-job-manager 0.1.4 → 0.1.6
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/Gemfile.lock +25 -22
- data/config.ru +4 -3
- data/lib/sidekiq/job-manager/version.rb +1 -1
- data/lib/sidekiq/job-manager/views/job_details.erb +85 -0
- data/lib/sidekiq/job-manager/views/manager.erb +47 -0
- data/lib/sidekiq/job-manager/web_extension.rb +4 -2
- data/sidekiq-job-manager.gemspec +2 -0
- data/test/test_helper.rb +3 -2
- metadata +32 -4
- data/lib/sidekiq/job-manager/views/job_details.slim +0 -63
- data/lib/sidekiq/job-manager/views/manager.slim +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54ed5a24fc812962a576a9bb431b7d653746c512
|
4
|
+
data.tar.gz: 4d54d32c9a18c265099f0370fa3a2ee392341e2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac0c6495d46fe7fe93191d701b53331cb8fca2a0df08f15155c08801cc153eee3d8009c5f0de26668eb6f727ebdde54393398deb53f686ce895fa179a3a896b3
|
7
|
+
data.tar.gz: 553145760176ac0702caa9173d95a5753f978afd992e99d013018ef71d99277a4a2070887746098995e1e6439e44118552dab366572cdcba488ea06ee50f78dc
|
data/Gemfile.lock
CHANGED
@@ -7,47 +7,50 @@ PATH
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
celluloid (0.
|
11
|
-
timers (
|
10
|
+
celluloid (0.15.2)
|
11
|
+
timers (~> 1.1.0)
|
12
12
|
connection_pool (1.1.0)
|
13
|
-
hike (1.2.
|
13
|
+
hike (1.2.3)
|
14
14
|
json (1.8.0)
|
15
|
-
|
16
|
-
|
17
|
-
rack
|
15
|
+
mock_redis (0.9.0)
|
16
|
+
multi_json (1.8.1)
|
17
|
+
rack (1.5.2)
|
18
|
+
rack-protection (1.5.0)
|
18
19
|
rack
|
19
20
|
rack-test (0.6.2)
|
20
21
|
rack (>= 1.0)
|
21
|
-
rake (
|
22
|
-
redis (3.0.
|
22
|
+
rake (10.1.0)
|
23
|
+
redis (3.0.5)
|
23
24
|
redis-namespace (1.3.1)
|
24
25
|
redis (~> 3.0.0)
|
25
|
-
sidekiq (2.
|
26
|
-
celluloid (>= 0.
|
26
|
+
sidekiq (2.15.1)
|
27
|
+
celluloid (>= 0.15.1)
|
27
28
|
connection_pool (>= 1.0.0)
|
28
29
|
json
|
29
|
-
redis (>= 3.0)
|
30
|
-
redis-namespace
|
31
|
-
sinatra (1.
|
32
|
-
rack (~> 1.
|
33
|
-
rack-protection (~> 1.
|
34
|
-
tilt (~> 1.3, >= 1.3.
|
35
|
-
slim (
|
36
|
-
temple (~> 0.
|
37
|
-
tilt (
|
38
|
-
sprockets (2.
|
30
|
+
redis (>= 3.0.4)
|
31
|
+
redis-namespace (>= 1.3.1)
|
32
|
+
sinatra (1.4.3)
|
33
|
+
rack (~> 1.4)
|
34
|
+
rack-protection (~> 1.4)
|
35
|
+
tilt (~> 1.3, >= 1.3.4)
|
36
|
+
slim (2.0.1)
|
37
|
+
temple (~> 0.6.6)
|
38
|
+
tilt (>= 1.3.3, < 2.1)
|
39
|
+
sprockets (2.10.0)
|
39
40
|
hike (~> 1.2)
|
40
41
|
multi_json (~> 1.0)
|
41
42
|
rack (~> 1.0)
|
42
43
|
tilt (~> 1.1, != 1.3.0)
|
43
|
-
temple (0.
|
44
|
-
tilt (1.
|
44
|
+
temple (0.6.7)
|
45
|
+
tilt (1.4.1)
|
45
46
|
timers (1.1.0)
|
46
47
|
|
47
48
|
PLATFORMS
|
48
49
|
ruby
|
49
50
|
|
50
51
|
DEPENDENCIES
|
52
|
+
connection_pool
|
53
|
+
mock_redis
|
51
54
|
rack-test
|
52
55
|
rake
|
53
56
|
sidekiq-job-manager!
|
data/config.ru
CHANGED
@@ -4,9 +4,10 @@
|
|
4
4
|
#
|
5
5
|
require 'sidekiq'
|
6
6
|
require 'sidekiq/web'
|
7
|
-
require './lib/sidekiq-manager'
|
7
|
+
require './lib/sidekiq-job-manager'
|
8
|
+
require 'mock_redis'
|
8
9
|
|
9
|
-
REDIS =
|
10
|
+
REDIS = ConnectionPool.new(:size => 1, :timeout => 5) { MockRedis.new }
|
10
11
|
Sidekiq.redis = REDIS
|
11
12
|
Sidekiq.redis {|c| c.flushdb }
|
12
13
|
|
@@ -34,4 +35,4 @@ Sidekiq.redis {|c| c.flushdb }
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
run Sidekiq::Web
|
38
|
+
run Sidekiq::Web
|
@@ -0,0 +1,85 @@
|
|
1
|
+
<header class="col-sm-12">
|
2
|
+
<div class="col-sm-5">
|
3
|
+
<h3>Last calls of <%=@worker%> worker</h3>
|
4
|
+
</div>
|
5
|
+
<div class="col-sm-3"">
|
6
|
+
<input class="filter" type="search" style="margin: 12px 0;margin-top: 18px;" placeholder="Filter" />
|
7
|
+
</div>
|
8
|
+
<div class="col-sm-2"">
|
9
|
+
<% if @messages.size > 0 %>
|
10
|
+
<%= erb :_paging, :locals => { :url => "#{root_path}manager/worker/#{@worker}#@name" } %>
|
11
|
+
<% end %>
|
12
|
+
</div>
|
13
|
+
</header>
|
14
|
+
|
15
|
+
<% if @messages.size > 0 %>
|
16
|
+
<table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
|
17
|
+
<thead>
|
18
|
+
<th style="width: 25%">Payload</th>
|
19
|
+
<th style="width: 10%">Queue</th>
|
20
|
+
<th style="width: 15%">Finished At</th>
|
21
|
+
<th style="width: 38%">Exception</th>
|
22
|
+
<th style="width: 12%">Action</th>
|
23
|
+
</thead>
|
24
|
+
<% @messages.each do |msg| %>
|
25
|
+
<tr class="<%=msg['error'].nil? ? '' : 'error'%>">
|
26
|
+
<td style="overflow: hidden; text-overflow: ellipsis;">
|
27
|
+
<%= msg['payload'] %>
|
28
|
+
</td>
|
29
|
+
<td><%= msg['queue'] %>
|
30
|
+
<td>
|
31
|
+
<time datetime="<%=Time.parse(msg['finished_at']).getutc.iso8601%>">
|
32
|
+
<%= msg['finished_at'] %>
|
33
|
+
</time>
|
34
|
+
</td>
|
35
|
+
<td style="overflow: auto; padding: 10px;">
|
36
|
+
<% if msg['error'] %>
|
37
|
+
<a class="backtrace" href="#" onclick="$(this).next().toggle(); return false" = "<%=msg['error']['exception']%>: <%=msg['error']['error']%>"
|
38
|
+
<pre style="display: none; background: none; border: 0; width: 100%; max-height: 30em; font-size: 0.8em; white-space: nowrap;"><%= msg['error']['backtrace'].join("<br />") %>
|
39
|
+
</pre>
|
40
|
+
<% end %>
|
41
|
+
</td>
|
42
|
+
<td>
|
43
|
+
<input class="btn btn-small add-to-queue" type="button" name="run" value="Add to queue" data-args="<%=msg['payload']['args'].join(',')%>" data-worker="<%=@worker%>" data-queue="<%=msg['queue']%>" />
|
44
|
+
</td>
|
45
|
+
</tr>
|
46
|
+
<% end %>
|
47
|
+
</table>
|
48
|
+
|
49
|
+
<div class="row">
|
50
|
+
<div class="span5">
|
51
|
+
<div class="form form-inline" action="<%=root_path%>manager/worker/<%=@worker%>/remove" method="post" style="margin: 20px 0">
|
52
|
+
<input class="btn btn-danger btn-small" type="submit" name="delete" value="Clear All" />
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
<div class="span4" />
|
56
|
+
<%= erb :_paging, :locals => { :url => "#{root_path}manager/worker/#{@worker}#@name" } %>
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
<% else %>
|
60
|
+
<div class="alert alert-success">No recent jobs found.</div>
|
61
|
+
<% end %>
|
62
|
+
|
63
|
+
<script type="text/javascript">
|
64
|
+
$('input.filter').live('keyup', function() {
|
65
|
+
var rex = new RegExp($(this).val(), 'i');
|
66
|
+
$('.table-striped tbody tr').hide();
|
67
|
+
$('.table-striped tbody tr').filter(function() {
|
68
|
+
return rex.test($(this).text());
|
69
|
+
}).show();
|
70
|
+
});
|
71
|
+
|
72
|
+
$('input.add-to-queue').live('click', function(){
|
73
|
+
var params = {
|
74
|
+
args: prompt('Enter arguments, comma separated', $(this).data('args')),
|
75
|
+
worker: $(this).data('worker'),
|
76
|
+
queue: $(this).data('queue')
|
77
|
+
}
|
78
|
+
|
79
|
+
if (params['args'] != undefined) {
|
80
|
+
$.post('<%=root_path%>manager/add_to_queue', params, function(data) {
|
81
|
+
window.location = "<%=root_path%>queues/"+params['queue']
|
82
|
+
});
|
83
|
+
}
|
84
|
+
})
|
85
|
+
</script>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<header class="row">
|
2
|
+
<div class="span5">
|
3
|
+
<h3>Recent Jobs</h3>
|
4
|
+
</div>
|
5
|
+
</header>
|
6
|
+
|
7
|
+
<% if @jobs.length > 0 %>
|
8
|
+
<table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
|
9
|
+
<thead>
|
10
|
+
<th style="width: 44%">Worker</th>
|
11
|
+
<th style="width: 44%">Last run</th>
|
12
|
+
<th style="widht: 12%">Action</th>
|
13
|
+
</thead>
|
14
|
+
<% @jobs.each do |job| %>
|
15
|
+
<tr class="<%=job[:last_call]['error'].nil? ? '' : 'error'%>">
|
16
|
+
<td style="overflow: hidden; text-overflow: ellipsis;">
|
17
|
+
<a href="<%=root_path%>manager/worker/<%=job[:name]%>">
|
18
|
+
<%= job[:name] %>
|
19
|
+
</a>
|
20
|
+
<td>
|
21
|
+
<time datetime="<%=Time.parse(job[:last_call]['finished_at']).getutc.iso8601%>">
|
22
|
+
<%= job[:last_call]['finished_at'] %>
|
23
|
+
</time>
|
24
|
+
</td>
|
25
|
+
<td>
|
26
|
+
<input class="btn btn-small add-to-queue" type="button" name="run" value="Add to queue" data-worker="<%=job[:name]%>" data-queue="<%=job[:last_call]['queue']%>" />
|
27
|
+
</td>
|
28
|
+
</tr>
|
29
|
+
<% end %>
|
30
|
+
</table>
|
31
|
+
<% else %>
|
32
|
+
<div class="alert alert-success">No recent jobs found</div>
|
33
|
+
<% end %>
|
34
|
+
|
35
|
+
<script type="text/javascript">
|
36
|
+
$('input.add-to-queue').live('click', function(){
|
37
|
+
var params = {
|
38
|
+
args: prompt('Enter arguments, comma separated', $(this).data('args')),
|
39
|
+
worker: $(this).data('worker'),
|
40
|
+
queue: $(this).data('queue')
|
41
|
+
}
|
42
|
+
|
43
|
+
$.post('<%=root_path%>manager/add_to_queue', params, function(data) {
|
44
|
+
window.location = "<%=root_path%>queues/"+params['queue']
|
45
|
+
});
|
46
|
+
})
|
47
|
+
</script>
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'slim'
|
2
|
+
|
1
3
|
module Sidekiq
|
2
4
|
module JobManager
|
3
5
|
module WebExtension
|
@@ -17,7 +19,7 @@ module Sidekiq
|
|
17
19
|
}
|
18
20
|
end
|
19
21
|
|
20
|
-
render(:
|
22
|
+
render(:erb, File.read(File.join(view_path, "manager.erb")))
|
21
23
|
end
|
22
24
|
|
23
25
|
app.get "/manager/worker/:name" do |name|
|
@@ -28,7 +30,7 @@ module Sidekiq
|
|
28
30
|
(@current_page, @total_size, @messages) = page("#{name}:details", params[:page], @count)
|
29
31
|
@messages = @messages.map { |msg| Sidekiq.load_json(msg) }
|
30
32
|
|
31
|
-
render(:
|
33
|
+
render(:erb, File.read(File.join(view_path, "job_details.erb")))
|
32
34
|
end
|
33
35
|
|
34
36
|
app.post "/manager/worker/:name/remove" do |name|
|
data/sidekiq-job-manager.gemspec
CHANGED
@@ -22,4 +22,6 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_development_dependency "sprockets"
|
23
23
|
gem.add_development_dependency "sinatra"
|
24
24
|
gem.add_development_dependency "slim"
|
25
|
+
gem.add_development_dependency "connection_pool"
|
26
|
+
gem.add_development_dependency "mock_redis"
|
25
27
|
end
|
data/test/test_helper.rb
CHANGED
@@ -16,12 +16,13 @@ require "rack/test"
|
|
16
16
|
|
17
17
|
require "celluloid"
|
18
18
|
require "sidekiq"
|
19
|
-
require "sidekiq-manager"
|
19
|
+
require "sidekiq-job-manager"
|
20
20
|
require "sidekiq/processor"
|
21
21
|
require "sidekiq/fetch"
|
22
22
|
require "sidekiq/cli"
|
23
|
+
require "mock_redis"
|
23
24
|
|
24
25
|
Celluloid.logger = nil
|
25
26
|
Sidekiq.logger.level = Logger::ERROR
|
26
27
|
|
27
|
-
REDIS =
|
28
|
+
REDIS = ConnectionPool.new(:size => 1, :timeout => 5) { MockRedis.new }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-job-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonid Bugaev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08
|
11
|
+
date: 2013-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: connection_pool
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: mock_redis
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
description: Manage your sidekiq jobs
|
98
126
|
email:
|
99
127
|
- leonsbox@gmail.com
|
@@ -114,8 +142,8 @@ files:
|
|
114
142
|
- lib/sidekiq/job-manager.rb
|
115
143
|
- lib/sidekiq/job-manager/middleware.rb
|
116
144
|
- lib/sidekiq/job-manager/version.rb
|
117
|
-
- lib/sidekiq/job-manager/views/job_details.
|
118
|
-
- lib/sidekiq/job-manager/views/manager.
|
145
|
+
- lib/sidekiq/job-manager/views/job_details.erb
|
146
|
+
- lib/sidekiq/job-manager/views/manager.erb
|
119
147
|
- lib/sidekiq/job-manager/web_extension.rb
|
120
148
|
- sidekiq-job-manager.gemspec
|
121
149
|
- test/middleware_test.rb
|
@@ -1,63 +0,0 @@
|
|
1
|
-
header.row
|
2
|
-
.span5
|
3
|
-
h3 Last calls of #{@worker} worker
|
4
|
-
.span3
|
5
|
-
input.filter type="search" style="margin: 12px 0;margin-top: 18px;" placeholder="Filter"
|
6
|
-
.span2
|
7
|
-
- if @messages.size > 0
|
8
|
-
== slim :_paging, :locals => { :url => "#{root_path}manager/worker/#{@worker}#@name" }
|
9
|
-
|
10
|
-
- if @messages.size > 0
|
11
|
-
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
|
12
|
-
thead
|
13
|
-
th style="width: 25%" Payload
|
14
|
-
th style="width: 10%" Queue
|
15
|
-
th style="width: 15%" Finished At
|
16
|
-
th style="width: 38%" Exception
|
17
|
-
th style="width: 12%" Action
|
18
|
-
- @messages.each do |msg|
|
19
|
-
tr class="#{msg['error'].nil? ? '' : 'error'}"
|
20
|
-
td style="overflow: hidden; text-overflow: ellipsis;"
|
21
|
-
= msg['payload']
|
22
|
-
td= msg['queue']
|
23
|
-
td
|
24
|
-
time datetime="#{Time.parse(msg['finished_at']).getutc.iso8601}"
|
25
|
-
= msg['finished_at']
|
26
|
-
td style="overflow: auto; padding: 10px;"
|
27
|
-
- if msg['error']
|
28
|
-
a.backtrace href="#" onclick="$(this).next().toggle(); return false" = "#{msg['error']['exception']}: #{msg['error']['error']}"
|
29
|
-
pre style="display: none; background: none; border: 0; width: 100%; max-height: 30em; font-size: 0.8em; white-space: nowrap;" == msg['error']['backtrace'].join("<br />")
|
30
|
-
td
|
31
|
-
input.btn.btn-small.add-to-queue type="button" name="run" value="Add to queue" data-args="#{msg['payload']['args'].join(',')}" data-worker="#{@worker}" data-queue="#{msg['queue']}"
|
32
|
-
|
33
|
-
div.row
|
34
|
-
.span5
|
35
|
-
form.form-inline action="#{root_path}manager/worker/#{@worker}/remove" method="post" style="margin: 20px 0"
|
36
|
-
input.btn.btn-danger.btn-small type="submit" name="delete" value="Clear All"
|
37
|
-
.span4
|
38
|
-
== slim :_paging, :locals => { :url => "#{root_path}manager/worker/#{@worker}#@name" }
|
39
|
-
- else
|
40
|
-
.alert.alert-success No recent jobs found.
|
41
|
-
|
42
|
-
javascript:
|
43
|
-
$('input.filter').live('keyup', function() {
|
44
|
-
var rex = new RegExp($(this).val(), 'i');
|
45
|
-
$('.table-striped tbody tr').hide();
|
46
|
-
$('.table-striped tbody tr').filter(function() {
|
47
|
-
return rex.test($(this).text());
|
48
|
-
}).show();
|
49
|
-
});
|
50
|
-
|
51
|
-
$('input.add-to-queue').live('click', function(){
|
52
|
-
var params = {
|
53
|
-
args: prompt('Enter arguments, comma separated', $(this).data('args')),
|
54
|
-
worker: $(this).data('worker'),
|
55
|
-
queue: $(this).data('queue')
|
56
|
-
}
|
57
|
-
|
58
|
-
if (params['args'] != undefined) {
|
59
|
-
$.post('#{root_path}manager/add_to_queue', params, function(data) {
|
60
|
-
window.location = "#{root_path}queues/"+params['queue']
|
61
|
-
});
|
62
|
-
}
|
63
|
-
})
|
@@ -1,36 +0,0 @@
|
|
1
|
-
header.row
|
2
|
-
.span5
|
3
|
-
h3 Recent Jobs
|
4
|
-
|
5
|
-
- if @jobs.length > 0
|
6
|
-
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
|
7
|
-
thead
|
8
|
-
th style="width: 44%" Worker
|
9
|
-
th style="width: 44%" Last run
|
10
|
-
th style="widht: 12%" Action
|
11
|
-
- @jobs.each do |job|
|
12
|
-
tr class="#{job[:last_call]['error'].nil? ? '' : 'error'}"
|
13
|
-
td style="overflow: hidden; text-overflow: ellipsis;"
|
14
|
-
a href="#{root_path}manager/worker/#{job[:name]}"
|
15
|
-
= job[:name]
|
16
|
-
td
|
17
|
-
time datetime="#{Time.parse(job[:last_call]['finished_at']).getutc.iso8601}"
|
18
|
-
= job[:last_call]['finished_at']
|
19
|
-
|
20
|
-
td
|
21
|
-
input.btn.btn-small.add-to-queue type="button" name="run" value="Add to queue" data-worker="#{job[:name]}" data-queue="#{job[:last_call]['queue']}"
|
22
|
-
- else
|
23
|
-
.alert.alert-success No recent jobs found.
|
24
|
-
|
25
|
-
javascript:
|
26
|
-
$('input.add-to-queue').live('click', function(){
|
27
|
-
var params = {
|
28
|
-
args: prompt('Enter arguments, comma separated', $(this).data('args')),
|
29
|
-
worker: $(this).data('worker'),
|
30
|
-
queue: $(this).data('queue')
|
31
|
-
}
|
32
|
-
|
33
|
-
$.post('#{root_path}manager/add_to_queue', params, function(data) {
|
34
|
-
window.location = "#{root_path}queues/"+params['queue']
|
35
|
-
});
|
36
|
-
})
|