a oe'@sdZddlZddlmZmZmZmZmZmZddl m Z m Z GdddZ Gdd d e Z Gd d d e ZGd d d e Zee efZeeeefZeZeeZGdddeZeedddZe edddZe eeeeefdddZe eeedddZe eedddZe eedddZe eddd Ze edd!d"Zeedd#d$Ze edd%d&Z e edd'd(Z!e edd)d*Z"e edd+d,Z#ee d-d.d/Z$eed0d1d2Z%e edd3d4Z&dS)5zHandwritten parser of dependency specifiers. The docstring for each __parse_* function contains ENBF-inspired grammar representing the implementation. N)AnyList NamedTupleOptionalTupleUnion) DEFAULT_RULES Tokenizerc@sFeZdZeddddZedddZeddd Zedd d ZdS) NodeN)valuereturncCs ||_dSNr )selfr rHC:\Program Files\Certbot\pkgs\pkg_resources\_vendor\packaging\_parser.py__init__sz Node.__init__r cCs|jSrrrrrr__str__sz Node.__str__cCsd|jjd|dS)N) __class____name__rrrr__repr__sz Node.__repr__cCstdSr)NotImplementedErrorrrrr serializeszNode.serialize)r __module__ __qualname__strrrrrrrrrr sr c@seZdZedddZdS)VariablercCst|SrrrrrrrszVariable.serializeNrrrrrrrrrr sr c@seZdZedddZdS)ValuercCs d|dS)N"rrrrrr!szValue.serializeNr"rrrrr# sr#c@seZdZedddZdS)OprcCst|Srr!rrrrr&sz Op.serializeNr"rrrrr%%sr%c@s>eZdZUeed<eed<eeed<eed<eeed<dS)ParsedRequirementnameurlextras specifiermarkerN)rrrr__annotations__rr MarkerListrrrrr&4s  r&)sourcer cCstt|tdSN)Zrules)_parse_requirementr r r.rrrparse_requirement?sr2) tokenizerr cCsf|d|jddd}|j}|dt|}|dt|\}}}|jdddt|||||S)zI requirement = WS? IDENTIFIER WS? extras WS? requirement_details WS IDENTIFIERz1package name at the start of dependency specifierZexpectedENDzend of dependency specifier)consumeexpecttext _parse_extras_parse_requirement_detailsr&)r3Z name_tokenr'r)r(r*r+rrrr0Cs   r0cCsd}d}d}|dr||d|j}|jdddj}|jdd d rV|||fS|jdd d|jdd d r||||fSt||d d }nF|j}t|}|d|jdd d r|||fSt|||rdndd }|||fS)z~ requirement_details = AT URL (WS requirement_marker?)? | specifier WS? (requirement_marker)? NATr4ZURLz URL after @r6r7Tpeekzwhitespace after URLzURL and whitespace) span_startafterversion specifierz#name and no valid version specifier)checkreadr8positionr9r:_parse_requirement_marker_parse_specifier)r3r*r(r+Z url_startZspecifier_startrrrr<Xs:       r<)r3rArBr cCs>|ds |jd|d|d|t|}|d|S)z3 requirement_marker = SEMICOLON marker WS? Z SEMICOLONz!Expected end or semicolon (after ))rAr4)rDraise_syntax_errorrE _parse_markerr8)r3rArBr+rrrrGs   rGcCsb|jdddsgS|jdddd,|dt|}|dWdn1sT0Y|S) zG extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? Z LEFT_BRACKETTr?Z RIGHT_BRACKETr)Zaroundr4N)rDenclosing_tokensr8_parse_extras_list)r3r)rrrr;s (r;cCsg}|ds|S||j|d|jdddrF|dn |dsRq||d|jddd}||jq"|S) z> extras_list = identifier (wsp* ',' wsp* identifier)* r5r4Tr?z"Expected comma between extra namesCOMMAzextra name after commar6)rDappendrEr:r8rJr9)r3r)Z extra_tokenrrrrNs     rNcCsP|jdddd,|dt|}|dWdn1sB0Y|S)zr specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS | WS? version_many WS? LEFT_PARENTHESISRIGHT_PARENTHESISrCrLr4N)rMr8_parse_version_many)r3parsed_specifiersrrrrHs (rHcCsd}|dr|j}||j7}|jdddrF|jd||jdd|jd ddrf|jd ||jd|d |d s|q||j7}|d q|S) z@ version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? r=Z SPECIFIERZVERSION_PREFIX_TRAILTr?z6.* suffix can only be used with `==` or `!=` operatorsr)rAZspan_endZVERSION_LOCAL_LABEL_TRAILz@Local version label can only be used with `==` or `!=` operatorsr4rO)rDrFrEr:rJr8)r3rTrArrrrSs,    rScCstt|tdSr/)rKr r r1rrr parse_markersrUcCs:t|g}|dr6|}t|}||j|fq |S)z4 marker = marker_atom (BOOLOP marker_atom)+ ZBOOLOP)_parse_marker_atomrDrEextendr:)r3Z expressiontokenZ expr_rightrrrrKs   rKcCs||d|jdddrf|jdddd,|dt|}|dWdqn1sZ0Ynt|}|d|S) zw marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? | WS? marker_item WS? r4rQTr?rRzmarker expressionrLN)r8rDrMrK_parse_marker_item)r3r+rrrrVs  * rVcCsJ|dt|}|dt|}|dt|}|d|||fS)zG marker_item = WS? marker_var WS? marker_op WS? marker_var WS? r4)r8_parse_marker_var_parse_marker_op)r3Zmarker_var_leftZ marker_opZmarker_var_rightrrrrY$s    rYcCsH|dr t|jddS|dr8t|jS|jdddS)z/ marker_var = VARIABLE | QUOTED_STRING ZVARIABLE._Z QUOTED_STRINGz+Expected a marker variable or quoted string)messageN)rDprocess_env_varrEr:replaceprocess_python_strrJr3rrrrZ2s  rZ)env_varr cCs$|dks|dkrtdSt|SdS)NZplatform_python_implementationZpython_implementation)r )rcrrrr_@s r_) python_strr cCst|}tt|Sr)astZ literal_evalr#r)rdr rrrraJs racCsv|dr|tdS|drP||jddd|jdddtdS|d rht|jS|d Sd S) z& marker_op = IN | NOT IN | OP INinZNOTr4zwhitespace after 'not'r6z'in' after 'not'znot inOPzJExpected marker operator, one of <=, <, !=, ==, >=, >, ~=, ===, in, not inN)rDrEr%r9r:rJrbrrrr[Os   r[)'__doc__retypingrrrrrrZ _tokenizerr r r r r#r%Z MarkerVarZ MarkerItemZ MarkerAtomr-r&rr2r0r<intrGr;rNrHrSrUrKrVrYrZr_rar[rrrrs@    4