jshint 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8acd5bd2914337701ba05bb61443fe4953886259
4
+ data.tar.gz: 00377c800679e1a108beb2e2dd82c7e6a379bc79
5
+ SHA512:
6
+ metadata.gz: 89a1f013c7cc7258b0f3ab95daa2a34eaf41eb574c2a76358bc262e042a025d4731837fc1812e2fb3a75f2f7379bacbc8e0b9b793d3b5452f47805960093ac04
7
+ data.tar.gz: e9bd66f7e2c0a55eddf887374bab8167576bc6a7774f5195d3abf31f0fe318b73de9db32861d23e8d2800be31ce5486260999d818d4c8dbeb6981acd94b9da9f
data/README.md CHANGED
@@ -69,3 +69,4 @@ For more configuration options see the [JSHint documentation](http://jshint.com/
69
69
  3. Commit your changes (`git commit -am 'Add some feature'`)
70
70
  4. Push to the branch (`git push origin my-new-feature`)
71
71
  5. Create new Pull Request
72
+
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "therubyracer", "~> 0.12.1"
22
22
  spec.add_dependency "execjs", "~> 1.4.0"
23
- spec.add_dependency "railties", ">= 3.2.0"
24
23
  spec.add_dependency 'multi_json', '~> 1.0'
25
24
 
26
25
  spec.add_development_dependency "bundler", "~> 1.3"
26
+ spec.add_development_dependency "railties", ">= 3.2.0"
27
27
  spec.add_development_dependency "rake"
28
- spec.add_development_dependency "rspec"
28
+ spec.add_development_dependency "rspec", "~> 2.14"
29
29
  spec.add_development_dependency "yard"
30
30
  end
@@ -75,7 +75,7 @@ module Jshint
75
75
  end
76
76
 
77
77
  def default_config_path
78
- File.join(Rails.root, 'config', 'jshint.yml')
78
+ File.join(defined?(Rails) ? Rails.root : Dir.pwd, 'config', 'jshint.yml')
79
79
  end
80
80
  end
81
81
  end
@@ -1,4 +1,5 @@
1
1
  # Top level namespace capable of containing different lint reporting classes
2
2
  module Jshint::Reporters
3
3
  autoload :Default, 'jshint/reporters/default'
4
+ autoload :Junit, 'jshint/reporters/junit'
4
5
  end
@@ -0,0 +1,286 @@
1
+ require 'rexml/text'
2
+
3
+ module Jshint::Reporters
4
+ # Outputs a lint report in JUnit XML formt
5
+ class Junit
6
+ # @return [String] the report output
7
+ attr_reader :output
8
+
9
+ # Sets up the output string for the final report
10
+ #
11
+ # @param results [Hash] Key value pairs containing the filename and associated errors
12
+ def initialize(results = {})
13
+ @results = results
14
+ @output = ''
15
+ end
16
+
17
+ # Loops through all the errors and generates the report
18
+ #
19
+ # @example
20
+ # foo/bar/baz.js: line 4, col 46, Bad operand.
21
+ # foo/bar/baz.js: line 39, col 7, Missing semicolon.
22
+ #
23
+ # 2 errors
24
+ #
25
+ # @return [String] The default report
26
+ def report
27
+ @output = <<-TEMPLATE
28
+ <?xml version="1.0" encoding="UTF-8"?>
29
+ <testsuites>
30
+ <testsuite name="#{File.basename(Dir.pwd)}" timestamp="#{DateTime.now}">
31
+ TEMPLATE
32
+
33
+ # Group according to the errors.
34
+ error_groups = {}
35
+ @results.each do |file, errors|
36
+ errors.each do |error|
37
+ next unless error && error['code']
38
+
39
+ error_groups[error['code']] ||= []
40
+ error_groups[error['code']] << {
41
+ file: file,
42
+ line: error['line'],
43
+ character: error['character'],
44
+ message: error['reason']
45
+ }
46
+ end
47
+ end
48
+
49
+ # Combine all the errors and the tests for which we have messages. Combine both together.
50
+ all_codes = error_groups.keys + TESTS.keys
51
+
52
+ all_codes.each do |code|
53
+ print_errors_for_code(code, error_groups.fetch(code, []))
54
+ end
55
+
56
+ @output <<= <<-TEMPLATE
57
+ </testsuite>
58
+ </testsuites>
59
+ TEMPLATE
60
+
61
+ output
62
+ end
63
+
64
+ # Appends new error elements to the Report output
65
+ #
66
+ # @example
67
+ # <testcase classname="JUnitXmlReporter.constructor" name="should default path to an empty string" time="0.006">
68
+ # <failure message="test failure">Assertion failed</failure>
69
+ # </testcase>
70
+ #
71
+ # @param code [String] The error code
72
+ # @param errors [Array] The errors for the code
73
+ # @return [void]
74
+ def print_errors_for_code(code, errors)
75
+ name = fetch_error_messages(code, errors)
76
+ output << " <testcase classname=\"jshint.#{code}\" name=\"#{escape(name)}\">\n"
77
+ errors.each do |error|
78
+ output << add_error_message(code, error)
79
+ end
80
+ output << " </testcase>\n"
81
+ output
82
+ end
83
+
84
+ # Escapes the text given for XML.
85
+ #
86
+ # @param text [String] The text to escape
87
+ # @return [String]
88
+ def escape(text)
89
+ REXML::Text.new(text, false, nil, false).to_s
90
+ end
91
+
92
+ private
93
+
94
+ def fetch_error_messages(code, errors)
95
+ return '' if errors.empty?
96
+ TESTS.fetch(code, errors.first[:message])
97
+ end
98
+
99
+ def add_error_message(code, error)
100
+ output << " <failure type=\"#{code}\" message=\"#{escape(error[:message])}\">"
101
+ output << "%s, line %s, col %s\n" % [
102
+ escape(error[:file]),
103
+ error[:line].to_s,
104
+ error[:character].to_s
105
+ ]
106
+ output << "\n</failure>\n"
107
+ end
108
+
109
+ TESTS = {
110
+ E001: "Bad option: '{a}'.",
111
+ E002: "Bad option value.",
112
+ E003: "Expected a JSON value.",
113
+ E004: "Input is neither a string nor an array of strings.",
114
+ E005: "Input is empty.",
115
+ E006: "Unexpected early end of program.",
116
+ E007: "Missing \"use strict\" statement.",
117
+ E008: "Strict violation.",
118
+ E009: "Option 'validthis' can't be used in a global scope.",
119
+ E010: "'with' is not allowed in strict mode.",
120
+ E011: "const '{a}' has already been declared.",
121
+ E012: "const '{a}' is initialized to 'undefined'.",
122
+ E013: "Attempting to override '{a}' which is a constant.",
123
+ E014: "A regular expression literal can be confused with '/='.",
124
+ E015: "Unclosed regular expression.",
125
+ E016: "Invalid regular expression.",
126
+ E017: "Unclosed comment.",
127
+ E018: "Unbegun comment.",
128
+ E019: "Unmatched '{a}'.",
129
+ E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
130
+ E021: "Expected '{a}' and instead saw '{b}'.",
131
+ E022: "Line breaking error '{a}'.",
132
+ E023: "Missing '{a}'.",
133
+ E024: "Unexpected '{a}'.",
134
+ E025: "Missing ':' on a case clause.",
135
+ E026: "Missing '}' to match '{' from line {a}.",
136
+ E027: "Missing ']' to match '[' form line {a}.",
137
+ E028: "Illegal comma.",
138
+ E029: "Unclosed string.",
139
+ E030: "Expected an identifier and instead saw '{a}'.",
140
+ E031: "Bad assignment.",
141
+ E032: "Expected a small integer or 'false' and instead saw '{a}'.",
142
+ E033: "Expected an operator and instead saw '{a}'.",
143
+ E034: "get/set are ES5 features.",
144
+ E035: "Missing property name.",
145
+ E036: "Expected to see a statement and instead saw a block.",
146
+ E037: "Constant {a} was not declared correctly.",
147
+ E038: "Variable {a} was not declared correctly.",
148
+ E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
149
+ E040: "Each value should have its own case label.",
150
+ E041: "Unrecoverable syntax error.",
151
+ E042: "Stopping.",
152
+ E043: "Too many errors.",
153
+ E044: "'{a}' is already defined and can't be redefined.",
154
+ E045: "Invalid for each loop.",
155
+ E046: "A yield statement shall be within a generator function (with syntax: `function*`)",
156
+ E047: "A generator function shall contain a yield statement.",
157
+ E048: "Let declaration not directly within block.",
158
+ E049: "A {a} cannot be named '{b}'.",
159
+ W001: "'hasOwnProperty' is a really bad name.",
160
+ W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
161
+ W003: "'{a}' was used before it was defined.",
162
+ W004: "'{a}' is already defined.",
163
+ W005: "A dot following a number can be confused with a decimal point.",
164
+ W006: "Confusing minuses.",
165
+ W007: "Confusing pluses.",
166
+ W008: "A leading decimal point can be confused with a dot: '{a}'.",
167
+ W009: "The array literal notation [] is preferrable.",
168
+ W010: "The object literal notation {} is preferrable.",
169
+ W011: "Unexpected space after '{a}'.",
170
+ W012: "Unexpected space before '{a}'.",
171
+ W013: "Missing space after '{a}'.",
172
+ W014: "Bad line breaking before '{a}'.",
173
+ W015: "Expected '{a}' to have an indentation at {b} instead at {c}.",
174
+ W016: "Unexpected use of '{a}'.",
175
+ W017: "Bad operand.",
176
+ W018: "Confusing use of '{a}'.",
177
+ W019: "Use the isNaN function to compare with NaN.",
178
+ W020: "Read only.",
179
+ W021: "'{a}' is a function.",
180
+ W022: "Do not assign to the exception parameter.",
181
+ W023: "Expected an identifier in an assignment and instead saw a function invocation.",
182
+ W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
183
+ W025: "Missing name in function declaration.",
184
+ W026: "Inner functions should be listed at the top of the outer function.",
185
+ W027: "Unreachable '{a}' after '{b}'.",
186
+ W028: "Label '{a}' on {b} statement.",
187
+ W030: "Expected an assignment or function call and instead saw an expression.",
188
+ W031: "Do not use 'new' for side effects.",
189
+ W032: "Unnecessary semicolon.",
190
+ W033: "Missing semicolon.",
191
+ W034: "Unnecessary directive \"{a}\".",
192
+ W035: "Empty block.",
193
+ W036: "Unexpected /*member '{a}'.",
194
+ W037: "'{a}' is a statement label.",
195
+ W038: "'{a}' used out of scope.",
196
+ W039: "'{a}' is not allowed.",
197
+ W040: "Possible strict violation.",
198
+ W041: "Use '{a}' to compare with '{b}'.",
199
+ W042: "Avoid EOL escaping.",
200
+ W043: "Bad escaping of EOL. Use option multistr if needed.",
201
+ W044: "Bad or unnecessary escaping.",
202
+ W045: "Bad number '{a}'.",
203
+ W046: "Don't use extra leading zeros '{a}'.",
204
+ W047: "A trailing decimal point can be confused with a dot: '{a}'.",
205
+ W048: "Unexpected control character in regular expression.",
206
+ W049: "Unexpected escaped character '{a}' in regular expression.",
207
+ W050: "JavaScript URL.",
208
+ W051: "Variables should not be deleted.",
209
+ W052: "Unexpected '{a}'.",
210
+ W053: "Do not use {a} as a constructor.",
211
+ W054: "The Function constructor is a form of eval.",
212
+ W055: "A constructor name should start with an uppercase letter.",
213
+ W056: "Bad constructor.",
214
+ W057: "Weird construction. Is 'new' unnecessary?",
215
+ W058: "Missing '()' invoking a constructor.",
216
+ W059: "Avoid arguments.{a}.",
217
+ W060: "document.write can be a form of eval.",
218
+ W061: "eval can be harmful.",
219
+ W062: "Wrap an immediate function invocation in parens " +
220
+ "to assist the reader in understanding that the expression " +
221
+ "is the result of a function, and not the function itself.",
222
+ W063: "Math is not a function.",
223
+ W064: "Missing 'new' prefix when invoking a constructor.",
224
+ W065: "Missing radix parameter.",
225
+ W066: "Implied eval. Consider passing a function instead of a string.",
226
+ W067: "Bad invocation.",
227
+ W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
228
+ W069: "['{a}'] is better written in dot notation.",
229
+ W070: "Extra comma. (it breaks older versions of IE)",
230
+ W071: "This function has too many statements. ({a})",
231
+ W072: "This function has too many parameters. ({a})",
232
+ W073: "Blocks are nested too deeply. ({a})",
233
+ W074: "This function's cyclomatic complexity is too high. ({a})",
234
+ W075: "Duplicate key '{a}'.",
235
+ W076: "Unexpected parameter '{a}' in get {b} function.",
236
+ W077: "Expected a single parameter in set {a} function.",
237
+ W078: "Setter is defined without getter.",
238
+ W079: "Redefinition of '{a}'.",
239
+ W080: "It's not necessary to initialize '{a}' to 'undefined'.",
240
+ W081: "Too many var statements.",
241
+ W082: "Function declarations should not be placed in blocks. " +
242
+ "Use a function expression or move the statement to the top of " +
243
+ "the outer function.",
244
+ W083: "Don't make functions within a loop.",
245
+ W084: "Expected a conditional expression and instead saw an assignment.",
246
+ W085: "Don't use 'with'.",
247
+ W086: "Expected a 'break' statement before '{a}'.",
248
+ W087: "Forgotten 'debugger' statement?",
249
+ W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
250
+ W089: "The body of a for in should be wrapped in an if statement to filter " +
251
+ "unwanted properties from the prototype.",
252
+ W090: "'{a}' is not a statement label.",
253
+ W091: "'{a}' is out of scope.",
254
+ W092: "Wrap the /regexp/ literal in parens to disambiguate the slash operator.",
255
+ W093: "Did you mean to return a conditional instead of an assignment?",
256
+ W094: "Unexpected comma.",
257
+ W095: "Expected a string and instead saw {a}.",
258
+ W096: "The '{a}' key may produce unexpected results.",
259
+ W097: "Use the function form of \"use strict\".",
260
+ W098: "'{a}' is defined but never used.",
261
+ W099: "Mixed spaces and tabs.",
262
+ W100: "This character may get silently deleted by one or more browsers.",
263
+ W101: "Line is too long.",
264
+ W102: "Trailing whitespace.",
265
+ W103: "The '{a}' property is deprecated.",
266
+ W104: "'{a}' is only available in JavaScript 1.7.",
267
+ W105: "Unexpected {a} in '{b}'.",
268
+ W106: "Identifier '{a}' is not in camel case.",
269
+ W107: "Script URL.",
270
+ W108: "Strings must use doublequote.",
271
+ W109: "Strings must use singlequote.",
272
+ W110: "Mixed double and single quotes.",
273
+ W112: "Unclosed string.",
274
+ W113: "Control character in string: {a}.",
275
+ W114: "Avoid {a}.",
276
+ W115: "Octal literals are not allowed in strict mode.",
277
+ W116: "Expected '{a}' and instead saw '{b}'.",
278
+ W117: "'{a}' is not defined.",
279
+ W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
280
+ W119: "'{a}' is only available in ES6 (use esnext option).",
281
+ I001: "Comma warnings can be turned off with 'laxcomma'.",
282
+ I002: "Reserved words as properties can be used under the 'es5' option.",
283
+ I003: "ES5 option is now set per default"
284
+ }.freeze
285
+ end
286
+ end
@@ -2,12 +2,29 @@ require 'jshint'
2
2
  require 'jshint/reporters'
3
3
 
4
4
  namespace :jshint do
5
- desc "Runs JSHint, the JavaScript lint tool over this projects JavaScript assets"
6
- task :lint => :environment do
5
+ desc "Runs JSHint, the JavaScript lint tool over this project's JavaScript assets"
6
+ task :lint => :environment do |_, args|
7
+ # Our own argument parsing, since rake jshint will push extra nil's.
8
+ reporter_name = :Default
9
+ file = nil
10
+ reporter_name = args.extras[0] if args.extras.length >= 1
11
+ file = args.extras[1] if args.extras.length >= 2
12
+
7
13
  linter = Jshint::Lint.new
8
14
  linter.lint
9
- reporter = Jshint::Reporters::Default.new(linter.errors)
10
- puts reporter.report
15
+ reporter = Jshint::Reporters.const_get(reporter_name).new(linter.errors)
16
+
17
+ printer = lambda do |stream|
18
+ stream.puts reporter.report
19
+ end
20
+ if file
21
+ Dir.mkdir(File.dirname(file))
22
+ File.open(file, 'w') do |stream|
23
+ printer.call(stream)
24
+ end
25
+ else
26
+ printer.call($stdout)
27
+ end
11
28
  end
12
29
 
13
30
  desc "Copies the default JSHint options to your Rails application"
@@ -1,4 +1,4 @@
1
1
  module Jshint
2
2
  # Our gem version
3
- VERSION = "0.0.2"
3
+ VERSION = "1.0.0"
4
4
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jshint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Damian Nicholson
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-03-17 00:00:00.000000000 Z
11
+ date: 2014-12-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: therubyracer
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: execjs
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,31 +34,13 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
45
40
  version: 1.4.0
46
- - !ruby/object:Gem::Dependency
47
- name: railties
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: 3.2.0
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: 3.2.0
62
41
  - !ruby/object:Gem::Dependency
63
42
  name: multi_json
64
43
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
44
  requirements:
67
45
  - - ~>
68
46
  - !ruby/object:Gem::Version
@@ -70,7 +48,6 @@ dependencies:
70
48
  type: :runtime
71
49
  prerelease: false
72
50
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
51
  requirements:
75
52
  - - ~>
76
53
  - !ruby/object:Gem::Version
@@ -78,7 +55,6 @@ dependencies:
78
55
  - !ruby/object:Gem::Dependency
79
56
  name: bundler
80
57
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
58
  requirements:
83
59
  - - ~>
84
60
  - !ruby/object:Gem::Version
@@ -86,57 +62,64 @@ dependencies:
86
62
  type: :development
87
63
  prerelease: false
88
64
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
65
  requirements:
91
66
  - - ~>
92
67
  - !ruby/object:Gem::Version
93
68
  version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: railties
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.2.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.2.0
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rake
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ~>
116
102
  - !ruby/object:Gem::Version
117
- version: '0'
103
+ version: '2.14'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ~>
124
109
  - !ruby/object:Gem::Version
125
- version: '0'
110
+ version: '2.14'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: yard
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  description: It achieves this by linting your code through a library called JSHint
@@ -162,6 +145,7 @@ files:
162
145
  - lib/jshint/railtie.rb
163
146
  - lib/jshint/reporters.rb
164
147
  - lib/jshint/reporters/default.rb
148
+ - lib/jshint/reporters/junit.rb
165
149
  - lib/jshint/tasks/jshint.rake
166
150
  - lib/jshint/version.rb
167
151
  - spec/fixtures/jshint.yml
@@ -174,33 +158,26 @@ files:
174
158
  homepage: http://damiannicholson.com
175
159
  licenses:
176
160
  - MIT
161
+ metadata: {}
177
162
  post_install_message:
178
163
  rdoc_options: []
179
164
  require_paths:
180
165
  - lib
181
166
  required_ruby_version: !ruby/object:Gem::Requirement
182
- none: false
183
167
  requirements:
184
- - - ! '>='
168
+ - - '>='
185
169
  - !ruby/object:Gem::Version
186
170
  version: '0'
187
- segments:
188
- - 0
189
- hash: 463206555677395138
190
171
  required_rubygems_version: !ruby/object:Gem::Requirement
191
- none: false
192
172
  requirements:
193
- - - ! '>='
173
+ - - '>='
194
174
  - !ruby/object:Gem::Version
195
175
  version: '0'
196
- segments:
197
- - 0
198
- hash: 463206555677395138
199
176
  requirements: []
200
177
  rubyforge_project:
201
- rubygems_version: 1.8.23
178
+ rubygems_version: 2.0.2
202
179
  signing_key:
203
- specification_version: 3
180
+ specification_version: 4
204
181
  summary: Ensures your JavaScript code adheres to best practices
205
182
  test_files:
206
183
  - spec/fixtures/jshint.yml