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 CHANGED
@@ -7,6 +7,7 @@ gem "capybara", ">= 0.4.0"
7
7
  gem "sqlite3"
8
8
  gem 'delayed_job'
9
9
  gem 'haml'
10
+ gem 'will_paginate'
10
11
 
11
12
  # To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
12
13
  # gem 'ruby-debug'
data/Gemfile.lock CHANGED
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dj_dashboard (0.0.7)
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.11)
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
@@ -17,7 +17,6 @@ Add to your Gemfile:
17
17
  Then run:
18
18
 
19
19
  rake dj_dashboard:install
20
- rake db:migrate
21
20
 
22
21
  Installation may take several minutes if you have a lot of existing jobs (50k+).
23
22
 
@@ -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: Delayed::Job.where(job_name: job.job_name).where("locked_at is not null").count,
11
- failed: Delayed::Job.where(job_name: job.job_name).where("failed_at is not null and attempts >= 3").count,
12
- pending: Delayed::Job.where(job_name: job.job_name).where(locked_at: nil, failed_at: nil).count,
13
- retrying: Delayed::Job.where(job_name: job.job_name).where(locked_at: nil).where("failed_at is not null").count
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);
@@ -1,6 +1,7 @@
1
1
  !!! 5
2
2
  %head
3
3
  %title Delayed Job Dashboard
4
+ = javascript_include_tag :defaults
4
5
  = stylesheet_link_tag('dj_dashboard/jobs.css')
5
6
  = javascript_include_tag('dj_dashboard/jobs.js')
6
7
  %body
data/config/routes.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  Rails.application.routes.draw do
2
2
  get "dj_dashboard" => "dj_dashboard/jobs#index", :as => :dj_dashboard
3
+ get "dj_dashboard/jobs/stats" => "dj_dashboard/jobs#stats", :as => :dj_dashboard_job_stats
3
4
  end
data/dj_dashboard.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency "haml"
21
21
  s.add_dependency "sass"
22
22
  s.add_dependency "delayed_job"
23
+ s.add_dependency "will_paginate"
23
24
  s.add_dependency "rails", '~> 3.0'
24
25
 
25
26
  s.add_development_dependency "sqlite3"
data/lib/dj_dashboard.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'active_support/dependencies'
2
2
  require 'haml'
3
3
  require 'delayed_job'
4
+ require 'will_paginate'
4
5
 
5
6
  module DjDashboard
6
7
 
@@ -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
- puts copy_files(%w( stylesheets images javascripts ), origin, destination, 'dj_dashboard')
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
- puts copy_files(%w( migrate ), origin, destination)
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
- puts copy_files(%w( initializers ), origin, destination)
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
 
@@ -1,3 +1,3 @@
1
1
  module DjDashboard
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.8'
3
3
  end
@@ -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.7
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: 2011-12-14 00:00:00.000000000Z
12
+ date: 2012-01-02 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: haml
16
- requirement: &70212829934080 !ruby/object:Gem::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: *70212829934080
24
+ version_requirements: *70130000392180
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sass
27
- requirement: &70212829932360 !ruby/object:Gem::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: *70212829932360
35
+ version_requirements: *70130000391460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: delayed_job
38
- requirement: &70212829930820 !ruby/object:Gem::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: *70212829930820
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: &70212829929660 !ruby/object:Gem::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: *70212829929660
68
+ version_requirements: *70130000388980
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: sqlite3
60
- requirement: &70212829928480 !ruby/object:Gem::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: *70212829928480
79
+ version_requirements: *70130000387600
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rspec-rails
71
- requirement: &70212829927720 !ruby/object:Gem::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: *70212829927720
90
+ version_requirements: *70130000386140
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: shoulda
82
- requirement: &70212829927200 !ruby/object:Gem::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: *70212829927200
101
+ version_requirements: *70130000384580
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: rr
93
- requirement: &70212829926420 !ruby/object:Gem::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: *70212829926420
112
+ version_requirements: *70130000383700
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: machinist
104
- requirement: &70212829925520 !ruby/object:Gem::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: *70212829925520
123
+ version_requirements: *70130000382560
113
124
  - !ruby/object:Gem::Dependency
114
125
  name: faker
115
- requirement: &70212829924940 !ruby/object:Gem::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: *70212829924940
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: -2640301045582584717
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: -2640301045582584717
237
+ hash: 2548906427269125101
225
238
  requirements: []
226
239
  rubyforge_project:
227
240
  rubygems_version: 1.8.6