Skip to content

Commit dcae6a4

Browse files
committed
feature: fallback to pre-release when no stable version is found
This allows to specify version like `3.11` or `pypy3.10` in workflows before those versions are released. This lessen the burden for users of `setup-python` by not having to modify their workflow twice: once when a pre-release is available (e.g. `3.11-dev`) and once when the first stable release is published (e.g. `3.11`)
1 parent c474c82 commit dcae6a4

File tree

8 files changed

+350
-29
lines changed

8 files changed

+350
-29
lines changed

__tests__/data/pypy.json

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,88 @@
11
[
2+
{
3+
"pypy_version": "7.3.8rc2",
4+
"python_version": "3.8.12",
5+
"stable": false,
6+
"latest_pypy": false,
7+
"date": "2022-02-11",
8+
"files": [
9+
{
10+
"filename": "pypy3.8-v7.3.8rc2-linux32.tar.bz2",
11+
"arch": "i686",
12+
"platform": "linux",
13+
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-linux32.tar.bz2"
14+
},
15+
{
16+
"filename": "pypy3.8-v7.3.8rc2-linux64.tar.bz2",
17+
"arch": "x64",
18+
"platform": "linux",
19+
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-linux64.tar.bz2"
20+
},
21+
{
22+
"filename": "pypy3.8-v7.3.8rc2-darwin64.tar.bz2",
23+
"arch": "x64",
24+
"platform": "darwin",
25+
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-darwin64.tar.bz2"
26+
},
27+
{
28+
"filename": "pypy3.8-v7.3.8rc2-s390x.tar.bz2",
29+
"arch": "s390x",
30+
"platform": "linux",
31+
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-s390x.tar.bz2"
32+
},
33+
{
34+
"filename": "pypy3.8-v7.3.8rc2-win64.zip",
35+
"arch": "x64",
36+
"platform": "win64",
37+
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-win64.zip"
38+
}
39+
]
40+
},
41+
{
42+
"pypy_version": "7.4.0rc1",
43+
"python_version": "3.6.12",
44+
"stable": false,
45+
"latest_pypy": false,
46+
"date": "2021-11-11",
47+
"files": [
48+
{
49+
"filename": "pypy3.6-v7.4.0rc1-aarch64.tar.bz2",
50+
"arch": "aarch64",
51+
"platform": "linux",
52+
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-aarch64.tar.bz2"
53+
},
54+
{
55+
"filename": "pypy3.6-v7.4.0rc1-linux32.tar.bz2",
56+
"arch": "i686",
57+
"platform": "linux",
58+
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-linux32.tar.bz2"
59+
},
60+
{
61+
"filename": "pypy3.6-v7.4.0rc1-linux64.tar.bz2",
62+
"arch": "x64",
63+
"platform": "linux",
64+
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-linux64.tar.bz2"
65+
},
66+
{
67+
"filename": "pypy3.6-v7.4.0rc1-darwin64.tar.bz2",
68+
"arch": "x64",
69+
"platform": "darwin",
70+
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-darwin64.tar.bz2"
71+
},
72+
{
73+
"filename": "pypy3.6-v7.4.0rc1-win32.zip",
74+
"arch": "x86",
75+
"platform": "win32",
76+
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-win32.zip"
77+
},
78+
{
79+
"filename": "pypy3.6-v7.4.0rc1-s390x.tar.bz2",
80+
"arch": "s390x",
81+
"platform": "linux",
82+
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-s390x.tar.bz2"
83+
}
84+
]
85+
},
286
{
387
"pypy_version": "7.3.3",
488
"python_version": "3.6.12",
@@ -530,4 +614,4 @@
530614
}
531615
]
532616
}
533-
]
617+
]

__tests__/data/versions-manifest.json

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,29 @@
11
[
2+
{
3+
"version": "1.2.4-beta.2",
4+
"stable": false,
5+
"release_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5",
6+
"files": [
7+
{
8+
"filename": "sometool-1.2.4-linux-x64.tar.gz",
9+
"arch": "x64",
10+
"platform": "linux",
11+
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5/sometool-1.2.4-linux-x64.tar.gz"
12+
},
13+
{
14+
"filename": "sometool-1.2.4-darwin-x64.tar.gz",
15+
"arch": "x64",
16+
"platform": "darwin",
17+
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5/sometool-1.2.4-darwin-x64.tar.gz"
18+
},
19+
{
20+
"filename": "sometool-1.2.4-win32-x64.tar.gz",
21+
"arch": "x64",
22+
"platform": "win32",
23+
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5/sometool-1.2.4-win32-x64.tar.gz"
24+
}
25+
]
26+
},
227
{
328
"version": "1.2.3",
429
"stable": true,
@@ -25,28 +50,28 @@
2550
]
2651
},
2752
{
28-
"version": "1.2.3-beta.2",
53+
"version": "1.1.0-beta.2",
2954
"stable": false,
30-
"release_url": "https://github.com/actions/sometool/releases/tag/1.2.3-beta.2-20200402.5",
55+
"release_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5",
3156
"files": [
3257
{
33-
"filename": "sometool-1.2.3-linux-x64.tar.gz",
58+
"filename": "sometool-1.1.0-linux-x64.tar.gz",
3459
"arch": "x64",
3560
"platform": "linux",
36-
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.3-beta.2-20200402.5/sometool-1.2.3-linux-x64.tar.gz"
61+
"download_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5/sometool-1.1.0-linux-x64.tar.gz"
3762
},
3863
{
39-
"filename": "sometool-1.2.3-darwin-x64.tar.gz",
64+
"filename": "sometool-1.1.0-darwin-x64.tar.gz",
4065
"arch": "x64",
4166
"platform": "darwin",
42-
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.3-20200402.5/sometool-1.2.3-darwin-x64.tar.gz"
67+
"download_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5/sometool-1.1.0-darwin-x64.tar.gz"
4368
},
4469
{
45-
"filename": "sometool-1.2.3-win32-x64.tar.gz",
70+
"filename": "sometool-1.1.0-win32-x64.tar.gz",
4671
"arch": "x64",
4772
"platform": "win32",
48-
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.3-20200402.5/sometool-1.2.3-win32-x64.tar.gz"
73+
"download_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5/sometool-1.1.0-win32-x64.tar.gz"
4974
}
5075
]
5176
}
52-
]
77+
]

