caffeinate 0.8.1 → 0.9.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: bf0c011679cba19db41a44adbbe22b0413473379a38cef42a98a0102ac3552b9
4
- data.tar.gz: 6120c873207dcca757ede074a9b564f1867b5bc6fa0f3a4613987184a39dbd50
3
+ metadata.gz: 207ba08c8c3c5596615211a20d62807615545d899e8d82fea4b858bfabe9660d
4
+ data.tar.gz: 5449537253999aa2b314e89d706e9e99f3b08d9aa55a2a861536f52c2506cb43
5
5
  SHA512:
6
- metadata.gz: cb150ab1506b93d50e09056f70f23ffa6a6fb2e7e5be7694f7d5bfedca8cf217a1e8b54b0ca69f34fedca816dbfaaf184b3fbaaf1629f88bf0e4d85f64e4fa9e
7
- data.tar.gz: 1c0532f1f40c42b3f746d49f712e61a19dbddc98208a3952aa655c7d757c5320dc15ded22c4d0208e32f48a783cd7570d485aac9c5596a8e09d9db9c2caad884
6
+ metadata.gz: 48d8a5eb87c0112a89e82c607132b4f3f4d23bc918b561e59e8b7a4bff9c801295d51795ad68108fe2bb450f2a6d411a5a7aa0957cc5a171b19693f0f290c790
7
+ data.tar.gz: e3e105ab3d1a7ae342457f5203b351e4c692b79e2d42eefe3668d8b9d96ddb635a2216b32fdfb1e510ed51ea2fb7d68a213f81f0bbf588b4cfe4405d9ba12d8b
@@ -56,7 +56,15 @@ module Caffeinate
56
56
  def unsubscribe(subscriber, **args)
57
57
  reason = args.delete(:reason)
58
58
  subscription = subscriber(subscriber, **args)
59
- raise ActiveRecord::RecordInvalid, subscription if subscription.nil?
59
+ return false if subscription.nil?
60
+
61
+ subscription.unsubscribe(reason)
62
+ end
63
+
64
+ def unsubscribe!(subscriber, **args)
65
+ reason = args.delete(:reason)
66
+ subscription = subscriber(subscriber, **args)
67
+ raise ::ActiveRecord::RecordInvalid, subscription if subscription.nil?
60
68
 
61
69
  subscription.unsubscribe!(reason)
62
70
  end
@@ -64,12 +72,12 @@ module Caffeinate
64
72
  # Creates a `CampaignSubscription` object for the present Campaign. Allows passing `**args` to
65
73
  # delegate additional arguments to the record. Uses `find_or_create_by`.
66
74
  def subscribe(subscriber, **args)
67
- caffeinate_campaign_subscriptions.find_or_create_by(subscriber: subscriber, **args)
75
+ caffeinate_campaign_subscriptions.create(subscriber: subscriber, **args)
68
76
  end
69
77
 
70
78
  # Subscribes an object to a campaign. Raises `ActiveRecord::RecordInvalid` if the record was invalid.
71
79
  def subscribe!(subscriber, **args)
72
- subscribe(subscriber, **args)
80
+ caffeinate_campaign_subscriptions.create!(subscriber: subscriber, **args)
73
81
  end
74
82
  end
75
83
  end
@@ -30,7 +30,7 @@ module Caffeinate
30
30
  has_many :mailings, class_name: 'Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id, dependent: :destroy
31
31
 
32
32
  has_one :next_caffeinate_mailing, -> { upcoming.unsent.order(send_at: :asc) }, class_name: '::Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id
33
- has_one :next_mailing, -> { upcoming.unsent.order(send_at: :asc) }, class_name: '::Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id
33
+ has_one :next_mailing, -> { joins(:caffeinate_campaign_subscription).where(Caffeinate::CampaignSubscription.active).upcoming.unsent.order(send_at: :asc) }, class_name: '::Caffeinate::Mailing', foreign_key: :caffeinate_campaign_subscription_id
34
34
 
35
35
  belongs_to :caffeinate_campaign, class_name: 'Caffeinate::Campaign', foreign_key: :caffeinate_campaign_id
36
36
  alias_attribute :campaign, :caffeinate_campaign
@@ -83,6 +83,16 @@ module Caffeinate
83
83
  true
84
84
  end
85
85
 
86
+ # Updates `ended_at` and runs `on_complete` callbacks
87
+ def end(reason = nil)
88
+ return false if unsubscribed?
89
+
90
+ result = update(ended_at: ::Caffeinate.config.time_now, ended_reason: reason)
91
+
92
+ caffeinate_campaign.to_dripper.run_callbacks(:on_end, self)
93
+ result
94
+ end
95
+
86
96
  # Updates `unsubscribed_at` and runs `on_subscribe` callbacks
