-
Notifications
You must be signed in to change notification settings - Fork 205
295 lines (265 loc) · 12.2 KB
/
Copy pathtest-changes.yml
File metadata and controls
295 lines (265 loc) · 12.2 KB
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
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions and Operating Systems
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Test Changes
on:
push:
branches: ["master"]
merge_group:
branches: ["master"]
pull_request:
branches: ["master"]
types: [opened, reopened, synchronize, ready_for_review]
workflow_dispatch:
inputs:
branch_commit_or_ref:
description: "Run this workflow in what branch/commit?"
required: true
type: string
default: master
jobs:
run-guard:
# it succeeds if any of the following conditions are met:
# - when the PR is not a draft and is not labeled 'prevent-ci'
# - when the PR is labeled 'force-ci'
runs-on: ubuntu-latest
if: |
( (!github.event.pull_request.draft) &&
(github.event.action != 'labeled') &&
(!contains( github.event.pull_request.labels.*.name, 'prevent-ci')) )
|| ((github.event.action != 'labeled') && contains( github.event.pull_request.labels.*.name, 'force-ci'))
|| (github.event.label.name == 'force-ci')
steps:
- name: Checking if CI shoud run for ${{ github.ref_name }}...
run: echo "Resuming CI. Continuing next jobs..."
test-source-code:
needs: run-guard
strategy:
fail-fast: false
matrix:
#@ https://github.com/actions/runner-images#available-images
os:
["ubuntu-latest", "windows-latest", "macos-latest"]
#@ https://github.com/marketplace/actions/setup-python
#@ https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#python
python:
["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
# TODO: Also test with PyPy and GraalPy @https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#graalpy
include:
# Default configuration for all jobs
- mode: "full"
- scope: "full"
- install: "no"
- primary: "3.10"
# Conditional configuration overrides
- python: "3.6"
install: "yes"
- python: "3.7"
install: "yes"
- os: "windows-latest"
mode: "basic"
scope: "basic"
# Handle random test failures
- os: "ubuntu-latest"
python: "3.9"
mode: "basic"
scope: "basic"
# Additional Jobs not included in the matrix above
- python: "2.7"
os: "ubuntu-latest"
mode: "basic"
scope: "full"
install: "yes"
exclude:
# macos-latest == macos-15-arm64
# macos-latest-large == macos-15-intel
- os: "macos-latest"
python: "3.6"
- os: "macos-latest"
python: "3.7"
# python 3.7 too slow on ubuntu-latest
- os: "ubuntu-latest"
python: "3.7"
runs-on: "${{ matrix.os }}"
steps:
- name: Checkout source code at ${{ inputs.branch_commit_or_ref || github.ref }}
uses: actions/checkout@v7
with:
ref: ${{ inputs.branch_commit_or_ref || github.ref }}
- name: Install linux tools
if: matrix.os == 'ubuntu-latest'
run: |
echo "::group::Install linux tools"
sudo apt-get update
sudo apt-get install -y --no-install-recommends python3-h5py
echo "::endgroup::"
- name: Install macos tools
if: matrix.os == 'macos-latest' && matrix.scope == 'full'
run: |
echo "::group::Install macos tools"
brew install hdf5
echo "::endgroup::"
- name: Install additional linux tools
if: matrix.os == 'ubuntu-latest' && matrix.scope == 'full'
run: |
echo "::group::Install additional linux tools"
sudo apt-get install -y --no-install-recommends default-libmysqlclient-dev
echo "::endgroup::"
- name: Set up Python ${{ matrix.python }} with install = ${{ matrix.install }}
if: matrix.install == 'no'
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python }}
- name: Set up Python ${{ matrix.python }} discontinued on ${{ matrix.os }}
if: matrix.install == 'yes'
uses: MatteoH2O1999/setup-python@v6
with:
python-version: ${{ matrix.python }}
cache: pip
- name: Upgrade pip
run: |
echo "::group::Upgrading pip"
python -m pip install --upgrade pip
echo "::endgroup::"
- name: Report Workflow Information
id: workflow_report
if: matrix.python >= '3'
uses: ./.github/actions/workflow-info
with:
title: "${{ github.ref_name }} on ${{ matrix.os }} with python ${{ matrix.python }}"
parameters: "${{ toJson(inputs) }}"
content: |
- Ref: ${{ github.head_ref }}
- matrix.python: ${{ matrix.python }}
- matrix.os: ${{ matrix.os }}
- matrix.mode: ${{ matrix.mode }}
- matrix.scope: ${{ matrix.scope }}
- matrix.install: ${{ matrix.install }}
- name: Install test dependencies
run: |
echo "::group::Install test dependencies"
python -m pip install --prefer-binary -r requirements-tests.txt
echo "::endgroup::"
- name: Setup environment variables for remote filesystem testing with primary = ${{ matrix.primary }}
if: matrix.os == 'ubuntu-latest' && matrix.python == matrix.primary
run: |
echo "::notice file=requirements-remote.txt,line=4,title=SMB environment configuration::Setup SMB environment variable to trigger testing in Petl"
echo 'PETL_TEST_SMB=smb://WORKGROUP;petl:test@localhost/public/' >> $GITHUB_ENV
echo "::notice file=requirements-remote.txt,line=5,title=SFTP environment configuration::Setup SFTP environment variable to trigger testing in Petl"
echo 'PETL_TEST_SFTP=sftp://petl:test@localhost:2244/public/' >> $GITHUB_ENV
echo "::group::Install remote test dependencies"
python -m pip install --prefer-binary -r requirements-remote.txt
echo "::endgroup::"
- name: Install containers for remote filesystem testing with install = ${{ matrix.install }}
if: matrix.os == 'ubuntu-latest' && matrix.install == 'no'
run: |
echo "::group::Setup docker for SMB at: ${{ env.PETL_TEST_SMB }}$"
docker run -it --name samba -p 139:139 -p 445:445 -d "dperson/samba" -p -u "petl;test" -s "public;/public-dir;yes;no;yes;all"
echo "::endgroup::"
echo "::group::Setup docker for SFTP at: ${{ env.PETL_TEST_SFTP }}$"
docker run -it --name sftp -p 2244:22 -d atmoz/sftp petl:test:::public
echo "::endgroup::"
- name: Install containers for remote database testing with scope = ${{ matrix.scope }}
if: matrix.os == 'ubuntu-latest' && matrix.scope == 'full'
run: |
echo "::group::Setup docker for MySQL"
docker run -it --name mysql -p 3306:3306 -p 33060:33060 -e MYSQL_ROOT_PASSWORD=pass0 -e MYSQL_DATABASE=petl -e MYSQL_USER=petl -e MYSQL_PASSWORD=test -d mysql:latest
echo "::notice file=requirements-database.txt,line=4,title=MySQL docker installation::Setup MySQL docker container for testing in Petl"
echo "::endgroup::"
echo "::group::Setup docker for Postgres"
docker run -it --name postgres -p 5432:5432 -e POSTGRES_DB=petl -e POSTGRES_USER=petl -e POSTGRES_PASSWORD=test -d postgres:latest
echo "::notice file=requirements-database.txt,line=6,title=Postgres docker installation::Setup Postgres docker container for testing in Petl"
echo "::endgroup::"
echo "::group::Install database test dependencies"
python -m pip install --prefer-binary -r requirements-database.txt
echo "::endgroup::"
- name: Setup petl package with mode = ${{ matrix.mode }}
run: |
python -m pip install --upgrade build setuptools wheel
python -m build
python -m pip install build --user
- name: Install extra packages dependencies for scope = ${{ matrix.scope }}
if: matrix.scope == 'full'
run: |
echo "::group::Install extra packages dependencies"
python -m pip install --prefer-binary -r requirements-formats.txt
echo "::endgroup::"
- name: Install optional test dependencies with install = ${{ matrix.install }}
if: matrix.os == 'ubuntu-latest' && matrix.install == 'no'
env:
DISABLE_BLOSC_AVX2: 1
run: |
echo "::group::Install tricky test dependencies"
# pip install --prefer-binary 'Cython>=0.29.21,<3.0.0' bcolz
if ! pip install --prefer-binary -r requirements-optional.txt ; then
echo "::warning file=requirements-optional.txt,line=23,col=1,endColumn=5,title=Optional package failure::Dismissed failure installing some optional package. Resuming tests..."
else
echo "::notice file=requirements-optional.txt,line=23,col=1,endColumn=5,title=Optional package failure::Successfully installed all optional packages."
fi
echo "::endgroup::"
- name: List Installed Packages for Throubleshooting
shell: bash
run: |
echo "::group::List Installed Packages for Throubleshooting"
printf '\n## Installed Packages for python ${{ matrix.python }}\n\n' >> "${GITHUB_STEP_SUMMARY}";
echo "- Python Version: $(python --version)" >> "${GITHUB_STEP_SUMMARY}";
echo "- Pytest Version: $(pytest --version)" >> "${GITHUB_STEP_SUMMARY}";
echo "- Pip Version: $(pip --version | head -n 1 | cut -d' ' -f2)" >> "${GITHUB_STEP_SUMMARY}";
printf '```text' >> "${GITHUB_STEP_SUMMARY}";
python -m pip list --format freeze >> "${GITHUB_STEP_SUMMARY}";
printf '```' >> "${GITHUB_STEP_SUMMARY}";
echo "::endgroup::"
- name: Test python source code for mode = basic
if: matrix.mode == 'basic'
env:
PYTHONTRACEMALLOC: 1
run: |
echo "::group::Perform basic test execution with coverage"
pytest --cov=petl petl
echo "::endgroup::"
- name: Test including documentation inside source code for mode = full
if: matrix.mode == 'full'
env:
PYTHONTRACEMALLOC: 1
run: |
echo "::group::Perform doctest-modules execution with coverage"
pytest --doctest-modules --cov=petl --durations=10 petl
echo "::endgroup::"
- name: Coveralls with os = ${{ matrix.os }}, primary = ${{ matrix.primary }}
if: matrix.os == 'ubuntu-latest' && matrix.python == matrix.primary
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -m pip install --upgrade coveralls
coveralls --service=github
- name: Print source code coverage
run: |
printf '\n## Coverage for python ${{ matrix.python }} with mode ${{ matrix.mode }}\n\n' >> "${GITHUB_STEP_SUMMARY}";
printf '```text' >> "${GITHUB_STEP_SUMMARY}";
coverage report -m >> "${GITHUB_STEP_SUMMARY}";
printf '```' >> "${GITHUB_STEP_SUMMARY}";
test-documentation:
needs: run-guard
runs-on: ubuntu-latest
strategy:
matrix:
python: ['3.10']
steps:
- name: Checkout source code at ${{ inputs.branch_commit_or_ref || github.ref }}
uses: actions/checkout@v7
with:
ref: ${{ inputs.branch_commit_or_ref || github.ref }}
- name: Set up Python ${{ matrix.python }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python }}
- name: Install doc generation dependencies
run: |
python -m pip install --prefer-binary -r requirements-docs.txt
- name: Setup petl package
run: |
python -m pip install --upgrade build setuptools wheel
python -m build
- name: Test docs generation
run: |
cd docs
sphinx-build -W -b singlehtml -d ../build/doctrees . ../build/singlehtml