caffeinate 0.8.4 → 0.10.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: 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: