thredded 0.16.15 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -23
  3. data/app/assets/javascripts/thredded/components/preview_area.es6 +3 -1
  4. data/app/commands/thredded/create_messageboard.rb +2 -2
  5. data/app/controllers/concerns/thredded/render_preview.rb +6 -0
  6. data/app/controllers/thredded/application_controller.rb +5 -10
  7. data/app/controllers/thredded/topics_controller.rb +0 -6
  8. data/app/forms/thredded/private_topic_form.rb +1 -1
  9. data/app/helpers/thredded/application_helper.rb +3 -3
  10. data/app/helpers/thredded/urls_helper.rb +1 -1
  11. data/app/mailer_previews/thredded/base_mailer_preview.rb +5 -5
  12. data/app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb +1 -1
  13. data/app/models/concerns/thredded/notifier_preference.rb +1 -1
  14. data/app/models/concerns/thredded/post_common.rb +8 -7
  15. data/app/models/concerns/thredded/topic_common.rb +1 -1
  16. data/app/models/concerns/thredded/user_topic_read_state_common.rb +5 -5
  17. data/app/models/thredded/messageboard.rb +3 -4
  18. data/app/models/thredded/notifications_for_followed_topics.rb +1 -1
  19. data/app/models/thredded/post.rb +3 -2
  20. data/app/models/thredded/post_moderation_record.rb +12 -13
  21. data/app/models/thredded/private_post.rb +2 -2
  22. data/app/models/thredded/private_topic.rb +4 -2
  23. data/app/models/thredded/topic.rb +2 -2
  24. data/app/models/thredded/user_detail.rb +1 -1
  25. data/app/models/thredded/user_extender.rb +1 -1
  26. data/app/view_models/thredded/post_view.rb +1 -0
  27. data/app/view_models/thredded/posts_page_view.rb +10 -9
  28. data/app/view_models/thredded/private_topics_page_view.rb +10 -6
  29. data/app/view_models/thredded/topic_posts_page_view.rb +16 -3
  30. data/app/view_models/thredded/topics_page_view.rb +9 -6
  31. data/app/views/layouts/thredded/application.html.erb +2 -2
  32. data/app/views/thredded/messageboards/_form.html.erb +3 -3
  33. data/app/views/thredded/moderation/_post_moderation_record.html.erb +3 -3
  34. data/app/views/thredded/posts_common/_content.html.erb +1 -1
  35. data/app/views/thredded/posts_common/actions/_quote.html.erb +1 -1
  36. data/app/views/thredded/shared/_page.html.erb +1 -1
  37. data/app/views/thredded/shared/nav/_standalone.html.erb +2 -2
  38. data/bin/create_migration_fixture +23 -0
  39. data/bin/rubocop +11 -0
  40. data/config/i18n-tasks.yml +6 -1
  41. data/config/locales/de.yml +2 -0
  42. data/config/locales/en.yml +3 -1
  43. data/config/locales/es.yml +2 -0
  44. data/config/locales/fr.yml +2 -0
  45. data/config/locales/it.yml +4 -2
  46. data/config/locales/pl.yml +2 -0
  47. data/config/locales/pt-BR.yml +2 -0
  48. data/config/locales/ru.yml +2 -0
  49. data/config/locales/zh-CN.yml +2 -0
  50. data/db/upgrade_migrations/20161019150201_upgrade_v0_7_to_v0_8.rb +5 -5
  51. data/db/upgrade_migrations/20180110200009_upgrade_thredded_v0_14_to_v0_15.rb +1 -1
  52. data/lib/generators/thredded/install/templates/initializer.rb +3 -3
  53. data/lib/thredded/arel_compat.rb +1 -42
  54. data/lib/thredded/base_migration.rb +2 -2
  55. data/lib/thredded/collection_to_strings_with_cache_renderer.rb +91 -28
  56. data/lib/thredded/compat.rb +35 -0
  57. data/lib/thredded/content_formatter.rb +30 -8
  58. data/lib/thredded/database_seeder.rb +11 -4
  59. data/lib/thredded/db_tools.rb +3 -5
  60. data/lib/thredded/email_transformer.rb +2 -2
  61. data/lib/thredded/engine.rb +1 -1
  62. data/lib/thredded/formatting_demo_content.rb +21 -21
  63. data/lib/thredded/html_pipeline/at_mention_filter.rb +1 -1
  64. data/lib/thredded/html_pipeline/onebox_filter.rb +3 -3
  65. data/lib/thredded/html_pipeline/utils.rb +1 -1
  66. data/lib/thredded/version.rb +1 -1
  67. data/lib/thredded.rb +3 -23
  68. metadata +56 -29
