has_messages 0.3.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.
- data/CHANGELOG.rdoc +5 -0
- data/Rakefile +2 -2
- data/app/models/message.rb +27 -22
- data/app/models/message_recipient.rb +27 -20
- data/lib/has_messages.rb +2 -2
- data/test/unit/message_recipient_test.rb +8 -0
- data/test/unit/message_test.rb +8 -0
- metadata +3 -3
data/CHANGELOG.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake/contrib/sshpublisher'
|
|
5
5
|
|
6
6
|
spec = Gem::Specification.new do |s|
|
7
7
|
s.name = 'has_messages'
|
8
|
-
s.version = '0.3.
|
8
|
+
s.version = '0.3.1'
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.summary = 'Demonstrates a reference implementation for sending messages between users.'
|
11
11
|
|
@@ -13,7 +13,7 @@ spec = Gem::Specification.new do |s|
|
|
13
13
|
s.require_path = 'lib'
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.test_files = Dir['test/**/*_test.rb']
|
16
|
-
s.add_dependency 'state_machine', '>= 0.
|
16
|
+
s.add_dependency 'state_machine', '>= 0.5.0'
|
17
17
|
|
18
18
|
s.author = 'Aaron Pfeifer'
|
19
19
|
s.email = 'aaron@pluginaweek.org'
|
data/app/models/message.rb
CHANGED
@@ -14,12 +14,16 @@
|
|
14
14
|
# * +queue+ - Queues the message so that you can send it in a separate process
|
15
15
|
# * +deliver+ - Sends the message to all of the recipients
|
16
16
|
#
|
17
|
-
# ==
|
17
|
+
# == Message visibility
|
18
18
|
#
|
19
19
|
# Although you can delete a message, it will also delete it from the inbox of all
|
20
|
-
# the message's recipients. Instead, you can
|
21
|
-
#
|
22
|
-
# * +
|
20
|
+
# the message's recipients. Instead, you can change the *visibility* of the
|
21
|
+
# message. Messages have 1 of 2 states that define its visibility:
|
22
|
+
# * +visible+ - The message is visible to the sender
|
23
|
+
# * +hidden+ - The message is hidden from the sender
|
24
|
+
#
|
25
|
+
# The visibility of a message can be changed by running the associated action:
|
26
|
+
# * +hide+ -Hides the message from the sender
|
23
27
|
# * +unhide+ - Makes the message visible again
|
24
28
|
class Message < ActiveRecord::Base
|
25
29
|
belongs_to :sender,
|
@@ -43,17 +47,33 @@ class Message < ActiveRecord::Base
|
|
43
47
|
:conditions => {:hidden_at => nil}
|
44
48
|
|
45
49
|
# Define actions for the message
|
46
|
-
state_machine :state, :initial =>
|
50
|
+
state_machine :state, :initial => :unsent do
|
47
51
|
# Queues the message so that it's sent in a separate process
|
48
52
|
event :queue do
|
49
|
-
transition :to =>
|
53
|
+
transition :to => :queued, :from => :unsent, :if => :has_recipients?
|
50
54
|
end
|
51
55
|
|
52
56
|
# Sends the message to all of the recipients as long as at least one
|
53
57
|
# recipient has been added
|
54
58
|
event :deliver do
|
55
|
-
transition :to =>
|
59
|
+
transition :to => :sent, :from => [:unsent, :queued], :if => :has_recipients?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Defines actions for the visibility of the message
|
64
|
+
state_machine :hidden_at, :initial => :visible do
|
65
|
+
# Hides the message from the recipient's inbox
|
66
|
+
event :hide do
|
67
|
+
transition :to => :hidden
|
56
68
|
end
|
69
|
+
|
70
|
+
# Makes the message visible in the recipient's inbox
|
71
|
+
event :unhide do
|
72
|
+
transition :to => :visible
|
73
|
+
end
|
74
|
+
|
75
|
+
state :visible, :value => nil
|
76
|
+
state :hidden, :value => lambda {Time.now}, :if => lambda {|value| value}
|
57
77
|
end
|
58
78
|
|
59
79
|
# Directly adds the receivers on the message (i.e. they are visible to all recipients)
|
@@ -101,21 +121,6 @@ class Message < ActiveRecord::Base
|
|
101
121
|
message
|
102
122
|
end
|
103
123
|
|
104
|
-
# Hides the message from the sender's inbox
|
105
|
-
def hide
|
106
|
-
update_attribute(:hidden_at, Time.now)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Makes the message visible in the sender's inbox
|
110
|
-
def unhide
|
111
|
-
update_attribute(:hidden_at, nil)
|
112
|
-
end
|
113
|
-
|
114
|
-
# Is this message still hidden from the sender's inbox?
|
115
|
-
def hidden?
|
116
|
-
hidden_at?
|
117
|
-
end
|
118
|
-
|
119
124
|
private
|
120
125
|
# Create/destroy any receivers that were added/removed
|
121
126
|
def update_recipients
|
@@ -17,8 +17,13 @@
|
|
17
17
|
#
|
18
18
|
# Although you can delete a recipient, it will also delete it from everyone else's
|
19
19
|
# message, meaning that no one will know that person was ever a recipient of the
|
20
|
-
# message. Instead, you can
|
21
|
-
#
|
20
|
+
# message. Instead, you can change the *visibility* of the message. Messages
|
21
|
+
# have 1 of 2 states that define its visibility:
|
22
|
+
# * +visible+ - The message is visible to the recipient
|
23
|
+
# * +hidden+ - The message is hidden from the recipient
|
24
|
+
#
|
25
|
+
# The visibility of a message can be changed by running the associated action:
|
26
|
+
# * +hide+ -Hides the message from the recipient
|
22
27
|
# * +unhide+ - Makes the message visible again
|
23
28
|
class MessageRecipient < ActiveRecord::Base
|
24
29
|
belongs_to :message
|
@@ -52,11 +57,28 @@ class MessageRecipient < ActiveRecord::Base
|
|
52
57
|
named_scope :visible,
|
53
58
|
:conditions => {:hidden_at => nil}
|
54
59
|
|
55
|
-
|
60
|
+
# Defines actions for the recipient
|
61
|
+
state_machine :state, :initial => :unread do
|
56
62
|
# Indicates that the message has been viewed by the receiver
|
57
63
|
event :view do
|
58
|
-
transition :to =>
|
64
|
+
transition :to => :read, :from => :unread, :if => :message_sent?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Defines actions for the visibility of the message to the recipient
|
69
|
+
state_machine :hidden_at, :initial => :visible do
|
70
|
+
# Hides the message from the recipient's inbox
|
71
|
+
event :hide do
|
72
|
+
transition :to => :hidden
|
59
73
|
end
|
74
|
+
|
75
|
+
# Makes the message visible in the recipient's inbox
|
76
|
+
event :unhide do
|
77
|
+
transition :to => :visible
|
78
|
+
end
|
79
|
+
|
80
|
+
state :visible, :value => nil
|
81
|
+
state :hidden, :value => lambda {Time.now}, :if => lambda {|value| value}
|
60
82
|
end
|
61
83
|
|
62
84
|
# Forwards this message, including the original subject and body in the new
|
@@ -87,25 +109,10 @@ class MessageRecipient < ActiveRecord::Base
|
|
87
109
|
message
|
88
110
|
end
|
89
111
|
|
90
|
-
# Hides the message from the recipient's inbox
|
91
|
-
def hide
|
92
|
-
update_attribute(:hidden_at, Time.now)
|
93
|
-
end
|
94
|
-
|
95
|
-
# Makes the message visible in the recipient's inbox
|
96
|
-
def unhide
|
97
|
-
update_attribute(:hidden_at, nil)
|
98
|
-
end
|
99
|
-
|
100
|
-
# Is this message still hidden from the recipient's inbox?
|
101
|
-
def hidden?
|
102
|
-
hidden_at?
|
103
|
-
end
|
104
|
-
|
105
112
|
private
|
106
113
|
# Has the message this recipient is on been sent?
|
107
114
|
def message_sent?
|
108
|
-
message.
|
115
|
+
message.sent?
|
109
116
|
end
|
110
117
|
|
111
118
|
# Sets the position of the current recipient based on existing recipients
|
data/lib/has_messages.rb
CHANGED
@@ -53,13 +53,13 @@ module HasMessages
|
|
53
53
|
# Composed messages that have not yet been sent. These consists of all
|
54
54
|
# messages that are currently in the "unsent" state.
|
55
55
|
def unsent_messages
|
56
|
-
messages.with_state(
|
56
|
+
messages.with_state(:unsent)
|
57
57
|
end
|
58
58
|
|
59
59
|
# Composed messages that have already been sent. These consists of all
|
60
60
|
# messages that are currently in the "queued" or "sent" states.
|
61
61
|
def sent_messages
|
62
|
-
messages.with_states(
|
62
|
+
messages.with_states(:queued, :sent)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -234,6 +234,10 @@ class MessageRecipientHiddenTest < Test::Unit::TestCase
|
|
234
234
|
def test_should_be_hidden
|
235
235
|
assert @recipient.hidden?
|
236
236
|
end
|
237
|
+
|
238
|
+
def test_should_not_be_visible
|
239
|
+
assert !@recipient.visible?
|
240
|
+
end
|
237
241
|
end
|
238
242
|
|
239
243
|
class MessageRecipientUnhiddenTest < Test::Unit::TestCase
|
@@ -250,6 +254,10 @@ class MessageRecipientUnhiddenTest < Test::Unit::TestCase
|
|
250
254
|
def test_should_not_be_hidden
|
251
255
|
assert !@recipient.hidden?
|
252
256
|
end
|
257
|
+
|
258
|
+
def test_should_be_visible
|
259
|
+
assert @recipient.visible?
|
260
|
+
end
|
253
261
|
end
|
254
262
|
|
255
263
|
class MessageRecipientForwardedTest < Test::Unit::TestCase
|
data/test/unit/message_test.rb
CHANGED
@@ -278,6 +278,10 @@ class MessageHiddenTest < Test::Unit::TestCase
|
|
278
278
|
def test_should_be_hidden
|
279
279
|
assert @message.hidden?
|
280
280
|
end
|
281
|
+
|
282
|
+
def test_should_not_be_visible
|
283
|
+
assert !@message.visible?
|
284
|
+
end
|
281
285
|
end
|
282
286
|
|
283
287
|
class MessageUnhiddenTest < Test::Unit::TestCase
|
@@ -294,6 +298,10 @@ class MessageUnhiddenTest < Test::Unit::TestCase
|
|
294
298
|
def test_should_not_be_hidden
|
295
299
|
assert !@message.hidden?
|
296
300
|
end
|
301
|
+
|
302
|
+
def test_should_be_visible
|
303
|
+
assert @message.visible?
|
304
|
+
end
|
297
305
|
end
|
298
306
|
|
299
307
|
class MessageForwardedTest < Test::Unit::TestCase
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_messages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Pfeifer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-01-11 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.
|
23
|
+
version: 0.5.0
|
24
24
|
version:
|
25
25
|
description:
|
26
26
|
email: aaron@pluginaweek.org
|