Skip to content

Commit 376e605

Browse files
ColinFayclaude
andcommitted
feat: warn when dev scaffolding fns are called in prod mode
Closes #808. ## New features - New internal helper `warn_if_in_prod_mode()` in `R/make_dev.R` emits a `warning()` when `getOption('golem.app.prod')` is TRUE, naming the caller via `sys.call(-1)`. - Wired into 50 exported scaffolding functions across `use_*`, `add_*` and `set_golem_*` families so that calling them from a deployed app surfaces a visible alert. `add_resource_path()` is intentionally left out since it is part of the runtime, not the scaffolding. ## Test plan - `devtools::test()` — 608 PASS, 0 FAIL. - `devtools::check()` — 0 errors, 0 warnings, 1 NOTE (environmental "unable to verify current time"). - New tests cover the helper in isolation (TRUE/FALSE/NULL cases) and three representative call sites (`use_external_file()`, `add_module()`, `set_golem_name()`). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 4b69987 commit 376e605

19 files changed

Lines changed: 143 additions & 0 deletions

NEWS.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
> Notes: the # between parenthesis refers to the related issue on GitHub, and the @ refers to an external contributor solving this issue.
22
3+
# golem (development version)
4+
5+
## New features
6+
7+
- Development-time scaffolding helpers (`use_*`, `add_*`, `set_golem_*`)
8+
now emit a warning when they are called while `{golem}` is in
9+
production mode (`options('golem.app.prod' = TRUE)`), helping catch
10+
accidental invocations from a deployed app (#808).
11+
312
# golem 0.5.1 to 0.6.0
413

514
## New features / user-visible changes

R/add_ci_files.R

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ add_github_action <- function(
1515
golem_wd = get_golem_wd(),
1616
open = TRUE
1717
) {
18+
warn_if_in_prod_mode()
1819
add_deploy_ci_(
1920
template = "github-action-template.yml",
2021
output = fs_path(
@@ -42,6 +43,7 @@ add_github_action <- function(
4243
#'
4344
#' @return The path to the created GitLab CI file, invisibly.
4445
add_gitlab_ci <- function(golem_wd = get_golem_wd(), open = TRUE) {
46+
warn_if_in_prod_mode()
4547
add_deploy_ci_(
4648
template = "gitlab-ci-template.yml",
4749
output = fs_path(golem_wd, ".gitlab-ci.yml"),

R/add_dockerfiles.R

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
add_dockerfile <- function(
5252
...
5353
) {
54+
warn_if_in_prod_mode()
5455
.Defunct(
5556
new = "add_dockerfile_with_renv",
5657
msg = "add_dockerfile() is defunct. Please use add_dockerfile_with_renv() instead."
@@ -62,6 +63,7 @@ add_dockerfile <- function(
6263
add_dockerfile_shinyproxy <- function(
6364
...
6465
) {
66+
warn_if_in_prod_mode()
6567
.Defunct(
6668
new = "add_dockerfile_with_renv_shinyproxy",
6769
msg = "add_dockerfile_shinyproxy() is defunct. Please use add_dockerfile_with_renv_shinyproxy() instead."
@@ -73,6 +75,7 @@ add_dockerfile_shinyproxy <- function(
7375
add_dockerfile_heroku <- function(
7476
...
7577
) {
78+
warn_if_in_prod_mode()
7679
.Defunct(
7780
new = "add_dockerfile_with_renv_heroku",
7881
msg = "add_dockerfile_heroku() is defunct. Please use add_dockerfile_with_renv_heroku() instead."

R/add_dockerfiles_renv.R

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ add_dockerfile_with_renv <- function(
270270
...,
271271
source_folder
272272
) {
273+
warn_if_in_prod_mode()
273274
signal_arg_is_deprecated(
274275
source_folder,
275276
fun = as.character(sys.call()[[1]]),
@@ -414,6 +415,7 @@ add_dockerfile_with_renv_shinyproxy <- function(
414415
...,
415416
source_folder
416417
) {
418+
warn_if_in_prod_mode()
417419
signal_arg_is_deprecated(
418420
source_folder,
419421
fun = as.character(sys.call()[[1]]),
@@ -474,6 +476,7 @@ add_dockerfile_with_renv_heroku <- function(
474476
...,
475477
source_folder
476478
) {
479+
warn_if_in_prod_mode()
477480
signal_arg_is_deprecated(
478481
source_folder,
479482
fun = as.character(sys.call()[[1]]),

R/add_files.R

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ add_js_file <- function(
4141
...,
4242
pkg
4343
) {
44+
warn_if_in_prod_mode()
4445
signal_arg_is_deprecated(
4546
pkg,
4647
fun = as.character(
@@ -109,6 +110,7 @@ add_js_handler <- function(
109110
...,
110111
pkg
111112
) {
113+
warn_if_in_prod_mode()
112114
signal_arg_is_deprecated(
113115
pkg,
114116
fun = as.character(
@@ -357,6 +359,7 @@ add_js_input_binding <- function(
357359
),
358360
pkg
359361
) {
362+
warn_if_in_prod_mode()
360363
signal_arg_is_deprecated(
361364
pkg,
362365
fun = as.character(
@@ -663,6 +666,7 @@ add_js_output_binding <- function(
663666
dir_create,
664667
pkg
665668
) {
669+
warn_if_in_prod_mode()
666670
signal_arg_is_deprecated(
667671
pkg,
668672
fun = as.character(
@@ -828,6 +832,7 @@ add_css_file <- function(
828832
...,
829833
pkg
830834
) {
835+
warn_if_in_prod_mode()
831836
signal_arg_is_deprecated(
832837
pkg,
833838
fun = as.character(
@@ -879,6 +884,7 @@ add_sass_file <- function(
879884
...,
880885
pkg
881886
) {
887+
warn_if_in_prod_mode()
882888
signal_arg_is_deprecated(
883889
pkg,
884890
fun = as.character(
@@ -983,6 +989,7 @@ add_empty_file <- function(
983989
...,
984990
pkg
985991
) {
992+
warn_if_in_prod_mode()
986993
signal_arg_is_deprecated(
987994
pkg,
988995
fun = as.character(
@@ -1092,6 +1099,7 @@ add_html_template <- function(
10921099
dir_create,
10931100
pkg
10941101
) {
1102+
warn_if_in_prod_mode()
10951103
signal_arg_is_deprecated(
10961104
pkg,
10971105
fun = as.character(
@@ -1167,6 +1175,7 @@ add_partial_html_template <- function(
11671175
dir_create,
11681176
pkg
11691177
) {
1178+
warn_if_in_prod_mode()
11701179
signal_arg_is_deprecated(
11711180
pkg,
11721181
fun = as.character(
@@ -1218,6 +1227,7 @@ add_ui_server_files <- function(
12181227
dir_create,
12191228
pkg
12201229
) {
1230+
warn_if_in_prod_mode()
12211231
signal_arg_is_deprecated(
12221232
pkg,
12231233
fun = as.character(

R/add_r_files.R

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ add_fct <- function(
222222
...,
223223
pkg
224224
) {
225+
warn_if_in_prod_mode()
225226
signal_arg_is_deprecated(
226227
pkg,
227228
fun = as.character(
@@ -253,6 +254,7 @@ add_utils <- function(
253254
with_test = FALSE,
254255
pkg
255256
) {
257+
warn_if_in_prod_mode()
256258
signal_arg_is_deprecated(
257259
pkg,
258260
fun = as.character(
@@ -282,6 +284,7 @@ add_r6 <- function(
282284
with_test = FALSE,
283285
pkg
284286
) {
287+
warn_if_in_prod_mode()
285288
signal_arg_is_deprecated(
286289
pkg,
287290
fun = as.character(

R/add_rstudio_files.R

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ add_positconnect_file <- function(
176176
open = TRUE,
177177
pkg
178178
) {
179+
warn_if_in_prod_mode()
179180
signal_arg_is_deprecated(
180181
pkg,
181182
fun = as.character(
@@ -197,6 +198,7 @@ add_shinyappsio_file <- function(
197198
open = TRUE,
198199
pkg
199200
) {
201+
warn_if_in_prod_mode()
200202
signal_arg_is_deprecated(
201203
pkg,
202204
fun = as.character(
@@ -218,6 +220,7 @@ add_shinyserver_file <- function(
218220
open = TRUE,
219221
pkg
220222
) {
223+
warn_if_in_prod_mode()
221224
signal_arg_is_deprecated(
222225
pkg,
223226
fun = as.character(
@@ -239,6 +242,7 @@ add_rscignore_file <- function(
239242
open = TRUE,
240243
pkg
241244
) {
245+
warn_if_in_prod_mode()
242246
signal_arg_is_deprecated(
243247
pkg,
244248
fun = as.character(

R/golem-yaml-set.R

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ set_golem_wd <- function(
77
golem_wd,
88
pkg
99
) {
10+
warn_if_in_prod_mode()
1011
signal_arg_is_deprecated(
1112
golem_wd,
1213
fun = as.character(
@@ -65,6 +66,7 @@ set_golem_name <- function(
6566
old_name = golem::pkg_name(),
6667
pkg
6768
) {
69+
warn_if_in_prod_mode()
6870
signal_arg_is_deprecated(
6971
pkg,
7072
fun = as.character(
@@ -237,6 +239,7 @@ set_golem_version <- function(
237239
talkative = TRUE,
238240
pkg
239241
) {
242+
warn_if_in_prod_mode()
240243
signal_arg_is_deprecated(
241244
pkg,
242245
fun = as.character(

R/make_dev.R

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,32 @@
1+
#' Warn if called while {golem} is in production mode
2+
#'
3+
#' Helper used by development-time scaffolding functions (`use_*`,
4+
#' `add_*`, `set_golem_*`) to alert the user when they are accidentally
5+
#' invoked from a running app (i.e. when `options('golem.app.prod')` is
6+
#' `TRUE`).
7+
#'
8+
#' @return Used for its side-effect (prints a `cli` warning).
9+
#' @noRd
10+
warn_if_in_prod_mode <- function() {
11+
if (!isTRUE(getOption("golem.app.prod"))) {
12+
return(invisible(NULL))
13+
}
14+
fun_call <- sys.call(-1)
15+
fun_name <- if (length(fun_call)) {
16+
as.character(fun_call[[1L]])
17+
} else {
18+
"This function"
19+
}
20+
warning(
21+
sprintf(
22+
"`%s()` is a development function and should not be called when {golem} is in production mode (`options('golem.app.prod' = TRUE)`).",
23+
fun_name
24+
),
25+
call. = FALSE
26+
)
27+
invisible(NULL)
28+
}
29+
130
#' Make a function dependent to dev mode
231
#'
332
#' The function returned will be run only if `golem::app_dev()`

R/modules_fn.R

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ add_module <- function(
4242
...,
4343
pkg
4444
) {
45+
warn_if_in_prod_mode()
4546
signal_arg_is_deprecated(
4647
pkg,
4748
fun = as.character(

0 commit comments

Comments
 (0)