phare 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35069f434b69d4d2b08242381c29e2f79430e9c8
4
- data.tar.gz: b1830fa17a58c356fa2697a58891faf853564713
3
+ metadata.gz: 5e4055ee6e95ae9be4856e7031220de6735136a4
4
+ data.tar.gz: 03a9678f15427a0affb3e76faaeb6694fb2d9775
5
5
  SHA512:
6
- metadata.gz: 0b9571363ff3a64770d27ec08fafeb1dfb43f2dc690f5c7625c0f7293f23d66e6ac3a0e82f13b8c2cf8b49e2cc937565c321daa357a03fab3f7662391d65452e
7
- data.tar.gz: f58562f9ecdfbeec535604a86fff42170abae6a82e52b668b267861f38fa68d6663f7042c3a5c32347be1503d656f185ff10c46dd5a3c1ee80c9b008a612ccda
6
+ metadata.gz: 83ee6107f5879b34f1da3a9554d96f2bdaccc982bb12f9d768f359d8b6809dae1f048acd3e76ac56584a4790b50e6b475d76e071d9b6e36ccc3c529bd0ffbafb
7
+ data.tar.gz: 838988f8a43ba902060c4c4b8036228d946fd80d4337bacbe6879bb6369519c354f47140c7feb0031829cfd3d5797da72e5de932f7fb26b265459231e75a35e8
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,17 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+
7
+ script:
8
+ - 'echo "Checking code style" && ./bin/phare'
9
+ - 'echo "Running specs" && bundle exec rake spec'
10
+
11
+ notifications:
12
+ hipchat:
13
+ rooms:
14
+ secure: "OjYHtwmsG6bDC8mewX85yulCKxsVpvGiic32e6lDRq2TYmMtot/atOQaZ16YlMMN0CQqiJ8jfpil3HWCSK1iPZxSLHzCEu//bL6uoDJdPc/oXNV2BPAj0CxyHiJPpV3gdgdnZBbYGNdDPtjxo8FuZnM+cWIDl3yW0Y2rQkE7u0k="
15
+ template:
16
+ - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (<a href="%{build_url}">Build</a>/<a href="%{compare_url}">Changes</a>)'
17
+ format: 'html'
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
+ require 'bundler'
2
+ require 'rake'
1
3
  require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ task default: :spec
7
+
8
+ desc 'Run all specs'
9
+ RSpec::Core::RakeTask.new(:spec) do |task|
10
+ task.pattern = 'spec/**/*_spec.rb'
11
+ end
data/bin/phare CHANGED
@@ -4,4 +4,4 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
4
 
5
5
  require 'phare'
6
6
 
7
- Phare::CLI.new(ENV)
7
+ Phare::CLI.new(ENV, ARGV).run
@@ -1,10 +1,31 @@
1
1
  require 'English'
2
+ require 'optparse'
2
3
  require 'phare/version'
3
4
 
4
5
  require 'phare/cli'
6
+
5
7
  require 'phare/check'
8
+ require 'phare/check/rubocop'
9
+ require 'phare/check/scss_lint'
10
+ require 'phare/check/jshint'
11
+ require 'phare/check/jscs'
12
+
13
+ require 'phare/check_suite'
14
+
15
+ module Phare
16
+ def self.system(*args)
17
+ Kernel.system(*args)
18
+ end
19
+
20
+ def self.system_output(args)
21
+ `#{args}`
22
+ end
23
+
24
+ def self.last_exit_status
25
+ $CHILD_STATUS.exitstatus
26
+ end
6
27
 
7
- require 'phare/checks/ruby_rubocop'
8
- require 'phare/checks/scss_lint'
9
- require 'phare/checks/javascript_jshint'
10
- require 'phare/checks/javascript_jscs'
28
+ def self.puts(*args)
29
+ STDOUT.puts(*args)
30
+ end
31
+ end
@@ -1,28 +1,33 @@
1
1
  module Phare
2
2
  class Check
3
- attr_reader :status
4
-
5
- def initialize(directory)
6
- @directory = directory
7
- @directory << '/' unless @directory.end_with?('/')
8
- end
3
+ attr_reader :status, :command
9
4
 
10
5
  def run
11
- @checks = []
6
+ if should_run?
7
+ print_banner
8
+ Phare.system(command)
9
+ @status = Phare.last_exit_status
12
10
 
