Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(versioning/poetry): improve poetry prerelease version handling #11733

Merged
merged 24 commits into from Oct 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d020473
Handle prereleases published with Poetry
jvansanten Sep 14, 2021
3e3d041
Update poetry versioning readme
jvansanten Sep 14, 2021
2a4f8b8
Apply formatting suggestions from code review
jvansanten Sep 14, 2021
a210c91
Use one sentence per line in readme
jvansanten Sep 14, 2021
3ff1eb7
Factor out patterns and transformations
jvansanten Sep 14, 2021
af5789b
Merge branch 'main' into poetry-prerelease-support
jvansanten Sep 14, 2021
ad433fa
Apply suggestions from code review
viceice Sep 15, 2021
89a75ff
Use JSDoc comments
jvansanten Sep 15, 2021
f8a69a2
Mollify linters
jvansanten Sep 15, 2021
106cddc
Use only public API in manager/poetry
jvansanten Sep 15, 2021
341b477
Merge branch 'main' into poetry-prerelease-support
rarkins Sep 16, 2021
99b535b
Handle PEP440 ===
jvansanten Sep 16, 2021
00c2b20
Mollify tsc
jvansanten Sep 16, 2021
84aefea
Handle underspecified postreleases
jvansanten Sep 16, 2021
b585c54
v27.10.0-alpha.0
jvansanten Sep 29, 2021
687d574
Prohibit release segments of length > 3
jvansanten Sep 29, 2021
1ff92fb
Revert "v27.10.0-alpha.0"
jvansanten Sep 29, 2021
e8b785f
Merge branch 'main' into poetry-prerelease-support
jvansanten Sep 29, 2021
be9431c
Merge branch 'main' into poetry-prerelease-support
rarkins Sep 30, 2021
8712c42
Merge branch 'main' into poetry-prerelease-support
rarkins Oct 22, 2021
cbbf22f
Fix up test coverage
jvansanten Oct 22, 2021
fb0bee1
Merge branch 'main' into poetry-prerelease-support
jvansanten Oct 22, 2021
1c0f6e2
Validate regexes verbosely
jvansanten Oct 22, 2021
70398fc
Export isValid directly from versioning/poetry
jvansanten Oct 22, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
173 changes: 108 additions & 65 deletions lib/versioning/poetry/index.spec.ts
Expand Up @@ -3,25 +3,33 @@ import { api as versioning } from '.';
describe('versioning/poetry/index', () => {
describe('equals', () => {
test.each`
a | b | expected
${'1'} | ${'1'} | ${true}
${'1.0'} | ${'1'} | ${true}
${'1.0.0'} | ${'1'} | ${true}
${'1.9.0'} | ${'1.9'} | ${true}
${'1'} | ${'2'} | ${false}
${'1.9.1'} | ${'1.9'} | ${false}
${'1.9-beta'} | ${'1.9'} | ${false}
a | b | expected
${'1'} | ${'1'} | ${true}
${'1.0'} | ${'1'} | ${true}
${'1.0.0'} | ${'1'} | ${true}
${'1.9.0'} | ${'1.9'} | ${true}
${'1'} | ${'2'} | ${false}
${'1.9.1'} | ${'1.9'} | ${false}
${'1.9-beta'} | ${'1.9'} | ${false}
${'1.9b0'} | ${'1.9'} | ${false}
${'1.9b0'} | ${'1.9.0-beta.0'} | ${true}
${'1.9-0'} | ${'1.9.0-post.0'} | ${true}
${'1.9.0-post'} | ${'1.9.0-post.0'} | ${true}
${'1.9.0dev0'} | ${'1.9.0-dev.0'} | ${true}
`('equals("$a", "$b") === $expected', ({ a, b, expected }) => {
expect(versioning.equals(a, b)).toBe(expected);
});
});

test.each`
version | major | minor | patch
${'1'} | ${1} | ${0} | ${0}
${'1.9'} | ${1} | ${9} | ${0}
${'1.9.0'} | ${1} | ${9} | ${0}
${'1.9.4'} | ${1} | ${9} | ${4}
version | major | minor | patch
${'1'} | ${1} | ${0} | ${0}
${'1.9'} | ${1} | ${9} | ${0}
${'1.9.0'} | ${1} | ${9} | ${0}
${'1.9.4'} | ${1} | ${9} | ${4}
${'1.9.4b0'} | ${1} | ${9} | ${4}
${'1.9.4-beta0'} | ${1} | ${9} | ${4}
${'17.04.01'} | ${17} | ${4} | ${1}
`(
'getMajor, getMinor, getPatch for "$version"',
({ version, major, minor, patch }) => {
Expand All @@ -38,6 +46,7 @@ describe('versioning/poetry/index', () => {
${'2.0.0'} | ${'1'} | ${true}
${'1.10.0'} | ${'1.9'} | ${true}
${'1.9'} | ${'1.9-beta'} | ${true}
${'1.9'} | ${'1.9a0'} | ${true}
${'1'} | ${'1'} | ${false}
${'1.0'} | ${'1'} | ${false}
${'1.0.0'} | ${'1'} | ${false}
Expand All @@ -53,21 +62,41 @@ describe('versioning/poetry/index', () => {
${'1.9.0'} | ${true}
${'1.9.4'} | ${true}
${'1.9.4-beta'} | ${false}
${'1.9.4a0'} | ${false}
`('isStable("$version") === $expected', ({ version, expected }) => {
const res = !!versioning.isStable(version);
expect(res).toBe(expected);
});

test.each`
version | expected
${'1.2.3a0'} | ${true}
${'1.2.3b1'} | ${true}
${'1.2.3rc23'} | ${true}
${'17.04.01'} | ${true}
${'17.b4.0'} | ${false}
${'0.98.5.1'} | ${false}
`('isVersion("$version") === $expected', ({ version, expected }) => {
expect(!!versioning.isVersion(version)).toBe(expected);
});

test.each`
version | expected
${'17.04.0'} | ${false}
${'17.04.00'} | ${true}
${'17.b4.0'} | ${false}
${'1.2.3'} | ${true}
${'1.2.3-foo'} | ${true}
${'1.2.3foo'} | ${false}
${'1.2.3a0'} | ${true}
${'1.2.3b1'} | ${true}
${'1.2.3rc23'} | ${true}
${'*'} | ${true}
${'~1.2.3'} | ${true}
${'^1.2.3'} | ${true}
${'>1.2.3'} | ${true}
${'~=1.9'} | ${true}
${'==1.9'} | ${true}
${'===1.9.4'} | ${true}
${'renovatebot/renovate'} | ${false}
${'renovatebot/renovate#master'} | ${false}
${'https://github.com/renovatebot/renovate.git'} | ${false}
Expand All @@ -87,15 +116,20 @@ describe('versioning/poetry/index', () => {
});

test.each`
version | range | expected
${'4.2.0'} | ${'4.2, >= 3.0, < 5.0.0'} | ${true}
${'4.2.0'} | ${'2.0, >= 3.0, < 5.0.0'} | ${false}
${'4.2.2'} | ${'4.2.0, < 4.2.4'} | ${false}
${'4.2.2'} | ${'^4.2.0, < 4.2.4'} | ${true}
${'4.2.0'} | ${'4.3.0, 3.0.0'} | ${false}
${'4.2.0'} | ${'> 5.0.0, <= 6.0.0'} | ${false}
${'4.2.0'} | ${'*'} | ${true}
${'1.4'} | ${'1.4'} | ${true}
version | range | expected
${'4.2.0'} | ${'4.2, >= 3.0, < 5.0.0'} | ${true}
${'4.2.0'} | ${'2.0, >= 3.0, < 5.0.0'} | ${false}
${'4.2.2'} | ${'4.2.0, < 4.2.4'} | ${false}
${'4.2.2'} | ${'^4.2.0, < 4.2.4'} | ${true}
${'4.2.0'} | ${'4.3.0, 3.0.0'} | ${false}
${'4.2.0'} | ${'> 5.0.0, <= 6.0.0'} | ${false}
${'4.2.0'} | ${'*'} | ${true}
${'1.9.4'} | ${'==1.9'} | ${true}
${'1.9.4'} | ${'===1.9.4'} | ${true}
${'1.9.4'} | ${'===1.9.3'} | ${false}
${'0.8.0a1'} | ${'^0.8.0-alpha.0'} | ${true}
${'0.7.4'} | ${'^0.8.0-alpha.0'} | ${false}
${'1.4'} | ${'1.4'} | ${true}
`(
'matches("$version", "$range") === "$expected"',
({ version, range, expected }) => {
Expand All @@ -121,6 +155,7 @@ describe('versioning/poetry/index', () => {
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'^4.0.0, = 0.5.0'} | ${null}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'^4.0.0, > 4.1.0, <= 4.3.5'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'^6.2.0, 3.*'} | ${null}
${['0.8.0a2', '0.8.0a7']} | ${'^0.8.0-alpha.0'} | ${'0.8.0-alpha.2'}
`(
'minSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => {
Expand All @@ -132,55 +167,61 @@ describe('versioning/poetry/index', () => {
versions | range | expected
${['4.2.1', '0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'4.*.0, < 4.2.5'} | ${'4.2.1'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0', '5.0.3']} | ${'5.0, > 5.0.0'} | ${'5.0.3'}
${['0.8.0a2', '0.8.0a7']} | ${'^0.8.0-alpha.0'} | ${'0.8.0-alpha.7'}
`(
'getSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => {
expect(versioning.getSatisfyingVersion(versions, range)).toBe(expected);
}
);
test.each`
currentValue | rangeStrategy | currentVersion | newVersion | expected
${'1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'}
${' 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'}
${'1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'}
${'=1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0'}
${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'}
${'^5.0.3'} | ${'replace'} | ${'5.3.1'} | ${'5.5'} | ${'^5.0.3'}
${'1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'2.0.7'}
${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'}
${'^0.5.15'} | ${'replace'} | ${'0.5.15'} | ${'0.6'} | ${'^0.5.15'}
${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2'}
${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1'}
${'5'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5'}
${'5'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.0.7'} | ${'5.0'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5.1'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6.1'}
${'5.0'} | ${'replace'} | ${'5.0.0'} | ${'6.1.7'} | ${'6.1'}
${'=1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'^1'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7-prerelease.1'} | ${'^1.0.7-prerelease.1'}
${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'1.2.3'} | ${'^1.0.0'}
${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1'}
${'1.0.*'} | ${'replace'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.*'}
${'1.*'} | ${'replace'} | ${'1.0.0'} | ${'2.1.0'} | ${'2.*'}
${'~0.6.1'} | ${'replace'} | ${'0.6.8'} | ${'0.7.0-rc.2'} | ${'~0.7.0-rc'}
${'<1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<1.5.1'}
${'< 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'< 1.5.1'}
${'< 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'< 1.5.1'}
${'<=1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<=1.5.0'}
${'<= 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<= 1.5.0'}
${'<= 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<= 1.5.0'}
${'^1.2'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'^2.0'}
${'^1'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'^2'}
${'~1.2'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'~2.0'}
${'~1'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'~2'}
${'^2.2'} | ${'widen'} | ${'2.2.0'} | ${'3.0.0'} | ${'^2.2 || ^3.0.0'}
currentValue | rangeStrategy | currentVersion | newVersion | expected
${'1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'}
${' 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'}
${'1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'}
${'=1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0'}
${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'}
${'^5.0.3'} | ${'replace'} | ${'5.3.1'} | ${'5.5'} | ${'^5.0.3'}
${'1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'2.0.7'}
${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'}
${'^0.5.15'} | ${'replace'} | ${'0.5.15'} | ${'0.6'} | ${'^0.5.15'}
${'^0.5.15'} | ${'replace'} | ${'0.5.15'} | ${'0.6b.4'} | ${'^0.5.15'}
${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2'}
${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1'}
${'5'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5'}
${'5'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.0.7'} | ${'5.0'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5.1'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6.1'}
${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'6.b0.0'} | ${'5.0'}
${'5.0'} | ${'replace'} | ${'5.0.0'} | ${'6.1.7'} | ${'6.1'}
${'=1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'}
${'^1'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7rc.1'} | ${'^1.0.7-rc.1'}
${'^1'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7a0'} | ${'^1.0.7-alpha.0'}
${'^0.8.0-alpha.0'} | ${'bump'} | ${'0.8.0-alpha.0'} | ${'0.8.0-alpha.1'} | ${'^0.8.0-alpha.1'}
${'^0.8.0-alpha.0'} | ${'bump'} | ${'0.8.0-alpha.0'} | ${'0.8.0a1'} | ${'^0.8.0-alpha.1'}
${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'1.2.3'} | ${'^1.0.0'}
${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1'}
${'1.0.*'} | ${'replace'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.*'}
${'1.*'} | ${'replace'} | ${'1.0.0'} | ${'2.1.0'} | ${'2.*'}
${'~0.6.1'} | ${'replace'} | ${'0.6.8'} | ${'0.7.0-rc.2'} | ${'~0.7.0-rc'}
${'<1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<1.5.1'}
${'< 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'< 1.5.1'}
${'< 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'< 1.5.1'}
${'<=1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<=1.5.0'}
${'<= 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<= 1.5.0'}
${'<= 1.3.4'} | ${'replace'} | ${'1.2.3'} | ${'1.5.0'} | ${'<= 1.5.0'}
${'^1.2'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'^2.0'}
${'^1'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'^2'}
${'~1.2'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'~2.0'}
${'~1'} | ${'replace'} | ${'1.2.3'} | ${'2.0.0'} | ${'~2'}
${'^2.2'} | ${'widen'} | ${'2.2.0'} | ${'3.0.0'} | ${'^2.2 || ^3.0.0'}
`(
'getNewValue("$currentValue", "$rangeStrategy", "$currentVersion", "$newVersion") === "$expected"',
({ currentValue, rangeStrategy, currentVersion, newVersion, expected }) => {
Expand All @@ -205,6 +246,8 @@ describe('versioning/poetry/index', () => {
${'1.0'} | ${'1'} | ${0}
${'1.0.0'} | ${'1'} | ${0}
${'1.9.0'} | ${'1.9'} | ${0}
${'1.9'} | ${'1.9b'} | ${1}
${'1.9'} | ${'1.9rc0'} | ${1}
`('sortVersions("$a", "$b") === $expected', ({ a, b, expected }) => {
expect(versioning.sortVersions(a, b)).toEqual(expected);
});
Expand Down