__tests__/find-pypy.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,19 @@ describe('findPyPyVersion', () => {
298298
`PyPy version 3.7 (v7.5.x) with arch ${architecture} not found`
299299
);
300300
});
301+
302+
it('found and install successfully, pre-release fallback', async () => {
303+
spyCacheDir = jest.spyOn(tc, 'cacheDir');
304+
spyCacheDir.mockImplementation(() =>
305+
path.join(toolDir, 'PyPy', '3.8.12', architecture)
306+
);
307+
spyChmodSync = jest.spyOn(fs, 'chmodSync');
308+
spyChmodSync.mockImplementation(() => undefined);
309+
await expect(
310+
finder.findPyPyVersion('pypy3.8', architecture, true)
311+
).resolves.toEqual({
312+
resolvedPythonVersion: '3.8.12',
313+
resolvedPyPyVersion: '7.3.8rc2'
314+
});
315+
});
301316
});

__tests__/finder.test.ts

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ describe('Finder tests', () => {
8585
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
8686
});
8787
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
88-
await finder.useCpythonVersion('1.2.3', 'x64', true);
88+
await expect(
89+
finder.useCpythonVersion('1.2.3', 'x64', true)
90+
).resolves.toEqual({
91+
impl: 'CPython',
92+
version: '1.2.3'
93+
});
8994
expect(spyCoreAddPath).toHaveBeenCalled();
9095
expect(spyCoreExportVariable).toHaveBeenCalledWith(
9196
'pythonLocation',
@@ -109,14 +114,19 @@ describe('Finder tests', () => {
109114
const pythonDir: string = path.join(
110115
toolDir,
111116
'Python',
112-
'1.2.3-beta.2',
117+
'1.2.4-beta.2',
113118
'x64'
114119
);
115120
await io.mkdirP(pythonDir);
116121
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
117122
});
118123
// This will throw if it doesn't find it in the manifest (because no such version exists)
119-
await finder.useCpythonVersion('1.2.3-beta.2', 'x64', true);
124+
await expect(
125+
finder.useCpythonVersion('1.2.4-beta.2', 'x64', true)
126+
).resolves.toEqual({
127+
impl: 'CPython',
128+
version: '1.2.4-beta.2'
129+
});
120130
expect(spyCoreAddPath).toHaveBeenCalled();
121131
expect(spyCoreExportVariable).toHaveBeenCalledWith(
122132
'pythonLocation',
@@ -128,6 +138,55 @@ describe('Finder tests', () => {
128138
);
129139
});
130140

141+
it('Finds stable Python version if it is not installed, but exists in the manifest, skipping newer pre-release', async () => {
142+
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
143+
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
144+
145+
const installSpy: jest.SpyInstance = jest.spyOn(
146+
installer,
147+
'installCpythonFromRelease'
148+
);
149+
installSpy.mockImplementation(async () => {
150+
const pythonDir: string = path.join(toolDir, 'Python', '1.2.3', 'x64');
151+
await io.mkdirP(pythonDir);
152+
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
153+
});
154+
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
155+
await expect(finder.useCpythonVersion('1.2', 'x64', true)).resolves.toEqual(
156+
{
157+
impl: 'CPython',
158+
version: '1.2.3'
159+
}
160+
);
161+
});
162+
163+
it('Finds Python version if it is not installed, but exists in the manifest, pre-release fallback', async () => {
164+
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
165+
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
166+
167+
const installSpy: jest.SpyInstance = jest.spyOn(
168+
installer,
169+
'installCpythonFromRelease'
170+
);
171+
installSpy.mockImplementation(async () => {
172+
const pythonDir: string = path.join(
173+
toolDir,
174+
'Python',
175+
'1.1.0-beta.2',
176+
'x64'
177+
);
178+
await io.mkdirP(pythonDir);
179+
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
180+
});
181+
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
182+
await expect(finder.useCpythonVersion('1.1', 'x64', true)).resolves.toEqual(
183+
{
184+
impl: 'CPython',
185+
version: '1.1.0-beta.2'
186+
}
187+
);
188+
});
189+
131190
it('Errors if Python is not installed', async () => {
132191
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
133192
let thrown = false;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy