diff --git a/spec/ameba/rule/naming/filename_spec.cr b/spec/ameba/rule/naming/filename_spec.cr new file mode 100644 index 00000000..5673aa91 --- /dev/null +++ b/spec/ameba/rule/naming/filename_spec.cr @@ -0,0 +1,19 @@ +require "../../../spec_helper" + +module Ameba::Rule::Naming + subject = Filename.new + + describe Filename do + it "passes if filename is correct" do + expect_no_issues subject, code: "", path: "src/foo.cr" + expect_no_issues subject, code: "", path: "src/foo_bar.cr" + end + + it "fails if filename is wrong" do + expect_issue subject, <<-CRYSTAL, path: "src/fooBar.cr" + + # ^{} error: Filename should be underscore-cased: foo_bar.cr, not fooBar.cr + CRYSTAL + end + end +end diff --git a/src/ameba/rule/naming/filename.cr b/src/ameba/rule/naming/filename.cr new file mode 100644 index 00000000..1c73b767 --- /dev/null +++ b/src/ameba/rule/naming/filename.cr @@ -0,0 +1,28 @@ +module Ameba::Rule::Naming + # A rule that enforces file names to be in underscored case. + # + # YAML configuration example: + # + # ``` + # Naming/Filename: + # Enabled: true + # ``` + class Filename < Base + properties do + description "Enforces file names to be in underscored case" + end + + MSG = "Filename should be underscore-cased: %s, not %s" + + private LOCATION = {1, 1} + + def test(source : Source) + path = Path[source.path] + name = path.basename + + return if (expected = name.underscore) == name + + issue_for LOCATION, MSG % {expected, name} + end + end +end