REFACTOR: plot method #2388
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: GitHub CI | |
on: | |
pull_request: | |
workflow_dispatch: | |
push: | |
tags: | |
- "*" | |
branches: | |
- main | |
env: | |
ANSYSLMD_LICENSE_FILE: ${{ format('1055@{0}', secrets.LICENSE_SERVER) }} | |
PYEDB_USE_DOTNET: '1' | |
PYEDB_CI_NO_DISPLAY: '1' | |
MAIN_PYTHON_VERSION: '3.10' | |
PACKAGE_NAME: 'pyedb' | |
DOCUMENTATION_CNAME: 'edb.docs.pyansys.com' | |
MEILISEARCH_API_KEY: ${{ secrets.MEILISEARCH_API_KEY }} | |
MEILISEARCH_HOST_URL: ${{ vars.MEILISEARCH_HOST_URL }} | |
MEILISEARCH_PUBLIC_API_KEY: ${{ secrets.MEILISEARCH_PUBLIC_API_KEY }} | |
ON_CI: True | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
check_title: | |
if: github.event_name == 'pull_request' | |
name: Check the title of the pull request | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check commit name | |
uses: ansys/actions/commit-style@v6 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
use-upper-case: true | |
doc-style: | |
name: Documentation style check | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check documentation style | |
uses: ansys/actions/doc-style@v8 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
smoke-tests: | |
name: Build and Smoke tests (${{ matrix.os }} | Python ${{ matrix.python-version }}) | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, windows-latest] | |
python-version: ['3.8', '3.9', '3.10', '3.11'] | |
should-release: | |
- ${{ github.event_name == 'push' && contains(github.ref, 'refs/tags') }} | |
steps: | |
- name: Build wheelhouse and perform smoke test | |
uses: ansys/actions/build-wheelhouse@v5 | |
with: | |
library-name: ${{ env.PACKAGE_NAME }} | |
operating-system: ${{ matrix.os }} | |
python-version: ${{ matrix.python-version }} | |
- name: Import python package | |
run: | | |
python -c "import pyedb; from pyedb import __version__" | |
# ================================================================================================= | |
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# ================================================================================================= | |
legacy-tests-windows: | |
name: Test dotnet (windows) | |
runs-on: [ Windows, self-hosted, pyedb ] | |
steps: | |
- name: "Install Git and clone project" | |
uses: actions/checkout@v4 | |
# Revert to previous verison due too setup-python#819 | |
- name: "Set up Python" | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: Create Python venv | |
run: | | |
python -m venv .venv | |
. .venv\Scripts\Activate.ps1 | |
- name: "Update pip" | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -m pip install -U pip | |
- name: "Install Python library and tests dependencies" | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -m pip install .[tests] | |
- name: "Executing legacy tests" | |
uses: nick-fields/retry@v3 | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 15 | |
command: | | |
. .venv\Scripts\Activate.ps1 | |
pytest -m "legacy" -n auto --dist loadfile -v --cov | |
- name: "Create coverage files" | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -m coverage html -d .cov\legacy-html | |
python -m coverage xml -o .cov\legacy.xml | |
- name: Upload Coverage Results | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
path: .cov\legacy-html | |
name: html-legacy-coverage | |
retention-days: 7 | |
- name: Upload coverage to Codecov | |
uses: codecov/codecov-action@v4 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
with: | |
files: .cov/legacy.xml | |
# ================================================================================================= | |
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# ================================================================================================= | |
legacy-tests-linux: | |
name: Test dotnet (linux) | |
runs-on: [ Linux, self-hosted, toolkits ] | |
env: | |
ANSYSEM_ROOT242: '/ansys_inc/AnsysEM/v242/Linux64' | |
ANS_NODEPCHECK: '1' | |
steps: | |
- name: "Install Git and clone project" | |
uses: actions/checkout@v4 | |
- name: "Set up Python" | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: "Install os packages" | |
run: | | |
sudo apt update | |
sudo apt install libgl1-mesa-glx xvfb | |
- name: Create Python venv | |
run: | | |
python -m venv .venv | |
- name: "Update pip" | |
run: | | |
. .venv/bin/activate | |
python -m pip install -U pip | |
- name: "Install Python library and tests dependencies" | |
run: | | |
. .venv/bin/activate | |
python -m pip install .[tests] | |
- name: "Executing legacy tests" | |
uses: nick-fields/retry@v3 | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 20 | |
command: | | |
. .venv/bin/activate | |
xvfb-run pytest -m "legacy" -n auto --dist loadfile -v --cov | |
- name: "Create coverage files" | |
run: | | |
. .venv/bin/activate | |
python -m coverage html -d .cov\legacy-html | |
python -m coverage xml -o .cov\legacy.xml | |
- name: Upload Coverage Results | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
path: .cov\legacy-html | |
name: html-legacy-linux-coverage | |
retention-days: 7 | |
- name: Upload coverage to Codecov | |
uses: codecov/codecov-action@v4 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
with: | |
files: .cov/legacy.xml | |
# ================================================================================================= | |
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# ================================================================================================= | |
test-pyaedt-main-windows: | |
name: Testing PyAEDT main branch (Windows) | |
if: github.event_name == 'push' && contains(github.ref, 'refs/tags') | |
needs: [smoke-tests] | |
runs-on: [ self-hosted, Windows, pyaedt ] | |
steps: | |
- name: Install Git and checkout project | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: Create Python venv | |
run: | | |
python -m venv .venv | |
. .venv\Scripts\Activate.ps1 | |
- name: Update pip | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -m pip install -U pip | |
- name: Clone PyAEDT on main branch | |
uses: actions/checkout@v4 | |
with: | |
repository: ansys/pyaedt | |
path: "external/pyaedt" | |
ref: "main" | |
- name: Install PyAEDT main branch version with its test dependencies | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
pip install --no-cache-dir external/pyaedt[tests] | |
- name: Install PyEDB | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -m pip install . | |
- name: Install CI dependencies (e.g. vtk-osmesa) | |
run: | | |
.venv\Scripts\Activate.ps1 | |
# Uninstall conflicting dependencies | |
pip uninstall --yes vtk | |
pip install --extra-index-url https://wheels.vtk.org vtk-osmesa | |
- name: Run PyAEDT tests | |
uses: nick-fields/retry@v3 | |
env: | |
PYTHONMALLOC: malloc | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 40 | |
command: | | |
.venv\Scripts\Activate.ps1 | |
pytest -n auto --dist loadfile --durations=50 -v external/pyaedt/_unittest | |
- name: Run PyAEDT solvers tests | |
uses: nick-fields/retry@v3 | |
env: | |
PYTHONMALLOC: malloc | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 40 | |
command: | | |
.venv\Scripts\Activate.ps1 | |
pytest --durations=50 -v external/pyaedt/_unittest_solvers | |
# ================================================================================================= | |
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# ================================================================================================= | |
test-pyaedt-main-linux: | |
name: Testing PyAEDT main branch (Linux) | |
if: github.event_name == 'push' && contains(github.ref, 'refs/tags') | |
needs: [smoke-tests] | |
runs-on: [ self-hosted, Linux, pyaedt ] | |
env: | |
ANSYSEM_ROOT242: '/ansys_inc/AnsysEM/v242/Linux64' | |
ANS_NODEPCHECK: '1' | |
steps: | |
- name: Install Git and checkout project | |
uses: actions/checkout@v4 | |
- name: Install OS packages | |
run: | | |
sudo apt update | |
sudo apt-get install tk | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: Create Python venv | |
run: | | |
export LD_LIBRARY_PATH=${{ env.ANSYSEM_ROOT242 }}/common/mono/Linux64/lib64:${{ env.ANSYSEM_ROOT242 }}/Delcross:$LD_LIBRARY_PATH | |
python -m venv .venv | |
- name: Update pip | |
run: | | |
export LD_LIBRARY_PATH=${{ env.ANSYSEM_ROOT242 }}/common/mono/Linux64/lib64:${{ env.ANSYSEM_ROOT242 }}/Delcross:$LD_LIBRARY_PATH | |
. .venv/bin/activate | |
python -m pip install -U pip | |
- name: Clone PyAEDT on main branch | |
uses: actions/checkout@v4 | |
with: | |
repository: ansys/pyaedt | |
path: "external/pyaedt" | |
ref: "main" | |
- name: Install PyAEDT main branch version with its test dependencies | |
run: | | |
export LD_LIBRARY_PATH=${{ env.ANSYSEM_ROOT242 }}/common/mono/Linux64/lib64:${{ env.ANSYSEM_ROOT242 }}/Delcross:$LD_LIBRARY_PATH | |
. .venv/bin/activate | |
pip install --no-cache-dir external/pyaedt[tests] | |
- name: Install PyEDB | |
run: | | |
export LD_LIBRARY_PATH=${{ env.ANSYSEM_ROOT242 }}/common/mono/Linux64/lib64:${{ env.ANSYSEM_ROOT242 }}/Delcross:$LD_LIBRARY_PATH | |
. .venv/bin/activate | |
python -m pip install . | |
- name: Install CI dependencies (e.g. vtk-osmesa) | |
run: | | |
. .venv/bin/activate | |
# Uninstall conflicting dependencies | |
pip uninstall --yes vtk | |
pip install --extra-index-url https://wheels.vtk.org vtk-osmesa | |
- name: Run PyAEDT tests | |
uses: nick-fields/retry@v3 | |
env: | |
PYTHONMALLOC: malloc | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 50 | |
command: | | |
export LD_LIBRARY_PATH=${{ env.ANSYSEM_ROOT242 }}/common/mono/Linux64/lib64:${{ env.ANSYSEM_ROOT242 }}/Delcross:$LD_LIBRARY_PATH | |
. .venv/bin/activate | |
pytest -n auto --dist loadfile --durations=50 -v external/pyaedt/_unittest | |
- name: Run PyAEDT solvers tests | |
uses: nick-fields/retry@v3 | |
env: | |
PYTHONMALLOC: malloc | |
with: | |
max_attempts: 3 | |
retry_on: error | |
timeout_minutes: 50 | |
command: | | |
export LD_LIBRARY_PATH=${{ env.ANSYSEM_ROOT242 }}/common/mono/Linux64/lib64:${{ env.ANSYSEM_ROOT242 }}/Delcross:$LD_LIBRARY_PATH | |
. .venv/bin/activate | |
pytest --durations=50 -v external/pyaedt/_unittest_solvers | |
# ================================================================================================= | |
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv RUNNING ON SELF-HOSTED RUNNER vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv | |
# ================================================================================================= | |
docs-build: | |
name: Build documentation | |
runs-on: [ Windows, self-hosted, pyedb ] | |
timeout-minutes: 480 | |
steps: | |
- uses: actions/checkout@v4 | |
# Revert to previous verison due too setup-python#819 | |
- name: "Set up Python" | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
- name: 'Create virtual env' | |
run: | | |
python -m venv .venv | |
- name: "Update pip" | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -m pip install pip -U | |
python -m pip install wheel setuptools -U | |
python -c "import sys; print(sys.executable)" | |
- name: Install pyedb with doc dependencies | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
pip install .[doc] | |
- name: Verify that pyedb can be imported | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
python -c "import pyedb" | |
- name: Retrieve pyedb version | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
echo "PyEDB version is: $(python -c "from pyedb import __version__; print(); print(__version__)")" | |
- name: Clone PyAEDT on main branch | |
uses: actions/checkout@v4 | |
with: | |
repository: ansys/pyaedt | |
path: "external/pyaedt" | |
ref: "main" | |
- name: Install PyAEDT main branch version with its test dependencies | |
run: | | |
. .venv\Scripts\Activate.ps1 | |
pip install --no-cache-dir external/pyaedt[tests] | |
# Use environment variable to keep the doctree and avoid redundant build for PDF pages | |
- name: Create HTML documentation | |
env: | |
SPHINXBUILD_KEEP_DOCTREEDIR: "1" | |
run: | | |
.venv\Scripts\Activate.ps1 | |
. .\doc\make.bat html | |
- name: Upload HTML documentation artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: documentation-html | |
path: doc/_build/html | |
retention-days: 7 | |
# Use environment variable to remove the doctree after the build of PDF pages | |
# Keeping doctree could cause an issue, see https://github.com/ansys/pyaedt/pull/3844/files | |
- name: Create PDF documentation | |
env: | |
SPHINXBUILD_KEEP_DOCTREEDIR: "0" | |
run: | | |
.venv\Scripts\Activate.ps1 | |
. .\doc\make.bat pdf | |
- name: Upload PDF Documentation artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: documentation-pdf | |
path: doc/_build/latex/pyedb.pdf | |
retention-days: 7 | |
- name: Add assets to HTML docs | |
run: | | |
zip -r documentation-html.zip .\doc\_build\html | |
mv documentation-html.zip .\doc\_build\html\_static\assets\download\ | |
cp doc/_build/latex/pyedb.pdf .\doc\_build\html\_static\assets\download\ | |
package: | |
name: Package library | |
needs: [legacy-tests-windows, legacy-tests-linux, docs-build] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Build library source and wheel artifacts | |
uses: ansys/actions/build-library@v5 | |
with: | |
library-name: ${{ env.PACKAGE_NAME }} | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
release: | |
name: Release project | |
if: github.event_name == 'push' && contains(github.ref, 'refs/tags') | |
needs: [package, test-pyaedt-main-windows, test-pyaedt-main-linux] | |
runs-on: ubuntu-latest | |
# Specifying a GitHub environment is optional, but strongly encouraged | |
environment: release | |
permissions: | |
id-token: write | |
contents: write | |
steps: | |
- name: Release to the public PyPI repository | |
uses: ansys/actions/release-pypi-public@v6 | |
with: | |
library-name: ${{ env.PACKAGE_NAME }} | |
use-trusted-publisher: true | |
- name: Release to GitHub | |
uses: ansys/actions/release-github@v6 | |
with: | |
library-name: ${{ env.PACKAGE_NAME }} | |
upload-dev-docs: | |
name: Upload dev documentation | |
if: github.ref == 'refs/heads/main' | |
runs-on: ubuntu-latest | |
needs: [package] | |
steps: | |
- name: Deploy the latest documentation | |
uses: ansys/actions/doc-deploy-dev@v5 | |
with: | |
cname: ${{ env.DOCUMENTATION_CNAME }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
doc-index-dev: | |
name: "Deploy dev index docs" | |
if: github.ref == 'refs/heads/main' | |
runs-on: ubuntu-latest | |
needs: upload-dev-docs | |
steps: | |
- name: "Deploy the latest documentation index" | |
uses: ansys/actions/doc-deploy-index@v5 | |
with: | |
cname: ${{ env.DOCUMENTATION_CNAME }}/version/dev | |
index-name: pyedb-vdev | |
host-url: ${{ env.MEILISEARCH_HOST_URL }} | |
api-key: ${{ env.MEILISEARCH_API_KEY }} | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |
upload-docs-release: | |
name: Upload release documentation | |
if: github.event_name == 'push' && contains(github.ref, 'refs/tags') | |
runs-on: ubuntu-latest | |
needs: [release] | |
steps: | |
- name: Deploy the stable documentation | |
uses: ansys/actions/doc-deploy-stable@v5 | |
with: | |
cname: ${{ env.DOCUMENTATION_CNAME }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
doc-index-stable: | |
name: "Deploy stable docs index" | |
runs-on: ubuntu-latest | |
needs: upload-docs-release | |
steps: | |
- name: "Install Git and clone project" | |
uses: actions/checkout@v4 | |
- name: "Install the package requirements" | |
run: pip install -e . | |
- name: "Get the version to PyMeilisearch" | |
run: | | |
VERSION=$(python -c "from pyedb import __version__; print('.'.join(__version__.split('.')[:2]))") | |
VERSION_MEILI=$(python -c "from pyedb import __version__; print('-'.join(__version__.split('.')[:2]))") | |
echo "Calculated VERSION: $VERSION" | |
echo "Calculated VERSION_MEILI: $VERSION_MEILI" | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
echo "VERSION_MEILI=$VERSION_MEILI" >> $GITHUB_ENV | |
- name: "Deploy the latest documentation index" | |
uses: ansys/actions/doc-deploy-index@v5 | |
with: | |
cname: ${{ env.DOCUMENTATION_CNAME }}/version/${{ env.VERSION }} | |
index-name: pyedb-v${{ env.VERSION_MEILI }} | |
host-url: ${{ env.MEILISEARCH_HOST_URL }} | |
api-key: ${{ env.MEILISEARCH_API_KEY }} | |
python-version: ${{ env.MAIN_PYTHON_VERSION }} | |