13
- @checks << ruby = Checks::RubyRubocop.new
14
- ruby.run
11
+ if @status == 0
12
+ print_success_message
13
+ else
14
+ print_error_message
15
+ end
15
16
 
16
- @checks << scsslint = Checks::ScssLint.new(@directory)
17
- scsslint.run
17
+ Phare.puts ''
18
+ else
19
+ @status = 0
20
+ end
21
+ end
18
22
 
19
- @checks << jshint = Checks::JavaScriptJSHint.new(@directory)
20
- jshint.run
23
+ protected
21
24
 
22
- @checks << jscs = Checks::JavaScriptJSCS.new(@directory)
23
- jscs.run
25
+ def print_success_message
26
+ Phare.puts('Everything looks good from here!')
27
+ end
24
28
 
25
- @status = @checks.map!(&:status).find { |status| status > 0 } || 0
29
+ def print_error_message
30
+ Phare.puts("Something went wrong. Program exited with #{@status}.")
26
31
  end
27
32
  end
28
33
  end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ module Phare
3
+ class Check
4
+ class JSCS < Check
5
+ attr_reader :config, :path
6
+
7
+ def initialize(directory)
8
+ @config = File.expand_path("#{directory}.jscs.json", __FILE__)
9
+ @path = File.expand_path("#{directory}app/assets", __FILE__)
10
+ end
11
+
12
+ def command
13
+ "jscs #{@path}"
14
+ end
15
+
16
+ protected
17
+
18
+ def should_run?
19
+ !Phare.system_output('which jscs').empty? && File.exists?(@config) && Dir.exists?(@path)
20
+ end
21
+
22
+ def print_banner
23
+ Phare.puts '---------------------------------------------'
24
+ Phare.puts 'Running JSCS to check for JavaScript style…'
25
+ Phare.puts '---------------------------------------------'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ module Phare
3
+ class Check
4
+ class JSHint < Check
5
+ attr_reader :config, :path
6
+
7
+ def initialize(directory)
8
+ @config = File.expand_path("#{directory}.jshintrc", __FILE__)
9
+ @path = File.expand_path("#{directory}app/assets/javascripts", __FILE__)
10
+ @glob = File.join(@path, '**/*')
11
+ end
12
+
13
+ def command
14
+ "jshint --config #{@config} --extra-ext .js,.es6.js #{@glob}"
15
+ end
16
+
17
+ protected
18
+
19
+ def should_run?
20
+ !Phare.system_output('which jshint').empty? && File.exists?(@config) && Dir.exists?(@path)
21
+ end
22
+
23
+ def print_banner
24
+ Phare.puts '---------------------------------------------'
25
+ Phare.puts 'Running JSHint to check for JavaScript style…'
26
+ Phare.puts '---------------------------------------------'
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ module Phare
3
+ class Check
4
+ class Rubocop < Check
5
+ def initialize(directory)
6
+ @path = directory
7
+ end
8
+
9
+ def command
10
+ 'rubocop'
11
+ end
12
+
13
+ protected
14
+
15
+ def should_run?
16
+ !Phare.system_output('which rubocop').empty?
17
+ end
18
+
19
+ def print_banner
20
+ Phare.puts '----------------------------------------'
21
+ Phare.puts 'Running Rubocop to check for Ruby style…'
22
+ Phare.puts '----------------------------------------'
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Phare
3
+ class Check
4
+ class ScssLint < Check
5
+ attr_reader :path
6
+
7
+ def initialize(directory)
8
+ @path = File.expand_path("#{directory}app/assets/stylesheets", __FILE__)
9
+ end
10
+
11
+ def command
12
+ "scss-lint #{@path}"
13
+ end
14
+
15
+ protected
16
+
17
+ def should_run?
18
+ !Phare.system_output('which scss-lint').empty? && Dir.exists?(@path)
19
+ end
20
+
21
+ def print_banner
22
+ Phare.puts '------------------------------------------'
23
+ Phare.puts 'Running SCSS-Lint to check for SCSS style…'
24
+ Phare.puts '------------------------------------------'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ module Phare
2
+ class CheckSuite
3
+ attr_reader :status
4
+
5
+ DEFAULT_CHECKS = {
6
+ rubocop: Check::Rubocop,
7
+ scsslint: Check::ScssLint,
8
+ jshint: Check::JSHint,
9
+ jscs: Check::JSCS
10
+ }
11
+
12
+ def initialize(options = {})
13
+ @options = options
14
+
15
+ @directory = options[:directory]
16
+ @directory << '/' unless @directory.end_with?('/')
17
+
18
+ @options[:skip] ||= []
19
+ @options[:only] ||= []
20
+ end
21
+
22
+ def checks
23
+ checks = DEFAULT_CHECKS.keys
24
+
25
+ if @options[:only].any?
26
+ checks = checks & @options[:only]
27
+ elsif @options[:skip]
28
+ checks = checks - @options[:skip]
29
+ else
30
+ checks
31
+ end
32
+ end
33
+
34
+ def run
35
+ @checks = checks.map do |check|
36
+ check = DEFAULT_CHECKS[check]
37
+ check.new(@directory).tap(&:run).status
38
+ end
39
+
40
+ @status = @checks.find { |status| status > 0 } || 0
41
+ end
42
+ end
43
+ end
@@ -1,27 +1,59 @@
1
+ # encoding: utf-8
1
2
  module Phare
