@@ -199,19 +199,14 @@ def __init__(self, version):
199199 if not self .is_correct (version ):
200200 raise InvalidVersionError (version )
201201
202- # If version is an empty string convert it to 0
203202 version = str (version ).strip ()
204-
205203 self .original = version
206204
205+ # If version is an empty string convert it to 0
207206 if not version :
208207 version = "0"
209208
210209 self .version = version .replace ("-" , ".pre." )
211- self ._segments = ()
212- self ._canonical_segments = ()
213- self ._bump = None
214- self ._release = None
215210
216211 def __str__ (self ):
217212 return self .original
@@ -225,7 +220,7 @@ def equal_strictly(self, other):
225220 return self .version == other .version
226221
227222 def __hash__ (self ):
228- return hash (self .canonical_segments )
223+ return hash (tuple ( self .canonical_segments ) )
229224
230225 def __eq__ (self , other ):
231226 return self .canonical_segments == other .canonical_segments
@@ -242,6 +237,33 @@ def __gt__(self, other):
242237 def __ge__ (self , other ):
243238 return self .__cmp__ (other ) >= 0
244239
240+ @property
241+ def segments (self ):
242+ """
243+ Return a new sequence of segments for this version where segments are
244+ ints or strings parsed from the original version string.
245+ """
246+ find_segments = re .compile (r"[0-9]+|[a-z]+" , re .IGNORECASE ).findall
247+ segments = []
248+ for seg in find_segments (self .version ):
249+ if seg .isdigit ():
250+ seg = int (seg )
251+ segments .append (seg )
252+ return segments
253+
254+ @property
255+ def canonical_segments (self ):
256+ """
257+ Return a new sequence of "canonical segments" for this version using
258+ the Rubygems way.
259+ """
260+ canonical_segments = []
261+ for segments in self .split_segments ():
262+ segs = list (dropwhile (lambda s : s == 0 , reversed (segments )))
263+ segs = reversed (segs )
264+ canonical_segments .extend (segs )
265+ return canonical_segments
266+
245267 def bump (self ):
246268 """
247269 Return a new version object where the next to the last revision number
@@ -252,40 +274,33 @@ def bump(self):
252274 >>> assert GemVersion("5.3.1").bump() == GemVersion("5.4"), repr(GemVersion("5.3.1").bump())
253275 >>> assert GemVersion("5.3.1.4-2").bump() == GemVersion("5.3.2"), GemVersion("5.3.1.4-2").bump()
254276 """
255- if not self ._bump :
256- segments = []
257- for seg in self .segments :
258- if isinstance (seg , str ):
259- break
260- else :
261- segments .append (seg )
262-
263- if len (segments ) > 1 :
264- segments .pop ()
277+ segments = []
278+ for seg in self .segments :
279+ if isinstance (seg , str ):
280+ break
281+ else :
282+ segments .append (seg )
265283
266- segments [- 1 ] += 1
267- segments = [str (r ) for r in segments ]
268- self ._bump = GemVersion ("." .join (segments ))
284+ if len (segments ) > 1 :
285+ segments .pop ()
269286
270- return self ._bump
287+ segments [- 1 ] += 1
288+ segments = [str (r ) for r in segments ]
289+ return GemVersion ("." .join (segments ))
271290
272291 def release (self ):
273292 """
274293 Return a new GemVersion which is the release for this version (e.g.,
275294 1.2.0.a -> 1.2.0). Non-prerelease versions return themselves. A release
276295 is composed only of numeric segments.
277296 """
278- if not self ._release :
279- if self .prerelease ():
280- segments = self .segments
281- while any (isinstance (s , str ) for s in segments ):
282- segments .pop ()
283- segments = (str (s ) for s in segments )
284- self ._release = GemVersion ("." .join (segments ))
285- else :
286- self ._release = self
287-
288- return self ._release
297+ if self .prerelease ():
298+ segments = self .segments
299+ while any (isinstance (s , str ) for s in segments ):
300+ segments .pop ()
301+ segments = (str (s ) for s in segments )
302+ return GemVersion ("." .join (segments ))
303+ return self
289304
290305 def prerelease (self ):
291306 """
@@ -294,47 +309,6 @@ def prerelease(self):
294309 """
295310 return any (not str (s ).isdigit () for s in self .segments )
296311
297- @property
298- def segments (self ):
299- """
300- Return a new sequence of segments for this version where segments are
301- ints or strings parsed from the original version string.
302- """
303- if not self ._segments :
304- self ._segments = self .get_segments ()
305- return list (self ._segments )
306-
307- def get_segments (self ):
308- """
309- Return a sequence of segments for this version where segments are ints
310- or strings parsed from the original version string.
311- """
312- find_segments = re .compile (r"[0-9]+|[a-z]+" , re .IGNORECASE ).findall
313- segments = []
314- for seg in find_segments (self .version ):
315- if seg .isdigit ():
316- seg = int (seg )
317- segments .append (seg )
318- return tuple (segments )
319-
320- @property
321- def canonical_segments (self ):
322- if not self ._canonical_segments :
323- self ._canonical_segments = self .get_canonical_segments ()
324- return list (self ._canonical_segments )
325-
326- def get_canonical_segments (self ):
327- """
328- Return a new sequence of "canonical segments" for this version using
329- the Rubygems way.
330- """
331- canonical_segments = []
332- for segments in self .split_segments ():
333- segs = list (dropwhile (lambda s : s == 0 , reversed (segments )))
334- segs = reversed (segs )
335- canonical_segments .extend (segs )
336- return tuple (canonical_segments )
337-
338312 def split_segments (self ):
339313 """
340314 Return a two-tuple of segments:
0 commit comments