diff --git a/config/default.yml b/config/default.yml index 1dfccef5..325e7772 100644 --- a/config/default.yml +++ b/config/default.yml @@ -368,6 +368,14 @@ PreCommit: - 'db/schema.rb' - 'db/structure.sql' + Recess: + enabled: false + description: 'Analyzing with recess' + required_executable: 'recess' + install_command: 'npm install -g recess' + flags: ['--format=compact', '--stripColors'] + include: '**/*.css' + Reek: enabled: false description: 'Analyzing with Reek' diff --git a/lib/overcommit/hook/pre_commit/recess.rb b/lib/overcommit/hook/pre_commit/recess.rb new file mode 100644 index 00000000..f4e3b253 --- /dev/null +++ b/lib/overcommit/hook/pre_commit/recess.rb @@ -0,0 +1,18 @@ +module Overcommit::Hook::PreCommit + # Runs `recess` against any modified CSS files. + # + # @see https://twitter.github.io/recess/ + class Recess < Base + MESSAGE_REGEX = /^(?(?:\w:)?[^:]+):(?\d+):.+$/ + + def run + result = execute(command, args: applicable_files) + + raw_messages = result.stdout.split("\n").grep(MESSAGE_REGEX) + + # example message: + # path/to/file.css:1:Error message + extract_messages(raw_messages, MESSAGE_REGEX) + end + end +end diff --git a/spec/overcommit/hook/pre_commit/recess_spec.rb b/spec/overcommit/hook/pre_commit/recess_spec.rb new file mode 100644 index 00000000..5ace6e92 --- /dev/null +++ b/spec/overcommit/hook/pre_commit/recess_spec.rb @@ -0,0 +1,43 @@ +require 'spec_helper' + +describe Overcommit::Hook::PreCommit::Recess do + let(:config) { Overcommit::ConfigurationLoader.default_configuration } + let(:context) { double('context') } + subject { described_class.new(config, context) } + + let(:result) { double('result') } + + before do + subject.stub(:applicable_files).and_return(%w[file1.css file2.css]) + subject.stub(:execute).and_return(result) + end + + context 'when recess exits successfully' do + let(:result) { double('result') } + + before do + result.stub(:success?).and_return(true) + end + + context 'with no errors' do + before do + result.stub(:stdout).and_return(normalize_indent(<<-OUT)) + FILE: file1.css + STATUS: Perfect! + OUT + end + + it { should pass } + end + + context 'and it reports an error' do + before do + result.stub(:stdout).and_return(normalize_indent(<<-OUT)) + file1.css:1:Element selectors should not be overqualified + OUT + end + + it { should fail_hook } + end + end +end