Skip to content

Move datasets to Zenodo with BiocFileCache caching - #10

Merged
lwaldron merged 3 commits into
develfrom
zenodo-refactor
Oct 3, 2026
Merged

lwaldron merged 3 commits into
develfrom
zenodo-refactor

Conversation

@lwaldron

@lwaldron lwaldron commented Oct 3, 2026

Copy link
Copy Markdown
Member

Replaces the ~380 MB of data/*.rda with on-demand download from Zenodo record 23125873, cached per-file in a package-specific BiocFileCache and verified against md5 checksums in inst/extdata/zenodo-manifest.csv. Same design as waldronlab/curatedCRCData#5:

  • New exported getter curatedOvarianData(): no args lists datasets, one name returns an ExpressionSet, several return a named list; test=TRUE loads small offline subsets bundled in inst/extdata/testdata/.
  • data(X) keeps working via data/*.R delayedAssign stubs that delegate to the getter with a once-per-session deprecation message; during this package's own check the stubs resolve to the offline subsets, so no network is needed. datalist is retained so installation doesn't execute the stubs, and BuildResaveData: no keeps R CMD build from doing so.
  • createEsetList.R loads through the getter (new test.mode config option); vignette runs end-to-end on the offline subsets, including the CXCL12 survival meta-analysis and ComBat examples, and documents caching.
  • RUnit scaffolding replaced with testthat; dead DFCI URL replaced with the GitHub URL, BugReports added, committed build/ PDF removed.
  • Verified: R CMD check Status: OK with tests (including a live download), and inst/scripts/data-integrity-report.Rmd confirms all 30 Zenodo objects are all.equal to the pre-refactor data/*.rda with md5s matching the Zenodo API.

The two Suggests-level dependents (doppelgangR, TOP) keep working through the data() stubs.

Closes #9

🤖 Generated with Claude Code

lwaldron and others added 3 commits October 3, 2026 11:16
Replace the ~380 MB of data/*.rda with on-demand download from Zenodo,
cached in a package-specific BiocFileCache and verified against md5
checksums in inst/extdata/zenodo-manifest.csv (placeholder URLs until
the Zenodo record is published):

- New exported getter curatedOvarianData(): no args lists datasets,
  one name returns an ExpressionSet, several return a named list;
  test=TRUE loads small offline subsets from inst/extdata/testdata/.
- data(X) stays working via data/*.R delayedAssign stubs that resolve
  through the getter (deprecation message once per session); during
  this package's own R CMD check they load the offline subsets, so
  checking needs no network. datalist retained so installation does
  not execute the stubs; BuildResaveData: no so R CMD build does not.
- createEsetList.R loads through the getter; new test.mode option in
  the patientselection configs; fixed which() on an empty eset list.
- RUnit scaffolding replaced with testthat; vignette updated to run on
  the offline subsets and document caching; replaced the dead DFCI URL
  with the GitHub URL and added BugReports; removed the committed
  build/ PDF.
- inst/scripts/: make-data.R, make-test-data.R (provenance; Zenodo
  upload preparation) and data-integrity-report.Rmd (verification).

Closes #9

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same fixes as curatedCRCData: make-data.R enumerates from the upload
directory when data/ holds only stubs, and the integrity report no
longer removes its comparison worktree prematurely (top-level on.exit
in a knitr chunk fires at the end of the expression, not the chunk).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
All 30 uploaded files verified: manifest md5s and sizes match the
Zenodo API, every object is all.equal to its pre-refactor data/*.rda
(inst/scripts/data-integrity-report.Rmd), and the full test suite
passes including a live download. R CMD check Status: OK.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 3, 2026 18:47
@lwaldron
lwaldron merged commit f9d01d5 into devel Oct 3, 2026
5 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The external-data migration and reverse-dependency compatibility need human verification, alongside resolution of the retained issues.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
What changed in this PR

Moves datasets to Zenodo to reduce package size for R-universe while preserving legacy data() access.

Changes:

  • Adds on-demand downloads with checksums and BiocFileCache caching.
  • Supports offline subsets for examples, tests, and vignettes.
  • Updates documentation, dataset selection, and migration tooling.
File Description
vignettes/​curatedOvarianData.Rmd Documents caching and uses offline examples.
tests/​testthat/​test-getData.R Tests manifests, getters, and caching.
tests/​testthat.R Adds testthat entry point.
tests/​runTests.R Removes RUnit entry point.
R/​getData.R Implements downloads, caching, and legacy loading.
NEWS.md Records migration changes.
NAMESPACE Exports getter and imports dependencies.
man/​curatedOvarianData.Rd Documents the getter.
man/​curatedOvarianData-package.Rd Updates package documentation.
inst/​unitTests/​test_counts.R Removes old dataset-count checks.
inst/​unitTests/​test_checkCurated.R Removes old metadata checks.
inst/​scripts/​make-test-data.R Generates offline fixtures.
inst/​scripts/​make-data.R Prepares uploads, manifests, and stubs.
inst/​scripts/​data-integrity-report.Rmd Adds migration integrity checks.
inst/​extdata/​zenodo-manifest.csv Records dataset URLs and checksums.
inst/​extdata/​patientselection.config Adds offline test-mode option.
inst/​extdata/​patientselection_all.config Adds offline test-mode option.
inst/​extdata/​createEsetList.R Loads datasets through getters.
external_data_store.txt Removes external-data directory listing.
DESCRIPTION Updates dependencies and build settings.
data/​TCGA.RNASeqV2_eset.R Adds legacy loading stub.
data/​TCGA.mirna.8x15kv2_eset.R Adds legacy loading stub.
data/​TCGA_eset.R Adds legacy loading stub.
data/​PMID19318476_eset.R Adds legacy loading stub.
data/​PMID17290060_eset.R Adds legacy loading stub.
data/​PMID15897565_eset.R Adds legacy loading stub.
data/​GSE9891_eset.R Adds legacy loading stub.
data/​GSE8842_eset.R Adds legacy loading stub.
data/​GSE6822_eset.R Adds legacy loading stub.
data/​GSE6008_eset.R Adds legacy loading stub.
data/​GSE51088_eset.R Adds legacy loading stub.
data/​GSE49997_eset.R Adds legacy loading stub.
data/​GSE44104_eset.R Adds legacy loading stub.
data/​GSE32063_eset.R Adds legacy loading stub.
data/​GSE32062.GPL6480_eset.R Adds legacy loading stub.
data/​GSE30161_eset.R Adds legacy loading stub.
data/​GSE30009_eset.R Adds legacy loading stub.
data/​GSE26712_eset.R Adds legacy loading stub.
data/​GSE26193_eset.R Adds legacy loading stub.
data/​GSE2109_eset.R Adds legacy loading stub.
data/​GSE20565_eset.R Adds legacy loading stub.
data/​GSE19829.GPL8300_eset.R Adds legacy loading stub.
data/​GSE19829.GPL570_eset.R Adds legacy loading stub.
data/​GSE18520_eset.R Adds legacy loading stub.
data/​GSE17260_eset.R Adds legacy loading stub.
data/​GSE14764_eset.R Adds legacy loading stub.
data/​GSE13876_eset.R Adds legacy loading stub.
data/​GSE12470_eset.R Adds legacy loading stub.
data/​GSE12418_eset.R Adds legacy loading stub.
data/​E.MTAB.386_eset.R Adds legacy loading stub.
data/​datalist Reorders dataset index.
.Rbuildignore Excludes website and citation metadata.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +81 to +86
unlink(tools::R_user_dir(pkg, "cache"), recursive = TRUE)
eset <- getter(smallest) # downloads
stopifnot(is(eset, "ExpressionSet"))
eset2 <- getter(smallest) # must hit the cache silently
stopifnot(identical(dim(eset), dim(eset2)))
dim(eset)
Comment on lines +73 to +74
expect_silent(suppressMessages(
eset2 <- curatedOvarianData("GSE30009_eset")))
lwaldron added a commit that referenced this pull request Oct 3, 2026
- Verify cached files by size on every load (cheap truncation check);
  evict and re-download on mismatch. Full md5 still runs after each
  fresh download.
- Stub test now forces the delayed binding under the check guard and
  asserts the class, instead of exists(), which never forces.
- Drop suppressMessages() inside expect_silent() so a regression that
  re-downloads on a cache hit fails the test.
- Integrity report smoke test uses a throwaway R_USER_CACHE_DIR instead
  of deleting the user's real package cache.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@lwaldron

lwaldron commented Oct 3, 2026

Copy link
Copy Markdown
Member Author

Copilot's review addressed in 9530aca (pushed to devel as 1.51.3): the integrity report now uses a throwaway R_USER_CACHE_DIR instead of deleting the user's real package cache, and suppressMessages() no longer defeats expect_silent() in the cache-hit test. Also applied the same fixes as waldronlab/curatedCRCData#5 (size check on cached files, stub test forces the binding), since the two packages deliberately share this code.

🤖 Drafted with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Move data products to Zenodo

2 participants