Releases: Gilead-Public/qcthat
Release list
v1.1.3
Overview
This patch release streamlines and hones the GitHub Action installed via Action_qcthat().
Action changes
Action_qcthat()now installs an action from a dedicated "actions" branch, allowing us to keep the action up-to-date with changes in GitHub policies without requiring an update to the package itself (#303, #205).- The
sessioninforuns are now displayed in the action runs and linked to from PR comments, rather than displaying in the comments themselves. This makes it easier to read comments generated by this package in email (#295). - The issue-test matrix underlying the full package report is attached to releases as JSON (via
SaveAsJSON()), which can be read back into R withReadJSONAsIssueTestMatrix()(#298). - If the
fail-for-missing-testsinput istrue(default), the qcthat action fails if any issues associated with the triggering PR lack tests (and are not tagged withqcthat-nocov) (#288). TriggerUAT()checks the status of PRs again before triggering re-runs of actions, to minimize instances where actions try to run an extra time if a PR is closed whileTriggerUAT()is processing (#299).- Actions triggered via workflow dispatch now set the branch properly (#308), and action input names match a more standard style (#310).
Other changes
ExpectUserAccepts()now automatically assigns UAT issues to GitHub usernames passed aschrAssignees, defaulting to the value of aqcthat_UAT_ASSIGNEESenvironment variable. This variable can be set in the GitHub action via theuat-assigneesinput, automatically triggering different UAT reviewers at different stages of development (#193).vignette("expect_user_accepts")added to describe the "User acceptance testing with ExpectUserAccepts" process (#293).- qcthat installs the dev version of gh to avoid issues with GitHub PATs caused by recent changes to the GitHub API.
What's Changed
- Main to dev by Jon Harmon (@jonthegeek) in #281
- Remove transparency from logo by Jon Harmon (@jonthegeek) in #282
- Fix 193: Assign UAT Issues by Jon Harmon (@jonthegeek) in #287
- Closes #293 Useful vignette for devs on how to implement
ExpectUserAccepts()by Zelos Zhu (@zdz2101) in #292 - Try gsm.utils render by Jon Harmon (@jonthegeek) in #297
- Secrets & speed by Jon Harmon (@jonthegeek) in #300
- Update docs, workflows, README, and DESCRIPTION by Jon Harmon (@jharmon-gilead) in #305
- Fix 306: Warn on missing milestone by Jon Harmon (@jharmon-gilead) in #307
- Fix the milestone warning message by Jon Harmon (@jharmon-gilead) in #309
- Federate qcthat workflow by Jon Harmon (@jharmon-gilead) in #312
- Change 'gh' remote reference to r-lib/gh by Jon Harmon (@jharmon-gilead) in #314
- Release candidate: qcthat v1.1.3 by Jon Harmon (@jharmon-gilead) in #315
New Contributors
- Zelos Zhu (@zdz2101) made their first contribution in #292
Full Changelog: v1.1.2...v1.1.3
v1.1.2
Overview
This patch release focuses on introducing the world to qcthat.
Documentation improvements
- Two new vignettes have been added,
vignette("qcthat")andvignette("business_process"). They were split off and refined from information that was previously in the README (#98, #236). - The slide deck on the pkgdown site has been finalized ahead of PHUSE US Connect 2026 (#170).
Bug fixes
- Warnings in tests now produce warnings rather than errors (#130).
- Tests are no longer double-counted when they are associated with multiple issues (#180).
What's Changed
- Main to dev by Jon Harmon (@jonthegeek) in #263
- fix 130 & 180: warn for warnings & better failure counts by Jon Harmon (@jonthegeek) in #266
- fix: Use R code blame for test alignment by Jon Harmon (@jonthegeek) in #273
- Fix 170: Final slide deck for PHUSE US Connect 2026 by Jon Harmon (@jonthegeek) in #275
- qcthat 1.1.2 Release Candidate by Jon Harmon (@jonthegeek) in #280
Full Changelog: v1.1.1...v1.1.2
{qcthat} Reports
Milestone
✅ A qcthat issue test matrix with 1 milestone, 5 issues, and 6 tests
└─█─Milestone: v1.1.2 (5 issues, 6 tests)
├─☑️─Documentation Task 236: Update README
│ └─✅─README is straightforward (#236)
├─☑️─Bug 180: Better Test Counts
│ └─✅─Test failure counts make sense (#180, #31)
├─☑️─Documentation Task 170: Final deck draft
│ └─✅─The intro slide deck is ready to present (#170)
├─☑️─Bug 130: Warn for warnings
│ ├─✅─CompileTestResults returns the expected object (#32, #130)
│ └─✅─ExtractDisposition() helper counts warnings as warnings (#130)
└─☑️─Documentation Task 98: Vignette: Getting Started
└─✅─There's a vignette about getting started (#98)
# Issue state: 📥 = open, ☑️ = closed (completed), ⛔ = closed (won't fix)
# Test disposition: ✅ = passed, ❌ = failed, 🚫 = skipped
🟢 All issues have at least one test
Completed Issues
✅ A qcthat issue test matrix with 7 milestones, 89 issues, and 252 tests
├─█─Milestone: ForTesting (1 issue, 1 test)
│ └─☑️─Technical Task 179: For Testing
│ └─✅─This package works for certain issues unconnected to actual features (#179)
├─█─Milestone: implementation (1 issue, 27 tests)
│ └─☑️─Feature 265: Add code context for tests
│ ├─✅─MapCoveredLinesToPotentialIssues maps source blame to issues (#265)
│ ├─✅─MapCoveredLinesToPotentialIssues handles empty input (#265)
│ ├─✅─MergePotentialIssues unions and deduplicates (#265)
│ ├─✅─MergePotentialIssues handles one empty side (#265)
│ ├─✅─MapTestFilesToPotentialIssues handles empty test directory (#265)
│ ├─✅─MapTestFilesToPotentialIssues handles all tests tagged with #noissue (#265)
│ ├─✅─MapTestFilesToPotentialIssues passes strTestDir parameter (#265)
│ ├─✅─MapTestFilesToPotentialIssues passes GitHub parameters (#265)
│ ├─✅─MapTestFilesToPotentialIssues merges source coverage issues when lglUseCoverage = TRUE (#265)
│ ├─✅─AugmentPotentialIssuesFromCoverage() passes strTestDir to LoadPkgEnv (#265)
│ ├─✅─AugmentPotentialIssuesFromCoverage() merges coverage issues with commit-based issues (#265)
│ ├─✅─ReadTestFileContents reads unique files into named list (#265)
│ ├─✅─ExtractTestWithPreamble includes preamble before first test (#265)
│ ├─✅─ExtractTestWithPreamble works when test starts at line 1 (#265)
│ ├─✅─NormalizeTallyPaths converts absolute paths to relative (#265)
│ ├─✅─CoverSingleTest returns covered lines from tally (#265)
│ ├─✅─CoverSingleTest returns NULL when no lines are covered (#265)
│ ├─✅─CoverSingleTest returns NULL on error (#265)
│ ├─✅─SetupTempSnapDir copies snapshot file to temp dir (#265)
│ ├─✅─SetupTempSnapDir works when no snapshot file exists (#265)
│ ├─✅─ExtractAllTestCode extracts code for all tests (#265)
│ ├─✅─ExtractAllTestCode handles namespaced and indented test_that (#265)
│ ├─✅─WriteAllTempTestFiles writes all files and returns paths (#265)
│ ├─✅─MapTestsToCoveredLines returns per-test covered lines (#265)
│ ├─✅─MapTestsToCoveredLines skips noissue tests (#265)
│ ├─✅─MapTestsToCoveredLines handles empty dfFileTests (#265)
│ └─✅─MapTestsToCoveredLines handles test with no coverage (#265)
├─█─Milestone: v0.2.0 (11 issues, 23 tests)
│ ├─☑️─Bug 61: Show "won't fix" for "duplicate"
│ │ └─✅─Issues closed as duplicates display the proper symbol (#61)
│ ├─☑️─Feature 32: Extract test information from test results
│ │ ├─✅─CompileTestResults errors informatively for bad input (#32)
│ │ ├─✅─CompileTestResults works for empty testthat_results (#32)
│ │ ├─✅─CompileTestResults returns the expected object (#32, #130)
│ │ └─✅─ExtractDisposition() helper errors informatively for weird results (#32)
│ ├─☑️─Requirement 31: Generate package QC report
│ │ ├─✅─Printing an IssueTestMatrix returns input invisibly (#31)
│ │ ├─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ │ └─✅─Test failure counts make sense (#180, #31)
│ ├─☑️─Feature 60: Show summary of report
│ │ ├─✅─MakeKeyItem works (#60)
│ │ ├─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ │ └─✅─Disposition indicators deal with all cases (#60)
│ ├─☑️─Technical Task 49: Unnest IssueTestMatrix for easier filtering
│ │ ├─✅─CompileIssueTestMatrix combines issues and test results into an IssueTestMatrix tibble (#35, #49)
│ │ ├─✅─Printing a generic qcthat_object returns input invisibly (#49)
│ │ ├─✅─FinalizeTree adds tree characters correctly (#49)
│ │ ├─✅─Printing a Milestone returns input invisibly (#49)
│ │ ├─✅─Printing a Milestone outputs a user-friendly tree (#49)
│ │ ├─✅─Printing a SingleIssueTestResults returns input invisibly (#49)
│ │ └─✅─Printing a SingleIssueTestResults outputs a user-friendly tree (#49)
│ ├─☑️─Bug 47: Fetch *all* repo issues
│ │ └─✅─FetchRepoIssues fetches all repo issues (#47)
│ ├─☑️─Bug 45: Deal with length-0 results
│ │ └─✅─ExtractDisposition() helper errors informatively for missing results within lTestResult object (#45)
│ ├─☑️─Technical Task 37: Package QC Report GHA
│ │ └─✅─Reports generated via GHA include information about the issues (#77, #37)
│ ├─☑️─Feature 36: Print IssueTestMatrix
│ │ └─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ ├─☑️─Feature 35: Generate Issue-Test Matrix
│ │ ├─✅─CompileIssueTestMatrix returns an empty IssueTestMatrix with empty input (#35)
│ │ └─✅─CompileIssueTestMatrix combines issues and test results into an IssueTestMatrix tibble (#35, #49)
│ └─☑️─Feature 34: Get repo issues
│ ├─✅─FetchRepoIssues returns an empty df when no issues found (#34)
│ └─✅─FetchRepoIssues returns a formatted df for real issues (#34)
├─█─Milestone: v1.0.0 (19 issues, 59 tests)
│ ├─☑️─Technical Task 101: Switch `lglShowIgnoredLabels` default to TRUE
│ │ └─✅─Ignored issues are shown by default (#101)
│ ├─☑️─Feature 80: Filter main qcthat report to only "closed (completed)"
│ │ └─✅─QCCompletedIssues filters to completed issues (#80, #69)
│ ├─☑️─Bug 77: GHA-generated report stability
│ │ └─✅─Reports generated via GHA include information about the issues (#77, #37)
│ ├─☑️─Feature 73: Add qcthis.yaml to a package
│ │ ├─✅─InstallAction calls InstallFile with expected parts (#73)
│ │ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ │ ├─✅─qcthatPath constructs paths (#73)
│ │ └─✅─InstallFile copies files as expected (#73)
│ ├─☑️─Technical Task 72: Add qc report to triggering PR as comment
│ │ └─✅─CommentReport generates the expected call (#99, #72)
│ ├─☑️─Requirement 69: Package QC Report Usability
│ │ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ │ ├─✅─Can print without milestone info (#40, #69)
│ │ ├─✅─QCPackage wraps the core qcthat functions (#46, #69)
│ │ └─✅─QCCompletedIssues filters to completed issues (#80, #69)
│ ├─☑️─Requirement 68: PR/Branch Report
│ │ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ │ ├─✅─QCMergeGH filters to merge-associated issues (#68, #84)
│ │ ├─✅─QCMergeLocal filters to ref-specific issues (#68, #84)
│ │ ├─✅─QCPR filters to PR-related issues (#68, #84)
│ │ └─✅─QCMilestones reports on specific milestones (#88, #68)
│ ├─☑️─Feature 67: Ignore issues with `qcthat-nocov` label
│ │ ├─✅─CompileIssueTestMatrix excludes issues in chrIgnoredLabels (#67)
│ │ ├─✅─ExtractDisposition() helper counts test errors as failures (#67)
│ │ └─✅─Can report ignored issue counts (#67, #81)
│ ├─☑️─Feature 55: GHA: Report of associated issues
│ │ └─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ ├─☑️─Feature 46: Wrapper to run everything
│ │ └─✅─QCPackage wraps the core qcthat functions (#46, #69)
│ ├─☑️─Feature 40: Print Without Milestones
│ │ └─✅─Can print without milestone info (#40, #69)
│ ├─☑️─Bug 96: Don't include ignored labels in `QCIssues()` warnings
│ │ └─✅─QCIssues doesn't warn about ignored issues (#96)
│ ├─☑️─Bug 95: Install qcthat as part of Action installation
│ │ └─✅─qcthat is installed as part of the GHA (#95)
│ ├─☑️─Feature 90: Function to create qcthat-nocov label
│ │ ├─✅─CreateGHLabel reports success conditional on lglVerbose (#90)
│ │ ├─✅─CreateGHLabel throws an error if the API doesn't report the expected result (#90)
│ │ ├─✅─CreateGHLabel attempts to update existing label (#90)
│ │ ├─✅─MaybeUpdateGHLabel decides based on lglUpdate (#90)
│ │ ├─✅─UpdateGHLabel makes the expected call (#90)
│ │ ├─✅─UpdateGHLabel throws an error if the API doesn't report the expected result (#90)
│ │ ├─✅─EmptyLabelsDF returns the expected structure (#90)
│ │ ├─✅─EnframeGHLabels ...
v1.1.1
Overview
This patch release contains improvements and bug fixes discovered while applying the experimental AI agent features released in qcthat v1.1.0. These changes are tracked in #241.
New features
- The experimental
tag-tests-with-issuesskill now generates a report inpkgdown/assetsdescribing the reasons that tests were tagged with each issue. If the pkgdown uses pkgdown, this report will be available at{pkgdown_root}/test_tag_reasons.html. We recommend using this report locally to verify results, and then deleting the report without merging it into your pkgdown site (#242).
Bug fixes
FetchRepoIssueClosers()is now better at determining which pull request or merge caused each issue to be closed. Other portions of the issue-test relationship mechanism are properly fetched from GitHub (in case the local repo does not have all changes), but the fetches are now much more optimized (#243, #251).ExtractTestsFromFiles()now uses a much more robust mechanism to quickly parse tests, built with the {astgrepr} R package (#247, #257).GetGHRemote()no longer truncates the repo name for repositories with a.in the name (such as "gsm.reporting") (#248).- The
qcthat.yamlworkflow no longer erroneously mentions "push" triggers (#259).
What's Changed
- Main to dev by Jon Harmon (@jonthegeek) in #237
- Fix 137 & 185 & 230: UAT issue creation hardiness by Jon Harmon (@jonthegeek) in #240
- Fix 243: Fetch all issue closers by Jon Harmon (@jonthegeek) in #245
- Fix 247: Allow namespacing of
test_that()by Jon Harmon (@jonthegeek) in #249 - Fix 248: Properly parse repo names with dots by Jon Harmon (@jonthegeek) in #250
- Fix 251: Better merge commit finding by Jon Harmon (@jonthegeek) in #252
- Fix 257: Use astgrepr for code search by Jon Harmon (@jonthegeek) in #258
- Fix 241: Update Test-Tagging Skill by Jon Harmon (@jonthegeek) in #261
- qcthat v1.1.1 Release Candidate by Jon Harmon (@jonthegeek) in #262
Full Changelog: v1.1.0...v1.1.1
{qcthat} Reports
Milestone
✅ A qcthat issue test matrix with 1 milestone, 9 issues, and 26 tests
└─█─Milestone: v1.1.1 (9 issues, 26 tests)
├─☑️─Technical Task 257: Use astgrepr for test parsing
│ ├─✅─ExtractTestsFromFiles parses tests and issues from test dirs (#52, #201, #257)
│ └─✅─FindTests finds tests using testthat:: namespace prefix (#247, #257)
├─☑️─Bug 251: Find more issue-test links via blame
│ ├─✅─FetchAllPRCommitSHAs returns empty list for empty input (#251)
│ ├─✅─FetchAllPRCommitSHAs batches PRs and returns one element per PR (#251)
│ ├─✅─MapRepoIssuesToCommits handles PR closers (#53, #251)
│ ├─✅─MapRepoIssuesToCommits handles mixed closers (#53, #251)
│ └─✅─MapRepoIssuesToCommits passes GitHub parameters to FetchAllPRCommitSHAs (#251)
├─☑️─Bug 248: Properly get remotes with dots
│ └─✅─GetGHRemote handles dots in repo names (#248)
├─☑️─Bug 247: Include namespaced tests in `ExtractTestsFromFiles()`
│ └─✅─FindTests finds tests using testthat:: namespace prefix (#247, #257)
├─☑️─Bug 243: Fetch all repo issue closers
│ ├─✅─FetchRepoIssueClosers filters cross-repo events within a mixed-repo issue (#243)
│ ├─✅─IsTimelineNodeFromRepo filters ConnectedEvent and DisconnectedEvent by repo (#243)
│ ├─✅─TibblifyIssueCloser returns NULL for non-Commit/PR closers like ProjectV2 (#243)
│ ├─✅─TibblifyIssueCloser treats ConnectedEvent with merged PR as a closer (#243)
│ ├─✅─TibblifyIssueCloser annihilates ConnectedEvent with subsequent DisconnectedEvent (#243)
│ ├─✅─TibblifyIssueCloser handles partial annihilation with multiple ConnectedEvents (#243)
│ ├─✅─FetchRepoIssueClosers skips non-tibblifiable closers and returns all valid closers (#243)
│ └─✅─FetchRepoIssueClosers returns all valid closers when an issue has multiple (#243)
├─☑️─Requirement 241: Improve the Test-Tagging Skill
│ └─✅─Skill_TagTestsWithIssues targets the expected skill (#53, #233, #241)
├─☑️─Bug 230: Don't create extra UAT issues
│ ├─✅─FormatUATGH works for errors (#137, #185, #230)
│ ├─✅─ExpectUserAccepts errors when online but GitHub fetch fails (#230)
│ ├─✅─CompileIssuesDF errors for bad gh response (#230)
│ ├─✅─FetchUAIssue returns closed child if multiple children (#230)
│ └─✅─EmptyGHResponse builds an empty GitHub response (#230)
├─☑️─Feature 185: Show all UAT items in UAT comment
│ ├─✅─CommentUAT generates the expected call (#115, #185)
│ ├─✅─FormatUATGH works for errors (#137, #185, #230)
│ └─✅─CommentUAT includes accepted UAT for this PR (#185)
└─☑️─Bug 137: {qcthat} Report: User Acceptance should indicate if the issue couldn't be created
├─✅─FormatUATGH works for errors (#137, #185, #230)
├─✅─ExpectUserAccepts fails when the child issue can't be created (#137)
└─✅─ExpectUserAccepts fails when weird things happen (#137)
# Issue state: 📥 = open, ☑️ = closed (completed), ⛔ = closed (won't fix)
# Test disposition: ✅ = passed, ❌ = failed, 🚫 = skipped
🟢 All issues have at least one test
🙈 2 issues with label "qcthat-nocov" were ignored
Completed Issues
✅ A qcthat issue test matrix with 5 milestones, 83 issues, and 224 tests
├─█─Milestone: ForTesting (1 issue, 1 test)
│ └─☑️─Technical Task 179: For Testing
│ └─✅─This package works for certain issues unconnected to actual features (#179)
├─█─Milestone: v0.2.0 (11 issues, 23 tests)
│ ├─☑️─Bug 61: Show "won't fix" for "duplicate"
│ │ └─✅─Issues closed as duplicates display the proper symbol (#61)
│ ├─☑️─Feature 32: Extract test information from test results
│ │ ├─✅─CompileTestResults errors informatively for bad input (#32)
│ │ ├─✅─CompileTestResults works for empty testthat_results (#32)
│ │ ├─✅─CompileTestResults returns the expected object (#32)
│ │ ├─✅─ExtractDisposition() helper counts warnings as errors (#32)
│ │ └─✅─ExtractDisposition() helper errors informatively for weird results (#32)
│ ├─☑️─Requirement 31: Generate package QC report
│ │ ├─✅─Printing an IssueTestMatrix returns input invisibly (#31)
│ │ └─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ ├─☑️─Feature 60: Show summary of report
│ │ ├─✅─MakeKeyItem works (#60)
│ │ ├─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ │ └─✅─Disposition indicators deal with all cases (#60)
│ ├─☑️─Technical Task 49: Unnest IssueTestMatrix for easier filtering
│ │ ├─✅─CompileIssueTestMatrix combines issues and test results into an IssueTestMatrix tibble (#35, #49)
│ │ ├─✅─Printing a generic qcthat_object returns input invisibly (#49)
│ │ ├─✅─FinalizeTree adds tree characters correctly (#49)
│ │ ├─✅─Printing a Milestone returns input invisibly (#49)
│ │ ├─✅─Printing a Milestone outputs a user-friendly tree (#49)
│ │ ├─✅─Printing a SingleIssueTestResults returns input invisibly (#49)
│ │ └─✅─Printing a SingleIssueTestResults outputs a user-friendly tree (#49)
│ ├─☑️─Bug 47: Fetch *all* repo issues
│ │ └─✅─FetchRepoIssues fetches all repo issues (#47)
│ ├─☑️─Bug 45: Deal with length-0 results
│ │ └─✅─ExtractDisposition() helper errors informatively for missing results within lTestResult object (#45)
│ ├─☑️─Technical Task 37: Package QC Report GHA
│ │ └─✅─Reports generated via GHA include information about the issues (#77, #37)
│ ├─☑️─Feature 36: Print IssueTestMatrix
│ │ └─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ ├─☑️─Feature 35: Generate Issue-Test Matrix
│ │ ├─✅─CompileIssueTestMatrix returns an empty IssueTestMatrix with empty input (#35)
│ │ └─✅─CompileIssueTestMatrix combines issues and test results into an IssueTestMatrix tibble (#35, #49)
│ └─☑️─Feature 34: Get repo issues
│ ├─✅─FetchRepoIssues returns an empty df when no issues found (#34)
│ └─✅─FetchRepoIssues returns a formatted df for real issues (#34)
├─█─Milestone: v1.0.0 (19 issues, 61 tests)
│ ├─☑️─Technical Task 101: Switch `lglShowIgnoredLabels` default to TRUE
│ │ └─✅─Ignored issues are shown by default (#101)
│ ├─☑️─Feature 80: Filter main qcthat report to only "closed (completed)"
│ │ └─✅─QCCompletedIssues filters to completed issues (#80, #69)
│ ├─☑️─Bug 77: GHA-generated report stability
│ │ └─✅─Reports generated via GHA include information about the issues (#77, #37)
│ ├─☑️─Feature 73: Add qcthis.yaml to a package
│ │ ├─✅─InstallAction calls InstallFile with expected parts (#73)
│ │ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ │ ├─✅─qcthatPath constructs paths (#73)
│ │ └─✅─InstallFile copies files as expected (#73)
│ ├─☑️─Technical Task 72: Add qc report to triggering PR as comment
│ │ └─✅─CommentReport generates the expected call (#99, #72)
│ ├─☑️─Requirement 69: Package QC Report Usability
│ │ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ │ ├─✅─Can print without milestone info (#40, #69)
│ │ ├─✅─QCPackage wraps the core qcthat functions (#46, #69)
│ │ └─✅─QCCompletedIssues filters to completed issues (#80, #69)
│ ├─☑️─Requirement 68: PR/Branch Report
│ │ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ │ ├─✅─QCMergeGH filters to merge-associated issues (#68, #84)
│ │ ├─✅─QCMergeLocal filters to ref-specific issues (#68, #84)
│ │ ├─✅─QCPR filters to PR-related issues (#68, #84)
│ │ └─✅─QCMilestones reports on specific milestones (#88, #68)
│ ├─☑️─Feature 67: Ignore issues with `qcthat-nocov` label
│ │ ├─✅─CompileIssueTestMatrix excludes is...
v1.1.0
Overview
New features and tools to help you track user acceptance testing, and to help you use AI agents to get started with qcthat.
New features
Experimental functions for tracking user-acceptance testing (UAT):
ExpectUserAccepts()enables tracking of user acceptance by connectingtestthattests to GitHub issues. Once the UAT issue is closed, the test will pass (#65, #111, #113, #115, #120).TriggerUAT()triggers the UAT test cycle for a closed issue. This function is used by the improved GitHub Actions framework, installable viaAction_qcthat()(#65, #111, #114, #115, #116, #157).
Improved onboarding:
use_qcthat()callsSetupGHLabels()andAction_qcthat(), to set up your repository with GitHub Actions workflows and labels used for QC tracking (#129, #141, #143, #161, #165, #181, #198).- Experimental AI agent features:
Skill_TagTestsWithIssues()installs an AI agent skill to tag tests with issues, using new functionsExtractTestsFromFiles(),MapTestFilesToPotentialIssues(), andPrepareTestIssueContext()(#52, #53, #200, #201, #233).
Other changes
- Additional improvements to QC reports, such as links to the GitHub Actions run (#150), timestamps (#172), and attaching QC Reports to releases within the release description (#152). Additional changes are tracked in the parent issues (#123, #160).
- The
pkgdownsite forqcthatnow includes a slide deck to introduce the package and the associated system (#166, #167, #168, #169).
Bug fixes
- Ignored issues are filtered out of reports (#118).
- Reports work properly when the active branch is associated with multiple PRs (#132), when the PRs contain a lot of commits (#133), and after PRs are merged (#149).
GetGHOwner()andGetGHRepo()should now work for forks, even if the local repo name does not match the upstream repo name (#199).
What's Changed
- Implement most of User Acceptance Testing by Jon Harmon (@jonthegeek) in #128
- Fix 141: Restore the proper action for milestone by Jon Harmon (@jonthegeek) in #142
- Fully qualify qcthat in installed
qcthat-pr_issues.yamlby Jon Harmon (@jonthegeek) in #144 - Better handling of PRs by Jon Harmon (@jonthegeek) in #153
- Fix 114 Add functionality to re-run UAT by Jon Harmon (@jonthegeek) in #154
- Fix 157 Use the qcthat-uat workflow to manage QC by Jon Harmon (@jonthegeek) in #159
- Add a minimal slide deck to pkgdown by Jon Harmon (@jonthegeek) in #171
- Fix 129 Consolidate GHA by Jon Harmon (@jonthegeek) in #175
- Verify reports work for releases by Jon Harmon (@jonthegeek) in #182
- Fix 52 53: Suggest issues for tests by Jon Harmon (@jonthegeek) in #184
- Fix 169: Update deck with "evidence." by Jon Harmon (@jonthegeek) in #202
- Fix 161 198:
use_qcthat()by Jon Harmon (@jonthegeek) in #204 - Fix 232: Prepare for Release by Jon Harmon (@jonthegeek) in #234
- qcthat v1.1.0 Release Candidate by Jon Harmon (@jonthegeek) in #235
Full Changelog: v1.0.0...v1.1.0
{qcthat} Reports
Milestone
✅ A qcthat issue test matrix with 1 milestone, 43 issues, and 128 tests
└─█─Milestone: v1.1.0 (43 issues, 128 tests)
├─☑️─Requirement 233: AI Agent for qcthat Onboarding
│ └─✅─Skill_TagTestsWithIssues targets the expected skill (#53, #233)
├─☑️─Bug 201: Provide full path in Skill-related functions
│ ├─✅─ExtractTestsFromFiles parses tests and issues from test dirs (#52, #201)
│ ├─✅─MapTestFilesToPotentialIssues finds potential issues via commits (#53, #201)
│ ├─✅─MapTestsToCommits adds commit SHAs for each test (#53, #201)
│ ├─✅─GetRelativePackagePath finds the relative path (#201)
│ ├─✅─PrepareTestIssueContext passes parameters (#53, #201)
│ └─✅─ReadTestCode reads test code from file (#53, #201)
├─☑️─Bug 200: Commits column of `MapRepoIssuesToCommits()` should expand to list of characters when empty
│ └─✅─MapRepoIssuesToCommits handles empty input (#200)
├─☑️─Bug 199: Use upstream when available in `GetGHOwner()`
│ └─✅─GetGHRemote uses upstream when available (#199)
├─☑️─Feature 198: Universal `Action_qcthat()` function
│ └─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
├─☑️─Technical Task 181: Verify `qcthat.yaml` works for releases
│ └─✅─AttachReleaseReports runs properly on release (#181)
├─☑️─Feature 172: Add timestamps to comments
│ ├─✅─CommentIssue compiles the body as expected (#83, #172)
│ └─✅─PrettyTimestamp works (#172)
├─☑️─Documentation Task 169: Deck draft 2: Final-ish
│ └─✅─The pkgdown site has an intro slide deck (#166, #167, #168, #169)
├─☑️─Documentation Task 168: Draft the real slide deck
│ └─✅─The pkgdown site has an intro slide deck (#166, #167, #168, #169)
├─☑️─Technical Task 167: Add a basic slide deck to pkgdown
│ └─✅─The pkgdown site has an intro slide deck (#166, #167, #168, #169)
├─☑️─Requirement 166: Introduce {qcthat}
│ └─✅─The pkgdown site has an intro slide deck (#166, #167, #168, #169)
├─☑️─Feature 165: Combined `CommentPRReports()` function
│ ├─✅─FormatReportBody finalizes reports (#165)
│ ├─✅─FormatReportType generates a report type (#165)
│ ├─✅─CommentAllReports generates the expected calls (#165)
│ ├─✅─All qcthat reports are combined in a single GHA (#129, #165, #152)
│ ├─✅─GuessMilestones returns NULL for bad arg (#165)
│ ├─✅─GuessMilestones extracts milestones from lGHEventPayload when available (#165)
│ └─✅─GuessMilestones returns NULL for bad extracted milestones (#165)
├─☑️─Feature 164: Functions to manage envQcthat$UATIssues
│ └─✅─SaveUATIssues saves UAT issues and LoadUATIssues loads them (#164)
├─☑️─Feature 163: Use GitHub Event for `GetGHAPRNumber()`
│ ├─✅─GetGHAPRNumber returns NULL for bad arg (#84, #163)
│ ├─✅─GetGHAPRNumber extracts PR number from lGHEventPayload when available (#84, #163)
│ └─✅─GetGHAPRNumber returns NULL for bad extracted PR number (#84, #163)
├─☑️─Feature 162: GuessIssueNumber()
│ ├─✅─GuessIssueNumber returns NULL for bad arg (#162)
│ ├─✅─GuessIssueNumber extracts issue number from lGHEventPayload when available (#162)
│ ├─✅─GuessIssueNumber returns NULL for bad extracted issue number (#162)
│ ├─✅─LoadGHEventPayload returns NULL when envvar is empty (#162)
│ ├─✅─LoadGHEventPayload returns NULL for bad path (#162)
│ ├─✅─LoadGHEventPayload returns NULL for bad payload (#162)
│ └─✅─LoadGHEventPayload returns the payload if it's readable (#162)
├─☑️─Feature 161: Single `use_qcthat()` function for all actions
│ └─✅─use_qcthat calls the expected functions (#161)
├─☑️─Requirement 160: Improved QC Tracking for Releases
│ └─✅─AttachReleaseReports makes the expected calls (#152, #160)
├─☑️─Feature 157: Automated UAT Verification Loop: Workflow
│ ├─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
│ └─✅─The UAT workflow triggers properly when all UAT issues connected to a PR are closed (#65, #157)
├─☑️─Feature 152: Add reports to release description (not as attachment)
│ ├─✅─UpdateReleaseBody makes the expected call (#152)
│ ├─✅─UpdateReleaseBody uses existing body if available (#152)
│ ├─✅─AttachReleaseReports makes the expected calls (#152, #160)
│ ├─✅─CompileReleaseReportsMarkdown stitches together parts for releases (#152)
│ ├─✅─All qcthat reports are combined in a single GHA (#129, #165, #152)
│ ├─✅─GuessReleaseID returns NULL for bad arg (#152)
│ ├─✅─GuessReleaseID extracts release from lGHEventPayload when available (#152)
│ ├─✅─GuessReleaseID converts tag name to release id when necessary (#152)
│ └─✅─FetchRawReleaseByTagName generates the expected call (#152)
├─☑️─Feature 150: Link to GHA Run in Report
│ ├─✅─CommentIssue includes run URL when available (#150)
│ ├─✅─FetchRunURL returns the expected URL (#150)
│ ├─✅─FetchRunJobsRaw makes the expected call (#150)
│ ├─✅─FetchRunInfoRaw makes the expected call (#150)
│ └─✅─CommentIssue includes session info (#150)
├─☑️─Bug 149: `QCPR()` should work after PRs are merged
│ ├─✅─FetchAllMergeIssueNumbers returns unique, sorted issue numbers (#149)
│ └─✅─FetchPRRefs returns source and target refs (#84, #133, #149)
├─☑️─Technical Task 146: Lower R Version Requirement
│ └─✅─The required R version is within the normal support window (#146)
├─☑️─Bug 143: Properly reference qcthat in actions
│ └─✅─qcthat is namespaced in GHA (#143)
├─☑️─Bug 141: Fix milestone action
│ └─✅─Action_qcthat targets the expected action (#55, #68, #69, #73, #88, #141, #157, #198)
├─☑️─Bug 133: Big PRs fail to generate PR-associated issues report
│ ├─✅─FetchRepoIssueClosers returns an empty df when no issues are found (#133)
│ ├─✅─FetchRepoIssueClosers processes raw data correctly (#133)
│ ├─✅─FetchRepoIssueClosersRaw processes pagination correctly (#133)
│ ├─✅─IsIssueCloserFromRepo filters cross-repo PRs (#133)
│ ├─✅─FetchRepoIssueClosersRawBatch generates the expected calls (#133)
│ ├─✅─FetchMergeCommitSHAs returns unique, sorted SHAs (#84, #133)
│ ├─✅─BuildCommitPRQuery builds the expected query (#133)
│ ├─✅─FetchAllPRIssueNumbers returns unique, sorted issue numbers (#133)
│ ├─✅─BuildPRIssuesQuery builds the expected query (#133)
│ └─✅─FetchPRRefs returns source and target refs (#84, #133, #149)
├─☑️─Bug 132: Deal with multiple PRs
│ ├─✅─FetchRefPRNumber fetches PR number for a branch ...
ForTesting
This is not a real release. It's here to use in test cases.
{qcthat} Reports
Milestone
✅ A qcthat issue test matrix with 1 milestone, 1 issue, and 1 test
└─█─Milestone: ForTesting (1 issue, 1 test)
└─📥─Technical Task 179: For Testing
└─✅─This package works for certain issues unconnected to actual features (#179)
# Issue state: 📥 = open, ☑️ = closed (completed), ⛔ = closed (won't fix)
# Test disposition: ✅ = passed, ❌ = failed, 🚫 = skipped
🟢 All issues have at least one test
Completed Issues
✅ A qcthat issue test matrix with 3 milestones, 60 issues, and 167 tests
├─█─Milestone: v0.2.0 (11 issues, 23 tests)
│ ├─☑️─Bug 61: Show "won't fix" for "duplicate"
│ │ └─✅─Issues closed as duplicates display the proper symbol (#61)
│ ├─☑️─Feature 60: Show summary of report
│ │ ├─✅─MakeKeyItem works (#60)
│ │ ├─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ │ └─✅─Disposition indicators deal with all cases (#60)
│ ├─☑️─Technical Task 49: Unnest IssueTestMatrix for easier filtering
│ │ ├─✅─CompileIssueTestMatrix combines issues and test results into an IssueTestMatrix tibble (#35, #49)
│ │ ├─✅─Printing a generic qcthat_object returns input invisibly (#49)
│ │ ├─✅─FinalizeTree adds tree characters correctly (#49)
│ │ ├─✅─Printing a Milestone returns input invisibly (#49)
│ │ ├─✅─Printing a Milestone outputs a user-friendly tree (#49)
│ │ ├─✅─Printing a SingleIssueTestResults returns input invisibly (#49)
│ │ └─✅─Printing a SingleIssueTestResults outputs a user-friendly tree (#49)
│ ├─☑️─Bug 47: Fetch *all* repo issues
│ │ └─✅─FetchRepoIssues fetches all repo issues (#47)
│ ├─☑️─Bug 45: Deal with length-0 results
│ │ └─✅─ExtractDisposition() helper errors informatively for missing results within lTestResult object (#45)
│ ├─☑️─Technical Task 37: Package QC Report GHA
│ │ └─✅─Reports generated via GHA include information about the issues (#77, #37)
│ ├─☑️─Feature 36: Print IssueTestMatrix
│ │ └─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ ├─☑️─Feature 35: Generate Issue-Test Matrix
│ │ ├─✅─CompileIssueTestMatrix returns an empty IssueTestMatrix with empty input (#35)
│ │ └─✅─CompileIssueTestMatrix combines issues and test results into an IssueTestMatrix tibble (#35, #49)
│ ├─☑️─Feature 34: Get repo issues
│ │ ├─✅─FetchRepoIssues returns an empty df when no issues found (#34)
│ │ └─✅─FetchRepoIssues returns a formatted df for real issues (#34)
│ ├─☑️─Feature 32: Extract test information from test results
│ │ ├─✅─CompileTestResults errors informatively for bad input (#32)
│ │ ├─✅─CompileTestResults works for empty testthat_results (#32)
│ │ ├─✅─CompileTestResults returns the expected object (#32)
│ │ ├─✅─ExtractDisposition() helper counts warnings as errors (#32)
│ │ └─✅─ExtractDisposition() helper errors informatively for weird results (#32)
│ └─☑️─Requirement 31: Generate package QC report
│ ├─✅─Printing an IssueTestMatrix returns input invisibly (#31)
│ └─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
├─█─Milestone: v1.0.0 (19 issues, 51 tests)
│ ├─☑️─Technical Task 101: Switch `lglShowIgnoredLabels` default to TRUE
│ │ └─✅─Ignored issues are shown by default (#101)
│ ├─☑️─Bug 96: Don't include ignored labels in `QCIssues()` warnings
│ │ └─✅─QCIssues doesn't warn about ignored issues (#96)
│ ├─☑️─Bug 95: Install qcthat as part of Action installation
│ │ └─✅─qcthat is installed as part of the GHA (#95, #141)
│ ├─☑️─Feature 90: Function to create qcthat-nocov label
│ │ ├─✅─Default helpers return expected values (#90)
│ │ ├─✅─SetupGHLabels creates missing labels (#90)
│ │ ├─✅─SetupGHLabels skips existing labels (#90)
│ │ ├─✅─PrepareDFLabels normalizes and filters correctly (#90)
│ │ ├─✅─Helper functions normalize strings correctly (#90)
│ │ ├─✅─ValidateDFLabels checks for required columns (#90)
│ │ ├─✅─CreateGHLabel reports success conditional on lglVerbose (#90)
│ │ └─✅─CreateGHLabel throws an error if the API doesn't report the expected result (#90)
│ ├─☑️─Feature 88: Report by Milestone
│ │ ├─✅─Action_QCMilestone targets the expected action (#88, #68)
│ │ ├─✅─QCMilestones reports on specific milestones (#88, #68)
│ │ ├─✅─QCMilestones warns about unknown milestones (#88)
│ │ └─✅─QCMilestones errors with no valid milestones (#88)
│ ├─☑️─Feature 86: Function to report on specific issues
│ │ ├─✅─QCIssues reports on specific issues (#86)
│ │ ├─✅─QCIssues warns about unknown issues (#86)
│ │ └─✅─QCIssues errors with no valid issues (#86)
│ ├─☑️─Feature 85: Report Issue-Test Coverage in Footer
│ │ ├─✅─Printing an IssueTestMatrix outputs a user-friendly tree (#31, #36, #60, #85)
│ │ └─✅─MakeITRCoverageFooter deals with all cases (#85)
│ ├─☑️─Feature 84: Function(s) to filter report to issues associated with PR/branch
│ │ ├─✅─FetchRepoPRs returns an empty df when no issues found (#84)
│ │ ├─✅─FetchRepoPRs returns a formatted df for real PRs (#84)
│ │ ├─✅─GuessPRNumber delegates to its sub-functions (#84)
│ │ ├─✅─GetGHAPRNumber returns NULL for bad arg (#84, #163)
│ │ ├─✅─GetGHAPRNumber extracts PR number from lGHEventPayload when available (#84, #163)
│ │ ├─✅─GetGHAPRNumber returns NULL for bad extracted PR number (#84, #163)
│ │ ├─✅─FetchRefPRNumber fetches PR number for a branch (#84, #132)
│ │ ├─✅─QCMergeGH filters to merge-associated issues (#68, #84)
│ │ ├─✅─FetchMergeCommitSHAs returns unique, sorted SHAs (#84, #133)
│ │ ├─✅─FetchAllMergePRNumbers returns unique, sorted PR numbers (#84)
│ │ ├─✅─FetchAllMergePRNumbers returns empty vector for no matching PRs (#84)
│ │ ├─✅─QCMergeLocal filters to ref-specific issues (#68, #84)
│ │ ├─✅─FindKeywordIssues extracts issues that will be closed by commits (#84)
│ │ ├─✅─QCPR errors informatively for bad intPRNumber (#84)
│ │ ├─✅─QCPR filters to PR-related issues (#68, #84)
│ │ ├─✅─FetchPRRefs returns source and target refs (#84, #133, #149)
│ │ ├─✅─PrepareGQLQuery constructs a query (#84)
│ │ └─✅─GQLWrapper wraps a query correctly (#84)
│ ├─☑️─Requirement 81: Report issue test coverage
│ │ └─✅─Can report ignored issue counts (#67, #81)
│ ├─☑️─Feature 80: Filter main qcthat report to only "closed (completed)"
│ │ └─✅─QCCompletedIssues filters to completed issues (#80, #69)
│ ├─☑️─Bug 77: GHA-generated report stability
│ │ └─✅─Reports generated via GHA include information about the issues (#77, #37)
│ ├─☑️─Feature 73: Add qcthis.yaml to a package
│ │ ├─✅─InstallAction calls InstallFile with expected parts (#73)
│ │ ├─✅─Action_QCCompletedIssues targets the expected action (#73, #69)
│ │ ├─✅─qcthatPath constructs paths (#73)
│ │ └─✅─InstallFile copies files as expected (#73)
│ ├─☑️─Technical Task 72: Add qc report to triggering PR as comment
│ │ └─✅─CommentReport generates the expected call (#99, #72)
│ ├─☑️─Requirement 69: Package QC Report Usability
│ │ ├─✅─Action_QCCompletedIssues targets the expected action (#73, #69)
│ │ ├─✅─Can print without milestone info (#40, #69)
│ │ ├─✅─QCPackage wraps the core qcthat functions (#46, #69)
│ │ └─✅─QCCompletedIssues filters to completed issues (#80, #69)
│ ├─☑️─Requirement 68: PR/Branch Report
│ │ ├─✅─Action_QCPRIssues targets the expected action (#55, #68)
│ │ ├─✅─Action_QCMilestone targets the expected action (#88, #68)
│ │ ├─✅─QCMergeGH filters to merge-associated issues (#68, #84)
│ │ ├─✅─QCMergeLocal filters to ref-specific issues (#68, #84)
│ │ ├─✅─QCPR filters to PR-related issues (#68, #84)
│ │ └─✅─QCMilestones reports on specific milestones (#88, #68)
│ ├─☑️─Feature 67: Ignore issues with `qcthat-nocov` label
│ │ ├─✅─CompileIssueTestMatrix excludes issues in chrIgnoredLabels (#67)
│ │ ├─✅─ExtractDisposition() helper counts test errors as failures (#67)
│ │ └─✅─Can report ignored issue counts (#67, #81)
│ ├─☑️─Feature 55: GHA: Report of associated issues
│ │ └─✅─Action_QCPRIssues targets the expected action (#55, #68)
│ ├─☑️─Feature 46: Wrapper to run everything
│ │ └─✅─QCPackage wraps the core qcthat functions (#46, #69)
│ └─☑️─Feature 40: Print Without Milestones
│ └─✅─Can print without milestone info (#40, #69)
└─█─Milestone: v1.1.0 (30 issues, 103 tests)
├─☑️─Feature 172: Add timestamps to comments
│ ├─✅─CommentIssue compiles the body as expected (#83, #172)
│ └─✅─PrettyTimestamp works (#172)
├─☑️─Documentation Task 168: Draft the real slide deck
│ └─✅─The pkgdown site has an intro slide deck (#167, #168)
├─☑️─Technical Task 167: Add a basic slide deck to pkgdown
│ └─✅─The pkgdown site has an intro slide deck (#167, #168)
├─☑️─Feature 165: Combined `CommentPRReports()` function
│ ├─✅─FormatReportBody finalizes reports (#165)
│ ├─✅─FormatReportType generates a report type (#165)
│ ├─✅─CommentAllReports generates the expected calls (#165)
│ ├─✅─All qcthat reports are combined in a single GHA (#129, #165, #152)
│ ├─✅─GuessMilestones returns NULL for bad arg (#165)
│ ├─✅─GuessMilestones extracts milestones from lGHEventPayload when available (#165)
│ └─✅─GuessMilestones returns NULL for bad extracted milestones (#165)
├─☑️─Feature 164: Functions to manage envQcthat$UATIssues
│ └─✅─SaveUATIssues saves UAT issues and LoadUATIssues loads them (#164)
├─☑️─Feature 163: Use GitHub Event for `GetGHAPRNumber()`
│ ├─✅─GetGHAPRNumber returns NULL for bad arg (#84, #163)
│ ├─✅─GetGHAPRNumber extracts PR number from lGHEventPayload when available (#84, #163)
│ └─✅─GetGHAPRNumber returns NULL for bad extracted PR number (#84, #163)
├─☑️─Feature 162: GuessIssueNumber()
│ ├─✅─GuessIssueNumber returns NULL for bad arg (#162)
│ ├─✅─GuessIssueNumber extracts issue number from lGHEventPayload when available (#162)
│ ├─✅─GuessIssueNumber returns NULL for bad extracted issue number (#162)
│ ├─✅─LoadGHEventPayload returns NULL when envvar is empty (#162)
│ ├─✅─LoadGHEventPayload returns NULL for bad path (#162)
│ ├─✅─LoadGHEv...
v1.0.0
qcthat v1.0.0
You can now use this package to implement a QC framework for any R package associated with a GitHub repository.
New features
A series of QC*() functions to generate QC reports for different sets of issues:
QCPackage()for all issues and tests for an R package and its associated GitHub repository (#46, #69).QCCompletedIssues()for only issues closed as completed (#69, #80).QCIssues()for specific issues (#86), andQCMilestones()for issues associated with specific named milestones (#68, #88)QCPR()for issues associated with specific GitHub pull requests,QCMergeGH()to generalize to issues associated with any GitHub merge using GitHub's graph to determine connections, andQCMergeLocal()to detect probable associations based on commit messages (#68, #84).
A series of Action_*() functions to set up GitHub actions for QC reports:
Action_QCCompletedIssues()to runQCCompletedIssues()(#69, #73).Action_QCPRIssues()to runQCPR()for specific pull requests (#55, #68).Action_QCMilestone()to runQCMilestones()for pull requests associated with milestones, and for releases with names that match milestones (#68, #88).
Other changes
This release also includes a number of helper functions and internal improvements.
What's Changed
- Add release trigger to GHA by Jon Harmon (@jonthegeek) in #74
- Better filename by Jon Harmon (@jonthegeek) in #75
- Stabilize Report on GHA by Jon Harmon (@jonthegeek) in #78
- Add comments to PRs that trigger qc reports by Jon Harmon (@jonthegeek) in #79
- Make it easy to add qc report by Jon Harmon (@jonthegeek) in #82
- Fix 68: QC Report: Associated Issues by Jon Harmon (@jonthegeek) in #87
- Fix 67 90 Ignore Issues with
qcthat-nocovlabel by Jon Harmon (@jonthegeek) in #93 - Fix 95 96 101 81 Tweaks for real use by Jon Harmon (@jonthegeek) in #97
- qcthat v1.0.0 Release Candidate by Jon Harmon (@jonthegeek) in #103
Full Changelog: v0.2.0...v1.0.0
qcthat v0.2.0
Overview
This is a complete rewrite of the package to implement a framework that links GitHub issues to evidence that those issues have been implemented.
New features
- Function
FetchRepoIssues()to get issues from a GitHub repository and compile them into a user-friendly data frame (#34, #47). - Function
CompileTestResults()to extract test results fromtestthattest runs and compile them into a user-friendly data frame (#32). - Function
CompileIssueTestMatrix()to link GitHub issues to test results, producing anIssueTestMatrixobject that summarizes the state of issues and their associated tests (#35, #49). - Custom print methods for
qcthat_SingleIssueTestResults,qcthat_Milestone, andqcthat_IssueTestMatrixobjects to display their contents in a user-friendly tree format (#31, #36, #45, #60, #61).
What's Changed
- Fix 14, 15, 16: Setup
pkgdown, add packages to DESCRIPTION, move vignettes to vignettes/articles by Matt Roumaya (@mattroumaya) in #17 - Main to dev by Jon Harmon (@jonthegeek) in #22
- Update package infrastructure by Jon Harmon (@jonthegeek) in #23
- Add Business Process Overview by Natalia Andriychuk (@nandriychuk) in #26
- Simplified Business Process by Jeremy Wildfire (@jwildfire) in #29
- Extract test information and repo issues by Jon Harmon (@jonthegeek) in #33
- Update README with new process by Jon Harmon (@jonthegeek) in #50
- Missing
resultsand issue counts by Jon Harmon (@jonthegeek) in #51 - Don't nest IssueTestMatrix by Jon Harmon (@jonthegeek) in #58
- Fix 30: Finish infrastructure setup by Jon Harmon (@jonthegeek) in #64
New Contributors
- Natalia Andriychuk (@nandriychuk) made their first contribution in #26
- Jeremy Wildfire (@jwildfire) made their first contribution in #29
Full Changelog: v0.1...v0.2.0
v0.1
qcthat v0.1
Initial release 🥳
This initial release will be used to pilot testing the framework on other internal repositories and filing bug fixes, features, etc. as needed.
What's Changed
- Initial Demo by Matt Roumaya (@mattroumaya) in #2
- Alpha testing by Matt Roumaya (@mattroumaya) in #4
- Fix 3 by Matt Roumaya (@mattroumaya) in #6
- Updates by Matt Roumaya (@mattroumaya) in #9
- improve init_github_actions() by Matt Roumaya (@mattroumaya) in #11
- Fix 8 by Matt Roumaya (@mattroumaya) in #12
- update DESCRIPTION for release by Matt Roumaya (@mattroumaya) in #13
New Contributors
- Matt Roumaya (@mattroumaya) made their first contribution in #2
Full Changelog: https://github.com/Gilead-BioStats/qcthat/commits/v0.1