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 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