2
3
  class CLI
3
- def initialize(env)
4
- if env['SKIP_CODE_CHECK']
5
- puts '--------------------------------------------------------'
6
- puts 'Skipping code style checking… Really? Well alright then…'
7
- puts '--------------------------------------------------------'
4
+ attr_reader :suite
5
+
6
+ def initialize(env, argv)
7
+ @env = env
8
+ @argv = argv
9
+ parse_options
10
+
11
+ @suite = Phare::CheckSuite.new(@options)
12
+ end
13
+
14
+ def run
15
+ if @env['SKIP_CODE_CHECK']
16
+ Phare.puts '--------------------------------------------------------'
17
+ Phare.puts 'Skipping code style checking… Really? Well alright then…'
18
+ Phare.puts '--------------------------------------------------------'
8
19
 
9
20
  exit 0
10
21
  else
11
- if Phare::Check.new(Dir.getwd).tap { |c| c.run }.status == 0
12
- puts '------------------------------------------'
13
- puts 'Everything looks good, keep on committing!'
14
- puts '------------------------------------------'
22
+ if @suite.tap(&:run).status == 0
23
+ Phare.puts '------------------------------------------'
24
+ Phare.puts 'Everything looks good, keep on committing!'
25
+ Phare.puts '------------------------------------------'
15
26
 
16
27
  exit 0
17
28
  else
18
- puts '------------------------------------------------------------------------'
19
- puts 'Something’s wrong with your code style. Please fix it before committing.'
20
- puts '------------------------------------------------------------------------'
29
+ Phare.puts '------------------------------------------------------------------------'
30
+ Phare.puts 'Something’s wrong with your code style. Please fix it before committing.'
31
+ Phare.puts '------------------------------------------------------------------------'
21
32
 
22
33
  exit 1
23
34
  end
24
35
  end
25
36
  end
37
+
38
+ def parse_options
39
+ @options = { directory: Dir.getwd }
40
+
41
+ OptionParser.new do |opts|
42
+ opts.banner = 'Usage: phare [options]'
43
+
44
+ opts.on('--directory', 'The directory in which to run the checks (default is the current directory') do |directory|
45
+ @options[:directory] = directory
46
+ end
47
+
48
+ opts.on('--skip x,y,z', 'Skip checks') do |checks|
49
+ @options[:skip] = checks.split(',').map(&:to_sym)
50
+ end
51
+
52
+ opts.on('--only x,y,z', 'Only run the specified checks') do |checks|
53
+ @options[:only] = checks.split(',').map(&:to_sym)
54
+ end
55
+
56
+ end.parse! @argv
57
+ end
26
58
  end
27
59
  end
@@ -1,3 +1,3 @@
1
1
  module Phare
2
- VERSION = '0.3'
2
+ VERSION = '0.4'
3
3
  end
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Phare::VERSION
9
9
  spec.authors = ['Rémi Prévost']
10
10
  spec.email = ['remi@exomel.com']
