dalliance 0.5.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,8 @@
1
1
  module Dalliance
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 5
5
- TINY = 0
4
+ MINOR = 8
5
+ TINY = 1
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -1,15 +1,20 @@
1
1
  module Dalliance
2
2
  module Workers
3
- if defined?(Rails) && ::Rails::VERSION::MAJOR >= 4 && ::Rails::VERSION::MINOR >= 2
3
+ if defined?(Rails)
4
4
  class DelayedJob < ::ActiveJob::Base
5
5
  queue_as :dalliance
6
6
 
7
- def self.enqueue(instance, queue = 'dalliance')
8
- Dalliance::Workers::DelayedJob.set(queue: queue).perform_later(instance.class.name, instance.id)
7
+ def self.enqueue(instance, queue = 'dalliance', perform_method)
8
+ Dalliance::Workers::DelayedJob
9
+ .set(queue: queue)
10
+ .perform_later(instance.class.name, instance.id, perform_method.to_s)
9
11
  end
10
12
 
11
- def perform(instance_klass, instance_id)
12
- instance_klass.constantize.find(instance_id).dalliance_process(true)
13
+ def perform(instance_klass, instance_id, perform_method)
14
+ instance_klass
15
+ .constantize
16
+ .find(instance_id)
17
+ .send(perform_method, true)
13
18
  end
14
19
 
15
20
  #Delayed job automatically retries, so rescue the error
@@ -18,13 +23,19 @@ module Dalliance
18
23
  end
19
24
  end
20
25
  else
21
- class DelayedJob < Struct.new(:instance_klass, :instance_id)
22
- def self.enqueue(instance, queue = 'dalliance')
23
- ::Delayed::Job.enqueue(self.new(instance.class.name, instance.id), :queue => queue)
26
+ class DelayedJob < Struct.new(:instance_klass, :instance_id, :perform_method)
27
+ def self.enqueue(instance, queue = 'dalliance', perform_method)
28
+ ::Delayed::Job.enqueue(
29
+ self.new(instance.class.name, instance.id, perform_method),
30
+ :queue => queue
31
+ )
24
32
  end
25
33
 
26
34
  def perform
27
- instance_klass.constantize.find(instance_id).dalliance_process(true)
35
+ instance_klass
36
+ .constantize
37
+ .find(instance_id)
38
+ .send(perform_method, true)
28
39
  end
29
40
 
30
41
  #Delayed job automatically retries, so rescue the error
@@ -1,15 +1,20 @@
1
1
  module Dalliance
2
2
  module Workers
3
- if defined?(Rails) && ::Rails::VERSION::MAJOR >= 4 && ::Rails::VERSION::MINOR >= 2
3
+ if defined?(Rails)
4
4
  class Resque < ::ActiveJob::Base
5
5
  queue_as :dalliance
6
6
 
7
- def self.enqueue(instance, queue = 'dalliance')
8
- Dalliance::Workers::Resque.set(queue: queue).perform_later(instance.class.name, instance.id)
7
+ def self.enqueue(instance, queue = 'dalliance', perform_method)
8
+ Dalliance::Workers::Resque
9
+ .set(queue: queue)
10
+ .perform_later(instance.class.name, instance.id, perform_method.to_s)
9
11
  end
10
12
 
11
- def perform(instance_klass, instance_id)
12
- instance_klass.constantize.find(instance_id).dalliance_process(true)
13
+ def perform(instance_klass, instance_id, perform_method)
14
+ instance_klass
15
+ .constantize
16
+ .find(instance_id)
17
+ .send(perform_method, true)
13
18
  end
14
19
 
15
20
  #Resque fails, so don't rescue the error
@@ -19,12 +24,15 @@ module Dalliance
19
24
  end
20
25
  else
21
26
  class Resque
22
- def self.enqueue(instance, queue = 'dalliance')
23
- ::Resque.enqueue_to(queue, self, instance.class.name, instance.id)
27
+ def self.enqueue(instance, queue = 'dalliance', perform_method)
28
+ ::Resque.enqueue_to(queue, self, instance.class.name, instance.id, perform_method.to_s)
24
29
  end
25
30
 
26
- def self.perform(instance_klass, instance_id)
27
- instance_klass.constantize.find(instance_id).dalliance_process(true)
31
+ def self.perform(instance_klass, instance_id, perform_method)
32
+ instance_klass
33
+ .constantize
34
+ .find(instance_id)
35
+ .send(perform_method, true)
28
36
  end
29
37
 
30
38
  #Resque fails, so don't rescue the error
