66
77"""
88import collections
9+ import functools
910import logging
1011import os
1112import re
1213import subprocess
1314import sys
14- from distutils . version import LooseVersion
15+ import typing
1516
1617from . import exc
1718from ._compat import MutableMapping , console_to_str , str_from_console
@@ -435,6 +436,45 @@ def _is_executable_file_or_link(exe):
435436 return None
436437
437438
439+ version_component_re = re .compile (r"(\d+|[a-z]+|\.)" )
440+
441+
442+ @functools .total_ordering
443+ class _Version (typing .NamedTuple ):
444+ """based on https://github.com/asottile/flake8-typing-imports/blob/923a533/flake8_typing_imports.py#L32-L42
445+
446+ License MIT
447+ """
448+
449+ major : int = 0
450+ minor : int = 0
451+ patch : int = 0
452+
453+ @classmethod
454+ def parse (cls , s : str ) -> "_Version" :
455+ return cls (* (int (p ) for p in s .split ("." )))
456+
457+ def __lt__ (self , other ):
458+ if isinstance (other , str ):
459+ other = Version (other )
460+ return tuple (self ) < tuple (other )
461+
462+ def __eq__ (self , other ):
463+ if isinstance (other , str ):
464+ other = Version (other )
465+ return self == other
466+
467+
468+ def Version (version : typing .Union [str , tuple ]) -> _Version :
469+ if isinstance (version , str ):
470+ return _Version (version )
471+ elif isinstance (version , (tuple , list )):
472+ return _Version (* version )
473+ else :
474+ raise NotImplementedError (f"No way to parse { version } , type { type (version )} " )
475+ return _Version (version )
476+
477+
438478def get_version ():
439479 """
440480 Return tmux version.
@@ -447,14 +487,14 @@ def get_version():
447487
448488 Returns
449489 -------
450- :class:`distutils.version.LooseVersion `
490+ :class:`distutils.version.Version `
451491 tmux version according to :func:`libtmux.common.which`'s tmux
452492 """
453493 proc = tmux_cmd ("-V" )
454494 if proc .stderr :
455495 if proc .stderr [0 ] == "tmux: unknown option -- V" :
456496 if sys .platform .startswith ("openbsd" ): # openbsd has no tmux -V
457- return LooseVersion ("%s-openbsd" % TMUX_MAX_VERSION )
497+ return Version ("%s-openbsd" % TMUX_MAX_VERSION )
458498 raise exc .LibTmuxException (
459499 "libtmux supports tmux %s and greater. This system"
460500 " is running tmux 1.3 or earlier." % TMUX_MIN_VERSION
@@ -465,11 +505,11 @@ def get_version():
465505
466506 # Allow latest tmux HEAD
467507 if version == "master" :
468- return LooseVersion ("%s-master" % TMUX_MAX_VERSION )
508+ return Version ("%s-master" % TMUX_MAX_VERSION )
469509
470510 version = re .sub (r"[a-z-]" , "" , version )
471511
472- return LooseVersion (version )
512+ return Version (version )
473513
474514
475515def has_version (version ):
@@ -486,7 +526,7 @@ def has_version(version):
486526 bool
487527 True if version matches
488528 """
489- return get_version () == LooseVersion (version )
529+ return get_version () == Version (version )
490530
491531
492532def has_gt_version (min_version ):
@@ -503,7 +543,7 @@ def has_gt_version(min_version):
503543 bool
504544 True if version above min_version
505545 """
506- return get_version () > LooseVersion (min_version )
546+ return get_version () > Version (min_version )
507547
508548
509549def has_gte_version (min_version ):
@@ -520,7 +560,7 @@ def has_gte_version(min_version):
520560 bool
521561 True if version above or equal to min_version
522562 """
523- return get_version () >= LooseVersion (min_version )
563+ return get_version () >= Version (min_version )
524564
525565
526566def has_lte_version (max_version ):
@@ -537,7 +577,7 @@ def has_lte_version(max_version):
537577 bool
538578 True if version below or equal to max_version
539579 """
540- return get_version () <= LooseVersion (max_version )
580+ return get_version () <= Version (max_version )
541581
542582
543583def has_lt_version (max_version ):
@@ -554,7 +594,7 @@ def has_lt_version(max_version):
554594 bool
555595 True if version below max_version
556596 """
557- return get_version () < LooseVersion (max_version )
597+ return get_version () < Version (max_version )
558598
559599
560600def has_minimum_version (raises = True ):
@@ -587,7 +627,7 @@ def has_minimum_version(raises=True):
587627
588628 .. _Issue 55: https://github.com/tmux-python/tmuxp/issues/55.
589629 """
590- if get_version () < LooseVersion (TMUX_MIN_VERSION ):
630+ if get_version () < Version (TMUX_MIN_VERSION ):
591631 if raises :
592632 raise exc .VersionTooLow (
593633 "libtmux only supports tmux %s and greater. This system"
@@ -670,9 +710,9 @@ def get_libtmux_version():
670710
671711 Returns
672712 -------
673- distutils.version.LooseVersion
713+ distutils.version.Version
674714 libtmux version
675715 """
676716 from libtmux .__about__ import __version__
677717
678- return LooseVersion (__version__ )
718+ return Version (__version__ )
0 commit comments