message_train 0.6.17 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +16 -13
  3. data/.rubocop_todo.yml +12 -0
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +1 -1
  6. data/Gemfile +28 -30
  7. data/README.md +284 -0
  8. data/Rakefile +6 -7
  9. data/VERSION +1 -1
  10. data/app/assets/javascripts/ckeditor/{config.js.coffee → config.js} +7 -6
  11. data/app/assets/stylesheets/message_train.scss +0 -8
  12. data/app/controllers/concerns/message_train_authorization.rb +37 -0
  13. data/app/controllers/concerns/message_train_support.rb +41 -69
  14. data/app/controllers/message_train/application_controller.rb +1 -0
  15. data/app/controllers/message_train/boxes_controller.rb +5 -4
  16. data/app/controllers/message_train/conversations_controller.rb +7 -5
  17. data/app/controllers/message_train/messages_controller.rb +43 -27
  18. data/app/controllers/message_train/participants_controller.rb +14 -25
  19. data/app/controllers/message_train/unsubscribes_controller.rb +96 -61
  20. data/app/helpers/message_train/application_helper.rb +13 -7
  21. data/app/helpers/message_train/attachments_helper.rb +4 -12
  22. data/app/helpers/message_train/boxes_helper.rb +4 -14
  23. data/app/helpers/message_train/collectives_helper.rb +23 -29
  24. data/app/helpers/message_train/conversations_helper.rb +52 -30
  25. data/app/helpers/message_train/messages_helper.rb +33 -20
  26. data/app/mailers/message_train/receipt_mailer.rb +22 -12
  27. data/app/models/message_train/attachment.rb +2 -2
  28. data/app/models/message_train/box.rb +182 -228
  29. data/app/models/message_train/conversation.rb +100 -103
  30. data/app/models/message_train/ignore.rb +83 -4
  31. data/app/models/message_train/message.rb +66 -117
  32. data/app/models/message_train/receipt.rb +73 -49
  33. data/app/views/message_train/boxes/show.html.haml +11 -7
  34. data/config/locales/en.yml +1 -0
  35. data/config/routes.rb +6 -12
  36. data/lib/message_train.rb +3 -1
  37. data/lib/message_train/class_methods.rb +51 -0
  38. data/lib/message_train/configuration.rb +28 -3
  39. data/lib/message_train/instance_methods.rb +209 -0
  40. data/lib/message_train/mixin.rb +25 -320
  41. data/message_train.gemspec +83 -83
  42. data/spec/controllers/message_train/boxes_controller_spec.rb +37 -19
  43. data/spec/controllers/message_train/concerns_spec.rb +21 -3
  44. data/spec/controllers/message_train/conversations_controller_spec.rb +41 -18
  45. data/spec/controllers/message_train/messages_controller_spec.rb +112 -31
  46. data/spec/controllers/message_train/participants_controller_spec.rb +33 -7
  47. data/spec/controllers/message_train/unsubscribes_controller_spec.rb +10 -8
  48. data/spec/dummy/app/assets/stylesheets/{application.css.scss → application.scss} +2 -1
  49. data/spec/dummy/app/assets/stylesheets/bootstrap-everything.scss +54 -0
  50. data/spec/dummy/app/models/group.rb +1 -1
  51. data/spec/dummy/app/views/layouts/application.html.haml +9 -8
  52. data/spec/dummy/bin/setup +8 -8
  53. data/spec/dummy/config/application.rb +0 -3
  54. data/spec/dummy/config/environments/test.rb +4 -2
  55. data/spec/dummy/db/schema.rb +94 -103
  56. data/spec/dummy/db/test.sqlite3 +0 -0
  57. data/spec/factories/attachment.rb +3 -1
  58. data/spec/factories/message.rb +2 -3
  59. data/spec/features/boxes_spec.rb +0 -3
  60. data/spec/helpers/message_train/application_helper_spec.rb +3 -2
  61. data/spec/helpers/message_train/attachment_helper_spec.rb +4 -0
  62. data/spec/helpers/message_train/boxes_helper_spec.rb +1 -0
  63. data/spec/helpers/message_train/collectives_helper_spec.rb +1 -0
  64. data/spec/helpers/message_train/conversations_helper_spec.rb +3 -2
  65. data/spec/helpers/message_train/messages_helper_spec.rb +2 -1
  66. data/spec/models/group_spec.rb +6 -4
  67. data/spec/models/message_train/box_spec.rb +0 -88
  68. data/spec/models/message_train/ignore_spec.rb +65 -0
  69. data/spec/models/message_train/message_spec.rb +6 -5
  70. data/spec/models/message_train/receipt_spec.rb +6 -8
  71. data/spec/models/role_spec.rb +2 -2
  72. data/spec/models/user_spec.rb +29 -101
  73. data/spec/rails_helper.rb +16 -30
  74. data/spec/support/feature_behaviors.rb +2 -1
  75. data/spec/support/shared_connection.rb +5 -0
  76. data/spec/support/utilities.rb +7 -8
  77. metadata +145 -120
  78. data/README.rdoc +0 -175
  79. data/spec/dummy/app/models/.keep +0 -0
  80. data/spec/dummy/log/.keep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12b8f313069e8f1baf1c13690a1a0980f840acf3
