diff --git a/spec/ameba/cli/cmd_spec.cr b/spec/ameba/cli/cmd_spec.cr index a412c194..867b6d45 100644 --- a/spec/ameba/cli/cmd_spec.cr +++ b/spec/ameba/cli/cmd_spec.cr @@ -5,7 +5,7 @@ module Ameba::Cli describe "Cmd" do describe ".run" do it "runs ameba" do - r = Cli.run %w(-f silent file.cr) + r = Cli.run %w(-f silent -c spec/fixtures/config.yml spec/fixtures/source.cr) r.should be_nil end end @@ -43,12 +43,12 @@ module Ameba::Cli end it "defaults rules? flag to false" do - c = Cli.parse_args %w(file.cr) + c = Cli.parse_args %w(spec/fixtures/source.cr) c.rules?.should be_false end it "defaults skip_reading_config? flag to false" do - c = Cli.parse_args %w(file.cr) + c = Cli.parse_args %w(spec/fixtures/source.cr) c.skip_reading_config?.should be_false end @@ -58,7 +58,7 @@ module Ameba::Cli end it "defaults all? flag to false" do - c = Cli.parse_args %w(file.cr) + c = Cli.parse_args %w(spec/fixtures/source.cr) c.all?.should be_false end @@ -95,35 +95,35 @@ module Ameba::Cli describe "-e/--explain" do it "configures file/line/column" do - c = Cli.parse_args %w(--explain src/file.cr:3:5) + c = Cli.parse_args %w(--explain spec/fixtures/source.cr:3:5) location_to_explain = c.location_to_explain.should_not be_nil - location_to_explain[:file].should eq "src/file.cr" + location_to_explain[:file].should eq "spec/fixtures/source.cr" location_to_explain[:line].should eq 3 location_to_explain[:column].should eq 5 end it "raises an error if location is not valid" do expect_raises(Exception, "location should have PATH:line:column") do - Cli.parse_args %w(--explain src/file.cr:3) + Cli.parse_args %w(--explain spec/fixtures/source.cr:3) end end it "raises an error if line number is not valid" do expect_raises(Exception, "location should have PATH:line:column") do - Cli.parse_args %w(--explain src/file.cr:a:3) + Cli.parse_args %w(--explain spec/fixtures/source.cr:a:3) end end it "raises an error if column number is not valid" do expect_raises(Exception, "location should have PATH:line:column") do - Cli.parse_args %w(--explain src/file.cr:3:&) + Cli.parse_args %w(--explain spec/fixtures/source.cr:3:&) end end it "raises an error if line/column are missing" do expect_raises(Exception, "location should have PATH:line:column") do - Cli.parse_args %w(--explain src/file.cr) + Cli.parse_args %w(--explain spec/fixtures/source.cr) end end end diff --git a/spec/ameba/config_spec.cr b/spec/ameba/config_spec.cr index 1c1d10b2..036c458f 100644 --- a/spec/ameba/config_spec.cr +++ b/spec/ameba/config_spec.cr @@ -9,10 +9,21 @@ module Ameba end describe ".new" do - it "loads default globs when config is empty" do - yml = YAML.parse "{}" - config = Config.new(yml) - config.globs.should eq Config::DEFAULT_GLOBS + context "when config is empty" do + it "loads default globs" do + yml = YAML.parse "{}" + config = Config.new(yml) + config.globs.should eq ["**/*.cr"] + end + + it "sets !lib as a default glob when there are .cr files in lib" do + File.touch "lib/shard.cr" + yml = YAML.parse "{}" + config = Config.new(yml) + config.globs.should eq ["**/*.cr", "!lib"] + ensure + File.delete "lib/shard.cr" + end end it "initializes globs as string" do @@ -102,7 +113,7 @@ module Ameba config = Config.load config_sample it "holds source globs" do - config.globs.should eq Config::DEFAULT_GLOBS + config.globs.should eq ["**/*.cr"] end it "allows to set globs" do diff --git a/spec/ameba/glob_utils_spec.cr b/spec/ameba/glob_utils_spec.cr index 41309195..fc47bacd 100644 --- a/spec/ameba/glob_utils_spec.cr +++ b/spec/ameba/glob_utils_spec.cr @@ -45,6 +45,30 @@ module Ameba subject.expand(["**/#{current_file_basename}", "**/#{current_file_basename}"]) .should eq [current_file_path] end + + it "raises an ArgumentError when the glob doesn't match any files" do + expect_raises(ArgumentError, "No files found matching foo/*") do + subject.expand(["foo/*"]) + end + end + + it "raises an ArgumentError when given a missing file" do + expect_raises(ArgumentError, "No files found matching foo.cr") do + subject.expand(["foo.cr"]) + end + end + + it "raises an ArgumentError when given a missing directory" do + expect_raises(ArgumentError, "No files found matching foo/") do + subject.expand(["foo/"]) + end + end + + it "raises an ArgumentError when given multiple arguments, one of which is missing" do + expect_raises(ArgumentError, "No files found matching foo.cr") do + subject.expand(["**/#{current_file_basename}", "foo.cr"]) + end + end end end end diff --git a/spec/fixtures/config.yml b/spec/fixtures/config.yml index c5394b90..4cc49722 100644 --- a/spec/fixtures/config.yml +++ b/spec/fixtures/config.yml @@ -1,2 +1,4 @@ -Lint/ComparisonToBoolean: - Enabled: true +Ameba/PerfRule: + Enabled: false +Ameba/ErrorRule: + Enabled: false diff --git a/spec/fixtures/source.cr b/spec/fixtures/source.cr new file mode 100644 index 00000000..e69de29b diff --git a/src/ameba/config.cr b/src/ameba/config.cr index 821fa065..5030740c 100644 --- a/src/ameba/config.cr +++ b/src/ameba/config.cr @@ -55,10 +55,7 @@ class Ameba::Config Path[XDG_CONFIG_HOME] / "ameba/config.yml", } - DEFAULT_GLOBS = %w( - **/*.cr - !lib - ) + SOURCES_GLOB = "**/*.cr" getter rules : Array(Rule::Base) property severity = Severity::Convention @@ -95,7 +92,7 @@ class Ameba::Config @rules = Rule.rules.map &.new(config).as(Rule::Base) @rule_groups = @rules.group_by &.group @excluded = load_array_section(config, "Excluded") - @globs = load_array_section(config, "Globs", DEFAULT_GLOBS) + @globs = load_array_section(config, "Globs", default_globs) return unless formatter_name = load_formatter_name(config) self.formatter = formatter_name @@ -239,6 +236,12 @@ class Ameba::Config end end + private def default_globs + [SOURCES_GLOB].tap do |globs| + globs.push("!lib") unless Dir["lib/**/*.cr"].empty? + end + end + # :nodoc: module RuleConfig # Define rule properties diff --git a/src/ameba/glob_utils.cr b/src/ameba/glob_utils.cr index 71cd0cb5..df4e80bd 100644 --- a/src/ameba/glob_utils.cr +++ b/src/ameba/glob_utils.cr @@ -22,6 +22,7 @@ module Ameba def expand(globs) globs.flat_map do |glob| glob += "/**/*.cr" if File.directory?(glob) + raise ArgumentError.new("No files found matching #{glob}") if Dir[glob].empty? Dir[glob] end.uniq! end