Add Excluded property to the rule

This commit is contained in:
Vitalii Elenhaupt 2017-11-30 23:50:07 +02:00 committed by V. Elenhaupt
parent a1854c0aa3
commit 8bf5066d6a
8 changed files with 92 additions and 23 deletions

View File

@ -17,6 +17,10 @@ module Ameba::Rule
it "has a description property" do it "has a description property" do
subject.description.should_not be_nil subject.description.should_not be_nil
end end
it "has excluded property" do
subject.excluded.should be_nil
end
end end
describe "when a rule does not have defined properties" do describe "when a rule does not have defined properties" do

View File

@ -46,5 +46,24 @@ module Ameba
config.formatter.should eq formatter config.formatter.should eq formatter
end end
end end
describe "#update_rule" do
config = Config.load config_sample
it "updates enabled property" do
name = DummyRule.class_name
config.update_rule name, enabled: false
rule = config.rules.find(&.name.== name).not_nil!
rule.enabled.should be_false
end
it "updates excluded property" do
name = DummyRule.class_name
excluded = %w(spec/source.cr)
config.update_rule name, excluded: excluded
rule = config.rules.find(&.name.== name).not_nil!
rule.excluded.should eq excluded
end
end
end end
end end

View File

@ -1,43 +1,54 @@
require "../../spec_helper" require "../../spec_helper"
module Ameba module Ameba
private def create_todo(formatter) private def create_todo
s = Source.new "a = 1" file = IO::Memory.new
formatter = Formatter::TODOFormatter.new IO::Memory.new, file
s = Source.new "a = 1", "source.cr"
s.error DummyRule.new, s.location(1, 2), "message" s.error DummyRule.new, s.location(1, 2), "message"
formatter.finished [s] formatter.finished [s]
file.to_s
end end
describe Formatter::TODOFormatter do describe Formatter::TODOFormatter do
file = IO::Memory.new context "problems not found" do
subject = Formatter::TODOFormatter.new IO::Memory.new, file
context "problems not reported" do
it "does not create todo" do it "does not create todo" do
subject.finished [Source.new ""] file = IO::Memory.new
formatter = Formatter::TODOFormatter.new IO::Memory.new, file
formatter.finished [Source.new ""]
file.to_s.empty?.should be_true file.to_s.empty?.should be_true
end end
end end
context "problems reported" do context "problems found" do
it "creates a todo with header" do it "creates a valid YAML document" do
create_todo subject YAML.parse(create_todo).should_not be_nil
file.to_s.should contain "# This configuration file was generated by"
file.to_s.should contain "Ameba version #{VERSION}"
end end
it "creates a todo with rule name" do it "creates a todo with header" do
create_todo subject create_todo.should contain "# This configuration file was generated by"
file.to_s.should contain "DummyRule" end
it "creates a todo with version" do
create_todo.should contain "Ameba version #{VERSION}"
end
it "creates a todo with a rule name" do
create_todo.should contain "DummyRule"
end end
it "creates a todo with problems count" do it "creates a todo with problems count" do
create_todo subject create_todo.should contain "Problems found: 1"
file.to_s.should contain "Problems found: 1"
end end
it "creates a valid YAML document" do it "creates a todo with run details" do
create_todo subject create_todo.should contain "Run `ameba --only #{DummyRule.class_name}`"
YAML.parse(file.to_s).should_not be_nil end
it "excludes source from this rule" do
create_todo.should contain "Excluded:\n - source.cr"
end end
end end
end end

View File

@ -6,6 +6,8 @@ module Ameba
config.formatter = formatter config.formatter = formatter
config.files = files config.files = files
config.update_rule ErrorRule.class_name, enabled: false
Runner.new(config) Runner.new(config)
end end
@ -36,6 +38,19 @@ module Ameba
runner(formatter: formatter).run runner(formatter: formatter).run
formatter.finished_source.should_not be_nil formatter.finished_source.should_not be_nil
end end
it "skips rule check if source is excluded" do
path = "source.cr"
source = Source.new "", path
rules = ([] of Rule::Base).tap do |rules|
rule = ErrorRule.new
rule.excluded = [path]
rules << rule
end
Runner.new(rules, [source], formatter).run.success?.should be_true
end
end end
describe "#success?" do describe "#success?" do

View File

@ -11,6 +11,13 @@ module Ameba
end end
end end
struct ErrorRule < Rule::Base
def test(source)
source.error self, source.location(1, 1),
"This rule always adds an error"
end
end
class DummyFormatter < Formatter::BaseFormatter class DummyFormatter < Formatter::BaseFormatter
property started_sources : Array(Source)? property started_sources : Array(Source)?
property finished_sources : Array(Source)? property finished_sources : Array(Source)?

View File

@ -71,12 +71,13 @@ class Ameba::Config
# config.update_rule "MyRuleName", enabled: false # config.update_rule "MyRuleName", enabled: false
# ``` # ```
# #
def update_rule(name, enabled = true) def update_rule(name, enabled = true, excluded = nil)
index = @rules.index { |r| r.name == name } index = @rules.index { |r| r.name == name }
raise ArgumentError.new("Rule `#{name}` does not exist") unless index raise ArgumentError.new("Rule `#{name}` does not exist") unless index
rule = @rules[index] rule = @rules[index]
rule.enabled = enabled rule.enabled = enabled
rule.excluded = excluded
@rules[index] = rule @rules[index] = rule
end end
@ -140,6 +141,10 @@ class Ameba::Config
{% properties["enabled".id] = {key: "Enabled", default: true, type: Bool} %} {% properties["enabled".id] = {key: "Enabled", default: true, type: Bool} %}
{% end %} {% end %}
{% if properties["excluded".id] == nil %}
{% properties["excluded".id] = {key: "Excluded", type: "Array(String)?".id} %}
{% end %}
YAML.mapping({{properties}}) YAML.mapping({{properties}})
end end

View File

@ -21,6 +21,7 @@ module Ameba::Formatter
@io << header @io << header
rule_errors_map(errors).each do |rule, rule_errors| rule_errors_map(errors).each do |rule, rule_errors|
@io << "\n# Problems found: #{rule_errors.size}" @io << "\n# Problems found: #{rule_errors.size}"
@io << "\n# Run `ameba --only #{rule.name}` for details"
@io << rule_todo(rule, rule_errors).gsub("---", "") @io << rule_todo(rule, rule_errors).gsub("---", "")
end end
ensure ensure
@ -47,7 +48,11 @@ module Ameba::Formatter
end end
private def rule_todo(rule, errors) private def rule_todo(rule, errors)
rule.enabled = false rule.excluded =
errors.map(&.location.try &.filename.try &.to_s)
.compact
.uniq!
YAML.build do |yaml| YAML.build do |yaml|
yaml.mapping do yaml.mapping do
rule.name.to_yaml(yaml) rule.name.to_yaml(yaml)

View File

@ -57,7 +57,10 @@ module Ameba
@sources.each do |source| @sources.each do |source|
@formatter.source_started source @formatter.source_started source
@rules.each &.test(source) @rules.each do |rule|
next if rule.excluded.try &.any? &.== source.path
rule.test(source)
end
@formatter.source_finished source @formatter.source_finished source
end end