Skip to content

Commit a3b3f50

Browse files
authored
Merge pull request #12 from mbdevpl/feature/pre-release-compatibility
Ensure compatibility with PEP 440 for pre-releases of Python packages
2 parents 897c4cc + e266415 commit a3b3f50

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

Jenkinsfile

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,26 @@ pipeline {
9292
}
9393
}
9494

95+
stage('Release') {
96+
when {
97+
environment name: 'PYTHON_VERSION', value: '3.11'
98+
buildingTag()
99+
}
100+
environment {
101+
PACKAGE_NAME = 'version-query'
102+
VERSION = sh(script: 'python3 -m version_query .', returnStdout: true).trim()
103+
}
104+
steps {
105+
script {
106+
githubUtils.createRelease([
107+
"dist/${PACKAGE_NAME.replace('-', '_')}-${VERSION}-py3-none-any.whl",
108+
"dist/${PACKAGE_NAME}-${VERSION}.tar.gz",
109+
"dist/${PACKAGE_NAME}-${VERSION}.zip"
110+
])
111+
}
112+
}
113+
}
114+
95115
}
96116

97117
}

test/examples.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ def _remove_version_suffixes(path: pathlib.Path) -> t.Optional[pathlib.Path]:
7070
'1': ((1,), {}),
7171
'1.0': ((1, 0), {}),
7272
'1.0.0': ((1, 0, 0), {}),
73+
'1.0.0rc1': ((1, 0, 0, None, 'rc', 1), {}),
74+
'1.0.0rc2': ((1, 0, 0, None, 'rc', 2), {}),
7375
'1.0.0.rc2': ((1, 0, 0, '.', 'rc', 2), {}),
76+
'1.0.0rc3': ((1, 0, 0, None, 'rc', 3), {}),
7477
'1.0.0.rc3': ((1, 0, 0, ('.', 'rc', 3)), {}),
7578
'1.0.0.rc2+local': ((1, 0, 0, '.', 'rc', 2, 'local'), {}),
7679
'1.0.0.rc3+local': ((1, 0, 0, ('.', 'rc', 3), 'local'), {}),
@@ -126,14 +129,16 @@ def _remove_version_suffixes(path: pathlib.Path) -> t.Optional[pathlib.Path]:
126129
'1.0.0.4': ((1, 0, 0, '.', None, 4), {}),
127130
'2.0.0.8+cc81cee': ((2, 0, 0, '.', None, 8, 'cc81cee'), {}),
128131
'4.5.0.dev1234': ((4, 5, 0, '.', 'dev', 1234), {}),
129-
'1.0.0.rc3': ((1, 0, 0, '.', 'rc', 3), {}),
132+
'1.0.0rc1': ((1, 0, 0, None, 'rc', 1), {}),
133+
'1.0.0rc3': ((1, 0, 0, None, 'rc', 3), {}),
130134
'1.0.1.dev0': ((1, 0, 1, '.', 'dev', 0), {}),
131135
'0.4.4.dev5+84e1d430': ((0, 4, 4, '.', 'dev', 5, '84e1d430'), {}),
132136
'0.4.4.dev5+20171003.84e1d430': ((0, 4, 4, '.', 'dev', 5, '20171003', '.', '84e1d430'), {})}
133137

134138
INCOMPATIBLE_STR_CASES: t.Dict[str, t.Tuple[tuple, dict]] = {
135139
'1.0.0-2': ((1, 0, 0, '-', None, 2), {}),
136140
# '1.0.0-0.2': ((1, 0, 0, '-', None, 0, '.', None, 2), {}),
141+
'1.0.0.rc3': ((1, 0, 0, '.', 'rc', 3), {}),
137142
'4.5.0.dev': ((4, 5, 0, '.', 'dev', None), {})}
138143

139144
STR_CASES = dict(itertools.chain(COMPATIBLE_STR_CASES.items(),

version_query/version.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
_LOG = logging.getLogger(__name__)
1414

15+
PY_PRE_RELEASE_INDICATORS = {'a', 'b', 'c', 'rc'}
16+
1517

1618
@enum.unique
1719
class VersionComponent(enum.IntEnum):
@@ -168,8 +170,8 @@ def from_py_version(cls, py_version: packaging.version.Version):
168170
elif ver.pre:
169171
pre_ver = ver.pre
170172
if pre_ver:
171-
pre_release = [('.', pre_ver[0] if len(pre_ver) > 0 else None,
172-
pre_ver[1] if len(pre_ver) > 1 else None)]
173+
prefix_dot = None if pre_ver[0] in PY_PRE_RELEASE_INDICATORS else '.'
174+
pre_release = [(prefix_dot, pre_ver[0], pre_ver[1] if len(pre_ver) > 1 else None)]
173175
if ver.local:
174176
local = tuple(itertools.chain.from_iterable(
175177
(dot, str(_)) for dot, _ in zip('.' * len(ver.local), ver.local)))[1:]
@@ -502,6 +504,8 @@ def _pre_release_segment_to_str(self, segment: int) -> str:
502504
return '{}{}'.format(*version_tuple[:2])
503505
if _version_tuple_checker(version_tuple, (True, False, True)):
504506
return f'{version_tuple[0]}{version_tuple[2]}'
507+
if _version_tuple_checker(version_tuple, (False, True, True)):
508+
return '{}{}'.format(*version_tuple[1:])
505509
if _version_tuple_checker(version_tuple, (True, True, True)):
506510
return '{}{}{}'.format(*version_tuple)
507511
raise ValueError(f'cannot generate valid version string from {repr(self)}')

0 commit comments

Comments
 (0)