sequenced_mailer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +70 -0
- data/CHANGELOG.md +5 -0
- data/app/concerns/mailing/sequenceable.rb +2 -2
- data/app/models/mailing/sequence.rb +8 -23
- data/app/models/mailing/sequence_owner.rb +16 -4
- data/app/models/mailing/sequence_step.rb +4 -0
- data/lib/generators/sequenced_mailer/utils.rb +2 -2
- data/lib/sequenced_mailer/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6075f7b3859cbdc368cc29e479e71e88cf305677edd0cd1216992e1485de7e0
|
4
|
+
data.tar.gz: e6c0388cf8a66da75a8360d035a92a2c15142fa5b44f08f1045c766fc5ae94ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f64c966850c580123f675825dcab14610a70c2853237127a7a9dd234ca42342be923542bf9f07e18efe3b4a2d54bc4980c05a7804e091bcd7bbdf4a218637c6e
|
7
|
+
data.tar.gz: dc585a8b953adb9bafec2d1158e6d177313cea4214b69b237693c72d12ef9e8fa87839e917b980159f1d23b656c0a0702237d927c59bac43f5c4703ce2c9e35a
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require:
|
2
|
+
- standard
|
3
|
+
- rubocop-rails
|
4
|
+
- rubocop-rspec
|
5
|
+
- rubocop-performance
|
6
|
+
- rubocop-capybara
|
7
|
+
- rubocop-factory_bot
|
8
|
+
|
9
|
+
inherit_gem:
|
10
|
+
standard: config/base.yml
|
11
|
+
|
12
|
+
AllCops:
|
13
|
+
NewCops: enable
|
14
|
+
TargetRubyVersion: 3.2
|
15
|
+
Exclude:
|
16
|
+
- node_modules/**/*
|
17
|
+
- public/**/*
|
18
|
+
- vendor/**/*
|
19
|
+
- db/**/*
|
20
|
+
- bin/**/*
|
21
|
+
|
22
|
+
Rails:
|
23
|
+
Enabled: true # enable rubocop-rails cops
|
24
|
+
Rails/OutputSafety:
|
25
|
+
Enabled: false
|
26
|
+
Rails/I18nLocaleTexts:
|
27
|
+
Enabled: false
|
28
|
+
Rails/Output:
|
29
|
+
Enabled: false
|
30
|
+
Style/RedundantRegexpEscape:
|
31
|
+
Enabled: false
|
32
|
+
Rails/UnknownEnv:
|
33
|
+
Environments:
|
34
|
+
- production
|
35
|
+
- development
|
36
|
+
- test
|
37
|
+
- staging
|
38
|
+
|
39
|
+
RSpec:
|
40
|
+
Enabled: true # enable rubocop-rspec cops
|
41
|
+
RSpec/DescribeClass:
|
42
|
+
Enabled: false # ignore missing comments on classes
|
43
|
+
RSpec/ExampleLength:
|
44
|
+
Enabled: false
|
45
|
+
RSpec/MultipleExpectations:
|
46
|
+
Enabled: false
|
47
|
+
RSpec/Focus:
|
48
|
+
Enabled: false
|
49
|
+
RSpec/FilePath:
|
50
|
+
IgnoreMethods: true
|
51
|
+
RSpec/MultipleMemoizedHelpers:
|
52
|
+
Enabled: false
|
53
|
+
RSpec/NestedGroups:
|
54
|
+
Enabled: false
|
55
|
+
Rails/RakeEnvironment:
|
56
|
+
Enabled: false
|
57
|
+
Rails/ApplicationRecord:
|
58
|
+
Enabled: false
|
59
|
+
Rails/FindEach:
|
60
|
+
Enabled: false
|
61
|
+
RSpec/AnyInstance:
|
62
|
+
Enabled: false
|
63
|
+
RSpec/MessageSpies:
|
64
|
+
Enabled: false
|
65
|
+
RSpec/ImplicitSubject:
|
66
|
+
Enabled: false
|
67
|
+
Rails/HelperInstanceVariable:
|
68
|
+
Enabled: false
|
69
|
+
RSpec/IndexedLet:
|
70
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -7,7 +7,7 @@ module Mailing::Sequenceable
|
|
7
7
|
def add_to_sequence(name)
|
8
8
|
logger.debug { "Will try to add to sequence: #{name}" }
|
9
9
|
sequence = Mailing::Sequence.find_by(name: name)
|
10
|
-
return
|
10
|
+
return if sequence.blank?
|
11
11
|
|
12
12
|
if sequence_owners.where(mailing_sequence_id: sequence.id, canceled_at: nil).any?
|
13
13
|
logger.debug { "User is already in the sequence" }
|
@@ -18,7 +18,7 @@ module Mailing::Sequenceable
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def cancel_sequence(name)
|
21
|
-
sequence_owner = sequence_owners.joins(:sequence).where(sequence: {
|
21
|
+
sequence_owner = sequence_owners.joins(:sequence).where(sequence: {name: name}).first
|
22
22
|
return if sequence_owner.blank?
|
23
23
|
|
24
24
|
sequence_owner.cancel!
|
@@ -1,8 +1,10 @@
|
|
1
1
|
class Mailing::Sequence < ActiveRecord::Base
|
2
2
|
validates :name, presence: true, uniqueness: true
|
3
3
|
|
4
|
-
has_many :sequence_owners, class_name: "Mailing::SequenceOwner", dependent: :destroy, inverse_of: :sequence,
|
5
|
-
|
4
|
+
has_many :sequence_owners, class_name: "Mailing::SequenceOwner", dependent: :destroy, inverse_of: :sequence,
|
5
|
+
foreign_key: "mailing_sequence_id"
|
6
|
+
has_many :steps, class_name: "Mailing::SequenceStep", dependent: :destroy, foreign_key: :mailing_sequence_id,
|
7
|
+
inverse_of: :sequence
|
6
8
|
has_many :owners, through: :sequence_owners, source_type: "User"
|
7
9
|
|
8
10
|
def self.name_and_steps_count
|
@@ -13,29 +15,12 @@ class Mailing::Sequence < ActiveRecord::Base
|
|
13
15
|
def self.send_mails(dry_run: false)
|
14
16
|
name_and_steps_count.each do |name, steps_count|
|
15
17
|
logger.debug { "Sending mails for #{name} (#{steps_count} steps)" }
|
16
|
-
Mailing::SequenceOwner.joins(:sequence).where(sequence: {name: name})
|
17
|
-
|
18
|
+
Mailing::SequenceOwner.joins(:sequence).where(sequence: {name: name})
|
19
|
+
.where("current_step < ? ", steps_count)
|
20
|
+
.where(canceled_at: nil).each do |owner|
|
21
|
+
logger.debug { "\tIf ready, will send mail to #{owner.owner_name} current_step is #{owner.current_step}" }
|
18
22
|
owner.send_next_step_if_ready(dry_run: dry_run)
|
19
23
|
end
|
20
24
|
end
|
21
25
|
end
|
22
|
-
|
23
|
-
def self.sequences_and_steps_names
|
24
|
-
{"onboarding_admin_sigilium" => {user_promoted: 0},
|
25
|
-
"onboarding_sigilium" => {welcome: 1},
|
26
|
-
"subscription_failed_payment" => {first_alert: 1}}
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.seed
|
30
|
-
sequences_and_steps_names.each do |sequence_name, steps_details|
|
31
|
-
sequence = Mailing::Sequence.find_or_create_by(name: sequence_name)
|
32
|
-
steps_details.each.with_index do |step_details, index|
|
33
|
-
step_name, days_after_last_step = step_details
|
34
|
-
step = sequence.steps.find_or_initialize_by(name: step_name)
|
35
|
-
step.days_after_last_step = days_after_last_step
|
36
|
-
step.position = index + 1
|
37
|
-
step.save!
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
26
|
end
|
@@ -4,20 +4,28 @@ class Mailing::SequenceOwner < ActiveRecord::Base
|
|
4
4
|
delegate :steps, to: :sequence
|
5
5
|
after_create :send_next_step_if_ready
|
6
6
|
|
7
|
-
delegate :name, to: :next_step, prefix: true
|
7
|
+
delegate :name, :ready_at, to: :next_step, prefix: true
|
8
8
|
delegate :name, to: :owner, prefix: true
|
9
9
|
delegate :name, to: :sequence, prefix: true
|
10
10
|
|
11
11
|
def owner_name
|
12
|
-
if owner.respond_to?(:
|
13
|
-
owner.
|
12
|
+
if owner.respond_to?(:mailing_sequence_owner_description)
|
13
|
+
owner.mailing_sequence_owner_description
|
14
14
|
else
|
15
15
|
owner.name
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def description
|
20
|
-
["Sequence: #{sequence_name}", "Owner: #{owner_name}"
|
20
|
+
desc = ["Sequence: #{sequence_name}", "Owner: #{owner_name}"]
|
21
|
+
desc << "Canceled at: #{canceled_at}" if canceled?
|
22
|
+
desc << if last_step?
|
23
|
+
"Finished"
|
24
|
+
else
|
25
|
+
"Next Step : #{next_step_name}, ready to send at: #{I18n.l(next_step_ready_at)}"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc.join(" - ")
|
21
29
|
end
|
22
30
|
|
23
31
|
def cancel!
|
@@ -47,6 +55,10 @@ class Mailing::SequenceOwner < ActiveRecord::Base
|
|
47
55
|
next_step.ready_to_send?(last_activity_at)
|
48
56
|
end
|
49
57
|
|
58
|
+
def next_step_ready_at
|
59
|
+
next_step.ready_at(last_activity_at)
|
60
|
+
end
|
61
|
+
|
50
62
|
def last_step?
|
51
63
|
next_step.blank?
|
52
64
|
end
|
@@ -6,6 +6,10 @@ class Mailing::SequenceStep < ActiveRecord::Base
|
|
6
6
|
last_activity_at.beginning_of_day + days_after_last_step.days <= Time.zone.now
|
7
7
|
end
|
8
8
|
|
9
|
+
def ready_at(last_activity_at)
|
10
|
+
(last_activity_at.beginning_of_day + days_after_last_step.days).to_date
|
11
|
+
end
|
12
|
+
|
9
13
|
def send_to_owner(sequence_owner)
|
10
14
|
# on a un scheduler qui appel les mails à envoyer les jours ouvrés
|
11
15
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequenced_mailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Darde
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -88,6 +88,7 @@ extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
90
|
- ".rspec"
|
91
|
+
- ".rubocop.yml"
|
91
92
|
- ".standard.yml"
|
92
93
|
- CHANGELOG.md
|
93
94
|
- CODE_OF_CONDUCT.md
|
@@ -130,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
131
|
- !ruby/object:Gem::Version
|
131
132
|
version: '0'
|
132
133
|
requirements: []
|
133
|
-
rubygems_version: 3.4.
|
134
|
+
rubygems_version: 3.4.15
|
134
135
|
signing_key:
|
135
136
|
specification_version: 4
|
136
137
|
summary: Send emails in sequence.
|