From d6ccefff9f5dbfe22a2a3d04dec194230af07a49 Mon Sep 17 00:00:00 2001 From: bbuchsbaum Date: Thu, 13 Aug 2026 08:17:32 -0400 Subject: [PATCH] Harden pkgcheck and CI paths --- .DS_Store | Bin 6148 -> 0 bytes .github/workflows/test-coverage.yaml | 11 ++++---- .gitignore | 1 + NEWS.md | 5 ++++ R/all_generic.R | 11 ++++++++ R/mock_bids.R | 10 ++++--- R/pack_bids.R | 2 +- inst/.DS_Store | Bin 6148 -> 0 bytes inst/extdata/.DS_Store | Bin 10244 -> 0 bytes man/dataset_name.Rd | 12 +++++++++ tests/testthat/test_mock_bids.R | 22 +++++++++++++++ tests/testthat/test_vignette_resilience.R | 31 ++++++++++++++++++++++ vignettes/quickstart.Rmd | 3 ++- 13 files changed, 97 insertions(+), 11 deletions(-) delete mode 100644 .DS_Store delete mode 100644 inst/.DS_Store delete mode 100644 inst/extdata/.DS_Store create mode 100644 tests/testthat/test_vignette_resilience.R diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 30b2657427b074c7368ab2411e98c20dc3ed10fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O0O({YSiXIod7OYVU;w8lT0!H+pQWH`%7_+5G&7l->)fe(jd>&_Z zH)1ho5jz9B-~8@oKgj+t#<)L^4;gb9V>UEIj!J`|yD`)<$%q`sh{}8#r7{Bh-NgPn z;I~^WVHwL=@%{UwX`1B4VDQ0PZEIt*V|VPHeHT2+GAP1gp8MhK2CYje)2PBOJB~jI9IiS4%l70J9c&#i=o>WuIn!QVsYXQ`r`O# zxLkJao&AH;i}6$XoXJmDvOM>ijy7kQg8ahyh|?jTtb9 zg56tV4ruAb05Qg(x|o$=bTmFVpzQUo9bv z7$64z83WuJ1tT98WzNHq1WKRWkT%Znlp212Zj)Hzw Q4oDXPMF@4oz%MZH3Df>cI{*Lx diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 0ebf3385..2d236452 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -9,7 +9,9 @@ on: name: test-coverage.yaml -permissions: read-all +permissions: + contents: read + id-token: write jobs: test-coverage: @@ -39,10 +41,9 @@ jobs: covr::to_cobertura(cov) shell: Rscript {0} - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 with: + use_oidc: true fail_ci_if_error: ${{ github.event_name != 'pull_request' && true || false }} - file: ./cobertura.xml - plugin: noop + files: ./cobertura.xml disable_search: true - token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4ca58309..0a25af48 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .Rhistory .RData .Ruserdata +.DS_Store old repomix.* Rplots.pdf diff --git a/NEWS.md b/NEWS.md index fb539b4b..1703b9fc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,10 @@ # bidser 0.5.0 +* Allow `create_mock_bids()` to construct an empty project when + `file_structure` has the required columns but zero rows. +* Make the quickstart vignette exit cleanly when its example dataset cannot be + downloaded, instead of passing a missing path to `bids_project()`. + * `read_sidecar(inherit = TRUE)` now anchors on the imaging scans matching the query and resolves each scan's effective metadata via BIDS inheritance, returning one row per scan. Previously it anchored on JSON sidecar *files*, so diff --git a/R/all_generic.R b/R/all_generic.R index 12c00f91..7aca7c30 100644 --- a/R/all_generic.R +++ b/R/all_generic.R @@ -968,6 +968,17 @@ read_dataset_description <- function(x, ...) { #' @param ... Additional arguments passed to methods. #' @return A character scalar. #' @export +#' @examples +#' desc_dir <- tempfile("bids-description-") +#' dir.create(desc_dir) +#' writeLines( +#' '{"Name":"Example Dataset","BIDSVersion":"1.9.0","DatasetType":"raw"}', +#' file.path(desc_dir, "dataset_description.json") +#' ) +#' desc <- read_dataset_description(desc_dir) +#' dataset_name(desc) +#' dataset_type(desc) +#' unlink(desc_dir, recursive = TRUE) dataset_name <- function(x, ...) UseMethod("dataset_name") #' @rdname dataset_name #' @export diff --git a/R/mock_bids.R b/R/mock_bids.R index f54ba38c..7db9d1a7 100644 --- a/R/mock_bids.R +++ b/R/mock_bids.R @@ -522,7 +522,7 @@ create_mock_bids <- function(project_name, generated_event_paths <- character() # Keep track of event files defined generated_confound_paths <- character() # Keep track of confound files defined - for (i in 1:nrow(file_structure)) { + for (i in seq_len(nrow(file_structure))) { row <- file_structure[i, ] # Extract all potential BIDS entities from the row @@ -689,9 +689,11 @@ create_mock_bids <- function(project_name, if (row$fmriprep) { prep_dir_parts <- strsplit(prep_dir,"/")[[1]] # Check if path_parts start with prep_dir_parts and remove them - if (length(path_parts) >= length(prep_dir_parts) && - all(path_parts[1:length(prep_dir_parts)] == prep_dir_parts)) { - path_parts <- path_parts[-(1:length(prep_dir_parts))] + prep_dir_index <- seq_along(prep_dir_parts) + if (length(prep_dir_parts) > 0L && + length(path_parts) >= length(prep_dir_parts) && + all(path_parts[prep_dir_index] == prep_dir_parts)) { + path_parts <- path_parts[-prep_dir_index] } } diff --git a/R/pack_bids.R b/R/pack_bids.R index 7e7a46d1..5b99e7fc 100644 --- a/R/pack_bids.R +++ b/R/pack_bids.R @@ -915,7 +915,7 @@ list_pack_bids <- function(archive_path, verbose = TRUE) { # We need to extract to temp dir to get file sizes temp_extract <- tempfile("bids_list_") dir.create(temp_extract) - on.exit(unlink(temp_extract, recursive = TRUE)) + on.exit(unlink(temp_extract, recursive = TRUE), add = TRUE) untar(archive_path, exdir = temp_extract) diff --git a/inst/.DS_Store b/inst/.DS_Store deleted file mode 100644 index 9029965ed97bdaeaa8c2727403ceec0ee74823c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O8O({YSiXIod7OYVU;w8lT0!H+pQWFw17_+5GtxyWN>I?ZMK94iI z8?YMiCSqq`^UcoB?#>6rqMoQHe<|!hR9K=5j5Aj8YUQ#t1$vruppe}<1nom z=r5XZ?QIsbXIOc}KCNGd;CTzjX_6QH{yT3pTWjlWt8I0y8~bXIL@Lc z=0{GyCk_t=i$%xU+TA-o8$G0tnS9Yqav)vFhQSJ6LHSbDlRwE)ncab>%BrFXi2-7O z7$62#i~(~HSltz?o602yh=HFO!2Ll$Lv#(68r9YTAG|)JzlDebI=&?kg+bR~sS!LN zT&Du+RBoOaT&IIwm^jy9sZpmhu4aaD%*@r}g{#@YE>t+wnGlsQ|!m4|1ofOZQF1>;IoKtNx*1V9J(ksamKet|l~ Yxduy(I11WTIv`yH6e08>27ZBo4>#6KNdN!< diff --git a/inst/extdata/.DS_Store b/inst/extdata/.DS_Store deleted file mode 100644 index 45c5826aa36e7e351d72dcc61cfa3cce9bf8924b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMPiz!b82`Sdz?-3^(^6nTN+&FhMHkrJmO?Gyc8dlgNJ9&4`M2!ujC5pnrtZvk zfn`nO!3YvPp$Vu54-&&k&=?OIjThrV6D5jXj0Z19J$S+B#qZ6Vt=rO#2NN|gZ}Z;w z-uJz4X1?G1&AfbX0RU4)Ee@ap0HeyK(n!rbh1+?(qlA1-Gf5@v&$e{ewQQ+t>8)$oTGz6zuBESz zC0-{U(nC+SNa$Bo6l#?XR>g^Lz5Nn%nHJ2pIFmxkSpTXa&H!Vzy| zXnNM~kJz?3)6ZlN8G0$Lv<=#pn=vfCP&57Ls9|Y#DP*Sk?#Sye74 z5`9rM-nXR^Rm<^2j0U~&ZIudRD?8&m_MFI{Ia@wgdHS+gK=eO?z*n!fT%mzjGcQKd znHm%^h6>dfZ_UIgF9|=|Chs0Ia<(;WoYm7xvqJ&zq2W+LpQ3O^bGBK`TTWVO$z{x3 z(agB|fNAo{&X}v8c6slxV;9^(Z(>?eijICjr+LPdzKdp)Yb(Ff{z=!cE$5J4a7ady zG4a&WwZ`SEJ0e{h6I-_r+-zFftjMi$+vt?x7+F(4STZzsVm#yIbW1a=lZOd>%Qc=b z^n%n9Ixme_nY?~eS=!vRVr4iyR?Het6%F@{5@AeSYfX5qq`bq9YV;)gY>j(ro+Z2{ zypFLWTt8UQsTFFuGkm|KWY~y9afwSjAV(#|kw#9@3JTZFa-1oebkNLXbyKK%2=&fzk}03C#Jc`tsaCn^S2Q*FB z7-NxSmyeUe_s3PR4tiia48b_Pu_d?&m*6FM9j?I*cn>~?&){?T0=|S>@ICwpKf%xN z3*3g^;CJ`~8Ma_6F2fG&!VUN!Mlp^LVL$G`oj8blaUbr-Av}a>Jb_uv;VE>nh^O%k zK7-HWMSKBY#MkgDzJ=HE2EL8&;|Jo=LRBvA5#wr$A5w2N7yb7wG&&y_+lhi|`PxWVG~U~voLRd$%QcHpwKVdWBdFm~rb-DxRif#t)%VHm2Z>Dj>ACc- z(q382X~S;v*&S+oyTbV*hU+`qWd(`Sl4sq}N!E~W+qj8r3y8hKmgtt-m4!r9;kk92 zEGrGfWMSRDgRF~)v%)%%A}jEBN~$4UUCO-)*Wn|g+qdu?{6JLu6>cNoB5cGJxE586 z;Ck%DO&G%jc4H5b>|q?hlt;A3J)(`{5j=*+iEb14B$}8<3rj?{GM>W-vIg&v8dY9-CL