ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ 3 &IYf@sdZddlmZddlmZddlmZddlZddl Zddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlZddlmZddlmZdUZdVZddZddZddZ ddZ!dWddZ"dXdd Z#Gd!d"d"ejZ$Gd#d$d$ejZ%Gd%d&d&ej&Z'Gd'd(d(ej(Z)Gd)d*d*ej(Z*d+d,Z+y&dd-l,m-Z-Gd.d/d/e-j.Z/d0Z0Wne1k rdZ0YnXd1d2Z2d3Z3d4Z4e4e4e3d5Z5d6d7Z6e j7j8e j9dfd8d9Z:Gd:d;d;ejZ;Gdd?d?ej=Z>Gd@dAdAejZ?dBdCZ@GdDdEdEejZAyddFlmBZBd0ZCeBjDZDWne1k rdZCdZDYnXdGdHZEdIdJZFdKdLZGdMdNZHdYdOdPZIdQdRZJdZdSdTZKejLjMZMdS)[z4 Utilities with minimum-depends for use in setup.py )unicode_literals)install)logN)develop) easy_install)egg_info)install_scripts)sdist) extra_files)git)options) testr_command)versionrequirements.txttools/pip-requirestest-requirements.txttools/test-requirescCsXtjjd}|r(tdd|jdDSttdttj dj ttj j t tt S)NZPBR_REQUIREMENTS_FILEScss|]}|jVqdS)N)strip).0fr//usr/lib/python3/dist-packages/pbr/packaging.py 6sz)get_requirements_files..,z-pyr)osenvirongettuplesplitlistmapstrsys version_infojoinpathsplitextREQUIREMENTS_FILES)filesrrrget_requirements_files3s  r)cCs:g}|j|d}|r|j||j|dj|||<dS)z5Append a separated list to possibly existing value. N)rappendextendr$)configkeyZ text_listZ new_valueZ current_valuerrrappend_text_list@s    r0cCsdd|DS)NcSsg|]}tjj|r|qSr)rr%exists)rrrrr Ksz!_any_existing..r)Z file_listrrr _any_existingJsr3c Cs6x0t|D]$}t|d}|jjdSQRXq WgS)Nrr+)r3openreadr)requirements_filesZrequirements_fileZfilrrrget_reqs_from_filesOs r8Fc Cs\|dkrt}dd}g}x:t|D],}|j s&|jdrBq&tjd|rPq&|jdr||jdd}|t|g|d7}q&ytj j |j }Wnt k rd}YnXtjd |rtj d ||}n0tjd |rtj d ||}ntjd |rd}d}|dk rBtj dd|}|r6|jd}|dkr*d}|d|}|j|q&tjd||fq&W|S)NcSstjdd|jdS)Nz([\w.]+)-([\w.-]+)z\1>=\2)resubgroups)matchrrr egg_fragment[sz(parse_requirements..egg_fragment#z(^\s*(-i|--index-url|--extra-index-url).*z-r ) strip_markersz\s*-e\s+z\s*-e\s+.*#egg=(.*)$z \s*(https?|git(\+(https|ssh))?):z,\s*(https?|git(\+(https|ssh))?):.*#egg=(.*)$z\s*-f\s+zIndex Locationz#.*$r*;rz[pbr] Excluding %s: %s)r)r8r startswithr;r> partitionparse_requirements pkg_resourcesZ Requirementparse project_name ValueErrorr<findr,rinfo) r7rCr?Z requirementslineZreq_filerJreasonZsemi_posrrrrGVsJ            rGcCsn|dkrt}g}xVt|D]J}tjd|r.qtjd|rP|jtjdd|qtjd|r|j|qW|S)Nz (\s*#)|(\s*$)z \s*-[ef]\s+r*z \s*(https?|git(\+(https|ssh))?):)r)r8r;r>r,r<)r7Zdependency_linksrNrrrparse_dependency_linkss   rPc@seZdZdZdZddZdS)InstallWithGitzExtracts ChangeLog and AUTHORS from git then installs. This is useful for e.g. readthedocs where the package is installed and then docs built. rcCst|jtjj|S)N) _from_git distributionrrun)selfrrrrTs zInstallWithGit.runN)__name__ __module__ __qualname____doc__ command_namerTrrrrrQsrQc@seZdZdZdZddZdS) LocalInstallzRuns python setup.py install in a sensible manner. Force a non-egg installed in the manner of single-version-externally-managed, which allows us to install manpages and config files. rcCst|jtjj|S)N)rRrS du_installrrT)rUrrrrTs zLocalInstall.runN)rVrWrXrYrZrTrrrrr[sr[c@seZdZdZdZddZdS) TestrTestz&Make setup.py test do the right thing.testcCstjj|dS)N)r TestrrT)rUrrrrTsz TestrTest.runN)rVrWrXrYrZrTrrrrr]sr]c@s4eZdZdZeZgZdZddZddZddZ d S) LocalRPMVersionz:Output the rpm *compatible* version string of this packageZ rpm_versioncCs.tjd|jj}ttj|jjdS)Nz[pbr] Extracting rpm version) rrMrSget_nameprintr VersionInfosemantic_versionZ rpm_string)rUnamerrrrTs  zLocalRPMVersion.runcCsdS)Nr)rUrrrinitialize_optionssz"LocalRPMVersion.initialize_optionscCsdS)Nr)rUrrrfinalize_optionssz LocalRPMVersion.finalize_optionsN) rVrWrXrY description user_optionsrZrTrfrgrrrrr`sr`c@s4eZdZdZeZgZdZddZddZddZ d S) LocalDebVersionz:Output the deb *compatible* version string of this packageZ deb_versioncCs.tjd|jj}ttj|jjdS)Nz[pbr] Extracting deb version) rrMrSrarbrrcrdZ debian_string)rUrerrrrTs  zLocalDebVersion.runcCsdS)Nr)rUrrrrfsz"LocalDebVersion.initialize_optionscCsdS)Nr)rUrrrrgsz LocalDebVersion.finalize_optionsN) rVrWrXrYrhrirZrTrfrgrrrrrjsrjcCstjS)N)r have_testrrrrrrksrk)commandsc@seZdZdZdZddZdS)NoseTestz)Fallback test runner if testr is a no-go.r^cCstjj|dS)N)rl nosetestsrT)rUrrrrTsz NoseTest.runN)rVrWrXrYrZrTrrrrrmsrmTcCstS)N) _have_noserrrr have_nosesrpaK#PBR Generated from %(group)r import threading from %(module_name)s import %(import_target)s if __name__ == "__main__": import argparse import socket import sys import wsgiref.simple_server as wss my_ip = socket.gethostbyname(socket.gethostname()) parser = argparse.ArgumentParser( description=%(import_target)s.__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter, usage='%%(prog)s [-h] [--port PORT] [--host IP] -- [passed options]') parser.add_argument('--port', '-p', type=int, default=8000, help='TCP port to listen on') parser.add_argument('--host', '-b', default='', help='IP to bind the server to') parser.add_argument('args', nargs=argparse.REMAINDER, metavar='-- [passed options]', help="'--' is the separator of the arguments used " "to start the WSGI server and the arguments passed " "to the WSGI application.") args = parser.parse_args() if args.args: if args.args[0] == '--': args.args.pop(0) else: parser.error("unrecognized arguments: %%s" %% ' '.join(args.args)) sys.argv[1:] = args.args server = wss.make_server(args.host, args.port, %(invoke_target)s()) print("*" * 80) print("STARTING test server %(module_name)s.%(invoke_target)s") url = "http://%%s:%%d/" %% (server.server_name, server.server_port) print("Available at %%s" %% url) print("DANGER! For testing only, do not use in production") print("*" * 80) sys.stdout.flush() server.serve_forever() else: application = None app_lock = threading.Lock() with app_lock: if application is None: application = %(invoke_target)s() z# PBR Generated from %(group)r import sys from %(module_name)s import %(import_target)s if __name__ == "__main__": sys.exit(%(invoke_target)s()) )Zconsole_scriptsZ gui_scripts wsgi_scriptscCsJ|j st|jdkrtd|t||j|jddj|jd}||S)a`Generate the script based on the template. :param str group: The entry-point group name, e.g., "console_scripts". :param str header: The first line of the script, e.g., "!#/usr/bin/env python". :param str template: The script template. :returns: The templated script content :rtype: str rBzBScript targets must be of the form 'func' or 'Class.class_method'.r.)group module_nameZ import_targetZ invoke_target)ZattrslenrKdictrtr$)rsZ entry_pointheadertemplateZ script_textrrrgenerate_scriptasryccsXtjd||}xDtjD]8\}}x.|j|jD]\}}|t||||fVq0WqWdS)z$Override entrypoints console_script.r*N)rget_script_headerENTRY_POINTS_MAPitems get_entry_mapry)dist executable is_wininstrwrsrxreeprrroverride_get_script_args{src@seZdZdZddZdS) LocalDeveloprcCs>tjdkrtjj||S|js:xt|D]}|j|q(WdS)NZwin32)r"platformrinstall_wrapper_scriptsZexclude_scriptsr write_script)rUr~argsrrrrs  z$LocalDevelop.install_wrapper_scriptsN)rVrWrXrZrrrrrrsrc@s$eZdZdZdZddZddZdS)LocalInstallScriptsz(Intercepts console scripts entry_points.rc CsPtjd||}td}x4|jdjD]"\}}td|||}|j||q&WdS)Nr*rq)rrzr{r}r|ryr) rUr~rrrwZwsgi_script_templatererZcontentrrr_make_wsgi_scripts_onlys  z+LocalInstallScripts._make_wsgi_scripts_onlyc Csddl}|jd|jjr,|jjjj|ng|_|jd}t j |j t j |j |j |j|j}|jd}t|dtj}t|jddd}d|jjkr|j||||jrdStjd krt}ntj}d |}x||||D]}|j|qWdS) NrrZ build_scriptsrZ bdist_wininstZ _is_runningFZ bdist_wheelntz"%s")Z!distutils.command.install_scriptsZ run_commandrSscriptscommandrrTZoutfilesget_finalized_commandrHZ DistributionZegg_baseZ PathMetadatarZegg_nameZ egg_versiongetattrrZsys_executableZhave_runrZno_eprrerget_script_argsr) rU distutilsei_cmdr~Zbs_cmdrrrrrrrrTs2       zLocalInstallScripts.runN)rVrWrXrYrZrrTrrrrrsrc@s eZdZdZddZddZdS)LocalManifestMakerz?Add any files that are in git and some standard sensible files.cCsxdD]}|jj|qWdS)Ninclude AUTHORSinclude ChangeLogexclude .gitignoreexclude .gitreviewglobal-exclude *.pyc)rrrrr)filelistZprocess_template_line)rUZ template_linerrr_add_pbr_defaultssz$LocalManifestMaker._add_pbr_defaultscCs|jjd}tjj||jj|j|jj|j|jjt j t j |dd}|spt j}|r|jj|ntjj|jr|j|jd}|j|jjd|jddS)NpbrZskip_git_sdistZSKIP_GIT_SDISTr*)prefix)rSget_option_dictr add_defaultsrr,rxmanifestr-r Zget_extra_filesr Zget_boolean_optionr Z_find_git_filesrr%r1Z read_manifestrrZinclude_patternr)rU option_dictZ should_skipZrcfilesrrrrrs    zLocalManifestMaker.add_defaultsN)rVrWrXrYrrrrrrrs rc@seZdZdZdZddZdS) LocalEggInfozAOverride the egg_info command to regenerate SOURCES.txt sensibly.rcCstjj|jd}tjj| s4tjjds4dtjkr`tjdt |j }||_ |j |j |_ n>tjdtj|_ x(t|djjdD]}|j j|qWdS) apGenerate SOURCES.txt only if there isn't one already. If we are in an sdist command, then we always want to update SOURCES.txt. If we are not in an sdist command, then it doesn't matter one flip, and is actually destructive. However, if we're in a git context, it's always the right thing to do to recreate SOURCES.txt z SOURCES.txtz.gitr z[pbr] Processing SOURCES.txtz"[pbr] Reusing existing SOURCES.txtr4r+N)rr%r$rr1r"argvrrMrrSrrTrZFileListr5r6rr,)rUZmanifest_filenameZmmentryrrr find_sourcess        zLocalEggInfo.find_sourcesN)rVrWrXrYrZrrrrrrsrcCs>|jd}tj}|r tj|}tj||dtj|ddS)Nr)r changelog)r)rr _iter_log_onelineZ_iter_changelogZwrite_git_changelogZgenerate_authors)rSrrrrrrR s   rRc@seZdZdZdZddZdS) LocalSDistz5Builds the ChangeLog and Authors files from VC first.r cCst|jtjj|dS)N)rRrSr rT)rUrrrrTs zLocalSDist.runN)rVrWrXrYrZrTrrrrrsr)builddoccCstS)N) _have_sphinxrrrr have_sphinx'src si|r|d}nd}tjd|g|}tdfdd|jdD}t}x&|D]}|jdd|jd DqRWfd d }|d |d |d|d|d|d|d|dx|D]}tjd|qWjd dS)aCalculate the sort of semver increment needed from git history. Every commit from HEAD to tag is consider for Sem-Ver metadata lines. See the pbr docs for their syntax. :return: a dict of kwargs for passing into SemanticVersion.increment. z..HEADZHEADrz sem-ver:cs*g|]"}|jjdr|djqS)z sem-ver:N)lowerrEr)rrN) header_lenrrr2:sz)_get_increment_kwargs..r+cSsg|] }|jqSr)r)rsymbolrrrr2>srcs||krd|<|j|dS)NT)discard)rsymbolsZimpact)resultrr_handle_symbol@sz-_get_increment_kwargs.._handle_symbolZbugfixZpatchZfeatureminorZ deprecationz api-breakmajorz[pbr] Unknown Sem-Ver symbol %rN) r _run_git_commandrursetupdaterrMpop) git_dirtagZ version_specrrlrrrrr)rrr_get_increment_kwargs+s&         rc Cstj|d}d}xt|D]x\}\}}}t}t}xHt|D]<}y"tjj|}|||<|j |Wq>t k rxYq>Xq>W|r|t ||fSqWd|fS)zReturn the commit data about the most recent tag. We use git-describe to find this out, but if there are no tags then we fall back to counting commits since the beginning of time. )rrr*) r r enumeraterrvrrSemanticVersionfrom_pip_stringadd Exceptionmax) rrZ row_countZignoredZtag_setZ version_tagsZ semver_to_tagrZsemverrrr_get_revno_and_last_tagPs   rcCst|\}}tjj|pd}|dkr*|}n|jft||}|dk r`||kr`tdt||d|dkrl|S|j|}|dk r|j|}||kr|S|S)aCalculate a version from a target version in git_dir. This is used for untagged versions only. A new version is calculated as necessary based on git metadata - distance to tags, current hash, contents of commit messages. :param git_dir: The git directory we're working from. :param target_version: If None, the last tagged version (or 0 if there are no tags yet) is incremented as needed to produce an appropriate target version following semver rules. Otherwise target_version is used as a constraint - if semver rules would result in a newer version then an exception is raised. :return: A semver version object. 0rNzRgit history requires a target version of %(new)s, but target version is %(target)s)newtarget) rrrrZ incrementrrKrvZto_dev)rtarget_versionrZdistanceZ last_semverZ new_versionZnew_devZ target_devrrr_get_version_from_git_targeths$    rcCstj}|rvy,tjddg|ddjdd}tjj|}Wn*tk rb|rZtjj|}nd}YnXt||}|j Syt St k rdSXdS) aCalculate a version string from git. If the revision is tagged, return that. Otherwise calculate a semantic version description of the tree. The number of revisions since the last tag is included in the dev counter in the version for untagged versions. :param pre_version: If supplied use this as the target version rather than inferring one from the last tag + commit messages. Zdescribez --exact-matchT)Zthrow_on_error-rrNr*) r Z_run_git_functionsrreplacerrrrrZrelease_stringZunicode NameError) pre_versionrZtaggedrrrrr_get_version_from_gits$   rcCsddg}i}x`|D]X}yt|d}Wnttfk r>wYnXytj|}Wqtjjk rhwYqXqW|jdd|krdS|jddS)zGet the version from package metadata if present. This looks for PKG-INFO if present (for sdists), and if not looks for METADATA (for wheels) and failing that will return None. zPKG-INFOZMETADATAr4NameNZVersion)r5IOErrorOSErroremailZmessage_from_fileerrorsZ MessageErrorr) package_nameZpkg_metadata_filenamesZ pkg_metadatafilenameZpkg_metadata_filerrr_get_version_from_pkg_metadatas  rcCsltjjdtjjdd}|r |St|}|r0|St|}tjddkrP|jd}|rX|Stdj |ddS) a Get the version of the project. First, try getting it from PKG-INFO or METADATA, if it exists. If it does, that means we're in a distribution tarball or that install has happened. Otherwise, if there is no PKG-INFO or METADATA file, pull the version from git. We do not support setup.py version sanity in git archive tarballs, nor do we support packagers directly sucking our git repo into theirs. We expect that a source tarball be made from our git repo - or that if someone wants to make a source tarball from a fork of our repo with additional tags in it that they understand and desire the results of doing that. :param pre_version: The version field from setup.cfg - if set then this version will be the next release. Z PBR_VERSIONZOSLO_PACKAGE_VERSIONNrrBzutf-8a(Versioning for this project requires either an sdist tarball, or access to an upstream git repository. It's also possible that there is a mismatch between the package name in setup.cfg and the argument given to pbr.version.VersionInfo. Project name {name} was given, but was not able to be found.)re) rrrrrr"r#encoderformat)rrrrrr get_versions r)rr)rr)NF)N)N)N)NrYZ __future__rZdistutils.commandrr\rrrZ email.errorsrr;r"rHZ setuptoolsZsetuptools.commandrrrrr rr r r Z pbr.pbr_jsonr rr'ZTEST_REQUIREMENTS_FILESr)r0r3r8rGrPrQr[r_r]ZCommandr`rjrkZnoserlrnrmro ImportErrorrpZ _wsgi_textZ _script_textr{ryr%normpathrrrrZmanifest_makerrrrRrrrZ LocalBuildDocrrrrrrrZpbr_jsonZwrite_pbr_jsonrrrrs                 E     9  :!     %% & /