From 7e8703dda0537ea80c974e7c2b58d2b8f54b8415 Mon Sep 17 00:00:00 2001 From: Vitalii Elenhaupt Date: Sun, 24 Dec 2017 23:32:14 +0200 Subject: [PATCH] Crystal 0.24.1 support --- spec/ameba/rule/base_spec.cr | 2 +- spec/ameba/rule/duplicated_when_spec.cr | 118 --------------------- spec/ameba/rule/empty_expression_spec.cr | 2 +- spec/ameba/rule/shadowed_exception_spec.cr | 3 +- src/ameba/formatter/todo_formatter.cr | 13 ++- src/ameba/rule/duplicated_when.cr | 55 ---------- 6 files changed, 12 insertions(+), 181 deletions(-) delete mode 100644 spec/ameba/rule/duplicated_when_spec.cr delete mode 100644 src/ameba/rule/duplicated_when.cr diff --git a/spec/ameba/rule/base_spec.cr b/spec/ameba/rule/base_spec.cr index 2f12a4e3..81e0c6bd 100644 --- a/spec/ameba/rule/base_spec.cr +++ b/spec/ameba/rule/base_spec.cr @@ -1,4 +1,4 @@ -require "../../spec/spec_helper" +require "../../spec_helper" module Ameba describe Rule::Base do diff --git a/spec/ameba/rule/duplicated_when_spec.cr b/spec/ameba/rule/duplicated_when_spec.cr deleted file mode 100644 index e7dd1bb2..00000000 --- a/spec/ameba/rule/duplicated_when_spec.cr +++ /dev/null @@ -1,118 +0,0 @@ -require "../../spec_helper" - -module Ameba::Rule - describe DuplicatedWhen do - subject = DuplicatedWhen.new - - it "passes if there are no duplicated when conditions in the case" do - s = Source.new %( - case x - when "first" - do_something - when "second" - do_something_else - end - - case x - when Integer then :one - when Int32, String then :two - end - - case {value1, value2} - when {0, _} - when {_, 0} - end - - case x - when .odd? - when .even? - end - - case - when Integer then :one - when Integer | String then :two - end - - case x - when :one - when "one" - end - - case {value1, value2} - when {String, String} - end - ) - subject.catch(s).should be_valid - end - - it "fails if there is a duplicated when condition in the case" do - s = Source.new %( - case x - when .starts_with?("pattern1") - do_something1 - when .starts_with?("pattern2") - do_something2 - when .starts_with?("pattern1") - do_something3 - end - ) - subject.catch(s).should_not be_valid - end - - it "fails if there are multiple when conditions with nil" do - s = Source.new %( - case x - when nil - say_hello - when nil - say_nothing - end - ) - subject.catch(s).should_not be_valid - end - - it "fails if there are multiple whens with is_a? conditions" do - s = Source.new %( - case x - when String then say_hello - when Integer then say_nothing - when String then blah - end - ) - subject.catch(s).should_not be_valid - end - - it "fails if there are duplicated whens but in difference order" do - s = Source.new %( - case x - when String, Integer then something - when Integer then blah - end - ) - subject.catch(s).should_not be_valid - end - - it "fails if there are duplicated conditions in one when" do - s = Source.new %( - case x - when String, String then something - end - ) - subject.catch(s).should_not be_valid - end - - it "reports rule, location and message" do - s = Source.new %q( - case x - when "first" - when "first" - end - ), "source.cr" - subject.catch(s).should_not be_valid - error = s.errors.first - error.rule.should_not be_nil - error.location.to_s.should eq "source.cr:2:9" - error.message.should eq "Duplicated when conditions in case" - end - end -end diff --git a/spec/ameba/rule/empty_expression_spec.cr b/spec/ameba/rule/empty_expression_spec.cr index 43747317..05b1e60a 100644 --- a/spec/ameba/rule/empty_expression_spec.cr +++ b/spec/ameba/rule/empty_expression_spec.cr @@ -104,7 +104,7 @@ module Ameba error = s.errors.first error.rule.should_not be_nil error.location.to_s.should eq "source.cr:2:12" - error.message.should eq "Avoid empty expression '()'" + error.message.should eq "Avoid empty expressions" end end end diff --git a/spec/ameba/rule/shadowed_exception_spec.cr b/spec/ameba/rule/shadowed_exception_spec.cr index 9779944b..366743b9 100644 --- a/spec/ameba/rule/shadowed_exception_spec.cr +++ b/spec/ameba/rule/shadowed_exception_spec.cr @@ -158,6 +158,7 @@ module Ameba::Rule it "reports rule, location and a message" do s = Source.new %q( begin + do_something rescue Exception | IndexError end ), "source.cr" @@ -165,7 +166,7 @@ module Ameba::Rule error = s.errors.first error.rule.should_not be_nil - error.location.to_s.should eq "source.cr:2:9" + error.location.to_s.should eq "source.cr:3:11" error.message.should eq( "Exception handler has shadowed exceptions: IndexError" ) diff --git a/src/ameba/formatter/todo_formatter.cr b/src/ameba/formatter/todo_formatter.cr index f6557338..10926076 100644 --- a/src/ameba/formatter/todo_formatter.cr +++ b/src/ameba/formatter/todo_formatter.cr @@ -53,11 +53,14 @@ module Ameba::Formatter .compact .uniq! - YAML.build do |yaml| - yaml.mapping do - rule.name.to_yaml(yaml) - rule.to_yaml(yaml) - end + nodes_builder = YAML::Nodes::Builder.new + nodes_builder.mapping do + rule.name.to_yaml nodes_builder + rule.to_yaml nodes_builder + end + + YAML.build do |builder| + nodes_builder.document.to_yaml(builder) end end end diff --git a/src/ameba/rule/duplicated_when.cr b/src/ameba/rule/duplicated_when.cr deleted file mode 100644 index 0cfab1e9..00000000 --- a/src/ameba/rule/duplicated_when.cr +++ /dev/null @@ -1,55 +0,0 @@ -module Ameba::Rule - # A rule that disallows duplicated when conditions in case. - # - # This is considered invalid: - # - # ``` - # case a - # when "first" - # do_something - # when "first" - # do_somehting_else - # end - # ``` - # - # And it should be written as follows: - # - # ``` - # case a - # when "first" - # do_something - # when "second" - # do_somehting_else - # end - # ``` - # - # YAML configuration example: - # - # ``` - # DuplicatedWhen: - # Enabled: true - # ``` - # - struct DuplicatedWhen < Base - properties do - description = "Disallows duplicated when conditions in case" - end - - def test(source) - AST::Visitor.new self, source - end - - def test(source, node : Crystal::Case) - return unless duplicated_whens?(node.whens) - - source.error self, node.location, "Duplicated when conditions in case" - end - - private def duplicated_whens?(whens) - whens.map(&.conds.map &.to_s) - .flatten - .group_by(&.itself) - .any? { |_, v| v.size > 1 } - end - end -end