Skip to content

Commit

Permalink
fix: add workflow for remote-client and separate from regular tests
Browse files Browse the repository at this point in the history
  • Loading branch information
hlouzada committed Sep 25, 2024
1 parent f041ac2 commit a65b648
Show file tree
Hide file tree
Showing 6 changed files with 232 additions and 41 deletions.
67 changes: 35 additions & 32 deletions .github/scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,38 +61,41 @@ else

fi

# Install subrepos from source
python -bb -X dev install_dev_repos.py --not-editable --no-install spyder

# Install boilerplate plugin
pushd spyder/app/tests/spyder-boilerplate
pip install --no-deps -q -e .
popd

# Install Spyder to test it as if it was properly installed.
python -bb -X dev -m build
python -bb -X dev -m pip install --no-deps dist/spyder*.whl

# Adjust PATH on Windows so that we can use conda below. This needs to be done
# at this point or the pip slots fail.
if [ "$OS" = "win" ]; then
PATH=/c/Miniconda/Scripts/:$PATH
fi
if [ -z "$SPYDER_TEST_REMOTE_CLIENT" ]; then

# Install subrepos from source
python -bb -X dev install_dev_repos.py --not-editable --no-install spyder

# Install boilerplate plugin
pushd spyder/app/tests/spyder-boilerplate
pip install --no-deps -q -e .
popd

# Install Spyder to test it as if it was properly installed.
python -bb -X dev -m build
python -bb -X dev -m pip install --no-deps dist/spyder*.whl

# Adjust PATH on Windows so that we can use conda below. This needs to be done
# at this point or the pip slots fail.
if [ "$OS" = "win" ]; then
PATH=/c/Miniconda/Scripts/:$PATH
fi

# Create environment for Jedi environment tests
conda create -n jedi-test-env -q -y python=3.9 flask
install_spyder_kernels jedi-test-env
conda list -n jedi-test-env

# Create environment to test conda env activation before launching a kernel
conda create -n spytest-ž -q -y -c conda-forge python=3.9
install_spyder_kernels spytest-ž
conda list -n spytest-ž

# Install pyenv on Linux systems
if [ "$RUN_SLOW" = "false" ]; then
if [ "$OS" = "linux" ]; then
curl https://pyenv.run | bash
$HOME/.pyenv/bin/pyenv install 3.8.1
# Create environment for Jedi environment tests
conda create -n jedi-test-env -q -y python=3.9 flask
install_spyder_kernels jedi-test-env
conda list -n jedi-test-env

# Create environment to test conda env activation before launching a kernel
conda create -n spytest-ž -q -y -c conda-forge python=3.9
install_spyder_kernels spytest-ž
conda list -n spytest-ž

# Install pyenv on Linux systems
if [ "$RUN_SLOW" = "false" ]; then
if [ "$OS" = "linux" ]; then
curl https://pyenv.run | bash
$HOME/.pyenv/bin/pyenv install 3.8.1
fi
fi
fi
10 changes: 7 additions & 3 deletions .github/scripts/run_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ else
fi

# Run tests
if [ "$OS" = "linux" ]; then
xvfb-run --auto-servernum python runtests.py --color=yes | tee -a pytest_log.txt
if [ "$SPYDER_TEST_REMOTE_CLIENT" = "true" ]; then
python runtests.py --color=yes --remote-client | tee -a pytest_log.txt
else
python runtests.py --color=yes | tee -a pytest_log.txt
if [ "$OS" = "linux" ]; then
xvfb-run --auto-servernum python runtests.py --color=yes | tee -a pytest_log.txt
else
python runtests.py --color=yes | tee -a pytest_log.txt
fi
fi
160 changes: 160 additions & 0 deletions .github/workflows/test-remoteclient.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
name: Linux tests

on:
push:
branches:
- master
- 6.*
- 5.*
paths:
- '.github/scripts/*.sh'
- '.github/workflows/*.yml'
- 'requirements/*.yml'
- '**.bat'
- '**.py'
- '**.sh'
- '!installers-conda/**'
- '!.github/workflows/installers-conda.yml'
- '!.github/workflows/build-subrepos.yml'

pull_request:
branches:
- master
- 6.*
- 5.*
paths:
- '.github/scripts/*.sh'
- '.github/workflows/*.yml'
- 'requirements/*.yml'
- '**.bat'
- '**.py'
- '**.sh'
- '!installers-conda/**'
- '!.github/workflows/installers-conda.yml'
- '!.github/workflows/build-subrepos.yml'

workflow_dispatch:
inputs:
ssh:
# github_cli: gh workflow run test-linux.yml --ref <branch> -f ssh=true
description: 'Enable ssh debugging'
required: false
default: false
type: boolean

concurrency:
group: test-remoteclient-${{ github.ref }}
cancel-in-progress: true

env:
ENABLE_SSH: ${{ github.event_name == 'workflow_dispatch' && inputs.ssh }}

jobs:
build:
# Use this to disable the workflow
# if: false
name: Linux - Py${{ matrix.PYTHON_VERSION }}, ${{ matrix.INSTALL_TYPE }}
runs-on: ubuntu-20.04
env:
CI: 'true'
QTCONSOLE_TESTING: 'true'
CODECOV_TOKEN: "56731c25-9b1f-4340-8b58-35739bfbc52d"
OS: 'linux'
PYTHON_VERSION: ${{ matrix.PYTHON_VERSION }}
USE_CONDA: ${{ matrix.INSTALL_TYPE == 'conda' }}
SPYDER_TEST_REMOTE_CLIENT: 'true'
strategy:
fail-fast: false
matrix:
INSTALL_TYPE: ['pip', 'conda']
PYTHON_VERSION: ['3.8', '3.10']
exclude:
# Only test Python 3.8 with pip because Conda-forge will drop it soon
- INSTALL_TYPE: 'conda'
PYTHON_VERSION: '3.8'
timeout-minutes: 90
steps:
- name: Setup Remote SSH Connection
if: env.ENABLE_SSH == 'true'
uses: mxschmitt/action-tmate@v3
timeout-minutes: 60
with:
detached: true
- name: Checkout Pull Requests
if: github.event_name == 'pull_request'
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Checkout Push
if: github.event_name != 'pull_request'
uses: actions/checkout@v4
- name: Fetch branches
run: git fetch --prune --unshallow
- name: Install dependencies
shell: bash
run: |
sudo apt-get update --fix-missing
sudo apt-get install -qq pyqt5-dev-tools libxcb-xinerama0 xterm --fix-missing
sudo apt-get install -qq docker docker-compose --fix-missing
- name: Cache conda
uses: actions/cache@v4
env:
# Increase this value to reset cache if requirements/*.txt has not changed
CACHE_NUMBER: 0
with:
path: ~/conda_pkgs_dir
key: ${{ runner.os }}-cacheconda-install${{ matrix.INSTALL_TYPE }}-${{ matrix.PYTHON_VERSION }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('requirements/*.yml') }}
- name: Cache pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-cachepip-install${{ matrix.INSTALL_TYPE }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('setup.py') }}
- name: Create conda test environment
if: env.USE_CONDA == 'true'
uses: mamba-org/setup-micromamba@v1
with:
environment-file: requirements/main.yml
environment-name: test
cache-downloads: true
create-args: python=${{ matrix.PYTHON_VERSION }}
- name: Create pip test environment
if: env.USE_CONDA != 'true'
uses: mamba-org/setup-micromamba@v1
with:
environment-name: test
cache-downloads: true
create-args: python=${{ matrix.PYTHON_VERSION }}
condarc: |
channels:
- conda-forge
- name: Install additional dependencies
shell: bash -l {0}
run: bash -l .github/scripts/install.sh
- name: Show conda test environment
if: env.USE_CONDA == 'true'
shell: bash -l {0}
run: |
micromamba info
micromamba list
- name: Show pip test environment
if: env.USE_CONDA != 'true'
shell: bash -l {0}
run: |
micromamba info
micromamba list
pip list
- name: Run tests
shell: bash -l {0}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
rm -f pytest_log.txt # Must remove any log file from a previous run
.github/scripts/run_tests.sh || \
.github/scripts/run_tests.sh || \
.github/scripts/run_tests.sh || \
.github/scripts/run_tests.sh
- name: Coverage
uses: codecov/codecov-action@v4
with:
fail_ci_if_error: false
verbose: true
17 changes: 13 additions & 4 deletions runtests.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
RUN_SLOW = os.environ.get('RUN_SLOW', None) == 'true'


