dallal 0.2.0 → 0.3.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
  SHA1:
3
- metadata.gz: 53e11c8daaf54da4d759d04172b5e2ba5fcc4d1d
4
- data.tar.gz: 69bb8738060d5c68b1ddc1c888a25aeaa873cbb2
3
+ metadata.gz: 48bb2a87abb110aaab509c6ebaf377f63260f7aa
4
+ data.tar.gz: 9ceaa80e8deabc46baa7c4ed0a688bbb5c0036c5
5
5
  SHA512:
6
- metadata.gz: 5a30fb2af03e8d7e81ce72b2cb7286a147b5191a3eeadbe26dfebf1ca83db9e52c477ecf58a4bce0b29edc773fbd0248f66b71420576168e88ba92d1455702a4
7
- data.tar.gz: 7ae52241acef4c1e0af8c716499ac5899f3a9e534ad2222176c8ec85786b07fd12af54784c7a1073e2573a25c980a304479c35356e2b7a906fb9b724ab73ee16
6
+ metadata.gz: 426f3fc734c51e3779d9a992de79fe1a6791b990445ebece635307d844ce57d744932930d690eed734ccf17b7b0babaa470347759871d3dd2952998bb3d9d92d
7
+ data.tar.gz: 9fcbf3ec632c534d11ae99416f8db2c8e8a321319b57dab4a7acc9da2cee0f8981fda62319fef5445da6204bae5077edb1354257612565a757177d0fc3c066b2
@@ -1,9 +1,10 @@
1
1
  require "dallal/engine" if defined?(Rails)
2
+ require 'dallal/configuration'
2
3
  require 'dallal/notification'
3
4
  require 'dallal/notifiers/notifier'
4
5
  require 'dallal/events/events'
5
- require 'dallal/configuration'
6
6
  require 'dallal/events/event_publisher'
7
+ require 'twilio-ruby'
7
8
 
8
9
  module Dallal
9
10
  extend Configuration
@@ -2,8 +2,9 @@ require 'ostruct'
2
2
 
3
3
  module Dallal
4
4
  module Configuration
5
- CURRENT_ATTRS = [:user_class_name, :dallal_class_name,
6
- :enabled, :email_layout, :from_email, :from_name].freeze
5
+ CURRENT_ATTRS = [:user_class_name, :dallal_class_name, :enabled,
6
+ :email_layout, :from_email, :from_name,
7
+ :twilio_account_id, :twilio_auth_token, :sms_from].freeze
7
8
  DEPRECATED_ATTRS = [].freeze
8
9
  CONFIG_ATTRS = (CURRENT_ATTRS + DEPRECATED_ATTRS).freeze
9
10
 
@@ -42,12 +43,20 @@ module Dallal
42
43
 
43
44
  private
44
45
  def set_default_values
46
+ # App config
45
47
  self.user_class_name = 'User'
46
48
  self.dallal_class_name = 'Dallal'
47
49
  self.enabled = true
50
+
51
+ # Email config
48
52
  self.email_layout = 'mailer'
49
53
  self.from_email = 'foo@bar.xyz'
50
54
  self.from_name = 'just a name'
55
+
56
+ # SMS config
57
+ self.twilio_account_id = 'YOUR TWILIO ACCOUNT ID'
58
+ self.twilio_auth_token = 'TWILIO_AUTH_TOKEN'
59
+ self.sms_from = 'Sender phone number'
51
60
  end
52
61
  end
53
62
  end
@@ -26,6 +26,7 @@ module Dallal
26
26
  def self.create_notification(id:, event:)
27
27
  # TODO This loops on all callbacks. Rethink this
28
28
  # method and implement it differently. Add listeners?
29
+ # Change callbacks data structure
29
30
  callbacks.each do |callback|
30
31
  next unless callback[:on].include?(event)
31
32
  obj = model_class.constantize.find(id)
@@ -42,16 +42,16 @@ module Dallal
42
42
 
43
43
  def dispatch!
44
44
  validate!
45
- @notifiers.each { |n| n.notify! }
45
+ @notifiers.each do |notifier|
46
+ # notifier.validate!
47
+ notifier.notify!
48
+ end
46
49
  @notifiers.each { |n| n.persist! } if persist?
47
50
  end
48
51
 
49
52
  private
50
53
  # TODO Implement this
