thredded 0.16.3 → 0.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70ed5d5d867753bfd5e7586702685ea7ccd08ec4a40413af3d61da3454188908
4
- data.tar.gz: 77c4526fbd5d779651f571112b8b22aef3557340d4fceee20feb0e9397b6c5fa
3
+ metadata.gz: c673448c2a6d28fb179142b35315e75444fce8dd02e7023ed2bacc044fb25fc6
4
+ data.tar.gz: 1a2c5185e9f7329ef66eba90964ee16a0acc5612721e028b37a065290a2b51f4
5
5
  SHA512:
6
- metadata.gz: 3ef7aebf6723efd1ecbce8dd49337e31aee80977ed2eda4b5a9cb07bf05118f2bb0087c513f3977948db5c46ff665aa5c90a016cfefcf16dc3744cf6f1a9398d
7
- data.tar.gz: e3030a49d320e4db4d5f97066dac4710837a63e638840f3e4dc9c3ab9dccf431897e4aaff642d4113922c9747c25193dc5965fa44a85a050cb5b9e2e16bee63a
6
+ metadata.gz: 9b63618a95b16216b1527b9317f6d016540692b6de92e2f915b7fb9806979ca480c4c2db6af0bbd7a4889b3b01152844d334a9999b77dd64f193f53c3b163406
7
+ data.tar.gz: 79fdbe8f94dce3f8519c3635016866ca294ecd11ea5fdceb93edc2df2df29f85c10663aee38c56c2153cf0c84220cb94306e5a9f49e7b32f5cecd9ad11e4c380
data/README.md CHANGED
@@ -95,7 +95,7 @@ Then, see the rest of this Readme for more information about using and customizi
95
95
  Add the gem to your Gemfile:
96
96
 
97
97
  ```ruby
98
- gem 'thredded', '~> 0.16.3'
98
+ gem 'thredded', '~> 0.16.4'
99
99
  ```
100
100
 
101
101
  Add the Thredded [initializer] to your parent app by running the install generator.
@@ -16,7 +16,8 @@ module Thredded
16
16
  Thredded::HtmlPipeline::AtMentionFilter.new(
17
17
  html,
18
18
  view_context: view_context,
19
- users_provider: ->(user_names) { @post.readers_from_user_names(user_names).to_a }
19
+ users_provider: ::Thredded::UsersProvider,
20
+ users_provider_scope: @post.readers
20
21
  ).mentioned_users
21
22
  end
22
23
  end
@@ -85,7 +85,8 @@ module Thredded
85
85
  # @param content_partial [String]
86
86
  def render_posts(posts, partial: 'thredded/posts/post', content_partial: 'thredded/posts/content', locals: {})
87
87
  posts_with_contents = render_collection_to_strings_with_cache(
88
- partial: content_partial, collection: posts, as: :post, expires_in: 1.week
88
+ partial: content_partial, collection: posts, as: :post, expires_in: 1.week,
89
+ locals: { options: { users_provider: ::Thredded::UsersProviderWithCache.new } }
89
90
  )
90
91
  render partial: partial, collection: posts_with_contents, as: :post_and_content, locals: locals
91
92
  end
@@ -33,22 +33,16 @@ module Thredded
33
33
 
34
34
  # @param view_context [Object] the context of the rendering view.
35
35
  # @return [String] formatted and sanitized html-safe post content.
36
- def filtered_content(view_context, users_provider: ->(names) { readers_from_user_names(names) }, **options)
37
- Thredded::ContentFormatter.new(view_context, users_provider: users_provider, **options).format_content(content)
36
+ def filtered_content(view_context, users_provider: ::Thredded::UsersProvider, **options)
37
+ Thredded::ContentFormatter.new(
38
+ view_context, users_provider: users_provider, users_provider_scope: readers, **options
39
+ ).format_content(content)
38
40
  end
39
41
 
40
42
  def first_post_in_topic?
41
43
  postable.first_post == self
42
44
  end
43
45
 
44
- # @return [ActiveRecord::Relation<Thredded.user_class>] users from the list of user names that can read this post.
45
- # @api private
46
- def readers_from_user_names(user_names)
47
- DbTextSearch::CaseInsensitive
48
- .new(readers, Thredded.user_name_column)
49
- .in(user_names)
50
- end
51
-
52
46
  # Marks all the posts from the given one as unread for the given user
