acts-as-messageable 0.0.3 → 0.1.0
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/README.rdoc +66 -11
- data/Rakefile +11 -1
- data/VERSION +1 -1
- data/lib/acts-as-messageable.rb +1 -1
- data/lib/acts_as_messageable/acts-as-messageable.rb +59 -30
- data/lib/acts_as_messageable/message.rb +28 -2
- data/lib/generators/acts_as_messageable/migration/templates/migration.rb +5 -2
- data/test/message_test.rb +114 -0
- metadata +13 -9
data/README.rdoc
CHANGED
@@ -17,23 +17,78 @@ To use it, add it to your Gemfile:
|
|
17
17
|
acts_as_messageable
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
@user2 = User.last
|
20
|
+
== Send message
|
22
21
|
|
23
22
|
# user1 send message to user2
|
24
|
-
|
25
|
-
@
|
23
|
+
# user.send_message(another_user, topic, body)
|
24
|
+
@user1.send_message(@user2, "Message to user2", "Hi user 2!;-)")
|
25
|
+
@user2.send_message(@user1, "Re: Message to user2", "Hi there!:)")
|
26
|
+
|
27
|
+
== Inbox/Outbox
|
26
28
|
|
27
29
|
# Show inbox
|
28
|
-
@
|
30
|
+
@user.received
|
31
|
+
# Show inbox trash
|
32
|
+
@user.received(:deleted => true)
|
33
|
+
# Show inbox with inbox trash
|
34
|
+
@user.received(:all => true)
|
35
|
+
|
29
36
|
# Show outbox
|
30
|
-
@
|
37
|
+
@user.sent
|
38
|
+
# Show outbox trash
|
39
|
+
@user.sent(:deleted => true)
|
40
|
+
# Show outbox with inbox trash
|
41
|
+
@user.sent(:all => true)
|
42
|
+
|
43
|
+
# Show trash
|
44
|
+
@user.messages(:deleted => true)
|
45
|
+
# Show all messages
|
46
|
+
@user.messages(:all => true)
|
47
|
+
|
48
|
+
== Delete message
|
49
|
+
|
50
|
+
# Delete message with block
|
51
|
+
@user.messages do |message|
|
52
|
+
message.delete
|
53
|
+
end
|
54
|
+
|
55
|
+
@user.send do |message|
|
56
|
+
message.delete
|
57
|
+
end
|
58
|
+
|
59
|
+
@user.received do |message|
|
60
|
+
message.delete
|
61
|
+
end
|
62
|
+
|
63
|
+
@user.messages(:from => @another_user) do |message|
|
64
|
+
message.delete
|
65
|
+
end
|
66
|
+
|
67
|
+
@user.messages(:to => @another_user) do |message|
|
68
|
+
messsage.delete
|
69
|
+
end
|
70
|
+
|
71
|
+
@user.send(:id => 10) do |message|
|
72
|
+
message.delete
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# Delete by hand
|
77
|
+
@user.delete_message(@user.messages(:id => 10))
|
78
|
+
|
79
|
+
== Search
|
31
80
|
|
32
81
|
# Search message
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
36
|
-
@
|
82
|
+
@user.messages # all messages (in and out)
|
83
|
+
@user.messages(:from => @user2) # all messages from @user2
|
84
|
+
@user.messages(:to => @user2) # all messages to @user2
|
85
|
+
@user.messages(:id => 2) # message where message.id = 2
|
86
|
+
|
87
|
+
== Blocks time ;-)
|
88
|
+
|
89
|
+
@user.messages do |messsage|
|
90
|
+
# message stuff...
|
91
|
+
end
|
37
92
|
|
38
|
-
Copyright ©
|
93
|
+
Copyright © 2011 Piotr Niełacny (http://ruby-blog.pl), released under the MIT license
|
39
94
|
|
data/Rakefile
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
desc 'Test the acts-as-messageable plugin.'
|
5
|
+
Rake::TestTask.new(:test) do |t|
|
6
|
+
t.libs << 'lib'
|
7
|
+
t.pattern = 'test/**/*_test.rb'
|
8
|
+
t.verbose = true
|
9
|
+
end
|
10
|
+
|
1
11
|
begin
|
2
12
|
require 'jeweler'
|
3
13
|
Jeweler::Tasks.new do |gemspec|
|
@@ -11,4 +21,4 @@ begin
|
|
11
21
|
Jeweler::GemcutterTasks.new
|
12
22
|
rescue LoadError
|
13
23
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
14
|
-
end
|
24
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/acts-as-messageable.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module ActsAsMessageable
|
2
|
-
module
|
2
|
+
module Model
|
3
3
|
|
4
4
|
def self.included(base)
|
5
5
|
base.extend ClassMethods
|
@@ -12,54 +12,83 @@ module ActsAsMessageable
|
|
12
12
|
has_many :sent_messages, :as => :sent_messageable, :class_name => "ActsAsMessageable::Message"
|
13
13
|
end
|
14
14
|
|
15
|
-
include ActsAsMessageable::
|
15
|
+
include ActsAsMessageable::Model::InstanceMethods
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
end
|
19
19
|
|
20
20
|
module InstanceMethods
|
21
|
-
def
|
22
|
-
|
23
|
-
|
21
|
+
def messages(options = {}, &block)
|
22
|
+
result = options.blank? ? (self.received + self.sent) : ActsAsMessageable::Message.scoped
|
23
|
+
filter(result, options, &block)
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
def received(options = {}, &block)
|
27
|
+
if options[:all]
|
28
|
+
result = self.received_messages
|
29
|
+
elsif options[:deleted]
|
30
|
+
result = self.received_messages.where(:recipient_delete => true)
|
31
|
+
else
|
32
|
+
result = self.received_messages.where(:recipient_delete => false)
|
29
33
|
end
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
m.received_messageable_id != args[:to].id
|
34
|
-
end
|
35
|
-
end
|
35
|
+
filter(result, options, &block)
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
def sent(options = {}, &block)
|
39
|
+
if options[:all]
|
40
|
+
result = self.sent_messages
|
41
|
+
elsif options[:deleted]
|
42
|
+
result = self.sent_messages.where(:sender_delete => true)
|
43
|
+
else
|
44
|
+
result = self.sent_messages.where(:sender_delete => false)
|
41
45
|
end
|
42
46
|
|
43
|
-
|
47
|
+
filter(result, options, &block)
|
44
48
|
end
|
45
49
|
|
46
|
-
def
|
47
|
-
|
50
|
+
def send_message(to, topic, body)
|
51
|
+
@message = ActsAsMessageable::Message.create!(:topic => topic, :body => body)
|
52
|
+
|
53
|
+
self.sent_messages << @message
|
54
|
+
to.received_messages << @message
|
48
55
|
end
|
49
56
|
|
50
|
-
def
|
51
|
-
self
|
57
|
+
def delete_message(message)
|
58
|
+
current_user = self
|
59
|
+
|
60
|
+
if message.received_messageable == current_user
|
61
|
+
message.update_attributes!(:recipient_delete => true)
|
62
|
+
elsif message.sent_messageable == current_user
|
63
|
+
message.update_attributes!(:sender_delete => true)
|
64
|
+
end
|
52
65
|
end
|
53
66
|
|
54
|
-
|
55
|
-
@message = ActsAsMessageable::Message.create
|
56
|
-
@message.topic, @message.body = topic, body
|
67
|
+
private
|
57
68
|
|
58
|
-
|
59
|
-
|
69
|
+
def filter(result, options = {}, &block)
|
70
|
+
current_user = self
|
71
|
+
|
72
|
+
options.each do |key, value|
|
73
|
+
case key
|
74
|
+
when :from then
|
75
|
+
result = result.messages_from(value, current_user)
|
76
|
+
when :to then
|
77
|
+
result = result.messages_to(value, current_user)
|
78
|
+
when :id then
|
79
|
+
result = result.message_id(value)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
result.each do |message|
|
84
|
+
block.call(message)
|
85
|
+
delete_message(message) if message.delete_message
|
86
|
+
end if block_given?
|
87
|
+
|
88
|
+
result
|
60
89
|
end
|
61
90
|
|
62
91
|
end
|
63
92
|
|
64
93
|
end
|
65
|
-
end
|
94
|
+
end
|
@@ -9,7 +9,17 @@ module ActsAsMessageable
|
|
9
9
|
:received_messageable_id,
|
10
10
|
:sent_messageable_type,
|
11
11
|
:sent_messageable_id,
|
12
|
-
:opened
|
12
|
+
:opened,
|
13
|
+
:recipient_delete,
|
14
|
+
:sender_delete
|
15
|
+
|
16
|
+
attr_accessor :delete_message
|
17
|
+
|
18
|
+
scope :messages_from, lambda { |*args| where("sent_messageable_id = :sender", :sender => args.first).
|
19
|
+
where("received_messageable_id = :receiver", :receiver => args.last) }
|
20
|
+
scope :messages_to, lambda { |*args| where("received_messageable_id = :receiver", :receiver => args.first).
|
21
|
+
where("sent_messageable_id = :sender", :sender => args.last)}
|
22
|
+
scope :message_id, lambda { |*args| where("id = :id", :id => args.first) }
|
13
23
|
|
14
24
|
validates_presence_of :topic ,:body
|
15
25
|
|
@@ -18,7 +28,19 @@ module ActsAsMessageable
|
|
18
28
|
end
|
19
29
|
|
20
30
|
def open
|
21
|
-
|
31
|
+
update_attributes!(:opened => true)
|
32
|
+
end
|
33
|
+
|
34
|
+
def mark_as_read
|
35
|
+
open
|
36
|
+
end
|
37
|
+
|
38
|
+
def close
|
39
|
+
update_attributes!(:opened => false)
|
40
|
+
end
|
41
|
+
|
42
|
+
def mark_as_unread
|
43
|
+
close
|
22
44
|
end
|
23
45
|
|
24
46
|
def from
|
@@ -29,5 +51,9 @@ module ActsAsMessageable
|
|
29
51
|
"#{self.received_messageable_type}".constantize.find(self.received_messageable_id)
|
30
52
|
end
|
31
53
|
|
54
|
+
def delete
|
55
|
+
self.delete_message = true
|
56
|
+
end
|
57
|
+
|
32
58
|
end
|
33
59
|
end
|
@@ -2,13 +2,16 @@ class CreateMessagesTable < ActiveRecord::Migration
|
|
2
2
|
def self.up
|
3
3
|
create_table :messages do |t|
|
4
4
|
t.string :topic
|
5
|
-
t.
|
5
|
+
t.text :body
|
6
6
|
t.references :received_messageable, :polymorphic => true
|
7
7
|
t.references :sent_messageable, :polymorphic => true
|
8
8
|
t.boolean :opened, :default => false
|
9
|
+
t.boolean :opened, :default => false
|
10
|
+
t.boolean :recipient_delete, :default => false
|
11
|
+
t.boolean :sender_delete, :default => false
|
9
12
|
end
|
10
13
|
|
11
|
-
add_index :messages, [:sent_messageable_id, :received_messageable_id]
|
14
|
+
add_index :messages, [:sent_messageable_id, :received_messageable_id], :name => "acts_as_messageable_ids"
|
12
15
|
end
|
13
16
|
|
14
17
|
def self.down
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require "rubygems"
|
3
|
+
|
4
|
+
require File.expand_path('../../lib/acts-as-messageable.rb', __FILE__)
|
5
|
+
|
6
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
7
|
+
|
8
|
+
def create_db
|
9
|
+
ActiveRecord::Schema.define(:version => 1) do
|
10
|
+
create_table :messages do |t|
|
11
|
+
t.string :topic
|
12
|
+
t.text :body
|
13
|
+
t.references :received_messageable, :polymorphic => true
|
14
|
+
t.references :sent_messageable, :polymorphic => true
|
15
|
+
t.boolean :opened, :default => false
|
16
|
+
t.boolean :opened, :default => false
|
17
|
+
t.boolean :recipient_delete, :default => false
|
18
|
+
t.boolean :sender_delete, :default => false
|
19
|
+
end
|
20
|
+
|
21
|
+
create_table :users do |t|
|
22
|
+
t.string :email
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def drop_db
|
30
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
31
|
+
ActiveRecord::Base.connection.drop_table(table)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class User < ActiveRecord::Base
|
36
|
+
acts_as_messageable
|
37
|
+
end
|
38
|
+
|
39
|
+
class MessageTest < Test::Unit::TestCase
|
40
|
+
def setup
|
41
|
+
create_db
|
42
|
+
User.create!(:email => "user1@users.com")
|
43
|
+
User.create!(:email => "user2@users.com")
|
44
|
+
end
|
45
|
+
|
46
|
+
def teardown
|
47
|
+
drop_db
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_send_message
|
51
|
+
u1 = User.first
|
52
|
+
u2 = User.last
|
53
|
+
|
54
|
+
u1.send_message(u2, "Topic", "Body")
|
55
|
+
u2.send_message(u1, "Topic2", "Body2")
|
56
|
+
|
57
|
+
assert_equal ["Topic", "Topic2"], ActsAsMessageable::Message.find(:all).map(&:topic)
|
58
|
+
assert_equal ["Body", "Body2"], ActsAsMessageable::Message.find(:all).map(&:body)
|
59
|
+
assert_equal u1.id, ActsAsMessageable::Message.find(:first, :conditions => { :topic => "Topic" }).sent_messageable_id
|
60
|
+
assert_equal u2.id, ActsAsMessageable::Message.find(:first, :conditions => { :topic => "Topic" }).received_messageable_id
|
61
|
+
|
62
|
+
assert_equal u2.id, ActsAsMessageable::Message.find(:first, :conditions => { :topic => "Topic2" }).sent_messageable_id
|
63
|
+
assert_equal u1.id, ActsAsMessageable::Message.find(:first, :conditions => { :topic => "Topic2" }).received_messageable_id
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_received
|
67
|
+
u1 = User.first
|
68
|
+
u2 = User.last
|
69
|
+
|
70
|
+
u1.send_message(u2, "Topic", "Body")
|
71
|
+
u1.send_message(u2, "Topic2", "Body2")
|
72
|
+
|
73
|
+
assert_equal ["Topic", "Topic2"], u2.received.map(&:topic)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_sent
|
77
|
+
u1 = User.first
|
78
|
+
u2 = User.last
|
79
|
+
|
80
|
+
u1.send_message(u2, "Topic", "Body")
|
81
|
+
u1.send_message(u2, "Topic2", "Body2")
|
82
|
+
|
83
|
+
assert_equal ["Topic", "Topic2"], u1.sent.map(&:topic)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_messages
|
87
|
+
u1 = User.first
|
88
|
+
u2 = User.last
|
89
|
+
|
90
|
+
u1.send_message(u2, "Topic", "Body")
|
91
|
+
u1.send_message(u2, "Topic2", "Body2")
|
92
|
+
|
93
|
+
assert_equal ["Topic", "Topic2"], u2.messages(:from => u1).map(&:topic)
|
94
|
+
assert_equal ["Topic", "Topic2"], u1.messages(:to => u2).map(&:topic)
|
95
|
+
assert_equal ["Topic"], u1.messages(:to => u2, :id => 1).map(&:topic)
|
96
|
+
assert_equal ["Topic2"], u1.messages(:id => 2).map(&:topic)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_delete_message
|
100
|
+
u1 = User.first
|
101
|
+
u2 = User.last
|
102
|
+
|
103
|
+
u1.send_message(u2, "Topic", "Body")
|
104
|
+
u1.send_message(u2, "Topic2", "Body2")
|
105
|
+
|
106
|
+
u1.messages do |m|
|
107
|
+
m.delete
|
108
|
+
end
|
109
|
+
|
110
|
+
assert_equal [], u1.messages
|
111
|
+
assert_equal ["Topic", "Topic2"], u2.messages.map(&:topic)
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts-as-messageable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
8
|
+
- 1
|
7
9
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.3
|
10
|
+
version: 0.1.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Piotr Nielacny
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2011-02-17 00:00:00 +01:00
|
18
19
|
default_executable:
|
19
20
|
dependencies: []
|
20
21
|
|
@@ -37,13 +38,14 @@ files:
|
|
37
38
|
- lib/generators/acts_as_messageable/migration/migration_generator.rb
|
38
39
|
- lib/generators/acts_as_messageable/migration/templates/migration.rb
|
39
40
|
- rails/init.rb
|
41
|
+
- test/message_test.rb
|
40
42
|
has_rdoc: true
|
41
43
|
homepage: http://github.com/LTe/acts_as_messageable
|
42
44
|
licenses: []
|
43
45
|
|
44
46
|
post_install_message:
|
45
|
-
rdoc_options:
|
46
|
-
|
47
|
+
rdoc_options: []
|
48
|
+
|
47
49
|
require_paths:
|
48
50
|
- lib
|
49
51
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -51,6 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
53
|
requirements:
|
52
54
|
- - ">="
|
53
55
|
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
54
57
|
segments:
|
55
58
|
- 0
|
56
59
|
version: "0"
|
@@ -59,15 +62,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
62
|
requirements:
|
60
63
|
- - ">="
|
61
64
|
- !ruby/object:Gem::Version
|
65
|
+
hash: 3
|
62
66
|
segments:
|
63
67
|
- 0
|
64
68
|
version: "0"
|
65
69
|
requirements: []
|
66
70
|
|
67
71
|
rubyforge_project:
|
68
|
-
rubygems_version: 1.
|
72
|
+
rubygems_version: 1.5.0
|
69
73
|
signing_key:
|
70
74
|
specification_version: 3
|
71
75
|
summary: Make user messageable!;-)
|
72
|
-
test_files:
|
73
|
-
|
76
|
+
test_files:
|
77
|
+
- test/message_test.rb
|