diff --git a/LICENSE b/LICENSE index 5dde4558..f20c7be3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2017 Vitalii Elenhaupt +Copyright (c) 2018 Vitalii Elenhaupt Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/spec/ameba/cli/cmd_spec.cr b/spec/ameba/cli/cmd_spec.cr index 96967d50..c2f331fe 100644 --- a/spec/ameba/cli/cmd_spec.cr +++ b/spec/ameba/cli/cmd_spec.cr @@ -3,10 +3,6 @@ require "../../../src/ameba/cli/cmd" module Ameba::Cli describe "Cmd" do - it "has a list of available formatters" do - AVAILABLE_FORMATTERS.should_not be_nil - end - describe ".run" do it "runs ameba" do r = Cli.run %w(-f silent file.cr) @@ -58,7 +54,7 @@ module Ameba::Cli it "allows args to be blank" do c = Cli.parse_args [] of String - c.formatter.should eq :progress + c.formatter.should be_nil c.files.should be_nil c.only.should be_nil c.except.should be_nil diff --git a/spec/ameba/config_spec.cr b/spec/ameba/config_spec.cr index abd3a522..e760df56 100644 --- a/spec/ameba/config_spec.cr +++ b/spec/ameba/config_spec.cr @@ -4,6 +4,10 @@ module Ameba describe Config do config_sample = "config/ameba.yml" + it "should have a list of available formatters" do + Config::AVAILABLE_FORMATTERS.should_not be_nil + end + describe ".load" do it "loads custom config" do config = Config.load config_sample @@ -45,6 +49,17 @@ module Ameba config.formatter = formatter config.formatter.should eq formatter end + + it "allows to set formatter using a name" do + config.formatter = :progress + config.formatter.should_not be_nil + end + + it "raises an error if not available formatter is set" do + expect_raises(Exception) do + config.formatter = :no_such_formatter + end + end end describe "#update_rule" do diff --git a/src/ameba/cli/cmd.cr b/src/ameba/cli/cmd.cr index 63bd324e..286af8e2 100644 --- a/src/ameba/cli/cmd.cr +++ b/src/ameba/cli/cmd.cr @@ -5,13 +5,6 @@ require "option_parser" module Ameba::Cli extend self - AVAILABLE_FORMATTERS = { - progress: Formatter::DotFormatter, - todo: Formatter::TODOFormatter, - flycheck: Formatter::FlycheckFormatter, - silent: Formatter::BaseFormatter, - } - def run(args) opts = parse_args args config = Config.load opts.config @@ -28,7 +21,7 @@ module Ameba::Cli private class Opts property config = Config::PATH - property formatter : String | Symbol = :progress + property formatter : Symbol | String | Nil property files : Array(String)? property only : Array(String)? property except : Array(String)? @@ -49,7 +42,7 @@ module Ameba::Cli end parser.on("-f", "--format FORMATTER", - "Choose an output formatter: #{formatters}") do |formatter| + "Choose an output formatter: #{Config.formatter_names}") do |formatter| opts.formatter = formatter end @@ -86,17 +79,11 @@ module Ameba::Cli end private def configure_formatter(config, opts) - if cls = AVAILABLE_FORMATTERS[opts.formatter]? - config.formatter = cls.new - else - raise "Unknown formatter `#{opts.formatter}`. Use any of #{formatters}." + if name = opts.formatter + config.formatter = name end end - private def formatters - AVAILABLE_FORMATTERS.keys.join("|") - end - private def print_version puts VERSION exit 0 diff --git a/src/ameba/config.cr b/src/ameba/config.cr index a22ea51a..41a2635f 100644 --- a/src/ameba/config.cr +++ b/src/ameba/config.cr @@ -12,6 +12,13 @@ require "yaml" # By default config loads `.ameba.yml` file in a current directory. # class Ameba::Config + AVAILABLE_FORMATTERS = { + progress: Formatter::DotFormatter, + todo: Formatter::TODOFormatter, + flycheck: Formatter::FlycheckFormatter, + silent: Formatter::BaseFormatter, + } + PATH = ".ameba.yml" setter formatter : Formatter::BaseFormatter? setter files : Array(String)? @@ -22,6 +29,10 @@ class Ameba::Config # `Config.load` uses this constructor to instantiate new config by YAML file. protected def initialize(@config : YAML::Any) @rules = Rule.rules.map &.new(config) + + if @config.as_h? && (name = @config["Formatter"]?.try &.["Name"]?) + self.formatter = name.to_s + end end # Loads YAML configuration file by `path`. @@ -33,8 +44,12 @@ class Ameba::Config def self.load(path = PATH) content = File.exists?(path) ? File.read path : "" Config.new YAML.parse(content) - rescue - raise "Config file is invalid" + rescue e + raise "Config file is invalid: #{e.message}" + end + + def self.formatter_names + AVAILABLE_FORMATTERS.keys.join("|") end # Returns a list of paths (with wildcards) to files. @@ -64,6 +79,21 @@ class Ameba::Config @formatter ||= default_formatter end + # Sets formatter by name. + # + # ``` + # config = Ameba::Config.load + # config.formatter = :progress + # ``` + # + def formatter=(name : String | Symbol) + if f = AVAILABLE_FORMATTERS[name]? + @formatter = f.new + else + raise "Unknown formatter `#{name}`. Use one of #{Config.formatter_names}." + end + end + # Updates rule properties. # # ```