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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19931eeaf248acd27f734e6e4769094a65d7e51f
4
- data.tar.gz: bad6f1eb40b6948561dc2388af6ba2e815e266a9
3
+ metadata.gz: d90cb39f5a815e14fe5213ee01ec5ea36b771d02
4
+ data.tar.gz: 1bbe259be1439258e67a380ddf5a9135395123e8
5
5
  SHA512:
6
- metadata.gz: b0a37c7782da5c02cf2e7185b62953d03434f376d55de7dd4b213f58ce3fa707dc33ec2c0a0aa97a27cb7d777f88b13ef7bcfbd378d988bc5060607187174866
7
- data.tar.gz: b5ac7ddb098ab744dc4cd536f8a1ef135fe44f92e7f2491658290b7ef9b43783bb6427ddd7aa1f3c854132855a82fd0cfd5772f51cd7013f115e318b378f8ce8
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 /working directory clean/.match(git_status)
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
@@ -32,7 +32,7 @@ module Qless
32
32
 
33
33
  def safely_send(event)
34
34
  return unless event
35
- ::Raven.send(event)
35
+ ::Raven.send_event(event)
36
36
  rescue
37
37
  # We don't want to silence our errors when the Sentry server
38
38
  # responds with an error. We'll still see the errors on the
@@ -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::Erorr`
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
@@ -115,6 +115,7 @@ module Qless
115
115
 
116
116
  # Make the id acceptable as an id / att in HTML
117
117
  def sanitize_attr(attr)
118
+ return unless attr
118
119
  attr.gsub(/[^a-zA-Z\:\_]/, '-')
119
120
  end
120
121
 
@@ -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
- /* @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
-
1
+ /* For proper failed job display*/
2
+ .l-sidebyside {
3
+ overflow:auto;
71
4
  }
72
5
 
73
- .cancel-button {
74
- background-color: red;
6
+ .l-sidebyside > * {
7
+ display:inline-block;
8
+ *display: inline;
9
+ *zoom: 1;
75
10
  }
76
11
 
77
- .job-tags {
78
- clear: both;
79
- margin-left: 15px;
12
+ .subnav.subnav-failed {
13
+ overflow: hidden;
80
14
  }
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;
15
+ .subnav.full {
16
+ height: auto;
17
+ max-height: 50%;
18
+ overflow-y: scroll;
89
19
  }
90
20
 
91
- .job-summary-container > .job-tags {
92
- float: left;
93
- clear: none;
94
- margin-top: 1px;
21
+ .failed-job > .min-col-size {
22
+ min-width: 395px;
95
23
  }
96
24
 
97
- .job-summary-container > .job-summary {
98
- float: left;
99
- clear: none;
100
- margin-top: -7px;
101
- padding-left: 12px;
25
+ .failed-job .row {
26
+ margin-left:0;
27
+ margin-right:10px;
28
+ height: 30px;
102
29
  }
103
30
 
104
- .job-summary {
105
- clear: both;
106
- padding-top: 10px;
107
- font-size: 16px;
31
+ .subnav-toggle-container {
32
+ text-align: right;
108
33
  }
109
34
 
110
- .job-state, .job-queue, .job-worker {
111
- font-weight: bold;
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
- <ul class="nav nav-pills">
3
- <% failed.sort_by { |f| -f['total'] }.each do |f| %>
4
- <li><a href="#<%= sanitize_attr(f['type']) %>" data-toggle="tab"><%= f['type'] %> (<%= f['total'] %>)</a></li>
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
@@ -1,5 +1,5 @@
1
1
  # Encoding: utf-8
2
2
 
3
3
  module Qless
4
- VERSION = '0.10.5'
4
+ VERSION = '0.11.0'
5
5
  end
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.10.5
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: 2016-11-29 00:00:00.000000000 Z
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: '0.4'
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: '0.4'
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.4
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.4
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.4.5
273
+ rubygems_version: 2.6.13
266
274
  signing_key:
267
275
  specification_version: 4
268
- summary: A Redis-Based Queueing System
276
+ summary: A Redis-based queueing system
269
277
  test_files: []