dj_dashboard 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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.