excellent 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -104,6 +104,17 @@ You can get a list of the enabled checks and their configurations by running:
104
104
  excellent --checks
105
105
  ```
106
106
 
107
+ You can also place a `.excellent.yml` file in your home directory that contains default settings you always
108
+ want to apply. Settings in project-specific configuration files will override these default settings.
109
+
110
+ Excellent now also supports ignore paths. Simple place a `.excellentignore` file in the root directory of
111
+ your project and these directories will be ignored, e.g.:
112
+
113
+ ```
114
+ vendor
115
+ some/specific/file.rb
116
+ ```
117
+
107
118
  Static analysis
108
119
  ---------------
109
120
 
@@ -39,12 +39,23 @@ else
39
39
  formatter = Simplabs::Excellent::Formatters::Text.new
40
40
  end
41
41
 
42
- custom_config = {}
43
- config_file = File.join(Dir.pwd, '.excellent.yml')
44
- if File.exists?(config_file)
42
+ custom_config = {}
43
+ custom_config_file = File.join(Dir.pwd, '.excellent.yml')
44
+ default_config_file = File.join(File.expand_path('~'), '.excellent.yml')
45
+ if File.exists?(default_config_file) || File.exists?(custom_config_file)
45
46
  require 'yaml'
46
47
  begin
47
- custom_config = YAML.load(File.open(config_file)) || {}
48
+ default_config = if File.exists?(default_config_file)
49
+ YAML.load(File.open(default_config_file)) || {}
50
+ else
51
+ {}
52
+ end
53
+ custom_config = if File.exists?(custom_config_file)
54
+ YAML.load(File.open(custom_config_file)) || {}
55
+ else
56
+ {}
57
+ end
58
+ custom_config = default_config.merge(custom_config)
48
59
  config_valid = custom_config.is_a?(Hash) && custom_config.all? do |key, value|
49
60
  key.is_a?(String) || key.is_a?(Symbol)
50
61
  end
@@ -52,7 +63,7 @@ if File.exists?(config_file)
52
63
  config_valid = false
53
64
  end
54
65
  unless config_valid
55
- puts "\n ** The configuration in #{config_file} is not valid!\n\n"
66
+ puts "\n ** The configuration is not valid!\n\n"
56
67
  puts " Please make sure you specify a hash with check names as keys and hashes or truthy/falsy values as hash values, e.g.:\n\n"
57
68
  puts " AbcMetricMethodCheck:"
58
69
  puts " false"
@@ -63,6 +74,12 @@ if File.exists?(config_file)
63
74
  end
64
75
  end
65
76
 
77
+ ignore_paths = []
78
+ ignore_file = File.join(Dir.pwd, '.excellentignore')
79
+ if File.exists?(ignore_file)
80
+ ignore_paths = File.readlines(ignore_file).map(&:strip).select { |line| !line.empty? }
81
+ end
82
+
66
83
  excellent = Simplabs::Excellent::Runner.new(custom_config)
67
84
 
68
85
  if options[:print_checks]
@@ -76,7 +93,7 @@ if options[:print_checks]
76
93
  exit 0
77
94
  end
78
95
 
79
- paths = ARGV.dup
96
+ paths = ARGV.dup
80
97
  if paths.empty?
81
98
  puts "\n **You must specify one or more directories to analyse, e.g.:\n"
82
99
  puts "\n excellent lib/\n\n"
@@ -84,8 +101,9 @@ if paths.empty?
84
101
  end
85
102
 
86
103
  begin
87
- excellent.check_paths(paths, formatter)
88
- rescue ArgumentError
104
+ excellent.check_paths(paths, formatter, ignore_paths)
105
+ rescue ArgumentError => e
106
+ puts e.inspect
89
107
  puts "\n** Excellent cannot find the paths specified!\n\n"
90
108
  exit 1
91
109
  end
@@ -9,7 +9,7 @@ module Simplabs #:nodoc:
9
9
 
10
10
  module Excellent #:nodoc:
11
11
 
12
- VERSION = '2.0.1'
12
+ VERSION = '2.1.0'
13
13
 
14
14
  end
15
15
 
@@ -94,9 +94,10 @@ module Simplabs
94
94
  #
95
95
  # * <tt>paths</tt> - The paths to process (specify file names or directories; will recursively process all ruby files if a directory is given).
96
96
  # * <tt>formatter</tt> - The formatter to use. If a formatter is specified, its +start+, +file+, +warning+ and +end+ methods will be called
97
- def check_paths(paths, formatter = nil)
97
+ # * <tt>ignore_paths</tt> - The paths to ignore
98
+ def check_paths(paths, formatter = nil, ignore_paths = [])
98
99
  formatter.start if formatter
99
- collect_files(paths).each do |path|
100
+ collect_files(paths, ignore_paths).each do |path|
100
101
  check_file(path)
101
102
  format_file_and_warnings(formatter, path) if formatter
102
103
  end
@@ -130,8 +131,9 @@ module Simplabs
130
131
  check_objects
131
132
  end
132
133
 
133
- def collect_files(paths)
134
- files = []
134
+ def collect_files(paths, ignore_paths)
135
+ files = []
136
+ ignored_files = []
135
137
  paths.each do |path|
136
138
  if File.file?(path)
137
139
  files << path
@@ -141,7 +143,16 @@ module Simplabs
141
143
  raise ArgumentError.new("#{path} is neither a File nor a directory!")
142
144
  end
143
145
  end
144
- files
146
+ ignore_paths.each do |path|
147
+ if File.file?(path)
148
+ ignored_files << path
149
+ elsif File.directory?(path)
150
+ ignored_files += Dir.glob(File.join(path, '**/*.{rb,erb}'))
151
+ else
152
+ raise ArgumentError.new("#{path} is neither a File nor a directory!")
153
+ end
154
+ end
155
+ files - ignored_files
145
156
  end
146
157
 
147
158
  def format_file_and_warnings(formatter, filename)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excellent
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: