Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.

Commit 49f1871

Browse files
feich-msmunozemiliovishwacsena
authored
[Lubuild] fix multiple bugs: case sensitive issue, default version issue and exception not throw out issue (#576)
* fix case issue of utterances and patterns * remove lower function for entities * adjust test cases * use a better solution to compare utterances * add tests to verify the fixes * move new added tests to luis package from lu package * add test cases for luConfig parameter in lubuild CLI * fix error not throw out bug * resolve comments of CLIError * remove uncessary semicolon * Updates and fixes * Updates * updating tests. * Updates for PR feedback, fix settings out path * updates * fix build errors * fix command parameter issue in test cases * fix tslint errors * remove lubuild.js which is not necessary * fixing bad merge * fix tslint and expose more in index.js and composerindex.js * remove lubuild module in index.js Co-authored-by: Emilio Munoz <munoz_emilio@hotmail.com> Co-authored-by: Vishwac Sena Kannan <vishwack@hotmail.com>
1 parent 6dd1d87 commit 49f1871

File tree

18 files changed

+1974
-701
lines changed

18 files changed

+1974
-701
lines changed

common/config/rush/pnpm-lock.yaml

Lines changed: 72 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
module.exports = {
2-
parseFile: require('./lufile/parseFileContents').parseFile,
3-
validateLUISBlob: require('./luis/luisValidator')
2+
parser: {
3+
parseFile: require('./lufile/parseFileContents').parseFile,
4+
validateLUISBlob: require('./luis/luisValidator')
5+
},
6+
sectionHandler: {
7+
luParser: require('./lufile/luParser'),
8+
sectionOperator: require('./lufile/sectionOperator'),
9+
luSectionTypes: require('./utils/enums/lusectiontypes')
10+
},
411
}

packages/lu/src/parser/index.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ const modules = {
2727

2828
Parser: require('./lufile/classes/parserObject')
2929
},
30-
sectionHandler: {
31-
luParser: require('./lufile/luParser'),
32-
sectionOperator: require('./lufile/sectionOperator'),
33-
luSectionTypes: require('./utils/enums/lusectiontypes')
34-
},
3530
V2 : {
3631
Luis: require('./luis/luis'),
3732
LU: require('./lu/lu'),

packages/lu/src/parser/lubuild.js

Lines changed: 0 additions & 10 deletions
This file was deleted.

packages/lu/src/parser/lubuild/builder.ts

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const fs = require('fs-extra')
1212
const delay = require('delay')
1313
const fileHelper = require('./../../utils/filehelper')
1414
const fileExtEnum = require('./../utils/helpers').FileExtTypeEnum
15+
const retCode = require('./../utils/enums/CLI-errors')
16+
const exception = require('./../utils/exception')
1517
const LuisBuilderVerbose = require('./../luis/luisCollate')
1618
const LuisBuilder = require('./../luis/luisBuilder')
1719
const LUOptions = require('./../lu/luOptions')
@@ -38,16 +40,25 @@ export class Builder {
3840
let fileCulture: string
3941
let fileName: string
4042
const luFiles = await fileHelper.getLuObjects(undefined, file, true, fileExtEnum.LUFile)
41-
const result = await LuisBuilderVerbose.build(luFiles, true, culture)
42-
const fileContent = result.parseToLuContent()
43+
44+
let fileContent = ''
45+
let result
46+
try {
47+
result = await LuisBuilderVerbose.build(luFiles, true, culture)
48+
fileContent = result.parseToLuContent()
49+
} catch (err) {
50+
err.text = `Invalid LU file ${file}: ${err.text}`
51+
throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, err.text))
52+
}
53+
4354
this.handler(`${file} loaded\n`)
4455
let cultureFromPath = fileHelper.getCultureFromPath(file)
4556
if (cultureFromPath) {
4657
fileCulture = cultureFromPath
4758
let fileNameWithCulture = path.basename(file, path.extname(file))
4859
fileName = fileNameWithCulture.substring(0, fileNameWithCulture.length - fileCulture.length - 1)
4960
} else {
50-
fileCulture = culture
61+
fileCulture = result.culture !== 'en-us' ? result.culture : culture
5162
fileName = path.basename(file, path.extname(file))
5263
}
5364

@@ -95,7 +106,7 @@ export class Builder {
95106
})
96107

97108
if (hasDuplicates) {
98-
throw new Error('Files with same name and locale are found.')
109+
throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Files with same name and locale are found.'))
99110
}
100111

101112
return {luContents, recognizers, multiRecognizers, settings}
@@ -200,16 +211,23 @@ export class Builder {
200211
return dialogContents
201212
}
202213

