ó ôBQc@s¦ddlZddlZddlZddlZddlZddlZeejdƒsiddl Zne Z e Z e Zd„Zd„Zddddd„ZdS( iÿÿÿÿNt assertIsNonecCs‹|jddƒ}ttj|ƒƒ}tj|dƒ|d<|djdƒrf|dd|d gs://foo/bar gs://foo/./bar -> gs://foo/bar sgs://sfile://is//i(treplacetlistturlparset posixpathtnormpatht startswitht urlunparse(turitparsedtunparsed((s./tmp/tmp.yUYbTOKr8o/gsutil/gslib/tests/util.pyt _NormalizeURI"s cGs¯t|tƒr5dtjjtjj|j|ŒƒSt|tƒr[dtjj||ŒS|j}|rt dj|gt |ƒƒƒ}n|j dƒr«|d }n|S(s¯Returns the storage URI string for a given StorageUri or file object. Args: obj: The object to get the URI from. Can be a file object, a subclass of boto.storage_uri.StorageURI, or a string. If a string, it is assumed to be a local on-disk path. suffixes: Suffixes to append. For example, ObjectToUri(bucketuri, 'foo') would return the URI for a key name 'foo' inside the given bucket. s file://%st/iÿÿÿÿ( t isinstancetfiletostpathtabspathtjointnamet basestringRR Rtendswith(tobjtsuffixesR((s./tmp/tmp.yUYbTOKr8o/gsutil/gslib/tests/util.pyt ObjectToURI:s & % iiics‡‡‡‡‡fd†}|S(sÚRetry calling the decorated function using an exponential backoff. Taken from: https://github.com/saltycrane/retry-decorator Licensed under BSD: https://github.com/saltycrane/retry-decorator/blob/master/LICENSE :param ExceptionToCheck: the exception to check. may be a tuple of exceptions to check :type ExceptionToCheck: Exception or tuple :param tries: number of times to try (not retry) before giving up :type tries: int :param delay: initial delay between retries in seconds :type delay: int :param backoff: backoff multiplier e.g. value of 2 will double the delay each retry :type backoff: int :param logger: logger to use. If None, print :type logger: logging.Logger instance cs"‡‡‡‡‡‡fd†}|S(Ncs½ˆˆ}}t}x|dkr¥yˆ||ŽSt}PWqˆk r¡}dt|ƒ|f}ˆrxˆj|ƒn|GHtj|ƒ|d8}|ˆ9}qXqW|r¹ˆ||ŽSdS(Nis%s, Retrying in %d seconds...(tTruetFalsetstrtwarningttimetsleep(targstkwargstmtriestmdelayttry_one_last_timetetmsg(tftbackofftdelayttriestExceptionToChecktlogger(s./tmp/tmp.yUYbTOKr8o/gsutil/gslib/tests/util.pytf_retryhs$     ((R&R,(R'R(R)R*R+(R&s./tmp/tmp.yUYbTOKr8o/gsutil/gslib/tests/util.pyt deco_retrygs((R*R)R(R'R+R-((R'R(R)R*R+s./tmp/tmp.yUYbTOKr8o/gsutil/gslib/tests/util.pytRetryRs(Rtos.pathRRturllibRtunittestthasattrtTestCaset unittest2RtRUN_INTEGRATION_TESTStRUN_UNIT_TESTSRtVERBOSE_OUTPUTR RtNoneR.(((s./tmp/tmp.yUYbTOKr8o/gsutil/gslib/tests/util.pyts