51
- # when target is nil throw error
52
- # on email notification when template is nil throw error
53
- # on sms notification when payload is nil throw an error
54
- # on any other notifiers add a validation logic here
54
+ # Add validation logic here
55
55
  def validate!
56
56
  if false
57
57
  raise "You have not defined \'notify\' in \'with\' block for #{class_name} notifier"
@@ -2,10 +2,29 @@ require 'dallal/notifications/base_notification'
2
2
  module Dallal
3
3
  module Notifications
4
4
  class SmsNotification < BaseNotification
5
- attr_reader :sms_payload
5
+ attr_reader :to
6
+ attr_reader :from
7
+ attr_reader :body
8
+
9
+ def initialize(notification, target)
10
+ super(notification, target)
11
+ @from = Dallal.configuration.sms_from
12
+ end
6
13
 
7
- def payload payload
8
- @sms_payload = payload
14
+ def template template
15
+ raise NotImplementedError
16
+ end
17
+
18
+ def message message
19
+ @body = message
20
+ end
21
+
22
+ def recipient recipient_number
23
+ @to = recipient_number
24
+ end
25
+
26
+ def to
27
+ @to || target.phone_number
9
28
  end
10
29
 
11
30
  def notifier
@@ -3,12 +3,28 @@ module Dallal
3
3
  module Notifiers
4
4
  class SmsNotifier < Notifier
5
5
 
6
- def notify!
6
+ class << self
7
+ def client
8
+ @client ||= Twilio::REST::Client.new(
9
+ Dallal.configuration.twilio_account_id,
10
+ Dallal.configuration.twilio_auth_token)
11
+ end
7
12
  end
8
13
 
14
+ def notify!
15
+ client.messages.create(from: notification.from,
16
+ to: notification.to,
17
+ body: notification.body)
18
+ end
9
19
 
10
20
  def persist!
11
21
  end
22
+
23
+ def client
24
+ self.class.client
25
+ end
26
+
27
+ private
12
28
  end
13
29
  end
14
30
  end
@@ -1,7 +1,7 @@
1
1
  module Dallal
2
2
  MAJOR = 0
3
- MINOR = 2
4
- PATCH = 0
3
+ MINOR = 3
4
+ PATCH = 1
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].compact.join(".")
7
7
  end
@@ -1,16 +1,20 @@
1
1
  Dallal.configure do |config|
2
2
  # Set the user class name of your app
3
- config.user_class_name = 'User'
3
+ # config.user_class_name = 'User'
4
4
 
5
5
  # Set up user notification class name
6
- config.dallal_class_name = 'Dallal'
6
+ # config.dallal_class_name = 'DallalNo'
7
7
 
8
- # Enable / Disable notifications globaly
8
+ # Enable / Disable notifications globally
9
9
  config.enabled = true
10
10
 
11
- #
12
- # config.available_notifications = [:email]
11
+ # Email config
12
+ config.email_layout = 'mailer'
13
+ config.from_email = 'info@yourdomain.com'
14
+ config.from_name = 'System Display Name'
13
15
 
14
- #
15
- # config.auto_deliver = true
16
+ # Twulio SMS configuration
17
+ config.twilio_account_id = 'YOUR TWILIO ACCOUNT ID'
18
+ config.twilio_auth_token = 'YOUR TWILIO_AUTH_TOKEN'
19
+ config.sms_from = 'Your Twilio phone phone number'
16
20
  end
@@ -45,7 +45,10 @@ describe Dallal::Configuration do
45
45
  enabled: true,
46
46
  email_layout: 'mailer',
47
47
  from_email: 'foo@bar.xyz',
48
- from_name: 'just a name'
48
+ from_name: 'just a name',
49
+ twilio_account_id: 'YOUR TWILIO ACCOUNT ID',
50
+ twilio_auth_token: 'TWILIO_AUTH_TOKEN',
51
+ sms_from: 'Sender phone number',
49
52
  })
50
53
  end
51
54
  end
@@ -17,6 +17,7 @@ describe Dallal::Events::EventSubscriber do
17
17
  end
18
18
 
19
19
  context 'when a create event is broadcasted' do
20
+ # Failes randomly
20
21
  it 'creates a new instance and executes' do
21
22
  # save the user
22
23
  user.save!
@@ -27,7 +27,7 @@ describe Dallal::Notification do
27
27
  Dallal::Notification.new(event: :create, model_class: 'Post', opts: { a: 1 }, _object: @post)
