thredded 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.mkdn +63 -0
- data/Procfile +1 -0
- data/README.mkdn +42 -20
- data/app/assets/images/thredded/private-messages.svg +4 -0
- data/app/assets/images/thredded/settings.svg +4 -0
- data/app/assets/javascripts/thredded.es6 +2 -10
- data/app/assets/javascripts/thredded/{currently_online.es6 → components/currently_online.es6} +0 -0
- data/app/assets/javascripts/thredded/{post_form.es6 → components/post_form.es6} +0 -0
- data/app/assets/javascripts/thredded/{time_stamps.es6 → components/time_stamps.es6} +0 -0
- data/app/assets/javascripts/thredded/{topic_form.es6 → components/topic_form.es6} +1 -1
- data/app/assets/javascripts/thredded/components/topics.es6 +37 -0
- data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +45 -0
- data/app/assets/javascripts/thredded/components/users_select.es6 +56 -0
- data/app/assets/javascripts/thredded/dependencies.js +9 -0
- data/app/assets/javascripts/thredded/thredded.es6 +1 -0
- data/app/assets/stylesheets/thredded/_base.scss +3 -2
- data/app/assets/stylesheets/thredded/_thredded.scss +4 -1
- data/app/assets/stylesheets/thredded/base/_buttons.scss +2 -1
- data/app/assets/stylesheets/thredded/base/_forms.scss +23 -18
- data/app/assets/stylesheets/thredded/base/_grid.scss +1 -1
- data/app/assets/stylesheets/thredded/base/_nav.scss +21 -0
- data/app/assets/stylesheets/thredded/base/_tables.scss +5 -14
- data/app/assets/stylesheets/thredded/base/_typography.scss +9 -4
- data/app/assets/stylesheets/thredded/base/_variables.scss +28 -9
- data/app/assets/stylesheets/thredded/components/_alerts.scss +19 -0
- data/app/assets/stylesheets/thredded/components/_currently-online.scss +1 -1
- data/app/assets/stylesheets/thredded/components/_form-list.scss +2 -4
- data/app/assets/stylesheets/thredded/components/_icons.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_messageboard.scss +4 -4
- data/app/assets/stylesheets/thredded/components/_pagination.scss +2 -2
- data/app/assets/stylesheets/thredded/components/_post-form.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_post.scss +14 -4
- data/app/assets/stylesheets/thredded/components/_select2.scss +79 -9
- data/app/assets/stylesheets/thredded/components/_topic-header.scss +11 -1
- data/app/assets/stylesheets/thredded/components/_topics.scss +13 -11
- data/app/assets/stylesheets/thredded/layout/_main-container.scss +3 -3
- data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +11 -17
- data/app/assets/stylesheets/thredded/layout/_navigation.scss +72 -0
- data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +66 -0
- data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +35 -61
- data/app/commands/thredded/at_notification_extractor.rb +1 -0
- data/app/commands/thredded/members_marked_notified.rb +1 -0
- data/app/commands/thredded/messageboard_destroyer.rb +7 -2
- data/app/commands/thredded/notify_mentioned_users.rb +8 -21
- data/app/commands/thredded/notify_private_topic_users.rb +3 -5
- data/app/controllers/thredded/application_controller.rb +76 -41
- data/app/controllers/thredded/autocomplete_users_controller.rb +46 -0
- data/app/controllers/thredded/messageboards_controller.rb +8 -5
- data/app/controllers/thredded/posts_controller.rb +20 -22
- data/app/controllers/thredded/preferences_controller.rb +19 -14
- data/app/controllers/thredded/private_topics_controller.rb +58 -23
- data/app/controllers/thredded/setups_controller.rb +1 -0
- data/app/controllers/thredded/theme_previews_controller.rb +24 -53
- data/app/controllers/thredded/topics_controller.rb +48 -77
- data/app/forms/thredded/private_topic_form.rb +1 -21
- data/app/forms/thredded/topic_form.rb +3 -7
- data/app/forms/thredded/user_preferences_form.rb +62 -0
- data/app/helpers/thredded/application_helper.rb +11 -12
- data/app/helpers/thredded/urls_helper.rb +103 -0
- data/app/jobs/thredded/activity_updater_job.rb +4 -3
- data/app/jobs/thredded/at_notifier_job.rb +1 -0
- data/app/jobs/thredded/notify_private_topic_users_job.rb +1 -0
- data/app/mailer_previews/thredded/base_mailer_preview.rb +101 -0
- data/app/mailer_previews/thredded/post_mailer_preview.rb +11 -0
- data/app/mailer_previews/thredded/private_post_mailer_preview.rb +11 -0
- data/app/mailer_previews/thredded/private_topic_mailer_preview.rb +15 -0
- data/app/mailers/thredded/base_mailer.rb +13 -0
- data/app/mailers/thredded/post_mailer.rb +4 -2
- data/app/mailers/thredded/private_post_mailer.rb +4 -2
- data/app/mailers/thredded/private_topic_mailer.rb +4 -2
- data/app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb +16 -0
- data/app/models/concerns/thredded/post_common.rb +68 -63
- data/app/models/concerns/thredded/topic_common.rb +31 -8
- data/app/models/concerns/thredded/user_topic_read_state_common.rb +31 -0
- data/app/models/thredded/category.rb +1 -0
- data/app/models/thredded/messageboard.rb +24 -25
- data/app/models/thredded/messageboard_user.rb +1 -0
- data/app/models/thredded/null_preference.rb +1 -0
- data/app/models/thredded/null_user.rb +1 -6
- data/app/models/thredded/null_user_topic_read_state.rb +12 -0
- data/app/models/thredded/post.rb +6 -9
- data/app/models/thredded/post_notification.rb +1 -0
- data/app/models/thredded/private_post.rb +6 -2
- data/app/models/thredded/private_topic.rb +46 -32
- data/app/models/thredded/private_user.rb +3 -2
- data/app/models/thredded/stats.rb +1 -0
- data/app/models/thredded/topic.rb +40 -64
- data/app/models/thredded/topic_category.rb +1 -0
- data/app/models/thredded/user_detail.rb +2 -15
- data/app/models/thredded/user_extender.rb +29 -14
- data/app/models/thredded/user_messageboard_preference.rb +20 -0
- data/app/models/thredded/user_permissions/admin/if_admin_column_true.rb +1 -0
- data/app/models/thredded/user_permissions/admin/none.rb +1 -0
- data/app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb +1 -0
- data/app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb +1 -0
- data/app/models/thredded/user_permissions/moderate/none.rb +1 -0
- data/app/models/thredded/user_permissions/read/all.rb +1 -0
- data/app/models/thredded/user_permissions/write/all.rb +1 -0
- data/app/models/thredded/user_permissions/write/none.rb +1 -0
- data/app/models/thredded/user_preference.rb +7 -1
- data/app/models/thredded/user_private_topic_read_state.rb +12 -0
- data/app/models/thredded/user_topic_read_state.rb +12 -0
- data/app/policies/thredded/messageboard_policy.rb +27 -0
- data/app/policies/thredded/post_policy.rb +33 -0
- data/app/policies/thredded/private_post_policy.rb +29 -0
- data/app/policies/thredded/private_topic_policy.rb +23 -0
- data/app/policies/thredded/topic_policy.rb +32 -0
- data/app/view_models/thredded/base_topic_view.rb +56 -0
- data/app/view_models/thredded/post_view.rb +44 -0
- data/app/view_models/thredded/posts_page_view.rb +27 -0
- data/app/view_models/thredded/private_topic_view.rb +9 -0
- data/app/{decorators/thredded/topic_email_decorator.rb → view_models/thredded/topic_email_view.rb} +2 -1
- data/app/view_models/thredded/topic_view.rb +23 -0
- data/app/view_models/thredded/topics_page_view.rb +26 -0
- data/app/views/thredded/error_pages/forbidden.html.erb +6 -0
- data/app/views/thredded/error_pages/not_found.html.erb +6 -0
- data/app/views/thredded/messageboards/_messageboard.html.erb +13 -6
- data/app/views/thredded/messageboards/index.html.erb +2 -8
- data/app/views/thredded/messageboards/new.html.erb +8 -2
- data/app/views/thredded/post_mailer/at_notification.html.erb +3 -3
- data/app/views/thredded/post_mailer/at_notification.text.erb +1 -1
- data/app/views/thredded/posts/_content_field.html.erb +1 -1
- data/app/views/thredded/posts/_form.html.erb +5 -1
- data/app/views/thredded/posts/_post.html.erb +3 -1
- data/app/views/thredded/posts/edit.html.erb +7 -3
- data/app/views/thredded/posts_common/_form.html.erb +1 -1
- data/app/views/thredded/posts_common/_post.html.erb +14 -8
- data/app/views/thredded/preferences/_form.html.erb +37 -15
- data/app/views/thredded/preferences/_header.html.erb +1 -1
- data/app/views/thredded/preferences/edit.html.erb +4 -6
- data/app/views/thredded/private_post_mailer/at_notification.html.erb +6 -4
- data/app/views/thredded/private_posts/_form.html.erb +5 -1
- data/app/views/thredded/private_posts/_private_post.html.erb +3 -1
- data/app/views/thredded/private_topic_mailer/message_notification.html.erb +3 -7
- data/app/views/thredded/private_topic_mailer/message_notification.text.erb +1 -3
- data/app/views/thredded/private_topics/_breadcrumbs.html.erb +2 -2
- data/app/views/thredded/private_topics/_form.html.erb +15 -10
- data/app/views/thredded/private_topics/_header.html.erb +12 -0
- data/app/views/thredded/private_topics/_no_private_topics.html.erb +2 -2
- data/app/views/thredded/private_topics/_private_topic.html.erb +4 -6
- data/app/views/thredded/private_topics/edit.html.erb +32 -0
- data/app/views/thredded/private_topics/index.html.erb +5 -5
- data/app/views/thredded/private_topics/new.html.erb +1 -2
- data/app/views/thredded/private_topics/show.html.erb +12 -7
- data/app/views/thredded/search/_form.html.erb +9 -6
- data/app/views/thredded/shared/{_messageboard_topics_breadcrumbs.html.erb → _breadcrumbs.html.erb} +2 -2
- data/app/views/thredded/shared/_header.html.erb +2 -3
- data/app/views/thredded/shared/_nav.html.erb +20 -0
- data/app/views/thredded/shared/nav/_notification_preferences.html.erb +6 -0
- data/app/views/thredded/shared/nav/_private_topics.html.erb +11 -0
- data/app/views/thredded/shared/nav/_standalone.html.erb +12 -0
- data/app/views/thredded/theme_previews/_section_title.html.erb +2 -2
- data/app/views/thredded/theme_previews/show.html.erb +13 -17
- data/app/views/thredded/topics/_form.html.erb +8 -6
- data/app/views/thredded/topics/_header.html.erb +12 -0
- data/app/views/thredded/topics/_topic.html.erb +4 -8
- data/app/views/thredded/topics/_topic_form_admin_options.html.erb +1 -1
- data/app/views/thredded/topics/edit.html.erb +22 -18
- data/app/views/thredded/topics/index.html.erb +3 -3
- data/app/views/thredded/topics/new.html.erb +1 -1
- data/app/views/thredded/topics/search.html.erb +17 -5
- data/app/views/thredded/topics/show.html.erb +14 -11
- data/bin/rails +5 -0
- data/config.ru +3 -0
- data/config/i18n-tasks.yml +16 -0
- data/config/locales/en.yml +90 -0
- data/config/routes.rb +29 -15
- data/db/migrate/20160329231848_create_thredded.rb +29 -33
- data/db/seeds.rb +115 -0
- data/db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb +59 -0
- data/heroku.gemfile +26 -0
- data/heroku.gemfile.lock +282 -0
- data/lib/generators/thredded/install/install_generator.rb +1 -0
- data/lib/generators/thredded/install/templates/initializer.rb +17 -0
- data/lib/html/pipeline/at_mention_filter.rb +2 -1
- data/lib/html/pipeline/bbcode_filter.rb +13 -4
- data/lib/tasks/thredded_tasks.rake +1 -0
- data/lib/thredded.rb +19 -17
- data/lib/thredded/at_users.rb +1 -0
- data/lib/thredded/engine.rb +14 -5
- data/lib/thredded/errors.rb +11 -11
- data/lib/thredded/main_app_route_delegator.rb +1 -0
- data/lib/thredded/search_parser.rb +2 -1
- data/lib/thredded/topics_search.rb +67 -0
- data/lib/thredded/version.rb +2 -1
- data/thredded.gemspec +12 -8
- metadata +146 -82
- data/app/assets/javascripts/thredded/users_select.es6 +0 -5
- data/app/assets/stylesheets/thredded/layout/_topic-navigation.scss +0 -53
- data/app/commands/thredded/user_reads_private_topic.rb +0 -22
- data/app/commands/thredded/user_resets_private_topic_to_unread.rb +0 -23
- data/app/decorators/thredded/base_topic_decorator.rb +0 -14
- data/app/decorators/thredded/base_user_topic_decorator.rb +0 -63
- data/app/decorators/thredded/messageboard_decorator.rb +0 -41
- data/app/decorators/thredded/post_decorator.rb +0 -40
- data/app/decorators/thredded/private_topic_decorator.rb +0 -23
- data/app/decorators/thredded/topic_decorator.rb +0 -25
- data/app/decorators/thredded/user_private_topic_decorator.rb +0 -13
- data/app/decorators/thredded/user_topic_decorator.rb +0 -37
- data/app/models/thredded/ability.rb +0 -60
- data/app/models/thredded/notification_preference.rb +0 -17
- data/app/models/thredded/null_topic.rb +0 -15
- data/app/models/thredded/null_topic_read.rb +0 -19
- data/app/models/thredded/user_topic_read.rb +0 -10
- data/app/views/thredded/shared/_notification_preferences.html.erb +0 -7
- data/app/views/thredded/shared/_top_nav.html.erb +0 -36
- data/app/views/thredded/shared/_topic_nav.html.erb +0 -22
- data/app/views/thredded/topics/_recent_topics_by_user.html.erb +0 -8
- data/app/views/thredded/topics/by_category.html.erb +0 -56
- data/app/views/thredded/topics_common/_header.html.erb +0 -6
- data/lib/thredded/messageboard_user_permissions.rb +0 -22
- data/lib/thredded/post_sql_builder.rb +0 -12
- data/lib/thredded/post_user_permissions.rb +0 -32
- data/lib/thredded/private_topic_user_permissions.rb +0 -26
- data/lib/thredded/search_sql_builder.rb +0 -21
- data/lib/thredded/seed_database.rb +0 -76
- data/lib/thredded/table_sql_builder.rb +0 -41
- data/lib/thredded/topic_sql_builder.rb +0 -11
- data/lib/thredded/topic_user_permissions.rb +0 -32
data/config/routes.rb
CHANGED
@@ -1,26 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
Thredded::Engine.routes.draw do
|
2
|
-
|
3
|
-
get '/:messageboard_id(.:format)' => 'topics#search', as: :messageboard_search
|
4
|
-
end
|
3
|
+
resource :theme_preview, only: [:show], path: 'theme-preview' if %w(development test).include? Rails.env
|
5
4
|
|
6
|
-
|
5
|
+
page_constraint = { page: /[1-9]\d*/ }
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
scope path: 'private-topics' do
|
8
|
+
resource :private_topic, only: [:new], path: ''
|
9
|
+
resources :private_topics, except: [:new, :show], path: '' do
|
10
|
+
member do
|
11
|
+
get '(page-:page)', action: :show, as: '', constraints: page_constraint
|
12
|
+
end
|
13
|
+
resources :private_posts, path: '', except: [:index, :show], controller: 'posts'
|
14
|
+
end
|
10
15
|
end
|
11
16
|
|
12
|
-
|
13
|
-
get '/:messageboard_id/preferences/edit' => 'preferences#edit'
|
14
|
-
get '/:messageboard_id/new(.:format)' => 'topics#new', as: :new_messageboard_topic
|
15
|
-
get '/:messageboard_id/:id/edit(.:format)' => 'topics#edit', as: :edit_messageboard_topic
|
16
|
-
get '/:messageboard_id/:id/page-:page(.:format)' => 'topics#show', as: :paged_messageboard_topic_posts, constraints: { page: /\d+/ }
|
17
|
-
get '/:messageboard_id/category/:category_id' => 'topics#category', as: :messageboard_topics_categories
|
17
|
+
resources :autocomplete_users, only: [:index], path: 'autocomplete-users'
|
18
18
|
|
19
|
+
constraints(->(req) { req.env['QUERY_STRING'].include? 'q=' }) do
|
20
|
+
get '/' => 'topics#search', as: :messageboards_search
|
21
|
+
get '/:messageboard_id(.:format)' => 'topics#search', as: :messageboard_search
|
22
|
+
end
|
23
|
+
|
24
|
+
resource :preferences, only: [:edit, :update]
|
25
|
+
resource :messageboard, path: 'messageboards', only: [:new]
|
19
26
|
resources :messageboards, only: [:index, :create], path: '' do
|
20
27
|
resource :preferences, only: [:edit, :update]
|
21
|
-
|
22
|
-
resources :topics, path: '' do
|
23
|
-
|
28
|
+
resource :topic, path: 'topics', only: [:new]
|
29
|
+
resources :topics, path: '', except: [:index, :new, :show] do
|
30
|
+
collection do
|
31
|
+
get '(page-:page)', action: :index, as: '', constraints: page_constraint
|
32
|
+
get '/category/:category_id', action: :category, as: :categories
|
33
|
+
end
|
34
|
+
member do
|
35
|
+
get '(page-:page)', action: :show, as: '', constraints: page_constraint
|
36
|
+
end
|
37
|
+
resources :posts, except: [:index, :show], path: ''
|
24
38
|
end
|
25
39
|
end
|
26
40
|
|
@@ -1,10 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
class CreateThredded < ActiveRecord::Migration
|
2
3
|
def change
|
3
|
-
|
4
4
|
unless table_exists?(:friendly_id_slugs)
|
5
5
|
# The user might have installed FriendlyId separately already.
|
6
6
|
create_table :friendly_id_slugs do |t|
|
7
|
-
t.string :slug, limit:
|
7
|
+
t.string :slug, limit: 191, null: false
|
8
8
|
t.integer :sluggable_id, null: false
|
9
9
|
t.string :sluggable_type, limit: 50
|
10
10
|
t.string :scope, limit: 191
|
@@ -18,14 +18,14 @@ class CreateThredded < ActiveRecord::Migration
|
|
18
18
|
|
19
19
|
create_table :thredded_categories do |t|
|
20
20
|
t.integer :messageboard_id, null: false
|
21
|
-
t.string :name, limit:
|
21
|
+
t.string :name, limit: 191, null: false
|
22
22
|
t.string :description, limit: 255
|
23
23
|
t.timestamps null: false
|
24
24
|
t.string :slug, limit: 191, null: false
|
25
25
|
end
|
26
26
|
add_index :thredded_categories, [:messageboard_id, :slug], name: :index_thredded_categories_on_messageboard_id_and_slug, unique: true
|
27
27
|
add_index :thredded_categories, [:messageboard_id], name: :index_thredded_categories_on_messageboard_id
|
28
|
-
DbTextSearch::
|
28
|
+
DbTextSearch::CaseInsensitive.add_index connection, :thredded_categories, :name, name: :thredded_categories_name_ci
|
29
29
|
|
30
30
|
create_table :thredded_messageboards do |t|
|
31
31
|
t.string :name, limit: 255, null: false
|
@@ -35,34 +35,22 @@ class CreateThredded < ActiveRecord::Migration
|
|
35
35
|
t.integer :posts_count, default: 0
|
36
36
|
t.boolean :closed, default: false, null: false
|
37
37
|
t.timestamps null: false
|
38
|
-
t.string :filter, limit: 255, default: 'markdown', null: false
|
39
38
|
end
|
40
39
|
add_index :thredded_messageboards, [:closed], name: :index_thredded_messageboards_on_closed
|
41
40
|
add_index :thredded_messageboards, [:slug], name: :index_thredded_messageboards_on_slug
|
42
41
|
|
43
|
-
create_table :thredded_notification_preferences do |t|
|
44
|
-
t.boolean :notify_on_mention, default: true
|
45
|
-
t.boolean :notify_on_message, default: true
|
46
|
-
t.integer :user_id, null: false
|
47
|
-
t.integer :messageboard_id, null: false
|
48
|
-
t.timestamps null: false
|
49
|
-
end
|
50
|
-
add_index :thredded_notification_preferences, [:messageboard_id], name: :index_thredded_notification_preferences_on_messageboard_id
|
51
|
-
add_index :thredded_notification_preferences, [:user_id], name: :index_thredded_notification_preferences_on_user_id
|
52
|
-
|
53
42
|
create_table :thredded_post_notifications do |t|
|
54
|
-
t.string :email, limit:
|
43
|
+
t.string :email, limit: 191, null: false
|
55
44
|
t.integer :post_id, null: false
|
56
45
|
t.timestamps null: false
|
57
|
-
t.string :post_type, limit:
|
46
|
+
t.string :post_type, limit: 191
|
58
47
|
end
|
59
48
|
add_index :thredded_post_notifications, [:post_id, :post_type], name: :index_thredded_post_notifications_on_post
|
60
49
|
|
61
50
|
create_table :thredded_posts do |t|
|
62
51
|
t.integer :user_id, limit: 4
|
63
|
-
t.text :content, limit:
|
52
|
+
t.text :content, limit: 65_535
|
64
53
|
t.string :ip, limit: 255
|
65
|
-
t.string :filter, limit: 255, default: 'markdown'
|
66
54
|
t.string :source, limit: 255, default: 'web'
|
67
55
|
t.integer :postable_id, limit: 4
|
68
56
|
t.integer :messageboard_id, null: false
|
@@ -72,13 +60,12 @@ class CreateThredded < ActiveRecord::Migration
|
|
72
60
|
add_index :thredded_posts, [:postable_id], name: :index_thredded_posts_on_postable_id
|
73
61
|
add_index :thredded_posts, [:postable_id], name: :index_thredded_posts_on_postable_id_and_postable_type
|
74
62
|
add_index :thredded_posts, [:user_id], name: :index_thredded_posts_on_user_id
|
75
|
-
DbTextSearch::
|
63
|
+
DbTextSearch::FullText.add_index connection, :thredded_posts, :content, name: :thredded_posts_content_fts
|
76
64
|
|
77
65
|
create_table :thredded_private_posts do |t|
|
78
66
|
t.integer :user_id, limit: 4
|
79
|
-
t.text :content, limit:
|
67
|
+
t.text :content, limit: 65_535
|
80
68
|
t.string :ip, limit: 255
|
81
|
-
t.string :filter, limit: 255, default: 'markdown'
|
82
69
|
t.integer :postable_id, null: false
|
83
70
|
t.timestamps null: false
|
84
71
|
end
|
@@ -99,10 +86,8 @@ class CreateThredded < ActiveRecord::Migration
|
|
99
86
|
t.integer :private_topic_id, limit: 4
|
100
87
|
t.integer :user_id, limit: 4
|
101
88
|
t.timestamps null: false
|
102
|
-
t.boolean :read, default: false
|
103
89
|
end
|
104
90
|
add_index :thredded_private_users, [:private_topic_id], name: :index_thredded_private_users_on_private_topic_id
|
105
|
-
add_index :thredded_private_users, [:read], name: :index_thredded_private_users_on_read
|
106
91
|
add_index :thredded_private_users, [:user_id], name: :index_thredded_private_users_on_user_id
|
107
92
|
|
108
93
|
create_table :thredded_topic_categories do |t|
|
@@ -129,7 +114,7 @@ class CreateThredded < ActiveRecord::Migration
|
|
129
114
|
add_index :thredded_topics, [:messageboard_id, :slug], name: :index_thredded_topics_on_messageboard_id_and_slug, unique: true
|
130
115
|
add_index :thredded_topics, [:messageboard_id], name: :index_thredded_topics_on_messageboard_id
|
131
116
|
add_index :thredded_topics, [:user_id], name: :index_thredded_topics_on_user_id
|
132
|
-
DbTextSearch::
|
117
|
+
DbTextSearch::FullText.add_index connection, :thredded_topics, :title, name: :thredded_topics_title_fts
|
133
118
|
|
134
119
|
create_table :thredded_user_details do |t|
|
135
120
|
t.integer :user_id, null: false
|
@@ -154,20 +139,31 @@ class CreateThredded < ActiveRecord::Migration
|
|
154
139
|
|
155
140
|
create_table :thredded_user_preferences do |t|
|
156
141
|
t.integer :user_id, null: false
|
157
|
-
t.
|
142
|
+
t.boolean :notify_on_mention, default: true, null: false
|
143
|
+
t.boolean :notify_on_message, default: true, null: false
|
158
144
|
t.timestamps null: false
|
159
145
|
end
|
160
146
|
add_index :thredded_user_preferences, [:user_id], name: :index_thredded_user_preferences_on_user_id
|
161
147
|
|
162
|
-
create_table :
|
148
|
+
create_table :thredded_user_messageboard_preferences do |t|
|
163
149
|
t.integer :user_id, null: false
|
164
|
-
t.integer :
|
165
|
-
t.
|
166
|
-
t.integer :posts_count, default: 0, null: false
|
167
|
-
t.integer :page, default: 1, null: false
|
150
|
+
t.integer :messageboard_id, null: false
|
151
|
+
t.boolean :notify_on_mention, default: true, null: false
|
168
152
|
t.timestamps null: false
|
169
153
|
end
|
170
|
-
add_index :
|
171
|
-
|
154
|
+
add_index :thredded_user_messageboard_preferences, [:user_id, :messageboard_id],
|
155
|
+
unique: true,
|
156
|
+
name: :thredded_user_messageboard_preferences_user_id_messageboard_id
|
157
|
+
|
158
|
+
%i(topic private_topic).each do |topics_table|
|
159
|
+
table_name = :"thredded_user_#{topics_table}_read_states"
|
160
|
+
create_table table_name do |t|
|
161
|
+
t.integer :user_id, null: false
|
162
|
+
t.integer :postable_id, null: false
|
163
|
+
t.integer :page, default: 1, null: false
|
164
|
+
t.timestamp :read_at, null: false
|
165
|
+
end
|
166
|
+
add_index table_name, [:user_id, :postable_id], name: :"#{table_name}_user_postable", unique: true
|
167
|
+
end
|
172
168
|
end
|
173
169
|
end
|
data/db/seeds.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'factory_girl_rails'
|
3
|
+
|
4
|
+
# rubocop:disable HandleExceptions
|
5
|
+
begin
|
6
|
+
if FactoryGirl.factories.instance_variable_get(:@items).none?
|
7
|
+
require_relative '../spec/factories'
|
8
|
+
end
|
9
|
+
rescue NameError
|
10
|
+
end
|
11
|
+
# rubocop:enable HandleExceptions
|
12
|
+
|
13
|
+
module Thredded
|
14
|
+
class SeedDatabase
|
15
|
+
attr_reader :user, :users, :messageboard, :topics, :private_topics, :posts
|
16
|
+
|
17
|
+
SKIP_CALLBACKS = [
|
18
|
+
[Thredded::Post, :commit, :after, :notify_at_users],
|
19
|
+
[Thredded::PrivatePost, :commit, :after, :notify_at_users],
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
def self.run(users: 200, topics: 55, posts: (1..60))
|
23
|
+
STDERR.puts 'Seeding the database...'
|
24
|
+
# Disable callbacks to avoid creating notifications and performing unnecessary updates
|
25
|
+
SKIP_CALLBACKS.each { |(klass, *args)| klass.skip_callback(*args) }
|
26
|
+
s = new
|
27
|
+
Messageboard.transaction do
|
28
|
+
s.create_first_user
|
29
|
+
s.create_users(count: users)
|
30
|
+
s.create_messageboard
|
31
|
+
s.create_topics(count: topics)
|
32
|
+
s.create_posts(count: posts)
|
33
|
+
s.create_private_posts(count: posts)
|
34
|
+
s.create_additional_messageboards
|
35
|
+
s.log 'Running after_commit callbacks'
|
36
|
+
end
|
37
|
+
ensure
|
38
|
+
# Re-enable callbacks
|
39
|
+
SKIP_CALLBACKS.each { |(klass, *args)| klass.set_callback(*args) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def log(message)
|
43
|
+
STDERR.puts "- #{message}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_first_user
|
47
|
+
@user ||= begin
|
48
|
+
::User.first ||
|
49
|
+
::User.create(name: 'Joe', email: 'joe@example.com')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_users(count: 5)
|
54
|
+
log "Creating #{count} users..."
|
55
|
+
@users = [user] + FactoryGirl.create_list(:user, count)
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_messageboard
|
59
|
+
log 'Creating a messageboard...'
|
60
|
+
@messageboard = FactoryGirl.create(
|
61
|
+
:messageboard,
|
62
|
+
name: 'Main Board',
|
63
|
+
slug: 'main-board',
|
64
|
+
description: 'A board is not a board without some posts'
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
def create_additional_messageboards
|
69
|
+
additional_messageboards = [
|
70
|
+
['Off-Topic', "Talk about whatever here, it's all good."],
|
71
|
+
['Meta', 'Need help using the forum? Want to report a bug or make a suggestion? This is the place.']
|
72
|
+
]
|
73
|
+
log "Creating #{additional_messageboards.length} additional messageboards..."
|
74
|
+
additional_messageboards.each do |(name, description)|
|
75
|
+
messageboard = Messageboard.create!(name: name, description: description)
|
76
|
+
FactoryGirl.create_list(:topic, 1 + rand(3), messageboard: messageboard, with_posts: 1)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_topics(count: 26, messageboard: self.messageboard)
|
81
|
+
log "Creating #{count} topics in #{messageboard.name}..."
|
82
|
+
@topics = FactoryGirl.create_list(
|
83
|
+
:topic, count,
|
84
|
+
messageboard: messageboard,
|
85
|
+
user: users.sample,
|
86
|
+
last_user: users.sample)
|
87
|
+
|
88
|
+
@private_topics = FactoryGirl.create_list(
|
89
|
+
:private_topic, count,
|
90
|
+
user: users.sample,
|
91
|
+
last_user: users.sample,
|
92
|
+
users: [user])
|
93
|
+
end
|
94
|
+
|
95
|
+
def create_posts(count: (1..30))
|
96
|
+
log "Creating #{count} additional posts in each topic..."
|
97
|
+
@posts = topics.flat_map do |topic|
|
98
|
+
(count.min + rand(count.max + 1)).times do
|
99
|
+
FactoryGirl.create(:post, postable: topic, messageboard: messageboard, user: users.sample)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def create_private_posts(count: (1..30))
|
105
|
+
log "Creating #{count} additional posts in each private topic..."
|
106
|
+
@private_posts = private_topics.flat_map do |topic|
|
107
|
+
(count.min + rand(count.max + 1)).times do
|
108
|
+
FactoryGirl.create(:private_post, postable: topic, user: users.sample)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
Thredded::SeedDatabase.run
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
class UpgradeV02ToV03 < ActiveRecord::Migration
|
3
|
+
def up
|
4
|
+
remove_index :thredded_notification_preferences, name: :index_thredded_notification_preferences_on_messageboard_id
|
5
|
+
remove_index :thredded_notification_preferences, name: :index_thredded_notification_preferences_on_user_id
|
6
|
+
rename_table :thredded_notification_preferences, :thredded_user_messageboard_preferences
|
7
|
+
remove_column :thredded_user_messageboard_preferences, :notify_on_message
|
8
|
+
change_column_null :thredded_user_messageboard_preferences, :notify_on_mention, false
|
9
|
+
add_column :thredded_user_preferences, :notify_on_mention, :boolean, default: true, null: false
|
10
|
+
add_column :thredded_user_preferences, :notify_on_message, :boolean, default: true, null: false
|
11
|
+
add_index :thredded_user_messageboard_preferences, [:user_id, :messageboard_id], unique: true, name: :thredded_user_messageboard_preferences_user_id_messageboard_id
|
12
|
+
remove_column :thredded_user_preferences, :time_zone
|
13
|
+
remove_column :thredded_messageboards, :filter
|
14
|
+
remove_column :thredded_posts, :filter
|
15
|
+
remove_column :thredded_private_posts, :filter
|
16
|
+
drop_table :thredded_user_topic_reads
|
17
|
+
%i(topic private_topic).each do |topics_table|
|
18
|
+
table_name = :"thredded_user_#{topics_table}_read_states"
|
19
|
+
create_table table_name do |t|
|
20
|
+
t.integer :user_id, null: false
|
21
|
+
t.integer :postable_id, null: false
|
22
|
+
t.integer :page, default: 1, null: false
|
23
|
+
t.timestamp :read_at, null: false
|
24
|
+
end
|
25
|
+
add_index table_name, [:user_id, :postable_id], name: :"#{table_name}_user_postable", unique: true
|
26
|
+
end
|
27
|
+
remove_column :thredded_private_users, :read
|
28
|
+
remove_index :thredded_private_users, name: :index_thredded_private_users_on_read
|
29
|
+
end
|
30
|
+
|
31
|
+
def down
|
32
|
+
add_column :thredded_private_users, :read, :boolean, default: false
|
33
|
+
add_index :thredded_private_users, :read, name: :index_thredded_private_users_on_read
|
34
|
+
drop_table :thredded_user_topic_read_states
|
35
|
+
drop_table :thredded_user_private_topic_read_states
|
36
|
+
create_table :thredded_user_topic_reads do |t|
|
37
|
+
t.integer :user_id, null: false
|
38
|
+
t.integer :topic_id, null: false
|
39
|
+
t.integer :post_id, null: false
|
40
|
+
t.integer :posts_count, default: 0, null: false
|
41
|
+
t.integer :page, default: 1, null: false
|
42
|
+
t.timestamps null: false
|
43
|
+
end
|
44
|
+
add_index :thredded_user_topic_reads, [:topic_id], name: :index_thredded_user_topic_reads_on_topic_id
|
45
|
+
add_index :thredded_user_topic_reads, [:user_id, :topic_id], name: :index_thredded_user_topic_reads_on_user_id_and_topic_id, unique: true
|
46
|
+
add_column :thredded_private_posts, :filter, :string, default: 'markdown', null: false
|
47
|
+
add_column :thredded_posts, :filter, :string, default: 'markdown', null: false
|
48
|
+
add_column :thredded_messageboards, :filter, :string, default: 'markdown', null: false
|
49
|
+
add_column :thredded_user_preferences, :time_zone, :string, limit: 191, default: 'Eastern Time (US & Canada)'
|
50
|
+
change_column_null :thredded_user_messageboard_preferences, :notify_on_mention, true
|
51
|
+
remove_index :thredded_user_messageboard_preferences, name: :thredded_user_messageboard_preferences_user_id_messageboard_id
|
52
|
+
rename_table :thredded_user_messageboard_preferences, :thredded_notification_preferences
|
53
|
+
add_index :thredded_notification_preferences, [:messageboard_id], name: :index_thredded_notification_preferences_on_messageboard_id
|
54
|
+
add_index :thredded_notification_preferences, [:user_id], name: :index_thredded_notification_preferences_on_user_id
|
55
|
+
add_column :thredded_notification_preferences, :notify_on_message, :boolean, default: true
|
56
|
+
remove_column :thredded_user_preferences, :notify_on_mention
|
57
|
+
remove_column :thredded_user_preferences, :notify_on_message
|
58
|
+
end
|
59
|
+
end
|
data/heroku.gemfile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
source 'https://rubygems.org'
|
3
|
+
ruby '2.3.0'
|
4
|
+
|
5
|
+
gem 'thredded', path: File.dirname(__FILE__)
|
6
|
+
|
7
|
+
# Rails 5
|
8
|
+
gem 'rails', git: 'https://github.com/rails/rails'
|
9
|
+
gem 'kaminari', git: 'https://github.com/amatsuda/kaminari'
|
10
|
+
gem 'active_record_union', git: 'https://github.com/glebm/active_record_union', branch: 'rails-5-test-harness'
|
11
|
+
|
12
|
+
# Make these gems available in production
|
13
|
+
gem 'puma'
|
14
|
+
gem 'pg'
|
15
|
+
gem 'rails_email_preview', '>= 1.0.3'
|
16
|
+
gem 'jquery-turbolinks'
|
17
|
+
gem 'turbolinks'
|
18
|
+
gem 'factory_girl_rails'
|
19
|
+
gem 'faker', '>= 1.6.2'
|
20
|
+
|
21
|
+
# Heroku-specific gems
|
22
|
+
gem 'newrelic_rpm'
|
23
|
+
gem 'rollbar'
|
24
|
+
gem 'therubyracer'
|
25
|
+
gem 'rack-canonical-host'
|
26
|
+
gem 'dalli'
|
data/heroku.gemfile.lock
ADDED
@@ -0,0 +1,282 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/amatsuda/kaminari
|
3
|
+
revision: 772de7ccea717ad74524163fa6ae9601efc87c2f
|
4
|
+
specs:
|
5
|
+
kaminari (1.0.0.alpha)
|
6
|
+
actionpack (>= 3.0.0)
|
7
|
+
activesupport (>= 3.0.0)
|
8
|
+
|
9
|
+
GIT
|
10
|
+
remote: https://github.com/glebm/active_record_union
|
11
|
+
revision: fde21fb8fe7d5d3cc24f1dc5d6627d92c30f10e5
|
12
|
+
branch: rails-5-test-harness
|
13
|
+
specs:
|
14
|
+
active_record_union (1.1.1)
|
15
|
+
activerecord (>= 4.0)
|
16
|
+
|
17
|
+
GIT
|
18
|
+
remote: https://github.com/rails/rails
|
19
|
+
revision: 597fa0b42f90bbef6a8c7628d4e08fb132fba887
|
20
|
+
specs:
|
21
|
+
actioncable (5.0.0.beta3)
|
22
|
+
actionpack (= 5.0.0.beta3)
|
23
|
+
nio4r (~> 1.2)
|
24
|
+
websocket-driver (~> 0.6.1)
|
25
|
+
actionmailer (5.0.0.beta3)
|
26
|
+
actionpack (= 5.0.0.beta3)
|
27
|
+
actionview (= 5.0.0.beta3)
|
28
|
+
activejob (= 5.0.0.beta3)
|
29
|
+
mail (~> 2.5, >= 2.5.4)
|
30
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
31
|
+
actionpack (5.0.0.beta3)
|
32
|
+
actionview (= 5.0.0.beta3)
|
33
|
+
activesupport (= 5.0.0.beta3)
|
34
|
+
rack (~> 2.x)
|
35
|
+
rack-test (~> 0.6.3)
|
36
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
37
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
38
|
+
actionview (5.0.0.beta3)
|
39
|
+
activesupport (= 5.0.0.beta3)
|
40
|
+
builder (~> 3.1)
|
41
|
+
erubis (~> 2.7.0)
|
42
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
43
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
44
|
+
activejob (5.0.0.beta3)
|
45
|
+
activesupport (= 5.0.0.beta3)
|
46
|
+
globalid (>= 0.3.6)
|
47
|
+
activemodel (5.0.0.beta3)
|
48
|
+
activesupport (= 5.0.0.beta3)
|
49
|
+
activerecord (5.0.0.beta3)
|
50
|
+
activemodel (= 5.0.0.beta3)
|
51
|
+
activesupport (= 5.0.0.beta3)
|
52
|
+
arel (~> 7.0)
|
53
|
+
activesupport (5.0.0.beta3)
|
54
|
+
concurrent-ruby (~> 1.0)
|
55
|
+
i18n (~> 0.7)
|
56
|
+
minitest (~> 5.1)
|
57
|
+
tzinfo (~> 1.1)
|
58
|
+
rails (5.0.0.beta3)
|
59
|
+
actioncable (= 5.0.0.beta3)
|
60
|
+
actionmailer (= 5.0.0.beta3)
|
61
|
+
actionpack (= 5.0.0.beta3)
|
62
|
+
actionview (= 5.0.0.beta3)
|
63
|
+
activejob (= 5.0.0.beta3)
|
64
|
+
activemodel (= 5.0.0.beta3)
|
65
|
+
activerecord (= 5.0.0.beta3)
|
66
|
+
activesupport (= 5.0.0.beta3)
|
67
|
+
bundler (>= 1.3.0, < 2.0)
|
68
|
+
railties (= 5.0.0.beta3)
|
69
|
+
sprockets-rails (>= 2.0.0)
|
70
|
+
railties (5.0.0.beta3)
|
71
|
+
actionpack (= 5.0.0.beta3)
|
72
|
+
activesupport (= 5.0.0.beta3)
|
73
|
+
method_source
|
74
|
+
rake (>= 0.8.7)
|
75
|
+
thor (>= 0.18.1, < 2.0)
|
76
|
+
|
77
|
+
PATH
|
78
|
+
remote: .
|
79
|
+
specs:
|
80
|
+
thredded (0.2.2)
|
81
|
+
active_record_union (>= 1.1.1)
|
82
|
+
autoprefixer-rails
|
83
|
+
autosize-rails
|
84
|
+
bbcoder (~> 1.0)
|
85
|
+
db_text_search (~> 0.2.0)
|
86
|
+
friendly_id
|
87
|
+
gemoji
|
88
|
+
github-markdown
|
89
|
+
html-pipeline
|
90
|
+
html-pipeline-vimeo
|
91
|
+
html-pipeline-youtube
|
92
|
+
htmlentities
|
93
|
+
inline_svg
|
94
|
+
jquery-rails
|
95
|
+
kaminari
|
96
|
+
nokogiri
|
97
|
+
pundit (>= 1.1.0)
|
98
|
+
rails (>= 4.2.0)
|
99
|
+
rails-timeago
|
100
|
+
rb-gravatar
|
101
|
+
rinku
|
102
|
+
sanitize
|
103
|
+
sass (>= 3.4.21)
|
104
|
+
select2-rails (~> 3.5)
|
105
|
+
sprockets-es6
|
106
|
+
|
107
|
+
GEM
|
108
|
+
remote: https://rubygems.org/
|
109
|
+
specs:
|
110
|
+
addressable (2.4.0)
|
111
|
+
arel (7.0.0)
|
112
|
+
autoprefixer-rails (6.3.6)
|
113
|
+
execjs
|
114
|
+
autosize-rails (1.18.17)
|
115
|
+
rails (>= 3.1)
|
116
|
+
babel-source (5.8.35)
|
117
|
+
babel-transpiler (0.7.0)
|
118
|
+
babel-source (>= 4.0, < 6)
|
119
|
+
execjs (~> 2.0)
|
120
|
+
bbcoder (1.1.1)
|
121
|
+
builder (3.2.2)
|
122
|
+
coffee-rails (4.1.1)
|
123
|
+
coffee-script (>= 2.2.0)
|
124
|
+
railties (>= 4.0.0, < 5.1.x)
|
125
|
+
coffee-script (2.4.1)
|
126
|
+
coffee-script-source
|
127
|
+
execjs
|
128
|
+
coffee-script-source (1.10.0)
|
129
|
+
concurrent-ruby (1.0.1)
|
130
|
+
crass (1.0.2)
|
131
|
+
dalli (2.7.6)
|
132
|
+
db_text_search (0.2.0)
|
133
|
+
activerecord (>= 4.1.15, < 6.0)
|
134
|
+
erubis (2.7.0)
|
135
|
+
execjs (2.6.0)
|
136
|
+
factory_girl (4.7.0)
|
137
|
+
activesupport (>= 3.0.0)
|
138
|
+
factory_girl_rails (4.7.0)
|
139
|
+
factory_girl (~> 4.7.0)
|
140
|
+
railties (>= 3.0.0)
|
141
|
+
faker (1.6.3)
|
142
|
+
i18n (~> 0.5)
|
143
|
+
friendly_id (5.1.0)
|
144
|
+
activerecord (>= 4.0.0)
|
145
|
+
gemoji (2.1.0)
|
146
|
+
github-markdown (0.6.9)
|
147
|
+
globalid (0.3.6)
|
148
|
+
activesupport (>= 4.1.0)
|
149
|
+
html-pipeline (2.4.0)
|
150
|
+
activesupport (>= 2, < 5)
|
151
|
+
nokogiri (>= 1.4)
|
152
|
+
html-pipeline-vimeo (0.1.1)
|
153
|
+
html-pipeline (~> 2.0)
|
154
|
+
html-pipeline-youtube (0.1.2)
|
155
|
+
html-pipeline (~> 2.0)
|
156
|
+
htmlentities (4.3.4)
|
157
|
+
i18n (0.7.0)
|
158
|
+
inline_svg (0.6.3)
|
159
|
+
activesupport (>= 4.0.4)
|
160
|
+
loofah (>= 2.0)
|
161
|
+
nokogiri (~> 1.6)
|
162
|
+
jquery-rails (4.1.1)
|
163
|
+
rails-dom-testing (>= 1, < 3)
|
164
|
+
railties (>= 4.2.0)
|
165
|
+
thor (>= 0.14, < 2.0)
|
166
|
+
jquery-turbolinks (2.1.0)
|
167
|
+
railties (>= 3.1.0)
|
168
|
+
turbolinks
|
169
|
+
json (1.8.3)
|
170
|
+
libv8 (3.16.14.13)
|
171
|
+
loofah (2.0.3)
|
172
|
+
nokogiri (>= 1.5.9)
|
173
|
+
mail (2.6.4)
|
174
|
+
mime-types (>= 1.16, < 4)
|
175
|
+
method_source (0.8.2)
|
176
|
+
mime-types (3.0)
|
177
|
+
mime-types-data (~> 3.2015)
|
178
|
+
mime-types-data (3.2016.0221)
|
179
|
+
mini_portile2 (2.0.0)
|
180
|
+
minitest (5.8.4)
|
181
|
+
multi_json (1.11.2)
|
182
|
+
newrelic_rpm (3.15.1.316)
|
183
|
+
nio4r (1.2.1)
|
184
|
+
nokogiri (1.6.7.2)
|
185
|
+
mini_portile2 (~> 2.0.0.rc2)
|
186
|
+
nokogumbo (1.4.7)
|
187
|
+
nokogiri
|
188
|
+
pg (0.18.4)
|
189
|
+
puma (3.4.0)
|
190
|
+
pundit (1.1.0)
|
191
|
+
activesupport (>= 3.0.0)
|
192
|
+
rack (2.0.0.alpha)
|
193
|
+
json
|
194
|
+
rack-canonical-host (0.2.1)
|
195
|
+
addressable (> 0, < 3)
|
196
|
+
rack (>= 1.0.0, < 3)
|
197
|
+
rack-test (0.6.3)
|
198
|
+
rack (>= 1.0)
|
199
|
+
rails-deprecated_sanitizer (1.0.3)
|
200
|
+
activesupport (>= 4.2.0.alpha)
|
201
|
+
rails-dom-testing (1.0.7)
|
202
|
+
activesupport (>= 4.2.0.beta, < 5.0)
|
203
|
+
nokogiri (~> 1.6.0)
|
204
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
205
|
+
rails-html-sanitizer (1.0.3)
|
206
|
+
loofah (~> 2.0)
|
207
|
+
rails-timeago (2.13.0)
|
208
|
+
actionpack (>= 3.1)
|
209
|
+
activesupport (>= 3.1)
|
210
|
+
rails_email_preview (1.0.3)
|
211
|
+
rails (>= 3.2)
|
212
|
+
request_store
|
213
|
+
sass-rails
|
214
|
+
turbolinks
|
215
|
+
rake (11.1.2)
|
216
|
+
rb-gravatar (1.0.5)
|
217
|
+
ref (2.0.0)
|
218
|
+
request_store (1.3.1)
|
219
|
+
rinku (1.7.3)
|
220
|
+
rollbar (2.9.1)
|
221
|
+
multi_json
|
222
|
+
sanitize (4.0.1)
|
223
|
+
crass (~> 1.0.2)
|
224
|
+
nokogiri (>= 1.4.4)
|
225
|
+
nokogumbo (~> 1.4.1)
|
226
|
+
sass (3.4.22)
|
227
|
+
sass-rails (5.0.4)
|
228
|
+
railties (>= 4.0.0, < 5.0)
|
229
|
+
sass (~> 3.1)
|
230
|
+
sprockets (>= 2.8, < 4.0)
|
231
|
+
sprockets-rails (>= 2.0, < 4.0)
|
232
|
+
tilt (>= 1.1, < 3)
|
233
|
+
select2-rails (3.5.10)
|
234
|
+
thor (~> 0.14)
|
235
|
+
sprockets (3.6.0)
|
236
|
+
concurrent-ruby (~> 1.0)
|
237
|
+
rack (> 1, < 3)
|
238
|
+
sprockets-es6 (0.9.0)
|
239
|
+
babel-source (>= 5.8.11)
|
240
|
+
babel-transpiler
|
241
|
+
sprockets (>= 3.0.0)
|
242
|
+
sprockets-rails (3.0.4)
|
243
|
+
actionpack (>= 4.0)
|
244
|
+
activesupport (>= 4.0)
|
245
|
+
sprockets (>= 3.0.0)
|
246
|
+
therubyracer (0.12.2)
|
247
|
+
libv8 (~> 3.16.14.0)
|
248
|
+
ref
|
249
|
+
thor (0.19.1)
|
250
|
+
thread_safe (0.3.5)
|
251
|
+
tilt (2.0.2)
|
252
|
+
turbolinks (2.5.3)
|
253
|
+
coffee-rails
|
254
|
+
tzinfo (1.2.2)
|
255
|
+
thread_safe (~> 0.1)
|
256
|
+
websocket-driver (0.6.3)
|
257
|
+
websocket-extensions (>= 0.1.0)
|
258
|
+
websocket-extensions (0.1.2)
|
259
|
+
|
260
|
+
PLATFORMS
|
261
|
+
ruby
|
262
|
+
|
263
|
+
DEPENDENCIES
|
264
|
+
active_record_union!
|
265
|
+
dalli
|
266
|
+
factory_girl_rails
|
267
|
+
faker (>= 1.6.2)
|
268
|
+
jquery-turbolinks
|
269
|
+
kaminari!
|
270
|
+
newrelic_rpm
|
271
|
+
pg
|
272
|
+
puma
|
273
|
+
rack-canonical-host
|
274
|
+
rails!
|
275
|
+
rails_email_preview (>= 1.0.3)
|
276
|
+
rollbar
|
277
|
+
therubyracer
|
278
|
+
thredded!
|
279
|
+
turbolinks
|
280
|
+
|
281
|
+
BUNDLED WITH
|
282
|
+
1.11.2
|