From 56a22c746e568f890196638cbdc8ab0d51416b6b Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Wed, 7 Aug 2024 16:36:34 -0500 Subject: [PATCH] Re-style --- R/layouts.R | 117 +++++++++++++++---------------- R/logger-meta.R | 59 ++++++++-------- man/get_logger_meta_variables.Rd | 2 + man/layout_glue_colors.Rd | 20 +++--- man/layout_json.Rd | 4 ++ tests/testthat/test-layout.R | 8 +-- 6 files changed, 106 insertions(+), 104 deletions(-) diff --git a/R/layouts.R b/R/layouts.R index 659e8dff..68a450b7 100644 --- a/R/layouts.R +++ b/R/layouts.R @@ -30,18 +30,16 @@ layout_glue_generator <- function(format = '{level} [{format(time, "%Y-%m-%d %H: stop("Invalid log level, see ?log_levels") } - meta <- logger_meta_env( - log_level = level, - namespace = namespace, - .logcall = .logcall, - .topcall = .topcall, - .topenv = .topenv, - parent = environment() - ) - glue::glue(format, .envir = meta) - - }, generator = deparse(match.call())) - + meta <- logger_meta_env( + log_level = level, + namespace = namespace, + .logcall = .logcall, + .topcall = .topcall, + .topenv = .topenv, + parent = environment() + ) + glue::glue(format, .envir = meta) + }, generator = deparse(match.call())) } @@ -95,17 +93,19 @@ layout_simple <- structure(function(level, msg, namespace = NA_character_, #' } layout_logging <- structure(function(level, msg, namespace = NA_character_, .logcall = sys.call(), .topcall = sys.call(-1), .topenv = parent.frame()) { - meta <- logger_meta_env( - log_level = level, - namespace = namespace, - .logcall = .logcall, - .topcall = .topcall, - .topenv = .topenv - ) - paste0(format(Sys.time(), "%Y-%m-%d %H:%M:%S"), ' ', - attr(level, 'level'), ':', - ifelse(meta$ns == 'global', '', meta$ns), ':', - msg) + meta <- logger_meta_env( + log_level = level, + namespace = namespace, + .logcall = .logcall, + .topcall = .topcall, + .topenv = .topenv + ) + paste0( + format(Sys.time(), "%Y-%m-%d %H:%M:%S"), " ", + attr(level, "level"), ":", + ifelse(meta$ns == "global", "", meta$ns), ":", + msg + ) }, generator = quote(layout_logging())) @@ -141,16 +141,16 @@ layout_glue <- layout_glue_generator() #' such as [layout_glue_generator()] #' @note This functionality depends on the \pkg{crayon} package. #' @examplesIf requireNamespace("crayon") -#' log_layout(layout_glue_colors) -#' log_threshold(TRACE) -#' log_info("Starting the script...") -#' log_debug("This is the second line") -#' log_trace("That is being placed right after the first one.") -#' log_warn("Some errors might come!") -#' log_error("This is a problem") -#' log_debug("Getting an error is usually bad") -#' log_error("This is another problem") -#' log_fatal("The last problem.") +#' log_layout(layout_glue_colors) +#' log_threshold(TRACE) +#' log_info("Starting the script...") +#' log_debug("This is the second line") +#' log_trace("That is being placed right after the first one.") +#' log_warn("Some errors might come!") +#' log_error("This is a problem") +#' log_debug("Getting an error is usually bad") +#' log_error("This is another problem") +#' log_fatal("The last problem.") layout_glue_colors <- layout_glue_generator( format = paste( "{crayon::bold(colorize_by_log_level(level, levelr))}", @@ -177,26 +177,23 @@ layout_glue_colors <- layout_glue_generator( #' } #' @note This functionality depends on the \pkg{jsonlite} package. #' @seealso This is a [log_layout()], for alternatives, see [layout_blank()], [layout_simple()], [layout_glue()], [layout_glue_colors()], [layout_json_parser()], or generator functions such as [layout_glue_generator()] -layout_json <- function(fields = c('time', 'level', 'ns', 'ans', 'topenv', 'fn', 'node', 'arch', 'os_name', 'os_release', 'os_version', 'pid', 'user')) { - - force(fields) +layout_json <- function(fields = c("time", "level", "ns", "ans", "topenv", "fn", "node", "arch", "os_name", "os_release", "os_version", "pid", "user")) { + force(fields) structure(function(level, msg, namespace = NA_character_, .logcall = sys.call(), .topcall = sys.call(-1), .topenv = parent.frame()) { fail_on_missing_package("jsonlite") - meta <- logger_meta_env( - log_level = level, - namespace = namespace, - .logcall = .logcall, - .topcall = .topcall, - .topenv = .topenv - ) - json <- mget(fields, meta) - sapply(msg, function(msg) jsonlite::toJSON(c(json, list(msg = msg)), auto_unbox = TRUE)) - - }, generator = deparse(match.call())) - + meta <- logger_meta_env( + log_level = level, + namespace = namespace, + .logcall = .logcall, + .topcall = .topcall, + .topenv = .topenv + ) + json <- mget(fields, meta) + sapply(msg, function(msg) jsonlite::toJSON(c(json, list(msg = msg)), auto_unbox = TRUE)) + }, generator = deparse(match.call())) } @@ -218,23 +215,25 @@ layout_json <- function(fields = c('time', 'level', 'ns', 'ans', 'topenv', 'fn', #' log_layout(layout_json_parser(fields = c("time", "node"))) #' log_info(cars = row.names(mtcars), species = unique(iris$Species)) #' } -layout_json_parser <- function(fields = c("time", "level", "ns", "ans", "topenv", "fn", "node", "arch", - "os_name", "os_release", "os_version", "pid", "user")) { +layout_json_parser <- function(fields = c( + "time", "level", "ns", "ans", "topenv", "fn", "node", "arch", + "os_name", "os_release", "os_version", "pid", "user" + )) { force(fields) structure(function(level, msg, namespace = NA_character_, .logcall = sys.call(), .topcall = sys.call(-1), .topenv = parent.frame()) { fail_on_missing_package("jsonlite") - meta <- logger_meta_env( - log_level = level, - namespace = namespace, - .logcall = .logcall, - .topcall = .topcall, - .topenv = .topenv - ) - meta <- mget(fields, meta) - msg <- jsonlite::fromJSON(msg) + meta <- logger_meta_env( + log_level = level, + namespace = namespace, + .logcall = .logcall, + .topcall = .topcall, + .topenv = .topenv + ) + meta <- mget(fields, meta) + msg <- jsonlite::fromJSON(msg) jsonlite::toJSON(c(meta, msg), auto_unbox = TRUE, null = "null") }, generator = deparse(match.call())) diff --git a/R/logger-meta.R b/R/logger-meta.R index ef069592..d837dc80 100644 --- a/R/logger-meta.R +++ b/R/logger-meta.R @@ -4,21 +4,21 @@ logger_meta_env <- function(log_level = NULL, .topcall = sys.call(-1), .topenv = parent.frame(), parent = emptyenv()) { - timestamp <- Sys.time() env <- new.env(parent = parent) env$ns <- namespace env$ans <- fallback_namespace(namespace) - force(.topcall); force(.topenv) - delayedAssign('fn', deparse_to_one_line(.topcall[[1]]), assign.env = env) - delayedAssign('call', deparse_to_one_line(.topcall), assign.env = env) - delayedAssign('topenv', top_env_name(.topenv), assign.env = env) + force(.topcall) + force(.topenv) + delayedAssign("fn", deparse_to_one_line(.topcall[[1]]), assign.env = env) + delayedAssign("call", deparse_to_one_line(.topcall), assign.env = env) + delayedAssign("topenv", top_env_name(.topenv), assign.env = env) env$time <- timestamp env$levelr <- log_level - env$level <- attr(log_level, 'level') + env$level <- attr(log_level, "level") delayedAssign("pid", Sys.getpid(), assign.env = env) @@ -32,12 +32,12 @@ logger_meta_env <- function(log_level = NULL, # stuff from Sys.info delayedAssign(".sysinfo", Sys.info()) - delayedAssign("node", .sysinfo[['nodename']], assign.env = env) - delayedAssign("arch", .sysinfo[['machine']], assign.env = env) - delayedAssign("os_name", .sysinfo[['sysname']], assign.env = env) - delayedAssign("os_release", .sysinfo[['release']], assign.env = env) - delayedAssign("os_version", .sysinfo[['version']], assign.env = env) - delayedAssign("user", .sysinfo[['user']], assign.env = env) + delayedAssign("node", .sysinfo[["nodename"]], assign.env = env) + delayedAssign("arch", .sysinfo[["machine"]], assign.env = env) + delayedAssign("os_name", .sysinfo[["sysname"]], assign.env = env) + delayedAssign("os_release", .sysinfo[["release"]], assign.env = env) + delayedAssign("os_version", .sysinfo[["version"]], assign.env = env) + delayedAssign("user", .sysinfo[["user"]], assign.env = env) env } @@ -80,34 +80,31 @@ get_logger_meta_variables <- function(log_level = NULL, .logcall = sys.call(), .topcall = sys.call(-1), .topenv = parent.frame()) { - sysinfo <- Sys.info() timestamp <- Sys.time() list( - ns = namespace, - ans = fallback_namespace(namespace), - topenv = top_env_name(.topenv), - fn = deparse_to_one_line(.topcall[[1]]), - call = deparse_to_one_line(.topcall), - - time = timestamp, - levelr = log_level, - level = attr(log_level, 'level'), - - pid = Sys.getpid(), + ns = namespace, + ans = fallback_namespace(namespace), + topenv = top_env_name(.topenv), + fn = deparse_to_one_line(.topcall[[1]]), + call = deparse_to_one_line(.topcall), + time = timestamp, + levelr = log_level, + level = attr(log_level, "level"), + pid = Sys.getpid(), ## R and ns package versions - r_version = paste0(R.Version()[c('major', 'minor')], collapse = '.'), + r_version = paste0(R.Version()[c("major", "minor")], collapse = "."), ns_pkg_version = tryCatch(as.character(packageVersion(namespace)), error = function(e) NA_character_), ## stuff from Sys.info - node = sysinfo[['nodename']], - arch = sysinfo[['machine']], - os_name = sysinfo[['sysname']], - os_release = sysinfo[['release']], - os_version = sysinfo[['version']], - user = sysinfo[['user']] + node = sysinfo[["nodename"]], + arch = sysinfo[["machine"]], + os_name = sysinfo[["sysname"]], + os_release = sysinfo[["release"]], + os_version = sysinfo[["version"]], + user = sysinfo[["user"]] ## NOTE might be better to rely on the whoami pkg? ## TODO jenkins (or any) env vars => no need to get here, users can write custom layouts diff --git a/man/get_logger_meta_variables.Rd b/man/get_logger_meta_variables.Rd index a5dda15b..45bd9352 100644 --- a/man/get_logger_meta_variables.Rd +++ b/man/get_logger_meta_variables.Rd @@ -65,5 +65,7 @@ otherwise a fallback namespace (eg usually \code{global}) } } \seealso{ +\code{\link[=layout_glue_generator]{layout_glue_generator()}} + \code{\link[=layout_glue_generator]{layout_glue_generator()}} } diff --git a/man/layout_glue_colors.Rd b/man/layout_glue_colors.Rd index 9e9e00fc..b9192d04 100644 --- a/man/layout_glue_colors.Rd +++ b/man/layout_glue_colors.Rd @@ -49,16 +49,16 @@ This functionality depends on the \pkg{crayon} package. } \examples{ \dontshow{if (requireNamespace("crayon")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} - log_layout(layout_glue_colors) - log_threshold(TRACE) - log_info("Starting the script...") - log_debug("This is the second line") - log_trace("That is being placed right after the first one.") - log_warn("Some errors might come!") - log_error("This is a problem") - log_debug("Getting an error is usually bad") - log_error("This is another problem") - log_fatal("The last problem.") +log_layout(layout_glue_colors) +log_threshold(TRACE) +log_info("Starting the script...") +log_debug("This is the second line") +log_trace("That is being placed right after the first one.") +log_warn("Some errors might come!") +log_error("This is a problem") +log_debug("Getting an error is usually bad") +log_error("This is another problem") +log_fatal("The last problem.") \dontshow{\}) # examplesIf} } \seealso{ diff --git a/man/layout_json.Rd b/man/layout_json.Rd index 468b1032..24cc4c1a 100644 --- a/man/layout_json.Rd +++ b/man/layout_json.Rd @@ -20,6 +20,8 @@ character vector Generate log layout function rendering JSON } \note{ +This functionality depends on the \pkg{jsonlite} package. + This functionality depends on the \pkg{jsonlite} package. } \examples{ @@ -34,4 +36,6 @@ This is a \code{\link[=log_layout]{log_layout()}}, for alternatives, see \code{\link[=layout_blank]{layout_blank()}}, \code{\link[=layout_simple]{layout_simple()}}, \code{\link[=layout_glue]{layout_glue()}}, \code{\link[=layout_glue_colors]{layout_glue_colors()}}, \code{\link[=layout_json_parser]{layout_json_parser()}}, or generator functions such as \code{\link[=layout_glue_generator]{layout_glue_generator()}} + +This is a \code{\link[=log_layout]{log_layout()}}, for alternatives, see \code{\link[=layout_blank]{layout_blank()}}, \code{\link[=layout_simple]{layout_simple()}}, \code{\link[=layout_glue]{layout_glue()}}, \code{\link[=layout_glue_colors]{layout_glue_colors()}}, \code{\link[=layout_json_parser]{layout_json_parser()}}, or generator functions such as \code{\link[=layout_glue_generator]{layout_glue_generator()}} } diff --git a/tests/testthat/test-layout.R b/tests/testthat/test-layout.R index 48f8c8eb..58b71bff 100644 --- a/tests/testthat/test-layout.R +++ b/tests/testthat/test-layout.R @@ -44,10 +44,10 @@ test_that("JSON layout", { expect_equal(jsonlite::fromJSON(capture.output(log_info("foobar")))$msg, "foobar") }) -test_that('JSON parser layout', { - local_test_logger(layout = layout_json_parser(fields = character())) - expect_output(log_info(skip_formatter('{"x": 4}')), '\\{"x":4\\}') - expect_equal(capture.output(log_info(skip_formatter('{"x": 4}'))), '{"x":4}') +test_that("JSON parser layout", { + local_test_logger(layout = layout_json_parser(fields = character())) + expect_output(log_info(skip_formatter('{"x": 4}')), '\\{"x":4\\}') + expect_equal(capture.output(log_info(skip_formatter('{"x": 4}'))), '{"x":4}') }) test_that("must throw errors", {