203-
async writeDialogAssets(contents: any[], force: boolean, out: string) {
214+
async writeDialogAssets(contents: any[], force: boolean, out: string, luconfig: string) {
204215
let writeDone = false
205-
if (out) {
206-
let settingsContents = contents.filter(c => c.id.endsWith('.json'))
207-
let writeContents = contents.filter(c => c.id.endsWith('.dialog'))
208216

209-
if (settingsContents && settingsContents.length > 0) {
210-
writeContents.push(this.mergeSettingsContent(path.join(path.resolve(out), settingsContents[0].id), settingsContents))
217+
let writeContents = contents.filter(c => c.id.endsWith('.dialog'))
218+
let settingsContents = contents.filter(c => c.id.endsWith('.json'))
219+
220+
if (settingsContents && settingsContents.length > 0) {
221+
let outPath
222+
if (luconfig) {
223+
outPath = path.join(path.resolve(path.dirname(luconfig)), settingsContents[0].id)
224+
} else if (out) {
225+
outPath = path.join(path.resolve(out), settingsContents[0].id)
211226
}
227+
writeContents.push(this.mergeSettingsContent(outPath, settingsContents))
228+
}
212229

230+
if (out) {
213231
for (const content of writeContents) {
214232
const outFilePath = path.join(path.resolve(out), path.basename(content.path))
215233
if (force || !fs.existsSync(outFilePath)) {
@@ -219,7 +237,7 @@ export class Builder {
219237
}
220238
}
221239
} else {
222-
for (const content of contents) {
240+
for (const content of writeContents) {
223241
if (force || !fs.existsSync(content.path)) {
224242
this.handler(`Writing to ${content.path}\n`)
225243
await fs.writeFile(content.path, content.content, 'utf-8')
@@ -269,7 +287,7 @@ export class Builder {
269287
const versionObjs = await luBuildCore.listApplicationVersions(recognizer.getAppId())
270288
for (const versionObj of versionObjs) {
271289
if (versionObj.version !== newVersionId) {
272-
this.handler(`deleting old version=${versionObj.version}`)
290+
this.handler(`${recognizer.getLuPath()} deleting old version=${versionObj.version}`)
273291
await luBuildCore.deleteVersion(recognizer.getAppId(), versionObj.version)
274292
}
275293
}

packages/lu/src/parser/lubuild/core.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,7 @@ export class LuBuildCore {
4949
public compareApplications(currentApp: any, existingApp: any) {
5050
currentApp.desc = currentApp.desc && currentApp.desc !== '' && currentApp.desc !== existingApp.desc ? currentApp.desc : existingApp.desc
5151
currentApp.culture = currentApp.culture && currentApp.culture !== '' && currentApp.culture !== existingApp.culture ? currentApp.culture : existingApp.culture
52-
currentApp.versionId = currentApp.versionId && currentApp.versionId !== '' && currentApp.versionId !== existingApp.versionId ? currentApp.versionId : existingApp.versionId;
53-
54-
// convert utterance text from lu file to lower case
55-
// as utterances from luis api are all converted to lower case automatically
56-
(currentApp.utterances || []).forEach((u: any) => {
57-
u.text = u.text.toLowerCase()
58-
});
52+
currentApp.versionId = currentApp.versionId && currentApp.versionId !== '' && currentApp.versionId > existingApp.versionId ? currentApp.versionId : existingApp.versionId;
5953

6054
// convert list entities to remove synonyms word in list which is same with canonicalForm
6155
(currentApp.closedLists || []).forEach((c: any) => {
@@ -85,7 +79,7 @@ export class LuBuildCore {
8579

8680
public updateVersion(currentApp: any, existingApp: any) {
8781
let newVersionId: string
88-
if (currentApp.versionId && currentApp.versionId !== existingApp.versionId) {
82+
if (currentApp.versionId > existingApp.versionId) {
8983
newVersionId = currentApp.versionId
9084
} else {
9185
newVersionId = this.updateVersionValue(existingApp.versionId)
@@ -178,12 +172,12 @@ export class LuBuildCore {
178172
equal = equal && this.isArrayEqual(appA.closedLists, appB.closedLists)
179173
equal = equal && this.isArrayEqual(appA.composites, appB.composites)
180174
equal = equal && this.isArrayEqual(appA.entities, appB.entities)
181-
equal = equal && this.isArrayEqual(appA.modelFeatures, appB.modelFeatures)
175+
equal = equal && this.isArrayEqual(appA.model_features, appB.modelFeatures)
182176
equal = equal && this.isArrayEqual(appA.patternAnyEntities, appB.patternAnyEntities)
183177
equal = equal && this.isArrayEqual(appA.patterns, appB.patterns)
184178
equal = equal && this.isArrayEqual(appA.prebuiltEntities, appB.prebuiltEntities)
185-
equal = equal && this.isArrayEqual(appA.regexEntities, appB.regexEntities)
186-
equal = equal && this.isArrayEqual(appA.regexFeatures, appB.regexFeatures)
179+
equal = equal && this.isArrayEqual(appA.regex_entities, appB.regexEntities)
180+
equal = equal && this.isArrayEqual(appA.regex_features, appB.regexFeatures)
187181
equal = equal && this.isArrayEqual(appA.utterances, appB.utterances)
188182

189183
// handle exception for none intent which is default added in luis portal
@@ -205,15 +199,14 @@ export class LuBuildCore {
205199
let yObj = []
206200

207201
if (x && x.length > 0) {
208-
xObj = JSON.parse(JSON.stringify(x))
202+
xObj = JSON.parse(JSON.stringify(x).toLowerCase().replace(/ {2}/g, ' '))
209203
}
210204

211205
if (y && y.length > 0) {
212-
yObj = JSON.parse(JSON.stringify(y))
206+
yObj = JSON.parse(JSON.stringify(y).toLowerCase().replace(/ {2}/g, ' '))
213207
}
214208

215209
if (xObj.length !== yObj.length) return false
216-
217210
if (differenceWith(xObj, yObj, isEqual).length > 0) return false
218211

219212
return true

0 commit comments

Comments
 (0)