Allow to configure formatter via configuration file

closes #20
This commit is contained in:
Vitalii Elenhaupt 2018-01-25 16:40:32 +02:00
parent bfe18f4a77
commit 1d436fbb94
No known key found for this signature in database
GPG Key ID: 7558EF3A4056C706
5 changed files with 53 additions and 25 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.
#
# ```