diff --git a/.github/workflows/test_and_deploy.yml b/.github/workflows/test_and_deploy.yml index 2c5bacdc..71ae1b9e 100644 --- a/.github/workflows/test_and_deploy.yml +++ b/.github/workflows/test_and_deploy.yml @@ -1,107 +1,105 @@ -# This workflows will upload a Python Package using Twine when a release is created -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries -# For pytest-qt related fixes: https://pytest-qt.readthedocs.io/en/latest/troubleshooting.html#github-actions - -name: tests - -on: - pull_request: - paths-ignore: - - "**/README.md" - push: - paths-ignore: - - "**/README.md" - -jobs: - test: - runs-on: ubuntu-latest - defaults: - run: - shell: bash -l {0} - strategy: - fail-fast: false - matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] - env: - DISPLAY: ":99.0" - steps: - - uses: actions/checkout@v3 - - - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - activate-environment: test - python-version: ${{ matrix.python-version }} - channels: conda-forge - - - name: Conda info - run: conda info - - - name: Save conda location - run: echo "python=$(which python)" >> "$GITHUB_ENV" - - - name: Install core - timeout-minutes: 10 - run: | - conda install -y pyopencl pocl - python --version - pip install --upgrade pip setuptools wheel - pip install --use-pep517 -e './core[testing]' - - - name: Lint core - uses: ./.github/lint - with: - directory: core - python: ${{ env.python }} - - - name: Test core - # Only run all the tests on one version, to avoid using excessive CPU hours - if: ${{ matrix.python-version == '3.10' }} - run: pytest -v --cov=core --cov-report=xml core/ - - - uses: tlambert03/setup-qt-libs@v1 - - - name: Install plugin - timeout-minutes: 10 - run: | - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1920x1200x24 -ac +extension GLX - pip install pytest-qt PyQt5 - pip install -e './plugin[testing]' - - - name: Lint plugin - uses: ./.github/lint - with: - directory: plugin - python: ${{ env.python }} - - - name: Test plugin - run: pytest -v --cov=plugin --cov-report=xml plugin - - - name: Coverage - uses: codecov/codecov-action@v3 - - deploy: - # this will run when you have tagged a commit, starting with "v*" - # and requires that you have put your twine API key in your - # github secrets (see readme for details) - needs: [test] - runs-on: ubuntu-latest - if: contains(github.ref, 'tags') - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.x" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -U setuptools setuptools_scm wheel twine - - name: Build and publish - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.TWINE_TOKEN }} - run: | - git tag - python setup.py sdist bdist_wheel - twine upload dist/* +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries +# For pytest-qt related fixes: https://pytest-qt.readthedocs.io/en/latest/troubleshooting.html#github-actions + +name: tests + +on: + pull_request: + paths-ignore: + - "**/README.md" + push: + paths-ignore: + - "**/README.md" + +jobs: + test: + runs-on: ubuntu-latest + defaults: + run: + shell: bash -l {0} + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + env: + DISPLAY: ":99.0" + steps: + - uses: actions/checkout@v3 + + - uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + activate-environment: test + python-version: ${{ matrix.python-version }} + channels: conda-forge + + - name: Conda info + run: conda info + + - name: Save conda location + run: echo "python=$(which python)" >> "$GITHUB_ENV" + + - name: Install core + timeout-minutes: 10 + run: | + conda install -y pyopencl pocl + python --version + pip install --upgrade pip setuptools wheel + pip install --use-pep517 -e './core[testing]' + + - name: Lint core + uses: ./.github/lint + with: + directory: core + python: ${{ env.python }} + + - name: Test core + run: pytest -v --cov=core --cov-report=xml core/ + + - uses: tlambert03/setup-qt-libs@v1 + + - name: Install plugin + timeout-minutes: 10 + run: | + /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1920x1200x24 -ac +extension GLX + pip install pytest-qt PyQt5 + pip install -e './plugin[testing]' + + - name: Lint plugin + uses: ./.github/lint + with: + directory: plugin + python: ${{ env.python }} + + - name: Test plugin + run: pytest -v --cov=plugin --cov-report=xml plugin + + - name: Coverage + uses: codecov/codecov-action@v3 + + deploy: + # this will run when you have tagged a commit, starting with "v*" + # and requires that you have put your twine API key in your + # github secrets (see readme for details) + needs: [test] + runs-on: ubuntu-latest + if: contains(github.ref, 'tags') + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U setuptools setuptools_scm wheel twine + - name: Build and publish + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.TWINE_TOKEN }} + run: | + git tag + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/core/lls_core/cmds/__main__.py b/core/lls_core/cmds/__main__.py index ef1f5888..33392c75 100644 --- a/core/lls_core/cmds/__main__.py +++ b/core/lls_core/cmds/__main__.py @@ -23,7 +23,7 @@ if TYPE_CHECKING: from lls_core.models.utils import FieldAccessModel - from typing import Type, Any + from typing import Type, Any, Iterable from rich.table import Table class CliDeskewDirection(StrEnum): @@ -100,8 +100,17 @@ def rich_validation(e: ValidationError) -> Table: return table +def pairwise(iterable: Iterable) -> Iterable: + """ + An implementation of the pairwise() function in Python 3.10+ + See: https://docs.python.org/3.12/library/itertools.html#itertools.pairwise + """ + from itertools import tee + a, b = tee(iterable) + next(b, None) + return zip(a, b) + def update_nested_data(data: Union[dict, list], keys: list, new_value: Any): - from itertools import pairwise current = data for key, next_key in pairwise(keys):