coffeelint 1.10.0 → 1.11.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.
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