From 386a5a975812036622e2074f69762faf29d65063 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Tue, 28 Jan 2025 20:25:59 -0500 Subject: [PATCH 01/12] Update code and tests to use hms instead of lubridate --- DESCRIPTION | 2 +- NAMESPACE | 2 +- R/utils.R | 2 +- R/zzz.R | 2 +- data-raw/data.R | 2 +- tests/testthat/test-read_dataset_json.R | 4 ++-- tests/testthat/test-utils.R | 2 +- tests/testthat/testdata/adsl_time_test.Rds | Bin 19350 -> 18931 bytes vignettes/converting_files.Rmd | 3 +++ 9 files changed, 11 insertions(+), 8 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 52b3602..ee0f5aa 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Depends: R (>= 4.0) Imports: yyjsonr (>= 0.1.18), jsonvalidate (>= 1.3.1), - lubridate + hms Suggests: testthat (>= 2.1.0), jsonlite (>= 1.8.0), diff --git a/NAMESPACE b/NAMESPACE index 5508b62..fa15f25 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -16,8 +16,8 @@ export(set_study_oid) export(set_variable_attributes) export(validate_dataset_json) export(write_dataset_json) +importFrom(hms,as_hms) importFrom(jsonvalidate,json_validate) -importFrom(lubridate,hms) importFrom(tools,file_path_sans_ext) importFrom(utils,tail) importFrom(yyjsonr,opts_read_json) diff --git a/R/utils.R b/R/utils.R index b128cd8..1294bd9 100644 --- a/R/utils.R +++ b/R/utils.R @@ -127,7 +127,7 @@ date_time_conversions <- function(d, dt, tdt){ as.POSIXct, tz = "UTC", tryFormats = "%Y-%m-%dT%H:%M:%S") - d[time_cols] <- lapply(d[time_cols], hms) + d[time_cols] <- lapply(d[time_cols], as_hms) d } diff --git a/R/zzz.R b/R/zzz.R index d6f89ed..55b3040 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -2,7 +2,7 @@ #' @importFrom yyjsonr opts_write_json opts_read_json write_json_file write_json_str read_json_str read_json_file #' @importFrom tools file_path_sans_ext #' @importFrom utils tail -#' @importFrom lubridate hms +#' @importFrom hms as_hms NULL #' @keywords internal diff --git a/data-raw/data.R b/data-raw/data.R index 05b60ab..e240520 100644 --- a/data-raw/data.R +++ b/data-raw/data.R @@ -89,7 +89,7 @@ time_options <- c("12:34:56", "15:34:34", "11:12:52", "21:16:11") adsl$VIST1TMC <- sample(time_options, 254, replace=TRUE) adsl$VIST1DTC <-paste(format(adsl$VISIT1DT, "%Y-%m-%d"), sample(time_options, 254, replace=TRUE), sep="T") -adsl$VISIT1TM <- lubridate::hms(adsl$VIST1TMC) +adsl$VISIT1TM <- hms::as_hms(adsl$VIST1TMC) adsl$VIST1DTM <- as.POSIXct(strptime(adsl$VIST1DTC, "%Y-%m-%dT%H:%M:%S", tz="UTC")) new_meta <- tibble::tribble( diff --git a/tests/testthat/test-read_dataset_json.R b/tests/testthat/test-read_dataset_json.R index 3e87440..3a181d6 100644 --- a/tests/testthat/test-read_dataset_json.R +++ b/tests/testthat/test-read_dataset_json.R @@ -84,11 +84,11 @@ test_that("datetime conversions work properly",{ iris_timetest <- read_dataset_json(test_path("testdata", "iris_timetest.json")) expect_s3_class(iris_timetest$Datetime, "POSIXct") - expect_equal(class(iris_timetest$Time), "Period", ignore_attr=TRUE) + expect_equal(class(iris_timetest$Time), c("hms", "difftime"), ignore_attr=TRUE) expect_equal(sort(unique(iris_timetest$Datetime)), as.POSIXct(strptime(c("2024-01-01T12:34:56", "2024-01-17T18:45:56"), "%Y-%m-%dT%H:%M:%S", tz="UTC"))) expect_equal(sort(unique(as.numeric(iris_timetest$Time))), - as.numeric(hms(c("12:34:56", "18:45:56")))) + as.numeric(as_hms(c("12:34:56", "18:45:56")))) }) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index c65ba10..579945d 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -42,5 +42,5 @@ test_that("Date, datetime and time conversions work as expected", { expect_equal(df_converted$datetime, as.POSIXct(c("2020-01-01 12:00:00", "2020-01-01 12:00:01", NA), tz = "UTC")) - expect_equal(df_converted$time, hms(c("12:00:00", "12:00:01", NA))) + expect_equal(df_converted$time, as_hms(c("12:00:00", "12:00:01", NA))) }) diff --git a/tests/testthat/testdata/adsl_time_test.Rds b/tests/testthat/testdata/adsl_time_test.Rds index dedfc6b2c7316cb12cffc3008dccdd2a05d13c7d..1a07e59a1518f00ddf3b0fd599aefee157265a24 100644 GIT binary patch literal 18931 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 O_x}S*RjIL8hXMdwr4G*k literal 19350 zcmZU(cRZWl7dURT6h*Dt@>VOgYt$C2QZ+)Ys-miDQ+p@WYHP$+Td3746?;ajR@7G1 zCT6YJ5lMV~zTe+}zvqwVKIfk2tb5OWz0N)70OD_v{ojXjFPtuq$2=oYTN3gk@djJ; zpSur)`!y_4A~&`MehX$x*BC&U@7>D&?Ux!kV33y`;r%DE0{HRc>X+~TbTw{R-n_wN zIeDvJOi!V0dB1qS3E0-@Z{;8UO>D_*>8f&GxoO`F^ktJ=9`v&^biZY@U|Q|m#KwFR z!23bxu1>U~9CG=4oiu+a8lt|CZ2pv|p?XgxLIRPQ0hfzQG^GL^?qTKy9sH{VPd zW_<6q1Urs%iGD4~kxyrfcL9F2(ta>K3$&4pPeerX8gN|(iGD@MJcl2?`PLUyrWyYKtW5$Q+u}^j?44!JsizvE^iaA#_3;#-|mp9Ye z8GGW^zM5GUpo*YjauOKQEtThA-IfCjt#Z{wd*G>9& zG_I2<;%D~6>(kh0xYKFu5FgMG5iO~s#eOekGQ>d8-&W6XFIqBOD@z?QCsuj+U|`B_ zD4@6A&rDalmSC=Xy=_&)Vqec^s^sfuLVoI&HpF`Cr->DeRzAI6xraR_G&XxT>MS`+ z51%~Csrb;mXslp#4}nPCznRKb=K+{DaiM2x`X95FV^_{~hB6tnnpnCCCu92XBCn65 znT3OwP<^b$(}}SsE}7rQb7nKCFROah3q~iC+I;OfGp0fkc3k^pa}b!;*$^QV5%bvtq6hZOJl8WKRY%MgU`M(1o>zZ#TgtDc zcC6N!9DYiA;?lnAk|?@8{3)|T(1G08cF@JlqE44>#MSIWg6{u#iHGv1{xQx}`H*RH zKT)*WRA}DUgR>_#G}x+0-k^7WcTb*7U)s^^xpqq+%F*np*VbZWhKal1OvRgT2(}5X z=i(L~W=}AVr7~Qi-#)mO`hQ7CLO=91Q?0)CzZT}!3L1SD`IMuZ*^@y+ z3xgDcwxvC(JdU;G4ka>N=JRSpe=BsJmOS}f&zH7e$1rF+SnAKp-GBBo@zlA5S=n5) z3?ai;p$P6djrGpd+53|mns2IG`@_;!)}>gu{LR?W*bM)O?tHnuNHsSvw0l@f4&{3+ z6!T+X8{QM`!zY{`C5_07pjqG22RhkmDeW?&?`Ih&HAVYW3#C&^Ao5<*tlzpuS!yZO zGoxKHjFT#(ebj~0qwXW}9@DG?p8%bVwUok`(Uob&Nx9KJ!-DCQ!iYR^n)SzeKqoyd zB^_q;c8YOQVziH~V0zR&MBW{mb?3)GCoL_d+t;#^jgw%}KKlaclmJBD$*uMGV4#zV zmeM2>+9k<2$vfHyDv%zQ zXeqsBLT`UGPBM@7DY%y&#fr!)y0yNg19TGBQW9rE-~V8o1djHRyq8YNgvg7&wSMaw z1<+DDxr26zGfq;9_UYtLkD^E9Ip10bY6G1(w3OQKpetjHlf3nPkkoh48 z2=}^ZB#If``vj;Wif}KDM#eFtH}rsQ!U*@QXe5LgO{E7^5kR+W-jn z&}ifm6IvGxRN+CmdqgA4nb2=^fo&WJce`k$7ZW=65m1E<;cgO*RA54v=>Xf95boO7 z`*R1~s|{3PK)B0CBm3^4H?)9lv