87
97
  def unsubscribe!(reason = nil)
88
98
  raise ::Caffeinate::InvalidState, 'CampaignSubscription is already ended.' if ended?
@@ -93,6 +103,16 @@ module Caffeinate
93
103
  true
94
104
  end
95
105
 
106
+ # Updates `unsubscribed_at` and runs `on_subscribe` callbacks
107
+ def unsubscribe(reason = nil)
108
+ return false if ended?
109
+
110
+ result = update(unsubscribed_at: ::Caffeinate.config.time_now, unsubscribe_reason: reason)
111
+
112
+ caffeinate_campaign.to_dripper.run_callbacks(:on_unsubscribe, self)
113
+ result
114
+ end
115
+
96
116
  # Updates `unsubscribed_at` to nil and runs `on_subscribe` callbacks.
97
117
  # Use `force` to forcefully reset. Does not create the mailings.
98
118
  def resubscribe!(force = false)
@@ -105,6 +125,18 @@ module Caffeinate
105
125
  true
106
126
  end
107
127
 
128
+ # Updates `unsubscribed_at` to nil and runs `on_subscribe` callbacks.
129
+ # Use `force` to forcefully reset. Does not create the mailings.
130
+ def resubscribe!(force = false)
131
+ return false if ended? && !force
132
+ return false if unsubscribed? && !force
133
+
134
+ result = update(unsubscribed_at: nil, resubscribed_at: ::Caffeinate.config.time_now)
135
+
136
+ caffeinate_campaign.to_dripper.run_callbacks(:on_resubscribe, self)
137
+ result
138
+ end
139
+
108
140
  def completed?
109
141
  caffeinate_mailings.unsent.count.zero?
110
142
  end
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title><%= Rails.application.class.module_parent_name %></title>
4
+ <title></title>
5
5
  </head>
6
6
  <body>
7
7
 
@@ -12,25 +12,28 @@ module Caffeinate
12
12
  def call(&block)
13
13
  return true unless block
14
14
 
15
- instance_eval(&block)
15
+ catch(:abort) do
16
+ return instance_eval(&block)
17
+ end
18
+ false
16
19
  end
17
20
 
18
21
  # Ends the CampaignSubscription
19
- def end!
20
- mailing.caffeinate_campaign_subscription.end!
21
- false
22
+ def end!(*args)
23
+ mailing.caffeinate_campaign_subscription.end!(*args)
24
+ throw(:abort)
22
25
  end
23
26
 
24
27
  # Unsubscribes the CampaignSubscription
25
- def unsubscribe!
26
- mailing.caffeinate_campaign_subscription.unsubscribe!
27
- false
28
+ def unsubscribe!(*args)
29
+ mailing.caffeinate_campaign_subscription.unsubscribe!(*args)
30
+ throw(:abort)
28
31
  end
29
32
 
30
33
  # Skips the mailing
31
34
  def skip!
32
35
  mailing.skip!
33
- false
36
+ throw(:abort)
34
37
  end
35
38
  end
36
39
  end
@@ -20,7 +20,7 @@ module Caffeinate
20
20
  .upcoming
21
21
  .unsent
22
22
  .joins(:caffeinate_campaign_subscription)
23
- .merge(Caffeinate::CampaignSubscription.active)
23
+ .merge(Caffeinate::CampaignSubscription.active.where(caffeinate_campaign: self.campaign))
24
24
  .in_batches(of: self.class.batch_size)
25
25
  .each do |batch|
26
26
  run_callbacks(:on_perform, self, batch)
@@ -31,10 +31,10 @@ module Caffeinate
31
31
  #
32
32
  # @return [Caffeinate::CampaignSubscriber] the created CampaignSubscriber
33
33
  def subscribe(subscriber, **args)
34
- caffeinate_campaign.subscribe(subscriber, **args)
34
+ caffeinate_campaign.subscribe!(subscriber, **args)
35
35
  end
36
36
 
37
- # Unsubscribes from the campaign.
37
+ # Unsubscribes from the campaign. Returns false if something's wrong.
38
38
  #
39
39
  # OrderDripper.unsubscribe(order, user: order.user)
40
40
  #
@@ -46,6 +46,18 @@ module Caffeinate
46
46
  caffeinate_campaign.unsubscribe(subscriber, **args)
47
47
  end
48
48
 
