mailboxer 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -7
  3. data/Appraisals +2 -2
  4. data/CHANGELOG.md +66 -0
  5. data/README.md +21 -1
  6. data/app/models/mailboxer/conversation.rb +5 -2
  7. data/app/models/mailboxer/mailbox.rb +1 -1
  8. data/app/models/mailboxer/notification.rb +6 -6
  9. data/app/models/mailboxer/receipt.rb +17 -16
  10. data/db/migrate/20110511145103_create_mailboxer.rb +3 -2
  11. data/db/migrate/20131206080416_add_conversation_optout.rb +1 -1
  12. data/db/migrate/20131206080417_add_missing_indices.rb +1 -1
  13. data/db/migrate/20151103080417_add_delivery_tracking_info_to_mailboxer_receipts.rb +1 -1
  14. data/gemfiles/rails5.1.gemfile +7 -0
  15. data/lib/generators/mailboxer/templates/initializer.rb +2 -1
  16. data/lib/generators/mailboxer/templates/mailboxer_namespacing_compatibility.rb +1 -0
  17. data/lib/mailboxer.rb +2 -0
  18. data/lib/mailboxer/mail_dispatcher.rb +13 -1
  19. data/lib/mailboxer/models/messageable.rb +17 -14
  20. data/lib/mailboxer/version.rb +1 -1
  21. data/mailboxer.gemspec +1 -1
  22. data/spec/dummy/config/initializers/mailboxer.rb +5 -4
  23. data/spec/dummy/db/migrate/20110228120600_create_users.rb +1 -1
  24. data/spec/dummy/db/migrate/20110306002940_create_ducks.rb +1 -1
  25. data/spec/dummy/db/migrate/20110306015107_create_cylons.rb +1 -1
  26. data/spec/dummy/db/migrate/20120305103200_create_mailboxer.rb +29 -30
  27. data/spec/dummy/db/migrate/20131206080416_add_conversation_optout.rb +1 -1
  28. data/spec/dummy/db/migrate/20151103202534_add_missing_indices.mailboxer_engine.rb +1 -2
  29. data/spec/dummy/db/migrate/20151103202535_add_delivery_tracking_info_to_mailboxer_receipts.mailboxer_engine.rb +1 -2
  30. data/spec/mailboxer/mail_dispatcher_spec.rb +14 -3
  31. data/spec/models/mailboxer_models_messageable_spec.rb +8 -8
  32. data/spec/models/notification_spec.rb +6 -6
  33. metadata +7 -6
  34. data/gemfiles/rails4.2.gemfile +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20ef2352a667a4efe2b58ba03e9e0ec71be8c6f5
4
- data.tar.gz: 62b56eef4d08c04fffea2050d547ea65331cd8d9
3
+ metadata.gz: 46c49273efc5f0fe22a30a35bbc7a0e0cd50a88f
4
+ data.tar.gz: 4683361def08b32438d693116f1cf53864ef76c7
5
5
  SHA512:
6
- metadata.gz: 1aa5bbfb3de37857cbccfee7e010f73d9bc92b03e6b221e5bbf4210af8e5fa599b9227bd4f922752d6f19342f846f328e5a3cb08b319bf818f07ba773b615ce8
7
- data.tar.gz: 5d6dc14ece4e486dce7ff21afb63ee2d562092e29792cad1dc74fb91135f69c564853b8e939efb9702a305d5f49c168eb57e615830678bb173f45983bb86be74
6
+ metadata.gz: 00c8d3afb30b6449c1748e511bb9c14310f46117a018cc81326ea20ca799ec464f11f57336e396500d1780f700b700681a71e096db41670d4b1f0e24e437c0a4
7
+ data.tar.gz: dcb7b75dbb2f24e8cfeaecc49268b0f1953179992dc0340647190eb66527ab072c0a9c6709c2bbf4cdc59a9d61108b5046203afc03344dbd0c810ecdbbb5b5ad
@@ -3,18 +3,14 @@ cache: bundler
3
3
  sudo: false
4
4
 
5
5
  rvm:
6
- - 2.1.10
7
6
  - 2.2.5
8
7
  - 2.3.1
8
+ - 2.4.1
9
+
9
10
 
10
11
  gemfile:
11
- - gemfiles/rails4.2.gemfile
12
12
  - gemfiles/rails5.0.gemfile
13
-
14
- matrix:
15
- exclude:
16
- - rvm: 2.1.10
17
- gemfile: gemfiles/rails5.0.gemfile
13
+ - gemfiles/rails5.1.gemfile
18
14
 
19
15
  env:
20
16
  global:
data/Appraisals CHANGED
@@ -1,3 +1,3 @@
1
- appraise "rails4.2" do
2
- gem "rails", "~> 4.2.6"
1
+ appraise "rails5.1" do
2
+ gem "rails", "~> 5.1.1"
3
3
  end