@@ -77,6 +77,48 @@ RSpec.describe DallianceModel do
77
77
  expect(subject.dalliance_duration).not_to eq(nil)
78
78
  end
79
79
 
80
+ context 'reprocess' do
81
+ before(:all) do
82
+ DallianceModel.dalliance_options[:dalliance_method] = :dalliance_success_method
83
+ DallianceModel.dalliance_options[:worker_class] = Dalliance::Workers::DelayedJob
84
+ DallianceModel.dalliance_options[:queue] = 'dalliance'
85
+ end
86
+
87
+ before do
88
+ subject.dalliance_process
89
+ subject.reload
90
+ end
91
+
92
+ it 'successfully runs the dalliance_reprocess method' do
93
+ subject.dalliance_background_reprocess
94
+ Delayed::Worker.new(:queues => [:dalliance]).work_off
95
+ subject.reload
96
+
97
+ expect(subject).to be_successful
98
+ expect(Delayed::Job.count).to eq(0)
99
+ expect(subject.reprocessed_count).to eq(1)
100
+ end
101
+
102
+ it 'increases the total processing time counter' do
103
+ original_duration = subject.dalliance_duration
104
+ subject.dalliance_background_reprocess
105
+ Delayed::Worker.new(:queues => [:dalliance]).work_off
106
+ subject.reload
107
+
108
+ expect(subject.dalliance_duration).to be_between(original_duration, Float::INFINITY)
109
+ end
110
+
111
+ it "resets the dalliance_status to 'pending'" do
112
+ subject.update_column(:dalliance_status, 'processing_error')
113
+ expect { subject.dalliance_background_reprocess }
114
+ .to change(subject, :dalliance_status)
115
+ .to('pending')
116
+
117
+ Delayed::Worker.new(:queues => [:dalliance]).work_off
118
+ expect(subject).to be_successful
119
+ end
120
+ end
121
+
80
122
  context "another_queue" do
81
123
  let(:queue) { 'dalliance_2'}
82
124
 
@@ -114,6 +114,60 @@ RSpec.describe DallianceModel do
114
114
  end
115
115
  end
116
116
 
117
+ context 'reprocess' do
118
+ before :all do
119
+ DallianceModel.dalliance_options[:dalliance_method] = :dalliance_success_method
120
+ DallianceModel.dalliance_options[:worker_class] = Dalliance::Workers::Resque
121
+ DallianceModel.dalliance_options[:queue] = 'dalliance'
122
+ end
123
+
124
+ before do
125
+ subject.dalliance_process
126
+ subject.reload
127
+ end
128
+
129
+ it 'successfully runs the dalliance_reprocess method' do
130
+ Resque::Stat.clear(:processed)
131
+ Resque::Stat.clear(:failed)
132
+
133
+ subject.dalliance_background_reprocess
134
+ Resque::Worker.new(:dalliance).process
135
+ subject.reload
136
+
137
+ aggregate_failures do
138
+ expect(subject).to be_successful
139
+ expect(Resque.size(:dalliance)).to eq(0)
140
+ expect(Resque::Stat[:processed]).to eq(1)
141
+ expect(Resque::Stat[:failed]).to eq(0)
142
+ expect(subject.reprocessed_count).to eq(1)
143
+ end
144
+ end
145
+
146
+ it 'increases the total processing time counter' do
147
+ original_duration = subject.dalliance_duration
148
+ subject.dalliance_background_reprocess
149
+ Delayed::Worker.new(:queues => [:dalliance]).work_off
150
+ subject.reload
151
+
152
+ expect(subject.dalliance_duration).to be_between(original_duration, Float::INFINITY)
153
+ end
154
+
155
+ it "resets the dalliance_status to 'pending'" do
156
+ subject.update_column(:dalliance_status, 'processing_error')
157
+
158
+ Resque::Stat.clear(:processed)
159
+ Resque::Stat.clear(:failed)
160
+
161
+ expect { subject.dalliance_background_reprocess }
162
+ .to change(subject, :dalliance_status)
163
+ .to('pending')
164
+
165
+ Resque::Worker.new(:dalliance).process
166
+
167
+ expect(subject).to be_successful
168
+ end
169
+ end
170
+
117
171
  context "raise error" do
118
172
  before(:all) do
119
173
  DallianceModel.dalliance_options[:dalliance_method] = :dalliance_error_method
@@ -21,7 +21,7 @@ RSpec.describe 'Dalliance' do
21
21
 
22
22
  context "human_attribute_name" do
23
23
  it "should display the correct locale" do
24
- expect(DallianceModel.human_attribute_name(:dalliance_status)).to eq ('Status')
24
+ expect(DallianceModel.human_attribute_name(:dalliance_status)).to eq('Status')
25
25
  end
26
26
  end
27
27
 
@@ -44,7 +44,7 @@ RSpec.describe 'Dalliance' do
44
44
  end
45
45
 
46
46
  context "w/ args" do
47
- let(:queue) { Proc.new{ |a,b,c| 'dalliance_2' } }
47
+ let(:queue) { Proc.new{ |_a,_b,_c| 'dalliance_2' } }
48
48
 
49
49
  specify{ expect(subject.processing_queue).to eq(queue.call) }
50
50
  end
@@ -35,6 +35,61 @@ RSpec.describe DallianceModel do
35
35
  end
36
36
  end
37
37
 
38
+ context 'reprocess' do
39
+ context 'without having already processed' do
40
+ it 'raises an error' do
41
+ expect { subject.dalliance_background_reprocess }
42
+ .to raise_error(
43
+ StateMachine::InvalidTransition,
44
+ /^Cannot transition dalliance_status via :reprocess_dalliance from :pending.*/
45
+ )
46
+ end
47
+ end
48
+
49
+ context 'when the model has already processed' do
50
+ before do
51
+ DallianceModel.dalliance_options[:dalliance_method] = :dalliance_success_method
52
+ subject.dalliance_background_process
53
+ subject.reload
54
+ end
55
+
56
+ it 'calls the dalliance_reprocess method' do
57
+ expect { subject.dalliance_background_reprocess }
58
+ .to change(subject, :reprocessed_count)
59
+ .from(0)
60
+ .to(1)
61
+ end
62
+
63
+ it 'can call the dalliance_reprocess method many times in succession' do
64
+ expect { 10.times { subject.dalliance_background_reprocess } }
65
+ .to change(subject, :reprocessed_count)
66
+ .from(0)
67
+ .to(10)
68
+ end
69
+
70
+ it 'sets the dalliance_status to completed' do
71
+ expect { subject.dalliance_background_reprocess }
72
+ .not_to change { subject.reload.dalliance_status }
73
+ .from('completed')
74
+ end
75
+
76
+ it 'sets the dalliance_progress to 100' do
77
+ expect { subject.dalliance_background_reprocess }
78
+ .not_to change { subject.reload.dalliance_progress }
79
+ .from(100)
80
+ end
81
+
82
+ it 'increases the total processing time counter' do
83
+ original_duration = subject.dalliance_duration
84
+ subject.dalliance_background_reprocess
85
+ Delayed::Worker.new(:queues => [:dalliance]).work_off
86
+ subject.reload
87
+
88
+ expect(subject.dalliance_duration).to be_between(original_duration, Float::INFINITY)
89
+ end
90
+ end
91
+ end
92
+
38
93
  context "raise error" do
39
94
  before(:all) do
40
95
  DallianceModel.dalliance_options[:dalliance_method] = :dalliance_error_method
@@ -121,7 +176,7 @@ RSpec.describe DallianceModel do
121
176
  end
122
177
  end
123
178
 
124
- context "destroy" do
179
+ context "destroy" do
125
180
  it "should return false when pending?" do
126
181
  subject.update_column(:dalliance_status, 'pending')
127
182
  expect(subject.destroy).to be_falsey
@@ -4,10 +4,12 @@ require 'bundler/setup'
4
4
  #Automatically included in a rails app...
5
5
  require 'active_support'
6
6
 
7
+ # rubocop:disable Lint/SuppressedException
7
8
  begin
8
9
  require 'active_job'
9
10
  rescue LoadError
10
11
  end
12
+ # rubocop:enable Lint/SuppressedException
11
13
 
12
14
  require 'state_machine'
13
15
  require 'byebug'
@@ -6,7 +6,7 @@ ActiveRecord::Migration.verbose = false
6
6
 
7
7
  ActiveRecord::Schema.define do
8
8
  create_table :dalliance_progress_meters, :force => true do |t|
9
- t.belongs_to :dalliance_progress_model, :polymorphic => true
9
+ t.belongs_to :dalliance_progress_model, :polymorphic => true, index: { name: "by_dalliance_progress_model" }
10
10
 
11
11
  t.integer :current_count
12
12
  t.integer :total_count
@@ -15,7 +15,7 @@ ActiveRecord::Schema.define do
15
15
  t.timestamps null: false
16
16
  end
17
17
 
18
- add_index :dalliance_progress_meters, [:dalliance_progress_model_id, :dalliance_progress_model_type], :name => 'by_dalliance_progress_model'
18
+ # add_index :dalliance_progress_meters, [:dalliance_progress_model_id, :dalliance_progress_model_type], :name => 'by_dalliance_progress_model'
19
19
 