11
- spec.description = ''
12
- spec.summary = ''
11
+ spec.description = 'Phare looks into your files and check for (Ruby, JavaScript and SCSS) coding style errors.'
12
+ spec.summary = spec.description
13
13
  spec.homepage = 'https://github.com/mirego/phare'
14
14
  spec.license = 'BSD 3-Clause'
15
15
 
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.3'
22
22
  spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'rspec', '~> 3.0.0.beta2'
23
24
  end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phare::Check::JSCS do
4
+ describe :should_run? do
5
+ let(:check) { described_class.new('.') }
6
+ before do
7
+ expect(Phare).to receive(:system_output).with('which jscs').and_return(which_output)
8
+ allow(File).to receive(:exists?).with(check.config).and_return(config_exists?)
9
+ allow(Dir).to receive(:exists?).with(check.path).and_return(path_exists?)
10
+ end
11
+
12
+ context 'with found jscs command' do
13
+ let(:which_output) { 'jscs' }
14
+ let(:config_exists?) { true }
15
+ let(:path_exists?) { true }
16
+ it { expect(check).to be_able_to_run }
17
+ end
18
+
19
+ context 'with unfound jscs command' do
20
+ let(:which_output) { '' }
21
+ let(:config_exists?) { false }
22
+ let(:path_exists?) { false }
23
+ it { expect(check).to_not be_able_to_run }
24
+ end
25
+ end
26
+
27
+ describe :run do
28
+ let(:check) { described_class.new('.') }
29
+ let(:run!) { check.run }
30
+
31
+ context 'with available JSCS' do
32
+ before do
33
+ expect(check).to receive(:should_run?).and_return(true)
34
+ expect(Phare).to receive(:system).with(check.command)
35
+ expect(Phare).to receive(:last_exit_status).and_return(jscs_exit_status)
36
+ expect(check).to receive(:print_banner)
37
+ end
38
+
39
+ context 'with check errors' do
40
+ let(:jscs_exit_status) { 0 }
41
+ it { expect { run! }.to change { check.status }.to(jscs_exit_status) }
42
+ end
43
+
44
+ context 'without check errors' do
45
+ let(:jscs_exit_status) { 1337 }
46
+ before { expect(Phare).to receive(:puts).with("Something went wrong. Program exited with #{jscs_exit_status}.") }
47
+ it { expect { run! }.to change { check.status }.to(jscs_exit_status) }
48
+ end
49
+ end
50
+
51
+ context 'with unavailable JSCS' do
52
+ before do
53
+ expect(check).to receive(:should_run?).and_return(false)
54
+ expect(Phare).to_not receive(:system).with(check.command)
55
+ expect(check).to_not receive(:print_banner)
56
+ end
57
+
58
+ it { expect { run! }.to change { check.status }.to(0) }
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phare::Check::JSHint do
4
+ describe :should_run? do
5
+ let(:check) { described_class.new('.') }
6
+ before do
7
+ expect(Phare).to receive(:system_output).with('which jshint').and_return(which_output)
8
+ allow(File).to receive(:exists?).with(check.config).and_return(config_exists?)
9
+ allow(Dir).to receive(:exists?).with(check.path).and_return(path_exists?)
10
+ end
11
+
12
+ context 'with found jshint command' do
13
+ let(:which_output) { 'jshint' }
14
+ let(:config_exists?) { true }
15
+ let(:path_exists?) { true }
16
+ it { expect(check).to be_able_to_run }
17
+ end
18
+
19
+ context 'with unfound jshint command' do
20
+ let(:which_output) { '' }
21
+ let(:config_exists?) { false }
22
+ let(:path_exists?) { false }
23
+ it { expect(check).to_not be_able_to_run }
24
+ end
25
+ end
26
+
27
+ describe :run do
28
+ let(:check) { described_class.new('.') }
29
+ let(:run!) { check.run }
30
+
31
+ context 'with available JSHint' do
32
+ before do
33
+ expect(check).to receive(:should_run?).and_return(true)
34
+ expect(Phare).to receive(:system).with(check.command)
35
+ expect(Phare).to receive(:last_exit_status).and_return(jshint_exit_status)
36
+ expect(check).to receive(:print_banner)
37
+ end
38
+
39
+ context 'with check errors' do
40
+ let(:jshint_exit_status) { 0 }
41
+ before { expect(Phare).to receive(:puts).with('Everything looks good from here!') }
42
+ it { expect { run! }.to change { check.status }.to(jshint_exit_status) }
43
+ end
44
+
45
+ context 'without check errors' do
46
+ let(:jshint_exit_status) { 1337 }
47
+ before { expect(Phare).to receive(:puts).with("Something went wrong. Program exited with #{jshint_exit_status}.") }
48
+ it { expect { run! }.to change { check.status }.to(jshint_exit_status) }
49
+ end
50
+ end
51
+
52
+ context 'with unavailable JSHint' do
53
+ before do
54
+ expect(check).to receive(:should_run?).and_return(false)
55
+ expect(Phare).to_not receive(:system).with(check.command)
56
+ expect(check).to_not receive(:print_banner)
57
+ end
58
+
59
+ it { expect { run! }.to change { check.status }.to(0) }
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phare::Check::Rubocop do
4
+ describe :should_run? do
5
+ let(:check) { described_class.new('.') }
6
+ before { expect(Phare).to receive(:system_output).with('which rubocop').and_return(which_output) }
7
+
8
+ context 'with found rubocop command' do
9
+ let(:which_output) { 'rubocop' }
10
+ it { expect(check).to be_able_to_run }
11
+ end
12
+
13
+ context 'with unfound rubocop command' do
14
+ let(:which_output) { '' }
15
+ it { expect(check).to_not be_able_to_run }
16
+ end
17
+ end
18
+
19
+ describe :run do
20
+ let(:check) { described_class.new('.') }
21
+ let(:run!) { check.run }
22
+
23
+ context 'with available Rubocop' do
24
+ before do
25
+ expect(check).to receive(:should_run?).and_return(true)
26
+ expect(Phare).to receive(:system).with(check.command)
27
+ expect(Phare).to receive(:last_exit_status).and_return(rubocop_exit_status)
28
+ expect(check).to receive(:print_banner)
29
+ end
30
+
31
+ context 'with check errors' do
32
+ let(:rubocop_exit_status) { 0 }
33
+ it { expect { run! }.to change { check.status }.to(0) }
34
+ end
35
+
36
+ context 'without check errors' do
37
+ let(:rubocop_exit_status) { 1337 }
38
+ before { expect(Phare).to receive(:puts).with("Something went wrong. Program exited with #{rubocop_exit_status}.") }
39
+ it { expect { run! }.to change { check.status }.to(rubocop_exit_status) }
40
+ end
41
+ end
42
+
43
+ context 'with unavailable Rubocop' do
44
+ before do
45
+ expect(check).to receive(:should_run?).and_return(false)
46
+ expect(Phare).to_not receive(:system).with(check.command)
47
+ expect(check).to_not receive(:print_banner)
48
+ end
49
+
50
+ it { expect { run! }.to change { check.status }.to(0) }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phare::Check::ScssLint do
4
+ describe :should_run? do
5
+ let(:check) { described_class.new('.') }
6
+ before do
7
+ expect(Phare).to receive(:system_output).with('which scss-lint').and_return(which_output)
8
+ allow(Dir).to receive(:exists?).with(check.path).and_return(path_exists?)
9
+ end
10
+
11
+ context 'with found scss-lint command' do
12
+ let(:which_output) { 'scss-lint' }
13
+ let(:path_exists?) { true }
14
+ it { expect(check).to be_able_to_run }
15
+ end
16
+
17
+ context 'with unfound scss-lint command' do
18
+ let(:which_output) { '' }
19
+ let(:path_exists?) { false }
20
+ it { expect(check).to_not be_able_to_run }
21
+ end
22
+ end
23
+
24
+ describe :run do
25
+ let(:check) { described_class.new('.') }
26
+ let(:run!) { check.run }
27
+
28
+ context 'with available ScssLint' do
29
+ before do
30
+ expect(check).to receive(:should_run?).and_return(true)
31
+ expect(Phare).to receive(:system).with(check.command)
32
+ expect(Phare).to receive(:last_exit_status).and_return(scsslint_exit_status)
33
+ expect(check).to receive(:print_banner)
34
+ end
35
+
36
+ context 'with check errors' do
37
+ let(:scsslint_exit_status) { 0 }
38
+ before { expect(Phare).to receive(:puts).with('Everything looks good from here!') }
39
+ it { expect { run! }.to change { check.status }.to(scsslint_exit_status) }
40
+ end
41
+
42
+ context 'without check errors' do
43
+ let(:scsslint_exit_status) { 1337 }
44
+ before { expect(Phare).to receive(:puts).with("Something went wrong. Program exited with #{scsslint_exit_status}.") }
45
+ it { expect { run! }.to change { check.status }.to(scsslint_exit_status) }
46
+ end
47
+ end
48
+
49
+ context 'with unavailable ScssLint' do
50
+ before do
51
+ expect(check).to receive(:should_run?).and_return(false)
52
+ expect(Phare).to_not receive(:system).with(check.command)
53
+ expect(check).to_not receive(:print_banner)
54
+ end
55
+
56
+ it { expect { run! }.to change { check.status }.to(0) }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phare::CheckSuite do
4
+ describe :run do
5
+ let(:options) { { directory: '.' } }
6
+ let(:suite) { described_class.new(options) }
7
+
8
+ before do
9
+ Phare::CheckSuite::DEFAULT_CHECKS.values.each_with_index do |check, index|
10
+ exit_status = exit_status_proc.call(index)
11
+ allow_any_instance_of(check).to receive(:run)
12
+ allow_any_instance_of(check).to receive(:status).and_return(exit_status)
13
+ end
14
+ end
15
+
16
+ context 'with a single failing check' do
17
+ let(:exit_status_proc) do
18
+ proc { |index| index == 2 ? 1337 : 0 }
19
+ end
20
+
21
+ it { expect { suite.run }.to change { suite.status }.to(1337) }
22
+ end
23
+
24
+ context 'with a multiple failing checks' do
25
+ let(:exit_status_proc) do
26
+ proc { |index| (index * 500) + 20 }
27
+ end
28
+
29
+ it { expect { suite.run }.to change { suite.status }.to(20) }
30
+ end
31
+
32
+ context 'with no failing check' do
33
+ let(:exit_status_proc) { proc { |index| 0 } }
34
+
35
+ it { expect { suite.run }.to change { suite.status }.to(0) }
36
+ end
37
+ end
38
+
39
+ describe :checks do
40
+ let(:options) { { directory: '.', skip: skip, only: only } }
41
+ let(:suite) { described_class.new(options) }
42
+ let(:skip) { [] }
43
+ let(:only) { [] }
44
+
45
+ context 'with "only" option' do
46
+ let(:only) { [:rubocop, :foo, :jshint] }
47
+ it { expect(suite.checks).to eql [:rubocop, :jshint] }
48
+ end
49
+
50
+ context 'with "skip" option' do
51
+ let(:skip) { [:scsslint, :foo, :jshint] }
52
+ it { expect(suite.checks).to eql [:rubocop, :jscs] }
53
+ end
54
+
55
+ context 'with both "only" and "skip" option' do
56
+ let(:skip) { [:scsslint, :rubocop] }
57
+ let(:only) { [:scsslint, :foo, :jshint] }
58
+ it { expect(suite.checks).to eql [:scsslint, :jshint] }
59
+ end
60
+
61
+ context 'with both "only" and "skip" option' do
62
+ it { expect(suite.checks).to eql Phare::CheckSuite::DEFAULT_CHECKS.keys }
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Phare::CLI do
4
+ let(:cli) { described_class.new(env, argv) }
5
+ let(:argv) { [] }
6
+ let(:run!) { cli.run }
7
+
8
+ describe :initialize do
9
+ context 'with code check skipping' do
10
+ let(:env) { { 'SKIP_CODE_CHECK' => '1' } }
11
+ it { expect { run! }.to exit_with_code(0) }
12
+ end
13
+
14
+ context 'without code check skipping' do
15
+ let(:env) { {} }
16
+
17
+ context 'with suite errors' do
18
+ before do
19
+ expect(cli.suite).to receive(:run)
20
+ expect(cli.suite).to receive(:status).and_return(1337)
21
+ end
22
+
23
+ it { expect { run! }.to exit_with_code(1) }
24
+ end
25
+
26
+ context 'without suite errors' do
27
+ before do
28
+ expect(cli.suite).to receive(:run)
29
+ expect(cli.suite).to receive(:status).and_return(0)
30
+ end
31
+
32
+ it { expect { run! }.to exit_with_code(0) }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,44 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'rspec'
4
+ require 'phare'
5
+
6
+ RSpec.configure do |config|
7
+ config.before(:each) do
8
+ # Disable all logging
9
+ allow(Phare).to receive(:puts)
10
+ end
11
+ end
12
+
13
+ RSpec::Matchers.define :be_able_to_run do
14
+ match do |actual|
15
+ actual.send(:should_run?) == true
16
+ end
17
+ end
18
+
19
+ RSpec::Matchers.define :exit_with_code do |expected_code|
20
+ actual = nil
21
+
22
+ match do |block|
23
+ begin
24
+ block.call
25
+ rescue SystemExit => e
26
+ actual = e.status
27
+ end
28
+
29
+ actual && actual == expected_code
30
+ end
31
+
32
+ failure_message do |block|
33
+ "expected block to call exit(#{expected_code}) but exit" +
34
+ (actual.nil? ? ' not called' : "(#{actual}) was called")
35
+ end
36
+
37
+ failure_message_when_negated do |block|
38
+ "expected block not to call exit(#{expected_code})"
39
+ end
40
+
41
+ description do
42
+ "expect block to call exit(#{expected_code})"
43
+ end
44
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phare
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
4
+ version: '0.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémi Prévost
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-04 00:00:00.000000000 Z
11
+ date: 2014-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,7 +38,22 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: ''
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 3.0.0.beta2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 3.0.0.beta2
55
+ description: Phare looks into your files and check for (Ruby, JavaScript and SCSS)
56
+ coding style errors.
42
57
  email:
