-
-
Notifications
You must be signed in to change notification settings - Fork 0
116 lines (116 loc) · 4.05 KB
/
python-package-test.yml
File metadata and controls
116 lines (116 loc) · 4.05 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
---
name: Test for Python Package
on:
workflow_call:
inputs:
package-path:
required: false
type: string
description: Path to a Python package or project
default: .
python-version:
required: false
type: string
description: Python version to use (not applicable if uv.lock is present)
default: 3.x
uv-version:
required: false
type: string
description: Version of uv to use (applicable only if uv.lock is present)
default: latest
additional-python-packages:
required: false
type: string
description: Additional Python packages to install
default: null
requirements-txt:
required: false
type: string
description: Path to the requirements.txt file (not applicable if uv.lock is present)
default: null
runs-on:
required: false
type: string
description: GitHub Actions runner to use
default: ubuntu-slim
permissions:
contents: read
defaults:
run:
shell: bash -euo pipefail {0}
working-directory: .
jobs:
test:
runs-on: ${{ inputs.runs-on }}
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
persist-credentials: false
- name: Detect uv.lock or poetry.lock
working-directory: ${{ inputs.package-path }}
run: |
if [[ -f uv.lock ]]; then
echo "LOCK_FILE=uv.lock" >> "${GITHUB_ENV}"
elif [[ -f poetry.lock ]]; then
echo "LOCK_FILE=poetry.lock" >> "${GITHUB_ENV}"
else
echo "LOCK_FILE=" >> "${GITHUB_ENV}"
fi
- name: Set up uv
if: env.LOCK_FILE == 'uv.lock'
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
version: ${{ inputs.uv-version }}
- name: Install packages using uv
if: env.LOCK_FILE == 'uv.lock'
working-directory: ${{ inputs.package-path }}
env:
INPUTS_ADDITIONAL_PYTHON_PACKAGES: ${{ inputs.additional-python-packages }}
run: |
uv sync --all-groups
for p in $(tr ' ' '\n' <<< "${INPUTS_ADDITIONAL_PYTHON_PACKAGES}"); do
if [[ -n "${p}" ]]; then
uv add --dev "${p}"
fi
done
tee -a "${GITHUB_ENV}" <<< "EXECUTOR=uv run --directory ${PWD}"
- name: Set up Python
if: env.LOCK_FILE != 'uv.lock'
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: ${{ inputs.python-version }}
- name: Install packages
if: env.LOCK_FILE != 'uv.lock'
env:
ADDITIONAL_PYTHON_PACKAGES: ${{ inputs.additional-python-packages }}
REQUIREMENTS_TXT_PATH: ${{ inputs.requirements-txt }}
working-directory: ${{ inputs.package-path }}
run: |
pip install -U --no-cache-dir pip
if [[ -n "${REQUIREMENTS_TXT_PATH}" ]]; then
pip install -U --no-cache-dir -r "${REQUIREMENTS_TXT_PATH}"
fi
if [[ "${LOCK_FILE}" == "poetry.lock" ]]; then
pip install --no-cache-dir poetry
poetry lock --no-interaction
for p in $(tr ' ' '\n' <<< "${ADDITIONAL_PYTHON_PACKAGES}"); do
if [[ -n "${p}" ]]; then
poetry add --group=dev --no-interaction "${p}"
fi
done
poetry install --no-interaction --no-root
tee -a "${GITHUB_ENV}" <<< "EXECUTOR=poetry run -C ${PWD}"
else
for p in $(tr ' ' '\n' <<< "${ADDITIONAL_PYTHON_PACKAGES}"); do
if [[ -n "${p}" ]]; then
pip install --no-cache-dir "${p}"
fi
done
tee -a "${GITHUB_ENV}" <<< "EXECUTOR="
fi
- name: Run tests with pytest
working-directory: ${{ inputs.package-path }}
run: > # zizmor: ignore[template-injection]
${{ env.EXECUTOR }} pytest