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 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: []