43
58
  - remi@exomel.com
44
59
  executables:
@@ -47,7 +62,9 @@ extensions: []
47
62
  extra_rdoc_files: []
48
63
  files:
49
64
  - .gitignore
65
+ - .rspec
50
66
  - .rubocop.yml
67
+ - .travis.yml
51
68
  - Gemfile
52
69
  - LICENSE.md
53
70
  - README.md
@@ -55,13 +72,21 @@ files:
55
72
  - bin/phare
56
73
  - lib/phare.rb
57
74
  - lib/phare/check.rb
58
- - lib/phare/checks/javascript_jscs.rb
59
- - lib/phare/checks/javascript_jshint.rb
60
- - lib/phare/checks/ruby_rubocop.rb
61
- - lib/phare/checks/scss_lint.rb
75
+ - lib/phare/check/jscs.rb
76
+ - lib/phare/check/jshint.rb
77
+ - lib/phare/check/rubocop.rb
78
+ - lib/phare/check/scss_lint.rb
79
+ - lib/phare/check_suite.rb
62
80
  - lib/phare/cli.rb
63
81
  - lib/phare/version.rb
64
82
  - phare.gemspec
83
+ - spec/phare/check/jscs_spec.rb
84
+ - spec/phare/check/jshint_spec.rb
85
+ - spec/phare/check/rubocop_spec.rb
86
+ - spec/phare/check/scss_lint_spec.rb
87
+ - spec/phare/check_suite_spec.rb
88
+ - spec/phare/cli_spec.rb
89
+ - spec/spec_helper.rb
65
90
  homepage: https://github.com/mirego/phare
