^cz-jdZddlZddlZddlmZddlZddlZddlmZ ddl m Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZejddkZdejvZdZes ddlZejZdZ ej!Z!dZ"dZ#d Z$ej%d krej&ej'Z'ej(Z(ej)*d Z+ej,*d Z-ej%*d Z.ej/*d Z0ej1*d Z2ej3*d Z4ej5Z6e6re6*d Z6ej7*d Z8ej9*d Z:ej;ZdZ?e@ZAe jBZCeDZEeFedd.ej%d krdejGDZHndejGDZHejIdjJZKdjLZMGddeNZOdZPdZQdZRdZSdZTdZUdZVdZWdZXeXejYZYeXejFZFeXejZZZeXej[Z[ej\Z]e^Z_d7d!Z`eXejZZad"Zbd#Zcd$Zdd8d&Zed'Zfd(ZgejhZie:jd)Zke:jd*Zle:jd+Zme.d,kZne.d-kZod.Zpd/Zqd9d2Zrd9d3Zsd:d4Zt d;d6ZudS)z_rapply..:s+22!1 222222r c3^K|]'\}}t|t|fV(dSr r)rkvrs r rz_rapply..<s<NN41aA1 6NNNNNNr ) isinstancelistsettupletypedictitemsrxss` r rr5s z "tS%())3tBxx2222r222222"dOtBxxNNNN288::NNNNNN 1R55Lr c8|tur|St||S)aApply function recursively to every item preserving the data structure >>> def f(x): ... return 'f(%s)' % x >>> rapply(f, None) is None True >>> rapply(f, 'a') 'f(a)' >>> rapply(f, {'a'}) == {'f(a)'} True >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []]) ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []] >>> xs = [object()] >>> rapply(identity, xs) is xs True )rrr"s r rapplyr%@s $ H}} 1b>>r ntasciic.tt|Sr )rmapargss r maplistr,r T  r c.tt|Sr )rranger*s r rangelistr0vs t  r c.tt|Sr )rzipr*s r ziplistr3zr-r argvc:g|]}|ddS)mbcsignoreencoderrs r r;s&@@@!188FH--@@@r c,g|]}t|Sr)fsencoder:s r r;r;s11118A;;111r z>Bs%rc8eZdZdZerd dZd dZdZdZdZ dS) bytestraWA bytes which mostly acts as a Python 2 str >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1) ('', 'foo', 'ascii', '1') >>> s = bytestr(b'foo') >>> assert s is bytestr(s) __bytes__() should be called if provided: >>> class bytesable: ... def __bytes__(self): ... return b'bytes' >>> bytestr(bytesable()) 'bytes' There's no implicit conversion from non-ascii str as its encoding is unknown: >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS Traceback (most recent call last): ... UnicodeEncodeError: ... Comparison between bytestr and bytes should work: >>> assert bytestr(b'foo') == b'foo' >>> assert b'foo' == bytestr(b'foo') >>> assert b'f' in bytestr(b'foo') >>> assert bytestr(b'f') in b'foo' Sliced elements should be bytes, not integer: >>> s[1], s[:2] (b'o', b'fo') >>> list(s), list(reversed(s)) ([b'f', b'o', b'o'], [b'o', b'o', b'f']) As bytestr type isn't propagated across operations, you need to cast bytes to bytestr explicitly: >>> s = bytestr(b'foo').upper() >>> t = bytestr(s) >>> s[0], t[0] (70, b'F') Be careful to not pass a bytestr object to a function which expects bytearray-like behavior. >>> t = bytes(t) # cast to bytes >>> assert type(t) is bytes r cdSr r)selfss r __init__zbytestr.__init__s Dr ct|tr|St|ttfs2t |ds"t |d}t||S)N __bytes__r')rr?bytes bytearrayhasattrstrr9__new__)clsrBs r rJzbytestr.__new__sy a ! ! H y!   ' |   ' A g&&A}}S!$$$r ct||}t|tst|}|Sr )rF __getitem__rbytechr)rAkeyrBs r rMzbytestr.__getitem__s9   dC ( (!U##  Ar cPtt|Sr ) iterbytestrrF__iter__rAs r rRzbytestr.__iter__s5>>$//000r cFt|ddS)N)rF__repr__rSs r rVzbytestr.__repr__s~~d##ABB''r N)r ) __name__ __module__ __qualname____doc__ TYPE_CHECKINGrCrJrMrRrVrr r r?r?s~22p     % % % % 111(((((r r?c,tt|S)z4Iterate bytes as if it were a str object of Python 2)r)rNrBs r rQrQs w??r cNt|trt|S|S)zPromote bytes to bytestr)rrFr?r]s r maybebytestrr_s%!Uqzz Hr cZt|tr|S|dS)zConvert an internal str (e.g. keyword, __doc__) back to bytes This never raises UnicodeEncodeError, but only ASCII characters can be round-trip by sysstr(sysbytes(s)). zutf-8)rrFr9r]s r sysbytesras- !U 88G  r cdt|tjr|S|dS)a$Return a keyword str to be passed to Python functions such as getattr() and str.encode() This never raises UnicodeDecodeError. Non-ascii characters are considered invalid and mapped to arbitrary but unique code points such that 'sysstr(a) != sysstr(b)' for all 'a != b'. latin-1)rbuiltinsrIdecoder]s r sysstrrfs/!X\"" 88I  r cZt|tr|dS|S)z Converts a bytes url back to strr')rrFreurls r strurlrjs+#u#zz'""" Jr cZt|tr|dS|S)z0Converts a str url to bytes by encoding in asciir')rrIr9rhs r bytesurlrls+#s#zz'""" Jr c,||)z(Raise exception with the given traceback)with_traceback)exctbs r raisewithtbrq#s  R  r cJt|dd}||St|S)zPGet docstring as bytes; may be None so gettext() won't confuse it with _('')rZN)getattrra)objdocs r getdocrv(s+ #y$ ' 'C { C==r cFtjfd}|S)Nc2|t|g|RSr )rf)objectnamer+rs r wz_wrapattrfunc..w2s#q-----r ) functoolswraps)rr{s` r _wrapattrfuncr~1s8_Q..... Hr rcJtj|t|||Sr )rdopenrf)rzmode bufferingencodings r rrBs =vd||Y A AAr cd|D}|d}d|D}||||\}}d|D}d|D}||fS)z Takes bytes arguments, converts them to unicode, pass them to getopt.getopt(), convert the returned values back to bytes and then return them for Python 3 compatibility as getopt.getopt() don't accepts bytes on Python 3. c8g|]}|dSrcrer:s r r;z#_getoptbwrapper..P$ . . .AAHHY   . . .r rcc8g|]}|dSrrr:s r r;z#_getoptbwrapper..Rs$666##666r czg|]8}|dd|ddf9S)rrcrUr8r:s r r;z#_getoptbwrapper..Ts= K K KQqT[[ # #QqT[[%;%; < K K Kr c8g|]}|dSrr8r:s r r;z#_getoptbwrapper..Urr r)origr+ shortlistnamelistoptss r _getoptbwrapperrIs / . . . .D  ++I66X666HdIx00JD$ K Kd K K KD . . . . .D :r cBd|D}|S)z Converts the keys of a python dictonary to str i.e. unicodes so that they can be passed as keyword arguments as dictionaries with bytes keys can't be passed as keyword arguments to functions on Python 3. c@i|]\}}|d|Srrrrrs r zstrkwargs.._* : : :da188I   : : :r r!dics r strkwargsrYs$ ; :ciikk : : :C Jr cBd|D}|S)z Converts keys of python dictionaries to bytes as they were converted to str to pass that dictonary as a keyword argument on Python 3. c@i|]\}}|d|Srr8rs r rzbyteskwargs..hrr rrs r byteskwargsrcs$ ; :ciikk : : :C Jr Tcltj|d||}d|DS)z Takes bytes argument, convert it to str i.e. unicodes, pass that into shlex.split(), convert the returned value to bytes and return that for Python 3 compatibility as shelx.split() don't accept bytes on Python 3. rcc8g|]}|dSrr8r:s r r;zshlexsplit..ts$ - - -AAHHY   - - -r )shlexsplitre)rBcommentsposixrets r shlexsplitrms7 +ahhy))8U ; ;C - - - - --r c*|Sr rrs r rwsaggiir c*|Sr )valuesrs r rrxsqxxzzr sjavasdarwinslinuxsposixsntc:ttj|||Sr )rgetoptr+rrs r getoptbrs 6=$ 8 D DDr c:ttj|||Sr )rr gnu_getoptrs r gnugetoptbrs 6,dIx H HHr r tmpc.tj|||Sr )tempfilemkdtempsuffixprefixdirs r rr  FFC 0 00r c.tj|||Sr )rmkstemprs r rrrr c`|d}nt|}d|vsJtj|g|Ri|S)Nzw+bb)rfr TemporaryFile)rr+kwargss r unnamedtempfilersG |d|| $;;;;  !$ 8 8 8 8 8 88r w+bc`t|}d|vsJtj||||||S)Nr)rrrdelete)rfrNamedTemporaryFile)rbufsizerrrrs r namedtempfilersC $<rs   $$$$$$ """"""  !!!!!! q  s/ / wyy)MMM(M!!!.   07e 'C&((( ; ; 9  G $ $ J  g & &   J  g & & 9  G $ $  g 9 (w''H J  g & & l!!'**  /BK ..M   #   73) w%@@sx@@@11111 &-   " =S(S(S(S(S(eS(S(S(l       !!!     -( ) ) -( ) ) -( ) ) -( ) )  BBBBmH,--     ....  ! ! Z  ! !' * *  ! !) , ,   * * H  eO EEEIII1111 1111 9999JNr