Skip to content

Commit 667e334

Browse files
Merge pull request #9 from aws-github-ops/defaultAreaFeat
feat: user can set default labels and assignees to apply when no keywords are detected
2 parents a5f3caa + 30b2bc9 commit 667e334

File tree

5 files changed

+83
-51
lines changed

5 files changed

+83
-51
lines changed

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,16 @@ Parameters should take the form
3232
]
3333
```
3434

35-
### excluded expressions
35+
### default-area
36+
If no keywords are detected in your issue, set these default labels and assignees
37+
```
38+
{
39+
"labels": ["labels"],
40+
"assignees": ["assignees"]
41+
}
42+
```
43+
44+
### excluded-expressions
3645

3746
You can exclude certain expressions from being potentially counted as keywords. This is useful if you have issue templates which may contain keywords.
3847
The input should be an array with expressions to exclude separated by bars. Ex. `[ Expression 1 | Expression 2 ]`

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: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28076,6 +28076,12 @@ function run() {
2807628076
const winningAreaData = issue.getWinningAreaData(issue.determineArea());
2807728077
if (winningAreaData.area === '') {
2807828078
console.log("Keywords not included in this issue");
28079+
if (issue.defaultArea) {
28080+
if (issue.defaultArea.assignees)
28081+
github.setIssueAssignees(issue.defaultArea.assignees);
28082+
if (issue.defaultArea.labels)
28083+
github.setIssueLabels(issue.defaultArea.labels);
28084+
}
2807928085
}
2808028086
else {
2808128087
if (winningAreaData.assignees)
@@ -28143,6 +28149,7 @@ class Issue {
2814328149
this.bodyIssueWords = body.split(/ |\(|\)|\./);
2814428150
}
2814528151
this.parameters = JSON.parse(core.getInput("parameters", { required: true }));
28152+
this.defaultArea = JSON.parse(core.getInput("default-area", { required: false }));
2814628153
this.similarity = +core.getInput("similarity", { required: false });
2814728154
this.bodyValue = +core.getInput("body-value", { required: false });
2814828155
}
@@ -28167,31 +28174,11 @@ class Issue {
2816728174
potentialAreas = this.scoreArea(content, potentialAreas, this.bodyValue);
2816828175
});
2816928176
}
28170-
console.log("Area scores: ", ...potentialAreas);
28171-
let winningArea = '';
28172-
let winners = new Map();
28173-
for (let area of potentialAreas.entries()) {
28174-
if (winners.size === 0) {
28175-
winners.set(area[0], area[1]);
28176-
}
28177-
else if (area[1] > winners.values().next().value) {
28178-
winners = new Map();
28179-
winners.set(area[0], area[1]);
28180-
}
28181-
else if (area[1] === winners.values().next().value) {
28182-
winners.set(area[0], area[1]);
28183-
}
28184-
}
28185-
// tiebreaker goes to the area with more *exact* keyword matches
28186-
if (winners.size > 1 && this.similarity !== 0) {
28187-
this.similarity = 0;
28188-
winningArea = this.determineArea();
28189-
}
28190-
else if (winners.size > 0) {
28191-
winningArea = winners.keys().next().value;
28192-
}
28193-
winningArea = winners.keys().next().value;
28194-
console.log("Winning area: " + winningArea);
28177+
if (potentialAreas.size > 0)
28178+
console.log("Area scores: ", ...potentialAreas);
28179+
const winningArea = this.decideWinner(potentialAreas);
28180+
if (winningArea)
28181+
console.log("Winning area: " + winningArea);
2819528182
return winningArea;
2819628183
}
2819728184
getWinningAreaData(winningArea) {
@@ -28220,6 +28207,31 @@ class Issue {
2822028207
});
2822128208
return potentialAreas;
2822228209
}
28210+
decideWinner(potentialAreas) {
28211+
let winningArea = '';
28212+
let winners = new Map();
28213+
for (let area of potentialAreas.entries()) {
28214+
if (winners.size === 0) {
28215+
winners.set(area[0], area[1]);
28216+
}
28217+
else if (area[1] > winners.values().next().value) {
28218+
winners = new Map();
28219+
winners.set(area[0], area[1]);
28220+
}
28221+
else if (area[1] === winners.values().next().value) {
28222+
winners.set(area[0], area[1]);
28223+
}
28224+
}
28225+
// tiebreaker goes to the area with more *exact* keyword matches
28226+
if (winners.size > 1 && this.similarity !== 0) {
28227+
this.similarity = 0;
28228+
winningArea = this.determineArea();
28229+
}
28230+
else if (winners.size > 0) {
28231+
winningArea = winners.keys().next().value;
28232+
}
28233+
return winningArea;
28234+
}
2822328235
isSimilar(str1, str2) {
2822428236
return (((str1.length + str2.length) / 2) * this.similarity);
2822528237
}

src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ async function run() {
1414

1515
if (winningAreaData.area === '') {
1616
console.log("Keywords not included in this issue");
17+
if(issue.defaultArea) {
18+
if(issue.defaultArea.assignees) github.setIssueAssignees(issue.defaultArea.assignees);
19+
if(issue.defaultArea.labels) github.setIssueLabels(issue.defaultArea.labels);
20+
}
1721
} else {
1822
if(winningAreaData.assignees) github.setIssueAssignees(winningAreaData.assignees);
1923
if(winningAreaData.labels) github.setIssueLabels(winningAreaData.labels);

src/issue.ts

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export class Issue {
1515
private titleIssueWords?: string[];
1616
private bodyIssueWords?: string[];
1717
public parameters: IParameter[];
18+
public defaultArea?: IDefaultArea;
1819
private similarity: number;
1920
private bodyValue: number;
2021

@@ -35,6 +36,7 @@ export class Issue {
3536
this.bodyIssueWords = body.split(/ |\(|\)|\./);
3637
}
3738
this.parameters = JSON.parse(core.getInput("parameters", {required: true}));
39+
this.defaultArea = JSON.parse(core.getInput("default-area", {required: false}));
3840
this.similarity = +core.getInput("similarity", {required: false});
3941
this.bodyValue = +core.getInput("body-value", {required: false});
4042
}
@@ -62,33 +64,12 @@ export class Issue {
6264
this.bodyIssueWords.forEach(content => {
6365
potentialAreas = this.scoreArea(content, potentialAreas, this.bodyValue);
6466
});
65-
}
66-
67-
console.log("Area scores: ", ...potentialAreas);
67+
}
6868

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

91-
console.log("Winning area: " + winningArea);
71+
const winningArea = this.decideWinner(potentialAreas);
72+
if(winningArea) console.log("Winning area: " + winningArea);
9273

9374
return winningArea;
9475
}
@@ -123,6 +104,29 @@ export class Issue {
123104
return potentialAreas;
124105
}
125106

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+
126130
private isSimilar(str1: string, str2: string): number {
127131
return (((str1.length + str2.length) / 2) * this.similarity);
128132
}

0 commit comments

Comments
 (0)