28
28
  end
29
29
 
30
- it 'should get the target(s) and call the block' do
30
+ it 'should get a single target and call the block' do
31
31
  executed = false
32
32
  subject.notify(@user) do
33
33
  executed = true
@@ -36,6 +36,17 @@ describe Dallal::Notification do
36
36
  expect(subject.targets).to eq [@user]
37
37
  end
38
38
 
39
+ it 'should get multiple target and call the block' do
40
+ executed = false
41
+ other = double("OtherUser")
42
+ subject.notify(@user, other) do
43
+ executed = true
44
+ end
45
+
46
+ expect(executed).to eq true
47
+ expect(subject.targets).to eq [@user, other]
48
+ end
49
+
39
50
  context 'notify with nested with block' do
40
51
  it 'calls with block' do
41
52
  executed = false
@@ -53,14 +64,18 @@ describe Dallal::Notification do
53
64
  end
54
65
 
55
66
  it 'evaluates correctly an sms block' do
67
+ subject.define_singleton_method(:post) {}
68
+ allow(subject).to receive(:post).and_return(@post)
56
69
  subject.notify(@user) do
57
70
  with :sms do
58
- payload({ a:1, b: 2 })
71
+ message "Message #{post.user.email}"
72
+ recipient post.user.phone_number
59
73
  end
60
74
  end
61
75
  notifier = subject.notifiers.first
62
76
  expect(notifier).to be_a(Dallal::Notifiers::SmsNotifier)
63
- expect(notifier.notification.sms_payload).to eq({a: 1, b: 2})
77
+ expect(notifier.notification.body).to eq("Message #{@post.user.email}")
78
+ expect(notifier.notification.to).to eq @post.user.phone_number
64
79
  expect(subject.targets).to eq([@user])
65
80
  end
66
81
 
@@ -101,14 +116,20 @@ describe Dallal::Notification do
101
116
  end
102
117
  end
103
118
 
104
- context "multiple notifiers" do
119
+ context "multiple types" do
105
120
  it 'fills properties correctly' do
121
+ subject.define_singleton_method(:post) do
122
+ @post
123
+ end
124
+ allow(subject).to receive(:post).and_return(@post)
125
+
106
126
  subject.notify(@user) do
107
127
  with :email do
108
128
  template :email_template
109
129
  end
110
130
  with :sms do
111
- payload a: 1, b: 2
131
+ message "Message #{post.user.email}"
132
+ recipient post.user.phone_number
112
133
  end
113
134
  end
114
135
  email_notifier = subject.notifiers.first
@@ -118,9 +139,41 @@ describe Dallal::Notification do
118
139
  expect(email_notifier).to be_a(Dallal::Notifiers::EmailNotifier)
119
140
  expect(email_notifier.notification.template_name).to eq :email_template
120
141
  expect(sms_notifier).to be_a(Dallal::Notifiers::SmsNotifier)
121
- expect(sms_notifier.notification.sms_payload).to eq(a: 1, b: 2)
142
+ expect(sms_notifier.notification.body).to eq "Message #{@post.user.email}"
143
+ expect(sms_notifier.notification.to).to eq @post.user.phone_number
144
+ end
145
+ end
146
+
147
+ context "multiple #notify blocks" do
148
+ before do
149
+ subject.define_singleton_method(:post) do
150
+ @post
151
+ end
152
+ allow(subject).to receive(:post).and_return(@post)
122
153
  end
123
- end
154
+ it 'evaluates multiple efinitions of notify' do
155
+ subject.notify(@user) do
156
+ with :email do
157
+ template :a_template
158
+ end
159
+ end
160
+
161
+ second_user = double("SecondUser")
162
+ subject.notify(second_user) do
163
+ with :email do
164
+ template :b_template
165
+ end
166
+ end
167
+
168
+ expect(subject.notifiers.size).to eq 2
169
+ first = subject.notifiers[0]
170
+ expect(first.notification.target).to eq @user
171
+ expect(first.notification.template_name).to eq :a_template
172
+ second = subject.notifiers[1]
173
+ expect(second.notification.target).to eq second_user
174
+ expect(second.notification.template_name).to eq :b_template
175
+ end
176
+ end
124
177
  end
125
178
 
126
179
  describe 'dispatch!' do
@@ -139,12 +192,86 @@ describe Dallal::Notification do
139
192
  subject.dispatch!
