acts-as-messageable 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,23 +17,78 @@ To use it, add it to your Gemfile:
17
17
  acts_as_messageable
18
18
  end
19
19
 
20
- @user1 = User.first
21
- @user2 = User.last
20
+ == Send message
22
21
 
23
22
  # user1 send message to user2
24
- @user1.send_msg(@user2, "Message to user2", "Hi user 2!;-)")
25
- @user2.send_msg(@user1, "Re: Message to user2", "Hi there!:)")
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
- @user1.recv
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
- @user1.sent
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
- @user1.msg # all messages (in and out)
34
- @user1.msg(:from => @user2) # all messages from @user2
35
- @user1.msg(:to => @user2) # all messages to @user2
36
- @user1.msg(:id => 2) # message where message.id = 2
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 © 2010 Piotr Niełacny (http://ruby-blog.pl), released under the MIT license
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.3
1
+ 0.1.0
@@ -8,5 +8,5 @@ require 'acts_as_messageable/message'
8
8
  $LOAD_PATH.shift
9
9
 
10
10
  if defined?(ActiveRecord::Base)
11
- ActiveRecord::Base.send :include, ActsAsMessageable::User
11
+ ActiveRecord::Base.send :include, ActsAsMessageable::Model
12
12
  end
@@ -1,5 +1,5 @@
1
1
  module ActsAsMessageable
2
- module User
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::User::InstanceMethods
15
+ include ActsAsMessageable::Model::InstanceMethods
16
16
  end
17
-
17
+
18
18
  end
19
19
 
20
20
  module InstanceMethods
21
- def msg(args = {})
22
-
23
- all = self.recv + self.sent
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
- if args[:from]
26
- all.reject! do |m|
27
- m.sent_messageable_id != args[:from].id
28
- end
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
- if args[:to]
32
- all.reject! do |m|
33
- m.received_messageable_id != args[:to].id
34
- end
35
- end
35
+ filter(result, options, &block)
36
+ end
36
37
 
37
- if args[:id] != nil
38
- all.reject! do |m|
39
- m.id != args[:id]
40
- end
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
- all
47
+ filter(result, options, &block)
44
48
  end
45
49
 
46
- def recv
47
- self.received_messages
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 sent
51
- self.sent_messages
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
- def send_msg(to, topic, body)
55
- @message = ActsAsMessageable::Message.create
56
- @message.topic, @message.body = topic, body
67
+ private
57
68
 
58
- self.sent_messages << @message
59
- to.received_messages << @message
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
- self.opened = true
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.string :body
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
- prerelease: false
4
+ hash: 27
5
+ prerelease:
5
6
  segments:
6
7
  - 0
8
+ - 1
7
9
  - 0
8
- - 3
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: 2010-08-04 00:00:00 +02:00
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
- - --charset=UTF-8
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.3.7
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