usethis icon indicating copy to clipboard operation
usethis copied to clipboard

Include code for parsing revdep failures

Open hadley opened this issue 2 years ago • 0 comments

library(stringr)
library(purrr)

lines <- brio::read_lines("~/Desktop/summary.txt")

# Drop lines before first "Package"
info <- lines[-(1:which(str_starts(lines, "Package: "))[[1]] - 1)]

field_id <- cumsum(str_starts(info, "^\\w[\\w ]+: "))

parse_field <- function(x) {
  first <- str_split(x[[1]], ": ", n = 2)[[1]]
  structure(
    list(
      name = first[[1]],
      value = first[[2]],
      extra = x[-1]
    ),
    class = "field"
  )
}

fields <- lapply(unname(split(info, field_id)), parse_field)
head(fields)

package_name <-

package_id <- cumsum(map_lgl(fields, ~ .x$name == "Package"))
packages <- unname(split(fields, package_id))

parse_package <- function(x) {
  even <- x[seq(2, length(x) - 1)]
  odd <- x[seq(3, length(x))]
  results <- map2(even, odd, function(check, result) {
    structure(
      list(
        status = result$value,
        check = check$value,
        results = result$extra
      ),
      class = "result"
    )
  })

  structure(
    list(
      name = x[[1]]$value,
      results = results
    ),
    class = "package"
  )
}

print.packages <- function(x, ..., n = 5) {
  lapply(x, print, n = n)
  invisible(x)
}

print.package <- function(x, ..., n = 20) {
  cat(cli::rule(x$name, col = cli::style_bold), "\n", sep = "")
  lapply(x$results, print, n = n)
  cat("\n")

  invisible(x)
}

print.result <- function(x, ..., n = 10) {
  cat(cli::col_red(x$status), ": ", x$check, "\n", sep = "")
  if (length(x$results) > n) {
    results <- c(x$results[1:(n-1)], "  ...")
  } else {
    results <- x$results
  }
  cat(results, sep = "\n")

  invisible(x)
}

parsed <- lapply(packages, parse_package)
names(parsed) <- map_chr(parsed, "name")
parsed <- structure(parsed, class = "packages")

hadley avatar Feb 21 '22 19:02 hadley