active_delivery 0.1.0 → 0.1.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: 49196fc041ea378e47c1a43a527d555b9822398570553d094b5d4ac051fe215b
4
- data.tar.gz: ad331e02883c5e9bd8c7b07f9acdd531d7aa64cbec0a589dc24ac5ed2f30ad74
3
+ metadata.gz: ba024e906a6a7bdf0dafd6a4e83ecefc7121b475ec9f9e7dfdadaacf4a2e04c0
4
+ data.tar.gz: 1045c894dc23a4d90282fac45a158af962839d9cd026ff8d5331371141c5c120
5
5
  SHA512:
6
- metadata.gz: 2c9f5f9cd717c0bba343c2f2ec2f82390c680a6c5df1561e70ef4e6e913f6dd7204456f0238e0a2c60df25274bf09bd55b2081a5441e793ff9e39c22f40b2fc5
7
- data.tar.gz: 0c423ef6827bb61f279f18094a9f4e57033086bc8aaac067e8a0c11a71f81e8005d7084b15d263f3d25908bccabdcee302dcec8f427927bc8c3bb27169788a72
6
+ metadata.gz: 0f54fd937683e8e70871ece3900d2f75026e0674e316cc8969ad5066e5757b4982697f3e2c5e59d9969497c54874b6c9ea107ee08eae502d1ef87f7013234943
7
+ data.tar.gz: 4af2720f68788f2cc35d4acbdfc2ed6870a809d075b08a16663ddbd459ebc734939eab1208a4acfc6fd46dc1ac2a19603d1de5ccfbfbeb1d5ff1a11ae749ff45
data/README.md CHANGED
@@ -43,6 +43,19 @@ end
43
43
 
