Skip to content

Commit 4bf1d6c

Browse files
authored
Merge pull request #126 from ropensci-review-tools/json-models
add chaoss-models.json for #124 in extdata
2 parents 1b56981 + 5ba2a15 commit 4bf1d6c

File tree

7 files changed

+148
-64
lines changed

7 files changed

+148
-64
lines changed

DESCRIPTION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: repometrics
22
Title: Metrics for Your Code Repository
3-
Version: 0.1.6.088
3+
Version: 0.1.6.095
44
Authors@R:
55
person("Mark", "Padgham", , "mark.padgham@email.com", role = c("aut", "cre"),
66
comment = c(ORCID = "0000-0003-2172-5265"))

R/cm-metrics-issue-response.R

+5-3
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ cm_data_issue_response_time <- function (path, end_date = Sys.Date ()) {
2929
created_at >= start_date & response_date <= end_date
3030
)
3131

32-
return (issue_responses$response_time)
32+
return (issue_responses)
3333
}
3434

3535
cm_metric_issue_response_time <- function (path, end_date = Sys.Date ()) {
36-
cm_data_issue_response_time (path, end_date)
36+
issue_responses <- cm_data_issue_response_time (path, end_date)
37+
res <- mean (as.integer (issue_responses$response_time), na.rm = TRUE)
3738
}
3839