4
- data.tar.gz: 7932ba13bedad5eaebbd72b2262d5378ef699567
3
+ metadata.gz: 2c59cd4ee75e183221da8c3b2dd801177d7b3c60
4
+ data.tar.gz: c3cf3df9408cfb22be672d147c6fc92770056a4b
5
5
  SHA512:
6
- metadata.gz: 3206692449f595f507755a26bdf754da473b8be0631d53fcb5a7280c82368a9725035e44669268fbd439085934ba0fd8a7f03c61f8cfe89b94b54ddb8d6cd4e8
7
- data.tar.gz: 7ec535b4e1a3e925ee5ab9a6ef5fcbc9311ee7509d3f334e1acd6bfa2df5d0e7ec0a477774481f8203f6c278329e70cfb202752b0481b5714d8fa1f2261e49e0
6
+ metadata.gz: a5b8949dbc963fdda36d71c41eae7b8f3f6dde94c87da7876497d4406cf2ce0d7c503b02819e26e844b26efa0fa7a8e0a484c105127cc0bf3a761e170f894d27
7
+ data.tar.gz: c2689982f54869d3d999255d2fa9c44763bdd8b640a89e630e9b2d49e930aaffab60b658865bd0ecb4f4f7cb812ba3b133dbb7be2e1ff9147a936841673567a2
data/.rubocop.yml CHANGED
@@ -1,20 +1,23 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  AllCops:
4
+ DisplayCopNames: true
2
5
  Exclude:
3
6
  - message_train.gemspec
4
7
  - db/migrate/*
5
8
  - spec/dummy/db/schema.rb
6
9
  - spec/dummy/db/migrate/*
7
- Style/ClassVars:
8
- Enabled: false
9
- Metrics/AbcSize:
10
- Enabled: false
11
- Metrics/ClassLength:
12
- Enabled: false
13
- Metrics/CyclomaticComplexity:
14
- Enabled: false
15
- Metrics/MethodLength:
16
- Enabled: false
10
+
11
+ Metrics/BlockLength:
12
+ Exclude:
13
+ - config/routes.rb
14
+ - spec/*
15
+ - spec/*/*
16
+ - spec/*/*/*
17
+ - spec/dummy/db/seeds/*
18
+
17
19
  Metrics/ModuleLength:
18
- Enabled: false
19
- Metrics/PerceivedComplexity:
20
- Enabled: false
20
+ Exclude:
21
+ - spec/*
22
+ - spec/*/*
23
+ - spec/*/*/*
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,12 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-03-23 13:39:31 -0600 using RuboCop version 0.47.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 3
10
+ # Configuration parameters: CountComments.
11
+ Metrics/ClassLength:
12
+ Max: 166
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.2
1
+ 2.2.3
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - ruby-2.2.1
4
3
  - 2.2.2
4
+ - 2.2.3
5
5
  before_install:
6
6
  - export TZ=America/Denver
7
7
  before_script:
data/Gemfile CHANGED
@@ -1,62 +1,60 @@
1
1
  source 'https://rubygems.org'
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
- # gem 'activesupport', '>= 2.3.5'
5
- gem 'rails', '>= 4.2'
6
- gem 'paperclip', '>= 4.2'
7
- gem 'rails-i18n', '~> 4'
8
4
  gem 'haml-rails', '~> 0.9'
9
5
  gem 'jquery-rails', '~> 4'
