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.
@@ -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