@@ -0,0 +1,66 @@
1
+ # CHANGELOG
2
+
3
+ ## Master (Unreleased)
4
+
5
+ ## 0.15.0 - 2017-05-17
6
+
7
+ ### Changed
8
+
9
+ * Update for Rails 5.1
10
+
11
+ * When sorting entries by `created_at`, also sort by `id` descending. This
12
+ is to ensure proper sorting of items for databases that do not store
13
+ nanoseconds for timestamp columns.
14
+
15
+ ### Fixed
16
+
17
+ * When trying to delete a Mailboxer object, a `NameError` may be thrown due
18
+ to a missing namespace
19
+
20
+ ## 0.14.0 - 2016-07-29
21
+
22
+ ### Added
23
+
24
+ * Rails 5 compatibility.
25
+
26
+ ### Fixed
27
+
28
+ * `Mailboxer::Message` object no longer requires to have a subject.
29
+ * Objects are now saved before mails are sent, you you can use them in the
30
+ mailer templates (to build URLs, for example).
31
+
32
+ ### Changed
33
+
34
+ * Errors are now stored in the parent message/notification instead of being
35
+ stored in the sender receipt. That means you need handle mailboxer related
36
+ controller and views differently, and study the upgrade case by case (propably
37
+ by having a look at mailboxer's source code). As an example, if you were
38
+ previously doing something like this in your controller:
39
+
40
+ ```
41
+ @receipt = @actor.send_message(@recipients, params[:body], params[:subject])
42
+ if (@receipt.errors.blank?)
43
+ @conversation = @receipt.conversation
44
+ redirect_to conversation_path(@conversation)
45
+ else
46
+ render :action => :new
47
+ end
48
+ ```
49
+
50
+ you now need to do something like
51
+
52
+ ```
53
+ @receipt = @actor.send_message(@recipients, params[:body], params[:subject])
54
+ @message = @receipt.message
55
+ if (@message.errors.blank?)
56
+ @conversation = @message.conversation
57
+ redirect_to conversation_path(@conversation)
58
+ else
59
+ render :action => :new
60
+ end
61
+ ```
62
+
63
+ This might look more complicated at first but allows you to build more RESTful
64
+ resources since you can build forms on messages and/or conversations and
65
+ directly show errors on them. Less specially handling is now required to
66
+ propagate errors around models.
data/README.md CHANGED
@@ -104,6 +104,24 @@ Mailboxer.setup do |config|
104
104
  end
105
105
  ```
106
106
 
107
+ If you have subclassed the Mailboxer::Notification class, you can specify the mailers using a member method:
108
+
109
+ ```ruby
110
+ class NewDocumentNotification < Mailboxer::Notification
111
+ def mailer_class
112
+ NewDocumentNotificationMailer
113
+ end
114
+ end
115
+
116
+ class NewCommentNotification < Mailboxer::Notification
117
+ def mailer_class
118
+ NewDocumentNotificationMailer
119
+ end
120
+ end
121
+ ```
122
+
123
+ Otherwise, the mailer class will be determined by appending 'Mailer' to the mailable class name.
124
+
107
125
  ### User identities
108
126
 
109
127
  Users must have an identity defined by a `name` and an `email`. We must ensure that Messageable models have some specific methods. These methods are:
@@ -135,6 +153,7 @@ Mailboxer.setup do |config|
135
153
  #Configures the methods needed by mailboxer
136
154
  config.email_method = :mailboxer_email
137
155
  config.name_method = :name
156
+ config.notify_method = :notify
138
157
  # ...
139
158
  end
140
159
  ```
@@ -144,9 +163,10 @@ You may change whatever you want or need. For example:
144
163
  ```ruby
145
164
  config.email_method = :notification_email
146
165
  config.name_method = :display_name
166
+ config.notify_method = :notify_mailboxer
147
167
  ```
148
168
 
149
- Will use the method `notification_email(object)` instead of `mailboxer_email(object)` and `display_name` for `name`.
169
+ Will use the method `notification_email(object)` instead of `mailboxer_email(object)`, `display_name` for `name` and `notify_mailboxer` for `notify`.
150
170
 
151
171
  Using default or custom method names, if your model doesn't implement them, Mailboxer will use dummy methods so as to notify you of missing methods rather than crashing.
152
172
 
@@ -32,6 +32,9 @@ class Mailboxer::Conversation < ActiveRecord::Base
32
32
  scope :not_trash, lambda {|participant|
33
33
  participant(participant).merge(Mailboxer::Receipt.not_trash)
34
34
  }
35
+ scope :not_deleted, lambda {|participant|
36
+ participant(participant).merge(Mailboxer::Receipt.not_deleted)
37
+ }
35
38
  scope :between, lambda {|participant_one, participant_two|
36
39
  joins("INNER JOIN (#{Mailboxer::Notification.recipient(participant_two).to_sql}) participant_two_notifications " \
37
40
  "ON participant_two_notifications.conversation_id = #{table_name}.id AND participant_two_notifications.type IN ('Mailboxer::Message')").
@@ -93,7 +96,7 @@ class Mailboxer::Conversation < ActiveRecord::Base
93
96
 
94
97
  #First message of the conversation.
95
98
  def original_message
96
- @original_message ||= messages.order('created_at').first
99
+ @original_message ||= messages.order(:created_at).first
97
100
  end
98
101
 
99
102
  #Sender of the last message.
@@ -103,7 +106,7 @@ class Mailboxer::Conversation < ActiveRecord::Base
103
106
 
104
107
  #Last message in the conversation.
105
108
  def last_message
106
- @last_message ||= messages.order('created_at DESC').first
109
+ @last_message ||= messages.order(:created_at => :desc, :id => :desc).first
107
110
  end
108
111
 
109
112
  #Returns the receipts of the conversation for one participants
@@ -9,7 +9,7 @@ class Mailboxer::Mailbox
9
9
  #Returns the notifications for the messageable
10
10
  def notifications(options = {})
11
11
  #:type => nil is a hack not to give Messages as Notifications
12
- notifs = Mailboxer::Notification.recipient(messageable).where(:type => nil).order("mailboxer_notifications.created_at DESC")
12
+ notifs = Mailboxer::Notification.recipient(messageable).where(:type => nil).order(:created_at => :desc, :id => :desc)
13
13
  if options[:read] == false || options[:unread]
14
14
  notifs = notifs.unread
15
15
  end
@@ -13,21 +13,21 @@ class Mailboxer::Notification < ActiveRecord::Base
13
13
  :length => { :maximum => Mailboxer.body_max_length }
14
14
 
15
15
  scope :recipient, lambda { |recipient|
16
- joins(:receipts).where('mailboxer_receipts.receiver_id' => recipient.id,'mailboxer_receipts.receiver_type' => recipient.class.base_class.to_s)
16
+ joins(:receipts).where(:mailboxer_receipts => { :receiver_id => recipient.id, :receiver_type => recipient.class.base_class.to_s })
17
17
  }
18
18
  scope :with_object, lambda { |obj|
19
- where('notified_object_id' => obj.id,'notified_object_type' => obj.class.to_s)
19
+ where(:notified_object_id => obj.id, :notified_object_type => obj.class.to_s)
20
20
  }
21
21
  scope :not_trashed, lambda {
22
- joins(:receipts).where('mailboxer_receipts.trashed' => false)
22
+ joins(:receipts).where(:mailboxer_receipts => { :trashed => false })
23
23
  }
24
24
  scope :unread, lambda {
25
- joins(:receipts).where('mailboxer_receipts.is_read' => false)
25
+ joins(:receipts).where(:mailboxer_receipts => { :is_read => false })
26
26
  }
27
27
  scope :global, lambda { where(:global => true) }
28
- scope :expired, lambda { where("mailboxer_notifications.expires < ?", Time.now) }
28
+ scope :expired, lambda { where("#{Mailboxer::Notification.quoted_table_name}.expires < ?", Time.now) }
29
29
  scope :unexpired, lambda {
30
- where("mailboxer_notifications.expires is NULL OR mailboxer_notifications.expires > ?", Time.now)
30
+ where("#{Mailboxer::Notification.quoted_table_name}.expires is NULL OR #{Mailboxer::Notification.quoted_table_name}.expires > ?", Time.now)
31
31
  }
32
32
 
33
33
  class << self
@@ -13,13 +13,13 @@ class Mailboxer::Receipt < ActiveRecord::Base
13
13
  }
14
14
  #Notifications Scope checks type to be nil, not Notification because of STI behaviour
15
15
  #with the primary class (no type is saved)
16
- scope :notifications_receipts, lambda { joins(:notification).where('mailboxer_notifications.type' => nil) }
17
- scope :messages_receipts, lambda { joins(:notification).where('mailboxer_notifications.type' => Mailboxer::Message.to_s) }
16
+ scope :notifications_receipts, lambda { joins(:notification).where(:mailboxer_notifications => { :type => nil }) }
17
+ scope :messages_receipts, lambda { joins(:notification).where(:mailboxer_notifications => { :type => Mailboxer::Message.to_s }) }
18
18
  scope :notification, lambda { |notification|
19
19
  where(:notification_id => notification.id)
20
20
  }
21
21
  scope :conversation, lambda { |conversation|
22
- joins(:message).where('mailboxer_notifications.conversation_id' => conversation.id)
22
+ joins(:message).where(:mailboxer_notifications => { :conversation_id => conversation.id })
23
23
  }
24
24
  scope :sentbox, lambda { where(:mailbox_type => "sentbox") }
25
25
  scope :inbox, lambda { where(:mailbox_type => "inbox") }
@@ -72,12 +72,8 @@ class Mailboxer::Receipt < ActiveRecord::Base
72
72
  end
73
73
 
74
74
  def update_receipts(updates, options={})
75
- ids = where(options).map { |rcp| rcp.id }
76
- unless ids.empty?
77
- sql = ids.map { "#{table_name}.id = ? " }.join(' OR ')
78
- conditions = [sql].concat(ids)
79
- Mailboxer::Receipt.where(conditions).update_all(updates)
80
- end
75
+ ids = where(options).pluck(:id)
76
+ Mailboxer::Receipt.where(:id => ids).update_all(updates) unless ids.empty?
81
77
  end
82
78
  end
83
79
 
@@ -140,14 +136,19 @@ class Mailboxer::Receipt < ActiveRecord::Base
140
136
  protected
141
137
 
142
138
  if Mailboxer.search_enabled
143
- searchable do
144
- text :subject, :boost => 5 do
145
- message.subject if message
146
- end
147
- text :body do
148
- message.body if message
139
+ if Mailboxer.search_engine == :pg_search
140
+ include PgSearch
141
+ pg_search_scope :search, associated_against: { message: { subject: 'A', body: 'B' } }, using: :tsearch
142
+ else
143
+ searchable do
144
+ text :subject, :boost => 5 do
145
+ message.subject if message
146
+ end
147
+ text :body do
148
+ message.body if message
149
+ end
150
+ integer :receiver_id
149
151
  end
150
- integer :receiver_id
151
152
  end
152
153
  end
153
154
  end
@@ -1,4 +1,4 @@
1
- class CreateMailboxer < ActiveRecord::Migration
1
+ class CreateMailboxer < ActiveRecord::Migration[4.2]
2
2
  def self.up
3
3
  #Tables
4
4
  #Conversations
@@ -27,7 +27,8 @@ class CreateMailboxer < ActiveRecord::Migration
27
27
  t.column :conversation_id, :integer
28
28
  t.column :draft, :boolean, :default => false
29
29
  t.string :notification_code, :default => nil
30
- t.references :notified_object, :polymorphic => true
30
+ t.references :notified_object, :polymorphic => true, index: { name: 'mailboxer_notifications_notified_object' }
31
+ end
31
32
  t.column :attachment, :string
32
33
  t.column :updated_at, :datetime, :null => false
33
34
  t.column :created_at, :datetime, :null => false
@@ -1,4 +1,4 @@
1
- class AddConversationOptout < ActiveRecord::Migration
1
+ class AddConversationOptout < ActiveRecord::Migration[4.2]
2
2
  def self.up
3
3
  create_table :mailboxer_conversation_opt_outs do |t|
4
4
  t.references :unsubscriber, :polymorphic => true
@@ -1,4 +1,4 @@
1
- class AddMissingIndices < ActiveRecord::Migration
1
+ class AddMissingIndices < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  # We'll explicitly specify its name, as the auto-generated name is too long and exceeds 63
4
4
  # characters limitation.
@@ -1,4 +1,4 @@
1
- class AddDeliveryTrackingInfoToMailboxerReceipts < ActiveRecord::Migration
1
+ class AddDeliveryTrackingInfoToMailboxerReceipts < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  add_column :mailboxer_receipts, :is_delivered, :boolean, default: false
4
4
  add_column :mailboxer_receipts, :delivery_method, :string
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.1"
6
+
7
+ gemspec :path => "../"
@@ -9,9 +9,10 @@ Mailboxer.setup do |config|
9
9
  #Configures the methods needed by mailboxer
10
10
  config.email_method = :mailboxer_email
11
11
  config.name_method = :name
12
+ config.notify_method = :notify
12
13
 
13
14
  #Configures if you use or not a search engine and which one you are using
14
- #Supported engines: [:solr,:sphinx]
15
+ #Supported engines: [:solr,:sphinx,:pg_search]
15
16
  config.search_enabled = false
16
17
  config.search_engine = :solr
17
18
 
@@ -13,6 +13,7 @@ class MailboxerNamespacingCompatibility < ActiveRecord::Migration
13
13
  rename_table :mailboxer_notifications, :notifications
14
14
  rename_table :mailboxer_receipts, :receipts
15
15
 
16
+ Mailboxer::Notification.table_name = "notifications"
16
17
  Mailboxer::Notification.where(type: 'Mailboxer::Message').update_all(type: 'Message')
17
18
  end
18
19
  end
@@ -15,6 +15,8 @@ module Mailboxer
15
15
  @@email_method = :mailboxer_email
16
16
  mattr_accessor :name_method
17
17
  @@name_method = :name
18
+ mattr_accessor :notify_method
19
+ @@notify_method = :notify
18
20
  mattr_accessor :subject_max_length
19
21
  @@subject_max_length = 255
20
22
  mattr_accessor :body_max_length
@@ -18,9 +18,21 @@ module Mailboxer
18
18
  private
19
19
 
20
20
  def mailer
21
+ mailer_config_method || mailer_from_mailable || mailer_constant
22
+ end
23
+
24
+ def mailer_from_mailable
25
+ mailable.mailer_class if mailable.respond_to? :mailer_class
26
+ end
27
+
28
+ def mailer_config_method
21
29
  klass = mailable.class.name.demodulize
22
30
  method = "#{klass.downcase}_mailer".to_sym
23
- Mailboxer.send(method) || "#{mailable.class}Mailer".constantize
31
+ Mailboxer.send(method) if Mailboxer.respond_to? method
32
+ end
33
+
34
+ def mailer_constant
35
+ "#{mailable.class.name}Mailer".constantize
24
36
  end
25
37
 
26
38
  def send_email(receipt)
@@ -14,7 +14,7 @@ module Mailboxer
14
14
 
15
15
  included do
16
16
  has_many :messages, :class_name => "Mailboxer::Message", :as => :sender
17
- has_many :receipts, -> { order 'created_at DESC' }, :class_name => "Mailboxer::Receipt", dependent: :destroy, as: :receiver
17
+ has_many :receipts, -> { order(:created_at => :desc, :id => :desc) }, :class_name => "Mailboxer::Receipt", dependent: :destroy, as: :receiver
18
18
  end
19
19
 
20
20
  unless defined?(Mailboxer.name_method)
@@ -40,6 +40,11 @@ module Mailboxer
40
40
  end
41
41
  end
42
42
 
43
+ #Sends a notification to the messageable
44
+ define_method Mailboxer.notify_method do |subject, body, obj=nil, sanitize_text=true, notification_code=nil, send_mail=true, sender=nil|
45
+ Mailboxer::Notification.notify_all([self],subject,body,obj,sanitize_text,notification_code,send_mail,sender)
46
+ end
47
+
43
48
  #Gets the mailbox of the messageable
44
49
  def mailbox
45
50
  @mailbox ||= Mailboxer::Mailbox.new(self)
@@ -50,11 +55,6 @@ module Mailboxer
50
55
  mailbox.inbox(unread: true).count
51
56
  end
52
57
 
53
- #Sends a notification to the messageable
54
- def notify(subject,body,obj = nil,sanitize_text=true,notification_code=nil,send_mail=true,sender=nil)
55
- Mailboxer::Notification.notify_all([self],subject,body,obj,sanitize_text,notification_code,send_mail,sender)
56
- end
57
-
58
58
  #Sends a messages, starting a new conversation, with the messageable
59
59
  #as originator
60
60
  def send_message(recipients, msg_body, subject, sanitize_text=true, attachment=nil, message_timestamp = Time.now)
@@ -169,11 +169,11 @@ module Mailboxer
169
169
  #* An array with any of them
170
170
  def mark_as_deleted(obj)
171
171
  case obj
172
- when Receipt
172
+ when Mailboxer::Receipt
173
173
  return obj.mark_as_deleted if obj.receiver == self
174
- when Message, Notification
174
+ when Mailboxer::Message, Mailboxer::Notification
175
175
  obj.mark_as_deleted(self)
176
- when Conversation
176
+ when Mailboxer::Conversation
177
177
  obj.mark_as_deleted(self)
178
178
  when Array
179
179
  obj.map{ |sub_obj| mark_as_deleted(sub_obj) }
@@ -225,12 +225,15 @@ module Mailboxer
225
225
  end
226
226
 
227
227
  def search_messages(query)
228
- @search = Mailboxer::Receipt.search do
229
- fulltext query
230
- with :receiver_id, self.id
228
+ if Mailboxer.search_engine == :pg_search
229
+ Mailboxer::Receipt.search(query).where(receiver_id: self.id).map(&:conversation).uniq
230
+ else
231
+ @search = Mailboxer::Receipt.search do
232
+ fulltext query
233
+ with :receiver_id, self.id
234
+ end
235
+ @search.results.map { |r| r.conversation }.uniq
231
236
  end
232
-
233
- @search.results.map { |r| r.conversation }.uniq
234
237
  end
235
238
  end
236
239
  end
@@ -1,3 +1,3 @@
1
1
  module Mailboxer
2
- VERSION = "0.14.0"
2
+ VERSION = "0.15.0"
3
3
  end
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  #
23
23
 
24
24
  # Development Gem dependencies
25
- s.add_runtime_dependency('rails', '>= 4.2.0')
25
+ s.add_runtime_dependency('rails', '>= 5.0.0')
26
26
  s.add_runtime_dependency('carrierwave', '>= 0.5.8')
27
27
 
28
28
  if RUBY_ENGINE == "rbx" && RUBY_VERSION >= "2.1.0"
@@ -1,17 +1,18 @@
1
1
  Mailboxer.setup do |config|
2
-
2
+
3
3
  #Configures if you applications uses or no the email sending for Notifications and Messages
4
4
  config.uses_emails = true
5
-
5
+
6
6
  #Configures the default from for the email sent for Messages and Notifications of Mailboxer
7
7
  config.default_from = "no-reply@mailboxer.com"
8
-
8
+
9
9
  #Configures the methods needed by mailboxer
10
10
  config.email_method = :mailboxer_email
11
11
  config.name_method = :name
12
+ config.notify_method = :notify
12
13
 
13
14
  #Configures if you use or not a search engine and wich one are you using
14
- #Supported enignes: [:solr,:sphinx]
15
+ #Supported enignes: [:solr,:sphinx]
15
16
  config.search_enabled = false
16
17
  config.search_engine = :solr
17
18
 
@@ -1,4 +1,4 @@
1
- class CreateUsers < ActiveRecord::Migration
1
+ class CreateUsers < ActiveRecord::Migration[4.2]
2
2
  def self.up
3
3
  create_table :users do |t|
4
4
  t.string :name
@@ -1,4 +1,4 @@
1
- class CreateDucks < ActiveRecord::Migration
1
+ class CreateDucks < ActiveRecord::Migration[4.2]
2
2
  def self.up
3
3
  create_table :ducks do |t|
4
4
  t.string :name
@@ -1,4 +1,4 @@
1
- class CreateCylons < ActiveRecord::Migration
1
+ class CreateCylons < ActiveRecord::Migration[4.2]
2
2
  def self.up
3
3
  create_table :cylons do |t|
4
4
  t.string :name
@@ -1,13 +1,13 @@
1
- class CreateMailboxer < ActiveRecord::Migration
2
- def self.up
1
+ class CreateMailboxer < ActiveRecord::Migration[4.2]
2
+ def self.up
3
3
  #Tables
4
- #Conversations
4
+ #Conversations
5
5
  create_table :mailboxer_conversations do |t|
6
6
  t.column :subject, :string, :default => ""
7
7
  t.column :created_at, :datetime, :null => false
8
8
  t.column :updated_at, :datetime, :null => false
9
- end
10
- #Receipts
9
+ end
10
+ #Receipts
11
11
  create_table :mailboxer_receipts do |t|
12
12
  t.references :receiver, :polymorphic => true
13
13
  t.column :notification_id, :integer, :null => false
@@ -17,46 +17,45 @@ class CreateMailboxer < ActiveRecord::Migration
17
17
  t.column :mailbox_type, :string, :limit => 25
18
18
  t.column :created_at, :datetime, :null => false
19
19
  t.column :updated_at, :datetime, :null => false
20
- end
21
- #Notifications and Messages
20
+ end
21
+ #Notifications and Messages
22
22
  create_table :mailboxer_notifications do |t|
23
23
  t.column :type, :string
24
24
  t.column :body, :text
25
25
  t.column :subject, :string, :default => ""
26
26
  t.references :sender, :polymorphic => true
27
- t.references :notified_object, :polymorphic => true
28
- t.string :notification_code, :default => nil
29
27
  t.column :conversation_id, :integer
30
28
  t.column :draft, :boolean, :default => false
29
+ t.string :notification_code, :default => nil
30
+ t.references :notified_object, :polymorphic => true, index: { name: 'mailboxer_notifications_notified_object' }
31
31
  t.column :attachment, :string
32
32
  t.column :updated_at, :datetime, :null => false
33
33
  t.column :created_at, :datetime, :null => false
34
- t.boolean :global, :default => false
34
+ t.boolean :global, default: false
35
35
  t.datetime :expires
36
- end
37
-
38
-
36
+ end
37
+
39
38
  #Indexes
40
- #Conversations
41
- #Receipts
42
- add_index "mailboxer_receipts","notification_id"
39
+ #Conversations
40
+ #Receipts
41
+ add_index "mailboxer_receipts","notification_id"
42
+
43
+ #Messages
44
+ add_index "mailboxer_notifications","conversation_id"
43
45
 
44
- #Messages
45
- add_index "mailboxer_notifications","conversation_id"
46
-
47
- #Foreign keys
48
- #Conversations
49
- #Receipts
50
- add_foreign_key "mailboxer_receipts", "mailboxer_notifications", :name => "receipts_on_notification_id", :column => "notification_id"
51
- #Messages
52
- add_foreign_key "mailboxer_notifications", "mailboxer_conversations", :name => "notifications_on_conversation_id", :column => "conversation_id"
46
+ #Foreign keys
47
+ #Conversations
48
+ #Receipts
49
+ add_foreign_key "mailboxer_receipts", "mailboxer_notifications", :name => "receipts_on_notification_id", :column => "notification_id"
50
+ #Messages
51
+ add_foreign_key "mailboxer_notifications", "mailboxer_conversations", :name => "notifications_on_conversation_id", :column => "conversation_id"
53
52
  end
54
-
53
+
55
54
  def self.down
56
- #Tables
57
- remove_foreign_key "mailboxer_receipts", :name => "receipts_on_notification_id"
58
- remove_foreign_key "mailboxer_notifications", :name => "notifications_on_conversation_id"
59
-
55
+ #Tables
56
+ remove_foreign_key "mailboxer_receipts", :name => "receipts_on_notification_id"
57
+ remove_foreign_key "mailboxer_notifications", :name => "notifications_on_conversation_id"
58
+
60
59
  #Indexes
61
60
  drop_table :mailboxer_receipts
62
61
  drop_table :mailboxer_conversations
@@ -1,4 +1,4 @@
1
- class AddConversationOptout < ActiveRecord::Migration
1
+ class AddConversationOptout < ActiveRecord::Migration[4.2]
2
2
  def self.up
3
3
  create_table :mailboxer_conversation_opt_outs do |t|
4
4
  t.references :unsubscriber, :polymorphic => true
@@ -1,5 +1,4 @@
1
- # This migration comes from mailboxer_engine (originally 20131206080417)
2
- class AddMissingIndices < ActiveRecord::Migration
1
+ class AddMissingIndices < ActiveRecord::Migration[4.2]
3
2
  def change
4
3
  # We'll explicitly specify its name, as the auto-generated name is too long and exceeds 63
5
4
  # characters limitation.
@@ -1,5 +1,4 @@
1
- # This migration comes from mailboxer_engine (originally 20151103080417)
2
- class AddDeliveryTrackingInfoToMailboxerReceipts < ActiveRecord::Migration
1
+ class AddDeliveryTrackingInfoToMailboxerReceipts < ActiveRecord::Migration[4.2]
3
2
  def change
4
3
  add_column :mailboxer_receipts, :is_delivered, :boolean, default: false
5
4
  add_column :mailboxer_receipts, :delivery_method, :string
@@ -63,7 +63,7 @@ describe Mailboxer::MailDispatcher do
63
63
  describe "mailer" do
64
64
  let(:receipts) { [] }
65
65
 
66
- context "mailable is a Message" do
66
+ context "mailable is a Notification" do
67
67
  let(:mailable) { Mailboxer::Notification.new }
68
68
 
69
69
  its(:mailer) { should be Mailboxer::NotificationMailer }
@@ -76,16 +76,27 @@ describe Mailboxer::MailDispatcher do
76
76
  end
77
77
  end
78
78
 
79
- context "mailable is a Notification" do
79
+ context "mailable is a Message" do
80
80
  let(:mailable) { Mailboxer::Message.new }
81
81
  its(:mailer) { should be Mailboxer::MessageMailer }
82
82
 
83
- context "with custom mailer" do
83
+ context 'mailer class is selected using global Mailboxer method' do
84
84
  before { Mailboxer.message_mailer = 'foo' }
85
85
  after { Mailboxer.message_mailer = nil }
86
86
 
87
87
  its(:mailer) { should eq 'foo' }
88
88
  end
89
+
90
+ context 'mailer class is selected using Mailable#mailer_class' do
91
+ let(:mailable) { double(mailer_class: :foo) }
92
+ its(:mailer) { should eq :foo }
93
+ end
94
+
95
+ context 'mailer class is selected by searching for the constant' do
96
+ before { stub_const 'StringMailer', 1 }
97
+ let(:mailable) { String.new('I am a string') }
98
+ its(:mailer) { should eq Object.const_get('StringMailer') }
99
+ end
89
100
  end
90
101
  end
91
102
  end
@@ -170,7 +170,7 @@ describe "Mailboxer::Models::Messageable through User" do
170
170
 
171
171
 
172
172
  it "should be able to unread an owned Notification (mark as unread)" do
173
- @receipt = @entity1.notify("Subject","Body")
173
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
174
174
  @notification = @receipt.notification
175
175
  expect(@receipt.is_read).to eq false
176
176
  @entity1.mark_as_read(@notification)
@@ -179,7 +179,7 @@ describe "Mailboxer::Models::Messageable through User" do
179
179
  end
180
180
 
181
181
  it "should be able to read an owned Notification (mark as read)" do
182
- @receipt = @entity1.notify("Subject","Body")
182
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
183
183
  @notification = @receipt.notification
184
184
  expect(@receipt.is_read).to eq false
185
185
  @entity1.mark_as_read(@notification)
@@ -187,7 +187,7 @@ describe "Mailboxer::Models::Messageable through User" do
187
187
  end
188
188
 
189
189
  it "should not be able to unread a not owned Notification (mark as unread)" do
190
- @receipt = @entity1.notify("Subject","Body")
190
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
191
191
  @notification = @receipt.notification
192
192
  expect(@receipt.is_read).to eq false
193
193
  @entity1.mark_as_read(@notification)
@@ -196,7 +196,7 @@ describe "Mailboxer::Models::Messageable through User" do
196
196
  end
197
197
 
198
198
  it "should not be able to read a not owned Notification (mark as read)" do
199
- @receipt = @entity1.notify("Subject","Body")
199
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
200
200
  @notification = @receipt.notification
201
201
  expect(@receipt.is_read).to eq false
202
202
  @entity2.mark_as_read(@notification)
@@ -204,7 +204,7 @@ describe "Mailboxer::Models::Messageable through User" do
204
204
  end
205
205
 
206
206
  it "should be able to trash an owned Notification" do
207
- @receipt = @entity1.notify("Subject","Body")
207
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
208
208
  @notification = @receipt.notification
209
209
  expect(@receipt.trashed).to eq false
210
210
  @entity1.trash(@notification)
@@ -212,7 +212,7 @@ describe "Mailboxer::Models::Messageable through User" do
212
212
  end
213
213
 
214
214
  it "should be able to untrash an owned Notification" do
215
- @receipt = @entity1.notify("Subject","Body")
215
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
216
216
  @notification = @receipt.notification
217
217
  expect(@receipt.trashed).to eq false
218
218
  @entity1.trash(@notification)
@@ -221,7 +221,7 @@ describe "Mailboxer::Models::Messageable through User" do
221
221
  end
222
222
 
223
223
  it "should not be able to trash a not owned Notification" do
224
- @receipt = @entity1.notify("Subject","Body")
224
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
225
225
  @notification = @receipt.notification
226
226
  expect(@receipt.trashed).to eq false
227
227
  @entity2.trash(@notification)
@@ -229,7 +229,7 @@ describe "Mailboxer::Models::Messageable through User" do
229
229
  end
230
230
 
231
231
  it "should not be able to untrash a not owned Notification" do
232
- @receipt = @entity1.notify("Subject","Body")
232
+ @receipt = @entity1.send(Mailboxer.notify_method, "Subject", "Body")
233
233
  @notification = @receipt.notification
234
234
  expect(@receipt.trashed).to eq false
235
235
  @entity1.trash(@notification)
@@ -14,7 +14,7 @@ describe Mailboxer::Notification do
14
14
  it { should validate_length_of(:body).is_at_most(Mailboxer.body_max_length) }
15
15
 
16
16
  it "should notify one user" do
17
- @entity1.notify("Subject", "Body")
17
+ @entity1.send(Mailboxer.notify_method, "Subject", "Body")
18
18
 
19
19
  #Check getting ALL receipts
20
20
  expect(@entity1.mailbox.receipts.size).to eq 1
@@ -31,14 +31,14 @@ describe Mailboxer::Notification do
31
31
  end
32
32
 
33
33
  it "should be unread by default" do
34
- @entity1.notify("Subject", "Body")
34
+ @entity1.send(Mailboxer.notify_method, "Subject", "Body")
35
35
  expect(@entity1.mailbox.receipts.size).to eq 1
36
36
  notification = @entity1.mailbox.receipts.first.notification
37
37
  expect(notification).to be_is_unread(@entity1)
38
38
  end
39
39
 
40
40
  it "should be able to marked as read" do
41
- @entity1.notify("Subject", "Body")
41
+ @entity1.send(Mailboxer.notify_method, "Subject", "Body")
42
42
  expect(@entity1.mailbox.receipts.size).to eq 1
43
43
  notification = @entity1.mailbox.receipts.first.notification
44
44
  notification.mark_as_read(@entity1)
@@ -46,7 +46,7 @@ describe Mailboxer::Notification do
46
46
  end
47
47
 
48
48
  it "should be able to specify a sender for a notification" do
49
- @entity1.notify("Subject", "Body", nil, true, nil, true, @entity3)
49
+ @entity1.send(Mailboxer.notify_method, "Subject", "Body", nil, true, nil, true, @entity3)
50
50
  expect(@entity1.mailbox.receipts.size).to eq 1
51
51
  notification = @entity1.mailbox.receipts.first.notification
52
52
  expect(notification.sender).to eq(@entity3)
@@ -126,11 +126,11 @@ describe Mailboxer::Notification do
126
126
 
127
127
  describe "scopes" do
128
128
  let(:scope_user) { FactoryGirl.create(:user) }
129
- let!(:notification) { scope_user.notify("Body", "Subject").notification }
129
+ let!(:notification) { scope_user.send(Mailboxer.notify_method, "Body", "Subject").notification }
130
130
 
131
131
  describe ".unread" do
132
132
  it "finds unread notifications" do
133
- unread_notification = scope_user.notify("Body", "Subject").notification
133
+ unread_notification = scope_user.send(Mailboxer.notify_method, "Body", "Subject").notification
134
134
  notification.mark_as_read(scope_user)
135
135
  expect(Mailboxer::Notification.unread.last).to eq unread_notification
136
136
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailboxer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Casanova Cuesta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-28 00:00:00.000000000 Z
11
+ date: 2017-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: 5.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.0
26
+ version: 5.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: carrierwave
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -180,6 +180,7 @@ files:
180
180
  - ".travis.yml"
181
181
  - ".yardopts"
182
182
  - Appraisals
183
+ - CHANGELOG.md
183
184
  - Gemfile
184
185
  - LICENSE.txt
185
186
  - README.md
@@ -210,8 +211,8 @@ files:
210
211
  - db/migrate/20131206080416_add_conversation_optout.rb
211
212
  - db/migrate/20131206080417_add_missing_indices.rb
212
213
  - db/migrate/20151103080417_add_delivery_tracking_info_to_mailboxer_receipts.rb
213
- - gemfiles/rails4.2.gemfile
214
214
  - gemfiles/rails5.0.gemfile
215
+ - gemfiles/rails5.1.gemfile
215
216
  - lib/generators/mailboxer/install_generator.rb
216
217
  - lib/generators/mailboxer/namespacing_compatibility_generator.rb
217
218
  - lib/generators/mailboxer/templates/initializer.rb
@@ -309,7 +310,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
309
310
  version: '0'
310
311
  requirements: []
311
312
  rubyforge_project:
312
- rubygems_version: 2.5.1
313
+ rubygems_version: 2.6.12
313
314
  signing_key:
314
315
  specification_version: 4
315
316
  summary: Messaging system for rails apps.
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rails", "~> 4.2.0"
6
-
7
- gemspec path: "../"