RXe9g&no0|(LXB|ej7D1CnQ&)T4WJ&AaKMZW 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 diff --git a/vignettes/converting_files.Rmd b/vignettes/converting_files.Rmd index 4f52b22..da89f74 100644 --- a/vignettes/converting_files.Rmd +++ b/vignettes/converting_files.Rmd @@ -49,6 +49,9 @@ extract_xpt_meta <- function(n, .data) { } else if (inherits(.data[[n]],"numeric")) { if (any(is.double(.data[[n]]))) out$dataType <- "float" else out$dataType <- "integer" + } else if (inherits(.data[[n]],"hms")) { + out$dataType <- "time" + out$targetDataType <- "integer" } else { out$dataType <- "string" out$length <- max(purrr::map_int(.data[[n]], nchar)) From 49c3a7d446db9f74a603dfcbc737a681fc16f2f2 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Tue, 28 Jan 2025 20:28:30 -0500 Subject: [PATCH 02/12] Catch vignette update --- vignettes/date_time_datetime.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vignettes/date_time_datetime.Rmd b/vignettes/date_time_datetime.Rmd index cbf81cf..e2db83e 100644 --- a/vignettes/date_time_datetime.Rmd +++ b/vignettes/date_time_datetime.Rmd @@ -43,8 +43,8 @@ tibble::tribble( In the table above, we have the metadata for both character and numeric dates, times, and date times. Both sets of variables have the same values within `dataType`. The difference is the optional field of `targetDataType`, where the value for the numeric variables is set to `integer`. Both `read_dataset_json()` and `write_dataset_json()` rely on these fields and as such they must be set properly. This comes with a few assumption and requirements. - Numeric dates will be converted into the type of `Date` (see `help("Date", package="base")`) -- Numeric times will be converted to the **{lubridate}** type of `Period` - - R doesn't have a specific built in type of time. We decided to take on **{lubridate}** as a dependency given package stability and **{lubridate}**'s inclusion in the tidyverse. The `Period` objects on read are produced using the `lubridate::hms()`. +- Numeric times will be converted to the **{hms}** type of `hms` + - R doesn't have a specific built in type of time. We decided to take on **{hms}** as a dependency given that this is the type using by the **{haven}** package when reading SAS Version 5 Transport files. As such, similar behavior can be expected when importing an XPT or a Dataset JSON file. - Numeric date times will be converted to the base R type of `POSIXct` and anchored to the UTC timezone. - CDISC dates are generally not timezone qualified, though for character dates, this is optional. Unless a timezone is explicitly specified systems may default to the user's current timezone. To decrease ambiguity, we've introduced a hard requirement that datetimes are anchored to UTC. If the datetime variable is found to be using a different timezone, an error will be thrown. From 2162edabd125111d364c47d6bada5fa815e20483 Mon Sep 17 00:00:00 2001 From: Nicholas Masel Date: Wed, 29 Jan 2025 13:16:10 +0000 Subject: [PATCH 03/12] hms as import only --- DESCRIPTION | 1 - 1 file changed, 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index ee0f5aa..7f22051 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -37,7 +37,6 @@ Suggests: purrr, tibble, dplyr, - hms, data.table VignetteBuilder: knitr Config/testthat/edition: 3 From 5a0f980cdc30606324668f95e2fc45e9e8093bf1 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 09:37:50 -0500 Subject: [PATCH 04/12] If only this was a magical fix --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 7f22051..295a434 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -37,6 +37,7 @@ Suggests: purrr, tibble, dplyr, + lubridate, data.table VignetteBuilder: knitr Config/testthat/edition: 3 From 02bb1620ca637967525ee623f00e6537990e9896 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 10:08:29 -0500 Subject: [PATCH 05/12] Maybe this? --- .github/workflows/R-CMD-check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index ffa63ca..39b45d0 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -65,7 +65,7 @@ jobs: while read -r cmd do eval sudo $cmd - done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "20.04"))') + done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "22.04"))') - name: Install dependencies run: | From 6b7318eebfd2f73aef9d645aae12cb99f3f983d3 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 10:15:34 -0500 Subject: [PATCH 06/12] Checking if this fixes pipeline --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 295a434..34ea1cb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,8 @@ Depends: R (>= 4.0) Imports: yyjsonr (>= 0.1.18), jsonvalidate (>= 1.3.1), - hms + hms, + lubridate Suggests: testthat (>= 2.1.0), jsonlite (>= 1.8.0), @@ -37,7 +38,6 @@ Suggests: purrr, tibble, dplyr, - lubridate, data.table VignetteBuilder: knitr Config/testthat/edition: 3 From d3f15d945c2a989b84809b79426dbacfafdedc1b Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 10:29:09 -0500 Subject: [PATCH 07/12] Why. --- .github/workflows/R-CMD-check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 39b45d0..bdd4619 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -70,7 +70,7 @@ jobs: - name: Install dependencies run: | remotes::install_deps(dependencies = TRUE) - remotes::install_cran("rcmdcheck") + remotes::install_cran("rcmdcheck", force = TRUE) shell: Rscript {0} - name: Check From 4bfc01c1fb4ffc6687692a26d26947ce6fcf0b28 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 10:45:42 -0500 Subject: [PATCH 08/12] Sigh --- .github/workflows/R-CMD-check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index bdd4619..b28d816 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -69,7 +69,7 @@ jobs: - name: Install dependencies run: | - remotes::install_deps(dependencies = TRUE) + remotes::install_deps(dependencies = TRUE, upgrade="always") remotes::install_cran("rcmdcheck", force = TRUE) shell: Rscript {0} From a3019a1076a0936adb676eef8508fe3ea77a2dde Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 11:05:03 -0500 Subject: [PATCH 09/12] Try pulling latest action from r-lib --- .github/workflows/R-CMD-check.yaml | 64 +++++++++--------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index b28d816..24bfcee 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -1,5 +1,5 @@ -# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. -# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: branches: @@ -12,7 +12,9 @@ on: - master - dev -name: R-CMD-check +name: R-CMD-check.yaml + +permissions: read-all jobs: R-CMD-check: @@ -32,56 +34,26 @@ jobs: - {os: ubuntu-latest, r: 'release'} env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true - - uses: r-lib/actions/setup-pandoc@v2 - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") - shell: Rscript {0} - - - name: Cache R packages - if: runner.os != 'Windows' - uses: actions/cache@v2 + - uses: r-lib/actions/setup-r-dependencies@v2 with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- - - - name: Install system dependencies - if: runner.os == 'Linux' - run: | - while read -r cmd - do - eval sudo $cmd - done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "22.04"))') - - - name: Install dependencies - run: | - remotes::install_deps(dependencies = TRUE, upgrade="always") - remotes::install_cran("rcmdcheck", force = TRUE) - shell: Rscript {0} - - - name: Check - env: - _R_CHECK_CRAN_INCOMING_REMOTE_: false - run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") - shell: Rscript {0} + extra-packages: any::rcmdcheck + needs: check - - name: Upload check results - if: failure() - uses: actions/upload-artifact@main + - uses: r-lib/actions/check-r-package@v2 with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results - path: check + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' From 660b5b5ab8507d7a6639a2261c7aae364c55dc76 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 11:10:10 -0500 Subject: [PATCH 10/12] Pull lubridate back out now that workflow is fixed --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 34ea1cb..295a434 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,8 +26,7 @@ Depends: R (>= 4.0) Imports: yyjsonr (>= 0.1.18), jsonvalidate (>= 1.3.1), - hms, - lubridate + hms Suggests: testthat (>= 2.1.0), jsonlite (>= 1.8.0), @@ -38,6 +37,7 @@ Suggests: purrr, tibble, dplyr, + lubridate, data.table VignetteBuilder: knitr Config/testthat/edition: 3 From 8cdddbe2106ee9ec1150fe99954335bd735c4f15 Mon Sep 17 00:00:00 2001 From: Michael Stackhouse Date: Wed, 29 Jan 2025 11:27:35 -0500 Subject: [PATCH 11/12] Update DESCRIPTION Co-authored-by: Nicholas Masel <61123199+nicholas-masel@users.noreply.github.com> --- DESCRIPTION | 1 - 1 file changed, 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 295a434..7f22051 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -37,7 +37,6 @@ Suggests: purrr, tibble, dplyr, - lubridate, data.table VignetteBuilder: knitr Config/testthat/edition: 3 From e1c4c4041bbd95ca4ad031b76f9bb7c24e817d87 Mon Sep 17 00:00:00 2001 From: mstackhouse Date: Wed, 29 Jan 2025 11:28:27 -0500 Subject: [PATCH 12/12] I think we'll eventually get this right. --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 7f22051..295a434 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -37,6 +37,7 @@ Suggests: purrr, tibble, dplyr, + lubridate, data.table VignetteBuilder: knitr Config/testthat/edition: 3