From 9fa98870697bf4b413311c61bce3444be301b3bd Mon Sep 17 00:00:00 2001 From: Joe Zhu Date: Fri, 11 Sep 2026 13:37:08 +0800 Subject: [PATCH 1/3] update, and adding test code --- R/generic_metric_coerce.R | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/R/generic_metric_coerce.R b/R/generic_metric_coerce.R index eb5317e..3df6751 100644 --- a/R/generic_metric_coerce.R +++ b/R/generic_metric_coerce.R @@ -41,3 +41,36 @@ method( function(from, to, ...) { as.integer(from, ...) } + +method( + metric_coerce, + list( + new_union(class_character, class_integer, class_logical), + new_S3_class(class_desc(class_double)) + ) +) <- + function(from, to, ...) { + as.double(from, ...) + } + +method( + metric_coerce, + list( + new_union(class_character, class_double, class_integer), + new_S3_class(class_desc(class_logical)) + ) +) <- + function(from, to, ...) { + as.logical(from, ...) + } + +method( + metric_coerce, + list( + new_union(class_double, class_integer, class_logical), + new_S3_class(class_desc(class_character)) + ) +) <- + function(from, to, ...) { + as.character(from, ...) + } From 4d280a26b23940d9a56b89b7c02e1356a8793723 Mon Sep 17 00:00:00 2001 From: Joe Zhu Date: Fri, 11 Sep 2026 13:37:16 +0800 Subject: [PATCH 2/3] update, and adding test code --- tests/testthat/test-metric_coerce.R | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/testthat/test-metric_coerce.R diff --git a/tests/testthat/test-metric_coerce.R b/tests/testthat/test-metric_coerce.R new file mode 100644 index 0000000..582cb50 --- /dev/null +++ b/tests/testthat/test-metric_coerce.R @@ -0,0 +1,66 @@ +test_that("metric_coerce coerces character metric strings to each atomic type", { + ms <- metrics() + + # integer metric + expect_identical( + metric_coerce("3", ms[["r_cmd_check_error_count"]]@data_class), + 3L + ) + + # logical metric + expect_identical( + metric_coerce("TRUE", ms[["has_website"]]@data_class), + TRUE + ) + expect_identical( + metric_coerce("FALSE", ms[["has_website"]]@data_class), + FALSE + ) + + # double metric + expect_identical( + metric_coerce("0.5", ms[["test_line_coverage_fraction"]]@data_class), + 0.5 + ) +}) + +test_that("metric_coerce coerces atomic values to character", { + expect_identical(metric_coerce(3L, class_character), "3") + expect_identical(metric_coerce(0.5, class_character), "0.5") + expect_identical(metric_coerce(TRUE, class_character), "TRUE") +}) + +test_that("convert(class_package_matrix, class_metric_data_frame) handles all atomic metric types", { + set.seed(1) + repo <- suppressWarnings(random_repo(n = 4)) + on.exit(unlink(sub("^file://", "", repo), recursive = TRUE)) + + # metric fields are non-standard, so discover them from the PACKAGES DCF + packages_url <- file.path( + sub("^file://", "", repo), + "src", "contrib", "PACKAGES" + ) + dcf <- paste(readLines(packages_url), collapse = "\n") + metric_fields <- grep( + "^Metric/", + colnames(read.dcf(textConnection(dcf))), + value = TRUE + ) + + db <- available.packages( + repos = repo, + fields = metric_fields, + filters = list() + ) + db <- db[!is.na(db[, "Package"]), , drop = FALSE] + + expect_no_error( + met <- convert(class_package_matrix(db), class_metric_data_frame) + ) + + # logical, double and integer metrics should have been coerced away from + # their character storage representation + expect_type(met[["has_website"]], "logical") + expect_type(met[["test_line_coverage_fraction"]], "double") + expect_type(met[["r_cmd_check_error_count"]], "integer") +}) From d1ec7040c27c6d9b378f46ae3f9560a1277e9e77 Mon Sep 17 00:00:00 2001 From: Joe Zhu Date: Fri, 11 Sep 2026 13:48:58 +0800 Subject: [PATCH 3/3] update --- tests/testthat/test-metric_coerce.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-metric_coerce.R b/tests/testthat/test-metric_coerce.R index 582cb50..e246ead 100644 --- a/tests/testthat/test-metric_coerce.R +++ b/tests/testthat/test-metric_coerce.R @@ -1,4 +1,4 @@ -test_that("metric_coerce coerces character metric strings to each atomic type", { +test_that("metric_coerce coerces character metrics to each atomic type", { ms <- metrics() # integer metric @@ -30,7 +30,7 @@ test_that("metric_coerce coerces atomic values to character", { expect_identical(metric_coerce(TRUE, class_character), "TRUE") }) -test_that("convert(class_package_matrix, class_metric_data_frame) handles all atomic metric types", { +test_that("convert package_matrix to metric_data_frame handles atomic types", { set.seed(1) repo <- suppressWarnings(random_repo(n = 4)) on.exit(unlink(sub("^file://", "", repo), recursive = TRUE))