coffeelint 1.10.0 → 1.11.0

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: cbd07135d812e00b449c464e6b41c500e99a0d6d
4
- data.tar.gz: d9058cfd7f4667b1c5dca140fed30030cc30237e
3
+ metadata.gz: 4e482db9f7267c3b2e3b6a6a39d445a23ed6d2cc
4
+ data.tar.gz: 16fc6cb55ddc9d88776df33a882d2e1cf374d91c
5
5
  SHA512:
6
- metadata.gz: a992bc82392840add25acaf727f18f3b8b7dbb8e72be618bb56ee16b259af5218a96f743487028099c93810b2dabd896176aab1754a9b54467614ff46ec2979f
7
- data.tar.gz: ccb6bc15554bc7d34e8bb6483a11a564c680dcced0e7522a72232c59701aca7a66a2bd9e682ceca9ea6a2a85145770115d3fa248f56e1df884f01732524f20fd
6
+ metadata.gz: 440d9e0c1106684bfbd074359e06b0b2a88ef2c30be6e9c58bf0dd3c8e9ad6d7a668d64f78ee0aa543a08572a6f8722a2a3be3e19408ee3df688b588a7fe402b
7
+ data.tar.gz: a15b9a7d6e6af6646b715996d1c98781a5c7820d4bdcc99be5dcfc672d3447ec44d8da5a8ded34bbeeaa4f3e4f21a2f7136c506c7cba070bc5c48cfbf8c5b2fb
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Coffeelint [![Build Status](https://travis-ci.org/zmbush/coffeelint-ruby.svg?branch=master)](https://travis-ci.org/zmbush/coffeelint-ruby) [![Gem Version](https://badge.fury.io/rb/coffeelint.png)](http://badge.fury.io/rb/coffeelint)
2
2
 
3
- Using coffeelint version: v1.10.0
3
+ Using coffeelint version: v1.11.0
4
4
 
5
5
  Coffeelint is a set of simple ruby bindings for [coffeelint](https://github.com/clutchski/coffeelint).
6
6
 
@@ -228,6 +228,8 @@ coffeelint.registerRule(require('./rules/colon_assignment_spacing.coffee'));
228
228
 
229
229
  coffeelint.registerRule(require('./rules/no_implicit_braces.coffee'));
230
230
 
231
+ coffeelint.registerRule(require('./rules/no_nested_string_interpolation.coffee'));
232
+
231
233
  coffeelint.registerRule(require('./rules/no_plusplus.coffee'));
232
234
 
233
235
  coffeelint.registerRule(require('./rules/no_throwing_strings.coffee'));
@@ -276,6 +278,8 @@ coffeelint.registerRule(require('./rules/no_this.coffee'));
276
278
 
277
279
  coffeelint.registerRule(require('./rules/eol_last.coffee'));
278
280
 
281
+ coffeelint.registerRule(require('./rules/no_private_function_fat_arrows.coffee'));
282
+
279
283
  hasSyntaxError = function(source) {
280
284
  try {
281
285
  CoffeeScript.tokens(source);
@@ -421,11 +425,11 @@ coffeelint.setCache = function(obj) {
421
425
 
422
426
 
423
427
 
424
- },{"./../package.json":2,"./ast_linter.coffee":3,"./error_report.coffee":5,"./lexical_linter.coffee":6,"./line_linter.coffee":7,"./rules.coffee":8,"./rules/arrow_spacing.coffee":9,"./rules/braces_spacing.coffee":10,"./rules/camel_case_classes.coffee":11,"./rules/colon_assignment_spacing.coffee":12,"./rules/cyclomatic_complexity.coffee":13,"./rules/duplicate_key.coffee":14,"./rules/empty_constructor_needs_parens.coffee":15,"./rules/ensure_comprehensions.coffee":16,"./rules/eol_last.coffee":17,"./rules/indentation.coffee":18,"./rules/line_endings.coffee":19,"./rules/max_line_length.coffee":20,"./rules/missing_fat_arrows.coffee":21,"./rules/newlines_after_classes.coffee":22,"./rules/no_backticks.coffee":23,"./rules/no_debugger.coffee":24,"./rules/no_empty_functions.coffee":25,"./rules/no_empty_param_list.coffee":26,"./rules/no_implicit_braces.coffee":27,"./rules/no_implicit_parens.coffee":28,"./rules/no_interpolation_in_single_quotes.coffee":29,"./rules/no_plusplus.coffee":30,"./rules/no_stand_alone_at.coffee":31,"./rules/no_tabs.coffee":32,"./rules/no_this.coffee":33,"./rules/no_throwing_strings.coffee":34,"./rules/no_trailing_semicolons.coffee":35,"./rules/no_trailing_whitespace.coffee":36,"./rules/no_unnecessary_double_quotes.coffee":37,"./rules/no_unnecessary_fat_arrows.coffee":38,"./rules/non_empty_constructor_needs_parens.coffee":39,"./rules/prefer_english_operator.coffee":40,"./rules/space_operators.coffee":41,"./rules/spacing_after_comma.coffee":42,"./rules/transform_messes_up_line_numbers.coffee":43}],2:[function(require,module,exports){
428
+ },{"./../package.json":2,"./ast_linter.coffee":3,"./error_report.coffee":5,"./lexical_linter.coffee":6,"./line_linter.coffee":7,"./rules.coffee":8,"./rules/arrow_spacing.coffee":9,"./rules/braces_spacing.coffee":10,"./rules/camel_case_classes.coffee":11,"./rules/colon_assignment_spacing.coffee":12,"./rules/cyclomatic_complexity.coffee":13,"./rules/duplicate_key.coffee":14,"./rules/empty_constructor_needs_parens.coffee":15,"./rules/ensure_comprehensions.coffee":16,"./rules/eol_last.coffee":17,"./rules/indentation.coffee":18,"./rules/line_endings.coffee":19,"./rules/max_line_length.coffee":20,"./rules/missing_fat_arrows.coffee":21,"./rules/newlines_after_classes.coffee":22,"./rules/no_backticks.coffee":23,"./rules/no_debugger.coffee":24,"./rules/no_empty_functions.coffee":25,"./rules/no_empty_param_list.coffee":26,"./rules/no_implicit_braces.coffee":27,"./rules/no_implicit_parens.coffee":28,"./rules/no_interpolation_in_single_quotes.coffee":29,"./rules/no_nested_string_interpolation.coffee":30,"./rules/no_plusplus.coffee":31,"./rules/no_private_function_fat_arrows.coffee":32,"./rules/no_stand_alone_at.coffee":33,"./rules/no_tabs.coffee":34,"./rules/no_this.coffee":35,"./rules/no_throwing_strings.coffee":36,"./rules/no_trailing_semicolons.coffee":37,"./rules/no_trailing_whitespace.coffee":38,"./rules/no_unnecessary_double_quotes.coffee":39,"./rules/no_unnecessary_fat_arrows.coffee":40,"./rules/non_empty_constructor_needs_parens.coffee":41,"./rules/prefer_english_operator.coffee":42,"./rules/space_operators.coffee":43,"./rules/spacing_after_comma.coffee":44,"./rules/transform_messes_up_line_numbers.coffee":45}],2:[function(require,module,exports){
425
429
  module.exports={
426
430
  "name": "coffeelint",
427
431
  "description": "Lint your CoffeeScript",
428
- "version": "1.10.0",
432
+ "version": "1.11.0",
429
433
  "homepage": "http://www.coffeelint.org",
430
434
  "keywords": [
431
435
  "lint",
@@ -1112,6 +1116,9 @@ module.exports = ArrowSpacing = (function() {
1112
1116
  ArrowSpacing.prototype.lintToken = function(token, tokenApi) {
1113
1117
  var pp;
1114
1118
  pp = tokenApi.peek(-1);
1119
+ if (!pp) {
1120
+ return;
1121
+ }
1115
1122
  if (!token.spaced && (pp[1] === "(" && (pp.generated == null)) && tokenApi.peek(1)[0] === 'INDENT' && tokenApi.peek(2)[0] === 'OUTDENT') {
1116
1123
  return null;
1117
1124
  } else if (!(((token.spaced != null) || (token.newLine != null) || this.atEof(tokenApi)) && (((pp.spaced != null) || pp[0] === 'TERMINATOR') || (pp.generated != null) || pp[0] === "INDENT" || (pp[1] === "(" && (pp.generated == null))))) {
@@ -1323,12 +1330,12 @@ module.exports = ColonAssignmentSpacing = (function() {
1323
1330
 
1324
1331
 
1325
1332
  },{}],13:[function(require,module,exports){
1326
- var NoTabs;
1333
+ var CyclomaticComplexity;
1327
1334
 
1328
- module.exports = NoTabs = (function() {
1329
- function NoTabs() {}
1335
+ module.exports = CyclomaticComplexity = (function() {
1336
+ function CyclomaticComplexity() {}
1330
1337
 
1331
- NoTabs.prototype.rule = {
1338
+ CyclomaticComplexity.prototype.rule = {
1332
1339
  name: 'cyclomatic_complexity',
1333
1340
  value: 10,
1334
1341
  level: 'ignore',
@@ -1336,20 +1343,20 @@ module.exports = NoTabs = (function() {
1336
1343
  description: 'Examine the complexity of your application.'
1337
1344
  };
1338
1345
 
1339
- NoTabs.prototype.getComplexity = function(node) {
1346
+ CyclomaticComplexity.prototype.getComplexity = function(node) {
1340
1347
  var complexity, name, ref;
1341
1348
  name = this.astApi.getNodeName(node);
1342
1349
  complexity = name === 'If' || name === 'While' || name === 'For' || name === 'Try' ? 1 : name === 'Op' && ((ref = node.operator) === '&&' || ref === '||') ? 1 : name === 'Switch' ? node.cases.length : 0;
1343
1350
  return complexity;
1344
1351
  };
1345
1352
 
1346
- NoTabs.prototype.lintAST = function(node, astApi) {
1353
+ CyclomaticComplexity.prototype.lintAST = function(node, astApi) {
1347
1354
  this.astApi = astApi;
1348
1355
  this.lintNode(node);
1349
1356
  return void 0;
1350
1357
  };
1351
1358
 
1352
- NoTabs.prototype.lintNode = function(node, line) {
1359
+ CyclomaticComplexity.prototype.lintNode = function(node, line) {
1353
1360
  var complexity, error, name, ref, rule;
1354
1361
  name = (ref = this.astApi) != null ? ref.getNodeName(node) : void 0;
1355
1362
  complexity = this.getComplexity(node);
@@ -1376,7 +1383,7 @@ module.exports = NoTabs = (function() {
1376
1383
  return complexity;
1377
1384
  };
1378
1385
 
1379
- return NoTabs;
1386
+ return CyclomaticComplexity;
1380
1387
 
1381
1388
  })();
1382
1389
 
@@ -1523,13 +1530,27 @@ module.exports = EnsureComprehensions = (function() {
1523
1530
 
1524
1531
  EnsureComprehensions.prototype.tokens = ['FOR'];
1525
1532
 
1533
+ EnsureComprehensions.prototype.forBlock = false;
1534
+
1526
1535
  EnsureComprehensions.prototype.lintToken = function(token, tokenApi) {
1527
- var atEqual, idents, peeker, prevIdents, prevToken, ref, ref1;
1536
+ var atEqual, idents, numCallEnds, numCallStarts, peeker, prevIdents, prevToken, ref, ref1;
1528
1537
  idents = this.findIdents(tokenApi);
1538
+ if (this.forBlock) {
1539
+ this.forBlock = false;
1540
+ return;
1541
+ }
1529
1542
  peeker = -1;
1530
1543
  atEqual = false;
1544
+ numCallEnds = 0;
1545
+ numCallStarts = 0;
1531
1546
  prevIdents = [];
1532
1547
  while ((prevToken = tokenApi.peek(peeker))) {
1548
+ if (prevToken[0] === 'CALL_END') {
1549
+ numCallEnds++;
1550
+ }
1551
+ if (prevToken[0] === 'CALL_START') {
1552
+ numCallStarts++;
1553
+ }
1533
1554
  if (prevToken[0] === 'IDENTIFIER') {
1534
1555
  if (!atEqual) {
1535
1556
  prevIdents.push(prevToken[1]);
@@ -1545,7 +1566,7 @@ module.exports = EnsureComprehensions = (function() {
1545
1566
  }
1546
1567
  peeker--;
1547
1568
  }
1548
- if (atEqual && prevIdents.length > 0) {
1569
+ if (atEqual && prevIdents.length > 0 && numCallStarts === numCallEnds) {
1549
1570
  return {
1550
1571
  context: ''
1551
1572
  };
@@ -1565,6 +1586,16 @@ module.exports = EnsureComprehensions = (function() {
1565
1586
  }
1566
1587
  peeker++;
1567
1588
  }
1589
+ while ((nextToken = tokenApi.peek(peeker))) {
1590
+ if (nextToken[0] === 'TERMINATOR') {
1591
+ break;
1592
+ }
1593
+ if (nextToken[0] === 'INDENT') {
1594
+ this.forBlock = true;
1595
+ break;
1596
+ }
1597
+ peeker++;
1598
+ }
1568
1599
  return idents;
1569
1600
  };
1570
1601
 
@@ -2259,6 +2290,56 @@ module.exports = NoInterpolationInSingleQuotes = (function() {
2259
2290
 
2260
2291
 
2261
2292
  },{}],30:[function(require,module,exports){
2293
+ var NoNestedStringInterpolation;
2294
+
2295
+ module.exports = NoNestedStringInterpolation = (function() {
2296
+ NoNestedStringInterpolation.prototype.rule = {
2297
+ name: 'no_nested_string_interpolation',
2298
+ level: 'warn',
2299
+ message: 'Nested string interpolation is forbidden',
2300
+ description: 'This rule warns about nested string interpolation,\nas it tends to make code harder to read and understand.\n<pre>\n<code># Good!\nstr = "Book by #{firstName.toUpperCase()} #{lastName.toUpperCase()}"\n\n# Bad!\nstr = "Book by #{"#{firstName} #{lastName}".toUpperCase()}"\n</code>\n</pre>'
2301
+ };
2302
+
2303
+ NoNestedStringInterpolation.prototype.tokens = ['STRING_START', 'STRING_END'];
2304
+
2305
+ function NoNestedStringInterpolation() {
2306
+ this.startedStrings = 0;
2307
+ this.generatedError = false;
2308
+ }
2309
+
2310
+ NoNestedStringInterpolation.prototype.lintToken = function(arg, tokenApi) {
2311
+ var type;
2312
+ type = arg[0];
2313
+ if (type === 'STRING_START') {
2314
+ return this.trackStringStart();
2315
+ } else {
2316
+ return this.trackStringEnd();
2317
+ }
2318
+ };
2319
+
2320
+ NoNestedStringInterpolation.prototype.trackStringStart = function() {
2321
+ this.startedStrings += 1;
2322
+ if (this.startedStrings <= 1 || this.generatedError) {
2323
+ return;
2324
+ }
2325
+ this.generatedError = true;
2326
+ return true;
2327
+ };
2328
+
2329
+ NoNestedStringInterpolation.prototype.trackStringEnd = function() {
2330
+ this.startedStrings -= 1;
2331
+ if (this.startedStrings === 1) {
2332
+ return this.generatedError = false;
2333
+ }
2334
+ };
2335
+
2336
+ return NoNestedStringInterpolation;
2337
+
2338
+ })();
2339
+
2340
+
2341
+
2342
+ },{}],31:[function(require,module,exports){
2262
2343
  var NoPlusPlus;
2263
2344
 
2264
2345
  module.exports = NoPlusPlus = (function() {
@@ -2285,7 +2366,105 @@ module.exports = NoPlusPlus = (function() {
2285
2366
 
2286
2367
 
2287
2368
 
2288
- },{}],31:[function(require,module,exports){
2369
+ },{}],32:[function(require,module,exports){
2370
+ var NoPrivateFunctionFatArrows,
2371
+ bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
2372
+ indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
2373
+
2374
+ module.exports = NoPrivateFunctionFatArrows = (function() {
2375
+ function NoPrivateFunctionFatArrows() {
2376
+ this.isFatArrowCode = bind(this.isFatArrowCode, this);
2377
+ this.isObject = bind(this.isObject, this);
2378
+ this.isValue = bind(this.isValue, this);
2379
+ this.isClass = bind(this.isClass, this);
2380
+ this.isCode = bind(this.isCode, this);
2381
+ }
2382
+
2383
+ NoPrivateFunctionFatArrows.prototype.rule = {
2384
+ name: 'no_private_function_fat_arrows',
2385
+ level: 'warn',
2386
+ message: 'Used the fat arrow for a private function',
2387
+ description: "Warns when you use the fat arrow for a private function\ninside a class defintion scope. It is not necessary and\nit does not do anything."
2388
+ };
2389
+
2390
+ NoPrivateFunctionFatArrows.prototype.lintAST = function(node, astApi) {
2391
+ this.astApi = astApi;
2392
+ this.lintNode(node);
2393
+ return void 0;
2394
+ };
2395
+
2396
+ NoPrivateFunctionFatArrows.prototype.lintNode = function(node, functions) {
2397
+ var error;
2398
+ if (functions == null) {
2399
+ functions = [];
2400
+ }
2401
+ if (this.isFatArrowCode(node) && indexOf.call(functions, node) >= 0) {
2402
+ error = this.astApi.createError({
2403
+ lineNumber: node.locationData.first_line + 1
2404
+ });
2405
+ this.errors.push(error);
2406
+ }
2407
+ return node.eachChild((function(_this) {
2408
+ return function(child) {
2409
+ return _this.lintNode(child, (function() {
2410
+ switch (false) {
2411
+ case !this.isClass(node):
2412
+ return this.functionsOfClass(node);
2413
+ case !this.isCode(node):
2414
+ return [];
2415
+ default:
2416
+ return functions;
2417
+ }
2418
+ }).call(_this));
2419
+ };
2420
+ })(this));
2421
+ };
2422
+
2423
+ NoPrivateFunctionFatArrows.prototype.isCode = function(node) {
2424
+ return this.astApi.getNodeName(node) === 'Code';
2425
+ };
2426
+
2427
+ NoPrivateFunctionFatArrows.prototype.isClass = function(node) {
2428
+ return this.astApi.getNodeName(node) === 'Class';
2429
+ };
2430
+
2431
+ NoPrivateFunctionFatArrows.prototype.isValue = function(node) {
2432
+ return this.astApi.getNodeName(node) === 'Value';
2433
+ };
2434
+
2435
+ NoPrivateFunctionFatArrows.prototype.isObject = function(node) {
2436
+ return this.astApi.getNodeName(node) === 'Obj';
2437
+ };
2438
+
2439
+ NoPrivateFunctionFatArrows.prototype.isFatArrowCode = function(node) {
2440
+ return this.isCode(node) && node.bound;
2441
+ };
2442
+
2443
+ NoPrivateFunctionFatArrows.prototype.functionsOfClass = function(classNode) {
2444
+ var bodyNode, bodyValues;
2445
+ bodyValues = (function() {
2446
+ var i, len, ref, results;
2447
+ ref = classNode.body.expressions;
2448
+ results = [];
2449
+ for (i = 0, len = ref.length; i < len; i++) {
2450
+ bodyNode = ref[i];
2451
+ if (this.isValue(bodyNode) && this.isObject(bodyNode.base)) {
2452
+ continue;
2453
+ }
2454
+ results.push(bodyNode.value);
2455
+ }
2456
+ return results;
2457
+ }).call(this);
2458
+ return bodyValues.filter(this.isCode);
2459
+ };
2460
+
2461
+ return NoPrivateFunctionFatArrows;
2462
+
2463
+ })();
2464
+
2465
+
2466
+
2467
+ },{}],33:[function(require,module,exports){
2289
2468
  var NoStandAloneAt;
2290
2469
 
2291
2470
  module.exports = NoStandAloneAt = (function() {
@@ -2322,7 +2501,7 @@ module.exports = NoStandAloneAt = (function() {
2322
2501
 
2323
2502
 
2324
2503
 
2325
- },{}],32:[function(require,module,exports){
2504
+ },{}],34:[function(require,module,exports){
2326
2505
  var NoTabs, indentationRegex,
2327
2506
  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
2328
2507
 
@@ -2354,7 +2533,7 @@ module.exports = NoTabs = (function() {
2354
2533
 
2355
2534
 
2356
2535
 
2357
- },{}],33:[function(require,module,exports){
2536
+ },{}],35:[function(require,module,exports){
2358
2537
  var NoThis;
2359
2538
 
2360
2539
  module.exports = NoThis = (function() {
@@ -2379,7 +2558,7 @@ module.exports = NoThis = (function() {
2379
2558
 
2380
2559
 
2381
2560
 
2382
- },{}],34:[function(require,module,exports){
2561
+ },{}],36:[function(require,module,exports){
2383
2562
  var NoThrowingStrings;
2384
2563
 
2385
2564
  module.exports = NoThrowingStrings = (function() {
@@ -2407,7 +2586,7 @@ module.exports = NoThrowingStrings = (function() {
2407
2586
 
2408
2587
 
2409
2588
 
2410
- },{}],35:[function(require,module,exports){
2589
+ },{}],37:[function(require,module,exports){
2411
2590
  var NoTrailingSemicolons, regexes,
2412
2591
  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
2413
2592
  slice = [].slice;
@@ -2460,7 +2639,7 @@ module.exports = NoTrailingSemicolons = (function() {
2460
2639
 
2461
2640
 
2462
2641
 
2463
- },{}],36:[function(require,module,exports){
2642
+ },{}],38:[function(require,module,exports){
2464
2643
  var NoTrailingWhitespace, regexes;
2465
2644
 
2466
2645
  regexes = {
@@ -2524,7 +2703,7 @@ module.exports = NoTrailingWhitespace = (function() {
2524
2703
 
2525
2704
 
2526
2705
 
2527
- },{}],37:[function(require,module,exports){
2706
+ },{}],39:[function(require,module,exports){
2528
2707
  var NoUnnecessaryDoubleQuotes;
2529
2708
 
2530
2709
  module.exports = NoUnnecessaryDoubleQuotes = (function() {
@@ -2537,7 +2716,7 @@ module.exports = NoUnnecessaryDoubleQuotes = (function() {
2537
2716
 
2538
2717
  function NoUnnecessaryDoubleQuotes() {
2539
2718
  this.regexps = [];
2540
- this.isInterpolation = false;
2719
+ this.interpolationLevel = 0;
2541
2720
  }
2542
2721
 
2543
2722
  NoUnnecessaryDoubleQuotes.prototype.tokens = ['STRING', 'STRING_START', 'STRING_END'];
@@ -2555,15 +2734,19 @@ module.exports = NoUnnecessaryDoubleQuotes = (function() {
2555
2734
  if (((ref = tokenApi.peek(2)) != null ? ref[0] : void 0) === 'REGEX_END') {
2556
2735
  return false;
2557
2736
  }
2558
- hasLegalConstructs = this.isInterpolation || this.hasSingleQuote(tokenValue);
2737
+ hasLegalConstructs = this.isInInterpolation() || this.hasSingleQuote(tokenValue);
2559
2738
  return !hasLegalConstructs;
2560
2739
  };
2561
2740
 
2741
+ NoUnnecessaryDoubleQuotes.prototype.isInInterpolation = function() {
2742
+ return this.interpolationLevel > 0;
2743
+ };
2744
+
2562
2745
  NoUnnecessaryDoubleQuotes.prototype.trackParens = function(token, tokenApi) {
2563
2746
  if (token[0] === 'STRING_START') {
2564
- this.isInterpolation = true;
2747
+ this.interpolationLevel += 1;
2565
2748
  } else if (token[0] === 'STRING_END') {
2566
- this.isInterpolation = false;
2749
+ this.interpolationLevel -= 1;
2567
2750
  }
2568
2751
  return null;
2569
2752
  };
@@ -2578,7 +2761,7 @@ module.exports = NoUnnecessaryDoubleQuotes = (function() {
2578
2761
 
2579
2762
 
2580
2763
 
2581
- },{}],38:[function(require,module,exports){
2764
+ },{}],40:[function(require,module,exports){
2582
2765
  var NoUnnecessaryFatArrows, any,
2583
2766
  bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
2584
2767
 
@@ -2660,7 +2843,7 @@ module.exports = NoUnnecessaryFatArrows = (function() {
2660
2843
 
2661
2844
 
2662
2845
 
2663
- },{}],39:[function(require,module,exports){
2846
+ },{}],41:[function(require,module,exports){
2664
2847
  var NonEmptyConstructorNeedsParens, ParentClass,
2665
2848
  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
2666
2849
  hasProp = {}.hasOwnProperty;
@@ -2693,13 +2876,13 @@ module.exports = NonEmptyConstructorNeedsParens = (function(superClass) {
2693
2876
 
2694
2877
 
2695
2878
 
2696
- },{"./empty_constructor_needs_parens.coffee":15}],40:[function(require,module,exports){
2697
- var RuleProcessor;
2879
+ },{"./empty_constructor_needs_parens.coffee":15}],42:[function(require,module,exports){
2880
+ var PreferEnglishOperator;
2698
2881
 
2699
- module.exports = RuleProcessor = (function() {
2700
- function RuleProcessor() {}
2882
+ module.exports = PreferEnglishOperator = (function() {
2883
+ function PreferEnglishOperator() {}
2701
2884
 
2702
- RuleProcessor.prototype.rule = {
2885
+ PreferEnglishOperator.prototype.rule = {
2703
2886
  name: 'prefer_english_operator',
2704
2887
  description: 'This rule prohibits &&, ||, ==, != and !.\nUse and, or, is, isnt, and not instead.\n!! for converting to a boolean is ignored.',
2705
2888
  level: 'ignore',
@@ -2707,9 +2890,9 @@ module.exports = RuleProcessor = (function() {
2707
2890
  message: 'Don\'t use &&, ||, ==, !=, or !'
2708
2891
  };
2709
2892
 
2710
- RuleProcessor.prototype.tokens = ['COMPARE', 'UNARY_MATH', 'LOGIC'];
2893
+ PreferEnglishOperator.prototype.tokens = ['COMPARE', 'UNARY_MATH', 'LOGIC'];
2711
2894
 
2712
- RuleProcessor.prototype.lintToken = function(token, tokenApi) {
2895
+ PreferEnglishOperator.prototype.lintToken = function(token, tokenApi) {
2713
2896
  var actual_token, config, context, first_column, last_column, level, line, ref;
2714
2897
  config = tokenApi.config[this.rule.name];
2715
2898
  level = config.level;
@@ -2749,13 +2932,13 @@ module.exports = RuleProcessor = (function() {
2749
2932
  }
2750
2933
  };
2751
2934
 
2752
- return RuleProcessor;
2935
+ return PreferEnglishOperator;
2753
2936
 
2754
2937
  })();
2755
2938
 
2756
2939
 
2757
2940
 
2758
- },{}],41:[function(require,module,exports){
2941
+ },{}],43:[function(require,module,exports){
2759
2942
  var SpaceOperators,
2760
2943
  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
2761
2944
 
@@ -2772,7 +2955,7 @@ module.exports = SpaceOperators = (function() {
2772
2955
  function SpaceOperators() {
2773
2956
  this.callTokens = [];
2774
2957
  this.parenTokens = [];
2775
- this.isInterpolation = false;
2958
+ this.interpolationLevel = 0;
2776
2959
  }
2777
2960
 
2778
2961
  SpaceOperators.prototype.lintToken = function(arg, tokenApi) {
@@ -2794,7 +2977,7 @@ module.exports = SpaceOperators = (function() {
2794
2977
 
2795
2978
  SpaceOperators.prototype.lintPlus = function(token, tokenApi) {
2796
2979
  var isUnary, p, ref, unaries;
2797
- if (this.isInterpolation || this.isInExtendedRegex()) {
2980
+ if (this.isInInterpolation() || this.isInExtendedRegex()) {
2798
2981
  return null;
2799
2982
  }
2800
2983
  p = tokenApi.peek(-1);
@@ -2833,6 +3016,10 @@ module.exports = SpaceOperators = (function() {
2833
3016
  return false;
2834
3017
  };
2835
3018
 
3019
+ SpaceOperators.prototype.isInInterpolation = function() {
3020
+ return this.interpolationLevel > 0;
3021
+ };
3022
+
2836
3023
  SpaceOperators.prototype.trackCall = function(token, tokenApi) {
2837
3024
  var p;
2838
3025
  if (token[0] === 'CALL_START') {
@@ -2847,9 +3034,9 @@ module.exports = SpaceOperators = (function() {
2847
3034
 
2848
3035
  SpaceOperators.prototype.trackParens = function(token, tokenApi) {
2849
3036
  if (token[0] === 'STRING_START') {
2850
- this.isInterpolation = true;
3037
+ this.interpolationLevel += 1;
2851
3038
  } else if (token[0] === 'STRING_END') {
2852
- this.isInterpolation = false;
3039
+ this.interpolationLevel -= 1;
2853
3040
  }
2854
3041
  return null;
2855
3042
  };
@@ -2860,24 +3047,24 @@ module.exports = SpaceOperators = (function() {
2860
3047
 
2861
3048
 
2862
3049
 
2863
- },{}],42:[function(require,module,exports){
2864
- var RuleProcessor;
3050
+ },{}],44:[function(require,module,exports){
3051
+ var SpacingAfterComma;
2865
3052
 
2866
- module.exports = RuleProcessor = (function() {
2867
- RuleProcessor.prototype.rule = {
3053
+ module.exports = SpacingAfterComma = (function() {
3054
+ SpacingAfterComma.prototype.rule = {
2868
3055
  name: 'spacing_after_comma',
2869
3056
  description: 'This rule requires a space after commas.',
2870
3057
  level: 'ignore',
2871
3058
  message: 'Spaces are required after commas'
2872
3059
  };
2873
3060
 
2874
- RuleProcessor.prototype.tokens = [',', 'REGEX_START', 'REGEX_END'];
3061
+ SpacingAfterComma.prototype.tokens = [',', 'REGEX_START', 'REGEX_END'];
2875
3062
 
2876
- function RuleProcessor() {
3063
+ function SpacingAfterComma() {
2877
3064
  this.inRegex = false;
2878
3065
  }
2879
3066
 
2880
- RuleProcessor.prototype.lintToken = function(token, tokenApi) {
3067
+ SpacingAfterComma.prototype.lintToken = function(token, tokenApi) {
2881
3068
  var type;
2882
3069
  type = token[0];
2883
3070
  if (type === 'REGEX_START') {
@@ -2895,7 +3082,7 @@ module.exports = RuleProcessor = (function() {
2895
3082
  }
2896
3083
  };
2897
3084
 
2898
- RuleProcessor.prototype.isRegexFlag = function(token, tokenApi) {
3085
+ SpacingAfterComma.prototype.isRegexFlag = function(token, tokenApi) {
2899
3086
  var maybeEnd;
2900
3087
  if (!this.inRegex) {
2901
3088
  return false;
@@ -2904,30 +3091,30 @@ module.exports = RuleProcessor = (function() {
2904
3091
  return (maybeEnd != null ? maybeEnd[0] : void 0) === 'REGEX_END';
2905
3092
  };
2906
3093
 
2907
- return RuleProcessor;
3094
+ return SpacingAfterComma;
2908
3095
 
2909
3096
  })();
2910
3097
 
2911
3098
 
2912
3099
 
2913
- },{}],43:[function(require,module,exports){
2914
- var CamelCaseClasses;
3100
+ },{}],45:[function(require,module,exports){
3101
+ var TransformMessesUpLineNumbers;
2915
3102
 
2916
- module.exports = CamelCaseClasses = (function() {
2917
- function CamelCaseClasses() {}
3103
+ module.exports = TransformMessesUpLineNumbers = (function() {
3104
+ function TransformMessesUpLineNumbers() {}
2918
3105
 
2919
- CamelCaseClasses.prototype.rule = {
3106
+ TransformMessesUpLineNumbers.prototype.rule = {
2920
3107
  name: 'transform_messes_up_line_numbers',
2921
3108
  level: 'warn',
2922
3109
  message: 'Transforming source messes up line numbers',
2923
3110
  description: "This rule detects when changes are made by transform function,\nand warns that line numbers are probably incorrect."
2924
3111
  };
2925
3112
 
2926
- CamelCaseClasses.prototype.tokens = [];
3113
+ TransformMessesUpLineNumbers.prototype.tokens = [];
2927
3114
 
2928
- CamelCaseClasses.prototype.lintToken = function(token, tokenApi) {};
3115
+ TransformMessesUpLineNumbers.prototype.lintToken = function(token, tokenApi) {};
2929
3116
 
2930
- return CamelCaseClasses;
3117
+ return TransformMessesUpLineNumbers;
2931
3118
 
2932
3119
  })();
2933
3120
 
@@ -112,6 +112,6 @@ module Coffeelint
112
112
  errors_count += errors.count
113
113
  result = Coffeelint.display_test_results(name, errors, pretty_output)
114
114
  end
115
- exit errors_count
115
+ errors_count
116
116
  end
117
117
  end
@@ -1,3 +1,3 @@
1
1
  module Coffeelint
2
- VERSION = "1.10.0"
2
+ VERSION = "1.11.0"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  desc "lint application javascript"
2
2
  task :coffeelint do
3
- success = Coffeelint.run_test_suite('app') and Coffeelint.run_test_suite('spec')
4
- fail "Lint!" unless success
3
+ failures = Coffeelint.run_test_suite('app') + Coffeelint.run_test_suite('spec')
4
+ fail "Lint!" unless failures == 0
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coffeelint
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zachary Bush
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-30 00:00:00.000000000 Z
11
+ date: 2015-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coffee-script