Skip to content

Commit

Permalink
New Rule: max-file-line-count (palantir#1360)
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisMBarr authored and jkillian committed Jul 26, 2016
1 parent c8ddf95 commit 6202637
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ Core rules are included in the `tslint` package.
* `label-position` enforces labels only on sensible statements.
* `label-undefined` checks that labels are defined before usage.
* `linebreak-style` checks that line breaks used in source files are either linefeed or carriage-return linefeeds. By default linefeeds are required. This rule accepts one parameter, either "LF" or "CRLF".
* `max-file-line-count` sets the maximum number of lines for files.
* `max-line-length` sets the maximum length of a line.
* `member-access` enforces using explicit visibility on class members
* `"check-accessor"` enforces explicit visibility on get/set accessors
Expand Down
67 changes: 67 additions & 0 deletions src/rules/maxFileLineCountRule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/**
* @license
* Copyright 2013 Palantir Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as Lint from "../lint";
import * as ts from "typescript";

export class Rule extends Lint.Rules.AbstractRule {
/* tslint:disable:object-literal-sort-keys */
public static metadata: Lint.IRuleMetadata = {
ruleName: "max-file-line-count",
description: "Requires files to remain under a certain number of lines",
rationale: Lint.Utils.dedent`
Limiting the number of lines allowed in a file allows files to remain small,
single purpose, and maintainable.`,
optionsDescription: "An integer indicating the maximum number of lines.",
options: {
type: "number",
minimum: "1",
},
optionExamples: ["[true, 300]"],
type: "maintainability",
};
/* tslint:enable:object-literal-sort-keys */

public static FAILURE_STRING_FACTORY = (lineCount: number, lineLimit: number) => {
let msg = `This file has ${lineCount} lines, which exceeds the maximum of ${lineLimit} lines allowed. `;
msg += `Consider breaking this file up into smaller parts`;
return msg;
};

public isEnabled(): boolean {
if (super.isEnabled()) {
const option = this.getOptions().ruleArguments[0];
if (typeof option === "number" && option > 0) {
return true;
}
}
return false;
}

public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
const ruleFailures: Lint.RuleFailure[] = [];
const lineLimit: number = this.getOptions().ruleArguments[0];
const lineCount: number = sourceFile.getLineStarts().length;
const disabledIntervals = this.getOptions().disabledIntervals;

if (lineCount > lineLimit && disabledIntervals.length === 0) {
const errorString = Rule.FAILURE_STRING_FACTORY(lineCount, lineLimit);
ruleFailures.push(new Lint.RuleFailure(sourceFile, 0, 1, errorString, this.getOptions().ruleName));
}

return ruleFailures;
}
}
1 change: 1 addition & 0 deletions src/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"rules/labelPositionRule.ts",
"rules/labelUndefinedRule.ts",
"rules/linebreakStyleRule.ts",
"rules/maxFileLineCountRule.ts",
"rules/maxLineLengthRule.ts",
"rules/memberAccessRule.ts",
"rules/memberOrderingRule.ts",
Expand Down
23 changes: 23 additions & 0 deletions test/rules/max-file-line-count/default/test.ts.lint
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
namespace App {
~ [This file has 23 lines, which exceeds the maximum of 10 lines allowed. Consider breaking this file up into smaller parts]
class GiveMeANumber {

/* tslint:disable:no-any */
private num:any = 10;
/* tslint:enable:no-any */

//This is some kind of comment
constructor(){
this.giveNumber();
}

/*
Here is another comment
It's very helpful.
*/

public giveNumber = () =>{
alert(this.num);
};
}
}
5 changes: 5 additions & 0 deletions test/rules/max-file-line-count/default/tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"rules": {
"max-file-line-count": [true, 10]
}
}
23 changes: 23 additions & 0 deletions test/rules/max-file-line-count/disabled/test.ts.lint
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/* tslint:disable:max-file-line-count */
//This file NEEDS to be very long, so we've disabled this rule here

namespace App {
class GiveMeANumber {

//THis is a comment about something
private num = 10;

constructor(){
this.giveNumber();
}

/*
Here is another comment
It's very helpful.
*/

public giveNumber = () =>{
alert(this.num);
};
}
}
5 changes: 5 additions & 0 deletions test/rules/max-file-line-count/disabled/tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"rules": {
"max-file-line-count": [true, 10]
}
}
1 change: 1 addition & 0 deletions test/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
"../src/rules/labelPositionRule.ts",
"../src/rules/labelUndefinedRule.ts",
"../src/rules/linebreakStyleRule.ts",
"../src/rules/maxFileLineCountRule.ts",
"../src/rules/maxLineLengthRule.ts",
"../src/rules/memberAccessRule.ts",
"../src/rules/memberOrderingRule.ts",
Expand Down

0 comments on commit 6202637

Please sign in to comment.