Disable performance rules for spec files

closes #220
This commit is contained in:
Vitalii Elenhaupt 2021-04-15 17:26:49 +03:00
parent 7c586eb9e5
commit 9e2d4f1856
No known key found for this signature in database
GPG key ID: CD0BF17825928BC0
22 changed files with 134 additions and 1 deletions

View file

@ -8,6 +8,17 @@ module Ameba::Rule
rules.should_not be_nil
rules.should contain DummyRule
end
it "contains rules across all the available groups" do
Rule.rules.map(&.group_name).uniq!.reject!(&.empty?).sort.should eq %w(
Ameba
Layout
Lint
Metrics
Performance
Style
)
end
end
context "properties" do

View file

@ -22,6 +22,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
[1, 2, 3].select { |e| e > 2 }.any?
), "source_spec.cr"
subject.catch(source).should be_valid
end
it "reports if there is reject followed by any? without a block" do
source = Source.new %(
[1, 2, 3].reject { |e| e > 2 }.any?

View file

@ -21,6 +21,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
[1, 2, 3].any?
), "source_spec.cr"
subject.catch(source).should be_valid
end
context "macro" do
it "reports in macro scope" do
source = Source.new %(

View file

@ -0,0 +1,19 @@
require "../../../spec_helper"
module Ameba::Rule::Performance
describe Base do
subject = PerfRule.new
describe "#catch" do
it "ignores spec files" do
source = Source.new("", "source_spec.cr")
subject.catch(source).should be_valid
end
it "reports perf issues for non-spec files" do
source = Source.new("", "source.cr")
subject.catch(source).should_not be_valid
end
end
end
end

View file

@ -23,6 +23,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
[1, 2, 3].select { |e| e > 1 }.reverse
), "source_spec.cr"
subject.catch(source).should be_valid
end
it "reports if there is select followed by reverse followed by other call" do
source = Source.new %(
[1, 2, 3].select { |e| e > 2 }.reverse.size

View file

@ -25,6 +25,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
(1..3).map(&.itself).compact
), "source_spec.cr"
subject.catch(source).should be_valid
end
context "macro" do
it "doesn't report in macro scope" do
source = Source.new %(

View file

@ -22,6 +22,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
[1, 2, 3].select { |e| e > 2 }.last
), "source_spec.cr"
subject.catch(source).should be_valid
end
it "reports if there is select followed by last?" do
source = Source.new %(
[1, 2, 3].select { |e| e > 2 }.last?

View file

@ -18,6 +18,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report is source is a spec" do
source = Source.new %(
%w[Alice Bob].map(&.chars).flatten
), "source_spec.cr"
subject.catch(source).should be_valid
end
context "macro" do
it "doesn't report in macro scope" do
source = Source.new %(

View file

@ -19,6 +19,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
(1..3).map(&.to_s).join
), "source_spec.cr"
subject.catch(source).should be_valid
end
it "reports if there is map followed by sum without a block (with argument)" do
source = Source.new %(
(1..3).map(&.to_u64).sum(0)

View file

@ -24,6 +24,13 @@ module Ameba::Rule::Performance
subject.catch(source).should_not be_valid
end
it "does not report if source is a spec" do
source = Source.new %(
[1, 2, 3].select { |e| e > 2 }.size
), "source_spec.cr"
subject.catch(source).should be_valid
end
it "reports if there is a reject followed by size" do
source = Source.new %(
[1, 2, 3].reject { |e| e < 2 }.size

View file

@ -7,6 +7,7 @@ module Ameba
config.globs = files
config.update_rule ErrorRule.rule_name, enabled: false
config.update_rule PerfRule.rule_name, enabled: false
Runner.new(config)
end

View file

@ -107,6 +107,16 @@ module Ameba
end
end
class PerfRule < Rule::Performance::Base
properties do
description : String = "Sample performance rule"
end
def test(source)
issue_for({1, 1}, "Poor performance")
end
end
class DummyFormatter < Formatter::BaseFormatter
property started_sources : Array(Source)?
property finished_sources : Array(Source)?

View file

@ -128,6 +128,16 @@ module Ameba::Rule
{{ @type.subclasses }}
end
protected def self.abstract?
{{ @type.abstract? }}
end
protected def self.inherited_rules
subclasses.each_with_object([] of Base.class) do |klass, obj|
klass.abstract? ? obj.concat(klass.inherited_rules) : (obj << klass)
end
end
macro inherited
protected def self.path_to_source_file
__FILE__
@ -188,6 +198,6 @@ module Ameba::Rule
# Ameba::Rule.rules # => [Rule1, Rule2, ....]
# ```
def self.rules
Base.subclasses
Base.inherited_rules
end
end

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of `any?` calls that follow filters.
#

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of arg-less `Enumerable#any?` calls.
#

View file

@ -0,0 +1,10 @@
require "../base"
module Ameba::Rule::Performance
# A general base class for performance rules.
abstract class Base < Ameba::Rule::Base
def catch(source : Source)
source.spec? ? source : super
end
end
end

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of chained calls not utilizing
# the bang method variants.

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of `compact` calls that follow `map`.
#

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of `first/last/first?/last?` calls that follow filters.
#

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of `flatten` calls that follow `map`.
#

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of `sum/product` calls
# that follow `map`.

View file

@ -1,3 +1,5 @@
require "./base"
module Ameba::Rule::Performance
# This rule is used to identify usage of `size` calls that follow filter.
#