mailboxer 0.2.1 → 0.2.2
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.
- data/app/models/notification.rb +44 -1
- data/app/models/receipt.rb +15 -3
- data/lib/mailboxer/models/messageable.rb +51 -8
- data/mailboxer.gemspec +1 -1
- data/spec/models/mailbox_spec.rb +1 -0
- data/spec/models/mailboxer_models_messageable_spec.rb +245 -50
- metadata +3 -3
data/app/models/notification.rb
CHANGED
@@ -8,6 +8,12 @@ class Notification < ActiveRecord::Base
|
|
8
8
|
|
9
9
|
scope :recipient, lambda { |recipient|
|
10
10
|
joins(:receipts).where('receipts.receiver_id' => recipient.id,'receipts.receiver_type' => recipient.class.to_s)
|
11
|
+
}
|
12
|
+
scope :not_trashed, lambda {
|
13
|
+
joins(:receipts).where('receipts.trashed' => false)
|
14
|
+
}
|
15
|
+
scope :unread, lambda {
|
16
|
+
joins(:receipts).where('receipts.read' => false)
|
11
17
|
}
|
12
18
|
|
13
19
|
class << self
|
@@ -43,7 +49,8 @@ class Notification < ActiveRecord::Base
|
|
43
49
|
temp_receipts.each(&:save!) #Save receipts
|
44
50
|
self.recipients=nil
|
45
51
|
end
|
46
|
-
return temp_receipts
|
52
|
+
return temp_receipts if temp_receipts.size > 1
|
53
|
+
return temp_receipts.first
|
47
54
|
end
|
48
55
|
|
49
56
|
#Returns the recipients of the Notification
|
@@ -62,6 +69,11 @@ class Notification < ActiveRecord::Base
|
|
62
69
|
def receipt_for(participant)
|
63
70
|
return Receipt.notification(self).recipient(participant)
|
64
71
|
end
|
72
|
+
|
73
|
+
#Returns the receipt for the participant. Alias for receipt_for(participant)
|
74
|
+
def receipts_for(participant)
|
75
|
+
return receipt_for(participant)
|
76
|
+
end
|
65
77
|
|
66
78
|
#Returns if the participant have read the Notification
|
67
79
|
def is_unread?(participant)
|
@@ -69,6 +81,37 @@ class Notification < ActiveRecord::Base
|
|
69
81
|
return self.receipt_for(participant).first.read
|
70
82
|
end
|
71
83
|
|
84
|
+
#Returns if the participant have trashed the Notification
|
85
|
+
def is_trashed?(participant)
|
86
|
+
return false if participant.nil?
|
87
|
+
return self.receipt_for(participant).first.trashed
|
88
|
+
end
|
89
|
+
|
90
|
+
#Mark the notification as read
|
91
|
+
def mark_as_read(participant)
|
92
|
+
return if participant.nil?
|
93
|
+
return self.receipt_for(participant).mark_as_read
|
94
|
+
end
|
95
|
+
|
96
|
+
#Mark the notification as unread
|
97
|
+
def mark_as_unread(participant)
|
98
|
+
return if participant.nil?
|
99
|
+
return self.receipt_for(participant).mark_as_unread
|
100
|
+
end
|
101
|
+
|
102
|
+
#Move the notification to the trash
|
103
|
+
def move_to_trash(participant)
|
104
|
+
return if participant.nil?
|
105
|
+
return self.receipt_for(participant).move_to_trash
|
106
|
+
end
|
107
|
+
|
108
|
+
#Takes the notification out of the trash
|
109
|
+
def untrash(participant)
|
110
|
+
return if participant.nil?
|
111
|
+
return self.receipt_for(participant).untrash
|
112
|
+
end
|
113
|
+
|
114
|
+
|
72
115
|
include ActionView::Helpers::SanitizeHelper
|
73
116
|
|
74
117
|
#Sanitizes the body and subject
|
data/app/models/receipt.rb
CHANGED
@@ -65,12 +65,13 @@ class Receipt < ActiveRecord::Base
|
|
65
65
|
where(options).each do |rcp|
|
66
66
|
ids << rcp.id
|
67
67
|
end
|
68
|
-
|
68
|
+
return if ids.empty?
|
69
|
+
conditions = [""].concat(ids)
|
69
70
|
condition = "id = ? "
|
70
|
-
|
71
|
+
ids.drop(1).each do
|
71
72
|
condition << "OR id = ? "
|
72
73
|
end
|
73
|
-
conditions =
|
74
|
+
conditions[0] = condition
|
74
75
|
Receipt.except(:where).except(:joins).where(conditions).update_all(updates)
|
75
76
|
end
|
76
77
|
end
|
@@ -111,6 +112,17 @@ class Receipt < ActiveRecord::Base
|
|
111
112
|
return nil
|
112
113
|
end
|
113
114
|
|
115
|
+
#Returns if the participant have read the Notification
|
116
|
+
def is_unread?
|
117
|
+
return !self.read
|
118
|
+
end
|
119
|
+
|
120
|
+
#Returns if the participant have trashed the Notification
|
121
|
+
def is_trashed?
|
122
|
+
return self.trashed
|
123
|
+
end
|
124
|
+
|
125
|
+
|
114
126
|
protected
|
115
127
|
|
116
128
|
#Removes the duplicate error about not present subject from Conversation if it has been already
|
@@ -107,11 +107,9 @@ module Mailboxer
|
|
107
107
|
when Receipt
|
108
108
|
return obj.mark_as_read if obj.receiver == self
|
109
109
|
when Message, Notification
|
110
|
-
|
111
|
-
return receipt.mark_as_read
|
110
|
+
obj.mark_as_read(self)
|
112
111
|
when Conversation
|
113
|
-
|
114
|
-
return receipts.mark_as_read
|
112
|
+
obj.mark_as_read(self)
|
115
113
|
when Array
|
116
114
|
obj.map{ |sub_obj| read(sub_obj) }
|
117
115
|
else
|
@@ -132,17 +130,62 @@ module Mailboxer
|
|
132
130
|
when Receipt
|
133
131
|
return obj.mark_as_unread if obj.receiver == self
|
134
132
|
when Message, Notification
|
135
|
-
|
136
|
-
return receipt.mark_as_unread
|
133
|
+
obj.mark_as_unread(self)
|
137
134
|
when Conversation
|
138
|
-
|
139
|
-
return receipts.mark_as_unread
|
135
|
+
obj.mark_as_unread(self)
|
140
136
|
when Array
|
141
137
|
obj.map{ |sub_obj| unread(sub_obj) }
|
142
138
|
else
|
143
139
|
return nil
|
144
140
|
end
|
145
141
|
end
|
142
|
+
|
143
|
+
|
144
|
+
#Mark the object as trashed for messageable.
|
145
|
+
#
|
146
|
+
#Object can be:
|
147
|
+
#* A Receipt
|
148
|
+
#* A Message
|
149
|
+
#* A Notification
|
150
|
+
#* A Conversation
|
151
|
+
#* An array with any of them
|
152
|
+
def trash(obj)
|
153
|
+
case obj
|
154
|
+
when Receipt
|
155
|
+
return obj.move_to_trash if obj.receiver == self
|
156
|
+
when Message, Notification
|
157
|
+
obj.move_to_trash(self)
|
158
|
+
when Conversation
|
159
|
+
obj.move_to_trash(self)
|
160
|
+
when Array
|
161
|
+
obj.map{ |sub_obj| trash(sub_obj) }
|
162
|
+
else
|
163
|
+
return nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
#Mark the object as not trashed for messageable.
|
168
|
+
#
|
169
|
+
#Object can be:
|
170
|
+
#* A Receipt
|
171
|
+
#* A Message
|
172
|
+
#* A Notification
|
173
|
+
#* A Conversation
|
174
|
+
#* An array with any of them
|
175
|
+
def untrash(obj)
|
176
|
+
case obj
|
177
|
+
when Receipt
|
178
|
+
return obj.untrash if obj.receiver == self
|
179
|
+
when Message, Notification
|
180
|
+
obj.untrash(self)
|
181
|
+
when Conversation
|
182
|
+
obj.untrash(self)
|
183
|
+
when Array
|
184
|
+
obj.map{ |sub_obj| untrash(sub_obj) }
|
185
|
+
else
|
186
|
+
return nil
|
187
|
+
end
|
188
|
+
end
|
146
189
|
end
|
147
190
|
end
|
148
191
|
end
|
data/mailboxer.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "mailboxer"
|
3
|
-
s.version = "0.2.
|
3
|
+
s.version = "0.2.2"
|
4
4
|
s.authors = ["Eduardo Casanova Cuesta"]
|
5
5
|
s.summary = "Messaging system for rails apps."
|
6
6
|
s.description = "A Rails engine that allows any model to act as messageable, permitting it interchange messages with any other messageable model." +
|
data/spec/models/mailbox_spec.rb
CHANGED
@@ -25,18 +25,16 @@ describe "Mailboxer::Models::Messageable through User" do
|
|
25
25
|
assert @entity2.reply_to_all(@receipt,"Reply body")
|
26
26
|
end
|
27
27
|
|
28
|
-
it "should be able to reply to conversation (TODO)" do
|
29
|
-
#TODO
|
30
|
-
end
|
31
28
|
|
32
|
-
|
29
|
+
|
30
|
+
it "should be able to unread an owned Receipt (mark as unread)" do
|
33
31
|
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
34
32
|
@receipt.read.should==true
|
35
33
|
@entity1.unread(@receipt)
|
36
34
|
@receipt.read.should==false
|
37
35
|
end
|
38
36
|
|
39
|
-
it "should be able to read an owned
|
37
|
+
it "should be able to read an owned Receipt (mark as read)" do
|
40
38
|
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
41
39
|
@receipt.read.should==true
|
42
40
|
@entity1.unread(@receipt)
|
@@ -44,14 +42,14 @@ describe "Mailboxer::Models::Messageable through User" do
|
|
44
42
|
@receipt.read.should==true
|
45
43
|
end
|
46
44
|
|
47
|
-
it "should be able to unread
|
45
|
+
it "should not be able to unread a not owned Receipt (mark as unread)" do
|
48
46
|
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
49
47
|
@receipt.read.should==true
|
50
48
|
@entity2.unread(@receipt) #Should not change
|
51
49
|
@receipt.read.should==true
|
52
50
|
end
|
53
51
|
|
54
|
-
it "should be able to read a not owned
|
52
|
+
it "should not be able to read a not owned Receipt (mark as read)" do
|
55
53
|
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
56
54
|
@receipt.read.should==true
|
57
55
|
@entity1.unread(@receipt) #From read to unread
|
@@ -59,49 +57,246 @@ describe "Mailboxer::Models::Messageable through User" do
|
|
59
57
|
@receipt.read.should==false
|
60
58
|
end
|
61
59
|
|
62
|
-
|
63
|
-
|
64
|
-
@
|
65
|
-
@
|
66
|
-
@
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
@
|
72
|
-
|
73
|
-
@
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
@
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
@
|
86
|
-
@
|
87
|
-
|
88
|
-
@
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
@
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
=
|
60
|
+
it "should be able to trash an owned Receipt" do
|
61
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
62
|
+
@receipt.trashed.should==false
|
63
|
+
@entity1.trash(@receipt)
|
64
|
+
@receipt.trashed.should==true
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should be able to untrash an owned Receipt" do
|
68
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
69
|
+
@receipt.trashed.should==false
|
70
|
+
@entity1.trash(@receipt)
|
71
|
+
@entity1.untrash(@receipt)
|
72
|
+
@receipt.trashed.should==false
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should not be able to trash a not owned Receipt" do
|
76
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
77
|
+
@receipt.trashed.should==false
|
78
|
+
@entity2.trash(@receipt) #Should not change
|
79
|
+
@receipt.trashed.should==false
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not be able to untrash a not owned Receipt" do
|
83
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
84
|
+
@receipt.trashed.should==false
|
85
|
+
@entity1.trash(@receipt) #From read to unread
|
86
|
+
@entity2.untrash(@receipt) #Should not change
|
87
|
+
@receipt.trashed.should==true
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
it "should be able to unread an owned Message (mark as unread)" do
|
93
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
94
|
+
@message = @receipt.message
|
95
|
+
@receipt.read.should==true
|
96
|
+
@entity1.unread(@message)
|
97
|
+
@message.receipt_for(@entity1).first.read.should==false
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should be able to read an owned Message (mark as read)" do
|
101
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
102
|
+
@message = @receipt.message
|
103
|
+
@receipt.read.should==true
|
104
|
+
@entity1.unread(@message)
|
105
|
+
@entity1.read(@message)
|
106
|
+
@message.receipt_for(@entity1).first.read.should==true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should not be able to unread a not owned Message (mark as unread)" do
|
110
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
111
|
+
@message = @receipt.message
|
112
|
+
@receipt.read.should==true
|
113
|
+
@entity2.unread(@message) #Should not change
|
114
|
+
@message.receipt_for(@entity1).first.read.should==true
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should not be able to read a not owned Message (mark as read)" do
|
118
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
119
|
+
@message = @receipt.message
|
120
|
+
@receipt.read.should==true
|
121
|
+
@entity1.unread(@message) #From read to unread
|
122
|
+
@entity2.read(@message) #Should not change
|
123
|
+
@message.receipt_for(@entity1).first.read.should==false
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should be able to trash an owned Message" do
|
127
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
128
|
+
@message = @receipt.message
|
129
|
+
@receipt.trashed.should==false
|
130
|
+
@entity1.trash(@message)
|
131
|
+
@message.receipt_for(@entity1).first.trashed.should==true
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should be able to untrash an owned Message" do
|
135
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
136
|
+
@message = @receipt.message
|
137
|
+
@receipt.trashed.should==false
|
138
|
+
@entity1.trash(@message)
|
139
|
+
@entity1.untrash(@message)
|
140
|
+
@message.receipt_for(@entity1).first.trashed.should==false
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should not be able to trash a not owned Message" do
|
144
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
145
|
+
@message = @receipt.message
|
146
|
+
@receipt.trashed.should==false
|
147
|
+
@entity2.trash(@message) #Should not change
|
148
|
+
@message.receipt_for(@entity1).first.trashed.should==false
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should not be able to untrash a not owned Message" do
|
152
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
153
|
+
@message = @receipt.message
|
154
|
+
@receipt.trashed.should==false
|
155
|
+
@entity1.trash(@message) #From read to unread
|
156
|
+
@entity2.untrash(@message) #Should not change
|
157
|
+
@message.receipt_for(@entity1).first.trashed.should==true
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
it "should be able to unread an owned Notification (mark as unread)" do
|
163
|
+
@receipt = @entity1.notify("Subject","Body")
|
164
|
+
@notification = @receipt.notification
|
165
|
+
@receipt.read.should==false
|
166
|
+
@entity1.read(@notification)
|
167
|
+
@entity1.unread(@notification)
|
168
|
+
@notification.receipt_for(@entity1).first.read.should==false
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should be able to read an owned Notification (mark as read)" do
|
172
|
+
@receipt = @entity1.notify("Subject","Body")
|
173
|
+
@notification = @receipt.notification
|
174
|
+
@receipt.read.should==false
|
175
|
+
@entity1.read(@notification)
|
176
|
+
@notification.receipt_for(@entity1).first.read.should==true
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should not be able to unread a not owned Notification (mark as unread)" do
|
180
|
+
@receipt = @entity1.notify("Subject","Body")
|
181
|
+
@notification = @receipt.notification
|
182
|
+
@receipt.read.should==false
|
183
|
+
@entity1.read(@notification)
|
184
|
+
@entity2.unread(@notification)
|
185
|
+
@notification.receipt_for(@entity1).first.read.should==true
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should not be able to read a not owned Notification (mark as read)" do
|
189
|
+
@receipt = @entity1.notify("Subject","Body")
|
190
|
+
@notification = @receipt.notification
|
191
|
+
@receipt.read.should==false
|
192
|
+
@entity2.read(@notification)
|
193
|
+
@notification.receipt_for(@entity1).first.read.should==false
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should be able to trash an owned Notification" do
|
197
|
+
@receipt = @entity1.notify("Subject","Body")
|
198
|
+
@notification = @receipt.notification
|
199
|
+
@receipt.trashed.should==false
|
200
|
+
@entity1.trash(@notification)
|
201
|
+
@notification.receipt_for(@entity1).first.trashed.should==true
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should be able to untrash an owned Notification" do
|
205
|
+
@receipt = @entity1.notify("Subject","Body")
|
206
|
+
@notification = @receipt.notification
|
207
|
+
@receipt.trashed.should==false
|
208
|
+
@entity1.trash(@notification)
|
209
|
+
@entity1.untrash(@notification)
|
210
|
+
@notification.receipt_for(@entity1).first.trashed.should==false
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should not be able to trash a not owned Notification" do
|
214
|
+
@receipt = @entity1.notify("Subject","Body")
|
215
|
+
@notification = @receipt.notification
|
216
|
+
@receipt.trashed.should==false
|
217
|
+
@entity2.trash(@notification)
|
218
|
+
@notification.receipt_for(@entity1).first.trashed.should==false
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should not be able to untrash a not owned Notification" do
|
222
|
+
@receipt = @entity1.notify("Subject","Body")
|
223
|
+
@notification = @receipt.notification
|
224
|
+
@receipt.trashed.should==false
|
225
|
+
@entity1.trash(@notification)
|
226
|
+
@entity2.untrash(@notification)
|
227
|
+
@notification.receipt_for(@entity1).first.trashed.should==true
|
228
|
+
end
|
229
|
+
|
230
|
+
|
231
|
+
|
232
|
+
it "should be able to unread an owned Conversation (mark as unread)" do
|
233
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
234
|
+
@conversation = @receipt.conversation
|
235
|
+
@receipt.read.should==true
|
236
|
+
@entity1.unread(@conversation)
|
237
|
+
@conversation.receipts_for(@entity1).first.read.should==false
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should be able to read an owned Conversation (mark as read)" do
|
241
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
242
|
+
@conversation = @receipt.conversation
|
243
|
+
@receipt.read.should==true
|
244
|
+
@entity1.unread(@conversation)
|
245
|
+
@entity1.read(@conversation)
|
246
|
+
@conversation.receipts_for(@entity1).first.read.should==true
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should not be able to unread a not owned Conversation (mark as unread)" do
|
250
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
251
|
+
@conversation = @receipt.conversation
|
252
|
+
@receipt.read.should==true
|
253
|
+
@entity2.unread(@conversation)
|
254
|
+
@conversation.receipts_for(@entity1).first.read.should==true
|
255
|
+
end
|
256
|
+
|
257
|
+
it "should not be able to read a not owned Conversation (mark as read)" do
|
258
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
259
|
+
@conversation = @receipt.conversation
|
260
|
+
@receipt.read.should==true
|
261
|
+
@entity1.unread(@conversation)
|
262
|
+
@entity2.read(@conversation)
|
263
|
+
@conversation.receipts_for(@entity1).first.read.should==false
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should be able to trash an owned Conversation" do
|
267
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
268
|
+
@conversation = @receipt.conversation
|
269
|
+
@receipt.trashed.should==false
|
270
|
+
@entity1.trash(@conversation)
|
271
|
+
@conversation.receipts_for(@entity1).first.trashed.should==true
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should be able to untrash an owned Conversation" do
|
275
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
276
|
+
@conversation = @receipt.conversation
|
277
|
+
@receipt.trashed.should==false
|
278
|
+
@entity1.trash(@conversation)
|
279
|
+
@entity1.untrash(@conversation)
|
280
|
+
@conversation.receipts_for(@entity1).first.trashed.should==false
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should not be able to trash a not owned Conversation" do
|
284
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
285
|
+
@conversation = @receipt.conversation
|
286
|
+
@receipt.trashed.should==false
|
287
|
+
@entity2.trash(@conversation)
|
288
|
+
@conversation.receipts_for(@entity1).first.trashed.should==false
|
289
|
+
end
|
105
290
|
|
291
|
+
it "should not be able to untrash a not owned Conversation" do
|
292
|
+
@receipt = @entity1.send_message(@entity2,"Body","Subject")
|
293
|
+
@conversation = @receipt.conversation
|
294
|
+
@receipt.trashed.should==false
|
295
|
+
@entity1.trash(@conversation)
|
296
|
+
@entity2.untrash(@conversation)
|
297
|
+
@conversation.receipts_for(@entity1).first.trashed.should==true
|
298
|
+
end
|
299
|
+
|
300
|
+
|
106
301
|
|
107
302
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailboxer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Eduardo Casanova Cuesta
|