jslint-v8 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,16 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jslint-v8 (1.0.0)
4
+ jslint-v8 (1.1.0)
5
5
  therubyracer (~> 0.9.4)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- libv8 (3.3.10.2)
11
- rake (0.9.2)
12
- test-unit (2.3.2)
13
- therubyracer (0.9.4)
10
+ libv8 (3.3.10.4)
11
+ rake (0.9.2.2)
12
+ test-unit (2.4.5)
13
+ therubyracer (0.9.9)
14
14
  libv8 (~> 3.3.10)
15
15
 
16
16
  PLATFORMS
data/README.markdown CHANGED
@@ -1 +1,51 @@
1
1
  [![Build Status](https://secure.travis-ci.org/whoward/jslint-v8.png)](http://travis-ci.org/whoward/jslint-v8)
2
+
3
+ # Description
4
+
5
+ JSLintV8 is simply a ruby wrapper that helps you run JSLint as an automated
6
+ code quality standards tool inside your projects. It's geared towards being run
7
+ in a continuous integration process (CI), such as Jenkins.
8
+
9
+ While it is focused on Ruby projects it can just as easily be used for any other
10
+ language out there so long as you have Ruby installed on your system.
11
+
12
+ Like it's name implies we run JSLint on the JavaScript V8 interpreter so, in
13
+ other words, it runs really really fast.
14
+
15
+ # How to use
16
+
17
+ 1. Make sure you have Ruby and Rubygems installed on your computer (most operating systems except for Windows have this already)
18
+
19
+ 2. In your console run: ```gem install jslint-v8```
20
+
21
+ 3. Run the following command ```jslint-v8 path/to/file.js```
22
+
23
+ For full details on using the command line interface simply type ```jslint-v8```
24
+
25
+ # Rake Task
26
+
27
+ In addition to the CLI you can also set up a Rake task to automatically run against
28
+ a set of files. Inside your Rakefile add the following:
29
+
30
+ ```ruby
31
+ require 'rake'
32
+ require 'jslint-v8'
33
+
34
+ namespace :js do
35
+ JSLintV8::RakeTask.new do |task|
36
+ task.name = "lint"
37
+ task.include_pattern = "app/javascripts/**/*.js"
38
+ task.exclude_pattern = "app/javascripts/{generated,lib}/**/*.js"
39
+ end
40
+ end
41
+ ```
42
+
43
+ Modify the settings as needed. This code will make a task "js:lint" which will
44
+ run against all javascript files under ```app/javascripts``` except under
45
+ ```app/javascripts/lib``` and ```app/javascripts/generated```
46
+
47
+ # Contributing
48
+
49
+ Whatever works, but my preference is for you to fork this repository on github
50
+ and write your changes on a separate branch. When finished you can send them
51
+ to me by issuing a pull request.
data/bin/jslint-v8 CHANGED
@@ -2,15 +2,39 @@
2
2
  require 'rubygems'
3
3
  require File.expand_path("../lib/jslint-v8", File.dirname(__FILE__))
4
4
 
5
- if ARGV.empty?
6
- puts "usage: #{File.basename(__FILE__)} FILES"
7
- exit 1
5
+ def print_usage
6
+ STDERR.puts JSLintV8::OptionParser.new.help
7
+ exit(255)
8
8
  end
9
9
 
10
+ # if no parameters are passed then print usage and exit
11
+ print_usage if ARGV.empty?
12
+
13
+ # parse the options out of the command line
14
+ begin
15
+ parser = JSLintV8::OptionParser.new
16
+ parser.parse!
17
+ rescue SystemExit => e
18
+ # exit with a failing status code, happens with the -h and -v options
19
+ exit(255)
20
+ rescue Exception => e
21
+ # print out an error message and exit with a failing exit code
22
+ STDERR.puts "#{$0}: #{e.message} (#{e.class.to_s})"
23
+ exit(255)
24
+ end
25
+
26
+ # if no parameters are left (nothing beyond options given) then print usage and exit
27
+ print_usage if ARGV.empty?
28
+
29
+ # set up a formatter for standard output
10
30
  formatter = JSLintV8::Formatter.new(STDOUT)
11
31
 
32
+ # set up a runner
33
+ runner = JSLintV8::Runner.new(ARGV)
34
+ runner.jslint_options.merge!(parser.options[:lint_options])
35
+
12
36
  # get a list of all failed files, printing . or * along the way depending on the result
13
- lint_result = JSLintV8::Runner.new(ARGV).run do |file, errors|
37
+ lint_result = runner.run do |file, errors|
14
38
  formatter.tick(errors)
15
39
  end
16
40
 
data/lib/jslint-v8.rb CHANGED
@@ -3,4 +3,6 @@ module JSLintV8 end
3
3
  require File.expand_path("jslint-v8/runner", File.dirname(__FILE__))
4
4
  require File.expand_path("jslint-v8/rake_task", File.dirname(__FILE__))
5
5
  require File.expand_path("jslint-v8/lint_error", File.dirname(__FILE__))
6
- require File.expand_path("jslint-v8/formatter", File.dirname(__FILE__))
6
+ require File.expand_path("jslint-v8/formatter", File.dirname(__FILE__))
7
+ require File.expand_path("jslint-v8/option_parser", File.dirname(__FILE__))
8
+ require File.expand_path("jslint-v8/version", File.dirname(__FILE__))
@@ -27,7 +27,11 @@ module JSLintV8
27
27
 
28
28
  out.print "\nFailures:\n\n"
29
29
 
30
- result.each do |file, errors|
30
+ # we iterate the sorted keys to prevent a brittle test and also the output
31
+ # should be nicer as it will be guaranteed to be alphabetized
32
+ result.keys.sort.each do |file|
33
+ errors = result[file]
34
+
31
35
  out.print "#{file}:\n"
32
36
  errors.each do |error|
33
37
  out.print " line #{error.line_number} character #{error.character} #{error.reason}\n"
@@ -0,0 +1,39 @@
1
+ require 'optparse'
2
+
3
+ module JSLintV8
4
+ class OptionParser < ::OptionParser
5
+
6
+ attr_reader :options
7
+
8
+ def initialize
9
+ super
10
+
11
+ @options = {}
12
+ @options[:lint_options] = {}
13
+
14
+ self.version = JSLintV8::Version::STRING
15
+ self.banner = "#{self.banner} <filepattern>..."
16
+
17
+ Runner::DefaultOptions.keys.each do |option|
18
+ default = Runner::DefaultOptions[option] ? "on" : "off"
19
+
20
+ long = "--[no-]#{option}"
21
+ desc = "#{Runner::OptionDescriptions[option]} (default=#{default})"
22
+
23
+ on(long, desc) do |value|
24
+ options[:lint_options][option] = value
25
+ end
26
+ end
27
+
28
+ on("-h", "--help", "Show this message") do
29
+ STDERR.puts self.help
30
+ exit(-1)
31
+ end
32
+
33
+ on("-v", "--version", "Show version") do
34
+ STDERR.puts "#{self.program_name} version #{JSLintV8::Version::STRING}"
35
+ exit(-1)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -18,6 +18,15 @@ module JSLintV8
18
18
  # output stream for this task
19
19
  attr_accessor :output_stream
20
20
 
21
+ # custom lint options for the task
22
+ attr_accessor :lint_options
23
+
24
+ # metaprogrammatically define accessors for each lint option expected
25
+ Runner::DefaultOptions.keys.each do |key|
26
+ define_method(key) { lint_options[key] }
27
+ define_method("#{key}=") {|value| lint_options[key] = value }
28
+ end
29
+
21
30
  def initialize
22
31
  # a default name
23
32
  @name = "lint"
@@ -34,6 +43,9 @@ module JSLintV8
34
43
  # by default use standard output for writing information
35
44
  @output_stream = STDOUT
36
45
 
46
+ # by default provide no overridden lint options
47
+ @lint_options = {}
48
+
37
49
  # if a block was given allow the block to call elements on this object
38
50
  yield self if block_given?
39
51
 
@@ -72,7 +84,9 @@ module JSLintV8
72
84
  private
73
85
 
74
86
  def runner
75
- JSLintV8::Runner.new(files_to_run)
87
+ runner = JSLintV8::Runner.new(files_to_run)
88
+ runner.jslint_options.merge!(lint_options)
89
+ runner
76
90
  end
77
91
 
78
92
  end
@@ -4,6 +4,100 @@ module JSLintV8
4
4
  class Runner
5
5
  JSLintLibraryFilename = File.expand_path("js/jslint.js", File.dirname(__FILE__))
6
6
 
7
+ DefaultOptions = {
8
+ "asi" => false,
9
+ "bitwise" => true,
10
+ "boss" => false,
11
+ "browser" => false,
12
+ "couch" => false,
13
+ "curly" => false,
14
+ "debug" => false,
15
+ "devel" => false,
16
+ "dojo" => false,
17
+ "eqeqeq" => true,
18
+ "eqnull" => false,
19
+ "es5" => false,
20
+ "evil" => false,
21
+ "expr" => false,
22
+ "forin" => false,
23
+ "globalstrict" => false,
24
+ "immed" => true,
25
+ "jquery" => false,
26
+ "latedef" => false,
27
+ "laxbreak" => false,
28
+ "loopfunc" => false,
29
+ "mootools" => false,
30
+ "newcap" => true,
31
+ "noarg" => false,
32
+ "node" => false,
33
+ "noempty" => false,
34
+ "nonew" => false,
35
+ "nomen" => true,
36
+ "onevar" => true,
37
+ "passfail" => false,
38
+ "plusplus" => true,
39
+ "prototypejs" => false,
40
+ "regexdash" => false,
41
+ "regexp" => true,
42
+ "rhino" => false,
43
+ "undef" => true,
44
+ "scripturl" => false,
45
+ "shadow" => false,
46
+ "strict" => false,
47
+ "sub" => false,
48
+ "supernew" => false,
49
+ "trailing" => false,
50
+ "white" => false,
51
+ "wsh" => false
52
+ }.freeze
53
+
54
+ OptionDescriptions = {
55
+ "asi" => "if automatic semicolon insertion should be tolerated",
56
+ "bitwise" => "if bitwise operators should not be allowed",
57
+ "boss" => "if advanced usage of assignments should be allowed",
58
+ "browser" => "if the standard browser globals should be predefined",
59
+ "couch" => "if CouchDB globals should be predefined",
60
+ "curly" => "if curly braces around blocks should be required (even in if/for/while)",
61
+ "debug" => "if debugger statements should be allowed",
62
+ "devel" => "if logging globals should be predefined (console, alert, etc.)",
63
+ "dojo" => "if Dojo Toolkit globals should be predefined",
64
+ "eqeqeq" => "if === should be required",
65
+ "eqnull" => "if == null comparisons should be tolerated",
66
+ "es5" => "if ES5 syntax should be allowed",
67
+ "evil" => "if eval should be allowed",
68
+ "expr" => "if ExpressionStatement should be allowed as Programs",
69
+ "forin" => "if for in statements must filter",
70
+ "globalstrict" => "if global \"use strict\"; should be allowed (also enables 'strict')",
71
+ "immed" => "if immediate invocations must be wrapped in parens",
72
+ "jquery" => "if jQuery globals should be predefined",
73
+ "latedef" => "if the use before definition should not be tolerated",
74
+ "laxbreak" => "if line breaks should not be checked",
75
+ "loopfunc" => "if functions should be allowed to be defined within loops",
76
+ "mootools" => "if MooTools globals should be predefined",
77
+ "newcap" => "if constructor names must be capitalized",
78
+ "noarg" => "if arguments.caller and arguments.callee should be disallowed",
79
+ "node" => "if the Node.js environment globals should be predefined",
80
+ "noempty" => "if empty blocks should be disallowed",
81
+ "nonew" => "if using `new` for side-effects should be disallowed",
82
+ "nomen" => "if names should be checked",
83
+ "onevar" => "if only one var statement per function should be allowed",
84
+ "passfail" => "if the scan should stop on first error",
85
+ "plusplus" => "if increment/decrement should not be allowed",
86
+ "prototypejs" => "if Prototype and Scriptaculous globals should be predefined",
87
+ "regexdash" => "if unescaped last dash (-) inside brackets should be tolerated",
88
+ "regexp" => "if the . should not be allowed in regexp literals",
89
+ "rhino" => "if the Rhino environment globals should be predefined",
90
+ "undef" => "if variables should be declared before used",
91
+ "scripturl" => "if script-targeted URLs should be tolerated",
92
+ "shadow" => "if variable shadowing should be tolerated",
93
+ "strict" => "require the \"use strict\"; pragma",
94
+ "sub" => "if all forms of subscript notation are tolerated",
95
+ "supernew" => "if `new function () { ... };` and `new Object;` should be tolerated",
96
+ "trailing" => "if trailing whitespace rules apply",
97
+ "white" => "if strict whitespace rules apply",
98
+ "wsh" => "if the Windows Scripting Host environment globals should be predefined",
99
+ }.freeze
100
+
7
101
  attr_reader :file_list
8
102
 
9
103
  def initialize(files)
@@ -63,19 +157,7 @@ module JSLintV8
63
157
  end
64
158
 
65
159
  def jslint_options
66
- {
67
- "bitwise" => true,
68
- "eqeqeq" => true,
69
- "immed" => true,
70
- "newcap" => true,
71
- "nomen" => true,
72
- "onevar" => true,
73
- "plusplus" => true,
74
- "regexp" => true,
75
- "rhino" => true,
76
- "undef" => true,
77
- "white" => true
78
- }
160
+ @jslint_options ||= DefaultOptions.dup
79
161
  end
80
162
 
81
163
  end
@@ -2,8 +2,8 @@
2
2
  module JSLintV8
3
3
  module Version
4
4
  MAJOR = 1
5
- MINOR = 0
6
- PATCH = 1
5
+ MINOR = 1
6
+ PATCH = 0
7
7
  BUILD = nil
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
data/test/test_cli.rb CHANGED
@@ -9,10 +9,35 @@ class TestCli < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_empty_args
12
- result = `#{Executable}`
12
+ # capture standard error by redirecting it to standard out
13
+ result = `#{Executable} 2>&1`
13
14
 
14
- assert_equal "usage: jslint-v8 FILES\n", result
15
- assert_equal false, $?.success?
15
+ assert_match /^Usage/, result
16
+ assert_equal 255, $?.exitstatus
17
+ end
18
+
19
+ def test_version_output
20
+ # capture standard error by redirecting it to standard out
21
+ result = `#{Executable} -v 2>&1`
22
+
23
+ assert_equal erb_fixture("version-output"), result
24
+ assert_equal 255, $?.exitstatus
25
+ end
26
+
27
+ def test_help_output
28
+ # capture standard error by redirecting it to standard out
29
+ result = `#{Executable} -h foo.js bar.js baz.js 2>&1`
30
+
31
+ assert_match /^Usage/, result
32
+ assert_equal 255, $?.exitstatus
33
+ end
34
+
35
+ def test_only_options_given
36
+ # capture standard error by redirecting it to standard out
37
+ result = `#{Executable} --browser --jquery 2>&1`
38
+
39
+ assert_match /^Usage/, result
40
+ assert_equal 255, $?.exitstatus
16
41
  end
17
42
 
18
43
  def test_valid
data/test/test_runner.rb CHANGED
@@ -43,6 +43,17 @@ class TestRunner < Test::Unit::TestCase
43
43
  assert_equal @runner.runtime.object_id, first.object_id
44
44
  end
45
45
 
46
+ def test_overrideable_options
47
+ # have same values as default options
48
+ assert_equal @runner.jslint_options, JSLintV8::Runner::DefaultOptions
49
+
50
+ # but not be the options
51
+ assert_not_equal @runner.jslint_options.object_id, JSLintV8::Runner::DefaultOptions.object_id
52
+
53
+ # but be memoized
54
+ assert_equal @runner.jslint_options.object_id, @runner.jslint_options.object_id
55
+ end
56
+
46
57
  def test_jslint_function_proxy
47
58
  assert_not_nil @runner.jslint_function
48
59
  end
data/test/test_task.rb CHANGED
@@ -52,23 +52,38 @@ class TestTask < Test::Unit::TestCase
52
52
  assert_equal STDOUT, task.output_stream
53
53
  end
54
54
 
55
+ def test_default_lint_options
56
+ task = JSLintV8::RakeTask.new
57
+
58
+ assert_equal({}, task.lint_options)
59
+ end
60
+
55
61
  def test_creation_block
56
62
  tempfile = Tempfile.new("foo")
57
63
 
58
64
  task = JSLintV8::RakeTask.new do |task|
59
65
  task.name = "foo"
66
+
60
67
  task.description = "Points out the bad codezzzz"
68
+
61
69
  task.include_pattern = "js/**/*.js"
62
70
  task.exclude_pattern = "js/**/*.txt"
71
+
63
72
  task.output_stream = tempfile
73
+
74
+ task.browser = true
75
+ task.strict = true
64
76
  end
65
77
 
66
78
  rake_task = Rake.application.lookup("foo")
67
79
 
80
+ expected_options = {"browser" => true, "strict" => true}
81
+
68
82
  assert_equal "foo", rake_task.name
69
83
  assert_equal "Points out the bad codezzzz", rake_task.comment
70
84
  assert_equal "js/**/*.js", task.include_pattern
71
85
  assert_equal "js/**/*.txt", task.exclude_pattern
86
+ assert_equal expected_options, task.lint_options
72
87
  assert_equal tempfile.object_id, task.output_stream.object_id
73
88
  end
74
89
 
@@ -83,6 +98,19 @@ class TestTask < Test::Unit::TestCase
83
98
  assert_equal expected_files, task.files_to_run
84
99
  end
85
100
 
101
+ def test_custom_lint_options
102
+ task = JSLintV8::RakeTask.new do |task|
103
+ task.browser = true
104
+ task.evil = true
105
+ end
106
+
107
+ runner = task.send(:runner)
108
+
109
+ assert_equal true, runner.jslint_options["browser"]
110
+ assert_equal true, runner.jslint_options["evil"]
111
+ assert_equal false, runner.jslint_options["rhino"]
112
+ end
113
+
86
114
  def test_valid_output
87
115
  result = String.new
88
116
 
metadata CHANGED
@@ -1,131 +1,107 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: jslint-v8
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 1
10
- version: 1.0.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - William Howard
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-08-31 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-02-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: therubyracer
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &71601450 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 51
29
- segments:
30
- - 0
31
- - 9
32
- - 4
20
+ - !ruby/object:Gem::Version
33
21
  version: 0.9.4
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: rake
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *71601450
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &71601100 !ruby/object:Gem::Requirement
40
28
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
48
33
  type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: test-unit
52
34
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *71601100
36
+ - !ruby/object:Gem::Dependency
37
+ name: test-unit
38
+ requirement: &71600860 !ruby/object:Gem::Requirement
54
39
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- hash: 3
59
- segments:
60
- - 0
61
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
62
44
  type: :development
63
- version_requirements: *id003
64
- description: Ruby gem wrapper for a jslint cli. Uses the The Ruby Racer library for performance reasons targeted for usage in CI environments and backed up with a full test suite.
45
+ prerelease: false
46
+ version_requirements: *71600860
47
+ description: Ruby gem wrapper for a jslint cli. Uses the The Ruby Racer library for
48
+ performance reasons targeted for usage in CI environments and backed up with a full
49
+ test suite.
65
50
  email: whoward.tke@gmail.com
66
- executables:
51
+ executables:
67
52
  - jslint-v8
68
53
  extensions: []
69
-
70
- extra_rdoc_files:
54
+ extra_rdoc_files:
71
55
  - README.markdown
72
- files:
56
+ files:
73
57
  - lib/jslint-v8/formatter.rb
74
- - lib/jslint-v8/runner.rb
75
58
  - lib/jslint-v8/rake_task.rb
76
- - lib/jslint-v8/lint_error.rb
77
59
  - lib/jslint-v8/version.rb
60
+ - lib/jslint-v8/runner.rb
61
+ - lib/jslint-v8/option_parser.rb
62
+ - lib/jslint-v8/lint_error.rb
78
63
  - lib/jslint-v8.rb
79
64
  - lib/jslint-v8/js/jslint.js
80
65
  - Gemfile
81
66
  - Gemfile.lock
82
67
  - bin/jslint-v8
83
68
  - README.markdown
84
- - test/test_task.rb
85
- - test/test_lint_error.rb
86
- - test/helper.rb
87
69
  - test/test_runner.rb
88
- - test/suite.rb
89
- - test/test_formatter.rb
90
70
  - test/test_cli.rb
71
+ - test/helper.rb
72
+ - test/test_formatter.rb
73
+ - test/test_task.rb
74
+ - test/suite.rb
75
+ - test/test_lint_error.rb
91
76
  homepage: http://github.com/whoward/jslint-v8
92
77
  licenses: []
93
-
94
78
  post_install_message:
95
79
  rdoc_options: []
96
-
97
- require_paths:
80
+ require_paths:
98
81
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
82
+ required_ruby_version: !ruby/object:Gem::Requirement
100
83
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
108
- required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
89
  none: false
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- hash: 3
114
- segments:
115
- - 0
116
- version: "0"
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
117
94
  requirements: []
118
-
119
95
  rubyforge_project:
120
- rubygems_version: 1.8.6
96
+ rubygems_version: 1.8.10
121
97
  signing_key:
122
98
  specification_version: 3
123
99
  summary: JSLint CLI and rake tasks via therubyracer (JavaScript V8 gem)
124
- test_files:
125
- - test/test_task.rb
126
- - test/test_lint_error.rb
127
- - test/helper.rb
100
+ test_files:
128
101
  - test/test_runner.rb
129
- - test/suite.rb
130
- - test/test_formatter.rb
131
102
  - test/test_cli.rb
103
+ - test/helper.rb
104
+ - test/test_formatter.rb
105
+ - test/test_task.rb
106
+ - test/suite.rb
107
+ - test/test_lint_error.rb