jshintrb 0.0.1 → 0.1.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.
- data/README.md +55 -39
- data/Rakefile +6 -2
- data/jshintrb.gemspec +1 -1
- data/lib/jshintrb/jshinttask.rb +76 -0
- data/lib/jshintrb/lint.rb +9 -3
- data/lib/jshintrb/reporter/default.rb +18 -4
- data/lib/jshintrb/version.rb +1 -1
- data/lib/jshintrb.rb +25 -4
- data/spec/jshintrb_spec.rb +8 -0
- metadata +12 -11
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# jshintrb
|
2
2
|
[](http://travis-ci.org/stereobooster/jshintrb)
|
3
3
|
|
4
|
-
Ruby wrapper for [JSHint](https://github.com/jshint/jshint/). The main difference from [jshint](https://github.com/liquid/jshint_on_rails) it does not depend on Java. Instead
|
4
|
+
Ruby wrapper for [JSHint](https://github.com/jshint/jshint/). The main difference from [jshint](https://github.com/liquid/jshint_on_rails) it does not depend on Java. Instead it uses [ExecJS](https://github.com/sstephenson/execjs).
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
|
@@ -13,45 +13,61 @@ Ensure that your environment has a JavaScript interpreter supported by [ExecJS](
|
|
13
13
|
|
14
14
|
## Usage
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
16
|
+
```ruby
|
17
|
+
require 'jshintrb'
|
18
|
+
|
19
|
+
Jshintrb.lint(File.read("source.js"))
|
20
|
+
# => array of warnings
|
21
|
+
|
22
|
+
Jshintrb.report(File.read("source.js"))
|
23
|
+
# => string
|
24
|
+
```
|
25
|
+
|
26
|
+
Or you can use it with rake
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
require "jshintrb/jshinttask"
|
30
|
+
Jshintrb::JshintTask.new :jshint do |t|
|
31
|
+
t.pattern = 'javascript/**/*.js'
|
32
|
+
t.options = :defaults
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
When initializing `Jshintrb`, you can pass options
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
Jshintrb.new(:undef => true).compile(source)
|
40
|
+
# Or
|
41
|
+
Jshintrb.compile(source, :undef => true)
|
42
|
+
```
|
43
|
+
|
44
|
+
[List of all available options](http://www.jshint.com/options/)
|
45
|
+
|
46
|
+
If you pass `:defaults` as option, it is the same as if you pass following
|
47
|
+
|
48
|
+
```
|
49
|
+
{
|
50
|
+
:bitwise => true,
|
51
|
+
:curly => true,
|
52
|
+
:eqeqeq => true,
|
53
|
+
:forin => true,
|
54
|
+
:immed => true,
|
55
|
+
:latedef => true,
|
56
|
+
:newcap => true,
|
57
|
+
:noarg => true,
|
58
|
+
:noempty => true,
|
59
|
+
:nonew => true,
|
60
|
+
:plusplus => true,
|
61
|
+
:regexp => true,
|
62
|
+
:undef => true,
|
63
|
+
:strict => true,
|
64
|
+
:trailing => true,
|
65
|
+
:browser => true
|
66
|
+
}
|
67
|
+
```
|
51
68
|
|
52
69
|
## TODO
|
53
70
|
|
54
|
-
- add rake task which will accept pattern for files
|
55
|
-
- add color reporter
|
56
71
|
- add more tests
|
57
|
-
|
72
|
+
- add color reporter
|
73
|
+
- add cli
|
data/Rakefile
CHANGED
@@ -11,8 +11,6 @@ task :git do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
require "rspec/core/rake_task"
|
14
|
-
|
15
|
-
desc "Run specs"
|
16
14
|
RSpec::Core::RakeTask.new
|
17
15
|
|
18
16
|
task :default => :spec
|
@@ -22,3 +20,9 @@ task :default => :spec
|
|
22
20
|
# t.rcov = true
|
23
21
|
# t.rcov_opts = ["--exclude", "spec"]
|
24
22
|
# end
|
23
|
+
|
24
|
+
require "./lib/jshintrb/jshinttask"
|
25
|
+
Jshintrb::JshintTask.new :jshint do |t|
|
26
|
+
t.pattern = 'vendor/jshint/tests/unit/fixtures/*.js'
|
27
|
+
t.options = :defaults
|
28
|
+
end
|
data/jshintrb.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["stereobooster@gmail.com"]
|
10
10
|
s.homepage = "https://github.com/stereobooster/jshintrb"
|
11
11
|
s.summary = %q{Ruby wrapper for JSHint}
|
12
|
-
s.description = %q{Ruby wrapper for JSHint. The main difference from jshint it does not depend on Java. Instead, it uses ExecJS}
|
12
|
+
s.description = %q{Ruby wrapper for JSHint. The main difference from jshint gem it does not depend on Java. Instead, it uses ExecJS}
|
13
13
|
|
14
14
|
s.rubyforge_project = "jshintrb"
|
15
15
|
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# Define a task library for running JSHint contexts.
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/tasklib'
|
5
|
+
|
6
|
+
require 'jshintrb'
|
7
|
+
|
8
|
+
module Jshintrb
|
9
|
+
|
10
|
+
class JshintTask < ::Rake::TaskLib
|
11
|
+
# Name of JSHint task. (default is :jshint)
|
12
|
+
attr_accessor :name
|
13
|
+
|
14
|
+
# Glob pattern to match JavaScript files. (default is './**/*.js')
|
15
|
+
attr_accessor :pattern
|
16
|
+
|
17
|
+
# options
|
18
|
+
attr_accessor :options
|
19
|
+
|
20
|
+
# Whether or not to fail Rake when an error occurs (typically when Jshint check fail).
|
21
|
+
# Defaults to true.
|
22
|
+
attr_accessor :fail_on_error
|
23
|
+
|
24
|
+
# Explicitly define the list of JavaScript files to be linted.
|
25
|
+
# +js_files+ is expected to be an array of file names (a
|
26
|
+
# FileList is acceptable). If both +pattern+ and +js_files+ are
|
27
|
+
# used, then the list of JavaScritp files is the union of the two.
|
28
|
+
attr_accessor :js_files
|
29
|
+
|
30
|
+
# Defines a new task, using the name +name+.
|
31
|
+
def initialize(name=:jshint)
|
32
|
+
@name = name
|
33
|
+
@pattern = nil
|
34
|
+
@js_files = nil
|
35
|
+
@options = nil
|
36
|
+
@fail_on_error = true
|
37
|
+
|
38
|
+
yield self if block_given?
|
39
|
+
@pattern = './**/*.js' if pattern.nil? && js_files.nil?
|
40
|
+
define
|
41
|
+
end
|
42
|
+
|
43
|
+
def define # :nodoc:
|
44
|
+
|
45
|
+
actual_name = Hash === name ? name.keys.first : name
|
46
|
+
unless ::Rake.application.last_comment
|
47
|
+
desc "Run JShint"
|
48
|
+
end
|
49
|
+
task name do
|
50
|
+
unless js_file_list.empty?
|
51
|
+
result = Jshintrb::report(js_file_list, @options, STDERR)
|
52
|
+
if result.size > 0
|
53
|
+
abort("JSHint check failed") if fail_on_error
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def evaluate(o) # :nodoc:
|
62
|
+
case o
|
63
|
+
when Proc then o.call
|
64
|
+
else o
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def js_file_list # :nodoc:
|
69
|
+
result = []
|
70
|
+
result += js_files.to_a if js_files
|
71
|
+
result += FileList[ pattern ].to_a if pattern
|
72
|
+
FileList[result]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/lib/jshintrb/lint.rb
CHANGED
@@ -32,13 +32,15 @@ module Jshintrb
|
|
32
32
|
|
33
33
|
def initialize(options = nil)
|
34
34
|
|
35
|
-
if options
|
35
|
+
if options == :defaults then
|
36
36
|
@options = DEFAULTS.dup
|
37
37
|
elsif options.instance_of? Hash then
|
38
38
|
@options = options.dup
|
39
39
|
# @options = DEFAULTS.merge(options)
|
40
|
+
elsif options.nil?
|
41
|
+
@options = nil
|
40
42
|
else
|
41
|
-
raise
|
43
|
+
raise 'Unsupported option for Jshintrb: ' + options.to_s
|
42
44
|
end
|
43
45
|
|
44
46
|
@context = ExecJS.compile(File.open(SourcePath, "r:UTF-8").read)
|
@@ -48,7 +50,11 @@ module Jshintrb
|
|
48
50
|
source = source.respond_to?(:read) ? source.read : source.to_s
|
49
51
|
|
50
52
|
js = []
|
51
|
-
|
53
|
+
if @options.nil? then
|
54
|
+
js << "JSHINT(#{MultiJson.encode(source)});"
|
55
|
+
else
|
56
|
+
js << "JSHINT(#{MultiJson.encode(source)}, #{MultiJson.encode(@options)});"
|
57
|
+
end
|
52
58
|
js << "return JSHINT.errors;"
|
53
59
|
|
54
60
|
@context.exec js.join("\n")
|
@@ -2,12 +2,26 @@ module Jshintrb
|
|
2
2
|
module Reporter
|
3
3
|
class Default
|
4
4
|
|
5
|
-
def format errors
|
5
|
+
def format errors, file
|
6
6
|
result = ''
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
indent = ''
|
8
|
+
if file then
|
9
|
+
indent = ' '
|
10
10
|
end
|
11
|
+
|
12
|
+
errors.each do |error|
|
13
|
+
if error.nil? then
|
14
|
+
result += indent + 'fatal error'
|
15
|
+
else
|
16
|
+
result += indent + 'line ' + error["line"].to_s + ', col ' +
|
17
|
+
error["character"].to_s + ', ' + error["reason"].to_s + "\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if file && result.size > 0 then
|
22
|
+
result = 'file: ' + file + "\n" + result
|
23
|
+
end
|
24
|
+
|
11
25
|
result
|
12
26
|
end
|
13
27
|
|
data/lib/jshintrb/version.rb
CHANGED
data/lib/jshintrb.rb
CHANGED
@@ -10,10 +10,31 @@ module Jshintrb
|
|
10
10
|
Lint.new(options).lint(source)
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.report(source, options = nil)
|
14
|
-
reporter = Reporter::Default
|
15
|
-
|
16
|
-
|
13
|
+
def self.report(source, options = nil, out = nil)
|
14
|
+
reporter = Reporter::Default.new
|
15
|
+
linter = Lint.new(options)
|
16
|
+
report = ''
|
17
|
+
if source.is_a?(Array) then
|
18
|
+
source.each do |src|
|
19
|
+
if !src.is_a?(String) then
|
20
|
+
p src.to_s
|
21
|
+
raise ('Expected array of strings. Instead get ' + src.class.to_s)
|
22
|
+
end
|
23
|
+
errors = linter.lint(File.read(src))
|
24
|
+
rep = reporter.format errors, src
|
25
|
+
if out && rep.size > 0 then
|
26
|
+
out.puts rep
|
27
|
+
end
|
28
|
+
report += rep
|
29
|
+
end
|
30
|
+
else
|
31
|
+
errors = linter.lint(source)
|
32
|
+
report = reporter.format errors
|
33
|
+
if out then
|
34
|
+
out.puts report
|
35
|
+
end
|
36
|
+
end
|
37
|
+
report
|
17
38
|
end
|
18
39
|
|
19
40
|
end
|
data/spec/jshintrb_spec.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require "jshintrb"
|
3
3
|
|
4
|
+
def gen_file source, option, value
|
5
|
+
"/*jshint " + option.to_s + ": " + value.to_s + "*/\n" + source
|
6
|
+
end
|
7
|
+
|
4
8
|
describe "Jshintrb" do
|
5
9
|
|
6
10
|
it "support options" do
|
@@ -28,6 +32,10 @@ describe "Jshintrb" do
|
|
28
32
|
Jshintrb.lint(source, option => true).length.should eq 1
|
29
33
|
end
|
30
34
|
|
35
|
+
options.each do |option, source|
|
36
|
+
Jshintrb.lint(gen_file(source, option, false)).length.should eq 0
|
37
|
+
Jshintrb.lint(gen_file(source, option, true)).length.should eq 1
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jshintrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-26 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &21721428 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *21721428
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &21721056 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *21721056
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: multi_json
|
38
|
-
requirement: &
|
38
|
+
requirement: &21720636 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *21720636
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: execjs
|
49
|
-
requirement: &
|
49
|
+
requirement: &21720024 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,9 +54,9 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
-
description: Ruby wrapper for JSHint. The main difference from jshint it does
|
59
|
-
depend on Java. Instead, it uses ExecJS
|
57
|
+
version_requirements: *21720024
|
58
|
+
description: Ruby wrapper for JSHint. The main difference from jshint gem it does
|
59
|
+
not depend on Java. Instead, it uses ExecJS
|
60
60
|
email:
|
61
61
|
- stereobooster@gmail.com
|
62
62
|
executables: []
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- jshintrb.gemspec
|
73
73
|
- lib/js/jshint.js
|
74
74
|
- lib/jshintrb.rb
|
75
|
+
- lib/jshintrb/jshinttask.rb
|
75
76
|
- lib/jshintrb/lint.rb
|
76
77
|
- lib/jshintrb/reporter/default.rb
|
77
78
|
- lib/jshintrb/version.rb
|