def run_pytest(run_slow=False, extra_args=None):
def run_pytest(run_slow=False, extra_args=None, remoteclient=False):
"""Run pytest tests for Spyder."""
# Be sure to ignore subrepos
# Be sure to ignore subrepos and remoteclient plugin
pytest_args = ['-vv', '-rw', '--durations=10', '--ignore=./external-deps',
'-W ignore::UserWarning', '--timeout=120',
'--timeout_method=thread']
Expand All @@ -49,6 +49,12 @@ def run_pytest(run_slow=False, extra_args=None):
if extra_args:
pytest_args += extra_args

if remoteclient:
pytest_args += ['./spyder/plugins/remoteclient']
os.environ["SPYDER_TEST_REMOTE_CLIENT"] = "true"
else:
pytest_args += ['--ignore=remoteclient']

print("Pytest Arguments: " + str(pytest_args))
errno = pytest.main(pytest_args)

Expand All @@ -62,12 +68,15 @@ def run_pytest(run_slow=False, extra_args=None):
def main():
"""Parse args then run the pytest suite for Spyder."""
test_parser = argparse.ArgumentParser(
usage='python runtests.py [-h] [--run-slow] [pytest_args]',
usage='python runtests.py [-h] [--run-slow] [--remote-client][pytest_args]',
description="Helper script to run Spyder's test suite")
test_parser.add_argument('--run-slow', action='store_true', default=False,
help='Run the slow tests')
test_parser.add_argument("--remote-client", action="store_true",
default=False, help="Run the remote client tests")
test_args, pytest_args = test_parser.parse_known_args()
run_pytest(run_slow=test_args.run_slow, extra_args=pytest_args)
run_pytest(run_slow=test_args.run_slow, extra_args=pytest_args,
remoteclient=test_args.remote_client)


if __name__ == '__main__':
Expand Down
8 changes: 8 additions & 0 deletions spyder/config/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ def running_under_pytest():
"""
return bool(os.environ.get('SPYDER_PYTEST'))

def running_under_remoteclient_tests():
"""
Return True if currently running under remoteclient tests.
This function is used to do some adjustment for testing. The environment
variable SPYDER_REMOTECLIENT_TESTS is defined in conftest.py.
"""
return bool(os.environ.get("SPYDER_REMOTECLIENT_TESTS"))

def running_in_ci():
"""Return True if currently running under CI."""
Expand Down
11 changes: 9 additions & 2 deletions spyder/plugins/ipythonconsole/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@
IPython Console plugin based on QtConsole
"""

from spyder.config.base import is_stable_version, running_under_pytest
from spyder.config.base import (
is_stable_version,
running_under_pytest,
running_under_remoteclient_tests,
)


# Use this variable, which corresponds to the html dash symbol, for any command
# that requires a dash below. That way users will be able to copy/paste
Expand All @@ -20,7 +25,9 @@

# Required version of Spyder-kernels
SPYDER_KERNELS_MIN_VERSION = (
'3.0.0' if not running_under_pytest() else '3.1.0.dev0'
"3.0.0"
if not running_under_pytest() or running_under_remoteclient_tests()
else "3.1.0.dev0"
)
SPYDER_KERNELS_MAX_VERSION = (
'3.1.0' if not running_under_pytest() else '4.0.0'
Expand Down

0 comments on commit a65b648

Please sign in to comment.