@@ -3,24 +3,25 @@
3
3
  module Thredded
4
4
  # A view model for a page of PostViews.
5
5
  class PostsPageView
6
- delegate :to_a,
6
+ delegate :each,
7
+ :each_with_index,
8
+ :map,
9
+ :size,
10
+ :to_a,
7
11
  :to_ary,
8
12
  :present?,
9
13
  to: :@post_views
10
14
  delegate :total_pages,
11
15
  :current_page,
12
16
  :limit_value,
13
- to: :@paginated_scope
14
-
15
- # @return [Thredded::BaseTopicView]
16
- attr_reader :topic
17
+ to: :@posts_paginator
17
18
 
18
19
  # @param user [Thredded.user_class] the user who is viewing the posts page
19
- # @param paginated_scope [ActiveRecord::Relation<Thredded::PostCommon>]
20
- def initialize(user, paginated_scope, topic_view: nil)
21
- @paginated_scope = paginated_scope
20
+ # @param paginated_scope [ActiveRecord::Relation<Thredded::PostCommon>] a kaminari-decorated ".page" scope
21
+ def initialize(user, paginated_scope)
22
+ @posts_paginator = paginated_scope
22
23
  @post_views = paginated_scope.map do |post|
23
- Thredded::PostView.new(post, Pundit.policy!(user, post), topic_view: topic_view)
24
+ Thredded::PostView.new(post, Pundit.policy!(user, post))
24
25
  end
25
26
  end
26
27
  end
@@ -3,7 +3,11 @@
3
3
  module Thredded
4
4
  # A view model for a page of BaseTopicViews.
5
5
  class PrivateTopicsPageView
6
- delegate :to_a,
6
+ delegate :each,
7
+ :each_with_index,
8
+ :map,
9
+ :size,
10
+ :to_a,
7
11
  :to_ary,
8
12
  :blank?,
9
13
  :empty?,
@@ -11,13 +15,13 @@ module Thredded
11
15
  delegate :total_pages,
12
16
  :current_page,
13
17
  :limit_value,
14
- to: :@topics_page_scope
18
+ to: :@topics_paginator
15
19
 
16
- # @param user [Thredded.user_class] the user who is viewing the posts page
17
- # @param topics_page_scope [ActiveRecord::Relation<Thredded::Topic>]
20
+ # @param user [Thredded.user_class] the user who is viewing the private topics page
21
+ # @param topics_page_scope [ActiveRecord::Relation<Thredded::PrivateTopic>] a kaminari-decorated ".page" scope
18
22
  def initialize(user, topics_page_scope)
19
- @topics_page_scope = refine_scope(topics_page_scope)
20
- @topic_views = @topics_page_scope.with_read_states(user).map do |(topic, read_state)|
23
+ @topics_paginator = refine_scope(topics_page_scope)
24
+ @topic_views = @topics_paginator.with_read_states(user).map do |(topic, read_state)|
21
25
  Thredded::PrivateTopicView.new(topic, read_state, Pundit.policy!(user, topic))
22
26
  end
23
27
  end
@@ -2,15 +2,28 @@
2
2
 
3
3
  module Thredded
4
4
  # A view model for a page of PostViews of a Topic.
5
- class TopicPostsPageView < Thredded::PostsPageView
5
+ class TopicPostsPageView
6
+ delegate :each,
7
+ :each_with_index,
8
+ :map,
9
+ :size,
10
+ :to_a,
11
+ :to_ary,
12
+ :present?,
13
+ to: :@post_views
14
+ delegate :total_pages,
15
+ :current_page,
16
+ :limit_value,
17
+ to: :@posts_paginator
18
+
6
19
  # @return [Thredded::BaseTopicView]
