PyDynamicReporting is the Python client library for Ansys Dynamic Reporting, previously documented as Nexus. Ansys Dynamic Reporting is a service for pushing items of many types, including images, text, 3D scenes, and tables, into a database, where you can keep them organized and create dynamic reports from them. When you use PyDynamicReporting to connect to an instance of Ansys Dynamic Reporting, you have a Pythonic way of accessing all capabilities of Ansys Dynamic Reporting.
Documentation for the latest stable release of PyDynamicReporting is hosted at PyDynamicReporting documentation.
In the upper right corner of the documentation's title bar, there is an option for switching from viewing the documentation for the latest stable release to viewing the documentation for the development version or previously released versions.
You can also view or download the PyDynamicReporting cheat sheet. This one-page reference provides syntax rules and commands for using PyDynamicReporting.
On the PyDynamicReporting Issues page, you can create issues to report bugs and request new features. On the Discussions page on the Ansys Developer portal, you can post questions, share ideas, and get community feedback.
To reach the project support team, email pyansys.core@ansys.com.
The pydynamicreporting package supports Python 3.10 through 3.13 on
Windows and Linux. It is currently available on
PyPI.
For the base client package, run:
pip install ansys-dynamicreporting-core
This project uses uv for fast dependency management and virtual environment handling. To set up a development environment:
Prerequisites
Install uv by following the official installation guide.
You'll also need make:
# On Windows, install using chocolatey: choco install make # On Linux, make is usually pre-installed. If not, install via: sudo apt-get install build-essential # Ubuntu/Debian sudo yum groupinstall "Development Tools" # RHEL/CentOS/Fedora
Clone and Install
git clone https://github.com/ansys/pydynamicreporting cd pydynamicreporting make install
The make install command does the following:
- Synchronizes dependencies from
uv.lock(includes all optional extras) - Creates a
.venvvirtual environment automatically - Installs the package in editable mode
This creates an "editable" installation that lets you develop and test PyDynamicReporting simultaneously.
Developer workflow note
After making changes, run the pre-commit hooks (via uv) before committing.
Otherwise, the code-style CI check will fail.
make check
Available Make Commands
The Makefile provides several useful commands:
make check # Run code quality checks (pre-commit hooks) make version # Display the current project version make build # Build source distribution and wheel make check-dist # Validate built artifacts make test # Run the full test suite with coverage make smoketest # Quick import test make docs # Build documentation make clean # Remove build artifacts and caches
Running Tests
To run tests with coverage reporting:
make test
For a quick sanity check:
make smoketest
Updating Dependencies
If you see an error like The lockfile at `uv.lock` needs to be updated,
run the following commands to update the lock file:
uv sync --upgrade --all-extras uv lock --upgrade
Then make sure to commit the updated uv.lock file.
This ensures your local environment is synchronized with the latest dependency
constraints.
Resolving CI Security Scan Errors
If CI reports a Security Scan error, first activate the virtual
environment and then refresh the environment and lock file:
# Windows PowerShell .\.venv\Scripts\Activate.ps1 # Linux/macOS source .venv/bin/activate uv sync --upgrade --all-extras uv lock --upgrade
After these commands finish, commit the updated uv.lock file.
For serverless compatibility work, keep the base dependency set broad enough to
span the supported ADR product lines and place release-specific pins in
constraints/.
To run GitHub Actions on your local desktop, install the act package:
choco install act-cli # Windows # or: brew install act # macOS/Linux with Homebrew
To run a specific job from the CI/CD workflow, use:
act -W '.github/workflows/ci_cd.yml' -j style --bind # Run code style checks act -W '.github/workflows/ci_cd.yml' -j smoketest --bind # Run smoke tests
Note: Deploy and upload steps are guarded with if: ${{ !env.ACT }} to
prevent them from running locally. Only build and validation steps will
execute with act.
This project now uses tag-driven releases and dynamic versions powered
by hatch-timestamp-version (based on hatch-vcs). Stable releases are
cut from Git tags (vX.Y.Z). Development builds use UTC timestamped
versions derived from the most recent tag. Version numbers come from tags, but
maintained product lines can still use long-lived stable/ branches.
- Stable releases: The version is the exact Git tag (for example,
v0.10.0-> package version0.10.0). - Development builds: Version is computed from the latest tag plus a
timestamp, for example
0.10.1.devYYYYMMDDHHMMSS. - No manual editing of
pyproject.tomlfor versions;[tool.hatch.version]drives everything. - Product compatibility is declared separately from SemVer. The package version stays plain SemVer, while the package metadata declares the bundled ADR product release and the supported annual product lines.
mainis reserved for the next ADR product line under development.- Long-lived maintenance branches use the
stable/<product-line>.xnaming convention. - Stable releases are still cut from tags, but the tag should be created from the maintenance branch that owns that product line.
- Backport only the specific fixes you want to ship on an older supported
line. Forward-port maintenance fixes from
stable/<product-line>.xback tomainafter they are released.
- Each client major line represents one ADR compatibility epoch.
- A client line supports the current ADR annual product line and the previous annual product line.
- Minor and patch releases do not widen the compatibility window.
- A new client major advances the window by one annual product line and drops the oldest supported line.
0.xis the legacy transition line.0.10.xremains the last legacy line tied to ADR26.1behavior.1.0.0is the first fully policy-driven line. It starts the product-release-aligned scheme with ADR27.1as the bundled release and support for the26.*and27.*annual product lines.- Every future client major advances the supported window by exactly one ADR annual product line.
The client major line determines the ADR compatibility epoch:
0.xis bundled with ADR26.1and supports the25.*and26.*annual product lines.1.xis bundled with ADR27.1and supports the26.*and27.*annual product lines.2.xis bundled with ADR28.1and supports the27.*and28.*annual product lines.
ADR 25.2 was the final half-year release. Starting with ADR 26.1,
there is only one release per annual line, so 26.* currently means
26.1, 27.* means 27.1, and so on.
For example, under this policy:
1.0.0is bundled with ADR27.1and supports26.*and27.*.1.2.0and1.2.2would still support26.*and27.*.2.0.0could bundle ADR28.1and support27.*and28.*, dropping support for26.*.
- Create Draft Release (on tag push): builds wheels/sdist and opens a
draft GitHub Release attaching artifacts. Tags ending in
rcNare marked as prereleases. - Publish Release (when the GitHub Release is published): uploads the reviewed GitHub Release artifacts to PyPI via Trusted Publisher, then builds and publishes the versioned documentation. Release-candidate documentation is published under its exact version while the stable documentation continues to point to the latest final release.
- Failure notifications: posts to Microsoft Teams on workflow failure.
- Ensure
CHANGELOG.mdhas a section for the release dated today. The helper script validates this. - Use a fresh checkout of
mainor the applicablestable/*maintenance branch. It must track and exactly match the same branch onorigin. - Working tree must be clean, including untracked files, and the CI-CD push workflow for the exact release commit must have completed successfully.
- Authenticate GitHub CLI (
gh) for the repository so the helper can verify the CI run before creating the tag. - CI secrets for publishing and docs deployment are configured in GitHub.
- The GitHub
pypienvironment and PyPI Trusted Publisher are configured for release tags matchingv*.
Make sure your
CHANGELOG.mdentry for the version is dated today. This check runs automatically frommake tag.Create and push the release tag:
make tag
This validates the tag syntax, changelog date, clean working tree, release branch and upstream commit, and successful CI-CD push run. It then creates and pushes the Git tag (for example,
v0.10.0).For a release candidate, pass the exact pre-release version explicitly:
make tag RELEASE_VERSION=1.0.0rc1
An
rcNtag creates a draft GitHub Release already marked as a prerelease. Keep that setting enabled when reviewing and publishing the draft.Once the tag is pushed:
- The Create Draft Release workflow builds the package and opens a draft GitHub Release with artifacts.
- After reviewing and finalizing notes, publish the GitHub Release. For an RC, verify that the release is marked as a prerelease before publishing.
Publishing the release automatically triggers the Release workflow, which:
- Downloads the artifacts attached to the reviewed GitHub Release and uploads those exact files to PyPI using Trusted Publisher.
- Builds and publishes the versioned documentation.
- Publishes RC documentation under its exact version, such as
version/1.0.0rc1/, without replacing the stable documentation.
- For a patch, update the changelog, ensure the working tree is clean, then
run
make tagagain. This tags the next patch version determined byhatch versionfrom your last tag. - Use the maintenance branch for the supported product line when cutting the tag.
You can use act to exercise non-publishing parts locally. Steps that
publish or deploy are already guarded in workflows (for example, with
if: ${{ !env.ACT }}). Build and validation steps still run:
act workflow_dispatch -W '.github/workflows/release-docs.yml' \
-j build --bindManual release or documentation deployment must be dispatched from the exact
existing release tag. Do not dispatch from main and pass a separate source
reference. For example:
gh workflow run create-draft-release.yml --ref v1.0.0rc1
# OR
gh workflow run release.yml --ref v1.0.0rc1 \
-f deploy_versioned_docs=true
# OR
gh workflow run release-docs.yml --ref v1.0.0rc1 \
-f deploy_versioned_docs=trueUse release.yml only when the PyPI upload has not completed. If PyPI
already contains the release, use the documentation-only workflow.
- .github/workflows/create-draft-release.yml
- Triggers on tag push
v*or manual dispatch. - Builds artifacts and opens a draft GitHub Release attaching
dist/*. AnrcNtag is marked as a prerelease automatically.
- Triggers on tag push
- .github/workflows/release.yml
- Triggers on a published GitHub Release or manual dispatch.
- Manual dispatches must select the exact existing release tag with
--ref. - Promotes the reviewed GitHub Release artifacts to PyPI without rebuilding them, then publishes versioned docs. RC docs are kept separate from stable docs. A manual dispatch must explicitly enable documentation deployment.
Print the resolved version (dev or stable):
make version
Build locally (sdist + wheel):
make build make check-dist
Clean:
make clean
Releases are blocked if today's dated entry is missing:
ERROR: CHANGELOG.md is not ready for release.
Expected line: ## [0.10.0] - YYYY-MM-DD
Tip: Check if it's still marked as '[Unreleased]' and update it to today's date.
- "No Git tag found" during checks: Create a tag via
make tag(orgit tag vX.Y.Z && git push origin vX.Y.Z). - Draft asset upload failed: Re-run
create-draft-release.ymlfrom the same tag. The workflow reuses the existing draft and replaces incomplete assets; it never creates a missing tag or modifies a published release. - Version mismatch:
hatch versiondetermines the version from the last tag. Ensure you pushed the intended tag and your clone has all tags (git fetch --tags).
PyDynamicReporting 1.x supports licensed ADR installations from the 26.*
and 27.* annual product lines. This requirement applies to both connected
service mode and
ansys.dynamicreporting.core.serverless.
This code shows how to start the simplest PyDynamicReporting session:
>>> import ansys.dynamicreporting.core as adr
>>> adr_service = adr.Service(ansys_installation=r"C:\\Program Files\\ANSYS Inc\\v261\\")
>>> ret = adr_service.connect()
>>> my_img = adr_service.create_item()
>>> my_img.item_image = "image.png"
>>> adr_service.visualize_report()PyDynamicReporting is licensed under the MIT license.
PyDynamicReporting makes no commercial claim over Ansys whatsoever. This library extends the functionality of Ansys Dynamic Reporting by adding a Python interface to Ansys Dynamic Reporting without changing the core behavior or license of the original software. The use of PyDynamicReporting requires a legally licensed copy of an Ansys product that supports Ansys Dynamic Reporting.
To get a copy of Ansys, visit the Ansys website.