R/travis-s3.R

Defines functions print.travis format.travis key_value shorten bullets format.travis_collection reconstruct `[.travis_collection` new_travis_collection new_travis_object new_travis travis_no_attr travis_attr

travis_attr <- function(x) {
  is_attr <- grepl("^@", names(x))
  x[is_attr]
}

travis_no_attr <- function(x) {
  is_attr <- grepl("^@", names(x))
  x[!is_attr]
}

new_travis <- function(x, attr, subclass) {
  attr[["names"]] <- names(x)
  attributes(x) <- attr
  structure(x, class = c(paste0("travis_", subclass), "travis"))
}

new_travis_object <- function(x, subclass) {
  new_travis(travis_no_attr(x), travis_attr(x), subclass)
}

new_travis_collection <- function(x, attr, subclass) {
  new_travis(x, attr, c(subclass, "collection"))
}

`[.travis_collection` <- function(x, i) {
  reconstruct(NextMethod(), x)
}

reconstruct <- function(new, orig) {
  mostattributes(new) <- attributes(orig)
  new
}

#' @export
format.travis_collection <- function(x, ...) {
  if (length(x) == 0) {
    return(invisible(x))
  } else {
    paste0(
      "A collection of ", length(x), " Travis CI ", attr(x, "@type"), ":\n",
      bullets(vapply(shorten(x), format, short = TRUE, character(1)))
    )
  }
}

bullets <- function(x) {
  if (length(x) == 0) {
    return(character())
  }
  paste0("- ", x, collapse = "\n")
}

shorten <- function(x) {
  n_max <- 6
  if (length(x) > n_max) {
    c(x[seq_len(n_max - 1)], "...")
  } else {
    x
  }
}

key_value <- function(x) {
  paste0(
    ifelse(names(x) == "", "", paste0(names(x), ": ")),
    x
  )
}

#' @export
format.travis <- function(x, ..., short = FALSE) {
  kv <- key_value(shorten(x))
  if (short) {
    paste0(kv, collapse = ", ")
  } else {
    bullets(kv)
  }
}

#' @export
print.travis <- function(x, ...) {
  cat(format(x))
  invisible(x)
}
ropenscilabs/travis documentation built on May 18, 2022, 8:33 p.m.