sequenced_mailer 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f10a1518274cbebdac21ddee3a8fe759b53bba5f65601991025bad9822d53ca6
4
- data.tar.gz: 2675de6f53963f9cd1ce5fc8e9f0e6e97811a6b7ec5d170f2a8cf5f225c92ce5
3
+ metadata.gz: 7d0775ad0570a009c8ad988db86629860abc9da64a2277f57ec8a23b9caf6d10
4
+ data.tar.gz: 1cc2d3ee3d5483ef16f2cea2ffde0d4571ee77295823ebd0e6c6ac1c17c3b3fd
5
5
  SHA512:
6
- metadata.gz: a8071455c749d4facad14150af141f65ed425c6743b20aad4ca257cd47a837db8727e434400d8f0ddeb4e2f588f1e27e43917a2a9abd79afd192c7303df5e8d9
7
- data.tar.gz: 2e41f703928a33497433ebb6b942a03077c05bf1bf8bcd8b93775252cdd325bfd303362e85df9edd50a4d9469daa4ec597426e8ac1be1f4bd4f0c6b793a9fb14
6
+ metadata.gz: 5a88739c87cd5fad2dff83fd3d83e8333603c4e7d7f4efc96b6e6cab5372df6fa13acfa764d3e9c83958de3d7e8b8eb587b07db303f93577e3f1f91ac4aae90c
7
+ data.tar.gz: 4d7a72e756ed8b1fe761a8a305f505417989cfd650fca82f2c935c01e6e974eee9a528f4d97b40f9f109c9b137fbacb95bacb48df276fc9ff0f0168f0a3b87b0
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,14 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.1] - 2023-07-05
4
+
5
+ - Try loading only activerecord
6
+
7
+ ## [0.2.0] - 2023-07-05
8
+
9
+ - Add a description to sequence owner
10
+
11
+
3
12
  ## [0.1.0] - 2023-06-20
4
13
 
5
14
  - 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.1"
5
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
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.1
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-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
@@ -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.20
134
135
  signing_key:
135
136
  specification_version: 4
136
137
  summary: Send emails in sequence.