dalliance 0.5.0 → 0.8.1

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.
@@ -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: