dj_dashboard 0.0.7 → 0.0.8
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.
- 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
|