caffeinate 0.1.4 → 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: a76e8b67d3a3ab36c7805028f96cc78a7ee734afd966b27711ccbbfc18b0f8f3
4
- data.tar.gz: 5aa9c1bcf06842f1def891e6ca2bd911d5e47aa0f447ace61a3a217ace84eb8a
3
+ metadata.gz: 3032e43fad1742429e8961a3bfca1e522c9fcf19714c8cc998d6dea629c30a6e
4
+ data.tar.gz: a51f59c2d0767d18002051827590d31a7ab0b96ae570a1c048d0a37ab4446007
5
5
  SHA512:
6
- metadata.gz: 162f21354008999da301307dd3ef11d1a5bb3ed8232f54e6abbacf4906fcdf7aa2ad8c6a78683a5ef7816b68a99cdd98cbce1c2da20fa6b52a43543964a672f0
7
- data.tar.gz: 3bd71c2357d9e0a205ad66fe524b450df54832436c2ab08f54be288ea637a9cc878e336a533d4bff7e960f3be0e6e47405a1341f2b656981791e1fd0d36dba5e
6
+ metadata.gz: ede225ce8d0fbb71214411d38366ea43992da7b95428734af5c4134f496c04d2dbf2b4a940f19ffbbf24dde9c4536834b96051bd493ec3476897f6f376b2324a
7
+ data.tar.gz: acc6124e88a4d8e6beced5afc80e7774de78b60858940e579f821ed172ad14f6a033e7b0419c105c233806f94005f98d4dab73f25bbb53e40175d7dca289c9f2
@@ -2,18 +2,33 @@
2
2
 
3
3
  module Caffeinate
4
4
  class CampaignSubscriptionsController < ApplicationController
5
+ layout 'caffeinate'
6
+
7
+ helper_method :caffeinate_unsubscribe_url, :caffeinate_subscribe_url
8
+
5
9
  before_action :find_campaign_subscription!
6
10
 
7
11
  def unsubscribe
8
12
  @campaign_subscription.unsubscribe!
9
- render plain: 'You have been unsubscribed.'
13
+ end
14
+
15
+ def subscribe
16
+ @campaign_subscription.subscribe!
10
17
  end
11
18
 
12
19
  private
13
20
 
21
+ def caffeinate_subscribe_url(**options)
22
+ Caffeinate::UrlHelpers.caffeinate_subscribe_url(@campaign_subscription, options)
23
+ end
24
+
25
+ def caffeinate_unsubscribe_url
26
+ Caffeinate::UrlHelpers.caffeinate_unsubscribe_url(@campaign_subscription, options)
27
+ end
28
+
14
29
  def find_campaign_subscription!
15
30
  @campaign_subscription = ::Caffeinate::CampaignSubscription.find_by(token: params[:token])
16
- return render plain: '404' if @campaign_subscription.nil?
31
+ raise ::ActiveRecord::RecordNotFound if @campaign_subscription.nil?
17
32
  end
18
33
  end
19
34
  end
@@ -1,7 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # == Schema Information
4
+ #
5
+ # Table name: caffeinate_campaigns
6
+ #
7
+ # id :integer not null, primary key
8
+ # name :string not null
9
+ # slug :string not null
10
+ # created_at :datetime not null
11
+ # updated_at :datetime not null
12
+ #
3
13
  module Caffeinate
4
- # Campaign.
14
+ # Campaign ties together subscribers and mailings, and provides one core model for handling your Drippers.
5
15
  class Campaign < ApplicationRecord
6
16
  self.table_name = 'caffeinate_campaigns'
7
17
  has_many :caffeinate_campaign_subscriptions, class_name: 'Caffeinate::CampaignSubscription', foreign_key: :caffeinate_campaign_id
@@ -1,12 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # == Schema Information
4
+ #
5
+ # Table name: caffeinate_campaign_subscriptions
6
+ #
7
+ # id :integer not null, primary key
8
+ # caffeinate_campaign_id :integer not null
9
+ # subscriber_type :string not null
10
+ # subscriber_id :string not null
11
+ # user_type :string
12
+ # user_id :string
13
+ # token :string not null
14
+ # ended_at :datetime
15
+ # unsubscribed_at :datetime
16
+ # created_at :datetime not null
17
+ # updated_at :datetime not null
18
+ #
3
19
  module Caffeinate
4
- # CampaignSubscription associates an object and its optional user to a Campaign.
20
+ # CampaignSubscription associates an object and its optional user to a Campaign
21
+ # and its relevant Mailings.
5
22
  class CampaignSubscription < ApplicationRecord
6
23
  self.table_name = 'caffeinate_campaign_subscriptions'
7
24
 
8
25
  has_many :caffeinate_mailings, class_name: 'Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id
9
- has_one :next_caffeinate_mailing, -> { upcoming.unsent.limit(1).first }, class_name: 'Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id
26
+ has_one :next_caffeinate_mailing, -> { upcoming.unsent.limit(1).first }, class_name: '::Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id
10
27
  belongs_to :caffeinate_campaign, class_name: 'Caffeinate::Campaign', foreign_key: :caffeinate_campaign_id
11
28
  belongs_to :subscriber, polymorphic: true
12
29
  belongs_to :user, polymorphic: true, optional: true
@@ -37,12 +54,12 @@ module Caffeinate
37
54
  !ended? && !unsubscribed?
38
55
  end
39
56
 
40
- # Checks if the CampaignSubscription is not subscribed
57
+ # Checks if the CampaignSubscription is not subscribed by checking the presence of `unsubscribed_at`
41
58
  def unsubscribed?
42
- !subscribed?
59
+ unsubscribed_at.present?
43
60
  end
44
61
 
45
- # Checks if the CampaignSubscription is ended
62
+ # Checks if the CampaignSubscription is ended by checking the presence of `ended_at`
46
63
  def ended?
47
64
  ended_at.present?
48
65
  end
@@ -1,8 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # == Schema Information
4
+ #
5
+ # Table name: caffeinate_mailings
6
+ #
7
+ # id :integer not null, primary key
8
+ # caffeinate_campaign_subscription_id :integer not null
9
+ # send_at :datetime
10
+ # sent_at :datetime
11
+ # skipped_at :datetime
12
+ # mailer_class :string not null
13
+ # mailer_action :string not null
14
+ # created_at :datetime not null
15
+ # updated_at :datetime not null
16
+ #
3
17
  module Caffeinate
4
18
  # Records of the mails sent and to be sent for a given `::Caffeinate::CampaignSubscriber`
5
19
  class Mailing < ApplicationRecord
20
+ CURRENT_THREAD_KEY = :current_caffeinate_mailing.freeze
21
+
6
22
  self.table_name = 'caffeinate_mailings'
7
23
 
8
24
  belongs_to :caffeinate_campaign_subscription, class_name: 'Caffeinate::CampaignSubscription'
@@ -49,7 +65,7 @@ module Caffeinate
49
65
  # The associated drip
50
66
  # @todo This can be optimized with a better cache
51
67
  def drip
52
- @drip ||= caffeinate_campaign.to_dripper.drips.find { |drip| drip.action.to_s == mailer_action }
68
+ @drip ||= caffeinate_campaign.to_dripper.drip_collection[mailer_action]
53
69
  end
54
70
 
55
71
  # The associated Subscriber from `::Caffeinate::CampaignSubscription`
@@ -64,7 +80,7 @@ module Caffeinate
64
80
 
65
81
  # Assigns attributes to the Mailing from the Drip
66
82
  def from_drip(drip)
67
- self.send_at = drip.options[:delay].from_now
83
+ self.send_at = drip.send_at
68
84
  self.mailer_class = drip.options[:mailer_class]
69
85
  self.mailer_action = drip.action
70
86
  self
@@ -0,0 +1,3 @@
1
+ <%= t("caffeinate.campaign_subscriptions.subscribe") %>
2
+ <p><%= t("caffeinate.campaign_subscriptions.changed_your_mind")%></p>
3
+ <p><%= link_to "Unsubscribe", caffeinate_subscribe_url %></p>
@@ -0,0 +1,3 @@
1
+ <h5><%= t("caffeinate.campaign_subscriptions.unsubscribe")%></h5>
2
+ <p><%= t("caffeinate.campaign_subscriptions.changed_your_mind")%></p>
3
+ <p><%= link_to "Resubscribe", caffeinate_subscribe_url %></p>
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= Rails.application.class.module_parent_name %></title>
5
+ </head>
6
+ <body>
7
+
8
+ <%= yield %>
9
+
10
+ </body>
11
+ </html>
@@ -0,0 +1,6 @@
1
+ en:
2
+ caffeinate:
3
+ campaign_subscriptions:
4
+ subscribe: "You have been subscribed."
5
+ unsubscribe: "You have been unsubscribed."
6
+ changed_your_mind: "Change your mind?"
@@ -3,6 +3,7 @@
3
3
  require 'rails/all'
