Skip to content

Commit 86cb49c

Browse files
feat: add default area feature
1 parent 3df9fb5 commit 86cb49c

File tree

3 files changed

+60
-46
lines changed

3 files changed

+60
-46
lines changed

action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ inputs:
77
parameters:
88
description: "JSON array of keywords to look for and labels and assignees to be set when there's a keyword match"
99
required: true
10+
default-area:
11+
description: "Labels and assignees to apply when no keywords are detected"
12+
required: false
1013
excluded-expressions:
1114
description: "Words to exclude from search"
1215
required: true

lib/index.js

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28137,6 +28137,7 @@ class Issue {
2813728137
this.bodyIssueWords = body.split(/ |\(|\)|\./);
2813828138
}
2813928139
this.parameters = JSON.parse(core.getInput("parameters", { required: true }));
28140+
this.defaultArea = JSON.parse(core.getInput("default-area", { required: true }));
2814028141
this.similarity = +core.getInput("similarity", { required: false });
2814128142
this.bodyValue = +core.getInput("body-value", { required: false });
2814228143
}
@@ -28162,29 +28163,7 @@ class Issue {
2816228163
});
2816328164
}
2816428165
console.log("Area scores: ", ...potentialAreas);
28165-
let winningArea = '';
28166-
let winners = new Map();
28167-
for (let area of potentialAreas.entries()) {
28168-
if (winners.size === 0) {
28169-
winners.set(area[0], area[1]);
28170-
}
28171-
else if (area[1] > winners.values().next().value) {
28172-
winners = new Map();
28173-
winners.set(area[0], area[1]);
28174-
}
28175-
else if (area[1] === winners.values().next().value) {
28176-
winners.set(area[0], area[1]);
28177-
}
28178-
}
28179-
// tiebreaker goes to the area with more *exact* keyword matches
28180-
if (winners.size > 1 && this.similarity !== 0) {
28181-
this.similarity = 0;
28182-
winningArea = this.determineArea();
28183-
}
28184-
else if (winners.size > 0) {
28185-
winningArea = winners.keys().next().value;
28186-
}
28187-
winningArea = winners.keys().next().value;
28166+
const winningArea = this.decideWinner(potentialAreas);
2818828167
console.log("Winning area: " + winningArea);
2818928168
return winningArea;
2819028169
}
@@ -28214,6 +28193,31 @@ class Issue {
2821428193
});
2821528194
return potentialAreas;
2821628195
}
28196+
decideWinner(potentialAreas) {
28197+
let winningArea = '';
28198+
let winners = new Map();
28199+
for (let area of potentialAreas.entries()) {
28200+
if (winners.size === 0) {
28201+
winners.set(area[0], area[1]);
28202+
}
28203+
else if (area[1] > winners.values().next().value) {
28204+
winners = new Map();
28205+
winners.set(area[0], area[1]);
28206+
}
28207+
else if (area[1] === winners.values().next().value) {
28208+
winners.set(area[0], area[1]);
28209+
}
28210+
}
28211+
// tiebreaker goes to the area with more *exact* keyword matches
28212+
if (winners.size > 1 && this.similarity !== 0) {
28213+
this.similarity = 0;
28214+
winningArea = this.determineArea();
28215+
}
28216+
else if (winners.size > 0) {
28217+
winningArea = winners.keys().next().value;
28218+
}
28219+
return winningArea;
28220+
}
2821728221
isSimilar(str1, str2) {
2821828222
return (((str1.length + str2.length) / 2) * this.similarity);
2821928223
}

src/issue.ts

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import * as core from "@actions/core";
22
import levenshtein from 'js-levenshtein';
33

4-
export interface IParameter {
4+
export interface IParameter extends IDefaultArea {
55
area: string;
66
keywords: string[];
7+
}
8+
9+
export interface IDefaultArea {
710
labels: string[];
811
assignees: string[];
912
}
@@ -12,6 +15,7 @@ export class Issue {
1215
private titleIssueWords?: string[];
1316
private bodyIssueWords?: string[];
1417
public parameters: IParameter[];
18+
public defaultArea: IDefaultArea;
1519
private similarity: number;
1620
private bodyValue: number;
1721

@@ -32,6 +36,7 @@ export class Issue {
3236
this.bodyIssueWords = body.split(/ |\(|\)|\./);
3337
}
3438
this.parameters = JSON.parse(core.getInput("parameters", {required: true}));
39+
this.defaultArea = JSON.parse(core.getInput("default-area", {required: true}));
3540
this.similarity = +core.getInput("similarity", {required: false});
3641
this.bodyValue = +core.getInput("body-value", {required: false});
3742
}
@@ -63,28 +68,7 @@ export class Issue {
6368

6469
console.log("Area scores: ", ...potentialAreas);
6570

66-
let winningArea = '';
67-
let winners: Map<string,number> = new Map();
68-
for (let area of potentialAreas.entries()) {
69-
if(winners.size === 0) {
70-
winners.set(area[0], area[1]);
71-
} else if (area[1] > winners.values().next().value) {
72-
winners = new Map();
73-
winners.set(area[0], area[1]);
74-
} else if (area[1] === winners.values().next().value) {
75-
winners.set(area[0], area[1]);
76-
}
77-
}
78-
// tiebreaker goes to the area with more *exact* keyword matches
79-
if(winners.size > 1 && this.similarity !== 0) {
80-
this.similarity = 0;
81-
winningArea = this.determineArea();
82-
} else if (winners.size > 0) {
83-
winningArea = winners.keys().next().value;
84-
}
85-
86-
winningArea = winners.keys().next().value;
87-
71+
const winningArea = this.decideWinner(potentialAreas);
8872
console.log("Winning area: " + winningArea);
8973

9074
return winningArea;
@@ -120,6 +104,29 @@ export class Issue {
120104
return potentialAreas;
121105
}
122106

107+
private decideWinner(potentialAreas: Map<string, number>): string {
108+
let winningArea = '';
109+
let winners: Map<string,number> = new Map();
110+
for (let area of potentialAreas.entries()) {
111+
if(winners.size === 0) {
112+
winners.set(area[0], area[1]);
113+
} else if (area[1] > winners.values().next().value) {
114+
winners = new Map();
115+
winners.set(area[0], area[1]);
116+
} else if (area[1] === winners.values().next().value) {
117+
winners.set(area[0], area[1]);
118+
}
119+
}
120+
// tiebreaker goes to the area with more *exact* keyword matches
121+
if(winners.size > 1 && this.similarity !== 0) {
122+
this.similarity = 0;
123+
winningArea = this.determineArea();
124+
} else if (winners.size > 0) {
125+
winningArea = winners.keys().next().value;
126+
}
127+
return winningArea;
128+
}
129+
123130
private isSimilar(str1: string, str2: string): number {
124131
return (((str1.length + str2.length) / 2) * this.similarity);
125132
}

0 commit comments

Comments
 (0)