From c8e2391b73ac9629d5b25862a9106ed88cd3774d Mon Sep 17 00:00:00 2001 From: jpcompartir Date: Thu, 14 Aug 2025 16:20:02 +0100 Subject: [PATCH 1/5] add the samy brand information and Quarto etc. --- .DS_Store | Bin 6148 -> 8196 bytes inst/brands/samyds/_brand.yml | 43 +++++++++++++++ inst/brands/samyds/_quarto.yml | 54 +++++++++++++++++++ inst/brands/samyds/samy-theme.scss | 75 +++++++++++++++++++++++++++ inst/brands/samyds/samy_isotype.png | Bin 0 -> 6846 bytes inst/brands/samyds/samy_logotype.png | Bin 0 -> 6846 bytes 6 files changed, 172 insertions(+) create mode 100644 inst/brands/samyds/_brand.yml create mode 100644 inst/brands/samyds/_quarto.yml create mode 100644 inst/brands/samyds/samy-theme.scss create mode 100644 inst/brands/samyds/samy_isotype.png create mode 100644 inst/brands/samyds/samy_logotype.png diff --git a/.DS_Store b/.DS_Store index a61686c2614742e2d05793b6cfd5683a6671b284..11a23c65a6bd940dc5e7ff45339528d07dba9ae4 100644 GIT binary patch literal 8196 zcmeHM&ubGw6#k}3F{Km>6=~7KUi2VF$fb~jWm_U%rST*PO`4Ean{H^DdJrT9kM+l; zqQ$d!>BWoJQalK~^=9t=3m$xLX0mzH-NZ|gqBAi2mU%zEZ@=B_^lbsCrB1B?%mT>K zWIH`chm^s7o{2GLS8kJ4l#h)@p}ZP3TZu@&;1%!+cm=!yUIDMbMNxqEY#zBG`@Zq| zqgTKy@Lwvx?}vaU+tAvsvHI0P2i*dY&C;?SbUw`|WCLqMYrDphhlVn#WKF8FErv4b zv>w>F(AuuCCLPK)AIc&t+o33pPW1yF4iy^fk6r<YW zqf)855mjj|ck}z#H?Izk7F~aBq`$Q`_%@*0A*JF{9~W!rpeoUU%f)1bM^A6gmW6R;CqDR9cCBJVcmHA)$n%|JRlINeJ z9ln_!^Ub1$3bs*k7|s+wNT1~N@I|ayoGV$R`5oMuka2T;T;xfs3Z6Omz~i(S$>YZJ zm`9?P0IrV-5&#w#5|ra^f7IoL`-@e zysIt7Q&@Je)Lz-FN}T+c_}VC5Vz?fs{+Qmi$LU$FvyNx(AX?W6M|dUP>%G(caigUZ zF?a{0M>zQC5dbEzLwB-4_p(kLG#BT3(Kt+xl6 zj43qB{Xe~{hJF7(FF0SvE8rElfC{K=sa#qjVz#$VP~=`apt(Ym2gh}d)hTq)?KoN8 tj+2f5VMylzg>p`4ZP!>@q4C#01lYeY-2Ju3R8sb9zyGr^e*Ak1{03llegyyk delta 336 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%0Dre*+$REA0aM>!S{fzXrI`O=y10 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 literal 0 HcmV?d00001 diff --git a/inst/brands/samyds/samy_logotype.png b/inst/brands/samyds/samy_logotype.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8a3ba714e48982355d51a6b58e2eb833ce1cff GIT binary patch literal 6846 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%0Dre*+$REA0aM>!S{fzXrI`O=y10 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 literal 0 HcmV?d00001 From a74946218dd6186c147904f5f2f6057e2169e4c2 Mon Sep 17 00:00:00 2001 From: jpcompartir Date: Thu, 14 Aug 2025 16:20:29 +0100 Subject: [PATCH 2/5] Re-work the dr_add_brand() and dr_list_brands() functions to use cli for user experience, and to allow for all files from brands/x/ to be copied over add cli:: to deps --- DESCRIPTION | 1 + R/brands.R | 80 ++++++++++++++++++---------------- inst/brands/samyds/_quarto.yml | 1 - 3 files changed, 44 insertions(+), 38 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f3f5e77..6e3ad99 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -13,6 +13,7 @@ Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 URL: https://jpcompartir.github.io/DisplayR/ Imports: + cli, dplyr (>= 1.1.0), flextable (>= 0.9.0), ggdist, diff --git a/R/brands.R b/R/brands.R index 8a6b7e5..3e63a6f 100644 --- a/R/brands.R +++ b/R/brands.R @@ -2,28 +2,33 @@ #' #' @description Check which brands a _brand.yml and an optional 'logo.png' have been uploaded to DisplayR for. #' +#' @param quiet whether to print the name of detected brands or not. #' @returns A list of folder names relating to brands/ #' @export #' #' @examples #' brands <- dr_list_brands() -dr_list_brands <- function(){ - brands_path <- system.file("brands", package = "DisplayR") +dr_list_brands <- function(quiet = FALSE){ + brands_path <- system.file("brands", package = "DisplayR") - brands <- list.dirs(brands_path, full.names = FALSE, recursive = FALSE) + brands <- list.dirs(brands_path, full.names = FALSE, recursive = FALSE) |> + purrr::keep(~ file.exists(file.path(brands_path, .x, "_brand.yml"))) + if (quiet) return(invisible(brands)) - # Chepck for _brand.yml - has_brand_yml <- sapply(brands, function(brand) { - file.exists(file.path(brands_path, brand, "_brand.yml")) - }) + if (length(brands) == 0) { + cli::cli_alert_info("No brands available") + } else { + cli::cli_alert_success("{length(brands)} brand{?s} available") + cli::cli_ul(brands) + } - return(brands[has_brand_yml]) + return(invisible(brands)) } #' Add brand styling to your project #' -#' @description Add a _brand.yml and a logo.png to your project from DisplayR's inst/brands folder. If you need a new brand to be added, contact the Data Science Team +#' @description Add brand files to your project from DisplayR's inst/brands folder. If you need a new brand to be added, contact the Data Science Team #' @param brand Name of the brand you wish to load, as it appears in `dr_list_brands()` #' @param directory The directory you want the brand information to be added to, as a default it uses the current working directory #' @@ -35,42 +40,43 @@ dr_list_brands <- function(){ #' brands <- dr_list_brands() #' dr_add_brand("shareds") #' -dr_add_brand <- function(brand, directory = getwd()) { +dr_add_brand <- function(brand, directory = getwd(), overwrite = NULL) { + # just mkae sure the brand does in fact exist + if (!brand %in% dr_list_brands(quiet = TRUE)) { + cli::cli_abort("Brand '{brand}' not found. Use {.fn dr_list_brands} to see available brands.") + } - brands_path <- system.file("brands", package = "DisplayR") - brands <- list.dirs(brands_path, full.names = FALSE, recursive = FALSE) + brand_path <- file.path(system.file("brands", package = "DisplayR"), brand) + brand_files <- list.files(brand_path, full.names = TRUE) + destination_files <- file.path(directory, basename(brand_files)) + existing_files <- basename(brand_files)[file.exists(destination_files)] - if(!brand %in% brands) { - stop(sprintf("Brand: '%s' not found in listed brands", brand)) + # if files already exist, ask the user whether to overwrite or not + if (is.null(overwrite) && length(existing_files) > 0) { + cli::cli_ul(existing_files) + choice <- utils::menu(c("Yes", "No"), title = "Overwrite existing files?") + overwrite <- choice == 1 } - brand_path <- file.path(brands_path, brand) + # default to TRUE if still NULL (no existing files or not specified) + overwrite <- overwrite %||% TRUE - if(!file.exists(file.path(brand_path, "_brand.yml"))){ - stop("No _brand.yml found in brands folder") - } else { - brand_yml <- file.path(brand_path, "_brand.yml") + # if user didn't want to overwrite let them know what happened + if (!overwrite && length(existing_files) > 0) { + cli::cli_alert_danger("Files already exist and were not overwritten:") + cli::cli_ul(existing_files) + cli::cli_alert_danger("Repeat: the above files were {.strong not} overwritten.") + return(invisible(character(0))) } - file.copy( - from = brand_yml, - to = directory, - overwrite = TRUE - ) + copied <- file.copy(brand_files, directory, overwrite = overwrite) + copied_files <- basename(brand_files)[copied] - has_logo <- file.exists(file.path(brand_path, "logo.png")) - if(has_logo){ - file.copy( - from = file.path(brand_path, "logo.png"), - to = directory, - overwrite = TRUE - ) - } else { - message(sprintf("No 'logo.png' found in '%s' ", brand_path)) + # let the user know what happened when we do overwrite + if (length(copied_files) > 0) { + cli::cli_alert_success("Added {.strong {brand}} brand files:") + cli::cli_ul(copied_files) } - invisible(TRUE) + invisible(copied_files) } - - - diff --git a/inst/brands/samyds/_quarto.yml b/inst/brands/samyds/_quarto.yml index 4250fd6..258a101 100644 --- a/inst/brands/samyds/_quarto.yml +++ b/inst/brands/samyds/_quarto.yml @@ -19,7 +19,6 @@ format: link-external-icon: true link-external-newwindow: true number-sections: true - title-block-banner: true toc: true toc-depth: 3 toc-expand: true From 9c61ef8d7ced85f3bdb025e2b27e1393ec3c05f1 Mon Sep 17 00:00:00 2001 From: jpcompartir Date: Fri, 3 Oct 2025 10:32:09 +0100 Subject: [PATCH 3/5] make sure brands only offers the menu in an interactive session --- R/brands.R | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/R/brands.R b/R/brands.R index 3e63a6f..0639b44 100644 --- a/R/brands.R +++ b/R/brands.R @@ -52,10 +52,12 @@ dr_add_brand <- function(brand, directory = getwd(), overwrite = NULL) { existing_files <- basename(brand_files)[file.exists(destination_files)] # if files already exist, ask the user whether to overwrite or not - if (is.null(overwrite) && length(existing_files) > 0) { - cli::cli_ul(existing_files) - choice <- utils::menu(c("Yes", "No"), title = "Overwrite existing files?") - overwrite <- choice == 1 + if(interactive()){ + if (is.null(overwrite) && length(existing_files) > 0) { + cli::cli_ul(existing_files) + choice <- utils::menu(c("Yes", "No"), title = "Overwrite existing files?") + overwrite <- choice == 1 + } } # default to TRUE if still NULL (no existing files or not specified) From 6d63013d65a892de263a91765da3bf680f91ea1c Mon Sep 17 00:00:00 2001 From: jpcompartir Date: Tue, 2 Dec 2025 11:54:07 +0000 Subject: [PATCH 4/5] fix typo in theme_microsoft_continuous remove bad tests in sentiment plot name cols in test-table_gt as index seems to have changed switch is.ggplot to is_ggplot in test-themes name geoms appropriately (post ggplot change?) --- R/themes.R | 2 +- man/theme_microsoft_continuous.Rd | 2 +- tests/testthat/test-plots_sentiment.R | 7 ------- tests/testthat/test-table_gt.R | 4 ++-- tests/testthat/test-themes.R | 6 +++--- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/R/themes.R b/R/themes.R index 7ed290c..9308d29 100644 --- a/R/themes.R +++ b/R/themes.R @@ -91,7 +91,7 @@ dr_theme_microsoft <- function(scale_type = c("discrete", "continuous"), } -#' theme_microsoft_continous +#' theme_microsoft_continuous #' #' Adds Microsoft colours and font to continous plot. #' @param index Choose palettes colours by index by setting index equal to a character vector e.g. c(1,2,3) or c(1:3) diff --git a/man/theme_microsoft_continuous.Rd b/man/theme_microsoft_continuous.Rd index 5ec0e53..99154dc 100644 --- a/man/theme_microsoft_continuous.Rd +++ b/man/theme_microsoft_continuous.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/themes.R \name{theme_microsoft_continuous} \alias{theme_microsoft_continuous} -\title{theme_microsoft_continous} +\title{theme_microsoft_continuous} \usage{ theme_microsoft_continuous( index = NULL, diff --git a/tests/testthat/test-plots_sentiment.R b/tests/testthat/test-plots_sentiment.R index 6aa8a65..7d51ac1 100644 --- a/tests/testthat/test-plots_sentiment.R +++ b/tests/testthat/test-plots_sentiment.R @@ -1,6 +1,4 @@ test_that("dr_plot_sent is rendering a ggplot when it should and failing when it should", { - - expect_error(dr_plot_sent_vot(df, sentiment_var = sentiment, date_var = date)) df <- DisplayR::disp_example plot <- dr_plot_sent(df, sentiment, "percent") @@ -26,11 +24,6 @@ test_that("dr_plot_sent is rendering a ggplot when it should and failing when it test_that("grouped sentiment plot is functioning as expeced", { - #test plot raises an error when data frame doesn't exist - expect_error(dr_plot_sent_group(df, group_var = topic, - sentiment_var = sentiment, - plot_type = "percent", - bar_labels = "volume")) df <- DisplayR::disp_example #test plot renders a ggplot object and the first value of n == 57 diff --git a/tests/testthat/test-table_gt.R b/tests/testthat/test-table_gt.R index dc11d73..e0e28fd 100644 --- a/tests/testthat/test-table_gt.R +++ b/tests/testthat/test-table_gt.R @@ -68,10 +68,10 @@ test_that("disp_gt_sent_time is functioning as expected", { plot_build <- ggplot2::ggplot_build(plot) # Colours are as expected - expect_equal(unique(plot_build$data[[1]][[1]]), c("#c00000", "black", "#1b7837")) + expect_equal(unique(plot_build$data[[1]][["colour"]]), c("#c00000", "black", "#1b7837")) # Data is as expected - expect_equal(plot_build$data[[1]][[4]][[1]], 119) + expect_equal(plot_build$data[[1]][["y"]][[1]], 119) # time_unit is functioning plot_weekly <- disp_gt_sent_time(df, sentiment, time_unit = "week") diff --git a/tests/testthat/test-themes.R b/tests/testthat/test-themes.R index 986f9a5..1e727fe 100644 --- a/tests/testthat/test-themes.R +++ b/tests/testthat/test-themes.R @@ -36,7 +36,7 @@ test_that("theme_boilerplate() returns ggplot object when theme applied", { plot_boilerplate <- plot + theme_boilerplate() - expect_true(ggplot2::is.ggplot(plot_boilerplate)) + expect_true(ggplot2::is_ggplot(plot_boilerplate)) }) @@ -139,7 +139,7 @@ test_that("theme_boilerplate() has desired behaviour towards axis aesthetics", theme_boilerplate() # axis ticks - expect_type(plot_boilerplate$theme$axis.ticks, "list") + expect_type(plot_boilerplate$theme$axis.ticks, "element_line") # axis ticks colour expect_true(plot_boilerplate$theme$axis.ticks$colour == "grey20") # axis line colour @@ -159,7 +159,7 @@ test_that("theme_boilerplate() has desired behaviour towards legend aesthetics", theme_boilerplate() # legend key - expect_type(plot_boilerplate$theme$legend.key, "list") + expect_type(plot_boilerplate$theme$legend.key, "element_rect") # legend key colour expect_true(is.na(plot_boilerplate$theme$legend.key$colour)) # legend key fill From daa69d4112e7de8fc8a8a16e76fe2caa63b6fb4a Mon Sep 17 00:00:00 2001 From: jpcompartir Date: Tue, 2 Dec 2025 13:38:39 +0000 Subject: [PATCH 5/5] remove gghalves, at least temporarily due to ggplot version incompatibility, use jitter in dr_plot_raincloud instead. add overwrite param to dr_add_brand roxygen2 docs update theme tests to check for s3 class not type --- DESCRIPTION | 3 +-- R/brands.R | 1 + R/plots_distribution.R | 11 ++++++++--- man/dr_add_brand.Rd | 6 ++++-- man/dr_list_brands.Rd | 5 ++++- tests/testthat/test-themes.R | 4 ++-- 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6e3ad99..19c4c17 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -16,8 +16,7 @@ Imports: cli, dplyr (>= 1.1.0), flextable (>= 0.9.0), - ggdist, - gghalves, + ggdist (>= 3.3.3), ggplot2 (>= 3.4.2), gt (>= 0.9.0), lubridate (>= 1.8.0), diff --git a/R/brands.R b/R/brands.R index 0639b44..c34812c 100644 --- a/R/brands.R +++ b/R/brands.R @@ -31,6 +31,7 @@ dr_list_brands <- function(quiet = FALSE){ #' @description Add brand files to your project from DisplayR's inst/brands folder. If you need a new brand to be added, contact the Data Science Team #' @param brand Name of the brand you wish to load, as it appears in `dr_list_brands()` #' @param directory The directory you want the brand information to be added to, as a default it uses the current working directory +#' @param overwrite Whether to overwrite any existing files #' #' @returns Invisible #' @export diff --git a/R/plots_distribution.R b/R/plots_distribution.R index 3a62f46..34d6883 100644 --- a/R/plots_distribution.R +++ b/R/plots_distribution.R @@ -67,11 +67,16 @@ dr_plot_raincloud <- function(data, color = NA, ## remove slab interval position = ggplot2::position_nudge(x = 0.15) ) + - gghalves::geom_half_point( - side = "l", - range_scale = 0.3, + ggplot2::geom_jitter( + width = 0.05, + height = 0, alpha = 0.5 ) + + # gghalves::geom_half_point( + # side = "l", + # range_scale = 0.3, + # alpha = 0.5, + # ) + theme_boilerplate() return(plot_raincloud) diff --git a/man/dr_add_brand.Rd b/man/dr_add_brand.Rd index c9d47f4..1722ff8 100644 --- a/man/dr_add_brand.Rd +++ b/man/dr_add_brand.Rd @@ -4,18 +4,20 @@ \alias{dr_add_brand} \title{Add brand styling to your project} \usage{ -dr_add_brand(brand, directory = getwd()) +dr_add_brand(brand, directory = getwd(), overwrite = NULL) } \arguments{ \item{brand}{Name of the brand you wish to load, as it appears in \code{dr_list_brands()}} \item{directory}{The directory you want the brand information to be added to, as a default it uses the current working directory} + +\item{overwrite}{Whether to overwrite any existing files} } \value{ Invisible } \description{ -Add a _brand.yml and a logo.png to your project from DisplayR's inst/brands folder. If you need a new brand to be added, contact the Data Science Team +Add brand files to your project from DisplayR's inst/brands folder. If you need a new brand to be added, contact the Data Science Team } \examples{ diff --git a/man/dr_list_brands.Rd b/man/dr_list_brands.Rd index 5be12ad..c2a4317 100644 --- a/man/dr_list_brands.Rd +++ b/man/dr_list_brands.Rd @@ -4,7 +4,10 @@ \alias{dr_list_brands} \title{View which brands have styling options available for them} \usage{ -dr_list_brands() +dr_list_brands(quiet = FALSE) +} +\arguments{ +\item{quiet}{whether to print the name of detected brands or not.} } \value{ A list of folder names relating to brands/ diff --git a/tests/testthat/test-themes.R b/tests/testthat/test-themes.R index 1e727fe..390b72b 100644 --- a/tests/testthat/test-themes.R +++ b/tests/testthat/test-themes.R @@ -139,7 +139,7 @@ test_that("theme_boilerplate() has desired behaviour towards axis aesthetics", theme_boilerplate() # axis ticks - expect_type(plot_boilerplate$theme$axis.ticks, "element_line") + expect_s3_class(plot_boilerplate$theme$axis.ticks, "element_line") # axis ticks colour expect_true(plot_boilerplate$theme$axis.ticks$colour == "grey20") # axis line colour @@ -159,7 +159,7 @@ test_that("theme_boilerplate() has desired behaviour towards legend aesthetics", theme_boilerplate() # legend key - expect_type(plot_boilerplate$theme$legend.key, "element_rect") + expect_s3_class(plot_boilerplate$theme$legend.key, "element_rect") # legend key colour expect_true(is.na(plot_boilerplate$theme$legend.key$colour)) # legend key fill