@@ -73,8 +73,7 @@ def parse(version):
7373 return version_parts
7474
7575
76- class VersionInfo (collections .namedtuple (
77- 'VersionInfo' , 'major minor patch prerelease build' )):
76+ class VersionInfo :
7877 """
7978 :param int major: version when you make incompatible API changes.
8079 :param int minor: version when you add functionality in
@@ -83,7 +82,26 @@ class VersionInfo(collections.namedtuple(
8382 :param str prerelease: an optional prerelease string
8483 :param str build: an optional build string
8584 """
86- __slots__ = ()
85+
86+ def __init__ (self , major , minor , patch , prerelease , build ):
87+ self .major = major
88+ self .minor = minor
89+ self .patch = patch
90+ self .prerelease = prerelease
91+ self .build = build
92+
93+ def _astuple (self ):
94+ return (self .major , self .minor , self .patch ,
95+ self .prerelease , self .build )
96+
97+ def _asdict (self ):
98+ return collections .OrderedDict ((
99+ ("major" , self .major ),
100+ ("minor" , self .minor ),
101+ ("patch" , self .patch ),
102+ ("prerelease" , self .prerelease ),
103+ ("build" , self .build )
104+ ))
87105
88106 def __eq__ (self , other ):
89107 if not isinstance (other , (VersionInfo , dict )):
@@ -115,11 +133,16 @@ def __ge__(self, other):
115133 return NotImplemented
116134 return _compare_by_keys (self ._asdict (), _to_dict (other )) >= 0
117135
136+ def __repr__ (self ):
137+ s = ", " .join ("%s=%r" % (key , val )
138+ for key , val in self ._asdict ().items ())
139+ return "VersionInfo(%s)" % s
140+
118141 def __str__ (self ):
119- return format_version (* self )
142+ return format_version (* ( self . _astuple ()) )
120143
121144 def __hash__ (self ):
122- return hash (tuple ( self ))
145+ return hash (self . _astuple ( ))
123146
124147 @staticmethod
125148 def parse (version ):
0 commit comments