Skip to content

Commit 677dd89

Browse files
authored
Update activity score calculation algorithm (#341)
* update score calculation algorithm * replace `watchers_count` by `subscribers_count` * fix slice number * simplify check * repo JSON access standardization
1 parent 1dde3e9 commit 677dd89

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

patterns/2-structured/repository-activity-score.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,23 @@ function calculateScore(repo) {
5858
// initial score is 50 to give active repos with low GitHub KPIs (forks, watchers, stars) a better starting point
5959
let iScore = 50;
6060
// weighting: forks and watches count most, then stars, add some little score for open issues, too
61-
iScore += repo["forks_count"] * 5 + repo["watchers_count"] + repo["stargazers_count"] / 3 + repo["open_issues_count"] / 5;
62-
let iDaysSinceLastUpdate = (new Date().getTime() - new Date(repo.updated_at).getTime()) / 1000 / 86400;
61+
iScore += repo.forks_count * 5;
62+
iScore += (repo.subscribers_count ? repo.subscribers_count : 0);
63+
iScore += repo.stargazers_count / 3;
64+
iScore += repo.open_issues_count / 5;
65+
6366
// updated in last 3 months: adds a bonus multiplier between 0..1 to overall score (1 = updated today, 0 = updated more than 100 days ago)
64-
iScore = iScore * (1 + (100 - Math.min(iDaysSinceLastUpdate, 100)) / 100);
67+
let iDaysSinceLastUpdate = (new Date().getTime() - new Date(repo.updated_at).getTime()) / 1000 / 86400;
68+
iScore = iScore * ((1 + (100 - Math.min(iDaysSinceLastUpdate, 100))) / 100);
69+
6570
// evaluate participation stats for the previous 3 months
6671
repo._InnerSourceMetadata = repo._InnerSourceMetadata || {};
6772
if (repo._InnerSourceMetadata.participation) {
6873
// average commits: adds a bonus multiplier between 0..1 to overall score (1 = >10 commits per week, 0 = less than 3 commits per week)
69-
let iAverageCommitsPerWeek = repo._InnerSourceMetadata.participation.slice(repo._InnerSourceMetadata.participation - 13).reduce((a, b) => a + b) / 13;
70-
iScore = iScore * (1 + (Math.min(Math.max(iAverageCommitsPerWeek - 3, 0), 7)) / 7);
74+
let iAverageCommitsPerWeek = repo._InnerSourceMetadata.participation.slice(repo._InnerSourceMetadata.participation.length - 13).reduce((a, b) => a + b) / 13;
75+
iScore = iScore * ((1 + (Math.min(Math.max(iAverageCommitsPerWeek - 3, 0), 7))) / 7);
7176
}
77+
7278
// boost calculation:
7379
// all repositories updated in the previous year will receive a boost of maximum 1000 declining by days since last update
7480
let iBoost = (1000 - Math.min(iDaysSinceLastUpdate, 365) * 2.74);
@@ -78,9 +84,9 @@ function calculateScore(repo) {
7884
// add boost to score
7985
iScore += iBoost;
8086
// give projects with a meaningful description a static boost of 50
81-
iScore += (repo["_InnerSourceMetadata"]["description"].length > 30 || repo["_InnerSourceMetadata"] && repo["_InnerSourceMetadata"]["motivation"].length > 30 ? 50 : 0);
87+
iScore += (repo.description?.length > 30 || repo._InnerSourceMetadata.motivation?.length > 30 ? 50 : 0);
8288
// give projects with contribution guidelines (CONTRIBUTING.md) file a static boost of 100
83-
iScore += (repo["_InnerSourceMetadata"] && repo["_InnerSourceMetadata"]["guidelines"] ? 100 : 0);
89+
iScore += (repo._InnerSourceMetadata.guidelines ? 100 : 0);
8490
// build in a logarithmic scale for very active projects (open ended but stabilizing around 5000)
8591
if (iScore > 3000) {
8692
iScore = 3000 + Math.log(iScore) * 100;
@@ -89,6 +95,7 @@ function calculateScore(repo) {
8995
iScore = Math.round(iScore - 50);
9096
// add score to metadata on the fly
9197
repo._InnerSourceMetadata.score = iScore;
98+
9299
return iScore;
93100
}
94101
```

0 commit comments

Comments
 (0)