Skip to content

Commit 0c434db

Browse files
minrkagoose77
andauthored
ENH: Accept dev prerelease versions (#26)
* accept dev prerelease versions e.g. `1.2.3.dev0` still doesn't accept valid pep440 versions with multiple fields like 1.2.3a1.dev0 1.2.3.post1.dev2 * fix: support dev as a dev suffix --------- Co-authored-by: Angus Hollands <[email protected]>
1 parent 9a95b55 commit 0c434db

File tree

3 files changed

+67
-16
lines changed

3 files changed

+67
-16
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ accepts the common version parts:
7474
- `minor`
7575
- `patch`
7676
- `pre-release`
77+
- `dev-release`
7778

7879
e.g. `1.2.3-rc0`.
7980

hatch_nodejs_version/version_source.py

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,44 @@
77

88
from hatchling.version.source.plugin.interface import VersionSourceInterface
99

10+
PRE_PATTERN = r"""
11+
(?P<{prefix}pre_l>(a|b|c|rc|alpha|beta|pre|preview))
12+
[-.]?
13+
(?P<{prefix}pre_n>[0-9]+)?
14+
15+
"""
16+
DEV_PATTERN = r"""
17+
dev
18+
[-.]?
19+
(?P<{prefix}dev_n>[0-9]+)?
20+
"""
21+
1022
# The Python-aware NodeJS version regex
1123
# This is very similar to `packaging.version.VERSION_PATTERN`, with a few changes:
1224
# - Don't accept underscores
1325
# - Only support four-component release, prerelease, and build segments
1426
# - Require - to indicate prerelease
15-
NODE_VERSION_PATTERN = r"""
27+
NODE_VERSION_PATTERN = rf"""
1628
(?P<major>[0-9]+) # major
1729
\.
1830
(?P<minor>[0-9]+) # minor
1931
\.
2032
(?P<patch>[0-9]+) # patch
21-
(?P<pre> # pre-release
33+
(?:
34+
(?P<pre_only> # pre-release
2235
-
23-
(?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
24-
[-\.]?
25-
(?P<pre_n>[0-9]+)?
36+
{PRE_PATTERN.format(prefix="pre_only_")}
37+
) |
38+
(?P<dev_only> # dev
39+
-
40+
{DEV_PATTERN.format(prefix="dev_only_")}
41+
) |
42+
(?P<pre_dev> # pre-release and dev
43+
-
44+
{PRE_PATTERN.format(prefix="pre_dev_")}
45+
\.
46+
{DEV_PATTERN.format(prefix="pre_dev_")}
47+
)
2648
)?
2749
(?:
2850
\+
@@ -40,7 +62,7 @@
4062

4163
# The NodeJS-aware Python version regex
4264
# This is very similar to `packaging.version.VERSION_PATTERN`, with a few changes:
43-
# - Only support four-component release, prerelease, and build segments
65+
# - Only support five-component release, prerelease, dev, and build segments
4466
PYTHON_VERSION_PATTERN = r"""
4567
v?
4668
(?:
@@ -50,12 +72,17 @@
5072
\.
5173
(?P<patch>[0-9]+) # patch
5274
(?P<pre> # pre-release
53-
[-_\.]?
75+
[-_.]?
5476
(?P<pre_l>(alpha|beta|preview|a|b|c|rc|pre))
55-
[-_\.]?
77+
[-_.]?
5678
(?P<pre_n>[0-9]+)?
5779
)?
58-
(?:
80+
(?P<dev>
81+
[-_.]?
82+
dev
83+
(?P<dev_n>[0-9]+)
84+
)?
85+
(?: # local version number
5986
\+
6087
(?P<local>
6188
[0-9A-Za-z][0-9A-Za-z-_]* # non-hyphen/dash leading identifier
@@ -105,16 +132,31 @@ def node_version_to_python(version: str) -> str:
105132
if match is None:
106133
raise ValueError(f"Version {version!r} did not match regex")
107134

108-
parts = ["{major}.{minor}.{patch}".format_map(match)]
135+
groups = {}
136+
for key, value in match.groupdict().items():
137+
key = re.sub("pre_dev_|pre_only_|dev_only_", "", key)
138+
if key not in groups:
139+
groups[key] = value
140+
elif value is not None:
141+
groups[key] = value
109142

110-
if match["pre"]:
111-
if match["pre_n"] is None:
112-
parts.append("{pre_l}".format_map(match))
143+
del match
144+
parts = ["{major}.{minor}.{patch}".format_map(groups)]
145+
146+
if groups["pre_only"] or groups["pre_dev"]:
147+
if groups["pre_n"] is None:
148+
parts.append("{pre_l}".format_map(groups))
113149
else:
114-
parts.append("{pre_l}{pre_n}".format_map(match))
150+
parts.append("{pre_l}{pre_n}".format_map(groups))
115151

116-
if match["build"]:
117-
parts.append("+{build}".format_map(match))
152+
if groups["dev_only"] or groups["pre_dev"]:
153+
if groups["dev_n"] is None:
154+
parts.append("dev0")
155+
else:
156+
parts.append("dev{dev_n}".format_map(groups))
157+
158+
if groups["build"]:
159+
parts.append("+{build}".format_map(groups))
118160

119161
return "".join(parts)
120162

@@ -137,6 +179,12 @@ def python_version_to_node(version: str) -> str:
137179
else:
138180
parts.append("-{pre_l}{pre_n}".format_map(match))
139181

182+
if match["dev"]:
183+
if match["pre"]:
184+
parts.append(".dev{dev_n}".format_map(match))
185+
else:
186+
parts.append("-dev{dev_n}".format_map(match))
187+
140188
if match["local"]:
141189
parts.append("+{local}".format_map(match))
142190
return "".join(parts)

tests/test_version_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
("1.4.5-b0", "1.4.5b0"),
1515
("1.4.5-c1", "1.4.5c1"),
1616
("1.4.5-rc0", "1.4.5rc0"),
17+
("1.4.5-dev0", "1.4.5dev0"),
18+
("1.4.5-a1.dev0", "1.4.5a1dev0"),
1719
("1.4.5-alpha0", "1.4.5alpha0"),
1820
("1.4.5-beta0", "1.4.5beta0"),
1921
("1.4.5-pre9", "1.4.5pre9"),

0 commit comments

Comments
 (0)