53
47
  # @param [Thredded.user_class] user
54
48
  def mark_as_unread(user)
@@ -23,6 +23,7 @@ require 'thredded/html_pipeline/kramdown_filter'
23
23
  require 'thredded/html_pipeline/onebox_filter'
24
24
  require 'thredded/html_pipeline/wrap_iframes_filter'
25
25
  require 'thredded/html_pipeline/spoiler_tag_filter'
26
+ require 'thredded/users_provider'
26
27
 
27
28
  # Asset compilation
28
29
  require 'autoprefixer-rails'
@@ -10,6 +10,7 @@ module Thredded
10
10
  def initialize(doc, context = nil, result = nil)
11
11
  super doc, context, result
12
12
  @users_provider = context[:users_provider]
13
+ @users_provider_scope = context[:users_provider_scope]
13
14
  @view_context = context[:view_context]
14
15
  end
15
16
 
@@ -30,7 +31,7 @@ module Thredded
30
31
  names = []
31
32
  process_text_nodes! { |node| names.concat mentioned_names(node.to_html) }
32
33
  names.uniq!
33
- @users_provider.call(names)
34
+ @users_provider.call(names, @users_provider_scope)
34
35
  end
35
36
 
36
37
  private
@@ -43,8 +44,8 @@ module Thredded
43
44
 
44
45
  def highlight!(text_node_html)
45
46
  names = mentioned_names(text_node_html)
46
- return if names.blank?
47
- @users_provider.call(names).each do |user|
47
+ return if names.blank? || @users_provider.nil?
48
+ @users_provider.call(names, @users_provider_scope).each do |user|
48
49
  name = user.thredded_display_name
49
50
  maybe_quoted_name = name =~ /[., ()]/ ? %("#{name}") : name
50
51
  url = Thredded.user_path(@view_context, user)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Thredded
4
+ module UsersProvider
5
+ module_function
6
+
7
+ def call(user_names, scope)
8
+ DbTextSearch::CaseInsensitive
9
+ .new(scope, Thredded.user_name_column)
10
+ .in(user_names)
11
+ end
12
+ end
13
+
14
+ class UsersProviderWithCache
15
+ def initialize
16
+ @mutex = Mutex.new
17
+ @cache = {}
18
+ end
19
+
20
+ def call(names, scope)
21
+ # This is not the same as the database lowercasing but it's OK.
22
+ # The worst that can happen is some cache misses.
23
+ names_with_lowercase = names.zip(names.map(&:downcase))
24
+ cached = uncached = nil
25
+ result = @mutex.synchronize do
26
+ scope_cache = (@cache[scope.to_sql] ||= {})
27
+ cached, uncached = names_with_lowercase.partition { |(_, lowercase)| scope_cache.key?(lowercase) }
28
+ fetched = UsersProvider.call(uncached.map(&:first), scope)
29
+ fetched.each do |user|
30
+ scope_cache[user.send(Thredded.user_name_column).downcase] = user
31
+ end
32
+ cached.map { |(_, lowercase)| scope_cache[lowercase] }.concat(fetched)
33
+ end
34
+ result.uniq!
35
+ result.compact!
36
+ Rails.logger.info(
37
+ " [Thredded::UsersProviderWithCache] #{names.size} user names => #{result.size} users "\
38
+ "(#{cached.size} cached, #{uncached.size} uncached)"
39
+ )
40
+ result
41
+ end
42
+ end
43
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Thredded
4
- VERSION = '0.16.3'
4
+ VERSION = '0.16.4'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thredded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.3
4
+ version: 0.16.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Oliveira
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-12-03 00:00:00.000000000 Z
12
+ date: 2019-01-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active_record_union
@@ -1043,6 +1043,7 @@ files:
1043
1043
  - lib/thredded/html_pipeline/utils.rb
1044
1044
  - lib/thredded/html_pipeline/wrap_iframes_filter.rb
1045
1045
  - lib/thredded/rails_lt_5_2_arel_case_node.rb
1046
+ - lib/thredded/users_provider.rb
1046
1047
  - lib/thredded/version.rb
1047
1048
  - lib/thredded/view_hooks/config.rb
1048
1049
  - lib/thredded/view_hooks/renderer.rb