Skip to content

Commit cd9f781

Browse files
authored
Merge pull request #139 from NIFU-NO/dev
setup_mesos handles arbitrary levels of subfolders
2 parents df8eb67 + a57c7c7 commit cd9f781

File tree

4 files changed

+268
-44
lines changed

4 files changed

+268
-44
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Type: Package
22
Package: saros.base
33
Title: Base Tools for Semi-Automatic Reporting of Ordinary Surveys
4-
Version: 0.5.0
4+
Version: 0.5.1
55
Authors@R: c(
66
person(given = "Stephan",
77
family = "Daus",

R/setup_mesos.R

Lines changed: 160 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,129 @@ search_and_replace_files <- function(
1818
files
1919
}
2020

21+
create_includes_content_path_df <-
22+
function(files_to_process,
23+
main_directory = character(),
24+
mesos_var = character(),
25+
mesos_var_subfolders = character(), # Assumed always a character vector or NULL
26+
mesos_groups_abbr = character(),
27+
prefix = '{{< include \"',
28+
suffix = '\" >}}') {
29+
if (!rlang::is_string(prefix)) cli::cli_abort("{.arg prefix} must be a string.")
30+
if (!rlang::is_string(suffix)) cli::cli_abort("{.arg suffix} must be a string.")
31+
if (missing(files_to_process) || !is.character(files_to_process)) cli::cli_abort("{.arg files_to_process} must be a character vector.")
32+
## By design, the order of this vector does not match the working order
33+
full_dir_path <- c(main_directory, mesos_var, mesos_var_subfolders, if (length(mesos_groups_abbr) > 0) "")
34+
35+
includes_df <-
36+
seq_along(full_dir_path) |>
37+
lapply(FUN = function(path_lvl) {
38+
dir_path <- fs::path_join(stringi::stri_remove_empty_na(full_dir_path[seq_len(length(full_dir_path) - path_lvl + 1)]))
39+
40+
lapply(files_to_process, function(filename_parent) {
41+
filename_child <- filename_parent
42+
43+
44+
if (path_lvl == 1) {
45+
# If inner-most child path, remove leading underscore, and add mesos_group folders
46+
filename_child <-
47+
stringi::stri_replace_first_regex(filename_child,
48+
pattern = "^_",
49+
replacement = ""
50+
)
51+
if (length(mesos_groups_abbr) > 0) {
52+
filename_child <- fs::path(mesos_groups_abbr, filename_child)
53+
}
54+
} else {
55+
filename_child <-
56+
stringi::stri_replace_first_regex(filename_child,
57+
pattern = , "^(?!_)",
58+
replacement = "_"
59+
)
60+
}
61+
if (path_lvl != length(full_dir_path)) {
62+
filename_parent <-
63+
stringi::stri_replace_first_regex(filename_parent,
64+
pattern = "^(?!_)",
65+
replacement = "_"
66+
)
67+
}
68+
69+
data.frame(
70+
content = paste0(paste0(rep("../", times = path_lvl), collapse = ""), filename_parent),
71+
path = if (nchar(dir_path)) fs::path(dir_path, filename_child) else filename_child
72+
)
73+
}) |>
74+
dplyr::bind_rows()
75+
}) |>
76+
dplyr::bind_rows()
77+
if (nrow(includes_df) > 0) {
78+
includes_df[["content"]] <- paste0(prefix, includes_df[["content"]], suffix)
79+
includes_df
80+
}
81+
}
82+
83+
84+
85+
create_metadata_yml <- function(main_directory,
86+
mesos_var,
87+
mesos_var_pretty,
88+
mesos_var_subfolder,
89+
mesos_groups_pretty,
90+
mesos_groups_abbr,
91+
subtitle_separator = " - ") {
92+
###
93+
mesos_groups_base_paths <- fs::path(main_directory, mesos_var, mesos_var_subfolder, mesos_groups_abbr)
94+
95+
lapply(mesos_groups_pretty, function(mesos_group) {
96+
out <- list(params = list(mesos_group = mesos_group))
97+
if (rlang::is_string(subtitle_separator)) {
98+
out$title <- mesos_group
99+
out$subtitle <- paste0(basename(main_directory), subtitle_separator, mesos_var_pretty)
100+
}
101+
out
102+
}) |>
103+
stats::setNames(nm = fs::path(mesos_groups_base_paths, "_metadata.yml"))
104+
}
105+
106+
21107
create_mesos_stubs_from_main_files <- function(mesos_df,
22108
main_directory,
109+
mesos_var_subfolder,
23110
files_to_process,
24-
subtitle_separator = " - ") {
111+
subtitle_separator = " - ",
112+
prefix = '{{< include \"',
113+
suffix = '\" >}}') {
114+
# For each mesos_var
25115
for (j in seq_len(length(mesos_df))) {
26116
mesos_var <- names(mesos_df[[j]])[1]
27117
mesos_var_pretty <- unname(get_raw_labels(mesos_df[[j]], col_pos = 1))
28118
if (is.null(mesos_var_pretty)) mesos_var_pretty <- mesos_var
29119
mesos_groups_pretty <- as.character(mesos_df[[j]][[1]])
30120
mesos_groups_pretty <- mesos_groups_pretty[!is.na(mesos_groups_pretty)]
31121
mesos_groups_abbr <- filename_sanitizer(mesos_groups_pretty, max_chars = 12, accept_hyphen = TRUE, make_unique = TRUE)
32-
mesos_groups_base_paths <- fs::path(main_directory, mesos_var, mesos_groups_abbr)
33-
fs::dir_create(fs::path(main_directory, mesos_var))
34-
fs::dir_create(mesos_groups_base_paths)
122+
# mesos_groups_base_paths <- fs::path(main_directory, mesos_var, mesos_var_subfolder, mesos_groups_abbr)
123+
fs::dir_create(fs::path(main_directory, mesos_var, mesos_var_subfolder))
35124

125+
## Assumes pre-cleaning of mesos_var_subfolder
126+
mesos_var_subfolders <- stringi::stri_split_regex(mesos_var_subfolder, pattern = "[/\\\\]")
127+
mesos_var_subfolders <- mesos_var_subfolders[[min(c(j, length(mesos_var_subfolder)))]]
128+
mesos_var_subfolders <- stringi::stri_remove_empty_na(mesos_var_subfolders)
129+
130+
includes_df <- create_includes_content_path_df(
131+
files_to_process = basename(unname(files_to_process)),
132+
main_directory = main_directory,
133+
mesos_var = mesos_var,
134+
mesos_var_subfolders = mesos_var_subfolders,
135+
mesos_groups_abbr = mesos_groups_abbr,
136+
prefix = prefix,
137+
suffix = suffix
138+
)
139+
for (i in seq_len(nrow(includes_df))) {
140+
cat(includes_df[i, "content", drop = TRUE], file = includes_df[i, "path", drop = TRUE])
141+
}
36142

143+
########################
37144
# Write _metadata.yml in each mesos_var folder
38145
yaml::write_yaml(
39146
x = list(params = list(
@@ -42,70 +149,76 @@ create_mesos_stubs_from_main_files <- function(mesos_df,
42149
)),
43150
file = fs::path(main_directory, mesos_var, "_metadata.yml")
44151
)
45-
46-
for (f in seq_along(files_to_process)) {
47-
cat(paste0('{{< include "../../', basename(unname(files_to_process[f])), '" >}}'),
48-
file = fs::path(main_directory, mesos_var, basename(unname(files_to_process[f])))
49-
)
152+
# Write empty metadata.yml files in all child folders of mesos_var that is not the mesos_group folders
153+
# Uses trick of fs::path returning a character vector if mesos_var_subfolders is a vector
154+
# Avoids overwriting in case user has modified it manually
155+
for (f in fs::path(main_directory, mesos_var, mesos_var_subfolders, "_metadata.yml")) {
156+
cat(file = f, append = TRUE)
50157
}
51158

52159

53-
for (i in seq_along(mesos_groups_pretty)) {
54-
mesos_group <- mesos_groups_pretty[i]
55-
56-
# Write _metadata.yml in each mesos_group foldre
57-
yml_contents <- list(
58-
params = list(mesos_group = mesos_group)
59-
)
60-
if (rlang::is_string(subtitle_separator)) {
61-
yml_contents$title <- mesos_group
62-
yml_contents$subtitle <- paste0(basename(main_directory), subtitle_separator, mesos_var_pretty)
63-
}
64-
yaml::write_yaml(
65-
x = yml_contents,
66-
file = fs::path(mesos_groups_base_paths[i], "_metadata.yml")
67-
)
68-
# Write chapter stubs in each mesos_group folder
69-
out_files <-
70-
fs::path(
71-
mesos_groups_base_paths[i],
72-
stringi::stri_replace_first_regex(basename(unname(files_to_process)),
73-
pattern = "^_",
74-
replacement = ""
75-
)
76-
)
77-
78-
for (k in seq_along(unname(files_to_process))) {
79-
cat(paste0('{{< include "../', basename(unname(files_to_process[k])), '" >}}'),
80-
file = out_files[k]
81-
)
82-
}
160+
###############################
161+
yml_contents <- create_metadata_yml(
162+
mesos_groups_pretty = mesos_groups_pretty,
163+
main_directory = main_directory,
164+
subtitle_separator = subtitle_separator,
165+
mesos_var = mesos_var,
166+
mesos_var_pretty = mesos_var_pretty,
167+
mesos_var_subfolder = mesos_var_subfolder,
168+
mesos_groups_abbr = mesos_groups_abbr
169+
)
170+
fs::dir_create(dirname(names(yml_contents)))
171+
for (i in seq_along(yml_contents)) {
172+
yaml::write_yaml(x = yml_contents[[i]], file = names(yml_contents)[i])
83173
}
174+
# for (i in seq_along(mesos_groups_pretty)) {
175+
# mesos_group <- mesos_groups_pretty[i]
176+
177+
# # Write _metadata.yml in each mesos_group folder
178+
# yml_contents <- list(
179+
# params = list(mesos_group = mesos_group)
180+
# )
181+
# if (rlang::is_string(subtitle_separator)) {
182+
# yml_contents$title <- mesos_group
183+
# yml_contents$subtitle <- paste0(basename(main_directory), subtitle_separator, mesos_var_pretty)
184+
# }
185+
# yaml::write_yaml(
186+
# x = yml_contents,
187+
# file = fs::path(mesos_groups_base_paths[i], "_metadata.yml")
188+
# )
189+
# }
84190
}
85191
}
86192

87193

194+
88195
#' Simply create qmd-files and yml-files for mesos reports
89196
#' @param main_directory String, path to where the _metadata.yml, stub QMD-files and their subfolders are created.
197+
#' @param mesos_var_subfolder String, optional name of a subfolder of the mesos_var folder in where to place all mesos_group folders.
90198
#' @param files_to_process Character vector of files used as templates for the mesos stubs.
91199
#' @param mesos_df List of single-column data frames where each variable is a mesos variable, optionally with a variable label indicating its pretty name. The values in each variable are the mesos groups. NA is silently ignored.
92200
#' @param main_files Character vector of files for which titles should be set as the mesos_group. Optional but recommended.
93201
#' @param read_syntax_pattern,read_syntax_replacement Optional strings, any regex pattern to search and replace in the qmd-files. If NULL, will ignore it.
94202
#' @param qmd_regex String. Experimental feature for allowing Rmarkdown, not yet tested.
95203
#' @param subtitle_separator String or NULL. If a string will add title and subtitle fields to the _metadata.yml-files in the deepest child folders. The title is the mesos_group. The subtitle is a concatenation of the folder name of the main_directory and the mesos_var label.
204+
#' @param prefix,suffix String for the include section of the stub qmd files.
96205
#' @export
97206
setup_mesos <- function(
98207
main_directory,
208+
mesos_var_subfolder = "",
99209
files_to_process,
100210
mesos_df,
101211
main_files = c("index", "report"),
102212
read_syntax_pattern = "qs::qread\\('",
103213
read_syntax_replacement = "qs::qread('../",
104214
qmd_regex = "\\.qmd",
105-
subtitle_separator = " - ") {
215+
subtitle_separator = " - ",
216+
prefix = '{{< include \"../',
217+
suffix = '\" >}}') {
106218
## Checks
107219

108220
if (!inherits(main_directory, "character") || length(main_directory) == 0) cli::cli_abort("{.arg main_directory} must be a string, not {.obj_type_friendly {main_directory}}")
221+
if (is.null(mesos_var_subfolder) || length(mesos_var_subfolder) != 1 || is.na(mesos_var_subfolder)) mesos_var_subfolder <- ""
109222
if (!is.character(files_to_process) ||
110223
length(files_to_process) == 0 ||
111224
!all(file.exists(files_to_process))) {
@@ -123,14 +236,19 @@ setup_mesos <- function(
123236
if (!inherits(main_files, "character")) cli::cli_abort("{.arg main_files} must be a character vector, not a {.obj_type_friendly {main_files}}")
124237
if (!inherits(read_syntax_pattern, "character")) cli::cli_abort("{.arg read_syntax_pattern} must be a string (regex), not a {.obj_type_friendly {read_syntax_pattern}}")
125238
if (!inherits(read_syntax_replacement, "character")) cli::cli_abort("{.arg read_syntax_replacement} must be a string (regex), not a {.obj_type_friendly {read_syntax_replacement}}")
126-
if (!inherits(qmd_regex, "character") || length(qmd_regex) == 0) cli::cli_abort("{.arg qmd_regex} must be a string, not a {.obj_type_friendly {qmd_regex}}")
239+
if (!inherits(qmd_regex, "character") || length(qmd_regex) != 1) cli::cli_abort("{.arg qmd_regex} must be a string, not a {.obj_type_friendly {qmd_regex}}")
240+
if (!inherits(prefix, "character") || length(prefix) != 1) cli::cli_abort("{.arg prefix} must be a string, not a {.obj_type_friendly {prefix}}")
241+
if (!inherits(suffix, "character") || length(suffix) != 1) cli::cli_abort("{.arg suffix} must be a string, not a {.obj_type_friendly {suffix}}")
127242

128243

129244
create_mesos_stubs_from_main_files(
130245
mesos_df = mesos_df,
131246
main_directory = main_directory,
247+
mesos_var_subfolder = mesos_var_subfolder,
132248
files_to_process = files_to_process,
133-
subtitle_separator = subtitle_separator
249+
subtitle_separator = subtitle_separator,
250+
prefix = prefix,
251+
suffix = suffix
134252
)
135253

136254
if (is.character(read_syntax_pattern) &&

man/setup_mesos.Rd

Lines changed: 8 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)