bgVDldZddlmZmZmZmZmZmZddlm Z m Z ddl m Z mZddl mZddlm Z mZmZm Z mZmZddlZdZdd Zdd Zdd Zd Zd ZdZdZd dZe je je je j e j!fZ"e j#e j$fZ%dZ&ddZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2ddZ3dS)!z Utility functions from 2to3, 3to2 and python-modernize (and some home-grown ones). Licences: 2to3: PSF License v2 3to2: Apache Software License (from 3to2/setup.py) python-modernize licence: BSD (from python-modernize/LICENSE) ) FromImportNewline is_import find_rootdoes_tree_importComma)LeafNode)python_symbolspython_grammar)token)r CallNamesymsrNumberNcBdvrSdr ddfd|D}t|dkr/tddd |Dzt|d krtd |d S) al Examples: >>> canonical_fix_name('fix_wrap_text_literals') 'libfuturize.fixes.fix_wrap_text_literals' >>> canonical_fix_name('wrap_text_literals') 'libfuturize.fixes.fix_wrap_text_literals' >>> canonical_fix_name('wrap_te') ValueError("unknown fixer name") >>> canonical_fix_name('wrap') ValueError("ambiguous fixer name") z.fix_fix_Ncdg|],}|d*|-S)zfix_{0})endswithformat).0ffixs g/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/libfuturize/fixer_util.py z&canonical_fix_name..(sG777qJJy//44557777zOAmbiguous fixer name. Choose a fully qualified module name instead from these:  c3 K|] }d|zV dS)z N)rmyfs r z%canonical_fix_name..-s&883D3J888888rrz1Unknown fixer. Use --list-fixes or -l for a list.) startswithlen ValueErrorjoin)r avail_fixesfounds` rcanonical_fix_namer*s#~~ >>& ! ! abb'C7777K777 u::>>6))88%888889:: :ZZ1__PQQ QQxrc:ttjd|S)N*prefix)r r STARr-s rStarr06s  D 0 0 00rc:ttjd|S)Nz**r-)r r DOUBLESTARr-s r DoubleStarr39s  % 7 7 77rc:ttjd|S)N-r-)r r MINUSr-s rMinusr7<s  T& 1 1 11rcg}|D]8}|||t9|d=|S)z{ Accepts/turns: (Name, Name, ..., Name, Name) Returns/into: (Name, Comma, Name, Comma, ..., Name, Comma, Name) )appendr)leafs new_leafsleafs r commatizer>?sT I""!!!!" rcX|jB|jjtjkr(|j}|j|jjtjk(|jdS|jtjkr|jS|j&|jjtjkr |jjS|jdS|jS)zf Returns the indentation for this node Iff a node is in a suite, then it has indentation. N) parenttypersuiter INDENTvalue prev_siblingr.nodes r indentationrIKs + !dk&6$*&D&D{ + !dk&6$*&D&D {s yEL  z  &4+<+AU\+Q+Q &&  "s{rct|}td|D}|sdSt|S)a Dirty little trick to get the difference between each indentation level Implemented by finding the shortest indentation string (technically, the "least" of all of the indentation strings, but tabs and spaces mixed won't get this far, so those are synonymous.) c3NK|] }|jtjk|jV!dSN)rBr rDrEris rr#z#indentation_step..is2OO!%,8N8Nag8N8N8N8NOOrz )rset pre_ordermin)rHr all_indentss rindentation_steprT`sN $AOOq{{}}OOOOOK  w;rc .|jD]}|jtjkrdSt |jD]\}}|jt jkrntdttjttt j t|t|zg}|j|dz}|d|_||||dS)zj Turn the stuff after the first colon in parent's children into a suite, if it wasn't already NzNo class suite and no ':'!rr@)childrenrBrrC enumerater COLONr&r rr rDrIrTremover. append_child)rArHrNrCone_nodes rsuitifyr\ps   9 " " FF # V_--884 9 # # E $6777 giielK [as ] Nr@importr-as )rextendr r import_name)packageas_namer.rVs r NameImportresx ~Yv...8HeD111gd3335 6 6 6  ( + ++rc#vK|jtvsJ|j}|jtjkr=|j}|jtjkrn |V|j}|jtjk=|j}|jtjksJ|j}| |V|j}| |j}|jtvr'|}|j|jV|j}|j|j}|j}|dS|jtvrD|jtj kr|V|j}||j}|j}|dS|jtvBdSdS)z Generator yields all nodes for which a node (an import_stmt) has scope The purpose of this is for a call to _find() on each of them N) rB _import_stmts next_siblingr SEMINEWLINErAr simple_stmt_compound_stmtsrC)rHtestnxtrAcontextcps rimport_binding_scoperrsy 9 % % % %  D )uz ! ! 8u} $ $ III )uz ! ![F ;$* * * * *  D       mG|&& n(. An(. Ay &O # # <4: % %MMM& ?hGAy &O # # # # # #rct|}tdd}t|d}ttj|||g}|||_|S)Nr_r`r-)rr rimport_as_namer.)namerdr.new_namenew_as new_as_namenew_nodes r ImportAsNamerzs\DzzH % % % %Fwt,,,KD'(FK)HIIH   Orc|jtjko7t|jdko|jdjt jkS)z< Returns True if the node appears to be a docstring r)rBrrkr%rVr STRINGrGs r is_docstringr}sI I) ) M    " M'+}Q'7'< 'LNrcRt|}td||rdSd}t|jD]O\}}t |st |r|}t |r5t|}|sn||vrdSPtdttj |dg}|dkr/|dkr)|jdj |_ d|jd_ |tg}||tt j|dS)z This seems to work __future__Nr`r-rr@)rrrWrVis_shebang_commentis_encoding_commentr}check_future_importrr r NAMEr.r insert_childr rrk)featurerHrootshebang_encoding_idxidxnamesimport_rVs r future_importrsJ T??D w55 t}--   T d # # '':4'@'@ '#&     #D))  E e   FF ej'#)N)N)N(OPPGq  SAXXq)0"% a'))$Hc4 0(;;<<<<.2s&;;;QQVu{%:%:q%:%:%:rcg|]}|dfSrLr!)rks rrzparse_args..4s222aD 222rrr) dictrWrBrargumentrVr EQUALrE)arglistscheme ret_mappingrNargslots r parse_argsr.s<;';;;G22622233KG$$$$3 8t} $ $a)=)L)L<?(D # QK  !9D #K   rcn|jtjko |jot |jdS)Nr)rBrrkrVrrGs ris_import_stmtrHs4 I) ) (dm ( dmA& ' ')rct|}t|||rdSd}dD]}td||rd}n|rad\}}t|jD]<\}}t |r(|}|} |r |j}| dz } t |s| }n| n=|J|J|} nDt|jD]-\}}|jtjkrnt|sn.|} |Pttj ttjdttj|d g} n&t|ttj|d g} |d krttjttjttjd ttjttjd ttjd gttjttjdttjdggg} | t+g} ng} | t+g}|j| j}d|j| _|| ttj|| t1| dkr3|| dzttj| dSdS)aWorks like `does_tree_import` but adds an import statement at the top if it was not imported (but below any __future__ imports) and below any comments such as shebang lines). Based on lib2to3.fixer_util.touch_import() Calling this multiple times adds the imports in reverse order. Also adds "standard_library.install_aliases()" after "from future import standard_library". This should probably be factored into another function. NF)absolute_importdivisionprint_functionunicode_literalsrTNNrr^r`r-standard_library.install_aliases()r@r)rrrWrVrrhrBrrkr}r rbr r rrpowertrailerDOTLPARRPARrr.rr%)rcname_to_importrHrr)rustartendridx2rr install_hookschildren_hookschildren_import old_prefixs rtouch_import_toprMsA T??D66 E% L$ 5 5 E E   s"4=11  IC"4(( ,DAID.t44"       #4=11  ICyD,,,%%   t' Y ' ' ^D 9 9 9*    WtEJt'T'T'T&UVV 0 0 0 !!1"&tz(,UZ9L(M(M(,T\DDQ *q.$t/?*P*PQQQQQrc|}|jtjkr|jst S|jd}|jtjkr1t |jddr|jdjdkst S|jdjtj kr|jd}n |jd}|jtj krt }|jD]}|jtj kr| |j2|jtj kr>|jd}|jtj ksJ| |j|S|jtj kr9|jd}|jtj ksJt |jgS|jtj krt |jgSJd|z) zZIf this is a future import, return set of symbols that are imported, else return None.rrrErrFzstrange import: %s)rBrrkrVrO import_fromhasattrrEr rimport_as_namesraddrt)rHsavenoderesultns rrrsH I) ) )dm )uu = D I) ) ) DM!$g . . * M!  "m 3 3uu  }Q **}Q}Q yD((( $ $Av## 17####4...JqMv++++ 17### d) ) )}QyEJ&&&&DJ<   ej DJ<    6*X555urz ^#!.*pythonz^#.*coding[:=]\s*([-\w.]+)cZttjt|jS)z Comments are prefixes for Leaf nodes. Returns whether the given node has a prefix that looks like a shebang line or an encoding line: #!/usr/bin/env python #!/usr/bin/python3 )boolrematch SHEBANG_REGEXr.rGs rrrs   44 5 55rcZttjt|jS)a Comments are prefixes for Leaf nodes. Returns whether the given node has a prefix that looks like an encoding line: # coding: utf-8 # encoding: utf-8 # -*- coding: -*- # vim: set fileencoding= : )rrrENCODING_REGEXr.rGs rrrs  55 6 66rct|dksJt|dkr|\}}|t|g}n|}tt|||S)z Example: >>> wrap_in_fn_call("oldstr", (arg,)) oldstr(arg) >>> wrap_in_fn_call("olddiv", (arg1, arg2)) olddiv(arg1, arg2) >>> wrap_in_fn_call("olddiv", [arg1, comma, arg2, comma, arg3]) olddiv(arg1, arg2, arg3) rrr-)r%rrr)fn_nameargsr.expr1expr2newargss rwrap_in_fn_callrsa t99q==== 4yyA~~ u%''5) W wv 6 6 66rrLr)4__doc__lib2to3.fixer_utilrrrrrrlib2to3.pytreer r lib2to3.pygramr rr r rrrrr*r0r3r7r>rIrTr\reif_stmt while_stmtfor_stmttry_stmt with_stmtrlrbrrgrrrzr}rrrrrrrrrrrr!rrrsDDDDDDDDDDDDDDDD%%%%%%%%AAAAAAAA FFFFFFFFFFFFFFFF D111188882222   *   0 , , , ,<$-PTP^_!4#34 999vNNN%=%=%=PSSS@4))) ]R]R]RF'6'6'6T .666 7 7 7777777r