Version 26.8.23
- The 14-name
utils::globalVariables()list is gone. Each NSE column name is now declared asNULLat the top of the one function that uses it: 8 declarations across 5 files. Only.stays package-wide. -
R CMD checknamed five columns the old list never declared at all:temp_max,temp_min,precip,latandlong, plusto_code. They were reaching the check clean for another reason, so the list was not doing the job it appeared to do.
Version 26.8.22
The package drops
magrittr. Every%>%is now the base pipe|>, andmagrittris gone fromDESCRIPTION.The rewrite is a relocation, not an edit. Each
%>%call was transformed the way R’s parser transforms|>, and the resulting tree was required to match the tree parsed from the rewritten file. A file whose trees disagreed was left untouched and converted by hand instead.The version runs one day ahead of the calendar on purpose. r-universe already published today’s number from a different commit, and one version must never name two trees.
Version 26.8.21
-
progressis now declared..onLoadcallsprogressr::handler_progress(), whose body callsprogress::progress_bar, so this package needs it at load time. It worked only becausecs9declares it and this package importscs9. It would have broken the daycs9stopped needing it. -
R/zzz_imports.Rnamesrmarkdownandprogress, which clears the declared-but-unused note. Neither is visible to the dependency scan.rmarkdownis named as a string, inutils::assignInNamespace(..., ns = "rmarkdown"), andprogressis reached through another package’s function body.
cs9example 26.8.6
Licensing
The copyright holder is now Folkehelseinstituttet. It read “cs9example authors”, which was a template placeholder.
DESCRIPTIONAuthors@Rnow declares that holder withrole = "cph". It declared no copyright holder at all, and neither did any other package in the fleet. Nothing inR CMD checkreports that.The copyright year is now 2026. It read 2021.
CLAUDE.mdnow carries a Licensing section, so the year gets checked rather than silently ageing.Fixed two
README.mdlinks that pointed atwww.csids.no. The introduction vignette link returned 404 there. Both now point atniphr.github.io, which is the URL cs9’s ownDESCRIPTIONand_pkgdown.ymldeclare, and which returns 200.-
Brought the prose in
R/,README.md,index.mdandNEWS.mdto the house standard: ASD-STE100 (Simplified Technical English), adapted. Split the long sentences, and turned the buried lists into real lists.- Sentences over 25 words, measured per authored unit, before and after:
R/4 to 0,README.md1 to 0,NEWS.md12 to 0.index.mdwas already at 0. - Regenerated
man/from the edited roxygen.NAMESPACEis unchanged, and all 10 help pages remain. -
index.mdkeeps thecs-*class names, which are the onescstemplatedefines. Anrw-*prefix would silently drop the card styling.
- Sentences over 25 words, measured per authored unit, before and after:
No code, documented function behaviour or documented number changed in this version.
cs9example 26.8.5
- Removed
no_data_plot(), and with itR/99_util_no_data_plot.R. It was never exported and never called. That is why a stalefhi::reference survived inside it undetected for so long. The name sat in aglue()string, where static analysis cannot see it. Deleting it removes the whole class of problem rather than the one instance. - Removed
knitrfromSuggestsand dropped theVignetteBuilderfield. The package ships no vignettes, so both were vestigial andR CMD checkreported the mismatch.rmarkdownstays inImports: it is a genuine load-time dependency, named by a string inassignInNamespace(ns = "rmarkdown"). -
library(cs9example)now runs with no database server and no.Renviron. WhenCS9_DBCONFIG_ACCESSis empty,.onLoad()configures a SQLite backend underfile.path(tempdir(), "cs9example")and callscs9::reload_db_config(), so both tables register against SQLite files. A.Renvironstill wins: the defaults are only applied when the variable is empty. - Added a test suite that needs no database server and no network.
tests/testthat/test-sqlite-roundtrip.Rasserts four things:- both tables register;
- SQLite backs both of them;
- the
configandanonaccesses use different SQLite files; - a synthetic row round-trips through
insert_data()andtbl().
-
README.mdno longer tells the reader to hand-write a PostgreSQL.Renvironbefore anything works. -
.onLoad()now callsutils::assignInNamespace()rather than bareassignInNamespace().utilsis not attached during the minimal-namespace load thatR CMD checkperforms. The bare call therefore raisedcould not find function "assignInNamespace", and failed.onLoad()outright. That produced three WARNINGs:-
checking whether the package can be loaded with stated dependencies; -
checking whether the package can be unloaded cleanly; -
checking whether the namespace can be loaded with stated dependencies.
utilsis a base-priority package, so the check does not ask for it inImports. It was not added there.R/11_onAttach.Ralready calledutils::packageDescription()on the same terms. -
- The package became loadable at all once
plnrwas fixed..onLoad()callsset_tasks(), which reachesplnr::Plan$add_analysis_from_list(), and that method read an undefineddfthat only resolved becausestats::dfhappened to be on the search path. Loading died there first, which is why theassignInNamespace()defect behind it had never been seen. Fixed in plnr 2026.8.3. -
DESCRIPTIONnow carriesRemotes: niphr/cs9, raubreywhite/plnr. Without it CI died beforeR CMD checkever started. pak reportedCan't find package called cs9, becausecs9is inImports:and is not on CRAN.plnris on CRAN, but only at 2025.11.22, which still reads the undefineddfinPlan$add_analysis_from_list(). A CRAN resolution ofplnrtherefore installs a version that makes.onLoad()die withobject 'df' not foundwheneverstatsis not attached. That is exactly the conditionR CMD checkuses forchecking whether the package can be loaded with stated dependencies. Note the two different owners:cs9isniphr/cs9,plnrisraubreywhite/plnr.csdbneeds no entry of its own. cs9 declarescsdb (>= 2026.8.5)together withRemotes: niphr/csdb, and pak follows that transitively.csdbtherefore resolves from GitHub at 2026.8.5 rather than the CRAN 2026.5.13. -
DESCRIPTIONnow declaresConfig/Needs/website: niphr/cstemplate, which was missing._pkgdown.ymlsetstemplate: package: cstemplate. cstemplate is not on CRAN, and nothing else in the package named it. The pkgdown build therefore had no template to load. The gap stayed invisible because thepkgdownjob in.github/workflows/check-and-pkgdown.ymlhasneeds: R-CMD-checkand so never ran while dependency resolution was failing. This is a third inline GitHub ref with a third owner:r-lib/actions/setup-r-dependenciesreads this field for itsneeds: websitestep. OrdinaryImports:resolution does not read it, so it is not interchangeable with aRemotes:entry. cs9 and csdb declare the same value; plnr declaresraubreywhite/pkgdowntemplate. -
DESCRIPTIONImports:now matches what the code actually uses. Nine namespaces were reached through::without being declared, and are now declared:csdb,csmaps,cstidy,cstime,glue,httr,plnr,progressrandstringr. Three were declared without being used anywhere in the package, and are removed:janitor,merToolsandtidyr. None of the three appears in any file outsideDESCRIPTIONitself, including string literals;tidyrwas superseded bydata.table::CJ()inmake_skeleton_date()andmake_skeleton_isoyearweek(). -
rmarkdownstays inImports:even thoughR CMD checkreports it as unused..onLoad()callsutils::assignInNamespace("clean_tmpfiles", clean_tmpfiles_mod, ns = "rmarkdown"), which names the package as a string, so no static analysis can see it. Loading cs9example does load thermarkdownnamespace, andassignInNamespace()raisesthere is no package calledwhen the namespace is absent. The remainingNamespace in Imports field not imported from: 'rmarkdown'NOTE is the honest price of a real dependency that cannot be spelled with::. - The
DESCRIPTIONDescription:field now ends in a full stop. That clearsR CMD check’sMalformed Description field: should contain one or more complete sentences.The wording is unchanged. - Fixed
weather_export_plots_data_selector(), which readindex_analysiswithout ever assigning it. Theif (plnr::is_run_directly())block set onlyindex_plan <- 1, then passedindex_analysistoglobal$ss$shortcut_get_argset(). The three sibling blocks all assign it first. This was a copy from the action body with theindex_analysis <- 1line dropped. The guard is FALSE under normal package use, so the defect never fired in production. It fired the moment a developer stepped through the data selector interactively. That is the only reason the block exists. R then either raisedobject 'index_analysis' not found, or silently used a stale value left in the global environment. Note thatweather_clean_data_data_selector()is correct as written and is unchanged. It omitsindex_analysisfrom the call entirely, which is the other valid shape. -
no_data_plot()no longer callsfhi::nb$aa.fhiis not a declared dependency and is not installed, so the function raisedFailed to evaluate glue component {fhi::nb$aa}on every call. No static analysis could see it, because the name sits inside aglue::glue()string. The value is the characterå, confirmed againstcsdata::nb$aaand against the same function in norsyss.cs9, which had already made this exact substitution. The literal replaces the call, so the label readsIkke noe data å viseas intended.fhiwas not added toImports:. -
R/00_env_and_namespace.Rnow declares the data.table and dplyr non-standard-evaluation column names inutils::globalVariables(). Fourteen names were reported bychecking R code for possible problemsand each was traced to a[...],:=ordplyr::select()site before being declared.index_analysiswas deliberately left out: it was a real bug, fixed above, not NSE. The check’simportFrom("datasets", "precip")suggestion was not followed, becausepreciphere is a weather column this package builds. -
.Rbuildignorenow excludes.githubandLICENSE.md, which clearedchecking for hidden files and directoriesandchecking top-level files. TheLICENSEfile named byLicense: MIT + file LICENSEstill ships.
cs9example 26.8.4
- Added a pkgdown site:
_pkgdown.ymlon thecstemplatehouse template, anindex.mdhome page, and a generated hex logo (dev/logo.R->man/figures/logo.png). - Documented every exported function with a description,
@seealsoand@family, and added runnable examples where one can run without a database.weather_export_plots_action(),make_skeleton_date(),make_skeleton_isoyearweek()andglobalnow have examples that execute. The five that need a live PostgreSQL database or internet access are marked\dontrun{}and say why. -
make_skeleton_date()andmake_skeleton_isoyearweek()are now actually exported. Both carried@exportsince they were added, butNAMESPACEhad not been regenerated, so neither was reachable ascs9example::make_skeleton_date().
cs9example 25.6.24
- Updated database schema to include quarterly fields (isoquarter, isoyearquarter)
- Upgraded table validators from v1 to v2 format
- Updated weather data source to use municipality-level locations
- Enhanced README with Posit Studio/Workbench setup instructions
- Streamlined package structure by removing unused COVID-19 functionality
