mirror of
https://github.com/sasjs/lint.git
synced 2026-04-12 00:43:13 +00:00
feat: add new config maxDataLineLength
This commit is contained in:
113
src/utils/getDataSectionDetail.spec.ts
Normal file
113
src/utils/getDataSectionDetail.spec.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { LintConfig } from '../types'
|
||||
import { getDataSectionsDetail, checkIsDataLine } from './getDataSectionsDetail'
|
||||
import { DefaultLintConfiguration } from './getLintConfig'
|
||||
|
||||
const datalines = `GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32. OPERATOR_NM:$10. RAW_VALUE:$4000.
|
||||
AND,AND,1,LIBREF,CONTAINS,"'DC'"
|
||||
AND,OR,2,DSN,=,"'MPE_LOCK_ANYTABLE'"`
|
||||
|
||||
const datalinesBeginPattern1 = `datalines;`
|
||||
const datalinesBeginPattern2 = `datalines4;`
|
||||
const datalinesBeginPattern3 = `cards;`
|
||||
const datalinesBeginPattern4 = `cards4;`
|
||||
const datalinesBeginPattern5 = `parmcards;`
|
||||
const datalinesBeginPattern6 = `parmcards4;`
|
||||
|
||||
const datalinesEndPattern1 = `;`
|
||||
const datalinesEndPattern2 = `;;;;`
|
||||
|
||||
describe('getDataSectionsDetail', () => {
|
||||
const config = new LintConfig(DefaultLintConfiguration)
|
||||
it(`should return the detail of data section when it begins and ends with '${datalinesBeginPattern1}' and '${datalinesEndPattern1}' markers`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern1}\n${datalines}\n${datalinesEndPattern1}\n%put world;`
|
||||
expect(getDataSectionsDetail(text, config)).toEqual([
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it(`should return the detail of data section when it begins and ends with '${datalinesBeginPattern2}' and '${datalinesEndPattern2}' markers`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern2}\n${datalines}\n${datalinesEndPattern2}\n%put world;`
|
||||
expect(getDataSectionsDetail(text, config)).toEqual([
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it(`should return the detail of data section when it begins and ends with '${datalinesBeginPattern3}' and '${datalinesEndPattern1}' markers`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern3}\n${datalines}\n${datalinesEndPattern1}\n%put world;`
|
||||
expect(getDataSectionsDetail(text, config)).toEqual([
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it(`should return the detail of data section when it begins and ends with '${datalinesBeginPattern4}' and '${datalinesEndPattern1}' markers`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern4}\n${datalines}\n${datalinesEndPattern1}\n%put world;`
|
||||
expect(getDataSectionsDetail(text, config)).toEqual([
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it(`should return the detail of data section when it begins and ends with '${datalinesBeginPattern5}' and '${datalinesEndPattern1}' markers`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern5}\n${datalines}\n${datalinesEndPattern1}\n%put world;`
|
||||
expect(getDataSectionsDetail(text, config)).toEqual([
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
it(`should return the detail of data section when it begins and ends with '${datalinesBeginPattern6}' and '${datalinesEndPattern2}' markers`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern6}\n${datalines}\n${datalinesEndPattern2}\n%put world;`
|
||||
expect(getDataSectionsDetail(text, config)).toEqual([
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
])
|
||||
})
|
||||
})
|
||||
|
||||
describe('checkIsDataLine', () => {
|
||||
const config = new LintConfig(DefaultLintConfiguration)
|
||||
it(`should return true if a line index is in a range of any data section`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern1}\n${datalines}\n${datalinesEndPattern1}\n%put world;`
|
||||
expect(
|
||||
checkIsDataLine(
|
||||
[
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
],
|
||||
4
|
||||
)
|
||||
).toBe(true)
|
||||
})
|
||||
|
||||
it(`should return false if a line index is not in a range of any of data sections`, () => {
|
||||
const text = `%put hello\n${datalinesBeginPattern1}\n${datalines}\n${datalinesEndPattern1}\n%put world;`
|
||||
expect(
|
||||
checkIsDataLine(
|
||||
[
|
||||
{
|
||||
start: 1,
|
||||
end: 5
|
||||
}
|
||||
],
|
||||
8
|
||||
)
|
||||
).toBe(false)
|
||||
})
|
||||
})
|
||||
56
src/utils/getDataSectionsDetail.ts
Normal file
56
src/utils/getDataSectionsDetail.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { LintConfig } from '../types'
|
||||
import { splitText } from './splitText'
|
||||
|
||||
interface DataSectionsDetail {
|
||||
start: number
|
||||
end: number
|
||||
}
|
||||
|
||||
export const getDataSectionsDetail = (text: string, config: LintConfig) => {
|
||||
const dataSections: DataSectionsDetail[] = []
|
||||
const lines = splitText(text, config)
|
||||
|
||||
const dataSectionStartRegex1 = new RegExp(
|
||||
'^(datalines;)|(cards;)|(cards4;)|(parmcards;)'
|
||||
)
|
||||
const dataSectionEndRegex1 = new RegExp(';')
|
||||
const dataSectionStartRegex2 = new RegExp('^(datalines4)|(parmcards4);')
|
||||
const dataSectionEndRegex2 = new RegExp(';;;;')
|
||||
|
||||
let dataSectionStarted = false
|
||||
let dataSectionStartIndex = -1
|
||||
let dataSectionEndRegex = dataSectionEndRegex1
|
||||
|
||||
lines.forEach((line, index) => {
|
||||
if (dataSectionStarted) {
|
||||
if (dataSectionEndRegex.test(line)) {
|
||||
dataSections.push({ start: dataSectionStartIndex, end: index })
|
||||
dataSectionStarted = false
|
||||
}
|
||||
} else {
|
||||
if (dataSectionStartRegex1.test(line)) {
|
||||
dataSectionStarted = true
|
||||
dataSectionStartIndex = index
|
||||
dataSectionEndRegex = dataSectionEndRegex1
|
||||
} else if (dataSectionStartRegex2.test(line)) {
|
||||
dataSectionStarted = true
|
||||
dataSectionStartIndex = index
|
||||
dataSectionEndRegex = dataSectionEndRegex2
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return dataSections
|
||||
}
|
||||
|
||||
export const checkIsDataLine = (
|
||||
dataSections: DataSectionsDetail[],
|
||||
lineIndex: number
|
||||
) => {
|
||||
for (const dataSection of dataSections) {
|
||||
if (lineIndex >= dataSection.start && lineIndex <= dataSection.end)
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
@@ -17,6 +17,7 @@ export const DefaultLintConfiguration = {
|
||||
lowerCaseFileNames: true,
|
||||
maxLineLength: 80,
|
||||
maxHeaderLineLength: 80,
|
||||
maxDataLineLength: 80,
|
||||
noTabIndentation: true,
|
||||
indentationMultiple: 2,
|
||||
hasMacroNameInMend: true,
|
||||
|
||||
@@ -7,3 +7,4 @@ export * from './listSasFiles'
|
||||
export * from './splitText'
|
||||
export * from './getIndicesOf'
|
||||
export * from './getHeaderLinesCount'
|
||||
export * from './getDataSectionsDetail'
|
||||
|
||||
Reference in New Issue
Block a user