49
+ # Unsubscribes from the campaign. Raises error if somerthing's wrong.
50
+ #
51
+ # OrderDripper.unsubscribe(order, user: order.user)
52
+ #
53
+ # @param [ActiveRecord::Base] subscriber The object subscribing
54
+ # @option [ActiveRecord::Base] :user The associated user (optional)
55
+ #
56
+ # @return [Caffeinate::CampaignSubscriber] the CampaignSubscriber
57
+ def unsubscribe!(subscriber, **args)
58
+ caffeinate_campaign.unsubscribe!(subscriber, **args)
59
+ end
60
+
49
61
  # :nodoc:
50
62
  def subscribes_block
51
63
  raise(NotImplementedError, 'Define subscribes') unless @subscribes_block
@@ -9,6 +9,13 @@ module Mail
9
9
  class Message
10
10
  attr_accessor :caffeinate_mailing
11
11
 
12
+ def caffeinate_mailing=(mailing)
13
+ @caffeinate_mailing = mailing
14
+ if mailing.is_a?(::Caffeinate::Mailing)
15
+ header['List-Unsubscribe'] = "<#{Caffeinate::UrlHelpers.caffeinate_subscribe_url(mailing.subscription)}>"
16
+ end
17
+ end
18
+
12
19
  def caffeinate?
13
20
  caffeinate_mailing.present?
14
21
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Caffeinate
4
- VERSION = '0.8.1'
4
+ VERSION = '0.9.1'
5
5
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Caffeinate
4
+ module Generators
5
+ # Creates a mailer from a dripper.
6
+ class MailerGenerator < Rails::Generators::Base
7
+ source_root File.expand_path('templates', __dir__)
8
+ include ::Rails::Generators::Migration
9
+ argument :dripper, banner: "dripper"
10
+
11
+ desc 'Creates a Mailer class from a dripper.'
12
+
13
+ def create_mailer
14
+ @dripper_klass = @dripper.safe_constantize
15
+ if @dripper_klass.nil?
16
+ raise ArgumentError, "Unknown dripper #{@dripper}"
17
+ end
18
+ @mailer_class = @dripper_klass.defaults[:mailer_class] || @dripper_klass.defaults[:mailer]
19
+ template 'mailer.rb', "app/mailers/#{@mailer_class.underscore}.rb"
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ class <%= @mailer_class %> < ApplicationMailer
2
+ <% @dripper_klass.drips.each do |action| -%>
3
+ def <%= action.action %><% if action.options[:using].nil? %>(mailing)<% end %>
4
+ <% if action.options[:using].nil? -%>
5
+ @mailing = mailing
6
+ <% end -%>
7
+ end
8
+ <% end -%>
9
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+
5
+ module Caffeinate
6
+ module Generators
7
+ module ViewPathTemplates #:nodoc:
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ public_task :copy_views
12
+ end
13
+
14
+ def copy_views
15
+ view_directory :campaign_subscriptions
16
+ end
17
+
18
+ protected
19
+
20
+ def view_directory(name, _target_path = nil)
21
+ directory name.to_s, _target_path || "#{target_path}/#{name}" do |content|
22
+ content
23
+ end
24
+ end
25
+
26
+ def target_path
27
+ @target_path ||= "app/views/caffeinate"
28
+ end
29
+ end
30
+
31
+ class SharedViewsGenerator < Rails::Generators::Base #:nodoc:
32
+ include ViewPathTemplates
33
+ source_root File.expand_path("../../../../app/views/caffeinate", __FILE__)
34
+ desc "Copies shared Caffeinate views to your application."
35
+ hide!
36
+ end
37
+
38
+ class ViewsGenerator < Rails::Generators::Base
39
+ desc "Copies Caffeinate views to your application."
40
+
41
+ invoke SharedViewsGenerator
42
+ end
43
+ end
44
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caffeinate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Brody
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-17 00:00:00.000000000 Z
11
+ date: 2020-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -175,8 +175,11 @@ files:
175
175
  - lib/caffeinate/url_helpers.rb
176
176
  - lib/caffeinate/version.rb
177
177
  - lib/generators/caffeinate/install_generator.rb
178
+ - lib/generators/caffeinate/mailer_generator.rb
178
179
  - lib/generators/caffeinate/templates/application_dripper.rb
179
180
  - lib/generators/caffeinate/templates/caffeinate.rb
181
+ - lib/generators/caffeinate/templates/mailer.rb.tt
182
+ - lib/generators/caffeinate/views_generator.rb
180
183
  homepage: https://github.com/joshmn/caffeinate
181
184
  licenses:
182
185
  - MIT