Skip to content

Releases: Gilead-Public/qcthat

v1.1.3

Choose a tag to compare

@jharmon-gilead jharmon-gilead released this 17 Jun 14:23
e627805

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 sessioninfo runs 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 with ReadJSONAsIssueTestMatrix() (#298).
  • If the fail-for-missing-tests input is true (default), the qcthat action fails if any issues associated with the triggering PR lack tests (and are not tagged with qcthat-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 while TriggerUAT() 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 as chrAssignees, defaulting to the value of a qcthat_UAT_ASSIGNEES environment variable. This variable can be set in the GitHub action via the uat-assignees input, 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

New Contributors

Full Changelog: v1.1.2...v1.1.3

v1.1.2

Choose a tag to compare

@lauramaxwell lauramaxwell released this 20 Mar 16:54
d0958dc

Overview

This patch release focuses on introducing the world to qcthat.

Documentation improvements

  • Two new vignettes have been added, vignette("qcthat") and vignette("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

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 tests passed

🟢 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 ...
Read more

v1.1.1

Choose a tag to compare

@jonthegeek jonthegeek released this 06 Mar 20:46
75c5db4

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-issues skill now generates a report in pkgdown/assets describing 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.yaml workflow no longer erroneously mentions "push" triggers (#259).

What's Changed

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 tests passed

🟢 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...
Read more

v1.1.0

Choose a tag to compare

@jonthegeek jonthegeek released this 24 Feb 15:11
936f46d

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 connecting testthat tests 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 via Action_qcthat() (#65, #111, #114, #115, #116, #157).

Improved onboarding:

  • use_qcthat() calls SetupGHLabels() and Action_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 functions ExtractTestsFromFiles(), MapTestFilesToPotentialIssues(), and PrepareTestIssueContext() (#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 pkgdown site for qcthat now 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() and GetGHRepo() should now work for forks, even if the local repo name does not match the upstream repo name (#199).

What's Changed

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 ...
Read more

ForTesting

Choose a tag to compare

@jonthegeek jonthegeek released this 05 Feb 16:23
56af16c

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 tests passed

🟢 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...
Read more

v1.0.0

Choose a tag to compare

@nandriychuk nandriychuk released this 17 Dec 16:03
cc7957a

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), and QCMilestones() 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, and QCMergeLocal() 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 run QCCompletedIssues() (#69, #73).
  • Action_QCPRIssues() to run QCPR() for specific pull requests (#55, #68).
  • Action_QCMilestone() to run QCMilestones() 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

Full Changelog: v0.2.0...v1.0.0

qcthat v0.2.0

Choose a tag to compare

@jonthegeek jonthegeek released this 05 Nov 17:47
11ed5e1

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 from testthat test runs and compile them into a user-friendly data frame (#32).
  • Function CompileIssueTestMatrix() to link GitHub issues to test results, producing an IssueTestMatrix object that summarizes the state of issues and their associated tests (#35, #49).
  • Custom print methods for qcthat_SingleIssueTestResults, qcthat_Milestone, and qcthat_IssueTestMatrix objects to display their contents in a user-friendly tree format (#31, #36, #45, #60, #61).

What's Changed

New Contributors

Full Changelog: v0.1...v0.2.0

v0.1

Choose a tag to compare

@mattroumaya mattroumaya released this 06 Feb 18:58
ec48694

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

New Contributors

Full Changelog: https://github.com/Gilead-BioStats/qcthat/commits/v0.1