This article is the checklist for preparing, testing, and cutting a new release of the EJAM R package, and for the updates that have to go out with it in the related repositories and hosted services. It covers what has to happen, in what order, and why. For the detailed mechanics of deployment and of building datasets, it points to the articles that already document them.
The current development version is 3.2022.3 (ACS 2018-2022 data, ejamdata release v3.2022.3). The examples below use the v3.2022.3 release of October 2026.
Related articles:
-
Updating datasets, including
the
ejamdataArrow release assets and refreshing FRS data - Updating EJSCREEN datasets annually (via the pipeline)
- Updating documentation
- GitHub Actions install tests
- Deploying the web app to AWS (infrastructure, routine deploys, rollback, logs) and Deploying the web app (options and parameters)
- Using the EJAM API
What a release involves
An EJAM release is a tagged version of the R package, but the package is only one of several things that carry the version number and have to move together:
| Component | Where | What changes at a release | Documented in |
|---|---|---|---|
| EJAM R package | Public-Environmental-Data-Partners/EJAM, branches
development → main, tag
vX.YYYY.Z
|
Version fields, NEWS, README, docs; the GitHub Release | This article |
| Large datasets | Public-Environmental-Data-Partners/ejamdata GitHub Release assets
(11 .arrow files) |
A new data release only if bgej, FRS, or block
geography data change |
Updating datasets |
| EJAM web app (dev and production) |
dev-deploy and prod-deploy branches of the
EJAM repo (AWS ECS Fargate) |
Dockerfile pins EJAM_VERSION and
EJAMDATA_VERSION
|
Deploying to AWS |
| EJAM-API | Public-Environmental-Data-Partners/EJAM-API (Google Cloud Run) | Dockerfile default EJAM_VERSION, then a manual image
build and deploy |
EJAM-API README.md
|
| EJSCREEN web app | Public-Environmental-Data-Partners/EJScreen (Azure) | The displayed version number, then a manual deploy | EJScreen README.md
|
| Documentation site | GitHub Pages, built by pkgdown | Rebuilt automatically from main when the Release is
published |
Updating documentation |
The web app, EJAM-API, and EJSCREEN each install or display a specific EJAM version. Nothing updates them automatically when the package is released; each one needs its own small change and deploy.
Version numbers
EJAM versions are
MAJOR.ACSENDYEAR.PATCH. The middle field
is the end year of the American Community Survey (ACS) 5-year data the
release uses, not a minor version number:
-
3.2022.3: major version 3, ACS 2018-2022 data, third patch. -
4.2024.0: major version 4, ACS 2020-2024 data, first release on that data.
Two data vintages can be supported at once. The highest version is the live line where development continues, and the older line can be frozen (for example, v3.2022.3 is the final ACS 2018-2022 release).
Conventions and the guard that enforces them:
-
Git tags carry a
v(v3.2022.3). TheDESCRIPTIONVersionfield does not (3.2022.3). The same applies toejamdatarelease tags, which do carry thev. -
The version and the data vintage must agree. The
release workflow reads
VersionACSfromDESCRIPTIONand refuses to release if the version’s middle field is not the end year ofVersionACS(for example,4.2024.0withVersionACS: 2018-2022is blocked). So a new ACS vintage’s version number has to land in the same commit as its data. -
A patch release (
3.2022.2→3.2022.3) keeps the vintage and may change code, documentation, or data corrections. A vintage release (3.2022.x→4.2024.0) swaps the ACS data and follows the annual pipeline article first.
Where the version appears
Update these in the version-bump commit:
| File | Field | How it’s updated |
|---|---|---|
DESCRIPTION |
Version, VersionEJSCREEN,
VersionDate (e.g. October 2026),
ReleaseDateEJAM, ReleaseDateEJSCREEN
|
By hand. These drive the report footer, citation, docs footer, and metadata stamps. |
DESCRIPTION |
VersionACS, ReleaseDateACS,
VersionCensus
|
By hand, only when the data vintage changes. |
DESCRIPTION |
ejamdata_required_tag
(e.g. v3.2022.3) |
By hand, only when a new ejamdata release is needed
(see Data). |
CITATION.cff |
version, date-released
|
By hand. |
inst/golem-config.yml |
golem_version |
By hand; nothing regenerates it. |
README.Rmd |
the About vX.YYYY.Z (Month YYYY) section |
By hand, then knit to README.md. |
NEWS.md |
the # EJAM X.YYYY.Z (Month YYYY) heading |
By hand (see NEWS). |
_pkgdown.yml |
versionmsg, datefooter
|
Filled from DESCRIPTION by
EJAM:::pkgdown_update(). |
inst/CITATION |
title and year | Read from DESCRIPTION at run time; no edit needed. |
Afterwards, search the whole repository for the previous version
string (for example git grep -n "3\.2022\.2"), because
older files, examples, and comments sometimes contain it as fixed
text.
If the release date slips, update VersionDate, both
ReleaseDate* fields, CITATION.cff, the NEWS
heading, and the README heading together. The report footer date comes
from DESCRIPTION.
Branches and the release flow
All work is merged into development.
main changes only when a release is cut,
through one pull request that brings development into
main. main is what the release is tagged from
and what the documentation root is built from.
feature branches ──PR──► development ──(release PR, merge commit)──► main ──► tag vX.YYYY.Z
▲ │
└──────── back-merge after the release ──┘
The release sequence:
-
Plan and prepare on
development: data, version bump, NEWS, README, documentation (the next two sections). -
Freeze
development. From here until the tag exists, merge only fixes needed for the release. For a small team this is an agreement, not a branch rule. - Test the release candidate locally, in CI, and on the dev web app.
-
Merge the release pull request into
main, then tag and publish with the release workflow. - Deploy and update the related repositories: web app (dev, then production), ejamdata “Latest” flag if needed, EJAM-API, EJSCREEN.
-
Back-merge
mainintodevelopmentand clean up.
Two rules make this work:
-
Closing keywords only take effect in pull requests merged
into
main(the default branch).Fixes #123in a pull request merged intodevelopmentlinks the issue but does not close it. RepeatCloses #Nin the release pull request for every still-open issue fixed ondevelopment(see Cut the release). -
Merge the release pull request with a merge commit, never a
squash. A squash leaves
mainwithoutdevelopment’s history, and every conflict resolved in this release comes back at the next one.
The ACS vintage branches (ACS2022, ACS2023,
ACS2024) hold earlier vintage-specific work. Keep them
until the next vintage release has shipped and been verified.
Data changes and the ejamdata release
Skip this section for a code-only release. If any data change, do it first, before the version bump, because the tests and example outputs depend on it.
Packaged datasets (data/*.rda,
installed with the package):
- For an annual ACS/EJSCREEN update, follow Updating EJSCREEN
datasets annually and copy the accepted pipeline outputs into the
package (
blockgroupstats,usastats,statestats, andavg.in.us, which is derived fromusastatsbydata-raw/datacreate_avg.in.us.R). - For a fix to published data (as in v3.2022.3, which corrected the
language counts in
blockgroupstats), replace only the affected objects and add a test that would have caught the error. - Restamp the metadata attributes with
data-raw/datacreate_1_metadata_update.R(viametadata_add(); the defaults come fromDESCRIPTIONthroughR/metadata_mapping.R), then runEJAM:::metadata_check()andEJAM:::metadata_check_print(). The stamps (ejam_package_version,acs_version,ejscreen_version, and so on) should match the newDESCRIPTION.
The ejamdata release (the 11 large
.arrow files, downloaded by EJAM on first use):
- A new
ejamdatarelease is needed whenbgej(the EJ indexes, which must come from the same build as the newusastats/statestats), the FRS facility files, or the block geography files change. A code-only EJAM release can keep using the existing data tag. -
Every data release must contain all 11 files,
including unchanged ones, because EJAM downloads everything from the
single tag named in
ejamdata_required_tag. See Every release must contain all 11 Arrow files. - The
.arrowfiles store the same version attributes as the packaged data (attributes()on a loaded table shows them). When unchanged files are carried into a new data release, restamp them withdata-raw/datacreate_ejamdata_arrow_restamp.R. It reads the stamps fromDESCRIPTION, keeps source dates such asdownload_date, and stops if any data value would change. Run it withRscript --vanillaafter updatingDESCRIPTION. It does not attach EJAM, because attaching tries to download the data release thatDESCRIPTIONnames, which may not be published yet. - Publish the release (see the “How New Versions of Arrow Datasets Are Republished / Released” section of Updating datasets), then check its asset names and sizes. Never edit or delete an older data release: earlier EJAM versions are pinned to it.
-
Every pin must name the same data tag, or EJAM
re-downloads about 1 GB of data at startup:
-
DESCRIPTIONejamdata_required_tag -
data/ejamdata_version.txt(the local marker; see Keep the data tag and local marker in sync) -
ARG EJAMDATA_VERSIONin theDockerfileon both thedev-deployandprod-deploybranches - EJAM-API needs no separate pin: its image installs EJAM, which
downloads the data release named in the installed
DESCRIPTION.
-
- Decide which data release should be marked Latest
in the
ejamdatarepository. EJAM itself usesejamdata_required_tag, not “Latest”, but people browsing the repository see the Latest one first.
Test fixtures and example outputs. Many tests compare current output exactly against saved objects, so after any data change (and any change to calculations), regenerate them and then run the full test suite:
-
data-raw/datacreate_testpoints_testoutputs.R(thetestoutput_getblocksnearby_*,testoutput_doaggregate_*, andtestoutput_ejamit_*objects) data-raw/datacreate_testoutput_ejamit_fips_.Rdata-raw/datacreate_testoutput_ejamit_shapes_2.R- the example reports and spreadsheets in
inst/testdata/examples_of_output/(viaejam2excel(..., save_now = TRUE, overwrite = TRUE, launchexcel = FALSE, interactive_console = FALSE)andejam2report(..., fileextension = "html")or"pdf")
Regenerate them from the new data rather than copying fixtures from another branch, which may be stale.
Prepare the release on development
Work on a short-lived branch (for example
v3.2022.3-version-bump) and merge it into
development through a pull request, so CI and review run on
it.
- Version fields: everything in Where the version appears.
-
Documentation: run
devtools::document()so every help file matches the code. A stale.Rdfile shows up as aWARNINGinR CMD check. Then runEJAM:::pkgdown_update()(see Updating documentation), which also refreshes the version in_pkgdown.yml. -
README: update the “About” section in
README.Rmdand knitREADME.mdin the same pull request. -
Dependencies: consider raising minimum versions in
ImportsandSuggestsif the release relies on newer package behavior. - NEWS: see the next section.
NEWS and the release notes
The release workflow publishes the section of
NEWS.md whose heading matches the version as the
GitHub Release notes. So the NEWS file is both the changelog and the
release announcement:
- Use one top-level heading per release:
# EJAM 3.2022.3 (October 2026). The workflow finds it by the version number, with or without av, so the month in parentheses is fine. - Keep entries short: one or two sentences each, with the issue or pull request number. Put causes and mechanisms in the pull request, not the changelog.
- Put each entry in the section of the release that actually ships the change. An entry left under an earlier release’s heading drops out of the new release notes. (In v3.2022.3, a web-app ETA entry sitting under 3.2022.2 had to be moved.)
- Mention data changes plainly, since users compare numbers across releases.
Test the release candidate
Test the exact code that will be tagged, in three places.
Locally, with the new data installed:
- the full test suite (
devtools::test()orEJAM:::test_ejam()); adding or renaming a test file requires updating the groups inR/test_ejam.R -
devtools::check(), which also runs every help-page example - the examples in the articles, especially any that use changed
datasets (for example, render the FRS-dependent articles after an FRS
refresh; a check with
vignettes = FALSEdoes not cover them)
In CI. Opening a pull request into main
automatically runs R CMD check on macOS, Windows, and
Ubuntu (the release, oldrel-1, and
devel versions of R), the web-app shinytest2
suite, the quick install check, and lintr:
- A test that needs the internet (for example scraping naics.com or
downloading Census boundaries) can fail on a GitHub runner for network
reasons. If the failure message says so, re-run just the failed job with
gh run rerun <run-id> --failed, or from the Actions page. - An R-devel-only failure usually signals a deprecation that will
reach the released R later. It is usually a small fix and worth making
(v3.2022.3 fixed a deprecated
structure(.Names = ...)call). - The full install matrix
(
install-release-user-check.yaml) runs when the tag is published. See GitHub Actions install tests.
On the dev web app. Deploy the candidate to the
development server before tagging. The dev deploy workflow accepts any
branch, tag, or commit through its ejam_version input:
gh workflow run "Build & Deploy to ECS Fargate (dev)" \
--repo Public-Environmental-Data-Partners/EJAM --ref dev-deploy \
-f ejam_version=developmentThe ejamdata tag used by the image is the
EJAMDATA_VERSION default in the dev-deploy
Dockerfile, which the dispatch cannot override. If the data release
changed, first merge a pull request into dev-deploy that
updates that pin. Merging it deploys immediately, so don’t also
dispatch; see the warning in Deploy the web
app.
Then check, in a fresh browser tab:
Cut the release
The release pull request
Open a pull request from development into
main. If main has commits that
development lacks (for example, a hotfix or
release-workflow change made directly on main), GitHub
reports conflicts. Resolve them once, either by merging
main into development or, as for v3.2022.3, on
an integration branch cut from main that merges
development, then use that branch for the pull request. In
both cases, take development’s version of each file unless
main holds something development lacks.
In the pull request description:
- summarize the release, or point to the NEWS section
- add
Closes #Nfor every still-open issue fixed ondevelopment. To find them, list the pull requests merged intodevelopmentsince the last release and scan their titles and descriptions for issue numbers (including bare#Nmentions, not only “Fixes #N”), then keep those issues that are still open.
When the dev app is accepted, merge with a merge
commit. --admin does not check anything for you,
so first confirm, for the pull request’s current head
commit, that:
Then merge, guarding against last-minute pushes:
gh pr view <PR> --repo Public-Environmental-Data-Partners/EJAM --json headRefOid --jq .headRefOid
gh pr merge <PR> --repo Public-Environmental-Data-Partners/EJAM --merge --admin \
--match-head-commit <full SHA printed above>Why --admin: the branch rules on
main include one that lets only the repository’s admin and
maintain roles update the branch. That makes every merge into
main, even a fully ready one, show as blocked and need
--admin. They do not require any status checks, so
--admin bypasses no check that GitHub would otherwise
enforce. It also means GitHub enforces none of them, which is why the
list above must be checked by hand. --match-head-commit
makes the merge fail if anyone pushed after you checked. If a check has
failed or a thread is unresolved, do not merge: fix it, or record in the
pull request why it is being accepted and who approved that.
Tag and publish: the release workflow
The “Release: tag and publish” workflow
(.github/workflows/release.yaml) creates the tag and the
GitHub Release. It only runs when started by hand; there is deliberately
no scheduled release. Always do a dry run first:
# Dry run: creates nothing. Read the job summary: tag, title, and release notes.
gh workflow run release.yaml --repo Public-Environmental-Data-Partners/EJAM --ref main \
-f expected_version=3.2022.3 -f dry_run=true -f mark_latest=true
# Publish
gh workflow run release.yaml --repo Public-Environmental-Data-Partners/EJAM --ref main \
-f expected_version=3.2022.3 -f dry_run=false -f mark_latest=trueWhat it does:
- reads
VersionandVersionACSfromDESCRIPTIONonmain, and stops ifexpected_versiondoes not match, or if the version and vintage disagree - if a draft Release for that version already exists,
publishes the draft as it is (its reviewed title and notes are kept);
otherwise creates tag
vX.YYYY.Zand a Release titled like “EJAM v3.2022.3 (ACS 2018-2022)”, with the matching NEWS section as the notes - never changes a Release that is already published, so re-running is safe
- marks the Release Latest if
mark_latest=true(usefalsewhen releasing a patch to an older, frozen line while a newer line is live) - starts the documentation build (pkgdown) and the release install checks
If a draft Release exists, check its target before the real
(non-dry-run) run. Publishing a draft creates the tag at the
draft’s target, which is set when the draft is made and
does not follow main, so a draft made before the release
pull request merged would tag the wrong code. The workflow guards
against this: the dry-run summary shows the draft’s target next to the
head of main and fails if they differ, and the real run
refuses to publish. To check by hand, or to fix a mismatch, point the
draft at main’s merge commit:
# the release pull request's merge commit on main
git fetch origin main && git rev-parse origin/main
# the draft's target (a branch name or a commit SHA)
gh release view vX.YYYY.Z --repo Public-Environmental-Data-Partners/EJAM \
--json isDraft,targetCommitish --jq '.isDraft, .targetCommitish'
# if the target is not that exact SHA, set it (only while the draft is unpublished)
gh release edit vX.YYYY.Z --repo Public-Environmental-Data-Partners/EJAM \
--target <full SHA of main's merge commit>Setting the target to the full SHA, rather than to main,
keeps the tag from landing on a later commit if someone merges into
main before you publish.
Then verify:
Deploy and update the related repositories
Deploy the web app (dev, then production)
The web app runs on AWS ECS Fargate. Its build and deploy files live
on the dev-deploy and prod-deploy branches,
and merging a pull request into either branch deploys
immediately (about 15–20 minutes). See Deploying the web app to AWS for the
infrastructure, the workflows, rollback, and logs.
For a release:
-
Dev: point the dev server at the tag, either with a
pull request into
dev-deploythat setsARG EJAM_VERSION=vX.YYYY.Z(recommended, since it leaves the branch pinned to the tag) or with a dispatch usingejam_version=vX.YYYY.Z. Check the footer and one report. -
Production: a pull request into
prod-deploythat setsARG EJAM_VERSION=vX.YYYY.Zand, if the data release changed,ARG EJAMDATA_VERSION. Merging it deploys production. Then check the same list as for dev.
Warnings:
-
Deploys don’t queue. If a merge into
dev-deploystarts a deploy and you also dispatch one, both run at once and either can win. Wait for one to finish, then confirm the footer version. - The container must rebuild its font cache when it starts: the
DockerfileCMDbegins withsystem('fc-cache -r'). Without it, the image’s font cache can mismatch the fonts on AWS, and every chart label renders as boxes (#621). Keep that line when editing either deploy branch.
ejamdata
If this release comes with a new data release, it must be published before the web app or EJAM-API is rebuilt, since both download it by tag. Decide which data release is marked Latest (see Data changes and the ejamdata release).
EJAM-API
EJAM-API (Public-Environmental-Data-Partners/EJAM-API, deployed on Google Cloud Run behind api.ejanalysis.com) serves the community reports used by EJSCREEN and by links from the web app. After the tag exists:
- Update the default
EJAM_VERSIONin the EJAM-APIDockerfileto the new tag, by pull request. Merging does not deploy. - Build, push, and redeploy the image as described in the EJAM-API
README.md(“Set-up” and “Choosing the EJAM version”). The build installs the tagged EJAM, which downloads its data release. - Clear the Cloudflare cache for api.ejanalysis.com, which caches reports, so people don’t keep getting the previous version’s reports.
- Check that a report (for example
/report?fips=10001) shows the new version in its footer.
The EJAM package keeps a byte-for-byte copy of the production API
code in inst/plumber/ejam-api/ so that
ejamapi_local() can serve the same API locally. If
EJAM-API’s code changed since the last release, re-sync the copy
following inst/plumber/ejam-api/SYNC.md.
EJSCREEN
The EJSCREEN web app (Public-Environmental-Data-Partners/EJScreen,
deployed on Azure behind ejscreen.ejanalysis.com) gets its reports from
EJAM-API, so those update with the API. Its own displayed version number
is set by hand. See “Updating the version number” in the EJScreen
README.md: it is the versionNumber value near
the top of javascript/config.js, from which the title,
report footers, and print footer are built. Update it by pull request,
then deploy to Azure.
Two data vintages at once
When a new ACS vintage becomes the live line while the previous one stays available (frozen), the web app, EJAM-API, and EJSCREEN each need a second deployment for the frozen version, with its own address. That is infrastructure work (for example, another ECS service and Terraform environment for the web app, another Cloud Run service for the API, another Azure app for EJSCREEN), plus Cloudflare configuration for the addresses. Plan it before the new vintage replaces what the current addresses serve. The new vintage’s package release does not depend on it.
After the release
-
Back-merge
mainintodevelopment(pull request, merge commit), so any commits made only on the release branch reachdevelopmentand the next release starts without conflicts. - Delete the release-prep branches once merged, and remove any temporary worktrees.
- Reinstall EJAM from the tag locally so your own session uses the released version and data.
- If a frozen line ever needs a fix, branch from its last tag (for
example
git switch -c v3.2022.x v3.2022.3), fix it there, and release it as the next patch (3.2022.4) withmark_latest=false. Don’t put fixes for the frozen line ondevelopmentafter the vintage swap.
Quick reference: rules that prevent release problems
- No scheduled or automatic release: every release is started by hand.
-
mainchanges only through the release pull request, merged with a merge commit. -
Closes #Nworks only in pull requests merged intomain. - The version’s middle field must match
VersionACS, so a new vintage’s version and data land in the same commit. - Every
ejamdatapin must name the same data tag, and every data release has all 11 files. - Merging into
dev-deployorprod-deploydeploys immediately, and deploys don’t queue. - The web app, EJAM-API, and EJSCREEN don’t follow a release automatically.
-
--match-head-commitneeds the pull request’s current full commit SHA.
Appendix: the install-test workflows
The install checks, and when to update their R-version and operating-system matrix, are described in GitHub Actions install tests. Users installing from GitHub may need a personal access token; see the installing article.
Appendix: changing repository names, the documentation URL, or the app title
These changes are rare and not part of a normal release, but several files have to agree when they happen.
Code repository owner or name
If the package is renamed or relocated, several files need to be updated for the package, documentation, tests, and data-download helpers to work correctly.
The full URL of the repository where the R package is stored must be recorded in the standard
URLfield of theDESCRIPTIONfile in the source package root. The canonical URL used byurl_package()must also be stored inConfig/EJAM/url_ejamrepo; its stable alias and simple redirect belong inConfig/EJAM/url_ejamrepo_aliasandConfig/EJAM/url_ejamrepo_redirect.The full URL is currently https://github.com/Public-Environmental-Data-Partners/EJAM as found in
Config/EJAM/url_ejamrepo. It can be checked viaurl_package(type = "code", get_full_url = TRUE).The
_pkgdown.ymlfile in the root folder should also be updated with the new URL.Rebuilding and reinstalling the package should update uses of the URL where relevant. Some utility functions read it from package metadata.
Rebuilding the pkgdown site via
pkgdown_update()should use the new information within documentation, including articles and function/data reference pages.
Owner of the code repository
The owner name portion is currently “Public-Environmental-Data-Partners” and can be found as part of the URL for the code repository, or via
gsub("/.*", "", url_package(type = "code")).Changing the URL as explained above and transferring ownership should work, but generated documentation pages, code test results, and code comments should be carefully checked.
It would not make sense to simply replace every instance of “ejanalysis” with a new owner name. Some web links within the R package, mostly in documentation, use the domain ejanalysis.com or equivalently ejanalysis.org. These are convenient redirect aliases for the code repository, documentation, data repository, and related resources. Those aliases include ejanalysis.org/code, ejanalysis.org/data, and ejanalysis.org/docs. They are also available via helpers such as
url_package("code", desc_or_alias = "alias"). The redirects for those domains would need to be updated to point to any new URLs for the data, code, or documentation. The alias domain does not need to match the owner of any GitHub repository.
Name of the code repository and/or the R package
The repository name portion is currently “EJAM” and can be found as part of the URL for the code repository, or via
gsub(".*/", "", url_package(type = "code")).The R package, code repository, and RStudio project could in theory all have different names, but in EJAM they have usually been the same.
The name of the R package would not be easy to change, since it is used in many places in different ways. Some references mean the GitHub repository name, some mean the R package name, and some mean the tool in general. The package name is often assumed to match the GitHub repository name. Changing the repository name, as distinct from the owner of the repository, may be feasible, but the distinction between package name, repository name, project name, and tool name needs to be checked carefully. Use a global search to find hard-coded references to old names, URLs, and assumptions that the repository and package names are identical.
Data repository owner or name
The owner/name of the repository where external large datasets are stored must be recorded as the
ejam_data_repoparameter in theDESCRIPTIONfile in the source package root. The full canonical URL used byurl_package()must be stored inConfig/EJAM/url_ejamdata, with alias and redirect values in the corresponding_aliasand_redirectfields.The full URL is currently https://github.com/Public-Environmental-Data-Partners/ejamdata. It can be checked via
url_package(type = "data", get_full_url = TRUE).The owner name portion is currently “Public-Environmental-Data-Partners” and can be found as part of the URL for the data repository, or via
gsub("/.*", "", url_package(type = "data")).The repository name portion is currently “ejamdata” and can be found as part of the URL for the data repository, or via
gsub(".*/", "", url_package(type = "data")).Changing the name or owner of this repository should be easier than changing the R package code repository, since the data repository is referenced less often and in fewer ways. Still, use a global search to check for hard-coded references. Changing the information in the
DESCRIPTIONfile and rebuilding the package should update most references to where the data repository is located. There may still be documentation or comments where the term “ejamdata” is used directly rather than read from theDESCRIPTIONfile.
Where the documentation is published
The URL where package documentation is published must be recorded in the standard
URLfield of theDESCRIPTIONfile in the source package root. The canonical URL used byurl_package()must also be stored inConfig/EJAM/url_ejamdocs, with its alias and redirect in the corresponding_aliasand_redirectfields. The website providing documentation for the R package is created viapkgdown_update(), as explained in updating documentation.This URL at least through mid-2026 was associated with the same owner name as the R code repository, but the documentation can be published elsewhere and does not have to use the same owner as the code repository. If the documentation is published on GitHub Pages, the URL will look like
https://OWNER.github.io/REPONAME;OWNERandREPONAMEneed to be updated if the documentation is moved. If the documentation is published on a different domain, update both the standardURLfield andConfig/EJAM/url_ejamdocsinDESCRIPTION.This URL can be checked via
url_package(type = "docs"), which should return the full URL where documentation is published (currently https://public-environmental-data-partners.github.io/EJAM).Before a release, compare the published development documentation at https://docs.ejanalysis.com/dev with the root documentation at https://docs.ejanalysis.com. For example, compare
/dev/reference/ejamapp.htmlwith/reference/ejamapp.html, and/dev/articles/whatis.htmlwith/articles/whatis.html. The development site is the documentation built fromdevelopment; the root site is built frommain.EJAM::url_package("docs", docs_version = "dev")returns the canonical development-site URL.EJAM::url_package("docs", desc_or_alias = "alias")returns the stable root alias, and appending"/dev"selects its development build. The API documentation can be found withEJAM::url_package("apidocs")or its stable alias, https://apidocs.ejanalysis.com. UseEJAM::url_package("apidocs", desc_or_alias = "alias")to request that alias;EJAM::url_package("apidocs_alias")is not valid.See Updating Documentation for a table of root and development URLs for the reference index, individual help pages, article index, and individual articles.
Web app title
- The full name/title of the web app/tool is used in several places,
and those places should read the title from one authoritative source.
The web app title is stored in the
DESCRIPTIONfile and is available to vignettes and functions viaas.vector(desc::desc_get("Title")). After the package is attached, the name as potentially modified viaglobal_defaults_package.Ror parameters toejamapp()is available asEJAM:::global_or_param("app_title").