7
20
  attr_reader :topic
8
21
 
9
22
  # @param user [Thredded.user_class] the user who is viewing the posts page
10
23
  # @param topic [Thredded::TopicCommon]
11
- # @param paginated_scope [ActiveRecord::Relation<Thredded::PostCommon>]
24
+ # @param paginated_scope [ActiveRecord::Relation<Thredded::PostCommon>] a kaminari-decorated ".page" scope
12
25
  def initialize(user, topic, paginated_scope)
13
- @paginated_scope = paginated_scope
26
+ @posts_paginator = paginated_scope
14
27
  @topic = "#{paginated_scope.reflect_on_association(:postable).klass}View".constantize.from_user(topic, user)
15
28
  prev_read = false
16
29
  @post_views = paginated_scope.map.with_index do |post, i|
@@ -8,18 +8,21 @@ module Thredded
8
8
  :blank?,
9
9
  :empty?,
10
10
  :[],
11
+ :each,
12
+ :map,
13
+ :size,
11
14
  to: :@topic_views
12
15
  delegate :total_pages,
13
16
  :current_page,
14
17
  :limit_value,
15
- to: :@topics_page_scope
18
+ to: :@topics_paginator
16
19
 
17
- # @param user [Thredded.user_class] the user who is viewing the posts page
18
- # @param topics_page_scope [ActiveRecord::Relation<Thredded::Topic>]
19
- # @param topic_view_class [Class] view_model for topic instances
20
+ # @param user [Thredded.user_class] the user who is viewing the topics page
21
+ # @param topics_page_scope [ActiveRecord::Relation<Thredded::Topic>] a kaminari-decorated ".page" scope
22
+ # @param topic_view_class [Class<TopicView>] view_model for topic instances
20
23
  def initialize(user, topics_page_scope, topic_view_class: TopicView)
21
- @topics_page_scope = refine_scope(topics_page_scope)
22
- @topic_views = @topics_page_scope.with_read_and_follow_states(user).map do |(topic, read_state, follow)|
24
+ @topics_paginator = refine_scope(topics_page_scope)
25
+ @topic_views = @topics_paginator.with_read_and_follow_states(user).map do |(topic, read_state, follow)|
23
26
  topic_view_class.new(topic, read_state, follow, Pundit.policy!(user, topic))
24
27
  end
25
28
  end
@@ -5,12 +5,12 @@
5
5
  <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
6
6
  <%= stylesheet_link_tag 'thredded', 'data-turbolinks-track': 'reload' %>
7
7
  <%= csrf_meta_tag %>
8
- <%= csp_meta_tag if Thredded.rails_supports_csp_nonce? %>
8
+ <%= csp_meta_tag %>
9
9
  <%= javascript_include_tag 'thredded',
10
10
  async: !Rails.application.config.assets.debug,
11
11
  defer: true,
12
12
  'data-turbolinks-track': 'reload' %>
13
- <%== Gravatar.prefetch_dns %>
13
+ <%= RailsGravatar.prefetch_dns_tag %>
14
14
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
15
15
  </head>
16
16
  <body>
@@ -1,16 +1,16 @@
1
1
  <%= form_for messageboard, html: { class: 'thredded--form' } do |f| %>
2
2
  <ul class="thredded--form-list">
3
3
  <li>
4
- <%= f.label t('thredded.messageboard.form.title_label') %>
4
+ <%= f.label :name, t('thredded.messageboard.form.title_label') %>
5
5
  <%= f.text_field :name, required: true %>
6
6
  <%= render 'thredded/shared/field_errors', messages: f.object.errors[:name] %>
7
7
  </li>
8
8
  <li>
9
- <%= f.label t('thredded.messageboard.form.description_label') %>
9
+ <%= f.label :description, t('thredded.messageboard.form.description_label') %>
10
10
  <%= f.text_field :description %>
11
11
  </li>
12
12
  <li>
13
- <%= f.label t('thredded.messageboard.form.messageboard_group_id_label') %>
13
+ <%= f.label :messageboard_group_id, t('thredded.messageboard.form.messageboard_group_id_label') %>
14
14
  <%= f.collection_select :messageboard_group_id, Thredded::MessageboardGroup.all, :id, :name,
