sequenced_mailer 0.1.0 → 0.2.0
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/.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.
|