4
4
  require 'caffeinate/engine'
5
5
  require 'caffeinate/drip'
6
+ require 'caffeinate/url_helpers'
6
7
  require 'caffeinate/configuration'
7
8
  require 'caffeinate/dripper/base'
8
9
  require 'caffeinate/deliver_async'
@@ -5,8 +5,18 @@ module Caffeinate
5
5
  module Extension
6
6
  def self.included(klass)
7
7
  klass.before_action do
8
- @mailing = Thread.current[:current_caffeinate_mailing] if Thread.current[:current_caffeinate_mailing]
8
+ @mailing = Thread.current[::Caffeinate::Mailing::CURRENT_THREAD_KEY] if Thread.current[::Caffeinate::Mailing::CURRENT_THREAD_KEY]
9
9
  end
10
+
11
+ klass.helper_method :caffeinate_unsubscribe_url, :caffeinate_subscribe_url
12
+ end
13
+
14
+ def caffeinate_unsubscribe_url(**options)
15
+ Caffeinate::UrlHelpers.caffeinate_unsubscribe_url(@mailing.caffeinate_campaign_subscription, **options)
16
+ end
17
+
18
+ def caffeinate_subscribe_url
19
+ Caffeinate::UrlHelpers.caffeinate_subscribe_url(@mailing.caffeinate_campaign_subscription, **options)
10
20
  end
11
21
  end
12
22
  end
@@ -5,7 +5,7 @@ module Caffeinate
5
5
  class Interceptor
6
6
  # Handles `before_send` callbacks for a `Caffeinate::Dripper`
7
7
  def self.delivering_email(message)
8
- mailing = Thread.current[:current_caffeinate_mailing]
8
+ mailing = Thread.current[::Caffeinate::Mailing::CURRENT_THREAD_KEY]
9
9
  return unless mailing
10
10
 
11
11
  mailing.caffeinate_campaign.to_dripper.run_callbacks(:before_send, mailing.caffeinate_campaign_subscription, mailing, message)
@@ -2,14 +2,14 @@
2
2
 
3
3
  module Caffeinate
4
4
  module ActionMailer
5
- # Handles updating the Caffeinate::Message if it's available in Thread.current[:current_caffeinate_mailing]
5
+ # Handles updating the Caffeinate::Message if it's available in Thread.current[::Caffeinate::Mailing::CURRENT_THREAD_KEY]
6
6
  # and runs any associated callbacks
7
7
  class Observer
8
8
  def self.delivered_email(message)
9
- mailing = Thread.current[:current_caffeinate_mailing]
9
+ mailing = Thread.current[::Caffeinate::Mailing::CURRENT_THREAD_KEY]
10
10
  return unless mailing
11
11
 
12
- mailing.update!(sent_at: Caffeinate.config.time_now) if message.perform_deliveries
12
+ mailing.update!(sent_at: Caffeinate.config.time_now, skipped_at: nil) if message.perform_deliveries
13
13
  mailing.caffeinate_campaign.to_dripper.run_callbacks(:after_send, mailing.caffeinate_campaign_subscription, mailing, message)
14
14
  end
15
15
  end
@@ -9,7 +9,7 @@ module Caffeinate
9
9
  has_many :caffeinate_campaigns, through: :caffeinate_campaign_subscriptions, class_name: '::Caffeinate::Campaign'
10
10
  has_many :caffeinate_mailings, through: :caffeinate_campaign_subscriptions, class_name: '::Caffeinate::Mailing'
11
11
 
