qless 0.10.5 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -1
- data/Rakefile +2 -2
- data/lib/qless/middleware/sentry.rb +1 -1
- data/lib/qless/middleware/timeout.rb +1 -1
- data/lib/qless/server.rb +1 -0
- data/lib/qless/server/static/css/docs.css +0 -21
- data/lib/qless/server/static/css/jquery.noty.css +10 -11
- data/lib/qless/server/static/css/noty_theme_twitter.css +13 -14
- data/lib/qless/server/static/css/resque.css +204 -0
- data/lib/qless/server/static/css/style.css +23 -190
- data/lib/qless/server/views/failed.erb +10 -4
- data/lib/qless/server/views/layout.erb +5 -0
- data/lib/qless/version.rb +1 -1
- metadata +19 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d90cb39f5a815e14fe5213ee01ec5ea36b771d02
|
4
|
+
data.tar.gz: 1bbe259be1439258e67a380ddf5a9135395123e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 997edf93ad4f9b4fd87bdf2058e4355bf995c0fceba227006b31658d69acdb274f85347baa0fa562e85a9a1c540187caeae0ec9e33494ea10cfcf2a3e0531e8b
|
7
|
+
data.tar.gz: acac2dc97737aa5b63785aab8dec49dc688c6f55f1a6abd447e9d0450be3ac274dd261fff6505c7eef97b7a394c100dfdff88b873e11a37f74adb1c4c1b27aeb
|
data/README.md
CHANGED
@@ -299,6 +299,15 @@ end
|
|
299
299
|
For an app using Rails 3+, check the router documentation for how to mount
|
300
300
|
rack apps.
|
301
301
|
|
302
|
+
If you wish to run the web interface from the `exe` directory, you
|
303
|
+
have the option to run the server as a daemon. Running as a daemon is
|
304
|
+
default behavior. To run in the foreground, pass the `--foreground` or
|
305
|
+
`-F` flag:
|
306
|
+
|
307
|
+
```bash
|
308
|
+
PATH_TO_QLESS_DIST/exe/qless-web -F
|
309
|
+
```
|
310
|
+
|
302
311
|
Job Dependencies
|
303
312
|
================
|
304
313
|
Let's say you have one job that depends on another, but the task definitions are
|
@@ -645,6 +654,8 @@ bundle exec rake spec
|
|
645
654
|
|
646
655
|
To change the redis instance used in tests, put the connection information into [`./spec/redis.config.yml`](https://github.com/seomoz/qless/blob/92904532aee82aaf1078957ccadfa6fcd27ae408/spec/spec_helper.rb#L26).
|
647
656
|
|
657
|
+
To help develop the web UI, run `bundle exec ./utils/dev/qless-web-dev` to run the server with seed data.
|
658
|
+
|
648
659
|
To contribute, fork the repo, use feature branches, run the tests and open PRs.
|
649
660
|
|
650
661
|
Mailing List
|
@@ -652,4 +663,3 @@ Mailing List
|
|
652
663
|
|
653
664
|
For questions and general Qless discussion, please join the [Qless
|
654
665
|
Mailing list](https://groups.google.com/forum/?fromgroups#!forum/qless).
|
655
|
-
|
data/Rakefile
CHANGED
@@ -51,8 +51,8 @@ namespace :core do
|
|
51
51
|
desc "Verifies the script has no uncommitted changes"
|
52
52
|
task :clean do
|
53
53
|
script_files.each do |file|
|
54
|
-
git_status = `git status -- #{file}`
|
55
|
-
unless
|
54
|
+
git_status = `git status --porcelain -- #{file}`
|
55
|
+
unless git_status.strip.empty?
|
56
56
|
raise "#{file} is dirty: \n\n#{git_status}\n\n"
|
57
57
|
end
|
58
58
|
end
|
@@ -3,7 +3,7 @@ require 'qless/middleware/requeue_exceptions'
|
|
3
3
|
|
4
4
|
module Qless
|
5
5
|
# Unique error class used when a job is timed out by this middleware.
|
6
|
-
# Allows us to differentiate this timeout from others caused by `::Timeout::
|
6
|
+
# Allows us to differentiate this timeout from others caused by `::Timeout::Error`
|
7
7
|
JobTimedoutError = Class.new(StandardError)
|
8
8
|
InvalidTimeoutError = Class.new(ArgumentError)
|
9
9
|
|
data/lib/qless/server.rb
CHANGED
@@ -816,24 +816,3 @@ form.well {
|
|
816
816
|
}
|
817
817
|
|
818
818
|
}
|
819
|
-
|
820
|
-
/* For proper failed job display*/
|
821
|
-
.l-sidebyside {
|
822
|
-
overflow:auto;
|
823
|
-
}
|
824
|
-
|
825
|
-
.l-sidebyside > * {
|
826
|
-
display:inline-block;
|
827
|
-
*display: inline;
|
828
|
-
*zoom: 1;
|
829
|
-
}
|
830
|
-
|
831
|
-
.failed-job > .min-col-size {
|
832
|
-
min-width: 395px;
|
833
|
-
}
|
834
|
-
|
835
|
-
.failed-job .row {
|
836
|
-
margin-left:0;
|
837
|
-
margin-right:10px;
|
838
|
-
height: 30px;
|
839
|
-
}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
/* CORE STYLES */
|
3
2
|
|
4
3
|
/* noty bar */
|
@@ -7,17 +6,17 @@
|
|
7
6
|
display: none;
|
8
7
|
z-index: 9999999;
|
9
8
|
}
|
10
|
-
|
9
|
+
|
11
10
|
/* noty_message */
|
12
11
|
.noty_bar .noty_message {
|
13
12
|
text-align: center;
|
14
13
|
}
|
15
|
-
|
14
|
+
|
16
15
|
/* noty close button */
|
17
16
|
.noty_bar .noty_close {
|
18
17
|
cursor: pointer;
|
19
18
|
}
|
20
|
-
|
19
|
+
|
21
20
|
/* noty modal */
|
22
21
|
.noty_modal {
|
23
22
|
position: fixed;
|
@@ -30,7 +29,7 @@
|
|
30
29
|
left: 0;
|
31
30
|
top: 0;
|
32
31
|
}
|
33
|
-
|
32
|
+
|
34
33
|
/* noty container for noty_layout_topLeft & noty_layout_topRight */
|
35
34
|
ul.noty_cont {
|
36
35
|
position: fixed;
|
@@ -81,9 +80,9 @@
|
|
81
80
|
.noty_bar.noty_layout_center {
|
82
81
|
top: 40%;
|
83
82
|
}
|
84
|
-
|
83
|
+
|
85
84
|
/* noty_layout_topLeft & noty_layout_topRight */
|
86
|
-
.noty_bar.noty_layout_topLeft,
|
85
|
+
.noty_bar.noty_layout_topLeft,
|
87
86
|
.noty_bar.noty_layout_topRight,
|
88
87
|
.noty_bar.noty_layout_bottomLeft,
|
89
88
|
.noty_bar.noty_layout_bottomRight {
|
@@ -91,15 +90,15 @@
|
|
91
90
|
clear: both;
|
92
91
|
position: relative;
|
93
92
|
}
|
94
|
-
|
95
|
-
.noty_bar.noty_layout_topLeft .noty_message,
|
93
|
+
|
94
|
+
.noty_bar.noty_layout_topLeft .noty_message,
|
96
95
|
.noty_bar.noty_layout_topRight .noty_message,
|
97
96
|
.noty_bar.noty_layout_bottomLeft .noty_message,
|
98
97
|
.noty_bar.noty_layout_bottomRight .noty_message {
|
99
98
|
text-align: left;
|
100
99
|
}
|
101
|
-
|
100
|
+
|
102
101
|
/* noty_layout_topCenter */
|
103
102
|
.noty_bar.noty_layout_topCenter {
|
104
103
|
top: 20px;
|
105
|
-
}
|
104
|
+
}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
/* CORE STYLES*/
|
3
2
|
|
4
3
|
/* noty bar */
|
@@ -8,12 +7,12 @@
|
|
8
7
|
text-shadow: 0 1px 0 #fff;
|
9
8
|
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
10
9
|
}
|
11
|
-
|
10
|
+
|
12
11
|
/* custom container */
|
13
12
|
.noty_custom_container.noty_theme_twitter.noty_layout_inline {
|
14
13
|
position: relative;
|
15
14
|
}
|
16
|
-
|
15
|
+
|
17
16
|
/* custom growl container */
|
18
17
|
.noty_custom_container.noty_theme_twitter.noty_layout_inline .noty_cont.noty_layout_inline {
|
19
18
|
position: static;
|
@@ -29,7 +28,7 @@
|
|
29
28
|
.noty_custom_container.noty_theme_twitter.noty_layout_inline .noty_bar .noty_message .noty_buttons {
|
30
29
|
margin-top: -1px;
|
31
30
|
}
|
32
|
-
|
31
|
+
|
33
32
|
/* noty_message */
|
34
33
|
.noty_bar.noty_theme_twitter .noty_message {
|
35
34
|
padding: 8px 14px;
|
@@ -38,19 +37,19 @@
|
|
38
37
|
.noty_bar.noty_theme_twitter.noty_closable .noty_message {
|
39
38
|
padding: 8px 35px 8px 14px;
|
40
39
|
}
|
41
|
-
|
40
|
+
|
42
41
|
/* noty_buttons */
|
43
42
|
.noty_bar.noty_theme_twitter .noty_message .noty_buttons {
|
44
43
|
float: right;
|
45
44
|
margin-top: -5px;
|
46
45
|
margin-left: 4px;
|
47
46
|
}
|
48
|
-
|
47
|
+
|
49
48
|
/* noty_button */
|
50
49
|
.noty_bar.noty_theme_twitter .noty_message .noty_buttons button {
|
51
50
|
margin-left: 5px;
|
52
51
|
}
|
53
|
-
|
52
|
+
|
54
53
|
/* noty close button */
|
55
54
|
.noty_bar.noty_theme_twitter .noty_close {
|
56
55
|
position: absolute;
|
@@ -63,21 +62,21 @@
|
|
63
62
|
opacity: 0.2;
|
64
63
|
text-shadow: 0 1px 0 #fff;
|
65
64
|
}
|
66
|
-
|
65
|
+
|
67
66
|
/* noty close button hover */
|
68
67
|
.noty_bar.noty_theme_twitter .noty_close:hover {
|
69
68
|
opacity: 0.4;
|
70
69
|
}
|
71
|
-
|
70
|
+
|
72
71
|
.noty_bar.noty_theme_twitter .noty_close:after {
|
73
72
|
content: "x";
|
74
73
|
}
|
75
|
-
|
74
|
+
|
76
75
|
/* noty modal */
|
77
76
|
.noty_modal.noty_theme_twitter {
|
78
77
|
opacity: 0.7;
|
79
78
|
}
|
80
|
-
|
79
|
+
|
81
80
|
/* LAYOUTS */
|
82
81
|
|
83
82
|
/* noty_layout_topLeft & noty_layout_topRight */
|
@@ -102,13 +101,13 @@
|
|
102
101
|
padding-top: 10px;
|
103
102
|
text-align: right;
|
104
103
|
}
|
105
|
-
|
104
|
+
|
106
105
|
.noty_bar.noty_theme_twitter.noty_layout_center .noty_message .noty_buttons,
|
107
106
|
.noty_bar.noty_theme_twitter.noty_layout_topCenter .noty_message .noty_buttons {
|
108
107
|
margin-left: 15px;
|
109
108
|
margin-top: -2px
|
110
109
|
}
|
111
|
-
|
110
|
+
|
112
111
|
/* NOTIFICATION TYPES */
|
113
112
|
|
114
113
|
/* noty_alert */
|
@@ -134,4 +133,4 @@
|
|
134
133
|
background-color: #D9EDF7;
|
135
134
|
border: 1px solid #BCE8F1;
|
136
135
|
color: #3A87AD;
|
137
|
-
}
|
136
|
+
}
|
@@ -0,0 +1,204 @@
|
|
1
|
+
/* @override http://localhost:4567/css/style.css */
|
2
|
+
|
3
|
+
/* Shamelessly poached from resque
|
4
|
+
SEOmoz Blue: #4d87e2;
|
5
|
+
*/
|
6
|
+
|
7
|
+
.queue-name {
|
8
|
+
font-size: 25px;
|
9
|
+
font-weight: bold;
|
10
|
+
}
|
11
|
+
|
12
|
+
.queue-summary {
|
13
|
+
font-size: 20px;
|
14
|
+
}
|
15
|
+
|
16
|
+
.queue-summary-description {
|
17
|
+
font-size: 12px;
|
18
|
+
color: lightgrey;
|
19
|
+
}
|
20
|
+
|
21
|
+
.queue-stats {
|
22
|
+
margin-top: 10px;
|
23
|
+
}
|
24
|
+
|
25
|
+
.queue-stats-date {}
|
26
|
+
.queue-stats-failures {}
|
27
|
+
.queue-stats-time {}
|
28
|
+
.queue-stats-wait {}
|
29
|
+
|
30
|
+
.queue-stats-time-title {
|
31
|
+
font-size: 20px;
|
32
|
+
width: 100%;
|
33
|
+
text-align: center;
|
34
|
+
margin-bottom: 10px;
|
35
|
+
margin-top: 10px;
|
36
|
+
}
|
37
|
+
|
38
|
+
.queue-stats-time-summary {
|
39
|
+
text-align: center;
|
40
|
+
}
|
41
|
+
|
42
|
+
.queue-stats-time-histogram-wait {}
|
43
|
+
.queue-stats-time-histogram-run {}
|
44
|
+
|
45
|
+
.job-id {
|
46
|
+
float: left;
|
47
|
+
font-size: 20px;
|
48
|
+
font-weight: bold;
|
49
|
+
padding-bottom: 10px;
|
50
|
+
}
|
51
|
+
|
52
|
+
.job-priority {
|
53
|
+
font-size: 16px;
|
54
|
+
padding-left: 5px;
|
55
|
+
}
|
56
|
+
|
57
|
+
.button {
|
58
|
+
background-color: darkgray;
|
59
|
+
float: left;
|
60
|
+
-webkit-border-radius: 5px;
|
61
|
+
-moz-border-radius: 5px;
|
62
|
+
border-radius: 5px;
|
63
|
+
color: white;
|
64
|
+
font-weight: bold;
|
65
|
+
padding-top: 2px;
|
66
|
+
padding-left: 7px;
|
67
|
+
padding-right: 7px;
|
68
|
+
padding-bottom: 3px;
|
69
|
+
margin-left: 5px;
|
70
|
+
|
71
|
+
}
|
72
|
+
|
73
|
+
.cancel-button {
|
74
|
+
background-color: red;
|
75
|
+
}
|
76
|
+
|
77
|
+
.job-tags {
|
78
|
+
clear: both;
|
79
|
+
margin-left: 15px;
|
80
|
+
}
|
81
|
+
|
82
|
+
.job-tag {
|
83
|
+
border: none;
|
84
|
+
-webkit-border-radius: 15px;
|
85
|
+
-moz-border-radius: 15px;
|
86
|
+
border-radius: 15px;
|
87
|
+
padding-left: 10px;
|
88
|
+
padding-right: 10px;
|
89
|
+
}
|
90
|
+
|
91
|
+
.job-summary-container > .job-tags {
|
92
|
+
float: left;
|
93
|
+
clear: none;
|
94
|
+
margin-top: 1px;
|
95
|
+
}
|
96
|
+
|
97
|
+
.job-summary-container > .job-summary {
|
98
|
+
float: left;
|
99
|
+
clear: none;
|
100
|
+
margin-top: -7px;
|
101
|
+
padding-left: 12px;
|
102
|
+
}
|
103
|
+
|
104
|
+
.job-summary {
|
105
|
+
clear: both;
|
106
|
+
padding-top: 10px;
|
107
|
+
font-size: 16px;
|
108
|
+
}
|
109
|
+
|
110
|
+
.job-state, .job-queue, .job-worker {
|
111
|
+
font-weight: bold;
|
112
|
+
}
|
113
|
+
|
114
|
+
.job-data-container {
|
115
|
+
margin-top: 10px;
|
116
|
+
border: 2px solid black;
|
117
|
+
}
|
118
|
+
|
119
|
+
html { background:#efefef; font-family:Arial, Verdana, sans-serif; font-size:13px; }
|
120
|
+
body { padding:0; margin:0; }
|
121
|
+
|
122
|
+
.header { background:#000; padding:8px 5% 0 5%; border-bottom:1px solid #444;border-bottom:5px solid #4d87e2;}
|
123
|
+
.header h1 { color:#333; font-size:90%; font-weight:bold; margin-bottom:6px;}
|
124
|
+
.header ul li { display:inline;}
|
125
|
+
.header ul li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; padding:8px; -webkit-border-top-right-radius:6px; -webkit-border-top-left-radius:6px; -moz-border-radius-topleft:6px; -moz-border-radius-topright:6px; }
|
126
|
+
.header ul li a:hover { background:#333;}
|
127
|
+
.header ul li.current a { background:#ce1212; font-weight:bold; color:#fff;}
|
128
|
+
|
129
|
+
.header .namespace { position: absolute; right: 75px; top: 10px; color: #7A7A7A; }
|
130
|
+
|
131
|
+
.subnav { padding:2px 5% 7px 5%; background:#ce1212; font-size:90%;}
|
132
|
+
.subnav li { display:inline;}
|
133
|
+
.subnav li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; background:#dd5b5b; padding:5px; -webkit-border-radius:3px; -moz-border-radius:3px;}
|
134
|
+
.subnav li.current a { background:#fff; font-weight:bold; color:#ce1212;}
|
135
|
+
.subnav li a:active { background:#b00909;}
|
136
|
+
|
137
|
+
#main { padding:10px 5%; background:#fff; overflow:hidden; }
|
138
|
+
#main .logo { float:right; margin:10px;}
|
139
|
+
#main span.hl { background:#efefef; padding:2px;}
|
140
|
+
#main h1 { margin:10px 0; font-size:190%; font-weight:bold; color:#ce1212;}
|
141
|
+
#main h2 { margin:10px 0; font-size:130%;}
|
142
|
+
#main table { width:100%; margin:10px 0;}
|
143
|
+
#main table tr td, #main table tr th { border:1px solid #ccc; padding:6px;}
|
144
|
+
#main table tr th { background:#efefef; color:#888; font-size:80%; font-weight:bold;}
|
145
|
+
#main table tr td.no-data { text-align:center; padding:40px 0; color:#999; font-style:italic; font-size:130%;}
|
146
|
+
#main a { color:#111;}
|
147
|
+
#main p { margin:5px 0;}
|
148
|
+
#main p.intro { margin-bottom:15px; font-size:85%; color:#999; margin-top:0; line-height:1.3;}
|
149
|
+
#main h1.wi { margin-bottom:5px;}
|
150
|
+
#main p.sub { font-size:95%; color:#999;}
|
151
|
+
|
152
|
+
#main table.queues { width:40%;}
|
153
|
+
#main table.queues td.queue { font-weight:bold; width:50%;}
|
154
|
+
#main table.queues tr.failed td { border-top:2px solid; font-size:90%; }
|
155
|
+
#main table.queues tr.failure td { background:#ffecec; border-top:2px solid #d37474; font-size:90%; color:#d37474;}
|
156
|
+
#main table.queues tr.failure td a{ color:#d37474;}
|
157
|
+
|
158
|
+
#main table.jobs td.class { font-family:Monaco, "Courier New", monospace; font-size:90%; width:50%;}
|
159
|
+
#main table.jobs td.args{ width:50%;}
|
160
|
+
|
161
|
+
#main table.workers td.icon {width:1%; background:#efefef;text-align:center;}
|
162
|
+
#main table.workers td.icon img { height: 16px; width: 16px; }
|
163
|
+
#main table.workers td.where { width:25%;}
|
164
|
+
#main table.workers td.queues { width:35%;}
|
165
|
+
#main .queue-tag { background:#b1d2e9; padding:2px; margin:0 3px; font-size:80%; text-decoration:none; text-transform:uppercase; font-weight:bold; color:#3274a2; -webkit-border-radius:4px; -moz-border-radius:4px;}
|
166
|
+
#main table.workers td.queues.queue { width:10%;}
|
167
|
+
#main table.workers td.process { width:35%;}
|
168
|
+
#main table.workers td.process span.waiting { color:#999; font-size:90%;}
|
169
|
+
#main table.workers td.process small { font-size:80%; margin-left:5px;}
|
170
|
+
#main table.workers td.process code { font-family:Monaco, "Courier New", monospace; font-size:90%;}
|
171
|
+
#main table.workers td.process small a { color:#999;}
|
172
|
+
#main.polling table.workers tr.working td { background:#f4ffe4; color:#7ac312;}
|
173
|
+
#main.polling table.workers tr.working td.where a { color:#7ac312;}
|
174
|
+
#main.polling table.workers tr.working td.process code { font-weight:bold;}
|
175
|
+
|
176
|
+
|
177
|
+
#main table.stats th { font-size:100%; width:40%; color:#000;}
|
178
|
+
#main hr { border:0; border-top:5px solid #efefef; margin:15px 0;}
|
179
|
+
|
180
|
+
#footer { padding:10px 5%; background:#efefef; color:#999; font-size:85%; line-height:1.5; border-top:5px solid #ccc; padding-top:10px;}
|
181
|
+
#footer p a { color:#999;}
|
182
|
+
|
183
|
+
#main p.poll { background:url(poll.png) no-repeat 0 2px; padding:3px 0; padding-left:23px; float:right; font-size:85%; }
|
184
|
+
|
185
|
+
#main ul.failed {}
|
186
|
+
#main ul.failed li {background:-webkit-gradient(linear, left top, left bottom, from(#efefef), to(#fff)) #efefef; margin-top:10px; padding:10px; overflow:hidden; -webkit-border-radius:5px; border:1px solid #ccc; }
|
187
|
+
#main ul.failed li dl dt {font-size:80%; color:#999; width:60px; float:left; padding-top:1px; text-align:right;}
|
188
|
+
#main ul.failed li dl dd {margin-bottom:10px; margin-left:70px;}
|
189
|
+
#main ul.failed li dl dd .retried { float:right; text-align: right; }
|
190
|
+
#main ul.failed li dl dd .retried .remove { display:none; margin-top: 8px; }
|
191
|
+
#main ul.failed li.hover dl dd .retried .remove { display:block; }
|
192
|
+
#main ul.failed li dl dd .controls { display:none; float:right; }
|
193
|
+
#main ul.failed li.hover dl dd .controls { display:block; }
|
194
|
+
#main ul.failed li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%; white-space: pre-wrap;}
|
195
|
+
#main ul.failed li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; }
|
196
|
+
#main ul.failed li dl dd.error pre { margin-top:3px; line-height:1.3;}
|
197
|
+
|
198
|
+
#main p.pagination { background:#efefef; padding:10px; overflow:hidden;}
|
199
|
+
#main p.pagination a.less { float:left;}
|
200
|
+
#main p.pagination a.more { float:right;}
|
201
|
+
|
202
|
+
#main form {float:right; margin-top:-10px;margin-left:10px;}
|
203
|
+
|
204
|
+
#main .time a.toggle_format {text-decoration:none;}
|
@@ -1,204 +1,37 @@
|
|
1
|
-
/*
|
2
|
-
|
3
|
-
|
4
|
-
SEOmoz Blue: #4d87e2;
|
5
|
-
*/
|
6
|
-
|
7
|
-
.queue-name {
|
8
|
-
font-size: 25px;
|
9
|
-
font-weight: bold;
|
10
|
-
}
|
11
|
-
|
12
|
-
.queue-summary {
|
13
|
-
font-size: 20px;
|
14
|
-
}
|
15
|
-
|
16
|
-
.queue-summary-description {
|
17
|
-
font-size: 12px;
|
18
|
-
color: lightgrey;
|
19
|
-
}
|
20
|
-
|
21
|
-
.queue-stats {
|
22
|
-
margin-top: 10px;
|
23
|
-
}
|
24
|
-
|
25
|
-
.queue-stats-date {}
|
26
|
-
.queue-stats-failures {}
|
27
|
-
.queue-stats-time {}
|
28
|
-
.queue-stats-wait {}
|
29
|
-
|
30
|
-
.queue-stats-time-title {
|
31
|
-
font-size: 20px;
|
32
|
-
width: 100%;
|
33
|
-
text-align: center;
|
34
|
-
margin-bottom: 10px;
|
35
|
-
margin-top: 10px;
|
36
|
-
}
|
37
|
-
|
38
|
-
.queue-stats-time-summary {
|
39
|
-
text-align: center;
|
40
|
-
}
|
41
|
-
|
42
|
-
.queue-stats-time-histogram-wait {}
|
43
|
-
.queue-stats-time-histogram-run {}
|
44
|
-
|
45
|
-
.job-id {
|
46
|
-
float: left;
|
47
|
-
font-size: 20px;
|
48
|
-
font-weight: bold;
|
49
|
-
padding-bottom: 10px;
|
50
|
-
}
|
51
|
-
|
52
|
-
.job-priority {
|
53
|
-
font-size: 16px;
|
54
|
-
padding-left: 5px;
|
55
|
-
}
|
56
|
-
|
57
|
-
.button {
|
58
|
-
background-color: darkgray;
|
59
|
-
float: left;
|
60
|
-
-webkit-border-radius: 5px;
|
61
|
-
-moz-border-radius: 5px;
|
62
|
-
border-radius: 5px;
|
63
|
-
color: white;
|
64
|
-
font-weight: bold;
|
65
|
-
padding-top: 2px;
|
66
|
-
padding-left: 7px;
|
67
|
-
padding-right: 7px;
|
68
|
-
padding-bottom: 3px;
|
69
|
-
margin-left: 5px;
|
70
|
-
|
1
|
+
/* For proper failed job display*/
|
2
|
+
.l-sidebyside {
|
3
|
+
overflow:auto;
|
71
4
|
}
|
72
5
|
|
73
|
-
.
|
74
|
-
|
6
|
+
.l-sidebyside > * {
|
7
|
+
display:inline-block;
|
8
|
+
*display: inline;
|
9
|
+
*zoom: 1;
|
75
10
|
}
|
76
11
|
|
77
|
-
.
|
78
|
-
|
79
|
-
margin-left: 15px;
|
12
|
+
.subnav.subnav-failed {
|
13
|
+
overflow: hidden;
|
80
14
|
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
-moz-border-radius: 15px;
|
86
|
-
border-radius: 15px;
|
87
|
-
padding-left: 10px;
|
88
|
-
padding-right: 10px;
|
15
|
+
.subnav.full {
|
16
|
+
height: auto;
|
17
|
+
max-height: 50%;
|
18
|
+
overflow-y: scroll;
|
89
19
|
}
|
90
20
|
|
91
|
-
.job
|
92
|
-
|
93
|
-
clear: none;
|
94
|
-
margin-top: 1px;
|
21
|
+
.failed-job > .min-col-size {
|
22
|
+
min-width: 395px;
|
95
23
|
}
|
96
24
|
|
97
|
-
.job
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
padding-left: 12px;
|
25
|
+
.failed-job .row {
|
26
|
+
margin-left:0;
|
27
|
+
margin-right:10px;
|
28
|
+
height: 30px;
|
102
29
|
}
|
103
30
|
|
104
|
-
.
|
105
|
-
|
106
|
-
padding-top: 10px;
|
107
|
-
font-size: 16px;
|
31
|
+
.subnav-toggle-container {
|
32
|
+
text-align: right;
|
108
33
|
}
|
109
34
|
|
110
|
-
.
|
111
|
-
|
35
|
+
.subnav-toggle-container .btn {
|
36
|
+
padding: 8px 10px;
|
112
37
|
}
|
113
|
-
|
114
|
-
.job-data-container {
|
115
|
-
margin-top: 10px;
|
116
|
-
border: 2px solid black;
|
117
|
-
}
|
118
|
-
|
119
|
-
html { background:#efefef; font-family:Arial, Verdana, sans-serif; font-size:13px; }
|
120
|
-
body { padding:0; margin:0; }
|
121
|
-
|
122
|
-
.header { background:#000; padding:8px 5% 0 5%; border-bottom:1px solid #444;border-bottom:5px solid #4d87e2;}
|
123
|
-
.header h1 { color:#333; font-size:90%; font-weight:bold; margin-bottom:6px;}
|
124
|
-
.header ul li { display:inline;}
|
125
|
-
.header ul li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; padding:8px; -webkit-border-top-right-radius:6px; -webkit-border-top-left-radius:6px; -moz-border-radius-topleft:6px; -moz-border-radius-topright:6px; }
|
126
|
-
.header ul li a:hover { background:#333;}
|
127
|
-
.header ul li.current a { background:#ce1212; font-weight:bold; color:#fff;}
|
128
|
-
|
129
|
-
.header .namespace { position: absolute; right: 75px; top: 10px; color: #7A7A7A; }
|
130
|
-
|
131
|
-
.subnav { padding:2px 5% 7px 5%; background:#ce1212; font-size:90%;}
|
132
|
-
.subnav li { display:inline;}
|
133
|
-
.subnav li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; background:#dd5b5b; padding:5px; -webkit-border-radius:3px; -moz-border-radius:3px;}
|
134
|
-
.subnav li.current a { background:#fff; font-weight:bold; color:#ce1212;}
|
135
|
-
.subnav li a:active { background:#b00909;}
|
136
|
-
|
137
|
-
#main { padding:10px 5%; background:#fff; overflow:hidden; }
|
138
|
-
#main .logo { float:right; margin:10px;}
|
139
|
-
#main span.hl { background:#efefef; padding:2px;}
|
140
|
-
#main h1 { margin:10px 0; font-size:190%; font-weight:bold; color:#ce1212;}
|
141
|
-
#main h2 { margin:10px 0; font-size:130%;}
|
142
|
-
#main table { width:100%; margin:10px 0;}
|
143
|
-
#main table tr td, #main table tr th { border:1px solid #ccc; padding:6px;}
|
144
|
-
#main table tr th { background:#efefef; color:#888; font-size:80%; font-weight:bold;}
|
145
|
-
#main table tr td.no-data { text-align:center; padding:40px 0; color:#999; font-style:italic; font-size:130%;}
|
146
|
-
#main a { color:#111;}
|
147
|
-
#main p { margin:5px 0;}
|
148
|
-
#main p.intro { margin-bottom:15px; font-size:85%; color:#999; margin-top:0; line-height:1.3;}
|
149
|
-
#main h1.wi { margin-bottom:5px;}
|
150
|
-
#main p.sub { font-size:95%; color:#999;}
|
151
|
-
|
152
|
-
#main table.queues { width:40%;}
|
153
|
-
#main table.queues td.queue { font-weight:bold; width:50%;}
|
154
|
-
#main table.queues tr.failed td { border-top:2px solid; font-size:90%; }
|
155
|
-
#main table.queues tr.failure td { background:#ffecec; border-top:2px solid #d37474; font-size:90%; color:#d37474;}
|
156
|
-
#main table.queues tr.failure td a{ color:#d37474;}
|
157
|
-
|
158
|
-
#main table.jobs td.class { font-family:Monaco, "Courier New", monospace; font-size:90%; width:50%;}
|
159
|
-
#main table.jobs td.args{ width:50%;}
|
160
|
-
|
161
|
-
#main table.workers td.icon {width:1%; background:#efefef;text-align:center;}
|
162
|
-
#main table.workers td.icon img { height: 16px; width: 16px; }
|
163
|
-
#main table.workers td.where { width:25%;}
|
164
|
-
#main table.workers td.queues { width:35%;}
|
165
|
-
#main .queue-tag { background:#b1d2e9; padding:2px; margin:0 3px; font-size:80%; text-decoration:none; text-transform:uppercase; font-weight:bold; color:#3274a2; -webkit-border-radius:4px; -moz-border-radius:4px;}
|
166
|
-
#main table.workers td.queues.queue { width:10%;}
|
167
|
-
#main table.workers td.process { width:35%;}
|
168
|
-
#main table.workers td.process span.waiting { color:#999; font-size:90%;}
|
169
|
-
#main table.workers td.process small { font-size:80%; margin-left:5px;}
|
170
|
-
#main table.workers td.process code { font-family:Monaco, "Courier New", monospace; font-size:90%;}
|
171
|
-
#main table.workers td.process small a { color:#999;}
|
172
|
-
#main.polling table.workers tr.working td { background:#f4ffe4; color:#7ac312;}
|
173
|
-
#main.polling table.workers tr.working td.where a { color:#7ac312;}
|
174
|
-
#main.polling table.workers tr.working td.process code { font-weight:bold;}
|
175
|
-
|
176
|
-
|
177
|
-
#main table.stats th { font-size:100%; width:40%; color:#000;}
|
178
|
-
#main hr { border:0; border-top:5px solid #efefef; margin:15px 0;}
|
179
|
-
|
180
|
-
#footer { padding:10px 5%; background:#efefef; color:#999; font-size:85%; line-height:1.5; border-top:5px solid #ccc; padding-top:10px;}
|
181
|
-
#footer p a { color:#999;}
|
182
|
-
|
183
|
-
#main p.poll { background:url(poll.png) no-repeat 0 2px; padding:3px 0; padding-left:23px; float:right; font-size:85%; }
|
184
|
-
|
185
|
-
#main ul.failed {}
|
186
|
-
#main ul.failed li {background:-webkit-gradient(linear, left top, left bottom, from(#efefef), to(#fff)) #efefef; margin-top:10px; padding:10px; overflow:hidden; -webkit-border-radius:5px; border:1px solid #ccc; }
|
187
|
-
#main ul.failed li dl dt {font-size:80%; color:#999; width:60px; float:left; padding-top:1px; text-align:right;}
|
188
|
-
#main ul.failed li dl dd {margin-bottom:10px; margin-left:70px;}
|
189
|
-
#main ul.failed li dl dd .retried { float:right; text-align: right; }
|
190
|
-
#main ul.failed li dl dd .retried .remove { display:none; margin-top: 8px; }
|
191
|
-
#main ul.failed li.hover dl dd .retried .remove { display:block; }
|
192
|
-
#main ul.failed li dl dd .controls { display:none; float:right; }
|
193
|
-
#main ul.failed li.hover dl dd .controls { display:block; }
|
194
|
-
#main ul.failed li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%; white-space: pre-wrap;}
|
195
|
-
#main ul.failed li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; }
|
196
|
-
#main ul.failed li dl dd.error pre { margin-top:3px; line-height:1.3;}
|
197
|
-
|
198
|
-
#main p.pagination { background:#efefef; padding:10px; overflow:hidden;}
|
199
|
-
#main p.pagination a.less { float:left;}
|
200
|
-
#main p.pagination a.more { float:right;}
|
201
|
-
|
202
|
-
#main form {float:right; margin-top:-10px;margin-left:10px;}
|
203
|
-
|
204
|
-
#main .time a.toggle_format {text-decoration:none;}
|
@@ -1,7 +1,13 @@
|
|
1
|
-
<div class="subnav subnav-fixed">
|
2
|
-
<
|
3
|
-
|
4
|
-
|
1
|
+
<div class="subnav subnav-fixed subnav-failed">
|
2
|
+
<div class="subnav-toggle-container pull-right">
|
3
|
+
<a class="btn" onclick="toggleSubNavHeight()">+</a>
|
4
|
+
</div>
|
5
|
+
<% sorted_failed = failed.sort_by { |f| -f['total'] } %>
|
6
|
+
<ul class="nav nav-pills failed-list">
|
7
|
+
<% sorted_failed.each do |f| %>
|
8
|
+
<li>
|
9
|
+
<a href="#<%= sanitize_attr(f['type']) %>" data-toggle="tab"><%= f['type'] %> (<%= f['total'] %>)</a>
|
10
|
+
</li>
|
5
11
|
<% end %>
|
6
12
|
</ul>
|
7
13
|
</div>
|
@@ -12,6 +12,7 @@
|
|
12
12
|
<link href="<%= u '/css/docs.css' %>" rel="stylesheet">
|
13
13
|
<link href="<%= u '/css/jquery.noty.css' %>" rel="stylesheet">
|
14
14
|
<link href="<%= u '/css/noty_theme_twitter.css' %>" rel="stylesheet">
|
15
|
+
<link href="<%= u '/css/style.css' %>" rel="stylesheet">
|
15
16
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
|
16
17
|
|
17
18
|
<style type="text/css">
|
@@ -331,6 +332,10 @@
|
|
331
332
|
})
|
332
333
|
}
|
333
334
|
|
335
|
+
var toggleSubNavHeight = function() {
|
336
|
+
$('.subnav-fixed').toggleClass('full');
|
337
|
+
}
|
338
|
+
|
334
339
|
$(document).ready(function() {
|
335
340
|
$('button').tooltip({delay:200});
|
336
341
|
});
|
data/lib/qless/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Lecocq
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-12-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: metriks
|
@@ -65,28 +65,34 @@ dependencies:
|
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.15.6
|
69
69
|
type: :runtime
|
70
70
|
prerelease: false
|
71
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 0.15.6
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
77
|
name: sinatra
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.3'
|
83
|
+
- - "<"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '2.1'
|
83
86
|
type: :runtime
|
84
87
|
prerelease: false
|
85
88
|
version_requirements: !ruby/object:Gem::Requirement
|
86
89
|
requirements:
|
87
|
-
- - "
|
90
|
+
- - ">="
|
88
91
|
- !ruby/object:Gem::Version
|
89
92
|
version: '1.3'
|
93
|
+
- - "<"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '2.1'
|
90
96
|
- !ruby/object:Gem::Dependency
|
91
97
|
name: statsd-ruby
|
92
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,14 +113,14 @@ dependencies:
|
|
107
113
|
requirements:
|
108
114
|
- - "~>"
|
109
115
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.6
|
116
|
+
version: '1.6'
|
111
117
|
type: :runtime
|
112
118
|
prerelease: false
|
113
119
|
version_requirements: !ruby/object:Gem::Requirement
|
114
120
|
requirements:
|
115
121
|
- - "~>"
|
116
122
|
- !ruby/object:Gem::Version
|
117
|
-
version: 1.6
|
123
|
+
version: '1.6'
|
118
124
|
- !ruby/object:Gem::Dependency
|
119
125
|
name: thor
|
120
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -195,6 +201,7 @@ files:
|
|
195
201
|
- lib/qless/server/static/css/docs.css
|
196
202
|
- lib/qless/server/static/css/jquery.noty.css
|
197
203
|
- lib/qless/server/static/css/noty_theme_twitter.css
|
204
|
+
- lib/qless/server/static/css/resque.css
|
198
205
|
- lib/qless/server/static/css/style.css
|
199
206
|
- lib/qless/server/static/favicon.ico
|
200
207
|
- lib/qless/server/static/img/glyphicons-halflings-white.png
|
@@ -244,7 +251,8 @@ files:
|
|
244
251
|
- lib/qless/worker/forking.rb
|
245
252
|
- lib/qless/worker/serial.rb
|
246
253
|
homepage: http://github.com/seomoz/qless
|
247
|
-
licenses:
|
254
|
+
licenses:
|
255
|
+
- MIT
|
248
256
|
metadata: {}
|
249
257
|
post_install_message:
|
250
258
|
rdoc_options: []
|
@@ -262,8 +270,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
262
270
|
version: '0'
|
263
271
|
requirements: []
|
264
272
|
rubyforge_project: qless
|
265
|
-
rubygems_version: 2.
|
273
|
+
rubygems_version: 2.6.13
|
266
274
|
signing_key:
|
267
275
|
specification_version: 4
|
268
|
-
summary: A Redis-
|
276
|
+
summary: A Redis-based queueing system
|
269
277
|
test_files: []
|