pre-commit 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -5
  3. data/bin/pre-commit +7 -5
  4. data/lib/plugins/pre_commit/checks/before_all.rb +13 -0
  5. data/lib/plugins/pre_commit/checks/ci.rb +12 -0
  6. data/lib/plugins/pre_commit/checks/closure.rb +19 -0
  7. data/lib/plugins/pre_commit/checks/coffeelint.rb +19 -0
  8. data/lib/plugins/pre_commit/checks/console_log.rb +13 -0
  9. data/lib/plugins/pre_commit/checks/debugger.rb +21 -0
  10. data/lib/plugins/pre_commit/checks/gemfile_path.rb +14 -0
  11. data/lib/plugins/pre_commit/checks/js.rb +36 -0
  12. data/lib/plugins/pre_commit/checks/jshint.rb +24 -0
  13. data/lib/plugins/pre_commit/checks/jslint.rb +24 -0
  14. data/lib/plugins/pre_commit/checks/local.rb +13 -0
  15. data/lib/plugins/pre_commit/checks/merge_conflict.rb +12 -0
  16. data/lib/plugins/pre_commit/checks/migration.rb +38 -0
  17. data/lib/plugins/pre_commit/checks/nb_space.rb +23 -0
  18. data/lib/plugins/pre_commit/checks/php.rb +27 -0
  19. data/lib/plugins/pre_commit/checks/pry.rb +12 -0
  20. data/lib/plugins/pre_commit/checks/rspec_focus.rb +13 -0
  21. data/lib/plugins/pre_commit/checks/rubocop.rb +46 -0
  22. data/lib/plugins/pre_commit/checks/ruby_symbol_hashrockets.rb +16 -0
  23. data/lib/plugins/pre_commit/checks/tabs.rb +14 -0
  24. data/lib/plugins/pre_commit/checks/whitespace.rb +21 -0
  25. data/lib/pre-commit/checks.rb +66 -58
  26. data/lib/pre-commit/cli.rb +29 -2
  27. data/lib/pre-commit/support/templates/automatic_hook +35 -0
  28. data/lib/pre-commit/support/templates/default_hook +35 -0
  29. data/lib/pre-commit/support/templates/manual_hook +14 -0
  30. metadata +101 -26
  31. data/lib/pre-commit/checks/ci_check.rb +0 -10
  32. data/lib/pre-commit/checks/closure_check.rb +0 -13
  33. data/lib/pre-commit/checks/console_log_check.rb +0 -11
  34. data/lib/pre-commit/checks/debugger_check.rb +0 -19
  35. data/lib/pre-commit/checks/gemfile_path_check.rb +0 -12
  36. data/lib/pre-commit/checks/js_check.rb +0 -35
  37. data/lib/pre-commit/checks/jshint_check.rb +0 -26
  38. data/lib/pre-commit/checks/jslint_check.rb +0 -22
  39. data/lib/pre-commit/checks/local_check.rb +0 -11
  40. data/lib/pre-commit/checks/merge_conflict_check.rb +0 -10
  41. data/lib/pre-commit/checks/migration_check.rb +0 -33
  42. data/lib/pre-commit/checks/nb_space_check.rb +0 -21
  43. data/lib/pre-commit/checks/php_check.rb +0 -25
  44. data/lib/pre-commit/checks/pry_check.rb +0 -10
  45. data/lib/pre-commit/checks/rspec_focus_check.rb +0 -11
  46. data/lib/pre-commit/checks/rubocop_check.rb +0 -38
  47. data/lib/pre-commit/checks/ruby_symbol_hashrockets.rb +0 -14
  48. data/lib/pre-commit/checks/tabs_check.rb +0 -12
  49. data/lib/pre-commit/checks/whitespace_check.rb +0 -16
  50. data/lib/pre-commit/support/templates/pre-commit-hook +0 -23