140
193
  end
141
194
  end
142
- context 'single email notification' do
195
+ context 'single email notification with persistance' do
143
196
  pending
144
197
  end
198
+
199
+ context 'single sms notification' do
200
+ it 'send an sms notification' do
201
+ subject.notify(@user) do
202
+ with :sms do
203
+ message "a message"
204
+ end
205
+ end
206
+
207
+ expect(subject.notifiers.size).to eq 1
208
+ expect(subject.notifiers.first).to receive(:notify!)
209
+ expect(subject.notifiers.first).to_not receive(:persist!)
210
+
211
+ subject.dispatch!
212
+ end
213
+ end
214
+
215
+ context 'single sms notification with persistance' do
216
+ pending
217
+ end
218
+
145
219
  context 'multiple notifications' do
146
220
  pending
147
221
  end
222
+
223
+ context "multiple users to be notified" do
224
+ it 'sends an notification to each one of them' do
225
+ other = double("OtherUser")
226
+ subject.notify(@user, other) do
227
+ with :sms do
228
+ message 'a message'
229
+ end
230
+ end
231
+
232
+ expect(subject.notifiers.size).to eq 2
233
+ expect(subject.notifiers.first).to receive(:notify!)
234
+ expect(subject.notifiers.last).to receive(:notify!)
235
+ subject.dispatch!
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "#with" do
241
+ pending
242
+ end
243
+
244
+ describe "#get_notifier" do
245
+ before do
246
+ subject.define_singleton_method(:post) {}
247
+ allow(subject).to receive(:post).and_return(@post)
248
+ end
249
+ context "sms notification" do
250
+ context "when recipient is defined" do
251
+ it 'creates a notification and return an sms notifier' do
252
+ blk = proc { message "a message"; recipient post.user }
253
+ notifier = subject.send(:get_notifier, :sms, @user, &blk)
254
+ expect(notifier).to be_a Dallal::Notifiers::SmsNotifier
255
+ notification = notifier.notification
256
+ expect(notification.target).to eq @user
257
+ expect(notification.body).to eq "a message"
258
+ expect(notification.to).to eq @post.user
259
+ expect(notification.from).to eq Dallal.configuration.sms_from
260
+ end
261
+ end
262
+ context "when recipient is not defined" do
263
+ it 'gets the number from target user' do
264
+ blk = proc { message "a message" }
265
+ notifier = subject.send(:get_notifier, :sms, @user, &blk)
266
+ expect(notifier).to be_a Dallal::Notifiers::SmsNotifier
267
+ notification = notifier.notification
268
+ expect(notification.target).to eq @user
269
+ expect(notification.body).to eq "a message"
270
+ expect(notification.to).to eq @post.user.phone_number
271
+ expect(notification.from).to eq Dallal.configuration.sms_from
272
+ end
273
+ end
274
+ end
148
275
  end
149
276
 
150
277
  describe 'persist?' do
@@ -4,6 +4,7 @@ describe Dallal::Notifiers::Notifier do
4
4
  let(:notification) { double("Notification") }
5
5
  subject { Dallal::Notifiers::Notifier.new(notification) }
6
6
  it { expect(subject).to be_a Dallal::AbstractInterface }
7
+ it { expect(subject.notification).to eq(notification) }
7
8
 
8
9
  describe "#persist!" do
9
10
  it 'should raise an error' do
@@ -0,0 +1,26 @@
1
+ require 'rails_helper'
2
+
3
+ describe Dallal::Notifiers::SmsNotifier do
4
+ let(:notification) do
5
+ double("Notification", body: 'a message', from: '111', to: '222')
6
+ end
7
+ subject { Dallal::Notifiers::SmsNotifier.new(notification) }
8
+
9
+ it { expect(subject).to be_a(Dallal::Notifiers::Notifier) }
10
+
11
+ describe '.client' do
12
+ it 'should return a twillio clinet' do
13
+ client = subject.client
14
+ expect(client).to be_a Twilio::REST::Client
15
+ end
16
+ end
17
+
18
+ describe '#notify' do
19
+ it 'should create a message with twillio reset client' do
20
+ expect(subject.client).to receive_message_chain(:messages, :create).with(from: notification.from, to: notification.to, body: notification.body)
21
+ subject.notify!
22
+ end
23
+ end
24
+
25
+ describe '#persist'
26
+ end