Skip to content

Commit 1b962ab

Browse files
committed
Beginning port to Mustache. Start with /stats and layout.
This branch requires Sinatra 1.0 and Mustache 0.9.0
1 parent ee79df6 commit 1b962ab

File tree

8 files changed

+276
-63
lines changed

8 files changed

+276
-63
lines changed

lib/resque/server.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
require 'erb'
22

33
require 'sinatra/base'
4+
require 'mustache/sinatra'
45

56
require 'resque'
67
require 'resque/version'
78

89
require 'resque/server/helpers'
10+
require 'resque/server/views/layout'
911

1012
module Resque
1113
class Server < Sinatra::Base
14+
register Mustache::Sinatra
1215
helpers Helpers
1316

1417
dir = File.dirname(File.expand_path(__FILE__))
@@ -17,8 +20,20 @@ class Server < Sinatra::Base
1720
set :public, "#{dir}/server/public"
1821
set :static, true
1922

23+
set :mustache, {
24+
:namespace => Resque,
25+
:templates => "#{dir}/server/templates",
26+
:views => "#{dir}/server/views"
27+
}
28+
2029
def show(page, layout = true)
21-
erb page.to_sym, {:layout => layout}, :resque => Resque
30+
templates = settings.mustache[:templates]
31+
32+
if File.exists? "#{templates}/#{page}.mustache"
33+
mustache page.to_sym
34+
else
35+
erb page.to_sym, {:layout => layout}, :resque => Resque
36+
end
2237
rescue Errno::ECONNREFUSED
2338
erb :error, { :layout => false },
2439
:error => "Can't connect to Redis! (#{Resque.redis.server})"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<table class='stats'>
2+
{{# stats }}
3+
<tr>
4+
<th>
5+
{{ key }}
6+
</th>
7+
<td>
8+
{{ value }}
9+
</td>
10+
</tr>
11+
{{/ stats }}
12+
</table>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>Resque.</title>
6+
{{{reset_css}}}
7+
{{{style_css}}}
8+
{{{jquery_js}}}
9+
{{{relatize_js}}}
10+
{{{ranger_js}}}
11+
</head>
12+
<body>
13+
<div class="header">
14+
<ul class='nav'>
15+
{{#tabs}}
16+
{{{tab}}}
17+
{{/tabs}}
18+
</ul>
19+
{{#custom_namespace?}}
20+
<abbr class="namespace" title="Resque's Redis Namespace">
21+
{{namespace}}
22+
</abbr>
23+
{{/custom_namespace?}}
24+
</div>
25+
26+
{{#any_subtabs?}}
27+
<ul class='subnav'>
28+
{{#keyed_subtabs}}
29+
<li {{{class}}}>
30+
<a href="{{current_section}}/{{subtab}}">
31+
<span>{{subtab}}</span>
32+
</a>
33+
</li>
34+
{{/keyed_subtabs}}
35+
</ul>
36+
{{/any_subtabs?}}
37+
38+
<div id="main">
39+
{{{yield}}}
40+
</div>
41+
42+
<div id="footer">
43+
<p>Powered by <a href="http://github.com/defunkt/resque">Resque</a>
44+
v{{version}}<%=%></p>
45+
<p>Connected to Redis namespace {{namespace}} on {{redis_server}}</p>
46+
</div>
47+
48+
</body>
49+
</html>

lib/resque/server/templates/stats.erb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<% elsif params[:id] == 'keys' %>
2+
3+
<h1>Keys owned by <%= resque %></h1>
4+
<p class='sub'>(All keys are actually prefixed with "resque:")</p>
5+
<table class='stats'>
6+
<tr>
7+
<th>key</th>
8+
<th>type</th>
9+
<th>size</th>
10+
</tr>
11+
<% for key in resque.keys.sort %>
12+
<tr>
13+
<th>
14+
<a href="<%=u "/stats/keys/#{key}" %>"><%= key %></a>
15+
</th>
16+
<td><%= resque.redis.type key %></td>
17+
<td><%= redis_get_size key %></td>
18+
</tr>
19+
<% end %>
20+
</table>
21+
22+
<% else %>
23+
24+
<% end %>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{{# resque_page? }}
2+
<h1>{{ resque }}</h1>
3+
{{> _stats_table }}
4+
{{/ resque_page? }}
5+
6+
{{# redis_page? }}
7+
<h1>{{ redis_server }}</h1>
8+
{{> _stats_table }}
9+
{{/ redis_page? }}
10+
11+
{{# keys_page? }}
12+
<h1>Keys owned by {{ resque }}</h1>
13+
<p class='sub'>(All keys are actually prefixed with "resque:")</p>
14+
<table class='stats'>
15+
<tr>
16+
<th>key</th>
17+
<th>type</th>
18+
<th>size</th>
19+
</tr>
20+
{{# keys }}
21+
<tr>
22+
<th>
23+
<a href="{{ href }}">{{ name }}</a>
24+
</th>
25+
<td>{{ type }}</td>
26+
<td>{{ size }}</td>
27+
</tr>
28+
{{/ keys }}
29+
</table>
30+
31+
{{/ keys_page? }}
32+
33+
{{# key_page? }}
34+
{{> key_string_or_sets }}
35+
{{/ key_page? }}
36+

lib/resque/server/views/layout.rb

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
module Resque
2+
module Views
3+
class Layout < Mustache
4+
include Server::Helpers
5+
undef_method :partial
6+
7+
attr_reader :params, :request
8+
9+
def tabs
10+
super.map do |tab_name|
11+
{ :tab => tab(tab_name) }
12+
end
13+
end
14+
15+
def custom_namespace?
16+
namespace != :resque
17+
end
18+
19+
def namespace
20+
Resque.redis.namespace
21+
end
22+
23+
def version
24+
Resque::Version
25+
end
26+
27+
def redis_server
28+
Resque.redis.server
29+
end
30+
31+
def resque
32+
Resque
33+
end
34+
35+
def any_subtabs?
36+
keyed_subtabs.any?
37+
end
38+
39+
def keyed_subtabs
40+
Array(subtabs).map do |subtab|
41+
{ :subtab => subtab, :class => class_for_subtab(subtab) }
42+
end
43+
end
44+
45+
def class_for_subtab(subtab)
46+
class_if_current "#{current_section}/#{subtab}"
47+
end
48+
49+
def reset_css
50+
css :reset
51+
end
52+
53+
def style_css
54+
css :style
55+
end
56+
57+
def jquery_js
58+
js "jquery-1.3.2.min"
59+
end
60+
61+
def relatize_js
62+
js "jquery.relatize_date"
63+
end
64+
65+
def ranger_js
66+
js :ranger
67+
end
68+
69+
def css(name)
70+
'<link href="' + u(name) +
71+
'.css" media="screen" rel="stylesheet" type="text/css">'
72+
end
73+
74+
def js(name)
75+
'<script src="' + u(name) + '.js" type="text/javascript"></script>'
76+
end
77+
end
78+
end
79+
end

lib/resque/server/views/stats.erb

Lines changed: 0 additions & 62 deletions
This file was deleted.

lib/resque/server/views/stats.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
module Resque
2+
module Views
3+
class Stats < Layout
4+
def subtabs
5+
%w( resque redis keys )
6+
end
7+
8+
def redis_server
9+
Resque.redis.server
10+
end
11+
12+
def key_page?
13+
params[:id] == "key"
14+
end
15+
16+
def key_string_or_sets
17+
Resque.redis.type(params[:key]) == "string" ? :key_string : :key_sets
18+
end
19+
20+
def keys_page?
21+
params[:id] == "keys"
22+
end
23+
24+
def keys
25+
Resque.keys.sort.map do |key|
26+
hash = {}
27+
hash[:name] = key
28+
hash[:href] = u("/stats/keys/#{key}")
29+
hash[:type] = resque.redis.type(key)
30+
hash[:size] = redis_get_size(key)
31+
hash
32+
end
33+
end
34+
35+
def resque_page?
36+
ResqueInfo.new if params[:id] == "resque"
37+
end
38+
39+
def redis_page?
40+
RedisInfo.new if params[:id] == "redis"
41+
end
42+
43+
class ResqueInfo
44+
def stats
45+
Resque.info.to_a.sort_by { |i| i[0].to_s }.map do |key, value|
46+
{ :key => key, :value => value }
47+
end
48+
end
49+
end
50+
51+
class RedisInfo
52+
def stats
53+
Resque.redis.info.to_a.sort_by { |i| i[0].to_s }.map do |key, value|
54+
{ :key => key, :value => value }
55+
end
56+
end
57+
end
58+
end
59+
end
60+
end

0 commit comments

Comments
 (0)