resque-web 0.0.4 → 0.0.5
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 +13 -0
- data/app/assets/javascripts/resque_web/application.js +0 -89
- data/app/assets/javascripts/resque_web/failure.js.coffee +7 -0
- data/app/assets/javascripts/resque_web/polling.js.coffee +25 -0
- data/app/assets/javascripts/resque_web/relative_date.js.coffee +27 -0
- data/app/assets/stylesheets/resque_web/{bootstrap_and_overrides.css.erb → bootstrap_and_overrides.css.scss} +1 -1
- data/app/controllers/resque_web/application_controller.rb +2 -0
- data/app/controllers/resque_web/queues_controller.rb +5 -0
- data/app/controllers/resque_web/stats_controller.rb +24 -5
- data/app/controllers/resque_web/workers_controller.rb +6 -1
- data/app/controllers/resque_web/working_controller.rb +4 -0
- data/app/helpers/resque_web/application_helper.rb +10 -6
- data/app/helpers/resque_web/failures_helper.rb +4 -0
- data/app/views/layouts/resque_web/application.html.erb +1 -1
- data/app/views/resque_web/failures/index.html.erb +18 -19
- data/app/views/resque_web/queues/show.html.erb +2 -2
- data/app/views/resque_web/stats/keys.html.erb +2 -4
- data/config/routes.rb +5 -1
- data/lib/resque_web/engine.rb +5 -0
- data/lib/resque_web/version.rb +1 -1
- data/test/dummy/log/development.log +2148 -0
- data/test/dummy/log/test.log +12499 -0
- data/test/dummy/tmp/cache/assets/development/sass/3700e9ce5293267736ba97e0c26f3d47c0831f78/bootstrap_and_overrides.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/267d0243760c55e0ff8039158fbfa98d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/27702049a9de2629f2ed91cdd31be59f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/373b0c58027ae58f732cc7e48e62a522 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/492baca6c94c6497c4cd84a8be19c680 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4d22200fb380d8ae9d5f07525088622f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5a6bde0acfcefec77d80e353647b009d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/62048721da4f3b03c45790b988031b97 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/68ef5c7f933ca591803bc207c78523d2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7cc1cf7c3cfd0a98060c98f3854c2623 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/823cf0a4ada4a293acf5ea2c94d0fe51 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8fbf100e961e22baca23d1850b41e4d5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a14b14c6f9b0cc8813ccef7ebe52b946 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a476c44dad10844e0f468821badf02fd +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b32b680312dc848727e94d9a05750037 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b6f28ccc1808230b8d7f937253be2112 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ccbf15c47a87da505803a6a215148d3a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d9f00b466d45c065d1281b100de9311f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e05ff4f8801c918dc89fef1d37880568 +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/3700e9ce5293267736ba97e0c26f3d47c0831f78/bootstrap_and_overrides.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/02fc0f32ed6d2b2e5865bfdf79df6ae5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/032c0d9725e6f257678ff460b7ec61da +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/0351bddf9b742970e5e314f04138c3cf +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/0b685878ca84b0dd82f9836bd70d7340 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/0fbf718cb07a27a132ae7edba954fb40 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/15ec19285d7eabe2154ec51a428dc21c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/195ca31a7cf5107a657fb2d90e8dc35c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/256f88a09b236d9ddbde7985826d274d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/267d0243760c55e0ff8039158fbfa98d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/27702049a9de2629f2ed91cdd31be59f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/29f5fe6a38dbf15c9c6540d227e466d8 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2a9f8ccd705f08ca1a66ef68d0967655 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2ab37c1672b566feb5086d1efce4ef06 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2d13e89fb36400e53d9d1f772a7306d3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/323ae466a976c736904d337e04a77f0f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/32fdb0387d5cd8aba5f0185f10ccaf6b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3300fcbaadb94dfc76a5e15a917d2a5c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3404b8d7ffc0f3f7fb3f8c09a820ae2d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/34e1f36ce83865719fa7b26a65e34fba +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/373b0c58027ae58f732cc7e48e62a522 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/395fd7e9d9dd28f6a1a225902df3d1b3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3af7b9731ca77394a5e3cd5484e047b3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3b603e358acbce7d4e6c7e53be5a8414 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/404fe327fe27745a105909c9d0d7dc0e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/429d37a3143b763262f09380204b6e7e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4703603e63c6b5332b1710c8f80df833 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4830cd721ae6d64fb5a86d30393ab181 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/492baca6c94c6497c4cd84a8be19c680 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4b4f58fffb5873ecfe6f0feb8eaa0de6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4d22200fb380d8ae9d5f07525088622f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4db5ecfa8e71040f6b070f2fe5d8830a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4ff25675e9d69ac5d68dff1d4372f3d1 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/57db68673f85a8f19a095060304788f1 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/58209bfedfa5a8913da17d9dfe378ee5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/58c189068622a1bf78f759f8f7851143 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5af3b0789d5082831e9eaa717c4f0c3e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/62566022f4deb51d6a7ebc74ed5e0077 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/64369bdb2598739d4b56d393e84a2fc2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/64ea7d9eaa6f2720d29f54d945cf527e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/68ef5c7f933ca591803bc207c78523d2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6abca5d2fa4f208d859608aaab9a86aa +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6b333684cc88cc858701e0ff2a0fcc96 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6ceaff99fe282a7a75bb97f927d693dd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6e7acd6f7443db46070d24f98875e26b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/700f27aaa765d8d3752a1a26a0e2b6de +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/718edbc6b6e91350bc4f9c696ba2eabe +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/722f2a204ab15e0261bc526aa3ea4a3d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/79965bea5ecea07173592c30b2d7cd4a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7a2aaf3f4f2464cab9a6a546516d6093 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7cc1cf7c3cfd0a98060c98f3854c2623 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7dcef8f4767eeae44ff2368ed119f80d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7e982e844962031ecd1bfc047979da8e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/81cde34de1dc552dabbc5f1cb007756a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/822f558a291238c0e1243baa05dc0078 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/823cf0a4ada4a293acf5ea2c94d0fe51 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8347d8bab74b0f7d886d8956383f9529 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/854305634174de2dfc6115e0d05de74a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/871f29c20b88dc490ec27567227d0ced +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8855c560fba1bd85e26f55568144a4d5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8d90527f6d78f66cd9a0e1b6d80540ea +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8db5e0838ccc7af599bed9d1583d9536 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8e526dc1a43ba261ea96cc7d60a38f3f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8ede852c2a9449d78c01e89499f273e5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8f0bb559073ecfcd453b2edf3b3942d9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8fbf100e961e22baca23d1850b41e4d5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/90bf5c76a5b601d800906b8f3378cd4a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/946024650dc58c11ad04e5276406dbaf +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9950bbaad1c8200f7c5211be2ff9dde9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9ab5bb1f2843f449ae54518739b99fe0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9bae2543ee8034cbd1cb0dc7fdb66551 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a476c44dad10844e0f468821badf02fd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a491611d8a81efd7b36e6598d7164775 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a5338dffdab56b5e26f8cb798f3d3fbd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a86260e43f4af99c33552e1d15c1beff +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a8daa7ca89f875fa27015cfbed019daf +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a8ffd37644d986072d5bdb95109200fd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a97936f8de2ec1ac226ff6adfa10c58a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/aa129daab62391fd5a7e4da2629c16c3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ab9f83c297cdf1b77e2757ac42bd046e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ac46bc10e41a078e53c502585d18a2fd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/b32b680312dc848727e94d9a05750037 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/b66838b2bbafc524cb33bcf0245bb634 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c14a109a9ad16a532a14457fd85ef40d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c50a3882a8af8120296e694171a75a76 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c7c8b271f30a25ebed6ed14122a73d8d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c8d75f093577f5a4d8371b8097c1d2a0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c90e9c573e54b170859449cb2ceb3a7a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ccbf15c47a87da505803a6a215148d3a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d2c9ab6cb2ffab9203c49e8aa8a8638a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d3347e44949d8909be6fb1d64cfb9967 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d3b37b59d7bfbff886d5fe9196331477 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d572fd50d855d3cfca311d6a7d613483 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d9f00b466d45c065d1281b100de9311f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/da24d6ed6605c160606df54829bd2243 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/db86602761e31ddd6facdfdf79b09545 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/dc94fd89d95deffd26d73a2dc7839c5c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/de8c7c42ab9ce204bd092917cab19b7b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/df621608c5dbad64a79460c92a787133 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/df794e3dae763f3ff0c96f05147eadc6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e05ff4f8801c918dc89fef1d37880568 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e48e226b900fedce58cd317408956ddf +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e49c4d8ec8434e5f0015f356cd1b9e62 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e4b617370a479f0edc146ad94b472b46 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e71835fce5a1cd93cf2d176e8d72c34a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e8606c009704eb4d9fd929abafc4e24b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/efc408ad768caf0eccd8bf07e13bd0c3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f2f0052d6146026489e3d05e891e6fe9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f7334b050d787bac849d2728a2fd4b1f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f81463d0d5bd6cf7d83cdaaaaf320dff +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/fac0cf39deee2f9a7dc39c3123bd8648 +0 -0
- data/test/functional/queues_controller_test.rb +27 -6
- data/test/functional/stats_controller_test.rb +67 -4
- data/test/functional/workers_controller_test.rb +23 -4
- data/test/functional/working_controller_test.rb +16 -4
- data/test/integration/plugin_integration_test.rb +72 -0
- data/test/test_helper.rb +1 -1
- data/test/unit/helpers/failures_helper_test.rb +11 -0
- metadata +473 -244
- data/lib/resque_web/tabs.rb +0 -21
- data/test/dummy/tmp/pids/server.pid +0 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9234c02c3b2a4284338cbd1d3214e4d79b1b1073
|
|
4
|
+
data.tar.gz: a5522b9fdb62a1a70681b96e11debb8ec70759ef
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 255bfc7bfb5bac12a736df7abfa4d74f218813743901daefda73733b85d0a0bfb884125d4645e77ac33f9aa3b22604780b7bb646d0632ee4395da011b1bb1014
|
|
7
|
+
data.tar.gz: 8e1d4ff4d789a7b67db3af49ab8151e52df649325195fd3143a981531fec8747a84719ec5a7773280870eb4fa0b30d9da1df5fb00b630fbe543ca3e9964b27cf
|
data/README.md
CHANGED
|
@@ -11,6 +11,13 @@ application that comes bundled with Resque, but deploys like a Rails application
|
|
|
11
11
|
and leverages Rails conventions for factoring things like controllers, helpers,
|
|
12
12
|
and views.
|
|
13
13
|
|
|
14
|
+
# NOTICE
|
|
15
|
+
Note this is NOT the old sinatra interface that comes with Resque 1-x. This is
|
|
16
|
+
a new project based on rails. If you have any issues with old web server,
|
|
17
|
+
please file an issue on the [resque](https://github.com/resque/resque) project.
|
|
18
|
+
Note that the sinatra web interface will be gone in Resque 2.0 and this is
|
|
19
|
+
meant to be the replacement.
|
|
20
|
+
|
|
14
21
|
More documentation coming soon!
|
|
15
22
|
|
|
16
23
|
## Starting
|
|
@@ -70,6 +77,12 @@ end
|
|
|
70
77
|
|
|
71
78
|
HTTP Basic Authentication is supported out of the box. Simply set the environment variables `RESQUE_WEB_HTTP_BASIC_AUTH_USER` and `RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD` to turn it on. If you're using Resque with Heroku run `heroku config:set RESQUE_WEB_HTTP_BASIC_AUTH_USER=user RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=secret` to get ResqueWeb secured.
|
|
72
79
|
|
|
80
|
+
## Plugins
|
|
81
|
+
|
|
82
|
+
In the past with the sinatra app it was fairly simple to just monkey-patch the
|
|
83
|
+
server to add more functionality/tabs. With this rails version you have to write
|
|
84
|
+
an engine under a specific namespace. Read more in PLUGINS.md.
|
|
85
|
+
|
|
73
86
|
## Screenshot
|
|
74
87
|
|
|
75
88
|

|
|
@@ -14,92 +14,3 @@
|
|
|
14
14
|
//= require jquery_ujs
|
|
15
15
|
//= require twitter/bootstrap
|
|
16
16
|
//= require_tree .
|
|
17
|
-
|
|
18
|
-
$(function() {
|
|
19
|
-
var poll_interval = 2
|
|
20
|
-
|
|
21
|
-
var relatizer = function(){
|
|
22
|
-
var dt = $(this).text();
|
|
23
|
-
$(this).relativeDate();
|
|
24
|
-
var relatized = $(this).text();
|
|
25
|
-
|
|
26
|
-
if ($(this).parents("a").length > 0 || $(this).is("a")) {
|
|
27
|
-
$(this).relativeDate()
|
|
28
|
-
if (!$(this).attr('title')) {
|
|
29
|
-
$(this).attr('title', dt)
|
|
30
|
-
}
|
|
31
|
-
} else {
|
|
32
|
-
$(this)
|
|
33
|
-
.text('')
|
|
34
|
-
.append( $('<a href="#" class="toggle_format" title="' + dt + '" />')
|
|
35
|
-
.append('<span class="date_time">' + dt +
|
|
36
|
-
'</span><span class="relatized_time">' +
|
|
37
|
-
relatized + '</span>') )
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
$('.time').each(relatizer);
|
|
42
|
-
|
|
43
|
-
$('.time a.toggle_format .date_time').hide()
|
|
44
|
-
|
|
45
|
-
var format_toggler = function(){
|
|
46
|
-
$('.time a.toggle_format span').toggle()
|
|
47
|
-
$(this).attr('title', $('span:hidden',this).text())
|
|
48
|
-
return false
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
$('.time a.toggle_format').click(format_toggler);
|
|
52
|
-
|
|
53
|
-
$('.backtrace').click(function() {
|
|
54
|
-
$(this).next().toggle()
|
|
55
|
-
return false
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
var poll_start = function(el) {
|
|
59
|
-
var href = el.attr('href')
|
|
60
|
-
el.parent().text('Starting...')
|
|
61
|
-
$("#main").addClass('polling')
|
|
62
|
-
|
|
63
|
-
setInterval(function() {
|
|
64
|
-
$.ajax({dataType: 'text', type: 'get', url: href, success: function(data) {
|
|
65
|
-
$('#main').html(data)
|
|
66
|
-
$('#main .time').relativeDate()
|
|
67
|
-
}})
|
|
68
|
-
}, poll_interval * 1000)
|
|
69
|
-
|
|
70
|
-
location.hash = '#poll'
|
|
71
|
-
|
|
72
|
-
return false
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
if (location.hash == '#poll') poll_start($('a[rel=poll]'))
|
|
76
|
-
|
|
77
|
-
$('a[rel=poll]').click(function() { return poll_start($(this)) })
|
|
78
|
-
|
|
79
|
-
$('ul.failed li').hover(function() {
|
|
80
|
-
$(this).addClass('hover');
|
|
81
|
-
}, function() {
|
|
82
|
-
$(this).removeClass('hover');
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
$('ul.failed a[rel=retry]').click(function() {
|
|
86
|
-
var href = $(this).attr('href');
|
|
87
|
-
$(this).text('Retrying...');
|
|
88
|
-
var parent = $(this).parent();
|
|
89
|
-
$.ajax({dataType: 'text', type: 'get', url: href, success: function(data) {
|
|
90
|
-
parent.html('Retried <b><span class="time">' + data + '</span></b>');
|
|
91
|
-
relatizer.apply($('.time', parent));
|
|
92
|
-
$('.date_time', parent).hide();
|
|
93
|
-
$('a.toggle_format span', parent).click(format_toggler);
|
|
94
|
-
}});
|
|
95
|
-
return false;
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
$('#clear-failed-jobs').click(function(){
|
|
99
|
-
return confirm('Are you sure you want to clear ALL failed jobs?');
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
$('#retry-failed-jobs').click(function(){
|
|
103
|
-
return confirm('Are you sure you want to retry ALL failed jobs?');
|
|
104
|
-
})
|
|
105
|
-
})
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
jQuery ->
|
|
2
|
+
poll_interval = 2
|
|
3
|
+
|
|
4
|
+
poll_start = (el) ->
|
|
5
|
+
href = el.attr("href")
|
|
6
|
+
el.parent().text "Starting..."
|
|
7
|
+
$("#main").addClass "polling"
|
|
8
|
+
setInterval (->
|
|
9
|
+
$.ajax
|
|
10
|
+
dataType: "text"
|
|
11
|
+
type: "get"
|
|
12
|
+
url: href
|
|
13
|
+
success: (data) ->
|
|
14
|
+
$("#main").html data
|
|
15
|
+
$("#main .time").relativeDate()
|
|
16
|
+
), poll_interval * 1000
|
|
17
|
+
location.hash = "#poll"
|
|
18
|
+
|
|
19
|
+
# auto start if hash is poll
|
|
20
|
+
poll_start $("a[rel=poll]") if location.hash == "#poll"
|
|
21
|
+
|
|
22
|
+
# start when click on link
|
|
23
|
+
$("a[rel=poll]").click (e) ->
|
|
24
|
+
e.preventDefault()
|
|
25
|
+
poll_start $(this)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
jQuery ->
|
|
2
|
+
relatizer = ->
|
|
3
|
+
dt = $(this).text()
|
|
4
|
+
$(this).relativeDate()
|
|
5
|
+
relatized = $(this).text()
|
|
6
|
+
if $(this).parents("a").size() > 0 || $(this).is("a")
|
|
7
|
+
$(this).relativeDate()
|
|
8
|
+
$(this).attr("title", dt) unless $(this).attr("title")
|
|
9
|
+
else
|
|
10
|
+
$(this).html """
|
|
11
|
+
<a href='#'' class='toggle_format' title='#{dt}'>
|
|
12
|
+
<span class='date_time'>#{dt}</span>
|
|
13
|
+
<span class='relatized_time'>#{relatized}</span>
|
|
14
|
+
</a>
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
format_toggler = (e) ->
|
|
18
|
+
e.preventDefault()
|
|
19
|
+
$(".time a.toggle_format span").toggle()
|
|
20
|
+
$(this).attr "title", $("span:hidden", this).text()
|
|
21
|
+
|
|
22
|
+
# changed html when doom is ready
|
|
23
|
+
$(".time").each relatizer
|
|
24
|
+
$(".time a.toggle_format .date_time").hide()
|
|
25
|
+
|
|
26
|
+
# add event on click in relative time to show date_time
|
|
27
|
+
$(".time").on "click", "a.toggle_format", format_toggler
|
|
@@ -101,7 +101,7 @@ body {
|
|
|
101
101
|
#footer { padding:10px 5%; background:#efefef; color:#999; font-size:85%; line-height:1.5; border-top:5px solid #ccc; padding-top:10px;}
|
|
102
102
|
#footer p a { color:#999;}
|
|
103
103
|
|
|
104
|
-
.container p.poll { background:url(
|
|
104
|
+
.container p.poll { background:url(image-url('poll.png')) no-repeat 0 2px; padding:3px 0; padding-left:23px; float:right; font-size:85%; }
|
|
105
105
|
|
|
106
106
|
.container ul.failed {margin-top: 20px;}
|
|
107
107
|
.container ul.failed li {
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
module ResqueWeb
|
|
2
2
|
class QueuesController < ApplicationController
|
|
3
|
+
|
|
4
|
+
def index
|
|
5
|
+
end
|
|
6
|
+
|
|
3
7
|
def show
|
|
4
8
|
set_subtabs view_context.queue_names
|
|
5
9
|
end
|
|
@@ -8,5 +12,6 @@ module ResqueWeb
|
|
|
8
12
|
Resque.remove_queue(params[:id])
|
|
9
13
|
redirect_to queues_path
|
|
10
14
|
end
|
|
15
|
+
|
|
11
16
|
end
|
|
12
17
|
end
|
|
@@ -3,14 +3,33 @@ module ResqueWeb
|
|
|
3
3
|
subtabs :resque, :redis, :keys
|
|
4
4
|
|
|
5
5
|
def index
|
|
6
|
-
redirect_to :
|
|
6
|
+
redirect_to action: "resque"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def resque
|
|
10
|
+
respond_to do |format|
|
|
11
|
+
format.html
|
|
12
|
+
format.json { render json: Hash[Resque.info.sort] }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def redis
|
|
17
|
+
respond_to do |format|
|
|
18
|
+
format.html
|
|
19
|
+
format.json { render json: Hash[Resque.redis.info.sort] }
|
|
20
|
+
end
|
|
7
21
|
end
|
|
8
22
|
|
|
9
23
|
def keys
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
24
|
+
respond_to do |format|
|
|
25
|
+
format.html do
|
|
26
|
+
if params[:id]
|
|
27
|
+
render 'key'
|
|
28
|
+
else
|
|
29
|
+
render 'keys'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
format.json { render json: Resque.keys.sort }
|
|
14
33
|
end
|
|
15
34
|
end
|
|
16
35
|
end
|
|
@@ -2,6 +2,9 @@ module ResqueWeb
|
|
|
2
2
|
class WorkersController < ApplicationController
|
|
3
3
|
before_filter :display_subtabs
|
|
4
4
|
|
|
5
|
+
def index
|
|
6
|
+
end
|
|
7
|
+
|
|
5
8
|
def show
|
|
6
9
|
if params[:id] && params[:id] != 'all'
|
|
7
10
|
@workers = view_context.worker_hosts[params[:id]].map { |id| Resque::Worker.find(id) }
|
|
@@ -10,9 +13,11 @@ module ResqueWeb
|
|
|
10
13
|
end
|
|
11
14
|
end
|
|
12
15
|
|
|
16
|
+
private
|
|
17
|
+
|
|
13
18
|
def display_subtabs
|
|
14
19
|
set_subtabs view_context.worker_hosts.map(&:first)
|
|
15
20
|
end
|
|
16
|
-
|
|
21
|
+
|
|
17
22
|
end
|
|
18
23
|
end
|
|
@@ -4,13 +4,17 @@ module ResqueWeb
|
|
|
4
4
|
PER_PAGE = 20
|
|
5
5
|
|
|
6
6
|
def tabs
|
|
7
|
-
{'overview' => overview_path,
|
|
8
|
-
'working' => working_index_path,
|
|
9
|
-
'failures' => failures_path,
|
|
10
|
-
'queues' => queues_path,
|
|
11
|
-
'workers' => workers_path,
|
|
12
|
-
'stats' => stats_path
|
|
7
|
+
t = {'overview' => ResqueWeb::Engine.app.url_helpers.overview_path,
|
|
8
|
+
'working' => ResqueWeb::Engine.app.url_helpers.working_index_path,
|
|
9
|
+
'failures' => ResqueWeb::Engine.app.url_helpers.failures_path,
|
|
10
|
+
'queues' => ResqueWeb::Engine.app.url_helpers.queues_path,
|
|
11
|
+
'workers' => ResqueWeb::Engine.app.url_helpers.workers_path,
|
|
12
|
+
'stats' => ResqueWeb::Engine.app.url_helpers.stats_path
|
|
13
13
|
}
|
|
14
|
+
ResqueWeb::Plugins.plugins.each do |p|
|
|
15
|
+
p.tabs.each { |tab| t.merge!(tab) }
|
|
16
|
+
end
|
|
17
|
+
t
|
|
14
18
|
end
|
|
15
19
|
|
|
16
20
|
def tab(name,path)
|
|
@@ -16,6 +16,10 @@ module ResqueWeb
|
|
|
16
16
|
multiple_failure_queues? ? params[:id] : 'failed'
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def failure_queue_name
|
|
20
|
+
@failure_queue_name ||= params[:queue] ? params[:queue] : 'Failed'
|
|
21
|
+
end
|
|
22
|
+
|
|
19
23
|
def failure_size
|
|
20
24
|
@failure_size ||= Resque::Failure.count(params[:id], params[:class])
|
|
21
25
|
end
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<span class="icon-bar"></span>
|
|
22
22
|
</a>
|
|
23
23
|
<%= image_tag "resque_web/lifebuoy.png", class: 'logo' %>
|
|
24
|
-
<%= link_to "Resque.", root_path, :class => "brand" %>
|
|
24
|
+
<%= link_to "Resque.", ResqueWeb::Engine.app.url_helpers.root_path, :class => "brand" %>
|
|
25
25
|
<div class="nav-collapse collapse">
|
|
26
26
|
<ul class="nav">
|
|
27
27
|
<% tabs.each do |tab_name,path| %>
|
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
<% if multiple_failure_queues? && !params[:queue] %>
|
|
2
|
-
<h1>All Failure Queues</h1>
|
|
2
|
+
<h1>All Failure Queues</h1>
|
|
3
3
|
<% else %>
|
|
4
|
-
<h1>Failed Jobs <%= "on '#{params[:queue]}'" if params[:queue] %> <%= "with class '#{params[:class]}'" if params[:class] %></h1>
|
|
4
|
+
<h1>Failed Jobs <%= "on '#{params[:queue]}'" if params[:queue] %> <%= "with class '#{params[:class]}'" if params[:class] %></h1>
|
|
5
5
|
<% end %>
|
|
6
6
|
|
|
7
7
|
<% unless failure_size.zero? %>
|
|
8
|
-
<%= form_tag(destroy_all_failures_path(:
|
|
9
|
-
<%= submit_tag "Clear #{
|
|
10
|
-
<% if failure_size >
|
|
11
|
-
|
|
12
|
-
<% end %>
|
|
8
|
+
<%= form_tag(destroy_all_failures_path(queue: params[:queue]), method: :delete) do %>
|
|
9
|
+
<%= submit_tag "Clear #{failure_queue_name} Jobs", class: 'btn btn-danger', data: { confirm: "Are you sure you want to clear ALL #{failure_queue_name.downcase} jobs?" } %>
|
|
10
|
+
<% if failure_size > failure_per_page %>
|
|
11
|
+
<%= link_to "Last page »".html_safe, { start: (failure_size - failure_per_page) }, class: 'btn' %>
|
|
12
|
+
<% end %>
|
|
13
13
|
<% end %>
|
|
14
|
-
<%= form_tag(retry_all_failures_path(:
|
|
15
|
-
<%= submit_tag "Retry #{
|
|
14
|
+
<%= form_tag(retry_all_failures_path(queue: params[:queue]), method: :put) do %>
|
|
15
|
+
<%= submit_tag "Retry #{failure_queue_name} Jobs", class: 'btn', data: { confirm: "Are you sure you want to retry ALL #{failure_queue_name.downcase} jobs?" } %>
|
|
16
16
|
<% end %>
|
|
17
17
|
<% end %>
|
|
18
18
|
|
|
19
19
|
<% if multiple_failure_queues? && !params[:queue] %>
|
|
20
|
-
<p class="sub"><b><%= Resque::Failure.queues.size %></b> failure queues total</sub>
|
|
21
|
-
<%= render :
|
|
20
|
+
<p class="sub"><b><%= Resque::Failure.queues.size %></b> failure queues total</sub>
|
|
21
|
+
<%= render partial: 'overview' %>
|
|
22
22
|
<% else %>
|
|
23
|
-
<p class="sub">Showing <%= failure_start_at %> to <%= failure_end_at %> of <b><%= failure_size %></b> jobs</p>
|
|
23
|
+
<p class="sub">Showing <%= failure_start_at %> to <%= failure_end_at %> of <b><%= failure_size %></b> jobs</p>
|
|
24
24
|
|
|
25
|
-
<ul class="failed">
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
</ul>
|
|
30
|
-
|
|
31
|
-
<%= pagination :start => failure_start_at, :total => failure_size unless params[:class] %>
|
|
25
|
+
<ul class="failed">
|
|
26
|
+
<% each_failure do |id, job| %>
|
|
27
|
+
<%= render partial: 'failed_job', locals: { id: id, job: job } %>
|
|
28
|
+
<% end %>
|
|
29
|
+
</ul>
|
|
32
30
|
|
|
31
|
+
<%= pagination(start: failure_start_at, total: failure_size) unless params[:class] %>
|
|
33
32
|
<% end %>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<h1>Pending jobs on <span class='hl'><%= params[:id] %></span></h1>
|
|
2
2
|
|
|
3
3
|
<%= form_tag(queue_path(params[:id]), :method => :delete, :class => 'remove-queue') do %>
|
|
4
|
-
<%= submit_tag "Remove Queue", :confirm => "Are you absolutely sure? This cannot be undone."
|
|
4
|
+
<%= submit_tag "Remove Queue", :class => 'btn btn-danger', :data => { :confirm => "Are you absolutely sure? This cannot be undone." } %>
|
|
5
5
|
<% end %>
|
|
6
6
|
|
|
7
7
|
<p class="sub">Showing <%= queue_start_at %> to <%= queue_end_at %> of <b><%= queue_size %></b> jobs</p>
|
|
@@ -23,4 +23,4 @@
|
|
|
23
23
|
<% end %>
|
|
24
24
|
</table>
|
|
25
25
|
|
|
26
|
-
<%= pagination :start => queue_start_at, :total => queue_size %>
|
|
26
|
+
<%= pagination :start => queue_start_at, :total => queue_size %>
|
|
@@ -9,11 +9,9 @@
|
|
|
9
9
|
</tr>
|
|
10
10
|
<% Resque.keys.sort.each do |key| %>
|
|
11
11
|
<tr>
|
|
12
|
-
<th>
|
|
13
|
-
<%= link_to key, "/stats/keys/#{key}" %>
|
|
14
|
-
</th>
|
|
12
|
+
<th><%= link_to key, statistic_path("keys", key) %></th>
|
|
15
13
|
<td><%= redis_key_type key %></td>
|
|
16
14
|
<td><%= redis_key_size key %></td>
|
|
17
15
|
</tr>
|
|
18
16
|
<% end %>
|
|
19
|
-
</table>
|
|
17
|
+
</table>
|
data/config/routes.rb
CHANGED
|
@@ -3,6 +3,10 @@ id_pattern = /[^\/]+/
|
|
|
3
3
|
|
|
4
4
|
ResqueWeb::Engine.routes.draw do
|
|
5
5
|
|
|
6
|
+
ResqueWeb::Plugins.plugins.each do |p|
|
|
7
|
+
mount p::Engine => p.engine_path
|
|
8
|
+
end
|
|
9
|
+
|
|
6
10
|
resource :overview, :only => [:show], :controller => :overview
|
|
7
11
|
resources :working, :only => [:index]
|
|
8
12
|
resources :queues, :only => [:index,:show,:destroy], :constraints => {:id => id_pattern}
|
|
@@ -19,7 +23,7 @@ ResqueWeb::Engine.routes.draw do
|
|
|
19
23
|
|
|
20
24
|
get '/stats' => "stats#index"
|
|
21
25
|
get '/stats/:action', :controller => :stats
|
|
22
|
-
get '/stats/:action/:id', :controller => :stats, :constraints => {:id => id_pattern}
|
|
26
|
+
get '/stats/:action/:id', :controller => :stats, :constraints => {:id => id_pattern}, :as => :statistic
|
|
23
27
|
|
|
24
28
|
root :to => 'overview#show'
|
|
25
29
|
|
data/lib/resque_web/engine.rb
CHANGED
data/lib/resque_web/version.rb
CHANGED