Rework KeywordMute interface to use a matcher object; spec out matcher. #164.
A matcher object that builds a match from KeywordMute data and runs it over text is, in my view, one of the easier ways to write examples for this sort of thing.
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
# frozen_string_literal: true
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: keyword_mutes
|
||||
@ -10,6 +11,34 @@
|
||||
#
|
||||
|
||||
class KeywordMute < ApplicationRecord
|
||||
def self.matches?(text)
|
||||
belongs_to :account, required: true
|
||||
|
||||
validates_presence_of :keyword
|
||||
|
||||
def self.matcher_for(account)
|
||||
Rails.cache.fetch("keyword_mutes:matcher:#{account}") { Matcher.new(account) }
|
||||
end
|
||||
|
||||
class Matcher
|
||||
attr_reader :regex
|
||||
|
||||
def initialize(account)
|
||||
re = String.new.tap do |str|
|
||||
scoped = KeywordMute.where(account: account)
|
||||
keywords = scoped.select(:id, :keyword)
|
||||
count = scoped.count
|
||||
|
||||
keywords.find_each.with_index do |kw, index|
|
||||
str << Regexp.escape(kw.keyword.strip)
|
||||
str << '|' if index < count - 1
|
||||
end
|
||||
end
|
||||
|
||||
@regex = /\b(?:#{re})\b/i unless re.empty?
|
||||
end
|
||||
|
||||
def =~(str)
|
||||
@regex ? @regex =~ str : false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user