12
- scope :not_subscribed_to, lambda { |list|
12
+ scope :not_subscribed_to_campaign, lambda { |list|
13
13
  subscribed = ::Caffeinate::CampaignSubscription.select(:subscriber_id).joins(:caffeinate_campaign).where(caffeinate_campaigns: { slug: list }, subscriber_type: name)
14
14
  where.not(id: subscribed)
15
15
  }
@@ -1,40 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'caffeinate/drip_evaluator'
3
4
  module Caffeinate
4
5
  # A Drip object
6
+ #
7
+ # Handles the block and provides convenience methods for the drip
5
8
  class Drip
6
- # Handles the block and provides convenience methods for the drip
7
- class Evaluator
8
- attr_reader :mailing
9
- def initialize(mailing)
10
- @mailing = mailing
11
- end
12
-
13
- def call(&block)
14
- return true unless block
15
-
16
- instance_eval(&block)
17
- end
18
-
19
- # Ends the CampaignSubscription
20
- def end!
21
- mailing.caffeinate_campaign_subscription.end!
22
- false
23
- end
24
-
25
- # Unsubscribes the CampaignSubscription
26
- def unsubscribe!
27
- mailing.caffeinate_campaign_subscription.unsubscribe!
28
- false
29
- end
30
-
31
- # Skips the mailing
32
- def skip!
33
- mailing.skip!
34
- false
35
- end
36
- end
37
-
38
9
  attr_reader :dripper, :action, :options, :block
39
10
  def initialize(dripper, action, options, &block)
40
11
  @dripper = dripper
@@ -43,14 +14,18 @@ module Caffeinate
43
14
  @block = block
44
15
  end
45
16
 
46
- # If the associated ActionMailer uses `ActionMailer::Parameterized` initialization
17
+ # If the associated ActionMailer uses `ActionMailer::Parameterized` initialization instead of argument-based initialization
47
18
  def parameterized?
48
19
  options[:using] == :parameterized
49
20
  end
50
21
 
51
- # If the drip is enabled.
22
+ def send_at
23
+ options[:delay].from_now
24
+ end
25
+
26
+ # Checks if the drip is enabled
52
27
  def enabled?(mailing)
53
- Evaluator.new(mailing).call(&@block)
28
+ DripEvaluator.new(mailing).call(&@block)
54
29
  end
55
30
  end
56
31
  end
@@ -0,0 +1,33 @@
1
+ module Caffeinate
2
+ # Handles evaluating the `drip` block and provides convenience methods for handling the mailing or its campaign.
3
+ class DripEvaluator
4
+ attr_reader :mailing
5
+ def initialize(mailing)
6
+ @mailing = mailing
7
+ end
8
+
9
+ def call(&block)
10
+ return true unless block
11
+
12
+ instance_eval(&block)
13
+ end
14
+
15
+ # Ends the CampaignSubscription
16
+ def end!
17
+ mailing.caffeinate_campaign_subscription.end!
18
+ false
19
+ end
20
+
21
+ # Unsubscribes the CampaignSubscription
22
+ def unsubscribe!
23
+ mailing.caffeinate_campaign_subscription.unsubscribe!
24
+ false
25
+ end
26
+
27
+ # Skips the mailing
28
+ def skip!
29
+ mailing.skip!
30
+ false
31
+ end
32
+ end
33
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'caffeinate/dripper/drip'
4
+ require 'caffeinate/dripper/inferences'
4
5
  require 'caffeinate/dripper/callbacks'
5
6
  require 'caffeinate/dripper/defaults'
6
7
  require 'caffeinate/dripper/subscriber'
@@ -16,18 +17,9 @@ module Caffeinate
16
17
  include Defaults
17
18
  include Delivery
18
19
  include Drip
20
+ include Inferences
19
21
  include Perform
20
22
  include Subscriber
21
-
22
- # The inferred mailer class
23
- def self.inferred_mailer_class
24
- klass_name = "#{name.delete_suffix('Dripper')}Mailer"
25
- klass = klass_name.safe_constantize
26
- return nil unless klass
27
- return klass_name if klass < ::ActionMailer::Base
28
-
29
- nil
30
- end
31
23
  end
32
24
  end
33
25
  end
@@ -45,7 +45,7 @@ module Caffeinate
45
45
 
46
46
  # The defined slug or the inferred slug
47
47
  def campaign_slug
48
- @_campaign_slug || name.delete_suffix('Campaign')
48
+ @_campaign_slug || inferred_campaign_slug
49
49
  end
50
50
  end
51
51
  end
@@ -14,7 +14,7 @@ module Caffeinate
14
14
  #
15
15
  # @param [Caffeinate::Mailing] mailing The mailing to deliver
16
16
  def deliver!(mailing)
17
- Thread.current[:current_caffeinate_mailing] = mailing
17
+ Thread.current[::Caffeinate::Mailing::CURRENT_THREAD_KEY] = mailing
18
18
 
19
19
  if mailing.drip.parameterized?
20
20
  mailing.mailer_class.constantize.with(mailing: mailing).send(mailing.mailer_action).deliver
@@ -10,21 +10,29 @@ module Caffeinate
10
10
 
11
11
  def initialize(dripper)
12
12
  @dripper = dripper
13
- @drips = []
13
+ @drips = {}
14
14
  end
15
15
 
16
16
  # Register the drip
17
17
  def register(action, options, &block)
18
- @drips << ::Caffeinate::Drip.new(@dripper, action, options, &block)
18
+ @drips[action.to_s] = ::Caffeinate::Drip.new(@dripper, action, options, &block)
19
19
  end
20
20
 
21
21
  def each(&block)
22
- @drips.each { |drip| block.call(drip) }
22
+ @drips.each { |action_name, drip| block.call(action_name, drip) }
23
+ end
24
+
25
+ def values
26
+ @drips.values
23
27
  end
24
28
 
25
29
  def size
26
30
  @drips.size
27
31
  end
32
+
33
+ def [](val)
34
+ @drips[val]
35
+ end
28
36
  end
29
37
 
30
38
  # :nodoc:
@@ -33,9 +41,14 @@ module Caffeinate
33
41
  end
34
42
 
35
43
  module ClassMethods
44
+ # A collection of Drip objects associated with a given `Caffeinate::Dripper`
45
+ def drip_collection
46
+ @drip_collection ||= DripCollection.new(self)
47
+ end
48
+
36
49
  # A collection of Drip objects associated with a given `Caffeinate::Dripper`
37
50
  def drips
38
- @drips ||= DripCollection.new(self)
51
+ drip_collection.values
39
52
  end
40
53
 
41
54
  # Register a drip on the Dripper
@@ -58,7 +71,7 @@ module Caffeinate
58
71
  end
59
72
  raise ArgumentError, "You must define :delay in the options for :#{action_name}" if options[:delay].nil?
60
73
 
61
- drips.register(action_name, options, &block)
74
+ drip_collection.register(action_name, options, &block)
62
75
  end
63
76
  end
64
77
  end
@@ -0,0 +1,26 @@
1
+ module Caffeinate
2
+ module Dripper
3
+ module Inferences
4
+ def self.included(klass)
5
+ klass.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ # The inferred mailer class
10
+ def inferred_mailer_class
11
+ klass_name = "#{name.delete_suffix('Dripper')}Mailer"
12
+ klass = klass_name.safe_constantize
13
+ return nil unless klass
14
+ return klass_name if klass < ::ActionMailer::Base
15
+
16
+ nil
17
+ end
18
+
19
+ # The inferred mailer class
20
+ def inferred_campaign_slug
21
+ "#{name.delete_suffix('Dripper')}".underscore
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -15,8 +15,10 @@ module Caffeinate
15
15
  #
16
16
  # @return nil
17
17
  def perform!
18
- campaign.caffeinate_campaign_subscriptions.joins(:next_caffeinate_mailing).includes(:next_caffeinate_mailing).each do |subscriber|
19
- subscriber.next_caffeinate_mailing.process!
18
+ campaign.caffeinate_campaign_subscriptions.active.includes(:next_caffeinate_mailing).each do |subscriber|
19
+ if subscriber.next_caffeinate_mailing
20
+ subscriber.next_caffeinate_mailing.process!
21
+ end
20
22
  end
21
23
  true
22
24
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'caffeinate/helpers'
3
4
  require 'caffeinate/action_mailer'
4
5
  require 'caffeinate/active_record/extension'
5
6
 
@@ -8,22 +9,24 @@ module Caffeinate
8
9
  class Engine < ::Rails::Engine
9
10
  isolate_namespace Caffeinate
10
11
 
12
+ config.to_prepare do
13
+ Dir.glob(Rails.root.join("app/drippers/**/*.rb")).each do |file|
14
+ require file
15
+ end
16
+ end
17
+
11
18
  ActiveSupport.on_load(:action_mailer) do
12
19
  include ::Caffeinate::ActionMailer::Extension
13
20
  ::ActionMailer::Base.register_interceptor(::Caffeinate::ActionMailer::Interceptor)
14
21
  ::ActionMailer::Base.register_observer(::Caffeinate::ActionMailer::Observer)
15
22
  end
16
23
 
17
- unless config.eager_load
18
- config.to_prepare do
19
- Dir.glob("#{Rails.root}/app/drippers/**/*.rb").each do |f|
20
- require f
21
- end
22
- end
23
- end
24
-
25
24
  ActiveSupport.on_load(:active_record) do
26
25
  extend ::Caffeinate::ActiveRecord::Extension
27
26
  end
27
+
28
+ ActiveSupport.on_load(:action_view) do
29
+ ApplicationHelper.send(:include, ::Caffeinate::Helpers)
30
+ end
28
31
  end
29
32
  end
@@ -0,0 +1,21 @@
1
+ module Caffeinate
2
+ module Helpers
3
+ def caffeinate_unsubscribe_url(subscription, **options)
4
+ opts = (::ActionMailer::Base.default_url_options || {}).merge(options)
5
+ Caffeinate::Engine.routes.url_helpers.unsubscribe_campaign_subscription_url(token: subscription.token, **opts)
6
+ end
7
+
8
+ def caffeinate_subscribe_url(subscription, **options)
9
+ opts = (::ActionMailer::Base.default_url_options || {}).merge(options)
10
+ Caffeinate::Engine.routes.url_helpers.subscribe_campaign_subscription_url(token: subscription.token, **opts)
11
+ end
12
+
13
+ def caffeinate_unsubscribe_path(subscription, **options)
14
+ Caffeinate::Engine.routes.url_helpers.unsubscribe_campaign_subscription_path(token: subscription.token, **options)
15
+ end
16
+
17
+ def caffeinate_subscribe_path(subscription, **options)
18
+ Caffeinate::Engine.routes.url_helpers.subscribe_campaign_subscription_path(token: subscription.token, **options)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ require 'caffeinate/helpers'
2
+
3
+ module Caffeinate
4
+ class UrlHelpers
5
+ extend Helpers
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Caffeinate
4
- VERSION = '0.1.4'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caffeinate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Brody
@@ -124,8 +124,10 @@ files:
124
124
  - app/models/caffeinate/campaign.rb
125
125
  - app/models/caffeinate/campaign_subscription.rb
126
126
  - app/models/caffeinate/mailing.rb
127
- - app/views/layouts/caffeinate/application.html.erb
128
- - app/views/layouts/caffeinate/campaign_subscriptions/unsubscribe.html.erb
127
+ - app/views/caffeinate/campaign_subscriptions/subscribe.html.erb
128
+ - app/views/caffeinate/campaign_subscriptions/unsubscribe.html.erb
129
+ - app/views/layouts/caffeinate.html.erb
130
+ - config/locales/en.yml
129
131
  - config/routes.rb
130
132
  - db/migrate/20201124183102_create_caffeinate_campaigns.rb
131
133
  - db/migrate/20201124183303_create_caffeinate_campaign_subscriptions.rb
@@ -140,15 +142,19 @@ files:
140
142
  - lib/caffeinate/configuration.rb
141
143
  - lib/caffeinate/deliver_async.rb
142
144
  - lib/caffeinate/drip.rb
145
+ - lib/caffeinate/drip_evaluator.rb
143
146
  - lib/caffeinate/dripper/base.rb
144
147
  - lib/caffeinate/dripper/callbacks.rb
145
148
  - lib/caffeinate/dripper/campaign.rb
146
149
  - lib/caffeinate/dripper/defaults.rb
147
150
  - lib/caffeinate/dripper/delivery.rb
148
151
  - lib/caffeinate/dripper/drip.rb
152
+ - lib/caffeinate/dripper/inferences.rb
149
153
  - lib/caffeinate/dripper/perform.rb
150
154
  - lib/caffeinate/dripper/subscriber.rb
151
155
  - lib/caffeinate/engine.rb
156
+ - lib/caffeinate/helpers.rb
157
+ - lib/caffeinate/url_helpers.rb
152
158
  - lib/caffeinate/version.rb
153
159
  - lib/generators/caffeinate/install_generator.rb
154
160
  - lib/generators/caffeinate/templates/application_dripper.rb
@@ -1,15 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Caffeinate</title>
5
- <%= csrf_meta_tags %>
6
- <%= csp_meta_tag %>
7
-
8
- <%= stylesheet_link_tag "caffeinate/application", media: "all" %>
9
- </head>
10
- <body>
11
-
12
- <%= yield %>
13
-
14
- </body>
15
- </html>
@@ -1 +0,0 @@
1
- <h5>You have been unsubscribed.</h5>