maximus 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +99 -12
- data/lib/maximus/cli.rb +39 -20
- data/lib/maximus/config/maximus-example.yml +129 -0
- data/lib/maximus/config/maximus.yml +2 -0
- data/lib/maximus/config.rb +329 -0
- data/lib/maximus/git_control.rb +29 -47
- data/lib/maximus/helper.rb +10 -23
- data/lib/maximus/lint.rb +47 -26
- data/lib/maximus/lints/brakeman.rb +5 -2
- data/lib/maximus/lints/jshint.rb +7 -2
- data/lib/maximus/lints/railsbp.rb +5 -2
- data/lib/maximus/lints/rubocop.rb +5 -2
- data/lib/maximus/lints/scsslint.rb +4 -2
- data/lib/maximus/statistic.rb +23 -23
- data/lib/maximus/statistics/phantomas.rb +12 -7
- data/lib/maximus/statistics/stylestats.rb +20 -21
- data/lib/maximus/statistics/wraith.rb +34 -60
- data/lib/maximus/version.rb +1 -1
- data/lib/maximus.rb +1 -1
- data/maximus.gemspec +6 -6
- data/roadmap.md +2 -1
- metadata +25 -30
- data/lib/maximus/config/.jshintignore +0 -2
- data/lib/maximus/config/jshint.json +0 -9
- data/lib/maximus/config/phantomas.json +0 -4
- data/lib/maximus/config/phantomas_urls.yaml +0 -1
- data/lib/maximus/config/scsslint.yml +0 -58
- data/lib/maximus/config/stylestats.json +0 -30
- data/lib/maximus/config/wraith.yaml +0 -56
- data/lib/maximus/constants.rb +0 -5
@@ -0,0 +1,329 @@
|
|
1
|
+
module Maximus
|
2
|
+
# @since 0.1.3
|
3
|
+
# @attr_reader settings [Hash] all the options
|
4
|
+
# @attr_reader temp_files [Hash] Filename without extension => path to temp file
|
5
|
+
class Config
|
6
|
+
|
7
|
+
include Helper
|
8
|
+
|
9
|
+
attr_reader :settings, :temp_files
|
10
|
+
|
11
|
+
# Global options for all of maximus
|
12
|
+
#
|
13
|
+
# @param opts [Hash] options passed directly to config
|
14
|
+
# @option opts [Boolean] :is_dev (false) whether or not the class was initialized from the command line
|
15
|
+
# @option opts [String, Boolean, nil] :log ('log/maximus_git.log') path to log file
|
16
|
+
# If not set, logger outputs to STDOUT
|
17
|
+
# @option opts [String, Boolean] :git_log (false) path to log file or don't log
|
18
|
+
# The git gem is very noisey
|
19
|
+
# @option opts [String] :root_dir base directory
|
20
|
+
# @option opts [String] :domain ('http://localhost:3000') the host - used for Statistics
|
21
|
+
# @option opts [String, Integer] :port ('') port number - used for Statistics
|
22
|
+
# and appended to domain. If blank (false, empty string, etc.), will not
|
23
|
+
# append to domain
|
24
|
+
# @option opts [String, Array] :file_paths ('') path to files. Accepts glob notation
|
25
|
+
# @option opts [Hash] :paths ({home: '/'}) labeled relative path to URLs. Statistics only
|
26
|
+
# @option opts [String] :commit accepts sha, "working", "last", or "master".
|
27
|
+
# @option opts [String] :config_file ('maximus.yml') path to config file
|
28
|
+
# @return [void] this method is used to set up instance variables
|
29
|
+
def initialize(opts = {})
|
30
|
+
opts[:is_dev] ||= false
|
31
|
+
|
32
|
+
# Only set log file if it's set to true.
|
33
|
+
# Otherwise, allow it to be nil or a path
|
34
|
+
opts[:log] = 'log/maximus.log' if opts[:log].is_a?(TrueClass)
|
35
|
+
|
36
|
+
opts[:git_log] = false if opts[:git_log].nil?
|
37
|
+
opts[:git_log] = 'log/maximus_git.log' if opts[:git_log].is_a?(TrueClass)
|
38
|
+
|
39
|
+
# @see Helper#root_dir
|
40
|
+
opts[:root_dir] ||= root_dir
|
41
|
+
opts[:domain] ||= 'http://localhost'
|
42
|
+
opts[:port] ||= is_rails? ? 3000 : ''
|
43
|
+
opts[:paths] ||= { 'home' => '/' }
|
44
|
+
|
45
|
+
# Accounting for space-separated command line arrays
|
46
|
+
if opts[:paths].is_a?(Array)
|
47
|
+
new_paths = {}
|
48
|
+
opts[:paths].each do |p|
|
49
|
+
if p.split('/').length > 1
|
50
|
+
new_paths[p.split('/').last.to_s] = p
|
51
|
+
else
|
52
|
+
new_paths['home'] = '/'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
opts[:paths] = new_paths
|
56
|
+
end
|
57
|
+
|
58
|
+
# What we're really interested in
|
59
|
+
@settings = opts
|
60
|
+
|
61
|
+
# Instance variables for Config class only
|
62
|
+
@temp_files = {}
|
63
|
+
|
64
|
+
conf_location = (opts[:config_file] && File.exist?(opts[:config_file])) ? opts[:config] : find_config
|
65
|
+
|
66
|
+
@yaml = YAML.load_file(conf_location)
|
67
|
+
|
68
|
+
# Match defaults
|
69
|
+
@yaml['domain'] ||= @settings[:domain]
|
70
|
+
@yaml['paths'] ||= @settings[:paths]
|
71
|
+
@yaml['port'] ||= @settings[:port]
|
72
|
+
set_families('lints', ['jshint', 'scsslint', 'rubocop', 'brakeman', 'railsbp'])
|
73
|
+
set_families('frontend', ['jshint', 'scsslint', 'phantomas', 'stylestats', 'wraith'])
|
74
|
+
set_families('backend', ['rubocop', 'brakeman', 'railsbp'])
|
75
|
+
set_families('ruby', ['rubocop', 'brakeman', 'railsbp'])
|
76
|
+
set_families('statistics', ['phantomas', 'stylestats', 'wraith'])
|
77
|
+
set_families('all', ['lints', 'statistics'])
|
78
|
+
|
79
|
+
# Override options with any defined in a discovered config file
|
80
|
+
evaluate_yaml
|
81
|
+
end
|
82
|
+
|
83
|
+
# Set global options or generate appropriate config files for lints or statistics
|
84
|
+
#
|
85
|
+
# @param yaml_data [Hash] (@yaml) loaded data from the discovered maximus config file
|
86
|
+
# @return [Hash] paths to temp config files and static options
|
87
|
+
# These should be deleted with destroy_temp after read and loaded
|
88
|
+
def evaluate_yaml(yaml_data = @yaml)
|
89
|
+
yaml_data.each do |key, value|
|
90
|
+
unless value.is_a?(FalseClass)
|
91
|
+
value = {} if value.is_a?(TrueClass)
|
92
|
+
|
93
|
+
case key
|
94
|
+
|
95
|
+
when 'jshint', 'JSHint', 'JShint'
|
96
|
+
|
97
|
+
# @todo DRY this up, but can't call it at the start because of the
|
98
|
+
# global config variables (last when statement in this switch)
|
99
|
+
value = load_config(value)
|
100
|
+
|
101
|
+
if yaml_data[key].is_a?(Hash) && yaml_data[key].has_key?['ignore']
|
102
|
+
jshintignore_file = []
|
103
|
+
yaml_data[key]['ignore'].each { |i| jshintignore_file << "#{i}\n" }
|
104
|
+
@settings[:jshintignore] = temp_it('jshintignore.json', jshintignore_file)
|
105
|
+
end
|
106
|
+
@settings[:jshint] = temp_it('jshint.json', value.to_json)
|
107
|
+
|
108
|
+
when 'scsslint', 'scss-lint', 'SCSSlint'
|
109
|
+
value = load_config(value)
|
110
|
+
|
111
|
+
@settings[:scsslint] = temp_it('scsslint.yml', value.to_yaml)
|
112
|
+
|
113
|
+
when 'rubocop', 'Rubocop', 'RuboCop'
|
114
|
+
value = load_config(value)
|
115
|
+
|
116
|
+
@settings[:rubocop] = temp_it('rubocop.yml', value.to_yaml)
|
117
|
+
|
118
|
+
when 'brakeman'
|
119
|
+
@settings[:brakeman] = yaml_data[key]
|
120
|
+
|
121
|
+
when 'rails_best_practice', 'railsbp'
|
122
|
+
@settings[:railsbp] = yaml_data[key]
|
123
|
+
|
124
|
+
when 'stylestats', 'Stylestats'
|
125
|
+
value = load_config(value)
|
126
|
+
@settings[:stylestats] = temp_it('stylestats.json', value.to_json)
|
127
|
+
|
128
|
+
when 'phantomas', 'Phantomas'
|
129
|
+
value = load_config(value)
|
130
|
+
@settings[:phantomas] = temp_it('phantomas.json', value.to_json)
|
131
|
+
|
132
|
+
when 'wraith', 'Wraith'
|
133
|
+
value = load_config(value)
|
134
|
+
|
135
|
+
@settings[:wraith] = {}
|
136
|
+
if value.include?('browser')
|
137
|
+
value['browser'].each do |browser, browser_value|
|
138
|
+
unless browser_value.is_a?(FalseClass)
|
139
|
+
new_data = {}
|
140
|
+
new_data['browser'] = []
|
141
|
+
new_data['browser'] << { browser.to_s => browser.to_s }
|
142
|
+
|
143
|
+
# Regardless of what's in the config, override with maximus,
|
144
|
+
# predictable namespacing
|
145
|
+
new_data['directory'] = "maximus_wraith_#{browser}"
|
146
|
+
new_data['history_dir'] = "maximus_wraith_history_#{browser}"
|
147
|
+
|
148
|
+
# @todo a snap file cannot be set in the config
|
149
|
+
snap_file = case browser
|
150
|
+
when 'casperjs' then 'casper'
|
151
|
+
when 'nojs' then 'nojs'
|
152
|
+
else 'snap'
|
153
|
+
end
|
154
|
+
new_data['snap_file'] = File.join(File.dirname(__FILE__), "config/wraith/#{snap_file}.js")
|
155
|
+
|
156
|
+
@settings[:wraith][browser.to_sym] = wraith_setup(new_data, "wraith_#{browser}")
|
157
|
+
end
|
158
|
+
end
|
159
|
+
else
|
160
|
+
value['browser'] = { 'phantomjs' => 'phantomjs' }
|
161
|
+
value['directory'] = 'maximus_wraith_phantomjs'
|
162
|
+
value['history_dir'] = 'maximus_wraith_history_phantomjs'
|
163
|
+
value['snap_file'] = File.join(File.dirname(__FILE__), "config/wraith/snap.js")
|
164
|
+
@settings[:wraith][:phantomjs] = wraith_setup(value)
|
165
|
+
end
|
166
|
+
|
167
|
+
# Configuration important to all of maximus
|
168
|
+
when 'is_dev', 'log', 'root_dir', 'domain', 'port', 'paths', 'commit'
|
169
|
+
@settings[key.to_sym] = yaml_data[key]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# Finally, we're done
|
175
|
+
@settings
|
176
|
+
end
|
177
|
+
|
178
|
+
# @return [Boolean]
|
179
|
+
def is_dev?
|
180
|
+
@settings[:is_dev]
|
181
|
+
end
|
182
|
+
|
183
|
+
# Defines base logger
|
184
|
+
#
|
185
|
+
# @param out [String, STDOUT] location for logging
|
186
|
+
# Accepts file path
|
187
|
+
# @return [Logger] self.log
|
188
|
+
def log
|
189
|
+
out = @settings[:log] || STDOUT
|
190
|
+
@log ||= Logger.new(out)
|
191
|
+
@log.level ||= Logger::INFO
|
192
|
+
@log
|
193
|
+
end
|
194
|
+
|
195
|
+
# Remove all or one created temporary config file
|
196
|
+
#
|
197
|
+
# @see #temp_it
|
198
|
+
# @see #yaml_evaluate
|
199
|
+
#
|
200
|
+
# @param filename [String] (nil) file to destroy
|
201
|
+
# If nil, destroy all temp files
|
202
|
+
# @return [void]
|
203
|
+
def destroy_temp(filename = nil)
|
204
|
+
return if @temp_files[filename.to_sym].blank?
|
205
|
+
if filename.nil?
|
206
|
+
@temp_files.each { |filename, file| file.unlink }
|
207
|
+
@temp_files = {}
|
208
|
+
else
|
209
|
+
@temp_files[filename.to_sym].unlink
|
210
|
+
@temp_files.delete(filename.to_sym)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# Combine domain with port if necessary
|
215
|
+
#
|
216
|
+
# @return [String] complete domain/host address
|
217
|
+
def domain
|
218
|
+
(!@settings[:port].blank? || @settings[:domain].include?(':')) ? "#{@settings[:domain]}:#{@settings[:port]}" : @settings[:domain]
|
219
|
+
end
|
220
|
+
|
221
|
+
|
222
|
+
private
|
223
|
+
|
224
|
+
# Allow shorthand to be declared for groups Maximus executions
|
225
|
+
#
|
226
|
+
# @example disable statistics
|
227
|
+
# @yaml['statistics'] = false
|
228
|
+
# set_families('statistics', ['phantomas', 'stylestats', 'wraith'])
|
229
|
+
#
|
230
|
+
# Sets as Boolean based on whether or not the queried label is `true`
|
231
|
+
# @param head_of_house [String] @yaml key and group label
|
232
|
+
# @param family [Array] group of other @yaml keys to be disabled
|
233
|
+
# @return [void] modified @yaml
|
234
|
+
def set_families(head_of_house, family)
|
235
|
+
if @yaml.has_key?(head_of_house)
|
236
|
+
family.each { |f| @yaml[f] = @yaml[head_of_house].is_a?(TrueClass) }
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
# Load config files if filename supplied
|
241
|
+
#
|
242
|
+
# @param value [Mixed] value from base config file
|
243
|
+
# @param [Hash] return blank hash if file not found so
|
244
|
+
# the reset of the process doesn't break
|
245
|
+
def load_config(value)
|
246
|
+
return value unless value.is_a?(String)
|
247
|
+
if File.exist?(value)
|
248
|
+
return YAML.load_file(value)
|
249
|
+
else
|
250
|
+
puts "#{value} not found"
|
251
|
+
return {}
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# Create a temp file with config data
|
256
|
+
#
|
257
|
+
# Stores all temp files in @temp_files or self.temp_files
|
258
|
+
# In Hash with filename minus extension as the key.
|
259
|
+
#
|
260
|
+
# @param filename [String] the preferred name/identifier of the file
|
261
|
+
# @param data [Mixed] config data important to each lint or statistic
|
262
|
+
# @return [String] absolute path to new config file
|
263
|
+
def temp_it(filename, data)
|
264
|
+
ext = filename.split('.')
|
265
|
+
file = Tempfile.new([filename, ".#{ext[1]}"])
|
266
|
+
file.write(data)
|
267
|
+
file.close
|
268
|
+
@temp_files[ext[0].to_sym] = file
|
269
|
+
file.path
|
270
|
+
end
|
271
|
+
|
272
|
+
# Look for a maximus config file
|
273
|
+
#
|
274
|
+
# Checks ./maximus.yml, ./maximus.yaml, ./config/maximus.yaml in order.
|
275
|
+
# If there hasn't been a file discovered yet, checks ./config/maximus.yml
|
276
|
+
# and if there still isn't a file, load the default one included with the
|
277
|
+
# maximus gem.
|
278
|
+
#
|
279
|
+
# @return [String] absolute path to config file
|
280
|
+
def find_config
|
281
|
+
config_exists('maximus.yml') || config_exists('maximus.yaml') || config_exists('config/maximus.yaml') || check_default_config_path('maximus.yml')
|
282
|
+
end
|
283
|
+
|
284
|
+
# See if a config file exists
|
285
|
+
#
|
286
|
+
# @see #find_config
|
287
|
+
#
|
288
|
+
# This is used exclusively for the find_config method
|
289
|
+
# @param file [String] file name
|
290
|
+
# @return [String, FalseClass] if file is found return the absolute path
|
291
|
+
# otherwise return false so we can keep checking
|
292
|
+
def config_exists(file)
|
293
|
+
File.exist?(File.join(File.dirname(__FILE__), file)) ? File.join(File.dirname(__FILE__), file) : false
|
294
|
+
end
|
295
|
+
|
296
|
+
# Wraith is a complicated gem with significant configuration
|
297
|
+
#
|
298
|
+
# @see #yaml_evaluate
|
299
|
+
# @see #temp_it
|
300
|
+
#
|
301
|
+
# @param value [Hash] modified data from a wraith config or injected data
|
302
|
+
# @param name [String] ('wraith') config file name to write and eventually load
|
303
|
+
# @return [String] temp file path
|
304
|
+
def wraith_setup(value, name = 'phantomjs')
|
305
|
+
|
306
|
+
if @yaml.include?('urls')
|
307
|
+
value['domains'] = yaml_data['urls']
|
308
|
+
else
|
309
|
+
value['domains'] = {}
|
310
|
+
# @see #domain
|
311
|
+
value['domains']['main'] = domain
|
312
|
+
end
|
313
|
+
|
314
|
+
# Wraith requires this screen_width config to be present
|
315
|
+
value['screen_widths'] ||= [767, 1024, 1280]
|
316
|
+
|
317
|
+
value['paths'] = @yaml['paths']
|
318
|
+
value['threshold'] ||= 0
|
319
|
+
|
320
|
+
# Wraith requires config files have .yaml extensions
|
321
|
+
# https://github.com/BBC-News/wraith/blob/2aff771eba01b76e61600cccb2113869bfe16479/lib/wraith/wraith.rb
|
322
|
+
file = Tempfile.new([name, '.yaml'])
|
323
|
+
file.write(value.to_yaml)
|
324
|
+
file.close
|
325
|
+
file.path
|
326
|
+
end
|
327
|
+
|
328
|
+
end
|
329
|
+
end
|
data/lib/maximus/git_control.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
1
|
require 'git'
|
2
|
-
require 'active_support'
|
3
|
-
require 'active_support/core_ext/object/blank'
|
4
|
-
require 'rainbow'
|
5
|
-
require 'rainbow/ext/string'
|
6
2
|
|
7
3
|
module Maximus
|
8
4
|
# @since 0.1.0
|
@@ -12,29 +8,21 @@ module Maximus
|
|
12
8
|
|
13
9
|
# Git management
|
14
10
|
#
|
15
|
-
#
|
16
|
-
# @
|
17
|
-
# @option opts [
|
18
|
-
#
|
19
|
-
# @option opts [
|
20
|
-
# @option opts [String, Integer] :port port number - used for Statistics
|
21
|
-
# @option opts [String, Array] :path ('') path to files. Accepts glob notation
|
11
|
+
# Inherits settings from {Config#initialize}
|
12
|
+
# @param opts [Hash] options passed directly to config
|
13
|
+
# @option opts [Boolean] :is_dev (false) whether or not the class was initialized from the command line
|
14
|
+
# This is set here again in case only GitControl needs to be directly called (outside of command line)
|
15
|
+
# @option opts [Config object] :config custom Maximus::Config object
|
22
16
|
# @option opts [String] :commit accepts sha, "working", "last", or "master".
|
23
|
-
# Used in the command line
|
24
17
|
# @return [void] this method is used to set up instance variables
|
25
18
|
def initialize(opts = {})
|
26
19
|
opts[:is_dev] ||= false
|
27
|
-
|
28
|
-
opts[:
|
29
|
-
opts[:
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@@is_dev = opts[:is_dev]
|
34
|
-
@opts = opts
|
35
|
-
|
36
|
-
@psuedo_commit = (!@opts[:commit].blank? && @opts[:commit] == 'working')
|
37
|
-
@g = Git.open(@opts[:root_dir], :log => log)
|
20
|
+
|
21
|
+
opts[:config] ||= Maximus::Config.new({commit: opts[:commit], is_dev: opts[:is_dev] })
|
22
|
+
@config ||= opts[:config]
|
23
|
+
@settings ||= @config.settings
|
24
|
+
@psuedo_commit = (!@settings[:commit].blank? && (@settings[:commit] == 'working' || @settings[:commit] == 'last' || @settings[:commit] == 'master') )
|
25
|
+
@g = Git.open(@settings[:root_dir], :log => @settings[:git_log])
|
38
26
|
end
|
39
27
|
|
40
28
|
# 30,000 foot view of a commit
|
@@ -74,12 +62,12 @@ module Maximus
|
|
74
62
|
def compare(sha1 = master_commit.sha, sha2 = sha)
|
75
63
|
diff_return = {}
|
76
64
|
|
77
|
-
if @
|
78
|
-
sha1 = case @
|
65
|
+
if @settings[:commit]
|
66
|
+
sha1 = case @settings[:commit]
|
79
67
|
when 'master' then master_commit.sha
|
80
68
|
when 'last' then @g.object('HEAD^').sha
|
81
69
|
when 'working' then 'working'
|
82
|
-
else @
|
70
|
+
else @settings[:commit]
|
83
71
|
end
|
84
72
|
end
|
85
73
|
|
@@ -112,7 +100,7 @@ module Maximus
|
|
112
100
|
unless files[child].blank?
|
113
101
|
files[child].each do |c|
|
114
102
|
# hack to ignore deleted files
|
115
|
-
files[child] = new_lines[c].blank? ? [] : [ filename: "#{@
|
103
|
+
files[child] = new_lines[c].blank? ? [] : [ filename: "#{@settings[:root_dir]}/#{c}", changes: new_lines[c] ]
|
116
104
|
end
|
117
105
|
files[ext].concat(files[child])
|
118
106
|
files.delete(child)
|
@@ -149,30 +137,23 @@ module Maximus
|
|
149
137
|
git_shas.each do |sha, exts|
|
150
138
|
# @todo better way to silence git, in case there's a real error?
|
151
139
|
quietly { `git checkout #{sha} -b maximus_#{sha}` } unless @psuedo_commit
|
152
|
-
puts sha.to_s.color(:blue) if
|
140
|
+
puts sha.to_s.color(:blue) if @config.is_dev?
|
153
141
|
git_output[sha.to_sym] = {
|
154
142
|
lints: {},
|
155
143
|
statistics: {}
|
156
144
|
}
|
157
145
|
lints = git_output[sha.to_sym][:lints]
|
158
146
|
statistics = git_output[sha.to_sym][:statistics]
|
159
|
-
lint_opts = {
|
160
|
-
is_dev: @@is_dev,
|
161
|
-
root_dir: @opts[:root_dir],
|
162
|
-
commit: !@opts[:commit].blank?
|
163
|
-
}
|
164
|
-
stat_opts = {
|
165
|
-
is_dev: @@is_dev,
|
166
|
-
base_url: @opts[:base_url],
|
167
|
-
port: @opts[:port],
|
168
|
-
root_dir: @opts[:root_dir]
|
169
|
-
}
|
147
|
+
lint_opts = {}
|
170
148
|
|
171
149
|
# This is where everything goes down
|
172
150
|
exts.each do |ext, files|
|
173
151
|
# For relevant_lines data
|
174
|
-
lint_opts
|
175
|
-
|
152
|
+
lint_opts = {
|
153
|
+
git_files: files,
|
154
|
+
config: @config
|
155
|
+
}
|
156
|
+
lint_opts[:file_paths] = lint_file_paths(files, ext) if lint_by_path
|
176
157
|
case ext
|
177
158
|
when :scss
|
178
159
|
lints[:scsslint] = Maximus::Scsslint.new(lint_opts).result
|
@@ -183,11 +164,11 @@ module Maximus
|
|
183
164
|
# @todo stylestat is singular here because model name in Rails is singular.
|
184
165
|
# But adding a .classify when it's converted to a model chops off the end s on 'phantomas',
|
185
166
|
# which breaks the model name.
|
186
|
-
statistics[:stylestat] = Maximus::Stylestats.new(
|
167
|
+
statistics[:stylestat] = Maximus::Stylestats.new({config: @config}).result
|
187
168
|
|
188
169
|
# @todo double pipe here is best way to say, if it's already run, don't run again, right?
|
189
|
-
statistics[:phantomas] ||= Maximus::Phantomas.new(
|
190
|
-
statistics[:wraith]
|
170
|
+
statistics[:phantomas] ||= Maximus::Phantomas.new({config: @config}).result
|
171
|
+
statistics[:wraith] ||= Maximus::Wraith.new({config: @config}).result
|
191
172
|
end
|
192
173
|
when :js
|
193
174
|
lints[:jshint] = Maximus::Jshint.new(lint_opts).result
|
@@ -195,14 +176,14 @@ module Maximus
|
|
195
176
|
# Do not run statistics if called from command line
|
196
177
|
if lint_opts[:commit].blank?
|
197
178
|
|
198
|
-
statistics[:phantomas]
|
179
|
+
statistics[:phantomas] ||= Maximus::Phantomas.new({config: @config}).result
|
199
180
|
|
200
181
|
# @todo double pipe here is best way to say, if it's already run, don't run again, right?
|
201
|
-
statistics[:wraith] ||= Maximus::Wraith.new(
|
182
|
+
statistics[:wraith] ||= Maximus::Wraith.new({config: @config}).result
|
202
183
|
end
|
203
184
|
when :ruby
|
204
185
|
lints[:rubocop] = Maximus::Rubocop.new(lint_opts).result
|
205
|
-
lints[:railsbp]
|
186
|
+
lints[:railsbp] ||= Maximus::Railsbp.new(lint_opts).result
|
206
187
|
lints[:brakeman] = Maximus::Brakeman.new(lint_opts).result
|
207
188
|
when :rails
|
208
189
|
lints[:railsbp] ||= Maximus::Railsbp.new(lint_opts).result
|
@@ -280,6 +261,7 @@ module Maximus
|
|
280
261
|
end
|
281
262
|
|
282
263
|
# Store last commit as Ruby Git::Object
|
264
|
+
#
|
283
265
|
# @param commitsha [String]
|
284
266
|
# @return [Git::Object]
|
285
267
|
def vccommit(commitsha = sha)
|
data/lib/maximus/helper.rb
CHANGED
@@ -3,18 +3,15 @@ require 'rainbow/ext/string'
|
|
3
3
|
require 'active_support'
|
4
4
|
require 'active_support/core_ext/object/blank'
|
5
5
|
require 'yaml'
|
6
|
+
require 'tempfile'
|
6
7
|
|
7
8
|
module Maximus
|
8
9
|
# @since 0.1.0
|
9
10
|
module Helper
|
10
11
|
|
11
12
|
# See if project linted is a Rails app
|
12
|
-
# This will usually be stored as a class variable in the inherited class
|
13
|
-
# @example class variable
|
14
|
-
# @@is_rails = is_rails?
|
15
|
-
#
|
16
|
-
# @see Lint#initialize
|
17
13
|
#
|
14
|
+
# This will usually be stored as a class variable in the inherited class
|
18
15
|
# @return [Boolean]
|
19
16
|
def is_rails?
|
20
17
|
defined?(Rails)
|
@@ -45,15 +42,13 @@ module Maximus
|
|
45
42
|
end
|
46
43
|
end
|
47
44
|
|
48
|
-
# Look for a
|
49
|
-
# otherwise, use the built-in one.
|
50
|
-
# @todo best practice that this inherits the @opts from the model it's being included in?
|
45
|
+
# Look for a file in the config directory
|
51
46
|
#
|
52
|
-
# @
|
53
|
-
# @
|
54
|
-
|
55
|
-
|
56
|
-
File.exist?(
|
47
|
+
# @since 0.1.0
|
48
|
+
# @param file [String] filename with extension to search for
|
49
|
+
# @return [String] path to default config file or file in user's directory
|
50
|
+
def check_default_config_path(file)
|
51
|
+
File.exist?(file) ? file : File.join(File.dirname(__FILE__), "config/#{file}")
|
57
52
|
end
|
58
53
|
|
59
54
|
# Grab the absolute path of the reporter file
|
@@ -61,7 +56,7 @@ module Maximus
|
|
61
56
|
# @param filename [String]
|
62
57
|
# @return [String] absolute path to the reporter file
|
63
58
|
def reporter_path(filename)
|
64
|
-
File.join(File.dirname(__FILE__),"reporter/#{filename}")
|
59
|
+
File.join(File.dirname(__FILE__), "reporter/#{filename}")
|
65
60
|
end
|
66
61
|
|
67
62
|
# Find all files that were linted by extension
|
@@ -96,6 +91,7 @@ module Maximus
|
|
96
91
|
|
97
92
|
# Edit and save a YAML file
|
98
93
|
#
|
94
|
+
# @param yaml_location [String] YAML absolute file path
|
99
95
|
# @return [void]
|
100
96
|
def edit_yaml(yaml_location, &block)
|
101
97
|
d = YAML.load_file(yaml_location)
|
@@ -112,15 +108,6 @@ module Maximus
|
|
112
108
|
STDIN.gets
|
113
109
|
end
|
114
110
|
|
115
|
-
# Defines base logger
|
116
|
-
#
|
117
|
-
# @return [Logger] @@log for logging use
|
118
|
-
def mlog
|
119
|
-
@@log ||= Logger.new(STDOUT)
|
120
|
-
@@log.level ||= Logger::INFO
|
121
|
-
@@log
|
122
|
-
end
|
123
|
-
|
124
111
|
# Convert the array from lines_added into spelled-out ranges
|
125
112
|
# This is a GitControl helper but it's used in Lint
|
126
113
|
# @see GitControl#lines_added
|