dj_dashboard 0.0.5 → 0.0.6

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.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dj_dashboard (0.0.5)
4
+ dj_dashboard (0.0.6)
5
5
  delayed_job
6
6
  haml
7
7
  rails (~> 3.0)
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # DjDashboard
2
+
3
+ The missing dashboard for delayed_job.
4
+
5
+ Tested with Ruby 1.9.2, Rails 3.0+
6
+
7
+ # Screenshots
8
+
9
+ Coming soon...
10
+
11
+ # Installation
12
+
13
+ Add to your Gemfile:
14
+
15
+ gem 'dj_dashboard'
16
+
17
+ Then run:
18
+
19
+ rake dj_dashboard:install
20
+ rake db:migrate
21
+
22
+ Installation may take several minutes if you have a lot of existing jobs (50k+).
23
+
24
+ # Usage
25
+
26
+ Start the server:
27
+
28
+ rails s
29
+
30
+ View the dashboard at: http://localhost:3000/dj_dashboard
31
+
32
+ # Authentication
33
+
34
+ The installer will create an initializer in app/config/initializers/dj_dashboard.rb
35
+
36
+ In the initializer, you can define any auth logic that will be used by the controller's before_filter callback.
37
+
38
+ Below is an example using devise:
39
+
40
+ module DjDashboard
41
+ class ApplicationController < ActionController::Base
42
+ def authenticate!
43
+ redirect_to new_user_session_url unless user_signed_in?
44
+ end
45
+ end
46
+ end
47
+
48
+ # License
49
+
50
+ This project uses MIT-LICENSE.
@@ -2,9 +2,10 @@ module DjDashboard
2
2
  class JobsController < ApplicationController
3
3
  layout 'dj_dashboard'
4
4
 
5
+ before_filter :authenticate!
6
+
5
7
  def index
6
8
  @jobs = Job.fetch
7
9
  end
8
-
9
10
  end
10
11
  end
@@ -3,18 +3,14 @@ require 'set'
3
3
  module DjDashboard
4
4
  class Job
5
5
  def self.fetch(opts={})
6
- results = Delayed::Job.select(:handler).group(:handler)
7
- names = results.reduce(Set.new) do |names, result|
8
- names << result[:handler].chomp.scan(/ruby\/\w+:([a-zA-Z:]+)\ /).flatten.first
9
- end
10
-
11
- names.map do |job|
6
+ jobs = Delayed::Job.select(:job_name).group(:job_name)
7
+ jobs.map do |job|
12
8
  {
13
- name: job,
14
- running: Delayed::Job.where("handler like '%#{job}%'").where("locked_at is not null").count,
15
- failed: Delayed::Job.where("handler like '%#{job}%'").where("failed_at is not null and attempts >= 3").count,
16
- pending: Delayed::Job.where("handler like '%#{job}%'").where(locked_at: nil, failed_at: nil).count,
17
- retrying: Delayed::Job.where("handler like '%#{job}%'").where(locked_at: nil).where("failed_at is not null").count
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
18
14
  }
19
15
  end
20
16
  end
@@ -1,5 +1,5 @@
1
1
  %div
2
- .title Current Jobs
2
+ .title Delayed Jobs
3
3
  %table#jobs
4
4
  %tr
5
5
  %td.header.left Job
@@ -10,14 +10,14 @@
10
10
  - @jobs.each.with_index do |job, index|
11
11
  %tr{ :class => "#{index % 2 === 0 ? 'striped' : ''}" }
12
12
  %td.col.left= job[:name]
13
- %td.col= job[:running]
14
- %td.col= job[:pending]
15
- %td.col= job[:retrying]
16
- %td.col= job[:failed]
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])
17
17
  %tr
18
18
  %td.total
19
- %td.total= @jobs.map { |j| j[:running] }.sum
20
- %td.total= @jobs.map { |j| j[:pending] }.sum
21
- %td.total= @jobs.map { |j| j[:retrying] }.sum
22
- %td.total= @jobs.map { |j| j[:failed] }.sum
19
+ %td.total= number_with_delimiter @jobs.map { |j| j[:running] }.sum
20
+ %td.total= number_with_delimiter @jobs.map { |j| j[:pending] }.sum
21
+ %td.total= number_with_delimiter @jobs.map { |j| j[:retrying] }.sum
22
+ %td.total= number_with_delimiter @jobs.map { |j| j[:failed] }.sum
23
23
 
@@ -0,0 +1,10 @@
1
+ module DjDashboard
2
+ class ApplicationController < ActionController::Base
3
+ def authenticate!
4
+ # custom auth logic here
5
+ #
6
+ # example using devise:
7
+ # redirect_to new_user_session_url unless user_signed_in?
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ class AddJobNameToDelayedJobs < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :delayed_jobs, :job_name, :string
4
+ add_index :delayed_jobs, :job_name
5
+
6
+ # populate name field with job class name
7
+ Delayed::Job.find_each do |job|
8
+ job.update_attributes(job_name: job.name)
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ remove_column :delayed_jobs, :job_name
14
+ end
15
+ end
data/lib/dj_dashboard.rb CHANGED
@@ -13,3 +13,4 @@ module DjDashboard
13
13
  end
14
14
 
15
15
  require 'dj_dashboard/engine'
16
+ require 'ext/delayed_job'
@@ -6,7 +6,8 @@ module DjDashboard
6
6
  def self.run
7
7
  puts 'installing dj_dashboard'
8
8
  copy_assets_files
9
- copy_migration_files
9
+ copy_db_files
10
+ copy_config_files
10
11
  end
11
12
 
12
13
  def self.copy_assets_files
@@ -17,13 +18,20 @@ module DjDashboard
17
18
  puts copy_files(%w( stylesheets images javascripts ), origin, destination, 'dj_dashboard')
18
19
  end
19
20
 
20
- def self.copy_migration_files
21
- puts 'now copying migration files'
21
+ def self.copy_db_files
22
+ puts 'now copying db files'
22
23
  origin = File.join(gem_path, 'db')
23
24
  destination = Rails.root.join('db')
24
25
  puts copy_files(%w( migrate ), origin, destination)
25
26
  end
26
27
 
28
+ def self.copy_config_files
29
+ puts 'now copying initializer file'
30
+ origin = File.join(gem_path, 'config')
31
+ destination = Rails.root.join('config')
32
+ puts copy_files(%w( initializers ), origin, destination)
33
+ end
34
+
27
35
  def self.gem_path
28
36
  File.expand_path('../../..', File.dirname(__FILE__))
29
37
  end
@@ -1,3 +1,3 @@
1
1
  module DjDashboard
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
@@ -0,0 +1,14 @@
1
+ module Delayed
2
+ module Backend
3
+ module Base
4
+ module ClassMethods
5
+ alias_method :old_enqueue, :enqueue
6
+ def enqueue(*args)
7
+ job = old_enqueue(*args)
8
+ job.update_attributes(job_name: job.name)
9
+ job
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,6 +3,8 @@ require File.expand_path('../../dj_dashboard/tasks/install', __FILE__)
3
3
  namespace :dj_dashboard do
4
4
  desc "Install dj_dashboard"
5
5
  task :install do
6
+ puts "Installing dj_dashboard"
7
+ puts "This may take several minutes if you have lots of existing jobs."
6
8
  DjDashboard::Tasks::Install.run
7
9
  end
8
10
  end
@@ -0,0 +1,10 @@
1
+ module DjDashboard
2
+ class ApplicationController < ActionController::Base
3
+ def authenticate!
4
+ # custom auth logic here
5
+ #
6
+ # example using devise:
7
+ # redirect_to new_user_session_url unless user_signed_in?
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ class AddIndexesOnDelayedJob < ActiveRecord::Migration
2
+ def self.up
3
+ add_index :delayed_jobs, :locked_at
4
+ add_index :delayed_jobs, :failed_at
5
+ add_index :delayed_jobs, [:locked_at, :failed_at]
6
+ add_index :delayed_jobs, [:failed_at, :attempts]
7
+ end
8
+
9
+ def self.down
10
+ remove_index :delayed_jobs, :locked_at
11
+ remove_index :delayed_jobs, :failed_at
12
+ remove_index :delayed_jobs, [:locked_at, :failed_at]
13
+ remove_index :delayed_jobs, [:failed_at, :attempts]
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class AddJobNameToDelayedJobs < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :delayed_jobs, :job_name, :string
4
+ add_index :delayed_jobs, :job_name
5
+
6
+ # populate name field with job class name
7
+ Delayed::Job.find_each do |job|
8
+ job.update_attributes(job_name: job.name)
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ remove_column :delayed_jobs, :job_name
14
+ end
15
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20111212042040) do
14
+ ActiveRecord::Schema.define(:version => 20111213032010) do
15
15
 
