overcommit 0.45.0 → 0.46.0
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/config/default.yml +41 -1
- data/lib/overcommit/hook/pre_commit/credo.rb +1 -1
- data/lib/overcommit/hook/pre_commit/flay.rb +36 -0
- data/lib/overcommit/hook/pre_commit/php_cs_fixer.rb +55 -0
- data/lib/overcommit/hook/pre_commit/stylelint.rb +21 -0
- data/lib/overcommit/hook/pre_commit/yard_coverage.rb +88 -0
- data/lib/overcommit/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f55e18f8852d00b8732b915daab20a7b37c28e60ee38dd35caacb091e0d87873
|
4
|
+
data.tar.gz: c75636dd8144cb6022b0400d1d5e1615cc1c27e765d32432332ee7b2701b1f66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8f0d7599c440d4389d19b94b558292f531d2832adf4846a104e2c033e3f0e12866b2f4febc444690ddc26fd245bd4146ff443c2fab5d49d2b44bec15b5befc8
|
7
|
+
data.tar.gz: 977649b8287f01bb7871db881583eac0490b68687cb1ab671612bb1d41e116b3efe45d39dbdec30909ca8dd49da00a9678674b1d1512c7cf5e35d20e5f2ea99f
|
data/config/default.yml
CHANGED
@@ -283,6 +283,16 @@ PreCommit:
|
|
283
283
|
flags: ['-IEHnw']
|
284
284
|
keywords: ['BROKEN', 'BUG', 'ERROR', 'FIXME', 'HACK', 'NOTE', 'OPTIMIZE', 'REVIEW', 'TODO', 'WTF', 'XXX']
|
285
285
|
|
286
|
+
Flay:
|
287
|
+
enabled: false
|
288
|
+
description: 'Analyze ruby code for structural similarities with Flay'
|
289
|
+
required_executable: 'flay'
|
290
|
+
install_command: 'gem install flay'
|
291
|
+
mass_threshold: 16
|
292
|
+
fuzzy: 1
|
293
|
+
liberal: false
|
294
|
+
include: '**/*.rb'
|
295
|
+
|
286
296
|
Foodcritic:
|
287
297
|
enabled: false
|
288
298
|
description: 'Analyze with Foodcritic'
|
@@ -499,6 +509,15 @@ PreCommit:
|
|
499
509
|
flags: ['--standard=PSR2', '--report=csv']
|
500
510
|
include: '**/*.php'
|
501
511
|
|
512
|
+
PhpCsFixer:
|
513
|
+
enabled: false
|
514
|
+
description: 'Fix non compliant PHP files'
|
515
|
+
required_executable: 'php-cs-fixer'
|
516
|
+
command: 'vendor/bin/php-cs-fixer'
|
517
|
+
flags: ['fix', '-v', '--path-mode=intersection']
|
518
|
+
install_command: 'composer global require friendsofphp/php-cs-fixer'
|
519
|
+
include: '**/*.php'
|
520
|
+
|
502
521
|
PhpStan:
|
503
522
|
description: 'Analyze with phpstan'
|
504
523
|
enabled: false
|
@@ -692,12 +711,22 @@ PreCommit:
|
|
692
711
|
install_command: 'npm install -g standard'
|
693
712
|
include: '**/*.js'
|
694
713
|
|
714
|
+
Stylelint:
|
715
|
+
enabled: false
|
716
|
+
description: 'Check styles with Stylelint'
|
717
|
+
require_executable: 'stylelint'
|
718
|
+
flags: ['-f', 'compact']
|
719
|
+
install_command: 'npm install -g stylelint'
|
720
|
+
include:
|
721
|
+
- '**/*.scss'
|
722
|
+
- '**/*.css'
|
723
|
+
- '**/*.less'
|
724
|
+
|
695
725
|
TsLint:
|
696
726
|
enabled: false
|
697
727
|
description: 'Analyze with TSLint'
|
698
728
|
required_executable: 'tslint'
|
699
729
|
install_command: 'npm install -g tslint typescript'
|
700
|
-
flags: ['--t=prose']
|
701
730
|
include: '**/*.ts'
|
702
731
|
|
703
732
|
TrailingWhitespace:
|
@@ -786,6 +815,17 @@ PreCommit:
|
|
786
815
|
- '**/*.yaml'
|
787
816
|
- '**/*.yml'
|
788
817
|
|
818
|
+
YardCoverage:
|
819
|
+
enabled: false
|
820
|
+
description: 'Checking for yard coverage'
|
821
|
+
command: ['yard', 'stats', '--list-undoc', '--compact']
|
822
|
+
flags: ['--private', '--protected']
|
823
|
+
required_executable: 'yard'
|
824
|
+
install_command: 'gem install yard'
|
825
|
+
min_coverage_percentage: 100
|
826
|
+
include:
|
827
|
+
- '/**/*.rb'
|
828
|
+
|
789
829
|
YarnCheck:
|
790
830
|
enabled: false
|
791
831
|
description: 'Check yarn.lock dependencies'
|
@@ -8,7 +8,7 @@ module Overcommit::Hook::PreCommit
|
|
8
8
|
# lib/file2.ex:12:81: R: Line is too long (max is 80, was 81).
|
9
9
|
|
10
10
|
def run
|
11
|
-
result = execute
|
11
|
+
result = execute(command, args: applicable_files)
|
12
12
|
return :pass if result.success?
|
13
13
|
|
14
14
|
result.stdout.split("\n").map(&:strip).reject(&:empty?).
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Runs `flay` against any modified files.
|
3
|
+
#
|
4
|
+
# @see https://github.com/seattlerb/flay
|
5
|
+
class Flay < Base
|
6
|
+
# Flay prints two kinds of messages:
|
7
|
+
#
|
8
|
+
# 1) IDENTICAL code found in :defn (mass*2 = MASS)
|
9
|
+
# file_path_1.rb:LINE_1
|
10
|
+
# file_path_2.rb:LINE_2
|
11
|
+
#
|
12
|
+
# 2) Similar code found in :defn (mass = MASS)
|
13
|
+
# file_path_1.rb:LINE_1
|
14
|
+
# file_path_2.rb:LINE_2
|
15
|
+
#
|
16
|
+
|
17
|
+
def run
|
18
|
+
command = ['flay', '--mass', @config['mass_threshold'].to_s, '--fuzzy', @config['fuzzy'].to_s]
|
19
|
+
# Use a more liberal detection method
|
20
|
+
command += ['--liberal'] if @config['liberal']
|
21
|
+
messages = []
|
22
|
+
# Run the command for each file
|
23
|
+
applicable_files.each do |file|
|
24
|
+
result = execute(command, args: [file])
|
25
|
+
results = result.stdout.split("\n\n")
|
26
|
+
results.shift
|
27
|
+
unless results.empty?
|
28
|
+
error_message = results.join("\n").gsub(/^\d+\)\s*/, '')
|
29
|
+
message = Overcommit::Hook::Message.new(:error, nil, nil, error_message)
|
30
|
+
messages << message
|
31
|
+
end
|
32
|
+
end
|
33
|
+
messages
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Runs `php-cs-fixer` against any modified PHP files.
|
3
|
+
class PhpCsFixer < Base
|
4
|
+
MESSAGE_REGEX = /\s+\d+\)\s+(?<file>.*\.php)(?<violated_rules>\s+\(\w+(?:,\s+)?\))?/
|
5
|
+
|
6
|
+
def run
|
7
|
+
messages = []
|
8
|
+
feedback = ''
|
9
|
+
|
10
|
+
# Exit status for all of the runs. Should be zero!
|
11
|
+
exit_status_sum = 0
|
12
|
+
|
13
|
+
applicable_files.each do |file|
|
14
|
+
result = execute(command, args: [file])
|
15
|
+
output = result.stdout.chomp
|
16
|
+
exit_status_sum += result.status
|
17
|
+
|
18
|
+
if result.status
|
19
|
+
messages = output.lstrip.split("\n")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
unless messages.empty?
|
24
|
+
feedback = parse_messages(messages)
|
25
|
+
end
|
26
|
+
|
27
|
+
:pass if exit_status_sum == 0
|
28
|
+
:pass if feedback.empty?
|
29
|
+
|
30
|
+
feedback
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_messages(messages)
|
34
|
+
output = []
|
35
|
+
|
36
|
+
messages.map do |message|
|
37
|
+
message.scan(MESSAGE_REGEX).map do |file, violated_rules|
|
38
|
+
type = :error
|
39
|
+
unless violated_rules.nil?
|
40
|
+
type = :warning
|
41
|
+
end
|
42
|
+
text = if type == :error
|
43
|
+
"Cannot process #{file}: Syntax error"
|
44
|
+
else
|
45
|
+
"#{file} has been fixed"
|
46
|
+
end
|
47
|
+
|
48
|
+
output << Overcommit::Hook::Message.new(type, file, 0, text)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
output
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Runs `stylelint` against any modified CSS file.
|
3
|
+
#
|
4
|
+
# @see https://github.com/stylelint/stylelint
|
5
|
+
class Stylelint < Base
|
6
|
+
# example of output:
|
7
|
+
# index.css: line 4, col 4, error - Expected indentation of 2 spaces (indentation)
|
8
|
+
|
9
|
+
MESSAGE_REGEX = /^(?<file>.+):\D*(?<line>\d).*$/
|
10
|
+
|
11
|
+
def run
|
12
|
+
result = execute(command, args: applicable_files)
|
13
|
+
output = result.stdout.chomp
|
14
|
+
return :pass if result.success? && output.empty?
|
15
|
+
extract_messages(
|
16
|
+
output.split("\n"),
|
17
|
+
MESSAGE_REGEX
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
|
2
|
+
module Overcommit::Hook::PreCommit
|
3
|
+
# Class to check yard documentation coverage.
|
4
|
+
#
|
5
|
+
# Use option "min_coverage_percentage" in your YardCoverage configuration
|
6
|
+
# to set your desired documentation coverage percentage.
|
7
|
+
#
|
8
|
+
class YardCoverage < Base
|
9
|
+
def run
|
10
|
+
# Run a no-stats yard command to get the coverage
|
11
|
+
args = flags + applicable_files
|
12
|
+
result = execute(command, args: args)
|
13
|
+
|
14
|
+
warnings_and_stats_text, undocumented_objects_text =
|
15
|
+
result.stdout.split('Undocumented Objects:')
|
16
|
+
|
17
|
+
warnings_and_stats = warnings_and_stats_text.strip.split("\n")
|
18
|
+
|
19
|
+
# Stats are the last 7 lines before the undocumented objects
|
20
|
+
stats = warnings_and_stats.slice(-7, 7)
|
21
|
+
|
22
|
+
# If no stats present (shouldn't happen), warn the user and end
|
23
|
+
if stats.class != Array || stats.length != 7
|
24
|
+
return [:warn, 'Impossible to read the yard stats. Please, check your yard installation.']
|
25
|
+
end
|
26
|
+
|
27
|
+
# Check the yard coverage
|
28
|
+
yard_coverage = check_yard_coverage(stats)
|
29
|
+
if yard_coverage == :warn
|
30
|
+
return [
|
31
|
+
:warn,
|
32
|
+
'Impossible to read yard doc coverage. Please, check your yard installation.'
|
33
|
+
]
|
34
|
+
end
|
35
|
+
return :pass if yard_coverage == :pass
|
36
|
+
|
37
|
+
error_messages(yard_coverage, undocumented_objects_text)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# Check the yard coverage
|
43
|
+
#
|
44
|
+
# Return a :pass if the coverage is enough, :warn if it couldn't be read,
|
45
|
+
# otherwise, it has been read successfully.
|
46
|
+
#
|
47
|
+
def check_yard_coverage(stat_lines)
|
48
|
+
if config['min_coverage_percentage']
|
49
|
+
match = stat_lines.last.match(/^\s*([\d.]+)%\s+documented\s*$/)
|
50
|
+
unless match
|
51
|
+
return :warn
|
52
|
+
end
|
53
|
+
|
54
|
+
yard_coverage = match.captures[0].to_f
|
55
|
+
if yard_coverage >= config['min_coverage_percentage'].to_f
|
56
|
+
return :pass
|
57
|
+
end
|
58
|
+
|
59
|
+
yard_coverage
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Create the error messages
|
64
|
+
def error_messages(yard_coverage, error_text)
|
65
|
+
first_message = "You have a #{yard_coverage}% yard documentation coverage. "\
|
66
|
+
"#{config['min_coverage_percentage']}% is the minimum required."
|
67
|
+
|
68
|
+
# Add the undocumented objects text as error messages
|
69
|
+
messages = [Overcommit::Hook::Message.new(:error, nil, nil, first_message)]
|
70
|
+
|
71
|
+
errors = error_text.strip.split("\n")
|
72
|
+
errors.each do |undocumented_object|
|
73
|
+
undocumented_object_message, file_info = undocumented_object.split(/:?\s+/)
|
74
|
+
file_info_match = file_info.match(/^\(([^:]+):(\d+)\)/)
|
75
|
+
|
76
|
+
# In case any compacted error does not follow the format, ignore it
|
77
|
+
if file_info_match
|
78
|
+
file = file_info_match.captures[0]
|
79
|
+
line = file_info_match.captures[1]
|
80
|
+
messages << Overcommit::Hook::Message.new(
|
81
|
+
:error, file, line, "#{file}:#{line}: #{undocumented_object_message}"
|
82
|
+
)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
messages
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/overcommit/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: overcommit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.46.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brigade Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-09-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: childprocess
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- lib/overcommit/hook/pre_commit/execute_permissions.rb
|
135
135
|
- lib/overcommit/hook/pre_commit/fasterer.rb
|
136
136
|
- lib/overcommit/hook/pre_commit/fix_me.rb
|
137
|
+
- lib/overcommit/hook/pre_commit/flay.rb
|
137
138
|
- lib/overcommit/hook/pre_commit/foodcritic.rb
|
138
139
|
- lib/overcommit/hook/pre_commit/forbidden_branches.rb
|
139
140
|
- lib/overcommit/hook/pre_commit/go_lint.rb
|
@@ -161,6 +162,7 @@ files:
|
|
161
162
|
- lib/overcommit/hook/pre_commit/pep257.rb
|
162
163
|
- lib/overcommit/hook/pre_commit/pep8.rb
|
163
164
|
- lib/overcommit/hook/pre_commit/php_cs.rb
|
165
|
+
- lib/overcommit/hook/pre_commit/php_cs_fixer.rb
|
164
166
|
- lib/overcommit/hook/pre_commit/php_lint.rb
|
165
167
|
- lib/overcommit/hook/pre_commit/php_stan.rb
|
166
168
|
- lib/overcommit/hook/pre_commit/pronto.rb
|
@@ -186,6 +188,7 @@ files:
|
|
186
188
|
- lib/overcommit/hook/pre_commit/slim_lint.rb
|
187
189
|
- lib/overcommit/hook/pre_commit/sqlint.rb
|
188
190
|
- lib/overcommit/hook/pre_commit/standard.rb
|
191
|
+
- lib/overcommit/hook/pre_commit/stylelint.rb
|
189
192
|
- lib/overcommit/hook/pre_commit/trailing_whitespace.rb
|
190
193
|
- lib/overcommit/hook/pre_commit/travis_lint.rb
|
191
194
|
- lib/overcommit/hook/pre_commit/ts_lint.rb
|
@@ -196,6 +199,7 @@ files:
|
|
196
199
|
- lib/overcommit/hook/pre_commit/xml_syntax.rb
|
197
200
|
- lib/overcommit/hook/pre_commit/yaml_lint.rb
|
198
201
|
- lib/overcommit/hook/pre_commit/yaml_syntax.rb
|
202
|
+
- lib/overcommit/hook/pre_commit/yard_coverage.rb
|
199
203
|
- lib/overcommit/hook/pre_commit/yarn_check.rb
|
200
204
|
- lib/overcommit/hook/pre_push/base.rb
|
201
205
|
- lib/overcommit/hook/pre_push/brakeman.rb
|
@@ -277,7 +281,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
281
|
version: '0'
|
278
282
|
requirements: []
|
279
283
|
rubyforge_project:
|
280
|
-
rubygems_version: 2.7.
|
284
|
+
rubygems_version: 2.7.6
|
281
285
|
signing_key:
|
282
286
|
specification_version: 4
|
283
287
|
summary: Git hook manager
|