o a~@shddlZddlZddlZddlZddlZGdddZejddZddZej ej Z e fdd Z dS) Nc@s:eZdZdZddZd ddZddZd d Zd d ZdS) ImportKillerz@Context manager to make an import of a given name or names fail.cGs ||_dSNnames)selfrr6/usr/lib/python3/dist-packages/keyring/testing/util.py__init__ s zImportKiller.__init__NcCs||jvr|SdSrr)rfullnamepathrrr find_modules zImportKiller.find_modulecCs||jvsJt|r)r ImportError)rr rrr load_moduleszImportKiller.load_modulecCs8i|_|jD] }tj|d|j|<qtjd|dS)Nr)originalrsysmodulespop meta_pathinsert)rnamerrr __enter__s zImportKiller.__enter__cGs6tj||jD] \}}|dur|tj|<q dSr)rrremoveritemsr)rargskeyvaluerrr__exit__s  zImportKiller.__exit__r) __name__ __module__ __qualname____doc__r r rrrrrrrrs  rcksi}|D]\}}||||<|dur||vr||=q|||<qdV|D]\}}|dur:||vr9||=q*|||<q*dS)zHelper context manager to make and unmake changes to a dict. A None is not a valid value for the destination, and so means that the associated name should be removed.N)rget) destinationchangesrrrrrrNoNoneDictMutator#s"  r$cKsttjfi|S)z6A context manager to temporarily change the os.environ)r$osenviron)r#rrrEnviron:sr'cCs&d}td|D] }|t|7}q|S)z-Generate a random string with length kr)rangerandomchoice)ksourceresultirrr random_stringBsr0) contextlibr%rr*stringrcontextmanagerr$r' ascii_lettersdigitsALPHABETr0rrrrs