maximus 0.1.1 → 0.1.2
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 +2 -0
- data/lib/maximus.rb +0 -1
- data/lib/maximus/cli.rb +2 -1
- data/lib/maximus/constants.rb +2 -0
- data/lib/maximus/git_control.rb +94 -33
- data/lib/maximus/helper.rb +73 -36
- data/lib/maximus/lint.rb +46 -29
- data/lib/maximus/lints/brakeman.rb +11 -2
- data/lib/maximus/lints/jshint.rb +3 -0
- data/lib/maximus/lints/railsbp.rb +11 -2
- data/lib/maximus/lints/rubocop.rb +3 -0
- data/lib/maximus/lints/scsslint.rb +3 -0
- data/lib/maximus/reporter/git-lines.sh +1 -1
- data/lib/maximus/statistic.rb +22 -13
- data/lib/maximus/statistics/phantomas.rb +5 -2
- data/lib/maximus/statistics/stylestats.rb +17 -11
- data/lib/maximus/statistics/wraith.rb +8 -4
- data/lib/maximus/version.rb +1 -1
- data/maximus.gemspec +3 -4
- data/roadmap.md +2 -4
- metadata +33 -51
- data/lib/maximus/rake_tasks.rb +0 -13
- data/lib/maximus/tasks/be.rake +0 -35
- data/lib/maximus/tasks/fe.rake +0 -30
- data/lib/maximus/tasks/maximus.rake +0 -39
- data/lib/maximus/tasks/statistic.rake +0 -26
data/lib/maximus/lint.rb
CHANGED
@@ -1,27 +1,30 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
module Maximus
|
4
|
+
# @since 0.1.0
|
4
5
|
class Lint
|
5
6
|
attr_accessor :output
|
6
7
|
|
7
8
|
include Helper
|
8
9
|
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
10
|
+
# Perform a lint of relevant code
|
11
|
+
#
|
12
|
+
# All defined lints require a "result" method
|
13
|
+
# @example the result method in the child class
|
14
|
+
# def result(opts = {})
|
15
|
+
# @task = __method__.to_s
|
16
|
+
# @path ||= 'path/or/**/glob/to/files''
|
17
|
+
# lint_data = JSON.parse(`some-command-line-linter`)
|
18
|
+
# @output[:files_inspected] ||= files_inspected(extension, delimiter, base_path_replacement)
|
19
|
+
# refine data_from_output
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# @param opts [Hash] the options to create a lint with
|
23
|
+
# @option opts [Boolean] :is_dev (false) whether or not the class was initialized from the command line
|
24
|
+
# @option opts [Array<String, Symbol>] :git_files files returned from the commit
|
25
|
+
# @option opts [String] :root_dir base directory
|
26
|
+
# @option opts [String, Array] :path ('') path to files. Accepts glob notation
|
27
|
+
# @return @output [Hash] combined and refined data from lint
|
25
28
|
def initialize(opts = {})
|
26
29
|
opts[:is_dev] ||= false
|
27
30
|
opts[:root_dir] ||= root_dir
|
@@ -35,7 +38,9 @@ module Maximus
|
|
35
38
|
end
|
36
39
|
|
37
40
|
# Convert raw data into warnings, errors, conventions or refactors. Use this wisely.
|
38
|
-
#
|
41
|
+
#
|
42
|
+
# @param data [Hash] unfiltered lint data
|
43
|
+
# @return [Hash] refined lint data and all the other bells and whistles
|
39
44
|
def refine(data)
|
40
45
|
# Prevent abortive empty JSON.parse error
|
41
46
|
data = '{}' if data.blank?
|
@@ -77,7 +82,7 @@ module Maximus
|
|
77
82
|
@output[:lint_refactors] = lint_refactors
|
78
83
|
lint_count = (lint_errors.length + lint_warnings.length + lint_conventions.length + lint_refactors.length)
|
79
84
|
if @@is_dev
|
80
|
-
lint_dev_format
|
85
|
+
puts lint_dev_format(data) unless data.blank?
|
81
86
|
puts lint_summarize
|
82
87
|
lint_ceiling lint_count
|
83
88
|
else
|
@@ -92,13 +97,18 @@ module Maximus
|
|
92
97
|
protected
|
93
98
|
|
94
99
|
# List all files inspected
|
95
|
-
#
|
96
|
-
|
97
|
-
|
100
|
+
#
|
101
|
+
# @param ext [String] extension to search for
|
102
|
+
# @param delimiter [String] comma or space separated
|
103
|
+
# @param remove [String] remove from all file names
|
104
|
+
# @return all_files [Array<string>] list of file names
|
105
|
+
def files_inspected(ext, delimiter = ',', remove = @opts[:root_dir])
|
106
|
+
@path.is_a?(Array) ? @path.split(delimiter) : file_list(@path, ext, remove)
|
98
107
|
end
|
99
108
|
|
100
109
|
# Compare lint output with lines changed in commit
|
101
|
-
#
|
110
|
+
#
|
111
|
+
# @return [Array] lints that match the lines in commit
|
102
112
|
def relevant_lints(lint, files)
|
103
113
|
all_files = {}
|
104
114
|
files.each do |file|
|
@@ -112,7 +122,7 @@ module Maximus
|
|
112
122
|
unless lint_file.blank?
|
113
123
|
all_files[revert_name] = []
|
114
124
|
|
115
|
-
#
|
125
|
+
# @todo originally I tried .map and delete_if, but this works,
|
116
126
|
# and the other method didn't cover all bases.
|
117
127
|
# Gotta be a better way to write this though
|
118
128
|
lint_file.each do |l|
|
@@ -136,7 +146,8 @@ module Maximus
|
|
136
146
|
private
|
137
147
|
|
138
148
|
# Send abbreviated results to console or to the log
|
139
|
-
#
|
149
|
+
#
|
150
|
+
# @return [String] console message to display
|
140
151
|
def lint_summarize
|
141
152
|
puts "\n" if @@is_dev
|
142
153
|
|
@@ -154,9 +165,12 @@ module Maximus
|
|
154
165
|
success
|
155
166
|
end
|
156
167
|
|
157
|
-
# If there's just too much to handle, through a warning.
|
158
|
-
#
|
168
|
+
# If there's just too much to handle, through a warning.
|
169
|
+
# MySQL may not store all the data and throw an abortive error if the blob is too large
|
159
170
|
# If prompt returns truthy, execution continues
|
171
|
+
#
|
172
|
+
# @param lint_length [Integer] count of how many lints
|
173
|
+
# @return [String] console message to display
|
160
174
|
def lint_ceiling(lint_length)
|
161
175
|
if lint_length > 100
|
162
176
|
lint_dev_format
|
@@ -170,9 +184,12 @@ module Maximus
|
|
170
184
|
end
|
171
185
|
end
|
172
186
|
|
173
|
-
# Dev display,
|
174
|
-
#
|
187
|
+
# Dev display, executed only when called from command line
|
188
|
+
#
|
189
|
+
# @param errors [Hash] data from lint
|
190
|
+
# @return [String] console message to display
|
175
191
|
def lint_dev_format(errors = @output[:raw_data])
|
192
|
+
return if errors.blank?
|
176
193
|
pretty_output = ''
|
177
194
|
errors.each do |filename, error_list|
|
178
195
|
pretty_output += "\n"
|
@@ -194,7 +211,7 @@ module Maximus
|
|
194
211
|
pretty_output += "\n"
|
195
212
|
end
|
196
213
|
end
|
197
|
-
|
214
|
+
pretty_output
|
198
215
|
end
|
199
216
|
|
200
217
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
2
3
|
class Brakeman < Maximus::Lint
|
3
4
|
|
4
5
|
# Brakeman (requires Rails)
|
6
|
+
#
|
7
|
+
# @see Lint#initialize
|
5
8
|
def result
|
6
9
|
|
7
10
|
return unless @@is_rails
|
@@ -35,7 +38,10 @@ module Maximus
|
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|
38
|
-
|
41
|
+
# The output of brakeman is a mix of strings and symbols
|
42
|
+
# but resetting the JSON like this standardizes everything.
|
43
|
+
# @todo Better way to get around this?
|
44
|
+
brakeman = JSON.parse(brakeman.to_json)
|
39
45
|
end
|
40
46
|
|
41
47
|
@output[:files_inspected] ||= files_inspected('rb', ' ')
|
@@ -45,7 +51,10 @@ module Maximus
|
|
45
51
|
|
46
52
|
private
|
47
53
|
|
48
|
-
# Convert to
|
54
|
+
# Convert to {file:README.md Maximus format}
|
55
|
+
#
|
56
|
+
# @param error [Hash] lint error
|
57
|
+
# @return [Hash]
|
49
58
|
def hash_for_brakeman(error, type)
|
50
59
|
{
|
51
60
|
linter: error['warning_type'],
|
data/lib/maximus/lints/jshint.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
2
3
|
class Railsbp < Maximus::Lint
|
3
4
|
|
4
5
|
# rails_best_practice (requires Rails)
|
6
|
+
#
|
7
|
+
# @see Lint#initialize
|
5
8
|
def result
|
6
9
|
|
7
10
|
return unless @@is_rails
|
@@ -26,7 +29,10 @@ module Maximus
|
|
26
29
|
railsbp[file.gsub(Rails.root.to_s, '')[1..-1].to_sym] = errors.map { |o| hash_for_railsbp(o) }
|
27
30
|
end
|
28
31
|
end
|
29
|
-
|
32
|
+
# The output of railsbp is a mix of strings and symbols
|
33
|
+
# but resetting the JSON like this standardizes everything.
|
34
|
+
# @todo Better way to get around this?
|
35
|
+
railsbp = JSON.parse(railsbp.to_json)
|
30
36
|
end
|
31
37
|
|
32
38
|
@output[:files_inspected] ||= files_inspected('rb', ' ')
|
@@ -36,7 +42,10 @@ module Maximus
|
|
36
42
|
|
37
43
|
private
|
38
44
|
|
39
|
-
# Convert to
|
45
|
+
# Convert to {file:README.md Maximus format}
|
46
|
+
#
|
47
|
+
# @param error [Hash] lint error
|
48
|
+
# @return [Hash]
|
40
49
|
def hash_for_railsbp(error)
|
41
50
|
{
|
42
51
|
linter: error['message'].gsub(/\((.*)\)/, '').strip.parameterize('_').camelize,
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
2
3
|
class Scsslint < Maximus::Lint
|
3
4
|
|
4
5
|
# SCSS-Lint
|
6
|
+
#
|
7
|
+
# @see Lint#initialize
|
5
8
|
def result
|
6
9
|
@task = 'scsslint'
|
7
10
|
@path ||= @@is_rails ? "#{@opts[:root_dir]}/app/assets/stylesheets" : "#{@opts[:root_dir]}/source/assets/stylesheets"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
3
|
# http://stackoverflow.com/questions/8259851/using-git-diff-how-can-i-get-added-and-modified-lines-numbers
|
4
|
-
#
|
4
|
+
# @todo this function is tricky because I don't fully understand regex in BASH. Also, getting line hunks from git is tricky. This will likely need to be refactored
|
5
5
|
function lines-added(){
|
6
6
|
local path=
|
7
7
|
local line=
|
data/lib/maximus/statistic.rb
CHANGED
@@ -1,20 +1,28 @@
|
|
1
|
-
|
2
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
3
3
|
class Statistic
|
4
4
|
attr_accessor :output
|
5
5
|
|
6
6
|
include Helper
|
7
7
|
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
8
|
+
# Gather info about how the code performs
|
9
|
+
#
|
10
|
+
# All defined statistics require a "result" method
|
11
|
+
# @example the result method in the child class
|
12
|
+
# def result(opts = {})
|
13
|
+
# @path ||= 'path/or/**/glob/to/files''
|
14
|
+
# stat_data = JSON.parse(`some-command-line-stat-runner`)
|
15
|
+
# @output
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @param opts [Hash] the options to create a lint with.
|
19
|
+
# @option opts [Boolean] :is_dev (false) whether or not the class was initialized from the command line
|
20
|
+
# @option opts [String] :root_dir base directory
|
21
|
+
# @option opts [String] :base_url ('http://localhost:3000/') the host
|
22
|
+
# @option opts [String, Integer] :port port number
|
23
|
+
# @option opts [String, Array] :path ('') path to files. Accepts glob notation
|
24
|
+
#
|
25
|
+
# @return output [Hash] combined and refined data from statistic
|
18
26
|
def initialize(opts = {})
|
19
27
|
opts[:is_dev] ||= false
|
20
28
|
opts[:root_dir] ||= root_dir
|
@@ -38,6 +46,7 @@ module Maximus
|
|
38
46
|
protected
|
39
47
|
|
40
48
|
# Organize stat output on the @output variable
|
49
|
+
#
|
41
50
|
# Adds @output[:statistics][:filepath] with all statistic data
|
42
51
|
def refine_stats(stats_cli, file_path)
|
43
52
|
|
@@ -50,10 +59,10 @@ module Maximus
|
|
50
59
|
stats = JSON.parse(stats_cli)
|
51
60
|
@output[:statistics][file_path.to_sym] ||= {}
|
52
61
|
|
53
|
-
#
|
62
|
+
# @todo is there a better way to do this?
|
54
63
|
fp = @output[:statistics][file_path.to_s.to_sym]
|
55
64
|
|
56
|
-
#
|
65
|
+
# @todo Can I do like a self << thing here?
|
57
66
|
stats.each do |stat, value|
|
58
67
|
fp[stat.to_sym] = value
|
59
68
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
2
3
|
class Phantomas < Maximus::Statistic
|
3
4
|
|
4
|
-
#
|
5
|
-
#
|
5
|
+
# Phantomas evaluates page performance with phantomjs and node
|
6
|
+
#
|
7
|
+
# @see Statistic#initialize
|
6
8
|
def result
|
7
9
|
|
8
10
|
node_module_exists('phantomjs', 'brew install')
|
@@ -22,6 +24,7 @@ module Maximus
|
|
22
24
|
|
23
25
|
# Organize stat output on the @output variable
|
24
26
|
# Adds @output[:statistics][:filepath] with all statistic data
|
27
|
+
# @return [void] goes to refine statistics
|
25
28
|
def phantomas_by_url(url, phantomas_cli)
|
26
29
|
puts "Phantomas on #{@opts[:base_url] + url}".color(:green)
|
27
30
|
phantomas = `#{phantomas_cli} #{@opts[:base_url] + url}`
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
2
3
|
class Stylestats < Maximus::Statistic
|
3
4
|
|
4
5
|
# @path array preferrably absolute paths, but relative should work
|
5
|
-
# If stylestatting one file, pass that as an array
|
6
|
+
# If stylestatting one file, pass that as an array
|
7
|
+
#
|
8
|
+
# @example stylestat one file
|
9
|
+
# Maximus::Stylestats.new({path: ['/absolute/to/public/assets/application.css']}).result
|
10
|
+
#
|
11
|
+
# @see Statistic#initialize
|
6
12
|
def result
|
7
13
|
|
8
14
|
node_module_exists('stylestats')
|
@@ -27,10 +33,10 @@ module Maximus
|
|
27
33
|
end
|
28
34
|
|
29
35
|
if @@is_rails
|
30
|
-
#
|
36
|
+
# @todo I'd rather Rake::Task but it's not working in different directories
|
31
37
|
Dir.chdir(@opts[:root_dir]) do
|
32
38
|
if @@is_dev
|
33
|
-
#
|
39
|
+
# @todo review that this may not be best practice, but it's really noisy in the console
|
34
40
|
quietly { `rake assets:clobber` }
|
35
41
|
else
|
36
42
|
`rake assets:clobber`
|
@@ -45,11 +51,11 @@ module Maximus
|
|
45
51
|
|
46
52
|
private
|
47
53
|
|
48
|
-
# Find all CSS files
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
54
|
+
# Find all CSS files or compile.
|
55
|
+
# Uses sprockets if Rails; Sass engine otherwise.
|
56
|
+
# Compass is supported
|
57
|
+
#
|
58
|
+
# @return [Array] CSS files
|
53
59
|
def find_css_files
|
54
60
|
searched_files = []
|
55
61
|
|
@@ -60,10 +66,10 @@ module Maximus
|
|
60
66
|
puts "\n"
|
61
67
|
puts 'Compiling assets for stylestats...'.color(:blue)
|
62
68
|
|
63
|
-
#
|
69
|
+
# @todo I'd rather Rake::Task but it's not working in different directories
|
64
70
|
Dir.chdir(@opts[:root_dir]) do
|
65
71
|
if @@is_dev
|
66
|
-
#
|
72
|
+
# @todo review that this may not be best practice, but it's really noisy in the console
|
67
73
|
quietly { `rake assets:precompile` }
|
68
74
|
else
|
69
75
|
`rake assets:precompile`
|
@@ -93,7 +99,7 @@ module Maximus
|
|
93
99
|
@path += ".scss"
|
94
100
|
|
95
101
|
Dir[@path].select { |f| File.file? f }.each do |file|
|
96
|
-
#
|
102
|
+
# @todo don't compile file if it starts with an underscore
|
97
103
|
scss_file = File.open(file, 'rb') { |f| f.read }
|
98
104
|
|
99
105
|
output_file = File.open( file.split('.').reverse.drop(1).reverse.join('.'), "w" )
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Maximus
|
2
|
+
# @since 0.1.0
|
2
3
|
class Wraith < Maximus::Statistic
|
3
4
|
|
4
5
|
# By default checks homepage
|
5
6
|
# Requires config to be in config/wraith/history.yaml
|
6
7
|
# Adds a new config/wraith/history.yaml if not present
|
7
8
|
# Path should be an Array defined as [{ label: url }]
|
8
|
-
#
|
9
|
+
# @see Statistic#initialize
|
9
10
|
def result
|
10
11
|
|
11
12
|
node_module_exists('phantomjs', 'brew install')
|
@@ -29,7 +30,7 @@ module Maximus
|
|
29
30
|
wraith_yaml_reset
|
30
31
|
|
31
32
|
# If the paths have been updated, call a timeout and run history again
|
32
|
-
#
|
33
|
+
# @todo this doesn't work very well. It puts the new shots in the history folder,
|
33
34
|
# even with absolute paths. Could be a bug in wraith
|
34
35
|
YAML.load_file(@wraith_config_file)['paths'].each do |label, url|
|
35
36
|
edit_yaml(@wraith_config_file) do |file|
|
@@ -53,7 +54,7 @@ module Maximus
|
|
53
54
|
# Get a diff percentage of all changes by label and screensize
|
54
55
|
# { path: { percent_changed: [{ size: percent_diff }] } }
|
55
56
|
# Example {:statistics=>{:/=>{:percent_changed=>[{1024=>0.0}, {767=>0.0}, {1024=>0.0}, {767=>0.0}, {1024=>0.0}, {767=>0.0}, {1024=>0.0}, {767=>0.0}] } }}
|
56
|
-
#
|
57
|
+
# @return [Hash]
|
57
58
|
def wraith_parse(wraith_config_file = @wraith_config_file)
|
58
59
|
paths = YAML.load_file(wraith_config_file)['paths']
|
59
60
|
Dir.glob("#{@opts[:root_dir]}/maximus_wraith/**/*.txt").select { |f| File.file? f }.each do |file|
|
@@ -69,7 +70,10 @@ module Maximus
|
|
69
70
|
@output
|
70
71
|
end
|
71
72
|
|
72
|
-
# Update the root domain (docker ports and addresses may change)
|
73
|
+
# Update the root domain (docker ports and addresses may change)
|
74
|
+
# and set paths as defined in @path
|
75
|
+
#
|
76
|
+
# @return [void] but updates instance variables
|
73
77
|
def wraith_yaml_reset(wraith_config_file = @wraith_config_file)
|
74
78
|
edit_yaml(wraith_config_file) do |file|
|
75
79
|
unless @@is_dev
|