20
20
  create_table :delayed_jobs, :force => true do |table|
21
21
  table.integer :priority, :default => 0
@@ -35,9 +35,10 @@ ActiveRecord::Schema.define do
35
35
  create_table :dalliance_models, :force => true do |t|
36
36
  t.text :dalliance_error_hash
37
37
  t.string :dalliance_status, :string, :null => false, :default => 'pending'
38
- t.integer :dalliance_duration
38
+ t.decimal :dalliance_duration
39
39
 
40
40
  t.boolean :successful, :default => false
41
+ t.integer :reprocessed_count, default: 0
41
42
  end
42
43
  end
43
44
 
@@ -47,12 +48,17 @@ class DallianceModel < ActiveRecord::Base
47
48
  include Dalliance::Glue
48
49
 
49
50
  dalliance :dalliance_success_method,
51
+ reprocess_method: :dalliance_reprocess_method,
50
52
  :logger => nil
51
53
 
52
54
  def dalliance_success_method
53
55
  update_attribute(:successful, true)
54
56
  end
55
57
 
58
+ def dalliance_reprocess_method
59
+ update_attribute(:reprocessed_count, self.reprocessed_count + 1)
60
+ end
61
+
56
62
  def dalliance_error_method
57
63
  raise RuntimeError
58
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dalliance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Sullivan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2020-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.2'
20
- - - "<="
19
+ version: '5.0'
20
+ - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: 5.1.4
22
+ version: '6.1'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '3.2'
30
- - - "<="
29
+ version: '5.0'
30
+ - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: 5.1.4
32
+ version: '6.1'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: state_machine
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -114,6 +114,48 @@ dependencies:
114
114
  - - ">="
115
115
  - !ruby/object:Gem::Version
116
116
  version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: bundler-audit
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.78'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.78'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec_junit_formatter
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
117
159
  description: " Background processing for ActiveRecord using a 'delayable' worker and
118
160
  a state_machine "
119
161
  email:
@@ -122,6 +164,7 @@ executables: []
122
164
  extensions: []
123
165
  extra_rdoc_files: []
124
166
  files:
167
+ - ".circleci/config.yml"
125
168
  - ".gitignore"
126
169
  - ".rspec"
127
170
  - Appraisals
@@ -131,20 +174,14 @@ files:
131
174
  - Rakefile
132
175
  - config/locales/en.yml
133
176
  - dalliance.gemspec
134
- - gemfiles/rails_3.1.gemfile
135
- - gemfiles/rails_3.1.gemfile.lock
136
- - gemfiles/rails_3.2.gemfile
137
- - gemfiles/rails_3.2.gemfile.lock
138
- - gemfiles/rails_4.0.gemfile
139
- - gemfiles/rails_4.0.gemfile.lock
140
- - gemfiles/rails_4.1.gemfile
141
- - gemfiles/rails_4.1.gemfile.lock
142
- - gemfiles/rails_4.2.gemfile
143
- - gemfiles/rails_4.2.gemfile.lock
144
177
  - gemfiles/rails_5.0.gemfile
145
178
  - gemfiles/rails_5.0.gemfile.lock
146
179
  - gemfiles/rails_5.1.gemfile
147
180
  - gemfiles/rails_5.1.gemfile.lock
181
+ - gemfiles/rails_5.2.gemfile
182
+ - gemfiles/rails_5.2.gemfile.lock
183
+ - gemfiles/rails_6.0.gemfile
184
+ - gemfiles/rails_6.0.gemfile.lock
148
185
  - lib/dalliance.rb
149
186
  - lib/dalliance/engine.rb
150
187
  - lib/dalliance/progress_meter.rb
@@ -167,7 +204,7 @@ files:
167
204
  homepage: https://github.com/annkissam/dalliance
168
205
  licenses: []
169
206
  metadata: {}
170
- post_install_message:
207
+ post_install_message:
171
208
  rdoc_options: []
172
209
  require_paths:
173
210
  - lib
@@ -182,9 +219,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
219
  - !ruby/object:Gem::Version
183
220
  version: '0'
184
221
  requirements: []
185
- rubyforge_project: dalliance
186
- rubygems_version: 2.6.14
187
- signing_key:
222
+ rubyforge_project:
223
+ rubygems_version: 2.7.6
224
+ signing_key:
188
225
  specification_version: 4
189
226
  summary: Wrapper for an ActiveRecord model with a single ascynhronous method
190
227
  test_files: