jslintrb_v8 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.rdoc +8 -0
- data/lib/jslintrb-v8/jslint.js +5150 -0
- data/lib/jslintrb-v8.rb +188 -0
- metadata +80 -0
data/lib/jslintrb-v8.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'v8'
|
2
|
+
# JSLint bindings for ruby using v8.
|
3
|
+
#
|
4
|
+
# Usage:
|
5
|
+
#
|
6
|
+
# require 'jslintrb-v8'
|
7
|
+
# puts JSLint.new.check("var x = 5")
|
8
|
+
#
|
9
|
+
# will output:
|
10
|
+
#
|
11
|
+
# Error at line 1 character 1: Missing "use strict" statement.
|
12
|
+
# var x = 5
|
13
|
+
# Error at line 1 character 10: Missing semicolon.
|
14
|
+
# var x = 5
|
15
|
+
#
|
16
|
+
# Pass options into the constructor:
|
17
|
+
#
|
18
|
+
# JSLint.new(:undef => false, :sub => true)
|
19
|
+
class JSLint
|
20
|
+
# if ADsafe should be enforced
|
21
|
+
attr_accessor :adsafe
|
22
|
+
# if bitwise operators should not be allowed
|
23
|
+
attr_accessor :bitwise
|
24
|
+
# if the standard browser globals should be predefined
|
25
|
+
attr_accessor :browser
|
26
|
+
# if upper case HTML should be allowed
|
27
|
+
attr_accessor :cap
|
28
|
+
# if CSS workarounds should be tolerated
|
29
|
+
attr_accessor :css
|
30
|
+
# if debugger statements should be allowed
|
31
|
+
attr_accessor :debug
|
32
|
+
# if === should be required
|
33
|
+
attr_accessor :eqeqeq
|
34
|
+
# if eval should be allowed
|
35
|
+
attr_accessor :evil
|
36
|
+
# if for in statements must filter
|
37
|
+
attr_accessor :forin
|
38
|
+
# if HTML fragments should be allowed
|
39
|
+
attr_accessor :fragment
|
40
|
+
# if immediate invocations must be wrapped in parens
|
41
|
+
attr_accessor :immed
|
42
|
+
# if line breaks should not be checked
|
43
|
+
attr_accessor :laxbreak
|
44
|
+
# if constructor names must be capitalized
|
45
|
+
attr_accessor :newcap
|
46
|
+
# if names should be checked
|
47
|
+
attr_accessor :nomen
|
48
|
+
# if HTML event handlers should be allowed
|
49
|
+
attr_accessor :on
|
50
|
+
# if only one var statement per function should be allowed
|
51
|
+
attr_accessor :onevar
|
52
|
+
# if the scan should stop on first error
|
53
|
+
attr_accessor :passfail
|
54
|
+
# if increment/decrement should not be allowed
|
55
|
+
attr_accessor :plusplus
|
56
|
+
# if the . should not be allowed in regexp literals
|
57
|
+
attr_accessor :regexp
|
58
|
+
# if the Rhino environment globals should be predefined
|
59
|
+
attr_accessor :rhino
|
60
|
+
# if variables should be declared before used
|
61
|
+
attr_accessor :undef
|
62
|
+
# if use of some browser features should be restricted
|
63
|
+
attr_accessor :safe
|
64
|
+
# if the System object should be predefined
|
65
|
+
attr_accessor :sidebar
|
66
|
+
# require the "use strict"; pragma
|
67
|
+
attr_accessor :strict
|
68
|
+
# if all forms of subscript notation are tolerated
|
69
|
+
attr_accessor :sub
|
70
|
+
# if strict whitespace rules apply
|
71
|
+
attr_accessor :white
|
72
|
+
# if the Yahoo Widgets globals should be predefined
|
73
|
+
attr_accessor :widget
|
74
|
+
|
75
|
+
def initialize(opts = {})
|
76
|
+
@adsafe = opts.fetch( :adsafe ){ false }
|
77
|
+
@bitwise = opts.fetch( :bitwise ){ true }
|
78
|
+
@browser = opts.fetch( :browser ){ false }
|
79
|
+
@cap = opts.fetch( :cap ){ false }
|
80
|
+
@css = opts.fetch( :css ){ false }
|
81
|
+
@debug = opts.fetch( :debug ){ false }
|
82
|
+
@eqeqeq = opts.fetch( :eqeqeq ){ true }
|
83
|
+
@evil = opts.fetch( :evil ){ false }
|
84
|
+
@forin = opts.fetch( :forin ){ false }
|
85
|
+
@fragment = opts.fetch( :fragment ){ false }
|
86
|
+
@immed = opts.fetch( :immed ){ true }
|
87
|
+
@laxbreak = opts.fetch( :laxbreak ){ false }
|
88
|
+
@newcap = opts.fetch( :newcap ){ true }
|
89
|
+
@nomen = opts.fetch( :nomen ){ true }
|
90
|
+
@on = opts.fetch( :on ){ false }
|
91
|
+
@onevar = opts.fetch( :onevar ){ true }
|
92
|
+
@passfail = opts.fetch( :passfail ){ false }
|
93
|
+
@plusplus = opts.fetch( :plusplus ){ true }
|
94
|
+
@regexp = opts.fetch( :regexp ){ true }
|
95
|
+
@rhino = opts.fetch( :rhino ){ false }
|
96
|
+
@undef = opts.fetch( :undef ){ true }
|
97
|
+
@safe = opts.fetch( :safe ){ false }
|
98
|
+
@sidebar = opts.fetch( :sidebar ){ false }
|
99
|
+
@strict = opts.fetch( :strict ){ true }
|
100
|
+
@sub = opts.fetch( :sub ){ false }
|
101
|
+
@white = opts.fetch( :white ){ false }
|
102
|
+
@widget = opts.fetch( :widget ){ false }
|
103
|
+
end
|
104
|
+
|
105
|
+
def check(input)
|
106
|
+
errors = []
|
107
|
+
V8::Context.new do |context|
|
108
|
+
context.load(File.join(File.dirname(__FILE__), 'jslintrb-v8', 'jslint.js'))
|
109
|
+
|
110
|
+
context['JSLintRBinput'] = lambda{ input }
|
111
|
+
context['JSLintRBadsafe'] = @adsafe
|
112
|
+
context['JSLintRBbitwise'] = @bitwise
|
113
|
+
context['JSLintRBbrowser'] = @browser
|
114
|
+
context['JSLintRBcap'] = @cap
|
115
|
+
context['JSLintRBcss'] = @css
|
116
|
+
context['JSLintRBdebug'] = @debug
|
117
|
+
context['JSLintRBeqeqeq'] = @eqeqeq
|
118
|
+
context['JSLintRBevil'] = @evil
|
119
|
+
context['JSLintRBforin'] = @forin
|
120
|
+
context['JSLintRBfragment'] = @fragment
|
121
|
+
context['JSLintRBimmed'] = @immed
|
122
|
+
context['JSLintRBlaxbreak'] = @laxbreak
|
123
|
+
context['JSLintRBnewcap'] = @newcap
|
124
|
+
context['JSLintRBnomen'] = @nomen
|
125
|
+
context['JSLintRBon'] = @on
|
126
|
+
context['JSLintRBonevar'] = @onevar
|
127
|
+
context['JSLintRBpassfail'] = @passfail
|
128
|
+
context['JSLintRBplusplus'] = @plusplus
|
129
|
+
context['JSLintRBregexp'] = @regexp
|
130
|
+
context['JSLintRBrhino'] = @rhino
|
131
|
+
context['JSLintRBundef'] = @undef
|
132
|
+
context['JSLintRBsafe'] = @safe
|
133
|
+
context['JSLintRBsidebar'] = @sidebar
|
134
|
+
context['JSLintRBstrict'] = @strict
|
135
|
+
context['JSLintRBsub'] = @sub
|
136
|
+
context['JSLintRBwhite'] = @white
|
137
|
+
context['JSLintRBwidget'] = @widget
|
138
|
+
context['JSLintRBreportErrors'] = lambda{|js_errors|
|
139
|
+
js_errors.each do |e|
|
140
|
+
if V8::Object === e
|
141
|
+
e = V8::To.rb(e)
|
142
|
+
errors << "Error at line #{e['line'].to_i + 1} " +
|
143
|
+
"character #{e['character'].to_i + 1}: #{e['reason']}"
|
144
|
+
errors << " #{e['evidence']}"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
}
|
148
|
+
context.eval %{
|
149
|
+
JSLINT(JSLintRBinput(), {
|
150
|
+
adsafe : JSLintRBadsafe,
|
151
|
+
bitwise : JSLintRBbitwise,
|
152
|
+
browser : JSLintRBbrowser,
|
153
|
+
cap : JSLintRBcap,
|
154
|
+
css : JSLintRBcss,
|
155
|
+
debug : JSLintRBdebug,
|
156
|
+
eqeqeq : JSLintRBeqeqeq,
|
157
|
+
evil : JSLintRBevil,
|
158
|
+
forin : JSLintRBforin,
|
159
|
+
fragment : JSLintRBfragment,
|
160
|
+
immed : JSLintRBimmed,
|
161
|
+
laxbreak : JSLintRBlaxbreak,
|
162
|
+
newcap : JSLintRBnewcap,
|
163
|
+
nomen : JSLintRBnomen,
|
164
|
+
on : JSLintRBon,
|
165
|
+
onevar : JSLintRBonevar,
|
166
|
+
passfail : JSLintRBpassfail,
|
167
|
+
plusplus : JSLintRBplusplus,
|
168
|
+
regexp : JSLintRBregexp,
|
169
|
+
rhino : JSLintRBrhino,
|
170
|
+
undef : JSLintRBundef,
|
171
|
+
safe : JSLintRBsafe,
|
172
|
+
sidebar : JSLintRBsidebar,
|
173
|
+
strict : JSLintRBstrict,
|
174
|
+
sub : JSLintRBsub,
|
175
|
+
white : JSLintRBwhite,
|
176
|
+
widget : JSLintRBwidget
|
177
|
+
});
|
178
|
+
JSLintRBreportErrors(JSLINT.errors);
|
179
|
+
}
|
180
|
+
end
|
181
|
+
|
182
|
+
if errors.empty?
|
183
|
+
return nil
|
184
|
+
else
|
185
|
+
return errors.join("\n")
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jslintrb_v8
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Nick Gauthier
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-11-15 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: therubyracer
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - "="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 7
|
31
|
+
- 5
|
32
|
+
version: 0.7.5
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description:
|
36
|
+
email: ngauthier@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- lib/jslintrb-v8.rb
|
45
|
+
- lib/jslintrb-v8/jslint.js
|
46
|
+
- README.rdoc
|
47
|
+
has_rdoc: true
|
48
|
+
homepage: http://www.github.com/ngauthier/jslintrb_v8
|
49
|
+
licenses: []
|
50
|
+
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.3.7
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: Run JSLint from Ruby
|
79
|
+
test_files: []
|
80
|
+
|