Thanks for contributing. This guide covers the development workflow, the
changelog convention, and the checks a pull request must pass. GEOquery is a
Bioconductor package; devel is the working branch.
Not every change needs an issue — file one where it helps users and contributors, not as ceremony.
- Bug, feature, or behavior change → open an issue first (or link an
existing one), then reference it from the PR with
Fixes #123. These are user-facing, so they also get aNEWS.mdbullet that links both the issue and the PR. For bugs, include a GEO accession + reproducible example +sessionInfo()(the bug issue form prompts for these). - Chore, CI, docs, or refactor → a pull request alone is fine. No issue
needed; use a
chore:/ci:/docs:/refactor:commit prefix.
Planned work is tracked on the 3.0 milestone;
see ROADMAP.md for the broader plan.
- Start work off
devel:git switch -c fix/issue-123 devel. - Make the change. Keep PRs focused — one logical change per PR.
- Reload and test locally:
devtools::load_all(".") devtools::test() # or devtools::test(filter = "GSE") for one file
- Regenerate docs if you touched roxygen:
devtools::document() # updates man/ and NAMESPACE — never hand-edit these
- Update
NEWS.md(see below) and bump the version (see below). - Push (
git push -u origin fix/issue-123) and open a pull request againstdevel. The PR template's checklist is the contract; CI runsR CMD checkacross a platform matrix. - Merge when the required checks are green. (
develis branch-protected; the required legs are the Ubuntu and macOSR CMD checkjobs.)
The vignettes hit the live NCBI GEO network, which must not happen during
R CMD build/check on CRAN/Bioconductor build machines. So each vignette is
authored in a vignettes/<name>.qmd.orig source (with live eval: true code)
and precompiled into the shipped static vignettes/<name>.qmd, which has the
real output baked in and executes nothing at build time. (This is the knitr
*.Rmd.orig pattern; Quarto's freeze does not help here, because the vignette
engine renders each file individually and freeze only applies to full-project
renders.)
Do not edit vignettes/*.qmd directly — they are generated. To change a
vignette:
- Edit the
vignettes/<name>.qmd.origsource. - Regenerate (with network access and the
Suggestsdeps installed):Rscript dev/precompute-vignettes.R # all vignettes Rscript dev/precompute-vignettes.R rnaseq # just one
- Commit both the
.qmd.origsource and the regenerated.qmd.
Refresh whenever you change a vignette's code, or periodically to pick up
GEO-side changes. Chunks that can't run at precompile time (private-token
examples, very large single-cell downloads, Seurat coercions, pure pseudo-code)
are marked #| eval: false in the source and carry hand-written output.
We follow the tidyverse NEWS style.
Every user-facing change gets one bullet in NEWS.md under the top
# GEOquery (development version) header (this header is renamed to the release
version at release time).
Rules:
- Write a complete sentence describing the change from the user's perspective. Put function/argument names in backticks.
- End every bullet with the PR link, and credit the contributor:
* `getGEO(parseCharacteristics = FALSE)` no longer parses characteristics; the flag is now threaded through `parseGSEMatrix()` (#166, @reporter).
- Group bullets under
## Breaking changes,## New features, or## Bug fixesonly once there are enough to warrant it; otherwise a flat list is fine. Most recent entries at the top. - The
#NNNand@userreferences autolink in the pkgdown changelog and on GitHub (the repo URL comes fromDESCRIPTION). - Skip NEWS for CI-only or internal-only changes (nothing user-visible).
Bump Version: and Date: in DESCRIPTION on every code PR, following the
Bioconductor convention (increment the z in x.y.z during the devel cycle).
Build-excluded changes (anything matched by .Rbuildignore, e.g. .github/,
CONTRIBUTING.md, ROADMAP.md) do not require a version bump.
R CMD check— no errors or warnings.BiocCheck::BiocCheck()— Bioconductor-specific requirements.lintr::lint_package()— style (config in.lintr).
Non-trivial architectural decisions are recorded as ADRs in adr/ — numbered
NNNN-title.md, copied from adr/template.md. Add one when a PR changes a parse
path, a return type, a dependency, or makes a notable trade-off. Small,
self-explanatory changes don't need an ADR; a decision you'd otherwise re-litigate
in a future PR review does.
These four artifacts answer different questions, and each points at the others so any one of them leads to the whole story:
- Issue — why (the user problem / requested behavior). Opened first for bugs, features, and behavior changes (see Issues vs. pull requests).
- ADR — what we decided and why (the design). Needed only when the change is architectural.
- NEWS — what changed, for users.
- PR — the implementation that ties them together.
Conventions:
- PR → issue. Put
Fixes #NNNin the PR body so the merge closes the issue. - PR → ADR. If the PR realizes a decision, say
Implements ADR-XXXXin the body. - ADR → issue/PR. In the ADR's Context, link the motivating issue(s) as
#NNN; fill inDeciders, and setStatus: acceptedwhen the PR merges. To revise an accepted ADR, write a new one that supersedes it and set the old one's status tosuperseded by ADR-YYYY(never edit an accepted ADR's decision). - NEWS → PR/ADR. End each user-facing bullet with the PR link, and cite the
ADR when one drove the change, e.g.
... (see ADR-0007) (#154).
So the full chain reads: issue → ADR (links the issue) → PR (Fixes #NNN,
Implements ADR-XXXX) → NEWS bullet (… (see ADR-XXXX) (#PR)). For a change
with no architectural decision, drop the ADR link and keep issue ↔ PR ↔ NEWS.
Open an issue with a GEO accession, a minimal reproducible example, and
sessionInfo(). Most GEOquery bugs are specific to how one record is formatted
on NCBI, so the accession is essential for reproduction.