16
16
  create_table "delayed_jobs", :force => true do |t|
17
17
  t.integer "priority", :default => 0
@@ -24,8 +24,14 @@ ActiveRecord::Schema.define(:version => 20111212042040) do
24
24
  t.string "locked_by"
25
25
  t.datetime "created_at"
26
26
  t.datetime "updated_at"
27
+ t.string "job_name"
27
28
  end
28
29
 
29
- add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority"
30
+ add_index "delayed_jobs", ["failed_at", "attempts"], :name => "index_delayed_jobs_on_failed_at_and_attempts"
31
+ add_index "delayed_jobs", ["failed_at"], :name => "index_delayed_jobs_on_failed_at"
32
+ add_index "delayed_jobs", ["job_name"], :name => "index_delayed_jobs_on_job_name"
33
+ add_index "delayed_jobs", ["locked_at", "failed_at"], :name => "index_delayed_jobs_on_locked_at_and_failed_at"
34
+ add_index "delayed_jobs", ["locked_at"], :name => "index_delayed_jobs_on_locked_at"
35
+ add_index "delayed_jobs", ["priority", "run_at"], :name => "altered_delayed_jobs_priority"
30
36
 
31
37
  end
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.5
4
+ version: 0.0.6
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-12 00:00:00.000000000Z
12
+ date: 2011-12-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: haml
16
- requirement: &70128177353460 !ruby/object:Gem::Requirement
16
+ requirement: &70247966674500 !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: *70128177353460
24
+ version_requirements: *70247966674500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sass
27
- requirement: &70128177352460 !ruby/object:Gem::Requirement
27
+ requirement: &70247966673380 !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: *70128177352460
35
+ version_requirements: *70247966673380
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: delayed_job
38
- requirement: &70128177351280 !ruby/object:Gem::Requirement
38
+ requirement: &70247966672240 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70128177351280
46
+ version_requirements: *70247966672240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rails
49
- requirement: &70128177350480 !ruby/object:Gem::Requirement
49
+ requirement: &70247966671560 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70128177350480
57
+ version_requirements: *70247966671560
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sqlite3
60
- requirement: &70128177349880 !ruby/object:Gem::Requirement
60
+ requirement: &70247966670920 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70128177349880
68
+ version_requirements: *70247966670920
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec-rails
71
- requirement: &70128177349200 !ruby/object:Gem::Requirement
71
+ requirement: &70247966670240 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70128177349200
79
+ version_requirements: *70247966670240
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: shoulda
82
- requirement: &70128177348580 !ruby/object:Gem::Requirement
82
+ requirement: &70247966669580 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70128177348580
90
+ version_requirements: *70247966669580
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rr
93
- requirement: &70128177347740 !ruby/object:Gem::Requirement
93
+ requirement: &70247966668880 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70128177347740
101
+ version_requirements: *70247966668880
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: machinist
104
- requirement: &70128177346940 !ruby/object:Gem::Requirement
104
+ requirement: &70247966667960 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '1.0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70128177346940
112
+ version_requirements: *70247966667960
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: faker
115
- requirement: &70128177346200 !ruby/object:Gem::Requirement
115
+ requirement: &70247966667160 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,7 +120,7 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70128177346200
123
+ version_requirements: *70247966667160
124
124
  description: Delayed Job Dashboard
125
125
  email:
126
126
  - ben.kempner@gmail.com
@@ -132,19 +132,22 @@ files:
132
132
  - Gemfile
133
133
  - Gemfile.lock
