diff --git a/README.md b/README.md index 924b3791..006311b5 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,29 @@ engines: - examples/ ``` +### Custom file name patterns + +All engines check only appropriate files but you can override default set of +patterns. Patterns are ran aginast the project root direcory so you have to use +`**` to match files in nested directories. Also note that you have to specify +all patterns, not only the one you want to add. + +```yml +engines: + duplication: + enabled: true + config: + languages: + ruby: + patterns: + - "**/*.rb + - "**/*.rake" + - "Rakefile" + - "**/*.ruby" +``` + + + [codeclimate]: https://codeclimate.com/dashboard [what-is-duplication]: https://docs.codeclimate.com/docs/duplication-concept [flay]: https://github.com/seattlerb/flay diff --git a/lib/cc/engine/analyzers/analyzer_base.rb b/lib/cc/engine/analyzers/analyzer_base.rb index 46a0971d..46f2ce24 100644 --- a/lib/cc/engine/analyzers/analyzer_base.rb +++ b/lib/cc/engine/analyzers/analyzer_base.rb @@ -70,7 +70,10 @@ def process_file(path) def file_list @_file_list ||= ::CC::Engine::Analyzers::FileList.new( engine_config: engine_config, - patterns: self.class::PATTERNS, + patterns: engine_config.patterns_for( + self.class::LANGUAGE, + self.class::PATTERNS, + ), ) end diff --git a/lib/cc/engine/analyzers/engine_config.rb b/lib/cc/engine/analyzers/engine_config.rb index 7bc29124..a3833f6b 100644 --- a/lib/cc/engine/analyzers/engine_config.rb +++ b/lib/cc/engine/analyzers/engine_config.rb @@ -55,6 +55,10 @@ def fetch_language(language) end end + def patterns_for(language, fallbacks) + Array(fetch_language(language).fetch("patterns", fallbacks)) + end + private attr_reader :config diff --git a/spec/cc/engine/analyzers/analyzer_base_spec.rb b/spec/cc/engine/analyzers/analyzer_base_spec.rb new file mode 100644 index 00000000..8a6344ca --- /dev/null +++ b/spec/cc/engine/analyzers/analyzer_base_spec.rb @@ -0,0 +1,76 @@ +require 'spec_helper' +require 'cc/engine/analyzers/analyzer_base' +require 'cc/engine/analyzers/engine_config' +require 'cc/engine/analyzers/file_list' + +module CC::Engine::Analyzers + RSpec.describe Base, in_tmpdir: true do + class DummyAnalyzer < Base + LANGUAGE = "dummy" + PATTERNS = [ + '**/*.a', + '**/*.b' + ] + end + + include AnalyzerSpecHelpers + + let(:engine_config) { EngineConfig.new({}) } + let(:analyzer) { DummyAnalyzer.new(engine_config: engine_config) } + + before(:each) do + create_source_file("foo.a", "") + create_source_file("foo.b", "") + create_source_file("foo.c", "") + end + + it "lists files according to the default patterns" do + expect(analyzer.files).to match_array(['./foo.a', './foo.b']) + end + + context "with custom patterns" do + let(:engine_config) do + EngineConfig.new({ + "config" => { + "languages" => { + "dummy" => { + "patterns" => [ + "**/*.c" + ], + }, + }, + }, + }) + end + + it "lists files according to the config patterns" do + expect(analyzer.files).to match_array(['./foo.c']) + end + end + + context "exact pattern" do + let(:engine_config) do + EngineConfig.new({ + "config" => { + "languages" => { + "dummy" => { + "patterns" => [ + "*.c" + ], + }, + }, + }, + }) + end + + before(:each) do + Dir.mkdir("nested") + create_source_file("nested/foo.c", "") + end + + it "lists files exactly according to the config patterns" do + expect(analyzer.files).to match_array(['./foo.c']) + end + end + end +end diff --git a/spec/cc/engine/analyzers/engine_config_spec.rb b/spec/cc/engine/analyzers/engine_config_spec.rb index 0c168911..e94cefd9 100644 --- a/spec/cc/engine/analyzers/engine_config_spec.rb +++ b/spec/cc/engine/analyzers/engine_config_spec.rb @@ -202,4 +202,30 @@ expect(engine_config.debug?).to eq(false) end end + + describe "#patterns_for" do + it "returns patterns for specified language" do + engine_config = CC::Engine::Analyzers::EngineConfig.new({ + "config" => { + "languages" => { + "fancy" => { + "patterns" => [ + "**/*.fancy" + ], + }, + }, + }, + }) + + expect(engine_config.patterns_for("fancy", [])) + .to match_array(["**/*.fancy"]) + end + + it "returns fallback patterns for missing language" do + engine_config = CC::Engine::Analyzers::EngineConfig.new({}) + + expect(engine_config.patterns_for("fancy", ["**/*.fancy"])) + .to match_array(["**/*.fancy"]) + end + end end