66
91
  licenses:
67
92
  - BSD 3-Clause
@@ -85,5 +110,13 @@ rubyforge_project:
85
110
  rubygems_version: 2.1.0
86
111
  signing_key:
87
112
  specification_version: 4
88
- summary: ''
89
- test_files: []
113
+ summary: Phare looks into your files and check for (Ruby, JavaScript and SCSS) coding
114
+ style errors.
115
+ test_files:
116
+ - spec/phare/check/jscs_spec.rb
117
+ - spec/phare/check/jshint_spec.rb
118
+ - spec/phare/check/rubocop_spec.rb
119
+ - spec/phare/check/scss_lint_spec.rb
120
+ - spec/phare/check_suite_spec.rb
121
+ - spec/phare/cli_spec.rb
122
+ - spec/spec_helper.rb
@@ -1,41 +0,0 @@
1
- module Phare
2
- module Checks
3
- class JavaScriptJSCS
4
- attr_reader :status
5
-
6
- def initialize(directory)
7
- @config = File.expand_path("#{directory}.jscs.json", __FILE__)
8
- @path = File.expand_path("#{directory}app/assets", __FILE__)
9
- @command = "jscs #{@path}"
10
- end
11
-
12
- def run
13
- if should_run?
14
- print_banner
15
- system(@command)
16
- @status = $CHILD_STATUS.exitstatus
17
-
18
- unless @status == 0
19
- puts "Something went wrong. Program exited with #{@status}"
20
- end
21
-
22
- puts ''
23
- else
24
- @status = 0
25
- end
26
- end
27
-
28
- protected
29
-
30
- def should_run?
31
- !`which jscs`.empty? && File.exists?(@config) && Dir.exists?(@path)
32
- end
33
-
34
- def print_banner
35
- puts '---------------------------------------------'
36
- puts 'Running JSCS to check for JavaScript style…'
37
- puts '---------------------------------------------'
38
- end
39
- end
40
- end
41
- end
@@ -1,44 +0,0 @@
1
- module Phare
2
- module Checks
3
- class JavaScriptJSHint
4
- attr_reader :status
5
-
6
- def initialize(directory)
7
- @config = File.expand_path("#{directory}.jshintrc", __FILE__)
8
- @path = File.expand_path("#{directory}app/assets/javascripts", __FILE__)
9
- @glob = File.join(@path, '**/*')
10
- @command = "jshint --config #{@config} --extra-ext .js,.es6.js #{@glob}"
11
- end
12
-
13
- def run
14
- if should_run?
15
- print_banner
16
- system(@command)
17
- @status = $CHILD_STATUS.exitstatus
18
-
19
- if @status == 0
20
- puts 'No code style errors found.'
21
- else
22
- puts "Something went wrong. Program exited with #{@status}"
23
- end
24
-
25
- puts ''
26
- else
27
- @status = 0
28
- end
29
- end
30
-
31
- protected
32
-
33
- def should_run?
34
- !`which jshint`.empty? && File.exists?(@config) && Dir.exists?(@path)
35
- end
36
-
37
- def print_banner
38
- puts '---------------------------------------------'
39
- puts 'Running JSHint to check for JavaScript style…'
40
- puts '---------------------------------------------'
41
- end
42
- end
43
- end
44
- end
@@ -1,39 +0,0 @@
1
- module Phare
2
- module Checks
3
- class RubyRubocop
4
- attr_reader :status
5
-
6
- def initialize
7
- @command = 'rubocop'
8
- end
9
-
10
- def run
11
- if should_run?
12
- print_banner
13
- system(@command)
14
- @status = $CHILD_STATUS.exitstatus
15
-
16
- unless @status == 0
17
- puts "Something went wrong. Program exited with #{@status}"
18
- end
19
-
20
- puts ''
21
- else
22
- @status = 0
23
- end
24
- end
25
-
26
- protected
27
-
28
- def should_run?
29
- !`which rubocop`.empty?
30
- end
31
-
32
- def print_banner
33
- puts '----------------------------------------'
34
- puts 'Running Rubocop to check for Ruby style…'
35
- puts '----------------------------------------'
36
- end
37
- end
38
- end
39
- end
@@ -1,42 +0,0 @@
1
- module Phare
2
- module Checks
3
- class ScssLint
4
- attr_reader :status
5
-
6
- def initialize(directory)
7
- @path = File.expand_path("#{directory}app/assets/stylesheets", __FILE__)
8
- @command = "scss-lint #{@path}"
9
- end
10
-
11
- def run
12
- if should_run?
13
- print_banner
14
- system(@command)
15
- @status = $CHILD_STATUS.exitstatus
16
-
17
- if @status == 0
18
- puts 'No code style errors found.'
19
- else
20
- puts "Something went wrong. Program exited with #{@status}"
21
- end
22
-
23
- puts ''
24
- else
25
- @status = 0
26
- end
27
- end
28
-
29
- protected
30
-
31
- def should_run?
32
- !`which scss-lint`.empty? && Dir.exists?(@path)
33
- end
34
-
35
- def print_banner
36
- puts '------------------------------------------'
37
- puts 'Running SCSS-Lint to check for SCSS style…'
38
- puts '------------------------------------------'
39
- end
40
- end
41
- end
42
- end