134
134
  - MIT-LICENSE
135
- - README.rdoc
135
+ - README.md
136
136
  - Rakefile
137
137
  - app/controllers/dj_dashboard/jobs_controller.rb
138
138
  - app/models/dj_dashboard/job.rb
139
139
  - app/views/dj_dashboard/jobs/index.html.haml
140
140
  - app/views/layouts/dj_dashboard.html.haml
141
+ - config/initializers/dj_dashboard.rb
141
142
  - config/routes.rb
142
143
  - db/migrate/20111212074858_add_indexes_on_delayed_job.rb
144
+ - db/migrate/20111213032010_add_job_name_to_delayed_jobs.rb
143
145
  - dj_dashboard.gemspec
144
146
  - lib/dj_dashboard.rb
145
147
  - lib/dj_dashboard/engine.rb
146
148
  - lib/dj_dashboard/tasks/install.rb
147
149
  - lib/dj_dashboard/version.rb
150
+ - lib/ext/delayed_job.rb
148
151
  - lib/tasks/install.rake
149
152
  - public/javascripts/dj_dashboard/jobs.js
150
153
  - public/stylesheets/dj_dashboard/jobs.css
@@ -166,6 +169,7 @@ files:
166
169
  - test/dummy/config/environments/production.rb
167
170
  - test/dummy/config/environments/test.rb
168
171
  - test/dummy/config/initializers/backtrace_silencers.rb
172
+ - test/dummy/config/initializers/dj_dashboard.rb
169
173
  - test/dummy/config/initializers/inflections.rb
170
174
  - test/dummy/config/initializers/mime_types.rb
171
175
  - test/dummy/config/initializers/secret_token.rb
@@ -173,6 +177,8 @@ files:
173
177
  - test/dummy/config/locales/en.yml
174
178
  - test/dummy/config/routes.rb
175
179
  - test/dummy/db/migrate/20111212042040_create_delayed_jobs.rb
180
+ - test/dummy/db/migrate/20111212074858_add_indexes_on_delayed_job.rb
181
+ - test/dummy/db/migrate/20111213032010_add_job_name_to_delayed_jobs.rb
176
182
  - test/dummy/db/schema.rb
177
183
  - test/dummy/public/404.html
178
184
  - test/dummy/public/422.html
@@ -205,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
205
211
  version: '0'
206
212
  segments:
207
213
  - 0
208
- hash: 1105974597055427148
214
+ hash: 120191758946631102
209
215
  required_rubygems_version: !ruby/object:Gem::Requirement
210
216
  none: false
211
217
  requirements:
@@ -214,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
220
  version: '0'
215
221
  segments:
216
222
  - 0
217
- hash: 1105974597055427148
223
+ hash: 120191758946631102
218
224
  requirements: []
219
225
  rubyforge_project:
220
226
  rubygems_version: 1.8.6
@@ -240,6 +246,7 @@ test_files:
240
246
  - test/dummy/config/environments/production.rb
241
247
  - test/dummy/config/environments/test.rb
242
248
  - test/dummy/config/initializers/backtrace_silencers.rb
249
+ - test/dummy/config/initializers/dj_dashboard.rb
243
250
  - test/dummy/config/initializers/inflections.rb
244
251
  - test/dummy/config/initializers/mime_types.rb
245
252
  - test/dummy/config/initializers/secret_token.rb
@@ -247,6 +254,8 @@ test_files:
247
254
  - test/dummy/config/locales/en.yml
248
255
  - test/dummy/config/routes.rb
249
256
  - test/dummy/db/migrate/20111212042040_create_delayed_jobs.rb
257
+ - test/dummy/db/migrate/20111212074858_add_indexes_on_delayed_job.rb
258
+ - test/dummy/db/migrate/20111213032010_add_job_name_to_delayed_jobs.rb
250
259
  - test/dummy/db/schema.rb
251
260
  - test/dummy/public/404.html
252
261
  - test/dummy/public/422.html
data/README.rdoc DELETED
@@ -1,3 +0,0 @@
1
- = DjDashboard
2
-
3
- This project rocks and uses MIT-LICENSE.