Skip to content

Commit ac51230

Browse files
committed
update validate-tooling-data for eliminate case insensitive languages
1 parent 219521e commit ac51230

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

.github/workflows/validate-tooling-data.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,49 @@ jobs:
4747
const data = yaml.load(fs.readFileSync(dataPath, 'utf-8'));
4848
const ajv = new Ajv({ allErrors: true });
4949
addFormats(ajv);
50+
51+
ajv.addKeyword({
52+
keyword: 'caseInsensitiveUnique',
53+
type: 'array',
54+
validate: function (schema, data) {
55+
if (!Array.isArray(data)) return false;
56+
57+
const languagesSet = new Set();
58+
const languagesLowercaseSet = new Set();
59+
data.forEach((tool) => {
60+
if (tool.languages) {
61+
tool.languages.forEach((language) => {
62+
languagesSet.add(language);
63+
languagesLowercaseSet.add(language.toLowerCase());
64+
});
65+
}
66+
});
67+
if (languagesSet.size !== languagesLowercaseSet.size) {
68+
console.error('Duplicate languages found');
69+
const lowercaseMap = new Map();
70+
languagesSet.forEach((language) => {
71+
lowercaseMap.set(
72+
language.toLowerCase(),
73+
(lowercaseMap.get(language.toLowerCase()) || 0) + 1
74+
);
75+
});
76+
77+
lowercaseMap.forEach((value, key) => {
78+
if (value > 1) {
79+
console.log('Duplicate found for:', key);
80+
}
81+
});
82+
validate.errors = [{
83+
keyword: 'caseInsensitiveUnique',
84+
message: 'array contains case-insensitive duplicates',
85+
params: { keyword: 'caseInsensitiveUnique' }
86+
}];
87+
return false;
88+
}
89+
return true;
90+
}
91+
});
92+
5093
const validate = ajv.compile(schema);
5194
const valid = validate(data);
5295
if (!valid) {

data/tooling-data.schema.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
"languages": {
8989
"description": "The language or languages a tool is built in. In the case of a validator, this will likely be the language it is written in. In the case of a conversion or transformation tool, these are the languages that are supported in some capacity.",
9090
"type": "array",
91+
"caseInsensitiveUnique": true,
9192
"items": {
9293
"description": "Individual language name, from the list unless not included.",
9394
"type": "string",

0 commit comments

Comments
 (0)