44
44
  - better testability (see [Testing](#testing)).
45
45
 
46
+ ## Installation
47
+
48
+ Add this line to your application's Gemfile:
49
+
50
+ ```ruby
51
+ gem 'active_delivery'
52
+ ```
53
+
54
+ And then execute:
55
+
56
+ ```sh
57
+ $ bundle
58
+ ```
46
59
 
47
60
  ## Usage
48
61
 
@@ -55,7 +68,7 @@ class PostsDelivery < ActiveDelivery::Base
55
68
  end
56
69
  ```
57
70
 
58
- It acts like a proxy in front of the different delivery channels (i.e. mailers, notifiers). That means that calling a method on delivery class invokes the same method on the corresponding class, e.g.:
71
+ It acts like a proxy in front of the different delivery channels (i.e. mailers, notifiers). That means that calling a method on delivery class invokes the same method on the corresponding _sender_ class, e.g.:
59
72
 
60
73
  ```ruby
61
74
  PostsDelivery.notify(:published, user, post)
@@ -63,7 +76,7 @@ PostsDelivery.notify(:published, user, post)
63
76
  # under the hood it calls
64
77
  PostsMailer.published(user, post).deliver_later
65
78
 
66
- # and if you have a notifier (or anything else)
79
+ # and if you have a notifier (or any other line, see below)
67
80
  PostsNotifier.published(user, post).notify_later
68
81
  ```
69
82
 
@@ -138,6 +151,118 @@ specify "when event is not found" do
138
151
  end
139
152
  ```
140
153
 
154
+ *NOTE:** test mode activated automatically if `RAILS_ENV` or `RACK_ENV` env variable is equal to "test". Otherwise add `require "active_delivery/testing"` to your `spec_helper.rb` / `rails_helper.rb` manually.
155
+
156
+ ## Custom "lines"
157
+
158
+ _Line_ class describes the way you want to _transfer_ your deliveries.
159
+
160
+ Out-of-the box we provide only Action Mailer _line_.
161
+
162
+ Line connects _delivery_ to the _sender_ class responsible for sending notifications.
163
+
164
+ If you want to use parameterized deliveries, your _sender_ class must respond to `.with(params)` method.
165
+
166
+ Assume that we want to send messages via _pigeons_ and we have the following sender class:
167
+
168
+ ```ruby
169
+ class EventPigeon
170
+ class << self
171
+ # Add `.with` method as an alias
172
+ alias with new
173
+
174
+ # delegate delivery action to instance
175
+ def message_arrived(*args)
176
+ new.message_arrived(*arsg)
177
+ end
178
+ end
179
+
180
+ def initialize(params = {})
181
+ # do smth with params
182
+ end
183
+
184
+ def message_arrived(msg)
185
+ # send pigeon with the message
186
+ end
187
+ end
188
+ ```
189
+
190
+ Now we want to add a _pigeon_ line to our `EventDelivery`, that is we want to send pigeons when
191
+ we call `EventDelivery.notify(:message_arrived, "ping-ping!")`.
192
+
193
+ Line class has the following API:
194
+
195
+ ```ruby
196
+
197
+ class PigeonLine < ActiveDelivery::Lines::Base
198
+ # This method is used to infer sender class
199
+ # `name` is the name of the delivery class
200
+ def resolve_class(name)
201
+ name.gsub(/Delivery$/, "Pigeon").safe_constantize
202
+ end
203
+
204
+ # This method should return true if sender recognizes the delivery action
205
+ def notify?(delivery_action)
206
+ # `handler_class` is available within the line instance
207
+ sender_class.respond_to?(delivery_action)
208
+ end
209
+
210
+ # Called when we want to send message synchronously
211
+ # `sender` here either `sender_class` or `sender_class.with(params)`
212
+ # if params passed.
213
+ def notify_now(sender, delivery_action, *args)
214
+ # For example, our EventPigeon class returns some `Pigeon` object
215
+ pigeon = sender.public_send(delivery_action, *args)
216
+ # PigeonLaunchService do all the sending job
217
+ PigeonService.launch pigeon
218
+ end
219
+
220
+ # Called when we want to send message asynchronously.
221
+ # For example, you can use background job here.
222
+ def notify_later(sender, delivery_action, *args)
223
+ pigeon = sender.public_send(delivery_action, *args)
224
+ # PigeonLaunchService do all the sending job
225
+ PigeonLaunchJob.perform_later pigeon
226
+ end
227
+ end
228
+ ```
229
+
230
+ **NOTE**: we fallback to superclass's sender class if `resolve_class` returns nil.
231
+ You can disable automatic inference of sender classes by marking delivery as _abstract_:
232
+
233
+ ```ruby
234
+ # we don't not want to use ApplicationMailer by default, don't we?
235
+ class ApplicationDelivery < ActiveDelivery::Base
236
+ self.abstract_class = true
237
+ end
238
+ ```
239
+
240
+ Final step is to register the line within your delivery class:
241
+
242
+ ```ruby
243
+ class EventDelivery < ActiveDelivery::Base
244
+ # under the hood a new instance of PigeonLine is created
245
+ # and used to send pigeons!
246
+ register_line :pigeon, PigeonLine
247
+
248
+ # you can pass additional options to customize your line
249
+ # (and use multiple pigeons lines with different configuration)
250
+ #
251
+ # register_line :pigeon, PigeonLine, namespace: "AngryPigeons"
252
+ #
253
+ # now you can explicitly specify pigeon class
254
+ # pigeon MyCustomPigeon
255
+ #
256
+ # or define pigeon specific callbacks
257
+ #
258
+ # before_notify :ensure_pigeon_is_not_dead, on: :pigeon
259
+ end
260
+ ```
261
+
262
+ ## Related projects
263
+
264
+ - [`abstract_notifier`](https://github.com/palkan/abstract_notifier) – Action Mailer-like interface for text-based notifications.
265
+
141
266
  ## Contributing
142
267
 
143
268
  Bug reports and pull requests are welcome on GitHub at https://github.com/palkan/active_delivery.
@@ -32,6 +32,8 @@ module ActiveDelivery
32
32
  # See https://api.rubyonrails.org/classes/ActionMailer/Parameterized.html
33
33
  class Base
34
34
  class << self
35
+ attr_accessor :abstract_class
36
+
35
37
  alias with new
36
38
 
37
39
  # Enqueues delivery (i.e. uses #deliver_later for mailers)
@@ -70,6 +72,10 @@ module ActiveDelivery
70
72
  end
71
73
  CODE
72
74
  end
75
+
76
+ def abstract_class?
77
+ abstract_class == true
78
+ end
73
79
  end
74
80
 
75
81
  attr_reader :params
@@ -36,6 +36,8 @@ module ActiveDelivery
36
36
  def handler_class
37
37
  return @handler_class if instance_variable_defined?(:@handler_class)
38
38
 
39
+ return @handler_class = nil if owner.abstract_class?
40
+
39
41
  @handler_class = resolve_class(owner.name) ||
40
42
  superclass_handler
41
43
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveDelivery
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_delivery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-20 00:00:00.000000000 Z
11
+ date: 2018-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler