-
Notifications
You must be signed in to change notification settings - Fork 8
/
logging.R
107 lines (98 loc) · 2.99 KB
/
logging.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
##' Start and stop the orderly log. When active, some actions will
##' print diagnostic information to the message stream. This is set
##' to be on by default.
##'
##' The function `orderly_log` is designed to be used from
##' applications that extend orderly, while the functions
##' `orderly_log_on` and `orderly_log_off` can be used by
##' applications or users to enable and disable log messages.
##'
##' The interface here may expand by adding arguments or change
##' behaviour based on global options. Future versions may support
##' logging to a file, or adding timestamps, or logging in json
##' format, etc.
##'
##' @title Orderly logging and diagnostic messages
##' @export
##' @rdname orderly_log
##'
##' @return `orderly_log_on` and `orderly_log_off` invisibly
##' returns a logical indicating if logging was previously enabled.
##' This allows patterns like:
##'
##' ```
##' if (!orderly::orderly_log_off()) {
##' on.exit(orderly::orderly_log_on())
##' }
##' ```
##'
##' to disable logging within a function (the `on.exit` block
##' will be run when the function exits).
##'
##' @seealso [orderly::orderly_run()], which makes use of these log
##' messages
##'
##' @examples
##' # We are going to log things below
##' logging_was_enabled <- orderly::orderly_log_on()
##'
##' # About orderly log messages:
##' # Orderly log messages have the form "[title] message"
##' orderly::orderly_log_on()
##' orderly::orderly_log("title", "message")
##'
##' # If logging is disabled they are not printed:
##' orderly::orderly_log_off()
##' orderly::orderly_log("title", "message")
##'
##' # Restore to previous settings:
##' if (logging_was_enabled) {
##' orderly::orderly_log_on()
##' }
orderly_log_on <- function() {
invisible(!isTRUE(options(orderly.nolog = NULL)$orderly.nolog))
}
##' @export
##' @rdname orderly_log
orderly_log_off <- function() {
invisible(!isTRUE(options(orderly.nolog = TRUE)$orderly.nolog))
}
##' @param topic Up to 9 character text string with the log topic
##' @param value Character string with the log entry
##' @rdname orderly_log
##' @export
orderly_log <- function(topic, value) {
if (!isTRUE(getOption("orderly.nolog"))) {
style <- orderly_style(orderly_log_style(topic))
n <- length(value) - 1L
if (n > 0L) {
topic <- c(topic, rep_len("...", n))
}
str <- trimws(sprintf("[ %s ] %s",
style(format(topic, width = 10)), value))
if (n > 0L) {
str <- paste(str, collapse = "\n")
}
message(str)
}
}
orderly_log_break <- function() {
orderly_log(strrep("-", 10),
strrep("-", max(getOption("width") - 18, 0)))
}
orderly_warning <- function(msg) {
if (getOption("orderly.nowarnings", FALSE)) {
message(msg)
} else {
warning(msg, immediate. = TRUE, call. = FALSE)
}
}
orderly_log_style <- function(topic) {
switch(tolower(topic),
warning = "alert",
error = "alert",
unexpected = "alert",
rollback = "alert",
workflow = "workflow",
"highlight")
}