mirror of
https://github.com/actions/setup-python.git
synced 2025-08-10 18:42:07 +00:00
Merge branch 'actions:main' into main
This commit is contained in:
commit
f9527ef14f
80
.github/workflows/test-python-freethreaded.yml
vendored
80
.github/workflows/test-python-freethreaded.yml
vendored
@ -242,6 +242,86 @@ jobs:
|
||||
with:
|
||||
python-version-file: .tool-versions
|
||||
|
||||
setup-versions-from-pipfile-with-python_version:
|
||||
name: Setup ${{ matrix.python }} ${{ matrix.os }} Pipfile
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
[
|
||||
macos-latest,
|
||||
windows-latest,
|
||||
ubuntu-22.04,
|
||||
ubuntu-22.04-arm,
|
||||
macos-13,
|
||||
ubuntu-latest,
|
||||
ubuntu-24.04-arm
|
||||
]
|
||||
python: [3.13t, 3.14t-dev]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: build-version-file ${{ matrix.python }}
|
||||
run: |
|
||||
echo '[requires]
|
||||
python_version = "${{ matrix.python }}"
|
||||
' > Pipfile
|
||||
|
||||
- name: setup-python ${{ matrix.python }}
|
||||
id: setup-python
|
||||
uses: ./
|
||||
with:
|
||||
python-version-file: Pipfile
|
||||
|
||||
- name: Check python-path
|
||||
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
|
||||
shell: bash
|
||||
|
||||
- name: Run simple code
|
||||
run: python -c 'import math; print(math.factorial(5))'
|
||||
|
||||
setup-versions-from-pipfile-with-python_full_version:
|
||||
name: Setup ${{ matrix.python }} ${{ matrix.os }} .tool-versions file
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
[
|
||||
macos-latest,
|
||||
windows-latest,
|
||||
ubuntu-22.04,
|
||||
ubuntu-22.04-arm,
|
||||
macos-13,
|
||||
ubuntu-latest,
|
||||
ubuntu-24.04-arm
|
||||
]
|
||||
python: [3.13.0t, 3.13.1t, 3.13.2t, 3.14t-dev]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: build-version-file ${{ matrix.python }}
|
||||
run: |
|
||||
echo '[requires]
|
||||
python_full_version = "${{ matrix.python }}"
|
||||
' > Pipfile
|
||||
|
||||
- name: setup-python ${{ matrix.python }}
|
||||
id: setup-python
|
||||
uses: ./
|
||||
with:
|
||||
python-version-file: Pipfile
|
||||
|
||||
- name: Check python-path
|
||||
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
|
||||
shell: bash
|
||||
|
||||
- name: Run simple code
|
||||
run: python -c 'import math; print(math.factorial(5))'
|
||||
|
||||
setup-pre-release-version-from-manifest:
|
||||
name: Setup 3.14.0-alpha.6 ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
100
.github/workflows/test-python.yml
vendored
100
.github/workflows/test-python.yml
vendored
@ -284,6 +284,106 @@ jobs:
|
||||
with:
|
||||
python-version-file: .tool-versions
|
||||
|
||||
setup-versions-from-pipfile-with-python_version:
|
||||
name: Setup ${{ matrix.python }} ${{ matrix.os }} Pipfile with python_version
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
[
|
||||
macos-latest,
|
||||
windows-latest,
|
||||
ubuntu-22.04,
|
||||
ubuntu-22.04-arm,
|
||||
macos-13,
|
||||
ubuntu-latest,
|
||||
ubuntu-24.04-arm
|
||||
]
|
||||
python: [3.9.13, 3.10.11, 3.11.9, 3.13.2]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: build-version-file ${{ matrix.python }}
|
||||
run: |
|
||||
echo '[requires]
|
||||
python_version = "${{ matrix.python }}"
|
||||
' > Pipfile
|
||||
|
||||
- name: setup-python ${{ matrix.python }}
|
||||
id: setup-python
|
||||
uses: ./
|
||||
with:
|
||||
python-version-file: Pipfile
|
||||
|
||||
- name: Check python-path
|
||||
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
|
||||
shell: bash
|
||||
|
||||
- name: Validate version
|
||||
run: |
|
||||
$pythonVersion = (python --version)
|
||||
if ("Python ${{ matrix.python }}".replace("==", "") -ne "$pythonVersion"){
|
||||
Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}"
|
||||
exit 1
|
||||
}
|
||||
$pythonVersion
|
||||
shell: pwsh
|
||||
|
||||
- name: Run simple code
|
||||
run: python -c 'import math; print(math.factorial(5))'
|
||||
|
||||
setup-versions-from-pipfile-with-python_full_version:
|
||||
name: Setup ${{ matrix.python }} ${{ matrix.os }} Pipfile with python_full_version
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
[
|
||||
macos-latest,
|
||||
windows-latest,
|
||||
ubuntu-22.04,
|
||||
ubuntu-22.04-arm,
|
||||
macos-13,
|
||||
ubuntu-latest,
|
||||
ubuntu-24.04-arm
|
||||
]
|
||||
python: [3.9.13, 3.10.11, 3.11.9, 3.13.2]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: build-version-file ${{ matrix.python }}
|
||||
run: |
|
||||
echo '[requires]
|
||||
python_full_version = "${{ matrix.python }}"
|
||||
' > Pipfile
|
||||
|
||||
- name: setup-python ${{ matrix.python }}
|
||||
id: setup-python
|
||||
uses: ./
|
||||
with:
|
||||
python-version-file: Pipfile
|
||||
|
||||
- name: Check python-path
|
||||
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
|
||||
shell: bash
|
||||
|
||||
- name: Validate version
|
||||
run: |
|
||||
$pythonVersion = (python --version)
|
||||
if ("Python ${{ matrix.python }}".replace("==", "") -ne "$pythonVersion"){
|
||||
Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}"
|
||||
exit 1
|
||||
}
|
||||
$pythonVersion
|
||||
shell: pwsh
|
||||
|
||||
- name: Run simple code
|
||||
run: python -c 'import math; print(math.factorial(5))'
|
||||
|
||||
setup-pre-release-version-from-manifest:
|
||||
name: Setup 3.14.0-alpha.6 ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
@ -94,6 +94,8 @@ steps:
|
||||
|
||||
>The requirements file format allows for specifying dependency versions using logical operators (for example chardet>=3.0.4) or specifying dependencies without any versions. In this case the pip install -r requirements.txt command will always try to install the latest available package version. To be sure that the cache will be used, please stick to a specific dependency version and update it manually if necessary.
|
||||
|
||||
>The `setup-python` action does not handle authentication for pip when installing packages from private repositories. For help, refer [pip’s VCS support documentation](https://pip.pypa.io/en/stable/topics/vcs-support/) or visit the [pip repository](https://github.com/pypa/pip).
|
||||
|
||||
See examples of using `cache` and `cache-dependency-path` for `pipenv` and `poetry` in the section: [Caching packages](docs/advanced-usage.md#caching-packages) of the [Advanced usage](docs/advanced-usage.md) guide.
|
||||
|
||||
## Advanced usage
|
||||
|
@ -1,7 +1,7 @@
|
||||
certifi==2020.6.20
|
||||
chardet==3.0.4
|
||||
docutils==0.16
|
||||
idna==2.10
|
||||
idna==3.7
|
||||
Kivy==2.0.0rc3
|
||||
Kivy-Garden==0.1.4
|
||||
packaging==20.7
|
||||
|
@ -8,7 +8,7 @@ docutils==0.16
|
||||
|
||||
future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'
|
||||
|
||||
idna==2.9
|
||||
idna==3.7
|
||||
|
||||
itsdangerous==1.1.0
|
||||
|
||||
|
@ -12,6 +12,7 @@ import {
|
||||
getVersionInputFromFile,
|
||||
getVersionsInputFromPlainFile,
|
||||
getVersionInputFromTomlFile,
|
||||
getVersionInputFromPipfileFile,
|
||||
getNextPageUrl,
|
||||
isGhes,
|
||||
IS_WINDOWS,
|
||||
@ -244,6 +245,44 @@ describe('Version from file test', () => {
|
||||
expect(_fn(toolVersionFilePath)).toEqual(['3.14t-dev']);
|
||||
}
|
||||
);
|
||||
|
||||
it.each([getVersionInputFromPipfileFile, getVersionInputFromFile])(
|
||||
'Version from python_version in Pipfile',
|
||||
async _fn => {
|
||||
await io.mkdirP(tempDir);
|
||||
const pythonVersionFileName = 'Pipfile';
|
||||
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
|
||||
const pythonVersion = '3.13';
|
||||
const pythonVersionFileContent = `[requires]\npython_version = "${pythonVersion}"`;
|
||||
fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent);
|
||||
expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]);
|
||||
}
|
||||
);
|
||||
|
||||
it.each([getVersionInputFromPipfileFile, getVersionInputFromFile])(
|
||||
'Version from python_full_version in Pipfile',
|
||||
async _fn => {
|
||||
await io.mkdirP(tempDir);
|
||||
const pythonVersionFileName = 'Pipfile';
|
||||
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
|
||||
const pythonVersion = '3.13.0';
|
||||
const pythonVersionFileContent = `[requires]\npython_full_version = "${pythonVersion}"`;
|
||||
fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent);
|
||||
expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]);
|
||||
}
|
||||
);
|
||||
|
||||
it.each([getVersionInputFromPipfileFile, getVersionInputFromFile])(
|
||||
'Pipfile undefined version',
|
||||
async _fn => {
|
||||
await io.mkdirP(tempDir);
|
||||
const pythonVersionFileName = 'Pipfile';
|
||||
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
|
||||
const pythonVersionFileContent = ``;
|
||||
fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent);
|
||||
expect(_fn(pythonVersionFilePath)).toEqual([]);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
describe('getNextPageUrl', () => {
|
||||
|
43
dist/setup/index.js
vendored
43
dist/setup/index.js
vendored
@ -96945,7 +96945,7 @@ function findPyPyVersion(versionSpec, architecture, updateEnvironment, checkLate
|
||||
core.addPath(pythonLocation);
|
||||
core.addPath(_binDir);
|
||||
}
|
||||
core.setOutput('python-version', 'pypy' + resolvedPyPyVersion);
|
||||
core.setOutput('python-version', `pypy${resolvedPythonVersion}-${resolvedPyPyVersion}`);
|
||||
core.setOutput('python-path', pythonPath);
|
||||
return { resolvedPyPyVersion, resolvedPythonVersion };
|
||||
});
|
||||
@ -98137,7 +98137,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.getDownloadFileName = exports.getNextPageUrl = exports.getBinaryDirectory = exports.getVersionInputFromFile = exports.getVersionInputFromToolVersions = exports.getVersionsInputFromPlainFile = exports.getVersionInputFromTomlFile = exports.getOSInfo = exports.getLinuxInfo = exports.logWarning = exports.isCacheFeatureAvailable = exports.isGhes = exports.validatePythonVersionFormatForPyPy = exports.writeExactPyPyVersionFile = exports.readExactPyPyVersionFile = exports.getPyPyVersionFromPath = exports.isNightlyKeyword = exports.validateVersion = exports.createSymlinkInFolder = exports.WINDOWS_PLATFORMS = exports.WINDOWS_ARCHS = exports.IS_MAC = exports.IS_LINUX = exports.IS_WINDOWS = void 0;
|
||||
exports.getDownloadFileName = exports.getNextPageUrl = exports.getBinaryDirectory = exports.getVersionInputFromFile = exports.getVersionInputFromPipfileFile = exports.getVersionInputFromToolVersions = exports.getVersionsInputFromPlainFile = exports.getVersionInputFromTomlFile = exports.getOSInfo = exports.getLinuxInfo = exports.logWarning = exports.isCacheFeatureAvailable = exports.isGhes = exports.validatePythonVersionFormatForPyPy = exports.writeExactPyPyVersionFile = exports.readExactPyPyVersionFile = exports.getPyPyVersionFromPath = exports.isNightlyKeyword = exports.validateVersion = exports.createSymlinkInFolder = exports.WINDOWS_PLATFORMS = exports.WINDOWS_ARCHS = exports.IS_MAC = exports.IS_LINUX = exports.IS_WINDOWS = void 0;
|
||||
/* eslint no-unsafe-finally: "off" */
|
||||
const cache = __importStar(__nccwpck_require__(5116));
|
||||
const core = __importStar(__nccwpck_require__(7484));
|
||||
@ -98407,7 +98407,41 @@ function getVersionInputFromToolVersions(versionFile) {
|
||||
}
|
||||
exports.getVersionInputFromToolVersions = getVersionInputFromToolVersions;
|
||||
/**
|
||||
* Python version extracted from a plain, .tool-versions or TOML file.
|
||||
* Python version extracted from the Pipfile file.
|
||||
*/
|
||||
function getVersionInputFromPipfileFile(versionFile) {
|
||||
core.debug(`Trying to resolve version from ${versionFile}`);
|
||||
if (!fs_1.default.existsSync(versionFile)) {
|
||||
core.warning(`File ${versionFile} does not exist.`);
|
||||
return [];
|
||||
}
|
||||
let pipfileFile = fs_1.default.readFileSync(versionFile, 'utf8');
|
||||
// Normalize the line endings in the pipfileFile
|
||||
pipfileFile = pipfileFile.replace(/\r\n/g, '\n');
|
||||
const pipfileConfig = toml.parse(pipfileFile);
|
||||
const keys = ['requires'];
|
||||
if (!('requires' in pipfileConfig)) {
|
||||
core.warning(`No Python version found in ${versionFile}`);
|
||||
return [];
|
||||
}
|
||||
if ('python_full_version' in pipfileConfig['requires']) {
|
||||
// specifies a full python version
|
||||
keys.push('python_full_version');
|
||||
}
|
||||
else {
|
||||
keys.push('python_version');
|
||||
}
|
||||
const versions = [];
|
||||
const version = extractValue(pipfileConfig, keys);
|
||||
if (version !== undefined) {
|
||||
versions.push(version);
|
||||
}
|
||||
core.info(`Extracted ${versions} from ${versionFile}`);
|
||||
return versions;
|
||||
}
|
||||
exports.getVersionInputFromPipfileFile = getVersionInputFromPipfileFile;
|
||||
/**
|
||||
* Python version extracted from a plain, .tool-versions, Pipfile or TOML file.
|
||||
*/
|
||||
function getVersionInputFromFile(versionFile) {
|
||||
if (versionFile.endsWith('.toml')) {
|
||||
@ -98416,6 +98450,9 @@ function getVersionInputFromFile(versionFile) {
|
||||
else if (versionFile.match('.tool-versions')) {
|
||||
return getVersionInputFromToolVersions(versionFile);
|
||||
}
|
||||
else if (versionFile.match('Pipfile')) {
|
||||
return getVersionInputFromPipfileFile(versionFile);
|
||||
}
|
||||
else {
|
||||
return getVersionsInputFromPlainFile(versionFile);
|
||||
}
|
||||
|
@ -310,6 +310,15 @@ steps:
|
||||
- run: python my_script.py
|
||||
```
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version-file: 'Pipfile' # Read python version from a file Pipfile
|
||||
- run: python my_script.py
|
||||
```
|
||||
|
||||
## Check latest version
|
||||
|
||||
The `check-latest` flag defaults to `false`. Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific `Python or PyPy` version is always used.
|
||||
|
@ -96,7 +96,10 @@ export async function findPyPyVersion(
|
||||
core.addPath(pythonLocation);
|
||||
core.addPath(_binDir);
|
||||
}
|
||||
core.setOutput('python-version', 'pypy' + resolvedPyPyVersion);
|
||||
core.setOutput(
|
||||
'python-version',
|
||||
`pypy${resolvedPythonVersion}-${resolvedPyPyVersion}`
|
||||
);
|
||||
core.setOutput('python-path', pythonPath);
|
||||
|
||||
return {resolvedPyPyVersion, resolvedPythonVersion};
|
||||
|
42
src/utils.ts
42
src/utils.ts
@ -325,14 +325,54 @@ export function getVersionInputFromToolVersions(versionFile: string): string[] {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Python version extracted from a plain, .tool-versions or TOML file.
|
||||
* Python version extracted from the Pipfile file.
|
||||
*/
|
||||
export function getVersionInputFromPipfileFile(versionFile: string): string[] {
|
||||
core.debug(`Trying to resolve version from ${versionFile}`);
|
||||
|
||||
if (!fs.existsSync(versionFile)) {
|
||||
core.warning(`File ${versionFile} does not exist.`);
|
||||
return [];
|
||||
}
|
||||
let pipfileFile = fs.readFileSync(versionFile, 'utf8');
|
||||
// Normalize the line endings in the pipfileFile
|
||||
pipfileFile = pipfileFile.replace(/\r\n/g, '\n');
|
||||
|
||||
const pipfileConfig = toml.parse(pipfileFile);
|
||||
const keys = ['requires'];
|
||||
|
||||
if (!('requires' in pipfileConfig)) {
|
||||
core.warning(`No Python version found in ${versionFile}`);
|
||||
return [];
|
||||
}
|
||||
if ('python_full_version' in (pipfileConfig['requires'] as toml.JsonMap)) {
|
||||
// specifies a full python version
|
||||
keys.push('python_full_version');
|
||||
} else {
|
||||
keys.push('python_version');
|
||||
}
|
||||
const versions = [];
|
||||
const version = extractValue(pipfileConfig, keys);
|
||||
if (version !== undefined) {
|
||||
versions.push(version);
|
||||
}
|
||||
|
||||
core.info(`Extracted ${versions} from ${versionFile}`);
|
||||
return versions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Python version extracted from a plain, .tool-versions, Pipfile or TOML file.
|
||||
*/
|
||||
export function getVersionInputFromFile(versionFile: string): string[] {
|
||||
if (versionFile.endsWith('.toml')) {
|
||||
return getVersionInputFromTomlFile(versionFile);
|
||||
} else if (versionFile.match('.tool-versions')) {
|
||||
return getVersionInputFromToolVersions(versionFile);
|
||||
} else if (versionFile.match('Pipfile')) {
|
||||
return getVersionInputFromPipfileFile(versionFile);
|
||||
} else {
|
||||
return getVersionsInputFromPlainFile(versionFile);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user