coffeelint 1.9.1 → 1.10.0.pre.patch.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7720f637d2867a5667ef76f393504a66af63150f
4
+ data.tar.gz: fccb84fdb0d07e5da9d45787eafca17e88fd533a
5
+ SHA512:
6
+ metadata.gz: e1132114822ce18e09c6661b557fde784ffeeb3150a72dd568eb147dddd456d318e8e0b2508eff81ed2f7a5fca1647e28b209e1871dc70590c5b8b5e8ae9dd25
7
+ data.tar.gz: 0c6fcb815fca593829c6e05d0edb0f2afdec674299f037b188e8947450ca3ce46700d0a7f4c3a0c644d55eac5274b897b07a4042572af5eadd5253a2b3f75901
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.9.1
3
+ Using coffeelint version: v1.10.0
4
4
 
5
5
  Coffeelint is a set of simple ruby bindings for [coffeelint](https://github.com/clutchski/coffeelint).
6
6
 
@@ -36,7 +36,7 @@ Coffeelint.lint_dir(directory, [config_options]) do |filename, lint_report|
36
36
  Coffeelint.display_test_results(filename, lint_report)
37
37
  end
38
38
  Coffeelint.run_test(filename of coffeescript source, [config_options]) # Run tests and print pretty results (return true/false)
39
- Coffeelint.run_test_suite(directory, [config_options]) # Runs a pretty report recursively for a directory (return true/false)
39
+ Coffeelint.run_test_suite(directory, [config_options]) # Runs a pretty report recursively for a directory (returns/exits with number of errors if any or 0)
40
40
  ```
41
41
 
42
42
  ### Config Options
@@ -6,7 +6,7 @@ CoffeeLint
6
6
  Copyright (c) 2011 Matthew Perpick.
7
7
  CoffeeLint is freely distributable under the MIT license.
8
8
  */
9
- var ASTLinter, CoffeeScript, ERROR, ErrorReport, IGNORE, LexicalLinter, LineLinter, RULES, WARN, _rules, cache, coffeelint, defaults, difference, extend, hasSyntaxError, mergeDefaultConfig, nodeRequire, packageJSON,
9
+ var ASTLinter, CoffeeScript, ERROR, ErrorReport, IGNORE, LexicalLinter, LineLinter, RULES, WARN, _rules, cache, coffeelint, defaults, difference, extend, hasSyntaxError, mergeDefaultConfig, nodeRequire, packageJSON, sameJSON,
10
10
  slice = [].slice,
11
11
  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; };
12
12
 
@@ -78,8 +78,15 @@ ASTLinter = require('./ast_linter.coffee');
78
78
  cache = null;
79
79
 
80
80
  mergeDefaultConfig = function(userConfig) {
81
- var config, rule, ruleConfig;
81
+ var config, rule, ruleConfig, ruleLoader;
82
+ try {
83
+ ruleLoader = nodeRequire('./ruleLoader');
84
+ ruleLoader.loadFromConfig(coffeelint, userConfig);
85
+ } catch (_error) {}
82
86
  config = {};
87
+ if (userConfig.coffeelint) {
88
+ config.coffeelint = userConfig.coffeelint;
89
+ }
83
90
  for (rule in RULES) {
84
91
  ruleConfig = RULES[rule];
85
92
  config[rule] = defaults(userConfig[rule], ruleConfig);
@@ -87,6 +94,50 @@ mergeDefaultConfig = function(userConfig) {
87
94
  return config;
88
95
  };
89
96
 
97
+ sameJSON = function(a, b) {
98
+ return JSON.stringify(a) === JSON.stringify(b);
99
+ };
100
+
101
+ coffeelint.trimConfig = function(userConfig) {
102
+ var config, dConfig, dValue, key, newConfig, ref, rule, value;
103
+ newConfig = {};
104
+ userConfig = mergeDefaultConfig(userConfig);
105
+ for (rule in userConfig) {
106
+ config = userConfig[rule];
107
+ dConfig = RULES[rule];
108
+ if (rule === 'coffeelint') {
109
+ config.transforms = config._transforms;
110
+ delete config._transforms;
111
+ config.coffeescript = config._coffeescript;
112
+ delete config._coffeescript;
113
+ newConfig[rule] = config;
114
+ } else if ((config.level === (ref = dConfig.level) && ref === 'ignore')) {
115
+ void 0;
116
+ } else if (config.level === 'ignore') {
117
+ newConfig[rule] = {
118
+ level: 'ignore'
119
+ };
120
+ } else {
121
+ config.module = config._module;
122
+ delete config._module;
123
+ for (key in config) {
124
+ value = config[key];
125
+ if (key === 'message' || key === 'description' || key === 'name') {
126
+ continue;
127
+ }
128
+ dValue = dConfig[key];
129
+ if (value !== dValue && !sameJSON(value, dValue)) {
130
+ if (newConfig[rule] == null) {
131
+ newConfig[rule] = {};
132
+ }
133
+ newConfig[rule][key] = value;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ return newConfig;
139
+ };
140
+
90
141
  coffeelint.invertLiterate = function(source) {
91
142
  var len, line, n, newSource, ref;
92
143
  source = CoffeeScript.helpers.invertLiterate(source);
@@ -221,6 +272,10 @@ coffeelint.registerRule(require('./rules/transform_messes_up_line_numbers.coffee
221
272
 
222
273
  coffeelint.registerRule(require('./rules/ensure_comprehensions.coffee'));
223
274
 
275
+ coffeelint.registerRule(require('./rules/no_this.coffee'));
276
+
277
+ coffeelint.registerRule(require('./rules/eol_last.coffee'));
278
+
224
279
  hasSyntaxError = function(source) {
225
280
  try {
226
281
  CoffeeScript.tokens(source);
@@ -244,10 +299,6 @@ coffeelint.lint = function(source, userConfig, literate) {
244
299
  literate = false;
245
300
  }
246
301
  errors = [];
247
- try {
248
- ruleLoader = nodeRequire('./ruleLoader');
249
- ruleLoader.loadFromConfig(this, userConfig);
250
- } catch (_error) {}
251
302
  if (cache != null) {
252
303
  cache.setConfig(userConfig);
253
304
  }
@@ -263,15 +314,17 @@ coffeelint.lint = function(source, userConfig, literate) {
263
314
  ref2 = userConfig != null ? (ref1 = userConfig.coffeelint) != null ? ref1.transforms : void 0 : void 0;
264
315
  for (n = 0, len = ref2.length; n < len; n++) {
265
316
  m = ref2[n];
266
- transform = ruleLoader.require(m);
267
- source = transform(source);
317
+ try {
318
+ ruleLoader = nodeRequire('./ruleLoader');
319
+ transform = ruleLoader.require(m);
320
+ source = transform(source);
321
+ } catch (_error) {}
268
322
  }
269
323
  if (sourceLength !== source.split("\n").length && config.transform_messes_up_line_numbers.level !== 'ignore') {
270
324
  errors.push(extend({
271
325
  lineNumber: 1,
272
326
  context: "File was transformed from " + sourceLength + " lines to " + (source.split("\n").length) + " lines"
273
327
  }, config.transform_messes_up_line_numbers));
274
- console.log(errors);
275
328
  }
276
329
  }
277
330
  if ((userConfig != null ? (ref3 = userConfig.coffeelint) != null ? ref3.coffeescript : void 0 : void 0) != null) {
@@ -368,11 +421,11 @@ coffeelint.setCache = function(obj) {
368
421
 
369
422
 
370
423
 
371
- },{"./../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/indentation.coffee":17,"./rules/line_endings.coffee":18,"./rules/max_line_length.coffee":19,"./rules/missing_fat_arrows.coffee":20,"./rules/newlines_after_classes.coffee":21,"./rules/no_backticks.coffee":22,"./rules/no_debugger.coffee":23,"./rules/no_empty_functions.coffee":24,"./rules/no_empty_param_list.coffee":25,"./rules/no_implicit_braces.coffee":26,"./rules/no_implicit_parens.coffee":27,"./rules/no_interpolation_in_single_quotes.coffee":28,"./rules/no_plusplus.coffee":29,"./rules/no_stand_alone_at.coffee":30,"./rules/no_tabs.coffee":31,"./rules/no_throwing_strings.coffee":32,"./rules/no_trailing_semicolons.coffee":33,"./rules/no_trailing_whitespace.coffee":34,"./rules/no_unnecessary_double_quotes.coffee":35,"./rules/no_unnecessary_fat_arrows.coffee":36,"./rules/non_empty_constructor_needs_parens.coffee":37,"./rules/prefer_english_operator.coffee":38,"./rules/space_operators.coffee":39,"./rules/spacing_after_comma.coffee":40,"./rules/transform_messes_up_line_numbers.coffee":41}],2:[function(require,module,exports){
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){
372
425
  module.exports={
373
426
  "name": "coffeelint",
374
427
  "description": "Lint your CoffeeScript",
375
- "version": "1.9.1",
428
+ "version": "1.10.0",
376
429
  "homepage": "http://www.coffeelint.org",
377
430
  "keywords": [
378
431
  "lint",
@@ -399,21 +452,18 @@ module.exports={
399
452
  "glob": "^4.0.0",
400
453
  "ignore": "^2.2.15",
401
454
  "optimist": "^0.6.1",
402
- "resolve": "^0.6.3"
455
+ "resolve": "^0.6.3",
456
+ "strip-json-comments": "^1.0.2"
403
457
  },
404
458
  "devDependencies": {
405
459
  "vows": ">=0.6.0",
406
460
  "underscore": ">=1.4.4"
407
461
  },
408
- "licenses": [
409
- {
410
- "type": "MIT",
411
- "url": "http://github.com/clutchski/coffeelint/raw/master/LICENSE"
412
- }
413
- ],
462
+ "license": "MIT",
414
463
  "scripts": {
415
464
  "pretest": "cake compile",
416
465
  "test": "./vowsrunner.js --spec test/*.coffee test/*.litcoffee",
466
+ "testrule": "npm run compile && ./vowsrunner.js --spec",
417
467
  "posttest": "npm run lint",
418
468
  "prepublish": "cake prepublish",
419
469
  "publish": "cake publish",
@@ -1053,11 +1103,11 @@ module.exports = ArrowSpacing = (function() {
1053
1103
  ArrowSpacing.prototype.rule = {
1054
1104
  name: 'arrow_spacing',
1055
1105
  level: 'ignore',
1056
- message: 'Function arrow (->) must be spaced properly',
1106
+ message: 'Function arrows (-> and =>) must be spaced properly',
1057
1107
  description: "<p>This rule checks to see that there is spacing before and after\nthe arrow operator that declares a function. This rule is disabled\nby default.</p> <p>Note that if arrow_spacing is enabled, and you\npass an empty function as a parameter, arrow_spacing will accept\neither a space or no space in-between the arrow operator and the\nparenthesis</p>\n<pre><code># Both of this will not trigger an error,\n# even with arrow_spacing enabled.\nx(-> 3)\nx( -> 3)\n\n# However, this will trigger an error\nx((a,b)-> 3)\n</code>\n</pre>"
1058
1108
  };
1059
1109
 
1060
- ArrowSpacing.prototype.tokens = ['->'];
1110
+ ArrowSpacing.prototype.tokens = ['->', '=>'];
1061
1111
 
1062
1112
  ArrowSpacing.prototype.lintToken = function(token, tokenApi) {
1063
1113
  var pp;
@@ -1100,8 +1150,9 @@ module.exports = BracesSpacing = (function() {
1100
1150
  name: 'braces_spacing',
1101
1151
  level: 'ignore',
1102
1152
  spaces: 0,
1153
+ empty_object_spaces: 0,
1103
1154
  message: 'Curly braces must have the proper spacing',
1104
- description: 'This rule checks to see that there is the proper spacing inside\ncurly braces. The spacing amount is specified by "spaces".\n\n<pre><code>\n# Spaces is 0\n{a: b} # Good\n{a: b } # Bad\n{ a: b} # Bad\n{ a: b } # Bad\n\n# Spaces is 1\n{a: b} # Bad\n{a: b } # Bad\n{ a: b} # Bad\n{ a: b } # Good\n{ a: b } # Bad\n{ a: b } # Bad\n{ a: b } # Bad\n</code></pre>\n\nThis rule is disabled by default.'
1155
+ description: 'This rule checks to see that there is the proper spacing inside\ncurly braces. The spacing amount is specified by "spaces".\nThe spacing amount for empty objects is specified by\n"empty_object_spaces".\n\n<pre><code>\n# Spaces is 0\n{a: b} # Good\n{a: b } # Bad\n{ a: b} # Bad\n{ a: b } # Bad\n\n# Spaces is 1\n{a: b} # Bad\n{a: b } # Bad\n{ a: b} # Bad\n{ a: b } # Good\n{ a: b } # Bad\n{ a: b } # Bad\n{ a: b } # Bad\n\n# Empty Object Spaces is 0\n{} # Good\n{ } # Bad\n\n# Empty Object Spaces is 1\n{} # Bad\n{ } # Good\n</code></pre>\n\nThis rule is disabled by default.'
1105
1156
  };
1106
1157
 
1107
1158
  BracesSpacing.prototype.tokens = ['{', '}'];
@@ -1127,6 +1178,16 @@ module.exports = BracesSpacing = (function() {
1127
1178
  return firstToken[2].first_line === secondToken[2].first_line;
1128
1179
  };
1129
1180
 
1181
+ BracesSpacing.prototype.getExpectedSpaces = function(tokenApi, firstToken, secondToken) {
1182
+ var config, ref;
1183
+ config = tokenApi.config[this.rule.name];
1184
+ if (firstToken[0] === '{' && secondToken[0] === '}') {
1185
+ return (ref = config.empty_object_spaces) != null ? ref : config.spaces;
1186
+ } else {
1187
+ return config.spaces;
1188
+ }
1189
+ };
1190
+
1130
1191
  BracesSpacing.prototype.lintToken = function(token, tokenApi) {
1131
1192
  var actual, expected, firstToken, msg, ref, secondToken;
1132
1193
  if (token.generated) {
@@ -1136,7 +1197,7 @@ module.exports = BracesSpacing = (function() {
1136
1197
  if (!this.tokensOnSameLine(firstToken, secondToken)) {
1137
1198
  return null;
1138
1199
  }
1139
- expected = tokenApi.config[this.rule.name].spaces;
1200
+ expected = this.getExpectedSpaces(tokenApi, firstToken, secondToken);
1140
1201
  actual = this.distanceBetweenTokens(firstToken, secondToken);
1141
1202
  if (actual === expected) {
1142
1203
  return null;
@@ -1162,7 +1223,7 @@ module.exports = BracesSpacing = (function() {
1162
1223
  var CamelCaseClasses, regexes;
1163
1224
 
1164
1225
  regexes = {
1165
- camelCase: /^[A-Z][a-zA-Z\d]*$/
1226
+ camelCase: /^[A-Z_][a-zA-Z\d]*$/
1166
1227
  };
1167
1228
 
1168
1229
  module.exports = CamelCaseClasses = (function() {
@@ -1171,8 +1232,8 @@ module.exports = CamelCaseClasses = (function() {
1171
1232
  CamelCaseClasses.prototype.rule = {
1172
1233
  name: 'camel_case_classes',
1173
1234
  level: 'error',
1174
- message: 'Class names should be camel cased',
1175
- description: "This rule mandates that all class names are CamelCased. Camel\ncasing class names is a generally accepted way of distinguishing\nconstructor functions - which require the 'new' prefix to behave\nproperly - from plain old functions.\n<pre>\n<code># Good!\nclass BoaConstrictor\n\n# Bad!\nclass boaConstrictor\n</code>\n</pre>\nThis rule is enabled by default."
1235
+ message: 'Class name should be UpperCamelCased',
1236
+ description: "This rule mandates that all class names are UpperCamelCased.\nCamel casing class names is a generally accepted way of\ndistinguishing constructor functions - which require the 'new'\nprefix to behave properly - from plain old functions.\n<pre>\n<code># Good!\nclass BoaConstrictor\n\n# Bad!\nclass boaConstrictor\n</code>\n</pre>\nThis rule is enabled by default."
1176
1237
  };
1177
1238
 
1178
1239
  CamelCaseClasses.prototype.tokens = ['CLASS'];
@@ -1407,17 +1468,24 @@ module.exports = EmptyConstructorNeedsParens = (function() {
1407
1468
  EmptyConstructorNeedsParens.prototype.tokens = ['UNARY'];
1408
1469
 
1409
1470
  EmptyConstructorNeedsParens.prototype.lintToken = function(token, tokenApi) {
1410
- var expectedCallStart, expectedIdentifier, identifierIndex;
1471
+ var expectedCallStart, expectedIdentifier, identifierIndex, peek, ref;
1411
1472
  if (token[1] === 'new') {
1473
+ peek = tokenApi.peek.bind(tokenApi);
1412
1474
  identifierIndex = 1;
1413
1475
  while (true) {
1414
- expectedIdentifier = tokenApi.peek(identifierIndex);
1415
- expectedCallStart = tokenApi.peek(identifierIndex + 1);
1476
+ expectedIdentifier = peek(identifierIndex);
1477
+ expectedCallStart = peek(identifierIndex + 1);
1416
1478
  if ((expectedIdentifier != null ? expectedIdentifier[0] : void 0) === 'IDENTIFIER') {
1417
1479
  if ((expectedCallStart != null ? expectedCallStart[0] : void 0) === '.') {
1418
1480
  identifierIndex += 2;
1419
1481
  continue;
1420
1482
  }
1483
+ if ((expectedCallStart != null ? expectedCallStart[0] : void 0) === 'INDEX_START') {
1484
+ while (((ref = peek(identifierIndex)) != null ? ref[0] : void 0) !== 'INDEX_END') {
1485
+ identifierIndex++;
1486
+ }
1487
+ continue;
1488
+ }
1421
1489
  }
1422
1490
  break;
1423
1491
  }
@@ -1507,6 +1575,34 @@ module.exports = EnsureComprehensions = (function() {
1507
1575
 
1508
1576
 
1509
1577
  },{}],17:[function(require,module,exports){
1578
+ var EOLLast;
1579
+
1580
+ module.exports = EOLLast = (function() {
1581
+ function EOLLast() {}
1582
+
1583
+ EOLLast.prototype.rule = {
1584
+ name: 'eol_last',
1585
+ level: 'ignore',
1586
+ message: 'File does not end with a single newline',
1587
+ description: "Checks that the file ends with a single newline"
1588
+ };
1589
+
1590
+ EOLLast.prototype.lintLine = function(line, lineApi) {
1591
+ if (!lineApi.isLastLine()) {
1592
+ return null;
1593
+ }
1594
+ if (line.length) {
1595
+ return true;
1596
+ }
1597
+ };
1598
+
1599
+ return EOLLast;
1600
+
1601
+ })();
1602
+
1603
+
1604
+
1605
+ },{}],18:[function(require,module,exports){
1510
1606
  var Indentation;
1511
1607
 
1512
1608
  module.exports = Indentation = (function() {
@@ -1631,7 +1727,7 @@ module.exports = Indentation = (function() {
1631
1727
 
1632
1728
 
1633
1729
 
1634
- },{}],18:[function(require,module,exports){
1730
+ },{}],19:[function(require,module,exports){
1635
1731
  var LineEndings;
1636
1732
 
1637
1733
  module.exports = LineEndings = (function() {
@@ -1676,7 +1772,7 @@ module.exports = LineEndings = (function() {
1676
1772
 
1677
1773
 
1678
1774
 
1679
- },{}],19:[function(require,module,exports){
1775
+ },{}],20:[function(require,module,exports){
1680
1776
  var MaxLineLength, regexes;
1681
1777
 
1682
1778
  regexes = {
@@ -1700,7 +1796,7 @@ module.exports = MaxLineLength = (function() {
1700
1796
  var limitComments, lineLength, max, ref, ref1;
1701
1797
  max = (ref = lineApi.config[this.rule.name]) != null ? ref.value : void 0;
1702
1798
  limitComments = (ref1 = lineApi.config[this.rule.name]) != null ? ref1.limitComments : void 0;
1703
- lineLength = line.trimRight().length;
1799
+ lineLength = line.replace(/\s+$/, '').length;
1704
1800
  if (lineApi.isLiterate() && regexes.literateComment.test(line)) {
1705
1801
  lineLength -= 2;
1706
1802
  }
@@ -1722,7 +1818,7 @@ module.exports = MaxLineLength = (function() {
1722
1818
 
1723
1819
 
1724
1820
 
1725
- },{}],20:[function(require,module,exports){
1821
+ },{}],21:[function(require,module,exports){
1726
1822
  var MissingFatArrows, any, containsButIsnt,
1727
1823
  bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
1728
1824
  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; };
@@ -1761,8 +1857,9 @@ module.exports = MissingFatArrows = (function() {
1761
1857
  MissingFatArrows.prototype.rule = {
1762
1858
  name: 'missing_fat_arrows',
1763
1859
  level: 'ignore',
1860
+ is_strict: false,
1764
1861
  message: 'Used `this` in a function without a fat arrow',
1765
- description: "Warns when you use `this` inside a function that wasn't defined\nwith a fat arrow. This rule does not apply to methods defined in a\nclass, since they have `this` bound to the class instance (or the\nclass itself, for class methods).\n\nIt is impossible to statically determine whether a function using\n`this` will be bound with the correct `this` value due to language\nfeatures like `Function.prototype.call` and\n`Function.prototype.bind`, so this rule may produce false positives."
1862
+ description: "Warns when you use `this` inside a function that wasn't defined\nwith a fat arrow. This rule does not apply to methods defined in a\nclass, since they have `this` bound to the class instance (or the\nclass itself, for class methods). The option `is_strict` is\navailable for checking bindings of class methods.\n\nIt is impossible to statically determine whether a function using\n`this` will be bound with the correct `this` value due to language\nfeatures like `Function.prototype.call` and\n`Function.prototype.bind`, so this rule may produce false positives."
1766
1863
  };
1767
1864
 
1768
1865
  MissingFatArrows.prototype.lintAST = function(node, astApi) {
@@ -1772,11 +1869,15 @@ module.exports = MissingFatArrows = (function() {
1772
1869
  };
1773
1870
 
1774
1871
  MissingFatArrows.prototype.lintNode = function(node, methods) {
1775
- var error;
1872
+ var error, is_strict, ref;
1776
1873
  if (methods == null) {
1777
1874
  methods = [];
1778
1875
  }
1779
- if ((!this.isFatArrowCode(node)) && (indexOf.call(methods, node) < 0) && (this.needsFatArrow(node))) {
1876
+ is_strict = (ref = this.astApi.config[this.rule.name]) != null ? ref.is_strict : void 0;
1877
+ if (this.isConstructor(node)) {
1878
+ return;
1879
+ }
1880
+ if ((!this.isFatArrowCode(node)) && (is_strict ? true : indexOf.call(methods, node) < 0) && (this.needsFatArrow(node))) {
1780
1881
  error = this.astApi.createError({
1781
1882
  lineNumber: node.locationData.first_line + 1
1782
1883
  });
@@ -1822,6 +1923,11 @@ module.exports = MissingFatArrows = (function() {
1822
1923
  return this.isCode(node) && node.bound;
1823
1924
  };
1824
1925
 
1926
+ MissingFatArrows.prototype.isConstructor = function(node) {
1927
+ var ref, ref1;
1928
+ return ((ref = node.variable) != null ? (ref1 = ref.base) != null ? ref1.value : void 0 : void 0) === 'constructor';
1929
+ };
1930
+
1825
1931
  MissingFatArrows.prototype.needsFatArrow = function(node) {
1826
1932
  return this.isCode(node) && (any(node.params, (function(_this) {
1827
1933
  return function(param) {
@@ -1849,7 +1955,7 @@ module.exports = MissingFatArrows = (function() {
1849
1955
 
1850
1956
 
1851
1957
 
1852
- },{}],21:[function(require,module,exports){
1958
+ },{}],22:[function(require,module,exports){
1853
1959
  var NewlinesAfterClasses;
1854
1960
 
1855
1961
  module.exports = NewlinesAfterClasses = (function() {
@@ -1860,7 +1966,7 @@ module.exports = NewlinesAfterClasses = (function() {
1860
1966
  value: 3,
1861
1967
  level: 'ignore',
1862
1968
  message: 'Wrong count of newlines between a class and other code',
1863
- description: "Checks the number of newlines between classes and other code"
1969
+ description: "<p>Checks the number of newlines between classes and other code.</p>\n\nOptions:\n- <pre><code>value</code></pre> - The number of required newlines\nafter class definitions. Defaults to 3."
1864
1970
  };
1865
1971
 
1866
1972
  NewlinesAfterClasses.prototype.lintLine = function(line, lineApi) {
@@ -1885,7 +1991,7 @@ module.exports = NewlinesAfterClasses = (function() {
1885
1991
 
1886
1992
 
1887
1993
 
1888
- },{}],22:[function(require,module,exports){
1994
+ },{}],23:[function(require,module,exports){
1889
1995
  var NoBackticks;
1890
1996
 
1891
1997
  module.exports = NoBackticks = (function() {
@@ -1910,7 +2016,7 @@ module.exports = NoBackticks = (function() {
1910
2016
 
1911
2017
 
1912
2018
 
1913
- },{}],23:[function(require,module,exports){
2019
+ },{}],24:[function(require,module,exports){
1914
2020
  var NoDebugger;
1915
2021
 
1916
2022
  module.exports = NoDebugger = (function() {
@@ -1919,16 +2025,28 @@ module.exports = NoDebugger = (function() {
1919
2025
  NoDebugger.prototype.rule = {
1920
2026
  name: 'no_debugger',
1921
2027
  level: 'warn',
1922
- message: 'Debugger statements will cause warnings',
1923
- description: "This rule detects the `debugger` statement.\nThis rule is `warn` by default."
2028
+ message: 'Found debugging code',
2029
+ console: false,
2030
+ description: "This rule detects `debugger` and optionally `console` calls\nThis rule is `warn` by default."
1924
2031
  };
1925
2032
 
1926
- NoDebugger.prototype.tokens = ["DEBUGGER"];
2033
+ NoDebugger.prototype.tokens = ["DEBUGGER", "IDENTIFIER"];
1927
2034
 
1928
2035
  NoDebugger.prototype.lintToken = function(token, tokenApi) {
1929
- return {
1930
- context: "found '" + token[0] + "'"
1931
- };
2036
+ var method, ref, ref1;
2037
+ if (token[0] === 'DEBUGGER') {
2038
+ return {
2039
+ context: "found '" + token[0] + "'"
2040
+ };
2041
+ }
2042
+ if ((ref = tokenApi.config[this.rule.name]) != null ? ref.console : void 0) {
2043
+ if (token[1] === 'console' && ((ref1 = tokenApi.peek(1)) != null ? ref1[0] : void 0) === '.') {
2044
+ method = tokenApi.peek(2);
2045
+ return {
2046
+ context: "found 'console." + method[1] + "'"
2047
+ };
2048
+ }
2049
+ }
1932
2050
  };
1933
2051
 
1934
2052
  return NoDebugger;
@@ -1937,7 +2055,7 @@ module.exports = NoDebugger = (function() {
1937
2055
 
1938
2056
 
1939
2057
 
1940
- },{}],24:[function(require,module,exports){
2058
+ },{}],25:[function(require,module,exports){
1941
2059
  var NoEmptyFunctions, isEmptyCode;
1942
2060
 
1943
2061
  isEmptyCode = function(node, astApi) {
@@ -1982,7 +2100,7 @@ module.exports = NoEmptyFunctions = (function() {
1982
2100
 
1983
2101
 
1984
2102
 
1985
- },{}],25:[function(require,module,exports){
2103
+ },{}],26:[function(require,module,exports){
1986
2104
  var NoEmptyParamList;
1987
2105
 
1988
2106
  module.exports = NoEmptyParamList = (function() {
@@ -2009,7 +2127,7 @@ module.exports = NoEmptyParamList = (function() {
2009
2127
 
2010
2128
 
2011
2129
 
2012
- },{}],26:[function(require,module,exports){
2130
+ },{}],27:[function(require,module,exports){
2013
2131
  var NoImplicitBraces;
2014
2132
 
2015
2133
  module.exports = NoImplicitBraces = (function() {
@@ -2069,7 +2187,7 @@ module.exports = NoImplicitBraces = (function() {
2069
2187
 
2070
2188
 
2071
2189
 
2072
- },{}],27:[function(require,module,exports){
2190
+ },{}],28:[function(require,module,exports){
2073
2191
  var NoImplicitParens;
2074
2192
 
2075
2193
  module.exports = NoImplicitParens = (function() {
@@ -2112,7 +2230,7 @@ module.exports = NoImplicitParens = (function() {
2112
2230
 
2113
2231
 
2114
2232
 
2115
- },{}],28:[function(require,module,exports){
2233
+ },{}],29:[function(require,module,exports){
2116
2234
  var NoInterpolationInSingleQuotes;
2117
2235
 
2118
2236
  module.exports = NoInterpolationInSingleQuotes = (function() {
@@ -2130,7 +2248,7 @@ module.exports = NoInterpolationInSingleQuotes = (function() {
2130
2248
  NoInterpolationInSingleQuotes.prototype.lintToken = function(token, tokenApi) {
2131
2249
  var hasInterpolation, tokenValue;
2132
2250
  tokenValue = token[1];
2133
- hasInterpolation = tokenValue.match(/#\{[^}]+\}/);
2251
+ hasInterpolation = tokenValue.match(/^\'.*#\{[^}]+\}.*\'$/);
2134
2252
  return hasInterpolation;
2135
2253
  };
2136
2254
 
@@ -2140,7 +2258,7 @@ module.exports = NoInterpolationInSingleQuotes = (function() {
2140
2258
 
2141
2259
 
2142
2260
 
2143
- },{}],29:[function(require,module,exports){
2261
+ },{}],30:[function(require,module,exports){
2144
2262
  var NoPlusPlus;
2145
2263
 
2146
2264
  module.exports = NoPlusPlus = (function() {
@@ -2167,7 +2285,7 @@ module.exports = NoPlusPlus = (function() {
2167
2285
 
2168
2286
 
2169
2287
 
2170
- },{}],30:[function(require,module,exports){
2288
+ },{}],31:[function(require,module,exports){
2171
2289
  var NoStandAloneAt;
2172
2290
 
2173
2291
  module.exports = NoStandAloneAt = (function() {
@@ -2204,7 +2322,7 @@ module.exports = NoStandAloneAt = (function() {
2204
2322
 
2205
2323
 
2206
2324
 
2207
- },{}],31:[function(require,module,exports){
2325
+ },{}],32:[function(require,module,exports){
2208
2326
  var NoTabs, indentationRegex,
2209
2327
  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; };
2210
2328
 
@@ -2236,7 +2354,32 @@ module.exports = NoTabs = (function() {
2236
2354
 
2237
2355
 
2238
2356
 
2239
- },{}],32:[function(require,module,exports){
2357
+ },{}],33:[function(require,module,exports){
2358
+ var NoThis;
2359
+
2360
+ module.exports = NoThis = (function() {
2361
+ function NoThis() {}
2362
+
2363
+ NoThis.prototype.rule = {
2364
+ name: 'no_this',
2365
+ description: 'This rule prohibits \'this\'.\nUse \'@\' instead.',
2366
+ level: 'ignore',
2367
+ message: "Don't use 'this', use '@' instead"
2368
+ };
2369
+
2370
+ NoThis.prototype.tokens = ['THIS'];
2371
+
2372
+ NoThis.prototype.lintToken = function(token, tokenApi) {
2373
+ return true;
2374
+ };
2375
+
2376
+ return NoThis;
2377
+
2378
+ })();
2379
+
2380
+
2381
+
2382
+ },{}],34:[function(require,module,exports){
2240
2383
  var NoThrowingStrings;
2241
2384
 
2242
2385
  module.exports = NoThrowingStrings = (function() {
@@ -2264,7 +2407,7 @@ module.exports = NoThrowingStrings = (function() {
2264
2407
 
2265
2408
 
2266
2409
 
2267
- },{}],33:[function(require,module,exports){
2410
+ },{}],35:[function(require,module,exports){
2268
2411
  var NoTrailingSemicolons, regexes,
2269
2412
  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; },
2270
2413
  slice = [].slice;
@@ -2317,7 +2460,7 @@ module.exports = NoTrailingSemicolons = (function() {
2317
2460
 
2318
2461
 
2319
2462
 
2320
- },{}],34:[function(require,module,exports){
2463
+ },{}],36:[function(require,module,exports){
2321
2464
  var NoTrailingWhitespace, regexes;
2322
2465
 
2323
2466
  regexes = {
@@ -2381,7 +2524,7 @@ module.exports = NoTrailingWhitespace = (function() {
2381
2524
 
2382
2525
 
2383
2526
 
2384
- },{}],35:[function(require,module,exports){
2527
+ },{}],37:[function(require,module,exports){
2385
2528
  var NoUnnecessaryDoubleQuotes;
2386
2529
 
2387
2530
  module.exports = NoUnnecessaryDoubleQuotes = (function() {
@@ -2400,7 +2543,7 @@ module.exports = NoUnnecessaryDoubleQuotes = (function() {
2400
2543
  NoUnnecessaryDoubleQuotes.prototype.tokens = ['STRING', 'STRING_START', 'STRING_END'];
2401
2544
 
2402
2545
  NoUnnecessaryDoubleQuotes.prototype.lintToken = function(token, tokenApi) {
2403
- var hasLegalConstructs, stringValue, tokenValue, type;
2546
+ var hasLegalConstructs, ref, stringValue, tokenValue, type;
2404
2547
  type = token[0], tokenValue = token[1];
2405
2548
  if (type === 'STRING_START' || type === 'STRING_END') {
2406
2549
  return this.trackParens.apply(this, arguments);
@@ -2409,6 +2552,9 @@ module.exports = NoUnnecessaryDoubleQuotes = (function() {
2409
2552
  if (!stringValue) {
2410
2553
  return false;
2411
2554
  }
2555
+ if (((ref = tokenApi.peek(2)) != null ? ref[0] : void 0) === 'REGEX_END') {
2556
+ return false;
2557
+ }
2412
2558
  hasLegalConstructs = this.isInterpolation || this.hasSingleQuote(tokenValue);
2413
2559
  return !hasLegalConstructs;
2414
2560
  };
@@ -2432,7 +2578,7 @@ module.exports = NoUnnecessaryDoubleQuotes = (function() {
2432
2578
 
2433
2579
 
2434
2580
 
2435
- },{}],36:[function(require,module,exports){
2581
+ },{}],38:[function(require,module,exports){
2436
2582
  var NoUnnecessaryFatArrows, any,
2437
2583
  bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
2438
2584
 
@@ -2514,7 +2660,7 @@ module.exports = NoUnnecessaryFatArrows = (function() {
2514
2660
 
2515
2661
 
2516
2662
 
2517
- },{}],37:[function(require,module,exports){
2663
+ },{}],39:[function(require,module,exports){
2518
2664
  var NonEmptyConstructorNeedsParens, ParentClass,
2519
2665
  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; },
2520
2666
  hasProp = {}.hasOwnProperty;
@@ -2547,7 +2693,7 @@ module.exports = NonEmptyConstructorNeedsParens = (function(superClass) {
2547
2693
 
2548
2694
 
2549
2695
 
2550
- },{"./empty_constructor_needs_parens.coffee":15}],38:[function(require,module,exports){
2696
+ },{"./empty_constructor_needs_parens.coffee":15}],40:[function(require,module,exports){
2551
2697
  var RuleProcessor;
2552
2698
 
2553
2699
  module.exports = RuleProcessor = (function() {
@@ -2609,7 +2755,7 @@ module.exports = RuleProcessor = (function() {
2609
2755
 
2610
2756
 
2611
2757
 
2612
- },{}],39:[function(require,module,exports){
2758
+ },{}],41:[function(require,module,exports){
2613
2759
  var SpaceOperators,
2614
2760
  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; };
2615
2761
 
@@ -2714,12 +2860,10 @@ module.exports = SpaceOperators = (function() {
2714
2860
 
2715
2861
 
2716
2862
 
2717
- },{}],40:[function(require,module,exports){
2863
+ },{}],42:[function(require,module,exports){
2718
2864
  var RuleProcessor;
2719
2865
 
2720
2866
  module.exports = RuleProcessor = (function() {
2721
- function RuleProcessor() {}
2722
-
2723
2867
  RuleProcessor.prototype.rule = {
2724
2868
  name: 'spacing_after_comma',
2725
2869
  description: 'This rule requires a space after commas.',
@@ -2727,23 +2871,46 @@ module.exports = RuleProcessor = (function() {
2727
2871
  message: 'Spaces are required after commas'
2728
2872
  };
2729
2873
 
2730
- RuleProcessor.prototype.tokens = [','];
2874
+ RuleProcessor.prototype.tokens = [',', 'REGEX_START', 'REGEX_END'];
2875
+
2876
+ function RuleProcessor() {
2877
+ this.inRegex = false;
2878
+ }
2731
2879
 
2732
2880
  RuleProcessor.prototype.lintToken = function(token, tokenApi) {
2733
- if (!(token.spaced || token.newLine)) {
2881
+ var type;
2882
+ type = token[0];
2883
+ if (type === 'REGEX_START') {
2884
+ this.inRegex = true;
2885
+ return;
2886
+ }
2887
+ if (type === 'REGEX_END') {
2888
+ this.inRegex = false;
2889
+ return;
2890
+ }
2891
+ if (!(token.spaced || token.newLine || token.generated || this.isRegexFlag(token, tokenApi))) {
2734
2892
  return {
2735
2893
  context: token[1]
2736
2894
  };
2737
2895
  }
2738
2896
  };
2739
2897
 
2898
+ RuleProcessor.prototype.isRegexFlag = function(token, tokenApi) {
2899
+ var maybeEnd;
2900
+ if (!this.inRegex) {
2901
+ return false;
2902
+ }
2903
+ maybeEnd = tokenApi.peek(3);
2904
+ return (maybeEnd != null ? maybeEnd[0] : void 0) === 'REGEX_END';
2905
+ };
2906
+
2740
2907
  return RuleProcessor;
2741
2908
 
2742
2909
  })();
2743
2910
 
2744
2911
 
2745
2912
 
2746
- },{}],41:[function(require,module,exports){
2913
+ },{}],43:[function(require,module,exports){
2747
2914
  var CamelCaseClasses;
2748
2915
 
2749
2916
  module.exports = CamelCaseClasses = (function() {
data/lib/coffeelint.rb CHANGED
@@ -107,11 +107,11 @@ module Coffeelint
107
107
 
108
108
  def self.run_test_suite(directory, config = {})
109
109
  pretty_output = config.has_key?(:pretty_output) ? config.delete(:pretty_output) : true
110
- success = true
110
+ errors_count = 0
111
111
  Coffeelint.lint_dir(directory, config) do |name, errors|
112
+ errors_count += errors.count
112
113
  result = Coffeelint.display_test_results(name, errors, pretty_output)
113
- success = false if not result
114
114
  end
115
- success
115
+ errors_count
116
116
  end
117
117
  end
@@ -1,3 +1,3 @@
1
1
  module Coffeelint
2
- VERSION = "1.9.1"
2
+ VERSION = "1.10.0-patch.1"
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
data/spec/config_spec.rb CHANGED
@@ -51,7 +51,7 @@ module CoffeeLint
51
51
  expect(Config.send(:config_files_in_path, [''])).to eq(result)
52
52
  end
53
53
 
54
- it 'builds usefull path segements' do
54
+ it 'builds useful path segements' do
55
55
  result = %w(config/coffeelint.json config/.coffeelint.json)
56
56
  expect(Config.send(:config_files_in_path, 'config')).to eq(result)
57
57
  expect(Config.send(:config_files_in_path, ['config'])).to eq(result)
metadata CHANGED
@@ -1,94 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coffeelint
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.1
5
- prerelease:
4
+ version: 1.10.0.pre.patch.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Zachary Bush
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-02-23 00:00:00.000000000 Z
11
+ date: 2015-08-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: coffee-script
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
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
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: json
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
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: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: execjs
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: 3.1.0
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: 3.1.0
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  description: Ruby bindings for coffeelint
@@ -99,16 +88,17 @@ executables:
99
88
  extensions: []
100
89
  extra_rdoc_files: []
101
90
  files:
102
- - .gitignore
103
- - .gitmodules
104
- - .rspec
105
- - .travis.yml
91
+ - ".gitignore"
92
+ - ".gitmodules"
93
+ - ".rspec"
94
+ - ".travis.yml"
106
95
  - Gemfile
107
96
  - LICENSE.txt
108
97
  - README.md
109
98
  - Rakefile
110
99
  - bin/coffeelint.rb
111
100
  - coffeelint.gemspec
101
+ - coffeelint/lib/coffeelint.js
112
102
  - lib/coffeelint.rb
113
103
  - lib/coffeelint/cmd.rb
114
104
  - lib/coffeelint/config.rb
@@ -119,31 +109,29 @@ files:
119
109
  - spec/coffeelint_spec.rb
120
110
  - spec/config_spec.rb
121
111
  - spec/spec_helper.rb
122
- - coffeelint/lib/coffeelint.js
123
112
  homepage: https://github.com/zipcodeman/coffeelint-ruby
124
113
  licenses:
125
114
  - MIT
115
+ metadata: {}
126
116
  post_install_message:
127
117
  rdoc_options: []
128
118
  require_paths:
129
119
  - lib
130
120
  required_ruby_version: !ruby/object:Gem::Requirement
131
- none: false
132
121
  requirements:
133
- - - ! '>='
122
+ - - ">="
134
123
  - !ruby/object:Gem::Version
135
124
  version: '0'
136
125
  required_rubygems_version: !ruby/object:Gem::Requirement
137
- none: false
138
126
  requirements:
139
- - - ! '>='
127
+ - - ">"
140
128
  - !ruby/object:Gem::Version
141
- version: '0'
129
+ version: 1.3.1
142
130
  requirements: []
143
131
  rubyforge_project:
144
- rubygems_version: 1.8.23
132
+ rubygems_version: 2.4.5
145
133
  signing_key:
146
- specification_version: 3
134
+ specification_version: 4
147
135
  summary: Ruby bindings for coffeelint along with railtie to add rake task to rails
148
136
  test_files:
149
137
  - spec/assets/.coffeelint.json