feat(workflows): add Python testing CI workflow with pytest and Codecov#934
Conversation
|
Hi @JasonOA888 — thank you for taking the time to contribute to this project! We really appreciate the effort you've put into this PR. Before we can review and merge your changes, we need you to sign the Microsoft Contributor License Agreement (CLA). The CLA bot should have posted instructions on this PR when it was opened. You can sign by posting the following comment:
If you're contributing on behalf of a company, use:
We'd love to include your work, but unfortunately we won't be able to accept the contribution without a signed CLA. If we don't hear back, we'll eventually need to close this PR and potentially redo the work under a signed agreement. Thanks again, and please let us know if you have any questions! |
|
PR Compliance Update — The following adjustments were made to align this PR with project conventions:
No content was changed — only formatting and metadata alignment. Thank you for the contribution! 🙏 |
katriendg
left a comment
There was a problem hiding this comment.
Hi @JasonOA888, thank you so much for taking the time to contribute to this project! It's highly appreciated, and you've made a solid start on the pytest CI workflow. The workflow structure, pinned actions, OIDC-based Codecov integration, and the soft-fail / changed-files-only inputs are all heading in the right direction.
That said, after comparing the PR against the requirements in #890, there are a number of items that still need to be addressed before this can be merged. Sharing the full list here so the path forward is straightforward:
Missing from the issue requirements
-
working-directoryinput — The issue requires the workflow to accept aworking-directoryinput so the orchestrator can call it once per Python skill directory. This is a core architectural requirement for multi-skill support and is currently absent. -
Dependency management approach — The issue specifies using
uv sync --lockedwithin the skill's working directory (to use the committed lockfile and prevent supply-chain risks), notuv pip install --system. The current approach installs packages globally and bypasses lockfile guarantees. -
pr-validation.ymlintegration — The issue requires modifyingpr-validation.ymlto callpytest-tests.ymlas a job in the validation matrix. This file was not changed. -
codecov.ymlflag configuration — The issue requires adding apytestcoverage flag incodecov.ymlwith path filters (.github/skills/**/scripts/**) andcarryforward: true. This file was not changed. -
pytest-mockin skill dev dependencies — The issue requirespytest-mockto be included in the[dependency-groups]dev dependencies of Python skills'pyproject.tomlfiles, not just installed in CI.
Implementation differences
code-coverageinput — The workflow adds acode-coverageboolean toggle, but the issue expects coverage to always be collected during test runs. This extra input diverges from the spec.- Test execution — The issue expects
uv run pytest(running within the skill's virtual environment) rather than a barepytestcall at the repo root. - Acceptance criteria gap — "Adding a new Python skill requires only a new orchestrator job entry, no workflow changes" depends on the
working-directoryinput and orchestrator integration, both currently missing.
Would you be able to update the PR to cover the remaining items? Happy to answer any questions about the expected architecture or help clarify anything in the issue. Thanks again for contributing!
@microsoft-github-policy-service agree |
|
@microsoft-github-policy-service agree |
|
Thanks for the detailed review @katriendg! The feedback is very helpful. I can see the PR is missing several key requirements from #890:
I'd like to update this PR to address all the requirements. A few clarifying questions:
I'll start working on the updates. |
- Add reusable pytest-tests.yml workflow - Accepts working-directory input for multi-skill support - Uses uv sync --locked for dependency management - Runs pytest with coverage collection - Uploads coverage to Codecov with pytest flag - Update pr-validation.yml - Add pytest-powerpoint job calling the new workflow - Update codecov.yml - Add pytest coverage flag with skill path filters - Enable carryforward for skills not tested in a given commit Fixes microsoft#890
e992624 to
4046c7c
Compare
|
PR updated to address all review feedback: Changes Made1. pytest-tests.yml (new reusable workflow)
2. pr-validation.yml
3. codecov.yml
Notes
|
|
@JasonOA888, thank you for the quick turnaround addressing the earlier feedback. The reusable workflow ( Two items remain before this can move forward:
The contribution is valuable and aligns well with the #890 requirements. Once #868 is in, we can get this across the finish line quickly. Thanks again! |
Changes: - Add discover-python-skills job that finds all pyproject.toml under .github/skills/ - Replace hardcoded pytest-powerpoint job with matrix-based pytest job - Adding new Python skill now only requires dropping pyproject.toml in skill folder This follows the project convention of dynamic discovery (see extension-package.yml). Note: Tests will pass with empty matrix until PowerPoint skill (microsoft#868) lands.
|
Updated to use dynamic discovery following project conventions. Changes1. Discovery Job (
|
|
@katriendg Sounds good! I'll keep this PR ready and rebased. Once #868 merges, I'll:
The workflow is already structured for dynamic discovery, so it should work automatically once a Python skill exists in the repo. (Unable to convert to draft via API, but consider this ready-and-waiting) |
- Add coverage.status.project.pytest with pytest flag to codecov.yml - Quote $GITHUB_OUTPUT in check-python step for shell safety - Replace hashFiles(inputs.working-directory) with inputs.working-directory for artifact and codecov naming - Make working-directory input required, remove hardcoded default
Requesting review from another maintainer so we can merge
- rewrite all tests to match actual validate_slides.py public API - add async test coverage for validate_slide, run, and main - cover argument parsing, image discovery, prompt loading, and error paths - achieve 99% code coverage on validate_slides module 🧪 - Generated by Copilot
- Update astral-sh/setup-uv from v6.4.3 (deleted SHA) to v7.4.0 - Add TestMain class to test_build_deck.py covering full build, template build, and partial rebuild paths (76% → 91%) - Add TestParseSlideNumbers, slide_numbers filtering, fitz import error, and BrokenPipeError tests to test_render_pdf_images.py (78% → 99%) - Fix missing slide_numbers attribute in Namespace test fixtures - 531 tests passing, 90% overall coverage
The v6.0.0 SHA (e797f83) is no longer available on GitHub, causing the PR validation pytest job to fail. Update to v6.2.0 SHA (a309ff8) matching copilot-setup-steps.yml.
🐛 - Generated by Copilot
|
Hey @JasonOA888 — just wanted to take a moment to say thank you for picking up these backlog items and driving them forward. Adding Python testing CI with pytest and Codecov integration is a meaningful contribution to the project, and the dynamic skill discovery via matrix strategy is a great pattern that will scale well as more Python skills are added. We really appreciate your patience working through the review feedback and revisions with us — the PR has shaped up well through the collaboration. The workflow is solid, the coverage configuration is clean, and the overall design fits nicely into the existing CI architecture. I've pushed a few additional commits to the branch to address the remaining review items and CI issues we identified together:
Thanks again for the contribution — looking forward to getting this merged! 🚀 |
…ame sanitization - add Set artifact name step using tr to convert path separators - reference step output for upload-artifact name 🔧 - Generated by Copilot
🤖 I have created a release *beep* *boop* --- ## [3.2.0](hve-core-v3.1.46...hve-core-v3.2.0) (2026-03-20) ### ✨ Features * add -OutputPath parameter to Validate-MarkdownFrontmatter.ps1 ([#1134](#1134)) ([fdf1bcf](fdf1bcf)), closes [#1006](#1006) * add action version consistency scan workflow ([#1127](#1127)) ([4229df1](4229df1)) * **agent:** MVE Experiment Designer ([#976](#976)) ([70f86ca](70f86ca)) * **agents:** add ADO Backlog Manager orchestrator agent ([#800](#800)) ([fae3987](fae3987)) * **agents:** add meeting analyst agent for transcript analysis using work-iq ([#502](#502)) ([5345b5b](5345b5b)) * **agents:** add quick-reference line to RPI Phase 5 suggestions ([#897](#897)) ([9a90f39](9a90f39)) * **agents:** add RAI Planner, enhance SSSC Planner, and redesign Security Planner ([#979](#979)) ([06f826c](06f826c)) * **agents:** add symmetric cross-system handoff to GitHub Backlog Manager ([#952](#952)) ([ba34a35](ba34a35)) * **agents:** Functional Code Review Agent — pre-PR functional correctness reviewer ([#733](#733)) ([9cf63b7](9cf63b7)) * **build:** add Python extensions and uv 0.10.8 to devcontainer ([#920](#920)) ([9ca0579](9ca0579)) * **build:** add uv ecosystem to Dependabot configuration ([#913](#913)) ([2a4bd39](2a4bd39)) * **build:** enable npm pinning enforcement in dependency scan ([#838](#838)) ([4e9e31f](4e9e31f)) * **build:** migrate attestation actions to v4.1.0 and add SBOM verification docs ([#841](#841)) ([ca1e65b](ca1e65b)) * **collections:** add four new validator checks (orphan, duplicate, companion, coverage) ([#869](#869)) ([1a96b73](1a96b73)) * **devcontainer,security:** add enterprise artifact hub configuration ([#1032](#1032)) ([1d56d25](1d56d25)) * **docs:** add Rust coding standards and guidelines ([#809](#809)) ([d4c4899](d4c4899)) * **extension:** add Microsoft logo icon to VS Code Marketplace listings ([#906](#906)) ([82aca41](82aca41)) * **github:** add declarative label management ([#953](#953)) ([a1a6845](a1a6845)) * **instructions:** add ADO backlog shared infrastructure ([#786](#786)) ([1914078](1914078)) * **instructions:** add ADO backlog sprint planning and capacity tracking ([#788](#788)) ([d6fb77d](d6fb77d)) * **instructions:** add ADO triage workflow and prompt ([#787](#787)) ([cde0190](cde0190)) * **instructions:** add shared story quality conventions and sprint planning ([#803](#803)) ([a2f18e3](a2f18e3)) * **prompts:** add ADO discovery and work item prompts with agent routing ([#790](#790)) ([7e74523](7e74523)) * **prompts:** add security review prompts ([#1118](#1118)) ([ad30967](ad30967)) * **scripts:** add dynamic Python skill discovery for lint/test ([#957](#957)) ([0a90f57](0a90f57)) * **scripts:** add Get-StandardTimestamp utility to CIHelpers module ([#1126](#1126)) ([b273a4b](b273a4b)) * **scripts:** add Python copyright header validation ([#905](#905)) ([67df902](67df902)) * **scripts:** add Python skill support to Validate-SkillStructure ([#903](#903)) ([68479d9](68479d9)) * **scripts:** add workflow npm command scanning to dependency pinning ([#837](#837)) ([6b5ae06](6b5ae06)) * **security:** add basic security reviewer agent with owasp skills ([#1008](#1008)) ([cb1fd05](cb1fd05)) * **security:** add sigstore attestation bundles and fix component-detection action ([#1148](#1148)) ([f79c272](f79c272)) * **skills:** add Atheris fuzz harness with CI workflow integration ([#1102](#1102)) ([d337e1d](d337e1d)) * **skills:** add PowerPoint automation skill with YAML-driven deck generation ([#868](#868)) ([00465cd](00465cd)) * **skills:** convert hve-core-installer agent to self-contained skill ([#846](#846)) ([1d821fb](1d821fb)) * **skills:** enhance pr-reference skill with flexible filtering and base branch detection ([#1095](#1095)) ([26a32ea](26a32ea)) * **workflows:** add devcontainer infrastructure change log workflow ([#899](#899)) ([8aca446](8aca446)) * **workflows:** add milestone auto-close on stable and pre-release publishes ([#834](#834)) ([79362b1](79362b1)) * **workflows:** add ms.date documentation freshness checking ([#969](#969)) ([3ed441c](3ed441c)) * **workflows:** add Python linting CI workflow with Ruff ([#951](#951)) ([f89f0eb](f89f0eb)) * **workflows:** add Python testing CI workflow with pytest and Codecov ([#934](#934)) ([5e8306f](5e8306f)) * **workflows:** add uv and Python package sync to copilot-setup-steps ([#921](#921)) ([45d517d](45d517d)) ### 🐛 Bug Fixes * **build:** override Linguist vendored flag for Python skill files ([#1155](#1155)) ([0eee5b6](0eee5b6)) * **build:** override serialize-javascript to >=7.0.3 for RCE fix ([#876](#876)) ([e49039a](e49039a)) * **build:** resolve Pinned-Dependencies alerts for vsce npm commands in extension workflows ([#782](#782)) ([89dad9d](89dad9d)) * **build:** update undici and yauzl overrides for security audit ([#1030](#1030)) ([2c2f92f](2c2f92f)) * **docs:** add CLI Plugins to install.md navigation surfaces ([#902](#902)) ([79d6595](79d6595)) * **docs:** add sidebar ordering for Design Thinking documentation ([#832](#832)) ([551fddc](551fddc)), closes [#830](#830) * **docs:** graduate design-thinking to preview and correct stale collection references ([#831](#831)) ([5110e35](5110e35)) * **docs:** include project-planning in UX Designer install guidance ([#908](#908)) ([e7aa9bc](e7aa9bc)) * **docs:** remediate writing-style convention violations ([#865](#865)) ([68b04bc](68b04bc)) * **docs:** remove draft content announcement banner ([#825](#825)) ([b45de80](b45de80)) * **docs:** remove unbounded path-to-regexp override breaking SSG ([#1153](#1153)) ([d810018](d810018)) * **docs:** use actual clone paths instead of folder display names in multi-root workspace settings ([#984](#984)) ([5dbab82](5dbab82)) * **instructions:** replace black with ruff in uv-projects ([#898](#898)) ([b0c06d9](b0c06d9)) * **scripts:** cover .github/ skill files in copyright header validation ([#1055](#1055)) ([#1098](#1098)) ([27fbd33](27fbd33)) * **scripts:** eliminate phantom git changes from plugin generation ([#1035](#1035)) ([e49a1b5](e49a1b5)) * **scripts:** enable JSON log output for lint:version-consistency ([#1033](#1033)) ([52b0885](52b0885)) * **security:** calculate compliance score from total scanned dependencies ([#930](#930)) ([c112c3d](c112c3d)) * **skills:** add AST validation and namespace restriction for content-extra.py ([#1027](#1027)) ([c50c7a3](c50c7a3)) * **skills:** add depth limits to recursive PowerPoint processing functions ([#1028](#1028)) ([bf08994](bf08994)) * **skills:** harden XML parsing and blob writes in powerpoint extract ([#1053](#1053)) ([89d24b1](89d24b1)) * **skills:** resolve ruff lint and format violations in powerpoint skill ([#1048](#1048)) ([17bbe7a](17bbe7a)) * **workflows:** add uv.lock dependencies submission have fork-skip condition ([#1109](#1109)) ([dec56ac](dec56ac)) * **workflows:** automate weekly SHA staleness check with issue creation ([#975](#975)) ([1ea4caa](1ea4caa)) * **workflows:** close Codecov integration gaps for Pester and pytest flags ([#1106](#1106)) ([cca29b7](cca29b7)) * **workflows:** propagate uv sync errors in copilot-setup-steps ([#961](#961)) ([df88d7c](df88d7c)) * **workflows:** resolve release-please skip cascade and Python project discovery ([#1043](#1043)) ([79993e2](79993e2)) * **workflows:** scan only commit subjects for breaking change detection ([#1157](#1157)) ([a38a657](a38a657)) ### 📚 Documentation * clarify HVE Core Extension vs Installer messaging across documentation ([#965](#965)) ([0fceb8f](0fceb8f)) * **docs:** add ADO integration user documentation ([#935](#935)) ([ec89302](ec89302)) * **docs:** add Project Planning agent documentation ([#936](#936)) ([3a3a0fd](3a3a0fd)) * **onboarding:** overhaul marketplace onboarding and documentation site ([#982](#982)) ([4309e10](4309e10)) ### ♻️ Refactoring * **build:** merge code-review collection into coding-standards ([#863](#863)) ([8027e7b](8027e7b)) * **workflows:** rename release pipeline workflows and add marketplace automation triggers ([#829](#829)) ([b6397f4](b6397f4)) ### 🔧 Maintenance * **build:** add clean:logs npm script ([#1122](#1122)) ([f85fe02](f85fe02)), closes [#988](#988) * **build:** add JSON reporter for cspell ([#1123](#1123)) ([6d59f67](6d59f67)) * **ci:** add multi-arch support to copilot-setup-steps binary downloads ([#955](#955)) ([8d0c706](8d0c706)) * **deps-dev:** bump cspell from 9.6.4 to 9.7.0 in the npm-dependencies group ([#839](#839)) ([3fa16ff](3fa16ff)) * **deps:** bump actions/dependency-review-action from 4.8.3 to 4.9.0 in the github-actions group across 1 directory ([#942](#942)) ([1a9b858](1a9b858)) * **deps:** bump cairosvg from 2.8.2 to 2.9.0 in /.github/skills/experimental/powerpoint ([#1025](#1025)) ([f4deda7](f4deda7)) * **deps:** bump dompurify from 3.3.1 to 3.3.2 in /docs/docusaurus ([#924](#924)) ([d2060d6](d2060d6)) * **deps:** bump svgo from 3.3.2 to 3.3.3 in /docs/docusaurus ([#880](#880)) ([6dc2406](6dc2406)) * **deps:** bump the github-actions group across 1 directory with 4 updates ([#1100](#1100)) ([2290dc0](2290dc0)) * **deps:** bump the github-actions group with 6 updates ([#840](#840)) ([f57bc01](f57bc01)) * **docs:** correct New-MsDateReport table rendering and refresh stale docs ([#1114](#1114)) ([c2b806f](c2b806f)) * **settings:** remove orphaned Checkov config and stale gitignore entries ([#870](#870)) ([98fcd74](98fcd74)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: hve-core-release-please[bot] <254602402+hve-core-release-please[bot]@users.noreply.github.com> Co-authored-by: Bill Berry <wberry@microsoft.com>
Description
Add a reusable
pytest-tests.ymlCI workflow for Python testing with dynamic skill discovery, pytest coverage, and Codecov integration.Workflow (
pytest-tests.yml)working-directory,soft-fail, andchanged-files-onlyinputsupload-artifactstep for preserving raw coverage XMLPR Validation Integration (
pr-validation.yml).github/skills/containing apyproject.tomlchanged-files-onlymode enabled for PR validation runsCodecov Configuration (
codecov.yml)pytestflag scoped to.github/skills/**/scripts/**autowith 1% thresholdTest Coverage
pptx_shapes100%,pptx_utils100%,render_pdf_images99%,validate_slides99%,build_deck91%Related Issue(s)
Fixes #890
Type of Change
Select all that apply:
Code & Documentation:
Infrastructure & Configuration:
AI Artifacts:
prompt-builderagent and addressed all feedback.github/instructions/*.instructions.md).github/prompts/*.prompt.md).github/agents/*.agent.md).github/skills/*/SKILL.md)Other:
.ps1,.sh,.py)Testing
powerpointskill's 14 script filesactions/checkoutv4.2.2,actions/setup-pythonv6.2.0,astral-sh/setup-uvv7.4.0,actions/upload-artifactv4.4.3,codecov/codecov-actionv5.5.2)Checklist
Required Checks
Required Automated Checks
The following validation commands must pass before merging:
npm run lint:mdnpm run spell-checknpm run lint:frontmatternpm run validate:skillsnpm run lint:md-linksnpm run lint:ps