15
15
  include_blank: t('thredded.messageboard.form.no_group') %>
16
16
  </li>
@@ -13,13 +13,13 @@
13
13
  time_ago: time_ago(record.created_at)
14
14
  }
15
15
  %>
16
- <article class="thredded--post-moderation-record thredded--post-moderation-record-<%= record.moderation_state %>">
16
+ <article id="<%= dom_id(post) %>" class="thredded--post-moderation-record thredded--post-moderation-record-<%= record.moderation_state %>">
17
17
  <header class="thredded--post-moderation-record--header">
18
18
  <p class="thredded--post-moderation-record--moderation-state-notice">
19
19
  <% if record.approved? %>
20
- <%= t('thredded.moderation.post_approved_html', moderation_state_notice_args) %>
20
+ <%= t('thredded.moderation.post_approved_html', **moderation_state_notice_args) %>
21
21
  <% elsif record.blocked? %>
22
- <%= t('thredded.moderation.post_blocked_html', moderation_state_notice_args) %>
22
+ <%= t('thredded.moderation.post_blocked_html', **moderation_state_notice_args) %>
23
23
  <% end %>
24
24
  </p>
25
25
  <% if post && post.content != record.post_content %>
@@ -1,3 +1,3 @@
1
1
  <div class="thredded--post--content">
2
- <%= post.filtered_content(self, local_assigns[:options] || {}) %>
2
+ <%= post.filtered_content(self, **(local_assigns[:options] || {})) %>
3
3
  </div>
@@ -1,4 +1,4 @@
1
- <%= link_to t('thredded.posts.quote_btn'), url_for(post.quote_url_params),
1
+ <%= link_to t('thredded.posts.quote_btn'), post.quote_url_params,
2
2
  'data-thredded-quote-post' => post.quote_path,
3
3
  class: 'thredded--post--quote thredded--post--dropdown--actions--item',
4
4
  rel: 'nofollow' %>
@@ -8,7 +8,7 @@
8
8
  <%# If thredded JS is loaded via an [async] script, the JS may
9
9
  run before or after DOMContentLoaded. Expose a flag to Thredded
10
10
  so it can initialize correctly. %>
11
- <%= javascript_tag 'data-turbolinks-eval': 'false', **(Thredded.rails_supports_csp_nonce? ? {nonce: true} : {}) do %>
11
+ <%= javascript_tag 'data-turbolinks-eval': 'false', nonce: true do %>
12
12
  document.addEventListener('DOMContentLoaded', function() {
13
13
  (window.Thredded = window.Thredded || {}).DOMContentLoadedFired = true;
14
14
  });
@@ -2,11 +2,11 @@
2
2
  <% resource_name = Thredded.user_class_name.demodulize.underscore %>
3
3
  <% if thredded_signed_in? %>
4
4
  <%= link_to main_app.send(:"destroy_#{resource_name}_session_path"), method: :delete do %>
5
- Sign Out
5
+ <%= t('thredded.nav.sign_out') %>
6
6
  <% end %>
7
7
  <% else %>
8
8
  <%= link_to main_app.send(:"new_#{resource_name}_session_path") do %>
9
- Sign In / Register
9
+ <%= t('thredded.nav.sign_in') %>
10
10
  <% end %>
11
11
  <% end %>