10
- gem 'uglifier', '~> 2.7'
6
+ gem 'paperclip', '>= 4.2', '< 6'
7
+ gem 'rails', '>= 4', '< 6'
8
+ gem 'rails-i18n', '>= 4', '< 6'
9
+ gem 'uglifier', '>= 2.7', '< 3.2'
11
10
 
12
11
  # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
13
12
  gem 'jbuilder', '~> 2.0'
14
13
 
15
- gem 'sass-rails', '~> 5'
16
14
  gem 'bootstrap-sass', '~> 3.3'
17
- gem 'bootstrap_leather', '~> 0.8'
18
- gem 'bootstrap_pager', '~> 0.10'
19
15
  gem 'bootstrap_form', '~> 2.3'
20
- gem 'ckeditor'
16
+ gem 'bootstrap_leather', '~> 0.9'
17
+ gem 'bootstrap_pager', '~> 0.10'
21
18
  gem 'bootstrap_tokenfield_rails', '~> 0.12'
19
+ gem 'ckeditor'
22
20
  gem 'cocoon', '~> 1.2'
23
- gem 'jquery-ui-bootstrap-rails-asset'
21
+ gem 'jquery-ui-bootstrap-rails'
22
+ gem 'sass-rails', '~> 5'
24
23
  gem 'twitter-typeahead-rails'
25
24
 
26
25
  # Add dependencies to develop your gem here.
27
26
  # Include everything needed to run rake, tests, features, etc.
28
27
  group :development do
29
- gem 'sdoc', '~> 0.4.1'
30
28
  gem 'bundler', '~> 1.0'
31
- gem 'jeweler', '~> 2.0'
29
+ gem 'juwelier', '~> 2'
32
30
  gem 'pre-commit', '~> 0.27'
33
- gem 'rubocop', '~> 0.37'
34
- gem 'coffeelint', '~> 1.14'
35
- gem 'scss_lint', '~> 0.47.0', require: false
31
+ gem 'rubocop', '~> 0.47.1', require: false
32
+ gem 'scss_lint', '~> 0.52', require: false
33
+ gem 'sdoc', '~> 0.4.1'
36
34
  end
37
35
 
38
36
  group :development, :test do
39
- gem 'sqlite3', '~> 1.3'
40
- gem 'devise', '~> 3.5'
41
- gem 'rolify', '~> 4'
42
- gem 'faker', '~> 1.4'
43
- gem 'rspec-rails', '~> 3.2'
44
- gem 'rspec-its', '~> 1.2'
37
+ gem 'byebug', '~> 9'
38
+ gem 'devise', '~> 4'
45
39
  gem 'factory_girl_rails', '~> 4.5'
46
- gem 'seedbank', '~> 0.3'
40
+ gem 'faker', '~> 1.4'
47
41
  gem 'friendly_id', '~> 5'
48
- gem 'byebug', '~> 5'
49
- gem 'high_voltage', '~> 2.4'
42
+ gem 'high_voltage', '~> 3'
43
+ gem 'rolify', '>= 4', '< 5.2'
44
+ gem 'rspec-its', '>= 1'
45
+ gem 'rspec-rails', '>= 3', '< 4'
46
+ gem 'seedbank', '~> 0.3'
47
+ gem 'sqlite3', '~> 1.3'
50
48
  end
51
49
 
52
50
  group :test do
53
51
  gem 'capybara', '~> 2.4'
54
- gem 'capybara-webkit', '~> 1.12'
55
- gem 'database_cleaner', '~> 1.4'
56
- gem 'rspec-collection_matchers', '~> 1.1'
57
- gem 'shoulda-matchers', '~> 2.8'
58
- gem 'launchy', '~> 2.1.2', require: false
59
52
  gem 'coveralls', '~> 0.8', require: false
53
+ gem 'database_cleaner', '~> 1.4'
54
+ gem 'launchy', '~> 2', require: false
55
+ gem 'poltergeist', '~> 1.14'
56
+ gem 'rails-controller-testing', '~> 1.0'
57
+ gem 'rspec-collection_matchers', '>= 1'
60
58
  gem 'rspec-html-matchers', '~> 0.7'
61
- gem 'selenium-webdriver', '~> 2'
59
+ gem 'shoulda-matchers', '>= 2.8', '< 3.2'
62
60
  end
