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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f10a1518274cbebdac21ddee3a8fe759b53bba5f65601991025bad9822d53ca6
4
- data.tar.gz: 2675de6f53963f9cd1ce5fc8e9f0e6e97811a6b7ec5d170f2a8cf5f225c92ce5
3
+ metadata.gz: b6075f7b3859cbdc368cc29e479e71e88cf305677edd0cd1216992e1485de7e0
4
+ data.tar.gz: e6c0388cf8a66da75a8360d035a92a2c15142fa5b44f08f1045c766fc5ae94ed
5
5
  SHA512:
6
- metadata.gz: a8071455c749d4facad14150af141f65ed425c6743b20aad4ca257cd47a837db8727e434400d8f0ddeb4e2f588f1e27e43917a2a9abd79afd192c7303df5e8d9
7
- data.tar.gz: 2e41f703928a33497433ebb6b942a03077c05bf1bf8bcd8b93775252cdd325bfd303362e85df9edd50a4d9469daa4ec597426e8ac1be1f4bd4f0c6b793a9fb14
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
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.0] - 2023-07-05
4
+
5
+ - Add a description to sequence owner
6
+
7
+
3
8
  ## [0.1.0] - 2023-06-20
4
9
 
5
10
  - Initial release
@@ -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 unless sequence.present?
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: { name: name }).first
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, foreign_key: "mailing_sequence_id"
5
- has_many :steps, class_name: "Mailing::SequenceStep", dependent: :destroy, foreign_key: :mailing_sequence_id, inverse_of: :sequence
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}).where("current_step < ? ", steps_count).where(canceled_at: nil).each do |owner|
17
- logger.debug { "\tVerify to send mail to #{owner.owner_name} current_step is #{owner.current_step}" }
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?(:full_name)
13
- owner.full_name
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}", "Step: #{next_step_name}"].join(" - ")
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
  #
@@ -15,8 +15,8 @@ module SequencedMailer
15
15
  end
16
16
 
17
17
  def ask_boolean(wording, _default_value = nil)
18
- value = ask_for(wording, 'Y')
19
- value = (value == 'Y')
18
+ value = ask_for(wording, "Y")
19
+ (value == "Y")
20
20
  end
21
21
  end
22
22
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SequencedMailer
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
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.1.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-01 00:00:00.000000000 Z
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.14
134
+ rubygems_version: 3.4.15
134
135
  signing_key:
135
136
  specification_version: 4
136
137
  summary: Send emails in sequence.