a )g@s|ddlmZmZmZeZddlZddlmZm Z ddl m Z ej dej dZGdddZGd d d ZGd d d e ZdS) )absolute_importdivisionprint_functionN) LooseVersionVersion) text_typea ^ (?P0|[1-9]\d*) \. (?P0|[1-9]\d*) \. (?P0|[1-9]\d*) (?: - (?P (?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*) (?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))* ) )? (?: \+ (?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*) )? $ )flagsc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)_AlphazClass to easily allow comparing strings Largely this exists to make comparing an integer and a string on py3 so that it works like py2. cCs ||_dSN) specifierselfr r9/usr/lib/python3.9/site-packages/ansible/utils/version.py__init__0sz_Alpha.__init__cCs t|jSr reprr r rrr__repr__3sz_Alpha.__repr__cCs.t|tr|j|jkSt|tr*|j|kSdSNF) isinstancer r strr otherrrr__eq__6s     z _Alpha.__eq__cCs || Sr rrrrr__ne__>sz _Alpha.__ne__cCs@t|tr|j|jkSt|tr*|j|kSt|tr8dStdSr)rr r r_Numeric ValueErrorrrrr__lt__As     z _Alpha.__lt__cCs||p||Sr rrrrrr__le__Ksz _Alpha.__le__cCs || Sr r!rrrr__gt__Nsz _Alpha.__gt__cCs || Sr rrrrr__ge__Qsz _Alpha.__ge__N __name__ __module__ __qualname____doc__rrrrrr!r#r%rrrrr *s r c@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)rzClass to easily allow comparing numbers Largely this exists to make comparing an integer and a string on py3 so that it works like py2. cCst||_dSr )intr r rrrr[sz_Numeric.__init__cCs t|jSr rrrrrr^sz_Numeric.__repr__cCs.t|tr|j|jkSt|tr*|j|kSdSr)rrr r+rrrrras     z_Numeric.__eq__cCs || Sr rrrrrrisz_Numeric.__ne__cCs@t|tr|j|jkSt|tr*|j|kSt|tr8dStdS)NT)rrr r+r rrrrrrls     z_Numeric.__lt__cCs||p||Sr r rrrrr!vsz_Numeric.__le__cCs || Sr r"rrrrr#ysz_Numeric.__gt__cCs || Sr r$rrrrr%|sz_Numeric.__ge__Nr&rrrrrUs rc@seZdZdZeZdddZddZeddZ d d Z e d d Z e d dZ e ddZddZddZddZddZddZddZddZdS) SemanticVersionzwVersion comparison class that implements Semantic Versioning 2.0.0 Based off of ``distutils.version.Version`` NcCs6||_d|_d|_d|_d|_d|_|r2||dS)Nr)vstringmajorminorpatch prerelease buildmetadataparse)r r-rrrrszSemanticVersion.__init__cCs d|jS)NzSemanticVersion(%r))r-rrrrrszSemanticVersion.__repr__c Cst|tstd|z|jdd}WntyFtd|Yn0d}dD]6}z||}WntyxYqPYqP0||krP|}qP|d|}|rtdd|Dttfkrtd|t d|j }|d gdt |}t d d d d|D|r |d nd fS)zThis method is designed to take a ``LooseVersion`` and attempt to construct a ``SemanticVersion`` from it This is useful where you want to do simple version math without requiring users to provide a compliant semver. z%r is not a LooseVersionN)-+css|]}t|VqdSr )type.0vrrr z5SemanticVersion.from_loose_version..zNon integer values in %rz[+-].+$rz%s%s.css|]}t|VqdSr )rr8rrrr;r<)rrrversionAttributeErrorindexsetr+researchr-lenr,joingroup)Z loose_versionr?Z extra_idxZmarkeridxZextrarrrfrom_loose_versions2        z"SemanticVersion.from_loose_versioncCst|}|std||ddddd\}}}}}t||_t||_t||_|rrtdd| d D|_ |rtd d| d D|_ dS) Nzinvalid semantic version '%s'r4css&|]}|rt|nt|VqdSr isdigitrr r9xrrrr;r<z(SemanticVersion.parse..r=css&|]}|rt|nt|VqdSr rNrPrrrr;r<) SEMVER_REmatchrrGr+r.r/r0tuplesplitr1r2)r r-rSr.r/r0r1r2rrrr3s     zSemanticVersion.parsecCs|j|j|jfSr )r.r/r0rrrrcoreszSemanticVersion.corecCs t|jSr )boolr1rrrr is_prereleaseszSemanticVersion.is_prereleasecCs|jdkp|j SNr)r.rXrrrr is_stableszSemanticVersion.is_stablecCst|trt|}|j|jkr2|j|jkr.dSdSt|j|jfsFdS|jrV|jsVdS|jsf|jrfdS|j|jkrvdS|j|jkrdSdS)NrJr)rrr,rVanyr1rrrr_cmps"       zSemanticVersion._cmpcCs||dkSrYr]rrrrrszSemanticVersion.__eq__cCs || Sr rrrrrrszSemanticVersion.__ne__cCs||dkSrYr^rrrrrszSemanticVersion.__lt__cCs||dkSrYr^rrrrr! szSemanticVersion.__le__cCs||dkSrYr^rrrrr# szSemanticVersion.__gt__cCs||dkSrYr^rrrrr%szSemanticVersion.__ge__)N)r'r(r)r*rRZ version_rerr staticmethodrIr3propertyrVrXrZr]rrrr!r#r%rrrrr,s(  (   #r,)Z __future__rrrr7Z __metaclass__rCZ#ansible.module_utils.compat.versionrrZansible.module_utils.sixrcompileXrRr rr,rrrrs ++