@@ -1,10 +0,0 @@
1
- module PreCommit
2
- class CiCheck
3
- CI_TASK_NAME = 'pre_commit:ci'
4
-
5
- def self.call(_)
6
- return if system("rake #{CI_TASK_NAME} --silent")
7
- "your test suite has failed, for the full output run `#{CI_TASK_NAME}`"
8
- end
9
- end
10
- end
@@ -1,13 +0,0 @@
1
- module PreCommit
2
- class ClosureCheck
3
- CLOSURE_PATH = File.expand_path("../../support/closure/compiler.jar", __FILE__)
4
-
5
- def self.call(staged_files)
6
- return if staged_files.empty?
7
- js_args = staged_files.map {|arg| "--js #{arg}"}.join(' ')
8
- errors = `java -jar #{CLOSURE_PATH} #{js_args} --js_output_file /tmp/jammit.js 2>&1`.strip
9
- return if errors.empty?
10
- errors
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- module PreCommit
2
- class ConsoleLogCheck
3
- def self.call(staged_files)
4
- staged_files.reject! { |f| File.extname(f) != ".js" }
5
- return if staged_files.empty?
6
- errors = `#{Utils.grep} -e "console\\.log" #{staged_files.join(" ")} | grep -v \/\/`.strip
7
- return unless $?.success?
8
- "console.log found:\n#{errors}"
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- require 'pre-commit/utils'
2
-
3
- module PreCommit
4
- class DebuggerCheck
5
- def self.call(staged_files)
6
- files = files_to_check(staged_files)
7
- return if files.empty?
8
-
9
- errors = `#{Utils.grep} debugger #{files.join(" ")}`.strip
10
- return unless $?.success?
11
-
12
- "debugger statement(s) found:\n#{errors}"
13
- end
14
-
15
- def self.files_to_check(files)
16
- files.reject { |file| File.basename(file) =~ /^Gemfile/ }
17
- end
18
- end
19
- end
@@ -1,12 +0,0 @@
1
- require 'pre-commit/utils'
2
-
3
- module PreCommit
4
- class GemfilePathCheck
5
- def self.call(staged_files)
6
- return unless staged_files.include?("Gemfile")
7
- errors = `#{Utils.grep} 'path:|:path\\s*=>' Gemfile`.strip
8
- return unless $?.success?
9
- "local path found in Gemfile:\n#{errors}"
10
- end
11
- end
12
- end
@@ -1,35 +0,0 @@
1
- require 'pre-commit/utils'
2
- require 'execjs'
3
-
4
- module PreCommit
5
- class JsCheck
6
- def self.call(staged_files)
7
- staged_files = staged_files.select { |f| File.extname(f) == ".js" }
8
- return if staged_files.empty?
9
-
10
- errors = []
11
- staged_files.each do |file|
12
- error_list = Array(run_check(file))
13
- error_list.each { |error_object| errors << display_error(error_object, file) }
14
- end
15
-
16
- return if errors.empty?
17
- errors.join("\n")
18
- end
19
-
20
- def self.check_name
21
- raise "Must be defined by subclass"
22
- end
23
-
24
- def self.linter_src
25
- raise "Must be defined by subclass"
26
- end
27
-
28
- def self.display_error(error_object, file)
29
- return "" unless error_object
30
-
31
- line = error_object['line'].to_i + 1
32
- "#{error_object['reason']}\n#{file}:#{line} #{error_object['evidence']}"
33
- end
34
- end
35
- end
@@ -1,26 +0,0 @@
1
- require 'pre-commit/checks/js_check'
2
-
3
- module PreCommit
4
- class JshintCheck < JsCheck
5
- def self.config
6
- if config_file = [ENV['JSHINT_CONFIG'], ".jshintrc"].compact.detect { |f| File.exist?(f) }
7
- ExecJS.exec("return (#{File.read(config_file)});")
8
- else
9
- {}
10
- end
11
- end
12
-
13
- def self.check_name
14
- "JSHint"
15
- end
16
-
17
- def self.run_check(file)
18
- context = ExecJS.compile(File.read(linter_src))
19
- context.call('JSHINT', File.read(file), config)
20
- end
21
-
22
- def self.linter_src
23
- File.expand_path("../../support/jshint/jshint.js", __FILE__)
24
- end
25
- end
26
- end
@@ -1,22 +0,0 @@
1
- require 'pre-commit/checks/js_check'
2
-
3
- module PreCommit
4
- class JslintCheck < JsCheck
5
- def self.check_name
6
- "JSLint"
7
- end
8
-
9
- def self.run_check(file)
10
- context = ExecJS.compile(File.read(linter_src))
11
- if !(context.call('JSLINT', File.read(file)))
12
- context.exec('return JSLINT.errors;')
13
- else
14
- []
15
- end
16
- end
17
-
18
- def self.linter_src
19
- File.expand_path("../../support/jslint/lint.js", __FILE__)
20
- end
21
- end
22
- end
@@ -1,11 +0,0 @@
1
- module PreCommit
2
- class LocalCheck
3
- DEFAULT_LOCATION = "config/pre-commit.rb"
4
-
5
- def self.call(staged_files, script=DEFAULT_LOCATION)
6
- return unless File.exist?(script)
7
- output = `ruby #{script} #{staged_files.join(" ")} 2>&1`
8
- "#{script} failed:\n#{output}" unless $?.success?
9
- end
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- module PreCommit
2
- class MergeConflictCheck
3
- def self.call(staged_files)
4
- return if staged_files.empty?
5
- errors = `#{Utils.grep} '<<<<<<<' #{staged_files.join(" ")}`.strip
6
- return unless $?.success?
7
- "detected a merge conflict\n#{errors}"
8
- end
9
- end
10
- end
@@ -1,33 +0,0 @@
1
- module PreCommit
2
- class MigrationCheck
3
- class << self
4
- def call(staged_files)
5
- migration_files = migration_files(staged_files)
6
- schema_files = schema_files(staged_files)
7
-
8
- if migration_files.any? && schema_files.none?
9
- "It looks like you're adding a migration, but did not update the schema file"
10
- elsif migration_files.none? && schema_files.any?
11
- "You're trying to change the schema without adding a migration file"
12
- elsif migration_files.any? && schema_files.any?
13
- versions = migration_files.map { |f| f[/\d+/] }
14
- schema = schema_files.map { |f| File.read(f) }.join
15
- missing_versions = versions.select { |version| !schema.include?(version) }
16
- if missing_versions.any?
17
- "You did not add the schema versions for #{versions.join(', ')} to #{schema_files.join(' or ')}"
18
- end
19
- end
20
- end
21
-
22
- private
23
-
24
- def migration_files(staged_files)
25
- staged_files.grep(/db\/migrate\/.*\.rb/)
26
- end
27
-
28
- def schema_files(staged_files)
29
- staged_files.select { |f| File.basename(f) =~ /schema\.rb|structure.*\.sql/ }
30
- end
31
- end
32
- end
33
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
- module PreCommit
3
- class NbSpaceCheck
4
- def self.call(staged_files)
5
- nb_space = " "
6
- raise "you messed that up" unless nb_space.bytes.to_a == [194, 160]
7
-
8
- staged_files.reject! { |f| f =~ /^vendor\// || !File.read(f).include?(nb_space) }
9
-
10
- bad = staged_files.map do |file|
11
- content = File.read(file).lines.to_a
12
- line_no = content.index { |l| l.include?(nb_space) }
13
- char_no = content[line_no].index(nb_space)
14
- [file, line_no, char_no]
15
- end
16
-
17
- return if bad.empty?
18
- "Detected non-breaking space in #{bad.map { |f,l,c| "#{f}:#{l+1} character:#{c+1}" }.join(" and")}, remove it!"
19
- end
20
- end
21
- end
@@ -1,25 +0,0 @@
1
- require 'pre-commit/utils'
2
-
3
- module PreCommit
4
- class PhpCheck
5
- def self.call(staged_files)
6
- staged_files = staged_files.grep /\.(php|engine|theme|install|inc|module|test)$/
7
- return if staged_files.empty?
8
-
9
- errors = staged_files.map { |file| run_check(file) }.compact
10
- return if errors.empty?
11
-
12
- errors.join("\n")
13
- end
14
-
15
- def self.run_check(file)
16
- # We force PHP to display errors otherwise they will likely end up in the
17
- # error_log and not in stdout.
18
- result = `php -d display_errors=1 -l #{file}`
19
- # Filter out the obvious note from PHP.
20
- result = result.split($/).find_all {|line| line !~ /Errors/}.join($/)
21
- # If PHP exited non-zero then there was a parse error.
22
- result.strip unless $? == 0
23
- end
24
- end
25
- end
@@ -1,10 +0,0 @@
1
- module PreCommit
2
- class PryCheck
3
- def self.call(staged_files)
4
- return if staged_files.empty?
5
- result = `#{Utils.grep} binding.pry #{staged_files.join(" ")}`.strip
6
- return unless $?.success?
7
- "binding.pry found:\n#{result}"
8
- end
9
- end
10
- end
@@ -1,11 +0,0 @@
1
- module PreCommit
2
- class RSpecFocusCheck
3
- def self.call(staged_files)
4
- staged_files = staged_files.grep(/_spec\.rb$/)
5
- return if staged_files.empty?
6
- result = `#{Utils.grep} ':focus' #{staged_files.join(" ")}`.strip
7
- return unless $?.success?
8
- ":focus found in specs:\n#{result}"
9
- end
10
- end
11
- end
@@ -1,38 +0,0 @@
1
- require 'pre-commit/utils'
2
- require 'rubocop'
3
- require 'stringio'
4
-
5
- module PreCommit
6
- class RubocopCheck
7
- def self.call(staged_files)
8
- staged_files = staged_files.grep(/\.rb$/)
9
- return if staged_files.empty?
10
- config_file = `git config pre-commit.rubocop.config`.chomp
11
-
12
- args = staged_files
13
- if !config_file.empty?
14
- if !File.exist? config_file
15
- $stderr.puts "Warning: rubocop config file '" + config_file + "' does not exist"
16
- $stderr.puts "Set the path to the config file using:"
17
- $stderr.puts "\tgit config pre-commit.rubocop.config 'path/relative/to/git/dir/rubocop.yml'"
18
- $stderr.puts "rubocop will use its default configuration or look for a .rubocop.yml file\n\n"
19
- else
20
- args = ['-c', config_file] + args
21
- end
22
- end
23
-
24
- success, captured = capture { Rubocop::CLI.new.run(args) == 0 }
25
- captured unless success
26
- end
27
-
28
- def self.capture
29
- $stdout, stdout = StringIO.new, $stdout
30
- $stderr, stderr = StringIO.new, $stderr
31
- result = yield
32
- [result, $stdout.string + $stderr.string]
33
- ensure
34
- $stdout = stdout
35
- $stderr = stderr
36
- end
37
- end
38
- end
@@ -1,14 +0,0 @@
1
- require 'pre-commit/utils'
2
-
3
- module PreCommit
4
- class RubySymbolHashrockets
5
- HASHROCKET_PATTERN = '[^:](:{1}(?:\$|@|@@|[_A-Za-z])?\w*[=!?]?\s*=>\s*)'
6
-
7
- def self.call(staged_files)
8
- return if staged_files.empty?
9
- lines = `#{Utils.grep} '#{HASHROCKET_PATTERN}' #{staged_files.join(" ")}`.strip
10
- return unless $?.success?
11
- "detected :symbol => value hashrocket:\n#{lines}"
12
- end
13
- end
14
- end
@@ -1,12 +0,0 @@
1
- module PreCommit
2
- class TabsCheck
3
- LEADING_TAB_PATTERN = '^ *\t'
4
-
5
- def self.call(staged_files)
6
- return if staged_files.empty?
7
- errors = `#{Utils.grep} '#{LEADING_TAB_PATTERN}' #{staged_files.join(" ")}`.strip
8
- return unless $?.success?
9
- "detected tab before initial space:\n#{errors}"
10
- end
11
- end
12
- end
@@ -1,16 +0,0 @@
1
- module PreCommit
2
- class WhiteSpaceCheck
3
- def self.call(_)
4
- errors = `git diff-index --check --cached HEAD -- 2>&1`
5
- return if $?.success?
6
-
7
- # Initial commit: diff against the empty tree object
8
- if errors =~ /fatal: bad revision 'HEAD'/
9
- errors = `git diff-index --check --cached 4b825dc642cb6eb9a060e54bf8d69288fbee4904 -- 2>&1`
10
- return if $?.success?
11
- end
12
-
13
- errors
14
- end
15
- end
16
- end
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env sh
2
-
3
- cmd=`git config pre-commit.ruby 2>/dev/null`
4
- if test -n "${cmd}"
5
- then true
6
- elif which rvm > /dev/null
7
- then cmd="rvm default do ruby"
8
- elif which rbenv > /dev/null
9
- then cmd="rbenv exec ruby"
10
- else cmd="ruby"
11
- fi
12
-
13
- export rvm_silence_path_mismatch_check_flag=1
14
-
15
- ${cmd} -rrubygems -e '
16
- begin
17
- require "pre-commit"
18
- true
19
- rescue LoadError
20
- $stderr.puts "pre-commit: WARNING: Skipping checks because the pre-commit gem is not installed. (Did you change your Ruby version?)"
21
- false
22
- end and PreCommit.run
23
- '