12
12
  </li>
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # edit constants in lib/thredded/db_tools.rb
4
+ # git checkout v0.x.0 -b create-0.x-migration-fixture
5
+ # bundle
6
+
7
+ DIR=$(pwd)
8
+
9
+ cd spec/dummy && DB=sqlite3 rails db:environment:set RAILS_ENV=development
10
+ cd $DIR
11
+ DB=sqlite3 rake db:drop db:create db:migrate db:miniseed_dump
12
+
13
+ cd spec/dummy && DB=postgresql rails db:environment:set RAILS_ENV=development
14
+ cd $DIR
15
+ DB=postgresql rake db:drop db:create db:migrate db:miniseed_dump
16
+
17
+ cd spec/dummy && DB=mysql2 rails db:environment:set RAILS_ENV=development
18
+ cd $DIR
19
+ DB=mysql2 rake db:drop db:create db:migrate db:miniseed_dump
20
+
21
+ git add `pwd`/spec/migration/*.dump
22
+
23
+ git commit -em "add sample data for 0.8 base for migration spec"
data/bin/rubocop CHANGED
@@ -12,6 +12,17 @@ require 'pathname'
12
12
  ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
13
13
  Pathname.new(__FILE__).realpath)
14
14
 
15
+ bundle_binstub = File.expand_path('bundle', __dir__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if /This file was generated by Bundler/.match?(File.read(bundle_binstub, 300))
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
15
26
  require 'rubygems'
16
27
  require 'bundler/setup'
17
28
 
@@ -1,5 +1,5 @@
1
1
  # i18n-tasks finds and manages missing and unused translations
2
- # See https://github.com/glebm/i18n-tasks/blob/master/templates/config/i18n-tasks.yml
2
+ # See https://github.com/glebm/i18n-tasks/blob/main/templates/config/i18n-tasks.yml
3
3
 
4
4
  # Do not consider these keys missing:
5
5
  ignore_missing:
@@ -15,3 +15,8 @@ data:
15
15
  yaml:
16
16
  write:
17
17
  line_width: 110
18
+
19
+ ## Exclude these keys from the `i18n-tasks check-consistent-interpolations` report:
20
+ ignore_inconsistent_interpolations:
21
+ - 'thredded.users.posts_count.one'
22
+ - 'thredded.users.started_topics_count.one'
@@ -128,6 +128,8 @@ de:
128
128
  moderation_users: Nutzer
129
129
  private_topics: Private Unterhaltungen
130
130
  settings: Benachrichtigungseinstellungen
131
+ sign_in: Anmelden
132
+ sign_out: Ausloggen
131
133
  unread_topics: Ungelesen
132
134
  null_user_name: Gelöschte Nutzer
133
135
  posts:
@@ -127,6 +127,8 @@ en:
127
127
  moderation_users: Users
128
128
  private_topics: Private Messages
129
129
  settings: Notification Settings
130
+ sign_in: Sign In / Register
131
+ sign_out: Sign Out
130
132
  unread_topics: Unread
131
133
  null_user_name: Deleted user
132
134
  posts:
@@ -262,7 +264,7 @@ en:
262
264
  last_active_html: Last active %{time_ago}
263
265
  posted_in_topic_html: Posted in %{topic_link}
264
266
  posts_count:
265
- one: Posted %{count} time
267
+ one: Posted once
266
268
  other: Posted %{count} times
267
269
  recent_activity: :thredded.recent_activity
268
270
  send_private_message: Send private message
@@ -129,6 +129,8 @@ es:
129
129
  moderation_users: Usuarios
130
130
  private_topics: Mensajes Privados
131
131
  settings: Ajuste de Notificaciones
132
+ sign_in: Registrarse
133
+ sign_out: Desconectar
132
134
  unread_topics: No leído
133
135
  null_user_name: Usuario eliminado
134
136
  posts:
@@ -127,6 +127,8 @@ fr:
127
127
  moderation_users: Utilisateurs
128
128
  private_topics: Messages privés
129
129
  settings: Paramètres de notifications
130
+ sign_in: Se connecter
131
+ sign_out: Déconnexion
130
132
  unread_topics: Non lu
131
133
  null_user_name: Utilisateur effacé
132
134
  posts:
@@ -127,6 +127,8 @@ it:
127
127
  moderation_users: Utenti
128
128
  private_topics: Messaggi Privati
129
129
  settings: Impostazioni Notifiche
130
+ sign_in: Entra
131
+ sign_out: Esci
130
132
  unread_topics: Non letto
131
133
  null_user_name: Utente cancellato
132
134
  posts:
@@ -266,13 +268,13 @@ it:
266
268
  last_active_html: Ultima attività %{time_ago}
267
269
  posted_in_topic_html: Ha scritto in %{topic_link}
268
270
  posts_count:
269
- one: Ha commentato %{count} volta
271
+ one: Ha commentato una volta
270
272
  other: Ha commentato %{count} volte
271
273
  recent_activity: :thredded.recent_activity
272
274
  send_private_message: Invia un messaggio privato
273
275
  started_topic_html: Ha iniziato %{topic_link}
274
276
  started_topics_count:
275
- one: Ha iniziato %{count} discussione
277
+ one: Ha iniziato una discussione
276
278
  other: Ha iniziato %{count} discussioni
277
279
  user_posted_in_topic_html: "%{user_link} ha commentato in %{topic_link}"
278
280
  user_since_html: Utente da %{time_ago}
@@ -127,6 +127,8 @@ pl:
127
127
  moderation_users: Użytkownicy
128
128
  private_topics: Prywatne wiadomości
129
129
  settings: Ustawienia powiadomień
130
+ sign_in: Zaloguj
131
+ sign_out: Wyloguj się
130
132
  unread_topics: Nieprzeczytane
131
133
  null_user_name: Usunięci użytkownicy
132
134
  posts:
@@ -129,6 +129,8 @@ pt-BR:
129
129
  moderation_users: Usuários
130
130
  private_topics: Mensagens Privadas
131
131
  settings: Configurações de Notificação
132
+ sign_in: Entrar / Cadastrar
133
+ sign_out: Sair
132
134
  unread_topics: Não lida
133
135
  null_user_name: Usuário deletado
134
136
  posts:
@@ -125,6 +125,8 @@ ru:
125
125
  moderation_users: Пользователи
126
126
  private_topics: Личное
127
127
  settings: Настройки
128
+ sign_in: Войти / Зарегистрироваться
129
+ sign_out: Выход
128
130
  unread_topics: Непрочитанные
129
131
  null_user_name: Пользователь удален
130
132
  posts:
@@ -120,6 +120,8 @@ zh-CN:
120
120
  moderation_users: 用户
121
121
  private_topics: 私人对话
122
122
  settings: 通知设置
123
+ sign_in: 登录/注册
124
+ sign_out: 登出
123
125
  unread_topics: 未读
124
126
  null_user_name: 删除用户
125
127
  posts:
@@ -6,11 +6,11 @@ class UpgradeV07ToV08 < Thredded::BaseMigration
6
6
  def up
7
7
  closed_messageboards = Thredded::Messageboard.unscoped.where(closed: true).to_a
8
8
  if closed_messageboards.present?
9
- fail ActiveRecord::MigrationError, <<-TEXT
10
- There are #{closed_messageboards.length} closed Messageboards:
11
- #{closed_messageboards.map { |m| "#{m.name} (id=#{m.id})" }.join("\n")}
12
- Support for closed messageboards has been removed in thredded v0.8.0.
13
- Delete or un-close these messageboards and consider using the "paranoia" gem to support soft deletion instead.
9
+ fail ActiveRecord::MigrationError, <<~TEXT
10
+ There are #{closed_messageboards.length} closed Messageboards:
11
+ #{closed_messageboards.map { |m| "#{m.name} (id=#{m.id})" }.join("\n")}
12
+ Support for closed messageboards has been removed in thredded v0.8.0.
13
+ Delete or un-close these messageboards and consider using the "paranoia" gem to support soft deletion instead.
14
14
  TEXT
15
15
  end
16
16
  remove_index :thredded_messageboards, name: :index_thredded_messageboards_on_closed
@@ -86,6 +86,6 @@ class UpgradeThreddedV014ToV015 < Thredded::BaseMigration
86
86
  def remove_string_limit(table, column, type: :text, indices: [])
87
87
  indices.each { |(_, options)| remove_index table, name: options[:name] }
88
88
  change_column table, column, type, limit: nil
89
- indices.each { |args| add_index table, *args }
89
+ indices.each { |(columns, options)| add_index table, columns, **options }
90
90
  end
91
91
  end
@@ -29,8 +29,8 @@ Thredded.user_path = ->(user) {
29
29
  # This method is used by Thredded controllers and views to fetch the currently signed-in user
30
30
  Thredded.current_user_method = :"current_#{Thredded.user_class_name.demodulize.underscore}"
31
31
 
32
- # User avatar URL. rb-gravatar gem is used by default:
33
- Thredded.avatar_url = ->(user) { Gravatar.src(user.email, 156, 'mm') }
32
+ # User avatar URL. rails_gravatar gem is used by default:
33
+ Thredded.avatar_url = ->(user) { RailsGravatar.src(user.email, 156, 'mm') }
34
34
 
35
35
  # ==> Permissions Configuration
36
36
  # By default, thredded uses a simple permission model, where all the users can post to all message boards,
@@ -124,7 +124,7 @@ Thredded.layout = 'thredded/application'
124
124
  # Change the HTML sanitization settings used by Thredded.
125
125
  # See the Sanitize docs for more information on the underlying library: https://github.com/rgrove/sanitize/#readme
126
126
  # E.g. to allow a custom element <custom-element>:
127
- # Thredded::ContentFormatter.whitelist[:elements] += %w(custom-element)
127
+ # Thredded::ContentFormatter.allowlist[:elements] += %w(custom-element)
128
128
 
129
129
  # ==> User autocompletion (Private messages and @-mentions)
130
130
  # Thredded.autocomplete_min_length = 2 lower to 1 if have 1-letter names -- increase if you want
@@ -1,60 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- unless Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 2 || Rails::VERSION::MAJOR > 5
4
- require 'thredded/rails_lt_5_2_arel_case_node.rb'
5
- end
6
-
7
3
  module Thredded
8
4
  module ArelCompat
9
5
  module_function
10
6
 
11
- # On Rails >= 5, this method simply returns `relation.pluck(*columns)`.
12
- #
13
- # Rails 4 `pluck` does not support Arel nodes and attributes. This method does.
14
- #
15
- # This is an external method because monkey-patching `pluck` would
16
- # have compatibility issues, see:
17
- #
18
- # https://github.com/thredded/thredded/issues/842
19
- # https://blog.newrelic.com/engineering/ruby-agent-module-prepend-alias-method-chains/
20
- if Rails::VERSION::MAJOR > 4
21
- def pluck(relation, *columns)
22
- relation.pluck(*columns)
23
- end
24
- else
25
- def pluck(relation, *columns)
26
- relation.pluck(*columns.map do |n|
27
- if n.is_a?(Arel::Node)
28
- Arel.sql(n.to_sql)
29
- elsif n.is_a?(Arel::Attributes::Attribute)
30
- n.name
31
- else
32
- n
33
- end
34
- end)
35
- end
36
- end
37
-
38
7
  # @param [#connection] engine
39
8
  # @param [Arel::Nodes::Node] a integer node
40
9
  # @param [Arel::Nodes::Node] b integer node
41
10
  # @return [Arel::Nodes::Node] a / b
42
11
  def integer_division(engine, a, b)
43
- if engine.connection.adapter_name =~ /mysql|mariadb/i
12
+ if /mysql|mariadb/i.match?(engine.connection.adapter_name)
44
13
  Arel::Nodes::InfixOperation.new('DIV', a, b)
45
14
  else
46
15
  Arel::Nodes::Division.new(a, b)
47
16
  end
48
17
  end
49
-
50
- if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 2 || Rails::VERSION::MAJOR > 5
51
- def true_value(_engine)
52
- true
53
- end
54
- else
55
- def true_value(engine)
56
- engine.connection.adapter_name =~ /sqlite|mysql|mariadb/i ? 1 : true
57
- end
58
- end
59
18
  end
60
19
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Thredded
4
- class BaseMigration < (Thredded.rails_gte_51? ? ActiveRecord::Migration[5.1] : ActiveRecord::Migration)
4
+ class BaseMigration < ActiveRecord::Migration[5.1]
5
5
  protected
6
6
 
7
7
  def user_id_type
@@ -15,7 +15,7 @@ module Thredded
15
15
 
16
16
  # @return [Integer, nil] the maximum number of codepoints that can be indexed for a primary key or index.
17
17
  def max_key_length
18
- return nil unless connection.adapter_name =~ /mysql|maria/i
18
+ return nil unless /mysql|maria/i.match?(connection.adapter_name)
19
19
  # Conservatively assume that innodb_large_prefix is **disabled**.
20
20
  # If it were enabled, the maximum key length would instead be 768 utf8mb4 characters.
21
21
  191