caffeinate 0.8.4 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a1b112ae3aa4c5c0d6f5d0754dffe6fc720c025739d3b78487b78754b4bd8fb
4
- data.tar.gz: a7ede18dbf114ebf23c3c6eba347b60524963574a921687ffba1943885055777
3
+ metadata.gz: 3f6b38c582c7ac99605a366b1217a973ebea58dad20cc60e4dd4a0f555da7474
4
+ data.tar.gz: a975e28f6386905c9e776cf2cc1dcb835054f0200d91fce9554d5c1f4bcdfd9b
5
5
  SHA512:
6
- metadata.gz: 83efe161d7aa1885ebd1080b1fe640ea87e21b9dd1dbf494998b361a4ae6f1188a23a4aa509766edec90eabea2fbc9b08d6f8b305592cbaeeaf38343737e16ef
7
- data.tar.gz: 4c42564577a0321ad57cf7a052645a2ea3fe2670e701789dfb123a1801e95a98dc3754602d318b9d341921b1f41c47cc03d8bfd1a678d4ef3e3b0317d32e29c6
6
+ metadata.gz: dd713236a833425f2a17d8c455fadaec49ba60bf17083c4bd879aa343611d30793e6aaef0e70db5e6cae3e760beec69ea41bdb2e38881ec2ecaabdb00c9c28a7
7
+ data.tar.gz: 935e59b886250e6b216535f236241221f313eefe304b9a588f0c42384d0236335e8da0fef7f71421dd80bef4e3fd114729153766c1d52bc95f4c760d681ba2c9
@@ -54,6 +54,14 @@ module Caffeinate
54
54
  #
55
55
  # Just... mintier.
56
56
  def unsubscribe(subscriber, **args)
57
+ reason = args.delete(:reason)
58
+ subscription = subscriber(subscriber, **args)
59
+ return false if subscription.nil?
60
+
61
+ subscription.unsubscribe(reason)
62
+ end
63
+
64
+ def unsubscribe!(subscriber, **args)
57
65
  reason = args.delete(:reason)
58
66
  subscription = subscriber(subscriber, **args)
59
67
  raise ::ActiveRecord::RecordInvalid, subscription if subscription.nil?
@@ -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_campaign_subscriptions: { ended_at: nil, unsubscribed_at: nil }).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
@@ -11,26 +11,29 @@ module Caffeinate
11
11
 
12
12
  def call(&block)
13
13
  return true unless block
14
-
15
- instance_eval(&block)
14
+ catch(:abort) do
15
+ result = instance_eval(&block)
16
+ return result.nil? || result === true
17
+ end
18
+ false
16
19
  end
17
20
 
18
21
  # Ends the CampaignSubscription
19
- def end!(**args)
20
- mailing.caffeinate_campaign_subscription.end!(**args)
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!(**args)
26
- mailing.caffeinate_campaign_subscription.unsubscribe!(**args)
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
@@ -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.4'
4
+ VERSION = '0.10.0'
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
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.4
4
+ version: 0.10.0
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-23 00:00:00.000000000 Z
11
+ date: 2020-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -175,8 +175,10 @@ 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
180
182
  - lib/generators/caffeinate/views_generator.rb
181
183
  homepage: https://github.com/joshmn/caffeinate
182
184
  licenses: