Auto activate venv when python-version is set (#194)

Closes: #124
This commit is contained in:
Kevin Stillhammer 2024-12-20 08:24:43 +01:00 committed by GitHub
parent 85aa0bf0c1
commit dd578776bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 62 additions and 18 deletions

View File

@ -143,17 +143,27 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.12", "3.13t"]
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- name: Install latest version
uses: ./
with:
python-version: ${{ matrix.python-version }}
python-version: 3.13.1t
- name: Verify UV_PYTHON is set to correct version
run: |
if [ "$UV_PYTHON" != "${{ matrix.python-version }}" ]; then
echo "$UV_PYTHON"
if [ "$UV_PYTHON" != "3.13.1t" ]; then
exit 1
fi
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
- name: Verify packages can be installed
run: uv pip install --python=3.13.1t pip
shell: bash
- name: Verify python version is correct
run: |
python --version
if [ "$(python --version)" != "Python 3.13.1" ]; then
exit 1
fi
shell: bash

View File

@ -72,15 +72,20 @@ to install the latest version that satisfies the range.
### Python version
You can use the input `python-version` to set the environment variable `UV_PYTHON` for the rest
of your workflow.
You can use the input `python-version` to
- set the environment variable `UV_PYTHON` for the rest of your workflow
- create a new virtual environment with the specified python version
- activate the virtual environment for the rest of your workflow
This will override any python version specifications in `pyproject.toml` and `.python-version`
```yaml
- name: Install the latest version of uv and set the python version to 3.12
- name: Install the latest version of uv and set the python version to 3.13t
uses: astral-sh/setup-uv@v4
with:
python-version: "3.12"
python-version: 3.13t
- run: uv pip install --python=3.13t pip
```
You can combine this with a matrix to test multiple python versions:

View File

@ -14,8 +14,7 @@ inputs:
required: false
github-token:
description:
"Used to increase the rate limit when retrieving versions and downloading
uv."
"Used to increase the rate limit when retrieving versions and downloading uv."
required: false
default: ${{ github.token }}
enable-cache:

25
dist/setup/index.js generated vendored
View File

@ -99236,6 +99236,7 @@ const download_version_1 = __nccwpck_require__(8255);
const restore_cache_1 = __nccwpck_require__(7772);
const platforms_1 = __nccwpck_require__(8361);
const inputs_1 = __nccwpck_require__(9612);
const exec = __importStar(__nccwpck_require__(5236));
function run() {
return __awaiter(this, void 0, void 0, function* () {
const platform = (0, platforms_1.getPlatform)();
@ -99251,7 +99252,7 @@ function run() {
addUvToPath(setupResult.uvDir);
addToolBinToPath();
setToolDir();
setupPython();
yield setupPython();
addMatchers();
setCacheDir(inputs_1.cacheLocalPath);
core.setOutput("uv-version", setupResult.version);
@ -99317,10 +99318,24 @@ function setToolDir() {
}
}
function setupPython() {
if (inputs_1.pythonVersion !== "") {
core.exportVariable("UV_PYTHON", inputs_1.pythonVersion);
core.info(`Set UV_PYTHON to ${inputs_1.pythonVersion}`);
}
return __awaiter(this, void 0, void 0, function* () {
if (inputs_1.pythonVersion !== "") {
core.exportVariable("UV_PYTHON", inputs_1.pythonVersion);
core.info(`Set UV_PYTHON to ${inputs_1.pythonVersion}`);
const options = {
silent: !core.isDebug(),
};
const execArgs = ["venv", "--python", inputs_1.pythonVersion];
core.info("Activating python venv...");
yield exec.exec("uv", execArgs, options);
let venvBinPath = ".venv/bin";
if (process.platform === "win32") {
venvBinPath = ".venv/Scripts";
}
core.addPath(venvBinPath);
core.exportVariable("VIRTUAL_ENV", venvBinPath);
}
});
}
function setCacheDir(cacheLocalPath) {
core.exportVariable("UV_CACHE_DIR", cacheLocalPath);

View File

@ -23,6 +23,7 @@ import {
toolDir,
version,
} from "./utils/inputs";
import * as exec from "@actions/exec";
async function run(): Promise<void> {
const platform = getPlatform();
@ -46,7 +47,7 @@ async function run(): Promise<void> {
addUvToPath(setupResult.uvDir);
addToolBinToPath();
setToolDir();
setupPython();
await setupPython();
addMatchers();
setCacheDir(cacheLocalPath);
@ -125,10 +126,24 @@ function setToolDir(): void {
}
}
function setupPython(): void {
async function setupPython(): Promise<void> {
if (pythonVersion !== "") {
core.exportVariable("UV_PYTHON", pythonVersion);
core.info(`Set UV_PYTHON to ${pythonVersion}`);
const options: exec.ExecOptions = {
silent: !core.isDebug(),
};
const execArgs = ["venv", "--python", pythonVersion];
core.info("Activating python venv...");
await exec.exec("uv", execArgs, options);
let venvBinPath = ".venv/bin";
if (process.platform === "win32") {
venvBinPath = ".venv/Scripts";
}
core.addPath(venvBinPath);
core.exportVariable("VIRTUAL_ENV", venvBinPath);
}
}