Skip to content

Commit

Permalink
Merge pull request #204 from sasjs/issue-17
Browse files Browse the repository at this point in the history
chore: add documentation for lineEndings rule
  • Loading branch information
allanbowe authored Feb 20, 2023
2 parents ad59159 + 12e4eeb commit 74e8df2
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 30 deletions.
52 changes: 27 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Configuration is via a `.sasjslint` file with the following structure (these are
"hasMacroParentheses": true,
"ignoreList": ["sajsbuild/", "sasjsresults/"],
"indentationMultiple": 2,
"lineEndings": "off",
"lowerCaseFileNames": true,
"maxDataLineLength": 80,
"maxHeaderLineLength": 80,
Expand All @@ -50,14 +51,14 @@ For more details, and the default state, see the description of each rule below.

### allowedGremlins

An array of hex codes that represents allowed gremlins (invisible / undesirable characters). To allow all gremlins, you can also set the `noGremlins` rule to `false`.
An array of hex codes that represents allowed gremlins (invisible / undesirable characters). To allow all gremlins, you can also set the `noGremlins` rule to `false`.

Example:

```json
{
"noGremlins": true,
"allowedGremlins": ["0x0080", "0x3000"]
"noGremlins": true,
"allowedGremlins": ["0x0080", "0x3000"]
}
```

Expand Down Expand Up @@ -122,6 +123,12 @@ This will check each line to ensure that the count of leading spaces can be divi
- Default: 2
- Severity: WARNING

### lineEndings

This setting ensures the line endings in a file to conform the configured type. Possible values are `lf`, `crlf` and `off` (off means rule is set to be off). If the value is missing, null or undefined then the check would also be switched off (no default applied).

- Severity: WARNING

### lowerCaseFileNames

On *nix systems, it is imperative that autocall macros are in lowercase. When sharing code between windows and *nix systems, the difference in case sensitivity can also be a cause of lost developer time. For this reason, we recommend that sas filenames are always lowercase.
Expand All @@ -131,16 +138,16 @@ On *nix systems, it is imperative that autocall macros are in lowercase. When sh

### maxDataLineLength

Datalines can be very wide, so to avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the data records only. On a related note, as a developer, you should also be aware that code submitted in batch may have a default line length limit which is lower than you expect. See this [usage note](https://support.sas.com/kb/15/883.html) (and thanks to [sasutils for reminding us](https://github.com/sasjs/lint/issues/47#issuecomment-1064340104)).
Datalines can be very wide, so to avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the data records only. On a related note, as a developer, you should also be aware that code submitted in batch may have a default line length limit which is lower than you expect. See this [usage note](https://support.sas.com/kb/15/883.html) (and thanks to [sasutils for reminding us](https://github.com/sasjs/lint/issues/47#issuecomment-1064340104)).

This feature will work for the following statements:

* cards
* cards4
* datalines
* datalines4
* parmcards
* parmcards4
- cards
- cards4
- datalines
- datalines4
- parmcards
- parmcards4

The `maxDataLineLength` setting is always the _higher_ of `maxDataLineLength` and `maxLineLength` (if you set a lower number, it is ignored).

Expand All @@ -149,13 +156,13 @@ The `maxDataLineLength` setting is always the _higher_ of `maxDataLineLength` an

See also:

* [hasDoxygenHeader](#hasdoxygenheader)
* [maxHeaderLineLength](#maxheaderlinelength)
* [maxLineLength](#maxlinelength)
- [hasDoxygenHeader](#hasdoxygenheader)
- [maxHeaderLineLength](#maxheaderlinelength)
- [maxLineLength](#maxlinelength)

### maxHeaderLineLength

In a program header it can be necessary to insert items such as URLs or markdown tables, that cannot be split over multiple lines. To avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the header section only.
In a program header it can be necessary to insert items such as URLs or markdown tables, that cannot be split over multiple lines. To avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the header section only.

The `maxHeaderLineLength` setting is always the _higher_ of `maxHeaderLineLength` and `maxLineLength` (if you set a lower number, it is ignored).

Expand All @@ -164,9 +171,9 @@ The `maxHeaderLineLength` setting is always the _higher_ of `maxHeaderLineLength

See also:

* [hasDoxygenHeader](#hasdoxygenheader)
* [maxDataLineLength](#maxdatalinelength)
* [maxLineLength](#maxlinelength)
- [hasDoxygenHeader](#hasdoxygenheader)
- [maxDataLineLength](#maxdatalinelength)
- [maxLineLength](#maxlinelength)

### maxLineLength

Expand All @@ -181,12 +188,12 @@ We strongly recommend a line length limit, and set the bar at 80. To turn this f

See also:

* [maxDataLineLength](#maxdatalinelength)
* [maxHeaderLineLength](#maxheaderlinelength)
- [maxDataLineLength](#maxdatalinelength)
- [maxHeaderLineLength](#maxheaderlinelength)

### noGremlins

Capture zero-width whitespace and other non-standard characters. The logic is borrowed from the [VSCode Gremlins Extension](https://github.com/nhoizey/vscode-gremlins) - if you are looking for more advanced gremlin zapping capabilities, we highly recommend to use their extension instead.
Capture zero-width whitespace and other non-standard characters. The logic is borrowed from the [VSCode Gremlins Extension](https://github.com/nhoizey/vscode-gremlins) - if you are looking for more advanced gremlin zapping capabilities, we highly recommend to use their extension instead.

The list of characters can be found in this file: [https://github.com/sasjs/lint/blob/main/src/utils/gremlinCharacters.ts](https://github.com/sasjs/lint/blob/main/src/utils/gremlinCharacters.ts)

Expand Down Expand Up @@ -247,11 +254,6 @@ This setting allows the default severity to be adjusted. This is helpful when ru
- "warn" - show warning in the log (doesn’t affect exit code)
- "error" - show error in the log (exit code is 1 when triggered)

## Upcoming Linting Rules:

- `noGremlins` -> identifies all invisible characters, other than spaces / tabs / line endings. If you really need that bell character, use a hex literal!
- `lineEndings` -> set a standard line ending, such as LF or CRLF

# SAS Formatter

A formatter will automatically apply rules when you hit SAVE, which can save a LOT of time.
Expand Down
1 change: 1 addition & 0 deletions sasjslint-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@
"lineEndings": {
"$id": "#/properties/lineEndings",
"type": "string",
"enum": ["lf", "crlf", "off"],
"title": "lineEndings",
"description": "Enforces the configured terminating character for each line. Shows a warning when incorrect line endings are present.",
"default": "lf",
Expand Down
3 changes: 2 additions & 1 deletion src/types/LineEndings.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export enum LineEndings {
LF = 'lf',
CRLF = 'crlf'
CRLF = 'crlf',
OFF = 'off'
}
3 changes: 2 additions & 1 deletion src/types/LintConfig.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@ describe('LintConfig', () => {
hasMacroNameInMend: true,
noNestedMacros: true,
hasMacroParentheses: true,
noGremlins: true
noGremlins: true,
lineEndings: 'lf'
})

expect(config).toBeTruthy()
Expand Down
4 changes: 2 additions & 2 deletions src/types/LintConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,7 @@ export class LintConfig {
}
}

this.fileLintRules.push(lineEndings)
if (json?.lineEndings) {
if (json?.lineEndings && json.lineEndings !== LineEndings.OFF) {
if (
json.lineEndings !== LineEndings.LF &&
json.lineEndings !== LineEndings.CRLF
Expand All @@ -92,6 +91,7 @@ export class LintConfig {
`Invalid value for lineEndings: can be ${LineEndings.LF} or ${LineEndings.CRLF}`
)
}
this.fileLintRules.push(lineEndings)
this.lineEndings = json.lineEndings
}

Expand Down
2 changes: 1 addition & 1 deletion src/utils/getLintConfig.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as fileModule from '@sasjs/utils/file'
import { LintConfig } from '../types/LintConfig'
import { getLintConfig } from './getLintConfig'

const expectedFileLintRulesCount = 6
const expectedFileLintRulesCount = 5
const expectedLineLintRulesCount = 6
const expectedPathLintRulesCount = 2

Expand Down

0 comments on commit 74e8df2

Please sign in to comment.