lib/rspec_tracer/filter.rb
# frozen_string_literal: true
module RSpecTracer
class Filter
attr_reader :filter
def initialize(filter)
@filter = filter
end
def match?(_source_file)
raise "#{self.class.name}#match? is not intended for direct use"
end
def self.register(filter)
return filter if filter.is_a?(Filter)
filter_class(filter).new(filter)
end
def self.filter_class(filter)
case filter
when String
StringFilter
when Regexp
RegexFilter
when Proc
BlockFilter
when Array
ArrayFilter
else
raise ArgumentError, 'Unknow filter'
end
end
end
class ArrayFilter < RSpecTracer::Filter
def initialize(filters)
filter_list = filters.each_with_object([]) do |filter, list|
list << Filter.register(filter)
end
super(filter_list)
end
def match?(source_file)
@filter.any? { |filter| filter.match?(source_file) }
end
end
class BlockFilter < RSpecTracer::Filter
def match?(source_file)
@filter.call(source_file)
end
end
class RegexFilter < RSpecTracer::Filter
def match?(source_file)
source_file[:file_name] =~ @filter
end
end
class StringFilter < RSpecTracer::Filter
def match?(source_file)
source_file[:file_name].include?(@filter)
end
end
end