3940
cm_data_defect_resolution_dur <- function (path, end_date = Sys.Date ()) { # nolint
@@ -65,7 +66,8 @@ cm_data_defect_resolution_dur <- function (path, end_date = Sys.Date ()) { # nol
6566
}
6667

6768
cm_metric_defect_resolution_dur <- function (path, end_date = Sys.Date ()) {
68-
cm_data_defect_resolution_dur (path, end_date)
69+
dat <- cm_data_defect_resolution_dur (path, end_date)
70+
dat [["mean"]]
6971
}
7072

7173
#' CHAOSS metric "Time to Close"

R/cm-metrics-pr-reviews.R

+15-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,10 @@ cm_data_pr_review_duration <- function (path, end_date = Sys.Date ()) {
134134
}
135135

136136
cm_metric_pr_review_duration <- function (path, end_date = Sys.Date ()) {
137-
cm_data_pr_review_duration (path, end_date)
137+
dat <- cm_data_pr_review_duration (path, end_date)
138+
# That has "cycle_dur_mn" and overall "review_dur_mn"; take mean of both:
139+
res <- mn_med_sum (dat [grep ("\\_mn$", names (dat))])
140+
return (res [["mean"]])
138141
}
139142

140143
cm_data_pr_cmt_count <- function (path, end_date = Sys.Date ()) {
@@ -249,3 +252,14 @@ cm_data_pr_reviews_approved <- function (path, end_date = Sys.Date ()) {
249252
cm_metric_pr_reviews_approved <- function (path, end_date = Sys.Date ()) {
250253
cm_data_pr_reviews_approved (path, end_date)
251254
}
255+
256+
cm_metric_num_prs_merged <- function (path, end_date = Sys.Date ()) {
257+
pr_dat <- cm_metric_change_req (path, end_date)
258+
num_prs_merged <- ifelse (
259+
length (pr_dat) > 1,
260+
as.integer (pr_dat [["n_closed"]]),
261+
0L
262+
)
263+
264+
return (num_prs_merged)
265+
}

R/cm-models.R

+10-42
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,20 @@ cm_model_dev_responsiveness <- function (path,
2525
metrics_data = NULL) {
2626

2727
if (is.null (metrics_data)) {
28-
pr_durs <- cm_metric_pr_review_duration (path, end_date = end_date)
28+
pr_dur_mn <- cm_metric_pr_review_duration (path, end_date = end_date)
2929
issue_resp_time <-
3030
cm_metric_issue_response_time (path, end_date = end_date)
3131
defect_resol_dur <-
3232
cm_metric_defect_resolution_dur (path, end_date = end_date)
3333
} else {
34-
pr_durs <- metrics_data$pr_review_duration
34+
pr_dur_mn <- metrics_data$pr_review_duration
3535
issue_resp_time <- metrics_data$issue_response_time
3636
defect_resol_dur <- metrics_data$defect_resolution_dur
3737
}
3838

39-
issue_resp_time <- mn_med_sum (as.integer (issue_resp_time))
40-
names (issue_resp_time) <- paste0 ("issue_resp_", names (issue_resp_time))
41-
names (defect_resol_dur) <-
42-
paste0 ("defect_resol_", names (defect_resol_dur))
43-
44-
nms <- list (c ("mn", "mean"), c ("md", "median"))
45-
vals <- lapply (nms, function (nm) {
46-
index_i <- grep (nm [2], names (issue_resp_time), value = TRUE)
47-
index_d <- grep (nm [2], names (defect_resol_dur), value = TRUE)
48-
vals_i <- c (
49-
pr_durs [grep (nm [1], names (pr_durs), value = TRUE)],
50-
issue_resp_time [index_i],
51-
defect_resol_dur [index_d]
52-
)
53-
return (vals_i [which (!is.na (vals_i))])
54-
})
55-
vals <- c (mean = mean (vals [[1]]), median = stats::median (vals [[2]]))
56-
names (vals) <- c ("mean", "median")
57-
vals [which (is.na (vals))] <- NA_real_
58-
59-
# But only return mean value, to align with all others
60-
# And convert final value to scale so that higher is better by
61-
val <- 2 - log10 (vals [["mean"]])
39+
vals <- c (pr_dur_mn, issue_resp_time, defect_resol_dur)
40+
# convert final value to scale so that higher is better by
41+
val <- 2 - log10 (mean (vals, na.rm = TRUE))
6242
val <- ifelse (is.na (val), 0, val)
6343
return (val)
6444
}
@@ -89,7 +69,7 @@ cm_model_proj_engagement <- function (path,
8969

9070
if (is.null (metrics_data)) {
9171

92-
pr_dat <- cm_metric_change_req (path, end_date = end_date)
72+
num_prs_merged <- cm_metric_num_prs_merged (path, end_date = end_date)
9373
counts <- cm_metric_committer_count (path, end_date = end_date)
9474
# has number of unique commiters for (watchers or forks, issues, prs)
9575

@@ -108,20 +88,14 @@ cm_model_proj_engagement <- function (path,
10888
# cm_metric_pr_review_duration (path, end_date = end_date)
10989
} else {
11090

111-
pr_dat <- metrics_data$pr_dat
91+
num_prs_merged <- metrics_data$num_prs_merged
11292
counts <- metrics_data$committer_count
11393
num_code_ctbs <- metrics_data$ctb_count
11494
num_issues_closed <- metrics_data$issues_closed
11595
num_issues_updated <- metrics_data$issue_updates
11696
num_issue_comments <- metrics_data$issue_cmt_count
11797
}
11898

119-
num_prs_merged <- ifelse (
120-
length (pr_dat) > 1,
121-
pr_dat [["n_closed"]],
122-
0L
123-
)
124-
12599
res <- c (
126100
num_prs_merged, counts, num_code_ctbs,
127101
num_issues_closed, num_issues_updated, num_issue_comments
@@ -269,7 +243,6 @@ cm_model_oss_compliance <- function (path,
269243

270244
bp_badge <- as.integer (bp_badge)
271245
lic_declared <- as.integer (length (lic_declared) > 0L)
272-
defect_res_dur <- defect_res_dur [["mean"]]
273246
defect_res_dur <- ifelse (defect_res_dur > 0, log10 (defect_res_dur), 0)
274247
libyears <- libyears [["mean"]]
275248

@@ -573,7 +546,7 @@ cm_model_comm_serv_support <- function (path,
573546
cm_metric_defect_resolution_dur (path, end_date = end_date)
574547

575548
pr_age <- cm_metric_pr_age (path, end_date = end_date)
576-
pr_dur <- cm_metric_pr_review_duration (path, end_date = end_date)
549+
pr_dur_mn <- cm_metric_pr_review_duration (path, end_date = end_date)
577550

578551
# Metrics measured in N > 1, for which higher is better:
579552
issue_num_cmts <- cm_metric_issue_comments (path, end_date = end_date)
@@ -586,23 +559,20 @@ cm_model_comm_serv_support <- function (path,
586559
issue_age <- metrics_data$issue_age
587560
issue_res_duration <- metrics_data$defect_resolution_dur
588561
pr_age <- metrics_data$pr_age
589-
pr_dur <- metrics_data$pr_review_duration
562+
pr_dur_mn <- metrics_data$pr_review_duration
590563
issue_num_cmts <- metrics_data$issue_comments
591564
issues_active <- metrics_data$issues_active
592565
pr_num_revs <- metrics_data$pr_reviews
593566

594567
}
595568

596-
issue_resp_time <- as.numeric (mean (issue_resp_time))
597569
issue_age <- issue_age [["mean"]]
598-
issue_res_duration <- issue_res_duration [["mean"]]
599570
pr_age <- pr_age [["mean"]]
600-
pr_dur <- pr_dur [["review_dur_mn"]]
601571

602572
pr_num_revs_approved <- pr_num_revs [["approved_count"]]
603573
pr_num_revs_rejected <- pr_num_revs [["rejected_count"]]
604574

605-
res_N_days <- c (issue_resp_time, issue_age, issue_res_duration, pr_age, pr_dur)
575+
res_N_days <- c (issue_resp_time, issue_age, issue_res_duration, pr_age, pr_dur_mn)
606576
res_ON <-
607577
c (issue_num_cmts, issues_active, pr_num_revs_approved, pr_num_revs_rejected)
608578
res_log10 <- vapply (list (res_N_days, res_ON), function (i) {
@@ -649,7 +619,6 @@ cm_model_starter_health <- function (path,
649619

650620
}
651621

652-
time_first_resp <- mn_med_sum (time_first_resp) [["mean"]]
653622
time_first_resp <- ifelse (time_first_resp == 0, 1, time_first_resp)
654623

655624
pr_closure_ratio <- NA_real_
@@ -719,7 +688,6 @@ cm_model_comm_welcoming <- function (path,
719688

720689
issue_age <- issue_age [["mean"]] # [0, N >> 1]
721690
issue_age <- ifelse (issue_age == 0, 1, issue_age)
722-
time_first_resp <- mn_med_sum (time_first_resp) [["mean"]]
723691
time_first_resp <- ifelse (time_first_resp == 0, 1, time_first_resp)
724692

725693
val_days <- log10 (c (issue_age, time_first_resp))

codemeta.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"codeRepository": "https://github.com/ropensci-review-tools/repometrics",
99
"issueTracker": "https://github.com/ropensci-review-tools/repometrics/issues",
1010
"license": "https://spdx.org/licenses/GPL-3.0",
11-
"version": "0.1.6.088",
11+
"version": "0.1.6.095",
1212
"programmingLanguage": {
1313
"@type": "ComputerLanguage",
1414
"name": "R",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
{
2+
"models": {
3+
"dev_reponsiveness": [
4+
"pr_review_duration",
5+
"issue_response_time",
6+
"defect_resolution_dur"
7+
],
8+
"proj_engagement": [
9+
"num_prs_merged",
10+
"committer_count",
11+
"ctb_count",
12+
"issues_closed",
13+
"issue_updates",
14+
"issue_cmt_count"
15+
],
16+
"proj_awareness": [
17+
"num_forks",
18+
"popularity"
19+
],
20+
"community_activity": [
21+
"ctb_count",
22+
"pr_reviews",
23+
"recent_releases",
24+
"issue_updates",
25+
"maintainer_count",
26+
"commit_freq",
27+
"issue_cmt_count"
28+
],
29+
"oss_compliance": [
30+
"best_practices",
31+
"license_coverage",
32+
"licenses_declared",
33+
"defect_resolution_dur",
34+
"libyears",
35+
"dependency_count"
36+
],
37+
"viability_community": [
38+
"committer_count",
39+
"change_req",
40+
"maintainer_count",
41+
"libyears"
42+
],
43+
"viability_starter": [
44+
"contrib_absence",
45+
"elephant_factor",
46+
"licenses_declared",
47+
"change_req",
48+
"libyears"
49+
],
50+
"viability_gov": [
51+
"label_inclusivity",
52+
"change_req",
53+
"popularity",
54+
"time_to_close",
55+
"libyears",
56+
"issue_age",
57+
"release_freq"
58+
],
59+
"viability_strategy": [
60+
"languages",
61+
"contrib_absence",
62+
"elephant_factor",
63+
"release_freq"
64+
],
65+
"collab_devel_index": [
66+
"has_ci",
67+
"change_req",
68+
"issues_to_prs",
69+
"num_contributors",
70+
"pr_reviews",
71+
"num_forks",
72+
"num_commits",
73+
"code_change_lines"
74+
],
75+
"comm_serv_support": [
76+
"issue_response_time",
77+
"issue_age",
78+
"defect_resolution_dur",
79+
"pr_age",
80+
"pr_review_duration",
81+
"issue_comments",
82+
"issues_active",
83+
"pr_reviews"
84+
],
85+
"starter_health": [
86+
"issue_response_time",
87+
"change_req",
88+
"contrib_absence",
89+
"release_freq"
90+
],
91+
"comm_welcoming": [
92+
"issue_age",
93+
"issue_response_time",
94+
"license_coverage",
95+
"licenses_declared",
96+
"test_coverage",
97+
"best_practices",
98+
"change_req",
99+
"contrib_absence",
100+
"elephant_factor",
101+
"ctb_count"
102+
]
103+
}
104+
}

tests/testthat/test-cm-metrics.R

+12-16
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,12 @@ test_that ("cm metric review duration", { # R/cm-metrics-pr-reviews.R
217217
Sys.setenv ("REPOMETRICS_TESTS" = "true")
218218
dat <- mock_rm_data ()
219219
path <- generate_test_pkg ()
220-
revs <- cm_metric_pr_review_duration (path, end_date = end_date)
220+
rev_dur_mn <- cm_metric_pr_review_duration (path, end_date = end_date)
221221
fs::dir_delete (path)
222222

223-
expect_type (revs, "double")
224-
expect_length (revs, 4L)
225-
expect_named (
226-
revs,
227-
c ("cycle_dur_mn", "cycle_dur_md", "review_dur_mn", "review_dur_md")
228-
)
223+
expect_type (rev_dur_mn, "double")
224+
expect_length (rev_dur_mn, 1L)
225+
expect_named (rev_dur_mn, NULL)
229226
})
230227

231228
test_that ("cm metric issue numbers, durations, response times", {
@@ -242,7 +239,6 @@ test_that ("cm metric issue numbers, durations, response times", {
242239

243240
# Vector of response durations:
244241
expect_type (dur_issues, "double")
245-
expect_s3_class (dur_issues, "difftime")
246242
expect_true (length (dur_issues) >= 0L)
247243

248244
# Overall summary statistic on repsonse times from both issues and PRs:
@@ -271,8 +267,8 @@ test_that ("cm metric defect resolution duration", {
271267
fs::dir_delete (path)
272268

273269
expect_type (res, "double")
274-
expect_length (res, 2L)
275-
expect_named (res, c ("mean", "median"))
270+
expect_length (res, 1L)
271+
expect_named (res, NULL)
276272
})
277273

278274
test_that ("cm metric label inclusivity", { # R/cm-metric-labels.R
@@ -588,17 +584,17 @@ test_that ("cm metric collate all", {
588584
fs::dir_delete (path)
589585

590586
expect_type (metrics_data, "list")
591-
expect_length (metrics_data, 44L)
587+
expect_length (metrics_data, 45L)
592588
metric_fns <- get_cm_fns ("metric")
593589
expect_identical (names (metrics_data), gsub ("^cm\\_metric\\_", "", metric_fns))
594590

595591
lens <- vapply (metrics_data, length, integer (1L), USE.NAMES = FALSE)
596-
lens_expected <- c (
592+
lens_expected <- as.integer (c (
597593
1, 1, 1, 1, 4, 3, 3, 1, 4, 1,
598-
2, 1, 3, 1, 3, 4, 1, 0, 1, 1,
594+
1, 1, 3, 1, 3, 4, 1, 1, 1, 1,
599595
1, 1, 3, 5, 4, 1, 1, 2, 1, 1,
600-
2, 4, 4, 1, 4, 0, 4, 14, 1, 1,
601-
2, 4, 3, 4
602-
)
596+
2, 1, 4, 4, 1, 4, 0, 1, 14, 1,
597+
1, 2, 4, 3, 4
598+
))
603599
expect_equal (lens, lens_expected)
604600
})

0 commit comments

Comments
 (0)