1
0
Fork 0
mirror of https://github.com/endofunky/sidetiq.git synced 2022-11-09 13:53:30 -05:00

Initial version of the web extension.

This commit is contained in:
Tobias Svensson 2013-02-01 12:26:17 +00:00
parent 2d73e6f77f
commit 46c013f725
7 changed files with 188 additions and 1 deletions

View file

@ -3,11 +3,14 @@ source 'https://rubygems.org'
group :development do
gem 'rake'
gem 'rake-compiler'
gem 'sinatra', require: false
gem 'slim', require: false
end
group :test do
gem 'simplecov'
gem 'mocha'
gem 'rack-test'
end
gemspec

View file

@ -77,6 +77,17 @@ Sidetiq.configure do |config|
end
```
## WEB EXTENSION
Sidetiq includes an extension for Sidekiq's web interface. It will not be
loaded by default, so it will have to be required manually:
```ruby
require 'sidetiq/web'
```
![Screenshot](http://cl.ly/image/1X0q3v153F3Q)
## CONSIDERATIONS
If workers are spread across multiple machines multiple jobs might be enqueued

View file

@ -0,0 +1,23 @@
header.row
.span5
h3 Recurring Jobs
- if @schedules.length > 0
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
thead
th style="width: 50%" Worker
th style="width: 20%" Queue
th style="width: 20%" Next Run
th style="width: 10%" Actions
- @schedules.each do |worker, schedule|
tr
td
= worker.name
td= worker.get_sidekiq_options['queue']
td
== relative_time(schedule.next_occurrence)
td
a href="#{root_path}sidetiq/#{worker.name}" Details
- else
.alert.alert-success No recurring jobs found.

View file

@ -0,0 +1,40 @@
header.row
.span5
h3
' Recurring Job:
= @worker.name
- if (recurrences = @schedule.recurrence_rules).length > 0
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
thead
th Recurrences
- recurrences.each do |rule|
tr
td
= rule.to_s
br
- if (exceptions = @schedule.exception_rules).length > 0
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
thead
th Exceptions
- exceptions.each do |rule|
tr
td
= rule.to_s
br
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
thead
th style="width: 25%" Next 10 runs
th style="width: 75%"
- @schedule.next_occurrences(10).each do |time|
tr
td
time= time.getutc
td
== relative_time(time)
br

42
lib/sidetiq/web.rb Normal file
View file

@ -0,0 +1,42 @@
require 'sidekiq/web'
module Sidetiq
module Web
def self.registered(app)
app.helpers do
def find_template(view, *args, &block)
path = File.expand_path(File.join('..', 'views'), __FILE__)
super(path, *args, &block)
super
end
end
app.get "/sidetiq" do
@schedules = Sidetiq::Clock.instance.schedules
slim :sidetiq
end
app.get "/sidetiq/:name" do
halt 404 unless (name = params[:name])
schedules = Sidetiq::Clock.instance.schedules
@worker, @schedule = schedules.select do |worker, schedule|
worker.name == name
end.flatten
slim :sidetiq_details
end
end
end
end
Sidekiq::Web.register(Sidetiq::Web)
if Sidekiq::Web.tabs.is_a?(Array)
Sidekiq::Web.tabs << "sidetiq"
else
Sidekiq::Web.tabs["Sidetiq"] = "sidetiq"
end

View file

@ -1,10 +1,16 @@
require 'simplecov'
SimpleCov.start { add_filter "/test/" }
require 'minitest/autorun'
require 'mocha/setup'
require 'sidetiq'
require 'rack/test'
require 'sidekiq'
require 'sidekiq/testing'
require 'sidetiq'
require 'sidetiq/web'
# Stub out Clock#start! so we don't actually loop
module Sidetiq
class Clock

62
test/test_web.rb Normal file
View file

@ -0,0 +1,62 @@
require_relative 'helper'
class TestWeb < MiniTest::Unit::TestCase
include Rack::Test::Methods
class Worker
include Sidekiq::Worker
include Sidetiq::Schedulable
tiq do
daily(1)
yearly(2)
monthly(3)
add_exception_rule yearly.month_of_year(:february)
end
end
def app
Sidekiq::Web
end
def clock
Sidetiq::Clock.instance
end
def test_home_tab
get '/'
assert_equal 200, last_response.status
assert_match last_response.body, /Sidekiq/
assert_match last_response.body, /Sidetiq/
end
def test_sidetiq_page
get '/sidetiq'
assert_equal 200, last_response.status
clock.schedules.each do |worker, schedule|
assert_match last_response.body, /#{worker.name}/
assert_match last_response.body, /#{worker.get_sidekiq_options['queue']}/
end
end
def test_details_page
get "/sidetiq/#{Worker.name}"
assert_equal 200, last_response.status
schedule = clock.schedules[Worker]
schedule.recurrence_rules.each do |rule|
assert_match last_response.body, /#{rule.to_s}/
end
schedule.exception_rules.each do |rule|
assert_match last_response.body, /#{rule.to_s}/
end
schedule.next_occurrences(10).each do |time|
assert_match last_response.body, /#{time.getutc.to_s}/
end
end
end