Skip to content

Commit 6247c15

Browse files
salujajaskeeratJaskeerat Singh Saluja
and
Jaskeerat Singh Saluja
authored
feat(import-alias):patch change for aliased imported types (#894)
* feat(import-alias):patch change for aliased imported types Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> * feat(alias-import): Test cases added Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> * feat(import-alias):Test cases fixed Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> * feat(import-alias): Changelog updated Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> * feat(alias-import): ENV IMPORT_ALIASING added Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> * feat(alias-import): PR suggestions Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> * feat(alias-import): Pr suggestions Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> --------- Signed-off-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local> Co-authored-by: Jaskeerat Singh Saluja <salujajaskeerat@Jaskeerats-MacBook-Pro.local>
1 parent 41cd639 commit 6247c15

File tree

11 files changed

+53
-12
lines changed

11 files changed

+53
-12
lines changed

packages/concerto-analysis/src/compare-config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export const defaultCompareConfig: CompareConfig = {
5757
'enum-value-added': CompareResult.PATCH,
5858
'enum-value-removed': CompareResult.MAJOR,
5959
'property-type-changed': CompareResult.MAJOR,
60+
'property-type-aliased':CompareResult.PATCH,
6061
'property-validator-added': CompareResult.MAJOR,
6162
'property-validator-removed': CompareResult.PATCH,
6263
'property-validator-changed': CompareResult.MAJOR,

packages/concerto-analysis/src/comparers/properties.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,16 +173,24 @@ const propertyTypeChanged: ComparerFactory = (context) => ({
173173
// return;
174174
// }
175175
const versionDiff = semver.diff(aTypeVersion, bTypeVersion);
176-
if (!versionDiff) {
177-
return;
178-
} else if (versionDiff === 'major' || versionDiff === 'premajor') {
176+
if (versionDiff === 'major' || versionDiff === 'premajor') {
179177
context.report({
180178
key: 'property-type-changed',
181179
message: `The ${aType} "${a.getName()}" in the ${classDeclarationType} "${a.getParent().getName()}" changed type from "${aFQTN}" to "${bFQTN}" (type version incompatible)`,
182180
element: a
183181
});
184182
return;
185183
}
184+
// Up to this point, 'a' and 'b' have identical fully qualified type names with matching major and premajor versions.
185+
// Next, we verify whether their types differ locally, which would indicate aliasing.
186+
if (!versionDiff && (a.getType() !== b.getType())) {
187+
context.report({
188+
key: 'property-type-aliased',
189+
message: `The local type name for "${a.getName()}" in the ${classDeclarationType} "${a.getParent().getName()}" is changed from ${a.getType()} to ${b.getType()}`,
190+
element: a
191+
});
192+
return;
193+
}
186194
},
187195
});
188196

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace org.accordproject.concerto.test@1.2.3
2+
3+
import org.accordproject.concerto.test.other@2.3.4.{ Bar }
4+
5+
concept Thing {
6+
o Bar bar
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace org.accordproject.concerto.test@1.2.3
2+
3+
import org.accordproject.concerto.test.other@2.3.4.{ Bar as b }
4+
5+
concept Thing {
6+
o b bar
7+
}

packages/concerto-analysis/test/unit/compare-config.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ describe('CompareConfigBuilder', () => {
1616
const actual = builder.default().build();
1717

1818
expect(actual.comparerFactories.length).toEqual(11);
19-
expect(Object.keys(actual.rules).length).toEqual(20);
19+
expect(Object.keys(actual.rules).length).toEqual(21);
2020
expect(actual.rules['class-declaration-added']).toEqual(CompareResult.MINOR);
2121
expect(actual.rules['optional-property-added']).toEqual(CompareResult.PATCH);
2222
expect(actual.rules['map-value-type-changed']).toEqual(CompareResult.MAJOR);
@@ -37,7 +37,7 @@ describe('CompareConfigBuilder', () => {
3737
const actual = builder.default().extend(toExtend).build();
3838

3939
expect(actual.comparerFactories.length).toEqual(12);
40-
expect(Object.keys(actual.rules).length).toEqual(21);
40+
expect(Object.keys(actual.rules).length).toEqual(22);
4141
expect(actual.rules['a-new-rule']).toEqual(CompareResult.MAJOR);
4242
});
4343

@@ -47,7 +47,7 @@ describe('CompareConfigBuilder', () => {
4747
const actual = builder.default().addComparerFactory(() => ({})).build();
4848

4949
expect(actual.comparerFactories.length).toEqual(12);
50-
expect(Object.keys(actual.rules).length).toEqual(20);
50+
expect(Object.keys(actual.rules).length).toEqual(21);
5151
});
5252

5353
it('Should add a new rule', () => {
@@ -56,7 +56,7 @@ describe('CompareConfigBuilder', () => {
5656
const actual = builder.default().addRule('a-new-rule', CompareResult.MAJOR).build();
5757

5858
expect(actual.comparerFactories.length).toEqual(11);
59-
expect(Object.keys(actual.rules).length).toEqual(21);
59+
expect(Object.keys(actual.rules).length).toEqual(22);
6060
expect(actual.rules['a-new-rule']).toEqual(CompareResult.MAJOR);
6161
});
6262

@@ -66,7 +66,7 @@ describe('CompareConfigBuilder', () => {
6666
const actual = builder.default().removeRule('optional-property-added').build();
6767

6868
expect(actual.comparerFactories.length).toEqual(11);
69-
expect(Object.keys(actual.rules).length).toEqual(19);
69+
expect(Object.keys(actual.rules).length).toEqual(20);
7070
expect(actual.rules['optional-property-added']).toBeFalsy();
7171
});
7272

packages/concerto-analysis/test/unit/compare.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ async function getModelFile(modelManager: ModelManager, fileName: string) {
1515
async function getModelFiles(
1616
aFileName: string,
1717
bFileName: string,
18+
importAliasing = false
1819
): Promise<[a: ModelFile, b: ModelFile]> {
19-
const modelManager = new ModelManager({ strict: true });
20+
const modelManager = new ModelManager({ strict: true, importAliasing: importAliasing });
2021
const a = await getModelFile(modelManager, aFileName);
2122
const b = await getModelFile(modelManager, bFileName);
2223
return [a, b];
@@ -255,6 +256,18 @@ test('should detect an array changing to a property', async () => {
255256
expect(results.result).toBe(CompareResult.MAJOR);
256257
});
257258

259+
test('should detect a field local type name change', async () => {
260+
const [a, b] = await getModelFiles('field-local-type-change-a.cto', 'field-local-type-change-b.cto',true);
261+
const results = new Compare().compare(a, b);
262+
expect(results.findings).toEqual(expect.arrayContaining([
263+
expect.objectContaining({
264+
key: 'property-type-aliased',
265+
message: 'The local type name for "bar" in the concept "Thing" is changed from Bar to b'
266+
})
267+
]));
268+
expect(results.result).toBe(CompareResult.PATCH);
269+
});
270+
258271
test('should detect a map key type changing from x to y', async () => {
259272
process.env.ENABLE_MAP_TYPE = 'true'; // TODO Remove on release of MapType
260273
const [a, b] = await getModelFiles('map-added.cto', 'map-changed-key.cto');

packages/concerto-core/api.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ class ModelLoader {
334334
+ ModelManager[] loadModelManagerFromModelFiles(object[],string[],object,boolean?,boolean?,number?)
335335
}
336336
class ModelManager extends BaseModelManager {
337-
+ void constructor(object?,boolean?,Object?,boolean?)
337+
+ void constructor(object?,boolean?,Object?,boolean?,boolean?)
338338
+ ModelFile addCTOModel(string,string?,boolean?) throws IllegalModelException
339339
}
340340
+ object getRootModel()

packages/concerto-core/changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
# Note that the latest public API is documented using JSDocs and is available in api.txt.
2525
#
2626

27+
Version 3.17.5 {9bd69f9522c14a99a085f077e12ac4b2} 2024-08-29
28+
- importAliasing added to ModelManager parameters
29+
2730
Version 3.17.4 {8cb49c7092c48b568da3b0a3eeab2777} 2024-08-01
2831
- Added api getImportedType() in modeFile
2932

packages/concerto-core/lib/basemodelmanager.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ class BaseModelManager {
9898
// TODO Remove on release of MapType
9999
// Supports both env var and property based flag
100100
this.enableMapType = !!options?.enableMapType;
101-
this.importAliasing = !!options?.importAliasing;
102-
101+
this.importAliasing = process?.env?.IMPORT_ALIASING === 'true' || !!options?.importAliasing;
103102
// Cache a copy of the Metamodel ModelFile for use when validating the structure of ModelFiles later.
104103
this.metamodelModelFile = new ModelFile(this, MetaModelUtil.metaModelAst, undefined, MetaModelNamespace);
105104

packages/concerto-core/lib/modelmanager.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ModelManager extends BaseModelManager {
6060
* @param {boolean} [options.strict] - require versioned namespaces and imports
6161
* @param {Object} [options.regExp] - An alternative regular expression engine.
6262
* @param {boolean} [options.enableMapType] - When true, the Concerto Map Type feature is enabled
63+
* @param {boolean} [options.importAliasing] - When true, the Concerto Map Type feature is enabled
6364
*/
6465
constructor(options) {
6566
super(options, ctoProcessFile(options));

packages/concerto-core/types/lib/modelmanager.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ declare class ModelManager extends BaseModelManager {
2020
* @param {boolean} [options.strict] - require versioned namespaces and imports
2121
* @param {Object} [options.regExp] - An alternative regular expression engine.
2222
* @param {boolean} [options.enableMapType] - When true, the Concerto Map Type feature is enabled
23+
* @param {boolean} [options.importAliasing] - When true, the Concerto Map Type feature is enabled
2324
*/
2425
constructor(options?: {
2526
strict?: boolean;
2627
regExp?: any;
2728
enableMapType?: boolean;
29+
importAliasing?: boolean;
2830
});
2931
/**
3032
* Adds a model in CTO format to the ModelManager.

0 commit comments

Comments
 (0)