qless 0.10.5 → 0.11.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/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: []
|