delayed_job_progress 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile +0 -12
- data/MIT-LICENSE +1 -1
- data/README.md +18 -13
- data/app/controllers/delayed_job_progress/jobs_controller.rb +14 -14
- data/lib/delayed_job_progress.rb +0 -1
- data/lib/delayed_job_progress/engine.rb +4 -0
- data/lib/delayed_job_progress/extensions/job.rb +35 -7
- data/lib/delayed_job_progress/version.rb +1 -1
- data/lib/{delayed_job_progress/generators → generators}/delayed_job/progress_generator.rb +0 -0
- data/lib/generators/delayed_job/templates/progress_migration.rb +22 -0
- data/test/extensions/job_test.rb +58 -29
- data/test/extensions/worker_test.rb +4 -2
- data/test/generator_test.rb +1 -1
- data/test/jobs_controller_test.rb +13 -10
- data/test/test_helper.rb +7 -28
- metadata +5 -10
- data/Gemfile.lock +0 -113
- data/lib/delayed_job_progress/error.rb +0 -4
- data/lib/delayed_job_progress/generators/delayed_job/templates/progress_migration.rb +0 -29
- data/lib/tasks/delayed_job_progress_tasks.rake +0 -4
- data/test/dummy/db/schema.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1fcb2f6b8acf92411aae4dea3bba0ba00726f11
|
4
|
+
data.tar.gz: f56629937708111fd74b7056ccc6a6778091d1e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72b68f66f84482fa967052cfa3de777db1b22d5429c9a93bf73d5a7c5302013d8ac5759b8633770b48058d848d0afb32fcc21702fa6eb2d54ca91f731446e078
|
7
|
+
data.tar.gz: 55cec2cf7c63aeee0dd2f8f78951f85b05b8def2c75be84211849a6053a9d9466c5526faf7a1ecac5b1172febd9e0ad55e766686517d031ec783cc40a47aa9f4
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,15 +1,3 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
# Declare your gem's dependencies in delayed_job_progress.gemspec.
|
4
|
-
# Bundler will treat runtime dependencies like base dependencies, and
|
5
|
-
# development dependencies will be added by default to the :development group.
|
6
3
|
gemspec
|
7
|
-
|
8
|
-
# Declare any dependencies that are still in development here instead of in
|
9
|
-
# your gemspec. These might include edge Rails or gems from your path or
|
10
|
-
# Git. Remember to move these dependencies to your gemspec before releasing
|
11
|
-
# your gem to rubygems.org.
|
12
|
-
|
13
|
-
# To use a debugger
|
14
|
-
# gem 'byebug', group: [:development, :test]
|
15
|
-
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# DelayedJobProgress
|
2
2
|
[](http://rubygems.org/gems/delayed_job_progress) [](http://rubygems.org/gems/delayed_job_progress) [](https://travis-ci.org/GBH/delayed_job_progress)
|
3
3
|
|
4
|
-
Extension for
|
4
|
+
Extension for [Delayed::Job](https://github.com/collectiveidea/delayed_job) that allows better tracking of jobs!
|
5
5
|
|
6
6
|
## Setup
|
7
7
|
|
@@ -17,7 +17,7 @@ Consider this:
|
|
17
17
|
```ruby
|
18
18
|
class User < ActiveRecord::Base
|
19
19
|
# convenient relationship to grab associated jobs
|
20
|
-
has_many :jobs, :as => :record, :class_name => '
|
20
|
+
has_many :jobs, :as => :record, :class_name => 'Delayed::Job'
|
21
21
|
end
|
22
22
|
```
|
23
23
|
|
@@ -43,12 +43,12 @@ class CustomUserJob < Struct.new(:user_id)
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def perform
|
46
|
-
@job.update_column(:
|
46
|
+
@job.update_column(:message, 'working')
|
47
47
|
(0..100).each do |i|
|
48
48
|
@user.do_a_thing(i)
|
49
49
|
@job.update_column(:progress_current, i)
|
50
50
|
end
|
51
|
-
@job.update_column(:
|
51
|
+
@job.update_column(:message, 'complete')
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -68,10 +68,14 @@ That job knows about object that spawned it:
|
|
68
68
|
```
|
69
69
|
|
70
70
|
`Delayed::Job` records now have new attributes:
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
```
|
72
|
+
`progress_max` - default is `100`. You can change it to whatever during `enqueue`.
|
73
|
+
`progress_current` - default is `0`. You can manually increment it while job is running. Will be set to `process_max` when job completes.
|
74
|
+
`message` - default is `nil`. Optional informational string.
|
75
|
+
`error_message` - error message without backtrace. Also useful to set your own message.
|
76
|
+
`completed_at` - when job is done this timestamp is recorded.
|
77
|
+
`identifier` - you can assign something during `enqueue` so you can fetch that job later for display.
|
78
|
+
```
|
75
79
|
|
76
80
|
This extension also introduces worker setting that keeps completed jobs around. This way you can keep list of completed jobs for a while. If you want to remove them, you need to `.destroy(:force)` them.
|
77
81
|
```
|
@@ -80,8 +84,9 @@ Delayed::Worker.destroy_completed_jobs = false
|
|
80
84
|
|
81
85
|
## Jobs Controller
|
82
86
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
87
|
+
```
|
88
|
+
GET /jobs - List all jobs. Can filter based on associated record via `record_type` and `record_id` parameters. `identifier` parameter can be used as well
|
89
|
+
GET /jobs/<id> - Status of a job. Will see all the Delayed::Job attributes including things like progress
|
90
|
+
DELETE /jobs/<id>` - If job is stuck/failed, we can remove it
|
91
|
+
POST /jobs/<id>/reload` - Restart failed job
|
92
|
+
```
|
@@ -1,22 +1,22 @@
|
|
1
1
|
module DelayedJobProgress
|
2
2
|
class JobsController < ActionController::Base
|
3
3
|
|
4
|
-
before_action :load_job, :
|
4
|
+
before_action :load_job, only: [:show, :destroy, :reload]
|
5
5
|
|
6
6
|
def index
|
7
7
|
jobs = Delayed::Job
|
8
8
|
if params[:record_type].present? && params[:record_id].present?
|
9
|
-
jobs = jobs.where(:
|
9
|
+
jobs = jobs.where(record_type: params[:record_type], record_id: params[:record_id])
|
10
10
|
end
|
11
11
|
if params[:identifier].present?
|
12
|
-
jobs = jobs.where(:
|
12
|
+
jobs = jobs.where(identifier: params[:identifier])
|
13
13
|
end
|
14
14
|
|
15
|
-
render :
|
15
|
+
render json: jobs.all, methods: :status
|
16
16
|
end
|
17
17
|
|
18
18
|
def show
|
19
|
-
render :
|
19
|
+
render json: @job, methods: :status
|
20
20
|
end
|
21
21
|
|
22
22
|
def destroy
|
@@ -26,15 +26,15 @@ module DelayedJobProgress
|
|
26
26
|
|
27
27
|
def reload
|
28
28
|
@job.update_columns(
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
29
|
+
run_at: Time.now,
|
30
|
+
failed_at: nil,
|
31
|
+
completed_at: nil,
|
32
|
+
locked_by: nil,
|
33
|
+
locked_at: nil,
|
34
|
+
last_error: nil,
|
35
|
+
attempts: 0
|
36
36
|
)
|
37
|
-
render :
|
37
|
+
render json: @job
|
38
38
|
end
|
39
39
|
|
40
40
|
protected
|
@@ -42,7 +42,7 @@ module DelayedJobProgress
|
|
42
42
|
def load_job
|
43
43
|
@job = Delayed::Job.find(params[:id])
|
44
44
|
rescue ActiveRecord::RecordNotFound
|
45
|
-
render :
|
45
|
+
render json: {error: 'Job not found'}, status: :not_found
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
data/lib/delayed_job_progress.rb
CHANGED
@@ -1,16 +1,31 @@
|
|
1
1
|
Delayed::Backend::ActiveRecord::Job.class_eval do
|
2
2
|
|
3
|
-
belongs_to :record, :
|
3
|
+
belongs_to :record, polymorphic: true
|
4
|
+
|
5
|
+
# Overriding default scope so we don't select already completed jobs
|
6
|
+
def self.ready_to_run(worker_name, max_run_time)
|
7
|
+
where_sql = <<-SQL.strip_heredoc
|
8
|
+
(run_at <= ? AND (locked_at IS NULL OR locked_at < ?) OR locked_by = ?)
|
9
|
+
AND failed_at IS NULL
|
10
|
+
AND completed_at IS NULL
|
11
|
+
SQL
|
12
|
+
where(where_sql, db_time_now, db_time_now - max_run_time, worker_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Helper method to easily grab state of the job
|
16
|
+
def status
|
17
|
+
failed_at.present?? :failed :
|
18
|
+
completed_at.present?? :completed :
|
19
|
+
locked_at.present?? :processing : :queued
|
20
|
+
end
|
4
21
|
|
5
22
|
# When enqueue hook is executed, we need to look if there's an identifier provided
|
6
23
|
# If there's another Delayed::Job out there with same identifier we need to bail
|
7
24
|
def hook(name, *args)
|
8
25
|
super
|
9
26
|
|
10
|
-
if name == :enqueue
|
11
|
-
|
12
|
-
raise DelayedJobProgress::DuplicateJobError, "Delayed::Job with identifier: #{self.identifier} already present"
|
13
|
-
end
|
27
|
+
if name == :enqueue
|
28
|
+
self.handler_class = payload_object.class.to_s
|
14
29
|
end
|
15
30
|
end
|
16
31
|
|
@@ -23,6 +38,17 @@ Delayed::Backend::ActiveRecord::Job.class_eval do
|
|
23
38
|
super
|
24
39
|
end
|
25
40
|
|
41
|
+
# Introducing `error_message` attribute that excludes backtrace, also able to be manually set it before
|
42
|
+
# job errors out.
|
43
|
+
def error=(error)
|
44
|
+
@error = error
|
45
|
+
|
46
|
+
if self.respond_to?(:last_error=)
|
47
|
+
self.error_message ||= error.message
|
48
|
+
self.last_error = "#{error.message}\n#{error.backtrace.join("\n")}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
26
52
|
def destroy_completed_jobs?
|
27
53
|
payload_object.respond_to?(:destroy_completed_jobs?) ?
|
28
54
|
payload_object.destroy_completed_jobs? :
|
@@ -34,8 +60,10 @@ Delayed::Backend::ActiveRecord::Job.class_eval do
|
|
34
60
|
super()
|
35
61
|
else
|
36
62
|
update_columns(
|
37
|
-
:
|
38
|
-
:
|
63
|
+
completed_at: Time.zone.now,
|
64
|
+
progress_current: self.progress_max,
|
65
|
+
locked_at: nil,
|
66
|
+
locked_by: nil
|
39
67
|
)
|
40
68
|
end
|
41
69
|
end
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class AddProgressToDelayedJobs < ActiveRecord::Migration
|
2
|
+
|
3
|
+
def change
|
4
|
+
change_table :delayed_jobs do |t|
|
5
|
+
t.string :identifier
|
6
|
+
t.string :record_type
|
7
|
+
t.integer :record_id
|
8
|
+
t.string :handler_class
|
9
|
+
t.integer :progress_current, null: false, default: 0
|
10
|
+
t.integer :progress_max, null: false, default: 100
|
11
|
+
t.string :message
|
12
|
+
t.string :error_message
|
13
|
+
t.datetime :completed_at
|
14
|
+
end
|
15
|
+
|
16
|
+
add_index :delayed_jobs, :identifier
|
17
|
+
add_index :delayed_jobs, [:record_type, :record_id]
|
18
|
+
add_index :delayed_jobs, :handler_class
|
19
|
+
add_index :delayed_jobs, :completed_at
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/test/extensions/job_test.rb
CHANGED
@@ -7,7 +7,7 @@ class JobTest < ActiveSupport::TestCase
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_job_default
|
10
|
-
thing = Thing.create(:
|
10
|
+
thing = Thing.create(name: 'test')
|
11
11
|
thing.delay.something
|
12
12
|
|
13
13
|
job = Delayed::Job.last
|
@@ -19,7 +19,7 @@ class JobTest < ActiveSupport::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_job_custom
|
22
|
-
thing = Thing.create(:
|
22
|
+
thing = Thing.create(name: 'test')
|
23
23
|
job = Delayed::Job.enqueue(TestJob.new(thing.id))
|
24
24
|
|
25
25
|
assert_equal thing, job.record
|
@@ -27,48 +27,77 @@ class JobTest < ActiveSupport::TestCase
|
|
27
27
|
assert_equal 1000, job.progress_max
|
28
28
|
assert_equal 'unique_identifier', job.identifier
|
29
29
|
assert_equal 'reports', job.queue
|
30
|
+
assert_equal 'TestJob', job.handler_class
|
30
31
|
end
|
31
32
|
|
32
|
-
def
|
33
|
-
thing = Thing.create(:
|
34
|
-
Delayed::Job.enqueue(TestJob.new(thing.id))
|
33
|
+
def test_job_destroy
|
34
|
+
thing = Thing.create(name: 'test')
|
35
|
+
job = Delayed::Job.enqueue(TestJob.new(thing.id))
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
assert job.completed_at.blank?
|
38
|
+
assert_no_difference 'Delayed::Job.count' do
|
39
|
+
job.destroy
|
40
|
+
assert job.completed_at.present?
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_difference 'Delayed::Job.count', -1 do
|
44
|
+
job.destroy(:force)
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
43
|
-
def
|
44
|
-
thing = Thing.create(:
|
48
|
+
def test_job_reserve_completed
|
49
|
+
thing = Thing.create(name: 'test')
|
50
|
+
worker = Delayed::Worker.new
|
45
51
|
job = Delayed::Job.enqueue(TestJob.new(thing.id))
|
46
|
-
job.update_column(:completed_at, Time.now)
|
47
52
|
|
48
|
-
|
53
|
+
# marking it as complete
|
54
|
+
job.update_column(:completed_at, Time.now)
|
55
|
+
Delayed::Job.reserve(worker)
|
56
|
+
job.reload
|
57
|
+
assert job.locked_at.nil?
|
58
|
+
assert job.locked_by.nil?
|
59
|
+
|
60
|
+
# and here's the default
|
61
|
+
job.update_column(:completed_at, nil)
|
62
|
+
Delayed::Job.reserve(worker)
|
63
|
+
job.reload
|
64
|
+
refute job.locked_at.nil?
|
65
|
+
refute job.locked_by.nil?
|
49
66
|
end
|
50
67
|
|
51
|
-
def
|
52
|
-
thing = Thing.create(:
|
68
|
+
def test_job_status
|
69
|
+
thing = Thing.create(name: 'test')
|
53
70
|
job = Delayed::Job.enqueue(TestJob.new(thing.id))
|
54
|
-
job.update_column(:failed_at, Time.now)
|
55
71
|
|
56
|
-
|
57
|
-
end
|
72
|
+
assert_equal :queued, job.status
|
58
73
|
|
59
|
-
|
60
|
-
|
61
|
-
job = Delayed::Job.enqueue(TestJob.new(thing.id))
|
74
|
+
job.update_column(:locked_at, Time.now)
|
75
|
+
assert_equal :processing, job.status
|
62
76
|
|
63
|
-
|
64
|
-
|
65
|
-
job.destroy
|
66
|
-
assert job.completed_at.present?
|
67
|
-
end
|
77
|
+
job.update_column(:completed_at, Time.now)
|
78
|
+
assert_equal :completed, job.status
|
68
79
|
|
69
|
-
|
70
|
-
|
71
|
-
end
|
80
|
+
job.update_column(:failed_at, Time.now)
|
81
|
+
assert_equal :failed, job.status
|
72
82
|
end
|
73
83
|
|
84
|
+
def test_job_error
|
85
|
+
thing = Thing.create(name: 'test')
|
86
|
+
thing.delay.explode
|
87
|
+
|
88
|
+
job = Delayed::Job.last
|
89
|
+
worker = Delayed::Worker.new
|
90
|
+
worker.run(job)
|
91
|
+
|
92
|
+
assert_equal 'hell', job.error_message
|
93
|
+
|
94
|
+
thing.delay.explode
|
95
|
+
|
96
|
+
job = Delayed::Job.last
|
97
|
+
job.error_message = 'custom error'
|
98
|
+
worker = Delayed::Worker.new
|
99
|
+
worker.run(job)
|
100
|
+
|
101
|
+
assert_equal 'custom error', job.error_message
|
102
|
+
end
|
74
103
|
end
|
@@ -20,8 +20,10 @@ class WorkerTest < ActiveSupport::TestCase
|
|
20
20
|
job.reload
|
21
21
|
|
22
22
|
assert job.completed_at.present?
|
23
|
-
assert_equal 1000,
|
24
|
-
assert_equal 'complete',
|
23
|
+
assert_equal 1000, job.progress_current
|
24
|
+
assert_equal 'complete', job.message
|
25
|
+
assert_equal nil, job.locked_by
|
26
|
+
assert_equal nil, job.locked_at
|
25
27
|
end
|
26
28
|
|
27
29
|
def test_run_job_and_destroy
|
data/test/generator_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require_relative './test_helper'
|
2
|
-
require_relative '../lib/
|
2
|
+
require_relative '../lib/generators/delayed_job/progress_generator'
|
3
3
|
|
4
4
|
class ScaffoldGeneratorTest < Rails::Generators::TestCase
|
5
5
|
destination File.expand_path('../tmp', File.dirname(__FILE__))
|
@@ -7,34 +7,36 @@ module DelayedJobProgress
|
|
7
7
|
@routes = Engine.routes
|
8
8
|
Delayed::Worker.delay_jobs = true
|
9
9
|
|
10
|
-
@thing = Thing.create(:
|
10
|
+
@thing = Thing.create(name: 'test')
|
11
11
|
@job = Delayed::Job.enqueue(TestJob.new(@thing.id))
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_index
|
15
15
|
get :index
|
16
16
|
assert_response :success
|
17
|
-
|
17
|
+
data = JSON.parse(response.body)
|
18
|
+
assert_equal 1, data.count
|
19
|
+
assert_equal 'queued', data[0]['status']
|
18
20
|
end
|
19
21
|
|
20
22
|
def test_index_record_filtering
|
21
|
-
get :index, :
|
23
|
+
get :index, record_type: @thing.class, record_id: @thing.id
|
22
24
|
assert_response :success
|
23
25
|
data = JSON.parse(response.body)
|
24
26
|
assert data.is_a?(Array)
|
25
27
|
assert_equal 1, data.count
|
26
28
|
|
27
|
-
get :index, :
|
29
|
+
get :index, record_type: 'invalid', record_id: @thing.id
|
28
30
|
assert_response :success
|
29
31
|
assert_equal [], JSON.parse(response.body)
|
30
32
|
|
31
|
-
get :index, :
|
33
|
+
get :index, record_type: @thing.class, record_id: 'invalid'
|
32
34
|
assert_response :success
|
33
35
|
assert_equal [], JSON.parse(response.body)
|
34
36
|
end
|
35
37
|
|
36
38
|
def test_show
|
37
|
-
get :show, :
|
39
|
+
get :show, id: @job.id
|
38
40
|
assert_response :success
|
39
41
|
data = JSON.parse(response.body)
|
40
42
|
assert_equal 'unique_identifier', data['identifier']
|
@@ -42,18 +44,19 @@ module DelayedJobProgress
|
|
42
44
|
assert_equal 1, data['record_id']
|
43
45
|
assert_equal 500, data['progress_current']
|
44
46
|
assert_equal 1000, data['progress_max']
|
45
|
-
assert_equal 'initialized', data['
|
47
|
+
assert_equal 'initialized', data['message']
|
48
|
+
assert_equal 'queued', data['status']
|
46
49
|
end
|
47
50
|
|
48
51
|
def test_show_failure
|
49
|
-
get :show, :
|
52
|
+
get :show, id: 'invalid'
|
50
53
|
assert_response :not_found
|
51
54
|
assert_equal ({'error' => 'Job not found'}), JSON.parse(response.body)
|
52
55
|
end
|
53
56
|
|
54
57
|
def test_destroy
|
55
58
|
assert_difference 'Delayed::Job.count', -1 do
|
56
|
-
delete :destroy, :
|
59
|
+
delete :destroy, id: @job.id
|
57
60
|
assert_response :no_content
|
58
61
|
end
|
59
62
|
end
|
@@ -61,7 +64,7 @@ module DelayedJobProgress
|
|
61
64
|
def test_reset
|
62
65
|
@job.update_column(:failed_at, Time.now)
|
63
66
|
|
64
|
-
post :reload, :
|
67
|
+
post :reload, id: @job
|
65
68
|
assert_response :success
|
66
69
|
|
67
70
|
@job.reload
|
data/test/test_helper.rb
CHANGED
@@ -10,11 +10,11 @@ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
|
|
10
10
|
|
11
11
|
# loading db schema
|
12
12
|
require 'generators/delayed_job/templates/migration'
|
13
|
-
require_relative '../lib/
|
13
|
+
require_relative '../lib/generators/delayed_job/templates/progress_migration'
|
14
14
|
|
15
15
|
ActiveRecord::Schema.define do
|
16
16
|
CreateDelayedJobs.up
|
17
|
-
AddProgressToDelayedJobs.
|
17
|
+
AddProgressToDelayedJobs.new.change
|
18
18
|
|
19
19
|
create_table :things do |t|
|
20
20
|
t.string :name
|
@@ -25,6 +25,9 @@ class Thing < ActiveRecord::Base
|
|
25
25
|
def something
|
26
26
|
update_column(:name, 'processed')
|
27
27
|
end
|
28
|
+
def explode
|
29
|
+
raise 'hell'
|
30
|
+
end
|
28
31
|
end
|
29
32
|
|
30
33
|
class TestJob < Struct.new(:thing_id)
|
@@ -33,7 +36,7 @@ class TestJob < Struct.new(:thing_id)
|
|
33
36
|
job.identifier = 'unique_identifier'
|
34
37
|
job.progress_max = 1000
|
35
38
|
job.progress_current = 500
|
36
|
-
job.
|
39
|
+
job.message = 'initialized'
|
37
40
|
job.queue = 'reports'
|
38
41
|
end
|
39
42
|
|
@@ -42,30 +45,6 @@ class TestJob < Struct.new(:thing_id)
|
|
42
45
|
end
|
43
46
|
|
44
47
|
def perform
|
45
|
-
@job.update_column(:
|
48
|
+
@job.update_column(:message, 'complete')
|
46
49
|
end
|
47
50
|
end
|
48
|
-
|
49
|
-
class ActiveSupport::TestCase
|
50
|
-
# Example usage:
|
51
|
-
# assert_exception_raised do ... end
|
52
|
-
# assert_exception_raised ActiveRecord::RecordInvalid do ... end
|
53
|
-
# assert_exception_raised Plugin::Error, 'error_message' do ... end
|
54
|
-
def assert_exception(exception_class = nil, error_message = nil, &block)
|
55
|
-
exception_raised = nil
|
56
|
-
yield
|
57
|
-
rescue => exception_raised
|
58
|
-
ensure
|
59
|
-
if exception_raised
|
60
|
-
if exception_class
|
61
|
-
assert_equal exception_class, exception_raised.class, exception_raised.to_s
|
62
|
-
else
|
63
|
-
assert true
|
64
|
-
end
|
65
|
-
assert_equal error_message, exception_raised.to_s if error_message
|
66
|
-
else
|
67
|
-
flunk 'Exception was not raised'
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_progress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Khabarov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -82,7 +82,6 @@ files:
|
|
82
82
|
- ".gitignore"
|
83
83
|
- ".travis.yml"
|
84
84
|
- Gemfile
|
85
|
-
- Gemfile.lock
|
86
85
|
- MIT-LICENSE
|
87
86
|
- README.md
|
88
87
|
- Rakefile
|
@@ -92,13 +91,11 @@ files:
|
|
92
91
|
- delayed_job_progress.gemspec
|
93
92
|
- lib/delayed_job_progress.rb
|
94
93
|
- lib/delayed_job_progress/engine.rb
|
95
|
-
- lib/delayed_job_progress/error.rb
|
96
94
|
- lib/delayed_job_progress/extensions/job.rb
|
97
95
|
- lib/delayed_job_progress/extensions/worker.rb
|
98
|
-
- lib/delayed_job_progress/generators/delayed_job/progress_generator.rb
|
99
|
-
- lib/delayed_job_progress/generators/delayed_job/templates/progress_migration.rb
|
100
96
|
- lib/delayed_job_progress/version.rb
|
101
|
-
- lib/
|
97
|
+
- lib/generators/delayed_job/progress_generator.rb
|
98
|
+
- lib/generators/delayed_job/templates/progress_migration.rb
|
102
99
|
- test/delayed_job_progress_test.rb
|
103
100
|
- test/dummy/README.rdoc
|
104
101
|
- test/dummy/Rakefile
|
@@ -136,7 +133,6 @@ files:
|
|
136
133
|
- test/dummy/config/routes.rb
|
137
134
|
- test/dummy/config/secrets.yml
|
138
135
|
- test/dummy/db/development.sqlite3
|
139
|
-
- test/dummy/db/schema.rb
|
140
136
|
- test/dummy/db/test.sqlite3
|
141
137
|
- test/dummy/lib/assets/.keep
|
142
138
|
- test/dummy/log/.keep
|
@@ -171,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
167
|
version: '0'
|
172
168
|
requirements: []
|
173
169
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.4.5
|
170
|
+
rubygems_version: 2.4.5.1
|
175
171
|
signing_key:
|
176
172
|
specification_version: 4
|
177
173
|
summary: DelayedJob Progress extension
|
@@ -206,7 +202,6 @@ test_files:
|
|
206
202
|
- test/dummy/config/secrets.yml
|
207
203
|
- test/dummy/config.ru
|
208
204
|
- test/dummy/db/development.sqlite3
|
209
|
-
- test/dummy/db/schema.rb
|
210
205
|
- test/dummy/db/test.sqlite3
|
211
206
|
- test/dummy/log/development.log
|
212
207
|
- test/dummy/log/test.log
|
data/Gemfile.lock
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
delayed_job_progress (0.0.0)
|
5
|
-
delayed_job (>= 4.0)
|
6
|
-
delayed_job_active_record (>= 4.0)
|
7
|
-
rails (>= 4.0.0, < 5)
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: https://rubygems.org/
|
11
|
-
specs:
|
12
|
-
actionmailer (4.2.4)
|
13
|
-
actionpack (= 4.2.4)
|
14
|
-
actionview (= 4.2.4)
|
15
|
-
activejob (= 4.2.4)
|
16
|
-
mail (~> 2.5, >= 2.5.4)
|
17
|
-
rails-dom-testing (~> 1.0, >= 1.0.5)
|
18
|
-
actionpack (4.2.4)
|
19
|
-
actionview (= 4.2.4)
|
20
|
-
activesupport (= 4.2.4)
|
21
|
-
rack (~> 1.6)
|
22
|
-
rack-test (~> 0.6.2)
|
23
|
-
rails-dom-testing (~> 1.0, >= 1.0.5)
|
24
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
25
|
-
actionview (4.2.4)
|
26
|
-
activesupport (= 4.2.4)
|
27
|
-
builder (~> 3.1)
|
28
|
-
erubis (~> 2.7.0)
|
29
|
-
rails-dom-testing (~> 1.0, >= 1.0.5)
|
30
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
31
|
-
activejob (4.2.4)
|
32
|
-
activesupport (= 4.2.4)
|
33
|
-
globalid (>= 0.3.0)
|
34
|
-
activemodel (4.2.4)
|
35
|
-
activesupport (= 4.2.4)
|
36
|
-
builder (~> 3.1)
|
37
|
-
activerecord (4.2.4)
|
38
|
-
activemodel (= 4.2.4)
|
39
|
-
activesupport (= 4.2.4)
|
40
|
-
arel (~> 6.0)
|
41
|
-
activesupport (4.2.4)
|
42
|
-
i18n (~> 0.7)
|
43
|
-
json (~> 1.7, >= 1.7.7)
|
44
|
-
minitest (~> 5.1)
|
45
|
-
thread_safe (~> 0.3, >= 0.3.4)
|
46
|
-
tzinfo (~> 1.1)
|
47
|
-
arel (6.0.3)
|
48
|
-
builder (3.2.2)
|
49
|
-
delayed_job (4.0.6)
|
50
|
-
activesupport (>= 3.0, < 5.0)
|
51
|
-
delayed_job_active_record (4.0.3)
|
52
|
-
activerecord (>= 3.0, < 5.0)
|
53
|
-
delayed_job (>= 3.0, < 4.1)
|
54
|
-
erubis (2.7.0)
|
55
|
-
globalid (0.3.6)
|
56
|
-
activesupport (>= 4.1.0)
|
57
|
-
i18n (0.7.0)
|
58
|
-
json (1.8.3)
|
59
|
-
loofah (2.0.3)
|
60
|
-
nokogiri (>= 1.5.9)
|
61
|
-
mail (2.6.3)
|
62
|
-
mime-types (>= 1.16, < 3)
|
63
|
-
mime-types (2.6.1)
|
64
|
-
mini_portile (0.6.2)
|
65
|
-
minitest (5.8.0)
|
66
|
-
nokogiri (1.6.6.2)
|
67
|
-
mini_portile (~> 0.6.0)
|
68
|
-
rack (1.6.4)
|
69
|
-
rack-test (0.6.3)
|
70
|
-
rack (>= 1.0)
|
71
|
-
rails (4.2.4)
|
72
|
-
actionmailer (= 4.2.4)
|
73
|
-
actionpack (= 4.2.4)
|
74
|
-
actionview (= 4.2.4)
|
75
|
-
activejob (= 4.2.4)
|
76
|
-
activemodel (= 4.2.4)
|
77
|
-
activerecord (= 4.2.4)
|
78
|
-
activesupport (= 4.2.4)
|
79
|
-
bundler (>= 1.3.0, < 2.0)
|
80
|
-
railties (= 4.2.4)
|
81
|
-
sprockets-rails
|
82
|
-
rails-deprecated_sanitizer (1.0.3)
|
83
|
-
activesupport (>= 4.2.0.alpha)
|
84
|
-
rails-dom-testing (1.0.7)
|
85
|
-
activesupport (>= 4.2.0.beta, < 5.0)
|
86
|
-
nokogiri (~> 1.6.0)
|
87
|
-
rails-deprecated_sanitizer (>= 1.0.1)
|
88
|
-
rails-html-sanitizer (1.0.2)
|
89
|
-
loofah (~> 2.0)
|
90
|
-
railties (4.2.4)
|
91
|
-
actionpack (= 4.2.4)
|
92
|
-
activesupport (= 4.2.4)
|
93
|
-
rake (>= 0.8.7)
|
94
|
-
thor (>= 0.18.1, < 2.0)
|
95
|
-
rake (10.4.2)
|
96
|
-
sprockets (3.3.3)
|
97
|
-
rack (~> 1.0)
|
98
|
-
sprockets-rails (2.3.2)
|
99
|
-
actionpack (>= 3.0)
|
100
|
-
activesupport (>= 3.0)
|
101
|
-
sprockets (>= 2.8, < 4.0)
|
102
|
-
sqlite3 (1.3.10)
|
103
|
-
thor (0.19.1)
|
104
|
-
thread_safe (0.3.5)
|
105
|
-
tzinfo (1.2.2)
|
106
|
-
thread_safe (~> 0.1)
|
107
|
-
|
108
|
-
PLATFORMS
|
109
|
-
ruby
|
110
|
-
|
111
|
-
DEPENDENCIES
|
112
|
-
delayed_job_progress!
|
113
|
-
sqlite3
|
@@ -1,29 +0,0 @@
|
|
1
|
-
class AddProgressToDelayedJobs < ActiveRecord::Migration
|
2
|
-
|
3
|
-
def self.up
|
4
|
-
change_table :delayed_jobs do |t|
|
5
|
-
t.string :identifier
|
6
|
-
t.string :record_type
|
7
|
-
t.integer :record_id
|
8
|
-
t.integer :progress_current, :null => false, :default => 0
|
9
|
-
t.integer :progress_max, :null => false, :default => 100
|
10
|
-
t.string :progress_state
|
11
|
-
t.datetime :completed_at
|
12
|
-
end
|
13
|
-
|
14
|
-
add_index :delayed_jobs, :identifier
|
15
|
-
add_index :delayed_jobs, [:record_type, :record_id]
|
16
|
-
add_index :delayed_jobs, :completed_at
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.down
|
20
|
-
remove_column :delayed_jobs, :identifier
|
21
|
-
remove_column :delayed_jobs, :record_type
|
22
|
-
remove_column :delayed_jobs, :record_id
|
23
|
-
remove_column :delayed_jobs, :progress_current
|
24
|
-
remove_column :delayed_jobs, :progress_max
|
25
|
-
remove_column :delayed_jobs, :progress_state
|
26
|
-
remove_column :delayed_jobs, :completed_at
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
data/test/dummy/db/schema.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
# This file is auto-generated from the current state of the database. Instead
|
3
|
-
# of editing this file, please use the migrations feature of Active Record to
|
4
|
-
# incrementally modify your database, and then regenerate this schema definition.
|
5
|
-
#
|
6
|
-
# Note that this schema.rb definition is the authoritative source for your
|
7
|
-
# database schema. If you need to create the application database on another
|
8
|
-
# system, you should be using db:schema:load, not running all the migrations
|
9
|
-
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
10
|
-
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
11
|
-
#
|
12
|
-
# It's strongly recommended that you check this file into your version control system.
|
13
|
-
|
14
|
-
ActiveRecord::Schema.define(version: 0) do
|
15
|
-
|
16
|
-
end
|