dj_dashboard 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +5 -2
- data/README.md +0 -1
- data/app/controllers/dj_dashboard/jobs_controller.rb +12 -0
- data/app/models/dj_dashboard/job.rb +4 -4
- data/app/views/dj_dashboard/jobs/_stats.html.haml +20 -0
- data/app/views/dj_dashboard/jobs/index.html.haml +6 -6
- data/app/views/dj_dashboard/jobs/stats.js.erb +10 -0
- data/app/views/layouts/dj_dashboard.html.haml +1 -0
- data/config/routes.rb +1 -0
- data/dj_dashboard.gemspec +1 -0
- data/lib/dj_dashboard.rb +1 -0
- data/lib/dj_dashboard/tasks/install.rb +6 -3
- data/lib/dj_dashboard/version.rb +1 -1
- data/lib/ext/delayed_job.rb +20 -0
- data/public/stylesheets/dj_dashboard/jobs.css +25 -0
- metadata +37 -24
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dj_dashboard (0.0.
|
4
|
+
dj_dashboard (0.0.8)
|
5
5
|
delayed_job
|
6
6
|
haml
|
7
7
|
rails (~> 3.0)
|
8
8
|
sass
|
9
|
+
will_paginate
|
9
10
|
|
10
11
|
GEM
|
11
12
|
remote: http://rubygems.org/
|
@@ -108,7 +109,7 @@ GEM
|
|
108
109
|
railties (~> 3.0)
|
109
110
|
rspec (~> 2.7.0)
|
110
111
|
rubyzip (0.9.5)
|
111
|
-
sass (3.1.
|
112
|
+
sass (3.1.12)
|
112
113
|
selenium-webdriver (2.15.0)
|
113
114
|
childprocess (>= 0.2.1)
|
114
115
|
ffi (~> 1.0.9)
|
@@ -121,6 +122,7 @@ GEM
|
|
121
122
|
polyglot
|
122
123
|
polyglot (>= 0.3.1)
|
123
124
|
tzinfo (0.3.31)
|
125
|
+
will_paginate (3.0.2)
|
124
126
|
xpath (0.1.4)
|
125
127
|
nokogiri (~> 1.3)
|
126
128
|
|
@@ -139,3 +141,4 @@ DEPENDENCIES
|
|
139
141
|
rspec-rails
|
140
142
|
shoulda
|
141
143
|
sqlite3
|
144
|
+
will_paginate
|
data/README.md
CHANGED
@@ -7,5 +7,17 @@ module DjDashboard
|
|
7
7
|
def index
|
8
8
|
@jobs = Job.fetch
|
9
9
|
end
|
10
|
+
|
11
|
+
def stats
|
12
|
+
@jobs = Delayed::Job.send(params[:type].to_sym, params[:job_name]).page(params[:page]).per_page(10)
|
13
|
+
@is_pagination_link = params[:page] ? true : false
|
14
|
+
@job_name = @jobs.first.job_name if @jobs.any?
|
15
|
+
@stat_type = params[:type]
|
16
|
+
|
17
|
+
respond_to do |format|
|
18
|
+
format.html
|
19
|
+
format.js
|
20
|
+
end
|
21
|
+
end
|
10
22
|
end
|
11
23
|
end
|
@@ -7,10 +7,10 @@ module DjDashboard
|
|
7
7
|
jobs.map do |job|
|
8
8
|
{
|
9
9
|
name: job.job_name,
|
10
|
-
running:
|
11
|
-
failed: Delayed::Job.
|
12
|
-
pending: Delayed::Job.
|
13
|
-
retrying: Delayed::Job.
|
10
|
+
running: Delayed::Job.running(job.job_name).count,
|
11
|
+
failed: Delayed::Job.failed(job.job_name).count,
|
12
|
+
pending: Delayed::Job.pending(job.job_name).count,
|
13
|
+
retrying: Delayed::Job.retrying(job.job_name).count
|
14
14
|
}
|
15
15
|
end
|
16
16
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
%tr.stats{:class => "#{@stat_type.to_s}", :id => "stats_#{@job_name.gsub('::', '__')}"}
|
2
|
+
%td{:colspan => 5}
|
3
|
+
%h3= "#{@stat_type.to_s.capitalize} Jobs"
|
4
|
+
#job_pagination= will_paginate(@jobs)
|
5
|
+
%table.stat
|
6
|
+
%tr.header
|
7
|
+
%td Priority
|
8
|
+
%td Created
|
9
|
+
%td Run
|
10
|
+
%td Locked
|
11
|
+
%td Attempts
|
12
|
+
%td Failed
|
13
|
+
- @jobs.each.with_index do |job, index|
|
14
|
+
%tr{:class => "#{index % 2 === 0 ? 'striped' : nil}"}
|
15
|
+
%td.center= job.priority
|
16
|
+
%td= "#{time_ago_in_words job.created_at} ago"
|
17
|
+
%td= job.run_at ? "#{time_ago_in_words job.run_at} ago" : "--"
|
18
|
+
%td= job.locked_at ? "#{time_ago_in_words job.locked_at} ago" : "--"
|
19
|
+
%td.center= job.attempts
|
20
|
+
%td= job.failed_at ? "#{time_ago_in_words job.failed_at} ago" : "--"
|
@@ -8,12 +8,12 @@
|
|
8
8
|
%td.header Retrying
|
9
9
|
%td.header.right Failed
|
10
10
|
- @jobs.each.with_index do |job, index|
|
11
|
-
%tr{ :class => "#{index % 2 === 0 ? 'striped' : ''}" }
|
12
|
-
%td.col.left= job[:name]
|
13
|
-
%td.col= number_with_delimiter(job[:running])
|
14
|
-
%td.col= number_with_delimiter(job[:pending])
|
15
|
-
%td.col= number_with_delimiter(job[:retrying])
|
16
|
-
%td.col= number_with_delimiter(job[:failed])
|
11
|
+
%tr{ :id => "job_#{job[:name].gsub('::','__')}", :class => "#{index % 2 === 0 ? 'striped' : ''}" }
|
12
|
+
%td.col.all.left= link_to job[:name], dj_dashboard_job_stats_path(:job_name => job[:name], :type => :all), :remote => true
|
13
|
+
%td.col.running= link_to_if (job[:running] > 0), number_with_delimiter(job[:running]), dj_dashboard_job_stats_path(:job_name => job[:name], :type => :running), :remote => true
|
14
|
+
%td.col.pending= link_to_if (job[:pending] > 0), number_with_delimiter(job[:pending]), dj_dashboard_job_stats_path(:job_name => job[:name], :type => :pending), :remote => true
|
15
|
+
%td.col.retrying= link_to_if (job[:retrying] > 0), number_with_delimiter(job[:retrying]), dj_dashboard_job_stats_path(:job_name => job[:name], :type => :retrying), :remote => true
|
16
|
+
%td.col.failed= link_to_if (job[:failed] > 0), number_with_delimiter(job[:failed]), dj_dashboard_job_stats_path(:job_name => job[:name], :type => :failed), :remote => true
|
17
17
|
%tr
|
18
18
|
%td.total
|
19
19
|
%td.total= number_with_delimiter @jobs.map { |j| j[:running] }.sum
|
@@ -0,0 +1,10 @@
|
|
1
|
+
var job = $('#job_<%= @job_name.gsub('::', '__') %>')
|
2
|
+
var stats = $('#stats_<%= @job_name.gsub('::', '__') %>')
|
3
|
+
var stats_type = $('#stats_<%= @job_name.gsub('::', '__') %>.stats.<%= @stat_type.to_s %>')
|
4
|
+
|
5
|
+
stats.remove();
|
6
|
+
if(stats_type.size() === 0 || <%= @is_pagination_link %>) {
|
7
|
+
job.after("<%= escape_javascript(render('stats')) %>")
|
8
|
+
}
|
9
|
+
|
10
|
+
$('.pagination a').attr('data-remote', true);
|
data/config/routes.rb
CHANGED
data/dj_dashboard.gemspec
CHANGED
data/lib/dj_dashboard.rb
CHANGED
@@ -11,26 +11,28 @@ module DjDashboard
|
|
11
11
|
run_migrations
|
12
12
|
end
|
13
13
|
|
14
|
+
# TODO: This is wierd...
|
14
15
|
def self.copy_assets_files
|
16
|
+
puts 'now copying assets'
|
15
17
|
return nil if Rails.version =~ /3.0/ # not needed for rails 3.0
|
16
18
|
origin = File.join(gem_path, 'public')
|
17
19
|
destination = Rails.root.join('app/assets') if Rails.version =~ /3.1/
|
18
20
|
destination = Rails.root.join('public') if Rails.version =~ /3.0/
|
19
|
-
|
21
|
+
copy_files(%w( stylesheets images javascripts ), origin, destination, 'dj_dashboard')
|
20
22
|
end
|
21
23
|
|
22
24
|
def self.copy_db_files
|
23
25
|
puts 'now copying db files'
|
24
26
|
origin = File.join(gem_path, 'db')
|
25
27
|
destination = Rails.root.join('db')
|
26
|
-
|
28
|
+
copy_files(%w( migrate ), origin, destination)
|
27
29
|
end
|
28
30
|
|
29
31
|
def self.copy_config_files
|
30
32
|
puts 'now copying initializer file'
|
31
33
|
origin = File.join(gem_path, 'config')
|
32
34
|
destination = Rails.root.join('config')
|
33
|
-
|
35
|
+
copy_files(%w( initializers ), origin, destination)
|
34
36
|
end
|
35
37
|
|
36
38
|
def self.gem_path
|
@@ -64,6 +66,7 @@ module DjDashboard
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def self.run_migrations
|
69
|
+
puts 'now running migrations'
|
67
70
|
Rake::Task['db:migrate'].invoke
|
68
71
|
end
|
69
72
|
|
data/lib/dj_dashboard/version.rb
CHANGED
data/lib/ext/delayed_job.rb
CHANGED
@@ -8,6 +8,26 @@ module Delayed
|
|
8
8
|
job.update_attributes(job_name: job.name)
|
9
9
|
job
|
10
10
|
end
|
11
|
+
|
12
|
+
def running(job_name = nil)
|
13
|
+
running = job_name ? where(job_name: job_name) : scoped
|
14
|
+
running.where("locked_at is not null").where(:attempts => 0)
|
15
|
+
end
|
16
|
+
|
17
|
+
def failed(job_name = nil)
|
18
|
+
failed = job_name ? where(job_name: job_name) : scoped
|
19
|
+
failed.where("failed_at is not null and attempts >= 3")
|
20
|
+
end
|
21
|
+
|
22
|
+
def pending(job_name = nil)
|
23
|
+
pending = job_name ? where(job_name: job_name) : scoped
|
24
|
+
pending.where(locked_at: nil, failed_at: nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
def retrying(job_name = nil)
|
28
|
+
retrying = job_name ? where(job_name: job_name) : scoped
|
29
|
+
retrying.where(locked_at: nil).where("failed_at is not null").where("attempts < 3")
|
30
|
+
end
|
11
31
|
end
|
12
32
|
end
|
13
33
|
end
|
@@ -6,4 +6,29 @@ body { font-family: Arial; color: #fff; background-color: #333 }
|
|
6
6
|
.col { padding: 15px; font-size: 18px; text-align: center; color: #999; }
|
7
7
|
tr.striped { background-color: #292929; }
|
8
8
|
.col.left { text-align: left; }
|
9
|
+
.col.running a { color: #74916A; text-decoration: none; }
|
10
|
+
.col.pending a { color: #CFBE5F; text-decoration: none; }
|
11
|
+
.col.retrying a { color: #D49E3B; text-decoration: none; }
|
12
|
+
.col.failed a { color: #CF5355; text-decoration: none; }
|
13
|
+
.col.all a { color: #999; text-decoration: none; }
|
14
|
+
.col a:hover { text-decoration: underline; }
|
9
15
|
.total { text-align: center; font-weight: bold; border-top: 2px solid #888; padding: 20px; }
|
16
|
+
|
17
|
+
.stats td { padding: 20px; background-color: #999; height: 385px; vertical-align: top; color: #333; }
|
18
|
+
.stats td h3 { color: #fff; text-shadow: 1px 2px #333; font-size: 19px; margin: 0 0 20px 0; float: left; }
|
19
|
+
.stats.running td { background-color: #8BAB80; }
|
20
|
+
.stats.running td .stat tr.striped td { background-color: #74916A; }
|
21
|
+
.stats.pending td { background-color: #E8D672; }
|
22
|
+
.stats.pending td .stat tr.striped td { background-color: #CFBE5F; }
|
23
|
+
.stats.retrying td { background-color: #F0B954; }
|
24
|
+
.stats.retrying td .stat tr.striped td { background-color: #D49E3B; }
|
25
|
+
.stats.failed td { background-color: #F06063; }
|
26
|
+
.stats.failed td .stat tr.striped td { background-color: #CF5355; }
|
27
|
+
.stats td .stat { width: 100%; border-collapse: collapse; }
|
28
|
+
.stats td .stat tr.header { border-bottom: 2px solid #333; }
|
29
|
+
.stats td .stat tr.header td { border: none; font-size: 15px; text-align: left; font-weight: bold; }
|
30
|
+
.stats td .stat td { height: 24px; font-size: 13px; padding: 5px 10px 5px 10px; border-bottom: 1px solid #333; }
|
31
|
+
.center { text-align: center }
|
32
|
+
|
33
|
+
#job_pagination { float: right; font-size: 13px; }
|
34
|
+
#job_pagination a { color: #fff; text-shadow: 1px 1px #666; }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dj_dashboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-02 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: haml
|
16
|
-
requirement: &
|
16
|
+
requirement: &70130000392180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70130000392180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sass
|
27
|
-
requirement: &
|
27
|
+
requirement: &70130000391460 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70130000391460
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: delayed_job
|
38
|
-
requirement: &
|
38
|
+
requirement: &70130000390760 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,21 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70130000390760
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: will_paginate
|
49
|
+
requirement: &70130000390100 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70130000390100
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: rails
|
49
|
-
requirement: &
|
60
|
+
requirement: &70130000388980 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ~>
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '3.0'
|
55
66
|
type: :runtime
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70130000388980
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: sqlite3
|
60
|
-
requirement: &
|
71
|
+
requirement: &70130000387600 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70130000387600
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: rspec-rails
|
71
|
-
requirement: &
|
82
|
+
requirement: &70130000386140 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70130000386140
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: shoulda
|
82
|
-
requirement: &
|
93
|
+
requirement: &70130000384580 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: '0'
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70130000384580
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: rr
|
93
|
-
requirement: &
|
104
|
+
requirement: &70130000383700 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: '0'
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *70130000383700
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: machinist
|
104
|
-
requirement: &
|
115
|
+
requirement: &70130000382560 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ~>
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: '1.0'
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *70130000382560
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: faker
|
115
|
-
requirement: &
|
126
|
+
requirement: &70130000381720 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ! '>='
|
@@ -120,7 +131,7 @@ dependencies:
|
|
120
131
|
version: '0'
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *70130000381720
|
124
135
|
description: Delayed Job Dashboard
|
125
136
|
email:
|
126
137
|
- ben.kempner@gmail.com
|
@@ -137,7 +148,9 @@ files:
|
|
137
148
|
- Rakefile
|
138
149
|
- app/controllers/dj_dashboard/jobs_controller.rb
|
139
150
|
- app/models/dj_dashboard/job.rb
|
151
|
+
- app/views/dj_dashboard/jobs/_stats.html.haml
|
140
152
|
- app/views/dj_dashboard/jobs/index.html.haml
|
153
|
+
- app/views/dj_dashboard/jobs/stats.js.erb
|
141
154
|
- app/views/layouts/dj_dashboard.html.haml
|
142
155
|
- config/initializers/dj_dashboard.rb
|
143
156
|
- config/routes.rb
|
@@ -212,7 +225,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
212
225
|
version: '0'
|
213
226
|
segments:
|
214
227
|
- 0
|
215
|
-
hash:
|
228
|
+
hash: 2548906427269125101
|
216
229
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
217
230
|
none: false
|
218
231
|
requirements:
|
@@ -221,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
234
|
version: '0'
|
222
235
|
segments:
|
223
236
|
- 0
|
224
|
-
hash:
|
237
|
+
hash: 2548906427269125101
|
225
238
|
requirements: []
|
226
239
|
rubyforge_project:
|
227
240
|
rubygems_version: 1.8.6
|