data/README.md ADDED
@@ -0,0 +1,284 @@
1
+ # MessageTrain
2
+ [![Build Status](https://travis-ci.org/gemvein/message_train.svg)](https://travis-ci.org/gemvein/message_train)
3
+ [![Coverage Status](https://coveralls.io/repos/gemvein/message_train/badge.svg?branch=master&service=github)](https://coveralls.io/github/gemvein/message_train?branch=master)
4
+ [![Gem Version](https://badge.fury.io/rb/message_train.svg)](http://badge.fury.io/rb/message_train)
5
+
6
+ MessageTrain is a Rails 4 and 5 Private Messaging Gem that uses bootstrap to send
7
+ and display private messages from one user to another. It can also be
8
+ configured to send messages to a user collective (such as a certain Role or
9
+ Group of users).
10
+
11
+ Messages can be saved as drafts instead of sending. Message composition
12
+ features type-ahead completion for recipients, wysiwyg html bodies, and an
13
+ arbitrary number of attachments. Messages are grouped together into
14
+ conversations, and allow valid senders to reply to a given message. Any given
15
+ conversation can be ignored if it is no longer of interest to the user, at
16
+ which point no further messages will be received in that conversation. The
17
+ 'read' or 'unread' status of messages is tracked automatically, and can also
18
+ be changed manually by the user.
19
+
20
+ Conversations are grouped into various boxes, depending on their status for
21
+ that user: in, sent, all, drafts, trash, ignored. Any message can be trashed
22
+ by the user, at which point the user has the option to permanently delete it.
23
+
24
+ Email messages are sent when a user receives a message, either directly or
25
+ through a collective (unless they have unsubscribed from those notifications
26
+ or all notifications).
27
+
28
+ ### Inbox Page
29
+ ![Inbox Screenshot](http://gemvein.com/assets/screenshots/message_train-box-in.png)
30
+
31
+ ## Installation
32
+
33
+ First, install the gem:
34
+
35
+ ```bash
36
+ gem 'ckeditor'
37
+ gem 'message_train'
38
+ ```
39
+
40
+ Then, run the install generator:
41
+
42
+ ```bash
43
+ rails g message_train:install
44
+ ```
45
+
46
+ And then run `rake db:migrate`.
47
+
48
+ Next, add to your models, each of which will need some kind of display
49
+ name column and some kind of slug (could be the same). See below for the
50
+ options for this mixin:
51
+
52
+ ```ruby
53
+ # in /app/models/user.rb
54
+ message_train
55
+
56
+ # OR to set the name and slug columns:
57
+
58
+ message_train slug_column: :short_name, name_column: :display_name
59
+ ```
60
+
61
+ To include Message Train variables and helpers in your controllers, add
62
+ this concern to your controller or application controller:
63
+
64
+ ```ruby
65
+ include MessageTrain::MessageTrainSupport
66
+ ```
67
+
68
+ Add to your application.css.scss:
69
+
70
+ ```scss
71
+ @import 'message_train';
72
+ ```
73
+
74
+ And in your application.js:
75
+
76
+ ```js
77
+ //= require message_train
78
+ ```
79
+
80
+ In your layout, supposing you use haml:
81
+
82
+ ```haml
83
+ #alert_area
84
+ = alert_flash_messages
85
+ ```
86
+
87
+ If you use bootstrap, you can use the built-in bootstrap sidebar menu
88
+ (makes use of bootstrap_leather, which is a dependency of this gem)
89
+
90
+ ```haml
91
+ - if user_signed_in?
92
+ = message_train_widget
93
+ = render_widgets 'md', 3
94
+ ```
95
+
96
+ ### Required helper methods
97
+
98
+ If you don't use devise with its `current_user` method, you will need to
99
+ configure MessageTrain to use whatever method you use:
100
+
101
+ ```ruby
102
+ MessageTrain.configure do |config|
103
+ config.current_user_method = :current_subscriber
104
+ end
105
+ ```
106
+
107
+ ### Mixin options
108
+
109
+ The `message_train` mixin takes the following options:
110
+
111
+ <dl>
112
+ <dt>only</dt>
113
+ <dd>A symbol or array of symbols to be the only relationships used, which can include: [:sender, :recipient]</dd>
114
+ <dt>except</dt>
115
+ <dd>A symbol or array of symbols not to create relationships for, which can include: [:sender, :recipient]</dd>
116
+ <dt>valid_senders</dt>
117
+ <dd>A method name to call for a list of valid senders for this model</dd>
118
+ <dt>collectives_for_recipient</dt>
119
+ <dd>A method that, when passed @box_user, will return a collection of valid instances of this model for that @box_user to receive. Probably a scope. (e.g. it might return groups that the user is a member of)</dd>
120
+ <dt>valid_recipients</dt>
121
+ <dd>A method that returns a collection of valid recipients for this model. default: nil</dd>
122
+ <dt>name_column</dt>
123
+ <dd>The column by which to name and find this model. default: :name</dd>
124
+ <dt>slug_column</dt>
125
+ <dd>The column with the short, typeable form of the name. default: :slug</dd>
126
+ </dl>
127
+
128
+ ### Smaller address book
129
+
130
+ By default, the address book will contain all objects of the
131
+ current_user_method object's model type. To change this behavior, define
132
+ an address book method on your recipient models, something like this:
133
+
134
+ ```ruby
135
+ def self.valid_recipients_for(user)
136
+ # Supposing you use rolify
137
+ with_role(:friend, user)
138
+ end
139
+ ```
140
+
141
+ And in your model:
142
+
143
+ ```ruby
144
+ message_train address_book_method: :valid_recipients_for
145
+ ```
146
+
147
+ Or in your initializer:
148
+
149
+ ```ruby
150
+ config.address_book_methods[:users] = :valid_recipients_for
151
+ ```
152
+
153
+ ## View Helpers
154
+
155
+ ### Boxes
156
+ <dl>
157
+ <dt>boxes_dropdown_list</dt>
158
+ <dd>Bootstrap navigation dropdown list of boxes. (Be sure to check thatuser is signed in before calling, or you'll get errors.)</dd>
159
+ <dt>boxes_widget</dt>
160
+ <dd>Bootstrap widget with list of boxes</dd>
161
+ <dt>box_nav_item(box)</dt>
162
+ <dd>Bootstrap list item for one box</dd>
163
+ <dt>box_list_item(box)</dt>
164
+ <dd>Bootstrap list item for one box</dd>
165
+ <dt>box_participant_name(participant)</dt>
166
+ <dd>Name of the participant, according to the method specified in yourconfiguration or model.</dd>
167
+ <dt>box_participant_slug(participant)</dt>
168
+ <dd>Slug of the participant, according to the method specified in your configuration or model.</dd>
169
+ </dl>
170
+
171
+ ### Conversations
172
+ <dl>
173
+ <dt>conversation_senders(conversation)</dt>
174
+ <dd>List of senders for a given conversation</dd>
175
+ <dt>conversation_class(box, conversation)</dt>
176
+ <dd>CSS class to put on a given conversation when in a certain box</dd>
177
+ <dt>conversation_trashed_toggle(conversation)</dt>
178
+ <dd>Link to toggle trashed status of a conversation</dd>
179
+ <dt>conversation_read_toggle(conversation)</dt>
180
+ <dd>Link to toggle read status of a conversation</dd>
181
+ <dt>conversation_ignored_toggle(conversation)</dt>
182
+ <dd>Link to toggle ignored status of a conversation</dd>
183
+ <dt>conversation_deleted_toggle(conversation)</dt>
184
+ <dd>Link to toggle deleted status of a conversation</dd>
185
+ <dt>conversation_toggle(conversation, icon, mark_to_set, method, title, options = {})</dt>
186
+ <dd>Link to toggle some status of a conversation</dd>
187
+ </dl>
188
+
189
+ ### Messages
190
+ <dl>
191
+ <dt>message_class(box, message)</dt>
192
+ <dd>CSS class to put on a given message when in a certain box</dd>
193
+ <dt>message_trashed_toggle(message)</dt>
194
+ <dd>Link to toggle trashed status of a message</dd>
195
+ <dt>message_read_toggle(message)</dt>
196
+ <dd>Link to toggle read status of a message</dd>
197
+ <dt>message_deleted_toggle(message)</dt>
198
+ <dd>Link to toggle ignored status of a message</dd>
199
+ <dt>message_toggle(message, icon, mark_to_set, title, options = {})</dt>
200
+ <dd>Link to toggle some status of a message</dd>
201
+ <dt>message_recipients(message)</dt>
202
+ <dd>Recipients for a given message</dd>
203
+ </dl>
204
+
205
+ ## Configuration
206
+
207
+ <dl>
208
+ <dt>config.slug_columns</dt>
209
+ <dd>Usually populated by options on the `message_train` mixin for models, this contains a `Hash` of tables and their slug columns</dd>
210
+ <dt>config.name_columns</dt>
211
+ <dd>Usually populated by options on the `message_train` mixin for models, this contains a `Hash` of tables and their name columns</dd>
212
+ <dt>config.user_model</dt>
213
+ <dd>Defaults to `'User'`</dd>
214
+ <dt>config.current_user_method</dt>
215
+ <dd>Defaults to `Devise`'s `current_user`</dd>
216
+ <dt>config.user_sign_in_path</dt>
217
+ <dd>Defaults to `Devise`'s `/users/sign_in`</dd>
218
+ <dt>config.user_route_authentication_method</dt>
219
+ <dd>Defaults to `Devise`'s `:user`</dd>
220
+ <dt>config.address_book_method</dt>
221
+ <dd>Default value if `address_book_methods` doesn't have a match for thistable</dd>
222
+ <dt>config.address_book_methods</dt>
223
+ <dd>`Hash` of tables and the methods those tables use to provide atab-completion address book for that table.</dd>
224
+ <dt>config.recipient_tables</dt>
225
+ <dd>Usually populated by options on the `message_train` mixin for models,this contains a `Hash` of tables and their class names</dd>
226
+ <dt>config.collectives_for_recipient_methods</dt>
227
+ <dd>Usually populated by options on the `message_train` mixin for models,this contains a list of collectives that act as recipients through which users receive messages.</dd>
228
+ <dt>config.valid_senders_methods</dt>
229
+ <dd>Usually populated by options on the `message_train` mixin for models,this contains a `Hash` of tables and the methods that indicate which users can send messages to a given instance from that table.</dd>
230
+ <dt>config.valid_recipients_methods</dt>
231
+ <dd>Usually populated by options on the `message_train` mixin for models,this contains a `Hash` of tables and the methods that indicate which users can receive messages from a given instance from that table.</dd>
232
+ <dt>config.from_email</dt>
233
+ <dd>The email address from which notification emails are sent.</dd>
234
+ <dt>config.site_name</dt>
235
+ <dd>The name of the site, for use in notification emails.</dd>
236
+ </dl>
237
+
238
+ ## Upgrading
239
+
240
+ ### 0.4.0
241
+
242
+ Version 0.4.0 introduced database changes to the foreign key columns to
243
+ work with Rails 4.2.5. Let me know if you need help migrating your app to
244
+ the newly named foreign keys.
245
+
246
+ ### 0.3.0
247
+
248
+ A new config variable was added for the user model, which will be used to
249
+ generate a new user if the user is anonymous.
250
+
251
+ ### 0.2.0
252
+ New columns were added with version 0.2.0, so when upgrading be sure to
253
+ install the latest migrations:
254
+
255
+ ```bash
256
+ rake message_train:install:migrations
257
+ ```
258
+
259
+ Running this command is harmless if the migrations are already installed,
260
+ they will simply be skipped.
261
+
262
+ ## Contributing to MessageTrain
263
+
264
+ * Check out the latest master to make sure the feature hasn't been
265
+ implemented or the bug hasn't been fixed yet.
266
+ * Check out the issue tracker to make sure someone already hasn't
267
+ requested it and/or contributed it.
268
+ * Fork the project.
269
+ * Start a feature/bugfix branch.
270
+ * Commit and push until you are happy with your contribution.
271
+ * Make sure to add tests for it. This is important so I don't break it
272
+ in a future version unintentionally.
273
+ * Please try not to mess with the Rakefile, version, or history. If you
274
+ want to have your own version, or is otherwise necessary, that is
275
+ fine, but please isolate to its own commit so I can cherry-pick around
276
+ it.
277
+
278
+ ## Contributors
279
+ * [Karen Lundgren](https://github.com/nerakdon)
280
+ * [Chad Lundgren](https://github.com/chadlundgren)
281
+
282
+ ## Copyright
283
+
284
+ Copyright (c) 2015-2017 Gem Vein. See LICENSE.txt for further details.