@@ -32,6 +32,7 @@ def _padded(cls, iter, length, padding=0):
3232 @classmethod
3333 def from_string (cls , version_string ):
3434 mod = 0
35+ bump_patch_level = False
3536 if version_string .endswith ("+" ):
3637 version_string = version_string [0 :- 1 ]
3738 mod = 1
@@ -42,19 +43,43 @@ def from_string(cls, version_string):
4243 version_string = version_string [0 :- 1 ]
4344 mod = - 1
4445 # Deal with '-rcX' substrings
45- if version_string . find ( '-rc' ) != - 1 :
46+ if '-rc' in version_string :
4647 version_string = version_string [0 :version_string .find ('-rc' )]
4748 mod = - 1
49+ # Deal with git describe generated substrings
50+ elif '-' in version_string :
51+ version_string = version_string [0 :version_string .find ('-' )]
52+ mod = - 1
53+ bump_patch_level = True
54+
4855
4956 version = [int (part ) for part in version_string .split ("." )]
5057 version = cls ._padded (version , 3 )
58+ # Make from_string and from_version_array agree. For example:
59+ # MongoDB Enterprise > db.runCommand('buildInfo').versionArray
60+ # [ 3, 2, 1, -100 ]
61+ # MongoDB Enterprise > db.runCommand('buildInfo').version
62+ # 3.2.0-97-g1ef94fe
63+ if bump_patch_level :
64+ version [- 1 ] += 1
5165 version .append (mod )
5266
5367 return Version (* version )
5468
69+ @classmethod
70+ def from_version_array (cls , version_array ):
71+ version = list (version_array )
72+ if version [- 1 ] < 0 :
73+ version [- 1 ] = - 1
74+ version = cls ._padded (version , 3 )
75+ return Version (* version )
76+
5577 @classmethod
5678 def from_client (cls , client ):
57- return cls .from_string (client .server_info ()['version' ])
79+ info = client .server_info ()
80+ if 'versionArray' in info :
81+ return cls .from_version_array (info ['versionArray' ])
82+ return cls .from_string (info ['version' ])
5883
5984 def at_least (self , * other_version ):
6085 return self >= Version (* other_version )
0 commit comments