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:
David Yip
2017-10-14 20:36:53 -05:00
parent 4745d6eeca
commit 603cf02b70
3 changed files with 91 additions and 12 deletions

View File

@ -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