Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add regex filters #589

Merged
merged 7 commits into from
Jun 24, 2017
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions lib/simplecov/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -293,12 +293,10 @@ def add_group(group_name, filter_argument = nil, &filter_proc)
def parse_filter(filter_argument = nil, &filter_proc)
if filter_argument.is_a?(SimpleCov::Filter)
filter_argument
elsif filter_argument.is_a?(String)
SimpleCov::StringFilter.new(filter_argument)
elsif filter_proc
SimpleCov::BlockFilter.new(filter_proc)
elsif filter_argument.is_a?(Array)
SimpleCov::ArrayFilter.new(filter_argument)
elsif filter_argument
SimpleCov::Filter.class_for_argument(filter_argument).new(filter_argument)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool stuff! 👍

else
raise ArgumentError, "Please specify either a string or a block to filter with"
end
Expand Down
4 changes: 2 additions & 2 deletions lib/simplecov/defaults.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
SimpleCov.profiles.define "rails" do
load_profile "test_frameworks"

add_filter "/config/"
add_filter "/db/"
add_filter %r{^/config/}
add_filter %r{/^/db/}

add_group "Controllers", "app/controllers"
add_group "Channels", "app/channels" if defined?(ActionCable)
Expand Down
24 changes: 22 additions & 2 deletions lib/simplecov/filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,33 @@ def passes?(source_file)
warn "#{Kernel.caller.first}: [DEPRECATION] #passes? is deprecated. Use #matches? instead."
matches?(source_file)
end

def self.class_for_argument(filter_argument)
if filter_argument.is_a?(String)
SimpleCov::StringFilter
elsif filter_argument.is_a?(Regexp)
SimpleCov::RegexFilter
elsif filter_argument.is_a?(Array)
SimpleCov::ArrayFilter
else
raise ArgumentError, "You have provided an unrecognized filter type"
end
end
end

class StringFilter < SimpleCov::Filter
# Returns true when the given source file's filename matches the
# string configured when initializing this Filter with StringFilter.new('somestring)
def matches?(source_file)
(source_file.filename =~ /#{filter_argument}/)
(source_file.project_filename =~ /#{filter_argument}/)
end
end

class RegexFilter < SimpleCov::Filter
# Returns true when the given source file's filename matches the
# regex configured when initializing this Filter with RegexFilter.new(/someregex/)
def matches?(source_file)
(source_file.project_filename =~ filter_argument)
end
end

Expand All @@ -47,7 +67,7 @@ class ArrayFilter < SimpleCov::Filter
# configured when initializing this Filter with StringFilter.new(['some/path', 'other/path'])
def matches?(source_files_list)
filter_argument.any? do |arg|
source_files_list.filename =~ /#{arg}/
source_files_list.project_filename =~ /#{arg}/
end
end
end
Expand Down
6 changes: 6 additions & 0 deletions lib/simplecov/source_file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,12 @@ def initialize(filename, coverage)
@coverage = coverage
end

# The path to this source file relative to the projects directory
def project_filename
project_dir = File.dirname(File.expand_path(File.basename(__FILE__)))
@filename.sub(/^#{project_dir}/, "")
end

# The source code for this file. Aliased as :source
def src
# We intentionally read source code lazily to
Expand Down
40 changes: 40 additions & 0 deletions spec/filters_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,27 @@
expect(SimpleCov::StringFilter.new("sample.rb")).to be_matches subject
end

it "doesn't match a parent directory with a new SimpleCov::StringFilter" do
parent_dir_name = File.basename(File.expand_path("..", File.dirname(__FILE__)))
expect(SimpleCov::StringFilter.new(parent_dir_name)).not_to be_matches subject
end

it "matches a new SimpleCov::StringFilter '/fixtures/'" do
expect(SimpleCov::StringFilter.new("sample.rb")).to be_matches subject
end

it "matches a new SimpleCov::RegexFilter /\/fixtures\//" do
expect(SimpleCov::RegexFilter.new(/\/fixtures\//)).to be_matches subject
end

it "doesn't match a new SimpleCov::RegexFilter /^\/fixtures\//" do
expect(SimpleCov::RegexFilter.new(/^\/fixtures\//)).not_to be_matches subject
end

it "matches a new SimpleCov::RegexFilter /^\/spec\//" do
expect(SimpleCov::RegexFilter.new(/^\/spec\//)).to be_matches subject
end

it "doesn't match a new SimpleCov::BlockFilter that is not applicable" do
expect(SimpleCov::BlockFilter.new(proc { |s| File.basename(s.filename) == "foo.rb" })).not_to be_matches subject
end
Expand All @@ -46,6 +67,11 @@
expect(SimpleCov::ArrayFilter.new(["sample.rb", "other_file.rb"])).to be_matches subject
end

it "doesn't match a parent directory with a new SimpleCov::ArrayFilter" do
parent_dir_name = File.basename(File.expand_path("..", File.dirname(__FILE__)))
expect(SimpleCov::ArrayFilter.new([parent_dir_name])).not_to be_matches subject
end

context "with no filters set up and a basic source file in an array" do
before do
@prev_filters = SimpleCov.filters
Expand Down Expand Up @@ -94,5 +120,19 @@
expect(SimpleCov.filtered(subject)).to be_a SimpleCov::FileList
end
end

describe ".class_for_argument" do
it "returns SimpleCov::StringFilter for a string" do
expect(SimpleCov::Filter.class_for_argument("filestring")).to eq(SimpleCov::StringFilter)
end

it "returns SimpleCov::RegexFilter for a string" do
expect(SimpleCov::Filter.class_for_argument(/regex/)).to eq(SimpleCov::RegexFilter)
end

it "returns SimpleCov::RegexFilter for a string" do
expect(SimpleCov::Filter.class_for_argument(%w[file1 file2])).to eq(SimpleCov::ArrayFilter)
end
end
end
end
4 changes: 4 additions & 0 deletions spec/source_file_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
expect(subject.src).to eq(subject.source)
end

it "has a project filename which removes the project directory" do
expect(subject.project_filename).to eq("/spec/fixtures/sample.rb")
end

it "has source_lines equal to lines" do
expect(subject.lines).to eq(subject.source_lines)
end
Expand Down