2
2
import datetime
3
3
import warnings
4
4
import re
5
+ from itertools import chain , repeat , islice
6
+
5
7
from .utils import trace
6
8
7
9
from pkg_resources import iter_entry_points
8
10
9
11
from pkg_resources import parse_version
10
12
13
+ SEMVER_MINOR = 2
14
+ SEMVER_PATCH = 3
15
+ SEMVER_LEN = 3
16
+
17
+
18
+ def _pad (iterable , size , padding = None ):
19
+ padded = chain (iterable , repeat (padding ))
20
+ return list (islice (padded , size ))
21
+
11
22
12
23
def _get_version_class ():
13
24
modern_version = parse_version ("1.0" )
@@ -70,6 +81,7 @@ class ScmVersion(object):
70
81
def __init__ (self , tag_version ,
71
82
distance = None , node = None , dirty = False ,
72
83
preformatted = False ,
84
+ branch = None ,
73
85
** kw ):
74
86
if kw :
75
87
trace ("unknown args" , kw )
@@ -82,6 +94,7 @@ def __init__(self, tag_version,
82
94
self .extra = kw
83
95
self .dirty = dirty
84
96
self .preformatted = preformatted
97
+ self .branch = branch
85
98
86
99
@property
87
100
def exact (self ):
@@ -90,18 +103,23 @@ def exact(self):
90
103
def __repr__ (self ):
91
104
return self .format_with (
92
105
'<ScmVersion {tag} d={distance}'
93
- ' n={node} d={dirty} x={extra}>' )
106
+ ' n={node} d={dirty} b={branch} x={extra}>' )
94
107
95
108
def format_with (self , fmt , ** kw ):
96
109
return fmt .format (
97
110
time = self .time ,
98
111
tag = self .tag , distance = self .distance ,
99
- node = self .node , dirty = self .dirty , extra = self .extra , ** kw )
112
+ node = self .node , dirty = self .dirty , extra = self .extra ,
113
+ branch = self .branch , ** kw )
100
114
101
115
def format_choice (self , clean_format , dirty_format , ** kw ):
102
116
return self .format_with (
103
117
dirty_format if self .dirty else clean_format , ** kw )
104
118
119
+ def format_next_version (self , guess_next , fmt = "{guessed}.dev{distance}" , ** kw ):
120
+ guessed = guess_next (self .tag , ** kw )
121
+ return self .format_with (fmt , guessed = guessed )
122
+
105
123
106
124
def _parse_tag (tag , preformatted ):
107
125
if preformatted :
@@ -118,11 +136,9 @@ def meta(tag, distance=None, dirty=False, node=None, preformatted=False, **kw):
118
136
return ScmVersion (tag , distance , node , dirty , preformatted , ** kw )
119
137
120
138
121
- def guess_next_version (tag_version , distance ):
139
+ def guess_next_version (tag_version ):
122
140
version = _strip_local (str (tag_version ))
123
- bumped = _bump_dev (version ) or _bump_regex (version )
124
- suffix = '.dev%s' % distance
125
- return bumped + suffix
141
+ return _bump_dev (version ) or _bump_regex (version )
126
142
127
143
128
144
def _strip_local (version_string ):
@@ -140,15 +156,37 @@ def _bump_dev(version):
140
156
141
157
142
158
def _bump_regex (version ):
143
- prefix , tail = re .match ('(.*?)(\d+)$' , version ).groups ()
159
+ prefix , tail = re .match (r '(.*?)(\d+)$' , version ).groups ()
144
160
return '%s%d' % (prefix , int (tail ) + 1 )
145
161
146
162
147
163
def guess_next_dev_version (version ):
148
164
if version .exact :
149
165
return version .format_with ("{tag}" )
150
166
else :
151
- return guess_next_version (version .tag , version .distance )
167
+ return version .format_next_version (guess_next_version )
168
+
169
+
170
+ def guess_next_simple_semver (version , retain , increment = True ):
171
+ parts = map (int , str (version ).split ('.' ))
172
+ parts = _pad (parts , retain , 0 )
173
+ if increment :
174
+ parts [- 1 ] += 1
175
+ parts = _pad (parts , SEMVER_LEN , 0 )
176
+ return '.' .join (map (str , parts ))
177
+
178
+
179
+ def simplified_semver_version (version ):
180
+ if version .exact :
181
+ return guess_next_simple_semver (
182
+ version .tag , retain = SEMVER_LEN , increment = False )
183
+ else :
184
+ if version .branch is not None and 'feature' in version .branch :
185
+ return version .format_next_version (
186
+ guess_next_simple_semver , retain = SEMVER_MINOR )
187
+ else :
188
+ return version .format_next_version (
189
+ guess_next_simple_semver , retain = SEMVER_PATCH )
152
190
153
191
154
192
def _format_local_with_time (version , time_format ):
0 commit comments