1
1
"""Meta related things."""
2
+ from __future__ import annotations
2
3
from collections import namedtuple
3
4
import re
4
5
@@ -69,17 +70,21 @@ class Version(namedtuple("Version", ["major", "minor", "micro", "release", "pre"
69
70
Version(1, 0, 0, "final") 1.0
70
71
Version(1, 2, 0, "final") 1.2
71
72
Version(1, 2, 3, "final") 1.2.3
72
- Version(1, 2, 0, ".dev- alpha", pre=4) 1.2a4
73
- Version(1, 2, 0, ".dev- beta", pre=4) 1.2b4
74
- Version(1, 2, 0, ".dev- candidate", pre=4) 1.2rc4
73
+ Version(1, 2, 0, "alpha", pre=4) 1.2a4
74
+ Version(1, 2, 0, "beta", pre=4) 1.2b4
75
+ Version(1, 2, 0, "candidate", pre=4) 1.2rc4
75
76
Version(1, 2, 0, "final", post=1) 1.2.post1
76
77
Version(1, 2, 3, ".dev") 1.2.3.dev0
77
78
Version(1, 2, 3, ".dev", dev=1) 1.2.3.dev1
78
79
```
79
80
80
81
"""
81
82
82
- def __new__ (cls , major , minor , micro , release = "final" , pre = 0 , post = 0 , dev = 0 ):
83
+ def __new__ (
84
+ cls ,
85
+ major : int , minor : int , micro : int , release : str = "final" ,
86
+ pre : int = 0 , post : int = 0 , dev : int = 0
87
+ ) -> Version :
83
88
"""Validate version info."""
84
89
85
90
# Ensure all parts are positive integers.
@@ -115,31 +120,31 @@ def __new__(cls, major, minor, micro, release="final", pre=0, post=0, dev=0):
115
120
116
121
return super ().__new__ (cls , major , minor , micro , release , pre , post , dev )
117
122
118
- def _is_pre (self ):
123
+ def _is_pre (self ) -> bool :
119
124
"""Is prerelease."""
120
125
121
- return self .pre > 0
126
+ return bool ( self .pre > 0 )
122
127
123
- def _is_dev (self ):
128
+ def _is_dev (self ) -> bool :
124
129
"""Is development."""
125
130
126
131
return bool (self .release < "alpha" )
127
132
128
- def _is_post (self ):
133
+ def _is_post (self ) -> bool :
129
134
"""Is post."""
130
135
131
- return self .post > 0
136
+ return bool ( self .post > 0 )
132
137
133
- def _get_dev_status (self ): # pragma: no cover
138
+ def _get_dev_status (self ) -> str : # pragma: no cover
134
139
"""Get development status string."""
135
140
136
141
return DEV_STATUS [self .release ]
137
142
138
- def _get_canonical (self ):
143
+ def _get_canonical (self ) -> str :
139
144
"""Get the canonical output string."""
140
145
141
146
# Assemble major, minor, micro version and append `pre`, `post`, or `dev` if needed..
142
- if self .micro == 0 :
147
+ if self .micro == 0 and self . major != 0 :
143
148
ver = f"{ self .major } .{ self .minor } "
144
149
else :
145
150
ver = f"{ self .major } .{ self .minor } .{ self .micro } "
@@ -153,11 +158,14 @@ def _get_canonical(self):
153
158
return ver
154
159
155
160
156
- def parse_version (ver , pre = False ) :
161
+ def parse_version (ver : str ) -> Version :
157
162
"""Parse version into a comparable Version tuple."""
158
163
159
164
m = RE_VER .match (ver )
160
165
166
+ if m is None :
167
+ raise ValueError (f"'{ ver } ' is not a valid version" )
168
+
161
169
# Handle major, minor, micro
162
170
major = int (m .group ('major' ))
163
171
minor = int (m .group ('minor' )) if m .group ('minor' ) else 0
@@ -185,5 +193,5 @@ def parse_version(ver, pre=False):
185
193
return Version (major , minor , micro , release , pre , post , dev )
186
194
187
195
188
- __version_info__ = Version (10 , 14 , 3 , "final" )
196
+ __version_info__ = Version (10 , 15 , 0 , "final" )
189
197
__version__ = __version_info__ ._get_canonical ()
0 commit comments