-
Notifications
You must be signed in to change notification settings - Fork 0
262 lines (230 loc) · 10.3 KB
/
tests.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
name: Run tests
env:
# variables copied from matplotlib's test workflow
NO_AT_BRIDGE: 1 # Necessary for GTK3 interactive test.
OPENBLAS_NUM_THREADS: 1
PYTHONFAULTHANDLER: 1
# Controls when the action will run.
on:
# run on push, manual dispatch and on a schedule
# when run on schedule, tests will only be run if a new matplotlib release was found
workflow_dispatch:
inputs:
ignore-mpl-version:
type: boolean
required: true
description: Run independent of current and last tested Matplotlib version
push:
branches-ignore:
- gh-pages
schedule:
- cron: '0 */8 * * *'
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# Check for new matplotlib releases and run tests if a new release is available
run-test:
# The type of runner that the job will run on
runs-on: ubuntu-22.04
steps:
- name: Get current stable Matplotlib version
id: mpl-sources
run: |
# Find out what's the latest version number of matplotlib and
# create a url for downloading the sources for that version.
# Read last runs version from a cached file if available. Set to 'unknown' otherwise.
# Set these as this steps outputs so they can be reused later.
sudo apt-get update -yy && sudo apt-get install -yy curl
CURRENT_MPL_VERSION=$(curl -s https://api.github.com/repos/matplotlib/matplotlib/releases/latest \
| grep "tag_name" \
| awk '{print substr($2, 3, length($2)-4)}')
MPL_LOCATION=$"https://github.com/matplotlib/matplotlib/archive/v$CURRENT_MPL_VERSION.tar.gz"
echo "current=$CURRENT_MPL_VERSION" >> "$GITHUB_OUTPUT"
echo "location=$MPL_LOCATION" >> "$GITHUB_OUTPUT"
# cached version file is used to remember the matplotlib release version
# number from the last run
- name: Cache version from last run
uses: actions/cache@v3
with:
path: mpl_version_last_run.txt
# ensure that the primary key is different on every run by including ids that are unique for each run
# this ensures that the cache is always updated because there is no hit on the primary key
# we do only know if the cache needs to be updated after restoring the cache and looking at its content, therefore, just always update
key: version-cache-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: |
version-cache
# check which is the newest matplotlib release version number
# determine whether to actually run tests depending on current and last release number
# and on the event that triggered the run
- name: Version Check
id: version
run: |
if test -f "mpl_version_last_run.txt"
then
LAST_MPL_VERSION=$(<mpl_version_last_run.txt)
else
LAST_MPL_VERSION="unknown"
fi
if [ -z ${{ inputs.ignore-mpl-version }} ]
then
IGNORE_MPL_VERSION='unset'
else
IGNORE_MPL_VERSION=${{ inputs.ignore-mpl-version }}
fi
echo "Event that triggered this run: ${{ github.event_name }}"
echo "Manual override to force running independent of versions is $IGNORE_MPL_VERSION"
echo "The current matplotlib version is ${{ steps.mpl-sources.outputs.current }}"
echo "URL for sources: ${{ steps.mpl-sources.outputs.location }}"
echo "The matplotlib version on the last run was $LAST_MPL_VERSION"
echo ""
if [[ "${{ github.event_name }}" == "schedule" ]] && [[ "$LAST_MPL_VERSION" != "${{ steps.mpl-sources.outputs.current }}" ]]
then
echo "Scheduled run, versions differ, tests will be run! Continuing..."
RUN_TESTS="yes"
elif [[ "${{ github.event_name }}" == "push" ]]
then
echo "Triggered by push, assume sources changed, tests will be run! Continuing..."
RUN_TESTS="yes"
elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]] && [[ "$LAST_MPL_VERSION" != "${{ steps.mpl-sources.outputs.current }}" ]]
then
echo "Manual run, versions differ, tests will be run! Continuing..."
RUN_TESTS="yes"
elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]] && [[ $IGNORE_MPL_VERSION == 'true' ]]
then
echo "Manual run, version comparison overridden, tests will be run! Continuing..."
RUN_TESTS="yes"
else
echo "Tests will not be run! Exiting..."
RUN_TESTS="no"
fi
echo "last=$LAST_MPL_VERSION" >> "$GITHUB_OUTPUT"
echo "run=$RUN_TESTS" >> "$GITHUB_OUTPUT"
- name: Setup python
if: steps.version.outputs.run == 'yes'
uses: actions/setup-python@v4
with:
python-version: 3.9 # Version range or exact version of a Python version to use, using SemVer's version range syntax
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout repo
if: steps.version.outputs.run == 'yes'
uses: actions/checkout@v4
- name: Install OS dependencies
if: steps.version.outputs.run == 'yes'
run: |
sudo apt-get update -yy
sudo apt-get install -yy \
ccache \
cm-super \
dvipng \
ffmpeg \
fonts-noto-cjk \
gdb \
gir1.2-gtk-3.0 \
graphviz \
inkscape \
lcov \
libcairo2 \
libcairo2-dev \
libffi-dev \
libgeos-dev \
libgirepository1.0-dev \
libsdl2-2.0-0 \
libxkbcommon-x11-0 \
libxcb-cursor0 \
libxcb-icccm4 \
libxcb-image0 \
libxcb-keysyms1 \
libxcb-randr0 \
libxcb-render-util0 \
libxcb-xinerama0 \
lmodern \
fonts-freefont-otf \
texlive-pictures \
pkg-config \
qtbase5-dev \
texlive-fonts-recommended \
texlive-latex-base \
texlive-latex-extra \
texlive-latex-recommended \
texlive-luatex \
texlive-xetex \
ttf-wqy-zenhei \
libopengl0
- name: Cache pip
if: steps.version.outputs.run == 'yes'
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: pip-cache-${{ hashFiles('requirements.txt') }}
restore-keys: |
pip-cache
- name: Clone latest released sources for matplotlib
if: steps.version.outputs.run == 'yes'
run: |
git clone --depth 1 --branch v${{ steps.mpl-sources.outputs.current }} https://github.com/matplotlib/matplotlib.git
- name: Install Python dependencies
if: steps.version.outputs.run == 'yes'
run: |
# Upgrade pip and setuptools and wheel to get as clean an install as
# possible.
python3 -m pip install --upgrade pip setuptools wheel
# Install dependencies from PyPI.
python3 -m pip install --upgrade \
'contourpy>=1.0.1' cycler fonttools kiwisolver importlib_resources \
numpy packaging pillow pyparsing python-dateutil setuptools-scm \
-r matplotlib/requirements/testing/all.txt \
-r matplotlib/requirements/testing/extra.txt
# Install optional dependencies from PyPI.
# Sphinx is needed to run sphinxext tests
python3 -m pip install --upgrade sphinx!=6.1.2
# GUI toolkits are pip-installable only for some versions of Python
# so don't fail if we can't install them. Make it easier to check
# whether the install was successful by trying to import the toolkit
# (sometimes, the install appears to be successful but shared
# libraries cannot be loaded at runtime, so an actual import is a
# better check).
# PyGObject, pycairo, and cariocffi do not install on OSX 10.12.
python -m pip install --upgrade pycairo 'cairocffi>=0.8' PyGObject &&
python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk' &&
echo 'PyGObject is available' ||
echo 'PyGObject is not available'
# There are no functioning wheels available for OSX 10.12 (as of
# Sept 2020) for either pyqt5 (there are only wheels for 10.13+) or
# pyside2 (the latest version (5.13.2) with 10.12 wheels has a
# fatal to us bug, it was fixed in 5.14.0 which has 10.13 wheels)
python -mpip install --upgrade pyqt5 &&
python -c 'import PyQt5.QtCore' &&
echo 'PyQt5 is available' ||
echo 'PyQt5 is not available'
python -mpip install --upgrade pyqt6 &&
python -c 'import PyQt6.QtCore' &&
echo 'PyQt6 is available' ||
echo 'PyQt6 is not available'
python -mpip install --upgrade pyside6 &&
python -c 'import PySide6.QtCore' &&
echo 'PySide6 is available' ||
echo 'PySide6 is not available'
python -mpip install --upgrade \
-f "https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-20.04" \
wxPython &&
python -c 'import wx' &&
echo 'wxPython is available' ||
echo 'wxPython is not available'
- name: Install matplotlib from sources
if: steps.version.outputs.run == 'yes'
run: |
cd matplotlib
cat <<EOT >> mplsetup.cfg
[rc_options]
backend=Agg
EOT
cat mplsetup.cfg
python -m pip install --no-deps -ve .
- name: Run Timple Tests
if: steps.version.outputs.run == 'yes'
run: |
python3 -m pip install -r requirements-dev.txt # ensure package requirements
xvfb-run -a python3 -m pytest -raR
- name: Update mpl version cache file
if: steps.version.outputs.run == 'yes'
run: |
echo "${{ steps.mpl-sources.outputs.current }}" > mpl_version_last_run.txt