PK!+__pycache__/py27compat.cpython-36.opt-1.pycnu[3 9f@sTdZddlZddlmZddZejr.ddZejdko>ejZerHendd Z dS) z2 Compatibility Support for Python 2.7 and earlier N)sixcCs |j|S)zH Given an HTTPMessage, return all headers matching a given key. )Zget_all)messagekeyr /usr/lib/python3.6/py27compat.pyget_all_headers srcCs |j|S)N)Z getheaders)rrrrrrsZLinuxcCs|S)Nr)xrrrsr ) __doc__platformZsetuptools.externrrZPY2systemZlinux_py2_asciistrZ rmtree_saferrrrs  PK!t&(#__pycache__/dep_util.cpython-36.pycnu[3 9f@sddlmZddZdS)) newer_groupcCslt|t|krtdg}g}xBtt|D]2}t||||r.|j|||j||q.W||fS)zWalk both arguments in parallel, testing if each source group is newer than its corresponding target. Returns a pair of lists (sources_groups, targets) where sources is newer than target, according to the semantics of 'newer_group()'. z5'sources_group' and 'targets' must be the same length)len ValueErrorrangerappend)Zsources_groupsZtargetsZ n_sourcesZ n_targetsir/usr/lib/python3.6/dep_util.pynewer_pairwise_groupsr N)Zdistutils.dep_utilrr rrrr s PK!sJ)\\(__pycache__/depends.cpython-36.opt-1.pycnu[3 9f@sddlZddlZddlZddlmZddlmZmZmZmZddl m Z dddd gZ Gd ddZ dd dZ dd dZdd d ZddZedS)N) StrictVersion) PKG_DIRECTORY PY_COMPILED PY_SOURCE PY_FROZEN)BytecodeRequire find_moduleget_module_constantextract_constantc@sHeZdZdZdddZddZdd Zdd d Zdd dZdddZ dS)r z7A prerequisite to building or installing a distributionNcCsF|dkr|dk rt}|dk r0||}|dkr0d}|jjt|`dS)N __version__)r__dict__updatelocalsself)rnamerequested_versionmoduleZhomepage attributeformatr/usr/lib/python3.6/depends.py__init__szRequire.__init__cCs |jdk rd|j|jfS|jS)z0Return full package/distribution name, w/versionNz%s-%s)rr)rrrr full_name s zRequire.full_namecCs*|jdkp(|jdkp(t|dko(||jkS)z%Is 'version' sufficiently up-to-date?Nunknown)rrstrr)rversionrrr version_ok&szRequire.version_okrc Cs||jdkrBy"t|j|\}}}|r*|j|Stk r@dSXt|j|j||}|dk rx||k rx|jdk rx|j|S|S)aGet version number of installed module, 'None', or 'default' Search 'paths' for module. If not found, return 'None'. If found, return the extracted version attribute, or 'default' if no version attribute was specified, or the value cannot be determined without importing the module. The version is formatted according to the requirement's version format (if any), unless it is 'None' or the supplied 'default'. N)rr rclose ImportErrorr r)rpathsdefaultfpivrrr get_version+s  zRequire.get_versioncCs|j|dk S)z/Return true if dependency is present on 'paths'N)r()rr"rrr is_presentFszRequire.is_presentcCs |j|}|dkrdS|j|S)z>Return true if dependency is present and up-to-date on 'paths'NF)r(r)rr"rrrr is_currentJs zRequire.is_current)r NN)Nr)N)N) __name__ __module__ __qualname____doc__rrrr(r)r*rrrrr s   c Csl|jd}x\|rf|jd}tj||\}}\}}}} |tkrP|pFdg}|g}q |r td||fq W| S)z7Just like 'imp.find_module()', but with package support.rrzCan't find %r in %s)splitpopimpr rr!) rr"partspartr$pathsuffixmodekindinforrrr Rs   c Csyt||\}}\}}}Wntk r.dSXz|tkrP|jdtj|} n`|tkrdtj|} nL|t kr~t |j|d} n2|t j krtj ||||||ftt j ||dSWd|r|jXt| ||S)zFind 'module' by searching 'paths', and extract 'symbol' Return 'None' if 'module' does not exist on 'paths', or it does not define 'symbol'. If the module defines 'symbol' as a constant, return the constant. Otherwise, return 'default'.Nexec)r r!rreadmarshalloadrr2get_frozen_objectrcompilesysmodules load_modulegetattrr r ) rsymbolr#r"r$r5r6r7r8coderrrr es$     c Cs||jkrdSt|jj|}d}d}d}|}xPt|D]D}|j} |j} | |kr\|j| }q8| |krx| |kst| |krx|S|}q8WdS)aExtract the constant value of 'symbol' from 'code' If the name 'symbol' is bound to a constant value by the Python code object 'code', return that value. If 'symbol' is bound to an expression, return 'default'. Otherwise, return 'None'. Return value is based on the first assignment to 'symbol'. 'symbol' must be a global, or at least a non-"fast" local in the code block. That is, only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' must be present in 'code.co_names'. NZad)co_nameslistindexrZopcodearg co_consts) rFrEr#Zname_idxZ STORE_NAMEZ STORE_GLOBALZ LOAD_CONSTconstZ byte_codeoprMrrrr s  cCsDtjjd rtjdkrdSd}x|D]}t|=tj|q&WdS)z Patch the globals to remove the objects not available on some platforms. XXX it'd be better to test assertions about bytecode instead. javaZcliNr r )r r )rAplatform startswithglobals__all__remove)Z incompatiblerrrr_update_globalss  rW)N)rXNrX)rX)rAr2r=Zdistutils.versionrrrrrZ py33compatrrUr r r r rWrrrrs   C  " $PK!sJ)\\"__pycache__/depends.cpython-36.pycnu[3 9f@sddlZddlZddlZddlmZddlmZmZmZmZddl m Z dddd gZ Gd ddZ dd dZ dd dZdd d ZddZedS)N) StrictVersion) PKG_DIRECTORY PY_COMPILED PY_SOURCE PY_FROZEN)BytecodeRequire find_moduleget_module_constantextract_constantc@sHeZdZdZdddZddZdd Zdd d Zdd dZdddZ dS)r z7A prerequisite to building or installing a distributionNcCsF|dkr|dk rt}|dk r0||}|dkr0d}|jjt|`dS)N __version__)r__dict__updatelocalsself)rnamerequested_versionmoduleZhomepage attributeformatr/usr/lib/python3.6/depends.py__init__szRequire.__init__cCs |jdk rd|j|jfS|jS)z0Return full package/distribution name, w/versionNz%s-%s)rr)rrrr full_name s zRequire.full_namecCs*|jdkp(|jdkp(t|dko(||jkS)z%Is 'version' sufficiently up-to-date?Nunknown)rrstrr)rversionrrr version_ok&szRequire.version_okrc Cs||jdkrBy"t|j|\}}}|r*|j|Stk r@dSXt|j|j||}|dk rx||k rx|jdk rx|j|S|S)aGet version number of installed module, 'None', or 'default' Search 'paths' for module. If not found, return 'None'. If found, return the extracted version attribute, or 'default' if no version attribute was specified, or the value cannot be determined without importing the module. The version is formatted according to the requirement's version format (if any), unless it is 'None' or the supplied 'default'. N)rr rclose ImportErrorr r)rpathsdefaultfpivrrr get_version+s  zRequire.get_versioncCs|j|dk S)z/Return true if dependency is present on 'paths'N)r()rr"rrr is_presentFszRequire.is_presentcCs |j|}|dkrdS|j|S)z>Return true if dependency is present and up-to-date on 'paths'NF)r(r)rr"rrrr is_currentJs zRequire.is_current)r NN)Nr)N)N) __name__ __module__ __qualname____doc__rrrr(r)r*rrrrr s   c Csl|jd}x\|rf|jd}tj||\}}\}}}} |tkrP|pFdg}|g}q |r td||fq W| S)z7Just like 'imp.find_module()', but with package support.rrzCan't find %r in %s)splitpopimpr rr!) rr"partspartr$pathsuffixmodekindinforrrr Rs   c Csyt||\}}\}}}Wntk r.dSXz|tkrP|jdtj|} n`|tkrdtj|} nL|t kr~t |j|d} n2|t j krtj ||||||ftt j ||dSWd|r|jXt| ||S)zFind 'module' by searching 'paths', and extract 'symbol' Return 'None' if 'module' does not exist on 'paths', or it does not define 'symbol'. If the module defines 'symbol' as a constant, return the constant. Otherwise, return 'default'.Nexec)r r!rreadmarshalloadrr2get_frozen_objectrcompilesysmodules load_modulegetattrr r ) rsymbolr#r"r$r5r6r7r8coderrrr es$     c Cs||jkrdSt|jj|}d}d}d}|}xPt|D]D}|j} |j} | |kr\|j| }q8| |krx| |kst| |krx|S|}q8WdS)aExtract the constant value of 'symbol' from 'code' If the name 'symbol' is bound to a constant value by the Python code object 'code', return that value. If 'symbol' is bound to an expression, return 'default'. Otherwise, return 'None'. Return value is based on the first assignment to 'symbol'. 'symbol' must be a global, or at least a non-"fast" local in the code block. That is, only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' must be present in 'code.co_names'. NZad)co_nameslistindexrZopcodearg co_consts) rFrEr#Zname_idxZ STORE_NAMEZ STORE_GLOBALZ LOAD_CONSTconstZ byte_codeoprMrrrr s  cCsDtjjd rtjdkrdSd}x|D]}t|=tj|q&WdS)z Patch the globals to remove the objects not available on some platforms. XXX it'd be better to test assertions about bytecode instead. javaZcliNr r )r r )rAplatform startswithglobals__all__remove)Z incompatiblerrrr_update_globalss  rW)N)rXNrX)rX)rAr2r=Zdistutils.versionrrrrrZ py33compatrrUr r r r rWrrrrs   C  " $PK!9%__pycache__/dist.cpython-36.opt-1.pycnu[3 9fu@sdgZddlZddlZddlZddlZddlZddlZddlZddl Zddl Z ddl m Z ddl mZmZmZddlmZddlmZddlmZddlmZdd lmZmZmZdd lmZdd lmZdd l m!Z!dd l"m#Z#ddl$Z$ddl%m&Z&e'de'dddZ(ddZ)ddZ*e+e,fZ-ddZ.ddZ/ddZ0ddZ1d d!Z2d"d#Z3d$d%Z4d&d'Z5d(d)Z6d*d+Z7d,d-Z8d.d/Z9e!ej:j;ZZ parse_maprAr)rDr8rEerrrcheck_entry_pointssrfcCst|tjstddS)Nztest_suite must be a string)r`r Z string_typesr)rDr8rErrrcheck_test_suites rgc Csdt|trTxH|jD]8\}}t|ts(Py t|Wqtk rJPYqXqWdSt|ddS)z@Verify that value is a dictionary of package names to glob listsNzI must be a dictionary mapping package names to lists of wildcard patterns)r`rar2striterr@r)rDr8rEkvrrrcheck_package_datas    rlcCs,x&|D]}tjd|stjjd|qWdS)Nz \w+(\.\w+)*z[WARNING: %r not a valid package name; please use only .-separated package names in setup.py)rematchrLrMr)rDr8rEZpkgnamerrrcheck_packagess   roc@s0eZdZdZdeedZdZddZdGddZ dd Z d d Z e d d Z ddZddZdHddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Z d5d6Z!d7d8Z"d9d:Z#d;d<Z$d=d>Z%d?d@Z&dAdBZ'dCdDZ(dEdFZ)dS)IraDistribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that effectively adds the following new optional keyword arguments to 'setup()': 'install_requires' -- a string or sequence of strings specifying project versions that the distribution requires when installed, in the format used by 'pkg_resources.require()'. They will be installed automatically when the package is installed. If you wish to use packages that are not available in PyPI, or want to give your users an alternate download location, you can add a 'find_links' option to the '[easy_install]' section of your project's 'setup.cfg' file, and then setuptools will scan the listed web pages for links that satisfy the requirements. 'extras_require' -- a dictionary mapping names of optional "extras" to the additional requirement(s) that using those extras incurs. For example, this:: extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) indicates that the distribution can optionally provide an extra capability called "reST", but it can only be used if docutils and reSTedit are installed. If the user installs your package using EasyInstall and requests one of your extras, the corresponding additional requirements will be installed if needed. 'features' **deprecated** -- a dictionary mapping option names to 'setuptools.Feature' objects. Features are a portion of the distribution that can be included or excluded based on user options, inter-feature dependencies, and availability on the current system. Excluded features are omitted from all setup commands, including source and binary distributions, so you can create multiple distributions from the same source tree. Feature names should be valid Python identifiers, except that they may contain the '-' (minus) sign. Features can be included or excluded via the command line options '--with-X' and '--without-X', where 'X' is the name of the feature. Whether a feature is included by default, and whether you are allowed to control this from the command line, is determined by the Feature object. See the 'Feature' class for more information. 'test_suite' -- the name of a test suite to run for the 'test' command. If the user runs 'python setup.py test', the package will be installed, and the named test suite will be run. The format is the same as would be used on a 'unittest.py' command line. That is, it is the dotted name of an object to import and call to generate a test suite. 'package_data' -- a dictionary mapping package names to lists of filenames or globs to use to find data files contained in the named packages. If the dictionary has filenames or globs listed under '""' (the empty string), those names will be searched for in every package, in addition to any names for the specific package. Data files found using these names/globs will be installed along with the package, in the same location as the package. Note that globs are allowed to reference the contents of non-package subdirectories, as long as you use '/' as a path separator. (Globs are automatically converted to platform-specific paths at runtime.) In addition to these new keywords, this class also has several new methods for manipulating the distribution's contents. For example, the 'include()' and 'exclude()' methods can be thought of as in-place add and subtract commands that add or remove packages, modules, extensions, and so on from the distribution. They are used by the feature subsystem to configure the distribution for the included and excluded features. N)rr1rcCsp| sd|ksd|krdStjt|dj}tjjj|}|dk rl|jd rltjt|d|_ ||_ dS)NrYr7zPKG-INFO) r=Z safe_namerhlower working_setZby_keygetZ has_metadataZ safe_versionZ_version _patched_dist)r5attrskeyrDrrrpatch_missing_pkg_infoSsz#Distribution.patch_missing_pkg_infoc std}|si_|pi}d|ks,d|kr4tjg_i_g_|jdd_j ||jdg_ |jdg_ x$t j dD]}tj|jdqWtjfdd |jDx\jjD]N\}}x6jj|fD]}||kr||}PqW|r|nd}tj||qWtjjtjr>tjjj_jjdk ryHtjjjj}t|} jj| krtj d jj| f| j_Wn0tjj!t"fk rtj d jjYnXj#dS) N package_datafeaturesrequire_featuressrc_rootdependency_linkssetup_requireszdistutils.setup_keywordscs i|]\}}|jkr||qSr)_DISTUTILS_UNSUPPORTED_METADATA).0rjrk)r5rr qsz)Distribution.__init__..zNormalizing '%s' to '%s'zThe version specified (%r) is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.)$r4rwFeaturewarn_deprecatedryrxZ dist_filespoprzrvr{r|r=iter_entry_pointsvars setdefaultrY _Distribution__init__r2r}metadata__dict__setattrr`r7numbersNumberrhr ZVersionrrZInvalidVersionr@_finalize_requires) r5rtZhave_package_datarFZoptiondefaultsourcerEZverZnormalized_versionr)r5rr`sR    zDistribution.__init__cCsjt|ddr|j|j_t|ddrVx2|jjD]$}|jdd}|r.|jjj|q.W|j|j dS)z Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. rNextras_requirerVr) r rrrkeyssplitradd_convert_extras_requirements"_move_install_requirements_markers)r5r;rrrrs   zDistribution._finalize_requirescCspt|ddpi}tt|_xP|jD]D\}}|j|x0tj|D]"}|j|}|j||j|qBWq$WdS)z Convert requirements in `extras_require` of the form `"extra": ["barbazquux; {marker}"]` to `"extra:{marker}": ["barbazquux"]`. rN) r rrQ_tmp_extras_requirer2r=rX _suffix_forappend)r5Z spec_ext_reqsZsectionrkrsuffixrrrrs   z)Distribution._convert_extras_requirementscCs|jrdt|jSdS)ze For a requirement, return the 'extras_require' suffix for that requirement. rV)rZrh)reqrrrrszDistribution._suffix_forcsdd}tddpf}ttj|}t||}t||}ttt|_x&|D]}j dt|j j |qPWt fddj j D_dS)zv Move requirements in `install_requires` that are using environment markers `extras_require`. cSs|j S)N)rZ)rrrr is_simple_reqszFDistribution._move_install_requirements_markers..is_simple_reqinstall_requiresNrVc3s,|]$\}}|ddtj|DfVqdS)cSsg|] }t|qSr)rh)r~rrrr szMDistribution._move_install_requirements_markers...N)r _clean_req)r~rjrk)r5rr szBDistribution._move_install_requirements_markers..)r rQr=rXr r r rhrrrZrrar2r)r5rZspec_inst_reqsZ inst_reqsZ simple_reqsZ complex_reqsrr)r5rrs     z/Distribution._move_install_requirements_markerscCs d|_|S)zP Given a Requirement, remove environment markers and return it. N)rZ)r5rrrrrszDistribution._clean_reqFcCs*tj||dt||j|d|jdS)zYParses configuration files from various levels and loads configuration. ) filenames)ignore_option_errorsN)rparse_config_filesrcommand_optionsr)r5rrrrrrszDistribution.parse_config_filescCstj|}|jr|j|S)z3Process features after parsing command line options)rparse_command_linerx_finalize_features)r5resultrrrrs zDistribution.parse_command_linecCsd|jddS)z;Convert feature name to corresponding option attribute nameZwith_-_)replace)r5rYrrr_feature_attrnameszDistribution._feature_attrnamecCs<tjjtj||jdd}x|D]}tjj|ddq W|S)zResolve pre-setup requirementsT) installerZreplace_conflicting)r)r=rqresolverXfetch_build_eggr)r5r!Zresolved_distsrDrrrfetch_build_eggss zDistribution.fetch_build_eggscCstj||jr|jxHtjdD]:}t||jd}|dk r$|j|j d|j ||j|q$Wt|ddrdd|j D|_ ng|_ dS)Nzdistutils.setup_keywords)rconvert_2to3_doctestscSsg|]}tjj|qSr)ospathabspath)r~prrrrsz1Distribution.finalize_options..) rfinalize_optionsrx_set_global_opts_from_featuresr=rr rYrequirerloadr)r5rFrErrrrs  zDistribution.finalize_optionsc Csvtjjtjd}tjj|srtj|tj|tjj|d}t|d$}|j d|j d|j dWdQRX|S)Nz.eggsz README.txtwzcThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins. zAThis directory caches those eggs to prevent repeated downloads. z/However, it is safe to delete this directory. ) rrr3curdirexistsmkdirrZ hide_fileopenr/)r5Z egg_cache_dirZreadme_txt_filenamefrrrget_egg_cache_dirs      zDistribution.get_egg_cache_dirc Csddlm}|jddgi}|jd}|j|jdd|jdjD|jr|jdd}d|krx|dd |}d |f|d<|j}||d g|d d dd d d d d d }|j |j|S)z Fetch an egg needed for buildingr) easy_installZ script_argsrcss"|]\}}|dkr||fVqdS) find_links site_dirs index_urloptimize allow_hostsN)rrrrrrr)r~rjrkrrrr1sz/Distribution.fetch_build_egg..NrrZsetupxTF) args install_dirZexclude_scriptsZ always_copyZbuild_directoryZeditableZupgradeZ multi_versionZ no_reportuser) Zsetuptools.command.easy_installr __class__get_option_dictclearupdater2r{rZensure_finalized)r5rrrDoptsZlinksrcmdrrrr*s(   zDistribution.fetch_build_eggc Csg}|jj}x|jjD]\}}|j|d|j||jr|j}d}d}|js^||}}d|dd||fd|dd||ff}|j |d||d|<qW||j |_ |_ ||_|_ dS)z;Add --with-X/--without-X options based on optional featuresNz (default)rzwith-zinclude zwithout-zexclude ) negative_optcopyrxr2 _set_featurevalidateoptional descriptioninclude_by_defaultextendglobal_optionsZfeature_optionsZfeature_negopt) r5ZgonorYfeaturedescrZincdefZexcdefnewrrrrGs"     z+Distribution._set_global_opts_from_featurescCsxJ|jjD]<\}}|j|}|s2|dkr |jr |j||j|dq Wx6|jjD](\}}|j|sX|j||j|dqXWdS)z9Add/remove features and resolve dependencies between themNrr)rxr2feature_is_includedr include_inr exclude_from)r5rYrZenabledrrrrbs    zDistribution._finalize_featurescCs`||jkr|j|Stjd|}x:|D]&}|j|jd|j|j|<}|SWtj||SdS)z(Pluggable version of get_command_class()zdistutils.commands)rN)cmdclassr=rrrrrget_command_class)r5commandZepsrFrrrrrss    zDistribution.get_command_classcCs>x2tjdD]$}|j|jkr |j}||j|j<q Wtj|S)Nzdistutils.commands)r=rrYrrrprint_commands)r5rFrrrrrs  zDistribution.print_commandscCs>x2tjdD]$}|j|jkr |j}||j|j<q Wtj|S)Nzdistutils.commands)r=rrYrrrget_command_list)r5rFrrrrrs  zDistribution.get_command_listcCst||j||dS)zSet feature's inclusion statusN)rr)r5rYZstatusrrrrszDistribution._set_featurecCst||j|S)zAReturn 1 if feature is included, 0 if excluded, 'None' if unknown)r r)r5rYrrrrsz Distribution.feature_is_includedcCsF|j|dkr&|j|j}t|d|j|j||j|ddS)z)Request inclusion of feature named 'name'rz2 is required, but was excluded or is not availablerN)rrxrrrr)r5rYrrrrinclude_features   zDistribution.include_featurecKsDx>|jD]2\}}t|d|d}|r0||q |j||q WdS)aAdd items to distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would add 'x' to the distribution's 'py_modules' attribute, if it was not already there. Currently, this method only supports inclusion for attributes that are lists or tuples. If you need to add support for adding to other attributes in this or a subclass, you can add an '_include_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' will try to call 'dist._include_foo({"bar":"baz"})', which can then handle whatever special inclusion logic is needed. Z _include_N)r2r _include_misc)r5rtrjrkincluderrrrs  zDistribution.includecsfd|jr&fdd|jD|_|jrDfdd|jD|_|jrbfdd|jD|_dS)z9Remove packages, modules, and extensions in named packagerIcs$g|]}|kr|j r|qSr) startswith)r~r)packagepfxrrrsz0Distribution.exclude_package..cs$g|]}|kr|j r|qSr)r)r~r)rrrrrscs(g|] }|jkr|jj r|qSr)rYr)r~r)rrrrrsN)packages py_modules ext_modules)r5rr)rrrexclude_packageszDistribution.exclude_packagecCs4|d}x&|jD]}||ks(|j|rdSqWdS)z.)r`sequencerr rBr)r5rYrEoldr)rEr _exclude_miscs  zDistribution._exclude_miscc st|tstd||fyt||Wn tk rHtd|YnXdkr`t|||n:ttsxt|dn"fdd|D}t|||dS)zAHandle 'include()' for list/tuple attrs without a special handlerz%s: setting must be a list (%r)z %s: No such distribution settingNz4: this setting cannot be changed via include/excludecsg|]}|kr|qSrr)r~r)rrrrsz.Distribution._include_misc..)r`rrr rBr)r5rYrErr)rrrs   zDistribution._include_misccKsDx>|jD]2\}}t|d|d}|r0||q |j||q WdS)aRemove items from distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from the distribution's 'py_modules' attribute. Excluding packages uses the 'exclude_package()' method, so all of the package's contained packages, modules, and extensions are also excluded. Currently, this method only supports exclusion from attributes that are lists or tuples. If you need to add support for excluding from other attributes in this or a subclass, you can add an '_exclude_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' will try to call 'dist._exclude_foo({"bar":"baz"})', which can then handle whatever special exclusion logic is needed. Z _exclude_N)r2r r)r5rtrjrkexcluderrrrs  zDistribution.excludecCs,t|tstd|ftt|j|dS)Nz.packages: setting must be a list or tuple (%r))r`rrrQr r)r5rrrr_exclude_packagess  zDistribution._exclude_packagesc Cs|jj|_|jj|_|d}|jd}xB||krh||\}}||=ddl}|j|d|dd<|d}q(Wtj|||}|j|} t | ddrd|f|j|d<|dk rgS|S)NraliasesTrZcommand_consumes_argumentsz command liner) rrrrshlexrr_parse_command_optsrr ) r5parserrrrsrcaliasrnargsZ cmd_classrrrr s"        z Distribution._parse_command_optsc Csi}x|jjD]\}}x|jD]\}\}}|dkr8q"|jdd}|dkr|j|}|jj}|jt|dix<|jD]\} } | |kr|| }d}Pq|Wtdn |dkrd}||j |i|<q"WqW|S) ahReturn a '{cmd: {opt:val}}' map of all command-line options Option names are all long, but do not include the leading '--', and contain dashes rather than underscores. If the option doesn't take an argument (e.g. '--quiet'), the 'val' is 'None'. Note that options provided by config files are intentionally excluded. z command linerrrrNzShouldn't be able to get herer) rr2rZget_command_objrrrr rCr) r5drroptrvalZcmdobjZneg_optnegposrrrget_cmdline_options:s(     z Distribution.get_cmdline_optionsccsx|jp fD] }|Vq Wx|jp$fD] }|Vq&WxH|jp>fD]:}t|trX|\}}n|j}|jdrt|dd}|Vq@WdS)z@Yield all packages, modules, and extension names in distributionmoduleNi)rrrr`tuplerYendswith)r5ZpkgrZextrYZ buildinforrrrbs      z$Distribution.iter_distribution_namescCsddl}tjs|jr tj||Sddl}t|j|j sBtj||S|jj j dkr^tj||S|jj }|jj }|j dkr|dp~d}|jj}|j |jjd||||_z tj||S|j |jj|||||_XdS)zIf there were any non-global "display-only" options (--help-commands or the metadata display options) on the command line, display the requested info and return true; else return false. rNutf-8utf8Zwin32 )rr )sysr r0Z help_commandsrhandle_display_optionsior`stdout TextIOWrapperencodingrperrorsr:line_bufferingdetach)r5Z option_orderr r rrnewlinerrrrr ts$     z#Distribution.handle_display_options)N)NF)*__name__ __module__ __qualname____doc__rarbr}rsrvrrr staticmethodrrrrrrrrrrrrrrrrrrrrrJrrrrrrrr rrrrrsLB ;      (c@sPeZdZdZeddZdddfffddZdd Zd d Zd d Z ddZ dS)ra **deprecated** -- The `Feature` facility was never completely implemented or supported, `has reported issues `_ and will be removed in a future version. A subset of the distribution that can be excluded if unneeded/wanted Features are created using these keyword arguments: 'description' -- a short, human readable description of the feature, to be used in error messages, and option help messages. 'standard' -- if true, the feature is included by default if it is available on the current system. Otherwise, the feature is only included if requested via a command line '--with-X' option, or if another included feature requires it. The default setting is 'False'. 'available' -- if true, the feature is available for installation on the current system. The default setting is 'True'. 'optional' -- if true, the feature's inclusion can be controlled from the command line, using the '--with-X' or '--without-X' options. If false, the feature's inclusion status is determined automatically, based on 'availabile', 'standard', and whether any other feature requires it. The default setting is 'True'. 'require_features' -- a string or sequence of strings naming features that should also be included if this feature is included. Defaults to empty list. May also contain 'Require' objects that should be added/removed from the distribution. 'remove' -- a string or list of strings naming packages to be removed from the distribution if this feature is *not* included. If the feature *is* included, this argument is ignored. This argument exists to support removing features that "crosscut" a distribution, such as defining a 'tests' feature that removes all the 'tests' subpackages provided by other features. The default for this argument is an empty list. (Note: the named package(s) or modules must exist in the base distribution when the 'setup()' function is initially called.) other keywords -- any other keyword arguments are saved, and passed to the distribution's 'include()' and 'exclude()' methods when the feature is included or excluded, respectively. So, for example, you could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be added or removed from the distribution as appropriate. A feature must include at least one 'requires', 'remove', or other keyword argument. Otherwise, it can't affect the distribution in any way. Note also that you can subclass 'Feature' to create your own specialized feature types that modify the distribution in other ways when included or excluded. See the docstrings for the various methods here for more detail. Aside from the methods, the only feature attributes that distributions look at are 'description' and 'optional'. cCsd}tj|tdddS)NzrFeatures are deprecated and will be removed in a future version. See https://github.com/pypa/setuptools/issues/65.) stacklevel)rrr)msgrrrrszFeature.warn_deprecatedFTc Ks|j||_||_||_||_t|ttfr4|f}dd|D|_dd|D}|r^||d<t|trn|f}||_ ||_ | r| r| rt ddS)NcSsg|]}t|tr|qSr)r`rh)r~rrrrrsz$Feature.__init__..cSsg|]}t|ts|qSr)r`rh)r~rrrrrsryzgFeature %s: must define 'require_features', 'remove', or at least one of 'packages', 'py_modules', etc.) rrstandard availablerr`rhrryremoveextrasr) r5rrrrryrr Zerrrrrs$ zFeature.__init__cCs |jo |jS)z+Should this feature be included by default?)rr)r5rrrrszFeature.include_by_defaultcCs@|jst|jd|jf|jx|jD]}|j|q*WdS)aEnsure feature and its requirements are included in distribution You may override this in a subclass to perform additional operations on the distribution. Note that this method may be called more than once per feature, and so should be idempotent. z3 is required, but is not available on this platformN)rrrrr ryr)r5rDrrrrrs   zFeature.include_incCs2|jf|j|jr.x|jD]}|j|qWdS)a2Ensure feature is excluded from distribution You may override this in a subclass to perform additional operations on the distribution. This method will be called at most once per feature, and only after all included features have been asked to include themselves. N)rr rr)r5rDrrrrrs  zFeature.exclude_fromcCs2x,|jD]"}|j|std|j||fqWdS)aVerify that feature makes sense in context of distribution This method is called by the distribution just before it parses its command line. It checks to ensure that the 'remove' attribute, if any, contains only valid package/module names that are present in the base distribution when 'setup()' is called. You may override it in a subclass to perform any other required validation of the feature against a target distribution. zg%s wants to be able to remove %s, but the distribution doesn't contain any packages or modules under %sN)rrJrr)r5rDrrrrrs  zFeature.validateN) rrrrrrrrrrrrrrrrs7 r)>__all__rmrrrZ distutils.logrLZdistutils.coreZ distutils.cmdZdistutils.distrR collectionsrZdistutils.errorsrrrZdistutils.utilrZdistutils.versionrZsetuptools.externr r Zsetuptools.extern.six.movesr r r Zsetuptools.dependsrZ setuptoolsrZsetuptools.monkeyrZsetuptools.configrr=Z py36compatr __import__rr#r<rrQrrGrHrPrUrTr^rcrdrfrgrlroZcorerrrrrrrs`          G     PK!ƏƏ__pycache__/dist.cpython-36.pycnu[3 9fu@sdgZddlZddlZddlZddlZddlZddlZddlZddl Zddl Z ddl m Z ddl mZmZmZddlmZddlmZddlmZddlmZdd lmZmZmZdd lmZdd lmZdd l m!Z!dd l"m#Z#ddl$Z$ddl%m&Z&e'de'dddZ(ddZ)ddZ*e+e,fZ-ddZ.ddZ/ddZ0ddZ1d d!Z2d"d#Z3d$d%Z4d&d'Z5d(d)Z6d*d+Z7d,d-Z8d.d/Z9e!ej:j;ZZ parse_maprCr)rEr8rFerrrcheck_entry_pointssrhcCst|tjstddS)Nztest_suite must be a string)rbr Z string_typesr)rEr8rFrrrcheck_test_suites ric Csdt|trTxH|jD]8\}}t|ts(Py t|Wqtk rJPYqXqWdSt|ddS)z@Verify that value is a dictionary of package names to glob listsNzI must be a dictionary mapping package names to lists of wildcard patterns)rbrcr2striterrBr)rEr8rFkvrrrcheck_package_datas    rncCs,x&|D]}tjd|stjjd|qWdS)Nz \w+(\.\w+)*z[WARNING: %r not a valid package name; please use only .-separated package names in setup.py)rematchrNrOr)rEr8rFZpkgnamerrrcheck_packagess   rqc@s0eZdZdZdeedZdZddZdGddZ dd Z d d Z e d d Z ddZddZdHddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Z d5d6Z!d7d8Z"d9d:Z#d;d<Z$d=d>Z%d?d@Z&dAdBZ'dCdDZ(dEdFZ)dS)IraDistribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that effectively adds the following new optional keyword arguments to 'setup()': 'install_requires' -- a string or sequence of strings specifying project versions that the distribution requires when installed, in the format used by 'pkg_resources.require()'. They will be installed automatically when the package is installed. If you wish to use packages that are not available in PyPI, or want to give your users an alternate download location, you can add a 'find_links' option to the '[easy_install]' section of your project's 'setup.cfg' file, and then setuptools will scan the listed web pages for links that satisfy the requirements. 'extras_require' -- a dictionary mapping names of optional "extras" to the additional requirement(s) that using those extras incurs. For example, this:: extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) indicates that the distribution can optionally provide an extra capability called "reST", but it can only be used if docutils and reSTedit are installed. If the user installs your package using EasyInstall and requests one of your extras, the corresponding additional requirements will be installed if needed. 'features' **deprecated** -- a dictionary mapping option names to 'setuptools.Feature' objects. Features are a portion of the distribution that can be included or excluded based on user options, inter-feature dependencies, and availability on the current system. Excluded features are omitted from all setup commands, including source and binary distributions, so you can create multiple distributions from the same source tree. Feature names should be valid Python identifiers, except that they may contain the '-' (minus) sign. Features can be included or excluded via the command line options '--with-X' and '--without-X', where 'X' is the name of the feature. Whether a feature is included by default, and whether you are allowed to control this from the command line, is determined by the Feature object. See the 'Feature' class for more information. 'test_suite' -- the name of a test suite to run for the 'test' command. If the user runs 'python setup.py test', the package will be installed, and the named test suite will be run. The format is the same as would be used on a 'unittest.py' command line. That is, it is the dotted name of an object to import and call to generate a test suite. 'package_data' -- a dictionary mapping package names to lists of filenames or globs to use to find data files contained in the named packages. If the dictionary has filenames or globs listed under '""' (the empty string), those names will be searched for in every package, in addition to any names for the specific package. Data files found using these names/globs will be installed along with the package, in the same location as the package. Note that globs are allowed to reference the contents of non-package subdirectories, as long as you use '/' as a path separator. (Globs are automatically converted to platform-specific paths at runtime.) In addition to these new keywords, this class also has several new methods for manipulating the distribution's contents. For example, the 'include()' and 'exclude()' methods can be thought of as in-place add and subtract commands that add or remove packages, modules, extensions, and so on from the distribution. They are used by the feature subsystem to configure the distribution for the included and excluded features. N)rr1rcCsp| sd|ksd|krdStjt|dj}tjjj|}|dk rl|jd rltjt|d|_ ||_ dS)Nr[r7zPKG-INFO) r=Z safe_namerjlower working_setZby_keygetZ has_metadataZ safe_versionZ_version _patched_dist)r5attrskeyrErrrpatch_missing_pkg_infoSsz#Distribution.patch_missing_pkg_infoc std}|si_|pi}d|ks,d|kr4tjg_i_g_|jdd_j ||jdg_ |jdg_ x$t j dD]}tj|jdqWtjfdd |jDx\jjD]N\}}x6jj|fD]}||kr||}PqW|r|nd}tj||qWtjjtjr>tjjj_jjdk ryHtjjjj}t|} jj| krtj d jj| f| j_Wn0tjj!t"fk rtj d jjYnXj#dS) N package_datafeaturesrequire_featuressrc_rootdependency_linkssetup_requireszdistutils.setup_keywordscs i|]\}}|jkr||qSr)_DISTUTILS_UNSUPPORTED_METADATA).0rlrm)r5rr qsz)Distribution.__init__..zNormalizing '%s' to '%s'zThe version specified (%r) is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.)$r4ryFeaturewarn_deprecatedr{rzZ dist_filespopr|rxr}r~r=iter_entry_pointsvars setdefaultr[ _Distribution__init__r2rmetadata__dict__setattrrbr7numbersNumberrjr ZVersionrrZInvalidVersionrB_finalize_requires) r5rvZhave_package_datarGZoptiondefaultsourcerFZverZnormalized_versionr)r5rr`sR    zDistribution.__init__cCsjt|ddr|j|j_t|ddrVx2|jjD]$}|jdd}|r.|jjj|q.W|j|j dS)z Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. rNextras_requirerXr) r rrrkeyssplitradd_convert_extras_requirements"_move_install_requirements_markers)r5r;rrrrs   zDistribution._finalize_requirescCspt|ddpi}tt|_xP|jD]D\}}|j|x0tj|D]"}|j|}|j||j|qBWq$WdS)z Convert requirements in `extras_require` of the form `"extra": ["barbazquux; {marker}"]` to `"extra:{marker}": ["barbazquux"]`. rN) r rrS_tmp_extras_requirer2r=rZ _suffix_forappend)r5Z spec_ext_reqsZsectionrmrsuffixrrrrs   z)Distribution._convert_extras_requirementscCs|jrdt|jSdS)ze For a requirement, return the 'extras_require' suffix for that requirement. rXrI)r\rj)reqrrrrszDistribution._suffix_forcsdd}tddpf}ttj|}t||}t||}ttt|_x&|D]}j dt|j j |qPWt fddj j D_dS)zv Move requirements in `install_requires` that are using environment markers `extras_require`. cSs|j S)N)r\)rrrr is_simple_reqszFDistribution._move_install_requirements_markers..is_simple_reqinstall_requiresNrXc3s,|]$\}}|ddtj|DfVqdS)cSsg|] }t|qSr)rj)rrrrr szMDistribution._move_install_requirements_markers...N)r _clean_req)rrlrm)r5rr szBDistribution._move_install_requirements_markers..)r rSr=rZr r r rjrrr\rrcr2r)r5rZspec_inst_reqsZ inst_reqsZ simple_reqsZ complex_reqsrr)r5rrs     z/Distribution._move_install_requirements_markerscCs d|_|S)zP Given a Requirement, remove environment markers and return it. N)r\)r5rrrrrszDistribution._clean_reqFcCs*tj||dt||j|d|jdS)zYParses configuration files from various levels and loads configuration. ) filenames)ignore_option_errorsN)rparse_config_filesrcommand_optionsr)r5rrrrrrszDistribution.parse_config_filescCstj|}|jr|j|S)z3Process features after parsing command line options)rparse_command_linerz_finalize_features)r5resultrrrrs zDistribution.parse_command_linecCsd|jddS)z;Convert feature name to corresponding option attribute nameZwith_-_)replace)r5r[rrr_feature_attrnameszDistribution._feature_attrnamecCs<tjjtj||jdd}x|D]}tjj|ddq W|S)zResolve pre-setup requirementsT) installerZreplace_conflicting)r)r=rsresolverZfetch_build_eggr)r5r!Zresolved_distsrErrrfetch_build_eggss zDistribution.fetch_build_eggscCstj||jr|jxHtjdD]:}t||jd}|dk r$|j|j d|j ||j|q$Wt|ddrdd|j D|_ ng|_ dS)Nzdistutils.setup_keywords)rconvert_2to3_doctestscSsg|]}tjj|qSr)ospathabspath)rprrrrsz1Distribution.finalize_options..) rfinalize_optionsrz_set_global_opts_from_featuresr=rr r[requirerloadr)r5rGrFrrrrs  zDistribution.finalize_optionsc Csvtjjtjd}tjj|srtj|tj|tjj|d}t|d$}|j d|j d|j dWdQRX|S)Nz.eggsz README.txtwzcThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins. zAThis directory caches those eggs to prevent repeated downloads. z/However, it is safe to delete this directory. ) rrr3curdirexistsmkdirrZ hide_fileopenr/)r5Z egg_cache_dirZreadme_txt_filenamefrrrget_egg_cache_dirs      zDistribution.get_egg_cache_dirc Csddlm}|jddgi}|jd}|j|jdd|jdjD|jr|jdd}d|krx|dd |}d |f|d<|j}||d g|d d dd d d d d d }|j |j|S)z Fetch an egg needed for buildingr) easy_installZ script_argsrcss"|]\}}|dkr||fVqdS) find_links site_dirs index_urloptimize allow_hostsN)rrrrrrr)rrlrmrrrr1sz/Distribution.fetch_build_egg..NrrZsetupxTF) args install_dirZexclude_scriptsZ always_copyZbuild_directoryZeditableZupgradeZ multi_versionZ no_reportuser) Zsetuptools.command.easy_installr __class__get_option_dictclearupdater2r}rZensure_finalized)r5rrrEoptsZlinksrcmdrrrr*s(   zDistribution.fetch_build_eggc Csg}|jj}x|jjD]\}}|j|d|j||jr|j}d}d}|js^||}}d|dd||fd|dd||ff}|j |d||d|<qW||j |_ |_ ||_|_ dS)z;Add --with-X/--without-X options based on optional featuresNz (default)rIzwith-zinclude zwithout-zexclude ) negative_optcopyrzr2 _set_featurevalidateoptional descriptioninclude_by_defaultextendglobal_optionsZfeature_optionsZfeature_negopt) r5Zgonor[featuredescrZincdefZexcdefnewrrrrGs"     z+Distribution._set_global_opts_from_featurescCsxJ|jjD]<\}}|j|}|s2|dkr |jr |j||j|dq Wx6|jjD](\}}|j|sX|j||j|dqXWdS)z9Add/remove features and resolve dependencies between themNrr)rzr2feature_is_includedr include_inr exclude_from)r5r[rZenabledrrrrbs    zDistribution._finalize_featurescCs`||jkr|j|Stjd|}x:|D]&}|j|jd|j|j|<}|SWtj||SdS)z(Pluggable version of get_command_class()zdistutils.commands)rN)cmdclassr=rrrrrget_command_class)r5commandZepsrGrrrrrss    zDistribution.get_command_classcCs>x2tjdD]$}|j|jkr |j}||j|j<q Wtj|S)Nzdistutils.commands)r=rr[rrrprint_commands)r5rGrrrrrs  zDistribution.print_commandscCs>x2tjdD]$}|j|jkr |j}||j|j<q Wtj|S)Nzdistutils.commands)r=rr[rrrget_command_list)r5rGrrrrrs  zDistribution.get_command_listcCst||j||dS)zSet feature's inclusion statusN)rr)r5r[ZstatusrrrrszDistribution._set_featurecCst||j|S)zAReturn 1 if feature is included, 0 if excluded, 'None' if unknown)r r)r5r[rrrrsz Distribution.feature_is_includedcCsF|j|dkr&|j|j}t|d|j|j||j|ddS)z)Request inclusion of feature named 'name'rz2 is required, but was excluded or is not availablerN)rrzrrrr)r5r[rrrrinclude_features   zDistribution.include_featurecKsDx>|jD]2\}}t|d|d}|r0||q |j||q WdS)aAdd items to distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would add 'x' to the distribution's 'py_modules' attribute, if it was not already there. Currently, this method only supports inclusion for attributes that are lists or tuples. If you need to add support for adding to other attributes in this or a subclass, you can add an '_include_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' will try to call 'dist._include_foo({"bar":"baz"})', which can then handle whatever special inclusion logic is needed. Z _include_N)r2r _include_misc)r5rvrlrmincluderrrrs  zDistribution.includecsfd|jr&fdd|jD|_|jrDfdd|jD|_|jrbfdd|jD|_dS)z9Remove packages, modules, and extensions in named packagerKcs$g|]}|kr|j r|qSr) startswith)rr)packagepfxrrrsz0Distribution.exclude_package..cs$g|]}|kr|j r|qSr)r)rr)rrrrrscs(g|] }|jkr|jj r|qSr)r[r)rr)rrrrrsN)packages py_modules ext_modules)r5rr)rrrexclude_packageszDistribution.exclude_packagecCs4|d}x&|jD]}||ks(|j|rdSqWdS)z.)rbsequencerr rDr)r5r[rFoldr)rFr _exclude_miscs  zDistribution._exclude_miscc st|tstd||fyt||Wn tk rHtd|YnXdkr`t|||n:ttsxt|dn"fdd|D}t|||dS)zAHandle 'include()' for list/tuple attrs without a special handlerz%s: setting must be a list (%r)z %s: No such distribution settingNz4: this setting cannot be changed via include/excludecsg|]}|kr|qSrr)rr)rrrrsz.Distribution._include_misc..)rbrrr rDr)r5r[rFrr)rrrs   zDistribution._include_misccKsDx>|jD]2\}}t|d|d}|r0||q |j||q WdS)aRemove items from distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from the distribution's 'py_modules' attribute. Excluding packages uses the 'exclude_package()' method, so all of the package's contained packages, modules, and extensions are also excluded. Currently, this method only supports exclusion from attributes that are lists or tuples. If you need to add support for excluding from other attributes in this or a subclass, you can add an '_exclude_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' will try to call 'dist._exclude_foo({"bar":"baz"})', which can then handle whatever special exclusion logic is needed. Z _exclude_N)r2r r)r5rvrlrmexcluderrrrs  zDistribution.excludecCs,t|tstd|ftt|j|dS)Nz.packages: setting must be a list or tuple (%r))rbrrrSr r)r5rrrr_exclude_packagess  zDistribution._exclude_packagesc Cs|jj|_|jj|_|d}|jd}xB||krh||\}}||=ddl}|j|d|dd<|d}q(Wtj|||}|j|} t | ddrd|f|j|d<|dk rgS|S)NraliasesTrZcommand_consumes_argumentsz command liner) rrrrshlexrr_parse_command_optsrr ) r5parserrrrsrcaliasrnargsZ cmd_classrrrr s"        z Distribution._parse_command_optsc Csi}x|jjD]\}}x|jD]\}\}}|dkr8q"|jdd}|dkr|j|}|jj}|jt|dix<|jD]\} } | |kr|| }d}Pq|Wtdn |dkrd}||j |i|<q"WqW|S) ahReturn a '{cmd: {opt:val}}' map of all command-line options Option names are all long, but do not include the leading '--', and contain dashes rather than underscores. If the option doesn't take an argument (e.g. '--quiet'), the 'val' is 'None'. Note that options provided by config files are intentionally excluded. z command linerrrrNzShouldn't be able to get herer) rr2rZget_command_objrrrr rAr) r5drroptrvalZcmdobjZneg_optnegposrrrget_cmdline_options:s(     z Distribution.get_cmdline_optionsccsx|jp fD] }|Vq Wx|jp$fD] }|Vq&WxH|jp>fD]:}t|trX|\}}n|j}|jdrt|dd}|Vq@WdS)z@Yield all packages, modules, and extension names in distributionmoduleNi)rrrrbtupler[endswith)r5ZpkgrZextr[Z buildinforrrrbs      z$Distribution.iter_distribution_namescCsddl}tjs|jr tj||Sddl}t|j|j sBtj||S|jj j dkr^tj||S|jj }|jj }|j dkr|dp~d}|jj}|j |jjd||||_z tj||S|j |jj|||||_XdS)zIf there were any non-global "display-only" options (--help-commands or the metadata display options) on the command line, display the requested info and return true; else return false. rNutf-8utf8Zwin32 )r r )sysr r0Z help_commandsrhandle_display_optionsiorbstdout TextIOWrapperencodingrrerrorsr:line_bufferingdetach)r5Z option_orderr rrrnewlinerrrrr ts$     z#Distribution.handle_display_options)N)NF)*__name__ __module__ __qualname____doc__rcrdrrurxrrr staticmethodrrrrrrrrrrrrrrrrrrrrrLrrrrrrrr rrrrrsLB ;      (c@sPeZdZdZeddZdddfffddZdd Zd d Zd d Z ddZ dS)ra **deprecated** -- The `Feature` facility was never completely implemented or supported, `has reported issues `_ and will be removed in a future version. A subset of the distribution that can be excluded if unneeded/wanted Features are created using these keyword arguments: 'description' -- a short, human readable description of the feature, to be used in error messages, and option help messages. 'standard' -- if true, the feature is included by default if it is available on the current system. Otherwise, the feature is only included if requested via a command line '--with-X' option, or if another included feature requires it. The default setting is 'False'. 'available' -- if true, the feature is available for installation on the current system. The default setting is 'True'. 'optional' -- if true, the feature's inclusion can be controlled from the command line, using the '--with-X' or '--without-X' options. If false, the feature's inclusion status is determined automatically, based on 'availabile', 'standard', and whether any other feature requires it. The default setting is 'True'. 'require_features' -- a string or sequence of strings naming features that should also be included if this feature is included. Defaults to empty list. May also contain 'Require' objects that should be added/removed from the distribution. 'remove' -- a string or list of strings naming packages to be removed from the distribution if this feature is *not* included. If the feature *is* included, this argument is ignored. This argument exists to support removing features that "crosscut" a distribution, such as defining a 'tests' feature that removes all the 'tests' subpackages provided by other features. The default for this argument is an empty list. (Note: the named package(s) or modules must exist in the base distribution when the 'setup()' function is initially called.) other keywords -- any other keyword arguments are saved, and passed to the distribution's 'include()' and 'exclude()' methods when the feature is included or excluded, respectively. So, for example, you could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be added or removed from the distribution as appropriate. A feature must include at least one 'requires', 'remove', or other keyword argument. Otherwise, it can't affect the distribution in any way. Note also that you can subclass 'Feature' to create your own specialized feature types that modify the distribution in other ways when included or excluded. See the docstrings for the various methods here for more detail. Aside from the methods, the only feature attributes that distributions look at are 'description' and 'optional'. cCsd}tj|tdddS)NzrFeatures are deprecated and will be removed in a future version. See https://github.com/pypa/setuptools/issues/65.) stacklevel)rrr)msgrrrrszFeature.warn_deprecatedFTc Ks|j||_||_||_||_t|ttfr4|f}dd|D|_dd|D}|r^||d<t|trn|f}||_ ||_ | r| r| rt ddS)NcSsg|]}t|tr|qSr)rbrj)rrrrrrsz$Feature.__init__..cSsg|]}t|ts|qSr)rbrj)rrrrrrsr{zgFeature %s: must define 'require_features', 'remove', or at least one of 'packages', 'py_modules', etc.) rrstandard availablerrbrjrr{remover@r) r5rrrrr{r r@Zerrrrrs$ zFeature.__init__cCs |jo |jS)z+Should this feature be included by default?)rr)r5rrrrszFeature.include_by_defaultcCs@|jst|jd|jf|jx|jD]}|j|q*WdS)aEnsure feature and its requirements are included in distribution You may override this in a subclass to perform additional operations on the distribution. Note that this method may be called more than once per feature, and so should be idempotent. z3 is required, but is not available on this platformN)rrrrr@r{r)r5rErrrrrs   zFeature.include_incCs2|jf|j|jr.x|jD]}|j|qWdS)a2Ensure feature is excluded from distribution You may override this in a subclass to perform additional operations on the distribution. This method will be called at most once per feature, and only after all included features have been asked to include themselves. N)rr@r r)r5rErrrrrs  zFeature.exclude_fromcCs2x,|jD]"}|j|std|j||fqWdS)aVerify that feature makes sense in context of distribution This method is called by the distribution just before it parses its command line. It checks to ensure that the 'remove' attribute, if any, contains only valid package/module names that are present in the base distribution when 'setup()' is called. You may override it in a subclass to perform any other required validation of the feature against a target distribution. zg%s wants to be able to remove %s, but the distribution doesn't contain any packages or modules under %sN)r rLrr)r5rErrrrrs  zFeature.validateN) rrrrrrrrrrrrrrrrs7 r)>__all__rorrrZ distutils.logrNZdistutils.coreZ distutils.cmdZdistutils.distrT collectionsrZdistutils.errorsrrrZdistutils.utilrZdistutils.versionrZsetuptools.externr r Zsetuptools.extern.six.movesr r r Zsetuptools.dependsrZ setuptoolsrZsetuptools.monkeyrZsetuptools.configrr=Z py36compatr __import__rr#r<rrSrrHrJrRrWrVr`rerfrhrirnrqZcorerrrrrrrs`          G     PK!trr*__pycache__/extension.cpython-36.opt-1.pycnu[3 9f@s|ddlZddlZddlZddlZddlZddlmZddlm Z ddZ e Z e ej j ZGdddeZ Gd d d e ZdS) N)map) get_unpatchedc Cs2d}yt|dgdjdStk r,YnXdS)z0 Return True if Cython can be imported. zCython.Distutils.build_ext build_ext)fromlistTF) __import__r Exception)Z cython_implr /usr/lib/python3.6/extension.py _have_cython sr c@s eZdZdZddZddZdS) Extensionz7Extension that uses '.c' files in place of '.pyx' filescOs(|jdd|_tj|||f||dS)Npy_limited_apiF)popr _Extension__init__)selfnamesourcesargskwr r r r#szExtension.__init__cCsNtr dS|jpd}|jdkr$dnd}tjtjd|}tt||j |_ dS)z Replace sources with .pyx extensions to sources with the target language extension. This mechanism allows language authors to supply pre-converted sources but to prefer the .pyx sources. Nzc++z.cppz.cz.pyx$) r Zlanguagelower functoolspartialresublistrr)rZlangZ target_extrr r r _convert_pyx_sources_to_lang)s  z&Extension._convert_pyx_sources_to_langN)__name__ __module__ __qualname____doc__rrr r r r r sr c@seZdZdZdS)Libraryz=Just like a regular Extension, but built as a library insteadN)rrr r!r r r r r"8sr")rrZdistutils.coreZ distutilsZdistutils.errorsZdistutils.extensionZsetuptools.extern.six.movesrZmonkeyrr Z have_pyrexZcorer rr"r r r r s   PK!trr$__pycache__/extension.cpython-36.pycnu[3 9f@s|ddlZddlZddlZddlZddlZddlmZddlm Z ddZ e Z e ej j ZGdddeZ Gd d d e ZdS) N)map) get_unpatchedc Cs2d}yt|dgdjdStk r,YnXdS)z0 Return True if Cython can be imported. zCython.Distutils.build_ext build_ext)fromlistTF) __import__r Exception)Z cython_implr /usr/lib/python3.6/extension.py _have_cython sr c@s eZdZdZddZddZdS) Extensionz7Extension that uses '.c' files in place of '.pyx' filescOs(|jdd|_tj|||f||dS)Npy_limited_apiF)popr _Extension__init__)selfnamesourcesargskwr r r r#szExtension.__init__cCsNtr dS|jpd}|jdkr$dnd}tjtjd|}tt||j |_ dS)z Replace sources with .pyx extensions to sources with the target language extension. This mechanism allows language authors to supply pre-converted sources but to prefer the .pyx sources. Nzc++z.cppz.cz.pyx$) r Zlanguagelower functoolspartialresublistrr)rZlangZ target_extrr r r _convert_pyx_sources_to_lang)s  z&Extension._convert_pyx_sources_to_langN)__name__ __module__ __qualname____doc__rrr r r r r sr c@seZdZdZdS)Libraryz=Just like a regular Extension, but built as a library insteadN)rrr r!r r r r r"8sr")rrZdistutils.coreZ distutilsZdistutils.errorsZdistutils.extensionZsetuptools.extern.six.movesrZmonkeyrr Z have_pyrexZcorer rr"r r r r s   PK!{&__pycache__/glibc.cpython-36.opt-1.pycnu[3 9fJ @sHddlmZddlZddlZddlZddZddZddZd d ZdS) )absolute_importNc CsPtjd}y |j}Wntk r(dSXtj|_|}t|tsL|jd}|S)z9Returns glibc version string, or None if not using glibc.Nascii) ctypesZCDLLgnu_get_libc_versionAttributeErrorZc_char_pZrestype isinstancestrdecode)Zprocess_namespacer version_strr /usr/lib/python3.6/glibc.pyglibc_version_string s    r cCsHtjd|}|s$tjd|tdSt|jd|koFt|jd|kS)Nz$(?P[0-9]+)\.(?P[0-9]+)z=Expected glibc version with 2 components major.minor, got: %sFmajorminor)rematchwarningswarnRuntimeWarningintgroup)r required_major minimum_minormr r r check_glibc_version$s  rcCst}|dkrdSt|||S)NF)r r)rrr r r r have_compatible_glibc4srcCst}|dkrdSd|fSdS)zTry to determine the glibc version Returns a tuple of strings (lib, version) which default to empty strings in case the lookup fails. NZglibc)rr)r )Z glibc_versionr r r libc_verLsr) Z __future__rrrrr rrrr r r r s PK!{ __pycache__/glibc.cpython-36.pycnu[3 9fJ @sHddlmZddlZddlZddlZddZddZddZd d ZdS) )absolute_importNc CsPtjd}y |j}Wntk r(dSXtj|_|}t|tsL|jd}|S)z9Returns glibc version string, or None if not using glibc.Nascii) ctypesZCDLLgnu_get_libc_versionAttributeErrorZc_char_pZrestype isinstancestrdecode)Zprocess_namespacer version_strr /usr/lib/python3.6/glibc.pyglibc_version_string s    r cCsHtjd|}|s$tjd|tdSt|jd|koFt|jd|kS)Nz$(?P[0-9]+)\.(?P[0-9]+)z=Expected glibc version with 2 components major.minor, got: %sFmajorminor)rematchwarningswarnRuntimeWarningintgroup)r required_major minimum_minormr r r check_glibc_version$s  rcCst}|dkrdSt|||S)NF)r r)rrr r r r have_compatible_glibc4srcCst}|dkrdSd|fSdS)zTry to determine the glibc version Returns a tuple of strings (lib, version) which default to empty strings in case the lookup fails. NZglibc)rr)r )Z glibc_versionr r r libc_verLsr) Z __future__rrrrr rrrr r r r s PK!w݊%__pycache__/glob.cpython-36.opt-1.pycnu[3 9fW@sdZddlZddlZddlZddlmZdddgZdddZdd dZd d Z d d Z ddZ ddZ ddZ ejdZejdZddZddZddZdS)z Filename globbing utility. Mostly a copy of `glob` from Python 3.5. Changes include: * `yield from` and PEP3102 `*` removed. * `bytes` changed to `six.binary_type`. * Hidden files are not ignored. N) binary_typeglobiglobescapeFcCstt||dS)ayReturn a list of paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. ) recursive)listr)pathnamerr /usr/lib/python3.6/glob.pyrs cCs"t||}|rt|rt|}|S)aReturn an iterator which yields the paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. )_iglob _isrecursivenext)rritsr r r r s  ccs tjj|\}}t|sF|r0tjj|rB|Vntjj|rB|VdS|s|rrt|rrx4t||D] }|VqbWnxt||D] }|Vq~WdS||krt|rt ||}n|g}t|r|rt|rt}qt}nt }x0|D](}x"|||D]}tjj ||VqWqWdS)N) ospathsplit has_magiclexistsisdirr glob2glob1r glob0join)rrdirnamebasenamexdirsZ glob_in_dirnamer r r r 2s4        r c CsR|s"t|trtjjd}ntj}ytj|}Wntk rDgSXtj||S)NASCII) isinstancerrcurdirencodelistdirOSErrorfnmatchfilter)rpatternnamesr r r r]s rcCs8|stjj|r4|gSntjjtjj||r4|gSgS)N)rrrrr)rrr r r rjs  rccs*|ddVxt|D] }|VqWdS)Nr) _rlistdir)rr'rr r r rzsrc cs|s"t|trttjd}ntj}ytj|}Wntjk rFdSXxJ|D]B}|V|rjtjj||n|}x t|D]}tjj||VqxWqNWdS)Nr) r rrr!r#errorrrr))rr(rryr r r r)s  r)z([*?[])s([*?[])cCs(t|trtj|}n tj|}|dk S)N)r rmagic_check_bytessearch magic_check)rmatchr r r rs   rcCst|tr|dkS|dkSdS)Ns**z**)r r)r'r r r r s r cCs<tjj|\}}t|tr(tjd|}n tjd|}||S)z#Escape all special characters. s[\1]z[\1])rr splitdriver rr,subr.)rZdriver r r rs   )F)F)__doc__rrer%Zsetuptools.extern.sixr__all__rrr rrrr)compiler.r,rr rr r r r s"    +   PK!tF"__pycache__/glob.cpython-36.pycnu[3 9fW@sdZddlZddlZddlZddlmZdddgZdddZdd dZd d Z d d Z ddZ ddZ ddZ ejdZejdZddZddZddZdS)z Filename globbing utility. Mostly a copy of `glob` from Python 3.5. Changes include: * `yield from` and PEP3102 `*` removed. * `bytes` changed to `six.binary_type`. * Hidden files are not ignored. N) binary_typeglobiglobescapeFcCstt||dS)ayReturn a list of paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. ) recursive)listr)pathnamerr /usr/lib/python3.6/glob.pyrs cCs,t||}|r(t|r(t|}| s(t|S)aReturn an iterator which yields the paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. )_iglob _isrecursivenextAssertionError)rritsr r r r s   ccs tjj|\}}t|sF|r0tjj|rB|Vntjj|rB|VdS|s|rrt|rrx4t||D] }|VqbWnxt||D] }|Vq~WdS||krt|rt ||}n|g}t|r|rt|rt}qt}nt }x0|D](}x"|||D]}tjj ||VqWqWdS)N) ospathsplit has_magiclexistsisdirr glob2glob1r glob0join)rrdirnamebasenamexdirsZ glob_in_dirnamer r r r 2s4        r c CsR|s"t|trtjjd}ntj}ytj|}Wntk rDgSXtj||S)NASCII) isinstancerrcurdirencodelistdirOSErrorfnmatchfilter)rpatternnamesr r r r]s rcCs8|stjj|r4|gSntjjtjj||r4|gSgS)N)rrrrr)rrr r r rjs  rccs6t|s t|ddVxt|D] }|Vq$WdS)Nr)r r _rlistdir)rr(rr r r rzs rc cs|s"t|trttjd}ntj}ytj|}Wntjk rFdSXxJ|D]B}|V|rjtjj||n|}x t|D]}tjj||VqxWqNWdS)Nr ) r!rrr"r$errorrrr*)rr)rryr r r r*s  r*z([*?[])s([*?[])cCs(t|trtj|}n tj|}|dk S)N)r!rmagic_check_bytessearch magic_check)rmatchr r r rs   rcCst|tr|dkS|dkSdS)Ns**z**)r!r)r(r r r r s r cCs<tjj|\}}t|tr(tjd|}n tjd|}||S)z#Escape all special characters. s[\1]z[\1])rr splitdriver!rr-subr/)rZdriver r r rs   )F)F)__doc__rrer&Zsetuptools.extern.sixr__all__rrr rrrr*compiler/r-rr rr r r r s"    +   PK!l'__pycache__/launch.cpython-36.opt-1.pycnu[3 9f@s.dZddlZddlZddZedkr*edS)z[ Launch the Python script on the command line after setuptools is bootstrapped via import. NcCsrttjd}t|ddd}tjddtjdd<ttdt}||j}|jdd}t ||d}t ||dS) zP Run the script in sys.argv[1] as if it had been invoked naturally. __main__N)__file____name____doc__openz\r\nz\nexec) __builtins__sysargvdictgetattrtokenizerreadreplacecompiler)Z script_name namespaceZopen_ZscriptZ norm_scriptcoder/usr/lib/python3.6/launch.pyrun s     rr)rrr rrrrrrs PK!l!__pycache__/launch.cpython-36.pycnu[3 9f@s.dZddlZddlZddZedkr*edS)z[ Launch the Python script on the command line after setuptools is bootstrapped via import. NcCsrttjd}t|ddd}tjddtjdd<ttdt}||j}|jdd}t ||d}t ||dS) zP Run the script in sys.argv[1] as if it had been invoked naturally. __main__N)__file____name____doc__openz\r\nz\nexec) __builtins__sysargvdictgetattrtokenizerreadreplacecompiler)Z script_name namespaceZopen_ZscriptZ norm_scriptcoder/usr/lib/python3.6/launch.pyrun s     rr)rrr rrrrrrs PK!z< < +__pycache__/lib2to3_ex.cpython-36.opt-1.pycnu[3 9f@sXdZddlmZddlmZddlmZmZddl Z GdddeZ Gdd d eZdS) zy Customized Mixin2to3 support: - adds support for converting doctests This module raises an ImportError on Python 2. ) Mixin2to3)log)RefactoringToolget_fixers_from_packageNc@s$eZdZddZddZddZdS)DistutilsRefactoringToolcOstj|f|dS)N)rerror)selfmsgargskwr /usr/lib/python3.6/lib2to3_ex.py log_errorsz"DistutilsRefactoringTool.log_errorcGstj|f|dS)N)rinfo)rr r r r r log_messagesz$DistutilsRefactoringTool.log_messagecGstj|f|dS)N)rdebug)rr r r r r log_debugsz"DistutilsRefactoringTool.log_debugN)__name__ __module__ __qualname__rrrr r r r rsrc@s&eZdZd ddZddZddZdS) rFcCsr|jjdk rdS|sdStjddj||j|j|rbtjrnt |j }|j |dddn t j ||dS)NTzFixing  )writeZ doctests_only) distributionZuse_2to3rrjoin_Mixin2to3__build_fixer_names_Mixin2to3__exclude_fixers setuptoolsZrun_2to3_on_doctestsr fixer_namesZrefactor _Mixin2to3run_2to3)rfilesZdoctestsrr r r rs  zMixin2to3.run_2to3cCsb|jr dSg|_xtjD]}|jjt|qW|jjdk r^x |jjD]}|jjt|qFWdS)N)rrZlib2to3_fixer_packagesextendrrZuse_2to3_fixers)rpr r r Z__build_fixer_names.s  zMixin2to3.__build_fixer_namescCsNt|dg}|jjdk r&|j|jjx"|D]}||jkr,|jj|q,WdS)NZexclude_fixers)getattrrZuse_2to3_exclude_fixersr"rremove)rZexcluded_fixersZ fixer_namer r r Z__exclude_fixers8s     zMixin2to3.__exclude_fixersN)F)rrrrrrr r r r rs  r) __doc__Zdistutils.utilrrZ distutilsrZlib2to3.refactorrrrrr r r r s    PK!z< < %__pycache__/lib2to3_ex.cpython-36.pycnu[3 9f@sXdZddlmZddlmZddlmZmZddl Z GdddeZ Gdd d eZdS) zy Customized Mixin2to3 support: - adds support for converting doctests This module raises an ImportError on Python 2. ) Mixin2to3)log)RefactoringToolget_fixers_from_packageNc@s$eZdZddZddZddZdS)DistutilsRefactoringToolcOstj|f|dS)N)rerror)selfmsgargskwr /usr/lib/python3.6/lib2to3_ex.py log_errorsz"DistutilsRefactoringTool.log_errorcGstj|f|dS)N)rinfo)rr r r r r log_messagesz$DistutilsRefactoringTool.log_messagecGstj|f|dS)N)rdebug)rr r r r r log_debugsz"DistutilsRefactoringTool.log_debugN)__name__ __module__ __qualname__rrrr r r r rsrc@s&eZdZd ddZddZddZdS) rFcCsr|jjdk rdS|sdStjddj||j|j|rbtjrnt |j }|j |dddn t j ||dS)NTzFixing  )writeZ doctests_only) distributionZuse_2to3rrjoin_Mixin2to3__build_fixer_names_Mixin2to3__exclude_fixers setuptoolsZrun_2to3_on_doctestsr fixer_namesZrefactor _Mixin2to3run_2to3)rfilesZdoctestsrr r r rs  zMixin2to3.run_2to3cCsb|jr dSg|_xtjD]}|jjt|qW|jjdk r^x |jjD]}|jjt|qFWdS)N)rrZlib2to3_fixer_packagesextendrrZuse_2to3_fixers)rpr r r Z__build_fixer_names.s  zMixin2to3.__build_fixer_namescCsNt|dg}|jjdk r&|j|jjx"|D]}||jkr,|jj|q,WdS)NZexclude_fixers)getattrrZuse_2to3_exclude_fixersr"rremove)rZexcluded_fixersZ fixer_namer r r Z__exclude_fixers8s     zMixin2to3.__exclude_fixersN)F)rrrrrrr r r r rs  r) __doc__Zdistutils.utilrrZ distutilsrZlib2to3.refactorrrrrr r r r s    PK! Y-'__pycache__/monkey.cpython-36.opt-1.pycnu[3 9f@sdZddlZddlZddlZddlZddlZddlmZddl Z ddl m Z ddl Z gZ ddZddZd d Zd d Zd dZddZddZddZdS)z Monkey patching of distutils. N) import_module)sixcCs"tjdkr|f|jStj|S)am Returns the bases classes for cls sorted by the MRO. Works around an issue on Jython where inspect.getmro will not return all base classes if multiple classes share the same name. Instead, this function will return a tuple containing the class itself, and the contents of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. ZJython)platformZpython_implementation __bases__inspectZgetmro)clsr/usr/lib/python3.6/monkey.py_get_mros  r cCs0t|tjrtnt|tjr tndd}||S)NcSsdS)Nr)itemrrr *szget_unpatched..) isinstancerZ class_typesget_unpatched_classtypes FunctionTypeget_unpatched_function)r lookuprrr get_unpatched&srcCs:ddt|D}t|}|jjds6d|}t||S)zProtect against re-patching the distutils if reloaded Also ensures that no other distutils extension monkeypatched the distutils first. css|]}|jjds|VqdS) setuptoolsN) __module__ startswith).0rrrr 6sz&get_unpatched_class.. distutilsz(distutils has already been patched by %r)r nextrrAssertionError)rZexternal_basesbasemsgrrr r/s  rcCstjtj_tjd k}|r"tjtj_tjd kpxd tjko@dknpxdtjkoZdknpxdtjkotdkn}|rd }|tjj _ t x"tj tjtj fD]}tj j|_qWtjjtj_tjjtj_d tjkrtjjtjd _tdS)N rzhttps://upload.pypi.org/legacy/zdistutils.command.build_ext)rrr)r r!r")rr)rrr!)rr#)rr#r$)rr)rrr)rZCommandrZcoresys version_infofindallZfilelistconfigZ PyPIRCCommandZDEFAULT_REPOSITORY+_patch_distribution_metadata_write_pkg_filedistcmdZ Distribution extensionZ Extensionmodules#patch_for_msvc_specialized_compiler)Zhas_issue_12885Zneeds_warehouseZ warehousemodulerrr patch_allAs&        r0cCstjjtjj_dS)zDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN)rr*Zwrite_pkg_filerZDistributionMetadatarrrr r)jsr)cCs*t||}t|jd|t|||dS)z Patch func_name in target_mod with replacement Important - original must be resolved by name to avoid patching an already patched function. unpatchedN)getattrvars setdefaultsetattr)Z replacementZ target_mod func_nameoriginalrrr patch_funcqs r8cCs t|dS)Nr1)r2) candidaterrr rsrcstdtjdkrdSfdd}tj|d}tj|d}yt|dt|d Wntk rlYnXyt|d Wntk rYnXyt|d Wntk rYnXdS) z\ Patch functions in distutils to use standalone Microsoft Visual C++ compilers. zsetuptools.msvcZWindowsNcsLd|kr dnd}||jd}t|}t|}t||sBt||||fS)zT Prepare the parameters for patch_func to patch indicated function. msvc9Zmsvc9_Zmsvc14__)lstripr2rhasattr ImportError)Zmod_namer6Z repl_prefixZ repl_namereplmod)msvcrr patch_paramss  z9patch_for_msvc_specialized_compiler..patch_paramszdistutils.msvc9compilerzdistutils._msvccompilerZfind_vcvarsallZquery_vcvarsallZ _get_vc_envZgen_lib_options)rrsystem functoolspartialr8r>)rBr:Zmsvc14r)rAr r.s&    r.)__doc__r%Zdistutils.filelistrrrrD importlibrrZsetuptools.externrr__all__r rrr0r)r8rr.rrrr s$   )PK! Y-!__pycache__/monkey.cpython-36.pycnu[3 9f@sdZddlZddlZddlZddlZddlZddlmZddl Z ddl m Z ddl Z gZ ddZddZd d Zd d Zd dZddZddZddZdS)z Monkey patching of distutils. N) import_module)sixcCs"tjdkr|f|jStj|S)am Returns the bases classes for cls sorted by the MRO. Works around an issue on Jython where inspect.getmro will not return all base classes if multiple classes share the same name. Instead, this function will return a tuple containing the class itself, and the contents of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. ZJython)platformZpython_implementation __bases__inspectZgetmro)clsr/usr/lib/python3.6/monkey.py_get_mros  r cCs0t|tjrtnt|tjr tndd}||S)NcSsdS)Nr)itemrrr *szget_unpatched..) isinstancerZ class_typesget_unpatched_classtypes FunctionTypeget_unpatched_function)r lookuprrr get_unpatched&srcCs:ddt|D}t|}|jjds6d|}t||S)zProtect against re-patching the distutils if reloaded Also ensures that no other distutils extension monkeypatched the distutils first. css|]}|jjds|VqdS) setuptoolsN) __module__ startswith).0rrrr 6sz&get_unpatched_class.. distutilsz(distutils has already been patched by %r)r nextrrAssertionError)rZexternal_basesbasemsgrrr r/s  rcCstjtj_tjd k}|r"tjtj_tjd kpxd tjko@dknpxdtjkoZdknpxdtjkotdkn}|rd }|tjj _ t x"tj tjtj fD]}tj j|_qWtjjtj_tjjtj_d tjkrtjjtjd _tdS)N rzhttps://upload.pypi.org/legacy/zdistutils.command.build_ext)rrr)r r!r")rr)rrr!)rr#)rr#r$)rr)rrr)rZCommandrZcoresys version_infofindallZfilelistconfigZ PyPIRCCommandZDEFAULT_REPOSITORY+_patch_distribution_metadata_write_pkg_filedistcmdZ Distribution extensionZ Extensionmodules#patch_for_msvc_specialized_compiler)Zhas_issue_12885Zneeds_warehouseZ warehousemodulerrr patch_allAs&        r0cCstjjtjj_dS)zDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN)rr*Zwrite_pkg_filerZDistributionMetadatarrrr r)jsr)cCs*t||}t|jd|t|||dS)z Patch func_name in target_mod with replacement Important - original must be resolved by name to avoid patching an already patched function. unpatchedN)getattrvars setdefaultsetattr)Z replacementZ target_mod func_nameoriginalrrr patch_funcqs r8cCs t|dS)Nr1)r2) candidaterrr rsrcstdtjdkrdSfdd}tj|d}tj|d}yt|dt|d Wntk rlYnXyt|d Wntk rYnXyt|d Wntk rYnXdS) z\ Patch functions in distutils to use standalone Microsoft Visual C++ compilers. zsetuptools.msvcZWindowsNcsLd|kr dnd}||jd}t|}t|}t||sBt||||fS)zT Prepare the parameters for patch_func to patch indicated function. msvc9Zmsvc9_Zmsvc14__)lstripr2rhasattr ImportError)Zmod_namer6Z repl_prefixZ repl_namereplmod)msvcrr patch_paramss  z9patch_for_msvc_specialized_compiler..patch_paramszdistutils.msvc9compilerzdistutils._msvccompilerZfind_vcvarsallZquery_vcvarsallZ _get_vc_envZgen_lib_options)rrsystem functoolspartialr8r>)rBr:Zmsvc14r)rAr r.s&    r.)__doc__r%Zdistutils.filelistrrrrD importlibrrZsetuptools.externrr__all__r rrr0r)r8rr.rrrr s$   )PK!9%__pycache__/msvc.cpython-36.opt-1.pycnu[3 9f @sdZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ej dkrpddl mZejZnGd d d ZeZeejjfZydd lmZWnek rYnXd d Zd ddZddZddZd!ddZGdddZGdddZGdddZGdddZ dS)"a@ Improved support for Microsoft Visual C++ compilers. Known supported compilers: -------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) N) LegacyVersion) filterfalse) get_unpatchedWindows)winregc@seZdZdZdZdZdZdS)rN)__name__ __module__ __qualname__ HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOTrr/usr/lib/python3.6/msvc.pyr(sr)RegcCsd}|d|f}ytj|d}WnJtk rjy|d|f}tj|d}Wntk rdd}YnXYnX|rtjjjj|d}tjj|r|Stt|S)a+ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone compiler build for Python (VCForPython). Fall back to original behavior when the standalone compiler is not available. Redirect the path of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Parameters ---------- version: float Required Microsoft Visual C++ version. Return ------ vcvarsall.bat path: str z-Software\%sMicrosoft\DevDiv\VCForPython\%0.1f installdirz Wow6432Node\Nz vcvarsall.bat) rZ get_valueKeyErrorospathjoinisfilermsvc9_find_vcvarsall)versionZVC_BASEkey productdir vcvarsallrrrr?s   rx86cOsytt}|||f||Stjjk r2Yntk rDYnXyt||jStjjk r}zt|||WYdd}~XnXdS)a Patched "distutils.msvc9compiler.query_vcvarsall" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Parameters ---------- ver: float Required Microsoft Visual C++ version. arch: str Target architecture. Return ------ environment: dict N) rmsvc9_query_vcvarsall distutilserrorsDistutilsPlatformError ValueErrorEnvironmentInfo return_env_augment_exception)verarchargskwargsZorigexcrrrrjs rcCsny tt|Stjjk r$YnXyt|ddjStjjk rh}zt|dWYdd}~XnXdS)a' Patched "distutils._msvccompiler._get_vc_env" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) Parameters ---------- plat_spec: str Target architecture. Return ------ environment: dict g,@) vc_min_verN)rmsvc14_get_vc_envr r!r"r$r%r&)Z plat_specr+rrrr-s  r-cOsBdtjkr4ddl}t|jtdkr4|jjj||Stt ||S)z Patched "distutils._msvccompiler.gen_lib_options" for fix compatibility between "numpy.distutils" and "distutils._msvccompiler" (for Numpy < 1.11.2) znumpy.distutilsrNz1.11.2) sysmodulesZnumpyr __version__r Z ccompilerZgen_lib_optionsrmsvc14_gen_lib_options)r)r*Znprrrr1s  r1rcCs|jd}d|jks"d|jkrd}|jft}d}|dkrr|jjddkrh|d 7}||d 7}q|d 7}n.|d kr|d 7}||d7}n|dkr|d7}|f|_dS)zl Add details to the exception message to help guide the user as to what action will resolve it. rrzvisual cz0Microsoft Visual C++ {version:0.1f} is required.z-www.microsoft.com/download/details.aspx?id=%dg"@Zia64rz* Get it with "Microsoft Windows SDK 7.0": iB z% Get it from http://aka.ms/vcpython27g$@z* Get it with "Microsoft Windows SDK 7.1": iW g,@zj Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-toolsN)r)lowerformatlocalsfind)r+rr(messageZtmplZ msdownloadrrrr&s   r&c@sbeZdZdZejddjZddZe ddZ dd Z d d Z dd dZ dddZdddZdS) PlatformInfoz Current and Target Architectures informations. Parameters ---------- arch: str Target architecture. Zprocessor_architecturercCs|jjdd|_dS)Nx64amd64)r3replacer()selfr(rrr__init__szPlatformInfo.__init__cCs|j|jjdddS)N_r)r(r6)r<rrr target_cpuszPlatformInfo.target_cpucCs |jdkS)Nr)r?)r<rrr target_is_x86szPlatformInfo.target_is_x86cCs |jdkS)Nr) current_cpu)r<rrrcurrent_is_x86szPlatformInfo.current_is_x86FcCs.|jdkr|rdS|jdkr$|r$dSd|jS)uk Current platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '†' if architecture is x86. x64: bool return 'd' and not 'md64' if architecture is amd64. Return ------ subfolder: str ' arget', or '' (see hidex86 parameter) rrr:z\x64z\%s)rA)r<hidex86r9rrr current_dir szPlatformInfo.current_dircCs.|jdkr|rdS|jdkr$|r$dSd|jS)ar Target platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '\x86' if architecture is x86. x64: bool return '\x64' and not '\amd64' if architecture is amd64. Return ------ subfolder: str '\current', or '' (see hidex86 parameter) rrr:z\x64z\%s)r?)r<rCr9rrr target_dirszPlatformInfo.target_dircCs0|rdn|j}|j|krdS|jjdd|S)ao Cross platform specific subfolder. Parameters ---------- forcex86: bool Use 'x86' as current architecture even if current acritecture is not x86. Return ------ subfolder: str '' if target architecture is current architecture, '\current_target' if not. rr\z\%s_)rAr?rEr;)r<forcex86Zcurrentrrr cross_dir5szPlatformInfo.cross_dirN)FF)FF)F)rr r __doc__safe_envgetr3rAr=propertyr?r@rBrDrErHrrrrr8s   r8c@seZdZdZejejejejfZ ddZ e ddZ e ddZ e dd Ze d d Ze d d Ze ddZe ddZe ddZe ddZdddZddZdS) RegistryInfoz Microsoft Visual Studio related registry informations. Parameters ---------- platform_info: PlatformInfo "PlatformInfo" instance. cCs ||_dS)N)pi)r<Z platform_inforrrr=ZszRegistryInfo.__init__cCsdS)z< Microsoft Visual Studio root registry key. Z VisualStudior)r<rrr visualstudio]szRegistryInfo.visualstudiocCstjj|jdS)z; Microsoft Visual Studio SxS registry key. ZSxS)rrrrO)r<rrrsxsdszRegistryInfo.sxscCstjj|jdS)z8 Microsoft Visual C++ VC7 registry key. ZVC7)rrrrP)r<rrrvckszRegistryInfo.vccCstjj|jdS)z; Microsoft Visual Studio VS7 registry key. ZVS7)rrrrP)r<rrrvsrszRegistryInfo.vscCsdS)z? Microsoft Visual C++ for Python registry key. zDevDiv\VCForPythonr)r<rrr vc_for_pythonyszRegistryInfo.vc_for_pythoncCsdS)z- Microsoft SDK registry key. zMicrosoft SDKsr)r<rrr microsoft_sdkszRegistryInfo.microsoft_sdkcCstjj|jdS)z> Microsoft Windows/Platform SDK registry key. r)rrrrT)r<rrr windows_sdkszRegistryInfo.windows_sdkcCstjj|jdS)z< Microsoft .NET Framework SDK registry key. ZNETFXSDK)rrrrT)r<rrr netfx_sdkszRegistryInfo.netfx_sdkcCsdS)z< Microsoft Windows Kits Roots registry key. zWindows Kits\Installed Rootsr)r<rrrwindows_kits_rootsszRegistryInfo.windows_kits_rootsFcCs(|jjs|rdnd}tjjd|d|S)a  Return key in Microsoft software registry. Parameters ---------- key: str Registry key path where look. x86: str Force x86 software registry. Return ------ str: value rZ Wow6432NodeZSoftwareZ Microsoft)rNrBrrr)r<rrZnode64rrr microsoftszRegistryInfo.microsoftcCstj}tj}|j}x|jD]}y||||d|}WnZttfk r|jjsy||||dd|}Wqttfk rwYqXnwYnXytj ||dSttfk rYqXqWdS)a Look for values in registry in Microsoft software registry. Parameters ---------- key: str Registry key path where look. name: str Value name to find. Return ------ str: value rTN) rKEY_READOpenKeyrXHKEYSOSErrorIOErrorrNrBZ QueryValueEx)r<rnamerYZopenkeymshkeybkeyrrrlookups"   zRegistryInfo.lookupN)F)rr r rIrr r r rr[r=rLrOrPrQrRrSrTrUrVrWrXrbrrrrrMLs"          rMc@s$eZdZdZejddZejddZejdeZd3ddZ d d Z d d Z e d dZ e ddZddZddZe ddZe ddZe ddZe ddZe ddZe dd Ze d!d"Ze d#d$Ze d%d&Ze d'd(Ze d)d*Ze d+d,Ze d-d.Zd/d0Zd4d1d2ZdS)5 SystemInfoz Microsoft Windows and Visual Studio related system inormations. Parameters ---------- registry_info: RegistryInfo "RegistryInfo" instance. vc_ver: float Required Microsoft Visual C++ version. WinDirr ProgramFileszProgramFiles(x86)NcCs"||_|jj|_|p|j|_dS)N)rirN_find_latest_available_vc_vervc_ver)r<Z registry_inforhrrrr=s zSystemInfo.__init__c Cs6y |jdStk r0d}tjj|YnXdS)Nrz%No Microsoft Visual C++ version foundr2)find_available_vc_vers IndexErrorr r!r")r<errrrrrgs  z(SystemInfo._find_latest_available_vc_verc Cs6|jj}|jj|jj|jjf}g}x|jjD]}x|D]}ytj|||dtj}Wnt t fk rpw8YnXtj |\}}} xPt |D]D} y*t tj|| d} | |kr|j| Wqtk rYqXqWxPt |D]D} y(t tj|| } | |kr|j| Wqtk r YqXqWq8Wq.Wt|S)zC Find all available Microsoft Visual C++ versions. r)rfrXrQrSrRr[rrZrYr\r]Z QueryInfoKeyrangefloatZ EnumValueappendr#ZEnumKeysorted) r<r_ZvckeysZvc_versr`rraZsubkeysvaluesr>ir'rrrris2   z!SystemInfo.find_available_vc_verscCs6d|j}tjj|j|}|jj|jjd|jp4|S)z4 Microsoft Visual Studio directory. zMicrosoft Visual Studio %0.1fz%0.1f)rhrrrProgramFilesx86rfrbrR)r<r^defaultrrr VSInstallDir s zSystemInfo.VSInstallDircCs|j|jp|j}tjj|jjd|j}|jj |d}|rNtjj|dn|}|jj |jj d|jpl|}tjj |sd}t j j||S)z1 Microsoft Visual C++ directory. z%0.1frZVCz(Microsoft Visual C++ directory not found)rt _guess_vc_guess_vc_legacyrrrrfrSrhrbrQisdirr r!r")r<guess_vcZreg_pathZ python_vcZ default_vcrmsgrrr VCInstallDirs  zSystemInfo.VCInstallDirc Cs^|jdkrdSd}tjj|j|}ytj|d}tjj||Stttfk rXYnXdS)z* Locate Visual C for 2017 g,@Nz VC\Tools\MSVCrr2) rhrrrrtlistdirr\r]rj)r<rsrxZ vc_exact_verrrrru0s zSystemInfo._guess_vccCsd|j}tjj|j|S)z< Locate Visual C for versions prior to 2017 z Microsoft Visual Studio %0.1f\VC)rhrrrrr)r<rsrrrrv@s zSystemInfo._guess_vc_legacycCsJ|jdkrdS|jdkrdS|jdkr*dS|jd kr8dS|jdkrFdSdS)zN Microsoft Windows SDK versions for specified MSVC++ version. g"@7.06.16.0ag$@7.17.0ag&@8.08.0ag(@8.18.1ag,@10.0N)r|r}r~)rr)rr)rr)rr)rh)r<rrrWindowsSdkVersionGs     zSystemInfo.WindowsSdkVersioncCs|jtjj|jdS)z4 Microsoft Windows SDK last version lib)_use_last_dir_namerrr WindowsSdkDir)r<rrrWindowsSdkLastVersionWs z SystemInfo.WindowsSdkLastVersioncCsTd}x8|jD].}tjj|jjd|}|jj|d}|r Pq W| sRtjj| rtjj|jjd|j }|jj|d}|rtjj|d}| stjj| rxH|jD]>}|d|j d}d |}tjj|j |}tjj|r|}qW| stjj| r:x:|jD]0}d |}tjj|j |}tjj|r|}qW|sPtjj|j d }|S) z2 Microsoft Windows SDK directory. rzv%sinstallationfolderz%0.1frZWinSDKN.zMicrosoft SDKs\Windows Kits\%szMicrosoft SDKs\Windows\v%sZ PlatformSDK) rrrrrfrUrbrwrSrhrfindrerz)r<sdkdirr'locrZ install_baseZintverdrrrr_s6     zSystemInfo.WindowsSdkDirc Cs|jdkrd}d}n&d}|jdkr&dnd}|jjd|d}d ||jd d f}g}|jd krx(|jD]}|tjj|jj ||g7}qdWx,|j D]"}|tjj|jj d ||g7}qWx |D]}|jj |d}|rPqW|S)z= Microsoft Windows SDK executable directory. g&@#r(g(@TF)r9rCzWinSDK-NetFx%dTools%srF-g,@zv%sAr) rhrNrDr;NetFxSdkVersionrrrrfrVrrUrb) r<Znetfxverr(rCZfxZregpathsr'rZexecpathrrrWindowsSDKExecutablePaths$    " z#SystemInfo.WindowsSDKExecutablePathcCs.d|j}tjj|jj|}|jj|dp,dS)z0 Microsoft Visual F# directory. z%0.1f\Setup\F#rr)rhrrrrfrOrb)r<rrrrFSharpInstallDirs zSystemInfo.FSharpInstallDircCsF|jdkrd}nf}x(|D] }|jj|jjd|}|rPqW|pDdS)z8 Microsoft Universal CRT SDK directory. g,@1081z kitsroot%sr)rr)rhrfrbrW)r<Zversr'rrrrUniversalCRTSdkDirs    zSystemInfo.UniversalCRTSdkDircCs|jtjj|jdS)z@ Microsoft Universal C Runtime SDK last version r)rrrrr)r<rrrUniversalCRTSdkLastVersions z%SystemInfo.UniversalCRTSdkLastVersioncCs|jdkrdSfSdS)z8 Microsoft .NET Framework SDK versions. g,@4.6.14.6N)rr)rh)r<rrrrs zSystemInfo.NetFxSdkVersioncCs>x4|jD]*}tjj|jj|}|jj|d}|rPqW|p)sz0SystemInfo._use_last_dir_name..Nr)reversedrr{next)r<rrZ matching_dirsr)rrrrs zSystemInfo._use_last_dir_name)N)r) rr r rIrJrKrdrerrr=rgrirLrtrzrurvrrrrrrrrrrrrrrrrrrrrcs4         &     rcc@sReZdZdZd=ddZeddZedd Zed d Zed d Z eddZ eddZ eddZ eddZ eddZeddZddZeddZeddZed d!Zed"d#Zed$d%Zed&d'Zed(d)Zed*d+Zed,d-Zed.d/Zed0d1Zed2d3Zed4d5Zd>d7d8Zd9d:Zd?d;d<Z dS)@r$aY Return environment variables for specified Microsoft Visual C++ version and platform : Lib, Include, Path and libpath. This function is compatible with Microsoft Visual C++ 9.0 to 14.0. Script created by analysing Microsoft environment configuration files like "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... Parameters ---------- arch: str Target architecture. vc_ver: float Required Microsoft Visual C++ version. If not set, autodetect the last version. vc_min_ver: float Minimum Microsoft Visual C++ version. NrcCsBt||_t|j|_t|j||_|j|kr>d}tjj |dS)Nz.No suitable Microsoft Visual C++ version found) r8rNrMrfrcsirhr r!r")r<r(rhr,rkrrrr=Is    zEnvironmentInfo.__init__cCs|jjS)z/ Microsoft Visual C++ version. )rrh)r<rrrrhRszEnvironmentInfo.vc_vercsVddg}jdkrDjjddd}|dg7}|dg7}|d|g7}fd d |DS) z/ Microsoft Visual Studio Tools z Common7\IDEz Common7\Toolsg,@T)rCr9z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance ToolszTeam Tools\Performance Tools%scsg|]}tjjjj|qSr)rrrrrt)rr)r<rr fsz+EnvironmentInfo.VSTools..)rhrNrD)r<paths arch_subdirr)r<rVSToolsYs   zEnvironmentInfo.VSToolscCs$tjj|jjdtjj|jjdgS)zL Microsoft Visual C++ & Microsoft Foundation Class Includes ZIncludezATLMFC\Include)rrrrrz)r<rrr VCIncludeshszEnvironmentInfo.VCIncludescsbjdkrjjdd}njjdd}d|d|g}jdkrP|d|g7}fd d |DS) zM Microsoft Visual C++ & Microsoft Foundation Class Libraries g.@T)r9)rCzLib%sz ATLMFC\Lib%sg,@z Lib\store%scsg|]}tjjjj|qSr)rrrrrz)rr)r<rrr~sz/EnvironmentInfo.VCLibraries..)rhrNrE)r<rrr)r<r VCLibrariesps  zEnvironmentInfo.VCLibrariescCs"|jdkrgStjj|jjdgS)zA Microsoft Visual C++ store references Libraries g,@zLib\store\references)rhrrrrrz)r<rrr VCStoreRefss zEnvironmentInfo.VCStoreRefscCs|j}tjj|jdg}|jdkr&dnd}|jj|}|rT|tjj|jd|g7}|jdkrd|jjdd}|tjj|j|g7}n|jdkr|jj rd nd }|tjj|j||jj dd g7}|jj |jj kr|tjj|j||jjdd g7}n|tjj|jd g7}|S) z, Microsoft Visual C++ Tools Z VCPackagesg$@TFzBin%sg,@)rCg.@z bin\HostX86%sz bin\HostX64%s)r9Bin) rrrrrzrhrNrHrDrBrErAr?)r<rtoolsrGrrZhost_dirrrrVCToolss&   zEnvironmentInfo.VCToolscCst|jdkr2|jjddd}tjj|jjd|gS|jjdd}tjj|jjd}|j}tjj|d||fgSdS) z1 Microsoft Windows SDK Libraries g$@T)rCr9zLib%s)r9rz%sum%sN) rhrNrErrrrr _sdk_subdir)r<rrZlibverrrr OSLibrariess zEnvironmentInfo.OSLibrariescCs|tjj|jjd}|jdkr.|tjj|dgS|jdkr@|j}nd}tjj|d|tjj|d|tjj|d|gSd S) z/ Microsoft Windows SDK Include includeg$@Zglg,@rz%ssharedz%sumz%swinrtN)rrrrrrhr)r<rsdkverrrr OSIncludess  zEnvironmentInfo.OSIncludescCstjj|jjd}g}|jdkr*||j7}|jdkrH|tjj|dg7}|jdkr||tjj|jjdtjj|ddtjj|d dtjj|d dtjj|jjd d d |jdddg7}|S)z7 Microsoft Windows SDK Libraries Paths Z Referencesg"@g&@zCommonConfiguration\Neutralg,@Z UnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractZ ExtensionSDKszMicrosoft.VCLibsz%0.1fZCommonConfigurationZneutral)rrrrrrhr)r<reflibpathrrr OSLibpaths>     zEnvironmentInfo.OSLibpathcCs t|jS)z- Microsoft Windows SDK Tools )list _sdk_tools)r<rrrSdkToolsszEnvironmentInfo.SdkToolsccs|jdkr0|jdkrdnd}tjj|jj|V|jjsd|jjdd}d|}tjj|jj|V|jdksx|jdkr|jj rd }n|jjddd }d |}tjj|jj|VnL|jdkrtjj|jjd}|jjdd}|jj }tjj|d ||fV|jj r|jj Vd S)z= Microsoft Windows SDK Tools paths generator g.@g&@rzBin\x86T)r9zBin%sg$@r)rCr9zBin\NETFX 4.0 Tools%sz%s%sN) rhrrrrrrNrBrDr@rr)r<Zbin_dirrrrrrrrs(     zEnvironmentInfo._sdk_toolscCs|jj}|rd|SdS)z6 Microsoft Windows SDK version subdir z%s\r)rr)r<ucrtverrrrrszEnvironmentInfo._sdk_subdircCs"|jdkrgStjj|jjdgS)z- Microsoft Windows SDK Setup g"@ZSetup)rhrrrrr)r<rrrSdkSetup%s zEnvironmentInfo.SdkSetupcs|j}|j|jdkr0d}|j o,|j }n$|jp>|j}|jdkpR|jdk}g}|rt|fddjD7}|r|fddjD7}|S)z0 Microsoft .NET Framework Tools g$@Tr:csg|]}tjjj|qSr)rrrr)rr')rrrr@sz+EnvironmentInfo.FxTools..csg|]}tjjj|qSr)rrrr)rr')rrrrCs) rNrrhr@rBrAr?rr)r<rNZ include32Z include64rr)rrFxTools/s     zEnvironmentInfo.FxToolscCs>|jdks|jj rgS|jjdd}tjj|jjd|gS)z8 Microsoft .Net Framework SDK Libraries g,@T)r9zlib\um%s)rhrrrNrErrr)r<rrrrNetFxSDKLibrariesGsz!EnvironmentInfo.NetFxSDKLibrariescCs,|jdks|jj rgStjj|jjdgS)z7 Microsoft .Net Framework SDK Includes g,@z include\um)rhrrrrr)r<rrrNetFxSDKIncludesRsz EnvironmentInfo.NetFxSDKIncludescCstjj|jjdgS)z> Microsoft Visual Studio Team System Database z VSTSDB\Deploy)rrrrrt)r<rrrVsTDb\szEnvironmentInfo.VsTDbcCs~|jdkrgS|jdkr0|jj}|jjdd}n |jj}d}d|j|f}tjj||g}|jdkrz|tjj||dg7}|S)z( Microsoft Build Engine g(@g.@T)rCrzMSBuild\%0.1f\bin%sZRoslyn) rhrrrrNrDrtrrr)r< base_pathrrZbuildrrrMSBuildcs   zEnvironmentInfo.MSBuildcCs"|jdkrgStjj|jjdgS)z. Microsoft HTML Help Workshop g&@zHTML Help Workshop)rhrrrrrr)r<rrrHTMLHelpWorkshopzs z EnvironmentInfo.HTMLHelpWorkshopcCsL|jdkrgS|jjdd}tjj|jjd}|j}tjj|d||fgS)z= Microsoft Universal C Runtime SDK Libraries g,@T)r9rz%sucrt%s) rhrNrErrrrr _ucrt_subdir)r<rrrrrr UCRTLibrariess  zEnvironmentInfo.UCRTLibrariescCs6|jdkrgStjj|jjd}tjj|d|jgS)z; Microsoft Universal C Runtime SDK Include g,@rz%sucrt)rhrrrrrr)r<rrrr UCRTIncludess zEnvironmentInfo.UCRTIncludescCs|jj}|rd|SdS)zB Microsoft Universal C Runtime SDK version subdir z%s\r)rr)r<rrrrrszEnvironmentInfo._ucrt_subdircCs |jdkr|jdkrgS|jjS)z% Microsoft Visual F# g&@g(@)rhrr)r<rrrFSharpszEnvironmentInfo.FSharpcCsl|jjdd}|jdkr&|jj}d}n|jjjdd}d}|jdkrHdn|j}|||j|f}tjj||S) zA Microsoft Visual C++ runtime redistribuable dll T)r9z-redist%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllz\Toolsz\Redistz.onecore%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllg,@) rNrErhrrzr;rrr)r<rZ redist_pathZ vcruntimeZdll_verrrrVCRuntimeRedists zEnvironmentInfo.VCRuntimeRedistTcCst|jd|j|j|j|jg||jd|j|j|j|j |j g||jd|j|j|j |j g||jd|j |j|j|j|j|j|j|j|jg |d}|jdkrtjj|jr|j|d<|S)z Return environment dict. Parameters ---------- exists: bool It True, only return existing paths. rrrr)rrrrZpy_vcruntime_redist)dict _build_pathsrrrrrrrrrrrrrrrrrrrrhrrrr)r<existsenvrrrr%sD   zEnvironmentInfo.return_envc Csxtjj|}tj|djtj}tj||}|rBtt tj j |n|}|sbd|j }t jj||j|} tjj| S)a Given an environment variable name and specified paths, return a pathsep-separated string of paths containing unique, extant, directories from those paths and from the environment variable. Raise an error if no paths are resolved. rz %s environment variable is empty) itertoolschain from_iterablerJrKsplitrpathseprfilterrrwupperr r!r"_unique_everseenr) r<r^Zspec_path_listsrZ spec_pathsZ env_pathsrZ extant_pathsryZ unique_pathsrrrrs     zEnvironmentInfo._build_pathsccsjt}|j}|dkr:xPt|j|D]}|||Vq"Wn,x*|D]"}||}||kr@|||Vq@WdS)z List unique elements, preserving order. Remember all elements ever seen. _unique_everseen('AAAABBBCCDAABBB') --> A B C D _unique_everseen('ABBCcAD', str.lower) --> A B C D N)setaddr __contains__)r<iterablerseenZseen_addelementkrrrrs   z EnvironmentInfo._unique_everseen)Nr)T)N)!rr r rIr=rLrhrrrrrrrrrrrrrrrrrrrrrrrr%rrrrrrr$1s:       -        -r$)r)r)!rIrr.platformrZdistutils.errorsr Z#setuptools.extern.packaging.versionrZsetuptools.extern.six.movesrZmonkeyrsystemrenvironrJr ImportErrorr!r"Z_msvc9_suppress_errorsZdistutils.msvc9compilerrrrr-r1r&r8rMrcr$rrrrs>      + /& %[bPK!9__pycache__/msvc.cpython-36.pycnu[3 9f @sdZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ej dkrpddl mZejZnGd d d ZeZeejjfZydd lmZWnek rYnXd d Zd ddZddZddZd!ddZGdddZGdddZGdddZGdddZ dS)"a@ Improved support for Microsoft Visual C++ compilers. Known supported compilers: -------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) N) LegacyVersion) filterfalse) get_unpatchedWindows)winregc@seZdZdZdZdZdZdS)rN)__name__ __module__ __qualname__ HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOTrr/usr/lib/python3.6/msvc.pyr(sr)RegcCsd}|d|f}ytj|d}WnJtk rjy|d|f}tj|d}Wntk rdd}YnXYnX|rtjjjj|d}tjj|r|Stt|S)a+ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone compiler build for Python (VCForPython). Fall back to original behavior when the standalone compiler is not available. Redirect the path of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Parameters ---------- version: float Required Microsoft Visual C++ version. Return ------ vcvarsall.bat path: str z-Software\%sMicrosoft\DevDiv\VCForPython\%0.1f installdirz Wow6432Node\Nz vcvarsall.bat) rZ get_valueKeyErrorospathjoinisfilermsvc9_find_vcvarsall)versionZVC_BASEkey productdir vcvarsallrrrr?s   rx86cOsytt}|||f||Stjjk r2Yntk rDYnXyt||jStjjk r}zt|||WYdd}~XnXdS)a Patched "distutils.msvc9compiler.query_vcvarsall" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Parameters ---------- ver: float Required Microsoft Visual C++ version. arch: str Target architecture. Return ------ environment: dict N) rmsvc9_query_vcvarsall distutilserrorsDistutilsPlatformError ValueErrorEnvironmentInfo return_env_augment_exception)verarchargskwargsZorigexcrrrrjs rcCsny tt|Stjjk r$YnXyt|ddjStjjk rh}zt|dWYdd}~XnXdS)a' Patched "distutils._msvccompiler._get_vc_env" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) Parameters ---------- plat_spec: str Target architecture. Return ------ environment: dict g,@) vc_min_verN)rmsvc14_get_vc_envr r!r"r$r%r&)Z plat_specr+rrrr-s  r-cOsBdtjkr4ddl}t|jtdkr4|jjj||Stt ||S)z Patched "distutils._msvccompiler.gen_lib_options" for fix compatibility between "numpy.distutils" and "distutils._msvccompiler" (for Numpy < 1.11.2) znumpy.distutilsrNz1.11.2) sysmodulesZnumpyr __version__r Z ccompilerZgen_lib_optionsrmsvc14_gen_lib_options)r)r*Znprrrr1s  r1rcCs|jd}d|jks"d|jkrd}|jft}d}|dkrr|jjddkrh|d 7}||d 7}q|d 7}n.|d kr|d 7}||d7}n|dkr|d7}|f|_dS)zl Add details to the exception message to help guide the user as to what action will resolve it. rrzvisual cz0Microsoft Visual C++ {version:0.1f} is required.z-www.microsoft.com/download/details.aspx?id=%dg"@Zia64rz* Get it with "Microsoft Windows SDK 7.0": iB z% Get it from http://aka.ms/vcpython27g$@z* Get it with "Microsoft Windows SDK 7.1": iW g,@zj Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-toolsN)r)lowerformatlocalsfind)r+rr(messageZtmplZ msdownloadrrrr&s   r&c@sbeZdZdZejddjZddZe ddZ dd Z d d Z dd dZ dddZdddZdS) PlatformInfoz Current and Target Architectures informations. Parameters ---------- arch: str Target architecture. Zprocessor_architecturercCs|jjdd|_dS)Nx64amd64)r3replacer()selfr(rrr__init__szPlatformInfo.__init__cCs|j|jjdddS)N_r)r(r6)r<rrr target_cpuszPlatformInfo.target_cpucCs |jdkS)Nr)r?)r<rrr target_is_x86szPlatformInfo.target_is_x86cCs |jdkS)Nr) current_cpu)r<rrrcurrent_is_x86szPlatformInfo.current_is_x86FcCs.|jdkr|rdS|jdkr$|r$dSd|jS)uk Current platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '†' if architecture is x86. x64: bool return 'd' and not 'md64' if architecture is amd64. Return ------ subfolder: str ' arget', or '' (see hidex86 parameter) rrr:z\x64z\%s)rA)r<hidex86r9rrr current_dir szPlatformInfo.current_dircCs.|jdkr|rdS|jdkr$|r$dSd|jS)ar Target platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '\x86' if architecture is x86. x64: bool return '\x64' and not '\amd64' if architecture is amd64. Return ------ subfolder: str '\current', or '' (see hidex86 parameter) rrr:z\x64z\%s)r?)r<rCr9rrr target_dirszPlatformInfo.target_dircCs0|rdn|j}|j|krdS|jjdd|S)ao Cross platform specific subfolder. Parameters ---------- forcex86: bool Use 'x86' as current architecture even if current acritecture is not x86. Return ------ subfolder: str '' if target architecture is current architecture, '\current_target' if not. rr\z\%s_)rAr?rEr;)r<forcex86Zcurrentrrr cross_dir5szPlatformInfo.cross_dirN)FF)FF)F)rr r __doc__safe_envgetr3rAr=propertyr?r@rBrDrErHrrrrr8s   r8c@seZdZdZejejejejfZ ddZ e ddZ e ddZ e dd Ze d d Ze d d Ze ddZe ddZe ddZe ddZdddZddZdS) RegistryInfoz Microsoft Visual Studio related registry informations. Parameters ---------- platform_info: PlatformInfo "PlatformInfo" instance. cCs ||_dS)N)pi)r<Z platform_inforrrr=ZszRegistryInfo.__init__cCsdS)z< Microsoft Visual Studio root registry key. Z VisualStudior)r<rrr visualstudio]szRegistryInfo.visualstudiocCstjj|jdS)z; Microsoft Visual Studio SxS registry key. ZSxS)rrrrO)r<rrrsxsdszRegistryInfo.sxscCstjj|jdS)z8 Microsoft Visual C++ VC7 registry key. ZVC7)rrrrP)r<rrrvckszRegistryInfo.vccCstjj|jdS)z; Microsoft Visual Studio VS7 registry key. ZVS7)rrrrP)r<rrrvsrszRegistryInfo.vscCsdS)z? Microsoft Visual C++ for Python registry key. zDevDiv\VCForPythonr)r<rrr vc_for_pythonyszRegistryInfo.vc_for_pythoncCsdS)z- Microsoft SDK registry key. zMicrosoft SDKsr)r<rrr microsoft_sdkszRegistryInfo.microsoft_sdkcCstjj|jdS)z> Microsoft Windows/Platform SDK registry key. r)rrrrT)r<rrr windows_sdkszRegistryInfo.windows_sdkcCstjj|jdS)z< Microsoft .NET Framework SDK registry key. ZNETFXSDK)rrrrT)r<rrr netfx_sdkszRegistryInfo.netfx_sdkcCsdS)z< Microsoft Windows Kits Roots registry key. zWindows Kits\Installed Rootsr)r<rrrwindows_kits_rootsszRegistryInfo.windows_kits_rootsFcCs(|jjs|rdnd}tjjd|d|S)a  Return key in Microsoft software registry. Parameters ---------- key: str Registry key path where look. x86: str Force x86 software registry. Return ------ str: value rZ Wow6432NodeZSoftwareZ Microsoft)rNrBrrr)r<rrZnode64rrr microsoftszRegistryInfo.microsoftcCstj}tj}|j}x|jD]}y||||d|}WnZttfk r|jjsy||||dd|}Wqttfk rwYqXnwYnXytj ||dSttfk rYqXqWdS)a Look for values in registry in Microsoft software registry. Parameters ---------- key: str Registry key path where look. name: str Value name to find. Return ------ str: value rTN) rKEY_READOpenKeyrXHKEYSOSErrorIOErrorrNrBZ QueryValueEx)r<rnamerYZopenkeymshkeybkeyrrrlookups"   zRegistryInfo.lookupN)F)rr r rIrr r r rr[r=rLrOrPrQrRrSrTrUrVrWrXrbrrrrrMLs"          rMc@s$eZdZdZejddZejddZejdeZd3ddZ d d Z d d Z e d dZ e ddZddZddZe ddZe ddZe ddZe ddZe ddZe dd Ze d!d"Ze d#d$Ze d%d&Ze d'd(Ze d)d*Ze d+d,Ze d-d.Zd/d0Zd4d1d2ZdS)5 SystemInfoz Microsoft Windows and Visual Studio related system inormations. Parameters ---------- registry_info: RegistryInfo "RegistryInfo" instance. vc_ver: float Required Microsoft Visual C++ version. WinDirr ProgramFileszProgramFiles(x86)NcCs"||_|jj|_|p|j|_dS)N)rirN_find_latest_available_vc_vervc_ver)r<Z registry_inforhrrrr=s zSystemInfo.__init__c Cs6y |jdStk r0d}tjj|YnXdS)Nrz%No Microsoft Visual C++ version foundr2)find_available_vc_vers IndexErrorr r!r")r<errrrrrgs  z(SystemInfo._find_latest_available_vc_verc Cs6|jj}|jj|jj|jjf}g}x|jjD]}x|D]}ytj|||dtj}Wnt t fk rpw8YnXtj |\}}} xPt |D]D} y*t tj|| d} | |kr|j| Wqtk rYqXqWxPt |D]D} y(t tj|| } | |kr|j| Wqtk r YqXqWq8Wq.Wt|S)zC Find all available Microsoft Visual C++ versions. r)rfrXrQrSrRr[rrZrYr\r]Z QueryInfoKeyrangefloatZ EnumValueappendr#ZEnumKeysorted) r<r_ZvckeysZvc_versr`rraZsubkeysvaluesr>ir'rrrris2   z!SystemInfo.find_available_vc_verscCs6d|j}tjj|j|}|jj|jjd|jp4|S)z4 Microsoft Visual Studio directory. zMicrosoft Visual Studio %0.1fz%0.1f)rhrrrProgramFilesx86rfrbrR)r<r^defaultrrr VSInstallDir s zSystemInfo.VSInstallDircCs|j|jp|j}tjj|jjd|j}|jj |d}|rNtjj|dn|}|jj |jj d|jpl|}tjj |sd}t j j||S)z1 Microsoft Visual C++ directory. z%0.1frZVCz(Microsoft Visual C++ directory not found)rt _guess_vc_guess_vc_legacyrrrrfrSrhrbrQisdirr r!r")r<guess_vcZreg_pathZ python_vcZ default_vcrmsgrrr VCInstallDirs  zSystemInfo.VCInstallDirc Cs^|jdkrdSd}tjj|j|}ytj|d}tjj||Stttfk rXYnXdS)z* Locate Visual C for 2017 g,@Nz VC\Tools\MSVCrr2) rhrrrrtlistdirr\r]rj)r<rsrxZ vc_exact_verrrrru0s zSystemInfo._guess_vccCsd|j}tjj|j|S)z< Locate Visual C for versions prior to 2017 z Microsoft Visual Studio %0.1f\VC)rhrrrrr)r<rsrrrrv@s zSystemInfo._guess_vc_legacycCsJ|jdkrdS|jdkrdS|jdkr*dS|jd kr8dS|jdkrFdSdS)zN Microsoft Windows SDK versions for specified MSVC++ version. g"@7.06.16.0ag$@7.17.0ag&@8.08.0ag(@8.18.1ag,@10.0N)r|r}r~)rr)rr)rr)rr)rh)r<rrrWindowsSdkVersionGs     zSystemInfo.WindowsSdkVersioncCs|jtjj|jdS)z4 Microsoft Windows SDK last version lib)_use_last_dir_namerrr WindowsSdkDir)r<rrrWindowsSdkLastVersionWs z SystemInfo.WindowsSdkLastVersioncCsTd}x8|jD].}tjj|jjd|}|jj|d}|r Pq W| sRtjj| rtjj|jjd|j }|jj|d}|rtjj|d}| stjj| rxH|jD]>}|d|j d}d |}tjj|j |}tjj|r|}qW| stjj| r:x:|jD]0}d |}tjj|j |}tjj|r|}qW|sPtjj|j d }|S) z2 Microsoft Windows SDK directory. rzv%sinstallationfolderz%0.1frZWinSDKN.zMicrosoft SDKs\Windows Kits\%szMicrosoft SDKs\Windows\v%sZ PlatformSDK) rrrrrfrUrbrwrSrhrfindrerz)r<sdkdirr'locrZ install_baseZintverdrrrr_s6     zSystemInfo.WindowsSdkDirc Cs|jdkrd}d}n&d}|jdkr&dnd}|jjd|d}d ||jd d f}g}|jd krx(|jD]}|tjj|jj ||g7}qdWx,|j D]"}|tjj|jj d ||g7}qWx |D]}|jj |d}|rPqW|S)z= Microsoft Windows SDK executable directory. g&@#r(g(@TF)r9rCzWinSDK-NetFx%dTools%srF-g,@zv%sAr) rhrNrDr;NetFxSdkVersionrrrrfrVrrUrb) r<Znetfxverr(rCZfxZregpathsr'rZexecpathrrrWindowsSDKExecutablePaths$    " z#SystemInfo.WindowsSDKExecutablePathcCs.d|j}tjj|jj|}|jj|dp,dS)z0 Microsoft Visual F# directory. z%0.1f\Setup\F#rr)rhrrrrfrOrb)r<rrrrFSharpInstallDirs zSystemInfo.FSharpInstallDircCsF|jdkrd}nf}x(|D] }|jj|jjd|}|rPqW|pDdS)z8 Microsoft Universal CRT SDK directory. g,@1081z kitsroot%sr)rr)rhrfrbrW)r<Zversr'rrrrUniversalCRTSdkDirs    zSystemInfo.UniversalCRTSdkDircCs|jtjj|jdS)z@ Microsoft Universal C Runtime SDK last version r)rrrrr)r<rrrUniversalCRTSdkLastVersions z%SystemInfo.UniversalCRTSdkLastVersioncCs|jdkrdSfSdS)z8 Microsoft .NET Framework SDK versions. g,@4.6.14.6N)rr)rh)r<rrrrs zSystemInfo.NetFxSdkVersioncCs>x4|jD]*}tjj|jj|}|jj|d}|rPqW|p)sz0SystemInfo._use_last_dir_name..Nr)reversedrr{next)r<rrZ matching_dirsr)rrrrs zSystemInfo._use_last_dir_name)N)r) rr r rIrJrKrdrerrr=rgrirLrtrzrurvrrrrrrrrrrrrrrrrrrrrcs4         &     rcc@sReZdZdZd=ddZeddZedd Zed d Zed d Z eddZ eddZ eddZ eddZ eddZeddZddZeddZeddZed d!Zed"d#Zed$d%Zed&d'Zed(d)Zed*d+Zed,d-Zed.d/Zed0d1Zed2d3Zed4d5Zd>d7d8Zd9d:Zd?d;d<Z dS)@r$aY Return environment variables for specified Microsoft Visual C++ version and platform : Lib, Include, Path and libpath. This function is compatible with Microsoft Visual C++ 9.0 to 14.0. Script created by analysing Microsoft environment configuration files like "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... Parameters ---------- arch: str Target architecture. vc_ver: float Required Microsoft Visual C++ version. If not set, autodetect the last version. vc_min_ver: float Minimum Microsoft Visual C++ version. NrcCsBt||_t|j|_t|j||_|j|kr>d}tjj |dS)Nz.No suitable Microsoft Visual C++ version found) r8rNrMrfrcsirhr r!r")r<r(rhr,rkrrrr=Is    zEnvironmentInfo.__init__cCs|jjS)z/ Microsoft Visual C++ version. )rrh)r<rrrrhRszEnvironmentInfo.vc_vercsVddg}jdkrDjjddd}|dg7}|dg7}|d|g7}fd d |DS) z/ Microsoft Visual Studio Tools z Common7\IDEz Common7\Toolsg,@T)rCr9z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance ToolszTeam Tools\Performance Tools%scsg|]}tjjjj|qSr)rrrrrt)rr)r<rr fsz+EnvironmentInfo.VSTools..)rhrNrD)r<paths arch_subdirr)r<rVSToolsYs   zEnvironmentInfo.VSToolscCs$tjj|jjdtjj|jjdgS)zL Microsoft Visual C++ & Microsoft Foundation Class Includes ZIncludezATLMFC\Include)rrrrrz)r<rrr VCIncludeshszEnvironmentInfo.VCIncludescsbjdkrjjdd}njjdd}d|d|g}jdkrP|d|g7}fd d |DS) zM Microsoft Visual C++ & Microsoft Foundation Class Libraries g.@T)r9)rCzLib%sz ATLMFC\Lib%sg,@z Lib\store%scsg|]}tjjjj|qSr)rrrrrz)rr)r<rrr~sz/EnvironmentInfo.VCLibraries..)rhrNrE)r<rrr)r<r VCLibrariesps  zEnvironmentInfo.VCLibrariescCs"|jdkrgStjj|jjdgS)zA Microsoft Visual C++ store references Libraries g,@zLib\store\references)rhrrrrrz)r<rrr VCStoreRefss zEnvironmentInfo.VCStoreRefscCs|j}tjj|jdg}|jdkr&dnd}|jj|}|rT|tjj|jd|g7}|jdkrd|jjdd}|tjj|j|g7}n|jdkr|jj rd nd }|tjj|j||jj dd g7}|jj |jj kr|tjj|j||jjdd g7}n|tjj|jd g7}|S) z, Microsoft Visual C++ Tools Z VCPackagesg$@TFzBin%sg,@)rCg.@z bin\HostX86%sz bin\HostX64%s)r9Bin) rrrrrzrhrNrHrDrBrErAr?)r<rtoolsrGrrZhost_dirrrrVCToolss&   zEnvironmentInfo.VCToolscCst|jdkr2|jjddd}tjj|jjd|gS|jjdd}tjj|jjd}|j}tjj|d||fgSdS) z1 Microsoft Windows SDK Libraries g$@T)rCr9zLib%s)r9rz%sum%sN) rhrNrErrrrr _sdk_subdir)r<rrZlibverrrr OSLibrariess zEnvironmentInfo.OSLibrariescCs|tjj|jjd}|jdkr.|tjj|dgS|jdkr@|j}nd}tjj|d|tjj|d|tjj|d|gSd S) z/ Microsoft Windows SDK Include includeg$@Zglg,@rz%ssharedz%sumz%swinrtN)rrrrrrhr)r<rsdkverrrr OSIncludess  zEnvironmentInfo.OSIncludescCstjj|jjd}g}|jdkr*||j7}|jdkrH|tjj|dg7}|jdkr||tjj|jjdtjj|ddtjj|d dtjj|d dtjj|jjd d d |jdddg7}|S)z7 Microsoft Windows SDK Libraries Paths Z Referencesg"@g&@zCommonConfiguration\Neutralg,@Z UnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractZ ExtensionSDKszMicrosoft.VCLibsz%0.1fZCommonConfigurationZneutral)rrrrrrhr)r<reflibpathrrr OSLibpaths>     zEnvironmentInfo.OSLibpathcCs t|jS)z- Microsoft Windows SDK Tools )list _sdk_tools)r<rrrSdkToolsszEnvironmentInfo.SdkToolsccs|jdkr0|jdkrdnd}tjj|jj|V|jjsd|jjdd}d|}tjj|jj|V|jdksx|jdkr|jj rd }n|jjddd }d |}tjj|jj|VnL|jdkrtjj|jjd}|jjdd}|jj }tjj|d ||fV|jj r|jj Vd S)z= Microsoft Windows SDK Tools paths generator g.@g&@rzBin\x86T)r9zBin%sg$@r)rCr9zBin\NETFX 4.0 Tools%sz%s%sN) rhrrrrrrNrBrDr@rr)r<Zbin_dirrrrrrrrs(     zEnvironmentInfo._sdk_toolscCs|jj}|rd|SdS)z6 Microsoft Windows SDK version subdir z%s\r)rr)r<ucrtverrrrrszEnvironmentInfo._sdk_subdircCs"|jdkrgStjj|jjdgS)z- Microsoft Windows SDK Setup g"@ZSetup)rhrrrrr)r<rrrSdkSetup%s zEnvironmentInfo.SdkSetupcs|j}|j|jdkr0d}|j o,|j }n$|jp>|j}|jdkpR|jdk}g}|rt|fddjD7}|r|fddjD7}|S)z0 Microsoft .NET Framework Tools g$@Tr:csg|]}tjjj|qSr)rrrr)rr')rrrr@sz+EnvironmentInfo.FxTools..csg|]}tjjj|qSr)rrrr)rr')rrrrCs) rNrrhr@rBrAr?rr)r<rNZ include32Z include64rr)rrFxTools/s     zEnvironmentInfo.FxToolscCs>|jdks|jj rgS|jjdd}tjj|jjd|gS)z8 Microsoft .Net Framework SDK Libraries g,@T)r9zlib\um%s)rhrrrNrErrr)r<rrrrNetFxSDKLibrariesGsz!EnvironmentInfo.NetFxSDKLibrariescCs,|jdks|jj rgStjj|jjdgS)z7 Microsoft .Net Framework SDK Includes g,@z include\um)rhrrrrr)r<rrrNetFxSDKIncludesRsz EnvironmentInfo.NetFxSDKIncludescCstjj|jjdgS)z> Microsoft Visual Studio Team System Database z VSTSDB\Deploy)rrrrrt)r<rrrVsTDb\szEnvironmentInfo.VsTDbcCs~|jdkrgS|jdkr0|jj}|jjdd}n |jj}d}d|j|f}tjj||g}|jdkrz|tjj||dg7}|S)z( Microsoft Build Engine g(@g.@T)rCrzMSBuild\%0.1f\bin%sZRoslyn) rhrrrrNrDrtrrr)r< base_pathrrZbuildrrrMSBuildcs   zEnvironmentInfo.MSBuildcCs"|jdkrgStjj|jjdgS)z. Microsoft HTML Help Workshop g&@zHTML Help Workshop)rhrrrrrr)r<rrrHTMLHelpWorkshopzs z EnvironmentInfo.HTMLHelpWorkshopcCsL|jdkrgS|jjdd}tjj|jjd}|j}tjj|d||fgS)z= Microsoft Universal C Runtime SDK Libraries g,@T)r9rz%sucrt%s) rhrNrErrrrr _ucrt_subdir)r<rrrrrr UCRTLibrariess  zEnvironmentInfo.UCRTLibrariescCs6|jdkrgStjj|jjd}tjj|d|jgS)z; Microsoft Universal C Runtime SDK Include g,@rz%sucrt)rhrrrrrr)r<rrrr UCRTIncludess zEnvironmentInfo.UCRTIncludescCs|jj}|rd|SdS)zB Microsoft Universal C Runtime SDK version subdir z%s\r)rr)r<rrrrrszEnvironmentInfo._ucrt_subdircCs |jdkr|jdkrgS|jjS)z% Microsoft Visual F# g&@g(@)rhrr)r<rrrFSharpszEnvironmentInfo.FSharpcCsl|jjdd}|jdkr&|jj}d}n|jjjdd}d}|jdkrHdn|j}|||j|f}tjj||S) zA Microsoft Visual C++ runtime redistribuable dll T)r9z-redist%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllz\Toolsz\Redistz.onecore%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllg,@) rNrErhrrzr;rrr)r<rZ redist_pathZ vcruntimeZdll_verrrrVCRuntimeRedists zEnvironmentInfo.VCRuntimeRedistTcCst|jd|j|j|j|jg||jd|j|j|j|j |j g||jd|j|j|j |j g||jd|j |j|j|j|j|j|j|j|jg |d}|jdkrtjj|jr|j|d<|S)z Return environment dict. Parameters ---------- exists: bool It True, only return existing paths. rrrr)rrrrZpy_vcruntime_redist)dict _build_pathsrrrrrrrrrrrrrrrrrrrrhrrrr)r<existsenvrrrr%sD   zEnvironmentInfo.return_envc Csxtjj|}tj|djtj}tj||}|rBtt tj j |n|}|sbd|j }t jj||j|} tjj| S)a Given an environment variable name and specified paths, return a pathsep-separated string of paths containing unique, extant, directories from those paths and from the environment variable. Raise an error if no paths are resolved. rz %s environment variable is empty) itertoolschain from_iterablerJrKsplitrpathseprfilterrrwupperr r!r"_unique_everseenr) r<r^Zspec_path_listsrZ spec_pathsZ env_pathsrZ extant_pathsryZ unique_pathsrrrrs     zEnvironmentInfo._build_pathsccsjt}|j}|dkr:xPt|j|D]}|||Vq"Wn,x*|D]"}||}||kr@|||Vq@WdS)z List unique elements, preserving order. Remember all elements ever seen. _unique_everseen('AAAABBBCCDAABBB') --> A B C D _unique_everseen('ABBCcAD', str.lower) --> A B C D N)setaddr __contains__)r<iterablerseenZseen_addelementkrrrrs   z EnvironmentInfo._unique_everseen)Nr)T)N)!rr r rIr=rLrhrrrrrrrrrrrrrrrrrrrrrrrr%rrrrrrr$1s:       -        -r$)r)r)!rIrr.platformrZdistutils.errorsr Z#setuptools.extern.packaging.versionrZsetuptools.extern.six.movesrZmonkeyrsystemrenvironrJr ImportErrorr!r"Z_msvc9_suppress_errorsZdistutils.msvc9compilerrrrr-r1r&r8rMrcr$rrrrs>      + /& %[bPK!++__pycache__/namespaces.cpython-36.opt-1.pycnu[3 9f @sRddlZddlmZddlZddlmZejjZGdddZ Gddde Z dS)N)log)mapc @sTeZdZdZddZddZddZdZdZddZ ddZ ddZ e ddZ dS) Installerz -nspkg.pthc Cs|j}|sdStjj|j\}}||j7}|jj|tj d|t |j |}|j rdt |dSt|d}|j|WdQRXdS)Nz Installing %sZwt)_get_all_ns_packagesospathsplitext _get_target nspkg_extZoutputsappendrinfor_gen_nspkg_lineZdry_runlistopen writelines)selfZnspfilenameextlinesfr /usr/lib/python3.6/namespaces.pyinstall_namespacess     zInstaller.install_namespacescCsHtjj|j\}}||j7}tjj|s.dStjd|tj|dS)Nz Removing %s) rrrr r existsrr remove)rrrrrruninstall_namespaces!s    zInstaller.uninstall_namespacescCs|jS)N)target)rrrrr )szInstaller._get_targetimport sys, types, os#has_mfs = sys.version_info > (3, 5)$p = os.path.join(%(root)s, *%(pth)r)4importlib = has_mfs and __import__('importlib.util')-has_mfs and __import__('importlib.machinery')m = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))Cm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))7mp = (m or []) and m.__dict__.setdefault('__path__',[])(p not in mp) and mp.append(p)4m and setattr(sys.modules[%(parent)r], %(child)r, m)cCsdS)Nz$sys._getframe(1).f_locals['sitedir']r)rrrr _get_rootCszInstaller._get_rootcCsVt|}t|jd}|j}|j}|jd\}}}|rB||j7}dj|tdS)N.; ) strtuplesplitr' _nspkg_tmpl rpartition_nspkg_tmpl_multijoinlocals)rpkgZpthrootZ tmpl_linesparentsepZchildrrrr Fs zInstaller._gen_nspkg_linecCs |jjp g}ttt|j|S)z,Return sorted list of all package namespaces)Z distributionZnamespace_packagessortedflattenr _pkg_names)rZpkgsrrrrQs zInstaller._get_all_ns_packagesccs,|jd}x|r&dj|V|jq WdS)z Given a namespace package, yield the components of that package. >>> names = Installer._pkg_names('a.b.c') >>> set(names) == set(['a', 'a.b', 'a.b.c']) True r(N)r-r1pop)r3partsrrrr9Vs  zInstaller._pkg_namesN) rrrr r!r"r#r$r%)r&)__name__ __module__ __qualname__r rrr r.r0r'r r staticmethodr9rrrrr s$ rc@seZdZddZddZdS)DevelopInstallercCstt|jS)N)reprr+Zegg_path)rrrrr'gszDevelopInstaller._get_rootcCs|jS)N)Zegg_link)rrrrr jszDevelopInstaller._get_targetN)r<r=r>r'r rrrrr@fsr@) rZ distutilsr itertoolsZsetuptools.extern.six.movesrchain from_iterabler8rr@rrrrs   [PK!+%__pycache__/namespaces.cpython-36.pycnu[3 9f @sRddlZddlmZddlZddlmZejjZGdddZ Gddde Z dS)N)log)mapc @sTeZdZdZddZddZddZdZdZddZ ddZ ddZ e ddZ dS) Installerz -nspkg.pthc Cs|j}|sdStjj|j\}}||j7}|jj|tj d|t |j |}|j rdt |dSt|d}|j|WdQRXdS)Nz Installing %sZwt)_get_all_ns_packagesospathsplitext _get_target nspkg_extZoutputsappendrinfor_gen_nspkg_lineZdry_runlistopen writelines)selfZnspfilenameextlinesfr /usr/lib/python3.6/namespaces.pyinstall_namespacess     zInstaller.install_namespacescCsHtjj|j\}}||j7}tjj|s.dStjd|tj|dS)Nz Removing %s) rrrr r existsrr remove)rrrrrruninstall_namespaces!s    zInstaller.uninstall_namespacescCs|jS)N)target)rrrrr )szInstaller._get_targetimport sys, types, os#has_mfs = sys.version_info > (3, 5)$p = os.path.join(%(root)s, *%(pth)r)4importlib = has_mfs and __import__('importlib.util')-has_mfs and __import__('importlib.machinery')m = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))Cm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))7mp = (m or []) and m.__dict__.setdefault('__path__',[])(p not in mp) and mp.append(p)4m and setattr(sys.modules[%(parent)r], %(child)r, m)cCsdS)Nz$sys._getframe(1).f_locals['sitedir']r)rrrr _get_rootCszInstaller._get_rootcCsVt|}t|jd}|j}|j}|jd\}}}|rB||j7}dj|tdS)N.; ) strtuplesplitr' _nspkg_tmpl rpartition_nspkg_tmpl_multijoinlocals)rpkgZpthrootZ tmpl_linesparentsepZchildrrrr Fs zInstaller._gen_nspkg_linecCs |jjp g}ttt|j|S)z,Return sorted list of all package namespaces)Z distributionZnamespace_packagessortedflattenr _pkg_names)rZpkgsrrrrQs zInstaller._get_all_ns_packagesccs,|jd}x|r&dj|V|jq WdS)z Given a namespace package, yield the components of that package. >>> names = Installer._pkg_names('a.b.c') >>> set(names) == set(['a', 'a.b', 'a.b.c']) True r(N)r-r1pop)r3partsrrrr9Vs  zInstaller._pkg_namesN) rrrr r!r"r#r$r%)r&)__name__ __module__ __qualname__r rrr r.r0r'r r staticmethodr9rrrrr s$ rc@seZdZddZddZdS)DevelopInstallercCstt|jS)N)reprr+Zegg_path)rrrrr'gszDevelopInstaller._get_rootcCs|jS)N)Zegg_link)rrrrr jszDevelopInstaller._get_targetN)r<r=r>r'r rrrrr@fsr@) rZ distutilsr itertoolsZsetuptools.extern.six.movesrchain from_iterabler8rr@rrrrs   [PK!ҲVP}}.__pycache__/package_index.cpython-36.opt-1.pycnu[3 9fŜ@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!ddlm"Z"ddl#m$Z$dd l%m&Z&dd l'm(Z(dd l)m*Z*dd l+m,Z,dd l-m.Z.ej/dZ0ej/dej1Z2ej/dZ3ej/dej1j4Z5dj6Z7ddddgZ8dZ9dZ:e:j;ejddZ?ddZ@dEd dZAdFd!d"ZBdGd#d$ZCdedfd%dZDdHd&d'ZEd(d)ZFej/d*ej1ZGeFd+d,ZHGd-d.d.eIZJGd/d0d0eJZKGd1ddeZLej/d2jMZNd3d4ZOd5d6ZPdId7d8ZQd9d:ZRGd;d<dd>ejTZUejVjWfd?d@ZXeQe9eXZXdAdBZYdCdDZZdS)Jz#PyPI and direct package downloadingN)wraps)six)urllib http_client configparsermap) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST) ssl_support)log)DistutilsError) translate)get_all_headers)unescape)Wheelz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+) \s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namezsz(interpret_distro_name..r9Nr7) py_versionrHrV)r?anyrangerTr join)rPrUrMr^rHrVrAr\r&r&r'rs  $ccsnt}|j}|dkr>xTtjj|j|D]}|||Vq&Wn,x*|D]"}||}||krD|||VqDWdS)zHList unique elements, preserving order. Remember all elements ever seen.N)setaddrZmoves filterfalse __contains__)iterablekeyseenZseen_addelementkr&r&r'unique_everseens  rkcstfdd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cst||S)N)rk)argskwargs)funcr&r'wrapperszunique_values..wrapper)r)rnror&)rnr' unique_valuessrpz3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>ccsxvtj|D]h}|j\}}tttj|jjd}d|ksFd|kr x,t j|D]}t j j |t |jdVqRWq WxHdD]@}|j|}|d kr~t j||}|r~t j j |t |jdVq~WdS) zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,Zhomepager8r7 Home PageDownload URLN)rrrsr;)RELfinditergroupsrbrstrstripr0r?HREFrr#urljoin htmldecoderLfindsearch)r@pagerKtagZrelZrelsposr&r&r'find_external_linkss "   rc@s(eZdZdZddZddZddZdS) ContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr&)selfblockr&r&r'feedszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr&)rr&r&r'is_validszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr&)rreportertemplater&r&r'reportszContentChecker.reportN)__name__ __module__ __qualname____doc__rrrr&r&r&r'rsrc@sBeZdZejdZddZeddZddZ dd Z d d Z d S) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_tj||_||_dS)N) hash_namehashlibnewhashexpected)rrrr&r&r'__init__s zHashChecker.__init__cCs>tjj|d}|stS|jj|}|s0tS|f|jS)z5Construct a (possibly null) ContentChecker from a URLr7r;)rr#r=rpatternr} groupdict)clsr@rFrKr&r&r'from_urls zHashChecker.from_urlcCs|jj|dS)N)rupdate)rrr&r&r'rszHashChecker.feedcCs|jj|jkS)N)rZ hexdigestr)rr&r&r'r!szHashChecker.is_validcCs||j}||S)N)r)rrrmsgr&r&r'r$s zHashChecker.reportN) rrrrZcompilerr classmethodrrrrr&r&r&r'rs rcs<eZdZdZdKddZdLd d ZdMd d ZdNd dZddZddZ ddZ ddZ dOddZ ddZ dPfdd ZddZdd Zd!d"Zd#d$Zd%d&ZdQd'd(ZdRd)d*Zd+d,Zd-Zd.d/Zd0d1ZdSd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@dAZ"dBdCZ#dDdEZ$dFdGZ%dHdIZ&Z'S)Urz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTcOstj|f|||dd|jd |_i|_i|_i|_tjdj t t |j |_ g|_|ortjor|prtj}|rtj||_n tjj|_dS)Nr6|)r rr1 index_url scanned_urls fetched_urls package_pagesrZrrarrrKallowsto_scanrZ is_availableZfind_ca_bundleZ opener_foropenerrrequesturlopen)rrZhostsZ ca_bundleZ verify_sslrlkwZuse_sslr&r&r'r,s zPackageIndex.__init__Fc Cs||jkr| rdSd|j|<t|s4|j|dStt|}|r^|j|sRdS|jd||sr| sr||jkrtt|j |dS|j|sd|j|<dS|j d|d|j|<d}|j |||}|dkrdSd|j|j <d|j jddjkr|jdS|j }|j}t|tsRt|tjjr4d }n|j jd pDd }|j|d }|jx6tj|D](} tjj|t| jd } |j| qfW|j |j!rt"|d ddkr|j#||}dS)z.)filterrWrDrr itertoolsstarmap scan_egg_link)rZ search_pathdirsZ egg_linksr&r&r'scan_egg_linksszPackageIndex.scan_egg_linksc Csttjj||}ttdttj|}WdQRXt |dkrDdS|\}}x>t tjj||D](}tjj|f||_ t |_ |j|q`WdS)Nr9)openrWrDrarrrrwrxrTrrPr rHrc)rrDrZ raw_lineslinesZegg_pathZ setup_pathrNr&r&r'rs  zPackageIndex.scan_egg_linkc sfdd}xHtj|D]:}y |tjj|t|jdWqtk rPYqXqW||\}}|rxXt||D]J}t |\}} |j dr| r|r|d||f7}n j |j |qrWt jdd|SdSd S) z#Process the contents of a PyPI pagecs|jjrtttjj|tjdjd}t|dkrd|dkrt |d}t |d}dj j |j i|<t|t|fSdS)Nr6r9r:r7rT)NN)r2rrrrr#r>rTr?rrr setdefaultr0r)rrApkgver)rr&r'scans "  z(PackageIndex.process_index..scanr7z.pyz #egg=%s-%scSsd|jdddS)Nz%sr7r!r9)rL)mr&r&r'sz,PackageIndex.process_index..rN)ryrurr#rzr{rLr$rrGr1need_version_infoscan_urlPYPI_MD5sub) rr@r~rrKrrnew_urlr4fragr&)rr'rs$       zPackageIndex.process_indexcCs|jd|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_all)rr@r&r&r'rszPackageIndex.need_version_infocGs:|j|jkr*|r |j|f||jd|j|jdS)Nz6Scanning index of all packages (this may take a while))rrrrr)rrrlr&r&r'rs  zPackageIndex.scan_allcCs~|j|j|jd|jj|js:|j|j|jd|jj|jsR|j|x&t|jj|jfD]}|j|qhWdS)Nr6) rr unsafe_namerrrgrQnot_found_in_indexr)r requirementr@r&r&r' find_packagess zPackageIndex.find_packagescsR|j|j|x,||jD]}||kr.|S|jd||qWtt|j||S)Nz%s does not match %s)prescanrrgrsuperrobtain)rrZ installerrN) __class__r&r'rs zPackageIndex.obtaincCsL|j|jd||jsH|jtj|td|jjtj j |fdS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) rrrrrWunlinkrrr3rDrU)rcheckerrXtfpr&r&r' check_hashs  zPackageIndex.check_hashcCsTxN|D]F}|jdks4t| s4|jds4tt|r@|j|q|jj|qWdS)z;Add `urls` to the list that will be prescanned for searchesNzfile:)rrr2rrrappend)rZurlsr@r&r&r'add_find_links s      zPackageIndex.add_find_linkscCs"|jrtt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrrr)rr&r&r'rszPackageIndex.prescancCs<||jr|jd}}n |jd}}|||j|jdS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rgrrrr)rrmethrr&r&r'r"s   zPackageIndex.not_found_in_indexcCs~t|tsjt|}|rR|j|jd||}t|\}}|jdrN|j|||}|Stj j |rb|St |}t |j ||ddS)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r7z.pyrPN)rrr _download_urlrLrGr1 gen_setuprWrDrr(rfetch_distribution)rr%tmpdirrBfoundr4rFr&r&r'r8,s    zPackageIndex.downloadc sjd|id}d fdd }|rHjj|||}| r`|dk r`|||}|dkrjdk rzj||}|dkr| rj|||}|dkrˆjdrdpd|njd||j|jd SdS) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNcs|dkr }x||jD]t}|jtkrJ rJ|krjd|d|<q||ko`|jtkp` }|rj|j}||_tj j |jr|SqWdS)Nz&Skipping development or system egg: %sr7) rgrHrrr r8rPdownload_locationrWrDr)ZreqenvrNZtestloc) develop_okrskippedsourcerr&r'r|fs z-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rP)N)rrrrrcloner) rrr force_scanrrZ local_indexrNr|r&)rrrrrr'rNs0       zPackageIndex.fetch_distributioncCs"|j||||}|dk r|jSdS)a3Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)rrP)rrrrrrNr&r&r'fetchszPackageIndex.fetchc Cstj|}|r*ddt||jddDp,g}t|dkrtjj|}tjj||krtjj ||}ddl m }|||st j |||}ttjj |dd2} | jd|dj|djtjj|dfWdQRX|S|rtd ||fntd dS) NcSsg|]}|jr|qSr&)rR)r[dr&r&r' sz*PackageIndex.gen_setup..r7r)samefilezsetup.pywzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) zCan't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rJrKrrLrTrWrDrUdirnameraZsetuptools.command.easy_installrshutilZcopy2rwriterQrRsplitextr) rrXrFrrKrrUdstrrr&r&r'rs2       zPackageIndex.gen_setupi c Cs|jd|d}ztj|}|j|}t|tjjrJtd||j |j f|j}d}|j }d}d|krt |d} t tt| }|j|||||t|dZ} xD|j|} | r|j| | j| |d7}|j|||||qPqW|j||| WdQRX|S|r|jXdS) NzDownloading %szCan't download %s: %s %srr7zcontent-lengthzContent-Lengthwbr;)rrrrrrrrrrr dl_blocksizermaxrint reporthookrrrr rr) rr@rXfprrblocknumZbssizeZsizesrrr&r&r' _download_tos:        zPackageIndex._download_tocCsdS)Nr&)rr@rXrZblksizerr&r&r'rszPackageIndex.reporthookcCs|jdrt|Sy t||jSttjfk r}z>djdd|jD}|r^|j ||nt d||fWYdd}~Xnt j j k r}z|Sd}~Xnt j jk r}z,|r|j ||jnt d||jfWYdd}~Xntjk r8}z.|r|j ||jnt d||jfWYdd}~XnPtjtj fk r}z*|rf|j ||nt d||fWYdd}~XnXdS)Nzfile: cSsg|] }t|qSr&)rw)r[argr&r&r'rsz)PackageIndex.open_url..z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r2 local_openopen_with_authrr$r InvalidURLrarlrrrrrZURLErrorreasonZ BadStatusLinelineZ HTTPExceptionsocket)rr@Zwarningvrr&r&r'rs6  "zPackageIndex.open_urlcCst|\}}|r4x&d|kr0|jddjdd}qWnd}|jdrN|dd}tjj||}|dksn|jd rz|j||S|d ks|jd r|j||S|jd r|j ||S|d krt j j t j j|dS|j|d|j||SdS)Nz...\_Z__downloaded__z.egg.zipr,svnzsvn+gitzgit+zhg+rr9Tr/)rGreplacer1rWrDrar2 _download_svn _download_git _download_hgrr url2pathnamer#r=r_attempt_download)rrBr@rr3rFrXr&r&r'rs$         zPackageIndex._download_urlcCs|j|ddS)NT)r)rr@r&r&r'r9szPackageIndex.scan_urlcCs6|j||}d|jddjkr.|j|||S|SdS)Nrz content-typer)rrr0_download_html)rr@rXrr&r&r'r(<s zPackageIndex._attempt_downloadcCslt|}x@|D]8}|jrtjd|rD|jtj||j||SPqW|jtj|td|dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r���rx���rZ���r}���r���rW���r���r$��r���)r���r@���r���rX���r���r��r&���r&���r'���r)��C��s����     zPackageIndex._download_htmlc�������������C���s��|j�ddd�}g�}|j�jdrd|krtjj|\}}}}}} | �r|jdrd|dd��kr|dd��j�dd\}}tjj|\} } | rd | kr| j�d d\} } d | �d | �g}n d | �g}| }|||||| f}tjj|}|�jd ||�t j d dg|�d||g��|S�)Nr:���r7���r���zsvn:@z//r6���r9���:z --username=z --password=z'Doing subversion checkout from %s to %sr!��checkoutz-q) r?���r0���r2���r���r#���r=��� splituser urlunparser��� subprocess check_call)r���r@���rX���ZcredsrB���netlocrD���r\���qr���authhostuserZpwrA���r&���r&���r'���r$��R��s$����   zPackageIndex._download_svnc�������������C���sp���t�jj|�\}}}}}|jddd�}|jddd�}d�}d|krR|jdd\}}t�jj||||df}�|�|fS�)N+r7���r:���r���r*��r���r;���)r���r#���Zurlsplitr?���rsplitZ urlunsplit)r@��� pop_prefixrB���r1��rD���rE���r���revr&���r&���r'���_vcs_split_rev_from_urlg��s����z$PackageIndex._vcs_split_rev_from_urlc�������������C���sr���|j�ddd�}|�j|dd\}}|�jd||�tjddd ||g�|d�k rn|�jd |�tjdd |d d |g�|S�) Nr:���r7���r���T)r8��zDoing git clone from %s to %sr"��r���z--quietzChecking out %sz-Cr,��)r?���r:��r���r/��r0��)r���r@���rX���r9��r&���r&���r'���r%��y��s���� zPackageIndex._download_gitc���������� ���C���sv���|j�ddd�}|�j|dd\}}|�jd||�tjddd ||g�|d�k rr|�jd |�tjdd |d d d|dg�|S�)Nr:���r7���r���T)r8��zDoing hg clone from %s to %sZhgr���z--quietzUpdating to %sz--cwdZupz-Cz-rz-q)r?���r:��r���r/��r0��)r���r@���rX���r9��r&���r&���r'���r&����s���� zPackageIndex._download_hgc�������������G���s���t�j|f|��d�S�)N)r���r���)r���r���rl���r&���r&���r'���r�����s����zPackageIndex.debugc�������������G���s���t�j|f|��d�S�)N)r���r���)r���r���rl���r&���r&���r'���r�����s����zPackageIndex.infoc�������������G���s���t�j|f|��d�S�)N)r���r���)r���r���rl���r&���r&���r'���r�����s����zPackageIndex.warnr���)r���r;��NT)F)F)F)N)N)FFFN)FF)N)F)(r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r8���r���r��r���r ��r��r��r���r���r���r(��r)��r$�� staticmethodr:��r%��r&��r���r���r��� __classcell__r&���r&���)r���r'���r���)��sL����  3   +   #� J )$ #   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�������������C���s���|�j�d}t|S�)Nr7���)rL���r���)rK���Zwhatr&���r&���r'��� decode_entity��s���� r>��c�������������C���s ���t�t|�S�)z'Decode HTML entities in the given text.) entity_subr>��)textr&���r&���r'���r{�����s����r{���c����������������s����fdd}|S�)Nc����������������s����fdd}|S�)Nc����������� ������s.���t�j�}t�j�z �|�|S�t�j|�X�d�S�)N)r��ZgetdefaulttimeoutZsetdefaulttimeout)rl���rm���Z old_timeout)rn���timeoutr&���r'���_socket_timeout��s ����  z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr&���)rn���rB��)rA��)rn���r'���rB����s����z'socket_timeout.<locals>._socket_timeoutr&���)rA��rB��r&���)rA��r'���socket_timeout��s���� rC��c�������������C���s2���t�jj|�}|j�}tj|}|j�}|jddS�)aq�� A function compatible with Python 2.3-3.3 that will encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False  r���)r���r#���r>���encodebase64Z encodestringr���r#��)r3��Zauth_sZ auth_bytesZ encoded_bytesZencodedr&���r&���r'��� _encode_auth��s ����  rG��c���������������@���s(���e�Zd�ZdZdd�Zdd�Zdd�ZdS�) Credentialz: A username/password pair. Use like a namedtuple. c�������������C���s���||�_�||�_d�S�)N)usernamepassword)r���rI��rJ��r&���r&���r'���r�����s����zCredential.__init__c�������������c���s���|�j�V��|�jV��d�S�)N)rI��rJ��)r���r&���r&���r'���__iter__��s����zCredential.__iter__c�������������C���s ���dt�|��S�)Nz%(username)s:%(password)s)vars)r���r&���r&���r'���__str__��s����zCredential.__str__N)r���r���r���r���r���rK��rM��r&���r&���r&���r'���rH����s���rH��c���������������@���s0���e�Zd�Zdd�Zedd�Zdd�Zdd�Zd S�) PyPIConfigc�������������C���sP���t�jdddgd}tjj|�|�tjjtjjdd}tjj |rL|�j |�dS�)z% Load from ~/.pypirc rI��rJ�� repositoryr���~z.pypircN) dictfromkeysr���RawConfigParserr���rW���rD���ra��� expanduserr���r���)r���ZdefaultsZrcr&���r&���r'���r�����s ���� zPyPIConfig.__init__c����������������s&����fdd�j��D�}tt�j|S�)Nc����������������s ���g�|�]}�j�|d�j�r|qS�)rO��)r���rx���)r[���section)r���r&���r'���r����s����z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)ZsectionsrQ��r���_get_repo_cred)r���Zsections_with_repositoriesr&���)r���r'���creds_by_repository��s����zPyPIConfig.creds_by_repositoryc�������������C���s6���|�j�|dj�}|t|�j�|dj�|�j�|dj�fS�)NrO��rI��rJ��)r���rx���rH��)r���rU��Zrepor&���r&���r'���rV����s����zPyPIConfig._get_repo_credc�������������C���s*���x$|�j�j�D�]\}}|j|r |S�q W�dS�)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)rW��itemsr2���)r���r@���rO��credr&���r&���r'���find_credential��s���� zPyPIConfig.find_credentialN)r���r���r���r���propertyrW��rV��rZ��r&���r&���r&���r'���rN����s��� rN��c�������������C���s:��t�jj|�\}}}}}}|jdr,tjd|d krFt�jj|\}} nd}|s~t�j|�} | r~t | }| j |�f} t j d | ��|rdt |�}|| ||||f} t�jj| } t�jj| }|jd|�n t�jj|�}|jd t�||}|r6t�jj|j\}}}}}}||kr6|| kr6||||||f} t�jj| |_|S�) z4Open a urllib2 request, handling HTTP authenticationr+��znonnumeric port: ''httphttpsN*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)r\��r]��)r^��)r���r#���r=���r1���r���r��r-��rN��rZ��rw���rI��r���r���rG��r.��r���ZRequestZ add_header user_agentr@���)r@���r���rB���r1��rD���ZparamsrE���r���r3��r4��rY��r���rA���r���r���r��s2Zh2Zpath2Zparam2Zquery2Zfrag2r&���r&���r'���r�� ��s6����         r��c�������������C���s���|�S�)Nr&���)r@���r&���r&���r'��� fix_sf_url:��s����ra��c���������� ���C���s��t�jj|�\}}}}}}t�jj|}tjj|r<t�jj|�S�|j drtjj |rg�}xtj |D�]b} tjj || } | dkrt | d} | j�} W�dQ�R�X�P�ntjj | r| d7�} |jdj| d�qbW�d} | j|�dj |d } d\}}n d\}}} ddi}tj| }t�jj|�||||S�)z7Read a local path, with special support for directoriesr6���z index.htmlrNz<a href="{name}">{name}</a>)r3���zB<html><head><title>{url}{files}rD)r@filesOKPath not found Not foundz content-typez text/html)rdre)rfrgrh)rr#r=rr'rWrDisfilerr1rrrarrrformatrStringIOrr)r@rBrCrDZparamrErrXrcrfilepathrZbodyrZstatusmessagerZ body_streamr&r&r'r>s,        r)N)N)N)N)r )[rr/sysrWrZrrrFrr functoolsrZsetuptools.externrZsetuptools.extern.six.movesrrrrr"Z pkg_resourcesrr r r r r rrrrrrrrZ distutilsrZdistutils.errorsrZfnmatchrZsetuptools.py27compatrZsetuptools.py33compatrZsetuptools.wheelrrrJIryrrKrr?rS__all__Z_SOCKET_TIMEOUTZ_tmplrjrRr_r(rrGrrIrYrrkrprtrobjectrrrrr?r>r{rCrGrHrSrNrrrrarr&r&r&r's|  <           !  "   !z  &. PK!ҲVP}}(__pycache__/package_index.cpython-36.pycnu[3 9fŜ@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!ddlm"Z"ddl#m$Z$dd l%m&Z&dd l'm(Z(dd l)m*Z*dd l+m,Z,dd l-m.Z.ej/dZ0ej/dej1Z2ej/dZ3ej/dej1j4Z5dj6Z7ddddgZ8dZ9dZ:e:j;ejddZ?ddZ@dEd dZAdFd!d"ZBdGd#d$ZCdedfd%dZDdHd&d'ZEd(d)ZFej/d*ej1ZGeFd+d,ZHGd-d.d.eIZJGd/d0d0eJZKGd1ddeZLej/d2jMZNd3d4ZOd5d6ZPdId7d8ZQd9d:ZRGd;d<dd>ejTZUejVjWfd?d@ZXeQe9eXZXdAdBZYdCdDZZdS)Jz#PyPI and direct package downloadingN)wraps)six)urllib http_client configparsermap) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST) ssl_support)log)DistutilsError) translate)get_all_headers)unescape)Wheelz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+) \s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namezsz(interpret_distro_name..r9Nr7) py_versionrHrV)r?anyrangerTr join)rPrUrMr^rHrVrAr\r&r&r'rs  $ccsnt}|j}|dkr>xTtjj|j|D]}|||Vq&Wn,x*|D]"}||}||krD|||VqDWdS)zHList unique elements, preserving order. Remember all elements ever seen.N)setaddrZmoves filterfalse __contains__)iterablekeyseenZseen_addelementkr&r&r'unique_everseens  rkcstfdd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cst||S)N)rk)argskwargs)funcr&r'wrapperszunique_values..wrapper)r)rnror&)rnr' unique_valuessrpz3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>ccsxvtj|D]h}|j\}}tttj|jjd}d|ksFd|kr x,t j|D]}t j j |t |jdVqRWq WxHdD]@}|j|}|d kr~t j||}|r~t j j |t |jdVq~WdS) zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,Zhomepager8r7 Home PageDownload URLN)rrrsr;)RELfinditergroupsrbrstrstripr0r?HREFrr#urljoin htmldecoderLfindsearch)r@pagerKtagZrelZrelsposr&r&r'find_external_linkss "   rc@s(eZdZdZddZddZddZdS) ContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr&)selfblockr&r&r'feedszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr&)rr&r&r'is_validszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr&)rreportertemplater&r&r'reportszContentChecker.reportN)__name__ __module__ __qualname____doc__rrrr&r&r&r'rsrc@sBeZdZejdZddZeddZddZ dd Z d d Z d S) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_tj||_||_dS)N) hash_namehashlibnewhashexpected)rrrr&r&r'__init__s zHashChecker.__init__cCs>tjj|d}|stS|jj|}|s0tS|f|jS)z5Construct a (possibly null) ContentChecker from a URLr7r;)rr#r=rpatternr} groupdict)clsr@rFrKr&r&r'from_urls zHashChecker.from_urlcCs|jj|dS)N)rupdate)rrr&r&r'rszHashChecker.feedcCs|jj|jkS)N)rZ hexdigestr)rr&r&r'r!szHashChecker.is_validcCs||j}||S)N)r)rrrmsgr&r&r'r$s zHashChecker.reportN) rrrrZcompilerr classmethodrrrrr&r&r&r'rs rcs<eZdZdZdKddZdLd d ZdMd d ZdNd dZddZddZ ddZ ddZ dOddZ ddZ dPfdd ZddZdd Zd!d"Zd#d$Zd%d&ZdQd'd(ZdRd)d*Zd+d,Zd-Zd.d/Zd0d1ZdSd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@dAZ"dBdCZ#dDdEZ$dFdGZ%dHdIZ&Z'S)Urz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTcOstj|f|||dd|jd |_i|_i|_i|_tjdj t t |j |_ g|_|ortjor|prtj}|rtj||_n tjj|_dS)Nr6|)r rr1 index_url scanned_urls fetched_urls package_pagesrZrrarrrKallowsto_scanrZ is_availableZfind_ca_bundleZ opener_foropenerrrequesturlopen)rrZhostsZ ca_bundleZ verify_sslrlkwZuse_sslr&r&r'r,s zPackageIndex.__init__Fc Cs||jkr| rdSd|j|<t|s4|j|dStt|}|r^|j|sRdS|jd||sr| sr||jkrtt|j |dS|j|sd|j|<dS|j d|d|j|<d}|j |||}|dkrdSd|j|j <d|j jddjkr|jdS|j }|j}t|tsRt|tjjr4d }n|j jd pDd }|j|d }|jx6tj|D](} tjj|t| jd } |j| qfW|j |j!rt"|d ddkr|j#||}dS)z.)filterrWrDrr itertoolsstarmap scan_egg_link)rZ search_pathdirsZ egg_linksr&r&r'scan_egg_linksszPackageIndex.scan_egg_linksc Csttjj||}ttdttj|}WdQRXt |dkrDdS|\}}x>t tjj||D](}tjj|f||_ t |_ |j|q`WdS)Nr9)openrWrDrarrrrwrxrTrrPr rHrc)rrDrZ raw_lineslinesZegg_pathZ setup_pathrNr&r&r'rs  zPackageIndex.scan_egg_linkc sfdd}xHtj|D]:}y |tjj|t|jdWqtk rPYqXqW||\}}|rxXt||D]J}t |\}} |j dr| r|r|d||f7}n j |j |qrWt jdd|SdSd S) z#Process the contents of a PyPI pagecs|jjrtttjj|tjdjd}t|dkrd|dkrt |d}t |d}dj j |j i|<t|t|fSdS)Nr6r9r:r7rT)NN)r2rrrrr#r>rTr?rrr setdefaultr0r)rrApkgver)rr&r'scans "  z(PackageIndex.process_index..scanr7z.pyz #egg=%s-%scSsd|jdddS)Nz%sr7r!r9)rL)mr&r&r'sz,PackageIndex.process_index..rN)ryrurr#rzr{rLr$rrGr1need_version_infoscan_urlPYPI_MD5sub) rr@r~rrKrrnew_urlr4fragr&)rr'rs$       zPackageIndex.process_indexcCs|jd|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_all)rr@r&r&r'rszPackageIndex.need_version_infocGs:|j|jkr*|r |j|f||jd|j|jdS)Nz6Scanning index of all packages (this may take a while))rrrrr)rrrlr&r&r'rs  zPackageIndex.scan_allcCs~|j|j|jd|jj|js:|j|j|jd|jj|jsR|j|x&t|jj|jfD]}|j|qhWdS)Nr6) rr unsafe_namerrrgrQnot_found_in_indexr)r requirementr@r&r&r' find_packagess zPackageIndex.find_packagescsR|j|j|x,||jD]}||kr.|S|jd||qWtt|j||S)Nz%s does not match %s)prescanrrgrsuperrobtain)rrZ installerrN) __class__r&r'rs zPackageIndex.obtaincCsL|j|jd||jsH|jtj|td|jjtj j |fdS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) rrrrrWunlinkrrr3rDrU)rcheckerrXtfpr&r&r' check_hashs  zPackageIndex.check_hashcCsTxN|D]F}|jdks4t| s4|jds4tt|r@|j|q|jj|qWdS)z;Add `urls` to the list that will be prescanned for searchesNzfile:)rrr2rrrappend)rZurlsr@r&r&r'add_find_links s      zPackageIndex.add_find_linkscCs"|jrtt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrrr)rr&r&r'rszPackageIndex.prescancCs<||jr|jd}}n |jd}}|||j|jdS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rgrrrr)rrmethrr&r&r'r"s   zPackageIndex.not_found_in_indexcCs~t|tsjt|}|rR|j|jd||}t|\}}|jdrN|j|||}|Stj j |rb|St |}t |j ||ddS)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r7z.pyrPN)rrr _download_urlrLrGr1 gen_setuprWrDrr(rfetch_distribution)rr%tmpdirrBfoundr4rFr&r&r'r8,s    zPackageIndex.downloadc sjd|id}d fdd }|rHjj|||}| r`|dk r`|||}|dkrjdk rzj||}|dkr| rj|||}|dkrˆjdrdpd|njd||j|jd SdS) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNcs|dkr }x||jD]t}|jtkrJ rJ|krjd|d|<q||ko`|jtkp` }|rj|j}||_tj j |jr|SqWdS)Nz&Skipping development or system egg: %sr7) rgrHrrr r8rPdownload_locationrWrDr)ZreqenvrNZtestloc) develop_okrskippedsourcerr&r'r|fs z-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rP)N)rrrrrcloner) rrr force_scanrrZ local_indexrNr|r&)rrrrrr'rNs0       zPackageIndex.fetch_distributioncCs"|j||||}|dk r|jSdS)a3Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)rrP)rrrrrrNr&r&r'fetchszPackageIndex.fetchc Cstj|}|r*ddt||jddDp,g}t|dkrtjj|}tjj||krtjj ||}ddl m }|||st j |||}ttjj |dd2} | jd|dj|djtjj|dfWdQRX|S|rtd ||fntd dS) NcSsg|]}|jr|qSr&)rR)r[dr&r&r' sz*PackageIndex.gen_setup..r7r)samefilezsetup.pywzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) zCan't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rJrKrrLrTrWrDrUdirnameraZsetuptools.command.easy_installrshutilZcopy2rwriterQrRsplitextr) rrXrFrrKrrUdstrrr&r&r'rs2       zPackageIndex.gen_setupi c Cs|jd|d}ztj|}|j|}t|tjjrJtd||j |j f|j}d}|j }d}d|krt |d} t tt| }|j|||||t|dZ} xD|j|} | r|j| | j| |d7}|j|||||qPqW|j||| WdQRX|S|r|jXdS) NzDownloading %szCan't download %s: %s %srr7zcontent-lengthzContent-Lengthwbr;)rrrrrrrrrrr dl_blocksizermaxrint reporthookrrrr rr) rr@rXfprrblocknumZbssizeZsizesrrr&r&r' _download_tos:        zPackageIndex._download_tocCsdS)Nr&)rr@rXrZblksizerr&r&r'rszPackageIndex.reporthookcCs|jdrt|Sy t||jSttjfk r}z>djdd|jD}|r^|j ||nt d||fWYdd}~Xnt j j k r}z|Sd}~Xnt j jk r}z,|r|j ||jnt d||jfWYdd}~Xntjk r8}z.|r|j ||jnt d||jfWYdd}~XnPtjtj fk r}z*|rf|j ||nt d||fWYdd}~XnXdS)Nzfile: cSsg|] }t|qSr&)rw)r[argr&r&r'rsz)PackageIndex.open_url..z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r2 local_openopen_with_authrr$r InvalidURLrarlrrrrrZURLErrorreasonZ BadStatusLinelineZ HTTPExceptionsocket)rr@Zwarningvrr&r&r'rs6  "zPackageIndex.open_urlcCst|\}}|r4x&d|kr0|jddjdd}qWnd}|jdrN|dd}tjj||}|dksn|jd rz|j||S|d ks|jd r|j||S|jd r|j ||S|d krt j j t j j|dS|j|d|j||SdS)Nz...\_Z__downloaded__z.egg.zipr,svnzsvn+gitzgit+zhg+rr9Tr/)rGreplacer1rWrDrar2 _download_svn _download_git _download_hgrr url2pathnamer#r=r_attempt_download)rrBr@rr3rFrXr&r&r'rs$         zPackageIndex._download_urlcCs|j|ddS)NT)r)rr@r&r&r'r9szPackageIndex.scan_urlcCs6|j||}d|jddjkr.|j|||S|SdS)Nrz content-typer)rrr0_download_html)rr@rXrr&r&r'r(<s zPackageIndex._attempt_downloadcCslt|}x@|D]8}|jrtjd|rD|jtj||j||SPqW|jtj|td|dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r���rx���rZ���r}���r���rW���r���r$��r���)r���r@���r���rX���r���r��r&���r&���r'���r)��C��s����     zPackageIndex._download_htmlc�������������C���s��|j�ddd�}g�}|j�jdrd|krtjj|\}}}}}} | �r|jdrd|dd��kr|dd��j�dd\}}tjj|\} } | rd | kr| j�d d\} } d | �d | �g}n d | �g}| }|||||| f}tjj|}|�jd ||�t j d dg|�d||g��|S�)Nr:���r7���r���zsvn:@z//r6���r9���:z --username=z --password=z'Doing subversion checkout from %s to %sr!��checkoutz-q) r?���r0���r2���r���r#���r=��� splituser urlunparser��� subprocess check_call)r���r@���rX���ZcredsrB���netlocrD���r\���qr���authhostuserZpwrA���r&���r&���r'���r$��R��s$����   zPackageIndex._download_svnc�������������C���sp���t�jj|�\}}}}}|jddd�}|jddd�}d�}d|krR|jdd\}}t�jj||||df}�|�|fS�)N+r7���r:���r���r*��r���r;���)r���r#���Zurlsplitr?���rsplitZ urlunsplit)r@��� pop_prefixrB���r1��rD���rE���r���revr&���r&���r'���_vcs_split_rev_from_urlg��s����z$PackageIndex._vcs_split_rev_from_urlc�������������C���sr���|j�ddd�}|�j|dd\}}|�jd||�tjddd ||g�|d�k rn|�jd |�tjdd |d d |g�|S�) Nr:���r7���r���T)r8��zDoing git clone from %s to %sr"��r���z--quietzChecking out %sz-Cr,��)r?���r:��r���r/��r0��)r���r@���rX���r9��r&���r&���r'���r%��y��s���� zPackageIndex._download_gitc���������� ���C���sv���|j�ddd�}|�j|dd\}}|�jd||�tjddd ||g�|d�k rr|�jd |�tjdd |d d d|dg�|S�)Nr:���r7���r���T)r8��zDoing hg clone from %s to %sZhgr���z--quietzUpdating to %sz--cwdZupz-Cz-rz-q)r?���r:��r���r/��r0��)r���r@���rX���r9��r&���r&���r'���r&����s���� zPackageIndex._download_hgc�������������G���s���t�j|f|��d�S�)N)r���r���)r���r���rl���r&���r&���r'���r�����s����zPackageIndex.debugc�������������G���s���t�j|f|��d�S�)N)r���r���)r���r���rl���r&���r&���r'���r�����s����zPackageIndex.infoc�������������G���s���t�j|f|��d�S�)N)r���r���)r���r���rl���r&���r&���r'���r�����s����zPackageIndex.warnr���)r���r;��NT)F)F)F)N)N)FFFN)FF)N)F)(r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r8���r���r��r���r ��r��r��r���r���r���r(��r)��r$�� staticmethodr:��r%��r&��r���r���r��� __classcell__r&���r&���)r���r'���r���)��sL����  3   +   #� J )$ #   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�������������C���s���|�j�d}t|S�)Nr7���)rL���r���)rK���Zwhatr&���r&���r'��� decode_entity��s���� r>��c�������������C���s ���t�t|�S�)z'Decode HTML entities in the given text.) entity_subr>��)textr&���r&���r'���r{�����s����r{���c����������������s����fdd}|S�)Nc����������������s����fdd}|S�)Nc����������� ������s.���t�j�}t�j�z �|�|S�t�j|�X�d�S�)N)r��ZgetdefaulttimeoutZsetdefaulttimeout)rl���rm���Z old_timeout)rn���timeoutr&���r'���_socket_timeout��s ����  z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr&���)rn���rB��)rA��)rn���r'���rB����s����z'socket_timeout.<locals>._socket_timeoutr&���)rA��rB��r&���)rA��r'���socket_timeout��s���� rC��c�������������C���s2���t�jj|�}|j�}tj|}|j�}|jddS�)aq�� A function compatible with Python 2.3-3.3 that will encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False  r���)r���r#���r>���encodebase64Z encodestringr���r#��)r3��Zauth_sZ auth_bytesZ encoded_bytesZencodedr&���r&���r'��� _encode_auth��s ����  rG��c���������������@���s(���e�Zd�ZdZdd�Zdd�Zdd�ZdS�) Credentialz: A username/password pair. Use like a namedtuple. c�������������C���s���||�_�||�_d�S�)N)usernamepassword)r���rI��rJ��r&���r&���r'���r�����s����zCredential.__init__c�������������c���s���|�j�V��|�jV��d�S�)N)rI��rJ��)r���r&���r&���r'���__iter__��s����zCredential.__iter__c�������������C���s ���dt�|��S�)Nz%(username)s:%(password)s)vars)r���r&���r&���r'���__str__��s����zCredential.__str__N)r���r���r���r���r���rK��rM��r&���r&���r&���r'���rH����s���rH��c���������������@���s0���e�Zd�Zdd�Zedd�Zdd�Zdd�Zd S�) PyPIConfigc�������������C���sP���t�jdddgd}tjj|�|�tjjtjjdd}tjj |rL|�j |�dS�)z% Load from ~/.pypirc rI��rJ�� repositoryr���~z.pypircN) dictfromkeysr���RawConfigParserr���rW���rD���ra��� expanduserr���r���)r���ZdefaultsZrcr&���r&���r'���r�����s ���� zPyPIConfig.__init__c����������������s&����fdd�j��D�}tt�j|S�)Nc����������������s ���g�|�]}�j�|d�j�r|qS�)rO��)r���rx���)r[���section)r���r&���r'���r����s����z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)ZsectionsrQ��r���_get_repo_cred)r���Zsections_with_repositoriesr&���)r���r'���creds_by_repository��s����zPyPIConfig.creds_by_repositoryc�������������C���s6���|�j�|dj�}|t|�j�|dj�|�j�|dj�fS�)NrO��rI��rJ��)r���rx���rH��)r���rU��Zrepor&���r&���r'���rV����s����zPyPIConfig._get_repo_credc�������������C���s*���x$|�j�j�D�]\}}|j|r |S�q W�dS�)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)rW��itemsr2���)r���r@���rO��credr&���r&���r'���find_credential��s���� zPyPIConfig.find_credentialN)r���r���r���r���propertyrW��rV��rZ��r&���r&���r&���r'���rN����s��� rN��c�������������C���s:��t�jj|�\}}}}}}|jdr,tjd|d krFt�jj|\}} nd}|s~t�j|�} | r~t | }| j |�f} t j d | ��|rdt |�}|| ||||f} t�jj| } t�jj| }|jd|�n t�jj|�}|jd t�||}|r6t�jj|j\}}}}}}||kr6|| kr6||||||f} t�jj| |_|S�) z4Open a urllib2 request, handling HTTP authenticationr+��znonnumeric port: ''httphttpsN*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)r\��r]��)r^��)r���r#���r=���r1���r���r��r-��rN��rZ��rw���rI��r���r���rG��r.��r���ZRequestZ add_header user_agentr@���)r@���r���rB���r1��rD���ZparamsrE���r���r3��r4��rY��r���rA���r���r���r��s2Zh2Zpath2Zparam2Zquery2Zfrag2r&���r&���r'���r�� ��s6����         r��c�������������C���s���|�S�)Nr&���)r@���r&���r&���r'��� fix_sf_url:��s����ra��c���������� ���C���s��t�jj|�\}}}}}}t�jj|}tjj|r<t�jj|�S�|j drtjj |rg�}xtj |D�]b} tjj || } | dkrt | d} | j�} W�dQ�R�X�P�ntjj | r| d7�} |jdj| d�qbW�d} | j|�dj |d } d\}}n d\}}} ddi}tj| }t�jj|�||||S�)z7Read a local path, with special support for directoriesr6���z index.htmlrNz<a href="{name}">{name}</a>)r3���zB<html><head><title>{url}{files}rD)r@filesOKPath not found Not foundz content-typez text/html)rdre)rfrgrh)rr#r=rr'rWrDisfilerr1rrrarrrformatrStringIOrr)r@rBrCrDZparamrErrXrcrfilepathrZbodyrZstatusmessagerZ body_streamr&r&r'r>s,        r)N)N)N)N)r )[rr/sysrWrZrrrFrr functoolsrZsetuptools.externrZsetuptools.extern.six.movesrrrrr"Z pkg_resourcesrr r r r r rrrrrrrrZ distutilsrZdistutils.errorsrZfnmatchrZsetuptools.py27compatrZsetuptools.py33compatrZsetuptools.wheelrrrJIryrrKrr?rS__all__Z_SOCKET_TIMEOUTZ_tmplrjrRr_r(rrGrrIrYrrkrprtrobjectrrrrr?r>r{rCrGrHrSrNrrrrarr&r&r&r's|  <           !  "   !z  &. PK!Jרii+__pycache__/pep425tags.cpython-36.opt-1.pycnu[3 9fy*@sdZddlmZddlZddlmZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZejdZd d Zd d Zd dZddZddZd#ddZddZddZddZddZddZd$d!d"ZeZdS)%z2Generate and work with PEP 425 Compatibility Tags.)absolute_importN)log) OrderedDict)glibcz(.+)_(\d+)_(\d+)_(.+)cCsBy tj|Stk r<}ztjdj|tdSd}~XnXdS)Nz{}) sysconfigget_config_varIOErrorwarningswarnformatRuntimeWarning)varer /usr/lib/python3.6/pep425tags.pyrs  rcCs:ttdrd}n&tjjdr"d}ntjdkr2d}nd}|S)z'Return abbreviated implementation name.pypy_version_infoppjavaZjyZcliZipcp)hasattrsysplatform startswith)Zpyimplrrr get_abbr_impls   rcCs.td}| stdkr*djttt}|S)zReturn implementation version.py_version_nodotr)rrjoinmapstrget_impl_version_info)Zimpl_verrrr get_impl_ver)sr!cCs:tdkr"tjdtjjtjjfStjdtjdfSdS)zQReturn sys.version_info-like tuple for use in decrementing the minor version.rrrN)rr version_informajorminorrrrrr 1s  r cCsdjttS)z; Returns the Tag for this specific implementation. z{}{})r rr!rrrr get_impl_tag<sr%TcCs.t|}|dkr&|r tjd||S||kS)zgUse a fallback method for determining SOABI flags if the needed config var is unset or unavailable.Nz>Config variable '%s' is unset, Python ABI tag may be incorrect)rrdebug)rZfallbackexpectedr valrrrget_flagCsr)cstd}t| rdkrttdrd}d}d}tddddkd rLd }td fd ddkd rjd }tdddddkotjdkdrtjdkrd}dt|||f}n@|r|jdrd|jdd}n|r|j ddj dd}nd}|S)zXReturn the ABI tag based on SOABI (if available) or emulate SOABI (CPython 2, PyPy).SOABIrr maxunicoderPy_DEBUGcSs ttdS)Ngettotalrefcount)rrrrrrYszget_abi_tag..)r d WITH_PYMALLOCcsdkS)Nrrr)implrrr.]smZPy_UNICODE_SIZEcSs tjdkS)Ni)rr+rrrrr.as)r'r uz %s%s%s%s%szcpython--r._N>rr)r4r4)r4r4) rrrrr)r"r!rsplitreplace)Zsoabir/r2r5abir)r1r get_abi_tagOs8    r<cCs tjdkS)Ni)rmaxsizerrrr_is_running_32bitqsr>cCstjdkr^tj\}}}|jd}|dkr6tr6d}n|dkrHtrHd}dj|d|d |Stjjj dd j d d }|d krtrd }|S)z0Return our platform name 'win32', 'linux_x86_64'darwinr7x86_64i386ppc64ppczmacosx_{}_{}_{}rrr8r6 linux_x86_64 linux_i686) rrZmac_verr9r>r distutilsutil get_platformr:)releaser8machineZ split_verresultrrrrHus  rHc CsFtdkrdSyddl}t|jSttfk r8YnXtjddS)NrDrEFr>rErD)rH _manylinuxboolZmanylinux1_compatible ImportErrorAttributeErrorrZhave_compatible_glibc)rNrrris_manylinux1_compatibles  rRcsvg}fddtd dddg|||r8|j|x.D]&}||kr>|||r>|j|q>W|jd |S)zReturn a list of supported arches (including group arches) for the given major, minor and machine architecture of an macOS machine. cs~|dkr||fd kS|dkr(||fd kS|dkr<||fd kS|dkrP||fd kS|krzx |D]}|||rbdSqbWd S)NrC rMrBrAr3r@TF)rSrM)rSrM)rSr3)rSrMr)r#r$archgarch)_supports_archgroupsrrrVs     z)get_darwin_arches.._supports_archfatrArCintelr@fat64rBfat32Z universalrArC)rXr\r@rA)rYr]r@rB)rZr^r@rArC)r[r_)rappend)r#r$rJarchesrUr)rVrWrget_darwin_archess$    rbFcCsg}|dkrXg}t}|dd}x4t|dddD] }|jdjtt||fq4W|p`t}g} |pnt}|r|g| dd<t} ddl } x8| j D],} | dj dr| j | dj dddqW| jtt| | jd|sx|pt} | j d rtj| }|r|j\}}}}d j||}g}xTttt|dD]4}x,tt|||D]}|j|||fq^WqHWn| g}n*|dkrtr| jd d | g}n| g}x:| D]2}x*|D]"} |jd ||df|| fqWqWxZ|ddD]J}|dkrPx6| D].}x&|D]} |jd ||f|| fqWqWqWx*|D]"} |jd|ddd| fqRW|jd ||dfddf|jd ||ddfddfxNt|D]B\}}|jd|fddf|dkr|jd|dddfqW|S)acReturn a list of supported tags for each version specified in `versions`. :param versions: a list of string versions, of the form ["33", "32"], or None. The first version will be assumed to support our ABI. :param platform: specify the exact platform you want valid tags for, or None. If None, use the local system platform. :param impl: specify the exact implementation you want valid tags for, or None. If None, use the local interpreter impl. :param abi: specify the exact abi you want valid tags for, or None. If None, use the local interpreter abi. Nrrrz.abir7rLZnoneZmacosxz {}_{}_%i_%slinuxZ manylinux1z%s%s3130zpy%sanyrgrgrg>rdre)r ranger`rrrrr<setimpZ get_suffixesraddr9extendsortedlistrH _osx_arch_patmatchrWr reversedintrbrRr: enumerate)ZversionsZnoarchrr1r;Z supportedr"r#r$ZabisZabi3srjsuffixrTrpnameZ actual_archZtplrar2aversionirrr get_supportedsh            (   * "  ry)TT)NFNNN)__doc__Z __future__rZdistutils.utilrFrrrerrr collectionsrrrcompilerorrr!r r%r)r<r>rHrRrbryZimplementation_tagrrrrs2        "= _PK!16ii%__pycache__/pep425tags.cpython-36.pycnu[3 9fy*@sdZddlmZddlZddlmZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZejdZd d Zd d Zd dZddZddZd#ddZddZddZddZddZddZd$d!d"ZeZdS)%z2Generate and work with PEP 425 Compatibility Tags.)absolute_importN)log) OrderedDict)glibcz(.+)_(\d+)_(\d+)_(.+)cCsBy tj|Stk r<}ztjdj|tdSd}~XnXdS)Nz{}) sysconfigget_config_varIOErrorwarningswarnformatRuntimeWarning)varer /usr/lib/python3.6/pep425tags.pyrs  rcCs:ttdrd}n&tjjdr"d}ntjdkr2d}nd}|S)z'Return abbreviated implementation name.pypy_version_infoppjavaZjyZcliZipcp)hasattrsysplatform startswith)Zpyimplrrr get_abbr_impls   rcCs.td}| stdkr*djttt}|S)zReturn implementation version.py_version_nodotr)rrjoinmapstrget_impl_version_info)Zimpl_verrrr get_impl_ver)sr!cCs:tdkr"tjdtjjtjjfStjdtjdfSdS)zQReturn sys.version_info-like tuple for use in decrementing the minor version.rrrN)rr version_informajorminorrrrrr 1s  r cCsdjttS)z; Returns the Tag for this specific implementation. z{}{})r rr!rrrr get_impl_tag<sr%TcCs.t|}|dkr&|r tjd||S||kS)zgUse a fallback method for determining SOABI flags if the needed config var is unset or unavailable.Nz>Config variable '%s' is unset, Python ABI tag may be incorrect)rrdebug)rZfallbackexpectedr valrrrget_flagCsr)cstd}t| rdkrttdrd}d}d}tddddkd rLd }td fd ddkd rjd }tdddddkotjdkdrtjdkrd}dt|||f}n@|r|jdrd|jdd}n|r|j ddj dd}nd}|S)zXReturn the ABI tag based on SOABI (if available) or emulate SOABI (CPython 2, PyPy).SOABIrr maxunicoderPy_DEBUGcSs ttdS)Ngettotalrefcount)rrrrrrYszget_abi_tag..)r d WITH_PYMALLOCcsdkS)Nrrr)implrrr.]smZPy_UNICODE_SIZEcSs tjdkS)Ni)rr+rrrrr.as)r'r uz %s%s%s%s%szcpython--r._N>rr)r4r4)r4r4) rrrrr)r"r!rsplitreplace)Zsoabir/r2r5abir)r1r get_abi_tagOs8    r<cCs tjdkS)Ni)rmaxsizerrrr_is_running_32bitqsr>cCstjdkr^tj\}}}|jd}|dkr6tr6d}n|dkrHtrHd}dj|d|d |Stjjj dd j d d }|d krtrd }|S)z0Return our platform name 'win32', 'linux_x86_64'darwinr7x86_64i386ppc64ppczmacosx_{}_{}_{}rrr8r6 linux_x86_64 linux_i686) rrZmac_verr9r>r distutilsutil get_platformr:)releaser8machineZ split_verresultrrrrHus  rHc CsFtdkrdSyddl}t|jSttfk r8YnXtjddS)NrDrEFr>rDrE)rH _manylinuxboolZmanylinux1_compatible ImportErrorAttributeErrorrZhave_compatible_glibc)rNrrris_manylinux1_compatibles  rRcsvg}fddtd dddg|||r8|j|x.D]&}||kr>|||r>|j|q>W|jd |S)zReturn a list of supported arches (including group arches) for the given major, minor and machine architecture of an macOS machine. cs~|dkr||fd kS|dkr(||fd kS|dkr<||fd kS|dkrP||fd kS|krzx |D]}|||rbdSqbWd S)NrC rMrBrAr3r@TF)rSrM)rSrM)rSr3)rSrMr)r#r$archgarch)_supports_archgroupsrrrVs     z)get_darwin_arches.._supports_archfatrArCintelr@fat64rBfat32Z universalrArC)rXr\r@rA)rYr]r@rB)rZr^r@rArC)r[r_)rappend)r#r$rJarchesrUr)rVrWrget_darwin_archess$    rbFcCsg}|dkrXg}t}|dd}x4t|dddD] }|jdjtt||fq4W|p`t}g} |pnt}|r|g| dd<t} ddl } x8| j D],} | dj dr| j | dj dddqW| jtt| | jd|sx|pt} | j d rtj| }|r|j\}}}}d j||}g}xTttt|dD]4}x,tt|||D]}|j|||fq^WqHWn| g}n*|dkrtr| jd d | g}n| g}x:| D]2}x*|D]"} |jd ||df|| fqWqWxZ|ddD]J}|dkrPx6| D].}x&|D]} |jd ||f|| fqWqWqWx*|D]"} |jd|ddd| fqRW|jd ||dfddf|jd ||ddfddfxNt|D]B\}}|jd|fddf|dkr|jd|dddfqW|S)acReturn a list of supported tags for each version specified in `versions`. :param versions: a list of string versions, of the form ["33", "32"], or None. The first version will be assumed to support our ABI. :param platform: specify the exact platform you want valid tags for, or None. If None, use the local system platform. :param impl: specify the exact implementation you want valid tags for, or None. If None, use the local interpreter impl. :param abi: specify the exact abi you want valid tags for, or None. If None, use the local interpreter abi. Nrrrz.abir7rLZnoneZmacosxz {}_{}_%i_%slinuxZ manylinux1z%s%s3130zpy%sanyrgrgrg>rdre)r ranger`rrrrr<setimpZ get_suffixesraddr9extendsortedlistrH _osx_arch_patmatchrWr reversedintrbrRr: enumerate)ZversionsZnoarchrr1r;Z supportedr"r#r$ZabisZabi3srjsuffixrTrpnameZ actual_archZtplrar2aversionirrr get_supportedsh            (   * "  ry)TT)NFNNN)__doc__Z __future__rZdistutils.utilrFrrrerrr collectionsrrrcompilerorrr!r r%r)r<r>rHrRrbryZimplementation_tagrrrrs2        "= _PK!%__pycache__/py27compat.cpython-36.pycnu[3 9f@sTdZddlZddlmZddZejr.ddZejdko>ejZerHendd Z dS) z2 Compatibility Support for Python 2.7 and earlier N)sixcCs |j|S)zH Given an HTTPMessage, return all headers matching a given key. )Zget_all)messagekeyr /usr/lib/python3.6/py27compat.pyget_all_headers srcCs |j|S)N)Z getheaders)rrrrrrsZLinuxcCs|S)Nr)xrrrsr ) __doc__platformZsetuptools.externrrZPY2systemZlinux_py2_asciistrZ rmtree_saferrrrs  PK!je+__pycache__/py31compat.cpython-36.opt-1.pycnu[3 9f@sddgZyddlmZmZWn,ek rHddlmZmZddZYnXyddlmZWn4ek rddl Z ddlZGdd d e ZYnXdS) get_config_varsget_path)rr)rget_python_libcCs|dkrtdt|dkS)NplatlibpurelibzName must be purelib or platlib)rr) ValueErrorr)namer /usr/lib/python3.6/py31compat.pyr s)TemporaryDirectoryNc@s(eZdZdZddZddZddZdS) r z Very simple temporary directory context manager. Will try to delete afterward, but will also ignore OS and similar errors on deletion. cCsd|_tj|_dS)N)rtempfileZmkdtemp)selfr r r __init__szTemporaryDirectory.__init__cCs|jS)N)r)r r r r __enter__!szTemporaryDirectory.__enter__c Cs2ytj|jdWntk r&YnXd|_dS)NT)shutilZrmtreerOSError)r exctypeZexcvalueZexctracer r r __exit__$s zTemporaryDirectory.__exit__N)__name__ __module__ __qualname____doc__rrrr r r r r sr ) __all__ sysconfigrr ImportErrorZdistutils.sysconfigrr r robjectr r r r sPK!je%__pycache__/py31compat.cpython-36.pycnu[3 9f@sddgZyddlmZmZWn,ek rHddlmZmZddZYnXyddlmZWn4ek rddl Z ddlZGdd d e ZYnXdS) get_config_varsget_path)rr)rget_python_libcCs|dkrtdt|dkS)NplatlibpurelibzName must be purelib or platlib)rr) ValueErrorr)namer /usr/lib/python3.6/py31compat.pyr s)TemporaryDirectoryNc@s(eZdZdZddZddZddZdS) r z Very simple temporary directory context manager. Will try to delete afterward, but will also ignore OS and similar errors on deletion. cCsd|_tj|_dS)N)rtempfileZmkdtemp)selfr r r __init__szTemporaryDirectory.__init__cCs|jS)N)r)r r r r __enter__!szTemporaryDirectory.__enter__c Cs2ytj|jdWntk r&YnXd|_dS)NT)shutilZrmtreerOSError)r exctypeZexcvalueZexctracer r r __exit__$s zTemporaryDirectory.__exit__N)__name__ __module__ __qualname____doc__rrrr r r r r sr ) __all__ sysconfigrr ImportErrorZdistutils.sysconfigrr r robjectr r r r sPK!sJ66+__pycache__/py33compat.cpython-36.opt-1.pycnu[3 9f @sddlZddlZddlZy ddlZWnek r<dZYnXddlmZddlmZej ddZ Gddde Z e ede Ze ed ejjZdS) N)six) html_parserOpArgz opcode argc@seZdZddZddZdS)Bytecode_compatcCs ||_dS)N)code)selfrr /usr/lib/python3.6/py33compat.py__init__szBytecode_compat.__init__ccstjd|jj}t|jj}d}d}x||kr||}|tjkr||d||dd|}|d7}|tjkrtjd }||d}q&n d}|d7}t ||Vq&WdS) z>Yield '(op,arg)' pair for each operation in code object 'code'briN) arrayrco_codelendisZ HAVE_ARGUMENTZ EXTENDED_ARGrZ integer_typesr)rbyteseofZptrZ extended_argopargZ long_typerrr __iter__s        zBytecode_compat.__iter__N)__name__ __module__ __qualname__r rrrrr rsrBytecodeunescape)rr collectionsZhtml ImportErrorZsetuptools.externrZsetuptools.extern.six.movesr namedtuplerobjectrgetattrrZ HTMLParserrrrrr s     " PK!sJ66%__pycache__/py33compat.cpython-36.pycnu[3 9f @sddlZddlZddlZy ddlZWnek r<dZYnXddlmZddlmZej ddZ Gddde Z e ede Ze ed ejjZdS) N)six) html_parserOpArgz opcode argc@seZdZddZddZdS)Bytecode_compatcCs ||_dS)N)code)selfrr /usr/lib/python3.6/py33compat.py__init__szBytecode_compat.__init__ccstjd|jj}t|jj}d}d}x||kr||}|tjkr||d||dd|}|d7}|tjkrtjd }||d}q&n d}|d7}t ||Vq&WdS) z>Yield '(op,arg)' pair for each operation in code object 'code'briN) arrayrco_codelendisZ HAVE_ARGUMENTZ EXTENDED_ARGrZ integer_typesr)rbyteseofZptrZ extended_argopargZ long_typerrr __iter__s        zBytecode_compat.__iter__N)__name__ __module__ __qualname__r rrrrr rsrBytecodeunescape)rr collectionsZhtml ImportErrorZsetuptools.externrZsetuptools.extern.six.movesr namedtuplerobjectrgetattrrZ HTMLParserrrrrr s     " PK!;3^ZZ+__pycache__/py36compat.cpython-36.opt-1.pycnu[3 9fK @sVddlZddlmZddlmZddlmZGdddZejd krRGdddZdS) N)DistutilsOptionError) strtobool)DEBUGc@seZdZdZdddZdS)Distribution_parse_config_filesz Mix-in providing forward-compatibility for functionality to be included by default on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. NcCsddlm}tjtjkr8ddddddd d d d d ddg }ng}t|}|dkrT|j}trb|jd|dd}x|D]}tr|jd||j |xf|j D]Z}|j |}|j |}x@|D]8} | dkr| |kr|j || } | jdd} || f|| <qWqW|jqrWd|jkrx|jdjD]\} \} } |jj | } yF| rVt|| t|  n(| dkrrt|| t| n t|| | Wn,tk r} zt| WYdd} ~ XnXq"WdS)Nr) ConfigParserz install-basezinstall-platbasez install-libzinstall-platlibzinstall-purelibzinstall-headerszinstall-scriptsz install-dataprefixz exec-prefixhomeuserrootz"Distribution.parse_config_files():)Z interpolationz reading %s__name__-_globalverbosedry_run)rr)Z configparserrsysr base_prefix frozensetZfind_config_filesrZannouncereadZsectionsoptionsZget_option_dictgetreplace__init__Zcommand_optionsitemsZ negative_optsetattrr ValueErrorr)self filenamesrZignore_optionsparserfilenameZsectionrZopt_dictoptvalsrcaliasmsgr% /usr/lib/python3.6/py36compat.pyparse_config_filessJ                z2Distribution_parse_config_files.parse_config_files)N)r __module__ __qualname____doc__r'r%r%r%r&rsrc@s eZdZdS)rN)r r(r)r%r%r%r&rJs)r+) rZdistutils.errorsrZdistutils.utilrZdistutils.debugrr version_infor%r%r%r&s   A PK!;3^ZZ%__pycache__/py36compat.cpython-36.pycnu[3 9fK @sVddlZddlmZddlmZddlmZGdddZejd krRGdddZdS) N)DistutilsOptionError) strtobool)DEBUGc@seZdZdZdddZdS)Distribution_parse_config_filesz Mix-in providing forward-compatibility for functionality to be included by default on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. NcCsddlm}tjtjkr8ddddddd d d d d ddg }ng}t|}|dkrT|j}trb|jd|dd}x|D]}tr|jd||j |xf|j D]Z}|j |}|j |}x@|D]8} | dkr| |kr|j || } | jdd} || f|| <qWqW|jqrWd|jkrx|jdjD]\} \} } |jj | } yF| rVt|| t|  n(| dkrrt|| t| n t|| | Wn,tk r} zt| WYdd} ~ XnXq"WdS)Nr) ConfigParserz install-basezinstall-platbasez install-libzinstall-platlibzinstall-purelibzinstall-headerszinstall-scriptsz install-dataprefixz exec-prefixhomeuserrootz"Distribution.parse_config_files():)Z interpolationz reading %s__name__-_globalverbosedry_run)rr)Z configparserrsysr base_prefix frozensetZfind_config_filesrZannouncereadZsectionsoptionsZget_option_dictgetreplace__init__Zcommand_optionsitemsZ negative_optsetattrr ValueErrorr)self filenamesrZignore_optionsparserfilenameZsectionrZopt_dictoptvalsrcaliasmsgr% /usr/lib/python3.6/py36compat.pyparse_config_filessJ                z2Distribution_parse_config_files.parse_config_files)N)r __module__ __qualname____doc__r'r%r%r%r&rsrc@s eZdZdS)rN)r r(r)r%r%r%r&rJs)r+) rZdistutils.errorsrZdistutils.utilrZdistutils.debugrr version_infor%r%r%r&s   A PK!q}-4&=&=(__pycache__/sandbox.cpython-36.opt-1.pycnu[3 9f7 @sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZddlZejjdrddljjjjZn ejejZyeZWnek rdZYnXeZddlm Z ddlm!Z!ddd d gZ"d-d d Z#ej$d.d dZ%ej$ddZ&ej$ddZ'ej$ddZ(Gddde)Z*GdddZ+ej$ddZ,ddZ-ej$ddZ.ej$dd Z/d!d"Z0d#d$Z1d%d Z2Gd&ddZ3e4ed'rej5gZ6ngZ6Gd(dde3Z7ej8ej9d)d*d+j:DZ;Gd,d d e Z)r;r2r3rrrresumes zExceptionSaver.resumeN)r5r6r7r8r<r@rCrrrrr:rs r:c #sVtjjt }VWdQRXtjjfddtjD}t||jdS)z Context in which imported modules are saved. Translates exceptions internal to the context into the equivalent exception outside the context. Nc3s&|]}|kr|jd r|VqdS)z encodings.N) startswith).0mod_name)rrr szsave_modules..)rmodulescopyr:update_clear_modulesrC) saved_excZ del_modulesr)rr save_moduless  rMcCsxt|D] }tj|=q WdS)N)listrrH)Z module_namesrFrrrrKsrKc cs$tj}z |VWdtj|XdS)N)r" __getstate__ __setstate__)rrrrsave_pkg_resources_states rQc,cstjj|d}txtfttNt<t|(t |t ddVWdQRXWdQRXWdQRXWdQRXWdQRXWdQRXdS)NZtempZ setuptools) r&rjoinrQrMhide_setuptoolsr rr%r* __import__) setup_dirZtemp_dirrrr setup_contexts  rVcCstjd}t|j|S)aH >>> _needs_hiding('setuptools') True >>> _needs_hiding('pkg_resources') True >>> _needs_hiding('setuptools_plugin') False >>> _needs_hiding('setuptools.__init__') True >>> _needs_hiding('distutils') True >>> _needs_hiding('os') False >>> _needs_hiding('Cython') True z1(setuptools|pkg_resources|distutils|Cython)(\.|$))rerboolmatch)rFpatternrrr _needs_hidings r[cCstttj}t|dS)a% Remove references to setuptools' modules from sys.modules to allow the invocation to import the most appropriate setuptools. This technique is necessary to avoid issues such as #315 where setuptools upgrading itself would fail to find a function declared in the metadata. N)filterr[rrHrK)rHrrrrSs rScCstjjtjj|}t|y|gt|tjdd<tjjd|t j t j j ddt |trl|n |jtj}t|t|dd}t||WdQRXWn4tk r}z|jr|jdrʂWYdd}~XnXWdQRXdS)z8Run a distutils setup script, sandboxed in its directoryNrcSs|jS)N)Zactivate)Zdistrrrszrun_setup..__main__)__file__r5)r&rabspathdirnamerVrNrrinsertr__init__Z callbacksappend isinstancestrencodegetfilesystemencodingr dictr SystemExitargs)Z setup_scriptrkrUZ dunder_filensvrrrr s   c@s2eZdZdZdZddZddZddZd d Zd d Z d dZ x$d9D]Z e e e rFe e ee <qFWd:ddZer~edeZedeZx$d;D]Z e e e ree ee <qWd)d*Zx$drzDWrap 'os' module and 'open()' builtin for virtualizing setup scriptsFcsfddttD_dS)Ncs&g|]}|jd rt|r|qS)_)rDhasattr)rEname)r;rr sz,AbstractSandbox.__init__..)dir_os_attrs)r;r)r;rrcszAbstractSandbox.__init__cCs&x |jD]}tt|t||qWdS)N)rtsetattrr&getattr)r;sourcerprrr_copy s zAbstractSandbox._copycCs(|j|tr|jt_|jt_d|_dS)NT)rx_filerfile_openr_active)r;rrrr<s  zAbstractSandbox.__enter__cCs$d|_trtt_tt_|jtdS)NF)r|ryrrzr{rrxrs)r;exc_type exc_value tracebackrrrr@s zAbstractSandbox.__exit__c Cs||SQRXdS)zRun 'func' under os sandboxingNr)r;funcrrrrunszAbstractSandbox.runcsttfdd}|S)Ncs2|jr |j||f||\}}||f||S)N)r| _remap_pair)r;srcdstrkkw)rporiginalrrwrap&sz3AbstractSandbox._mk_dual_path_wrapper..wrap)rvrs)rprr)rprr_mk_dual_path_wrapper#s z%AbstractSandbox._mk_dual_path_wrapperrenamelinksymlinkNcs p ttfdd}|S)Ncs*|jr|j|f||}|f||S)N)r| _remap_input)r;rrkr)rprrrr4sz5AbstractSandbox._mk_single_path_wrapper..wrap)rvrs)rprrr)rprr_mk_single_path_wrapper1sz'AbstractSandbox._mk_single_path_wrapperrzrstatlistdirr(chmodchownmkdirremoveunlinkrmdirutimelchownchrootlstat startfilemkfifomknodpathconfaccesscsttfdd}|S)NcsB|jr2|j|f||}|j|f||S|f||S)N)r|r _remap_output)r;rrkr)rprrrrIsz4AbstractSandbox._mk_single_with_return..wrap)rvrs)rprr)rprr_mk_single_with_returnFs z&AbstractSandbox._mk_single_with_returnreadlinktempnamcsttfdd}|S)Ncs ||}|jr|j|S|S)N)r|r)r;rkrZretval)rprrrrXs  z'AbstractSandbox._mk_query..wrap)rvrs)rprr)rprr _mk_queryUs zAbstractSandbox._mk_queryr'tmpnamcCs|S)z=Called to remap or validate any path, whether input or outputr)r;rrrr_validate_pathdszAbstractSandbox._validate_pathcOs |j|S)zCalled for path inputs)r)r; operationrrkrrrrrhszAbstractSandbox._remap_inputcCs |j|S)zCalled for path outputs)r)r;rrrrrrlszAbstractSandbox._remap_outputcOs0|j|d|f|||j|d|f||fS)z?Called for path pairs like rename, link, and symlink operationsz-fromz-to)r)r;rrrrkrrrrrpszAbstractSandbox._remap_pair)rrr)N)rrr(rrrrrrrrrrrrrrrr)rr)r'r)r5r6r7r8r|rcrxr<r@rrrprorsrrryr{rrrrrrrrrrrsB          devnullc@seZdZdZejdddddddd d d d d dg ZdgZefddZ ddZ e rXd'ddZ d(ddZ ddZ ddZddZdd Zd!d"Zd)d$d%Zd&S)*r z.) r&rrr_sandboxrR_prefix _exceptionsrrc)r;Zsandbox exceptionsrrrrcs  zDirectorySandbox.__init__cOsddlm}||||dS)Nr)r )r/r )r;rrkrr rrr _violations zDirectorySandbox._violationrcOs<|dkr*|j| r*|jd||f||t||f||S)Nrrtr rUUrz)rrr rr)_okrry)r;rrrkrrrrryszDirectorySandbox._filecOs<|dkr*|j| r*|jd||f||t||f||S)Nrrr rrr)rrr rr)rrr{)r;rrrkrrrrr{szDirectorySandbox._opencCs|jddS)Nr)r)r;rrrrszDirectorySandbox.tmpnamc CsN|j}z:d|_tjjtjj|}|j|p@||jkp@|j|jS||_XdS)NF) r|r&rrr _exemptedrrDr)r;rZactiverrrrrs   zDirectorySandbox._okcs<fdd|jD}fdd|jD}tj||}t|S)Nc3s|]}j|VqdS)N)rD)rEZ exception)filepathrrrGsz-DirectorySandbox._exempted..c3s|]}tj|VqdS)N)rWrY)rErZ)rrrrGs)r_exception_patterns itertoolschainany)r;rZ start_matchesZpattern_matchesZ candidatesr)rrrs      zDirectorySandbox._exemptedcOs6||jkr2|j| r2|j|tjj|f|||S)zCalled for path inputs) write_opsrrr&rr)r;rrrkrrrrrszDirectorySandbox._remap_inputcOs6|j| s|j| r.|j|||f||||fS)z?Called for path pairs like rename, link, and symlink operations)rr)r;rrrrkrrrrrszDirectorySandbox._remap_paircOsB|t@r,|j| r,|jd|||f||tj|||f||S)zCalled for low-level os.open()zos.open) WRITE_FLAGSrrrsr)r;rzflagsrrkrrrrrszDirectorySandbox.openN)r)r)r)r5r6r7r8rifromkeysrr _EXCEPTIONSrcrryr{rrrrrrrrrrr ~s      cCsg|]}tt|dqS)r)rvrs)rEarrrrqsrqz4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYc@s&eZdZdZejdjZddZdS)r zEA setup script attempted to modify the filesystem outside the sandboxa SandboxViolation: {cmd}{args!r} {kwargs} The package setup script has attempted to modify files on your system that are not within the EasyInstall build area, and has been aborted. This package cannot be safely installed by EasyInstall, and may not support alternate installation locations even if you run its setup script by hand. Please inform the package's author and the EasyInstall maintainers to find out if a fix or workaround is available. cCs|j\}}}|jjftS)N)rktmplformatr)r;cmdrkkwargsrrr__str__s zSandboxViolation.__str__N) r5r6r7r8textwrapdedentlstriprrrrrrr s )N)N)=r&rr$operator functoolsrrW contextlibr,rZsetuptools.externrZsetuptools.extern.six.movesrrZpkg_resources.py31compatr"platformrDZ$org.python.modules.posix.PosixModulepythonrHposixZ PosixModulersrprzry NameErrorrr{Zdistutils.errorsrr__all__rcontextmanagerrr r%r*r.r+r:rMrKrQrVr[rSr rrorrr reduceor_splitrr rrrrs^             w  V PK!q}-4&=&="__pycache__/sandbox.cpython-36.pycnu[3 9f7 @sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZddlZejjdrddljjjjZn ejejZyeZWnek rdZYnXeZddlm Z ddlm!Z!ddd d gZ"d-d d Z#ej$d.d dZ%ej$ddZ&ej$ddZ'ej$ddZ(Gddde)Z*GdddZ+ej$ddZ,ddZ-ej$ddZ.ej$dd Z/d!d"Z0d#d$Z1d%d Z2Gd&ddZ3e4ed'rej5gZ6ngZ6Gd(dde3Z7ej8ej9d)d*d+j:DZ;Gd,d d e Z)r;r2r3rrrresumes zExceptionSaver.resumeN)r5r6r7r8r<r@rCrrrrr:rs r:c #sVtjjt }VWdQRXtjjfddtjD}t||jdS)z Context in which imported modules are saved. Translates exceptions internal to the context into the equivalent exception outside the context. Nc3s&|]}|kr|jd r|VqdS)z encodings.N) startswith).0mod_name)rrr szsave_modules..)rmodulescopyr:update_clear_modulesrC) saved_excZ del_modulesr)rr save_moduless  rMcCsxt|D] }tj|=q WdS)N)listrrH)Z module_namesrFrrrrKsrKc cs$tj}z |VWdtj|XdS)N)r" __getstate__ __setstate__)rrrrsave_pkg_resources_states rQc,cstjj|d}txtfttNt<t|(t |t ddVWdQRXWdQRXWdQRXWdQRXWdQRXWdQRXdS)NZtempZ setuptools) r&rjoinrQrMhide_setuptoolsr rr%r* __import__) setup_dirZtemp_dirrrr setup_contexts  rVcCstjd}t|j|S)aH >>> _needs_hiding('setuptools') True >>> _needs_hiding('pkg_resources') True >>> _needs_hiding('setuptools_plugin') False >>> _needs_hiding('setuptools.__init__') True >>> _needs_hiding('distutils') True >>> _needs_hiding('os') False >>> _needs_hiding('Cython') True z1(setuptools|pkg_resources|distutils|Cython)(\.|$))rerboolmatch)rFpatternrrr _needs_hidings r[cCstttj}t|dS)a% Remove references to setuptools' modules from sys.modules to allow the invocation to import the most appropriate setuptools. This technique is necessary to avoid issues such as #315 where setuptools upgrading itself would fail to find a function declared in the metadata. N)filterr[rrHrK)rHrrrrSs rScCstjjtjj|}t|y|gt|tjdd<tjjd|t j t j j ddt |trl|n |jtj}t|t|dd}t||WdQRXWn4tk r}z|jr|jdrʂWYdd}~XnXWdQRXdS)z8Run a distutils setup script, sandboxed in its directoryNrcSs|jS)N)Zactivate)Zdistrrrszrun_setup..__main__)__file__r5)r&rabspathdirnamerVrNrrinsertr__init__Z callbacksappend isinstancestrencodegetfilesystemencodingr dictr SystemExitargs)Z setup_scriptrkrUZ dunder_filensvrrrr s   c@s2eZdZdZdZddZddZddZd d Zd d Z d dZ x$d9D]Z e e e rFe e ee <qFWd:ddZer~edeZedeZx$d;D]Z e e e ree ee <qWd)d*Zx$drzDWrap 'os' module and 'open()' builtin for virtualizing setup scriptsFcsfddttD_dS)Ncs&g|]}|jd rt|r|qS)_)rDhasattr)rEname)r;rr sz,AbstractSandbox.__init__..)dir_os_attrs)r;r)r;rrcszAbstractSandbox.__init__cCs&x |jD]}tt|t||qWdS)N)rtsetattrr&getattr)r;sourcerprrr_copy s zAbstractSandbox._copycCs(|j|tr|jt_|jt_d|_dS)NT)rx_filerfile_openr_active)r;rrrr<s  zAbstractSandbox.__enter__cCs$d|_trtt_tt_|jtdS)NF)r|ryrrzr{rrxrs)r;exc_type exc_value tracebackrrrr@s zAbstractSandbox.__exit__c Cs||SQRXdS)zRun 'func' under os sandboxingNr)r;funcrrrrunszAbstractSandbox.runcsttfdd}|S)Ncs2|jr |j||f||\}}||f||S)N)r| _remap_pair)r;srcdstrkkw)rporiginalrrwrap&sz3AbstractSandbox._mk_dual_path_wrapper..wrap)rvrs)rprr)rprr_mk_dual_path_wrapper#s z%AbstractSandbox._mk_dual_path_wrapperrenamelinksymlinkNcs p ttfdd}|S)Ncs*|jr|j|f||}|f||S)N)r| _remap_input)r;rrkr)rprrrr4sz5AbstractSandbox._mk_single_path_wrapper..wrap)rvrs)rprrr)rprr_mk_single_path_wrapper1sz'AbstractSandbox._mk_single_path_wrapperrzrstatlistdirr(chmodchownmkdirremoveunlinkrmdirutimelchownchrootlstat startfilemkfifomknodpathconfaccesscsttfdd}|S)NcsB|jr2|j|f||}|j|f||S|f||S)N)r|r _remap_output)r;rrkr)rprrrrIsz4AbstractSandbox._mk_single_with_return..wrap)rvrs)rprr)rprr_mk_single_with_returnFs z&AbstractSandbox._mk_single_with_returnreadlinktempnamcsttfdd}|S)Ncs ||}|jr|j|S|S)N)r|r)r;rkrZretval)rprrrrXs  z'AbstractSandbox._mk_query..wrap)rvrs)rprr)rprr _mk_queryUs zAbstractSandbox._mk_queryr'tmpnamcCs|S)z=Called to remap or validate any path, whether input or outputr)r;rrrr_validate_pathdszAbstractSandbox._validate_pathcOs |j|S)zCalled for path inputs)r)r; operationrrkrrrrrhszAbstractSandbox._remap_inputcCs |j|S)zCalled for path outputs)r)r;rrrrrrlszAbstractSandbox._remap_outputcOs0|j|d|f|||j|d|f||fS)z?Called for path pairs like rename, link, and symlink operationsz-fromz-to)r)r;rrrrkrrrrrpszAbstractSandbox._remap_pair)rrr)N)rrr(rrrrrrrrrrrrrrrr)rr)r'r)r5r6r7r8r|rcrxr<r@rrrprorsrrryr{rrrrrrrrrrrsB          devnullc@seZdZdZejdddddddd d d d d dg ZdgZefddZ ddZ e rXd'ddZ d(ddZ ddZ ddZddZdd Zd!d"Zd)d$d%Zd&S)*r z.) r&rrr_sandboxrR_prefix _exceptionsrrc)r;Zsandbox exceptionsrrrrcs  zDirectorySandbox.__init__cOsddlm}||||dS)Nr)r )r/r )r;rrkrr rrr _violations zDirectorySandbox._violationrcOs<|dkr*|j| r*|jd||f||t||f||S)Nrrtr rUUrz)rrr rr)_okrry)r;rrrkrrrrryszDirectorySandbox._filecOs<|dkr*|j| r*|jd||f||t||f||S)Nrrr rrr)rrr rr)rrr{)r;rrrkrrrrr{szDirectorySandbox._opencCs|jddS)Nr)r)r;rrrrszDirectorySandbox.tmpnamc CsN|j}z:d|_tjjtjj|}|j|p@||jkp@|j|jS||_XdS)NF) r|r&rrr _exemptedrrDr)r;rZactiverrrrrs   zDirectorySandbox._okcs<fdd|jD}fdd|jD}tj||}t|S)Nc3s|]}j|VqdS)N)rD)rEZ exception)filepathrrrGsz-DirectorySandbox._exempted..c3s|]}tj|VqdS)N)rWrY)rErZ)rrrrGs)r_exception_patterns itertoolschainany)r;rZ start_matchesZpattern_matchesZ candidatesr)rrrs      zDirectorySandbox._exemptedcOs6||jkr2|j| r2|j|tjj|f|||S)zCalled for path inputs) write_opsrrr&rr)r;rrrkrrrrrszDirectorySandbox._remap_inputcOs6|j| s|j| r.|j|||f||||fS)z?Called for path pairs like rename, link, and symlink operations)rr)r;rrrrkrrrrrszDirectorySandbox._remap_paircOsB|t@r,|j| r,|jd|||f||tj|||f||S)zCalled for low-level os.open()zos.open) WRITE_FLAGSrrrsr)r;rzflagsrrkrrrrrszDirectorySandbox.openN)r)r)r)r5r6r7r8rifromkeysrr _EXCEPTIONSrcrryr{rrrrrrrrrrr ~s      cCsg|]}tt|dqS)r)rvrs)rEarrrrqsrqz4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYc@s&eZdZdZejdjZddZdS)r zEA setup script attempted to modify the filesystem outside the sandboxa SandboxViolation: {cmd}{args!r} {kwargs} The package setup script has attempted to modify files on your system that are not within the EasyInstall build area, and has been aborted. This package cannot be safely installed by EasyInstall, and may not support alternate installation locations even if you run its setup script by hand. Please inform the package's author and the EasyInstall maintainers to find out if a fix or workaround is available. cCs|j\}}}|jjftS)N)rktmplformatr)r;cmdrkkwargsrrr__str__s zSandboxViolation.__str__N) r5r6r7r8textwrapdedentlstriprrrrrrr s )N)N)=r&rr$operator functoolsrrW contextlibr,rZsetuptools.externrZsetuptools.extern.six.movesrrZpkg_resources.py31compatr"platformrDZ$org.python.modules.posix.PosixModulepythonrHposixZ PosixModulersrprzry NameErrorrr{Zdistutils.errorsrr__all__rcontextmanagerrr r%r*r.r+r:rMrKrQrVr[rSr rrorrr reduceor_splitrr rrrrs^             w  V PK!1=ǝ+__pycache__/site-patch.cpython-36.opt-1.pycnu[3 9f @sddZedkre[dS)cCsddl}ddl}|jjd}|dks4|jdkr:| r:g}n |j|j}t|di}|jt |d}|jj t }x|D]}||ksv| rqv|j|}|dk r|j d}|dk r|j dPqvy ddl} | j d|g\} } } Wntk rwvYnX| dkrqvz| j d| | | Wd| jXPqvWtdtdd|jD} t|d d}d|_x|D]}t|qXW|j|7_t|d\}}d}g}xl|jD]b}t|\}}||kr|dkrt |}|| ks|dkr|j|n|j|||d 7}qW||jdd<dS) N PYTHONPATHZwin32path_importer_cachesitez$Couldn't find the real 'site' modulecSsg|]}t|ddfqS))makepath).0itemr /usr/lib/python3.6/site-patch.py )sz__boot.. __egginsertr)sysosenvirongetplatformsplitpathsepgetattrpathlendirname__file__ find_module load_moduleimp ImportErrorclosedictr addsitedirrappendinsert)r rrZpicZstdpathZmydirrZimporterloaderrstreamrZdescr known_pathsZoldposdZndZ insert_atnew_pathpZnpr r r __boots`               r(rN)r(__name__r r r r sGPK!1=ǝ%__pycache__/site-patch.cpython-36.pycnu[3 9f @sddZedkre[dS)cCsddl}ddl}|jjd}|dks4|jdkr:| r:g}n |j|j}t|di}|jt |d}|jj t }x|D]}||ksv| rqv|j|}|dk r|j d}|dk r|j dPqvy ddl} | j d|g\} } } Wntk rwvYnX| dkrqvz| j d| | | Wd| jXPqvWtdtdd|jD} t|d d}d|_x|D]}t|qXW|j|7_t|d\}}d}g}xl|jD]b}t|\}}||kr|dkrt |}|| ks|dkr|j|n|j|||d 7}qW||jdd<dS) N PYTHONPATHZwin32path_importer_cachesitez$Couldn't find the real 'site' modulecSsg|]}t|ddfqS))makepath).0itemr /usr/lib/python3.6/site-patch.py )sz__boot.. __egginsertr)sysosenvirongetplatformsplitpathsepgetattrpathlendirname__file__ find_module load_moduleimp ImportErrorclosedictr addsitedirrappendinsert)r rrZpicZstdpathZmydirrZimporterloaderrstreamrZdescr known_pathsZoldposdZndZ insert_atnew_pathpZnpr r r __boots`               r(rN)r(__name__r r r r sGPK!w==,__pycache__/ssl_support.cpython-36.opt-1.pycnu[3 9f,!"@sddlZddlZddlZddlZddlZddlmZmZmZm Z ddl m Z m Z y ddl Z Wnek rtdZ YnXdddddgZd jjZyejjZejZWnek reZZYnXe dk oeeefkZydd l mZmZWnRek r:ydd lmZdd lmZWnek r4dZdZYnXYnXesRGd ddeZesjdddZddZGdddeZGdddeZd ddZ ddZ!e!ddZ"ddZ#ddZ$dS)!N)urllib http_clientmapfilter)ResolutionErrorExtractionErrorVerifyingHTTPSHandlerfind_ca_bundle is_available cert_paths opener_fora /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt /usr/share/ssl/certs/ca-bundle.crt /usr/local/share/certs/ca-root.crt /etc/ssl/cert.pem /System/Library/OpenSSL/certs/cert.pem /usr/local/share/certs/ca-root-nss.crt /etc/ssl/ca-bundle.pem )CertificateErrormatch_hostname)r )rc@s eZdZdS)r N)__name__ __module__ __qualname__rr!/usr/lib/python3.6/ssl_support.pyr 5sr c Csg}|s dS|jd}|d}|dd}|jd}||krLtdt||s`|j|jkS|dkrt|jdn>|jd s|jd r|jtj|n|jtj|j d d x|D]}|jtj|qWtj d d j |dtj } | j |S)zpMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 F.rrN*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)splitcountr reprlowerappend startswithreescapereplacecompilejoin IGNORECASEmatch) ZdnhostnameZ max_wildcardsZpatspartsZleftmostZ remainderZ wildcardsZfragZpatrrr_dnsname_match;s*     r&cCs|s tdg}|jdf}x0|D](\}}|dkr"t||r@dS|j|q"W|sxF|jdfD]6}x0|D](\}}|dkrjt||rdS|j|qjWq`Wt|dkrtd|d jtt|fn*t|dkrtd ||d fntd dS) a=Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. zempty or no certificateZsubjectAltNameZDNSNZsubjectZ commonNamerz&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rrz=no appropriate commonName or subjectAltName fields were found) ValueErrorgetr&rlenr r!rr)Zcertr$ZdnsnamesZsankeyvaluesubrrrros.     rc@s eZdZdZddZddZdS)rz=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|dS)N) ca_bundle HTTPSHandler__init__)selfr-rrrr/szVerifyingHTTPSHandler.__init__csjfdd|S)Ncst|jf|S)N)VerifyingHTTPSConnr-)hostkw)r0rrsz2VerifyingHTTPSHandler.https_open..)Zdo_open)r0Zreqr)r0r https_opensz VerifyingHTTPSHandler.https_openN)rrr__doc__r/r5rrrrrsc@s eZdZdZddZddZdS)r1z@Simple verifying connection: no auth, subclasses, timeouts, etc.cKstj||f|||_dS)N)HTTPSConnectionr/r-)r0r2r-r3rrrr/szVerifyingHTTPSConn.__init__c Cstj|j|jft|dd}t|drHt|ddrH||_|j|j}n|j}tt drxt j |j d}|j ||d|_nt j |t j |j d|_yt|jj|Wn.tk r|jjtj|jjYnXdS)NZsource_address_tunnel _tunnel_hostcreate_default_context)Zcafile)Zserver_hostname)Z cert_reqsZca_certs)socketZcreate_connectionr2Zportgetattrhasattrsockr8r9sslr:r-Z wrap_socketZ CERT_REQUIREDrZ getpeercertr ZshutdownZ SHUT_RDWRclose)r0r>Z actual_hostZctxrrrconnects$  zVerifyingHTTPSConn.connectN)rrrr6r/rArrrrr1sr1cCstjjt|ptjS)z@Get a urlopen() replacement that uses ca_bundle for verification)rrequestZ build_openerrr open)r-rrrr scstjfdd}|S)Ncstds||_jS)Nalways_returns)r=rD)argskwargs)funcrrwrappers  zonce..wrapper) functoolswraps)rGrHr)rGroncesrKc sXy ddl}Wntk r dSXGfddd|j}|jd|jd|jS)Nrcs,eZdZfddZfddZZS)z"get_win_certfile..CertFilecst|jtj|jdS)N)superr/atexitregisterr@)r0)CertFile __class__rrr/sz+get_win_certfile..CertFile.__init__c s,yt|jWntk r&YnXdS)N)rLr@OSError)r0)rOrPrrr@sz(get_win_certfile..CertFile.close)rrrr/r@ __classcell__r)rO)rPrrOsrOZCAZROOT) wincertstore ImportErrorrOZaddstorename)rSZ _wincertsr)rOrget_win_certfiles    rVcCs$ttjjt}tp"t|dp"tS)z*Return an existing CA bundle path, or NoneN)rospathisfiler rVnext_certifi_where)Zextant_cert_pathsrrrr s c Cs,y tdjStttfk r&YnXdS)NZcertifi) __import__whererTrrrrrrr[s r[)r)N)%rWr;rMrrIZsetuptools.extern.six.movesrrrrZ pkg_resourcesrrr?rT__all__striprr rBr.r7AttributeErrorobjectr r rZbackports.ssl_match_hostnamer'r&rr1r rKrVr r[rrrrsP      4) (   PK!w==&__pycache__/ssl_support.cpython-36.pycnu[3 9f,!"@sddlZddlZddlZddlZddlZddlmZmZmZm Z ddl m Z m Z y ddl Z Wnek rtdZ YnXdddddgZd jjZyejjZejZWnek reZZYnXe dk oeeefkZydd l mZmZWnRek r:ydd lmZdd lmZWnek r4dZdZYnXYnXesRGd ddeZesjdddZddZGdddeZGdddeZd ddZ ddZ!e!ddZ"ddZ#ddZ$dS)!N)urllib http_clientmapfilter)ResolutionErrorExtractionErrorVerifyingHTTPSHandlerfind_ca_bundle is_available cert_paths opener_fora /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt /usr/share/ssl/certs/ca-bundle.crt /usr/local/share/certs/ca-root.crt /etc/ssl/cert.pem /System/Library/OpenSSL/certs/cert.pem /usr/local/share/certs/ca-root-nss.crt /etc/ssl/ca-bundle.pem )CertificateErrormatch_hostname)r )rc@s eZdZdS)r N)__name__ __module__ __qualname__rr!/usr/lib/python3.6/ssl_support.pyr 5sr c Csg}|s dS|jd}|d}|dd}|jd}||krLtdt||s`|j|jkS|dkrt|jdn>|jd s|jd r|jtj|n|jtj|j d d x|D]}|jtj|qWtj d d j |dtj } | j |S)zpMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 F.rrN*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)splitcountr reprlowerappend startswithreescapereplacecompilejoin IGNORECASEmatch) ZdnhostnameZ max_wildcardsZpatspartsZleftmostZ remainderZ wildcardsZfragZpatrrr_dnsname_match;s*     r&cCs|s tdg}|jdf}x0|D](\}}|dkr"t||r@dS|j|q"W|sxF|jdfD]6}x0|D](\}}|dkrjt||rdS|j|qjWq`Wt|dkrtd|d jtt|fn*t|dkrtd ||d fntd dS) a=Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. zempty or no certificateZsubjectAltNameZDNSNZsubjectZ commonNamerz&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rrz=no appropriate commonName or subjectAltName fields were found) ValueErrorgetr&rlenr r!rr)Zcertr$ZdnsnamesZsankeyvaluesubrrrros.     rc@s eZdZdZddZddZdS)rz=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|dS)N) ca_bundle HTTPSHandler__init__)selfr-rrrr/szVerifyingHTTPSHandler.__init__csjfdd|S)Ncst|jf|S)N)VerifyingHTTPSConnr-)hostkw)r0rrsz2VerifyingHTTPSHandler.https_open..)Zdo_open)r0Zreqr)r0r https_opensz VerifyingHTTPSHandler.https_openN)rrr__doc__r/r5rrrrrsc@s eZdZdZddZddZdS)r1z@Simple verifying connection: no auth, subclasses, timeouts, etc.cKstj||f|||_dS)N)HTTPSConnectionr/r-)r0r2r-r3rrrr/szVerifyingHTTPSConn.__init__c Cstj|j|jft|dd}t|drHt|ddrH||_|j|j}n|j}tt drxt j |j d}|j ||d|_nt j |t j |j d|_yt|jj|Wn.tk r|jjtj|jjYnXdS)NZsource_address_tunnel _tunnel_hostcreate_default_context)Zcafile)Zserver_hostname)Z cert_reqsZca_certs)socketZcreate_connectionr2Zportgetattrhasattrsockr8r9sslr:r-Z wrap_socketZ CERT_REQUIREDrZ getpeercertr ZshutdownZ SHUT_RDWRclose)r0r>Z actual_hostZctxrrrconnects$  zVerifyingHTTPSConn.connectN)rrrr6r/rArrrrr1sr1cCstjjt|ptjS)z@Get a urlopen() replacement that uses ca_bundle for verification)rrequestZ build_openerrr open)r-rrrr scstjfdd}|S)Ncstds||_jS)Nalways_returns)r=rD)argskwargs)funcrrwrappers  zonce..wrapper) functoolswraps)rGrHr)rGroncesrKc sXy ddl}Wntk r dSXGfddd|j}|jd|jd|jS)Nrcs,eZdZfddZfddZZS)z"get_win_certfile..CertFilecst|jtj|jdS)N)superr/atexitregisterr@)r0)CertFile __class__rrr/sz+get_win_certfile..CertFile.__init__c s,yt|jWntk r&YnXdS)N)rLr@OSError)r0)rOrPrrr@sz(get_win_certfile..CertFile.close)rrrr/r@ __classcell__r)rO)rPrrOsrOZCAZROOT) wincertstore ImportErrorrOZaddstorename)rSZ _wincertsr)rOrget_win_certfiles    rVcCs$ttjjt}tp"t|dp"tS)z*Return an existing CA bundle path, or NoneN)rospathisfiler rVnext_certifi_where)Zextant_cert_pathsrrrr s c Cs,y tdjStttfk r&YnXdS)NZcertifi) __import__whererTrrrrrrr[s r[)r)N)%rWr;rMrrIZsetuptools.extern.six.movesrrrrZ pkg_resourcesrrr?rT__all__striprr rBr.r7AttributeErrorobjectr r rZbackports.ssl_match_hostnamer'r&rr1r rKrVr r[rrrrsP      4) (   PK!RzTLL.__pycache__/unicode_utils.cpython-36.opt-1.pycnu[3 9f@s8ddlZddlZddlmZddZddZddZdS) N)sixc CsVt|tjrtjd|Sy$|jd}tjd|}|jd}Wntk rPYnX|S)NZNFDzutf-8) isinstancer text_type unicodedataZ normalizedecodeencode UnicodeError)pathr #/usr/lib/python3.6/unicode_utils.py decomposes    r c CsXt|tjr|Stjpd}|df}x.|D]&}y |j|Stk rNw*Yq*Xq*WdS)zY Ensure that the given path is decoded, NONE when no expected encoding works zutf-8N)rrrsysgetfilesystemencodingrUnicodeDecodeError)r Zfs_encZ candidatesencr r r filesys_decodes    rc Cs$y |j|Stk rdSXdS)z/turn unicode encoding into a functional routineN)rUnicodeEncodeError)stringrr r r try_encode's r)rr Zsetuptools.externrr rrr r r r s   PK!RzTLL(__pycache__/unicode_utils.cpython-36.pycnu[3 9f@s8ddlZddlZddlmZddZddZddZdS) N)sixc CsVt|tjrtjd|Sy$|jd}tjd|}|jd}Wntk rPYnX|S)NZNFDzutf-8) isinstancer text_type unicodedataZ normalizedecodeencode UnicodeError)pathr #/usr/lib/python3.6/unicode_utils.py decomposes    r c CsXt|tjr|Stjpd}|df}x.|D]&}y |j|Stk rNw*Yq*Xq*WdS)zY Ensure that the given path is decoded, NONE when no expected encoding works zutf-8N)rrrsysgetfilesystemencodingrUnicodeDecodeError)r Zfs_encZ candidatesencr r r filesys_decodes    rc Cs$y |j|Stk rdSXdS)z/turn unicode encoding into a functional routineN)rUnicodeEncodeError)stringrr r r try_encode's r)rr Zsetuptools.externrr rrr r r r s   PK!;X(__pycache__/version.cpython-36.opt-1.pycnu[3 9f @s6ddlZyejdjZWnek r0dZYnXdS)NZ setuptoolsunknown)Z pkg_resourcesZget_distributionversion __version__ Exceptionrr/usr/lib/python3.6/version.pysPK!;X"__pycache__/version.cpython-36.pycnu[3 9f @s6ddlZyejdjZWnek r0dZYnXdS)NZ setuptoolsunknown)Z pkg_resourcesZget_distributionversion __version__ Exceptionrr/usr/lib/python3.6/version.pysPK!}  &__pycache__/wheel.cpython-36.opt-1.pycnu[3 9fb@sdZddlmZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z ddl mZddlmZddlm ZddlmZdd lmZejd ejjZd Zd d ZGdddeZdS)zWheels support.) get_platformN) Distribution PathMetadata parse_version)canonicalize_name)PY3)r) pep425tags)write_requirementsz^(?P.+?)-(?P\d.*?) ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) )\.whl$ztry: __import__('pkg_resources').declare_namespace(__name__) except ImportError: __path__ = __import__('pkgutil').extend_path(__path__, __name__) c Csxtj|D]\}}}tjj||}x6|D].}tjj||}tjj|||}tj||q*WxXttt|D]D\} } tjj|| }tjj||| }tjj |sntj|||| =qnWq Wx&tj|ddD]\}}}tj |qWdS)zDMove everything under `src_dir` to `dst_dir`, and delete the former.T)topdownN) oswalkpathrelpathjoinrenamesreversedlist enumerateexistsrmdir) Zsrc_dirZdst_dirdirpathZdirnames filenamessubdirfsrcdstndr/usr/lib/python3.6/wheel.pyunpack!s   r c@s<eZdZddZddZddZddZd d Zd d Zd S)WheelcCsTttjj|}|dkr$td|||_x$|jjD]\}}t|||q8WdS)Nzinvalid wheel name: %r) WHEEL_NAMEr r basename ValueErrorfilename groupdictitemssetattr)selfr%matchkvrrr__init__9s  zWheel.__init__cCs&tj|jjd|jjd|jjdS)z>List tags (py_version, abi, platform) supported by this wheel..) itertoolsproduct py_versionsplitabiplatform)r)rrrtagsAs z Wheel.tagscs$tjtfdd|jDdS)z5Is the wheel is compatible with the current platform?c3s|]}|krdVqdS)TNr).0t)supported_tagsrr Jsz&Wheel.is_compatible..F)rZ get_supportednextr5)r)r)r8r is_compatibleGszWheel.is_compatiblecCs*t|j|j|jdkrdntdjdS)Nany) project_nameversionr4z.egg)rr=r>r4regg_name)r)rrrr?LszWheel.egg_namecCsJx<|jD]0}tj|}|jdr t|jt|jr |Sq WtddS)Nz .dist-infoz.unsupported wheel format. .dist-info not found)Znamelist posixpathdirnameendswithr startswithr=r$)r)zfmemberrArrr get_dist_infoRs   zWheel.get_dist_infocstj|jd|j|jf}|jd|fdd}|d}|d}t|jd}td|koxtd knstd |t j |j |t j j |tj|t|d d d tttjfddjD}t j j |d}t j|t jt j j |dt j j |dtt|dd} t| jddt j j |dt j j |t j j d} t j j| rt j j |dd} t j | xVt j| D]H} | jdrt jt j j | | n t jt j j | | t j j | | qWt j| x0t t j jfddd#DD]} t!| |q$Wt j jrPt jt j j |d}t j j|rt"|}|j#j$}WdQRXxr|D]j}t j j |f|j$d }t j j |d!}t j j|rt j j| rt"|d"}|j%t&WdQRXqWWdQRXdS)$z"Install wheel as an egg directory.z%s-%sz%s.datac sHjtj|,}tr&|jjdn|j}tjjj |SQRXdS)Nzutf-8) openr@rrreaddecodeemailparserZParserZparsestr)namefpvalue) dist_inforDrr get_metadatabsz*Wheel.install_as_egg..get_metadataZWHEELZMETADATAz Wheel-Versionz1.0z2.0dev0z$unsupported wheel format version: %s)ZmetadatacSsd|_t|S)N)Zmarkerstr)reqrrrraw_reqxsz%Wheel.install_as_egg..raw_reqc s6i|].}ttfddtj|fD|qS)c3s|]}|kr|VqdS)Nr)r6rR)install_requiresrrr9~sz2Wheel.install_as_egg...)rsortedmaprequires)r6Zextra)distrTrSrr |sz(Wheel.install_as_egg..zEGG-INFOzPKG-INFO)rTextras_require)Zattrsegg_infoNz requires.txtscriptsz.pycc3s|]}tjj|VqdS)N)r r r)r6r) dist_datarrr9sz'Wheel.install_as_egg..dataheaderspurelibplatlibznamespace_packages.txtr.z __init__.pyw)r^r_r`ra)'zipfileZZipFiler%r=r>rFrgetr$r mkdirZ extractallr rrZ from_locationrrrUrVrWZextrasrenameSetuptoolsDistributiondictr Zget_command_objrlistdirrBunlinkrfilterr rGrHr2writeNAMESPACE_PACKAGE_INIT)r)Zdestination_eggdirZ dist_basenamerPZwheel_metadataZ dist_metadataZ wheel_versionrZr[Z setup_distZdist_data_scriptsZegg_info_scriptsentryrZnamespace_packagesrMmodZmod_dirZmod_initr)rXr]rOrTrSrDrinstall_as_egg\sr                  zWheel.install_as_eggN) __name__ __module__ __qualname__r-r5r;r?rFrprrrrr!7s  r!)__doc__Zdistutils.utilrrJr/r r@rercZ pkg_resourcesrrrZ!setuptools.extern.packaging.utilsrZsetuptools.extern.sixrZ setuptoolsrgrZsetuptools.command.egg_infor compileVERBOSEr*r"rmr objectr!rrrrs&       PK!s|$%% __pycache__/wheel.cpython-36.pycnu[3 9fb@sdZddlmZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z ddl mZddlmZddlm ZddlmZdd lmZejd ejjZd Zd d ZGdddeZdS)zWheels support.) get_platformN) Distribution PathMetadata parse_version)canonicalize_name)PY3)r) pep425tags)write_requirementsz^(?P.+?)-(?P\d.*?) ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) )\.whl$ztry: __import__('pkg_resources').declare_namespace(__name__) except ImportError: __path__ = __import__('pkgutil').extend_path(__path__, __name__) c Csxtj|D]\}}}tjj||}x6|D].}tjj||}tjj|||}tj||q*WxXttt|D]D\} } tjj|| }tjj||| }tjj |sntj|||| =qnWq Wx0tj|ddD]\}}}| st tj |qWdS)zDMove everything under `src_dir` to `dst_dir`, and delete the former.T)topdownN) oswalkpathrelpathjoinrenamesreversedlist enumerateexistsAssertionErrorrmdir) Zsrc_dirZdst_dirdirpathZdirnames filenamessubdirfsrcdstndr/usr/lib/python3.6/wheel.pyunpack!s    r!c@s<eZdZddZddZddZddZd d Zd d Zd S)WheelcCsTttjj|}|dkr$td|||_x$|jjD]\}}t|||q8WdS)Nzinvalid wheel name: %r) WHEEL_NAMEr r basename ValueErrorfilename groupdictitemssetattr)selfr&matchkvrrr __init__9s  zWheel.__init__cCs&tj|jjd|jjd|jjdS)z>List tags (py_version, abi, platform) supported by this wheel..) itertoolsproduct py_versionsplitabiplatform)r*rrr tagsAs z Wheel.tagscs$tjtfdd|jDdS)z5Is the wheel is compatible with the current platform?c3s|]}|krdVqdS)TNr).0t)supported_tagsrr Jsz&Wheel.is_compatible..F)rZ get_supportednextr6)r*r)r9r is_compatibleGszWheel.is_compatiblecCs*t|j|j|jdkrdntdjdS)Nany) project_nameversionr5z.egg)rr>r?r5regg_name)r*rrr r@LszWheel.egg_namecCsJx<|jD]0}tj|}|jdr t|jt|jr |Sq WtddS)Nz .dist-infoz.unsupported wheel format. .dist-info not found)Znamelist posixpathdirnameendswithr startswithr>r%)r*zfmemberrBrrr get_dist_infoRs   zWheel.get_dist_infocstj|jd|j|jf}|jd|fdd}|d}|d}t|jd}td|koxtd knstd |t j |j |t j j |tj|t|d d d tttjfddjD}t j j |d}t j|t jt j j |dt j j |dtt|dd} t| jddt j j |dt j j |t j j d} t j j| rt j j |dd} t j | xVt j| D]H} | jdrt jt j j | | n t jt j j | | t j j | | qWt j| x0t t j jfddd#DD]} t!| |q$Wt j jrPt jt j j |d}t j j|rt"|}|j#j$}WdQRXxr|D]j}t j j |f|j$d }t j j |d!}t j j|rt j j| rt"|d"}|j%t&WdQRXqWWdQRXdS)$z"Install wheel as an egg directory.z%s-%sz%s.datac sHjtj|,}tr&|jjdn|j}tjjj |SQRXdS)Nzutf-8) openrArrreaddecodeemailparserZParserZparsestr)namefpvalue) dist_inforErr get_metadatabsz*Wheel.install_as_egg..get_metadataZWHEELZMETADATAz Wheel-Versionz1.0z2.0dev0z$unsupported wheel format version: %s)ZmetadatacSsd|_t|S)N)Zmarkerstr)reqrrr raw_reqxsz%Wheel.install_as_egg..raw_reqc s6i|].}ttfddtj|fD|qS)c3s|]}|kr|VqdS)Nr)r7rS)install_requiresrr r:~sz2Wheel.install_as_egg...)rsortedmaprequires)r7Zextra)distrUrTrr |sz(Wheel.install_as_egg..zEGG-INFOzPKG-INFO)rUextras_require)Zattrsegg_infoNz requires.txtscriptsz.pycc3s|]}tjj|VqdS)N)r r r)r7r) dist_datarr r:sz'Wheel.install_as_egg..dataheaderspurelibplatlibznamespace_packages.txtr/z __init__.pyw)r_r`rarb)'zipfileZZipFiler&r>r?rGrgetr%r mkdirZ extractallr rrZ from_locationrrrVrWrXZextrasrenameSetuptoolsDistributiondictr Zget_command_objrlistdirrCunlinkrfilterr!rHrIr3writeNAMESPACE_PACKAGE_INIT)r*Zdestination_eggdirZ dist_basenamerQZwheel_metadataZ dist_metadataZ wheel_versionr[r\Z setup_distZdist_data_scriptsZegg_info_scriptsentryrZnamespace_packagesrNmodZmod_dirZmod_initr)rYr^rPrUrTrEr install_as_egg\sr                  zWheel.install_as_eggN) __name__ __module__ __qualname__r.r6r<r@rGrqrrrr r"7s  r")__doc__Zdistutils.utilrrKr0r rArerdZ pkg_resourcesrrrZ!setuptools.extern.packaging.utilsrZsetuptools.extern.sixrZ setuptoolsrhrZsetuptools.command.egg_infor compileVERBOSEr+r#rnr!objectr"rrrr s&       PK!u 0__pycache__/windows_support.cpython-36.opt-1.pycnu[3 9f@s(ddlZddlZddZeddZdS)NcCstjdkrddS|S)NZWindowsc_sdS)N)argskwargsrr%/usr/lib/python3.6/windows_support.pyszwindows_only..)platformsystem)funcrrr windows_onlys r cCsLtdtjjj}tjjtjjf|_tjj |_ d}|||}|sHtj dS)z Set the hidden attribute on a file or directory. From http://stackoverflow.com/questions/19622133/ `path` must be text. zctypes.wintypesN) __import__ctypesZwindllZkernel32ZSetFileAttributesWZwintypesZLPWSTRZDWORDZargtypesZBOOLZrestypeZWinError)pathZSetFileAttributesFILE_ATTRIBUTE_HIDDENretrrr hide_file s    r)rr r rrrrrsPK!u *__pycache__/windows_support.cpython-36.pycnu[3 9f@s(ddlZddlZddZeddZdS)NcCstjdkrddS|S)NZWindowsc_sdS)N)argskwargsrr%/usr/lib/python3.6/windows_support.pyszwindows_only..)platformsystem)funcrrr windows_onlys r cCsLtdtjjj}tjjtjjf|_tjj |_ d}|||}|sHtj dS)z Set the hidden attribute on a file or directory. From http://stackoverflow.com/questions/19622133/ `path` must be text. zctypes.wintypesN) __import__ctypesZwindllZkernel32ZSetFileAttributesWZwintypesZLPWSTRZDWORDZargtypesZBOOLZrestypeZWinError)pathZSetFileAttributesFILE_ATTRIBUTE_HIDDENretrrr hide_file s    r)rr r rrrrrsPK!h[KK)__pycache__/__init__.cpython-36.opt-1.pycnu[3 9fD@s2dZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z ddl ZddlmZddlmZmZddlmZd d lmZd d d ddddgZejjZdZdZdgZGdddeZGdddeZ ej!Z"ddZ#dd Z$ej%j$je$_ej&ej%j'Z(Gddde(Z'ddZ)ej*fddZ+ej,dS) z@Extensions to the 'distutils' for large or complex distributionsN) convert_path) fnmatchcase)filtermap) Extension) DistributionFeature)Require)monkeysetuprrCommandrr find_packagesTz lib2to3.fixesc@sHeZdZdZedfd fddZeddZedd Zed d Z d S) PackageFinderzI Generate a list of all Python packages found within a directory .*cCs&t|jt||jd||j|S)a Return a list all Python packages found within directory 'where' 'where' is the root directory which will be searched for packages. It should be supplied as a "cross-platform" (i.e. URL-style) path; it will be converted to the appropriate local path syntax. 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). 'include' is a sequence of package names to include. If it's specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. ez_setup *__pycache__)rr)list_find_packages_iterr _build_filter)clswhereexcludeincluder/usr/lib/python3.6/__init__.pyfind's zPackageFinder.findc csxtj|ddD]\}}}|dd}g|dd<xp|D]h}tjj||} tjj| |} | jtjjd} d|ks8|j|  r~q8|| r||  r| V|j|q8WqWdS)zy All the packages found in 'where' that pass the 'include' filter, but not the 'exclude' filter. T) followlinksNr) oswalkpathjoinrelpathreplacesep_looks_like_packageappend) rrrrrootdirsfilesZall_dirsdir full_pathZrel_pathpackagerrrr>s   z!PackageFinder._find_packages_itercCstjjtjj|dS)z%Does a directory look like a package?z __init__.py)rr!isfiler")r!rrrr&Zsz!PackageFinder._looks_like_packagecs fddS)z Given a list of patterns, return a callable that will be true only if the input matches at least one of the patterns. cstfddDS)Nc3s|]}t|dVqdS))patN)r).0r/)namerr esz@PackageFinder._build_filter....)any)r1)patterns)r1resz-PackageFinder._build_filter..r)r4r)r4rr_szPackageFinder._build_filterN)r) __name__ __module__ __qualname____doc__ classmethodrr staticmethodr&rrrrrr"s   rc@seZdZeddZdS)PEP420PackageFindercCsdS)NTr)r!rrrr&isz'PEP420PackageFinder._looks_like_packageN)r6r7r8r;r&rrrrr<hsr<cCs@tjjtdd|jD}|jdd|jr<|j|jdS)Ncss"|]\}}|dkr||fVqdS)dependency_linkssetup_requiresN)r=r>r)r0kvrrrr2usz*_install_setup_requires..T)Zignore_option_errors) distutilscorerdictitemsZparse_config_filesr>Zfetch_build_eggs)attrsdistrrr_install_setup_requiresqs  rGcKst|tjjf|S)N)rGrArBr )rErrrr ~sc@s(eZdZejZdZddZdddZdS) r FcKstj||t|j|dS)zj Construct the command for dist, updating vars(self) with any keyword parameters. N)_Command__init__varsupdate)selfrFkwrrrrIs zCommand.__init__rcKs tj|||}t|j||S)N)rHreinitialize_commandrJrK)rLZcommandZreinit_subcommandsrMcmdrrrrNszCommand.reinitialize_commandN)r)r6r7r8rHr9Zcommand_consumes_argumentsrIrNrrrrr scCs&ddtj|ddD}ttjj|S)z% Find all files under 'path' css,|]$\}}}|D]}tjj||VqqdS)N)rr!r")r0baser)r*filerrrr2sz#_find_all_simple..T)r)rr rr!r.)r!resultsrrr_find_all_simplesrScCs6t|}|tjkr.tjtjj|d}t||}t|S)z Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. )start) rSrcurdir functoolspartialr!r#rr)r+r*Zmake_relrrrfindalls   rX)-r9rrVZdistutils.corerAZdistutils.filelistZdistutils.utilrZfnmatchrZsetuptools.extern.six.movesrrZsetuptools.versionZ setuptoolsZsetuptools.extensionrZsetuptools.distrrZsetuptools.dependsr r __all__version __version__Zbootstrap_install_fromZrun_2to3_on_doctestsZlib2to3_fixer_packagesobjectrr<rrrGr rBZ get_unpatchedr rHrSrUrXZ patch_allrrrrs:      F    PK!h[KK#__pycache__/__init__.cpython-36.pycnu[3 9fD@s2dZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z ddl ZddlmZddlmZmZddlmZd d lmZd d d ddddgZejjZdZdZdgZGdddeZGdddeZ ej!Z"ddZ#dd Z$ej%j$je$_ej&ej%j'Z(Gddde(Z'ddZ)ej*fddZ+ej,dS) z@Extensions to the 'distutils' for large or complex distributionsN) convert_path) fnmatchcase)filtermap) Extension) DistributionFeature)Require)monkeysetuprrCommandrr find_packagesTz lib2to3.fixesc@sHeZdZdZedfd fddZeddZedd Zed d Z d S) PackageFinderzI Generate a list of all Python packages found within a directory .*cCs&t|jt||jd||j|S)a Return a list all Python packages found within directory 'where' 'where' is the root directory which will be searched for packages. It should be supplied as a "cross-platform" (i.e. URL-style) path; it will be converted to the appropriate local path syntax. 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). 'include' is a sequence of package names to include. If it's specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. ez_setup *__pycache__)rr)list_find_packages_iterr _build_filter)clswhereexcludeincluder/usr/lib/python3.6/__init__.pyfind's zPackageFinder.findc csxtj|ddD]\}}}|dd}g|dd<xp|D]h}tjj||} tjj| |} | jtjjd} d|ks8|j|  r~q8|| r||  r| V|j|q8WqWdS)zy All the packages found in 'where' that pass the 'include' filter, but not the 'exclude' filter. T) followlinksNr) oswalkpathjoinrelpathreplacesep_looks_like_packageappend) rrrrrootdirsfilesZall_dirsdir full_pathZrel_pathpackagerrrr>s   z!PackageFinder._find_packages_itercCstjjtjj|dS)z%Does a directory look like a package?z __init__.py)rr!isfiler")r!rrrr&Zsz!PackageFinder._looks_like_packagecs fddS)z Given a list of patterns, return a callable that will be true only if the input matches at least one of the patterns. cstfddDS)Nc3s|]}t|dVqdS))patN)r).0r/)namerr esz@PackageFinder._build_filter....)any)r1)patterns)r1resz-PackageFinder._build_filter..r)r4r)r4rr_szPackageFinder._build_filterN)r) __name__ __module__ __qualname____doc__ classmethodrr staticmethodr&rrrrrr"s   rc@seZdZeddZdS)PEP420PackageFindercCsdS)NTr)r!rrrr&isz'PEP420PackageFinder._looks_like_packageN)r6r7r8r;r&rrrrr<hsr<cCs@tjjtdd|jD}|jdd|jr<|j|jdS)Ncss"|]\}}|dkr||fVqdS)dependency_linkssetup_requiresN)r=r>r)r0kvrrrr2usz*_install_setup_requires..T)Zignore_option_errors) distutilscorerdictitemsZparse_config_filesr>Zfetch_build_eggs)attrsdistrrr_install_setup_requiresqs  rGcKst|tjjf|S)N)rGrArBr )rErrrr ~sc@s(eZdZejZdZddZdddZdS) r FcKstj||t|j|dS)zj Construct the command for dist, updating vars(self) with any keyword parameters. N)_Command__init__varsupdate)selfrFkwrrrrIs zCommand.__init__rcKs tj|||}t|j||S)N)rHreinitialize_commandrJrK)rLZcommandZreinit_subcommandsrMcmdrrrrNszCommand.reinitialize_commandN)r)r6r7r8rHr9Zcommand_consumes_argumentsrIrNrrrrr scCs&ddtj|ddD}ttjj|S)z% Find all files under 'path' css,|]$\}}}|D]}tjj||VqqdS)N)rr!r")r0baser)r*filerrrr2sz#_find_all_simple..T)r)rr rr!r.)r!resultsrrr_find_all_simplesrScCs6t|}|tjkr.tjtjj|d}t||}t|S)z Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. )start) rSrcurdir functoolspartialr!r#rr)r+r*Zmake_relrrrfindalls   rX)-r9rrVZdistutils.corerAZdistutils.filelistZdistutils.utilrZfnmatchrZsetuptools.extern.six.movesrrZsetuptools.versionZ setuptoolsZsetuptools.extensionrZsetuptools.distrrZsetuptools.dependsr r __all__version __version__Zbootstrap_install_fromZrun_2to3_on_doctestsZlib2to3_fixer_packagesobjectrr<rrrGr rBZ get_unpatchedr rHrSrUrXZ patch_allrrrrs:      F    PK!]-__pycache__/archive_util.cpython-36.opt-1.pycnu[3 9f@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddddd d d gZ Gd d d eZ d dZ e dfddZe fdd Ze fddZe fddZeeefZdS)z/Utilities for extracting common archive formatsN)DistutilsError)ensure_directoryunpack_archiveunpack_zipfileunpack_tarfiledefault_filterUnrecognizedFormatextraction_driversunpack_directoryc@seZdZdZdS)rz#Couldn't recognize the archive typeN)__name__ __module__ __qualname____doc__rr"/usr/lib/python3.6/archive_util.pyrscCs|S)z@The default progress/filter callback; returns True for all filesr)srcdstrrrrsc CsNxH|ptD]0}y||||Wntk r4w Yq XdSq Wtd|dS)aUnpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` `progress_filter` is a function taking two arguments: a source path internal to the archive ('/'-separated), and a filesystem path where it will be extracted. The callback must return the desired extract path (which may be the same as the one passed in), or else ``None`` to skip that file or directory. The callback can thus be used to report on the progress of the extraction, as well as to filter the items extracted or alter their extraction paths. `drivers`, if supplied, must be a non-empty sequence of functions with the same signature as this function (minus the `drivers` argument), that raise ``UnrecognizedFormat`` if they do not support extracting the designated archive type. The `drivers` are tried in sequence until one is found that does not raise an error, or until all are exhausted (in which case ``UnrecognizedFormat`` is raised). If you do not supply a sequence of drivers, the module's ``extraction_drivers`` constant will be used, which means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that order. Nz!Not a recognized archive type: %s)r r)filename extract_dirprogress_filterZdriversZdriverrrrrsc Cstjj|std||d|fi}xtj|D]\}}}||\}}x4|D],} || dtjj|| f|tjj|| <qLWx\|D]T} tjj|| } ||| | } | sqt| tjj|| } tj| | tj | | qWq0WdS)z"Unpack" a directory, using the same interface as for archives Raises ``UnrecognizedFormat`` if `filename` is not a directory z%s is not a directory/N) ospathisdirrwalkjoinrshutilZcopyfileZcopystat) rrrpathsbasedirsfilesrrdftargetrrrr ?s      ,  c Cstj|std|ftj|}x|jD]}|j}|jds.d|jdkrRq.tj j |f|jd}|||}|szq.|j drt |n4t ||j |j}t|d}|j|WdQRX|jd?} | r.tj|| q.WWdQRXdS)zUnpack zip `filename` to `extract_dir` Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation of the `progress_filter` argument. z%s is not a zip filerz..wbN)zipfileZ is_zipfilerZZipFileZinfolistr startswithsplitrrrendswithrreadopenwriteZ external_attrchmod) rrrzinfonamer$datar#Zunix_attributesrrrrZs(        c Cshytj|}Wn$tjk r2td|fYnXtj|dd|_x |D]}|j}|jd oxd|j dkrTt j j |f|j d}xV|dk r|j s|jr|j}|jrtj|j}tj ||}tj|}|j|}qW|dk rT|js|jrT|||} | rT| jt jr,| dd } y|j|| WqTtjk rTYqTXqTWdSQRXdS) zUnpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined by ``tarfile.open()``). See ``unpack_archive()`` for an explanation of the `progress_filter` argument. z/%s is not a compressed or uncompressed tar filecWsdS)Nr)argsrrrsz unpack_tarfile..rz..NT)tarfiler,ZTarErrorr contextlibclosingchownr1r(r)rrrZislnkZissymZlinkname posixpathdirnamenormpathZ _getmemberisfilerr*sepZ_extract_memberZ ExtractError) rrrZtarobjmemberr1Z prelim_dstZlinkpathrZ final_dstrrrrs8       )rr'r7rrr;r8Zdistutils.errorsrZ pkg_resourcesr__all__rrrr rrr rrrrs$    "  % .PK!]'__pycache__/archive_util.cpython-36.pycnu[3 9f@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddddd d d gZ Gd d d eZ d dZ e dfddZe fdd Ze fddZe fddZeeefZdS)z/Utilities for extracting common archive formatsN)DistutilsError)ensure_directoryunpack_archiveunpack_zipfileunpack_tarfiledefault_filterUnrecognizedFormatextraction_driversunpack_directoryc@seZdZdZdS)rz#Couldn't recognize the archive typeN)__name__ __module__ __qualname____doc__rr"/usr/lib/python3.6/archive_util.pyrscCs|S)z@The default progress/filter callback; returns True for all filesr)srcdstrrrrsc CsNxH|ptD]0}y||||Wntk r4w Yq XdSq Wtd|dS)aUnpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` `progress_filter` is a function taking two arguments: a source path internal to the archive ('/'-separated), and a filesystem path where it will be extracted. The callback must return the desired extract path (which may be the same as the one passed in), or else ``None`` to skip that file or directory. The callback can thus be used to report on the progress of the extraction, as well as to filter the items extracted or alter their extraction paths. `drivers`, if supplied, must be a non-empty sequence of functions with the same signature as this function (minus the `drivers` argument), that raise ``UnrecognizedFormat`` if they do not support extracting the designated archive type. The `drivers` are tried in sequence until one is found that does not raise an error, or until all are exhausted (in which case ``UnrecognizedFormat`` is raised). If you do not supply a sequence of drivers, the module's ``extraction_drivers`` constant will be used, which means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that order. Nz!Not a recognized archive type: %s)r r)filename extract_dirprogress_filterZdriversZdriverrrrrsc Cstjj|std||d|fi}xtj|D]\}}}||\}}x4|D],} || dtjj|| f|tjj|| <qLWx\|D]T} tjj|| } ||| | } | sqt| tjj|| } tj| | tj | | qWq0WdS)z"Unpack" a directory, using the same interface as for archives Raises ``UnrecognizedFormat`` if `filename` is not a directory z%s is not a directory/N) ospathisdirrwalkjoinrshutilZcopyfileZcopystat) rrrpathsbasedirsfilesrrdftargetrrrr ?s      ,  c Cstj|std|ftj|}x|jD]}|j}|jds.d|jdkrRq.tj j |f|jd}|||}|szq.|j drt |n4t ||j |j}t|d}|j|WdQRX|jd?} | r.tj|| q.WWdQRXdS)zUnpack zip `filename` to `extract_dir` Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation of the `progress_filter` argument. z%s is not a zip filerz..wbN)zipfileZ is_zipfilerZZipFileZinfolistr startswithsplitrrrendswithrreadopenwriteZ external_attrchmod) rrrzinfonamer$datar#Zunix_attributesrrrrZs(        c Cshytj|}Wn$tjk r2td|fYnXtj|dd|_x |D]}|j}|jd oxd|j dkrTt j j |f|j d}xV|dk r|j s|jr|j}|jrtj|j}tj ||}tj|}|j|}qW|dk rT|js|jrT|||} | rT| jt jr,| dd } y|j|| WqTtjk rTYqTXqTWdSQRXdS) zUnpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined by ``tarfile.open()``). See ``unpack_archive()`` for an explanation of the `progress_filter` argument. z/%s is not a compressed or uncompressed tar filecWsdS)Nr)argsrrrsz unpack_tarfile..rz..NT)tarfiler,ZTarErrorr contextlibclosingchownr1r(r)rrrZislnkZissymZlinkname posixpathdirnamenormpathZ _getmemberisfilerr*sepZ_extract_memberZ ExtractError) rrrZtarobjmemberr1Z prelim_dstZlinkpathrZ final_dstrrrrs8       )rr'r7rrr;r8Zdistutils.errorsrZ pkg_resourcesr__all__rrrr rrr rrrrs$    "  % .PK!лvv+__pycache__/build_meta.cpython-36.opt-1.pycnu[3 9f'@sdZddlZddlZddlZddlZddlZddlZddlZGdddeZ Gdddej j Z ddd Z d d Z d d ZddZdddZdddZdddZdddZdddZdS) a-A PEP 517 interface to setuptools Previously, when a user or a command line tool (let's call it a "frontend") needed to make a request of setuptools to take a certain action, for example, generating a list of installation requirements, the frontend would would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. PEP 517 defines a different method of interfacing with setuptools. Rather than calling "setup.py" directly, the frontend should: 1. Set the current directory to the directory with a setup.py file 2. Import this module into a safe python interpreter (one in which setuptools can potentially set global variables or crash hard). 3. Call one of the functions defined in PEP 517. What each function does is defined in PEP 517. However, here is a "casual" definition of the functions (this definition should not be relied on for bug reports or API stability): - `build_wheel`: build a wheel in the folder and return the basename - `get_requires_for_build_wheel`: get the `setup_requires` to build - `prepare_metadata_for_build_wheel`: get the `install_requires` - `build_sdist`: build an sdist in the folder and return the basename - `get_requires_for_build_sdist`: get the `setup_requires` to build Again, this is not a formal definition! Just a "taste" of the module. Nc@seZdZddZdS)SetupRequirementsErrorcCs ||_dS)N) specifiers)selfrr /usr/lib/python3.6/build_meta.py__init__(szSetupRequirementsError.__init__N)__name__ __module__ __qualname__rrrrrr'src@s&eZdZddZeejddZdS) DistributioncCs t|dS)N)r)rrrrrfetch_build_eggs-szDistribution.fetch_build_eggsc cs*tjj}|tj_z dVWd|tj_XdS)zw Replace distutils.dist.Distribution with this class for the duration of this context. N) distutilsZcorer )clsZorigrrrpatch0s  zDistribution.patchN)rr r r classmethod contextlibcontextmanagerrrrrrr ,sr setup.pycCsH|}d}ttdt|}|jjdd}|jtt||dtdS)N__main__openz\r\nz\nexec) getattrtokenizerreadreplaceclosercompilelocals)Z setup_script__file__rfcoderrr _run_setup@s r!cCs|pi}|jdg|S)Nz--global-option) setdefault)config_settingsrrr _fix_configKs r$cCs~t|}ddg}tjdddg|dt_ytj tWdQRXWn,tk rx}z||j7}WYdd}~XnX|S)N setuptoolsZwheelZegg_infoz--global-option)r$sysargvr rr!rr)r#Z requirementserrr_get_build_requiresQs  r*csfddtjDS)Ncs&g|]}tjjtjj|r|qSr)ospathisdirjoin).0name)a_dirrr asz1_get_immediate_subdirectories..)r+listdir)r1r)r1r_get_immediate_subdirectories`sr4cCst|}t|S)N)r$r*)r#rrrget_requires_for_build_wheelesr5cCst|}t|S)N)r$r*)r#rrrget_requires_for_build_sdistjsr6cCstjdddd|gt_t|}xPddtj|D}t|dkrptt|dkrptjj|tj|d}q&Pq&W||krt j tjj||d|t j |dd|dS) Nr&Z dist_infoz --egg-basecSsg|]}|jdr|qS)z .dist-info)endswith)r/rrrrr2usz4prepare_metadata_for_build_wheel..rT) ignore_errors) r'r(r!r+r3lenr4r,r.shutilZmovermtree)metadata_directoryr#Zdist_info_directoryZ dist_infosrrr prepare_metadata_for_build_wheelos" r=cCsrt|}tjj|}tjdddg|dt_t|dkrVtj|tj d|ddtj |D}|dS)Nr&Z bdist_wheelz--global-optiondistcSsg|]}|jdr|qS)z.whl)r7)r/rrrrr2szbuild_wheel..r) r$r+r,abspathr'r(r!r:r;copytreer3)Zwheel_directoryr#r<Zwheelsrrr build_wheels    rAcCsrt|}tjj|}tjdddg|dt_t|dkrVtj|tj d|ddtj |D}|dS)Nr&Zsdistz--global-optionr>cSsg|]}|jdr|qS)z.tar.gz)r7)r/rrrrr2szbuild_sdist..r) r$r+r,r?r'r(r!r:r;r@r3)Zsdist_directoryr#Zsdistsrrr build_sdists    rB)r)N)N)N)NN)N)__doc__r+r'rr:rr%r BaseExceptionrr>r r!r$r*r4r5r6r=rArBrrrrs&     PK!`|%__pycache__/build_meta.cpython-36.pycnu[3 9f'@sdZddlZddlZddlZddlZddlZddlZddlZGdddeZ Gdddej j Z ddd Z d d Z d d ZddZdddZdddZdddZdddZdddZdS) a-A PEP 517 interface to setuptools Previously, when a user or a command line tool (let's call it a "frontend") needed to make a request of setuptools to take a certain action, for example, generating a list of installation requirements, the frontend would would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. PEP 517 defines a different method of interfacing with setuptools. Rather than calling "setup.py" directly, the frontend should: 1. Set the current directory to the directory with a setup.py file 2. Import this module into a safe python interpreter (one in which setuptools can potentially set global variables or crash hard). 3. Call one of the functions defined in PEP 517. What each function does is defined in PEP 517. However, here is a "casual" definition of the functions (this definition should not be relied on for bug reports or API stability): - `build_wheel`: build a wheel in the folder and return the basename - `get_requires_for_build_wheel`: get the `setup_requires` to build - `prepare_metadata_for_build_wheel`: get the `install_requires` - `build_sdist`: build an sdist in the folder and return the basename - `get_requires_for_build_sdist`: get the `setup_requires` to build Again, this is not a formal definition! Just a "taste" of the module. Nc@seZdZddZdS)SetupRequirementsErrorcCs ||_dS)N) specifiers)selfrr /usr/lib/python3.6/build_meta.py__init__(szSetupRequirementsError.__init__N)__name__ __module__ __qualname__rrrrrr'src@s&eZdZddZeejddZdS) DistributioncCs t|dS)N)r)rrrrrfetch_build_eggs-szDistribution.fetch_build_eggsc cs*tjj}|tj_z dVWd|tj_XdS)zw Replace distutils.dist.Distribution with this class for the duration of this context. N) distutilsZcorer )clsZorigrrrpatch0s  zDistribution.patchN)rr r r classmethod contextlibcontextmanagerrrrrrr ,sr setup.pycCsH|}d}ttdt|}|jjdd}|jtt||dtdS)N__main__openz\r\nz\nexec) getattrtokenizerreadreplaceclosercompilelocals)Z setup_script__file__rfcoderrr _run_setup@s r!cCs|pi}|jdg|S)Nz--global-option) setdefault)config_settingsrrr _fix_configKs r$cCs~t|}ddg}tjdddg|dt_ytj tWdQRXWn,tk rx}z||j7}WYdd}~XnX|S)N setuptoolsZwheelZegg_infoz--global-option)r$sysargvr rr!rr)r#Z requirementserrr_get_build_requiresQs  r*csfddtjDS)Ncs&g|]}tjjtjj|r|qSr)ospathisdirjoin).0name)a_dirrr asz1_get_immediate_subdirectories..)r+listdir)r1r)r1r_get_immediate_subdirectories`sr4cCst|}t|S)N)r$r*)r#rrrget_requires_for_build_wheelesr5cCst|}t|S)N)r$r*)r#rrrget_requires_for_build_sdistjsr6cCstjdddd|gt_t|}x`ddtj|D}t|dkrptt|dkrptjj|tj|d}q&t|dkst Pq&W||krt j tjj||d|t j |dd|dS) Nr&Z dist_infoz --egg-basecSsg|]}|jdr|qS)z .dist-info)endswith)r/rrrrr2usz4prepare_metadata_for_build_wheel..rT) ignore_errors) r'r(r!r+r3lenr4r,r.AssertionErrorshutilZmovermtree)metadata_directoryr#Zdist_info_directoryZ dist_infosrrr prepare_metadata_for_build_wheelos$ r>cCst|}tjj|}tjdddg|dt_t|dkrVtj|tj d|ddtj |D}t |dkszt |dS)Nr&Z bdist_wheelz--global-optiondistcSsg|]}|jdr|qS)z.whl)r7)r/rrrrr2szbuild_wheel..r) r$r+r,abspathr'r(r!r;r<copytreer3r9r:)Zwheel_directoryr#r=Zwheelsrrr build_wheels    rBcCst|}tjj|}tjdddg|dt_t|dkrVtj|tj d|ddtj |D}t |dkszt |dS)Nr&Zsdistz--global-optionr?cSsg|]}|jdr|qS)z.tar.gz)r7)r/rrrrr2szbuild_sdist..r) r$r+r,r@r'r(r!r;r<rAr3r9r:)Zsdist_directoryr#Zsdistsrrr build_sdists    rC)r)N)N)N)NN)N)__doc__r+r'rr;rr%r BaseExceptionrr?r r!r$r*r4r5r6r>rBrCrrrrs&     PK!Wmď::'__pycache__/config.cpython-36.opt-1.pycnu[3 9fVF@sddlmZmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZddlmZmZddlmZdd d Zd d ZdddZGdddeZGdddeZGdddeZdS))absolute_importunicode_literalsN) defaultdict)partial) import_module)DistutilsOptionErrorDistutilsFileError) LegacyVersionparse) string_typesFc Csddlm}m}tjj|}tjj|s4td|tj}tj tjj |zJ|}|rb|j ng}||krx|j ||j ||dt||j|d}Wdtj |Xt|S)a,Read given configuration file and returns options from it as a dict. :param str|unicode filepath: Path to configuration file to get options from. :param bool find_others: Whether to search for other configuration files which could be on in various places. :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: dict r) Distribution _Distributionz%Configuration file %s does not exist.) filenames)ignore_option_errorsN)Zsetuptools.distr r ospathabspathisfilergetcwdchdirdirnameZfind_config_filesappendZparse_config_filesparse_configurationcommand_optionsconfiguration_to_dict) filepathZ find_othersrr r Zcurrent_directoryZdistrhandlersr/usr/lib/python3.6/config.pyread_configurations$      rcCsltt}x^|D]V}|j}|j}xD|jD]:}t|d|d}|dkrNt||}n|}||||<q&WqW|S)zReturns configuration data gathered by given handlers as a dict. :param list[ConfigHandler] handlers: Handlers list, usually from parse_configuration() :rtype: dict zget_%sN)rdictsection_prefix target_obj set_optionsgetattr)rZ config_dictZhandlerZ obj_aliasr"Zoptiongettervaluerrrr=s   rcCs6t|||}|jt|j|||j}|j||fS)aPerforms additional parsing of configuration options for a distribution. Returns a list of used option handlers. :param Distribution distribution: :param dict command_options: :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: list )ConfigOptionsHandlerr ConfigMetadataHandlermetadata package_dir)Z distributionrroptionsmetarrrrZs rc@seZdZdZdZiZd!ddZeddZdd Z e d"d d Z e d dZ e ddZ e ddZeddZeddZe d#ddZe ddZe d$ddZddZdd ZdS)% ConfigHandlerz1Handles metadata supplied in configuration files.NFcCsbi}|j}x:|jD].\}}|j|s(q|j|djd}|||<qW||_||_||_g|_dS)N.) r!items startswithreplacestriprr"sectionsr#)selfr"r+rr4r! section_namesection_optionsrrr__init__s  zConfigHandler.__init__cCstd|jjdS)z.Metadata item name to parser function mapping.z!%s must provide .parsers propertyN)NotImplementedError __class____name__)r5rrrparsersszConfigHandler.parsersc Cst}|j}|jj||}t|||}||kr6t||r>dSd}|jj|}|ry ||}Wn tk r~d}|jszYnX|rdSt|d|d}|dkrt |||n|||j j |dS)NFTzset_%s) tupler"aliasesgetr$KeyErrorr< Exceptionrsetattrr#r) r5Z option_namer&unknownr"Z current_valueZ skip_optionparsersetterrrr __setitem__s0   zConfigHandler.__setitem__,cCs8t|tr|Sd|kr |j}n |j|}dd|DS)zRepresents value as a list. Value is split either by separator (defaults to comma) or by lines. :param value: :param separator: List items separator character. :rtype: list  cSsg|]}|jr|jqSr)r3).0chunkrrr sz-ConfigHandler._parse_list..) isinstancelist splitlinessplit)clsr& separatorrrr _parse_lists   zConfigHandler._parse_listcCsTd}i}xF|j|D]8}|j|\}}}||krsz,ConfigHandler._parse_file..rGrHc3s2|]*}j|sdrtjj|rj|VqdS)TN) _assert_localrrr _read_file)rIr)rPrrr` s)rLr r1lenrOjoin)rPr&Zinclude_directivespecZ filepathsr)rPr _parse_files   zConfigHandler._parse_filecCs|jtjstd|dS)Nz#`file:` directive can not access %s)r1rrr)rrrrraszConfigHandler._assert_localc Cs"tj|dd }|jSQRXdS)Nzutf-8)encoding)ioopenread)rfrrrrbszConfigHandler._read_filec Csd}|j|s|S|j|djjd}|j}dj|}|p@d}tj}|r|d|kr||d}|jdd} t | dkrtj jtj| d}| d}q|}nd|krtj jtj|d}t j j d|zt |} t| |}Wdt j ddt _ X|S) zRepresents value as a module attribute. Examples: attr: package.attr attr: package.module.attr :param str value: :rtype: str zattr:r.r/r8r/N)r1r2r3rOpoprdrrrsplitrcrsysinsertrr$) rPr&r*Zattr_directiveZ attrs_pathZ attr_nameZ module_name parent_pathZ custom_pathpartsmodulerrr _parse_attrs0        zConfigHandler._parse_attrcsfdd}|S)zReturns parser function to represents value as a list. Parses a value applying given methods one after another. :param parse_methods: :rtype: callable cs|}xD] }||}q W|S)Nr)r&parsedmethod) parse_methodsrrr Qs  z1ConfigHandler._get_parser_compound..parser)rPrxr r)rxr_get_parser_compoundHs z"ConfigHandler._get_parser_compoundcCs:i}|pdd}x$|jD]\}\}}||||<qW|S)zParses section options into a dictionary. Optionally applies a given parser to values. :param dict section_options: :param callable values_parser: :rtype: dict cSs|S)Nr)rYrrrfsz6ConfigHandler._parse_section_to_dict..)r0)rPr7Z values_parserr&rW_rYrrr_parse_section_to_dict[s  z$ConfigHandler._parse_section_to_dictc Cs@x:|jD].\}\}}y |||<Wq tk r6Yq Xq WdS)zQParses configuration file section. :param dict section_options: N)r0r@)r5r7namer{r&rrr parse_sectionks  zConfigHandler.parse_sectioncCsfx`|jjD]R\}}d}|r$d|}t|d|jddd}|dkrVtd|j|f||q WdS)zTParses configuration file items from one or more related sections. r.z_%szparse_section%sr/__Nz0Unsupported distribution option section: [%s.%s])r4r0r$r2rr!)r5r6r7Zmethod_postfixZsection_parser_methodrrrr wszConfigHandler.parse)F)rG)N)N)r; __module__ __qualname____doc__r!r>r8propertyr<rF classmethodrRrZr_rf staticmethodrarbruryr|r~r rrrrr-ts(  &     ,   r-csHeZdZdZdddddZdZdfd d Zed d Zd dZ Z S)r(r)Zurl description classifiers platforms)Z home_pageZsummaryZ classifierplatformFNcstt|j|||||_dS)N)superr(r8r*)r5r"r+rr*)r:rrr8szConfigMetadataHandler.__init__c Cs8|j}|j}|j}||||||j||||||j|d S)z.Metadata item name to parser function mapping.) rkeywordsZprovidesZrequiresZ obsoletesrlicenserZlong_descriptionversionZ project_urls)rRrfrZry_parse_version)r5 parse_listZ parse_file parse_dictrrrr<s zConfigMetadataHandler.parserscCs|j|}||kr<|j}tt|tr8td||f|S|j||j}t|rX|}t|t st |dr~dj t t |}nd|}|S)zSParses `version` option value. :param value: :rtype: str z7Version loaded from %s does not comply with PEP 440: %s__iter__r/z%s)rfr3rLr r rrur*callabler hasattrrdmapstr)r5r&rrrrrs    z$ConfigMetadataHandler._parse_version)FN) r;rrr!r>Z strict_moder8rr<r __classcell__rr)r:rr(s r(c@sTeZdZdZeddZddZddZdd Zd d Z d d Z ddZ ddZ dS)r'r+cCsL|j}t|jdd}|j}|j}|||||||||||||||j|j|dS)z.Metadata item name to parser function mapping.;)rQ)Zzip_safeZuse_2to3Zinclude_package_datar*Zuse_2to3_fixersZuse_2to3_exclude_fixersZconvert_2to3_doctestsscriptsZeager_resourcesZdependency_linksZnamespace_packagesZinstall_requiresZsetup_requiresZ tests_requireZpackages entry_pointsZ py_modules)rRrr_rZ_parse_packagesrf)r5rZparse_list_semicolonZ parse_boolrrrrr<s*zConfigOptionsHandler.parserscCsBd}|j|s|j|S|j|jjdi}ddlm}|f|S)zTParses `packages` option value. :param value: :rtype: list zfind:z packages.findr) find_packages)r1rRparse_section_packages__findr4r?Z setuptoolsr)r5r&Zfind_directive find_kwargsrrrrrs   z$ConfigOptionsHandler._parse_packagescsT|j||j}dddgtfdd|jD}|jd}|dk rP|d|d<|S)zParses `packages.find` configuration file section. To be used in conjunction with _parse_packages(). :param dict section_options: whereincludeexcludecs$g|]\}}|kr|r||fqSrr)rIkv) valid_keysrrrKszEConfigOptionsHandler.parse_section_packages__find..Nr)r|rRr r0r?)r5r7Z section_datarrr)rrrs    z1ConfigOptionsHandler.parse_section_packages__findcCs|j||j}||d<dS)z`Parses `entry_points` configuration file section. :param dict section_options: rN)r|rR)r5r7rvrrrparse_section_entry_points%sz/ConfigOptionsHandler.parse_section_entry_pointscCs.|j||j}|jd}|r*||d<|d=|S)N*r.)r|rRr?)r5r7rvrootrrr_parse_package_data-s  z(ConfigOptionsHandler._parse_package_datacCs|j||d<dS)z`Parses `package_data` configuration file section. :param dict section_options: Z package_dataN)r)r5r7rrrparse_section_package_data7sz/ConfigOptionsHandler.parse_section_package_datacCs|j||d<dS)zhParses `exclude_package_data` configuration file section. :param dict section_options: Zexclude_package_dataN)r)r5r7rrr"parse_section_exclude_package_data>sz7ConfigOptionsHandler.parse_section_exclude_package_datacCs"t|jdd}|j|||d<dS)zbParses `extras_require` configuration file section. :param dict section_options: r)rQZextras_requireN)rrRr|)r5r7rrrrparse_section_extras_requireFsz1ConfigOptionsHandler.parse_section_extras_requireN) r;rrr!rr<rrrrrrrrrrrr's  r')FF)F)Z __future__rrrhrrp collectionsr functoolsr importlibrZdistutils.errorsrrZ#setuptools.extern.packaging.versionr r Zsetuptools.extern.sixr rrrobjectr-r(r'rrrrs"     . MPK!Wmď::!__pycache__/config.cpython-36.pycnu[3 9fVF@sddlmZmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZddlmZmZddlmZdd d Zd d ZdddZGdddeZGdddeZGdddeZdS))absolute_importunicode_literalsN) defaultdict)partial) import_module)DistutilsOptionErrorDistutilsFileError) LegacyVersionparse) string_typesFc Csddlm}m}tjj|}tjj|s4td|tj}tj tjj |zJ|}|rb|j ng}||krx|j ||j ||dt||j|d}Wdtj |Xt|S)a,Read given configuration file and returns options from it as a dict. :param str|unicode filepath: Path to configuration file to get options from. :param bool find_others: Whether to search for other configuration files which could be on in various places. :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: dict r) Distribution _Distributionz%Configuration file %s does not exist.) filenames)ignore_option_errorsN)Zsetuptools.distr r ospathabspathisfilergetcwdchdirdirnameZfind_config_filesappendZparse_config_filesparse_configurationcommand_optionsconfiguration_to_dict) filepathZ find_othersrr r Zcurrent_directoryZdistrhandlersr/usr/lib/python3.6/config.pyread_configurations$      rcCsltt}x^|D]V}|j}|j}xD|jD]:}t|d|d}|dkrNt||}n|}||||<q&WqW|S)zReturns configuration data gathered by given handlers as a dict. :param list[ConfigHandler] handlers: Handlers list, usually from parse_configuration() :rtype: dict zget_%sN)rdictsection_prefix target_obj set_optionsgetattr)rZ config_dictZhandlerZ obj_aliasr"Zoptiongettervaluerrrr=s   rcCs6t|||}|jt|j|||j}|j||fS)aPerforms additional parsing of configuration options for a distribution. Returns a list of used option handlers. :param Distribution distribution: :param dict command_options: :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: list )ConfigOptionsHandlerr ConfigMetadataHandlermetadata package_dir)Z distributionrroptionsmetarrrrZs rc@seZdZdZdZiZd!ddZeddZdd Z e d"d d Z e d dZ e ddZ e ddZeddZeddZe d#ddZe ddZe d$ddZddZdd ZdS)% ConfigHandlerz1Handles metadata supplied in configuration files.NFcCsbi}|j}x:|jD].\}}|j|s(q|j|djd}|||<qW||_||_||_g|_dS)N.) r!items startswithreplacestriprr"sectionsr#)selfr"r+rr4r! section_namesection_optionsrrr__init__s  zConfigHandler.__init__cCstd|jjdS)z.Metadata item name to parser function mapping.z!%s must provide .parsers propertyN)NotImplementedError __class____name__)r5rrrparsersszConfigHandler.parsersc Cst}|j}|jj||}t|||}||kr6t||r>dSd}|jj|}|ry ||}Wn tk r~d}|jszYnX|rdSt|d|d}|dkrt |||n|||j j |dS)NFTzset_%s) tupler"aliasesgetr$KeyErrorr< Exceptionrsetattrr#r) r5Z option_namer&unknownr"Z current_valueZ skip_optionparsersetterrrr __setitem__s0   zConfigHandler.__setitem__,cCs8t|tr|Sd|kr |j}n |j|}dd|DS)zRepresents value as a list. Value is split either by separator (defaults to comma) or by lines. :param value: :param separator: List items separator character. :rtype: list  cSsg|]}|jr|jqSr)r3).0chunkrrr sz-ConfigHandler._parse_list..) isinstancelist splitlinessplit)clsr& separatorrrr _parse_lists   zConfigHandler._parse_listcCsTd}i}xF|j|D]8}|j|\}}}||krsz,ConfigHandler._parse_file..rGrHc3s2|]*}j|sdrtjj|rj|VqdS)TN) _assert_localrrr _read_file)rIr)rPrrr` s)rLr r1lenrOjoin)rPr&Zinclude_directivespecZ filepathsr)rPr _parse_files   zConfigHandler._parse_filecCs|jtjstd|dS)Nz#`file:` directive can not access %s)r1rrr)rrrrraszConfigHandler._assert_localc Cs"tj|dd }|jSQRXdS)Nzutf-8)encoding)ioopenread)rfrrrrbszConfigHandler._read_filec Csd}|j|s|S|j|djjd}|j}dj|}|p@d}tj}|r|d|kr||d}|jdd} t | dkrtj jtj| d}| d}q|}nd|krtj jtj|d}t j j d|zt |} t| |}Wdt j ddt _ X|S) zRepresents value as a module attribute. Examples: attr: package.attr attr: package.module.attr :param str value: :rtype: str zattr:r.r/r8r/N)r1r2r3rOpoprdrrrsplitrcrsysinsertrr$) rPr&r*Zattr_directiveZ attrs_pathZ attr_nameZ module_name parent_pathZ custom_pathpartsmodulerrr _parse_attrs0        zConfigHandler._parse_attrcsfdd}|S)zReturns parser function to represents value as a list. Parses a value applying given methods one after another. :param parse_methods: :rtype: callable cs|}xD] }||}q W|S)Nr)r&parsedmethod) parse_methodsrrr Qs  z1ConfigHandler._get_parser_compound..parser)rPrxr r)rxr_get_parser_compoundHs z"ConfigHandler._get_parser_compoundcCs:i}|pdd}x$|jD]\}\}}||||<qW|S)zParses section options into a dictionary. Optionally applies a given parser to values. :param dict section_options: :param callable values_parser: :rtype: dict cSs|S)Nr)rYrrrfsz6ConfigHandler._parse_section_to_dict..)r0)rPr7Z values_parserr&rW_rYrrr_parse_section_to_dict[s  z$ConfigHandler._parse_section_to_dictc Cs@x:|jD].\}\}}y |||<Wq tk r6Yq Xq WdS)zQParses configuration file section. :param dict section_options: N)r0r@)r5r7namer{r&rrr parse_sectionks  zConfigHandler.parse_sectioncCsfx`|jjD]R\}}d}|r$d|}t|d|jddd}|dkrVtd|j|f||q WdS)zTParses configuration file items from one or more related sections. r.z_%szparse_section%sr/__Nz0Unsupported distribution option section: [%s.%s])r4r0r$r2rr!)r5r6r7Zmethod_postfixZsection_parser_methodrrrr wszConfigHandler.parse)F)rG)N)N)r; __module__ __qualname____doc__r!r>r8propertyr<rF classmethodrRrZr_rf staticmethodrarbruryr|r~r rrrrr-ts(  &     ,   r-csHeZdZdZdddddZdZdfd d Zed d Zd dZ Z S)r(r)Zurl description classifiers platforms)Z home_pageZsummaryZ classifierplatformFNcstt|j|||||_dS)N)superr(r8r*)r5r"r+rr*)r:rrr8szConfigMetadataHandler.__init__c Cs8|j}|j}|j}||||||j||||||j|d S)z.Metadata item name to parser function mapping.) rkeywordsZprovidesZrequiresZ obsoletesrlicenserZlong_descriptionversionZ project_urls)rRrfrZry_parse_version)r5 parse_listZ parse_file parse_dictrrrr<s zConfigMetadataHandler.parserscCs|j|}||kr<|j}tt|tr8td||f|S|j||j}t|rX|}t|t st |dr~dj t t |}nd|}|S)zSParses `version` option value. :param value: :rtype: str z7Version loaded from %s does not comply with PEP 440: %s__iter__r/z%s)rfr3rLr r rrur*callabler hasattrrdmapstr)r5r&rrrrrs    z$ConfigMetadataHandler._parse_version)FN) r;rrr!r>Z strict_moder8rr<r __classcell__rr)r:rr(s r(c@sTeZdZdZeddZddZddZdd Zd d Z d d Z ddZ ddZ dS)r'r+cCsL|j}t|jdd}|j}|j}|||||||||||||||j|j|dS)z.Metadata item name to parser function mapping.;)rQ)Zzip_safeZuse_2to3Zinclude_package_datar*Zuse_2to3_fixersZuse_2to3_exclude_fixersZconvert_2to3_doctestsscriptsZeager_resourcesZdependency_linksZnamespace_packagesZinstall_requiresZsetup_requiresZ tests_requireZpackages entry_pointsZ py_modules)rRrr_rZ_parse_packagesrf)r5rZparse_list_semicolonZ parse_boolrrrrr<s*zConfigOptionsHandler.parserscCsBd}|j|s|j|S|j|jjdi}ddlm}|f|S)zTParses `packages` option value. :param value: :rtype: list zfind:z packages.findr) find_packages)r1rRparse_section_packages__findr4r?Z setuptoolsr)r5r&Zfind_directive find_kwargsrrrrrs   z$ConfigOptionsHandler._parse_packagescsT|j||j}dddgtfdd|jD}|jd}|dk rP|d|d<|S)zParses `packages.find` configuration file section. To be used in conjunction with _parse_packages(). :param dict section_options: whereincludeexcludecs$g|]\}}|kr|r||fqSrr)rIkv) valid_keysrrrKszEConfigOptionsHandler.parse_section_packages__find..Nr)r|rRr r0r?)r5r7Z section_datarrr)rrrs    z1ConfigOptionsHandler.parse_section_packages__findcCs|j||j}||d<dS)z`Parses `entry_points` configuration file section. :param dict section_options: rN)r|rR)r5r7rvrrrparse_section_entry_points%sz/ConfigOptionsHandler.parse_section_entry_pointscCs.|j||j}|jd}|r*||d<|d=|S)N*r.)r|rRr?)r5r7rvrootrrr_parse_package_data-s  z(ConfigOptionsHandler._parse_package_datacCs|j||d<dS)z`Parses `package_data` configuration file section. :param dict section_options: Z package_dataN)r)r5r7rrrparse_section_package_data7sz/ConfigOptionsHandler.parse_section_package_datacCs|j||d<dS)zhParses `exclude_package_data` configuration file section. :param dict section_options: Zexclude_package_dataN)r)r5r7rrr"parse_section_exclude_package_data>sz7ConfigOptionsHandler.parse_section_exclude_package_datacCs"t|jdd}|j|||d<dS)zbParses `extras_require` configuration file section. :param dict section_options: r)rQZextras_requireN)rrRr|)r5r7rrrrparse_section_extras_requireFsz1ConfigOptionsHandler.parse_section_extras_requireN) r;rrr!rr<rrrrrrrrrrrr's  r')FF)F)Z __future__rrrhrrp collectionsr functoolsr importlibrZdistutils.errorsrrZ#setuptools.extern.packaging.versionr r Zsetuptools.extern.sixr rrrobjectr-r(r'rrrrs"     . MPK!t&()__pycache__/dep_util.cpython-36.opt-1.pycnu[3 9f@sddlmZddZdS)) newer_groupcCslt|t|krtdg}g}xBtt|D]2}t||||r.|j|||j||q.W||fS)zWalk both arguments in parallel, testing if each source group is newer than its corresponding target. Returns a pair of lists (sources_groups, targets) where sources is newer than target, according to the semantics of 'newer_group()'. z5'sources_group' and 'targets' must be the same length)len ValueErrorrangerappend)Zsources_groupsZtargetsZ n_sourcesZ n_targetsir/usr/lib/python3.6/dep_util.pynewer_pairwise_groupsr N)Zdistutils.dep_utilrr rrrr s PK!bnqq1_vendor/__pycache__/__init__.cpython-36.opt-1.pycnu[3 9f@sdS)Nrrr/usr/lib/python3.6/__init__.pysPK!bnqq+_vendor/__pycache__/__init__.cpython-36.pycnu[3 9f@sdS)Nrrr/usr/lib/python3.6/__init__.pysPK!AKK2_vendor/__pycache__/pyparsing.cpython-36.opt-1.pycnu[3 9f@s dZdZdZdZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZyddlmZWn ek rddlmZYnXydd l mZWn>ek rydd lmZWnek rdZYnXYnXd d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgiZee jddsZeddskZer"e jZe Z!e"Z#e Z$e%e&e'e(e)ee*e+e,e-e.g Z/nbe j0Ze1Z2dtduZ$gZ/ddl3Z3xBdvj4D]6Z5ye/j6e7e3e5Wne8k r|wJYnXqJWe9dwdxe2dyDZ:dzd{Z;Gd|d}d}e<Z=ej>ej?Z@d~ZAeAdZBe@eAZCe"dZDdjEddxejFDZGGdd!d!eHZIGdd#d#eIZJGdd%d%eIZKGdd'd'eKZLGdd*d*eHZMGddde<ZNGdd&d&e<ZOe jPjQeOdd=ZRddNZSddKZTddZUddZVddZWddUZXd/ddZYGdd(d(e<ZZGdd0d0eZZ[Gddde[Z\Gddde[Z]Gddde[Z^e^Z_e^eZ_`Gddde[ZaGdd d e^ZbGdd d eaZcGddpdpe[ZdGdd3d3e[ZeGdd+d+e[ZfGdd)d)e[ZgGdd d e[ZhGdd2d2e[ZiGddde[ZjGdddejZkGdddejZlGdddejZmGdd.d.ejZnGdd-d-ejZoGdd5d5ejZpGdd4d4ejZqGdd$d$eZZrGdd d erZsGdd d erZtGddderZuGddderZvGdd"d"eZZwGdddewZxGdddewZyGdddewZzGdddezZ{Gdd6d6ezZ|Gddde<Z}e}Z~GdddewZGdd,d,ewZGdddewZGdddeZGdd1d1ewZGdddeZGdddeZGdddeZGdd/d/eZGddde<ZddfZd0ddDZd1dd@Zdd΄ZddSZddRZdd҄Zd2ddWZddEZd3ddkZddlZddnZe\jdGZeljdMZemjdLZenjdeZeojddZeeeDdddڍjdd܄Zefd݃jdd܄Zefd߃jdd܄ZeeBeBeeeGddydBefde jBZeeedeZe^dedjdee{eeBjddZddcZddQZdd`Zdd^ZddqZedd܄Zedd܄ZddZddOZddPZddiZe<e_d4ddoZe=Ze<e_e<e_ededfddmZeZeefddjdZeefddjdZeefddefddBjdZee_dejjdZdddejfddTZd5ddjZedZedZeeee@eCdjd\ZZeed j4d Zefd d jEejÃd jdZĐdd_ZeefddjdZefdjdZefdjȃjdZefdjdZeefddeBjdZeZefdjdZee{eeeGdɐdeeede^dɃemj΃jdZeeejeBddjd>ZGd drdrZeҐd!k rebd"Zebd#Zeee@eCd$ZeeՐd%dӐd&jeZeeeփjd'Zאd(eBZeeՐd%dӐd&jeZeeeكjd)ZeӐd*eؐd'eeڐd)Zejܐd+ejjܐd,ejjܐd,ejjܐd-ddlZejjeejejjܐd.dS(6aS pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}), built up using L{Word}, L{Literal}, and L{And} elements (L{'+'} operator gives L{And} expressions, strings are auto-converted to L{Literal} expressions):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The L{ParseResults} object returned from L{ParserElement.parseString} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments z2.1.10z07 Oct 2016 01:31 UTCz*Paul McGuire N)ref)datetime)RLock) OrderedDictAndCaselessKeywordCaselessLiteral CharsNotInCombineDictEachEmpty FollowedByForward GoToColumnGroupKeywordLineEnd LineStartLiteral MatchFirstNoMatchNotAny OneOrMoreOnlyOnceOptionalOrParseBaseExceptionParseElementEnhanceParseExceptionParseExpressionParseFatalException ParseResultsParseSyntaxException ParserElement QuotedStringRecursiveGrammarExceptionRegexSkipTo StringEnd StringStartSuppressTokenTokenConverterWhiteWordWordEnd WordStart ZeroOrMore alphanumsalphas alphas8bit anyCloseTag anyOpenTag cStyleCommentcolcommaSeparatedListcommonHTMLEntity countedArraycppStyleCommentdblQuotedStringdblSlashComment delimitedListdictOfdowncaseTokensemptyhexnums htmlCommentjavaStyleCommentlinelineEnd lineStartlineno makeHTMLTags makeXMLTagsmatchOnlyAtColmatchPreviousExprmatchPreviousLiteral nestedExprnullDebugActionnumsoneOfopAssocoperatorPrecedence printablespunc8bitpythonStyleComment quotedString removeQuotesreplaceHTMLEntity replaceWith restOfLinesglQuotedStringsrange stringEnd stringStarttraceParseAction unicodeString upcaseTokens withAttribute indentedBlockoriginalTextForungroup infixNotation locatedExpr withClass CloseMatchtokenMappyparsing_commonc Cs`t|tr|Syt|Stk rZt|jtjd}td}|jdd|j |SXdS)aDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. xmlcharrefreplacez&#\d+;cSs$dtt|dddddS)Nz\ur)hexint)trw/usr/lib/python3.6/pyparsing.pysz_ustr..N) isinstanceZunicodestrUnicodeEncodeErrorencodesysgetdefaultencodingr'setParseActiontransformString)objretZ xmlcharrefrwrwrx_ustrs rz6sum len sorted reversed list tuple set any all min maxccs|] }|VqdS)Nrw).0yrwrwrx srrrcCs>d}dddjD}x"t||D]\}}|j||}q"W|S)z/Escape &, <, >, ", ', etc. in a string of data.z&><"'css|]}d|dVqdS)&;Nrw)rsrwrwrxrsz_xml_escape..zamp gt lt quot apos)splitzipreplace)dataZ from_symbolsZ to_symbolsZfrom_Zto_rwrwrx _xml_escapes rc@s eZdZdS) _ConstantsN)__name__ __module__ __qualname__rwrwrwrxrsr 0123456789Z ABCDEFabcdef\ccs|]}|tjkr|VqdS)N)stringZ whitespace)rcrwrwrxrsc@sPeZdZdZdddZeddZdd Zd d Zd d Z dddZ ddZ dS)rz7base exception class for all parsing runtime exceptionsrNcCs>||_|dkr||_d|_n ||_||_||_|||f|_dS)Nr)locmsgpstr parserElementargs)selfrrrelemrwrwrx__init__szParseBaseException.__init__cCs||j|j|j|jS)z internal factory method to simplify creating one type of ParseException from another - avoids having __init__ signature conflicts among subclasses )rrrr)clsperwrwrx_from_exceptionsz"ParseBaseException._from_exceptioncCsN|dkrt|j|jS|dkr,t|j|jS|dkrBt|j|jSt|dS)zsupported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text rJr9columnrGN)r9r)rJrrr9rGAttributeError)rZanamerwrwrx __getattr__szParseBaseException.__getattr__cCsd|j|j|j|jfS)Nz"%s (at char %d), (line:%d, col:%d))rrrJr)rrwrwrx__str__szParseBaseException.__str__cCst|S)N)r)rrwrwrx__repr__szParseBaseException.__repr__>!} ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been foundN)rrrrrwrwrwrxr#sc@s eZdZdZddZddZdS)r&zZexception thrown by L{ParserElement.validate} if the grammar could be improperly recursivecCs ||_dS)N)parseElementTrace)rparseElementListrwrwrxrsz"RecursiveGrammarException.__init__cCs d|jS)NzRecursiveGrammarException: %s)r)rrwrwrxr sz!RecursiveGrammarException.__str__N)rrrrrrrwrwrwrxr&sc@s,eZdZddZddZddZddZd S) _ParseResultsWithOffsetcCs||f|_dS)N)tup)rZp1Zp2rwrwrxr$sz _ParseResultsWithOffset.__init__cCs |j|S)N)r)rirwrwrx __getitem__&sz#_ParseResultsWithOffset.__getitem__cCst|jdS)Nr)reprr)rrwrwrxr(sz _ParseResultsWithOffset.__repr__cCs|jd|f|_dS)Nr)r)rrrwrwrx setOffset*sz!_ParseResultsWithOffset.setOffsetN)rrrrrrrrwrwrwrxr#src@seZdZdZd[ddZddddefddZdd Zefd d Zd d Z ddZ ddZ ddZ e Z ddZddZddZddZddZereZeZeZn$eZeZeZddZd d!Zd"d#Zd$d%Zd&d'Zd\d(d)Zd*d+Zd,d-Zd.d/Zd0d1Z d2d3Z!d4d5Z"d6d7Z#d8d9Z$d:d;Z%d} - see L{ParserElement.setResultsName}) Example:: integer = Word(nums) date_str = (integer.setResultsName("year") + '/' + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") # parseString returns a ParseResults object result = date_str.parseString("1999/12/31") def test(s, fn=repr): print("%s -> %s" % (s, fn(eval(s)))) test("list(result)") test("result[0]") test("result['month']") test("result.day") test("'month' in result") test("'minutes' in result") test("result.dump()", str) prints:: list(result) -> ['1999', '/', '12', '/', '31'] result[0] -> '1999' result['month'] -> '12' result.day -> '31' 'month' in result -> True 'minutes' in result -> False result.dump() -> ['1999', '/', '12', '/', '31'] - day: 31 - month: 12 - year: 1999 NTcCs"t||r|Stj|}d|_|S)NT)rzobject__new___ParseResults__doinit)rtoklistnameasListmodalZretobjrwrwrxrTs   zParseResults.__new__c Cs`|jrvd|_d|_d|_i|_||_||_|dkr6g}||trP|dd|_n||trft||_n|g|_t |_ |dk o|r\|sd|j|<||t rt |}||_||t dttfo|ddgfks\||tr|g}|r&||trt|jd||<ntt|dd||<|||_n6y|d||<Wn$tttfk rZ|||<YnXdS)NFrr)r_ParseResults__name_ParseResults__parent_ParseResults__accumNames_ParseResults__asList_ParseResults__modallist_ParseResults__toklist_generatorTypedict_ParseResults__tokdictrurr basestringr"rcopyKeyError TypeError IndexError)rrrrrrzrwrwrxr]sB     $   zParseResults.__init__cCsPt|ttfr|j|S||jkr4|j|ddStdd|j|DSdS)NrrrcSsg|] }|dqS)rrw)rvrwrwrx sz,ParseResults.__getitem__..rs)rzruslicerrrr")rrrwrwrxrs   zParseResults.__getitem__cCs||tr0|jj|t|g|j|<|d}nD||ttfrN||j|<|}n&|jj|tt|dg|j|<|}||trt||_ dS)Nr) rrgetrrurrr"wkrefr)rkrrzsubrwrwrx __setitem__s   " zParseResults.__setitem__c Cst|ttfrt|j}|j|=t|trH|dkr:||7}t||d}tt|j|}|jx^|j j D]F\}}x<|D]4}x.t |D]"\}\}} t || | |k||<qWq|WqnWn|j |=dS)Nrrr) rzrurlenrrrangeindicesreverseritems enumerater) rrZmylenZremovedr occurrencesjrvaluepositionrwrwrx __delitem__s   $zParseResults.__delitem__cCs ||jkS)N)r)rrrwrwrx __contains__szParseResults.__contains__cCs t|jS)N)rr)rrwrwrx__len__szParseResults.__len__cCs |j S)N)r)rrwrwrx__bool__szParseResults.__bool__cCs t|jS)N)iterr)rrwrwrx__iter__szParseResults.__iter__cCst|jdddS)Nrrrs)rr)rrwrwrx __reversed__szParseResults.__reversed__cCs$t|jdr|jjSt|jSdS)Niterkeys)hasattrrrr)rrwrwrx _iterkeyss  zParseResults._iterkeyscsfddjDS)Nc3s|]}|VqdS)Nrw)rr)rrwrxrsz+ParseResults._itervalues..)r)rrw)rrx _itervaluesszParseResults._itervaluescsfddjDS)Nc3s|]}||fVqdS)Nrw)rr)rrwrxrsz*ParseResults._iteritems..)r)rrw)rrx _iteritemsszParseResults._iteritemscCs t|jS)zVReturns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).)rr)rrwrwrxkeysszParseResults.keyscCs t|jS)zXReturns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).)r itervalues)rrwrwrxvaluesszParseResults.valuescCs t|jS)zfReturns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).)r iteritems)rrwrwrxrszParseResults.itemscCs t|jS)zSince keys() returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.)boolr)rrwrwrxhaskeysszParseResults.haskeyscOs|s dg}x6|jD]*\}}|dkr2|d|f}qtd|qWt|dtsht|dksh|d|kr|d}||}||=|S|d}|SdS)a Removes and returns item at specified index (default=C{last}). Supports both C{list} and C{dict} semantics for C{pop()}. If passed no argument or an integer argument, it will use C{list} semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use C{dict} semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in C{dict.pop()}. Example:: def remove_first(tokens): tokens.pop(0) print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] label = Word(alphas) patt = label("LABEL") + OneOrMore(Word(nums)) print(patt.parseString("AAB 123 321").dump()) # Use pop() in a parse action to remove named result (note that corresponding value is not # removed from list form of results) def remove_LABEL(tokens): tokens.pop("LABEL") return tokens patt.addParseAction(remove_LABEL) print(patt.parseString("AAB 123 321").dump()) prints:: ['AAB', '123', '321'] - LABEL: AAB ['AAB', '123', '321'] rrdefaultrz-pop() got an unexpected keyword argument '%s'Nrs)rrrzrur)rrkwargsrrindexrZ defaultvaluerwrwrxpops"  zParseResults.popcCs||kr||S|SdS)ai Returns named result matching the given key, or if there is no such name, then returns the given C{defaultValue} or C{None} if no C{defaultValue} is specified. Similar to C{dict.get()}. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString("1999/12/31") print(result.get("year")) # -> '1999' print(result.get("hour", "not specified")) # -> 'not specified' print(result.get("hour")) # -> None Nrw)rkey defaultValuerwrwrxrszParseResults.getcCsZ|jj||xF|jjD]8\}}x.t|D]"\}\}}t||||k||<q,WqWdS)a Inserts new element at location index in the list of parsed tokens. Similar to C{list.insert()}. Example:: print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] # use a parse action to insert the parse location in the front of the parsed results def insert_locn(locn, tokens): tokens.insert(0, locn) print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] N)rinsertrrrr)rrZinsStrrrrrrrwrwrxr2szParseResults.insertcCs|jj|dS)a Add single element to end of ParseResults list of elements. Example:: print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] # use a parse action to compute the sum of the parsed integers, and add it to the end def append_sum(tokens): tokens.append(sum(map(int, tokens))) print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] N)rappend)ritemrwrwrxrFs zParseResults.appendcCs$t|tr||7}n |jj|dS)a Add sequence of elements to end of ParseResults list of elements. Example:: patt = OneOrMore(Word(alphas)) # use a parse action to append the reverse of the matched strings, to make a palindrome def make_palindrome(tokens): tokens.extend(reversed([t[::-1] for t in tokens])) return ''.join(tokens) print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' N)rzr"rextend)rZitemseqrwrwrxrTs  zParseResults.extendcCs|jdd=|jjdS)z7 Clear all elements and results names. N)rrclear)rrwrwrxrfs zParseResults.clearc Csfy||Stk rdSX||jkr^||jkrD|j|ddStdd|j|DSndSdS)NrrrrcSsg|] }|dqS)rrw)rrrwrwrxrwsz,ParseResults.__getattr__..rs)rrrr")rrrwrwrxrms  zParseResults.__getattr__cCs|j}||7}|S)N)r)rotherrrwrwrx__add__{szParseResults.__add__cs|jrnt|jfdd|jj}fdd|D}x4|D],\}}|||<t|dtr>t||d_q>W|j|j7_|jj |j|S)Ncs|dkr S|S)Nrrw)a)offsetrwrxrysz'ParseResults.__iadd__..c s4g|],\}}|D]}|t|d|dfqqS)rrr)r)rrvlistr) addoffsetrwrxrsz)ParseResults.__iadd__..r) rrrrrzr"rrrupdate)rrZ otheritemsZotherdictitemsrrrw)rrrx__iadd__s    zParseResults.__iadd__cCs&t|tr|dkr|jS||SdS)Nr)rzrur)rrrwrwrx__radd__szParseResults.__radd__cCsdt|jt|jfS)Nz(%s, %s))rrr)rrwrwrxrszParseResults.__repr__cCsddjdd|jDdS)N[z, css(|] }t|trt|nt|VqdS)N)rzr"rr)rrrwrwrxrsz'ParseResults.__str__..])rr)rrwrwrxrszParseResults.__str__rcCsPg}xF|jD]<}|r"|r"|j|t|tr:||j7}q |jt|q W|S)N)rrrzr" _asStringListr)rsepoutrrwrwrxr s   zParseResults._asStringListcCsdd|jDS)a Returns the parse results as a nested list of matching tokens, all converted to strings. Example:: patt = OneOrMore(Word(alphas)) result = patt.parseString("sldkj lsdkj sldkj") # even though the result prints in string-like form, it is actually a pyparsing ParseResults print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] # Use asList() to create an actual list result_list = result.asList() print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] cSs"g|]}t|tr|jn|qSrw)rzr"r)rresrwrwrxrsz'ParseResults.asList..)r)rrwrwrxrszParseResults.asListcs6tr |j}n|j}fddtfdd|DS)a Returns the named parse results as a nested dictionary. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString('12/31/1999') print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) result_dict = result.asDict() print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} # even though a ParseResults supports dict-like access, sometime you just need to have a dict import json print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} cs6t|tr.|jr|jSfdd|DSn|SdS)Ncsg|] }|qSrwrw)rr)toItemrwrxrsz7ParseResults.asDict..toItem..)rzr"rasDict)r)rrwrxrs  z#ParseResults.asDict..toItemc3s|]\}}||fVqdS)Nrw)rrr)rrwrxrsz&ParseResults.asDict..)PY_3rrr)rZitem_fnrw)rrxrs  zParseResults.asDictcCs8t|j}|jj|_|j|_|jj|j|j|_|S)zA Returns a new copy of a C{ParseResults} object. )r"rrrrrrr)rrrwrwrxrs   zParseResults.copyFc CsPd}g}tdd|jjD}|d}|s8d}d}d}d} |dk rJ|} n |jrV|j} | sf|rbdSd} |||d| d g7}xt|jD]\} } t| tr| |kr|| j|| |o|dk||g7}n|| jd|o|dk||g7}qd} | |kr|| } | s |rqnd} t t | } |||d| d | d | d g 7}qW|||d | d g7}dj |S) z (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.  css(|] \}}|D]}|d|fVqqdS)rrNrw)rrrrrwrwrxrsz%ParseResults.asXML..z rNZITEM<>z.z %s%s- %s: z rrcss|]}t|tVqdS)N)rzr")rvvrwrwrxrssz %s%s[%d]: %s%s%sr) rrrrsortedrrzr"dumpranyrr) rrdepthfullr NLrrrrrrwrwrxrPs,   4.zParseResults.dumpcOstj|jf||dS)a Pretty-printer for parsed results as a list, using the C{pprint} module. Accepts additional positional or keyword args as defined for the C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) Example:: ident = Word(alphas, alphanums) num = Word(nums) func = Forward() term = ident | num | Group('(' + func + ')') func <<= ident + Group(Optional(delimitedList(term))) result = func.parseString("fna a,b,(fnb c,d,200),100") result.pprint(width=40) prints:: ['fna', ['a', 'b', ['(', 'fnb', ['c', 'd', '200'], ')'], '100']] N)pprintr)rrrrwrwrxr"}szParseResults.pprintcCs.|j|jj|jdk r|jp d|j|jffS)N)rrrrrr)rrwrwrx __getstate__s zParseResults.__getstate__cCsN|d|_|d\|_}}|_i|_|jj||dk rDt||_nd|_dS)Nrrr)rrrrrrr)rstaterZ inAccumNamesrwrwrx __setstate__s   zParseResults.__setstate__cCs|j|j|j|jfS)N)rrrr)rrwrwrx__getnewargs__szParseResults.__getnewargs__cCstt|t|jS)N)rrrr)rrwrwrxrszParseResults.__dir__)NNTT)N)r)NFrT)rrT)4rrrrrrzrrrrrrr __nonzero__rrrrrrrrrrrrrrrrrrrrrrrrrr rrrrrrrr"r#r%r&rrwrwrwrxr"-sh& ' 4  # =% - cCsF|}d|kot|knr4||ddkr4dS||jdd|S)aReturns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. rrrr)rrfind)rstrgrrwrwrxr9s cCs|jdd|dS)aReturns current line number within a string, counting newlines as line separators. The first line is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. rrrr)count)rr)rwrwrxrJs cCsF|jdd|}|jd|}|dkr2||d|S||ddSdS)zfReturns the line of text containing loc within a string, counting newlines as line separators. rrrrN)r(find)rr)ZlastCRZnextCRrwrwrxrGs  cCs8tdt|dt|dt||t||fdS)NzMatch z at loc z(%d,%d))printrrJr9)instringrexprrwrwrx_defaultStartDebugActionsr/cCs$tdt|dt|jdS)NzMatched z -> )r,rr{r)r-startlocZendlocr.toksrwrwrx_defaultSuccessDebugActionsr2cCstdt|dS)NzException raised:)r,r)r-rr.excrwrwrx_defaultExceptionDebugActionsr4cGsdS)zG'Do-nothing' debug action, to suppress debugging output during parsing.Nrw)rrwrwrxrQsrqc stkrfddSdgdgtdddkrFddd }dd d n tj}tjd }|dd d}|d|d|ffdd}d}ytdtdj}Wntk rt}YnX||_|S)Ncs|S)Nrw)rlrv)funcrwrxrysz_trim_arity..rFrqrocSs8tdkr dnd }tj| |dd|}|j|jfgS) Nror7rrqrr)limit)ror7r)system_version traceback extract_stackfilenamerJ)r8r frame_summaryrwrwrxr=sz"_trim_arity..extract_stackcSs$tj||d}|d}|j|jfgS)N)r8rrrs)r< extract_tbr>rJ)tbr8Zframesr?rwrwrxr@sz_trim_arity..extract_tb)r8rrcsxy |dd}dd<|Stk rdr>n4z.tjd}|dddddksjWd~Xdkrdd7<wYqXqWdS)NrTrrrq)r8rsrs)rr~exc_info)rrrA)r@ foundArityr6r8maxargspa_call_line_synthrwrxwrappers"  z_trim_arity..wrapperzr __class__)ror7)r)rrs) singleArgBuiltinsr;r<r=r@getattrr Exceptionr{)r6rEr=Z LINE_DIFFZ this_linerG func_namerw)r@rDr6r8rErFrx _trim_aritys*   rMcseZdZdZdZdZeddZeddZddd Z d d Z d d Z dddZ dddZ ddZddZddZddZddZddZddd Zd!d"Zdd#d$Zd%d&Zd'd(ZGd)d*d*eZed+k rGd,d-d-eZnGd.d-d-eZiZeZd/d/gZ dd0d1Z!eZ"ed2d3Z#dZ$edd5d6Z%dd7d8Z&e'dfd9d:Z(d;d<Z)e'fd=d>Z*e'dfd?d@Z+dAdBZ,dCdDZ-dEdFZ.dGdHZ/dIdJZ0dKdLZ1dMdNZ2dOdPZ3dQdRZ4dSdTZ5dUdVZ6dWdXZ7dYdZZ8dd[d\Z9d]d^Z:d_d`Z;dadbZdgdhZ?ddidjZ@dkdlZAdmdnZBdodpZCdqdrZDgfdsdtZEddudvZFfdwdxZGdydzZHd{d|ZId}d~ZJddZKdddZLdddZMZNS)r$z)Abstract base level parser element class.z FcCs |t_dS)a Overrides the default whitespace chars Example:: # default whitespace chars are space, and newline OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] # change to just treat newline as significant ParserElement.setDefaultWhitespaceChars(" \t") OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] N)r$DEFAULT_WHITE_CHARS)charsrwrwrxsetDefaultWhitespaceChars=s z'ParserElement.setDefaultWhitespaceCharscCs |t_dS)a Set class to be used for inclusion of string literals into a parser. Example:: # default literal class used is Literal integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] # change to Suppress ParserElement.inlineLiteralsUsing(Suppress) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] N)r$_literalStringClass)rrwrwrxinlineLiteralsUsingLsz!ParserElement.inlineLiteralsUsingcCst|_d|_d|_d|_||_d|_tj|_ d|_ d|_ d|_ t|_ d|_d|_d|_d|_d|_d|_d|_d|_d|_dS)NTFr)NNN)r parseAction failActionstrRepr resultsName saveAsListskipWhitespacer$rN whiteCharscopyDefaultWhiteCharsmayReturnEmptykeepTabs ignoreExprsdebug streamlined mayIndexErrorerrmsg modalResults debugActionsre callPreparse callDuringTry)rsavelistrwrwrxras(zParserElement.__init__cCs<tj|}|jdd|_|jdd|_|jr8tj|_|S)a$ Make a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element. Example:: integer = Word(nums).setParseAction(lambda toks: int(toks[0])) integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) prints:: [5120, 100, 655360, 268435456] Equivalent form of C{expr.copy()} is just C{expr()}:: integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") N)rrSr]rZr$rNrY)rZcpyrwrwrxrxs  zParserElement.copycCs*||_d|j|_t|dr&|j|j_|S)af Define name for this expression, makes debugging and exception messages clearer. Example:: Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) z Expected exception)rrarrhr)rrrwrwrxsetNames    zParserElement.setNamecCs4|j}|jdr"|dd}d}||_| |_|S)aP Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. You can also set results names using the abbreviated syntax, C{expr("name")} in place of C{expr.setResultsName("name")} - see L{I{__call__}<__call__>}. Example:: date_str = (integer.setResultsName("year") + '/' + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: date_str = integer("year") + '/' + integer("month") + '/' + integer("day") *NrrTrs)rendswithrVrb)rrlistAllMatchesZnewselfrwrwrxsetResultsNames  zParserElement.setResultsNameTcs@|r&|jdfdd }|_||_nt|jdr<|jj|_|S)zMethod to invoke the Python pdb debugger when this element is about to be parsed. Set C{breakFlag} to True to enable, False to disable. Tcsddl}|j||||S)Nr)pdbZ set_trace)r-r doActions callPreParsern) _parseMethodrwrxbreakersz'ParserElement.setBreak..breaker_originalParseMethod)TT)_parsersr)rZ breakFlagrrrw)rqrxsetBreaks  zParserElement.setBreakcOs&tttt||_|jdd|_|S)a  Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Optional keyword arguments: - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. Example:: integer = Word(nums) date_str = integer + '/' + integer + '/' + integer date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] # use parse action to convert to ints at parse time integer = Word(nums).setParseAction(lambda toks: int(toks[0])) date_str = integer + '/' + integer + '/' + integer # note that integer fields are now ints, not strings date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] rfF)rmaprMrSrrf)rfnsrrwrwrxrs"zParserElement.setParseActioncOs4|jtttt|7_|jp,|jdd|_|S)z Add parse action to expression's list of parse actions. See L{I{setParseAction}}. See examples in L{I{copy}}. rfF)rSrrvrMrfr)rrwrrwrwrxaddParseActionszParserElement.addParseActioncsb|jdd|jddrtntx(|D] fdd}|jj|q&W|jpZ|jdd|_|S)aAdd a boolean predicate function to expression's list of parse actions. See L{I{setParseAction}} for function call signatures. Unlike C{setParseAction}, functions passed to C{addCondition} need to return boolean success/fail of the condition. Optional keyword arguments: - message = define a custom message to be used in the raised exception - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException Example:: integer = Word(nums).setParseAction(lambda toks: int(toks[0])) year_int = integer.copy() year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") date_str = year_int + '/' + integer + '/' + integer result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) messagezfailed user-defined conditionfatalFcs$tt|||s ||dS)N)rrM)rr5rv)exc_typefnrrwrxpasz&ParserElement.addCondition..parf)rr!rrSrrf)rrwrr}rw)r{r|rrx addConditions  zParserElement.addConditioncCs ||_|S)a Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw C{L{ParseFatalException}} if it is desired to stop parsing immediately.)rT)rr|rwrwrx setFailActions zParserElement.setFailActionc CsZd}xP|rTd}xB|jD]8}yx|j||\}}d}qWWqtk rLYqXqWqW|S)NTF)r]rtr)rr-rZ exprsFoundeZdummyrwrwrx_skipIgnorables#s  zParserElement._skipIgnorablescCsL|jr|j||}|jrH|j}t|}x ||krF|||krF|d7}q(W|S)Nrr)r]rrXrYr)rr-rZwtinstrlenrwrwrxpreParse0s  zParserElement.preParsecCs|gfS)Nrw)rr-rrorwrwrx parseImpl<szParserElement.parseImplcCs|S)Nrw)rr-r tokenlistrwrwrx postParse?szParserElement.postParsec "Cs|j}|s|jr|jdr,|jd||||rD|jrD|j||}n|}|}yDy|j|||\}}Wn(tk rt|t||j |YnXWnXt k r} z<|jdr|jd|||| |jr|j|||| WYdd} ~ XnXn|o|jr|j||}n|}|}|j s$|t|krhy|j|||\}}Wn*tk rdt|t||j |YnXn|j|||\}}|j |||}t ||j|j|jd} |jr|s|jr|rVyRxL|jD]B} | ||| }|dk rt ||j|jot|t tf|jd} qWWnFt k rR} z(|jdr@|jd|||| WYdd} ~ XnXnNxL|jD]B} | ||| }|dk r^t ||j|jot|t tf|jd} q^W|r|jdr|jd||||| || fS)Nrrq)rrrr)r^rTrcrerrrrrrarr`rr"rVrWrbrSrfrzr) rr-rrorpZ debuggingprelocZ tokensStarttokenserrZ retTokensr|rwrwrx _parseNoCacheCsp             zParserElement._parseNoCachec Cs>y|j||dddStk r8t|||j|YnXdS)NF)ror)rtr!rra)rr-rrwrwrxtryParseszParserElement.tryParsec Cs2y|j||Wnttfk r(dSXdSdS)NFT)rrr)rr-rrwrwrx canParseNexts zParserElement.canParseNextc@seZdZddZdS)zParserElement._UnboundedCachecsdit|_fdd}fdd}fdd}tj|||_tj|||_tj|||_dS)Ncs j|S)N)r)rr)cache not_in_cacherwrxrsz3ParserElement._UnboundedCache.__init__..getcs ||<dS)Nrw)rrr)rrwrxsetsz3ParserElement._UnboundedCache.__init__..setcs jdS)N)r)r)rrwrxrsz5ParserElement._UnboundedCache.__init__..clear)rrtypes MethodTyperrr)rrrrrw)rrrxrs   z&ParserElement._UnboundedCache.__init__N)rrrrrwrwrwrx_UnboundedCachesrNc@seZdZddZdS)zParserElement._FifoCachecsht|_tfdd}fdd}fdd}tj|||_tj|||_tj|||_dS)Ncs j|S)N)r)rr)rrrwrxrsz.ParserElement._FifoCache.__init__..getcs"||<tkrjddS)NF)rpopitem)rrr)rsizerwrxrs z.ParserElement._FifoCache.__init__..setcs jdS)N)r)r)rrwrxrsz0ParserElement._FifoCache.__init__..clear)rr _OrderedDictrrrrr)rrrrrrw)rrrrxrs  z!ParserElement._FifoCache.__init__N)rrrrrwrwrwrx _FifoCachesrc@seZdZddZdS)zParserElement._FifoCachecsvt|_itjgfdd}fdd}fdd}tj|||_tj|||_tj|||_dS)Ncs j|S)N)r)rr)rrrwrxrsz.ParserElement._FifoCache.__init__..getcs2||<tkr$jjdj|dS)N)rrpopleftr)rrr)rkey_fiforrwrxrs z.ParserElement._FifoCache.__init__..setcsjjdS)N)r)r)rrrwrxrsz0ParserElement._FifoCache.__init__..clear) rr collectionsdequerrrrr)rrrrrrw)rrrrrxrs  z!ParserElement._FifoCache.__init__N)rrrrrwrwrwrxrsrc Csd\}}|||||f}tjtj}|j|} | |jkrtj|d7<y|j||||} Wn8tk r} z|j|| j | j WYdd} ~ XqX|j|| d| dj f| Sn4tj|d7<t | t r| | d| dj fSWdQRXdS)Nrrr)rrr)r$packrat_cache_lock packrat_cacherrpackrat_cache_statsrrrrHrrrzrK) rr-rrorpZHITZMISSlookuprrrrwrwrx _parseCaches$   zParserElement._parseCachecCs(tjjdgttjtjdd<dS)Nr)r$rrrrrwrwrwrx resetCaches zParserElement.resetCachecCs8tjs4dt_|dkr tjt_n tj|t_tjt_dS)aEnables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. Parameters: - cache_size_limit - (default=C{128}) - if an integer value is provided will limit the size of the packrat cache; if None is passed, then the cache size will be unbounded; if 0 is passed, the cache will be effectively disabled. This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method C{ParserElement.enablePackrat()}. If your program uses C{psyco} to "compile as you go", you must call C{enablePackrat} before calling C{psyco.full()}. If you do not do this, Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. Example:: import pyparsing pyparsing.ParserElement.enablePackrat() TN)r$_packratEnabledrrrrrt)Zcache_size_limitrwrwrx enablePackrats   zParserElement.enablePackratcCstj|js|jx|jD] }|jqW|js<|j}y<|j|d\}}|rv|j||}t t }|j||Wn0t k r}ztj rn|WYdd}~XnX|SdS)aB Execute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built. If you want the grammar to require that the entire input string be successfully parsed, then set C{parseAll} to True (equivalent to ending the grammar with C{L{StringEnd()}}). Note: C{parseString} implicitly calls C{expandtabs()} on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the C{loc} argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - calling C{parseWithTabs} on your grammar before calling C{parseString} (see L{I{parseWithTabs}}) - define your parse action using the full C{(s,loc,toks)} signature, and reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling C{parseString} Example:: Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text rN) r$rr_ streamliner]r\ expandtabsrtrr r)rverbose_stacktrace)rr-parseAllrrrZser3rwrwrx parseString#s$    zParserElement.parseStringccs@|js|jx|jD] }|jqW|js8t|j}t|}d}|j}|j}t j d} yx||kon| |kry |||} ||| dd\} } Wnt k r| d}Yq`X| |kr| d7} | | | fV|r|||} | |kr| }q|d7}n| }q`| d}q`WWn4t k r:}zt j r&n|WYdd}~XnXdS)a Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional C{maxMatches} argument, to clip scanning after 'n' matches are found. If C{overlap} is specified, then overlapping matches will be reported. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs. Example:: source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" print(source) for tokens,start,end in Word(alphas).scanString(source): print(' '*start + '^'*(end-start)) print(' '*start + tokens[0]) prints:: sldjf123lsdjjkf345sldkjf879lkjsfd987 ^^^^^ sldjf ^^^^^^^ lsdjjkf ^^^^^^ sldkjf ^^^^^^ lkjsfd rF)rprrN)r_rr]r\rrrrrtr$rrrr)rr- maxMatchesZoverlaprrrZ preparseFnZparseFnmatchesrZnextLocrZnextlocr3rwrwrx scanStringUsB       zParserElement.scanStringcCsg}d}d|_yxh|j|D]Z\}}}|j||||rrt|trT||j7}nt|trh||7}n |j||}qW|j||ddd|D}djtt t |St k r}zt j rȂn|WYdd}~XnXdS)af Extension to C{L{scanString}}, to modify matching text with modified tokens that may be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. C{transformString()} returns the resulting transformed string. Example:: wd = Word(alphas) wd.setParseAction(lambda toks: toks[0].title()) print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) Prints:: Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. rTNcSsg|] }|r|qSrwrw)rorwrwrxrsz1ParserElement.transformString..r)r\rrrzr"rrrrvr_flattenrr$r)rr-r ZlastErvrrr3rwrwrxrs(    zParserElement.transformStringcCsPytdd|j||DStk rJ}ztjr6n|WYdd}~XnXdS)a~ Another extension to C{L{scanString}}, simplifying the access to the tokens found to match the given parse expression. May be called with optional C{maxMatches} argument, to clip searching after 'n' matches are found. Example:: # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters cap_word = Word(alphas.upper(), alphas.lower()) print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) prints:: ['More', 'Iron', 'Lead', 'Gold', 'I'] cSsg|]\}}}|qSrwrw)rrvrrrwrwrxrsz.ParserElement.searchString..N)r"rrr$r)rr-rr3rwrwrx searchStrings zParserElement.searchStringc csXd}d}x<|j||dD]*\}}}|||V|r>|dV|}qW||dVdS)a[ Generator method to split a string using the given expression as a separator. May be called with optional C{maxsplit} argument, to limit the number of splits; and the optional C{includeSeparators} argument (default=C{False}), if the separating matching text should be included in the split results. Example:: punc = oneOf(list(".,;:/-!?")) print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) prints:: ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] r)rN)r) rr-maxsplitZincludeSeparatorsZsplitsZlastrvrrrwrwrxrs  zParserElement.splitcCsFt|trtj|}t|ts:tjdt|tdddSt||gS)a Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement converts them to L{Literal}s by default. Example:: greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) Prints:: Hello, World! -> ['Hello', ',', 'World', '!'] z4Cannot combine element of type %s with ParserElementrq) stacklevelN) rzrr$rQwarningswarnr SyntaxWarningr)rrrwrwrxrs    zParserElement.__add__cCsBt|trtj|}t|ts:tjdt|tdddS||S)z] Implementation of + operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrxrs    zParserElement.__radd__cCsLt|trtj|}t|ts:tjdt|tdddSt|tj |gS)zQ Implementation of - operator, returns C{L{And}} with error stop z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr _ErrorStop)rrrwrwrx__sub__s    zParserElement.__sub__cCsBt|trtj|}t|ts:tjdt|tdddS||S)z] Implementation of - operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__rsub__ s    zParserElement.__rsub__cst|tr|d}}nt|tr|d dd}|ddkrHd|df}t|dtr|ddkr|ddkrvtS|ddkrtS|dtSnJt|dtrt|dtr|\}}||8}ntdt|dt|dntdt||dkr td|dkrtd||ko2dknrBtd |rfd d |r|dkrt|}ntg||}n|}n|dkr}ntg|}|S) a Implementation of * operator, allows use of C{expr * 3} in place of C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples may also include C{None} as in: - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + L{ZeroOrMore}(expr)} (read as "at least n instances of C{expr}") - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} Note that C{expr*(None,n)} does not raise an exception if more than n exprs exist in the input stream; that is, C{expr*(None,n)} does not enforce a maximum number of expr occurrences. If this behavior is desired, then write C{expr*(None,n) + ~expr} rNrqrrz7cannot multiply 'ParserElement' and ('%s','%s') objectsz0cannot multiply 'ParserElement' and '%s' objectsz/cannot multiply ParserElement by negative valuez@second tuple value must be greater or equal to first tuple valuez+cannot multiply ParserElement by 0 or (0,0)cs(|dkrt|dStSdS)Nrr)r)n)makeOptionalListrrwrxr]sz/ParserElement.__mul__..makeOptionalList)NN) rzrutupler2rrr ValueErrorr)rrZ minElementsZ optElementsrrw)rrrx__mul__,sD             zParserElement.__mul__cCs |j|S)N)r)rrrwrwrx__rmul__pszParserElement.__rmul__cCsFt|trtj|}t|ts:tjdt|tdddSt||gS)zI Implementation of | operator - returns C{L{MatchFirst}} z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr)rrrwrwrx__or__ss    zParserElement.__or__cCsBt|trtj|}t|ts:tjdt|tdddS||BS)z] Implementation of | operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__ror__s    zParserElement.__ror__cCsFt|trtj|}t|ts:tjdt|tdddSt||gS)zA Implementation of ^ operator - returns C{L{Or}} z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr)rrrwrwrx__xor__s    zParserElement.__xor__cCsBt|trtj|}t|ts:tjdt|tdddS||AS)z] Implementation of ^ operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__rxor__s    zParserElement.__rxor__cCsFt|trtj|}t|ts:tjdt|tdddSt||gS)zC Implementation of & operator - returns C{L{Each}} z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr )rrrwrwrx__and__s    zParserElement.__and__cCsBt|trtj|}t|ts:tjdt|tdddS||@S)z] Implementation of & operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__rand__s    zParserElement.__rand__cCst|S)zE Implementation of ~ operator - returns C{L{NotAny}} )r)rrwrwrx __invert__szParserElement.__invert__cCs|dk r|j|S|jSdS)a  Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be passed as C{True}. If C{name} is omitted, same as calling C{L{copy}}. Example:: # these are equivalent userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") N)rmr)rrrwrwrx__call__s zParserElement.__call__cCst|S)z Suppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. )r+)rrwrwrxsuppressszParserElement.suppresscCs d|_|S)a Disables the skipping of whitespace before matching the characters in the C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. F)rX)rrwrwrxleaveWhitespaceszParserElement.leaveWhitespacecCsd|_||_d|_|S)z8 Overrides the default whitespace chars TF)rXrYrZ)rrOrwrwrxsetWhitespaceCharssz ParserElement.setWhitespaceCharscCs d|_|S)z Overrides default behavior to expand C{}s to spaces before parsing the input string. Must be called before C{parseString} when the input grammar contains elements that match C{} characters. T)r\)rrwrwrx parseWithTabsszParserElement.parseWithTabscCsLt|trt|}t|tr4||jkrH|jj|n|jjt|j|S)a Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. Example:: patt = OneOrMore(Word(alphas)) patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] patt.ignore(cStyleComment) patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] )rzrr+r]rr)rrrwrwrxignores   zParserElement.ignorecCs"|pt|p t|ptf|_d|_|S)zT Enable display of debugging messages while doing pattern matching. T)r/r2r4rcr^)rZ startActionZ successActionZexceptionActionrwrwrxsetDebugActions s  zParserElement.setDebugActionscCs|r|jtttnd|_|S)a Enable display of debugging messages while doing pattern matching. Set C{flag} to True to enable, False to disable. Example:: wd = Word(alphas).setName("alphaword") integer = Word(nums).setName("numword") term = wd | integer # turn on debugging for wd wd.setDebug() OneOrMore(term).parseString("abc 123 xyz 890") prints:: Match alphaword at loc 0(1,1) Matched alphaword -> ['abc'] Match alphaword at loc 3(1,4) Exception raised:Expected alphaword (at char 4), (line:1, col:5) Match alphaword at loc 7(1,8) Matched alphaword -> ['xyz'] Match alphaword at loc 11(1,12) Exception raised:Expected alphaword (at char 12), (line:1, col:13) Match alphaword at loc 15(1,16) Exception raised:Expected alphaword (at char 15), (line:1, col:16) The output shown is that produced by the default debug actions - custom debug actions can be specified using L{setDebugActions}. Prior to attempting to match the C{wd} expression, the debugging message C{"Match at loc (,)"} is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, which makes debugging and exception messages easier to understand - for instance, the default name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. F)rr/r2r4r^)rflagrwrwrxsetDebugs#zParserElement.setDebugcCs|jS)N)r)rrwrwrxr@szParserElement.__str__cCst|S)N)r)rrwrwrxrCszParserElement.__repr__cCsd|_d|_|S)NT)r_rU)rrwrwrxrFszParserElement.streamlinecCsdS)Nrw)rrrwrwrxcheckRecursionKszParserElement.checkRecursioncCs|jgdS)zj Check defined expressions for valid structure, check for infinite recursive definitions. N)r)r validateTracerwrwrxvalidateNszParserElement.validatecCsy |j}Wn2tk r>t|d}|j}WdQRXYnXy |j||Stk r|}ztjrhn|WYdd}~XnXdS)z Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. rN)readropenrrr$r)rZfile_or_filenamerZ file_contentsfr3rwrwrx parseFileTs   zParserElement.parseFilecsHt|tr"||kp t|t|kSt|tr6|j|Stt||kSdS)N)rzr$varsrrsuper)rr)rHrwrx__eq__hs    zParserElement.__eq__cCs ||k S)Nrw)rrrwrwrx__ne__pszParserElement.__ne__cCs tt|S)N)hashid)rrwrwrx__hash__sszParserElement.__hash__cCs||kS)Nrw)rrrwrwrx__req__vszParserElement.__req__cCs ||k S)Nrw)rrrwrwrx__rne__yszParserElement.__rne__c Cs0y|jt||ddStk r*dSXdS)a Method for quick testing of a parser against a test string. Good for simple inline microtests of sub expressions while building up larger parser. Parameters: - testString - to test against this expression for a match - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests Example:: expr = Word(nums) assert expr.matches("100") )rTFN)rrr)rZ testStringrrwrwrxr|s zParserElement.matches#cCst|tr"tttj|jj}t|tr4t|}g}g}d} x|D]} |dk rb|j | dsl|rx| rx|j | qH| s~qHdj || g} g}y:| j dd} |j | |d} | j | j|d| o| } Wntk rx} zt| trdnd }d| kr0| j t| j| | j d t| j| d d |n| j d | jd || j d t| | ob|} | } WYdd} ~ XnDtk r}z&| j dt|| o|} |} WYdd}~XnX|r|r| j d tdj | |j | | fqHW| |fS)a3 Execute the parse expression on a series of test strings, showing each test, the parsed results or where the parse failed. Quick and easy way to run a parse expression against a list of sample strings. Parameters: - tests - a list of separate test strings, or a multiline string of test strings - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - comment - (default=C{'#'}) - expression for indicating embedded comments in the test string; pass None to disable comment filtering - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; if False, only dump nested list - printResults - (default=C{True}) prints test output to stdout - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing Returns: a (success, results) tuple, where success indicates that all tests succeeded (or failed if C{failureTests} is True), and the results contain a list of lines of each test's output Example:: number_expr = pyparsing_common.number.copy() result = number_expr.runTests(''' # unsigned integer 100 # negative integer -100 # float with scientific notation 6.02e23 # integer with scientific notation 1e-12 ''') print("Success" if result[0] else "Failed!") result = number_expr.runTests(''' # stray character 100Z # missing leading digit before '.' -.100 # too many '.' 3.14.159 ''', failureTests=True) print("Success" if result[0] else "Failed!") prints:: # unsigned integer 100 [100] # negative integer -100 [-100] # float with scientific notation 6.02e23 [6.02e+23] # integer with scientific notation 1e-12 [1e-12] Success # stray character 100Z ^ FAIL: Expected end of text (at char 3), (line:1, col:4) # missing leading digit before '.' -.100 ^ FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) # too many '.' 3.14.159 ^ FAIL: Expected end of text (at char 4), (line:1, col:5) Success Each test string must be on a single line. If you want to test a string that spans multiple lines, create a test like this:: expr.runTest(r"this is a test\n of strings that spans \n 3 lines") (Note that this is a raw string literal, you must include the leading 'r'.) TNFrz\n)r)r z(FATAL)r rr^zFAIL: zFAIL-EXCEPTION: )rzrrrvr{rrstrip splitlinesrrrrrrrrr!rGrr9rKr,)rZtestsrZcommentZfullDumpZ printResultsZ failureTestsZ allResultsZcommentssuccessrvr resultrrzr3rwrwrxrunTestssNW     $   zParserElement.runTests)F)F)T)T)TT)TT)r)F)N)T)F)T)TrTTF)OrrrrrNr staticmethodrPrRrrrirmrurrxr~rrrrrrrrrrrrrrrrrrtrrrr_MAX_INTrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr __classcell__rwrw)rHrxr$8s     &     H   " 2G+    D           )    cs eZdZdZfddZZS)r,zT Abstract C{ParserElement} subclass, for defining atomic matching patterns. cstt|jdddS)NF)rg)rr,r)r)rHrwrxr szToken.__init__)rrrrrrrwrw)rHrxr, scs eZdZdZfddZZS)r z, An empty token, will always match. cs$tt|jd|_d|_d|_dS)Nr TF)rr rrr[r`)r)rHrwrxr szEmpty.__init__)rrrrrrrwrw)rHrxr  scs*eZdZdZfddZdddZZS)rz( A token that will never match. cs*tt|jd|_d|_d|_d|_dS)NrTFzUnmatchable token)rrrrr[r`ra)r)rHrwrxr* s zNoMatch.__init__TcCst|||j|dS)N)rra)rr-rrorwrwrxr1 szNoMatch.parseImpl)T)rrrrrrrrwrw)rHrxr& s cs*eZdZdZfddZdddZZS)ra Token to exactly match a specified string. Example:: Literal('blah').parseString('blah') # -> ['blah'] Literal('blah').parseString('blahfooblah') # -> ['blah'] Literal('blah').parseString('bla') # -> Exception: Expected "blah" For case-insensitive matching, use L{CaselessLiteral}. For keyword matching (force word break before and after the matched string), use L{Keyword} or L{CaselessKeyword}. c stt|j||_t||_y|d|_Wn*tk rVtj dt ddt |_ YnXdt |j|_d|j|_d|_d|_dS)Nrz2null string passed to Literal; use Empty() insteadrq)rz"%s"z Expected F)rrrmatchrmatchLenfirstMatchCharrrrrr rHrrrar[r`)r matchString)rHrwrxrC s    zLiteral.__init__TcCsJ|||jkr6|jdks&|j|j|r6||j|jfSt|||j|dS)Nrr)rr startswithrrra)rr-rrorwrwrxrV szLiteral.parseImpl)T)rrrrrrrrwrw)rHrxr5 s  csLeZdZdZedZdfdd Zddd Zfd d Ze d d Z Z S)ra\ Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with C{L{Literal}}: - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} Accepts two optional constructor arguments in addition to the keyword string: - C{identChars} is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$" - C{caseless} allows case-insensitive matching, default is C{False}. Example:: Keyword("start").parseString("start") # -> ['start'] Keyword("start").parseString("starting") # -> Exception For case-insensitive matching, use L{CaselessKeyword}. z_$NFc stt|j|dkrtj}||_t||_y|d|_Wn$tk r^t j dt ddYnXd|j|_ d|j |_ d|_d|_||_|r|j|_|j}t||_dS)Nrz2null string passed to Keyword; use Empty() insteadrq)rz"%s"z Expected F)rrrDEFAULT_KEYWORD_CHARSrrrrrrrrrrar[r`caselessupper caselessmatchr identChars)rrrr)rHrwrxrq s&    zKeyword.__init__TcCs|jr|||||jj|jkr|t||jksL|||jj|jkr|dksj||dj|jkr||j|jfSnv|||jkr|jdks|j|j|r|t||jks|||j|jkr|dks||d|jkr||j|jfSt |||j |dS)Nrrr) rrrrrrrrrrra)rr-rrorwrwrxr s*&zKeyword.parseImplcstt|j}tj|_|S)N)rrrrr)rr)rHrwrxr sz Keyword.copycCs |t_dS)z,Overrides the default Keyword chars N)rr)rOrwrwrxsetDefaultKeywordChars szKeyword.setDefaultKeywordChars)NF)T) rrrrr3rrrrrrrrwrw)rHrxr^ s   cs*eZdZdZfddZdddZZS)ral Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. Example:: OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] (Contrast with example for L{CaselessKeyword}.) cs6tt|j|j||_d|j|_d|j|_dS)Nz'%s'z Expected )rrrr returnStringrra)rr)rHrwrxr s zCaselessLiteral.__init__TcCs@||||jj|jkr,||j|jfSt|||j|dS)N)rrrrrra)rr-rrorwrwrxr szCaselessLiteral.parseImpl)T)rrrrrrrrwrw)rHrxr s  cs,eZdZdZdfdd Zd ddZZS) rz Caseless version of L{Keyword}. Example:: OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] (Contrast with example for L{CaselessLiteral}.) Ncstt|j||dddS)NT)r)rrr)rrr)rHrwrxr szCaselessKeyword.__init__TcCsj||||jj|jkrV|t||jksF|||jj|jkrV||j|jfSt|||j|dS)N)rrrrrrrra)rr-rrorwrwrxr s*zCaselessKeyword.parseImpl)N)T)rrrrrrrrwrw)rHrxr scs,eZdZdZdfdd Zd ddZZS) rlax A variation on L{Literal} which matches "close" matches, that is, strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - C{match_string} - string to be matched - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match The results from a successful parse will contain the matched text from the input string and the following named results: - C{mismatches} - a list of the positions within the match_string where mismatches were found - C{original} - the original match_string used to compare against the input string If C{mismatches} is an empty list, then the match was an exact match. Example:: patt = CloseMatch("ATCATCGAATGGA") patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) # exact match patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) # close match allowing up to 2 mismatches patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) rrcsBtt|j||_||_||_d|j|jf|_d|_d|_dS)Nz&Expected %r (with up to %d mismatches)F) rrlrr match_string maxMismatchesrar`r[)rrr)rHrwrxr szCloseMatch.__init__TcCs|}t|}|t|j}||kr|j}d}g} |j} xtt||||jD]0\}} | \} } | | krP| j|t| | krPPqPW|d}t|||g}|j|d<| |d<||fSt|||j|dS)Nrrroriginal mismatches) rrrrrrr"rra)rr-rrostartrmaxlocrZmatch_stringlocrrZs_msrcmatresultsrwrwrxr s("   zCloseMatch.parseImpl)rr)T)rrrrrrrrwrw)rHrxrl s cs8eZdZdZd fdd Zdd d Zfd d ZZS)r/a Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. An optional C{excludeChars} parameter can list characters that might be found in the input C{bodyChars} string; useful to define a word of all printables except for one or two characters, for instance. L{srange} is useful for defining custom character set strings for defining C{Word} expressions, using range notation from regular expression character sets. A common mistake is to use C{Word} to match a specific literal string, as in C{Word("Address")}. Remember that C{Word} uses the string argument to define I{sets} of matchable characters. This expression would match "Add", "AAA", "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an exact literal string, use L{Literal} or L{Keyword}. pyparsing includes helper strings for building Words: - L{alphas} - L{nums} - L{alphanums} - L{hexnums} - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - L{printables} (any non-whitespace character) Example:: # a word composed of digits integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) # a word with a leading capital, and zero or more lowercase capital_word = Word(alphas.upper(), alphas.lower()) # hostnames are alphanumeric, with leading alpha, and '-' hostname = Word(alphas, alphanums+'-') # roman numeral (not a strict parser, accepts invalid mix of characters) roman = Word("IVXLCDM") # any string of non-whitespace characters, except for ',' csv_value = Word(printables, excludeChars=",") NrrrFc stt|jrFdjfdd|D}|rFdjfdd|D}||_t||_|rl||_t||_n||_t||_|dk|_ |dkrt d||_ |dkr||_ nt |_ |dkr||_ ||_ t||_d|j|_d |_||_d |j|jkr|dkr|dkr|dkr|j|jkr8d t|j|_nHt|jdkrfd tj|jt|jf|_nd t|jt|jf|_|jrd|jd|_ytj|j|_Wntk rd|_YnXdS)Nrc3s|]}|kr|VqdS)Nrw)rr) excludeCharsrwrxr7 sz Word.__init__..c3s|]}|kr|VqdS)Nrw)rr)rrwrxr9 srrrzZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permittedz Expected Frz[%s]+z%s[%s]*z [%s][%s]*z\b)rr/rr initCharsOrigr initChars bodyCharsOrig bodyChars maxSpecifiedrminLenmaxLenrrrrar` asKeyword_escapeRegexRangeCharsreStringrrdescapecompilerK)rrrminmaxexactrr)rH)rrxr4 sT      0 z Word.__init__Tc CsD|jr<|jj||}|s(t|||j||j}||jfS|||jkrZt|||j||}|d7}t|}|j}||j }t ||}x ||kr|||kr|d7}qWd} |||j krd} |j r||kr|||krd} |j r|dkr||d|ks||kr|||krd} | r4t|||j|||||fS)NrrFTr)rdrrraendgrouprrrrr rrr) rr-rrorrrZ bodycharsrZthrowExceptionrwrwrxrj s6    4zWord.parseImplc stytt|jStk r"YnX|jdkrndd}|j|jkr^d||j||jf|_nd||j|_|jS)NcSs$t|dkr|dddS|SdS)Nz...)r)rrwrwrx charsAsStr s z Word.__str__..charsAsStrz W:(%s,%s)zW:(%s))rr/rrKrUrr)rr)rHrwrxr s  z Word.__str__)NrrrrFN)T)rrrrrrrrrwrw)rHrxr/ s.6 #csFeZdZdZeejdZd fdd Zd ddZ fd d Z Z S) r'a Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. If the given regex contains named groups (defined using C{(?P...)}), these will be preserved as named parse results. Example:: realnum = Regex(r"[+-]?\d+\.\d*") date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)') # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") z[A-Z]rc stt|jt|tr|s,tjdtdd||_||_ yt j |j|j |_ |j|_ Wqt jk rtjd|tddYqXn2t|tjr||_ t||_|_ ||_ ntdt||_d|j|_d|_d|_d S) zThe parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.z0null string passed to Regex; use Empty() insteadrq)rz$invalid pattern (%s) passed to RegexzCRegex may only be constructed with a string or a compiled RE objectz Expected FTN)rr'rrzrrrrpatternflagsrdr r sre_constantserrorcompiledREtyper{rrrrar`r[)rrr)rHrwrxr s.         zRegex.__init__TcCsd|jj||}|s"t|||j||j}|j}t|j}|r\x|D]}||||<qHW||fS)N)rdrrrar groupdictr"r)rr-rrordrrrwrwrxr s  zRegex.parseImplc sDytt|jStk r"YnX|jdkr>dt|j|_|jS)NzRe:(%s))rr'rrKrUrr)r)rHrwrxr s z Regex.__str__)r)T) rrrrrrdr rrrrrrwrw)rHrxr' s  " cs8eZdZdZd fdd Zd ddZfd d ZZS) r%a Token for matching strings that are delimited by quoting characters. Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=C{None}) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) Example:: qs = QuotedString('"') print(qs.searchString('lsjdf "This is the quote" sldjf')) complex_qs = QuotedString('{{', endQuoteChar='}}') print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) sql_qs = QuotedString('"', escQuote='""') print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) prints:: [['This is the quote']] [['This is the "quote"']] [['This is the quote with "embedded" quotes']] NFTc sNttj|j}|s0tjdtddt|dkr>|}n"|j}|s`tjdtddt|_t |_ |d_ |_ t |_ |_|_|_|_|rtjtjB_dtjjtj d|dk rt|pdf_n.)z|(?:%s)z|(?:%s.)z(.)z)*%sz$invalid pattern (%s) passed to Regexz Expected FTrs)%rr%rrrrr SyntaxError quoteCharr quoteCharLenfirstQuoteCharrendQuoteCharLenescCharescQuoteunquoteResultsconvertWhitespaceEscapesrd MULTILINEDOTALLrr rrrrescCharReplacePatternr rrrrrrar`r[)rrr r!Z multiliner"rr#)rH)rrxr sf       6     zQuotedString.__init__c Cs|||jkr|jj||pd}|s4t|||j||j}|j}|jr||j|j }t |t rd|kr|j rddddd}x |j D]\}}|j||}qW|jrtj|jd|}|jr|j|j|j}||fS)N\ r  )z\tz\nz\fz\rz\g<1>)rrdrrrarrr"rrrzrr#rrr rr&r!r) rr-rrorrZws_mapZwslitZwscharrwrwrxrG s(  zQuotedString.parseImplc sFytt|jStk r"YnX|jdkr@d|j|jf|_|jS)Nz.quoted string, starting with %s ending with %s)rr%rrKrUrr)r)rHrwrxrj s zQuotedString.__str__)NNFTNT)T)rrrrrrrrrwrw)rHrxr% sA #cs8eZdZdZd fdd Zd ddZfd d ZZS) r a Token for matching words composed of characters I{not} in a given set (will include whitespace in matched characters if not listed in the provided exclusion set - see example). Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. Example:: # define a comma-separated-value as anything that is not a ',' csv_value = CharsNotIn(',') print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) prints:: ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] rrrcstt|jd|_||_|dkr*td||_|dkr@||_nt|_|dkrZ||_||_t ||_ d|j |_ |jdk|_ d|_ dS)NFrrzfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedrz Expected )rr rrXnotCharsrrrrrrrar[r`)rr+r r r )rHrwrxr s    zCharsNotIn.__init__TcCs|||jkrt|||j||}|d7}|j}t||jt|}x ||krd|||krd|d7}qFW|||jkrt|||j|||||fS)Nrr)r+rrar rrr)rr-rrorZnotcharsmaxlenrwrwrxr s   zCharsNotIn.parseImplc sdytt|jStk r"YnX|jdkr^t|jdkrRd|jdd|_n d|j|_|jS)Nrz !W:(%s...)z!W:(%s))rr rrKrUrr+)r)rHrwrxr s  zCharsNotIn.__str__)rrrr)T)rrrrrrrrrwrw)rHrxr v s cs<eZdZdZddddddZdfd d ZdddZZS)r.a Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is C{" \t\r\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, as defined for the C{L{Word}} class. zzzzz)rr(rr*r) rrrcsttj|_jdjfddjDdjddjD_d_dj_ |_ |dkrt|_ nt _ |dkr|_ |_ dS)Nrc3s|]}|jkr|VqdS)N) matchWhite)rr)rrwrxr sz!White.__init__..css|]}tj|VqdS)N)r. whiteStrs)rrrwrwrxr sTz Expected r) rr.rr.rrrYrr[rarrr)rZwsr r r )rH)rrxr s  zWhite.__init__TcCs|||jkrt|||j||}|d7}||j}t|t|}x"||krd|||jkrd|d7}qDW|||jkrt|||j|||||fS)Nrr)r.rrarr rr)rr-rrorrrwrwrxr s  zWhite.parseImpl)r-rrrr)T)rrrrr/rrrrwrw)rHrxr. scseZdZfddZZS)_PositionTokencs(tt|j|jj|_d|_d|_dS)NTF)rr0rrHrrr[r`)r)rHrwrxr s z_PositionToken.__init__)rrrrrrwrw)rHrxr0 sr0cs2eZdZdZfddZddZd ddZZS) rzb Token to advance to a specific column of input text; useful for tabular report scraping. cstt|j||_dS)N)rrrr9)rcolno)rHrwrxr szGoToColumn.__init__cCs`t|||jkr\t|}|jr*|j||}x0||krZ||jrZt|||jkrZ|d7}q,W|S)Nrr)r9rr]risspace)rr-rrrwrwrxr s & zGoToColumn.preParseTcCsDt||}||jkr"t||d|||j|}|||}||fS)NzText not in expected column)r9r)rr-rroZthiscolZnewlocrrwrwrxr s    zGoToColumn.parseImpl)T)rrrrrrrrrwrw)rHrxr s  cs*eZdZdZfddZdddZZS)ra Matches if current position is at the beginning of a line within the parse string Example:: test = ''' AAA this line AAA and this line AAA but not this one B AAA and definitely not this one ''' for t in (LineStart() + 'AAA' + restOfLine).searchString(test): print(t) Prints:: ['AAA', ' this line'] ['AAA', ' and this line'] cstt|jd|_dS)NzExpected start of line)rrrra)r)rHrwrxr& szLineStart.__init__TcCs*t||dkr|gfSt|||j|dS)Nrr)r9rra)rr-rrorwrwrxr* szLineStart.parseImpl)T)rrrrrrrrwrw)rHrxr s cs*eZdZdZfddZdddZZS)rzU Matches if current position is at the end of a line within the parse string cs,tt|j|jtjjddd|_dS)NrrzExpected end of line)rrrrr$rNrra)r)rHrwrxr3 szLineEnd.__init__TcCsb|t|kr6||dkr$|ddfSt|||j|n(|t|krN|dgfSt|||j|dS)Nrrr)rrra)rr-rrorwrwrxr8 s     zLineEnd.parseImpl)T)rrrrrrrrwrw)rHrxr/ s cs*eZdZdZfddZdddZZS)r*zM Matches if current position is at the beginning of the parse string cstt|jd|_dS)NzExpected start of text)rr*rra)r)rHrwrxrG szStringStart.__init__TcCs0|dkr(||j|dkr(t|||j||gfS)Nr)rrra)rr-rrorwrwrxrK szStringStart.parseImpl)T)rrrrrrrrwrw)rHrxr*C s cs*eZdZdZfddZdddZZS)r)zG Matches if current position is at the end of the parse string cstt|jd|_dS)NzExpected end of text)rr)rra)r)rHrwrxrV szStringEnd.__init__TcCs^|t|krt|||j|n<|t|kr6|dgfS|t|krJ|gfSt|||j|dS)Nrr)rrra)rr-rrorwrwrxrZ s    zStringEnd.parseImpl)T)rrrrrrrrwrw)rHrxr)R s cs.eZdZdZeffdd ZdddZZS)r1ap Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. cs"tt|jt||_d|_dS)NzNot at the start of a word)rr1rr wordCharsra)rr3)rHrwrxrl s zWordStart.__init__TcCs@|dkr8||d|jks(|||jkr8t|||j||gfS)Nrrr)r3rra)rr-rrorwrwrxrq s zWordStart.parseImpl)T)rrrrrVrrrrwrw)rHrxr1d scs.eZdZdZeffdd ZdddZZS)r0aZ Matches if the current position is at the end of a Word, and is not followed by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. cs(tt|jt||_d|_d|_dS)NFzNot at the end of a word)rr0rrr3rXra)rr3)rHrwrxr s zWordEnd.__init__TcCsPt|}|dkrH||krH|||jks8||d|jkrHt|||j||gfS)Nrrr)rr3rra)rr-rrorrwrwrxr s zWordEnd.parseImpl)T)rrrrrVrrrrwrw)rHrxr0x scseZdZdZdfdd ZddZddZd d Zfd d Zfd dZ fddZ dfdd Z gfddZ fddZ ZS)r z^ Abstract subclass of ParserElement, for combining and post-processing parsed tokens. Fc stt|j|t|tr"t|}t|tr.F)rr rrzrrrr$rQexprsrIterableallrvrre)rr4rg)rHrwrxr s     zParseExpression.__init__cCs |j|S)N)r4)rrrwrwrxr szParseExpression.__getitem__cCs|jj|d|_|S)N)r4rrU)rrrwrwrxr s zParseExpression.appendcCs4d|_dd|jD|_x|jD] }|jq W|S)z~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on all contained expressions.FcSsg|] }|jqSrw)r)rrrwrwrxr sz3ParseExpression.leaveWhitespace..)rXr4r)rrrwrwrxr s   zParseExpression.leaveWhitespacecszt|trF||jkrvtt|j|xP|jD]}|j|jdq,Wn0tt|j|x|jD]}|j|jdq^W|S)Nrrrsrs)rzr+r]rr rr4)rrr)rHrwrxr s    zParseExpression.ignorec sLytt|jStk r"YnX|jdkrFd|jjt|jf|_|jS)Nz%s:(%s)) rr rrKrUrHrrr4)r)rHrwrxr s zParseExpression.__str__cs0tt|jx|jD] }|jqWt|jdkr|jd}t||jr|j r|jdkr|j r|jdd|jdg|_d|_ |j |j O_ |j |j O_ |jd}t||jo|j o|jdko|j r|jdd|jdd|_d|_ |j |j O_ |j |j O_ dt ||_|S)Nrqrrrz Expected rsrs)rr rr4rrzrHrSrVr^rUr[r`rra)rrr)rHrwrxr s0         zParseExpression.streamlinecstt|j||}|S)N)rr rm)rrrlr)rHrwrxrm szParseExpression.setResultsNamecCs:|dd|g}x|jD]}|j|qW|jgdS)N)r4rr)rrtmprrwrwrxr s zParseExpression.validatecs$tt|j}dd|jD|_|S)NcSsg|] }|jqSrw)r)rrrwrwrxr sz(ParseExpression.copy..)rr rr4)rr)rHrwrxr szParseExpression.copy)F)F)rrrrrrrrrrrrmrrrrwrw)rHrxr s " csTeZdZdZGdddeZdfdd ZdddZd d Zd d Z d dZ Z S)ra  Requires all given C{ParseExpression}s to be found in the given order. Expressions may be separated by whitespace. May be constructed using the C{'+'} operator. May also be constructed using the C{'-'} operator, which will suppress backtracking. Example:: integer = Word(nums) name_expr = OneOrMore(Word(alphas)) expr = And([integer("id"),name_expr("name"),integer("age")]) # more easily written as: expr = integer("id") + name_expr("name") + integer("age") cseZdZfddZZS)zAnd._ErrorStopcs&ttj|j||d|_|jdS)N-)rrrrrr)rrr)rHrwrxr szAnd._ErrorStop.__init__)rrrrrrwrw)rHrxr srTcsRtt|j||tdd|jD|_|j|jdj|jdj|_d|_ dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxr szAnd.__init__..rT) rrrr6r4r[rrYrXre)rr4rg)rHrwrxr s z And.__init__c Cs|jdj|||dd\}}d}x|jddD]}t|tjrFd}q0|ry|j|||\}}Wqtk rvYqtk r}zd|_tj|WYdd}~Xqt k rt|t ||j |YqXn|j|||\}}|s|j r0||7}q0W||fS)NrF)rprrT) r4rtrzrrr#r __traceback__rrrrar) rr-rro resultlistZ errorStoprZ exprtokensrrwrwrxr s(   z And.parseImplcCst|trtj|}|j|S)N)rzrr$rQr)rrrwrwrxr5 s  z And.__iadd__cCs8|dd|g}x |jD]}|j||jsPqWdS)N)r4rr[)rrsubRecCheckListrrwrwrxr: s   zAnd.checkRecursioncCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nr{rcss|]}t|VqdS)N)r)rrrwrwrxrF szAnd.__str__..})rrrUrr4)rrwrwrxrA s    z And.__str__)T)T) rrrrr rrrrrrrrwrw)rHrxr s csDeZdZdZdfdd ZdddZdd Zd d Zd d ZZ S)ra Requires that at least one C{ParseExpression} is found. If two expressions match, the expression that matches the longest string will be used. May be constructed using the C{'^'} operator. Example:: # construct Or using '^' operator number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) print(number.searchString("123 3.1416 789")) prints:: [['123'], ['3.1416'], ['789']] Fcs:tt|j|||jr0tdd|jD|_nd|_dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxr\ szOr.__init__..T)rrrr4rr[)rr4rg)rHrwrxrY sz Or.__init__Tc CsTd}d}g}x|jD]}y|j||}Wnvtk rd} z d| _| j|krT| }| j}WYdd} ~ Xqtk rt||krt|t||j|}t|}YqX|j||fqW|r*|j dddx`|D]X\} }y|j |||Stk r$} z"d| _| j|kr| }| j}WYdd} ~ XqXqW|dk rB|j|_ |nt||d|dS)NrrcSs |d S)Nrrw)xrwrwrxryu szOr.parseImpl..)rz no defined alternatives to matchrs) r4rrr9rrrrarsortrtr) rr-rro maxExcLoc maxExceptionrrZloc2r_rwrwrxr` s<     z Or.parseImplcCst|trtj|}|j|S)N)rzrr$rQr)rrrwrwrx__ixor__ s  z Or.__ixor__cCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nrr<z ^ css|]}t|VqdS)N)r)rrrwrwrxr szOr.__str__..r=)rrrUrr4)rrwrwrxr s    z Or.__str__cCs0|dd|g}x|jD]}|j|qWdS)N)r4r)rrr;rrwrwrxr s zOr.checkRecursion)F)T) rrrrrrrCrrrrwrw)rHrxrK s   & csDeZdZdZdfdd ZdddZdd Zd d Zd d ZZ S)ra Requires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the C{'|'} operator. Example:: # construct MatchFirst using '|' operator # watch the order of expressions to match number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] # put more selective expression first number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] Fcs:tt|j|||jr0tdd|jD|_nd|_dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxr sz&MatchFirst.__init__..T)rrrr4rr[)rr4rg)rHrwrxr szMatchFirst.__init__Tc Csd}d}x|jD]}y|j|||}|Stk r\}z|j|krL|}|j}WYdd}~Xqtk rt||krt|t||j|}t|}YqXqW|dk r|j|_|nt||d|dS)Nrrz no defined alternatives to matchrs)r4rtrrrrrar) rr-rror@rArrrrwrwrxr s$   zMatchFirst.parseImplcCst|trtj|}|j|S)N)rzrr$rQr)rrrwrwrx__ior__ s  zMatchFirst.__ior__cCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nrr<z | css|]}t|VqdS)N)r)rrrwrwrxr sz%MatchFirst.__str__..r=)rrrUrr4)rrwrwrxr s    zMatchFirst.__str__cCs0|dd|g}x|jD]}|j|qWdS)N)r4r)rrr;rrwrwrxr s zMatchFirst.checkRecursion)F)T) rrrrrrrDrrrrwrw)rHrxr s   cs<eZdZdZd fdd Zd ddZddZd d ZZS) r am Requires all given C{ParseExpression}s to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the C{'&'} operator. Example:: color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") integer = Word(nums) shape_attr = "shape:" + shape_type("shape") posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") color_attr = "color:" + color("color") size_attr = "size:" + integer("size") # use Each (using operator '&') to accept attributes in any order # (shape and posn are required, color and size are optional) shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) shape_spec.runTests(''' shape: SQUARE color: BLACK posn: 100, 120 shape: CIRCLE size: 50 color: BLUE posn: 50,80 color:GREEN size:20 shape:TRIANGLE posn:20,40 ''' ) prints:: shape: SQUARE color: BLACK posn: 100, 120 ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - color: BLACK - posn: ['100', ',', '120'] - x: 100 - y: 120 - shape: SQUARE shape: CIRCLE size: 50 color: BLUE posn: 50,80 ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - color: BLUE - posn: ['50', ',', '80'] - x: 50 - y: 80 - shape: CIRCLE - size: 50 color: GREEN size: 20 shape: TRIANGLE posn: 20,40 ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - color: GREEN - posn: ['20', ',', '40'] - x: 20 - y: 40 - shape: TRIANGLE - size: 20 Tcs8tt|j||tdd|jD|_d|_d|_dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxrsz Each.__init__..T)rr rr6r4r[rXinitExprGroups)rr4rg)rHrwrxrsz Each.__init__c s|jrtdd|jD|_dd|jD}dd|jD}|||_dd|jD|_dd|jD|_dd|jD|_|j|j7_d |_|}|jdd}|jddg}d } x| rp||j|j} g} x~| D]v} y| j||}Wn t k r| j | YqX|j |jj t | | | |krD|j | q| krj | qWt| t| krd } qW|rd jd d|D} t ||d | |fdd|jD7}g}x*|D]"} | j|||\}}|j |qWt|tg}||fS)Ncss&|]}t|trt|j|fVqdS)N)rzrrr.)rrrwrwrxrsz!Each.parseImpl..cSsg|]}t|tr|jqSrw)rzrr.)rrrwrwrxrsz"Each.parseImpl..cSs"g|]}|jrt|t r|qSrw)r[rzr)rrrwrwrxrscSsg|]}t|tr|jqSrw)rzr2r.)rrrwrwrxr scSsg|]}t|tr|jqSrw)rzrr.)rrrwrwrxr!scSs g|]}t|tttfs|qSrw)rzrr2r)rrrwrwrxr"sFTz, css|]}t|VqdS)N)r)rrrwrwrxr=sz*Missing one or more required elements (%s)cs$g|]}t|tr|jkr|qSrw)rzrr.)rr)tmpOptrwrxrAs)rErr4Zopt1mapZ optionalsZmultioptionalsZ multirequiredZrequiredrrrrrremoverrrtsumr")rr-rroZopt1Zopt2ZtmpLocZtmpReqdZ matchOrderZ keepMatchingZtmpExprsZfailedrZmissingr:rZ finalResultsrw)rFrxrsP     zEach.parseImplcCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nrr<z & css|]}t|VqdS)N)r)rrrwrwrxrPszEach.__str__..r=)rrrUrr4)rrwrwrxrKs    z Each.__str__cCs0|dd|g}x|jD]}|j|qWdS)N)r4r)rrr;rrwrwrxrTs zEach.checkRecursion)T)T) rrrrrrrrrrwrw)rHrxr s 5 1 csleZdZdZdfdd ZdddZdd Zfd d Zfd d ZddZ gfddZ fddZ Z S)rza Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. Fcstt|j|t|tr@ttjtr2tj|}ntjt |}||_ d|_ |dk r|j |_ |j |_ |j|j|j|_|j|_|j|_|jj|jdS)N)rrrrzr issubclassr$rQr,rr.rUr`r[rrYrXrWrer]r)rr.rg)rHrwrxr^s    zParseElementEnhance.__init__TcCs2|jdk r|jj|||ddStd||j|dS)NF)rpr)r.rtrra)rr-rrorwrwrxrps zParseElementEnhance.parseImplcCs*d|_|jj|_|jdk r&|jj|S)NF)rXr.rr)rrwrwrxrvs    z#ParseElementEnhance.leaveWhitespacecsrt|trB||jkrntt|j||jdk rn|jj|jdn,tt|j||jdk rn|jj|jd|S)Nrrrsrs)rzr+r]rrrr.)rr)rHrwrxr}s    zParseElementEnhance.ignorecs&tt|j|jdk r"|jj|S)N)rrrr.)r)rHrwrxrs  zParseElementEnhance.streamlinecCsB||krt||g|dd|g}|jdk r>|jj|dS)N)r&r.r)rrr;rwrwrxrs  z"ParseElementEnhance.checkRecursioncCs6|dd|g}|jdk r(|jj||jgdS)N)r.rr)rrr7rwrwrxrs  zParseElementEnhance.validatec sVytt|jStk r"YnX|jdkrP|jdk rPd|jjt|jf|_|jS)Nz%s:(%s)) rrrrKrUr.rHrr)r)rHrwrxrszParseElementEnhance.__str__)F)T) rrrrrrrrrrrrrrwrw)rHrxrZs   cs*eZdZdZfddZdddZZS)ra Lookahead matching of the given parse expression. C{FollowedBy} does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. C{FollowedBy} always returns a null token list. Example:: # use FollowedBy to match a label only if it is followed by a ':' data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() prints:: [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] cstt|j|d|_dS)NT)rrrr[)rr.)rHrwrxrszFollowedBy.__init__TcCs|jj|||gfS)N)r.r)rr-rrorwrwrxrszFollowedBy.parseImpl)T)rrrrrrrrwrw)rHrxrs cs2eZdZdZfddZd ddZddZZS) ra Lookahead to disallow matching with the given parse expression. C{NotAny} does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression does I{not} match at the current position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator. Example:: cs0tt|j|d|_d|_dt|j|_dS)NFTzFound unwanted token, )rrrrXr[rr.ra)rr.)rHrwrxrszNotAny.__init__TcCs&|jj||rt|||j||gfS)N)r.rrra)rr-rrorwrwrxrszNotAny.parseImplcCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrz~{r=)rrrUrr.)rrwrwrxrs   zNotAny.__str__)T)rrrrrrrrrwrw)rHrxrs   cs(eZdZdfdd ZdddZZS) _MultipleMatchNcsFtt|j|d|_|}t|tr.tj|}|dk r<|nd|_dS)NT) rrJrrWrzrr$rQ not_ender)rr.stopOnZender)rHrwrxrs   z_MultipleMatch.__init__Tc Cs|jj}|j}|jdk }|r$|jj}|r2|||||||dd\}}yZ|j } xJ|rb|||| rr|||} n|} ||| |\}} | s| jrT|| 7}qTWWnttfk rYnX||fS)NF)rp) r.rtrrKrr]rrr) rr-rroZself_expr_parseZself_skip_ignorablesZ check_enderZ try_not_enderrZhasIgnoreExprsrZ tmptokensrwrwrxrs,      z_MultipleMatch.parseImpl)N)T)rrrrrrrwrw)rHrxrJsrJc@seZdZdZddZdS)ra Repetition of one or more of the given expression. Parameters: - expr - expression that must match one or more times - stopOn - (default=C{None}) - expression for a terminating sentinel (only required if the sentinel would ordinarily match the repetition expression) Example:: data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) text = "shape: SQUARE posn: upper left color: BLACK" OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] # use stopOn attribute for OneOrMore to avoid reading label string as part of the data attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] # could also be written as (attr_expr * (1,)).parseString(text).pprint() cCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrr<z}...)rrrUrr.)rrwrwrxr!s   zOneOrMore.__str__N)rrrrrrwrwrwrxrscs8eZdZdZd fdd Zd fdd Zdd ZZS) r2aw Optional repetition of zero or more of the given expression. Parameters: - expr - expression that must match zero or more times - stopOn - (default=C{None}) - expression for a terminating sentinel (only required if the sentinel would ordinarily match the repetition expression) Example: similar to L{OneOrMore} Ncstt|j||dd|_dS)N)rLT)rr2rr[)rr.rL)rHrwrxr6szZeroOrMore.__init__Tc s6ytt|j|||Sttfk r0|gfSXdS)N)rr2rrr)rr-rro)rHrwrxr:szZeroOrMore.parseImplcCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrrz]...)rrrUrr.)rrwrwrxr@s   zZeroOrMore.__str__)N)T)rrrrrrrrrwrw)rHrxr2*s c@s eZdZddZeZddZdS) _NullTokencCsdS)NFrw)rrwrwrxrJsz_NullToken.__bool__cCsdS)Nrrw)rrwrwrxrMsz_NullToken.__str__N)rrrrr'rrwrwrwrxrMIsrMcs6eZdZdZeffdd Zd ddZddZZS) raa Optional matching of the given expression. Parameters: - expr - expression that must match zero or more times - default (optional) - value to be returned if the optional expression is not found. Example:: # US postal code can be a 5-digit zip, plus optional 4-digit qualifier zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) zip.runTests(''' # traditional ZIP code 12345 # ZIP+4 form 12101-0001 # invalid ZIP 98765- ''') prints:: # traditional ZIP code 12345 ['12345'] # ZIP+4 form 12101-0001 ['12101-0001'] # invalid ZIP 98765- ^ FAIL: Expected end of text (at char 5), (line:1, col:6) cs.tt|j|dd|jj|_||_d|_dS)NF)rgT)rrrr.rWrr[)rr.r)rHrwrxrts zOptional.__init__Tc Cszy|jj|||dd\}}WnTttfk rp|jtk rh|jjr^t|jg}|j||jj<ql|jg}ng}YnX||fS)NF)rp)r.rtrrr_optionalNotMatchedrVr")rr-rrorrwrwrxrzs    zOptional.parseImplcCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrrr )rrrUrr.)rrwrwrxrs   zOptional.__str__)T) rrrrrNrrrrrwrw)rHrxrQs" cs,eZdZdZd fdd Zd ddZZS) r(a Token for skipping over all undefined text until the matched expression is found. Parameters: - expr - target expression marking the end of the data to be skipped - include - (default=C{False}) if True, the target expression is also parsed (the skipped text and target expression are returned as a 2-element list). - ignore - (default=C{None}) used to define grammars (typically quoted strings and comments) that might contain false matches to the target expression - failOn - (default=C{None}) define expressions that are not allowed to be included in the skipped test; if found before the target expression is found, the SkipTo is not a match Example:: report = ''' Outstanding Issues Report - 1 Jan 2000 # | Severity | Description | Days Open -----+----------+-------------------------------------------+----------- 101 | Critical | Intermittent system crash | 6 94 | Cosmetic | Spelling error on Login ('log|n') | 14 79 | Minor | System slow when running too many reports | 47 ''' integer = Word(nums) SEP = Suppress('|') # use SkipTo to simply match everything up until the next SEP # - ignore quoted strings, so that a '|' character inside a quoted string does not match # - parse action will call token.strip() for each matched token, i.e., the description body string_data = SkipTo(SEP, ignore=quotedString) string_data.setParseAction(tokenMap(str.strip)) ticket_expr = (integer("issue_num") + SEP + string_data("sev") + SEP + string_data("desc") + SEP + integer("days_open")) for tkt in ticket_expr.searchString(report): print tkt.dump() prints:: ['101', 'Critical', 'Intermittent system crash', '6'] - days_open: 6 - desc: Intermittent system crash - issue_num: 101 - sev: Critical ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - days_open: 14 - desc: Spelling error on Login ('log|n') - issue_num: 94 - sev: Cosmetic ['79', 'Minor', 'System slow when running too many reports', '47'] - days_open: 47 - desc: System slow when running too many reports - issue_num: 79 - sev: Minor FNcs`tt|j|||_d|_d|_||_d|_t|t rFt j ||_ n||_ dt |j|_dS)NTFzNo match found for )rr(r ignoreExprr[r` includeMatchrrzrr$rQfailOnrr.ra)rrincluderrQ)rHrwrxrs zSkipTo.__init__Tc Cs,|}t|}|j}|jj}|jdk r,|jjnd}|jdk rB|jjnd} |} x| |kr|dk rh||| rhP| dk rx*y| || } Wqrtk rPYqrXqrWy||| dddWn tt fk r| d7} YqLXPqLWt|||j || }|||} t | } |j r$||||dd\}} | | 7} || fS)NF)rorprr)rp) rr.rtrQrrOrrrrrar"rP)rr-rror0rr.Z expr_parseZself_failOn_canParseNextZself_ignoreExpr_tryParseZtmplocZskiptextZ skipresultrrwrwrxrs<    zSkipTo.parseImpl)FNN)T)rrrrrrrrwrw)rHrxr(s6 csbeZdZdZdfdd ZddZddZd d Zd d Zgfd dZ ddZ fddZ Z S)raK Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. Note: take care when assigning to C{Forward} not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:: fwdExpr << a | b | c will actually be evaluated as:: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. It is recommended that you explicitly group the values inserted into the C{Forward}:: fwdExpr << (a | b | c) Converting to use the '<<=' operator instead will avoid this problem. See L{ParseResults.pprint} for an example of a recursive parser created using C{Forward}. Ncstt|j|dddS)NF)rg)rrr)rr)rHrwrxrszForward.__init__cCsjt|trtj|}||_d|_|jj|_|jj|_|j|jj |jj |_ |jj |_ |j j |jj |S)N)rzrr$rQr.rUr`r[rrYrXrWr]r)rrrwrwrx __lshift__s      zForward.__lshift__cCs||>S)Nrw)rrrwrwrx __ilshift__'szForward.__ilshift__cCs d|_|S)NF)rX)rrwrwrxr*szForward.leaveWhitespacecCs$|js d|_|jdk r |jj|S)NT)r_r.r)rrwrwrxr.s   zForward.streamlinecCs>||kr0|dd|g}|jdk r0|jj||jgdS)N)r.rr)rrr7rwrwrxr5s   zForward.validatec Cs>t|dr|jS|jjdSd}Wd|j|_X|jjd|S)Nrz: ...Nonez: )rrrHrZ _revertClass_ForwardNoRecurser.r)rZ retStringrwrwrxr<s   zForward.__str__cs.|jdk rtt|jSt}||K}|SdS)N)r.rrr)rr)rHrwrxrMs  z Forward.copy)N) rrrrrrSrTrrrrrrrwrw)rHrxrs  c@seZdZddZdS)rVcCsdS)Nz...rw)rrwrwrxrVsz_ForwardNoRecurse.__str__N)rrrrrwrwrwrxrVUsrVcs"eZdZdZdfdd ZZS)r-zQ Abstract subclass of C{ParseExpression}, for converting parsed results. Fcstt|j|d|_dS)NF)rr-rrW)rr.rg)rHrwrxr]szTokenConverter.__init__)F)rrrrrrrwrw)rHrxr-Yscs6eZdZdZd fdd ZfddZdd ZZS) r a Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying C{'adjacent=False'} in the constructor. Example:: real = Word(nums) + '.' + Word(nums) print(real.parseString('3.1416')) # -> ['3', '.', '1416'] # will also erroneously match the following print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] real = Combine(Word(nums) + '.' + Word(nums)) print(real.parseString('3.1416')) # -> ['3.1416'] # no match when there are internal spaces print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) rTcs8tt|j||r|j||_d|_||_d|_dS)NT)rr rradjacentrX joinStringre)rr.rXrW)rHrwrxrrszCombine.__init__cs(|jrtj||ntt|j||S)N)rWr$rrr )rr)rHrwrxr|szCombine.ignorecCsP|j}|dd=|tdj|j|jg|jd7}|jrH|jrH|gS|SdS)Nr)r)rr"rr rXrbrVr)rr-rrZretToksrwrwrxrs  "zCombine.postParse)rT)rrrrrrrrrwrw)rHrxr as cs(eZdZdZfddZddZZS)ra Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. Example:: ident = Word(alphas) num = Word(nums) term = ident | num func = ident + Optional(delimitedList(term)) print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] func = ident + Group(Optional(delimitedList(term))) print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] cstt|j|d|_dS)NT)rrrrW)rr.)rHrwrxrszGroup.__init__cCs|gS)Nrw)rr-rrrwrwrxrszGroup.postParse)rrrrrrrrwrw)rHrxrs  cs(eZdZdZfddZddZZS)r aW Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. Example:: data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) text = "shape: SQUARE posn: upper left color: light blue texture: burlap" attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) # print attributes as plain groups print(OneOrMore(attr_expr).parseString(text).dump()) # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names result = Dict(OneOrMore(Group(attr_expr))).parseString(text) print(result.dump()) # access named fields as dict entries, or output as dict print(result['shape']) print(result.asDict()) prints:: ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - color: light blue - posn: upper left - shape: SQUARE - texture: burlap SQUARE {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} See more examples at L{ParseResults} of accessing fields by results name. cstt|j|d|_dS)NT)rr rrW)rr.)rHrwrxrsz Dict.__init__cCsxt|D]\}}t|dkr q |d}t|trBt|dj}t|dkr^td|||<q t|dkrt|dt rt|d|||<q |j}|d=t|dkst|tr|j rt||||<q t|d|||<q W|j r|gS|SdS)Nrrrrrq) rrrzrurrrr"rrrV)rr-rrrtokZikeyZ dictvaluerwrwrxrs$   zDict.postParse)rrrrrrrrwrw)rHrxr s# c@s eZdZdZddZddZdS)r+aV Converter for ignoring the results of a parsed expression. Example:: source = "a, b, c,d" wd = Word(alphas) wd_list1 = wd + ZeroOrMore(',' + wd) print(wd_list1.parseString(source)) # often, delimiters that are useful during parsing are just in the # way afterward - use Suppress to keep them out of the parsed output wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) print(wd_list2.parseString(source)) prints:: ['a', ',', 'b', ',', 'c', ',', 'd'] ['a', 'b', 'c', 'd'] (See also L{delimitedList}.) cCsgS)Nrw)rr-rrrwrwrxrszSuppress.postParsecCs|S)Nrw)rrwrwrxrszSuppress.suppressN)rrrrrrrwrwrwrxr+sc@s(eZdZdZddZddZddZdS) rzI Wrapper for parse actions, to ensure they are only called once. cCst||_d|_dS)NF)rMcallablecalled)rZ methodCallrwrwrxrs zOnlyOnce.__init__cCs.|js|j|||}d|_|St||ddS)NTr)r[rZr)rrr5rvrrwrwrxrs zOnlyOnce.__call__cCs d|_dS)NF)r[)rrwrwrxreset szOnlyOnce.resetN)rrrrrrr\rwrwrwrxrsc s:tfdd}y j|_Wntk r4YnX|S)as Decorator for debugging parse actions. When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. Example:: wd = Word(alphas) @traceParseAction def remove_duplicate_chars(tokens): return ''.join(sorted(set(''.join(tokens))) wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) print(wds.parseString("slkdjs sld sldd sdlf sdljf")) prints:: >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) <>entering %s(line: '%s', %d, %r) z<.z)rMrr)rr`rw)rrxrb s  ,FcCs`t|dt|dt|d}|rBt|t||j|S|tt||j|SdS)a Helper to define a delimited list of expressions - the delimiter defaults to ','. By default, the list elements and delimiters can have intervening whitespace, and comments, but this can be overridden by passing C{combine=True} in the constructor. If C{combine} is set to C{True}, the matching tokens are returned as a single token string, with the delimiters included; otherwise, the matching tokens are returned as a list of tokens, with the delimiters suppressed. Example:: delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] z [rz]...N)rr r2rir+)r.ZdelimcombineZdlNamerwrwrxr@9s $csjtfdd}|dkr0ttjdd}n|j}|jd|j|dd|jd td S) a: Helper to define a counted list of expressions. This helper defines a pattern of the form:: integer expr expr expr... where the leading integer tells how many expr expressions follow. The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. Example:: countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] # in this parser, the leading integer value is given in binary, # '10' indicating that 2 values are in the array binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] cs.|d}|r ttg|p&tt>gS)Nr)rrrC)rr5rvr) arrayExprr.rwrxcountFieldParseAction_s"z+countedArray..countFieldParseActionNcSs t|dS)Nr)ru)rvrwrwrxrydszcountedArray..ZarrayLenT)rfz(len) z...)rr/rRrrrirxr)r.ZintExprrdrw)rcr.rxr<Ls cCs:g}x0|D](}t|tr(|jt|q |j|q W|S)N)rzrrrr)Lrrrwrwrxrks   rcs6tfdd}|j|ddjdt|S)a* Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousLiteral(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches a previous literal, will also match the leading C{"1:1"} in C{"1:10"}. If this is not desired, use C{matchPreviousExpr}. Do I{not} use with packrat parsing enabled. csP|rBt|dkr|d>qLt|j}tdd|D>n t>dS)Nrrrcss|]}t|VqdS)N)r)rttrwrwrxrszDmatchPreviousLiteral..copyTokenToRepeater..)rrrrr )rr5rvZtflat)reprwrxcopyTokenToRepeaters   z1matchPreviousLiteral..copyTokenToRepeaterT)rfz(prev) )rrxrir)r.rhrw)rgrxrOts  csFt|j}|Kfdd}|j|ddjdt|S)aS Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousExpr(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches by expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; the expressions are evaluated first, and then compared, so C{"1"} is compared with C{"10"}. Do I{not} use with packrat parsing enabled. cs*t|jfdd}j|dddS)Ncs$t|j}|kr tddddS)Nrr)rrr)rr5rvZ theseTokens) matchTokensrwrxmustMatchTheseTokenss zLmatchPreviousExpr..copyTokenToRepeater..mustMatchTheseTokensT)rf)rrr)rr5rvrj)rg)rirxrhs  z.matchPreviousExpr..copyTokenToRepeaterT)rfz(prev) )rrrxrir)r.Ze2rhrw)rgrxrNs cCs>xdD]}|j|t|}qW|jdd}|jdd}t|S)Nz\^-]rz\nr(z\t)r_bslashr)rrrwrwrxrs    rTc s|rdd}dd}tndd}dd}tg}t|trF|j}n&t|tjr\t|}ntj dt dd|svt Sd }x|t |d kr||}xnt ||d d D]N\}} || |r|||d =Pq||| r|||d =|j|| | }PqW|d 7}q|W| r|ryht |t d j|krZtd d jdd|Djdj|Stdjdd|Djdj|SWn&tk rtj dt ddYnXtfdd|Djdj|S)a Helper to quickly define a set of alternative Literals, and makes sure to do longest-first testing when there is a conflict, regardless of the input order, but returns a C{L{MatchFirst}} for best performance. Parameters: - strs - a string of space-delimited literals, or a collection of string literals - caseless - (default=C{False}) - treat all literals as caseless - useRegex - (default=C{True}) - as an optimization, will generate a Regex object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or if creating a C{Regex} raises an exception) Example:: comp_oper = oneOf("< = > <= >= !=") var = Word(alphas) number = Word(nums) term = var | number comparison_expr = term + comp_oper + term print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) prints:: [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] cSs|j|jkS)N)r)rbrwrwrxryszoneOf..cSs|jj|jS)N)rr)rrlrwrwrxryscSs||kS)Nrw)rrlrwrwrxryscSs |j|S)N)r)rrlrwrwrxrysz6Invalid argument to oneOf, expected string or iterablerq)rrrrNrz[%s]css|]}t|VqdS)N)r)rsymrwrwrxrszoneOf..z | |css|]}tj|VqdS)N)rdr )rrmrwrwrxrsz7Exception creating Regex for oneOf, building MatchFirstc3s|]}|VqdS)Nrw)rrm)parseElementClassrwrxrs)rrrzrrrr5rrrrrrrrrr'rirKr) ZstrsrZuseRegexZisequalZmasksZsymbolsrZcurrrrw)rorxrSsL         ((cCsttt||S)a Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the C{Dict} results can include named token fields. Example:: text = "shape: SQUARE posn: upper left color: light blue texture: burlap" attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) print(OneOrMore(attr_expr).parseString(text).dump()) attr_label = label attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) # similar to Dict, but simpler call format result = dictOf(attr_label, attr_value).parseString(text) print(result.dump()) print(result['shape']) print(result.shape) # object attribute access works too print(result.asDict()) prints:: [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - color: light blue - posn: upper left - shape: SQUARE - texture: burlap SQUARE SQUARE {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} )r r2r)rrrwrwrxrAs!cCs^tjdd}|j}d|_|d||d}|r@dd}ndd}|j||j|_|S) a Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. By default, returns astring containing the original parsed text. If the optional C{asString} argument is passed as C{False}, then the return value is a C{L{ParseResults}} containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to C{L{originalTextFor}} contains expressions with defined results names, you must set C{asString} to C{False} if you want to preserve those results name values. Example:: src = "this is test bold text normal text " for tag in ("b","i"): opener,closer = makeHTMLTags(tag) patt = originalTextFor(opener + SkipTo(closer) + closer) print(patt.searchString(src)[0]) prints:: [' bold text '] ['text'] cSs|S)Nrw)rrrvrwrwrxry8sz!originalTextFor..F_original_start _original_endcSs||j|jS)N)rprq)rr5rvrwrwrxry=scSs&||jd|jdg|dd<dS)Nrprq)r)rr5rvrwrwrx extractText?sz$originalTextFor..extractText)r rrrer])r.ZasStringZ locMarkerZ endlocMarker matchExprrrrwrwrxrg s  cCst|jddS)zp Helper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty. cSs|dS)Nrrw)rvrwrwrxryJszungroup..)r-r)r.rwrwrxrhEscCs4tjdd}t|d|d|jjdS)a Helper to decorate a returned token with its starting and ending locations in the input string. This helper adds the following results names: - locn_start = location where matched expression begins - locn_end = location where matched expression ends - value = the actual parsed results Be careful if the input text contains C{} characters, you may want to call C{L{ParserElement.parseWithTabs}} Example:: wd = Word(alphas) for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): print(match) prints:: [[0, 'ljsdf', 5]] [[8, 'lksdjjf', 15]] [[18, 'lkkjj', 23]] cSs|S)Nrw)rr5rvrwrwrxry`szlocatedExpr..Z locn_startrZlocn_end)r rrrr)r.ZlocatorrwrwrxrjLsz\[]-*.$+^?()~ )r cCs |ddS)Nrrrrw)rr5rvrwrwrxryksryz\\0?[xX][0-9a-fA-F]+cCstt|djddS)Nrz\0x)unichrrulstrip)rr5rvrwrwrxrylsz \\0[0-7]+cCstt|ddddS)Nrrr)ruru)rr5rvrwrwrxrymsz\])rr z\wr8rrZnegatebodyr c sBddy djfddtj|jDStk r<dSXdS)a Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be: - a single character - an escaped character with a leading backslash (such as C{\-} or C{\]}) - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) (C{\0x##} is also supported for backwards compatibility) - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) cSs<t|ts|Sdjddtt|dt|ddDS)Nrcss|]}t|VqdS)N)ru)rrrwrwrxrsz+srange....rrr)rzr"rrord)prwrwrxryszsrange..rc3s|]}|VqdS)Nrw)rpart) _expandedrwrxrszsrange..N)r_reBracketExprrrxrK)rrw)r|rxr_rs  csfdd}|S)zt Helper method for defining parse actions that require matching at a specific column in the input text. cs"t||krt||ddS)Nzmatched token not at column %d)r9r)r)Zlocnr1)rrwrx verifyColsz!matchOnlyAtCol..verifyColrw)rr~rw)rrxrMs cs fddS)a Helper method for common parse actions that simply return a literal value. Especially useful when used with C{L{transformString}()}. Example:: num = Word(nums).setParseAction(lambda toks: int(toks[0])) na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) term = na | num OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] csgS)Nrw)rr5rv)replStrrwrxryszreplaceWith..rw)rrw)rrxr\s cCs|dddS)a Helper parse action for removing quotation marks from parsed quoted strings. Example:: # by default, quotation marks are included in parsed results quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] # use removeQuotes to strip quotation marks from parsed results quotedString.setParseAction(removeQuotes) quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] rrrrsrw)rr5rvrwrwrxrZs c sNfdd}ytdtdj}Wntk rBt}YnX||_|S)aG Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional args are passed, they are forwarded to the given function as additional arguments after the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the parsed data to an integer using base 16. Example (compare the last to example in L{ParserElement.transformString}:: hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) hex_ints.runTests(''' 00 11 22 aa FF 0a 0d 1a ''') upperword = Word(alphas).setParseAction(tokenMap(str.upper)) OneOrMore(upperword).runTests(''' my kingdom for a horse ''') wd = Word(alphas).setParseAction(tokenMap(str.title)) OneOrMore(wd).setParseAction(' '.join).runTests(''' now is the winter of our discontent made glorious summer by this sun of york ''') prints:: 00 11 22 aa FF 0a 0d 1a [0, 17, 34, 170, 255, 10, 13, 26] my kingdom for a horse ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] now is the winter of our discontent made glorious summer by this sun of york ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] csfdd|DS)Ncsg|]}|fqSrwrw)rZtokn)rr6rwrxrsz(tokenMap..pa..rw)rr5rv)rr6rwrxr}sztokenMap..parrH)rJrrKr{)r6rr}rLrw)rr6rxrms cCs t|jS)N)rr)rvrwrwrxryscCs t|jS)N)rlower)rvrwrwrxryscCst|tr|}t|| d}n|j}tttd}|rtjj t }t d|dt t t|t d|tddgdjd j d d t d }nd jddtD}tjj t t|B}t d|dt t t|j ttt d|tddgdjd j dd t d }ttd|d }|jdd j|jddjjjd|}|jdd j|jddjjjd|}||_||_||fS)zRInternal helper to construct opening and closing tag expressions, given a tag name)rz_-:rtag=/F)rrCcSs |ddkS)Nrrrw)rr5rvrwrwrxrysz_makeTags..rrcss|]}|dkr|VqdS)rNrw)rrrwrwrxrsz_makeTags..cSs |ddkS)Nrrrw)rr5rvrwrwrxryszrz)rzrrrr/r4r3r>rrrZr+r r2rrrmrrVrYrBr _Lrtitlerrir)tagStrZxmlZresnameZ tagAttrNameZ tagAttrValueZopenTagZprintablesLessRAbrackZcloseTagrwrwrx _makeTagss" T\..rcCs t|dS)a  Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. Example:: text = 'More info at the pyparsing wiki page' # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple a,a_end = makeHTMLTags("A") link_expr = a + SkipTo(a_end)("link_text") + a_end for link in link_expr.searchString(text): # attributes in the tag (like "href" shown here) are also accessible as named results print(link.link_text, '->', link.href) prints:: pyparsing -> http://pyparsing.wikispaces.com F)r)rrwrwrxrKscCs t|dS)z Helper to construct opening and closing tag expressions for XML, given a tag name. Matches tags only in the given upper/lower case. Example: similar to L{makeHTMLTags} T)r)rrwrwrxrLscs8|r|ddn|jddDfdd}|S)a< Helper to create a validating parse action to be used with start tags created with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as C{} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. If just testing for C{class} (with or without a namespace), use C{L{withClass}}. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this has no type
''' div,div_end = makeHTMLTags("div") # only match div tag having a type attribute with value "grid" div_grid = div().setParseAction(withAttribute(type="grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) # construct a match with any div tag having a type attribute, regardless of the value div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 NcSsg|]\}}||fqSrwrw)rrrrwrwrxrQsz!withAttribute..cs^xXD]P\}}||kr&t||d||tjkr|||krt||d||||fqWdS)Nzno matching attribute z+attribute '%s' has value '%s', must be '%s')rre ANY_VALUE)rr5rZattrNameZ attrValue)attrsrwrxr}Rs zwithAttribute..pa)r)rZattrDictr}rw)rrxres 2 cCs|r d|nd}tf||iS)a Simplified version of C{L{withAttribute}} when matching on a div class - made difficult because C{class} is a reserved word in Python. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this <div> has no class
''' div,div_end = makeHTMLTags("div") div_grid = div().setParseAction(withClass("grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 z%s:classclass)re)Z classname namespaceZ classattrrwrwrxrk\s (rcCst}||||B}x`t|D]R\}}|d dd\}} } } | dkrTd|nd|} | dkr|dksxt|dkrtd|\} }tj| }| tjkrd| dkrt||t|t |}n| dkr|dk rt|||t|t ||}nt||t|t |}nD| dkrZt|| |||t|| |||}ntd n| tj krH| dkrt |t st |}t|j |t||}n| dkr|dk rt|||t|t ||}nt||t|t |}nD| dkr>t|| |||t|| |||}ntd ntd | r`|j| ||j| |BK}|}q"W||K}|S) a Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. The generated parser will also recognize the use of parentheses to override operator precedences (see example below). Note: if you define a deep operator list, you may see performance issues when using infixNotation. See L{ParserElement.enablePackrat} for a mechanism to potentially improve your parser performance. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) Example:: # simple example of four-function arithmetic with ints and variable names integer = pyparsing_common.signed_integer varname = pyparsing_common.identifier arith_expr = infixNotation(integer | varname, [ ('-', 1, opAssoc.RIGHT), (oneOf('* /'), 2, opAssoc.LEFT), (oneOf('+ -'), 2, opAssoc.LEFT), ]) arith_expr.runTests(''' 5+3*6 (5+3)*6 -2--11 ''', fullDump=False) prints:: 5+3*6 [[5, '+', [3, '*', 6]]] (5+3)*6 [[[5, '+', 3], '*', 6]] -2--11 [[['-', 2], '-', ['-', 11]]] Nrroz%s termz %s%s termrqz@if numterms=3, opExpr must be a tuple or list of two expressionsrrz6operator must be unary (1), binary (2), or ternary (3)z2operator must indicate right or left associativity)N)rrrrrirTLEFTrrrRIGHTrzrr.r)ZbaseExprZopListZlparZrparrZlastExprrZoperDefZopExprZarityZrightLeftAssocr}ZtermNameZopExpr1ZopExpr2ZthisExprrsrwrwrxrisR;    &       &   z4"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*"z string enclosed in double quotesz4'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*'z string enclosed in single quotesz*quotedString using single or double quotesuzunicode string literalcCs||krtd|dkr(t|to,t|tr t|dkrt|dkr|dk rtt|t||tjddj dd}n$t j t||tjj dd}nx|dk rtt|t |t |ttjddj dd}n4ttt |t |ttjddj d d}ntd t }|dk rb|tt|t||B|Bt|K}n$|tt|t||Bt|K}|jd ||f|S) a~ Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - content - expression for items within the nested lists (default=C{None}) - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. Example:: data_type = oneOf("void int short long char float double") decl_data_type = Combine(data_type + Optional(Word('*'))) ident = Word(alphas+'_', alphanums+'_') number = pyparsing_common.number arg = Group(decl_data_type + ident) LPAR,RPAR = map(Suppress, "()") code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) c_function = (decl_data_type("type") + ident("name") + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + code_body("body")) c_function.ignore(cStyleComment) source_code = ''' int is_odd(int x) { return (x%2); } int dec_to_hex(char hchar) { if (hchar >= '0' && hchar <= '9') { return (ord(hchar)-ord('0')); } else { return (10+ord(hchar)-ord('A')); } } ''' for func in c_function.searchString(source_code): print("%(name)s (%(type)s) args: %(args)s" % func) prints:: is_odd (int) args: [['int', 'x']] dec_to_hex (int) args: [['char', 'hchar']] z.opening and closing strings cannot be the sameNrr)r cSs |djS)Nr)r)rvrwrwrxry9sznestedExpr..cSs |djS)Nr)r)rvrwrwrxry<scSs |djS)Nr)r)rvrwrwrxryBscSs |djS)Nr)r)rvrwrwrxryFszOopening and closing arguments must be strings if no content expression is givenznested %s%s expression)rrzrrr rr r$rNrrCrrrrr+r2ri)openerZcloserZcontentrOrrwrwrxrPs4:     *$c sfdd}fdd}fdd}ttjdj}ttj|jd}tj|jd }tj|jd } |rtt||t|t|t|| } n$tt|t|t|t|} |j t t| jd S) a Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=C{True}) A valid block must contain at least one C{blockStatement}. Example:: data = ''' def A(z): A1 B = 100 G = A2 A2 A3 B def BB(a,b,c): BB1 def BBA(): bba1 bba2 bba3 C D def spam(x,y): def eggs(z): pass ''' indentStack = [1] stmt = Forward() identifier = Word(alphas, alphanums) funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") func_body = indentedBlock(stmt, indentStack) funcDef = Group( funcDecl + func_body ) rvalue = Forward() funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") rvalue << (funcCall | identifier | Word(nums)) assignment = Group(identifier + "=" + rvalue) stmt << ( funcDef | assignment | identifier ) module_body = OneOrMore(stmt) parseTree = module_body.parseString(data) parseTree.pprint() prints:: [['def', 'A', ['(', 'z', ')'], ':', [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], 'B', ['def', 'BB', ['(', 'a', 'b', 'c', ')'], ':', [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], 'C', 'D', ['def', 'spam', ['(', 'x', 'y', ')'], ':', [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] csN|t|krdSt||}|dkrJ|dkr>t||dt||ddS)Nrrzillegal nestingznot a peer entryrsrs)rr9r!r)rr5rvcurCol) indentStackrwrxcheckPeerIndents     z&indentedBlock..checkPeerIndentcs2t||}|dkr"j|n t||ddS)Nrrznot a subentryrs)r9rr)rr5rvr)rrwrxcheckSubIndents   z%indentedBlock..checkSubIndentcsN|t|krdSt||}o4|dko4|dksBt||djdS)Nrrrqznot an unindentrsr:)rr9rr)rr5rvr)rrwrx checkUnindents    z$indentedBlock..checkUnindentz INDENTrZUNINDENTzindented block) rrrrr rrirrrrk) ZblockStatementExprrrrrrr!rZPEERZUNDENTZsmExprrw)rrxrfQsN   ,z#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]z[\0xa1-\0xbf\0xd7\0xf7]z_:zany tagzgt lt amp nbsp quot aposz><& "'z &(?Prnz);zcommon HTML entitycCs tj|jS)zRHelper parser action to replace common HTML entities with their special characters)_htmlEntityMaprZentity)rvrwrwrxr[sz/\*(?:[^*]|\*(?!/))*z*/zC style commentzz HTML commentz.*z rest of linez//(?:\\\n|[^\n])*z // commentzC++ style commentz#.*zPython style comment)rz commaItem)rc@seZdZdZeeZeeZe e j dj eZ e ej dj eedZedj dj eZej edej ej dZejd d eeeed jeBj d Zejeed j dj eZedj dj eZeeBeBjZedj dj eZe ededj dZedj dZ edj dZ!e!de!dj dZ"ee!de!d>dee!de!d?j dZ#e#j$d d d!e j d"Z%e&e"e%Be#Bj d#j d#Z'ed$j d%Z(e)d@d'd(Z*e)dAd*d+Z+ed,j d-Z,ed.j d/Z-ed0j d1Z.e/je0jBZ1e)d2d3Z2e&e3e4d4e5e e6d4d5ee7d6jj d7Z8e9ee:j;e8Bd8d9j d:Zd=S)Brna Here are some common low-level expressions that may be useful in jump-starting parser development: - numeric forms (L{integers}, L{reals}, L{scientific notation}) - common L{programming identifiers} - network addresses (L{MAC}, L{IPv4}, L{IPv6}) - ISO8601 L{dates} and L{datetime} - L{UUID} - L{comma-separated list} Parse actions: - C{L{convertToInteger}} - C{L{convertToFloat}} - C{L{convertToDate}} - C{L{convertToDatetime}} - C{L{stripHTMLTags}} - C{L{upcaseTokens}} - C{L{downcaseTokens}} Example:: pyparsing_common.number.runTests(''' # any int or real number, returned as the appropriate type 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.fnumber.runTests(''' # any int or real number, returned as float 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.hex_integer.runTests(''' # hex numbers 100 FF ''') pyparsing_common.fraction.runTests(''' # fractions 1/2 -3/4 ''') pyparsing_common.mixed_integer.runTests(''' # mixed fractions 1 1/2 -3/4 1-3/4 ''') import uuid pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) pyparsing_common.uuid.runTests(''' # uuid 12345678-1234-5678-1234-567812345678 ''') prints:: # any int or real number, returned as the appropriate type 100 [100] -100 [-100] +100 [100] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # any int or real number, returned as float 100 [100.0] -100 [-100.0] +100 [100.0] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # hex numbers 100 [256] FF [255] # fractions 1/2 [0.5] -3/4 [-0.75] # mixed fractions 1 [1] 1/2 [0.5] -3/4 [-0.75] 1-3/4 [1.75] # uuid 12345678-1234-5678-1234-567812345678 [UUID('12345678-1234-5678-1234-567812345678')] integerz hex integerrtz[+-]?\d+zsigned integerrfractioncCs|d|dS)Nrrrrsrw)rvrwrwrxryszpyparsing_common.r8z"fraction or mixed integer-fractionz [+-]?\d+\.\d*z real numberz+[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)z$real number with scientific notationz[+-]?\d+\.?\d*([eE][+-]?\d+)?fnumberrB identifierzK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}z IPv4 addressz[0-9a-fA-F]{1,4} hex_integerrzfull IPv6 addressrrBz::zshort IPv6 addresscCstdd|DdkS)Ncss|]}tjj|rdVqdS)rrN)rn _ipv6_partr)rrfrwrwrxrsz,pyparsing_common...rw)rH)rvrwrwrxrysz::ffff:zmixed IPv6 addressz IPv6 addressz:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}z MAC address%Y-%m-%dcsfdd}|S)a Helper to create a parse action for converting parsed date string to Python datetime.date Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) Example:: date_expr = pyparsing_common.iso8601_date.copy() date_expr.setParseAction(pyparsing_common.convertToDate()) print(date_expr.parseString("1999-12-31")) prints:: [datetime.date(1999, 12, 31)] csLytj|djStk rF}zt||t|WYdd}~XnXdS)Nr)rstrptimeZdaterrr{)rr5rvve)fmtrwrxcvt_fnsz.pyparsing_common.convertToDate..cvt_fnrw)rrrw)rrx convertToDates zpyparsing_common.convertToDate%Y-%m-%dT%H:%M:%S.%fcsfdd}|S)a Helper to create a parse action for converting parsed datetime string to Python datetime.datetime Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) Example:: dt_expr = pyparsing_common.iso8601_datetime.copy() dt_expr.setParseAction(pyparsing_common.convertToDatetime()) print(dt_expr.parseString("1999-12-31T23:59:59.999")) prints:: [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] csHytj|dStk rB}zt||t|WYdd}~XnXdS)Nr)rrrrr{)rr5rvr)rrwrxrsz2pyparsing_common.convertToDatetime..cvt_fnrw)rrrw)rrxconvertToDatetimes z"pyparsing_common.convertToDatetimez7(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?z ISO8601 datez(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?zISO8601 datetimez2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}UUIDcCstjj|dS)a Parse action to remove HTML tags from web page HTML source Example:: # strip HTML links from normal text text = 'More info at the
pyparsing wiki page' td,td_end = makeHTMLTags("TD") table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' r)rn_html_stripperr)rr5rrwrwrx stripHTMLTagss zpyparsing_common.stripHTMLTagsra)rz rr)rzcomma separated listcCs t|jS)N)rr)rvrwrwrxryscCs t|jS)N)rr)rvrwrwrxrysN)rrB)rrB)r)r)?rrrrrmruZconvertToIntegerfloatZconvertToFloatr/rRrirrrDrr'Zsigned_integerrrxrrZ mixed_integerrHrealZsci_realrnumberrr4r3rZ ipv4_addressrZ_full_ipv6_addressZ_short_ipv6_addressr~Z_mixed_ipv6_addressr Z ipv6_addressZ mac_addressrrrZ iso8601_dateZiso8601_datetimeuuidr7r6rrrrrrVr. _commasepitemr@rYrZcomma_separated_listrdrBrwrwrwrxrnsN"" 2   8__main__Zselectfromz_$r])rbcolumnsrjZtablesZcommandaK # '*' as column list and dotted table name select * from SYS.XYZZY # caseless match on "SELECT", and casts back to "select" SELECT * from XYZZY, ABC # list of column names, and mixed case SELECT keyword Select AA,BB,CC from Sys.dual # multiple tables Select A, B, C from Sys.dual, Table2 # invalid SELECT keyword - should fail Xelect A, B, C from Sys.dual # incomplete command - should fail Select # invalid column name - should fail Select ^^^ frox Sys.dual z] 100 -100 +100 3.14159 6.02e23 1e-12 z 100 FF z6 12345678-1234-5678-1234-567812345678 )rq)raF)N)FT)T)r)T)r __version__Z__versionTime__ __author__rweakrefrrrr~rrdrrr"r<rr_threadr ImportErrorZ threadingrrZ ordereddict__all__r version_infor;rmaxsizerr{rchrrurrHrrreversedrrrr6r r rIZmaxintZxrangerZ __builtin__rZfnamerrJrrrrrrZascii_uppercaseZascii_lowercaser4rRrDr3rkrZ printablerVrKrrr!r#r&rr"MutableMappingregisterr9rJrGr/r2r4rQrMr$r,r rrrrQrrrrlr/r'r%r r.r0rrrr*r)r1r0r rrrr rrrrJrr2rMrNrr(rrVr-r rr r+rrbr@r<rrOrNrrSrArgrhrjrirCrIrHrar`rZ _escapedPuncZ_escapedHexCharZ_escapedOctCharUNICODEZ _singleCharZ _charRangermr}r_rMr\rZrmrdrBrrKrLrerrkrTrrrirUr>r^rYrcrPrfr5rWr7r6rrrrr;r[r8rErr]r?r=rFrXrrr:rnrZ selectTokenZ fromTokenZidentZ columnNameZcolumnNameListZ columnSpecZ tableNameZ tableNameListZ simpleSQLrrrrrrrwrwrwrx=s                 8      @d &A= I G3pLOD|M &#@sQ,A,    I# %     &0 ,   ? #k Zr   (  0     "PK!AKK,_vendor/__pycache__/pyparsing.cpython-36.pycnu[3 9f@s dZdZdZdZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZyddlmZWn ek rddlmZYnXydd l mZWn>ek rydd lmZWnek rdZYnXYnXd d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgiZee jddsZeddskZer"e jZe Z!e"Z#e Z$e%e&e'e(e)ee*e+e,e-e.g Z/nbe j0Ze1Z2dtduZ$gZ/ddl3Z3xBdvj4D]6Z5ye/j6e7e3e5Wne8k r|wJYnXqJWe9dwdxe2dyDZ:dzd{Z;Gd|d}d}e<Z=ej>ej?Z@d~ZAeAdZBe@eAZCe"dZDdjEddxejFDZGGdd!d!eHZIGdd#d#eIZJGdd%d%eIZKGdd'd'eKZLGdd*d*eHZMGddde<ZNGdd&d&e<ZOe jPjQeOdd=ZRddNZSddKZTddZUddZVddZWddUZXd/ddZYGdd(d(e<ZZGdd0d0eZZ[Gddde[Z\Gddde[Z]Gddde[Z^e^Z_e^eZ_`Gddde[ZaGdd d e^ZbGdd d eaZcGddpdpe[ZdGdd3d3e[ZeGdd+d+e[ZfGdd)d)e[ZgGdd d e[ZhGdd2d2e[ZiGddde[ZjGdddejZkGdddejZlGdddejZmGdd.d.ejZnGdd-d-ejZoGdd5d5ejZpGdd4d4ejZqGdd$d$eZZrGdd d erZsGdd d erZtGddderZuGddderZvGdd"d"eZZwGdddewZxGdddewZyGdddewZzGdddezZ{Gdd6d6ezZ|Gddde<Z}e}Z~GdddewZGdd,d,ewZGdddewZGdddeZGdd1d1ewZGdddeZGdddeZGdddeZGdd/d/eZGddde<ZddfZd0ddDZd1dd@Zdd΄ZddSZddRZdd҄Zd2ddWZddEZd3ddkZddlZddnZe\jdGZeljdMZemjdLZenjdeZeojddZeeeDdddڍjdd܄Zefd݃jdd܄Zefd߃jdd܄ZeeBeBeeeGddydBefde jBZeeedeZe^dedjdee{eeBjddZddcZddQZdd`Zdd^ZddqZedd܄Zedd܄ZddZddOZddPZddiZe<e_d4ddoZe=Ze<e_e<e_ededfddmZeZeefddjdZeefddjdZeefddefddBjdZee_dejjdZdddejfddTZd5ddjZedZedZeeee@eCdjd\ZZeed j4d Zefd d jEejÃd jdZĐdd_ZeefddjdZefdjdZefdjȃjdZefdjdZeefddeBjdZeZefdjdZee{eeeGdɐdeeede^dɃemj΃jdZeeejeBddjd>ZGd drdrZeҐd!k rebd"Zebd#Zeee@eCd$ZeeՐd%dӐd&jeZeeeփjd'Zאd(eBZeeՐd%dӐd&jeZeeeكjd)ZeӐd*eؐd'eeڐd)Zejܐd+ejjܐd,ejjܐd,ejjܐd-ddlZejjeejejjܐd.dS(6aS pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}), built up using L{Word}, L{Literal}, and L{And} elements (L{'+'} operator gives L{And} expressions, strings are auto-converted to L{Literal} expressions):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The L{ParseResults} object returned from L{ParserElement.parseString} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments z2.1.10z07 Oct 2016 01:31 UTCz*Paul McGuire N)ref)datetime)RLock) OrderedDictAndCaselessKeywordCaselessLiteral CharsNotInCombineDictEachEmpty FollowedByForward GoToColumnGroupKeywordLineEnd LineStartLiteral MatchFirstNoMatchNotAny OneOrMoreOnlyOnceOptionalOrParseBaseExceptionParseElementEnhanceParseExceptionParseExpressionParseFatalException ParseResultsParseSyntaxException ParserElement QuotedStringRecursiveGrammarExceptionRegexSkipTo StringEnd StringStartSuppressTokenTokenConverterWhiteWordWordEnd WordStart ZeroOrMore alphanumsalphas alphas8bit anyCloseTag anyOpenTag cStyleCommentcolcommaSeparatedListcommonHTMLEntity countedArraycppStyleCommentdblQuotedStringdblSlashComment delimitedListdictOfdowncaseTokensemptyhexnums htmlCommentjavaStyleCommentlinelineEnd lineStartlineno makeHTMLTags makeXMLTagsmatchOnlyAtColmatchPreviousExprmatchPreviousLiteral nestedExprnullDebugActionnumsoneOfopAssocoperatorPrecedence printablespunc8bitpythonStyleComment quotedString removeQuotesreplaceHTMLEntity replaceWith restOfLinesglQuotedStringsrange stringEnd stringStarttraceParseAction unicodeString upcaseTokens withAttribute indentedBlockoriginalTextForungroup infixNotation locatedExpr withClass CloseMatchtokenMappyparsing_commonc Cs`t|tr|Syt|Stk rZt|jtjd}td}|jdd|j |SXdS)aDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. xmlcharrefreplacez&#\d+;cSs$dtt|dddddS)Nz\ur)hexint)trw/usr/lib/python3.6/pyparsing.pysz_ustr..N) isinstanceZunicodestrUnicodeEncodeErrorencodesysgetdefaultencodingr'setParseActiontransformString)objretZ xmlcharrefrwrwrx_ustrs rz6sum len sorted reversed list tuple set any all min maxccs|] }|VqdS)Nrw).0yrwrwrx srrrcCs>d}dddjD}x"t||D]\}}|j||}q"W|S)z/Escape &, <, >, ", ', etc. in a string of data.z&><"'css|]}d|dVqdS)&;Nrw)rsrwrwrxrsz_xml_escape..zamp gt lt quot apos)splitzipreplace)dataZ from_symbolsZ to_symbolsZfrom_Zto_rwrwrx _xml_escapes rc@s eZdZdS) _ConstantsN)__name__ __module__ __qualname__rwrwrwrxrsr 0123456789Z ABCDEFabcdef\ccs|]}|tjkr|VqdS)N)stringZ whitespace)rcrwrwrxrsc@sPeZdZdZdddZeddZdd Zd d Zd d Z dddZ ddZ dS)rz7base exception class for all parsing runtime exceptionsrNcCs>||_|dkr||_d|_n ||_||_||_|||f|_dS)Nr)locmsgpstr parserElementargs)selfrrrelemrwrwrx__init__szParseBaseException.__init__cCs||j|j|j|jS)z internal factory method to simplify creating one type of ParseException from another - avoids having __init__ signature conflicts among subclasses )rrrr)clsperwrwrx_from_exceptionsz"ParseBaseException._from_exceptioncCsN|dkrt|j|jS|dkr,t|j|jS|dkrBt|j|jSt|dS)zsupported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text rJr9columnrGN)r9r)rJrrr9rGAttributeError)rZanamerwrwrx __getattr__szParseBaseException.__getattr__cCsd|j|j|j|jfS)Nz"%s (at char %d), (line:%d, col:%d))rrrJr)rrwrwrx__str__szParseBaseException.__str__cCst|S)N)r)rrwrwrx__repr__szParseBaseException.__repr__>!} ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been foundN)rrrrrwrwrwrxr#sc@s eZdZdZddZddZdS)r&zZexception thrown by L{ParserElement.validate} if the grammar could be improperly recursivecCs ||_dS)N)parseElementTrace)rparseElementListrwrwrxrsz"RecursiveGrammarException.__init__cCs d|jS)NzRecursiveGrammarException: %s)r)rrwrwrxr sz!RecursiveGrammarException.__str__N)rrrrrrrwrwrwrxr&sc@s,eZdZddZddZddZddZd S) _ParseResultsWithOffsetcCs||f|_dS)N)tup)rZp1Zp2rwrwrxr$sz _ParseResultsWithOffset.__init__cCs |j|S)N)r)rirwrwrx __getitem__&sz#_ParseResultsWithOffset.__getitem__cCst|jdS)Nr)reprr)rrwrwrxr(sz _ParseResultsWithOffset.__repr__cCs|jd|f|_dS)Nr)r)rrrwrwrx setOffset*sz!_ParseResultsWithOffset.setOffsetN)rrrrrrrrwrwrwrxr#src@seZdZdZd[ddZddddefddZdd Zefd d Zd d Z ddZ ddZ ddZ e Z ddZddZddZddZddZereZeZeZn$eZeZeZddZd d!Zd"d#Zd$d%Zd&d'Zd\d(d)Zd*d+Zd,d-Zd.d/Zd0d1Z d2d3Z!d4d5Z"d6d7Z#d8d9Z$d:d;Z%d} - see L{ParserElement.setResultsName}) Example:: integer = Word(nums) date_str = (integer.setResultsName("year") + '/' + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") # parseString returns a ParseResults object result = date_str.parseString("1999/12/31") def test(s, fn=repr): print("%s -> %s" % (s, fn(eval(s)))) test("list(result)") test("result[0]") test("result['month']") test("result.day") test("'month' in result") test("'minutes' in result") test("result.dump()", str) prints:: list(result) -> ['1999', '/', '12', '/', '31'] result[0] -> '1999' result['month'] -> '12' result.day -> '31' 'month' in result -> True 'minutes' in result -> False result.dump() -> ['1999', '/', '12', '/', '31'] - day: 31 - month: 12 - year: 1999 NTcCs"t||r|Stj|}d|_|S)NT)rzobject__new___ParseResults__doinit)rtoklistnameasListmodalZretobjrwrwrxrTs   zParseResults.__new__c Cs`|jrvd|_d|_d|_i|_||_||_|dkr6g}||trP|dd|_n||trft||_n|g|_t |_ |dk o|r\|sd|j|<||t rt |}||_||t dttfo|ddgfks\||tr|g}|r&||trt|jd||<ntt|dd||<|||_n6y|d||<Wn$tttfk rZ|||<YnXdS)NFrr)r_ParseResults__name_ParseResults__parent_ParseResults__accumNames_ParseResults__asList_ParseResults__modallist_ParseResults__toklist_generatorTypedict_ParseResults__tokdictrurr basestringr"rcopyKeyError TypeError IndexError)rrrrrrzrwrwrxr]sB     $   zParseResults.__init__cCsPt|ttfr|j|S||jkr4|j|ddStdd|j|DSdS)NrrrcSsg|] }|dqS)rrw)rvrwrwrx sz,ParseResults.__getitem__..rs)rzruslicerrrr")rrrwrwrxrs   zParseResults.__getitem__cCs||tr0|jj|t|g|j|<|d}nD||ttfrN||j|<|}n&|jj|tt|dg|j|<|}||trt||_ dS)Nr) rrgetrrurrr"wkrefr)rkrrzsubrwrwrx __setitem__s   " zParseResults.__setitem__c Cst|ttfrt|j}|j|=t|trH|dkr:||7}t||d}tt|j|}|jx^|j j D]F\}}x<|D]4}x.t |D]"\}\}} t || | |k||<qWq|WqnWn|j |=dS)Nrrr) rzrurlenrrrangeindicesreverseritems enumerater) rrZmylenZremovedr occurrencesjrvaluepositionrwrwrx __delitem__s   $zParseResults.__delitem__cCs ||jkS)N)r)rrrwrwrx __contains__szParseResults.__contains__cCs t|jS)N)rr)rrwrwrx__len__szParseResults.__len__cCs |j S)N)r)rrwrwrx__bool__szParseResults.__bool__cCs t|jS)N)iterr)rrwrwrx__iter__szParseResults.__iter__cCst|jdddS)Nrrrs)rr)rrwrwrx __reversed__szParseResults.__reversed__cCs$t|jdr|jjSt|jSdS)Niterkeys)hasattrrrr)rrwrwrx _iterkeyss  zParseResults._iterkeyscsfddjDS)Nc3s|]}|VqdS)Nrw)rr)rrwrxrsz+ParseResults._itervalues..)r)rrw)rrx _itervaluesszParseResults._itervaluescsfddjDS)Nc3s|]}||fVqdS)Nrw)rr)rrwrxrsz*ParseResults._iteritems..)r)rrw)rrx _iteritemsszParseResults._iteritemscCs t|jS)zVReturns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).)rr)rrwrwrxkeysszParseResults.keyscCs t|jS)zXReturns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).)r itervalues)rrwrwrxvaluesszParseResults.valuescCs t|jS)zfReturns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).)r iteritems)rrwrwrxrszParseResults.itemscCs t|jS)zSince keys() returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.)boolr)rrwrwrxhaskeysszParseResults.haskeyscOs|s dg}x6|jD]*\}}|dkr2|d|f}qtd|qWt|dtsht|dksh|d|kr|d}||}||=|S|d}|SdS)a Removes and returns item at specified index (default=C{last}). Supports both C{list} and C{dict} semantics for C{pop()}. If passed no argument or an integer argument, it will use C{list} semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use C{dict} semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in C{dict.pop()}. Example:: def remove_first(tokens): tokens.pop(0) print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] label = Word(alphas) patt = label("LABEL") + OneOrMore(Word(nums)) print(patt.parseString("AAB 123 321").dump()) # Use pop() in a parse action to remove named result (note that corresponding value is not # removed from list form of results) def remove_LABEL(tokens): tokens.pop("LABEL") return tokens patt.addParseAction(remove_LABEL) print(patt.parseString("AAB 123 321").dump()) prints:: ['AAB', '123', '321'] - LABEL: AAB ['AAB', '123', '321'] rrdefaultrz-pop() got an unexpected keyword argument '%s'Nrs)rrrzrur)rrkwargsrrindexrZ defaultvaluerwrwrxpops"  zParseResults.popcCs||kr||S|SdS)ai Returns named result matching the given key, or if there is no such name, then returns the given C{defaultValue} or C{None} if no C{defaultValue} is specified. Similar to C{dict.get()}. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString("1999/12/31") print(result.get("year")) # -> '1999' print(result.get("hour", "not specified")) # -> 'not specified' print(result.get("hour")) # -> None Nrw)rkey defaultValuerwrwrxrszParseResults.getcCsZ|jj||xF|jjD]8\}}x.t|D]"\}\}}t||||k||<q,WqWdS)a Inserts new element at location index in the list of parsed tokens. Similar to C{list.insert()}. Example:: print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] # use a parse action to insert the parse location in the front of the parsed results def insert_locn(locn, tokens): tokens.insert(0, locn) print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] N)rinsertrrrr)rrZinsStrrrrrrrwrwrxr2szParseResults.insertcCs|jj|dS)a Add single element to end of ParseResults list of elements. Example:: print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] # use a parse action to compute the sum of the parsed integers, and add it to the end def append_sum(tokens): tokens.append(sum(map(int, tokens))) print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] N)rappend)ritemrwrwrxrFs zParseResults.appendcCs$t|tr||7}n |jj|dS)a Add sequence of elements to end of ParseResults list of elements. Example:: patt = OneOrMore(Word(alphas)) # use a parse action to append the reverse of the matched strings, to make a palindrome def make_palindrome(tokens): tokens.extend(reversed([t[::-1] for t in tokens])) return ''.join(tokens) print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' N)rzr"rextend)rZitemseqrwrwrxrTs  zParseResults.extendcCs|jdd=|jjdS)z7 Clear all elements and results names. N)rrclear)rrwrwrxrfs zParseResults.clearc Csfy||Stk rdSX||jkr^||jkrD|j|ddStdd|j|DSndSdS)NrrrrcSsg|] }|dqS)rrw)rrrwrwrxrwsz,ParseResults.__getattr__..rs)rrrr")rrrwrwrxrms  zParseResults.__getattr__cCs|j}||7}|S)N)r)rotherrrwrwrx__add__{szParseResults.__add__cs|jrnt|jfdd|jj}fdd|D}x4|D],\}}|||<t|dtr>t||d_q>W|j|j7_|jj |j|S)Ncs|dkr S|S)Nrrw)a)offsetrwrxrysz'ParseResults.__iadd__..c s4g|],\}}|D]}|t|d|dfqqS)rrr)r)rrvlistr) addoffsetrwrxrsz)ParseResults.__iadd__..r) rrrrrzr"rrrupdate)rrZ otheritemsZotherdictitemsrrrw)rrrx__iadd__s    zParseResults.__iadd__cCs&t|tr|dkr|jS||SdS)Nr)rzrur)rrrwrwrx__radd__szParseResults.__radd__cCsdt|jt|jfS)Nz(%s, %s))rrr)rrwrwrxrszParseResults.__repr__cCsddjdd|jDdS)N[z, css(|] }t|trt|nt|VqdS)N)rzr"rr)rrrwrwrxrsz'ParseResults.__str__..])rr)rrwrwrxrszParseResults.__str__rcCsPg}xF|jD]<}|r"|r"|j|t|tr:||j7}q |jt|q W|S)N)rrrzr" _asStringListr)rsepoutrrwrwrxr s   zParseResults._asStringListcCsdd|jDS)a Returns the parse results as a nested list of matching tokens, all converted to strings. Example:: patt = OneOrMore(Word(alphas)) result = patt.parseString("sldkj lsdkj sldkj") # even though the result prints in string-like form, it is actually a pyparsing ParseResults print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] # Use asList() to create an actual list result_list = result.asList() print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] cSs"g|]}t|tr|jn|qSrw)rzr"r)rresrwrwrxrsz'ParseResults.asList..)r)rrwrwrxrszParseResults.asListcs6tr |j}n|j}fddtfdd|DS)a Returns the named parse results as a nested dictionary. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString('12/31/1999') print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) result_dict = result.asDict() print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} # even though a ParseResults supports dict-like access, sometime you just need to have a dict import json print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} cs6t|tr.|jr|jSfdd|DSn|SdS)Ncsg|] }|qSrwrw)rr)toItemrwrxrsz7ParseResults.asDict..toItem..)rzr"rasDict)r)rrwrxrs  z#ParseResults.asDict..toItemc3s|]\}}||fVqdS)Nrw)rrr)rrwrxrsz&ParseResults.asDict..)PY_3rrr)rZitem_fnrw)rrxrs  zParseResults.asDictcCs8t|j}|jj|_|j|_|jj|j|j|_|S)zA Returns a new copy of a C{ParseResults} object. )r"rrrrrrr)rrrwrwrxrs   zParseResults.copyFc CsPd}g}tdd|jjD}|d}|s8d}d}d}d} |dk rJ|} n |jrV|j} | sf|rbdSd} |||d| d g7}xt|jD]\} } t| tr| |kr|| j|| |o|dk||g7}n|| jd|o|dk||g7}qd} | |kr|| } | s |rqnd} t t | } |||d| d | d | d g 7}qW|||d | d g7}dj |S) z (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.  css(|] \}}|D]}|d|fVqqdS)rrNrw)rrrrrwrwrxrsz%ParseResults.asXML..z rNZITEM<>z.z %s%s- %s: z rrcss|]}t|tVqdS)N)rzr")rvvrwrwrxrssz %s%s[%d]: %s%s%sr) rrrrsortedrrzr"dumpranyrr) rrdepthfullr NLrrrrrrwrwrxrPs,   4.zParseResults.dumpcOstj|jf||dS)a Pretty-printer for parsed results as a list, using the C{pprint} module. Accepts additional positional or keyword args as defined for the C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) Example:: ident = Word(alphas, alphanums) num = Word(nums) func = Forward() term = ident | num | Group('(' + func + ')') func <<= ident + Group(Optional(delimitedList(term))) result = func.parseString("fna a,b,(fnb c,d,200),100") result.pprint(width=40) prints:: ['fna', ['a', 'b', ['(', 'fnb', ['c', 'd', '200'], ')'], '100']] N)pprintr)rrrrwrwrxr"}szParseResults.pprintcCs.|j|jj|jdk r|jp d|j|jffS)N)rrrrrr)rrwrwrx __getstate__s zParseResults.__getstate__cCsN|d|_|d\|_}}|_i|_|jj||dk rDt||_nd|_dS)Nrrr)rrrrrrr)rstaterZ inAccumNamesrwrwrx __setstate__s   zParseResults.__setstate__cCs|j|j|j|jfS)N)rrrr)rrwrwrx__getnewargs__szParseResults.__getnewargs__cCstt|t|jS)N)rrrr)rrwrwrxrszParseResults.__dir__)NNTT)N)r)NFrT)rrT)4rrrrrrzrrrrrrr __nonzero__rrrrrrrrrrrrrrrrrrrrrrrrrr rrrrrrrr"r#r%r&rrwrwrwrxr"-sh& ' 4  # =% - cCsF|}d|kot|knr4||ddkr4dS||jdd|S)aReturns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. rrrr)rrfind)rstrgrrwrwrxr9s cCs|jdd|dS)aReturns current line number within a string, counting newlines as line separators. The first line is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. rrrr)count)rr)rwrwrxrJs cCsF|jdd|}|jd|}|dkr2||d|S||ddSdS)zfReturns the line of text containing loc within a string, counting newlines as line separators. rrrrN)r(find)rr)ZlastCRZnextCRrwrwrxrGs  cCs8tdt|dt|dt||t||fdS)NzMatch z at loc z(%d,%d))printrrJr9)instringrexprrwrwrx_defaultStartDebugActionsr/cCs$tdt|dt|jdS)NzMatched z -> )r,rr{r)r-startlocZendlocr.toksrwrwrx_defaultSuccessDebugActionsr2cCstdt|dS)NzException raised:)r,r)r-rr.excrwrwrx_defaultExceptionDebugActionsr4cGsdS)zG'Do-nothing' debug action, to suppress debugging output during parsing.Nrw)rrwrwrxrQsrqc stkrfddSdgdgtdddkrFddd }dd d n tj}tjd }|dd d}|d|d|ffdd}d}ytdtdj}Wntk rt}YnX||_|S)Ncs|S)Nrw)rlrv)funcrwrxrysz_trim_arity..rFrqrocSs8tdkr dnd }tj| |dd|}|j|jfgS) Nror7rrqrr)limit)ror7r)system_version traceback extract_stackfilenamerJ)r8r frame_summaryrwrwrxr=sz"_trim_arity..extract_stackcSs$tj||d}|d}|j|jfgS)N)r8rrrs)r< extract_tbr>rJ)tbr8Zframesr?rwrwrxr@sz_trim_arity..extract_tb)r8rrcsxy |dd}dd<|Stk rdr>n4z.tjd}|dddddksjWd~Xdkrdd7<wYqXqWdS)NrTrrrq)r8rsrs)rr~exc_info)rrrA)r@ foundArityr6r8maxargspa_call_line_synthrwrxwrappers"  z_trim_arity..wrapperzr __class__)ror7)r)rrs) singleArgBuiltinsr;r<r=r@getattrr Exceptionr{)r6rEr=Z LINE_DIFFZ this_linerG func_namerw)r@rDr6r8rErFrx _trim_aritys*   rMcseZdZdZdZdZeddZeddZddd Z d d Z d d Z dddZ dddZ ddZddZddZddZddZddZddd Zd!d"Zdd#d$Zd%d&Zd'd(ZGd)d*d*eZed+k rGd,d-d-eZnGd.d-d-eZiZeZd/d/gZ dd0d1Z!eZ"ed2d3Z#dZ$edd5d6Z%dd7d8Z&e'dfd9d:Z(d;d<Z)e'fd=d>Z*e'dfd?d@Z+dAdBZ,dCdDZ-dEdFZ.dGdHZ/dIdJZ0dKdLZ1dMdNZ2dOdPZ3dQdRZ4dSdTZ5dUdVZ6dWdXZ7dYdZZ8dd[d\Z9d]d^Z:d_d`Z;dadbZdgdhZ?ddidjZ@dkdlZAdmdnZBdodpZCdqdrZDgfdsdtZEddudvZFfdwdxZGdydzZHd{d|ZId}d~ZJddZKdddZLdddZMZNS)r$z)Abstract base level parser element class.z FcCs |t_dS)a Overrides the default whitespace chars Example:: # default whitespace chars are space, and newline OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] # change to just treat newline as significant ParserElement.setDefaultWhitespaceChars(" \t") OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] N)r$DEFAULT_WHITE_CHARS)charsrwrwrxsetDefaultWhitespaceChars=s z'ParserElement.setDefaultWhitespaceCharscCs |t_dS)a Set class to be used for inclusion of string literals into a parser. Example:: # default literal class used is Literal integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] # change to Suppress ParserElement.inlineLiteralsUsing(Suppress) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] N)r$_literalStringClass)rrwrwrxinlineLiteralsUsingLsz!ParserElement.inlineLiteralsUsingcCst|_d|_d|_d|_||_d|_tj|_ d|_ d|_ d|_ t|_ d|_d|_d|_d|_d|_d|_d|_d|_d|_dS)NTFr)NNN)r parseAction failActionstrRepr resultsName saveAsListskipWhitespacer$rN whiteCharscopyDefaultWhiteCharsmayReturnEmptykeepTabs ignoreExprsdebug streamlined mayIndexErrorerrmsg modalResults debugActionsre callPreparse callDuringTry)rsavelistrwrwrxras(zParserElement.__init__cCs<tj|}|jdd|_|jdd|_|jr8tj|_|S)a$ Make a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element. Example:: integer = Word(nums).setParseAction(lambda toks: int(toks[0])) integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) prints:: [5120, 100, 655360, 268435456] Equivalent form of C{expr.copy()} is just C{expr()}:: integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") N)rrSr]rZr$rNrY)rZcpyrwrwrxrxs  zParserElement.copycCs*||_d|j|_t|dr&|j|j_|S)af Define name for this expression, makes debugging and exception messages clearer. Example:: Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) z Expected exception)rrarrhr)rrrwrwrxsetNames    zParserElement.setNamecCs4|j}|jdr"|dd}d}||_| |_|S)aP Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. You can also set results names using the abbreviated syntax, C{expr("name")} in place of C{expr.setResultsName("name")} - see L{I{__call__}<__call__>}. Example:: date_str = (integer.setResultsName("year") + '/' + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: date_str = integer("year") + '/' + integer("month") + '/' + integer("day") *NrrTrs)rendswithrVrb)rrlistAllMatchesZnewselfrwrwrxsetResultsNames  zParserElement.setResultsNameTcs@|r&|jdfdd }|_||_nt|jdr<|jj|_|S)zMethod to invoke the Python pdb debugger when this element is about to be parsed. Set C{breakFlag} to True to enable, False to disable. Tcsddl}|j||||S)Nr)pdbZ set_trace)r-r doActions callPreParsern) _parseMethodrwrxbreakersz'ParserElement.setBreak..breaker_originalParseMethod)TT)_parsersr)rZ breakFlagrrrw)rqrxsetBreaks  zParserElement.setBreakcOs&tttt||_|jdd|_|S)a  Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Optional keyword arguments: - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. Example:: integer = Word(nums) date_str = integer + '/' + integer + '/' + integer date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] # use parse action to convert to ints at parse time integer = Word(nums).setParseAction(lambda toks: int(toks[0])) date_str = integer + '/' + integer + '/' + integer # note that integer fields are now ints, not strings date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] rfF)rmaprMrSrrf)rfnsrrwrwrxrs"zParserElement.setParseActioncOs4|jtttt|7_|jp,|jdd|_|S)z Add parse action to expression's list of parse actions. See L{I{setParseAction}}. See examples in L{I{copy}}. rfF)rSrrvrMrfr)rrwrrwrwrxaddParseActionszParserElement.addParseActioncsb|jdd|jddrtntx(|D] fdd}|jj|q&W|jpZ|jdd|_|S)aAdd a boolean predicate function to expression's list of parse actions. See L{I{setParseAction}} for function call signatures. Unlike C{setParseAction}, functions passed to C{addCondition} need to return boolean success/fail of the condition. Optional keyword arguments: - message = define a custom message to be used in the raised exception - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException Example:: integer = Word(nums).setParseAction(lambda toks: int(toks[0])) year_int = integer.copy() year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") date_str = year_int + '/' + integer + '/' + integer result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) messagezfailed user-defined conditionfatalFcs$tt|||s ||dS)N)rrM)rr5rv)exc_typefnrrwrxpasz&ParserElement.addCondition..parf)rr!rrSrrf)rrwrr}rw)r{r|rrx addConditions  zParserElement.addConditioncCs ||_|S)a Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw C{L{ParseFatalException}} if it is desired to stop parsing immediately.)rT)rr|rwrwrx setFailActions zParserElement.setFailActionc CsZd}xP|rTd}xB|jD]8}yx|j||\}}d}qWWqtk rLYqXqWqW|S)NTF)r]rtr)rr-rZ exprsFoundeZdummyrwrwrx_skipIgnorables#s  zParserElement._skipIgnorablescCsL|jr|j||}|jrH|j}t|}x ||krF|||krF|d7}q(W|S)Nrr)r]rrXrYr)rr-rZwtinstrlenrwrwrxpreParse0s  zParserElement.preParsecCs|gfS)Nrw)rr-rrorwrwrx parseImpl<szParserElement.parseImplcCs|S)Nrw)rr-r tokenlistrwrwrx postParse?szParserElement.postParsec "Cs|j}|s|jr|jdr,|jd||||rD|jrD|j||}n|}|}yDy|j|||\}}Wn(tk rt|t||j |YnXWnXt k r} z<|jdr|jd|||| |jr|j|||| WYdd} ~ XnXn|o|jr|j||}n|}|}|j s$|t|krhy|j|||\}}Wn*tk rdt|t||j |YnXn|j|||\}}|j |||}t ||j|j|jd} |jr|s|jr|rVyRxL|jD]B} | ||| }|dk rt ||j|jot|t tf|jd} qWWnFt k rR} z(|jdr@|jd|||| WYdd} ~ XnXnNxL|jD]B} | ||| }|dk r^t ||j|jot|t tf|jd} q^W|r|jdr|jd||||| || fS)Nrrq)rrrr)r^rTrcrerrrrrrarr`rr"rVrWrbrSrfrzr) rr-rrorpZ debuggingprelocZ tokensStarttokenserrZ retTokensr|rwrwrx _parseNoCacheCsp             zParserElement._parseNoCachec Cs>y|j||dddStk r8t|||j|YnXdS)NF)ror)rtr!rra)rr-rrwrwrxtryParseszParserElement.tryParsec Cs2y|j||Wnttfk r(dSXdSdS)NFT)rrr)rr-rrwrwrx canParseNexts zParserElement.canParseNextc@seZdZddZdS)zParserElement._UnboundedCachecsdit|_fdd}fdd}fdd}tj|||_tj|||_tj|||_dS)Ncs j|S)N)r)rr)cache not_in_cacherwrxrsz3ParserElement._UnboundedCache.__init__..getcs ||<dS)Nrw)rrr)rrwrxsetsz3ParserElement._UnboundedCache.__init__..setcs jdS)N)r)r)rrwrxrsz5ParserElement._UnboundedCache.__init__..clear)rrtypes MethodTyperrr)rrrrrw)rrrxrs   z&ParserElement._UnboundedCache.__init__N)rrrrrwrwrwrx_UnboundedCachesrNc@seZdZddZdS)zParserElement._FifoCachecsht|_tfdd}fdd}fdd}tj|||_tj|||_tj|||_dS)Ncs j|S)N)r)rr)rrrwrxrsz.ParserElement._FifoCache.__init__..getcs"||<tkrjddS)NF)rpopitem)rrr)rsizerwrxrs z.ParserElement._FifoCache.__init__..setcs jdS)N)r)r)rrwrxrsz0ParserElement._FifoCache.__init__..clear)rr _OrderedDictrrrrr)rrrrrrw)rrrrxrs  z!ParserElement._FifoCache.__init__N)rrrrrwrwrwrx _FifoCachesrc@seZdZddZdS)zParserElement._FifoCachecsvt|_itjgfdd}fdd}fdd}tj|||_tj|||_tj|||_dS)Ncs j|S)N)r)rr)rrrwrxrsz.ParserElement._FifoCache.__init__..getcs2||<tkr$jjdj|dS)N)rrpopleftr)rrr)rkey_fiforrwrxrs z.ParserElement._FifoCache.__init__..setcsjjdS)N)r)r)rrrwrxrsz0ParserElement._FifoCache.__init__..clear) rr collectionsdequerrrrr)rrrrrrw)rrrrrxrs  z!ParserElement._FifoCache.__init__N)rrrrrwrwrwrxrsrc Csd\}}|||||f}tjtj}|j|} | |jkrtj|d7<y|j||||} Wn8tk r} z|j|| j | j WYdd} ~ XqX|j|| d| dj f| Sn4tj|d7<t | t r| | d| dj fSWdQRXdS)Nrrr)rrr)r$packrat_cache_lock packrat_cacherrpackrat_cache_statsrrrrHrrrzrK) rr-rrorpZHITZMISSlookuprrrrwrwrx _parseCaches$   zParserElement._parseCachecCs(tjjdgttjtjdd<dS)Nr)r$rrrrrwrwrwrx resetCaches zParserElement.resetCachecCs8tjs4dt_|dkr tjt_n tj|t_tjt_dS)aEnables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. Parameters: - cache_size_limit - (default=C{128}) - if an integer value is provided will limit the size of the packrat cache; if None is passed, then the cache size will be unbounded; if 0 is passed, the cache will be effectively disabled. This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method C{ParserElement.enablePackrat()}. If your program uses C{psyco} to "compile as you go", you must call C{enablePackrat} before calling C{psyco.full()}. If you do not do this, Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. Example:: import pyparsing pyparsing.ParserElement.enablePackrat() TN)r$_packratEnabledrrrrrt)Zcache_size_limitrwrwrx enablePackrats   zParserElement.enablePackratcCstj|js|jx|jD] }|jqW|js<|j}y<|j|d\}}|rv|j||}t t }|j||Wn0t k r}ztj rn|WYdd}~XnX|SdS)aB Execute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built. If you want the grammar to require that the entire input string be successfully parsed, then set C{parseAll} to True (equivalent to ending the grammar with C{L{StringEnd()}}). Note: C{parseString} implicitly calls C{expandtabs()} on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the C{loc} argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - calling C{parseWithTabs} on your grammar before calling C{parseString} (see L{I{parseWithTabs}}) - define your parse action using the full C{(s,loc,toks)} signature, and reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling C{parseString} Example:: Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text rN) r$rr_ streamliner]r\ expandtabsrtrr r)rverbose_stacktrace)rr-parseAllrrrZser3rwrwrx parseString#s$    zParserElement.parseStringccs@|js|jx|jD] }|jqW|js8t|j}t|}d}|j}|j}t j d} yx||kon| |kry |||} ||| dd\} } Wnt k r| d}Yq`X| |kr| d7} | | | fV|r|||} | |kr| }q|d7}n| }q`| d}q`WWn4t k r:}zt j r&n|WYdd}~XnXdS)a Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional C{maxMatches} argument, to clip scanning after 'n' matches are found. If C{overlap} is specified, then overlapping matches will be reported. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs. Example:: source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" print(source) for tokens,start,end in Word(alphas).scanString(source): print(' '*start + '^'*(end-start)) print(' '*start + tokens[0]) prints:: sldjf123lsdjjkf345sldkjf879lkjsfd987 ^^^^^ sldjf ^^^^^^^ lsdjjkf ^^^^^^ sldkjf ^^^^^^ lkjsfd rF)rprrN)r_rr]r\rrrrrtr$rrrr)rr- maxMatchesZoverlaprrrZ preparseFnZparseFnmatchesrZnextLocrZnextlocr3rwrwrx scanStringUsB       zParserElement.scanStringcCsg}d}d|_yxh|j|D]Z\}}}|j||||rrt|trT||j7}nt|trh||7}n |j||}qW|j||ddd|D}djtt t |St k r}zt j rȂn|WYdd}~XnXdS)af Extension to C{L{scanString}}, to modify matching text with modified tokens that may be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. C{transformString()} returns the resulting transformed string. Example:: wd = Word(alphas) wd.setParseAction(lambda toks: toks[0].title()) print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) Prints:: Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. rTNcSsg|] }|r|qSrwrw)rorwrwrxrsz1ParserElement.transformString..r)r\rrrzr"rrrrvr_flattenrr$r)rr-r ZlastErvrrr3rwrwrxrs(    zParserElement.transformStringcCsPytdd|j||DStk rJ}ztjr6n|WYdd}~XnXdS)a~ Another extension to C{L{scanString}}, simplifying the access to the tokens found to match the given parse expression. May be called with optional C{maxMatches} argument, to clip searching after 'n' matches are found. Example:: # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters cap_word = Word(alphas.upper(), alphas.lower()) print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) prints:: ['More', 'Iron', 'Lead', 'Gold', 'I'] cSsg|]\}}}|qSrwrw)rrvrrrwrwrxrsz.ParserElement.searchString..N)r"rrr$r)rr-rr3rwrwrx searchStrings zParserElement.searchStringc csXd}d}x<|j||dD]*\}}}|||V|r>|dV|}qW||dVdS)a[ Generator method to split a string using the given expression as a separator. May be called with optional C{maxsplit} argument, to limit the number of splits; and the optional C{includeSeparators} argument (default=C{False}), if the separating matching text should be included in the split results. Example:: punc = oneOf(list(".,;:/-!?")) print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) prints:: ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] r)rN)r) rr-maxsplitZincludeSeparatorsZsplitsZlastrvrrrwrwrxrs  zParserElement.splitcCsFt|trtj|}t|ts:tjdt|tdddSt||gS)a Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement converts them to L{Literal}s by default. Example:: greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) Prints:: Hello, World! -> ['Hello', ',', 'World', '!'] z4Cannot combine element of type %s with ParserElementrq) stacklevelN) rzrr$rQwarningswarnr SyntaxWarningr)rrrwrwrxrs    zParserElement.__add__cCsBt|trtj|}t|ts:tjdt|tdddS||S)z] Implementation of + operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrxrs    zParserElement.__radd__cCsLt|trtj|}t|ts:tjdt|tdddSt|tj |gS)zQ Implementation of - operator, returns C{L{And}} with error stop z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr _ErrorStop)rrrwrwrx__sub__s    zParserElement.__sub__cCsBt|trtj|}t|ts:tjdt|tdddS||S)z] Implementation of - operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__rsub__ s    zParserElement.__rsub__cst|tr|d}}nt|tr|d dd}|ddkrHd|df}t|dtr|ddkr|ddkrvtS|ddkrtS|dtSnJt|dtrt|dtr|\}}||8}ntdt|dt|dntdt||dkr td|dkrtd||ko2dknrBtd |rfd d |r|dkrt|}ntg||}n|}n|dkr}ntg|}|S) a Implementation of * operator, allows use of C{expr * 3} in place of C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples may also include C{None} as in: - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + L{ZeroOrMore}(expr)} (read as "at least n instances of C{expr}") - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} Note that C{expr*(None,n)} does not raise an exception if more than n exprs exist in the input stream; that is, C{expr*(None,n)} does not enforce a maximum number of expr occurrences. If this behavior is desired, then write C{expr*(None,n) + ~expr} rNrqrrz7cannot multiply 'ParserElement' and ('%s','%s') objectsz0cannot multiply 'ParserElement' and '%s' objectsz/cannot multiply ParserElement by negative valuez@second tuple value must be greater or equal to first tuple valuez+cannot multiply ParserElement by 0 or (0,0)cs(|dkrt|dStSdS)Nrr)r)n)makeOptionalListrrwrxr]sz/ParserElement.__mul__..makeOptionalList)NN) rzrutupler2rrr ValueErrorr)rrZ minElementsZ optElementsrrw)rrrx__mul__,sD             zParserElement.__mul__cCs |j|S)N)r)rrrwrwrx__rmul__pszParserElement.__rmul__cCsFt|trtj|}t|ts:tjdt|tdddSt||gS)zI Implementation of | operator - returns C{L{MatchFirst}} z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr)rrrwrwrx__or__ss    zParserElement.__or__cCsBt|trtj|}t|ts:tjdt|tdddS||BS)z] Implementation of | operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__ror__s    zParserElement.__ror__cCsFt|trtj|}t|ts:tjdt|tdddSt||gS)zA Implementation of ^ operator - returns C{L{Or}} z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr)rrrwrwrx__xor__s    zParserElement.__xor__cCsBt|trtj|}t|ts:tjdt|tdddS||AS)z] Implementation of ^ operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__rxor__s    zParserElement.__rxor__cCsFt|trtj|}t|ts:tjdt|tdddSt||gS)zC Implementation of & operator - returns C{L{Each}} z4Cannot combine element of type %s with ParserElementrq)rN) rzrr$rQrrrrr )rrrwrwrx__and__s    zParserElement.__and__cCsBt|trtj|}t|ts:tjdt|tdddS||@S)z] Implementation of & operator when left operand is not a C{L{ParserElement}} z4Cannot combine element of type %s with ParserElementrq)rN)rzrr$rQrrrr)rrrwrwrx__rand__s    zParserElement.__rand__cCst|S)zE Implementation of ~ operator - returns C{L{NotAny}} )r)rrwrwrx __invert__szParserElement.__invert__cCs|dk r|j|S|jSdS)a  Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be passed as C{True}. If C{name} is omitted, same as calling C{L{copy}}. Example:: # these are equivalent userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") N)rmr)rrrwrwrx__call__s zParserElement.__call__cCst|S)z Suppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. )r+)rrwrwrxsuppressszParserElement.suppresscCs d|_|S)a Disables the skipping of whitespace before matching the characters in the C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. F)rX)rrwrwrxleaveWhitespaceszParserElement.leaveWhitespacecCsd|_||_d|_|S)z8 Overrides the default whitespace chars TF)rXrYrZ)rrOrwrwrxsetWhitespaceCharssz ParserElement.setWhitespaceCharscCs d|_|S)z Overrides default behavior to expand C{}s to spaces before parsing the input string. Must be called before C{parseString} when the input grammar contains elements that match C{} characters. T)r\)rrwrwrx parseWithTabsszParserElement.parseWithTabscCsLt|trt|}t|tr4||jkrH|jj|n|jjt|j|S)a Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. Example:: patt = OneOrMore(Word(alphas)) patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] patt.ignore(cStyleComment) patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] )rzrr+r]rr)rrrwrwrxignores   zParserElement.ignorecCs"|pt|p t|ptf|_d|_|S)zT Enable display of debugging messages while doing pattern matching. T)r/r2r4rcr^)rZ startActionZ successActionZexceptionActionrwrwrxsetDebugActions s  zParserElement.setDebugActionscCs|r|jtttnd|_|S)a Enable display of debugging messages while doing pattern matching. Set C{flag} to True to enable, False to disable. Example:: wd = Word(alphas).setName("alphaword") integer = Word(nums).setName("numword") term = wd | integer # turn on debugging for wd wd.setDebug() OneOrMore(term).parseString("abc 123 xyz 890") prints:: Match alphaword at loc 0(1,1) Matched alphaword -> ['abc'] Match alphaword at loc 3(1,4) Exception raised:Expected alphaword (at char 4), (line:1, col:5) Match alphaword at loc 7(1,8) Matched alphaword -> ['xyz'] Match alphaword at loc 11(1,12) Exception raised:Expected alphaword (at char 12), (line:1, col:13) Match alphaword at loc 15(1,16) Exception raised:Expected alphaword (at char 15), (line:1, col:16) The output shown is that produced by the default debug actions - custom debug actions can be specified using L{setDebugActions}. Prior to attempting to match the C{wd} expression, the debugging message C{"Match at loc (,)"} is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, which makes debugging and exception messages easier to understand - for instance, the default name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. F)rr/r2r4r^)rflagrwrwrxsetDebugs#zParserElement.setDebugcCs|jS)N)r)rrwrwrxr@szParserElement.__str__cCst|S)N)r)rrwrwrxrCszParserElement.__repr__cCsd|_d|_|S)NT)r_rU)rrwrwrxrFszParserElement.streamlinecCsdS)Nrw)rrrwrwrxcheckRecursionKszParserElement.checkRecursioncCs|jgdS)zj Check defined expressions for valid structure, check for infinite recursive definitions. N)r)r validateTracerwrwrxvalidateNszParserElement.validatecCsy |j}Wn2tk r>t|d}|j}WdQRXYnXy |j||Stk r|}ztjrhn|WYdd}~XnXdS)z Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. rN)readropenrrr$r)rZfile_or_filenamerZ file_contentsfr3rwrwrx parseFileTs   zParserElement.parseFilecsHt|tr"||kp t|t|kSt|tr6|j|Stt||kSdS)N)rzr$varsrrsuper)rr)rHrwrx__eq__hs    zParserElement.__eq__cCs ||k S)Nrw)rrrwrwrx__ne__pszParserElement.__ne__cCs tt|S)N)hashid)rrwrwrx__hash__sszParserElement.__hash__cCs||kS)Nrw)rrrwrwrx__req__vszParserElement.__req__cCs ||k S)Nrw)rrrwrwrx__rne__yszParserElement.__rne__c Cs0y|jt||ddStk r*dSXdS)a Method for quick testing of a parser against a test string. Good for simple inline microtests of sub expressions while building up larger parser. Parameters: - testString - to test against this expression for a match - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests Example:: expr = Word(nums) assert expr.matches("100") )rTFN)rrr)rZ testStringrrwrwrxr|s zParserElement.matches#cCst|tr"tttj|jj}t|tr4t|}g}g}d} x|D]} |dk rb|j | dsl|rx| rx|j | qH| s~qHdj || g} g}y:| j dd} |j | |d} | j | j|d| o| } Wntk rx} zt| trdnd }d| kr0| j t| j| | j d t| j| d d |n| j d | jd || j d t| | ob|} | } WYdd} ~ XnDtk r}z&| j dt|| o|} |} WYdd}~XnX|r|r| j d tdj | |j | | fqHW| |fS)a3 Execute the parse expression on a series of test strings, showing each test, the parsed results or where the parse failed. Quick and easy way to run a parse expression against a list of sample strings. Parameters: - tests - a list of separate test strings, or a multiline string of test strings - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - comment - (default=C{'#'}) - expression for indicating embedded comments in the test string; pass None to disable comment filtering - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; if False, only dump nested list - printResults - (default=C{True}) prints test output to stdout - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing Returns: a (success, results) tuple, where success indicates that all tests succeeded (or failed if C{failureTests} is True), and the results contain a list of lines of each test's output Example:: number_expr = pyparsing_common.number.copy() result = number_expr.runTests(''' # unsigned integer 100 # negative integer -100 # float with scientific notation 6.02e23 # integer with scientific notation 1e-12 ''') print("Success" if result[0] else "Failed!") result = number_expr.runTests(''' # stray character 100Z # missing leading digit before '.' -.100 # too many '.' 3.14.159 ''', failureTests=True) print("Success" if result[0] else "Failed!") prints:: # unsigned integer 100 [100] # negative integer -100 [-100] # float with scientific notation 6.02e23 [6.02e+23] # integer with scientific notation 1e-12 [1e-12] Success # stray character 100Z ^ FAIL: Expected end of text (at char 3), (line:1, col:4) # missing leading digit before '.' -.100 ^ FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) # too many '.' 3.14.159 ^ FAIL: Expected end of text (at char 4), (line:1, col:5) Success Each test string must be on a single line. If you want to test a string that spans multiple lines, create a test like this:: expr.runTest(r"this is a test\n of strings that spans \n 3 lines") (Note that this is a raw string literal, you must include the leading 'r'.) TNFrz\n)r)r z(FATAL)r rr^zFAIL: zFAIL-EXCEPTION: )rzrrrvr{rrstrip splitlinesrrrrrrrrr!rGrr9rKr,)rZtestsrZcommentZfullDumpZ printResultsZ failureTestsZ allResultsZcommentssuccessrvr resultrrzr3rwrwrxrunTestssNW     $   zParserElement.runTests)F)F)T)T)TT)TT)r)F)N)T)F)T)TrTTF)OrrrrrNr staticmethodrPrRrrrirmrurrxr~rrrrrrrrrrrrrrrrrrtrrrr_MAX_INTrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr __classcell__rwrw)rHrxr$8s     &     H   " 2G+    D           )    cs eZdZdZfddZZS)r,zT Abstract C{ParserElement} subclass, for defining atomic matching patterns. cstt|jdddS)NF)rg)rr,r)r)rHrwrxr szToken.__init__)rrrrrrrwrw)rHrxr, scs eZdZdZfddZZS)r z, An empty token, will always match. cs$tt|jd|_d|_d|_dS)Nr TF)rr rrr[r`)r)rHrwrxr szEmpty.__init__)rrrrrrrwrw)rHrxr  scs*eZdZdZfddZdddZZS)rz( A token that will never match. cs*tt|jd|_d|_d|_d|_dS)NrTFzUnmatchable token)rrrrr[r`ra)r)rHrwrxr* s zNoMatch.__init__TcCst|||j|dS)N)rra)rr-rrorwrwrxr1 szNoMatch.parseImpl)T)rrrrrrrrwrw)rHrxr& s cs*eZdZdZfddZdddZZS)ra Token to exactly match a specified string. Example:: Literal('blah').parseString('blah') # -> ['blah'] Literal('blah').parseString('blahfooblah') # -> ['blah'] Literal('blah').parseString('bla') # -> Exception: Expected "blah" For case-insensitive matching, use L{CaselessLiteral}. For keyword matching (force word break before and after the matched string), use L{Keyword} or L{CaselessKeyword}. c stt|j||_t||_y|d|_Wn*tk rVtj dt ddt |_ YnXdt |j|_d|j|_d|_d|_dS)Nrz2null string passed to Literal; use Empty() insteadrq)rz"%s"z Expected F)rrrmatchrmatchLenfirstMatchCharrrrrr rHrrrar[r`)r matchString)rHrwrxrC s    zLiteral.__init__TcCsJ|||jkr6|jdks&|j|j|r6||j|jfSt|||j|dS)Nrr)rr startswithrrra)rr-rrorwrwrxrV szLiteral.parseImpl)T)rrrrrrrrwrw)rHrxr5 s  csLeZdZdZedZdfdd Zddd Zfd d Ze d d Z Z S)ra\ Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with C{L{Literal}}: - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} Accepts two optional constructor arguments in addition to the keyword string: - C{identChars} is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$" - C{caseless} allows case-insensitive matching, default is C{False}. Example:: Keyword("start").parseString("start") # -> ['start'] Keyword("start").parseString("starting") # -> Exception For case-insensitive matching, use L{CaselessKeyword}. z_$NFc stt|j|dkrtj}||_t||_y|d|_Wn$tk r^t j dt ddYnXd|j|_ d|j |_ d|_d|_||_|r|j|_|j}t||_dS)Nrz2null string passed to Keyword; use Empty() insteadrq)rz"%s"z Expected F)rrrDEFAULT_KEYWORD_CHARSrrrrrrrrrrar[r`caselessupper caselessmatchr identChars)rrrr)rHrwrxrq s&    zKeyword.__init__TcCs|jr|||||jj|jkr|t||jksL|||jj|jkr|dksj||dj|jkr||j|jfSnv|||jkr|jdks|j|j|r|t||jks|||j|jkr|dks||d|jkr||j|jfSt |||j |dS)Nrrr) rrrrrrrrrrra)rr-rrorwrwrxr s*&zKeyword.parseImplcstt|j}tj|_|S)N)rrrrr)rr)rHrwrxr sz Keyword.copycCs |t_dS)z,Overrides the default Keyword chars N)rr)rOrwrwrxsetDefaultKeywordChars szKeyword.setDefaultKeywordChars)NF)T) rrrrr3rrrrrrrrwrw)rHrxr^ s   cs*eZdZdZfddZdddZZS)ral Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. Example:: OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] (Contrast with example for L{CaselessKeyword}.) cs6tt|j|j||_d|j|_d|j|_dS)Nz'%s'z Expected )rrrr returnStringrra)rr)rHrwrxr s zCaselessLiteral.__init__TcCs@||||jj|jkr,||j|jfSt|||j|dS)N)rrrrrra)rr-rrorwrwrxr szCaselessLiteral.parseImpl)T)rrrrrrrrwrw)rHrxr s  cs,eZdZdZdfdd Zd ddZZS) rz Caseless version of L{Keyword}. Example:: OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] (Contrast with example for L{CaselessLiteral}.) Ncstt|j||dddS)NT)r)rrr)rrr)rHrwrxr szCaselessKeyword.__init__TcCsj||||jj|jkrV|t||jksF|||jj|jkrV||j|jfSt|||j|dS)N)rrrrrrrra)rr-rrorwrwrxr s*zCaselessKeyword.parseImpl)N)T)rrrrrrrrwrw)rHrxr scs,eZdZdZdfdd Zd ddZZS) rlax A variation on L{Literal} which matches "close" matches, that is, strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - C{match_string} - string to be matched - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match The results from a successful parse will contain the matched text from the input string and the following named results: - C{mismatches} - a list of the positions within the match_string where mismatches were found - C{original} - the original match_string used to compare against the input string If C{mismatches} is an empty list, then the match was an exact match. Example:: patt = CloseMatch("ATCATCGAATGGA") patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) # exact match patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) # close match allowing up to 2 mismatches patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) rrcsBtt|j||_||_||_d|j|jf|_d|_d|_dS)Nz&Expected %r (with up to %d mismatches)F) rrlrr match_string maxMismatchesrar`r[)rrr)rHrwrxr szCloseMatch.__init__TcCs|}t|}|t|j}||kr|j}d}g} |j} xtt||||jD]0\}} | \} } | | krP| j|t| | krPPqPW|d}t|||g}|j|d<| |d<||fSt|||j|dS)Nrrroriginal mismatches) rrrrrrr"rra)rr-rrostartrmaxlocrZmatch_stringlocrrZs_msrcmatresultsrwrwrxr s("   zCloseMatch.parseImpl)rr)T)rrrrrrrrwrw)rHrxrl s cs8eZdZdZd fdd Zdd d Zfd d ZZS)r/a Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. An optional C{excludeChars} parameter can list characters that might be found in the input C{bodyChars} string; useful to define a word of all printables except for one or two characters, for instance. L{srange} is useful for defining custom character set strings for defining C{Word} expressions, using range notation from regular expression character sets. A common mistake is to use C{Word} to match a specific literal string, as in C{Word("Address")}. Remember that C{Word} uses the string argument to define I{sets} of matchable characters. This expression would match "Add", "AAA", "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an exact literal string, use L{Literal} or L{Keyword}. pyparsing includes helper strings for building Words: - L{alphas} - L{nums} - L{alphanums} - L{hexnums} - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - L{printables} (any non-whitespace character) Example:: # a word composed of digits integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) # a word with a leading capital, and zero or more lowercase capital_word = Word(alphas.upper(), alphas.lower()) # hostnames are alphanumeric, with leading alpha, and '-' hostname = Word(alphas, alphanums+'-') # roman numeral (not a strict parser, accepts invalid mix of characters) roman = Word("IVXLCDM") # any string of non-whitespace characters, except for ',' csv_value = Word(printables, excludeChars=",") NrrrFc stt|jrFdjfdd|D}|rFdjfdd|D}||_t||_|rl||_t||_n||_t||_|dk|_ |dkrt d||_ |dkr||_ nt |_ |dkr||_ ||_ t||_d|j|_d |_||_d |j|jkr|dkr|dkr|dkr|j|jkr8d t|j|_nHt|jdkrfd tj|jt|jf|_nd t|jt|jf|_|jrd|jd|_ytj|j|_Wntk rd|_YnXdS)Nrc3s|]}|kr|VqdS)Nrw)rr) excludeCharsrwrxr7 sz Word.__init__..c3s|]}|kr|VqdS)Nrw)rr)rrwrxr9 srrrzZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permittedz Expected Frz[%s]+z%s[%s]*z [%s][%s]*z\b)rr/rr initCharsOrigr initChars bodyCharsOrig bodyChars maxSpecifiedrminLenmaxLenrrrrar` asKeyword_escapeRegexRangeCharsreStringrrdescapecompilerK)rrrminmaxexactrr)rH)rrxr4 sT      0 z Word.__init__Tc CsD|jr<|jj||}|s(t|||j||j}||jfS|||jkrZt|||j||}|d7}t|}|j}||j }t ||}x ||kr|||kr|d7}qWd} |||j krd} |j r||kr|||krd} |j r|dkr||d|ks||kr|||krd} | r4t|||j|||||fS)NrrFTr)rdrrraendgrouprrrrr rrr) rr-rrorrrZ bodycharsrZthrowExceptionrwrwrxrj s6    4zWord.parseImplc stytt|jStk r"YnX|jdkrndd}|j|jkr^d||j||jf|_nd||j|_|jS)NcSs$t|dkr|dddS|SdS)Nz...)r)rrwrwrx charsAsStr s z Word.__str__..charsAsStrz W:(%s,%s)zW:(%s))rr/rrKrUrr)rr)rHrwrxr s  z Word.__str__)NrrrrFN)T)rrrrrrrrrwrw)rHrxr/ s.6 #csFeZdZdZeejdZd fdd Zd ddZ fd d Z Z S) r'a Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. If the given regex contains named groups (defined using C{(?P...)}), these will be preserved as named parse results. Example:: realnum = Regex(r"[+-]?\d+\.\d*") date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)') # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") z[A-Z]rc stt|jt|tr|s,tjdtdd||_||_ yt j |j|j |_ |j|_ Wqt jk rtjd|tddYqXn2t|tjr||_ t||_|_ ||_ ntdt||_d|j|_d|_d|_d S) zThe parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.z0null string passed to Regex; use Empty() insteadrq)rz$invalid pattern (%s) passed to RegexzCRegex may only be constructed with a string or a compiled RE objectz Expected FTN)rr'rrzrrrrpatternflagsrdr r sre_constantserrorcompiledREtyper{rrrrar`r[)rrr)rHrwrxr s.         zRegex.__init__TcCsd|jj||}|s"t|||j||j}|j}t|j}|r\x|D]}||||<qHW||fS)N)rdrrrar groupdictr"r)rr-rrordrrrwrwrxr s  zRegex.parseImplc sDytt|jStk r"YnX|jdkr>dt|j|_|jS)NzRe:(%s))rr'rrKrUrr)r)rHrwrxr s z Regex.__str__)r)T) rrrrrrdr rrrrrrwrw)rHrxr' s  " cs8eZdZdZd fdd Zd ddZfd d ZZS) r%a Token for matching strings that are delimited by quoting characters. Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=C{None}) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) Example:: qs = QuotedString('"') print(qs.searchString('lsjdf "This is the quote" sldjf')) complex_qs = QuotedString('{{', endQuoteChar='}}') print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) sql_qs = QuotedString('"', escQuote='""') print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) prints:: [['This is the quote']] [['This is the "quote"']] [['This is the quote with "embedded" quotes']] NFTc sNttj|j}|s0tjdtddt|dkr>|}n"|j}|s`tjdtddt|_t |_ |d_ |_ t |_ |_|_|_|_|rtjtjB_dtjjtj d|dk rt|pdf_n.)z|(?:%s)z|(?:%s.)z(.)z)*%sz$invalid pattern (%s) passed to Regexz Expected FTrs)%rr%rrrrr SyntaxError quoteCharr quoteCharLenfirstQuoteCharrendQuoteCharLenescCharescQuoteunquoteResultsconvertWhitespaceEscapesrd MULTILINEDOTALLrr rrrrescCharReplacePatternr rrrrrrar`r[)rrr r!Z multiliner"rr#)rH)rrxr sf       6     zQuotedString.__init__c Cs|||jkr|jj||pd}|s4t|||j||j}|j}|jr||j|j }t |t rd|kr|j rddddd}x |j D]\}}|j||}qW|jrtj|jd|}|jr|j|j|j}||fS)N\ r  )z\tz\nz\fz\rz\g<1>)rrdrrrarrr"rrrzrr#rrr rr&r!r) rr-rrorrZws_mapZwslitZwscharrwrwrxrG s(  zQuotedString.parseImplc sFytt|jStk r"YnX|jdkr@d|j|jf|_|jS)Nz.quoted string, starting with %s ending with %s)rr%rrKrUrr)r)rHrwrxrj s zQuotedString.__str__)NNFTNT)T)rrrrrrrrrwrw)rHrxr% sA #cs8eZdZdZd fdd Zd ddZfd d ZZS) r a Token for matching words composed of characters I{not} in a given set (will include whitespace in matched characters if not listed in the provided exclusion set - see example). Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. Example:: # define a comma-separated-value as anything that is not a ',' csv_value = CharsNotIn(',') print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) prints:: ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] rrrcstt|jd|_||_|dkr*td||_|dkr@||_nt|_|dkrZ||_||_t ||_ d|j |_ |jdk|_ d|_ dS)NFrrzfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedrz Expected )rr rrXnotCharsrrrrrrrar[r`)rr+r r r )rHrwrxr s    zCharsNotIn.__init__TcCs|||jkrt|||j||}|d7}|j}t||jt|}x ||krd|||krd|d7}qFW|||jkrt|||j|||||fS)Nrr)r+rrar rrr)rr-rrorZnotcharsmaxlenrwrwrxr s   zCharsNotIn.parseImplc sdytt|jStk r"YnX|jdkr^t|jdkrRd|jdd|_n d|j|_|jS)Nrz !W:(%s...)z!W:(%s))rr rrKrUrr+)r)rHrwrxr s  zCharsNotIn.__str__)rrrr)T)rrrrrrrrrwrw)rHrxr v s cs<eZdZdZddddddZdfd d ZdddZZS)r.a Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is C{" \t\r\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, as defined for the C{L{Word}} class. zzzzz)rr(rr*r) rrrcsttj|_jdjfddjDdjddjD_d_dj_ |_ |dkrt|_ nt _ |dkr|_ |_ dS)Nrc3s|]}|jkr|VqdS)N) matchWhite)rr)rrwrxr sz!White.__init__..css|]}tj|VqdS)N)r. whiteStrs)rrrwrwrxr sTz Expected r) rr.rr.rrrYrr[rarrr)rZwsr r r )rH)rrxr s  zWhite.__init__TcCs|||jkrt|||j||}|d7}||j}t|t|}x"||krd|||jkrd|d7}qDW|||jkrt|||j|||||fS)Nrr)r.rrarr rr)rr-rrorrrwrwrxr s  zWhite.parseImpl)r-rrrr)T)rrrrr/rrrrwrw)rHrxr. scseZdZfddZZS)_PositionTokencs(tt|j|jj|_d|_d|_dS)NTF)rr0rrHrrr[r`)r)rHrwrxr s z_PositionToken.__init__)rrrrrrwrw)rHrxr0 sr0cs2eZdZdZfddZddZd ddZZS) rzb Token to advance to a specific column of input text; useful for tabular report scraping. cstt|j||_dS)N)rrrr9)rcolno)rHrwrxr szGoToColumn.__init__cCs`t|||jkr\t|}|jr*|j||}x0||krZ||jrZt|||jkrZ|d7}q,W|S)Nrr)r9rr]risspace)rr-rrrwrwrxr s & zGoToColumn.preParseTcCsDt||}||jkr"t||d|||j|}|||}||fS)NzText not in expected column)r9r)rr-rroZthiscolZnewlocrrwrwrxr s    zGoToColumn.parseImpl)T)rrrrrrrrrwrw)rHrxr s  cs*eZdZdZfddZdddZZS)ra Matches if current position is at the beginning of a line within the parse string Example:: test = ''' AAA this line AAA and this line AAA but not this one B AAA and definitely not this one ''' for t in (LineStart() + 'AAA' + restOfLine).searchString(test): print(t) Prints:: ['AAA', ' this line'] ['AAA', ' and this line'] cstt|jd|_dS)NzExpected start of line)rrrra)r)rHrwrxr& szLineStart.__init__TcCs*t||dkr|gfSt|||j|dS)Nrr)r9rra)rr-rrorwrwrxr* szLineStart.parseImpl)T)rrrrrrrrwrw)rHrxr s cs*eZdZdZfddZdddZZS)rzU Matches if current position is at the end of a line within the parse string cs,tt|j|jtjjddd|_dS)NrrzExpected end of line)rrrrr$rNrra)r)rHrwrxr3 szLineEnd.__init__TcCsb|t|kr6||dkr$|ddfSt|||j|n(|t|krN|dgfSt|||j|dS)Nrrr)rrra)rr-rrorwrwrxr8 s     zLineEnd.parseImpl)T)rrrrrrrrwrw)rHrxr/ s cs*eZdZdZfddZdddZZS)r*zM Matches if current position is at the beginning of the parse string cstt|jd|_dS)NzExpected start of text)rr*rra)r)rHrwrxrG szStringStart.__init__TcCs0|dkr(||j|dkr(t|||j||gfS)Nr)rrra)rr-rrorwrwrxrK szStringStart.parseImpl)T)rrrrrrrrwrw)rHrxr*C s cs*eZdZdZfddZdddZZS)r)zG Matches if current position is at the end of the parse string cstt|jd|_dS)NzExpected end of text)rr)rra)r)rHrwrxrV szStringEnd.__init__TcCs^|t|krt|||j|n<|t|kr6|dgfS|t|krJ|gfSt|||j|dS)Nrr)rrra)rr-rrorwrwrxrZ s    zStringEnd.parseImpl)T)rrrrrrrrwrw)rHrxr)R s cs.eZdZdZeffdd ZdddZZS)r1ap Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. cs"tt|jt||_d|_dS)NzNot at the start of a word)rr1rr wordCharsra)rr3)rHrwrxrl s zWordStart.__init__TcCs@|dkr8||d|jks(|||jkr8t|||j||gfS)Nrrr)r3rra)rr-rrorwrwrxrq s zWordStart.parseImpl)T)rrrrrVrrrrwrw)rHrxr1d scs.eZdZdZeffdd ZdddZZS)r0aZ Matches if the current position is at the end of a Word, and is not followed by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. cs(tt|jt||_d|_d|_dS)NFzNot at the end of a word)rr0rrr3rXra)rr3)rHrwrxr s zWordEnd.__init__TcCsPt|}|dkrH||krH|||jks8||d|jkrHt|||j||gfS)Nrrr)rr3rra)rr-rrorrwrwrxr s zWordEnd.parseImpl)T)rrrrrVrrrrwrw)rHrxr0x scseZdZdZdfdd ZddZddZd d Zfd d Zfd dZ fddZ dfdd Z gfddZ fddZ ZS)r z^ Abstract subclass of ParserElement, for combining and post-processing parsed tokens. Fc stt|j|t|tr"t|}t|tr.F)rr rrzrrrr$rQexprsrIterableallrvrre)rr4rg)rHrwrxr s     zParseExpression.__init__cCs |j|S)N)r4)rrrwrwrxr szParseExpression.__getitem__cCs|jj|d|_|S)N)r4rrU)rrrwrwrxr s zParseExpression.appendcCs4d|_dd|jD|_x|jD] }|jq W|S)z~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on all contained expressions.FcSsg|] }|jqSrw)r)rrrwrwrxr sz3ParseExpression.leaveWhitespace..)rXr4r)rrrwrwrxr s   zParseExpression.leaveWhitespacecszt|trF||jkrvtt|j|xP|jD]}|j|jdq,Wn0tt|j|x|jD]}|j|jdq^W|S)Nrrrsrs)rzr+r]rr rr4)rrr)rHrwrxr s    zParseExpression.ignorec sLytt|jStk r"YnX|jdkrFd|jjt|jf|_|jS)Nz%s:(%s)) rr rrKrUrHrrr4)r)rHrwrxr s zParseExpression.__str__cs0tt|jx|jD] }|jqWt|jdkr|jd}t||jr|j r|jdkr|j r|jdd|jdg|_d|_ |j |j O_ |j |j O_ |jd}t||jo|j o|jdko|j r|jdd|jdd|_d|_ |j |j O_ |j |j O_ dt ||_|S)Nrqrrrz Expected rsrs)rr rr4rrzrHrSrVr^rUr[r`rra)rrr)rHrwrxr s0         zParseExpression.streamlinecstt|j||}|S)N)rr rm)rrrlr)rHrwrxrm szParseExpression.setResultsNamecCs:|dd|g}x|jD]}|j|qW|jgdS)N)r4rr)rrtmprrwrwrxr s zParseExpression.validatecs$tt|j}dd|jD|_|S)NcSsg|] }|jqSrw)r)rrrwrwrxr sz(ParseExpression.copy..)rr rr4)rr)rHrwrxr szParseExpression.copy)F)F)rrrrrrrrrrrrmrrrrwrw)rHrxr s " csTeZdZdZGdddeZdfdd ZdddZd d Zd d Z d dZ Z S)ra  Requires all given C{ParseExpression}s to be found in the given order. Expressions may be separated by whitespace. May be constructed using the C{'+'} operator. May also be constructed using the C{'-'} operator, which will suppress backtracking. Example:: integer = Word(nums) name_expr = OneOrMore(Word(alphas)) expr = And([integer("id"),name_expr("name"),integer("age")]) # more easily written as: expr = integer("id") + name_expr("name") + integer("age") cseZdZfddZZS)zAnd._ErrorStopcs&ttj|j||d|_|jdS)N-)rrrrrr)rrr)rHrwrxr szAnd._ErrorStop.__init__)rrrrrrwrw)rHrxr srTcsRtt|j||tdd|jD|_|j|jdj|jdj|_d|_ dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxr szAnd.__init__..rT) rrrr6r4r[rrYrXre)rr4rg)rHrwrxr s z And.__init__c Cs|jdj|||dd\}}d}x|jddD]}t|tjrFd}q0|ry|j|||\}}Wqtk rvYqtk r}zd|_tj|WYdd}~Xqt k rt|t ||j |YqXn|j|||\}}|s|j r0||7}q0W||fS)NrF)rprrT) r4rtrzrrr#r __traceback__rrrrar) rr-rro resultlistZ errorStoprZ exprtokensrrwrwrxr s(   z And.parseImplcCst|trtj|}|j|S)N)rzrr$rQr)rrrwrwrxr5 s  z And.__iadd__cCs8|dd|g}x |jD]}|j||jsPqWdS)N)r4rr[)rrsubRecCheckListrrwrwrxr: s   zAnd.checkRecursioncCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nr{rcss|]}t|VqdS)N)r)rrrwrwrxrF szAnd.__str__..})rrrUrr4)rrwrwrxrA s    z And.__str__)T)T) rrrrr rrrrrrrrwrw)rHrxr s csDeZdZdZdfdd ZdddZdd Zd d Zd d ZZ S)ra Requires that at least one C{ParseExpression} is found. If two expressions match, the expression that matches the longest string will be used. May be constructed using the C{'^'} operator. Example:: # construct Or using '^' operator number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) print(number.searchString("123 3.1416 789")) prints:: [['123'], ['3.1416'], ['789']] Fcs:tt|j|||jr0tdd|jD|_nd|_dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxr\ szOr.__init__..T)rrrr4rr[)rr4rg)rHrwrxrY sz Or.__init__Tc CsTd}d}g}x|jD]}y|j||}Wnvtk rd} z d| _| j|krT| }| j}WYdd} ~ Xqtk rt||krt|t||j|}t|}YqX|j||fqW|r*|j dddx`|D]X\} }y|j |||Stk r$} z"d| _| j|kr| }| j}WYdd} ~ XqXqW|dk rB|j|_ |nt||d|dS)NrrcSs |d S)Nrrw)xrwrwrxryu szOr.parseImpl..)rz no defined alternatives to matchrs) r4rrr9rrrrarsortrtr) rr-rro maxExcLoc maxExceptionrrZloc2r_rwrwrxr` s<     z Or.parseImplcCst|trtj|}|j|S)N)rzrr$rQr)rrrwrwrx__ixor__ s  z Or.__ixor__cCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nrr<z ^ css|]}t|VqdS)N)r)rrrwrwrxr szOr.__str__..r=)rrrUrr4)rrwrwrxr s    z Or.__str__cCs0|dd|g}x|jD]}|j|qWdS)N)r4r)rrr;rrwrwrxr s zOr.checkRecursion)F)T) rrrrrrrCrrrrwrw)rHrxrK s   & csDeZdZdZdfdd ZdddZdd Zd d Zd d ZZ S)ra Requires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the C{'|'} operator. Example:: # construct MatchFirst using '|' operator # watch the order of expressions to match number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] # put more selective expression first number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] Fcs:tt|j|||jr0tdd|jD|_nd|_dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxr sz&MatchFirst.__init__..T)rrrr4rr[)rr4rg)rHrwrxr szMatchFirst.__init__Tc Csd}d}x|jD]}y|j|||}|Stk r\}z|j|krL|}|j}WYdd}~Xqtk rt||krt|t||j|}t|}YqXqW|dk r|j|_|nt||d|dS)Nrrz no defined alternatives to matchrs)r4rtrrrrrar) rr-rror@rArrrrwrwrxr s$   zMatchFirst.parseImplcCst|trtj|}|j|S)N)rzrr$rQr)rrrwrwrx__ior__ s  zMatchFirst.__ior__cCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nrr<z | css|]}t|VqdS)N)r)rrrwrwrxr sz%MatchFirst.__str__..r=)rrrUrr4)rrwrwrxr s    zMatchFirst.__str__cCs0|dd|g}x|jD]}|j|qWdS)N)r4r)rrr;rrwrwrxr s zMatchFirst.checkRecursion)F)T) rrrrrrrDrrrrwrw)rHrxr s   cs<eZdZdZd fdd Zd ddZddZd d ZZS) r am Requires all given C{ParseExpression}s to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the C{'&'} operator. Example:: color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") integer = Word(nums) shape_attr = "shape:" + shape_type("shape") posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") color_attr = "color:" + color("color") size_attr = "size:" + integer("size") # use Each (using operator '&') to accept attributes in any order # (shape and posn are required, color and size are optional) shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) shape_spec.runTests(''' shape: SQUARE color: BLACK posn: 100, 120 shape: CIRCLE size: 50 color: BLUE posn: 50,80 color:GREEN size:20 shape:TRIANGLE posn:20,40 ''' ) prints:: shape: SQUARE color: BLACK posn: 100, 120 ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - color: BLACK - posn: ['100', ',', '120'] - x: 100 - y: 120 - shape: SQUARE shape: CIRCLE size: 50 color: BLUE posn: 50,80 ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - color: BLUE - posn: ['50', ',', '80'] - x: 50 - y: 80 - shape: CIRCLE - size: 50 color: GREEN size: 20 shape: TRIANGLE posn: 20,40 ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - color: GREEN - posn: ['20', ',', '40'] - x: 20 - y: 40 - shape: TRIANGLE - size: 20 Tcs8tt|j||tdd|jD|_d|_d|_dS)Ncss|] }|jVqdS)N)r[)rrrwrwrxrsz Each.__init__..T)rr rr6r4r[rXinitExprGroups)rr4rg)rHrwrxrsz Each.__init__c s|jrtdd|jD|_dd|jD}dd|jD}|||_dd|jD|_dd|jD|_dd|jD|_|j|j7_d |_|}|jdd}|jddg}d } x| rp||j|j} g} x~| D]v} y| j||}Wn t k r| j | YqX|j |jj t | | | |krD|j | q| krj | qWt| t| krd } qW|rd jd d|D} t ||d | |fdd|jD7}g}x*|D]"} | j|||\}}|j |qWt|tg}||fS)Ncss&|]}t|trt|j|fVqdS)N)rzrrr.)rrrwrwrxrsz!Each.parseImpl..cSsg|]}t|tr|jqSrw)rzrr.)rrrwrwrxrsz"Each.parseImpl..cSs"g|]}|jrt|t r|qSrw)r[rzr)rrrwrwrxrscSsg|]}t|tr|jqSrw)rzr2r.)rrrwrwrxr scSsg|]}t|tr|jqSrw)rzrr.)rrrwrwrxr!scSs g|]}t|tttfs|qSrw)rzrr2r)rrrwrwrxr"sFTz, css|]}t|VqdS)N)r)rrrwrwrxr=sz*Missing one or more required elements (%s)cs$g|]}t|tr|jkr|qSrw)rzrr.)rr)tmpOptrwrxrAs)rErr4Zopt1mapZ optionalsZmultioptionalsZ multirequiredZrequiredrrrrrremoverrrtsumr")rr-rroZopt1Zopt2ZtmpLocZtmpReqdZ matchOrderZ keepMatchingZtmpExprsZfailedrZmissingr:rZ finalResultsrw)rFrxrsP     zEach.parseImplcCs@t|dr|jS|jdkr:ddjdd|jDd|_|jS)Nrr<z & css|]}t|VqdS)N)r)rrrwrwrxrPszEach.__str__..r=)rrrUrr4)rrwrwrxrKs    z Each.__str__cCs0|dd|g}x|jD]}|j|qWdS)N)r4r)rrr;rrwrwrxrTs zEach.checkRecursion)T)T) rrrrrrrrrrwrw)rHrxr s 5 1 csleZdZdZdfdd ZdddZdd Zfd d Zfd d ZddZ gfddZ fddZ Z S)rza Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. Fcstt|j|t|tr@ttjtr2tj|}ntjt |}||_ d|_ |dk r|j |_ |j |_ |j|j|j|_|j|_|j|_|jj|jdS)N)rrrrzr issubclassr$rQr,rr.rUr`r[rrYrXrWrer]r)rr.rg)rHrwrxr^s    zParseElementEnhance.__init__TcCs2|jdk r|jj|||ddStd||j|dS)NF)rpr)r.rtrra)rr-rrorwrwrxrps zParseElementEnhance.parseImplcCs*d|_|jj|_|jdk r&|jj|S)NF)rXr.rr)rrwrwrxrvs    z#ParseElementEnhance.leaveWhitespacecsrt|trB||jkrntt|j||jdk rn|jj|jdn,tt|j||jdk rn|jj|jd|S)Nrrrsrs)rzr+r]rrrr.)rr)rHrwrxr}s    zParseElementEnhance.ignorecs&tt|j|jdk r"|jj|S)N)rrrr.)r)rHrwrxrs  zParseElementEnhance.streamlinecCsB||krt||g|dd|g}|jdk r>|jj|dS)N)r&r.r)rrr;rwrwrxrs  z"ParseElementEnhance.checkRecursioncCs6|dd|g}|jdk r(|jj||jgdS)N)r.rr)rrr7rwrwrxrs  zParseElementEnhance.validatec sVytt|jStk r"YnX|jdkrP|jdk rPd|jjt|jf|_|jS)Nz%s:(%s)) rrrrKrUr.rHrr)r)rHrwrxrszParseElementEnhance.__str__)F)T) rrrrrrrrrrrrrrwrw)rHrxrZs   cs*eZdZdZfddZdddZZS)ra Lookahead matching of the given parse expression. C{FollowedBy} does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. C{FollowedBy} always returns a null token list. Example:: # use FollowedBy to match a label only if it is followed by a ':' data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() prints:: [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] cstt|j|d|_dS)NT)rrrr[)rr.)rHrwrxrszFollowedBy.__init__TcCs|jj|||gfS)N)r.r)rr-rrorwrwrxrszFollowedBy.parseImpl)T)rrrrrrrrwrw)rHrxrs cs2eZdZdZfddZd ddZddZZS) ra Lookahead to disallow matching with the given parse expression. C{NotAny} does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression does I{not} match at the current position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator. Example:: cs0tt|j|d|_d|_dt|j|_dS)NFTzFound unwanted token, )rrrrXr[rr.ra)rr.)rHrwrxrszNotAny.__init__TcCs&|jj||rt|||j||gfS)N)r.rrra)rr-rrorwrwrxrszNotAny.parseImplcCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrz~{r=)rrrUrr.)rrwrwrxrs   zNotAny.__str__)T)rrrrrrrrrwrw)rHrxrs   cs(eZdZdfdd ZdddZZS) _MultipleMatchNcsFtt|j|d|_|}t|tr.tj|}|dk r<|nd|_dS)NT) rrJrrWrzrr$rQ not_ender)rr.stopOnZender)rHrwrxrs   z_MultipleMatch.__init__Tc Cs|jj}|j}|jdk }|r$|jj}|r2|||||||dd\}}yZ|j } xJ|rb|||| rr|||} n|} ||| |\}} | s| jrT|| 7}qTWWnttfk rYnX||fS)NF)rp) r.rtrrKrr]rrr) rr-rroZself_expr_parseZself_skip_ignorablesZ check_enderZ try_not_enderrZhasIgnoreExprsrZ tmptokensrwrwrxrs,      z_MultipleMatch.parseImpl)N)T)rrrrrrrwrw)rHrxrJsrJc@seZdZdZddZdS)ra Repetition of one or more of the given expression. Parameters: - expr - expression that must match one or more times - stopOn - (default=C{None}) - expression for a terminating sentinel (only required if the sentinel would ordinarily match the repetition expression) Example:: data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) text = "shape: SQUARE posn: upper left color: BLACK" OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] # use stopOn attribute for OneOrMore to avoid reading label string as part of the data attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] # could also be written as (attr_expr * (1,)).parseString(text).pprint() cCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrr<z}...)rrrUrr.)rrwrwrxr!s   zOneOrMore.__str__N)rrrrrrwrwrwrxrscs8eZdZdZd fdd Zd fdd Zdd ZZS) r2aw Optional repetition of zero or more of the given expression. Parameters: - expr - expression that must match zero or more times - stopOn - (default=C{None}) - expression for a terminating sentinel (only required if the sentinel would ordinarily match the repetition expression) Example: similar to L{OneOrMore} Ncstt|j||dd|_dS)N)rLT)rr2rr[)rr.rL)rHrwrxr6szZeroOrMore.__init__Tc s6ytt|j|||Sttfk r0|gfSXdS)N)rr2rrr)rr-rro)rHrwrxr:szZeroOrMore.parseImplcCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrrz]...)rrrUrr.)rrwrwrxr@s   zZeroOrMore.__str__)N)T)rrrrrrrrrwrw)rHrxr2*s c@s eZdZddZeZddZdS) _NullTokencCsdS)NFrw)rrwrwrxrJsz_NullToken.__bool__cCsdS)Nrrw)rrwrwrxrMsz_NullToken.__str__N)rrrrr'rrwrwrwrxrMIsrMcs6eZdZdZeffdd Zd ddZddZZS) raa Optional matching of the given expression. Parameters: - expr - expression that must match zero or more times - default (optional) - value to be returned if the optional expression is not found. Example:: # US postal code can be a 5-digit zip, plus optional 4-digit qualifier zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) zip.runTests(''' # traditional ZIP code 12345 # ZIP+4 form 12101-0001 # invalid ZIP 98765- ''') prints:: # traditional ZIP code 12345 ['12345'] # ZIP+4 form 12101-0001 ['12101-0001'] # invalid ZIP 98765- ^ FAIL: Expected end of text (at char 5), (line:1, col:6) cs.tt|j|dd|jj|_||_d|_dS)NF)rgT)rrrr.rWrr[)rr.r)rHrwrxrts zOptional.__init__Tc Cszy|jj|||dd\}}WnTttfk rp|jtk rh|jjr^t|jg}|j||jj<ql|jg}ng}YnX||fS)NF)rp)r.rtrrr_optionalNotMatchedrVr")rr-rrorrwrwrxrzs    zOptional.parseImplcCs4t|dr|jS|jdkr.dt|jd|_|jS)Nrrr )rrrUrr.)rrwrwrxrs   zOptional.__str__)T) rrrrrNrrrrrwrw)rHrxrQs" cs,eZdZdZd fdd Zd ddZZS) r(a Token for skipping over all undefined text until the matched expression is found. Parameters: - expr - target expression marking the end of the data to be skipped - include - (default=C{False}) if True, the target expression is also parsed (the skipped text and target expression are returned as a 2-element list). - ignore - (default=C{None}) used to define grammars (typically quoted strings and comments) that might contain false matches to the target expression - failOn - (default=C{None}) define expressions that are not allowed to be included in the skipped test; if found before the target expression is found, the SkipTo is not a match Example:: report = ''' Outstanding Issues Report - 1 Jan 2000 # | Severity | Description | Days Open -----+----------+-------------------------------------------+----------- 101 | Critical | Intermittent system crash | 6 94 | Cosmetic | Spelling error on Login ('log|n') | 14 79 | Minor | System slow when running too many reports | 47 ''' integer = Word(nums) SEP = Suppress('|') # use SkipTo to simply match everything up until the next SEP # - ignore quoted strings, so that a '|' character inside a quoted string does not match # - parse action will call token.strip() for each matched token, i.e., the description body string_data = SkipTo(SEP, ignore=quotedString) string_data.setParseAction(tokenMap(str.strip)) ticket_expr = (integer("issue_num") + SEP + string_data("sev") + SEP + string_data("desc") + SEP + integer("days_open")) for tkt in ticket_expr.searchString(report): print tkt.dump() prints:: ['101', 'Critical', 'Intermittent system crash', '6'] - days_open: 6 - desc: Intermittent system crash - issue_num: 101 - sev: Critical ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - days_open: 14 - desc: Spelling error on Login ('log|n') - issue_num: 94 - sev: Cosmetic ['79', 'Minor', 'System slow when running too many reports', '47'] - days_open: 47 - desc: System slow when running too many reports - issue_num: 79 - sev: Minor FNcs`tt|j|||_d|_d|_||_d|_t|t rFt j ||_ n||_ dt |j|_dS)NTFzNo match found for )rr(r ignoreExprr[r` includeMatchrrzrr$rQfailOnrr.ra)rrincluderrQ)rHrwrxrs zSkipTo.__init__Tc Cs,|}t|}|j}|jj}|jdk r,|jjnd}|jdk rB|jjnd} |} x| |kr|dk rh||| rhP| dk rx*y| || } Wqrtk rPYqrXqrWy||| dddWn tt fk r| d7} YqLXPqLWt|||j || }|||} t | } |j r$||||dd\}} | | 7} || fS)NF)rorprr)rp) rr.rtrQrrOrrrrrar"rP)rr-rror0rr.Z expr_parseZself_failOn_canParseNextZself_ignoreExpr_tryParseZtmplocZskiptextZ skipresultrrwrwrxrs<    zSkipTo.parseImpl)FNN)T)rrrrrrrrwrw)rHrxr(s6 csbeZdZdZdfdd ZddZddZd d Zd d Zgfd dZ ddZ fddZ Z S)raK Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. Note: take care when assigning to C{Forward} not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:: fwdExpr << a | b | c will actually be evaluated as:: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. It is recommended that you explicitly group the values inserted into the C{Forward}:: fwdExpr << (a | b | c) Converting to use the '<<=' operator instead will avoid this problem. See L{ParseResults.pprint} for an example of a recursive parser created using C{Forward}. Ncstt|j|dddS)NF)rg)rrr)rr)rHrwrxrszForward.__init__cCsjt|trtj|}||_d|_|jj|_|jj|_|j|jj |jj |_ |jj |_ |j j |jj |S)N)rzrr$rQr.rUr`r[rrYrXrWr]r)rrrwrwrx __lshift__s      zForward.__lshift__cCs||>S)Nrw)rrrwrwrx __ilshift__'szForward.__ilshift__cCs d|_|S)NF)rX)rrwrwrxr*szForward.leaveWhitespacecCs$|js d|_|jdk r |jj|S)NT)r_r.r)rrwrwrxr.s   zForward.streamlinecCs>||kr0|dd|g}|jdk r0|jj||jgdS)N)r.rr)rrr7rwrwrxr5s   zForward.validatec Cs>t|dr|jS|jjdSd}Wd|j|_X|jjd|S)Nrz: ...Nonez: )rrrHrZ _revertClass_ForwardNoRecurser.r)rZ retStringrwrwrxr<s   zForward.__str__cs.|jdk rtt|jSt}||K}|SdS)N)r.rrr)rr)rHrwrxrMs  z Forward.copy)N) rrrrrrSrTrrrrrrrwrw)rHrxrs  c@seZdZddZdS)rVcCsdS)Nz...rw)rrwrwrxrVsz_ForwardNoRecurse.__str__N)rrrrrwrwrwrxrVUsrVcs"eZdZdZdfdd ZZS)r-zQ Abstract subclass of C{ParseExpression}, for converting parsed results. Fcstt|j|d|_dS)NF)rr-rrW)rr.rg)rHrwrxr]szTokenConverter.__init__)F)rrrrrrrwrw)rHrxr-Yscs6eZdZdZd fdd ZfddZdd ZZS) r a Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying C{'adjacent=False'} in the constructor. Example:: real = Word(nums) + '.' + Word(nums) print(real.parseString('3.1416')) # -> ['3', '.', '1416'] # will also erroneously match the following print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] real = Combine(Word(nums) + '.' + Word(nums)) print(real.parseString('3.1416')) # -> ['3.1416'] # no match when there are internal spaces print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) rTcs8tt|j||r|j||_d|_||_d|_dS)NT)rr rradjacentrX joinStringre)rr.rXrW)rHrwrxrrszCombine.__init__cs(|jrtj||ntt|j||S)N)rWr$rrr )rr)rHrwrxr|szCombine.ignorecCsP|j}|dd=|tdj|j|jg|jd7}|jrH|jrH|gS|SdS)Nr)r)rr"rr rXrbrVr)rr-rrZretToksrwrwrxrs  "zCombine.postParse)rT)rrrrrrrrrwrw)rHrxr as cs(eZdZdZfddZddZZS)ra Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. Example:: ident = Word(alphas) num = Word(nums) term = ident | num func = ident + Optional(delimitedList(term)) print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] func = ident + Group(Optional(delimitedList(term))) print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] cstt|j|d|_dS)NT)rrrrW)rr.)rHrwrxrszGroup.__init__cCs|gS)Nrw)rr-rrrwrwrxrszGroup.postParse)rrrrrrrrwrw)rHrxrs  cs(eZdZdZfddZddZZS)r aW Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. Example:: data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) text = "shape: SQUARE posn: upper left color: light blue texture: burlap" attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) # print attributes as plain groups print(OneOrMore(attr_expr).parseString(text).dump()) # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names result = Dict(OneOrMore(Group(attr_expr))).parseString(text) print(result.dump()) # access named fields as dict entries, or output as dict print(result['shape']) print(result.asDict()) prints:: ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - color: light blue - posn: upper left - shape: SQUARE - texture: burlap SQUARE {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} See more examples at L{ParseResults} of accessing fields by results name. cstt|j|d|_dS)NT)rr rrW)rr.)rHrwrxrsz Dict.__init__cCsxt|D]\}}t|dkr q |d}t|trBt|dj}t|dkr^td|||<q t|dkrt|dt rt|d|||<q |j}|d=t|dkst|tr|j rt||||<q t|d|||<q W|j r|gS|SdS)Nrrrrrq) rrrzrurrrr"rrrV)rr-rrrtokZikeyZ dictvaluerwrwrxrs$   zDict.postParse)rrrrrrrrwrw)rHrxr s# c@s eZdZdZddZddZdS)r+aV Converter for ignoring the results of a parsed expression. Example:: source = "a, b, c,d" wd = Word(alphas) wd_list1 = wd + ZeroOrMore(',' + wd) print(wd_list1.parseString(source)) # often, delimiters that are useful during parsing are just in the # way afterward - use Suppress to keep them out of the parsed output wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) print(wd_list2.parseString(source)) prints:: ['a', ',', 'b', ',', 'c', ',', 'd'] ['a', 'b', 'c', 'd'] (See also L{delimitedList}.) cCsgS)Nrw)rr-rrrwrwrxrszSuppress.postParsecCs|S)Nrw)rrwrwrxrszSuppress.suppressN)rrrrrrrwrwrwrxr+sc@s(eZdZdZddZddZddZdS) rzI Wrapper for parse actions, to ensure they are only called once. cCst||_d|_dS)NF)rMcallablecalled)rZ methodCallrwrwrxrs zOnlyOnce.__init__cCs.|js|j|||}d|_|St||ddS)NTr)r[rZr)rrr5rvrrwrwrxrs zOnlyOnce.__call__cCs d|_dS)NF)r[)rrwrwrxreset szOnlyOnce.resetN)rrrrrrr\rwrwrwrxrsc s:tfdd}y j|_Wntk r4YnX|S)as Decorator for debugging parse actions. When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. Example:: wd = Word(alphas) @traceParseAction def remove_duplicate_chars(tokens): return ''.join(sorted(set(''.join(tokens))) wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) print(wds.parseString("slkdjs sld sldd sdlf sdljf")) prints:: >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) <>entering %s(line: '%s', %d, %r) z<.z)rMrr)rr`rw)rrxrb s  ,FcCs`t|dt|dt|d}|rBt|t||j|S|tt||j|SdS)a Helper to define a delimited list of expressions - the delimiter defaults to ','. By default, the list elements and delimiters can have intervening whitespace, and comments, but this can be overridden by passing C{combine=True} in the constructor. If C{combine} is set to C{True}, the matching tokens are returned as a single token string, with the delimiters included; otherwise, the matching tokens are returned as a list of tokens, with the delimiters suppressed. Example:: delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] z [rz]...N)rr r2rir+)r.ZdelimcombineZdlNamerwrwrxr@9s $csjtfdd}|dkr0ttjdd}n|j}|jd|j|dd|jd td S) a: Helper to define a counted list of expressions. This helper defines a pattern of the form:: integer expr expr expr... where the leading integer tells how many expr expressions follow. The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. Example:: countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] # in this parser, the leading integer value is given in binary, # '10' indicating that 2 values are in the array binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] cs.|d}|r ttg|p&tt>gS)Nr)rrrC)rr5rvr) arrayExprr.rwrxcountFieldParseAction_s"z+countedArray..countFieldParseActionNcSs t|dS)Nr)ru)rvrwrwrxrydszcountedArray..ZarrayLenT)rfz(len) z...)rr/rRrrrirxr)r.ZintExprrdrw)rcr.rxr<Ls cCs:g}x0|D](}t|tr(|jt|q |j|q W|S)N)rzrrrr)Lrrrwrwrxrks   rcs6tfdd}|j|ddjdt|S)a* Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousLiteral(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches a previous literal, will also match the leading C{"1:1"} in C{"1:10"}. If this is not desired, use C{matchPreviousExpr}. Do I{not} use with packrat parsing enabled. csP|rBt|dkr|d>qLt|j}tdd|D>n t>dS)Nrrrcss|]}t|VqdS)N)r)rttrwrwrxrszDmatchPreviousLiteral..copyTokenToRepeater..)rrrrr )rr5rvZtflat)reprwrxcopyTokenToRepeaters   z1matchPreviousLiteral..copyTokenToRepeaterT)rfz(prev) )rrxrir)r.rhrw)rgrxrOts  csFt|j}|Kfdd}|j|ddjdt|S)aS Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousExpr(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches by expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; the expressions are evaluated first, and then compared, so C{"1"} is compared with C{"10"}. Do I{not} use with packrat parsing enabled. cs*t|jfdd}j|dddS)Ncs$t|j}|kr tddddS)Nrr)rrr)rr5rvZ theseTokens) matchTokensrwrxmustMatchTheseTokenss zLmatchPreviousExpr..copyTokenToRepeater..mustMatchTheseTokensT)rf)rrr)rr5rvrj)rg)rirxrhs  z.matchPreviousExpr..copyTokenToRepeaterT)rfz(prev) )rrrxrir)r.Ze2rhrw)rgrxrNs cCs>xdD]}|j|t|}qW|jdd}|jdd}t|S)Nz\^-]rz\nr(z\t)r_bslashr)rrrwrwrxrs    rTc s|rdd}dd}tndd}dd}tg}t|trF|j}n&t|tjr\t|}ntj dt dd|svt Sd }x|t |d kr||}xnt ||d d D]N\}} || |r|||d =Pq||| r|||d =|j|| | }PqW|d 7}q|W| r|ryht |t d j|krZtd d jdd|Djdj|Stdjdd|Djdj|SWn&tk rtj dt ddYnXtfdd|Djdj|S)a Helper to quickly define a set of alternative Literals, and makes sure to do longest-first testing when there is a conflict, regardless of the input order, but returns a C{L{MatchFirst}} for best performance. Parameters: - strs - a string of space-delimited literals, or a collection of string literals - caseless - (default=C{False}) - treat all literals as caseless - useRegex - (default=C{True}) - as an optimization, will generate a Regex object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or if creating a C{Regex} raises an exception) Example:: comp_oper = oneOf("< = > <= >= !=") var = Word(alphas) number = Word(nums) term = var | number comparison_expr = term + comp_oper + term print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) prints:: [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] cSs|j|jkS)N)r)rbrwrwrxryszoneOf..cSs|jj|jS)N)rr)rrlrwrwrxryscSs||kS)Nrw)rrlrwrwrxryscSs |j|S)N)r)rrlrwrwrxrysz6Invalid argument to oneOf, expected string or iterablerq)rrrrNrz[%s]css|]}t|VqdS)N)r)rsymrwrwrxrszoneOf..z | |css|]}tj|VqdS)N)rdr )rrmrwrwrxrsz7Exception creating Regex for oneOf, building MatchFirstc3s|]}|VqdS)Nrw)rrm)parseElementClassrwrxrs)rrrzrrrr5rrrrrrrrrr'rirKr) ZstrsrZuseRegexZisequalZmasksZsymbolsrZcurrrrw)rorxrSsL         ((cCsttt||S)a Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the C{Dict} results can include named token fields. Example:: text = "shape: SQUARE posn: upper left color: light blue texture: burlap" attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) print(OneOrMore(attr_expr).parseString(text).dump()) attr_label = label attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) # similar to Dict, but simpler call format result = dictOf(attr_label, attr_value).parseString(text) print(result.dump()) print(result['shape']) print(result.shape) # object attribute access works too print(result.asDict()) prints:: [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - color: light blue - posn: upper left - shape: SQUARE - texture: burlap SQUARE SQUARE {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} )r r2r)rrrwrwrxrAs!cCs^tjdd}|j}d|_|d||d}|r@dd}ndd}|j||j|_|S) a Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. By default, returns astring containing the original parsed text. If the optional C{asString} argument is passed as C{False}, then the return value is a C{L{ParseResults}} containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to C{L{originalTextFor}} contains expressions with defined results names, you must set C{asString} to C{False} if you want to preserve those results name values. Example:: src = "this is test bold text normal text " for tag in ("b","i"): opener,closer = makeHTMLTags(tag) patt = originalTextFor(opener + SkipTo(closer) + closer) print(patt.searchString(src)[0]) prints:: [' bold text '] ['text'] cSs|S)Nrw)rrrvrwrwrxry8sz!originalTextFor..F_original_start _original_endcSs||j|jS)N)rprq)rr5rvrwrwrxry=scSs&||jd|jdg|dd<dS)Nrprq)r)rr5rvrwrwrx extractText?sz$originalTextFor..extractText)r rrrer])r.ZasStringZ locMarkerZ endlocMarker matchExprrrrwrwrxrg s  cCst|jddS)zp Helper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty. cSs|dS)Nrrw)rvrwrwrxryJszungroup..)r-r)r.rwrwrxrhEscCs4tjdd}t|d|d|jjdS)a Helper to decorate a returned token with its starting and ending locations in the input string. This helper adds the following results names: - locn_start = location where matched expression begins - locn_end = location where matched expression ends - value = the actual parsed results Be careful if the input text contains C{} characters, you may want to call C{L{ParserElement.parseWithTabs}} Example:: wd = Word(alphas) for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): print(match) prints:: [[0, 'ljsdf', 5]] [[8, 'lksdjjf', 15]] [[18, 'lkkjj', 23]] cSs|S)Nrw)rr5rvrwrwrxry`szlocatedExpr..Z locn_startrZlocn_end)r rrrr)r.ZlocatorrwrwrxrjLsz\[]-*.$+^?()~ )r cCs |ddS)Nrrrrw)rr5rvrwrwrxryksryz\\0?[xX][0-9a-fA-F]+cCstt|djddS)Nrz\0x)unichrrulstrip)rr5rvrwrwrxrylsz \\0[0-7]+cCstt|ddddS)Nrrr)ruru)rr5rvrwrwrxrymsz\])rr z\wr8rrZnegatebodyr c sBddy djfddtj|jDStk r<dSXdS)a Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be: - a single character - an escaped character with a leading backslash (such as C{\-} or C{\]}) - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) (C{\0x##} is also supported for backwards compatibility) - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) cSs<t|ts|Sdjddtt|dt|ddDS)Nrcss|]}t|VqdS)N)ru)rrrwrwrxrsz+srange....rrr)rzr"rrord)prwrwrxryszsrange..rc3s|]}|VqdS)Nrw)rpart) _expandedrwrxrszsrange..N)r_reBracketExprrrxrK)rrw)r|rxr_rs  csfdd}|S)zt Helper method for defining parse actions that require matching at a specific column in the input text. cs"t||krt||ddS)Nzmatched token not at column %d)r9r)r)Zlocnr1)rrwrx verifyColsz!matchOnlyAtCol..verifyColrw)rr~rw)rrxrMs cs fddS)a Helper method for common parse actions that simply return a literal value. Especially useful when used with C{L{transformString}()}. Example:: num = Word(nums).setParseAction(lambda toks: int(toks[0])) na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) term = na | num OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] csgS)Nrw)rr5rv)replStrrwrxryszreplaceWith..rw)rrw)rrxr\s cCs|dddS)a Helper parse action for removing quotation marks from parsed quoted strings. Example:: # by default, quotation marks are included in parsed results quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] # use removeQuotes to strip quotation marks from parsed results quotedString.setParseAction(removeQuotes) quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] rrrrsrw)rr5rvrwrwrxrZs c sNfdd}ytdtdj}Wntk rBt}YnX||_|S)aG Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional args are passed, they are forwarded to the given function as additional arguments after the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the parsed data to an integer using base 16. Example (compare the last to example in L{ParserElement.transformString}:: hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) hex_ints.runTests(''' 00 11 22 aa FF 0a 0d 1a ''') upperword = Word(alphas).setParseAction(tokenMap(str.upper)) OneOrMore(upperword).runTests(''' my kingdom for a horse ''') wd = Word(alphas).setParseAction(tokenMap(str.title)) OneOrMore(wd).setParseAction(' '.join).runTests(''' now is the winter of our discontent made glorious summer by this sun of york ''') prints:: 00 11 22 aa FF 0a 0d 1a [0, 17, 34, 170, 255, 10, 13, 26] my kingdom for a horse ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] now is the winter of our discontent made glorious summer by this sun of york ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] csfdd|DS)Ncsg|]}|fqSrwrw)rZtokn)rr6rwrxrsz(tokenMap..pa..rw)rr5rv)rr6rwrxr}sztokenMap..parrH)rJrrKr{)r6rr}rLrw)rr6rxrms cCs t|jS)N)rr)rvrwrwrxryscCs t|jS)N)rlower)rvrwrwrxryscCst|tr|}t|| d}n|j}tttd}|rtjj t }t d|dt t t|t d|tddgdjd j d d t d }nd jddtD}tjj t t|B}t d|dt t t|j ttt d|tddgdjd j dd t d }ttd|d }|jdd j|jddjjjd|}|jdd j|jddjjjd|}||_||_||fS)zRInternal helper to construct opening and closing tag expressions, given a tag name)rz_-:rtag=/F)rrCcSs |ddkS)Nrrrw)rr5rvrwrwrxrysz_makeTags..rrcss|]}|dkr|VqdS)rNrw)rrrwrwrxrsz_makeTags..cSs |ddkS)Nrrrw)rr5rvrwrwrxryszrz)rzrrrr/r4r3r>rrrZr+r r2rrrmrrVrYrBr _Lrtitlerrir)tagStrZxmlZresnameZ tagAttrNameZ tagAttrValueZopenTagZprintablesLessRAbrackZcloseTagrwrwrx _makeTagss" T\..rcCs t|dS)a  Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. Example:: text = 'More info at the pyparsing wiki page' # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple a,a_end = makeHTMLTags("A") link_expr = a + SkipTo(a_end)("link_text") + a_end for link in link_expr.searchString(text): # attributes in the tag (like "href" shown here) are also accessible as named results print(link.link_text, '->', link.href) prints:: pyparsing -> http://pyparsing.wikispaces.com F)r)rrwrwrxrKscCs t|dS)z Helper to construct opening and closing tag expressions for XML, given a tag name. Matches tags only in the given upper/lower case. Example: similar to L{makeHTMLTags} T)r)rrwrwrxrLscs8|r|ddn|jddDfdd}|S)a< Helper to create a validating parse action to be used with start tags created with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as C{} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. If just testing for C{class} (with or without a namespace), use C{L{withClass}}. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this has no type
''' div,div_end = makeHTMLTags("div") # only match div tag having a type attribute with value "grid" div_grid = div().setParseAction(withAttribute(type="grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) # construct a match with any div tag having a type attribute, regardless of the value div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 NcSsg|]\}}||fqSrwrw)rrrrwrwrxrQsz!withAttribute..cs^xXD]P\}}||kr&t||d||tjkr|||krt||d||||fqWdS)Nzno matching attribute z+attribute '%s' has value '%s', must be '%s')rre ANY_VALUE)rr5rZattrNameZ attrValue)attrsrwrxr}Rs zwithAttribute..pa)r)rZattrDictr}rw)rrxres 2 cCs|r d|nd}tf||iS)a Simplified version of C{L{withAttribute}} when matching on a div class - made difficult because C{class} is a reserved word in Python. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this <div> has no class
''' div,div_end = makeHTMLTags("div") div_grid = div().setParseAction(withClass("grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 z%s:classclass)re)Z classname namespaceZ classattrrwrwrxrk\s (rcCst}||||B}x`t|D]R\}}|d dd\}} } } | dkrTd|nd|} | dkr|dksxt|dkrtd|\} }tj| }| tjkrd| dkrt||t|t |}n| dkr|dk rt|||t|t ||}nt||t|t |}nD| dkrZt|| |||t|| |||}ntd n| tj krH| dkrt |t st |}t|j |t||}n| dkr|dk rt|||t|t ||}nt||t|t |}nD| dkr>t|| |||t|| |||}ntd ntd | r`|j| ||j| |BK}|}q"W||K}|S) a Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. The generated parser will also recognize the use of parentheses to override operator precedences (see example below). Note: if you define a deep operator list, you may see performance issues when using infixNotation. See L{ParserElement.enablePackrat} for a mechanism to potentially improve your parser performance. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) Example:: # simple example of four-function arithmetic with ints and variable names integer = pyparsing_common.signed_integer varname = pyparsing_common.identifier arith_expr = infixNotation(integer | varname, [ ('-', 1, opAssoc.RIGHT), (oneOf('* /'), 2, opAssoc.LEFT), (oneOf('+ -'), 2, opAssoc.LEFT), ]) arith_expr.runTests(''' 5+3*6 (5+3)*6 -2--11 ''', fullDump=False) prints:: 5+3*6 [[5, '+', [3, '*', 6]]] (5+3)*6 [[[5, '+', 3], '*', 6]] -2--11 [[['-', 2], '-', ['-', 11]]] Nrroz%s termz %s%s termrqz@if numterms=3, opExpr must be a tuple or list of two expressionsrrz6operator must be unary (1), binary (2), or ternary (3)z2operator must indicate right or left associativity)N)rrrrrirTLEFTrrrRIGHTrzrr.r)ZbaseExprZopListZlparZrparrZlastExprrZoperDefZopExprZarityZrightLeftAssocr}ZtermNameZopExpr1ZopExpr2ZthisExprrsrwrwrxrisR;    &       &   z4"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*"z string enclosed in double quotesz4'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*'z string enclosed in single quotesz*quotedString using single or double quotesuzunicode string literalcCs||krtd|dkr(t|to,t|tr t|dkrt|dkr|dk rtt|t||tjddj dd}n$t j t||tjj dd}nx|dk rtt|t |t |ttjddj dd}n4ttt |t |ttjddj d d}ntd t }|dk rb|tt|t||B|Bt|K}n$|tt|t||Bt|K}|jd ||f|S) a~ Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - content - expression for items within the nested lists (default=C{None}) - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. Example:: data_type = oneOf("void int short long char float double") decl_data_type = Combine(data_type + Optional(Word('*'))) ident = Word(alphas+'_', alphanums+'_') number = pyparsing_common.number arg = Group(decl_data_type + ident) LPAR,RPAR = map(Suppress, "()") code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) c_function = (decl_data_type("type") + ident("name") + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + code_body("body")) c_function.ignore(cStyleComment) source_code = ''' int is_odd(int x) { return (x%2); } int dec_to_hex(char hchar) { if (hchar >= '0' && hchar <= '9') { return (ord(hchar)-ord('0')); } else { return (10+ord(hchar)-ord('A')); } } ''' for func in c_function.searchString(source_code): print("%(name)s (%(type)s) args: %(args)s" % func) prints:: is_odd (int) args: [['int', 'x']] dec_to_hex (int) args: [['char', 'hchar']] z.opening and closing strings cannot be the sameNrr)r cSs |djS)Nr)r)rvrwrwrxry9sznestedExpr..cSs |djS)Nr)r)rvrwrwrxry<scSs |djS)Nr)r)rvrwrwrxryBscSs |djS)Nr)r)rvrwrwrxryFszOopening and closing arguments must be strings if no content expression is givenznested %s%s expression)rrzrrr rr r$rNrrCrrrrr+r2ri)openerZcloserZcontentrOrrwrwrxrPs4:     *$c sfdd}fdd}fdd}ttjdj}ttj|jd}tj|jd }tj|jd } |rtt||t|t|t|| } n$tt|t|t|t|} |j t t| jd S) a Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=C{True}) A valid block must contain at least one C{blockStatement}. Example:: data = ''' def A(z): A1 B = 100 G = A2 A2 A3 B def BB(a,b,c): BB1 def BBA(): bba1 bba2 bba3 C D def spam(x,y): def eggs(z): pass ''' indentStack = [1] stmt = Forward() identifier = Word(alphas, alphanums) funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") func_body = indentedBlock(stmt, indentStack) funcDef = Group( funcDecl + func_body ) rvalue = Forward() funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") rvalue << (funcCall | identifier | Word(nums)) assignment = Group(identifier + "=" + rvalue) stmt << ( funcDef | assignment | identifier ) module_body = OneOrMore(stmt) parseTree = module_body.parseString(data) parseTree.pprint() prints:: [['def', 'A', ['(', 'z', ')'], ':', [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], 'B', ['def', 'BB', ['(', 'a', 'b', 'c', ')'], ':', [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], 'C', 'D', ['def', 'spam', ['(', 'x', 'y', ')'], ':', [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] csN|t|krdSt||}|dkrJ|dkr>t||dt||ddS)Nrrzillegal nestingznot a peer entryrsrs)rr9r!r)rr5rvcurCol) indentStackrwrxcheckPeerIndents     z&indentedBlock..checkPeerIndentcs2t||}|dkr"j|n t||ddS)Nrrznot a subentryrs)r9rr)rr5rvr)rrwrxcheckSubIndents   z%indentedBlock..checkSubIndentcsN|t|krdSt||}o4|dko4|dksBt||djdS)Nrrrqznot an unindentrsr:)rr9rr)rr5rvr)rrwrx checkUnindents    z$indentedBlock..checkUnindentz INDENTrZUNINDENTzindented block) rrrrr rrirrrrk) ZblockStatementExprrrrrrr!rZPEERZUNDENTZsmExprrw)rrxrfQsN   ,z#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]z[\0xa1-\0xbf\0xd7\0xf7]z_:zany tagzgt lt amp nbsp quot aposz><& "'z &(?Prnz);zcommon HTML entitycCs tj|jS)zRHelper parser action to replace common HTML entities with their special characters)_htmlEntityMaprZentity)rvrwrwrxr[sz/\*(?:[^*]|\*(?!/))*z*/zC style commentzz HTML commentz.*z rest of linez//(?:\\\n|[^\n])*z // commentzC++ style commentz#.*zPython style comment)rz commaItem)rc@seZdZdZeeZeeZe e j dj eZ e ej dj eedZedj dj eZej edej ej dZejd d eeeed jeBj d Zejeed j dj eZedj dj eZeeBeBjZedj dj eZe ededj dZedj dZ edj dZ!e!de!dj dZ"ee!de!d>dee!de!d?j dZ#e#j$d d d!e j d"Z%e&e"e%Be#Bj d#j d#Z'ed$j d%Z(e)d@d'd(Z*e)dAd*d+Z+ed,j d-Z,ed.j d/Z-ed0j d1Z.e/je0jBZ1e)d2d3Z2e&e3e4d4e5e e6d4d5ee7d6jj d7Z8e9ee:j;e8Bd8d9j d:Zd=S)Brna Here are some common low-level expressions that may be useful in jump-starting parser development: - numeric forms (L{integers}, L{reals}, L{scientific notation}) - common L{programming identifiers} - network addresses (L{MAC}, L{IPv4}, L{IPv6}) - ISO8601 L{dates} and L{datetime} - L{UUID} - L{comma-separated list} Parse actions: - C{L{convertToInteger}} - C{L{convertToFloat}} - C{L{convertToDate}} - C{L{convertToDatetime}} - C{L{stripHTMLTags}} - C{L{upcaseTokens}} - C{L{downcaseTokens}} Example:: pyparsing_common.number.runTests(''' # any int or real number, returned as the appropriate type 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.fnumber.runTests(''' # any int or real number, returned as float 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.hex_integer.runTests(''' # hex numbers 100 FF ''') pyparsing_common.fraction.runTests(''' # fractions 1/2 -3/4 ''') pyparsing_common.mixed_integer.runTests(''' # mixed fractions 1 1/2 -3/4 1-3/4 ''') import uuid pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) pyparsing_common.uuid.runTests(''' # uuid 12345678-1234-5678-1234-567812345678 ''') prints:: # any int or real number, returned as the appropriate type 100 [100] -100 [-100] +100 [100] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # any int or real number, returned as float 100 [100.0] -100 [-100.0] +100 [100.0] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # hex numbers 100 [256] FF [255] # fractions 1/2 [0.5] -3/4 [-0.75] # mixed fractions 1 [1] 1/2 [0.5] -3/4 [-0.75] 1-3/4 [1.75] # uuid 12345678-1234-5678-1234-567812345678 [UUID('12345678-1234-5678-1234-567812345678')] integerz hex integerrtz[+-]?\d+zsigned integerrfractioncCs|d|dS)Nrrrrsrw)rvrwrwrxryszpyparsing_common.r8z"fraction or mixed integer-fractionz [+-]?\d+\.\d*z real numberz+[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)z$real number with scientific notationz[+-]?\d+\.?\d*([eE][+-]?\d+)?fnumberrB identifierzK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}z IPv4 addressz[0-9a-fA-F]{1,4} hex_integerrzfull IPv6 addressrrBz::zshort IPv6 addresscCstdd|DdkS)Ncss|]}tjj|rdVqdS)rrN)rn _ipv6_partr)rrfrwrwrxrsz,pyparsing_common...rw)rH)rvrwrwrxrysz::ffff:zmixed IPv6 addressz IPv6 addressz:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}z MAC address%Y-%m-%dcsfdd}|S)a Helper to create a parse action for converting parsed date string to Python datetime.date Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) Example:: date_expr = pyparsing_common.iso8601_date.copy() date_expr.setParseAction(pyparsing_common.convertToDate()) print(date_expr.parseString("1999-12-31")) prints:: [datetime.date(1999, 12, 31)] csLytj|djStk rF}zt||t|WYdd}~XnXdS)Nr)rstrptimeZdaterrr{)rr5rvve)fmtrwrxcvt_fnsz.pyparsing_common.convertToDate..cvt_fnrw)rrrw)rrx convertToDates zpyparsing_common.convertToDate%Y-%m-%dT%H:%M:%S.%fcsfdd}|S)a Helper to create a parse action for converting parsed datetime string to Python datetime.datetime Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) Example:: dt_expr = pyparsing_common.iso8601_datetime.copy() dt_expr.setParseAction(pyparsing_common.convertToDatetime()) print(dt_expr.parseString("1999-12-31T23:59:59.999")) prints:: [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] csHytj|dStk rB}zt||t|WYdd}~XnXdS)Nr)rrrrr{)rr5rvr)rrwrxrsz2pyparsing_common.convertToDatetime..cvt_fnrw)rrrw)rrxconvertToDatetimes z"pyparsing_common.convertToDatetimez7(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?z ISO8601 datez(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?zISO8601 datetimez2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}UUIDcCstjj|dS)a Parse action to remove HTML tags from web page HTML source Example:: # strip HTML links from normal text text = 'More info at the
pyparsing wiki page' td,td_end = makeHTMLTags("TD") table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' r)rn_html_stripperr)rr5rrwrwrx stripHTMLTagss zpyparsing_common.stripHTMLTagsra)rz rr)rzcomma separated listcCs t|jS)N)rr)rvrwrwrxryscCs t|jS)N)rr)rvrwrwrxrysN)rrB)rrB)r)r)?rrrrrmruZconvertToIntegerfloatZconvertToFloatr/rRrirrrDrr'Zsigned_integerrrxrrZ mixed_integerrHrealZsci_realrnumberrr4r3rZ ipv4_addressrZ_full_ipv6_addressZ_short_ipv6_addressr~Z_mixed_ipv6_addressr Z ipv6_addressZ mac_addressrrrZ iso8601_dateZiso8601_datetimeuuidr7r6rrrrrrVr. _commasepitemr@rYrZcomma_separated_listrdrBrwrwrwrxrnsN"" 2   8__main__Zselectfromz_$r])rbcolumnsrjZtablesZcommandaK # '*' as column list and dotted table name select * from SYS.XYZZY # caseless match on "SELECT", and casts back to "select" SELECT * from XYZZY, ABC # list of column names, and mixed case SELECT keyword Select AA,BB,CC from Sys.dual # multiple tables Select A, B, C from Sys.dual, Table2 # invalid SELECT keyword - should fail Xelect A, B, C from Sys.dual # incomplete command - should fail Select # invalid column name - should fail Select ^^^ frox Sys.dual z] 100 -100 +100 3.14159 6.02e23 1e-12 z 100 FF z6 12345678-1234-5678-1234-567812345678 )rq)raF)N)FT)T)r)T)r __version__Z__versionTime__ __author__rweakrefrrrr~rrdrrr"r<rr_threadr ImportErrorZ threadingrrZ ordereddict__all__r version_infor;rmaxsizerr{rchrrurrHrrreversedrrrr6r r rIZmaxintZxrangerZ __builtin__rZfnamerrJrrrrrrZascii_uppercaseZascii_lowercaser4rRrDr3rkrZ printablerVrKrrr!r#r&rr"MutableMappingregisterr9rJrGr/r2r4rQrMr$r,r rrrrQrrrrlr/r'r%r r.r0rrrr*r)r1r0r rrrr rrrrJrr2rMrNrr(rrVr-r rr r+rrbr@r<rrOrNrrSrArgrhrjrirCrIrHrar`rZ _escapedPuncZ_escapedHexCharZ_escapedOctCharUNICODEZ _singleCharZ _charRangermr}r_rMr\rZrmrdrBrrKrLrerrkrTrrrirUr>r^rYrcrPrfr5rWr7r6rrrrr;r[r8rErr]r?r=rFrXrrr:rnrZ selectTokenZ fromTokenZidentZ columnNameZcolumnNameListZ columnSpecZ tableNameZ tableNameListZ simpleSQLrrrrrrrwrwrwrx=s                 8      @d &A= I G3pLOD|M &#@sQ,A,    I# %     &0 ,   ? #k Zr   (  0     "PK!Z_Z_,_vendor/__pycache__/six.cpython-36.opt-1.pycnu[3 9fuI@srdZddlmZddlZddlZddlZddlZddlZdZdZ ej ddkZ ej ddkZ ej dddzkZ e refZefZefZeZeZejZnefZeefZeejfZeZeZejjd red|ZnLGd d d eZ ye!e Wn e"k r ed~ZYn XedZ[ ddZ#ddZ$GdddeZ%Gddde%Z&Gdddej'Z(Gddde%Z)GdddeZ*e*e+Z,Gddde(Z-e)ddd d!e)d"d#d$d%d"e)d&d#d#d'd&e)d(d)d$d*d(e)d+d)d,e)d-d#d$d.d-e)d/d0d0d1d/e)d2d0d0d/d2e)d3d)d$d4d3e)d5d)e rd6nd7d8e)d9d)d:e)d;de)d!d!d e)d?d?d@e)dAdAd@e)dBdBd@e)d4d)d$d4d3e)dCd#d$dDdCe)dEd#d#dFdEe&d$d)e&dGdHe&dIdJe&dKdLdMe&dNdOdNe&dPdQdRe&dSdTdUe&dVdWdXe&dYdZd[e&d\d]d^e&d_d`dae&dbdcdde&dedfdge&dhdidje&dkdkdle&dmdmdle&dndndle&dododpe&dqdre&dsdte&dudve&dwdxdwe&dydze&d{d|d}e&d~dde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&de+dde&de+dde&de+de+de&ddde&ddde&dddg>Z.ejdkrZe.e&ddg7Z.x:e.D]2Z/e0e-e/j1e/e2e/e&r`e,j3e/de/j1q`W[/e.e-_.e-e+dZ4e,j3e4dGddde(Z5e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)d>dde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddgZ6xe6D]Z/e0e5e/j1e/qW[/e6e5_.e,j3e5e+dddӃGddՄde(Z7e)ddde)ddde)dddgZ8xe8D]Z/e0e7e/j1e/q$W[/e8e7_.e,j3e7e+ddd܃Gddބde(Z9e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddg!Z:xe:D]Z/e0e9e/j1e/qW[/e:e9_.e,j3e9e+dddGddde(Z;e)ddde)ddde)d dde)d ddgZxe>D]Z/e0e=e/j1e/qW[/e>e=_.e,j3e=e+dddGdddej'Z?e,j3e?e+ddddZ@ddZAe rjdZBdZCdZDdZEdZFd ZGn$d!ZBd"ZCd#ZDd$ZEd%ZFd&ZGyeHZIWn"eJk rd'd(ZIYnXeIZHyeKZKWn"eJk rd)d*ZKYnXe rd+d,ZLejMZNd-d.ZOeZPn>d/d,ZLd0d1ZNd2d.ZOGd3d4d4eZPeKZKe#eLd5ejQeBZRejQeCZSejQeDZTejQeEZUejQeFZVejQeGZWe rd6d7ZXd8d9ZYd:d;ZZd<d=Z[ej\d>Z]ej\d?Z^ej\d@Z_nTdAd7ZXdBd9ZYdCd;ZZdDd=Z[ej\dEZ]ej\dFZ^ej\dGZ_e#eXdHe#eYdIe#eZdJe#e[dKe rdLdMZ`dNdOZaebZcddldZdedjedPjfZg[dejhdZiejjZkelZmddlnZnenjoZoenjpZpdQZqej d d k rdRZrdSZsn dTZrdUZsnjdVdMZ`dWdOZaecZcebZgdXdYZidZd[ZkejtejuevZmddloZoeojoZoZpd\ZqdRZrdSZse#e`d]e#ead^d_dQZwd`dTZxdadUZye reze4j{dbZ|ddcddZ}nddedfZ|e|dgej dddk re|dhn.ej dddk r8e|din djdkZ~eze4j{dldZedk rjdmdnZej dddk reZdodnZe#e}dpej dddk rejejfdqdrZnejZdsdtZdudvZdwdxZgZe+Zejdydk rge_ejrbx>eejD]0\ZZeej+dkr*ej1e+kr*eje=Pq*W[[ejje,dS(z6Utilities for writing code that runs on Python 2 and 3)absolute_importNz'Benjamin Peterson z1.10.0javac@seZdZddZdS)XcCsdS)Nrrl)selfr r /usr/lib/python3.6/six.py__len__>sz X.__len__N)__name__ __module__ __qualname__r r r r r r <sr ?cCs ||_dS)z Add documentation to a function.N)__doc__)funcdocr r r _add_docKsrcCst|tj|S)z7Import module, returning the module after the last dot.) __import__sysmodules)namer r r _import_modulePsrc@seZdZddZddZdS) _LazyDescrcCs ||_dS)N)r)r rr r r __init__Xsz_LazyDescr.__init__c CsB|j}t||j|yt|j|jWntk r<YnX|S)N)_resolvesetattrrdelattr __class__AttributeError)r objtpresultr r r __get__[sz_LazyDescr.__get__N)rrrrr%r r r r rVsrcs.eZdZdfdd ZddZddZZS) MovedModuleNcs2tt|j|tr(|dkr |}||_n||_dS)N)superr&rPY3mod)r roldnew)r r r ris zMovedModule.__init__cCs t|jS)N)rr))r r r r rrszMovedModule._resolvecCs"|j}t||}t||||S)N)rgetattrr)r attr_modulevaluer r r __getattr__us  zMovedModule.__getattr__)N)rrrrrr0 __classcell__r r )r r r&gs r&cs(eZdZfddZddZgZZS) _LazyModulecstt|j||jj|_dS)N)r'r2rr r)r r)r r r r~sz_LazyModule.__init__cCs ddg}|dd|jD7}|S)NrrcSsg|] }|jqSr )r).0r-r r r sz'_LazyModule.__dir__..)_moved_attributes)r Zattrsr r r __dir__sz_LazyModule.__dir__)rrrrr6r5r1r r )r r r2|s r2cs&eZdZdfdd ZddZZS)MovedAttributeNcsdtt|j|trH|dkr |}||_|dkr@|dkr<|}n|}||_n||_|dkrZ|}||_dS)N)r'r7rr(r)r-)r rZold_modZnew_modZold_attrZnew_attr)r r r rszMovedAttribute.__init__cCst|j}t||jS)N)rr)r,r-)r moduler r r rs zMovedAttribute._resolve)NN)rrrrrr1r r )r r r7sr7c@sVeZdZdZddZddZddZdd d Zd d Zd dZ ddZ ddZ e Z dS)_SixMetaPathImporterz A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 cCs||_i|_dS)N)r known_modules)r Zsix_module_namer r r rsz_SixMetaPathImporter.__init__cGs&x |D]}||j|jd|<qWdS)N.)r:r)r r)Z fullnamesfullnamer r r _add_modules z _SixMetaPathImporter._add_modulecCs|j|jd|S)Nr;)r:r)r r<r r r _get_modulesz _SixMetaPathImporter._get_moduleNcCs||jkr|SdS)N)r:)r r<pathr r r find_modules z _SixMetaPathImporter.find_modulec Cs0y |j|Stk r*td|YnXdS)Nz!This loader does not know module )r:KeyError ImportError)r r<r r r Z __get_modules z!_SixMetaPathImporter.__get_modulec CsRy tj|Stk rYnX|j|}t|tr>|j}n||_|tj|<|S)N)rrrA _SixMetaPathImporter__get_module isinstancer&r __loader__)r r<r)r r r load_modules     z _SixMetaPathImporter.load_modulecCst|j|dS)z Return true, if the named module is a package. We need this method to get correct spec objects with Python 3.4 (see PEP451) __path__)hasattrrC)r r<r r r is_packagesz_SixMetaPathImporter.is_packagecCs|j|dS)z;Return None Required, if is_package is implementedN)rC)r r<r r r get_codes z_SixMetaPathImporter.get_code)N) rrrrrr=r>r@rCrFrIrJ get_sourcer r r r r9s  r9c@seZdZdZgZdS) _MovedItemszLazy loading of moved objectsN)rrrrrGr r r r rLsrLZ cStringIOioStringIOfilter itertoolsbuiltinsZifilter filterfalseZ ifilterfalseinputZ __builtin__Z raw_inputinternrmapimapgetcwdosZgetcwdugetcwdbrangeZxrangeZ reload_module importlibZimpreloadreduce functoolsZ shlex_quoteZpipesZshlexZquoteUserDict collectionsUserList UserStringzipZizip zip_longestZ izip_longestZ configparserZ ConfigParsercopyregZcopy_regZdbm_gnuZgdbmzdbm.gnuZ _dummy_threadZ dummy_threadZhttp_cookiejarZ cookielibzhttp.cookiejarZ http_cookiesZCookiez http.cookiesZ html_entitiesZhtmlentitydefsz html.entitiesZ html_parserZ HTMLParserz html.parserZ http_clientZhttplibz http.clientZemail_mime_multipartzemail.MIMEMultipartzemail.mime.multipartZemail_mime_nonmultipartzemail.MIMENonMultipartzemail.mime.nonmultipartZemail_mime_textzemail.MIMETextzemail.mime.textZemail_mime_basezemail.MIMEBasezemail.mime.baseZBaseHTTPServerz http.serverZ CGIHTTPServerZSimpleHTTPServerZcPicklepickleZqueueZQueuereprlibreprZ socketserverZ SocketServer_threadZthreadZtkinterZTkinterZtkinter_dialogZDialogztkinter.dialogZtkinter_filedialogZ FileDialogztkinter.filedialogZtkinter_scrolledtextZ ScrolledTextztkinter.scrolledtextZtkinter_simpledialogZ SimpleDialogztkinter.simpledialogZ tkinter_tixZTixz tkinter.tixZ tkinter_ttkZttkz tkinter.ttkZtkinter_constantsZ Tkconstantsztkinter.constantsZ tkinter_dndZTkdndz tkinter.dndZtkinter_colorchooserZtkColorChooserztkinter.colorchooserZtkinter_commondialogZtkCommonDialogztkinter.commondialogZtkinter_tkfiledialogZ tkFileDialogZ tkinter_fontZtkFontz tkinter.fontZtkinter_messageboxZ tkMessageBoxztkinter.messageboxZtkinter_tksimpledialogZtkSimpleDialogZ urllib_parsez.moves.urllib_parsez urllib.parseZ urllib_errorz.moves.urllib_errorz urllib.errorZurllibz .moves.urllibZurllib_robotparser robotparserzurllib.robotparserZ xmlrpc_clientZ xmlrpclibz xmlrpc.clientZ xmlrpc_serverZSimpleXMLRPCServerz xmlrpc.serverZwin32winreg_winregzmoves.z.movesmovesc@seZdZdZdS)Module_six_moves_urllib_parsez7Lazy loading of moved objects in six.moves.urllib_parseN)rrrrr r r r rn@srnZ ParseResultZurlparseZ SplitResultZparse_qsZ parse_qslZ urldefragZurljoinZurlsplitZ urlunparseZ urlunsplitZ quote_plusZunquoteZ unquote_plusZ urlencodeZ splitqueryZsplittagZ splituserZ uses_fragmentZ uses_netlocZ uses_paramsZ uses_queryZ uses_relativezmoves.urllib_parsezmoves.urllib.parsec@seZdZdZdS)Module_six_moves_urllib_errorz7Lazy loading of moved objects in six.moves.urllib_errorN)rrrrr r r r rohsroZURLErrorZurllib2Z HTTPErrorZContentTooShortErrorz.moves.urllib.errorzmoves.urllib_errorzmoves.urllib.errorc@seZdZdZdS)Module_six_moves_urllib_requestz9Lazy loading of moved objects in six.moves.urllib_requestN)rrrrr r r r rp|srpZurlopenzurllib.requestZinstall_openerZ build_openerZ pathname2urlZ url2pathnameZ getproxiesZRequestZOpenerDirectorZHTTPDefaultErrorHandlerZHTTPRedirectHandlerZHTTPCookieProcessorZ ProxyHandlerZ BaseHandlerZHTTPPasswordMgrZHTTPPasswordMgrWithDefaultRealmZAbstractBasicAuthHandlerZHTTPBasicAuthHandlerZProxyBasicAuthHandlerZAbstractDigestAuthHandlerZHTTPDigestAuthHandlerZProxyDigestAuthHandlerZ HTTPHandlerZ HTTPSHandlerZ FileHandlerZ FTPHandlerZCacheFTPHandlerZUnknownHandlerZHTTPErrorProcessorZ urlretrieveZ urlcleanupZ URLopenerZFancyURLopenerZ proxy_bypassz.moves.urllib.requestzmoves.urllib_requestzmoves.urllib.requestc@seZdZdZdS) Module_six_moves_urllib_responsez:Lazy loading of moved objects in six.moves.urllib_responseN)rrrrr r r r rqsrqZaddbasezurllib.responseZ addclosehookZaddinfoZ addinfourlz.moves.urllib.responsezmoves.urllib_responsezmoves.urllib.responsec@seZdZdZdS)#Module_six_moves_urllib_robotparserz=Lazy loading of moved objects in six.moves.urllib_robotparserN)rrrrr r r r rrsrrZRobotFileParserz.moves.urllib.robotparserzmoves.urllib_robotparserzmoves.urllib.robotparserc@sNeZdZdZgZejdZejdZejdZ ejdZ ejdZ ddZ d S) Module_six_moves_urllibzICreate a six.moves.urllib namespace that resembles the Python 3 namespacezmoves.urllib_parsezmoves.urllib_errorzmoves.urllib_requestzmoves.urllib_responsezmoves.urllib_robotparsercCsdddddgS)Nparseerrorrequestresponserjr )r r r r r6szModule_six_moves_urllib.__dir__N) rrrrrG _importerr>rtrurvrwrjr6r r r r rss     rsz moves.urllibcCstt|j|dS)zAdd an item to six.moves.N)rrLr)Zmover r r add_movesrycCsXytt|WnDtk rRy tj|=Wn"tk rLtd|fYnXYnXdS)zRemove item from six.moves.zno such move, %rN)rrLr!rm__dict__rA)rr r r remove_moves r{__func____self__ __closure____code__ __defaults__ __globals__im_funcZim_selfZ func_closureZ func_codeZ func_defaultsZ func_globalscCs|jS)N)next)itr r r advance_iterator srcCstddt|jDS)Ncss|]}d|jkVqdS)__call__N)rz)r3klassr r r szcallable..)anytype__mro__)r"r r r callablesrcCs|S)Nr )unboundr r r get_unbound_functionsrcCs|S)Nr )rclsr r r create_unbound_methodsrcCs|jS)N)r)rr r r r"scCstj|||jS)N)types MethodTyper )rr"r r r create_bound_method%srcCstj|d|S)N)rr)rrr r r r(sc@seZdZddZdS)IteratorcCst|j|S)N)r__next__)r r r r r-sz Iterator.nextN)rrrrr r r r r+srz3Get the function out of a possibly unbound functioncKst|jf|S)N)iterkeys)dkwr r r iterkeys>srcKst|jf|S)N)rvalues)rrr r r itervaluesAsrcKst|jf|S)N)ritems)rrr r r iteritemsDsrcKst|jf|S)N)rZlists)rrr r r iterlistsGsrrrrcKs |jf|S)N)r)rrr r r rPscKs |jf|S)N)r)rrr r r rSscKs |jf|S)N)r)rrr r r rVscKs |jf|S)N)r)rrr r r rYsviewkeys viewvalues viewitemsz1Return an iterator over the keys of a dictionary.z3Return an iterator over the values of a dictionary.z?Return an iterator over the (key, value) pairs of a dictionary.zBReturn an iterator over the (key, [values]) pairs of a dictionary.cCs |jdS)Nzlatin-1)encode)sr r r bksrcCs|S)Nr )rr r r unsrz>BassertCountEqualZassertRaisesRegexpZassertRegexpMatchesassertRaisesRegex assertRegexcCs|S)Nr )rr r r rscCst|jdddS)Nz\\z\\\\Zunicode_escape)unicodereplace)rr r r rscCs t|dS)Nr)ord)Zbsr r r byte2intsrcCs t||S)N)r)Zbufir r r indexbytessrZassertItemsEqualz Byte literalz Text literalcOst|t||S)N)r,_assertCountEqual)r argskwargsr r r rscOst|t||S)N)r,_assertRaisesRegex)r rrr r r rscOst|t||S)N)r, _assertRegex)r rrr r r rsexeccCs*|dkr|}|j|k r"|j||dS)N) __traceback__with_traceback)r#r/tbr r r reraises   rcCsB|dkr*tjd}|j}|dkr&|j}~n |dkr6|}tddS)zExecute code in a namespace.Nrzexec _code_ in _globs_, _locs_)r _getframe f_globalsf_localsr)Z_code_Z_globs_Z_locs_framer r r exec_s rz9def reraise(tp, value, tb=None): raise tp, value, tb zrdef raise_from(value, from_value): if from_value is None: raise value raise value from from_value zCdef raise_from(value, from_value): raise value from from_value cCs|dS)Nr )r/Z from_valuer r r raise_fromsrprintc s6|jdtjdkrdSfdd}d}|jdd}|dk r`t|trNd}nt|ts`td|jd d}|dk rt|trd}nt|tstd |rtd |sx|D]}t|trd}PqW|rtd }td }nd }d }|dkr|}|dkr|}x,t|D] \} }| r||||qW||dS)z4The new-style print function for Python 2.4 and 2.5.fileNcsdt|tst|}ttrVt|trVjdk rVtdd}|dkrHd}|jj|}j|dS)Nerrorsstrict) rD basestringstrrrencodingr,rwrite)datar)fpr r rs     zprint_..writeFsepTzsep must be None or a stringendzend must be None or a stringz$invalid keyword arguments to print()  )poprstdoutrDrr TypeError enumerate) rrrZ want_unicoderrargnewlineZspacerr )rr print_sL           rcOs<|jdtj}|jdd}t|||r8|dk r8|jdS)NrflushF)getrrr_printr)rrrrr r r r s    zReraise an exception.csfdd}|S)Ncstj|}|_|S)N)r^wraps __wrapped__)f)assignedupdatedwrappedr r wrapperszwraps..wrapperr )rrrrr )rrrr rsrcs&Gfddd}tj|dfiS)z%Create a base class with a metaclass.cseZdZfddZdS)z!with_metaclass..metaclasscs ||S)Nr )rrZ this_basesr)basesmetar r __new__'sz)with_metaclass..metaclass.__new__N)rrrrr )rrr r metaclass%srZtemporary_class)rr)rrrr )rrr with_metaclass srcsfdd}|S)z6Class decorator for creating a class with a metaclass.csl|jj}|jd}|dk rDt|tr,|g}x|D]}|j|q2W|jdd|jdd|j|j|S)N __slots__rz __weakref__)rzcopyrrDrrr __bases__)rZ orig_varsslotsZ slots_var)rr r r.s      zadd_metaclass..wrapperr )rrr )rr add_metaclass,s rcCs2tr.d|jkrtd|j|j|_dd|_|S)a A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. __str__zY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cSs|jjdS)Nzutf-8) __unicode__r)r r r r Jsz-python_2_unicode_compatible..)PY2rz ValueErrorrrr)rr r r python_2_unicode_compatible<s   r__spec__)rrlilill)N)NN)rr)rr)rr)rr)rZ __future__rr^rPoperatorrr __author__ __version__ version_inforr(ZPY34rZ string_typesintZ integer_typesrZ class_typesZ text_typebytesZ binary_typemaxsizeZMAXSIZErZlongZ ClassTyperplatform startswithobjectr len OverflowErrorrrrr& ModuleTyper2r7r9rrxrLr5r-rrrDr=rmrnZ_urllib_parse_moved_attributesroZ_urllib_error_moved_attributesrpZ _urllib_request_moved_attributesrqZ!_urllib_response_moved_attributesrrZ$_urllib_robotparser_moved_attributesrsryr{Z _meth_funcZ _meth_selfZ _func_closureZ _func_codeZ_func_defaultsZ _func_globalsrr NameErrorrrrrrr attrgetterZget_method_functionZget_method_selfZget_function_closureZget_function_codeZget_function_defaultsZget_function_globalsrrrr methodcallerrrrrrchrZunichrstructStructpackZint2byte itemgetterrgetitemrrZ iterbytesrMrNBytesIOrrrpartialrVrrrrr,rQrrrrrWRAPPER_ASSIGNMENTSWRAPPER_UPDATESrrrrrG __package__globalsrrsubmodule_search_locations meta_pathrrZimporterappendr r r r s     >                                                                                                                                                          5     PK!Z_Z_&_vendor/__pycache__/six.cpython-36.pycnu[3 9fuI@srdZddlmZddlZddlZddlZddlZddlZdZdZ ej ddkZ ej ddkZ ej dddzkZ e refZefZefZeZeZejZnefZeefZeejfZeZeZejjd red|ZnLGd d d eZ ye!e Wn e"k r ed~ZYn XedZ[ ddZ#ddZ$GdddeZ%Gddde%Z&Gdddej'Z(Gddde%Z)GdddeZ*e*e+Z,Gddde(Z-e)ddd d!e)d"d#d$d%d"e)d&d#d#d'd&e)d(d)d$d*d(e)d+d)d,e)d-d#d$d.d-e)d/d0d0d1d/e)d2d0d0d/d2e)d3d)d$d4d3e)d5d)e rd6nd7d8e)d9d)d:e)d;de)d!d!d e)d?d?d@e)dAdAd@e)dBdBd@e)d4d)d$d4d3e)dCd#d$dDdCe)dEd#d#dFdEe&d$d)e&dGdHe&dIdJe&dKdLdMe&dNdOdNe&dPdQdRe&dSdTdUe&dVdWdXe&dYdZd[e&d\d]d^e&d_d`dae&dbdcdde&dedfdge&dhdidje&dkdkdle&dmdmdle&dndndle&dododpe&dqdre&dsdte&dudve&dwdxdwe&dydze&d{d|d}e&d~dde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&de+dde&de+dde&de+de+de&ddde&ddde&dddg>Z.ejdkrZe.e&ddg7Z.x:e.D]2Z/e0e-e/j1e/e2e/e&r`e,j3e/de/j1q`W[/e.e-_.e-e+dZ4e,j3e4dGddde(Z5e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)d>dde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddgZ6xe6D]Z/e0e5e/j1e/qW[/e6e5_.e,j3e5e+dddӃGddՄde(Z7e)ddde)ddde)dddgZ8xe8D]Z/e0e7e/j1e/q$W[/e8e7_.e,j3e7e+ddd܃Gddބde(Z9e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddg!Z:xe:D]Z/e0e9e/j1e/qW[/e:e9_.e,j3e9e+dddGddde(Z;e)ddde)ddde)d dde)d ddgZxe>D]Z/e0e=e/j1e/qW[/e>e=_.e,j3e=e+dddGdddej'Z?e,j3e?e+ddddZ@ddZAe rjdZBdZCdZDdZEdZFd ZGn$d!ZBd"ZCd#ZDd$ZEd%ZFd&ZGyeHZIWn"eJk rd'd(ZIYnXeIZHyeKZKWn"eJk rd)d*ZKYnXe rd+d,ZLejMZNd-d.ZOeZPn>d/d,ZLd0d1ZNd2d.ZOGd3d4d4eZPeKZKe#eLd5ejQeBZRejQeCZSejQeDZTejQeEZUejQeFZVejQeGZWe rd6d7ZXd8d9ZYd:d;ZZd<d=Z[ej\d>Z]ej\d?Z^ej\d@Z_nTdAd7ZXdBd9ZYdCd;ZZdDd=Z[ej\dEZ]ej\dFZ^ej\dGZ_e#eXdHe#eYdIe#eZdJe#e[dKe rdLdMZ`dNdOZaebZcddldZdedjedPjfZg[dejhdZiejjZkelZmddlnZnenjoZoenjpZpdQZqej d d k rdRZrdSZsn dTZrdUZsnjdVdMZ`dWdOZaecZcebZgdXdYZidZd[ZkejtejuevZmddloZoeojoZoZpd\ZqdRZrdSZse#e`d]e#ead^d_dQZwd`dTZxdadUZye reze4j{dbZ|ddcddZ}nddedfZ|e|dgej dddk re|dhn.ej dddk r8e|din djdkZ~eze4j{dldZedk rjdmdnZej dddk reZdodnZe#e}dpej dddk rejejfdqdrZnejZdsdtZdudvZdwdxZgZe+Zejdydk rge_ejrbx>eejD]0\ZZeej+dkr*ej1e+kr*eje=Pq*W[[ejje,dS(z6Utilities for writing code that runs on Python 2 and 3)absolute_importNz'Benjamin Peterson z1.10.0javac@seZdZddZdS)XcCsdS)Nrrl)selfr r /usr/lib/python3.6/six.py__len__>sz X.__len__N)__name__ __module__ __qualname__r r r r r r <sr ?cCs ||_dS)z Add documentation to a function.N)__doc__)funcdocr r r _add_docKsrcCst|tj|S)z7Import module, returning the module after the last dot.) __import__sysmodules)namer r r _import_modulePsrc@seZdZddZddZdS) _LazyDescrcCs ||_dS)N)r)r rr r r __init__Xsz_LazyDescr.__init__c CsB|j}t||j|yt|j|jWntk r<YnX|S)N)_resolvesetattrrdelattr __class__AttributeError)r objtpresultr r r __get__[sz_LazyDescr.__get__N)rrrrr%r r r r rVsrcs.eZdZdfdd ZddZddZZS) MovedModuleNcs2tt|j|tr(|dkr |}||_n||_dS)N)superr&rPY3mod)r roldnew)r r r ris zMovedModule.__init__cCs t|jS)N)rr))r r r r rrszMovedModule._resolvecCs"|j}t||}t||||S)N)rgetattrr)r attr_modulevaluer r r __getattr__us  zMovedModule.__getattr__)N)rrrrrr0 __classcell__r r )r r r&gs r&cs(eZdZfddZddZgZZS) _LazyModulecstt|j||jj|_dS)N)r'r2rr r)r r)r r r r~sz_LazyModule.__init__cCs ddg}|dd|jD7}|S)NrrcSsg|] }|jqSr )r).0r-r r r sz'_LazyModule.__dir__..)_moved_attributes)r Zattrsr r r __dir__sz_LazyModule.__dir__)rrrrr6r5r1r r )r r r2|s r2cs&eZdZdfdd ZddZZS)MovedAttributeNcsdtt|j|trH|dkr |}||_|dkr@|dkr<|}n|}||_n||_|dkrZ|}||_dS)N)r'r7rr(r)r-)r rZold_modZnew_modZold_attrZnew_attr)r r r rszMovedAttribute.__init__cCst|j}t||jS)N)rr)r,r-)r moduler r r rs zMovedAttribute._resolve)NN)rrrrrr1r r )r r r7sr7c@sVeZdZdZddZddZddZdd d Zd d Zd dZ ddZ ddZ e Z dS)_SixMetaPathImporterz A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 cCs||_i|_dS)N)r known_modules)r Zsix_module_namer r r rsz_SixMetaPathImporter.__init__cGs&x |D]}||j|jd|<qWdS)N.)r:r)r r)Z fullnamesfullnamer r r _add_modules z _SixMetaPathImporter._add_modulecCs|j|jd|S)Nr;)r:r)r r<r r r _get_modulesz _SixMetaPathImporter._get_moduleNcCs||jkr|SdS)N)r:)r r<pathr r r find_modules z _SixMetaPathImporter.find_modulec Cs0y |j|Stk r*td|YnXdS)Nz!This loader does not know module )r:KeyError ImportError)r r<r r r Z __get_modules z!_SixMetaPathImporter.__get_modulec CsRy tj|Stk rYnX|j|}t|tr>|j}n||_|tj|<|S)N)rrrA _SixMetaPathImporter__get_module isinstancer&r __loader__)r r<r)r r r load_modules     z _SixMetaPathImporter.load_modulecCst|j|dS)z Return true, if the named module is a package. We need this method to get correct spec objects with Python 3.4 (see PEP451) __path__)hasattrrC)r r<r r r is_packagesz_SixMetaPathImporter.is_packagecCs|j|dS)z;Return None Required, if is_package is implementedN)rC)r r<r r r get_codes z_SixMetaPathImporter.get_code)N) rrrrrr=r>r@rCrFrIrJ get_sourcer r r r r9s  r9c@seZdZdZgZdS) _MovedItemszLazy loading of moved objectsN)rrrrrGr r r r rLsrLZ cStringIOioStringIOfilter itertoolsbuiltinsZifilter filterfalseZ ifilterfalseinputZ __builtin__Z raw_inputinternrmapimapgetcwdosZgetcwdugetcwdbrangeZxrangeZ reload_module importlibZimpreloadreduce functoolsZ shlex_quoteZpipesZshlexZquoteUserDict collectionsUserList UserStringzipZizip zip_longestZ izip_longestZ configparserZ ConfigParsercopyregZcopy_regZdbm_gnuZgdbmzdbm.gnuZ _dummy_threadZ dummy_threadZhttp_cookiejarZ cookielibzhttp.cookiejarZ http_cookiesZCookiez http.cookiesZ html_entitiesZhtmlentitydefsz html.entitiesZ html_parserZ HTMLParserz html.parserZ http_clientZhttplibz http.clientZemail_mime_multipartzemail.MIMEMultipartzemail.mime.multipartZemail_mime_nonmultipartzemail.MIMENonMultipartzemail.mime.nonmultipartZemail_mime_textzemail.MIMETextzemail.mime.textZemail_mime_basezemail.MIMEBasezemail.mime.baseZBaseHTTPServerz http.serverZ CGIHTTPServerZSimpleHTTPServerZcPicklepickleZqueueZQueuereprlibreprZ socketserverZ SocketServer_threadZthreadZtkinterZTkinterZtkinter_dialogZDialogztkinter.dialogZtkinter_filedialogZ FileDialogztkinter.filedialogZtkinter_scrolledtextZ ScrolledTextztkinter.scrolledtextZtkinter_simpledialogZ SimpleDialogztkinter.simpledialogZ tkinter_tixZTixz tkinter.tixZ tkinter_ttkZttkz tkinter.ttkZtkinter_constantsZ Tkconstantsztkinter.constantsZ tkinter_dndZTkdndz tkinter.dndZtkinter_colorchooserZtkColorChooserztkinter.colorchooserZtkinter_commondialogZtkCommonDialogztkinter.commondialogZtkinter_tkfiledialogZ tkFileDialogZ tkinter_fontZtkFontz tkinter.fontZtkinter_messageboxZ tkMessageBoxztkinter.messageboxZtkinter_tksimpledialogZtkSimpleDialogZ urllib_parsez.moves.urllib_parsez urllib.parseZ urllib_errorz.moves.urllib_errorz urllib.errorZurllibz .moves.urllibZurllib_robotparser robotparserzurllib.robotparserZ xmlrpc_clientZ xmlrpclibz xmlrpc.clientZ xmlrpc_serverZSimpleXMLRPCServerz xmlrpc.serverZwin32winreg_winregzmoves.z.movesmovesc@seZdZdZdS)Module_six_moves_urllib_parsez7Lazy loading of moved objects in six.moves.urllib_parseN)rrrrr r r r rn@srnZ ParseResultZurlparseZ SplitResultZparse_qsZ parse_qslZ urldefragZurljoinZurlsplitZ urlunparseZ urlunsplitZ quote_plusZunquoteZ unquote_plusZ urlencodeZ splitqueryZsplittagZ splituserZ uses_fragmentZ uses_netlocZ uses_paramsZ uses_queryZ uses_relativezmoves.urllib_parsezmoves.urllib.parsec@seZdZdZdS)Module_six_moves_urllib_errorz7Lazy loading of moved objects in six.moves.urllib_errorN)rrrrr r r r rohsroZURLErrorZurllib2Z HTTPErrorZContentTooShortErrorz.moves.urllib.errorzmoves.urllib_errorzmoves.urllib.errorc@seZdZdZdS)Module_six_moves_urllib_requestz9Lazy loading of moved objects in six.moves.urllib_requestN)rrrrr r r r rp|srpZurlopenzurllib.requestZinstall_openerZ build_openerZ pathname2urlZ url2pathnameZ getproxiesZRequestZOpenerDirectorZHTTPDefaultErrorHandlerZHTTPRedirectHandlerZHTTPCookieProcessorZ ProxyHandlerZ BaseHandlerZHTTPPasswordMgrZHTTPPasswordMgrWithDefaultRealmZAbstractBasicAuthHandlerZHTTPBasicAuthHandlerZProxyBasicAuthHandlerZAbstractDigestAuthHandlerZHTTPDigestAuthHandlerZProxyDigestAuthHandlerZ HTTPHandlerZ HTTPSHandlerZ FileHandlerZ FTPHandlerZCacheFTPHandlerZUnknownHandlerZHTTPErrorProcessorZ urlretrieveZ urlcleanupZ URLopenerZFancyURLopenerZ proxy_bypassz.moves.urllib.requestzmoves.urllib_requestzmoves.urllib.requestc@seZdZdZdS) Module_six_moves_urllib_responsez:Lazy loading of moved objects in six.moves.urllib_responseN)rrrrr r r r rqsrqZaddbasezurllib.responseZ addclosehookZaddinfoZ addinfourlz.moves.urllib.responsezmoves.urllib_responsezmoves.urllib.responsec@seZdZdZdS)#Module_six_moves_urllib_robotparserz=Lazy loading of moved objects in six.moves.urllib_robotparserN)rrrrr r r r rrsrrZRobotFileParserz.moves.urllib.robotparserzmoves.urllib_robotparserzmoves.urllib.robotparserc@sNeZdZdZgZejdZejdZejdZ ejdZ ejdZ ddZ d S) Module_six_moves_urllibzICreate a six.moves.urllib namespace that resembles the Python 3 namespacezmoves.urllib_parsezmoves.urllib_errorzmoves.urllib_requestzmoves.urllib_responsezmoves.urllib_robotparsercCsdddddgS)Nparseerrorrequestresponserjr )r r r r r6szModule_six_moves_urllib.__dir__N) rrrrrG _importerr>rtrurvrwrjr6r r r r rss     rsz moves.urllibcCstt|j|dS)zAdd an item to six.moves.N)rrLr)Zmover r r add_movesrycCsXytt|WnDtk rRy tj|=Wn"tk rLtd|fYnXYnXdS)zRemove item from six.moves.zno such move, %rN)rrLr!rm__dict__rA)rr r r remove_moves r{__func____self__ __closure____code__ __defaults__ __globals__im_funcZim_selfZ func_closureZ func_codeZ func_defaultsZ func_globalscCs|jS)N)next)itr r r advance_iterator srcCstddt|jDS)Ncss|]}d|jkVqdS)__call__N)rz)r3klassr r r szcallable..)anytype__mro__)r"r r r callablesrcCs|S)Nr )unboundr r r get_unbound_functionsrcCs|S)Nr )rclsr r r create_unbound_methodsrcCs|jS)N)r)rr r r r"scCstj|||jS)N)types MethodTyper )rr"r r r create_bound_method%srcCstj|d|S)N)rr)rrr r r r(sc@seZdZddZdS)IteratorcCst|j|S)N)r__next__)r r r r r-sz Iterator.nextN)rrrrr r r r r+srz3Get the function out of a possibly unbound functioncKst|jf|S)N)iterkeys)dkwr r r iterkeys>srcKst|jf|S)N)rvalues)rrr r r itervaluesAsrcKst|jf|S)N)ritems)rrr r r iteritemsDsrcKst|jf|S)N)rZlists)rrr r r iterlistsGsrrrrcKs |jf|S)N)r)rrr r r rPscKs |jf|S)N)r)rrr r r rSscKs |jf|S)N)r)rrr r r rVscKs |jf|S)N)r)rrr r r rYsviewkeys viewvalues viewitemsz1Return an iterator over the keys of a dictionary.z3Return an iterator over the values of a dictionary.z?Return an iterator over the (key, value) pairs of a dictionary.zBReturn an iterator over the (key, [values]) pairs of a dictionary.cCs |jdS)Nzlatin-1)encode)sr r r bksrcCs|S)Nr )rr r r unsrz>BassertCountEqualZassertRaisesRegexpZassertRegexpMatchesassertRaisesRegex assertRegexcCs|S)Nr )rr r r rscCst|jdddS)Nz\\z\\\\Zunicode_escape)unicodereplace)rr r r rscCs t|dS)Nr)ord)Zbsr r r byte2intsrcCs t||S)N)r)Zbufir r r indexbytessrZassertItemsEqualz Byte literalz Text literalcOst|t||S)N)r,_assertCountEqual)r argskwargsr r r rscOst|t||S)N)r,_assertRaisesRegex)r rrr r r rscOst|t||S)N)r, _assertRegex)r rrr r r rsexeccCs*|dkr|}|j|k r"|j||dS)N) __traceback__with_traceback)r#r/tbr r r reraises   rcCsB|dkr*tjd}|j}|dkr&|j}~n |dkr6|}tddS)zExecute code in a namespace.Nrzexec _code_ in _globs_, _locs_)r _getframe f_globalsf_localsr)Z_code_Z_globs_Z_locs_framer r r exec_s rz9def reraise(tp, value, tb=None): raise tp, value, tb zrdef raise_from(value, from_value): if from_value is None: raise value raise value from from_value zCdef raise_from(value, from_value): raise value from from_value cCs|dS)Nr )r/Z from_valuer r r raise_fromsrprintc s6|jdtjdkrdSfdd}d}|jdd}|dk r`t|trNd}nt|ts`td|jd d}|dk rt|trd}nt|tstd |rtd |sx|D]}t|trd}PqW|rtd }td }nd }d }|dkr|}|dkr|}x,t|D] \} }| r||||qW||dS)z4The new-style print function for Python 2.4 and 2.5.fileNcsdt|tst|}ttrVt|trVjdk rVtdd}|dkrHd}|jj|}j|dS)Nerrorsstrict) rD basestringstrrrencodingr,rwrite)datar)fpr r rs     zprint_..writeFsepTzsep must be None or a stringendzend must be None or a stringz$invalid keyword arguments to print()  )poprstdoutrDrr TypeError enumerate) rrrZ want_unicoderrargnewlineZspacerr )rr print_sL           rcOs<|jdtj}|jdd}t|||r8|dk r8|jdS)NrflushF)getrrr_printr)rrrrr r r r s    zReraise an exception.csfdd}|S)Ncstj|}|_|S)N)r^wraps __wrapped__)f)assignedupdatedwrappedr r wrapperszwraps..wrapperr )rrrrr )rrrr rsrcs&Gfddd}tj|dfiS)z%Create a base class with a metaclass.cseZdZfddZdS)z!with_metaclass..metaclasscs ||S)Nr )rrZ this_basesr)basesmetar r __new__'sz)with_metaclass..metaclass.__new__N)rrrrr )rrr r metaclass%srZtemporary_class)rr)rrrr )rrr with_metaclass srcsfdd}|S)z6Class decorator for creating a class with a metaclass.csl|jj}|jd}|dk rDt|tr,|g}x|D]}|j|q2W|jdd|jdd|j|j|S)N __slots__rz __weakref__)rzcopyrrDrrr __bases__)rZ orig_varsslotsZ slots_var)rr r r.s      zadd_metaclass..wrapperr )rrr )rr add_metaclass,s rcCs2tr.d|jkrtd|j|j|_dd|_|S)a A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. __str__zY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cSs|jjdS)Nzutf-8) __unicode__r)r r r r Jsz-python_2_unicode_compatible..)PY2rz ValueErrorrrr)rr r r python_2_unicode_compatible<s   r__spec__)rrlilill)N)NN)rr)rr)rr)rr)rZ __future__rr^rPoperatorrr __author__ __version__ version_inforr(ZPY34rZ string_typesintZ integer_typesrZ class_typesZ text_typebytesZ binary_typemaxsizeZMAXSIZErZlongZ ClassTyperplatform startswithobjectr len OverflowErrorrrrr& ModuleTyper2r7r9rrxrLr5r-rrrDr=rmrnZ_urllib_parse_moved_attributesroZ_urllib_error_moved_attributesrpZ _urllib_request_moved_attributesrqZ!_urllib_response_moved_attributesrrZ$_urllib_robotparser_moved_attributesrsryr{Z _meth_funcZ _meth_selfZ _func_closureZ _func_codeZ_func_defaultsZ _func_globalsrr NameErrorrrrrrr attrgetterZget_method_functionZget_method_selfZget_function_closureZget_function_codeZget_function_defaultsZget_function_globalsrrrr methodcallerrrrrrchrZunichrstructStructpackZint2byte itemgetterrgetitemrrZ iterbytesrMrNBytesIOrrrpartialrVrrrrr,rQrrrrrWRAPPER_ASSIGNMENTSWRAPPER_UPDATESrrrrrG __package__globalsrrsubmodule_search_locations meta_pathrrZimporterappendr r r r s     >                                                                                                                                                          5     PK!YH<_vendor/packaging/__pycache__/__about__.cpython-36.opt-1.pycnu[3 9f@sPddlmZmZmZdddddddd gZd Zd Zd Zd ZdZ dZ dZ de Z dS))absolute_importdivisionprint_function __title__ __summary____uri__ __version__ __author__ __email__ __license__ __copyright__Z packagingz"Core utilities for Python packagesz!https://github.com/pypa/packagingz16.8z)Donald Stufft and individual contributorszdonald@stufft.ioz"BSD or Apache License, Version 2.0zCopyright 2014-2016 %sN) Z __future__rrr__all__rrrrr r r r rr/usr/lib/python3.6/__about__.pys  PK!YH6_vendor/packaging/__pycache__/__about__.cpython-36.pycnu[3 9f@sPddlmZmZmZdddddddd gZd Zd Zd Zd ZdZ dZ dZ de Z dS))absolute_importdivisionprint_function __title__ __summary____uri__ __version__ __author__ __email__ __license__ __copyright__Z packagingz"Core utilities for Python packagesz!https://github.com/pypa/packagingz16.8z)Donald Stufft and individual contributorszdonald@stufft.ioz"BSD or Apache License, Version 2.0zCopyright 2014-2016 %sN) Z __future__rrr__all__rrrrr r r r rr/usr/lib/python3.6/__about__.pys  PK!%;_vendor/packaging/__pycache__/__init__.cpython-36.opt-1.pycnu[3 9f@sTddlmZmZmZddlmZmZmZmZm Z m Z m Z m Z dddddd d d gZ d S) )absolute_importdivisionprint_function) __author__ __copyright__ __email__ __license__ __summary__ __title____uri__ __version__r r r r rrr rN)Z __future__rrr __about__rrrr r r r r __all__rr/usr/lib/python3.6/__init__.pys( PK!%5_vendor/packaging/__pycache__/__init__.cpython-36.pycnu[3 9f@sTddlmZmZmZddlmZmZmZmZm Z m Z m Z m Z dddddd d d gZ d S) )absolute_importdivisionprint_function) __author__ __copyright__ __email__ __license__ __summary__ __title____uri__ __version__r r r r rrr rN)Z __future__rrr __about__rrrr r r r r __all__rr/usr/lib/python3.6/__init__.pys( PK!:_vendor/packaging/__pycache__/_compat.cpython-36.opt-1.pycnu[3 9f\@sVddlmZmZmZddlZejddkZejddkZerDefZ ne fZ ddZ dS))absolute_importdivisionprint_functionNcs&Gfddd}tj|dfiS)z/ Create a base class with a metaclass. cseZdZfddZdS)z!with_metaclass..metaclasscs ||S)N)clsnameZ this_basesd)basesmetar/usr/lib/python3.6/_compat.py__new__sz)with_metaclass..metaclass.__new__N)__name__ __module__ __qualname__rr)r r rr metaclasssrZtemporary_class)typer)r r rr)r r r with_metaclasssr) Z __future__rrrsys version_infoZPY2ZPY3strZ string_typesZ basestringrrrrr sPK!4_vendor/packaging/__pycache__/_compat.cpython-36.pycnu[3 9f\@sVddlmZmZmZddlZejddkZejddkZerDefZ ne fZ ddZ dS))absolute_importdivisionprint_functionNcs&Gfddd}tj|dfiS)z/ Create a base class with a metaclass. cseZdZfddZdS)z!with_metaclass..metaclasscs ||S)N)clsnameZ this_basesd)basesmetar/usr/lib/python3.6/_compat.py__new__sz)with_metaclass..metaclass.__new__N)__name__ __module__ __qualname__rr)r r rr metaclasssrZtemporary_class)typer)r r rr)r r r with_metaclasssr) Z __future__rrrsys version_infoZPY2ZPY3strZ string_typesZ basestringrrrrr sPK!v >_vendor/packaging/__pycache__/_structures.cpython-36.opt-1.pycnu[3 9f@sDddlmZmZmZGdddeZeZGdddeZeZdS))absolute_importdivisionprint_functionc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)InfinitycCsdS)Nr)selfrr!/usr/lib/python3.6/_structures.py__repr__ szInfinity.__repr__cCs tt|S)N)hashrepr)rrrr__hash__ szInfinity.__hash__cCsdS)NFr)rotherrrr__lt__szInfinity.__lt__cCsdS)NFr)rr rrr__le__szInfinity.__le__cCs t||jS)N) isinstance __class__)rr rrr__eq__szInfinity.__eq__cCst||j S)N)rr)rr rrr__ne__szInfinity.__ne__cCsdS)NTr)rr rrr__gt__szInfinity.__gt__cCsdS)NTr)rr rrr__ge__szInfinity.__ge__cCstS)N)NegativeInfinity)rrrr__neg__!szInfinity.__neg__N) __name__ __module__ __qualname__r r rrrrrrrrrrrrsrc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)rcCsdS)Nz -Infinityr)rrrrr )szNegativeInfinity.__repr__cCs tt|S)N)r r )rrrrr ,szNegativeInfinity.__hash__cCsdS)NTr)rr rrrr/szNegativeInfinity.__lt__cCsdS)NTr)rr rrrr2szNegativeInfinity.__le__cCs t||jS)N)rr)rr rrrr5szNegativeInfinity.__eq__cCst||j S)N)rr)rr rrrr8szNegativeInfinity.__ne__cCsdS)NFr)rr rrrr;szNegativeInfinity.__gt__cCsdS)NFr)rr rrrr>szNegativeInfinity.__ge__cCstS)N)r)rrrrrAszNegativeInfinity.__neg__N) rrrr r rrrrrrrrrrrr'srN)Z __future__rrrobjectrrrrrrsPK!v 8_vendor/packaging/__pycache__/_structures.cpython-36.pycnu[3 9f@sDddlmZmZmZGdddeZeZGdddeZeZdS))absolute_importdivisionprint_functionc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)InfinitycCsdS)Nr)selfrr!/usr/lib/python3.6/_structures.py__repr__ szInfinity.__repr__cCs tt|S)N)hashrepr)rrrr__hash__ szInfinity.__hash__cCsdS)NFr)rotherrrr__lt__szInfinity.__lt__cCsdS)NFr)rr rrr__le__szInfinity.__le__cCs t||jS)N) isinstance __class__)rr rrr__eq__szInfinity.__eq__cCst||j S)N)rr)rr rrr__ne__szInfinity.__ne__cCsdS)NTr)rr rrr__gt__szInfinity.__gt__cCsdS)NTr)rr rrr__ge__szInfinity.__ge__cCstS)N)NegativeInfinity)rrrr__neg__!szInfinity.__neg__N) __name__ __module__ __qualname__r r rrrrrrrrrrrrsrc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)rcCsdS)Nz -Infinityr)rrrrr )szNegativeInfinity.__repr__cCs tt|S)N)r r )rrrrr ,szNegativeInfinity.__hash__cCsdS)NTr)rr rrrr/szNegativeInfinity.__lt__cCsdS)NTr)rr rrrr2szNegativeInfinity.__le__cCs t||jS)N)rr)rr rrrr5szNegativeInfinity.__eq__cCst||j S)N)rr)rr rrrr8szNegativeInfinity.__ne__cCsdS)NFr)rr rrrr;szNegativeInfinity.__gt__cCsdS)NFr)rr rrrr>szNegativeInfinity.__ge__cCstS)N)r)rrrrrAszNegativeInfinity.__neg__N) rrrr r rrrrrrrrrrrr'srN)Z __future__rrrobjectrrrrrrsPK!g!!:_vendor/packaging/__pycache__/markers.cpython-36.opt-1.pycnu[3 9f/ @s@ddlmZmZmZddlZddlZddlZddlZddlm Z m Z m Z m Z ddlm Z mZmZmZddlmZddlmZddlmZmZd d d d d gZGdd d eZGdd d eZGdd d eZGdddeZGdddeZGdddeZ GdddeZ!ededBedBedBedBedBedBed Bed!Bed"Bed#Bed$Bed%Bed&Bed'Bed(Bed)Bed*BZ"d#d"ddddd+Z#e"j$d,d-ed.ed/Bed0Bed1Bed2Bed3Bed4Bed5BZ%e%ed6Bed7BZ&e&j$d8d-ed9ed:BZ'e'j$d;d-ed<ed=BZ(e"e'BZ)ee)e&e)Z*e*j$d>d-ed?j+Z,ed@j+Z-eZ.e*ee,e.e-BZ/e.e/e e(e.>e e.e Z0dAdBZ1dSdDdEZ2dFd-dGd-ej3ej4ej5ej6ej7ej8dHZ9dIdJZ:eZ;dKdLZdQd Z?GdRd d eZ@dS)T)absolute_importdivisionprint_functionN)ParseException ParseResults stringStart stringEnd) ZeroOrMoreGroupForward QuotedString)Literal) string_types) SpecifierInvalidSpecifier InvalidMarkerUndefinedComparisonUndefinedEnvironmentNameMarkerdefault_environmentc@seZdZdZdS)rzE An invalid marker was found, users should refer to PEP 508. N)__name__ __module__ __qualname____doc__rr/usr/lib/python3.6/markers.pyrsc@seZdZdZdS)rzP An invalid operation was attempted on a value that doesn't support it. N)rrrrrrrrrsc@seZdZdZdS)rz\ A name was attempted to be used that does not exist inside of the environment. N)rrrrrrrrr%sc@s,eZdZddZddZddZddZd S) NodecCs ||_dS)N)value)selfrrrr__init__.sz Node.__init__cCs t|jS)N)strr)rrrr__str__1sz Node.__str__cCsdj|jjt|S)Nz <{0}({1!r})>)format __class__rr!)rrrr__repr__4sz Node.__repr__cCstdS)N)NotImplementedError)rrrr serialize7szNode.serializeN)rrrr r"r%r'rrrrr,src@seZdZddZdS)VariablecCst|S)N)r!)rrrrr'=szVariable.serializeN)rrrr'rrrrr(;sr(c@seZdZddZdS)ValuecCs dj|S)Nz"{0}")r#)rrrrr'CszValue.serializeN)rrrr'rrrrr)Asr)c@seZdZddZdS)OpcCst|S)N)r!)rrrrr'Isz Op.serializeN)rrrr'rrrrr*Gsr*implementation_versionplatform_python_implementationimplementation_namepython_full_versionplatform_releaseplatform_versionplatform_machineplatform_systempython_version sys_platformos_namezos.namez sys.platformzplatform.versionzplatform.machinezplatform.python_implementationpython_implementationZextra)zos.namez sys.platformzplatform.versionzplatform.machinezplatform.python_implementationr6cCsttj|d|dS)Nr)r(ALIASESget)sltrrrisr<z===z==z>=z<=z!=z~=>sz(_coerce_parse_result..) isinstancer)resultsrrrrGs rGTcCst|tr4t|dkr4t|dttfr4t|dSt|trndd|D}|rZdj|Sddj|dSn"t|trdjdd |DS|SdS) Nrrcss|]}t|ddVqdS)F)firstN)_format_marker)rHmrrr sz!_format_marker.. rErFcSsg|] }|jqSr)r')rHrOrrrrJsz"_format_marker..)rKlistlenrDrNjoin)markerrMinnerrrrrNs    rNcCs||kS)Nr)lhsrhsrrrr<scCs||kS)Nr)rWrXrrrr<s)r?znot inr>z<=z==z!=z>=r=c Cslytdj|j|g}Wntk r.Yn X|j|Stj|j}|dkrbtdj||||||S)Nz#Undefined {0!r} on {1!r} and {2!r}.) rrTr'rcontains _operatorsr8rr#)rWoprXspecZoperrrr_eval_ops r^cCs&|j|t}|tkr"tdj||S)Nz/{0!r} does not exist in evaluation environment.)r8 _undefinedrr#) environmentnamerrrr_get_envs   rbc Csgg}x|D]}t|tr0|djt||q t|tr|\}}}t|trbt||j}|j}n|j}t||j}|djt|||q |dkr |jgq Wt dd|DS)NrrCcss|]}t|VqdS)N)all)rHitemrrrrPsz$_evaluate_markers..re) rKrRappend_evaluate_markersrDr(rbrr^any) Zmarkersr`groupsrUrWr\rXZ lhs_valueZ rhs_valuerrrrgs       rgcCs2dj|}|j}|dkr.||dt|j7}|S)Nz{0.major}.{0.minor}.{0.micro}finalr)r# releaselevelr!serial)infoversionZkindrrrformat_full_versions  roc Cslttdr ttjj}tjj}nd}d}||tjtjtj tj tjtj tj tj ddtjd S)Nimplementation0rY) r-r+r5r1r/r2r0r.r,r3r4) hasattrsysrorprnraosplatformmachinereleasesystemr3r6)Ziverr-rrrrs    c@s.eZdZddZddZddZd dd ZdS) rcCs`yttj||_WnFtk rZ}z*dj|||j|jd}t|WYdd}~XnXdS)Nz+Invalid marker: {0!r}, parse error at {1!r})rGMARKERZ parseString_markersrr#locr)rrUeZerr_strrrrr s zMarker.__init__cCs t|jS)N)rNr|)rrrrr"szMarker.__str__cCsdjt|S)Nz)r#r!)rrrrr%szMarker.__repr__NcCs$t}|dk r|j|t|j|S)a$Evaluate a marker. Return the boolean from evaluating the given marker against the environment. environment is an optional argument to override all or part of the determined environment. The environment is determined from the current Python process. N)rupdatergr|)rr`Zcurrent_environmentrrrevaluate s  zMarker.evaluate)N)rrrr r"r%rrrrrrs)T)AZ __future__rrroperatorrurvrtZsetuptools.extern.pyparsingrrrrr r r r r LZ_compatrZ specifiersrr__all__ ValueErrorrrrobjectrr(r)r*ZVARIABLEr7ZsetParseActionZ VERSION_CMPZ MARKER_OPZ MARKER_VALUEZBOOLOPZ MARKER_VARZ MARKER_ITEMsuppressZLPARENZRPARENZ MARKER_EXPRZ MARKER_ATOMr{rGrNltleeqnegegtr[r^r_rbrgrorrrrrrsx    6       PK!]?a"a"4_vendor/packaging/__pycache__/markers.cpython-36.pycnu[3 9f/ @s@ddlmZmZmZddlZddlZddlZddlZddlm Z m Z m Z m Z ddlm Z mZmZmZddlmZddlmZddlmZmZd d d d d gZGdd d eZGdd d eZGdd d eZGdddeZGdddeZGdddeZ GdddeZ!ededBedBedBedBedBedBed Bed!Bed"Bed#Bed$Bed%Bed&Bed'Bed(Bed)Bed*BZ"d#d"ddddd+Z#e"j$d,d-ed.ed/Bed0Bed1Bed2Bed3Bed4Bed5BZ%e%ed6Bed7BZ&e&j$d8d-ed9ed:BZ'e'j$d;d-ed<ed=BZ(e"e'BZ)ee)e&e)Z*e*j$d>d-ed?j+Z,ed@j+Z-eZ.e*ee,e.e-BZ/e.e/e e(e.>e e.e Z0dAdBZ1dSdDdEZ2dFd-dGd-ej3ej4ej5ej6ej7ej8dHZ9dIdJZ:eZ;dKdLZdQd Z?GdRd d eZ@dS)T)absolute_importdivisionprint_functionN)ParseException ParseResults stringStart stringEnd) ZeroOrMoreGroupForward QuotedString)Literal) string_types) SpecifierInvalidSpecifier InvalidMarkerUndefinedComparisonUndefinedEnvironmentNameMarkerdefault_environmentc@seZdZdZdS)rzE An invalid marker was found, users should refer to PEP 508. N)__name__ __module__ __qualname____doc__rr/usr/lib/python3.6/markers.pyrsc@seZdZdZdS)rzP An invalid operation was attempted on a value that doesn't support it. N)rrrrrrrrrsc@seZdZdZdS)rz\ A name was attempted to be used that does not exist inside of the environment. N)rrrrrrrrr%sc@s,eZdZddZddZddZddZd S) NodecCs ||_dS)N)value)selfrrrr__init__.sz Node.__init__cCs t|jS)N)strr)rrrr__str__1sz Node.__str__cCsdj|jjt|S)Nz <{0}({1!r})>)format __class__rr!)rrrr__repr__4sz Node.__repr__cCstdS)N)NotImplementedError)rrrr serialize7szNode.serializeN)rrrr r"r%r'rrrrr,src@seZdZddZdS)VariablecCst|S)N)r!)rrrrr'=szVariable.serializeN)rrrr'rrrrr(;sr(c@seZdZddZdS)ValuecCs dj|S)Nz"{0}")r#)rrrrr'CszValue.serializeN)rrrr'rrrrr)Asr)c@seZdZddZdS)OpcCst|S)N)r!)rrrrr'Isz Op.serializeN)rrrr'rrrrr*Gsr*implementation_versionplatform_python_implementationimplementation_namepython_full_versionplatform_releaseplatform_versionplatform_machineplatform_systempython_version sys_platformos_namezos.namez sys.platformzplatform.versionzplatform.machinezplatform.python_implementationpython_implementationZextra)zos.namez sys.platformzplatform.versionzplatform.machinezplatform.python_implementationr6cCsttj|d|dS)Nr)r(ALIASESget)sltrrrisr<z===z==z>=z<=z!=z~=>sz(_coerce_parse_result..) isinstancer)resultsrrrrGs rGTcCst|tttfstt|trHt|dkrHt|dttfrHt|dSt|trdd|D}|rndj|Sddj|dSn"t|trdjdd |DS|SdS) Nrrcss|]}t|ddVqdS)F)firstN)_format_marker)rHmrrr sz!_format_marker.. rErFcSsg|] }|jqSr)r')rHrOrrrrJsz"_format_marker..)rKlistrDrAssertionErrorlenrNjoin)markerrMinnerrrrrNs    rNcCs||kS)Nr)lhsrhsrrrr<scCs||kS)Nr)rXrYrrrr<s)r?znot inr>z<=z==z!=z>=r=c Cslytdj|j|g}Wntk r.Yn X|j|Stj|j}|dkrbtdj||||||S)Nz#Undefined {0!r} on {1!r} and {2!r}.) rrUr'rcontains _operatorsr8rr#)rXoprYspecZoperrrr_eval_ops r_cCs&|j|t}|tkr"tdj||S)Nz/{0!r} does not exist in evaluation environment.)r8 _undefinedrr#) environmentnamerrrr_get_envs   rcc Csgg}x|D]}t|tttfs$tt|trD|djt||q t|tr|\}}}t|trvt||j }|j }n|j }t||j }|djt |||q |dkst|dkr |jgq Wt dd|DS) NrrBrCcss|]}t|VqdS)N)all)rHitemrrrrPsz$_evaluate_markers..rf)rBrC) rKrRrDrrSappend_evaluate_markersr(rcrr_any) ZmarkersragroupsrVrXr]rYZ lhs_valueZ rhs_valuerrrrhs"        rhcCs2dj|}|j}|dkr.||dt|j7}|S)Nz{0.major}.{0.minor}.{0.micro}finalr)r# releaselevelr!serial)infoversionZkindrrrformat_full_versions  rpc Cslttdr ttjj}tjj}nd}d}||tjtjtj tj tjtj tj tj ddtjd S)Nimplementation0rZ) r-r+r5r1r/r2r0r.r,r3r4) hasattrsysrprqrorbosplatformmachinereleasesystemr3r6)Ziverr-rrrrs    c@s.eZdZddZddZddZd dd ZdS) rcCs`yttj||_WnFtk rZ}z*dj|||j|jd}t|WYdd}~XnXdS)Nz+Invalid marker: {0!r}, parse error at {1!r})rGMARKERZ parseString_markersrr#locr)rrVeZerr_strrrrr s zMarker.__init__cCs t|jS)N)rNr})rrrrr"szMarker.__str__cCsdjt|S)Nz)r#r!)rrrrr%szMarker.__repr__NcCs$t}|dk r|j|t|j|S)a$Evaluate a marker. Return the boolean from evaluating the given marker against the environment. environment is an optional argument to override all or part of the determined environment. The environment is determined from the current Python process. N)rupdaterhr})rraZcurrent_environmentrrrevaluate s  zMarker.evaluate)N)rrrr r"r%rrrrrrs)T)AZ __future__rrroperatorrvrwruZsetuptools.extern.pyparsingrrrrr r r r r LZ_compatrZ specifiersrr__all__ ValueErrorrrrobjectrr(r)r*ZVARIABLEr7ZsetParseActionZ VERSION_CMPZ MARKER_OPZ MARKER_VALUEZBOOLOPZ MARKER_VARZ MARKER_ITEMsuppressZLPARENZRPARENZ MARKER_EXPRZ MARKER_ATOMr|rGrNltleeqnegegtr\r_r`rcrhrprrrrrrsx    6       PK! ?_vendor/packaging/__pycache__/requirements.cpython-36.opt-1.pycnu[3 9f@srddlmZmZmZddlZddlZddlmZmZm Z m Z ddlm Z m Z m Z mZmZddlmZddlmZddlmZmZdd lmZmZmZGd d d eZe ejejZ ed j!Z"ed j!Z#edj!Z$edj!Z%edj!Z&edj!Z'edj!Z(e dZ)e e e)e BZ*ee e e*Z+e+dZ,e+Z-eddZ.e(e.Z/e-e e&e-Z0e"e e0e#dZ1eej2ej3ej4BZ5eej2ej3ej4BZ6e5e6AZ7ee7e e&e7ddddZ8e e$e8e%e8BZ9e9j:dde e9dZ;e;j:dde edZej:d de'Ze/e e=Z?e,e e1e?e>BZ@ee@eZAGd!d"d"eBZCdS)#)absolute_importdivisionprint_functionN) stringStart stringEndoriginalTextForParseException) ZeroOrMoreWordOptionalRegexCombine)Literal)parse) MARKER_EXPRMarker)LegacySpecifier Specifier SpecifierSetc@seZdZdZdS)InvalidRequirementzJ An invalid requirement was found, users should refer to PEP 508. N)__name__ __module__ __qualname____doc__rr"/usr/lib/python3.6/requirements.pyrsr[](),;@z-_.namez[^ ]+urlextrasF)Z joinStringZadjacent _raw_speccCs |jpdS)N)r')sltrrr6sr, specifiercCs|dS)Nrr)r)r*r+rrrr,9smarkercCst||j|jS)N)rZ_original_startZ _original_end)r)r*r+rrrr,=sc@s(eZdZdZddZddZddZdS) RequirementzParse a requirement. Parse a given requirement string into its parts, such as name, specifier, URL, and extras. Raises InvalidRequirement on a badly-formed requirement string. cCsytj|}Wn@tk rN}z$tdj||j|jdWYdd}~XnX|j|_|jrtj|j}|j ot|j s|j r|j rtd|j|_nd|_t |j r|j j ng|_ t|j|_|jr|jnd|_dS)Nz+Invalid requirement, parse error at "{0!r}"zInvalid URL given) REQUIREMENTZ parseStringrrformatlocr$r%urlparseschemeZnetlocsetr&ZasListrr-r.)selfZrequirement_stringZreqeZ parsed_urlrrr__init__Xs"*   zRequirement.__init__cCsz|jg}|jr*|jdjdjt|j|jr@|jt|j|jrX|jdj|j|j rp|jdj|j dj|S)Nz[{0}]r!z@ {0}z; {0}r() r$r&appendr2joinsortedr-strr%r.)r7partsrrr__str__mszRequirement.__str__cCsdjt|S)Nz)r2r=)r7rrr__repr__~szRequirement.__repr__N)rrrrr9r?r@rrrrr/Ksr/)DZ __future__rrrstringreZsetuptools.extern.pyparsingrrrrr r r r r rLZ"setuptools.extern.six.moves.urllibrr4ZmarkersrrZ specifiersrrr ValueErrorrZ ascii_lettersZdigitsZALPHANUMsuppressZLBRACKETZRBRACKETZLPARENZRPARENCOMMAZ SEMICOLONATZ PUNCTUATIONZIDENTIFIER_ENDZ IDENTIFIERNAMEZEXTRAZURIZURLZ EXTRAS_LISTZEXTRASZ _regex_strVERBOSE IGNORECASEZVERSION_PEP440ZVERSION_LEGACYZ VERSION_ONEZ VERSION_MANYZ _VERSION_SPECZsetParseActionZ VERSION_SPECZMARKER_SEPERATORZMARKERZVERSION_AND_MARKERZURL_AND_MARKERZNAMED_REQUIREMENTr1objectr/rrrrsZ               PK! 9_vendor/packaging/__pycache__/requirements.cpython-36.pycnu[3 9f@srddlmZmZmZddlZddlZddlmZmZm Z m Z ddlm Z m Z m Z mZmZddlmZddlmZddlmZmZdd lmZmZmZGd d d eZe ejejZ ed j!Z"ed j!Z#edj!Z$edj!Z%edj!Z&edj!Z'edj!Z(e dZ)e e e)e BZ*ee e e*Z+e+dZ,e+Z-eddZ.e(e.Z/e-e e&e-Z0e"e e0e#dZ1eej2ej3ej4BZ5eej2ej3ej4BZ6e5e6AZ7ee7e e&e7ddddZ8e e$e8e%e8BZ9e9j:dde e9dZ;e;j:dde edZej:d de'Ze/e e=Z?e,e e1e?e>BZ@ee@eZAGd!d"d"eBZCdS)#)absolute_importdivisionprint_functionN) stringStart stringEndoriginalTextForParseException) ZeroOrMoreWordOptionalRegexCombine)Literal)parse) MARKER_EXPRMarker)LegacySpecifier Specifier SpecifierSetc@seZdZdZdS)InvalidRequirementzJ An invalid requirement was found, users should refer to PEP 508. N)__name__ __module__ __qualname____doc__rr"/usr/lib/python3.6/requirements.pyrsr[](),;@z-_.namez[^ ]+urlextrasF)Z joinStringZadjacent _raw_speccCs |jpdS)N)r')sltrrr6sr, specifiercCs|dS)Nrr)r)r*r+rrrr,9smarkercCst||j|jS)N)rZ_original_startZ _original_end)r)r*r+rrrr,=sc@s(eZdZdZddZddZddZdS) RequirementzParse a requirement. Parse a given requirement string into its parts, such as name, specifier, URL, and extras. Raises InvalidRequirement on a badly-formed requirement string. cCsytj|}Wn@tk rN}z$tdj||j|jdWYdd}~XnX|j|_|jrtj|j}|j ot|j s|j r|j rtd|j|_nd|_t |j r|j j ng|_ t|j|_|jr|jnd|_dS)Nz+Invalid requirement, parse error at "{0!r}"zInvalid URL given) REQUIREMENTZ parseStringrrformatlocr$r%urlparseschemeZnetlocsetr&ZasListrr-r.)selfZrequirement_stringZreqeZ parsed_urlrrr__init__Xs"*   zRequirement.__init__cCsz|jg}|jr*|jdjdjt|j|jr@|jt|j|jrX|jdj|j|j rp|jdj|j dj|S)Nz[{0}]r!z@ {0}z; {0}r() r$r&appendr2joinsortedr-strr%r.)r7partsrrr__str__mszRequirement.__str__cCsdjt|S)Nz)r2r=)r7rrr__repr__~szRequirement.__repr__N)rrrrr9r?r@rrrrr/Ksr/)DZ __future__rrrstringreZsetuptools.extern.pyparsingrrrrr r r r r rLZ"setuptools.extern.six.moves.urllibrr4ZmarkersrrZ specifiersrrr ValueErrorrZ ascii_lettersZdigitsZALPHANUMsuppressZLBRACKETZRBRACKETZLPARENZRPARENCOMMAZ SEMICOLONATZ PUNCTUATIONZIDENTIFIER_ENDZ IDENTIFIERNAMEZEXTRAZURIZURLZ EXTRAS_LISTZEXTRASZ _regex_strVERBOSE IGNORECASEZVERSION_PEP440ZVERSION_LEGACYZ VERSION_ONEZ VERSION_MANYZ _VERSION_SPECZsetParseActionZ VERSION_SPECZMARKER_SEPERATORZMARKERZVERSION_AND_MARKERZURL_AND_MARKERZNAMED_REQUIREMENTr1objectr/rrrrsZ               PK!S MM=_vendor/packaging/__pycache__/specifiers.cpython-36.opt-1.pycnu[3 9fym@sddlmZmZmZddlZddlZddlZddlZddlm Z m Z ddl m Z m Z mZGdddeZGdd d e ejeZGd d d eZGd d d eZddZGdddeZejdZddZddZGdddeZdS))absolute_importdivisionprint_functionN) string_typeswith_metaclass)Version LegacyVersionparsec@seZdZdZdS)InvalidSpecifierzH An invalid specifier was found, users should refer to PEP 440. N)__name__ __module__ __qualname____doc__rr /usr/lib/python3.6/specifiers.pyr sr c@seZdZejddZejddZejddZejddZej d d Z e j d d Z ejdd dZ ejdddZ d S) BaseSpecifiercCsdS)z Returns the str representation of this Specifier like object. This should be representative of the Specifier itself. Nr)selfrrr__str__szBaseSpecifier.__str__cCsdS)zF Returns a hash value for this Specifier like object. Nr)rrrr__hash__szBaseSpecifier.__hash__cCsdS)zq Returns a boolean representing whether or not the two Specifier like objects are equal. Nr)rotherrrr__eq__$szBaseSpecifier.__eq__cCsdS)zu Returns a boolean representing whether or not the two Specifier like objects are not equal. Nr)rrrrr__ne__+szBaseSpecifier.__ne__cCsdS)zg Returns whether or not pre-releases as a whole are allowed by this specifier. Nr)rrrr prereleases2szBaseSpecifier.prereleasescCsdS)zd Sets whether or not pre-releases as a whole are allowed by this specifier. Nr)rvaluerrrr9sNcCsdS)zR Determines if the given item is contained within this specifier. Nr)ritemrrrrcontains@szBaseSpecifier.containscCsdS)z Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. Nr)riterablerrrrfilterFszBaseSpecifier.filter)N)N)r r rabcabstractmethodrrrrabstractpropertyrsetterrrrrrrrs rc@seZdZiZd ddZddZddZd d Zd d Zd dZ ddZ ddZ e ddZ e ddZe ddZejddZddZd!ddZd"ddZdS)#_IndividualSpecifierNcCsF|jj|}|stdj||jdj|jdjf|_||_dS)NzInvalid specifier: '{0}'operatorversion)_regexsearchr formatgroupstrip_spec _prereleases)rspecrmatchrrr__init__Rs   z_IndividualSpecifier.__init__cCs0|jdk rdj|jnd}dj|jjt||S)Nz, prereleases={0!r}r$z<{0}({1!r}{2})>)r-r)r __class__r str)rprerrr__repr___s z_IndividualSpecifier.__repr__cCs dj|jS)Nz{0}{1})r)r,)rrrrrlsz_IndividualSpecifier.__str__cCs t|jS)N)hashr,)rrrrrosz_IndividualSpecifier.__hash__c CsLt|tr0y|j|}Wq@tk r,tSXnt||js@tS|j|jkS)N) isinstancerr1r NotImplementedr,)rrrrrrrs  z_IndividualSpecifier.__eq__c CsLt|tr0y|j|}Wq@tk r,tSXnt||js@tS|j|jkS)N)r6rr1r r7r,)rrrrrr}s  z_IndividualSpecifier.__ne__cCst|dj|j|S)Nz _compare_{0})getattrr) _operators)roprrr _get_operatorsz"_IndividualSpecifier._get_operatorcCst|ttfst|}|S)N)r6r rr )rr&rrr_coerce_versionsz$_IndividualSpecifier._coerce_versioncCs |jdS)Nr)r,)rrrrr%sz_IndividualSpecifier.operatorcCs |jdS)Nr)r,)rrrrr&sz_IndividualSpecifier.versioncCs|jS)N)r-)rrrrrsz _IndividualSpecifier.prereleasescCs ||_dS)N)r-)rrrrrrscCs |j|S)N)r)rrrrr __contains__sz!_IndividualSpecifier.__contains__cCs<|dkr|j}|j|}|jr(| r(dS|j|j||jS)NF)rr< is_prereleaser;r%r&)rrrrrrrs   z_IndividualSpecifier.containsccsd}g}d|dk r|ndi}xL|D]D}|j|}|j|f|r"|jr\|pL|j r\|j|q"d}|Vq"W| r|rx|D] }|VqzWdS)NFrT)r<rr>rappend)rrrZyieldedfound_prereleaseskwr&parsed_versionrrrrs       z_IndividualSpecifier.filter)r$N)N)N)r r rr9r0r4rrrrr;r<propertyr%r&rr"r=rrrrrrr#Ns         r#c@sveZdZdZejdedejejBZdddddd d Z d d Z d dZ ddZ ddZ ddZddZddZdS)LegacySpecifiera (?P(==|!=|<=|>=|<|>)) \s* (?P [^,;\s)]* # Since this is a "legacy" specifier, and the version # string can be just about anything, we match everything # except for whitespace, a semi-colon for marker support, # a closing paren since versions can be enclosed in # them, and a comma since it's a version separator. ) z^\s*z\s*$equal not_equalless_than_equalgreater_than_equal less_than greater_than)z==z!=z<=z>=<>cCst|tstt|}|S)N)r6r r2)rr&rrrr<s  zLegacySpecifier._coerce_versioncCs||j|kS)N)r<)r prospectiver.rrr_compare_equalszLegacySpecifier._compare_equalcCs||j|kS)N)r<)rrMr.rrr_compare_not_equalsz"LegacySpecifier._compare_not_equalcCs||j|kS)N)r<)rrMr.rrr_compare_less_than_equalsz(LegacySpecifier._compare_less_than_equalcCs||j|kS)N)r<)rrMr.rrr_compare_greater_than_equalsz+LegacySpecifier._compare_greater_than_equalcCs||j|kS)N)r<)rrMr.rrr_compare_less_thansz"LegacySpecifier._compare_less_thancCs||j|kS)N)r<)rrMr.rrr_compare_greater_thansz%LegacySpecifier._compare_greater_thanN)r r r _regex_strrecompileVERBOSE IGNORECASEr'r9r<rNrOrPrQrRrSrrrrrDs  rDcstjfdd}|S)Ncst|tsdS|||S)NF)r6r)rrMr.)fnrrwrapped s z)_require_version_compare..wrapped) functoolswraps)rYrZr)rYr_require_version_compare sr]c @seZdZdZejdedejejBZdddddd d d d Z e d dZ e ddZ e ddZ e ddZe ddZe ddZe ddZddZeddZejddZd S)! Specifiera (?P(~=|==|!=|<=|>=|<|>|===)) (?P (?: # The identity operators allow for an escape hatch that will # do an exact string match of the version you wish to install. # This will not be parsed by PEP 440 and we cannot determine # any semantic meaning from it. This operator is discouraged # but included entirely as an escape hatch. (?<====) # Only match for the identity operator \s* [^\s]* # We just match everything, except for whitespace # since we are only testing for strict identity. ) | (?: # The (non)equality operators allow for wild card and local # versions to be specified so we have to define these two # operators separately to enable that. (?<===|!=) # Only match for equals and not equals \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)* # release (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? # You cannot use a wild card and a dev or local version # together so group them with a | and make them optional. (?: (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local | \.\* # Wild card syntax of .* )? ) | (?: # The compatible operator requires at least two digits in the # release segment. (?<=~=) # Only match for the compatible operator \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release ) | (?: # All other operators only allow a sub set of what the # (non)equality operators do. Specifically they do not allow # local versions to be specified nor do they allow the prefix # matching wild cards. (?=rKrLz===cCsNdjttjddt|dd}|d7}|jd||oL|jd||S) N.cSs|jd o|jd S)NZpostZdev) startswith)xrrrs z/Specifier._compare_compatible..rz.*z>=z==)joinlist itertools takewhile_version_splitr;)rrMr.prefixrrr_compare_compatibles   zSpecifier._compare_compatiblecCsp|jdrPt|j}t|dd}tt|}|dt|}t||\}}nt|}|jsht|j}||kS)Nz.*)endswithrZpublicrhr2len _pad_versionlocal)rrMr.rrrrNs    zSpecifier._compare_equalcCs|j|| S)N)rN)rrMr.rrrrOszSpecifier._compare_not_equalcCs |t|kS)N)r)rrMr.rrrrPsz"Specifier._compare_less_than_equalcCs |t|kS)N)r)rrMr.rrrrQsz%Specifier._compare_greater_than_equalcCs>t|}||ksdS|j r:|jr:t|jt|jkr:dSdS)NFT)rr> base_version)rrMr.rrrrRszSpecifier._compare_less_thancCs`t|}||ksdS|j r:|jr:t|jt|jkr:dS|jdk r\t|jt|jkr\dSdS)NFT)rZis_postreleaserqrp)rrMr.rrrrSs zSpecifier._compare_greater_thancCst|jt|jkS)N)r2lower)rrMr.rrr_compare_arbitraryszSpecifier._compare_arbitrarycCsR|jdk r|jS|j\}}|d krN|dkr@|jdr@|dd }t|jrNdSd S) N==>=<=~====z.*rkTF)rtrurvrwrxrl)r-r,rmr r>)rr%r&rrrrs    zSpecifier.prereleasescCs ||_dS)N)r-)rrrrrrsN)r r rrTrUrVrWrXr'r9r]rjrNrOrPrQrRrSrsrCrr"rrrrr^s*^  #      r^z^([0-9]+)((?:a|b|c|rc)[0-9]+)$cCsDg}x:|jdD],}tj|}|r2|j|jq|j|qW|S)Nr_)split _prefix_regexr(extendgroupsr?)r&resultrr/rrrrh's rhc Csgg}}|jttjdd||jttjdd||j|t|dd|j|t|dd|jddgtdt|dt|d|jddgtdt|dt|dttj|ttj|fS)NcSs|jS)N)isdigit)rarrrrb6sz_pad_version..cSs|jS)N)r~)rarrrrb7srr0)r?rerfrgrninsertmaxchain)leftrightZ left_splitZ right_splitrrrro2s && roc@seZdZdddZddZddZd d Zd d Zd dZddZ ddZ ddZ e ddZ e jddZ ddZdddZd ddZdS)! SpecifierSetr$Nc Csrdd|jdD}t}xB|D]:}y|jt|Wq tk rX|jt|Yq Xq Wt||_||_dS)NcSsg|]}|jr|jqSr)r+).0srrr Rsz)SpecifierSet.__init__..,) rysetaddr^r rD frozenset_specsr-)rZ specifiersrZparsed specifierrrrr0Os  zSpecifierSet.__init__cCs*|jdk rdj|jnd}djt||S)Nz, prereleases={0!r}r$z)r-r)rr2)rr3rrrr4dszSpecifierSet.__repr__cCsdjtdd|jDS)Nrcss|]}t|VqdS)N)r2)rrrrr nsz'SpecifierSet.__str__..)rdsortedr)rrrrrmszSpecifierSet.__str__cCs t|jS)N)r5r)rrrrrpszSpecifierSet.__hash__cCst|trt|}nt|ts"tSt}t|j|jB|_|jdkrX|jdk rX|j|_n<|jdk rv|jdkrv|j|_n|j|jkr|j|_ntd|S)NzFCannot combine SpecifierSets with True and False prerelease overrides.)r6rrr7rrr- ValueError)rrrrrr__and__ss       zSpecifierSet.__and__cCsFt|trt|}n&t|tr,tt|}nt|ts:tS|j|jkS)N)r6rrr#r2r7r)rrrrrrs    zSpecifierSet.__eq__cCsFt|trt|}n&t|tr,tt|}nt|ts:tS|j|jkS)N)r6rrr#r2r7r)rrrrrrs    zSpecifierSet.__ne__cCs t|jS)N)rnr)rrrr__len__szSpecifierSet.__len__cCs t|jS)N)iterr)rrrr__iter__szSpecifierSet.__iter__cCs.|jdk r|jS|jsdStdd|jDS)Ncss|] }|jVqdS)N)r)rrrrrrsz+SpecifierSet.prereleases..)r-rany)rrrrrs  zSpecifierSet.prereleasescCs ||_dS)N)r-)rrrrrrscCs |j|S)N)r)rrrrrr=szSpecifierSet.__contains__csNtttfstdkr$|j r4jr4dStfdd|jDS)NFc3s|]}|jdVqdS))rN)r)rr)rrrrrsz(SpecifierSet.contains..)r6r rr rr>allr)rrrr)rrrrs  zSpecifierSet.containscCs|dkr|j}|jr:x |jD]}|j|t|d}qW|Sg}g}xZ|D]R}t|ttfsdt|}n|}t|trtqH|jr| r|s|j |qH|j |qHW| r|r|dkr|S|SdS)N)r) rrrboolr6r rr r>r?)rrrr.Zfilteredr@rrBrrrrs*      zSpecifierSet.filter)r$N)N)N)r r rr0r4rrrrrrrrCrr"r=rrrrrrrMs      r)Z __future__rrrrr[rfrUZ_compatrrr&rr r rr ABCMetaobjectrr#rDr]r^rVrzrhrorrrrrs&9 4   PK!S MM7_vendor/packaging/__pycache__/specifiers.cpython-36.pycnu[3 9fym@sddlmZmZmZddlZddlZddlZddlZddlm Z m Z ddl m Z m Z mZGdddeZGdd d e ejeZGd d d eZGd d d eZddZGdddeZejdZddZddZGdddeZdS))absolute_importdivisionprint_functionN) string_typeswith_metaclass)Version LegacyVersionparsec@seZdZdZdS)InvalidSpecifierzH An invalid specifier was found, users should refer to PEP 440. N)__name__ __module__ __qualname____doc__rr /usr/lib/python3.6/specifiers.pyr sr c@seZdZejddZejddZejddZejddZej d d Z e j d d Z ejdd dZ ejdddZ d S) BaseSpecifiercCsdS)z Returns the str representation of this Specifier like object. This should be representative of the Specifier itself. Nr)selfrrr__str__szBaseSpecifier.__str__cCsdS)zF Returns a hash value for this Specifier like object. Nr)rrrr__hash__szBaseSpecifier.__hash__cCsdS)zq Returns a boolean representing whether or not the two Specifier like objects are equal. Nr)rotherrrr__eq__$szBaseSpecifier.__eq__cCsdS)zu Returns a boolean representing whether or not the two Specifier like objects are not equal. Nr)rrrrr__ne__+szBaseSpecifier.__ne__cCsdS)zg Returns whether or not pre-releases as a whole are allowed by this specifier. Nr)rrrr prereleases2szBaseSpecifier.prereleasescCsdS)zd Sets whether or not pre-releases as a whole are allowed by this specifier. Nr)rvaluerrrr9sNcCsdS)zR Determines if the given item is contained within this specifier. Nr)ritemrrrrcontains@szBaseSpecifier.containscCsdS)z Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. Nr)riterablerrrrfilterFszBaseSpecifier.filter)N)N)r r rabcabstractmethodrrrrabstractpropertyrsetterrrrrrrrs rc@seZdZiZd ddZddZddZd d Zd d Zd dZ ddZ ddZ e ddZ e ddZe ddZejddZddZd!ddZd"ddZdS)#_IndividualSpecifierNcCsF|jj|}|stdj||jdj|jdjf|_||_dS)NzInvalid specifier: '{0}'operatorversion)_regexsearchr formatgroupstrip_spec _prereleases)rspecrmatchrrr__init__Rs   z_IndividualSpecifier.__init__cCs0|jdk rdj|jnd}dj|jjt||S)Nz, prereleases={0!r}r$z<{0}({1!r}{2})>)r-r)r __class__r str)rprerrr__repr___s z_IndividualSpecifier.__repr__cCs dj|jS)Nz{0}{1})r)r,)rrrrrlsz_IndividualSpecifier.__str__cCs t|jS)N)hashr,)rrrrrosz_IndividualSpecifier.__hash__c CsLt|tr0y|j|}Wq@tk r,tSXnt||js@tS|j|jkS)N) isinstancerr1r NotImplementedr,)rrrrrrrs  z_IndividualSpecifier.__eq__c CsLt|tr0y|j|}Wq@tk r,tSXnt||js@tS|j|jkS)N)r6rr1r r7r,)rrrrrr}s  z_IndividualSpecifier.__ne__cCst|dj|j|S)Nz _compare_{0})getattrr) _operators)roprrr _get_operatorsz"_IndividualSpecifier._get_operatorcCst|ttfst|}|S)N)r6r rr )rr&rrr_coerce_versionsz$_IndividualSpecifier._coerce_versioncCs |jdS)Nr)r,)rrrrr%sz_IndividualSpecifier.operatorcCs |jdS)Nr)r,)rrrrr&sz_IndividualSpecifier.versioncCs|jS)N)r-)rrrrrsz _IndividualSpecifier.prereleasescCs ||_dS)N)r-)rrrrrrscCs |j|S)N)r)rrrrr __contains__sz!_IndividualSpecifier.__contains__cCs<|dkr|j}|j|}|jr(| r(dS|j|j||jS)NF)rr< is_prereleaser;r%r&)rrrrrrrs   z_IndividualSpecifier.containsccsd}g}d|dk r|ndi}xL|D]D}|j|}|j|f|r"|jr\|pL|j r\|j|q"d}|Vq"W| r|rx|D] }|VqzWdS)NFrT)r<rr>rappend)rrrZyieldedfound_prereleaseskwr&parsed_versionrrrrs       z_IndividualSpecifier.filter)r$N)N)N)r r rr9r0r4rrrrr;r<propertyr%r&rr"r=rrrrrrr#Ns         r#c@sveZdZdZejdedejejBZdddddd d Z d d Z d dZ ddZ ddZ ddZddZddZdS)LegacySpecifiera (?P(==|!=|<=|>=|<|>)) \s* (?P [^,;\s)]* # Since this is a "legacy" specifier, and the version # string can be just about anything, we match everything # except for whitespace, a semi-colon for marker support, # a closing paren since versions can be enclosed in # them, and a comma since it's a version separator. ) z^\s*z\s*$equal not_equalless_than_equalgreater_than_equal less_than greater_than)z==z!=z<=z>=<>cCst|tstt|}|S)N)r6r r2)rr&rrrr<s  zLegacySpecifier._coerce_versioncCs||j|kS)N)r<)r prospectiver.rrr_compare_equalszLegacySpecifier._compare_equalcCs||j|kS)N)r<)rrMr.rrr_compare_not_equalsz"LegacySpecifier._compare_not_equalcCs||j|kS)N)r<)rrMr.rrr_compare_less_than_equalsz(LegacySpecifier._compare_less_than_equalcCs||j|kS)N)r<)rrMr.rrr_compare_greater_than_equalsz+LegacySpecifier._compare_greater_than_equalcCs||j|kS)N)r<)rrMr.rrr_compare_less_thansz"LegacySpecifier._compare_less_thancCs||j|kS)N)r<)rrMr.rrr_compare_greater_thansz%LegacySpecifier._compare_greater_thanN)r r r _regex_strrecompileVERBOSE IGNORECASEr'r9r<rNrOrPrQrRrSrrrrrDs  rDcstjfdd}|S)Ncst|tsdS|||S)NF)r6r)rrMr.)fnrrwrapped s z)_require_version_compare..wrapped) functoolswraps)rYrZr)rYr_require_version_compare sr]c @seZdZdZejdedejejBZdddddd d d d Z e d dZ e ddZ e ddZ e ddZe ddZe ddZe ddZddZeddZejddZd S)! Specifiera (?P(~=|==|!=|<=|>=|<|>|===)) (?P (?: # The identity operators allow for an escape hatch that will # do an exact string match of the version you wish to install. # This will not be parsed by PEP 440 and we cannot determine # any semantic meaning from it. This operator is discouraged # but included entirely as an escape hatch. (?<====) # Only match for the identity operator \s* [^\s]* # We just match everything, except for whitespace # since we are only testing for strict identity. ) | (?: # The (non)equality operators allow for wild card and local # versions to be specified so we have to define these two # operators separately to enable that. (?<===|!=) # Only match for equals and not equals \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)* # release (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? # You cannot use a wild card and a dev or local version # together so group them with a | and make them optional. (?: (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local | \.\* # Wild card syntax of .* )? ) | (?: # The compatible operator requires at least two digits in the # release segment. (?<=~=) # Only match for the compatible operator \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release ) | (?: # All other operators only allow a sub set of what the # (non)equality operators do. Specifically they do not allow # local versions to be specified nor do they allow the prefix # matching wild cards. (?=rKrLz===cCsNdjttjddt|dd}|d7}|jd||oL|jd||S) N.cSs|jd o|jd S)NZpostZdev) startswith)xrrrs z/Specifier._compare_compatible..rz.*z>=z==)joinlist itertools takewhile_version_splitr;)rrMr.prefixrrr_compare_compatibles   zSpecifier._compare_compatiblecCsp|jdrPt|j}t|dd}tt|}|dt|}t||\}}nt|}|jsht|j}||kS)Nz.*)endswithrZpublicrhr2len _pad_versionlocal)rrMr.rrrrNs    zSpecifier._compare_equalcCs|j|| S)N)rN)rrMr.rrrrOszSpecifier._compare_not_equalcCs |t|kS)N)r)rrMr.rrrrPsz"Specifier._compare_less_than_equalcCs |t|kS)N)r)rrMr.rrrrQsz%Specifier._compare_greater_than_equalcCs>t|}||ksdS|j r:|jr:t|jt|jkr:dSdS)NFT)rr> base_version)rrMr.rrrrRszSpecifier._compare_less_thancCs`t|}||ksdS|j r:|jr:t|jt|jkr:dS|jdk r\t|jt|jkr\dSdS)NFT)rZis_postreleaserqrp)rrMr.rrrrSs zSpecifier._compare_greater_thancCst|jt|jkS)N)r2lower)rrMr.rrr_compare_arbitraryszSpecifier._compare_arbitrarycCsR|jdk r|jS|j\}}|d krN|dkr@|jdr@|dd }t|jrNdSd S) N==>=<=~====z.*rkTF)rtrurvrwrxrl)r-r,rmr r>)rr%r&rrrrs    zSpecifier.prereleasescCs ||_dS)N)r-)rrrrrrsN)r r rrTrUrVrWrXr'r9r]rjrNrOrPrQrRrSrsrCrr"rrrrr^s*^  #      r^z^([0-9]+)((?:a|b|c|rc)[0-9]+)$cCsDg}x:|jdD],}tj|}|r2|j|jq|j|qW|S)Nr_)split _prefix_regexr(extendgroupsr?)r&resultrr/rrrrh's rhc Csgg}}|jttjdd||jttjdd||j|t|dd|j|t|dd|jddgtdt|dt|d|jddgtdt|dt|dttj|ttj|fS)NcSs|jS)N)isdigit)rarrrrb6sz_pad_version..cSs|jS)N)r~)rarrrrb7srr0)r?rerfrgrninsertmaxchain)leftrightZ left_splitZ right_splitrrrro2s && roc@seZdZdddZddZddZd d Zd d Zd dZddZ ddZ ddZ e ddZ e jddZ ddZdddZd ddZdS)! SpecifierSetr$Nc Csrdd|jdD}t}xB|D]:}y|jt|Wq tk rX|jt|Yq Xq Wt||_||_dS)NcSsg|]}|jr|jqSr)r+).0srrr Rsz)SpecifierSet.__init__..,) rysetaddr^r rD frozenset_specsr-)rZ specifiersrZparsed specifierrrrr0Os  zSpecifierSet.__init__cCs*|jdk rdj|jnd}djt||S)Nz, prereleases={0!r}r$z)r-r)rr2)rr3rrrr4dszSpecifierSet.__repr__cCsdjtdd|jDS)Nrcss|]}t|VqdS)N)r2)rrrrr nsz'SpecifierSet.__str__..)rdsortedr)rrrrrmszSpecifierSet.__str__cCs t|jS)N)r5r)rrrrrpszSpecifierSet.__hash__cCst|trt|}nt|ts"tSt}t|j|jB|_|jdkrX|jdk rX|j|_n<|jdk rv|jdkrv|j|_n|j|jkr|j|_ntd|S)NzFCannot combine SpecifierSets with True and False prerelease overrides.)r6rrr7rrr- ValueError)rrrrrr__and__ss       zSpecifierSet.__and__cCsFt|trt|}n&t|tr,tt|}nt|ts:tS|j|jkS)N)r6rrr#r2r7r)rrrrrrs    zSpecifierSet.__eq__cCsFt|trt|}n&t|tr,tt|}nt|ts:tS|j|jkS)N)r6rrr#r2r7r)rrrrrrs    zSpecifierSet.__ne__cCs t|jS)N)rnr)rrrr__len__szSpecifierSet.__len__cCs t|jS)N)iterr)rrrr__iter__szSpecifierSet.__iter__cCs.|jdk r|jS|jsdStdd|jDS)Ncss|] }|jVqdS)N)r)rrrrrrsz+SpecifierSet.prereleases..)r-rany)rrrrrs  zSpecifierSet.prereleasescCs ||_dS)N)r-)rrrrrrscCs |j|S)N)r)rrrrrr=szSpecifierSet.__contains__csNtttfstdkr$|j r4jr4dStfdd|jDS)NFc3s|]}|jdVqdS))rN)r)rr)rrrrrsz(SpecifierSet.contains..)r6r rr rr>allr)rrrr)rrrrs  zSpecifierSet.containscCs|dkr|j}|jr:x |jD]}|j|t|d}qW|Sg}g}xZ|D]R}t|ttfsdt|}n|}t|trtqH|jr| r|s|j |qH|j |qHW| r|r|dkr|S|SdS)N)r) rrrboolr6r rr r>r?)rrrr.Zfilteredr@rrBrrrrs*      zSpecifierSet.filter)r$N)N)N)r r rr0r4rrrrrrrrCrr"r=rrrrrrrMs      r)Z __future__rrrrr[rfrUZ_compatrrr&rr r rr ABCMetaobjectrr#rDr]r^rVrzrhrorrrrrs&9 4   PK!dV8_vendor/packaging/__pycache__/utils.cpython-36.opt-1.pycnu[3 9f@s2ddlmZmZmZddlZejdZddZdS))absolute_importdivisionprint_functionNz[-_.]+cCstjd|jS)N-)_canonicalize_regexsublower)namer /usr/lib/python3.6/utils.pycanonicalize_name sr )Z __future__rrrrecompilerr r r r r s PK!dV2_vendor/packaging/__pycache__/utils.cpython-36.pycnu[3 9f@s2ddlmZmZmZddlZejdZddZdS))absolute_importdivisionprint_functionNz[-_.]+cCstjd|jS)N-)_canonicalize_regexsublower)namer /usr/lib/python3.6/utils.pycanonicalize_name sr )Z __future__rrrrecompilerr r r r r s PK! )):_vendor/packaging/__pycache__/version.cpython-36.opt-1.pycnu[3 9f$-@sddlmZmZmZddlZddlZddlZddlmZddddd gZ ej d d d d dddgZ ddZ Gddde ZGdddeZGdddeZejdejZddddddZddZddZdZGd ddeZd!d"Zejd#Zd$d%Zd&d'ZdS)()absolute_importdivisionprint_functionN)InfinityparseVersion LegacyVersionInvalidVersionVERSION_PATTERN_Versionepochreleasedevprepostlocalc Cs&yt|Stk r t|SXdS)z Parse the given version string and return either a :class:`Version` object or a :class:`LegacyVersion` object depending on if the given version is a valid PEP 440 version or a legacy version. N)rr r )versionr/usr/lib/python3.6/version.pyrsc@seZdZdZdS)r zF An invalid version was found, users should refer to PEP 440. N)__name__ __module__ __qualname____doc__rrrrr $sc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS) _BaseVersioncCs t|jS)N)hash_key)selfrrr__hash__,sz_BaseVersion.__hash__cCs|j|ddS)NcSs||kS)Nr)sorrr0sz%_BaseVersion.__lt__..)_compare)rotherrrr__lt__/sz_BaseVersion.__lt__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!3sz%_BaseVersion.__le__..)r")rr#rrr__le__2sz_BaseVersion.__le__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!6sz%_BaseVersion.__eq__..)r")rr#rrr__eq__5sz_BaseVersion.__eq__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!9sz%_BaseVersion.__ge__..)r")rr#rrr__ge__8sz_BaseVersion.__ge__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!<sz%_BaseVersion.__gt__..)r")rr#rrr__gt__;sz_BaseVersion.__gt__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!?sz%_BaseVersion.__ne__..)r")rr#rrr__ne__>sz_BaseVersion.__ne__cCst|tstS||j|jS)N) isinstancerNotImplementedr)rr#methodrrrr"As z_BaseVersion._compareN) rrrrr$r%r&r'r(r)r"rrrrr*src@s`eZdZddZddZddZeddZed d Zed d Z ed dZ eddZ dS)r cCst||_t|j|_dS)N)str_version_legacy_cmpkeyr)rrrrr__init__Js zLegacyVersion.__init__cCs|jS)N)r.)rrrr__str__NszLegacyVersion.__str__cCsdjtt|S)Nz)formatreprr-)rrrr__repr__QszLegacyVersion.__repr__cCs|jS)N)r.)rrrrpublicTszLegacyVersion.publiccCs|jS)N)r.)rrrr base_versionXszLegacyVersion.base_versioncCsdS)Nr)rrrrr\szLegacyVersion.localcCsdS)NFr)rrrr is_prerelease`szLegacyVersion.is_prereleasecCsdS)NFr)rrrris_postreleasedszLegacyVersion.is_postreleaseN) rrrr0r1r4propertyr5r6rr7r8rrrrr Hs    z(\d+ | [a-z]+ | \.| -)czfinal-@)rpreview-rcrccsbxVtj|D]H}tj||}| s |dkr,q |dddkrJ|jdVq d|Vq WdVdS)N.r 0123456789*z*final)_legacy_version_component_resplit_legacy_version_replacement_mapgetzfill)rpartrrr_parse_version_partsrs rIcCsd}g}xlt|jD]\}|jdrh|dkrJx|rH|ddkrH|jq.Wx|rf|ddkrf|jqLW|j|qWt|}||fS) NrrBz*finalz*final-Z00000000rJrJ)rIlower startswithpopappendtuple)rr partsrHrrrr/s   r/a v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                          # pre-release
            [-_\.]?
            (?P(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
c@s|eZdZejdedejejBZddZ	ddZ
ddZed	d
Z
eddZed
dZeddZeddZdS)rz^\s*z\s*$c	Cs|jj|}|stdj|t|jdr8t|jdndtdd|jdjdDt	|jd|jd	t	|jd
|jdp|jdt	|jd
|jdt
|jdd|_t|jj
|jj|jj|jj|jj|jj|_dS)NzInvalid version: '{0}'r
rcss|]}t|VqdS)N)int).0irrr	sz#Version.__init__..rr?Zpre_lZpre_nZpost_lZpost_n1Zpost_n2Zdev_lZdev_nr)r
rrrrr)_regexsearchr
r2rgrouprQrOrD_parse_letter_version_parse_local_versionr._cmpkeyr
rrrrrr)rrmatchrrrr0s.

zVersion.__init__cCsdjtt|S)Nz)r2r3r-)rrrrr4szVersion.__repr__cCsg}|jjdkr$|jdj|jj|jdjdd|jjD|jjdk	rl|jdjdd|jjD|jjdk	r|jdj|jjd	|jjdk	r|jd
j|jjd	|jj	dk	r|jdjdjdd|jj	Ddj|S)
Nrz{0}!r?css|]}t|VqdS)N)r-)rRxrrrrTsz"Version.__str__..css|]}t|VqdS)N)r-)rRr\rrrrTsz.post{0}rz.dev{0}z+{0}css|]}t|VqdS)N)r-)rRr\rrrrTs)
r.r
rNr2joinrrrrr)rrPrrrr1s zVersion.__str__cCst|jdddS)N+rr)r-rD)rrrrr5
szVersion.publiccCsLg}|jjdkr$|jdj|jj|jdjdd|jjDdj|S)Nrz{0}!r?css|]}t|VqdS)N)r-)rRr\rrrrTsz'Version.base_version..r])r.r
rNr2r^r)rrPrrrr6s
zVersion.base_versioncCs$t|}d|kr |jdddSdS)Nr_r)r-rD)rZversion_stringrrrrsz
Version.localcCst|jjp|jjS)N)boolr.rr)rrrrr7!szVersion.is_prereleasecCst|jjS)N)r`r.r)rrrrr8%szVersion.is_postreleaseN)rrrrecompilerVERBOSE
IGNORECASErUr0r4r1r9r5r6rr7r8rrrrrs
#
cCsx|rZ|dkrd}|j}|dkr&d}n(|dkr4d}n|d
krBd	}n|dkrNd}|t|fS|rt|rtd}|t|fSdS)NrZalphaaZbetabr:rr<r>revrr)r:rr<)rgrh)rKrQ)ZletterZnumberrrrrX*s 
rXz[\._-]cCs$|dk	r tddtj|DSdS)zR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    Ncss&|]}|js|jnt|VqdS)N)isdigitrKrQ)rRrHrrrrTRsz'_parse_local_version..)rO_local_version_seperatorsrD)rrrrrYLsrYcCsttttjddt|}|dkr@|dkr@|dk	r@t}n|dkrLt}|dkrZt}|dkrft}|dkrvt}ntdd|D}||||||fS)NcSs|dkS)Nrr)r\rrrr!`sz_cmpkey..css*|]"}t|tr|dfnt|fVqdS)r]N)r*rQr)rRrSrrrrTsz_cmpkey..)rOreversedlist	itertools	dropwhiler)r
rrrrrrrrrZWs&		
rZ)Z
__future__rrrcollectionsrmraZ_structuresr__all__
namedtuplerr
ValueErrorr
objectrr	rbrcrCrErIr/rrrXrjrYrZrrrrs.!
9k
PK!))4_vendor/packaging/__pycache__/version.cpython-36.pycnu[3

9f$-@sddlmZmZmZddlZddlZddlZddlmZddddd	gZ	ej
d
ddd
dddgZddZGddde
ZGdddeZGdddeZejdejZddddddZddZddZdZGd ddeZd!d"Zejd#Zd$d%Zd&d'ZdS)()absolute_importdivisionprint_functionN)InfinityparseVersion
LegacyVersionInvalidVersionVERSION_PATTERN_VersionepochreleasedevprepostlocalcCs&yt|Stk
r t|SXdS)z
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    N)rr
r	)versionr/usr/lib/python3.6/version.pyrsc@seZdZdZdS)r
zF
    An invalid version was found, users should refer to PEP 440.
    N)__name__
__module____qualname____doc__rrrrr
$sc@sLeZdZddZddZddZddZd	d
ZddZd
dZ	ddZ
dS)_BaseVersioncCs
t|jS)N)hash_key)selfrrr__hash__,sz_BaseVersion.__hash__cCs|j|ddS)NcSs||kS)Nr)sorrr0sz%_BaseVersion.__lt__..)_compare)rotherrrr__lt__/sz_BaseVersion.__lt__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!3sz%_BaseVersion.__le__..)r")rr#rrr__le__2sz_BaseVersion.__le__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!6sz%_BaseVersion.__eq__..)r")rr#rrr__eq__5sz_BaseVersion.__eq__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!9sz%_BaseVersion.__ge__..)r")rr#rrr__ge__8sz_BaseVersion.__ge__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!<sz%_BaseVersion.__gt__..)r")rr#rrr__gt__;sz_BaseVersion.__gt__cCs|j|ddS)NcSs||kS)Nr)rr rrrr!?sz%_BaseVersion.__ne__..)r")rr#rrr__ne__>sz_BaseVersion.__ne__cCst|tstS||j|jS)N)
isinstancerNotImplementedr)rr#methodrrrr"As
z_BaseVersion._compareN)rrrrr$r%r&r'r(r)r"rrrrr*src@s`eZdZddZddZddZeddZed	d
ZeddZ	ed
dZ
eddZdS)r	cCst||_t|j|_dS)N)str_version_legacy_cmpkeyr)rrrrr__init__Js
zLegacyVersion.__init__cCs|jS)N)r.)rrrr__str__NszLegacyVersion.__str__cCsdjtt|S)Nz)formatreprr-)rrrr__repr__QszLegacyVersion.__repr__cCs|jS)N)r.)rrrrpublicTszLegacyVersion.publiccCs|jS)N)r.)rrrrbase_versionXszLegacyVersion.base_versioncCsdS)Nr)rrrrr\szLegacyVersion.localcCsdS)NFr)rrrr
is_prerelease`szLegacyVersion.is_prereleasecCsdS)NFr)rrrris_postreleasedszLegacyVersion.is_postreleaseN)rrrr0r1r4propertyr5r6rr7r8rrrrr	Hsz(\d+ | [a-z]+ | \.| -)czfinal-@)rpreview-rcrccsbxVtj|D]H}tj||}|s|dkr,q|dddkrJ|jdVqd|VqWdVdS)N.r
0123456789*z*final)_legacy_version_component_resplit_legacy_version_replacement_mapgetzfill)rpartrrr_parse_version_partsrsrIcCsd}g}xlt|jD]\}|jdrh|dkrJx|rH|ddkrH|jq.Wx|rf|ddkrf|jqLW|j|qWt|}||fS)	NrrBz*finalz*final-Z00000000rJrJ)rIlower
startswithpopappendtuple)rr
partsrHrrrr/s
r/a
    v?
    (?:
        (?:(?P[0-9]+)!)?                           # epoch
        (?P[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P
                                          # pre-release
            [-_\.]?
            (?P(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
c@s|eZdZejdedejejBZddZ	ddZ
ddZed	d
Z
eddZed
dZeddZeddZdS)rz^\s*z\s*$c	Cs|jj|}|stdj|t|jdr8t|jdndtdd|jdjdDt	|jd|jd	t	|jd
|jdp|jdt	|jd
|jdt
|jdd|_t|jj
|jj|jj|jj|jj|jj|_dS)NzInvalid version: '{0}'r
rcss|]}t|VqdS)N)int).0irrr	sz#Version.__init__..rr?Zpre_lZpre_nZpost_lZpost_n1Zpost_n2Zdev_lZdev_nr)r
rrrrr)_regexsearchr
r2rgrouprQrOrD_parse_letter_version_parse_local_versionr._cmpkeyr
rrrrrr)rrmatchrrrr0s.

zVersion.__init__cCsdjtt|S)Nz)r2r3r-)rrrrr4szVersion.__repr__cCsg}|jjdkr$|jdj|jj|jdjdd|jjD|jjdk	rl|jdjdd|jjD|jjdk	r|jdj|jjd	|jjdk	r|jd
j|jjd	|jj	dk	r|jdjdjdd|jj	Ddj|S)
Nrz{0}!r?css|]}t|VqdS)N)r-)rRxrrrrTsz"Version.__str__..css|]}t|VqdS)N)r-)rRr\rrrrTsz.post{0}rz.dev{0}z+{0}css|]}t|VqdS)N)r-)rRr\rrrrTs)
r.r
rNr2joinrrrrr)rrPrrrr1s zVersion.__str__cCst|jdddS)N+rr)r-rD)rrrrr5
szVersion.publiccCsLg}|jjdkr$|jdj|jj|jdjdd|jjDdj|S)Nrz{0}!r?css|]}t|VqdS)N)r-)rRr\rrrrTsz'Version.base_version..r])r.r
rNr2r^r)rrPrrrr6s
zVersion.base_versioncCs$t|}d|kr |jdddSdS)Nr_r)r-rD)rZversion_stringrrrrsz
Version.localcCst|jjp|jjS)N)boolr.rr)rrrrr7!szVersion.is_prereleasecCst|jjS)N)r`r.r)rrrrr8%szVersion.is_postreleaseN)rrrrecompilerVERBOSE
IGNORECASErUr0r4r1r9r5r6rr7r8rrrrrs
#
cCsx|rZ|dkrd}|j}|dkr&d}n(|dkr4d}n|d
krBd	}n|dkrNd}|t|fS|rt|rtd}|t|fSdS)NrZalphaaZbetabr:rr<r>revrr)r:rr<)rgrh)rKrQ)ZletterZnumberrrrrX*s 
rXz[\._-]cCs$|dk	r tddtj|DSdS)zR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    Ncss&|]}|js|jnt|VqdS)N)isdigitrKrQ)rRrHrrrrTRsz'_parse_local_version..)rO_local_version_seperatorsrD)rrrrrYLsrYcCsttttjddt|}|dkr@|dkr@|dk	r@t}n|dkrLt}|dkrZt}|dkrft}|dkrvt}ntdd|D}||||||fS)NcSs|dkS)Nrr)r\rrrr!`sz_cmpkey..css*|]"}t|tr|dfnt|fVqdS)r]N)r*rQr)rRrSrrrrTsz_cmpkey..)rOreversedlist	itertools	dropwhiler)r
rrrrrrrrrZWs&		
rZ)Z
__future__rrrcollectionsrmraZ_structuresr__all__
namedtuplerr
ValueErrorr
objectrr	rbrcrCrErIr/rrrXrjrYrZrrrrs.!
9k
PK!<)X_vendor/packaging/__about__.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

__all__ = [
    "__title__", "__summary__", "__uri__", "__version__", "__author__",
    "__email__", "__license__", "__copyright__",
]

__title__ = "packaging"
__summary__ = "Core utilities for Python packages"
__uri__ = "https://github.com/pypa/packaging"

__version__ = "16.8"

__author__ = "Donald Stufft and individual contributors"
__email__ = "donald@stufft.io"

__license__ = "BSD or Apache License, Version 2.0"
__copyright__ = "Copyright 2014-2016 %s" % __author__
PK!v_vendor/packaging/__init__.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

from .__about__ import (
    __author__, __copyright__, __email__, __license__, __summary__, __title__,
    __uri__, __version__
)

__all__ = [
    "__title__", "__summary__", "__uri__", "__version__", "__author__",
    "__email__", "__license__", "__copyright__",
]
PK!iJ\\_vendor/packaging/_compat.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import sys


PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3

# flake8: noqa

if PY3:
    string_types = str,
else:
    string_types = basestring,


def with_metaclass(meta, *bases):
    """
    Create a base class with a metaclass.
    """
    # This requires a bit of explanation: the basic idea is to make a dummy
    # metaclass for one level of class instantiation that replaces itself with
    # the actual metaclass.
    class metaclass(meta):
        def __new__(cls, name, this_bases, d):
            return meta(name, bases, d)
    return type.__new__(metaclass, 'temporary_class', (), {})
PK! _vendor/packaging/_structures.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function


class Infinity(object):

    def __repr__(self):
        return "Infinity"

    def __hash__(self):
        return hash(repr(self))

    def __lt__(self, other):
        return False

    def __le__(self, other):
        return False

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not isinstance(other, self.__class__)

    def __gt__(self, other):
        return True

    def __ge__(self, other):
        return True

    def __neg__(self):
        return NegativeInfinity

Infinity = Infinity()


class NegativeInfinity(object):

    def __repr__(self):
        return "-Infinity"

    def __hash__(self):
        return hash(repr(self))

    def __lt__(self, other):
        return True

    def __le__(self, other):
        return True

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not isinstance(other, self.__class__)

    def __gt__(self, other):
        return False

    def __ge__(self, other):
        return False

    def __neg__(self):
        return Infinity

NegativeInfinity = NegativeInfinity()
PK!H/ / _vendor/packaging/markers.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import operator
import os
import platform
import sys

from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd
from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString
from setuptools.extern.pyparsing import Literal as L  # noqa

from ._compat import string_types
from .specifiers import Specifier, InvalidSpecifier


__all__ = [
    "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName",
    "Marker", "default_environment",
]


class InvalidMarker(ValueError):
    """
    An invalid marker was found, users should refer to PEP 508.
    """


class UndefinedComparison(ValueError):
    """
    An invalid operation was attempted on a value that doesn't support it.
    """


class UndefinedEnvironmentName(ValueError):
    """
    A name was attempted to be used that does not exist inside of the
    environment.
    """


class Node(object):

    def __init__(self, value):
        self.value = value

    def __str__(self):
        return str(self.value)

    def __repr__(self):
        return "<{0}({1!r})>".format(self.__class__.__name__, str(self))

    def serialize(self):
        raise NotImplementedError


class Variable(Node):

    def serialize(self):
        return str(self)


class Value(Node):

    def serialize(self):
        return '"{0}"'.format(self)


class Op(Node):

    def serialize(self):
        return str(self)


VARIABLE = (
    L("implementation_version") |
    L("platform_python_implementation") |
    L("implementation_name") |
    L("python_full_version") |
    L("platform_release") |
    L("platform_version") |
    L("platform_machine") |
    L("platform_system") |
    L("python_version") |
    L("sys_platform") |
    L("os_name") |
    L("os.name") |  # PEP-345
    L("sys.platform") |  # PEP-345
    L("platform.version") |  # PEP-345
    L("platform.machine") |  # PEP-345
    L("platform.python_implementation") |  # PEP-345
    L("python_implementation") |  # undocumented setuptools legacy
    L("extra")
)
ALIASES = {
    'os.name': 'os_name',
    'sys.platform': 'sys_platform',
    'platform.version': 'platform_version',
    'platform.machine': 'platform_machine',
    'platform.python_implementation': 'platform_python_implementation',
    'python_implementation': 'platform_python_implementation'
}
VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))

VERSION_CMP = (
    L("===") |
    L("==") |
    L(">=") |
    L("<=") |
    L("!=") |
    L("~=") |
    L(">") |
    L("<")
)

MARKER_OP = VERSION_CMP | L("not in") | L("in")
MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))

MARKER_VALUE = QuotedString("'") | QuotedString('"')
MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))

BOOLOP = L("and") | L("or")

MARKER_VAR = VARIABLE | MARKER_VALUE

MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))

LPAREN = L("(").suppress()
RPAREN = L(")").suppress()

MARKER_EXPR = Forward()
MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)

MARKER = stringStart + MARKER_EXPR + stringEnd


def _coerce_parse_result(results):
    if isinstance(results, ParseResults):
        return [_coerce_parse_result(i) for i in results]
    else:
        return results


def _format_marker(marker, first=True):
    assert isinstance(marker, (list, tuple, string_types))

    # Sometimes we have a structure like [[...]] which is a single item list
    # where the single item is itself it's own list. In that case we want skip
    # the rest of this function so that we don't get extraneous () on the
    # outside.
    if (isinstance(marker, list) and len(marker) == 1 and
            isinstance(marker[0], (list, tuple))):
        return _format_marker(marker[0])

    if isinstance(marker, list):
        inner = (_format_marker(m, first=False) for m in marker)
        if first:
            return " ".join(inner)
        else:
            return "(" + " ".join(inner) + ")"
    elif isinstance(marker, tuple):
        return " ".join([m.serialize() for m in marker])
    else:
        return marker


_operators = {
    "in": lambda lhs, rhs: lhs in rhs,
    "not in": lambda lhs, rhs: lhs not in rhs,
    "<": operator.lt,
    "<=": operator.le,
    "==": operator.eq,
    "!=": operator.ne,
    ">=": operator.ge,
    ">": operator.gt,
}


def _eval_op(lhs, op, rhs):
    try:
        spec = Specifier("".join([op.serialize(), rhs]))
    except InvalidSpecifier:
        pass
    else:
        return spec.contains(lhs)

    oper = _operators.get(op.serialize())
    if oper is None:
        raise UndefinedComparison(
            "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
        )

    return oper(lhs, rhs)


_undefined = object()


def _get_env(environment, name):
    value = environment.get(name, _undefined)

    if value is _undefined:
        raise UndefinedEnvironmentName(
            "{0!r} does not exist in evaluation environment.".format(name)
        )

    return value


def _evaluate_markers(markers, environment):
    groups = [[]]

    for marker in markers:
        assert isinstance(marker, (list, tuple, string_types))

        if isinstance(marker, list):
            groups[-1].append(_evaluate_markers(marker, environment))
        elif isinstance(marker, tuple):
            lhs, op, rhs = marker

            if isinstance(lhs, Variable):
                lhs_value = _get_env(environment, lhs.value)
                rhs_value = rhs.value
            else:
                lhs_value = lhs.value
                rhs_value = _get_env(environment, rhs.value)

            groups[-1].append(_eval_op(lhs_value, op, rhs_value))
        else:
            assert marker in ["and", "or"]
            if marker == "or":
                groups.append([])

    return any(all(item) for item in groups)


def format_full_version(info):
    version = '{0.major}.{0.minor}.{0.micro}'.format(info)
    kind = info.releaselevel
    if kind != 'final':
        version += kind[0] + str(info.serial)
    return version


def default_environment():
    if hasattr(sys, 'implementation'):
        iver = format_full_version(sys.implementation.version)
        implementation_name = sys.implementation.name
    else:
        iver = '0'
        implementation_name = ''

    return {
        "implementation_name": implementation_name,
        "implementation_version": iver,
        "os_name": os.name,
        "platform_machine": platform.machine(),
        "platform_release": platform.release(),
        "platform_system": platform.system(),
        "platform_version": platform.version(),
        "python_full_version": platform.python_version(),
        "platform_python_implementation": platform.python_implementation(),
        "python_version": platform.python_version()[:3],
        "sys_platform": sys.platform,
    }


class Marker(object):

    def __init__(self, marker):
        try:
            self._markers = _coerce_parse_result(MARKER.parseString(marker))
        except ParseException as e:
            err_str = "Invalid marker: {0!r}, parse error at {1!r}".format(
                marker, marker[e.loc:e.loc + 8])
            raise InvalidMarker(err_str)

    def __str__(self):
        return _format_marker(self._markers)

    def __repr__(self):
        return "".format(str(self))

    def evaluate(self, environment=None):
        """Evaluate a marker.

        Return the boolean from evaluating the given marker against the
        environment. environment is an optional argument to override all or
        part of the determined environment.

        The environment is determined from the current Python process.
        """
        current_environment = default_environment()
        if environment is not None:
            current_environment.update(environment)

        return _evaluate_markers(self._markers, current_environment)
PK!vЁ!_vendor/packaging/requirements.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import string
import re

from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException
from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine
from setuptools.extern.pyparsing import Literal as L  # noqa
from setuptools.extern.six.moves.urllib import parse as urlparse

from .markers import MARKER_EXPR, Marker
from .specifiers import LegacySpecifier, Specifier, SpecifierSet


class InvalidRequirement(ValueError):
    """
    An invalid requirement was found, users should refer to PEP 508.
    """


ALPHANUM = Word(string.ascii_letters + string.digits)

LBRACKET = L("[").suppress()
RBRACKET = L("]").suppress()
LPAREN = L("(").suppress()
RPAREN = L(")").suppress()
COMMA = L(",").suppress()
SEMICOLON = L(";").suppress()
AT = L("@").suppress()

PUNCTUATION = Word("-_.")
IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))

NAME = IDENTIFIER("name")
EXTRA = IDENTIFIER

URI = Regex(r'[^ ]+')("url")
URL = (AT + URI)

EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")

VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE)
VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE)

VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY
VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE),
                       joinString=",", adjacent=False)("_raw_spec")
_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '')

VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier")
VERSION_SPEC.setParseAction(lambda s, l, t: t[1])

MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
MARKER_EXPR.setParseAction(
    lambda s, l, t: Marker(s[t._original_start:t._original_end])
)
MARKER_SEPERATOR = SEMICOLON
MARKER = MARKER_SEPERATOR + MARKER_EXPR

VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER)
URL_AND_MARKER = URL + Optional(MARKER)

NAMED_REQUIREMENT = \
    NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)

REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd


class Requirement(object):
    """Parse a requirement.

    Parse a given requirement string into its parts, such as name, specifier,
    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
    string.
    """

    # TODO: Can we test whether something is contained within a requirement?
    #       If so how do we do that? Do we need to test against the _name_ of
    #       the thing as well as the version? What about the markers?
    # TODO: Can we normalize the name and extra name?

    def __init__(self, requirement_string):
        try:
            req = REQUIREMENT.parseString(requirement_string)
        except ParseException as e:
            raise InvalidRequirement(
                "Invalid requirement, parse error at \"{0!r}\"".format(
                    requirement_string[e.loc:e.loc + 8]))

        self.name = req.name
        if req.url:
            parsed_url = urlparse.urlparse(req.url)
            if not (parsed_url.scheme and parsed_url.netloc) or (
                    not parsed_url.scheme and not parsed_url.netloc):
                raise InvalidRequirement("Invalid URL given")
            self.url = req.url
        else:
            self.url = None
        self.extras = set(req.extras.asList() if req.extras else [])
        self.specifier = SpecifierSet(req.specifier)
        self.marker = req.marker if req.marker else None

    def __str__(self):
        parts = [self.name]

        if self.extras:
            parts.append("[{0}]".format(",".join(sorted(self.extras))))

        if self.specifier:
            parts.append(str(self.specifier))

        if self.url:
            parts.append("@ {0}".format(self.url))

        if self.marker:
            parts.append("; {0}".format(self.marker))

        return "".join(parts)

    def __repr__(self):
        return "".format(str(self))
PK!|Eymym_vendor/packaging/specifiers.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import abc
import functools
import itertools
import re

from ._compat import string_types, with_metaclass
from .version import Version, LegacyVersion, parse


class InvalidSpecifier(ValueError):
    """
    An invalid specifier was found, users should refer to PEP 440.
    """


class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):

    @abc.abstractmethod
    def __str__(self):
        """
        Returns the str representation of this Specifier like object. This
        should be representative of the Specifier itself.
        """

    @abc.abstractmethod
    def __hash__(self):
        """
        Returns a hash value for this Specifier like object.
        """

    @abc.abstractmethod
    def __eq__(self, other):
        """
        Returns a boolean representing whether or not the two Specifier like
        objects are equal.
        """

    @abc.abstractmethod
    def __ne__(self, other):
        """
        Returns a boolean representing whether or not the two Specifier like
        objects are not equal.
        """

    @abc.abstractproperty
    def prereleases(self):
        """
        Returns whether or not pre-releases as a whole are allowed by this
        specifier.
        """

    @prereleases.setter
    def prereleases(self, value):
        """
        Sets whether or not pre-releases as a whole are allowed by this
        specifier.
        """

    @abc.abstractmethod
    def contains(self, item, prereleases=None):
        """
        Determines if the given item is contained within this specifier.
        """

    @abc.abstractmethod
    def filter(self, iterable, prereleases=None):
        """
        Takes an iterable of items and filters them so that only items which
        are contained within this specifier are allowed in it.
        """


class _IndividualSpecifier(BaseSpecifier):

    _operators = {}

    def __init__(self, spec="", prereleases=None):
        match = self._regex.search(spec)
        if not match:
            raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec))

        self._spec = (
            match.group("operator").strip(),
            match.group("version").strip(),
        )

        # Store whether or not this Specifier should accept prereleases
        self._prereleases = prereleases

    def __repr__(self):
        pre = (
            ", prereleases={0!r}".format(self.prereleases)
            if self._prereleases is not None
            else ""
        )

        return "<{0}({1!r}{2})>".format(
            self.__class__.__name__,
            str(self),
            pre,
        )

    def __str__(self):
        return "{0}{1}".format(*self._spec)

    def __hash__(self):
        return hash(self._spec)

    def __eq__(self, other):
        if isinstance(other, string_types):
            try:
                other = self.__class__(other)
            except InvalidSpecifier:
                return NotImplemented
        elif not isinstance(other, self.__class__):
            return NotImplemented

        return self._spec == other._spec

    def __ne__(self, other):
        if isinstance(other, string_types):
            try:
                other = self.__class__(other)
            except InvalidSpecifier:
                return NotImplemented
        elif not isinstance(other, self.__class__):
            return NotImplemented

        return self._spec != other._spec

    def _get_operator(self, op):
        return getattr(self, "_compare_{0}".format(self._operators[op]))

    def _coerce_version(self, version):
        if not isinstance(version, (LegacyVersion, Version)):
            version = parse(version)
        return version

    @property
    def operator(self):
        return self._spec[0]

    @property
    def version(self):
        return self._spec[1]

    @property
    def prereleases(self):
        return self._prereleases

    @prereleases.setter
    def prereleases(self, value):
        self._prereleases = value

    def __contains__(self, item):
        return self.contains(item)

    def contains(self, item, prereleases=None):
        # Determine if prereleases are to be allowed or not.
        if prereleases is None:
            prereleases = self.prereleases

        # Normalize item to a Version or LegacyVersion, this allows us to have
        # a shortcut for ``"2.0" in Specifier(">=2")
        item = self._coerce_version(item)

        # Determine if we should be supporting prereleases in this specifier
        # or not, if we do not support prereleases than we can short circuit
        # logic if this version is a prereleases.
        if item.is_prerelease and not prereleases:
            return False

        # Actually do the comparison to determine if this item is contained
        # within this Specifier or not.
        return self._get_operator(self.operator)(item, self.version)

    def filter(self, iterable, prereleases=None):
        yielded = False
        found_prereleases = []

        kw = {"prereleases": prereleases if prereleases is not None else True}

        # Attempt to iterate over all the values in the iterable and if any of
        # them match, yield them.
        for version in iterable:
            parsed_version = self._coerce_version(version)

            if self.contains(parsed_version, **kw):
                # If our version is a prerelease, and we were not set to allow
                # prereleases, then we'll store it for later incase nothing
                # else matches this specifier.
                if (parsed_version.is_prerelease and not
                        (prereleases or self.prereleases)):
                    found_prereleases.append(version)
                # Either this is not a prerelease, or we should have been
                # accepting prereleases from the begining.
                else:
                    yielded = True
                    yield version

        # Now that we've iterated over everything, determine if we've yielded
        # any values, and if we have not and we have any prereleases stored up
        # then we will go ahead and yield the prereleases.
        if not yielded and found_prereleases:
            for version in found_prereleases:
                yield version


class LegacySpecifier(_IndividualSpecifier):

    _regex_str = (
        r"""
        (?P(==|!=|<=|>=|<|>))
        \s*
        (?P
            [^,;\s)]* # Since this is a "legacy" specifier, and the version
                      # string can be just about anything, we match everything
                      # except for whitespace, a semi-colon for marker support,
                      # a closing paren since versions can be enclosed in
                      # them, and a comma since it's a version separator.
        )
        """
    )

    _regex = re.compile(
        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)

    _operators = {
        "==": "equal",
        "!=": "not_equal",
        "<=": "less_than_equal",
        ">=": "greater_than_equal",
        "<": "less_than",
        ">": "greater_than",
    }

    def _coerce_version(self, version):
        if not isinstance(version, LegacyVersion):
            version = LegacyVersion(str(version))
        return version

    def _compare_equal(self, prospective, spec):
        return prospective == self._coerce_version(spec)

    def _compare_not_equal(self, prospective, spec):
        return prospective != self._coerce_version(spec)

    def _compare_less_than_equal(self, prospective, spec):
        return prospective <= self._coerce_version(spec)

    def _compare_greater_than_equal(self, prospective, spec):
        return prospective >= self._coerce_version(spec)

    def _compare_less_than(self, prospective, spec):
        return prospective < self._coerce_version(spec)

    def _compare_greater_than(self, prospective, spec):
        return prospective > self._coerce_version(spec)


def _require_version_compare(fn):
    @functools.wraps(fn)
    def wrapped(self, prospective, spec):
        if not isinstance(prospective, Version):
            return False
        return fn(self, prospective, spec)
    return wrapped


class Specifier(_IndividualSpecifier):

    _regex_str = (
        r"""
        (?P(~=|==|!=|<=|>=|<|>|===))
        (?P
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s]*    # We just match everything, except for whitespace
                          # since we are only testing for strict identity.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?

                # You cannot use a wild card and a dev or local version
                # together so group them with a | and make them optional.
                (?:
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                    |
                    \.\*  # Wild card syntax of .*
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?=": "greater_than_equal",
        "<": "less_than",
        ">": "greater_than",
        "===": "arbitrary",
    }

    @_require_version_compare
    def _compare_compatible(self, prospective, spec):
        # Compatible releases have an equivalent combination of >= and ==. That
        # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
        # implement this in terms of the other specifiers instead of
        # implementing it ourselves. The only thing we need to do is construct
        # the other specifiers.

        # We want everything but the last item in the version, but we want to
        # ignore post and dev releases and we want to treat the pre-release as
        # it's own separate segment.
        prefix = ".".join(
            list(
                itertools.takewhile(
                    lambda x: (not x.startswith("post") and not
                               x.startswith("dev")),
                    _version_split(spec),
                )
            )[:-1]
        )

        # Add the prefix notation to the end of our string
        prefix += ".*"

        return (self._get_operator(">=")(prospective, spec) and
                self._get_operator("==")(prospective, prefix))

    @_require_version_compare
    def _compare_equal(self, prospective, spec):
        # We need special logic to handle prefix matching
        if spec.endswith(".*"):
            # In the case of prefix matching we want to ignore local segment.
            prospective = Version(prospective.public)
            # Split the spec out by dots, and pretend that there is an implicit
            # dot in between a release segment and a pre-release segment.
            spec = _version_split(spec[:-2])  # Remove the trailing .*

            # Split the prospective version out by dots, and pretend that there
            # is an implicit dot in between a release segment and a pre-release
            # segment.
            prospective = _version_split(str(prospective))

            # Shorten the prospective version to be the same length as the spec
            # so that we can determine if the specifier is a prefix of the
            # prospective version or not.
            prospective = prospective[:len(spec)]

            # Pad out our two sides with zeros so that they both equal the same
            # length.
            spec, prospective = _pad_version(spec, prospective)
        else:
            # Convert our spec string into a Version
            spec = Version(spec)

            # If the specifier does not have a local segment, then we want to
            # act as if the prospective version also does not have a local
            # segment.
            if not spec.local:
                prospective = Version(prospective.public)

        return prospective == spec

    @_require_version_compare
    def _compare_not_equal(self, prospective, spec):
        return not self._compare_equal(prospective, spec)

    @_require_version_compare
    def _compare_less_than_equal(self, prospective, spec):
        return prospective <= Version(spec)

    @_require_version_compare
    def _compare_greater_than_equal(self, prospective, spec):
        return prospective >= Version(spec)

    @_require_version_compare
    def _compare_less_than(self, prospective, spec):
        # Convert our spec to a Version instance, since we'll want to work with
        # it as a version.
        spec = Version(spec)

        # Check to see if the prospective version is less than the spec
        # version. If it's not we can short circuit and just return False now
        # instead of doing extra unneeded work.
        if not prospective < spec:
            return False

        # This special case is here so that, unless the specifier itself
        # includes is a pre-release version, that we do not accept pre-release
        # versions for the version mentioned in the specifier (e.g. <3.1 should
        # not match 3.1.dev0, but should match 3.0.dev0).
        if not spec.is_prerelease and prospective.is_prerelease:
            if Version(prospective.base_version) == Version(spec.base_version):
                return False

        # If we've gotten to here, it means that prospective version is both
        # less than the spec version *and* it's not a pre-release of the same
        # version in the spec.
        return True

    @_require_version_compare
    def _compare_greater_than(self, prospective, spec):
        # Convert our spec to a Version instance, since we'll want to work with
        # it as a version.
        spec = Version(spec)

        # Check to see if the prospective version is greater than the spec
        # version. If it's not we can short circuit and just return False now
        # instead of doing extra unneeded work.
        if not prospective > spec:
            return False

        # This special case is here so that, unless the specifier itself
        # includes is a post-release version, that we do not accept
        # post-release versions for the version mentioned in the specifier
        # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0).
        if not spec.is_postrelease and prospective.is_postrelease:
            if Version(prospective.base_version) == Version(spec.base_version):
                return False

        # Ensure that we do not allow a local version of the version mentioned
        # in the specifier, which is techincally greater than, to match.
        if prospective.local is not None:
            if Version(prospective.base_version) == Version(spec.base_version):
                return False

        # If we've gotten to here, it means that prospective version is both
        # greater than the spec version *and* it's not a pre-release of the
        # same version in the spec.
        return True

    def _compare_arbitrary(self, prospective, spec):
        return str(prospective).lower() == str(spec).lower()

    @property
    def prereleases(self):
        # If there is an explicit prereleases set for this, then we'll just
        # blindly use that.
        if self._prereleases is not None:
            return self._prereleases

        # Look at all of our specifiers and determine if they are inclusive
        # operators, and if they are if they are including an explicit
        # prerelease.
        operator, version = self._spec
        if operator in ["==", ">=", "<=", "~=", "==="]:
            # The == specifier can include a trailing .*, if it does we
            # want to remove before parsing.
            if operator == "==" and version.endswith(".*"):
                version = version[:-2]

            # Parse the version, and if it is a pre-release than this
            # specifier allows pre-releases.
            if parse(version).is_prerelease:
                return True

        return False

    @prereleases.setter
    def prereleases(self, value):
        self._prereleases = value


_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")


def _version_split(version):
    result = []
    for item in version.split("."):
        match = _prefix_regex.search(item)
        if match:
            result.extend(match.groups())
        else:
            result.append(item)
    return result


def _pad_version(left, right):
    left_split, right_split = [], []

    # Get the release segment of our versions
    left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left)))
    right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right)))

    # Get the rest of our versions
    left_split.append(left[len(left_split[0]):])
    right_split.append(right[len(right_split[0]):])

    # Insert our padding
    left_split.insert(
        1,
        ["0"] * max(0, len(right_split[0]) - len(left_split[0])),
    )
    right_split.insert(
        1,
        ["0"] * max(0, len(left_split[0]) - len(right_split[0])),
    )

    return (
        list(itertools.chain(*left_split)),
        list(itertools.chain(*right_split)),
    )


class SpecifierSet(BaseSpecifier):

    def __init__(self, specifiers="", prereleases=None):
        # Split on , to break each indidivual specifier into it's own item, and
        # strip each item to remove leading/trailing whitespace.
        specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]

        # Parsed each individual specifier, attempting first to make it a
        # Specifier and falling back to a LegacySpecifier.
        parsed = set()
        for specifier in specifiers:
            try:
                parsed.add(Specifier(specifier))
            except InvalidSpecifier:
                parsed.add(LegacySpecifier(specifier))

        # Turn our parsed specifiers into a frozen set and save them for later.
        self._specs = frozenset(parsed)

        # Store our prereleases value so we can use it later to determine if
        # we accept prereleases or not.
        self._prereleases = prereleases

    def __repr__(self):
        pre = (
            ", prereleases={0!r}".format(self.prereleases)
            if self._prereleases is not None
            else ""
        )

        return "".format(str(self), pre)

    def __str__(self):
        return ",".join(sorted(str(s) for s in self._specs))

    def __hash__(self):
        return hash(self._specs)

    def __and__(self, other):
        if isinstance(other, string_types):
            other = SpecifierSet(other)
        elif not isinstance(other, SpecifierSet):
            return NotImplemented

        specifier = SpecifierSet()
        specifier._specs = frozenset(self._specs | other._specs)

        if self._prereleases is None and other._prereleases is not None:
            specifier._prereleases = other._prereleases
        elif self._prereleases is not None and other._prereleases is None:
            specifier._prereleases = self._prereleases
        elif self._prereleases == other._prereleases:
            specifier._prereleases = self._prereleases
        else:
            raise ValueError(
                "Cannot combine SpecifierSets with True and False prerelease "
                "overrides."
            )

        return specifier

    def __eq__(self, other):
        if isinstance(other, string_types):
            other = SpecifierSet(other)
        elif isinstance(other, _IndividualSpecifier):
            other = SpecifierSet(str(other))
        elif not isinstance(other, SpecifierSet):
            return NotImplemented

        return self._specs == other._specs

    def __ne__(self, other):
        if isinstance(other, string_types):
            other = SpecifierSet(other)
        elif isinstance(other, _IndividualSpecifier):
            other = SpecifierSet(str(other))
        elif not isinstance(other, SpecifierSet):
            return NotImplemented

        return self._specs != other._specs

    def __len__(self):
        return len(self._specs)

    def __iter__(self):
        return iter(self._specs)

    @property
    def prereleases(self):
        # If we have been given an explicit prerelease modifier, then we'll
        # pass that through here.
        if self._prereleases is not None:
            return self._prereleases

        # If we don't have any specifiers, and we don't have a forced value,
        # then we'll just return None since we don't know if this should have
        # pre-releases or not.
        if not self._specs:
            return None

        # Otherwise we'll see if any of the given specifiers accept
        # prereleases, if any of them do we'll return True, otherwise False.
        return any(s.prereleases for s in self._specs)

    @prereleases.setter
    def prereleases(self, value):
        self._prereleases = value

    def __contains__(self, item):
        return self.contains(item)

    def contains(self, item, prereleases=None):
        # Ensure that our item is a Version or LegacyVersion instance.
        if not isinstance(item, (LegacyVersion, Version)):
            item = parse(item)

        # Determine if we're forcing a prerelease or not, if we're not forcing
        # one for this particular filter call, then we'll use whatever the
        # SpecifierSet thinks for whether or not we should support prereleases.
        if prereleases is None:
            prereleases = self.prereleases

        # We can determine if we're going to allow pre-releases by looking to
        # see if any of the underlying items supports them. If none of them do
        # and this item is a pre-release then we do not allow it and we can
        # short circuit that here.
        # Note: This means that 1.0.dev1 would not be contained in something
        #       like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0
        if not prereleases and item.is_prerelease:
            return False

        # We simply dispatch to the underlying specs here to make sure that the
        # given version is contained within all of them.
        # Note: This use of all() here means that an empty set of specifiers
        #       will always return True, this is an explicit design decision.
        return all(
            s.contains(item, prereleases=prereleases)
            for s in self._specs
        )

    def filter(self, iterable, prereleases=None):
        # Determine if we're forcing a prerelease or not, if we're not forcing
        # one for this particular filter call, then we'll use whatever the
        # SpecifierSet thinks for whether or not we should support prereleases.
        if prereleases is None:
            prereleases = self.prereleases

        # If we have any specifiers, then we want to wrap our iterable in the
        # filter method for each one, this will act as a logical AND amongst
        # each specifier.
        if self._specs:
            for spec in self._specs:
                iterable = spec.filter(iterable, prereleases=bool(prereleases))
            return iterable
        # If we do not have any specifiers, then we need to have a rough filter
        # which will filter out any pre-releases, unless there are no final
        # releases, and which will filter out LegacyVersion in general.
        else:
            filtered = []
            found_prereleases = []

            for item in iterable:
                # Ensure that we some kind of Version class for this item.
                if not isinstance(item, (LegacyVersion, Version)):
                    parsed_version = parse(item)
                else:
                    parsed_version = item

                # Filter out any item which is parsed as a LegacyVersion
                if isinstance(parsed_version, LegacyVersion):
                    continue

                # Store any item which is a pre-release for later unless we've
                # already found a final version or we are accepting prereleases
                if parsed_version.is_prerelease and not prereleases:
                    if not filtered:
                        found_prereleases.append(item)
                else:
                    filtered.append(item)

            # If we've found no items except for pre-releases, then we'll go
            # ahead and use the pre-releases
            if not filtered and found_prereleases and prereleases is None:
                return found_prereleases

            return filtered
PK!'_vendor/packaging/utils.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import re


_canonicalize_regex = re.compile(r"[-_.]+")


def canonicalize_name(name):
    # This is taken from PEP 503.
    return _canonicalize_regex.sub("-", name).lower()
PK!ơ$-$-_vendor/packaging/version.pynu[# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import collections
import itertools
import re

from ._structures import Infinity


__all__ = [
    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"
]


_Version = collections.namedtuple(
    "_Version",
    ["epoch", "release", "dev", "pre", "post", "local"],
)


def parse(version):
    """
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    """
    try:
        return Version(version)
    except InvalidVersion:
        return LegacyVersion(version)


class InvalidVersion(ValueError):
    """
    An invalid version was found, users should refer to PEP 440.
    """


class _BaseVersion(object):

    def __hash__(self):
        return hash(self._key)

    def __lt__(self, other):
        return self._compare(other, lambda s, o: s < o)

    def __le__(self, other):
        return self._compare(other, lambda s, o: s <= o)

    def __eq__(self, other):
        return self._compare(other, lambda s, o: s == o)

    def __ge__(self, other):
        return self._compare(other, lambda s, o: s >= o)

    def __gt__(self, other):
        return self._compare(other, lambda s, o: s > o)

    def __ne__(self, other):
        return self._compare(other, lambda s, o: s != o)

    def _compare(self, other, method):
        if not isinstance(other, _BaseVersion):
            return NotImplemented

        return method(self._key, other._key)


class LegacyVersion(_BaseVersion):

    def __init__(self, version):
        self._version = str(version)
        self._key = _legacy_cmpkey(self._version)

    def __str__(self):
        return self._version

    def __repr__(self):
        return "".format(repr(str(self)))

    @property
    def public(self):
        return self._version

    @property
    def base_version(self):
        return self._version

    @property
    def local(self):
        return None

    @property
    def is_prerelease(self):
        return False

    @property
    def is_postrelease(self):
        return False


_legacy_version_component_re = re.compile(
    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
)

_legacy_version_replacement_map = {
    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
}


def _parse_version_parts(s):
    for part in _legacy_version_component_re.split(s):
        part = _legacy_version_replacement_map.get(part, part)

        if not part or part == ".":
            continue

        if part[:1] in "0123456789":
            # pad for numeric comparison
            yield part.zfill(8)
        else:
            yield "*" + part

    # ensure that alpha/beta/candidate are before final
    yield "*final"


def _legacy_cmpkey(version):
    # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
    # greater than or equal to 0. This will effectively put the LegacyVersion,
    # which uses the defacto standard originally implemented by setuptools,
    # as before all PEP 440 versions.
    epoch = -1

    # This scheme is taken from pkg_resources.parse_version setuptools prior to
    # it's adoption of the packaging library.
    parts = []
    for part in _parse_version_parts(version.lower()):
        if part.startswith("*"):
            # remove "-" before a prerelease tag
            if part < "*final":
                while parts and parts[-1] == "*final-":
                    parts.pop()

            # remove trailing zeros from each series of numeric parts
            while parts and parts[-1] == "00000000":
                parts.pop()

        parts.append(part)
    parts = tuple(parts)

    return epoch, parts

# Deliberately not anchored to the start and end of the string, to make it
# easier for 3rd party code to reuse
VERSION_PATTERN = r"""
    v?
    (?:
        (?:(?P[0-9]+)!)?                           # epoch
        (?P[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P
                                          # pre-release
            [-_\.]?
            (?P(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
"""


class Version(_BaseVersion):

    _regex = re.compile(
        r"^\s*" + VERSION_PATTERN + r"\s*$",
        re.VERBOSE | re.IGNORECASE,
    )

    def __init__(self, version):
        # Validate the version and parse it into pieces
        match = self._regex.search(version)
        if not match:
            raise InvalidVersion("Invalid version: '{0}'".format(version))

        # Store the parsed out pieces of the version
        self._version = _Version(
            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
            release=tuple(int(i) for i in match.group("release").split(".")),
            pre=_parse_letter_version(
                match.group("pre_l"),
                match.group("pre_n"),
            ),
            post=_parse_letter_version(
                match.group("post_l"),
                match.group("post_n1") or match.group("post_n2"),
            ),
            dev=_parse_letter_version(
                match.group("dev_l"),
                match.group("dev_n"),
            ),
            local=_parse_local_version(match.group("local")),
        )

        # Generate a key which will be used for sorting
        self._key = _cmpkey(
            self._version.epoch,
            self._version.release,
            self._version.pre,
            self._version.post,
            self._version.dev,
            self._version.local,
        )

    def __repr__(self):
        return "".format(repr(str(self)))

    def __str__(self):
        parts = []

        # Epoch
        if self._version.epoch != 0:
            parts.append("{0}!".format(self._version.epoch))

        # Release segment
        parts.append(".".join(str(x) for x in self._version.release))

        # Pre-release
        if self._version.pre is not None:
            parts.append("".join(str(x) for x in self._version.pre))

        # Post-release
        if self._version.post is not None:
            parts.append(".post{0}".format(self._version.post[1]))

        # Development release
        if self._version.dev is not None:
            parts.append(".dev{0}".format(self._version.dev[1]))

        # Local version segment
        if self._version.local is not None:
            parts.append(
                "+{0}".format(".".join(str(x) for x in self._version.local))
            )

        return "".join(parts)

    @property
    def public(self):
        return str(self).split("+", 1)[0]

    @property
    def base_version(self):
        parts = []

        # Epoch
        if self._version.epoch != 0:
            parts.append("{0}!".format(self._version.epoch))

        # Release segment
        parts.append(".".join(str(x) for x in self._version.release))

        return "".join(parts)

    @property
    def local(self):
        version_string = str(self)
        if "+" in version_string:
            return version_string.split("+", 1)[1]

    @property
    def is_prerelease(self):
        return bool(self._version.dev or self._version.pre)

    @property
    def is_postrelease(self):
        return bool(self._version.post)


def _parse_letter_version(letter, number):
    if letter:
        # We consider there to be an implicit 0 in a pre-release if there is
        # not a numeral associated with it.
        if number is None:
            number = 0

        # We normalize any letters to their lower case form
        letter = letter.lower()

        # We consider some words to be alternate spellings of other words and
        # in those cases we want to normalize the spellings to our preferred
        # spelling.
        if letter == "alpha":
            letter = "a"
        elif letter == "beta":
            letter = "b"
        elif letter in ["c", "pre", "preview"]:
            letter = "rc"
        elif letter in ["rev", "r"]:
            letter = "post"

        return letter, int(number)
    if not letter and number:
        # We assume if we are given a number, but we are not given a letter
        # then this is using the implicit post release syntax (e.g. 1.0-1)
        letter = "post"

        return letter, int(number)


_local_version_seperators = re.compile(r"[\._-]")


def _parse_local_version(local):
    """
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    """
    if local is not None:
        return tuple(
            part.lower() if not part.isdigit() else int(part)
            for part in _local_version_seperators.split(local)
        )


def _cmpkey(epoch, release, pre, post, dev, local):
    # When we compare a release version, we want to compare it with all of the
    # trailing zeros removed. So we'll use a reverse the list, drop all the now
    # leading zeros until we come to something non zero, then take the rest
    # re-reverse it back into the correct order and make it a tuple and use
    # that for our sorting key.
    release = tuple(
        reversed(list(
            itertools.dropwhile(
                lambda x: x == 0,
                reversed(release),
            )
        ))
    )

    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
    # We'll do this by abusing the pre segment, but we _only_ want to do this
    # if there is not a pre or a post segment. If we have one of those then
    # the normal sorting rules will handle this case correctly.
    if pre is None and post is None and dev is not None:
        pre = -Infinity
    # Versions without a pre-release (except as noted above) should sort after
    # those with one.
    elif pre is None:
        pre = Infinity

    # Versions without a post segment should sort before those with one.
    if post is None:
        post = -Infinity

    # Versions without a development segment should sort after those with one.
    if dev is None:
        dev = Infinity

    if local is None:
        # Versions without a local segment should sort before those with one.
        local = -Infinity
    else:
        # Versions with a local segment need that segment parsed to implement
        # the sorting rules in PEP440.
        # - Alpha numeric segments sort before numeric segments
        # - Alpha numeric segments sort lexicographically
        # - Numeric segments sort numerically
        # - Shorter versions sort before longer versions when the prefixes
        #   match exactly
        local = tuple(
            (i, "") if isinstance(i, int) else (-Infinity, i)
            for i in local
        )

    return epoch, release, pre, post, dev, local
PK!_vendor/__init__.pynu[PK!x(_vendor/pyparsing.pynu[# module pyparsing.py
#
# Copyright (c) 2003-2016  Paul T. McGuire
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#

__doc__ = \
"""
pyparsing module - Classes and methods to define and execute parsing grammars

The pyparsing module is an alternative approach to creating and executing simple grammars,
vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
provides a library of classes that you use to construct the grammar directly in Python.

Here is a program to parse "Hello, World!" (or any greeting of the form 
C{", !"}), built up using L{Word}, L{Literal}, and L{And} elements 
(L{'+'} operator gives L{And} expressions, strings are auto-converted to
L{Literal} expressions)::

    from pyparsing import Word, alphas

    # define grammar of a greeting
    greet = Word(alphas) + "," + Word(alphas) + "!"

    hello = "Hello, World!"
    print (hello, "->", greet.parseString(hello))

The program outputs the following::

    Hello, World! -> ['Hello', ',', 'World', '!']

The Python representation of the grammar is quite readable, owing to the self-explanatory
class names, and the use of '+', '|' and '^' operators.

The L{ParseResults} object returned from L{ParserElement.parseString} can be accessed as a nested list, a dictionary, or an
object with named attributes.

The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
 - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
 - quoted strings
 - embedded comments
"""

__version__ = "2.1.10"
__versionTime__ = "07 Oct 2016 01:31 UTC"
__author__ = "Paul McGuire "

import string
from weakref import ref as wkref
import copy
import sys
import warnings
import re
import sre_constants
import collections
import pprint
import traceback
import types
from datetime import datetime

try:
    from _thread import RLock
except ImportError:
    from threading import RLock

try:
    from collections import OrderedDict as _OrderedDict
except ImportError:
    try:
        from ordereddict import OrderedDict as _OrderedDict
    except ImportError:
        _OrderedDict = None

#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )

__all__ = [
'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 
'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore',
'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums',
'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno',
'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 
'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass',
'CloseMatch', 'tokenMap', 'pyparsing_common',
]

system_version = tuple(sys.version_info)[:3]
PY_3 = system_version[0] == 3
if PY_3:
    _MAX_INT = sys.maxsize
    basestring = str
    unichr = chr
    _ustr = str

    # build list of single arg builtins, that can be used as parse actions
    singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max]

else:
    _MAX_INT = sys.maxint
    range = xrange

    def _ustr(obj):
        """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
           then < returns the unicode object | encodes it with the default encoding | ... >.
        """
        if isinstance(obj,unicode):
            return obj

        try:
            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
            # it won't break any existing code.
            return str(obj)

        except UnicodeEncodeError:
            # Else encode it
            ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace')
            xmlcharref = Regex('&#\d+;')
            xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:])
            return xmlcharref.transformString(ret)

    # build list of single arg builtins, tolerant of Python version, that can be used as parse actions
    singleArgBuiltins = []
    import __builtin__
    for fname in "sum len sorted reversed list tuple set any all min max".split():
        try:
            singleArgBuiltins.append(getattr(__builtin__,fname))
        except AttributeError:
            continue
            
_generatorType = type((y for y in range(1)))
 
def _xml_escape(data):
    """Escape &, <, >, ", ', etc. in a string of data."""

    # ampersand must be replaced first
    from_symbols = '&><"\''
    to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split())
    for from_,to_ in zip(from_symbols, to_symbols):
        data = data.replace(from_, to_)
    return data

class _Constants(object):
    pass

alphas     = string.ascii_uppercase + string.ascii_lowercase
nums       = "0123456789"
hexnums    = nums + "ABCDEFabcdef"
alphanums  = alphas + nums
_bslash    = chr(92)
printables = "".join(c for c in string.printable if c not in string.whitespace)

class ParseBaseException(Exception):
    """base exception class for all parsing runtime exceptions"""
    # Performance tuning: we construct a *lot* of these, so keep this
    # constructor as small and fast as possible
    def __init__( self, pstr, loc=0, msg=None, elem=None ):
        self.loc = loc
        if msg is None:
            self.msg = pstr
            self.pstr = ""
        else:
            self.msg = msg
            self.pstr = pstr
        self.parserElement = elem
        self.args = (pstr, loc, msg)

    @classmethod
    def _from_exception(cls, pe):
        """
        internal factory method to simplify creating one type of ParseException 
        from another - avoids having __init__ signature conflicts among subclasses
        """
        return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement)

    def __getattr__( self, aname ):
        """supported attributes by name are:
            - lineno - returns the line number of the exception text
            - col - returns the column number of the exception text
            - line - returns the line containing the exception text
        """
        if( aname == "lineno" ):
            return lineno( self.loc, self.pstr )
        elif( aname in ("col", "column") ):
            return col( self.loc, self.pstr )
        elif( aname == "line" ):
            return line( self.loc, self.pstr )
        else:
            raise AttributeError(aname)

    def __str__( self ):
        return "%s (at char %d), (line:%d, col:%d)" % \
                ( self.msg, self.loc, self.lineno, self.column )
    def __repr__( self ):
        return _ustr(self)
    def markInputline( self, markerString = ">!<" ):
        """Extracts the exception line from the input string, and marks
           the location of the exception with a special symbol.
        """
        line_str = self.line
        line_column = self.column - 1
        if markerString:
            line_str = "".join((line_str[:line_column],
                                markerString, line_str[line_column:]))
        return line_str.strip()
    def __dir__(self):
        return "lineno col line".split() + dir(type(self))

class ParseException(ParseBaseException):
    """
    Exception thrown when parse expressions don't match class;
    supported attributes by name are:
     - lineno - returns the line number of the exception text
     - col - returns the column number of the exception text
     - line - returns the line containing the exception text
        
    Example::
        try:
            Word(nums).setName("integer").parseString("ABC")
        except ParseException as pe:
            print(pe)
            print("column: {}".format(pe.col))
            
    prints::
       Expected integer (at char 0), (line:1, col:1)
        column: 1
    """
    pass

class ParseFatalException(ParseBaseException):
    """user-throwable exception thrown when inconsistent parse content
       is found; stops all parsing immediately"""
    pass

class ParseSyntaxException(ParseFatalException):
    """just like L{ParseFatalException}, but thrown internally when an
       L{ErrorStop} ('-' operator) indicates that parsing is to stop 
       immediately because an unbacktrackable syntax error has been found"""
    pass

#~ class ReparseException(ParseBaseException):
    #~ """Experimental class - parse actions can raise this exception to cause
       #~ pyparsing to reparse the input string:
        #~ - with a modified input string, and/or
        #~ - with a modified start location
       #~ Set the values of the ReparseException in the constructor, and raise the
       #~ exception in a parse action to cause pyparsing to use the new string/location.
       #~ Setting the values as None causes no change to be made.
       #~ """
    #~ def __init_( self, newstring, restartLoc ):
        #~ self.newParseText = newstring
        #~ self.reparseLoc = restartLoc

class RecursiveGrammarException(Exception):
    """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive"""
    def __init__( self, parseElementList ):
        self.parseElementTrace = parseElementList

    def __str__( self ):
        return "RecursiveGrammarException: %s" % self.parseElementTrace

class _ParseResultsWithOffset(object):
    def __init__(self,p1,p2):
        self.tup = (p1,p2)
    def __getitem__(self,i):
        return self.tup[i]
    def __repr__(self):
        return repr(self.tup[0])
    def setOffset(self,i):
        self.tup = (self.tup[0],i)

class ParseResults(object):
    """
    Structured parse results, to provide multiple means of access to the parsed data:
       - as a list (C{len(results)})
       - by list index (C{results[0], results[1]}, etc.)
       - by attribute (C{results.} - see L{ParserElement.setResultsName})

    Example::
        integer = Word(nums)
        date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))
        # equivalent form:
        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")

        # parseString returns a ParseResults object
        result = date_str.parseString("1999/12/31")

        def test(s, fn=repr):
            print("%s -> %s" % (s, fn(eval(s))))
        test("list(result)")
        test("result[0]")
        test("result['month']")
        test("result.day")
        test("'month' in result")
        test("'minutes' in result")
        test("result.dump()", str)
    prints::
        list(result) -> ['1999', '/', '12', '/', '31']
        result[0] -> '1999'
        result['month'] -> '12'
        result.day -> '31'
        'month' in result -> True
        'minutes' in result -> False
        result.dump() -> ['1999', '/', '12', '/', '31']
        - day: 31
        - month: 12
        - year: 1999
    """
    def __new__(cls, toklist=None, name=None, asList=True, modal=True ):
        if isinstance(toklist, cls):
            return toklist
        retobj = object.__new__(cls)
        retobj.__doinit = True
        return retobj

    # Performance tuning: we construct a *lot* of these, so keep this
    # constructor as small and fast as possible
    def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ):
        if self.__doinit:
            self.__doinit = False
            self.__name = None
            self.__parent = None
            self.__accumNames = {}
            self.__asList = asList
            self.__modal = modal
            if toklist is None:
                toklist = []
            if isinstance(toklist, list):
                self.__toklist = toklist[:]
            elif isinstance(toklist, _generatorType):
                self.__toklist = list(toklist)
            else:
                self.__toklist = [toklist]
            self.__tokdict = dict()

        if name is not None and name:
            if not modal:
                self.__accumNames[name] = 0
            if isinstance(name,int):
                name = _ustr(name) # will always return a str, but use _ustr for consistency
            self.__name = name
            if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])):
                if isinstance(toklist,basestring):
                    toklist = [ toklist ]
                if asList:
                    if isinstance(toklist,ParseResults):
                        self[name] = _ParseResultsWithOffset(toklist.copy(),0)
                    else:
                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0)
                    self[name].__name = name
                else:
                    try:
                        self[name] = toklist[0]
                    except (KeyError,TypeError,IndexError):
                        self[name] = toklist

    def __getitem__( self, i ):
        if isinstance( i, (int,slice) ):
            return self.__toklist[i]
        else:
            if i not in self.__accumNames:
                return self.__tokdict[i][-1][0]
            else:
                return ParseResults([ v[0] for v in self.__tokdict[i] ])

    def __setitem__( self, k, v, isinstance=isinstance ):
        if isinstance(v,_ParseResultsWithOffset):
            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
            sub = v[0]
        elif isinstance(k,(int,slice)):
            self.__toklist[k] = v
            sub = v
        else:
            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
            sub = v
        if isinstance(sub,ParseResults):
            sub.__parent = wkref(self)

    def __delitem__( self, i ):
        if isinstance(i,(int,slice)):
            mylen = len( self.__toklist )
            del self.__toklist[i]

            # convert int to slice
            if isinstance(i, int):
                if i < 0:
                    i += mylen
                i = slice(i, i+1)
            # get removed indices
            removed = list(range(*i.indices(mylen)))
            removed.reverse()
            # fixup indices in token dictionary
            for name,occurrences in self.__tokdict.items():
                for j in removed:
                    for k, (value, position) in enumerate(occurrences):
                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
        else:
            del self.__tokdict[i]

    def __contains__( self, k ):
        return k in self.__tokdict

    def __len__( self ): return len( self.__toklist )
    def __bool__(self): return ( not not self.__toklist )
    __nonzero__ = __bool__
    def __iter__( self ): return iter( self.__toklist )
    def __reversed__( self ): return iter( self.__toklist[::-1] )
    def _iterkeys( self ):
        if hasattr(self.__tokdict, "iterkeys"):
            return self.__tokdict.iterkeys()
        else:
            return iter(self.__tokdict)

    def _itervalues( self ):
        return (self[k] for k in self._iterkeys())
            
    def _iteritems( self ):
        return ((k, self[k]) for k in self._iterkeys())

    if PY_3:
        keys = _iterkeys       
        """Returns an iterator of all named result keys (Python 3.x only)."""

        values = _itervalues
        """Returns an iterator of all named result values (Python 3.x only)."""

        items = _iteritems
        """Returns an iterator of all named result key-value tuples (Python 3.x only)."""

    else:
        iterkeys = _iterkeys
        """Returns an iterator of all named result keys (Python 2.x only)."""

        itervalues = _itervalues
        """Returns an iterator of all named result values (Python 2.x only)."""

        iteritems = _iteritems
        """Returns an iterator of all named result key-value tuples (Python 2.x only)."""

        def keys( self ):
            """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x)."""
            return list(self.iterkeys())

        def values( self ):
            """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x)."""
            return list(self.itervalues())
                
        def items( self ):
            """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x)."""
            return list(self.iteritems())

    def haskeys( self ):
        """Since keys() returns an iterator, this method is helpful in bypassing
           code that looks for the existence of any defined results names."""
        return bool(self.__tokdict)
        
    def pop( self, *args, **kwargs):
        """
        Removes and returns item at specified index (default=C{last}).
        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
        argument or an integer argument, it will use C{list} semantics
        and pop tokens from the list of parsed tokens. If passed a 
        non-integer argument (most likely a string), it will use C{dict}
        semantics and pop the corresponding value from any defined 
        results names. A second default return value argument is 
        supported, just as in C{dict.pop()}.

        Example::
            def remove_first(tokens):
                tokens.pop(0)
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']

            label = Word(alphas)
            patt = label("LABEL") + OneOrMore(Word(nums))
            print(patt.parseString("AAB 123 321").dump())

            # Use pop() in a parse action to remove named result (note that corresponding value is not
            # removed from list form of results)
            def remove_LABEL(tokens):
                tokens.pop("LABEL")
                return tokens
            patt.addParseAction(remove_LABEL)
            print(patt.parseString("AAB 123 321").dump())
        prints::
            ['AAB', '123', '321']
            - LABEL: AAB

            ['AAB', '123', '321']
        """
        if not args:
            args = [-1]
        for k,v in kwargs.items():
            if k == 'default':
                args = (args[0], v)
            else:
                raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
        if (isinstance(args[0], int) or 
                        len(args) == 1 or 
                        args[0] in self):
            index = args[0]
            ret = self[index]
            del self[index]
            return ret
        else:
            defaultvalue = args[1]
            return defaultvalue

    def get(self, key, defaultValue=None):
        """
        Returns named result matching the given key, or if there is no
        such name, then returns the given C{defaultValue} or C{None} if no
        C{defaultValue} is specified.

        Similar to C{dict.get()}.
        
        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            result = date_str.parseString("1999/12/31")
            print(result.get("year")) # -> '1999'
            print(result.get("hour", "not specified")) # -> 'not specified'
            print(result.get("hour")) # -> None
        """
        if key in self:
            return self[key]
        else:
            return defaultValue

    def insert( self, index, insStr ):
        """
        Inserts new element at location index in the list of parsed tokens.
        
        Similar to C{list.insert()}.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']

            # use a parse action to insert the parse location in the front of the parsed results
            def insert_locn(locn, tokens):
                tokens.insert(0, locn)
            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
        """
        self.__toklist.insert(index, insStr)
        # fixup indices in token dictionary
        for name,occurrences in self.__tokdict.items():
            for k, (value, position) in enumerate(occurrences):
                occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))

    def append( self, item ):
        """
        Add single element to end of ParseResults list of elements.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            
            # use a parse action to compute the sum of the parsed integers, and add it to the end
            def append_sum(tokens):
                tokens.append(sum(map(int, tokens)))
            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
        """
        self.__toklist.append(item)

    def extend( self, itemseq ):
        """
        Add sequence of elements to end of ParseResults list of elements.

        Example::
            patt = OneOrMore(Word(alphas))
            
            # use a parse action to append the reverse of the matched strings, to make a palindrome
            def make_palindrome(tokens):
                tokens.extend(reversed([t[::-1] for t in tokens]))
                return ''.join(tokens)
            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
        """
        if isinstance(itemseq, ParseResults):
            self += itemseq
        else:
            self.__toklist.extend(itemseq)

    def clear( self ):
        """
        Clear all elements and results names.
        """
        del self.__toklist[:]
        self.__tokdict.clear()

    def __getattr__( self, name ):
        try:
            return self[name]
        except KeyError:
            return ""
            
        if name in self.__tokdict:
            if name not in self.__accumNames:
                return self.__tokdict[name][-1][0]
            else:
                return ParseResults([ v[0] for v in self.__tokdict[name] ])
        else:
            return ""

    def __add__( self, other ):
        ret = self.copy()
        ret += other
        return ret

    def __iadd__( self, other ):
        if other.__tokdict:
            offset = len(self.__toklist)
            addoffset = lambda a: offset if a<0 else a+offset
            otheritems = other.__tokdict.items()
            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
                                for (k,vlist) in otheritems for v in vlist]
            for k,v in otherdictitems:
                self[k] = v
                if isinstance(v[0],ParseResults):
                    v[0].__parent = wkref(self)
            
        self.__toklist += other.__toklist
        self.__accumNames.update( other.__accumNames )
        return self

    def __radd__(self, other):
        if isinstance(other,int) and other == 0:
            # useful for merging many ParseResults using sum() builtin
            return self.copy()
        else:
            # this may raise a TypeError - so be it
            return other + self
        
    def __repr__( self ):
        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )

    def __str__( self ):
        return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']'

    def _asStringList( self, sep='' ):
        out = []
        for item in self.__toklist:
            if out and sep:
                out.append(sep)
            if isinstance( item, ParseResults ):
                out += item._asStringList()
            else:
                out.append( _ustr(item) )
        return out

    def asList( self ):
        """
        Returns the parse results as a nested list of matching tokens, all converted to strings.

        Example::
            patt = OneOrMore(Word(alphas))
            result = patt.parseString("sldkj lsdkj sldkj")
            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
            print(type(result), result) # ->  ['sldkj', 'lsdkj', 'sldkj']
            
            # Use asList() to create an actual list
            result_list = result.asList()
            print(type(result_list), result_list) # ->  ['sldkj', 'lsdkj', 'sldkj']
        """
        return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist]

    def asDict( self ):
        """
        Returns the named parse results as a nested dictionary.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(type(result), repr(result)) # ->  (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
            
            result_dict = result.asDict()
            print(type(result_dict), repr(result_dict)) # ->  {'day': '1999', 'year': '12', 'month': '31'}

            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
            import json
            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
        """
        if PY_3:
            item_fn = self.items
        else:
            item_fn = self.iteritems
            
        def toItem(obj):
            if isinstance(obj, ParseResults):
                if obj.haskeys():
                    return obj.asDict()
                else:
                    return [toItem(v) for v in obj]
            else:
                return obj
                
        return dict((k,toItem(v)) for k,v in item_fn())

    def copy( self ):
        """
        Returns a new copy of a C{ParseResults} object.
        """
        ret = ParseResults( self.__toklist )
        ret.__tokdict = self.__tokdict.copy()
        ret.__parent = self.__parent
        ret.__accumNames.update( self.__accumNames )
        ret.__name = self.__name
        return ret

    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
        """
        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
        """
        nl = "\n"
        out = []
        namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items()
                                                            for v in vlist)
        nextLevelIndent = indent + "  "

        # collapse out indents if formatting is not desired
        if not formatted:
            indent = ""
            nextLevelIndent = ""
            nl = ""

        selfTag = None
        if doctag is not None:
            selfTag = doctag
        else:
            if self.__name:
                selfTag = self.__name

        if not selfTag:
            if namedItemsOnly:
                return ""
            else:
                selfTag = "ITEM"

        out += [ nl, indent, "<", selfTag, ">" ]

        for i,res in enumerate(self.__toklist):
            if isinstance(res,ParseResults):
                if i in namedItems:
                    out += [ res.asXML(namedItems[i],
                                        namedItemsOnly and doctag is None,
                                        nextLevelIndent,
                                        formatted)]
                else:
                    out += [ res.asXML(None,
                                        namedItemsOnly and doctag is None,
                                        nextLevelIndent,
                                        formatted)]
            else:
                # individual token, see if there is a name for it
                resTag = None
                if i in namedItems:
                    resTag = namedItems[i]
                if not resTag:
                    if namedItemsOnly:
                        continue
                    else:
                        resTag = "ITEM"
                xmlBodyText = _xml_escape(_ustr(res))
                out += [ nl, nextLevelIndent, "<", resTag, ">",
                                                xmlBodyText,
                                                "" ]

        out += [ nl, indent, "" ]
        return "".join(out)

    def __lookup(self,sub):
        for k,vlist in self.__tokdict.items():
            for v,loc in vlist:
                if sub is v:
                    return k
        return None

    def getName(self):
        """
        Returns the results name for this token expression. Useful when several 
        different expressions might match at a particular location.

        Example::
            integer = Word(nums)
            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
            house_number_expr = Suppress('#') + Word(nums, alphanums)
            user_data = (Group(house_number_expr)("house_number") 
                        | Group(ssn_expr)("ssn")
                        | Group(integer)("age"))
            user_info = OneOrMore(user_data)
            
            result = user_info.parseString("22 111-22-3333 #221B")
            for item in result:
                print(item.getName(), ':', item[0])
        prints::
            age : 22
            ssn : 111-22-3333
            house_number : 221B
        """
        if self.__name:
            return self.__name
        elif self.__parent:
            par = self.__parent()
            if par:
                return par.__lookup(self)
            else:
                return None
        elif (len(self) == 1 and
               len(self.__tokdict) == 1 and
               next(iter(self.__tokdict.values()))[0][1] in (0,-1)):
            return next(iter(self.__tokdict.keys()))
        else:
            return None

    def dump(self, indent='', depth=0, full=True):
        """
        Diagnostic method for listing out the contents of a C{ParseResults}.
        Accepts an optional C{indent} argument so that this string can be embedded
        in a nested display of other data.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(result.dump())
        prints::
            ['12', '/', '31', '/', '1999']
            - day: 1999
            - month: 31
            - year: 12
        """
        out = []
        NL = '\n'
        out.append( indent+_ustr(self.asList()) )
        if full:
            if self.haskeys():
                items = sorted((str(k), v) for k,v in self.items())
                for k,v in items:
                    if out:
                        out.append(NL)
                    out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
                    if isinstance(v,ParseResults):
                        if v:
                            out.append( v.dump(indent,depth+1) )
                        else:
                            out.append(_ustr(v))
                    else:
                        out.append(repr(v))
            elif any(isinstance(vv,ParseResults) for vv in self):
                v = self
                for i,vv in enumerate(v):
                    if isinstance(vv,ParseResults):
                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),vv.dump(indent,depth+1) ))
                    else:
                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),_ustr(vv)))
            
        return "".join(out)

    def pprint(self, *args, **kwargs):
        """
        Pretty-printer for parsed results as a list, using the C{pprint} module.
        Accepts additional positional or keyword args as defined for the 
        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})

        Example::
            ident = Word(alphas, alphanums)
            num = Word(nums)
            func = Forward()
            term = ident | num | Group('(' + func + ')')
            func <<= ident + Group(Optional(delimitedList(term)))
            result = func.parseString("fna a,b,(fnb c,d,200),100")
            result.pprint(width=40)
        prints::
            ['fna',
             ['a',
              'b',
              ['(', 'fnb', ['c', 'd', '200'], ')'],
              '100']]
        """
        pprint.pprint(self.asList(), *args, **kwargs)

    # add support for pickle protocol
    def __getstate__(self):
        return ( self.__toklist,
                 ( self.__tokdict.copy(),
                   self.__parent is not None and self.__parent() or None,
                   self.__accumNames,
                   self.__name ) )

    def __setstate__(self,state):
        self.__toklist = state[0]
        (self.__tokdict,
         par,
         inAccumNames,
         self.__name) = state[1]
        self.__accumNames = {}
        self.__accumNames.update(inAccumNames)
        if par is not None:
            self.__parent = wkref(par)
        else:
            self.__parent = None

    def __getnewargs__(self):
        return self.__toklist, self.__name, self.__asList, self.__modal

    def __dir__(self):
        return (dir(type(self)) + list(self.keys()))

collections.MutableMapping.register(ParseResults)

def col (loc,strg):
    """Returns current column within a string, counting newlines as line separators.
   The first column is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}} for more information
   on parsing strings containing C{}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   """
    s = strg
    return 1 if 0} for more information
   on parsing strings containing C{}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   """
    return strg.count("\n",0,loc) + 1

def line( loc, strg ):
    """Returns the line of text containing loc within a string, counting newlines as line separators.
       """
    lastCR = strg.rfind("\n", 0, loc)
    nextCR = strg.find("\n", loc)
    if nextCR >= 0:
        return strg[lastCR+1:nextCR]
    else:
        return strg[lastCR+1:]

def _defaultStartDebugAction( instring, loc, expr ):
    print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))

def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))

def _defaultExceptionDebugAction( instring, loc, expr, exc ):
    print ("Exception raised:" + _ustr(exc))

def nullDebugAction(*args):
    """'Do-nothing' debug action, to suppress debugging output during parsing."""
    pass

# Only works on Python 3.x - nonlocal is toxic to Python 2 installs
#~ 'decorator to trim function calls to match the arity of the target'
#~ def _trim_arity(func, maxargs=3):
    #~ if func in singleArgBuiltins:
        #~ return lambda s,l,t: func(t)
    #~ limit = 0
    #~ foundArity = False
    #~ def wrapper(*args):
        #~ nonlocal limit,foundArity
        #~ while 1:
            #~ try:
                #~ ret = func(*args[limit:])
                #~ foundArity = True
                #~ return ret
            #~ except TypeError:
                #~ if limit == maxargs or foundArity:
                    #~ raise
                #~ limit += 1
                #~ continue
    #~ return wrapper

# this version is Python 2.x-3.x cross-compatible
'decorator to trim function calls to match the arity of the target'
def _trim_arity(func, maxargs=2):
    if func in singleArgBuiltins:
        return lambda s,l,t: func(t)
    limit = [0]
    foundArity = [False]
    
    # traceback return data structure changed in Py3.5 - normalize back to plain tuples
    if system_version[:2] >= (3,5):
        def extract_stack(limit=0):
            # special handling for Python 3.5.0 - extra deep call stack by 1
            offset = -3 if system_version == (3,5,0) else -2
            frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset]
            return [(frame_summary.filename, frame_summary.lineno)]
        def extract_tb(tb, limit=0):
            frames = traceback.extract_tb(tb, limit=limit)
            frame_summary = frames[-1]
            return [(frame_summary.filename, frame_summary.lineno)]
    else:
        extract_stack = traceback.extract_stack
        extract_tb = traceback.extract_tb
    
    # synthesize what would be returned by traceback.extract_stack at the call to 
    # user's parse action 'func', so that we don't incur call penalty at parse time
    
    LINE_DIFF = 6
    # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND 
    # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
    this_line = extract_stack(limit=2)[-1]
    pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF)

    def wrapper(*args):
        while 1:
            try:
                ret = func(*args[limit[0]:])
                foundArity[0] = True
                return ret
            except TypeError:
                # re-raise TypeErrors if they did not come from our arity testing
                if foundArity[0]:
                    raise
                else:
                    try:
                        tb = sys.exc_info()[-1]
                        if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth:
                            raise
                    finally:
                        del tb

                if limit[0] <= maxargs:
                    limit[0] += 1
                    continue
                raise

    # copy func name to wrapper for sensible debug output
    func_name = ""
    try:
        func_name = getattr(func, '__name__', 
                            getattr(func, '__class__').__name__)
    except Exception:
        func_name = str(func)
    wrapper.__name__ = func_name

    return wrapper

class ParserElement(object):
    """Abstract base level parser element class."""
    DEFAULT_WHITE_CHARS = " \n\t\r"
    verbose_stacktrace = False

    @staticmethod
    def setDefaultWhitespaceChars( chars ):
        r"""
        Overrides the default whitespace chars

        Example::
            # default whitespace chars are space,  and newline
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
            
            # change to just treat newline as significant
            ParserElement.setDefaultWhitespaceChars(" \t")
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
        """
        ParserElement.DEFAULT_WHITE_CHARS = chars

    @staticmethod
    def inlineLiteralsUsing(cls):
        """
        Set class to be used for inclusion of string literals into a parser.
        
        Example::
            # default literal class used is Literal
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']


            # change to Suppress
            ParserElement.inlineLiteralsUsing(Suppress)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
        """
        ParserElement._literalStringClass = cls

    def __init__( self, savelist=False ):
        self.parseAction = list()
        self.failAction = None
        #~ self.name = ""  # don't define self.name, let subclasses try/except upcall
        self.strRepr = None
        self.resultsName = None
        self.saveAsList = savelist
        self.skipWhitespace = True
        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
        self.copyDefaultWhiteChars = True
        self.mayReturnEmpty = False # used when checking for left-recursion
        self.keepTabs = False
        self.ignoreExprs = list()
        self.debug = False
        self.streamlined = False
        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
        self.errmsg = ""
        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
        self.debugActions = ( None, None, None ) #custom debug actions
        self.re = None
        self.callPreparse = True # used to avoid redundant calls to preParse
        self.callDuringTry = False

    def copy( self ):
        """
        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
        for the same parsing pattern, using copies of the original parse element.
        
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
            
            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
        prints::
            [5120, 100, 655360, 268435456]
        Equivalent form of C{expr.copy()} is just C{expr()}::
            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
        """
        cpy = copy.copy( self )
        cpy.parseAction = self.parseAction[:]
        cpy.ignoreExprs = self.ignoreExprs[:]
        if self.copyDefaultWhiteChars:
            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
        return cpy

    def setName( self, name ):
        """
        Define name for this expression, makes debugging and exception messages clearer.
        
        Example::
            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
        """
        self.name = name
        self.errmsg = "Expected " + self.name
        if hasattr(self,"exception"):
            self.exception.msg = self.errmsg
        return self

    def setResultsName( self, name, listAllMatches=False ):
        """
        Define name for referencing matching tokens as a nested attribute
        of the returned parse results.
        NOTE: this returns a *copy* of the original C{ParserElement} object;
        this is so that the client can define a basic element, such as an
        integer, and reference it in multiple places with different names.

        You can also set results names using the abbreviated syntax,
        C{expr("name")} in place of C{expr.setResultsName("name")} - 
        see L{I{__call__}<__call__>}.

        Example::
            date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))

            # equivalent form:
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
        """
        newself = self.copy()
        if name.endswith("*"):
            name = name[:-1]
            listAllMatches=True
        newself.resultsName = name
        newself.modalResults = not listAllMatches
        return newself

    def setBreak(self,breakFlag = True):
        """Method to invoke the Python pdb debugger when this element is
           about to be parsed. Set C{breakFlag} to True to enable, False to
           disable.
        """
        if breakFlag:
            _parseMethod = self._parse
            def breaker(instring, loc, doActions=True, callPreParse=True):
                import pdb
                pdb.set_trace()
                return _parseMethod( instring, loc, doActions, callPreParse )
            breaker._originalParseMethod = _parseMethod
            self._parse = breaker
        else:
            if hasattr(self._parse,"_originalParseMethod"):
                self._parse = self._parse._originalParseMethod
        return self

    def setParseAction( self, *fns, **kwargs ):
        """
        Define action to perform when successfully matching parse element definition.
        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
         - s   = the original string being parsed (see note below)
         - loc = the location of the matching substring
         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
        If the functions in fns modify the tokens, they can return them as the return
        value from fn, and the modified list of tokens will replace the original.
        Otherwise, fn does not need to return any value.

        Optional keyword arguments:
         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing

        Note: the default parsing behavior is to expand tabs in the input string
        before starting the parsing process.  See L{I{parseString}} for more information
        on parsing strings containing C{}s, and suggested methods to maintain a
        consistent view of the parsed string, the parse location, and line and column
        positions within the parsed string.
        
        Example::
            integer = Word(nums)
            date_str = integer + '/' + integer + '/' + integer

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']

            # use parse action to convert to ints at parse time
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            date_str = integer + '/' + integer + '/' + integer

            # note that integer fields are now ints, not strings
            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
        """
        self.parseAction = list(map(_trim_arity, list(fns)))
        self.callDuringTry = kwargs.get("callDuringTry", False)
        return self

    def addParseAction( self, *fns, **kwargs ):
        """
        Add parse action to expression's list of parse actions. See L{I{setParseAction}}.
        
        See examples in L{I{copy}}.
        """
        self.parseAction += list(map(_trim_arity, list(fns)))
        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
        return self

    def addCondition(self, *fns, **kwargs):
        """Add a boolean predicate function to expression's list of parse actions. See 
        L{I{setParseAction}} for function call signatures. Unlike C{setParseAction}, 
        functions passed to C{addCondition} need to return boolean success/fail of the condition.

        Optional keyword arguments:
         - message = define a custom message to be used in the raised exception
         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
         
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            year_int = integer.copy()
            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
            date_str = year_int + '/' + integer + '/' + integer

            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
        """
        msg = kwargs.get("message", "failed user-defined condition")
        exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException
        for fn in fns:
            def pa(s,l,t):
                if not bool(_trim_arity(fn)(s,l,t)):
                    raise exc_type(s,l,msg)
            self.parseAction.append(pa)
        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
        return self

    def setFailAction( self, fn ):
        """Define action to perform if parsing fails at this expression.
           Fail acton fn is a callable function that takes the arguments
           C{fn(s,loc,expr,err)} where:
            - s = string being parsed
            - loc = location where expression match was attempted and failed
            - expr = the parse expression that failed
            - err = the exception thrown
           The function returns no value.  It may throw C{L{ParseFatalException}}
           if it is desired to stop parsing immediately."""
        self.failAction = fn
        return self

    def _skipIgnorables( self, instring, loc ):
        exprsFound = True
        while exprsFound:
            exprsFound = False
            for e in self.ignoreExprs:
                try:
                    while 1:
                        loc,dummy = e._parse( instring, loc )
                        exprsFound = True
                except ParseException:
                    pass
        return loc

    def preParse( self, instring, loc ):
        if self.ignoreExprs:
            loc = self._skipIgnorables( instring, loc )

        if self.skipWhitespace:
            wt = self.whiteChars
            instrlen = len(instring)
            while loc < instrlen and instring[loc] in wt:
                loc += 1

        return loc

    def parseImpl( self, instring, loc, doActions=True ):
        return loc, []

    def postParse( self, instring, loc, tokenlist ):
        return tokenlist

    #~ @profile
    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
        debugging = ( self.debug ) #and doActions )

        if debugging or self.failAction:
            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
            if (self.debugActions[0] ):
                self.debugActions[0]( instring, loc, self )
            if callPreParse and self.callPreparse:
                preloc = self.preParse( instring, loc )
            else:
                preloc = loc
            tokensStart = preloc
            try:
                try:
                    loc,tokens = self.parseImpl( instring, preloc, doActions )
                except IndexError:
                    raise ParseException( instring, len(instring), self.errmsg, self )
            except ParseBaseException as err:
                #~ print ("Exception raised:", err)
                if self.debugActions[2]:
                    self.debugActions[2]( instring, tokensStart, self, err )
                if self.failAction:
                    self.failAction( instring, tokensStart, self, err )
                raise
        else:
            if callPreParse and self.callPreparse:
                preloc = self.preParse( instring, loc )
            else:
                preloc = loc
            tokensStart = preloc
            if self.mayIndexError or loc >= len(instring):
                try:
                    loc,tokens = self.parseImpl( instring, preloc, doActions )
                except IndexError:
                    raise ParseException( instring, len(instring), self.errmsg, self )
            else:
                loc,tokens = self.parseImpl( instring, preloc, doActions )

        tokens = self.postParse( instring, loc, tokens )

        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
        if self.parseAction and (doActions or self.callDuringTry):
            if debugging:
                try:
                    for fn in self.parseAction:
                        tokens = fn( instring, tokensStart, retTokens )
                        if tokens is not None:
                            retTokens = ParseResults( tokens,
                                                      self.resultsName,
                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
                                                      modal=self.modalResults )
                except ParseBaseException as err:
                    #~ print "Exception raised in user parse action:", err
                    if (self.debugActions[2] ):
                        self.debugActions[2]( instring, tokensStart, self, err )
                    raise
            else:
                for fn in self.parseAction:
                    tokens = fn( instring, tokensStart, retTokens )
                    if tokens is not None:
                        retTokens = ParseResults( tokens,
                                                  self.resultsName,
                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
                                                  modal=self.modalResults )

        if debugging:
            #~ print ("Matched",self,"->",retTokens.asList())
            if (self.debugActions[1] ):
                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )

        return loc, retTokens

    def tryParse( self, instring, loc ):
        try:
            return self._parse( instring, loc, doActions=False )[0]
        except ParseFatalException:
            raise ParseException( instring, loc, self.errmsg, self)
    
    def canParseNext(self, instring, loc):
        try:
            self.tryParse(instring, loc)
        except (ParseException, IndexError):
            return False
        else:
            return True

    class _UnboundedCache(object):
        def __init__(self):
            cache = {}
            self.not_in_cache = not_in_cache = object()

            def get(self, key):
                return cache.get(key, not_in_cache)

            def set(self, key, value):
                cache[key] = value

            def clear(self):
                cache.clear()

            self.get = types.MethodType(get, self)
            self.set = types.MethodType(set, self)
            self.clear = types.MethodType(clear, self)

    if _OrderedDict is not None:
        class _FifoCache(object):
            def __init__(self, size):
                self.not_in_cache = not_in_cache = object()

                cache = _OrderedDict()

                def get(self, key):
                    return cache.get(key, not_in_cache)

                def set(self, key, value):
                    cache[key] = value
                    if len(cache) > size:
                        cache.popitem(False)

                def clear(self):
                    cache.clear()

                self.get = types.MethodType(get, self)
                self.set = types.MethodType(set, self)
                self.clear = types.MethodType(clear, self)

    else:
        class _FifoCache(object):
            def __init__(self, size):
                self.not_in_cache = not_in_cache = object()

                cache = {}
                key_fifo = collections.deque([], size)

                def get(self, key):
                    return cache.get(key, not_in_cache)

                def set(self, key, value):
                    cache[key] = value
                    if len(cache) > size:
                        cache.pop(key_fifo.popleft(), None)
                    key_fifo.append(key)

                def clear(self):
                    cache.clear()
                    key_fifo.clear()

                self.get = types.MethodType(get, self)
                self.set = types.MethodType(set, self)
                self.clear = types.MethodType(clear, self)

    # argument cache for optimizing repeated calls when backtracking through recursive expressions
    packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail
    packrat_cache_lock = RLock()
    packrat_cache_stats = [0, 0]

    # this method gets repeatedly called during backtracking with the same arguments -
    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
        HIT, MISS = 0, 1
        lookup = (self, instring, loc, callPreParse, doActions)
        with ParserElement.packrat_cache_lock:
            cache = ParserElement.packrat_cache
            value = cache.get(lookup)
            if value is cache.not_in_cache:
                ParserElement.packrat_cache_stats[MISS] += 1
                try:
                    value = self._parseNoCache(instring, loc, doActions, callPreParse)
                except ParseBaseException as pe:
                    # cache a copy of the exception, without the traceback
                    cache.set(lookup, pe.__class__(*pe.args))
                    raise
                else:
                    cache.set(lookup, (value[0], value[1].copy()))
                    return value
            else:
                ParserElement.packrat_cache_stats[HIT] += 1
                if isinstance(value, Exception):
                    raise value
                return (value[0], value[1].copy())

    _parse = _parseNoCache

    @staticmethod
    def resetCache():
        ParserElement.packrat_cache.clear()
        ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats)

    _packratEnabled = False
    @staticmethod
    def enablePackrat(cache_size_limit=128):
        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
           Repeated parse attempts at the same string location (which happens
           often in many complex grammars) can immediately return a cached value,
           instead of re-executing parsing/validating code.  Memoizing is done of
           both valid results and parsing exceptions.
           
           Parameters:
            - cache_size_limit - (default=C{128}) - if an integer value is provided
              will limit the size of the packrat cache; if None is passed, then
              the cache size will be unbounded; if 0 is passed, the cache will
              be effectively disabled.
            
           This speedup may break existing programs that use parse actions that
           have side-effects.  For this reason, packrat parsing is disabled when
           you first import pyparsing.  To activate the packrat feature, your
           program must call the class method C{ParserElement.enablePackrat()}.  If
           your program uses C{psyco} to "compile as you go", you must call
           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
           Python will crash.  For best results, call C{enablePackrat()} immediately
           after importing pyparsing.
           
           Example::
               import pyparsing
               pyparsing.ParserElement.enablePackrat()
        """
        if not ParserElement._packratEnabled:
            ParserElement._packratEnabled = True
            if cache_size_limit is None:
                ParserElement.packrat_cache = ParserElement._UnboundedCache()
            else:
                ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit)
            ParserElement._parse = ParserElement._parseCache

    def parseString( self, instring, parseAll=False ):
        """
        Execute the parse expression with the given string.
        This is the main interface to the client code, once the complete
        expression has been built.

        If you want the grammar to require that the entire input string be
        successfully parsed, then set C{parseAll} to True (equivalent to ending
        the grammar with C{L{StringEnd()}}).

        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
        in order to report proper column numbers in parse actions.
        If the input string contains tabs and
        the grammar uses parse actions that use the C{loc} argument to index into the
        string being parsed, you can ensure you have a consistent view of the input
        string by:
         - calling C{parseWithTabs} on your grammar before calling C{parseString}
           (see L{I{parseWithTabs}})
         - define your parse action using the full C{(s,loc,toks)} signature, and
           reference the input string using the parse action's C{s} argument
         - explictly expand the tabs in your input string before calling
           C{parseString}
        
        Example::
            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
        """
        ParserElement.resetCache()
        if not self.streamlined:
            self.streamline()
            #~ self.saveAsList = True
        for e in self.ignoreExprs:
            e.streamline()
        if not self.keepTabs:
            instring = instring.expandtabs()
        try:
            loc, tokens = self._parse( instring, 0 )
            if parseAll:
                loc = self.preParse( instring, loc )
                se = Empty() + StringEnd()
                se._parse( instring, loc )
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc
        else:
            return tokens

    def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
        """
        Scan the input string for expression matches.  Each match will return the
        matching tokens, start location, and end location.  May be called with optional
        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
        C{overlap} is specified, then overlapping matches will be reported.

        Note that the start and end locations are reported relative to the string
        being parsed.  See L{I{parseString}} for more information on parsing
        strings with embedded tabs.

        Example::
            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
            print(source)
            for tokens,start,end in Word(alphas).scanString(source):
                print(' '*start + '^'*(end-start))
                print(' '*start + tokens[0])
        
        prints::
        
            sldjf123lsdjjkf345sldkjf879lkjsfd987
            ^^^^^
            sldjf
                    ^^^^^^^
                    lsdjjkf
                              ^^^^^^
                              sldkjf
                                       ^^^^^^
                                       lkjsfd
        """
        if not self.streamlined:
            self.streamline()
        for e in self.ignoreExprs:
            e.streamline()

        if not self.keepTabs:
            instring = _ustr(instring).expandtabs()
        instrlen = len(instring)
        loc = 0
        preparseFn = self.preParse
        parseFn = self._parse
        ParserElement.resetCache()
        matches = 0
        try:
            while loc <= instrlen and matches < maxMatches:
                try:
                    preloc = preparseFn( instring, loc )
                    nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
                except ParseException:
                    loc = preloc+1
                else:
                    if nextLoc > loc:
                        matches += 1
                        yield tokens, preloc, nextLoc
                        if overlap:
                            nextloc = preparseFn( instring, loc )
                            if nextloc > loc:
                                loc = nextLoc
                            else:
                                loc += 1
                        else:
                            loc = nextLoc
                    else:
                        loc = preloc+1
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def transformString( self, instring ):
        """
        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
        be returned from a parse action.  To use C{transformString}, define a grammar and
        attach a parse action to it that modifies the returned token list.
        Invoking C{transformString()} on a target string will then scan for matches,
        and replace the matched text patterns according to the logic in the parse
        action.  C{transformString()} returns the resulting transformed string.
        
        Example::
            wd = Word(alphas)
            wd.setParseAction(lambda toks: toks[0].title())
            
            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
        Prints::
            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
        """
        out = []
        lastE = 0
        # force preservation of s, to minimize unwanted transformation of string, and to
        # keep string locs straight between transformString and scanString
        self.keepTabs = True
        try:
            for t,s,e in self.scanString( instring ):
                out.append( instring[lastE:s] )
                if t:
                    if isinstance(t,ParseResults):
                        out += t.asList()
                    elif isinstance(t,list):
                        out += t
                    else:
                        out.append(t)
                lastE = e
            out.append(instring[lastE:])
            out = [o for o in out if o]
            return "".join(map(_ustr,_flatten(out)))
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def searchString( self, instring, maxMatches=_MAX_INT ):
        """
        Another extension to C{L{scanString}}, simplifying the access to the tokens found
        to match the given parse expression.  May be called with optional
        C{maxMatches} argument, to clip searching after 'n' matches are found.
        
        Example::
            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
            cap_word = Word(alphas.upper(), alphas.lower())
            
            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
        prints::
            ['More', 'Iron', 'Lead', 'Gold', 'I']
        """
        try:
            return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False):
        """
        Generator method to split a string using the given expression as a separator.
        May be called with optional C{maxsplit} argument, to limit the number of splits;
        and the optional C{includeSeparators} argument (default=C{False}), if the separating
        matching text should be included in the split results.
        
        Example::        
            punc = oneOf(list(".,;:/-!?"))
            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
        prints::
            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
        """
        splits = 0
        last = 0
        for t,s,e in self.scanString(instring, maxMatches=maxsplit):
            yield instring[last:s]
            if includeSeparators:
                yield t[0]
            last = e
        yield instring[last:]

    def __add__(self, other ):
        """
        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
        converts them to L{Literal}s by default.
        
        Example::
            greet = Word(alphas) + "," + Word(alphas) + "!"
            hello = "Hello, World!"
            print (hello, "->", greet.parseString(hello))
        Prints::
            Hello, World! -> ['Hello', ',', 'World', '!']
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return And( [ self, other ] )

    def __radd__(self, other ):
        """
        Implementation of + operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other + self

    def __sub__(self, other):
        """
        Implementation of - operator, returns C{L{And}} with error stop
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return And( [ self, And._ErrorStop(), other ] )

    def __rsub__(self, other ):
        """
        Implementation of - operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other - self

    def __mul__(self,other):
        """
        Implementation of * operator, allows use of C{expr * 3} in place of
        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
        may also include C{None} as in:
         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
              to C{expr*n + L{ZeroOrMore}(expr)}
              (read as "at least n instances of C{expr}")
         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
              (read as "0 to n instances of C{expr}")
         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}

        Note that C{expr*(None,n)} does not raise an exception if
        more than n exprs exist in the input stream; that is,
        C{expr*(None,n)} does not enforce a maximum number of expr
        occurrences.  If this behavior is desired, then write
        C{expr*(None,n) + ~expr}
        """
        if isinstance(other,int):
            minElements, optElements = other,0
        elif isinstance(other,tuple):
            other = (other + (None, None))[:2]
            if other[0] is None:
                other = (0, other[1])
            if isinstance(other[0],int) and other[1] is None:
                if other[0] == 0:
                    return ZeroOrMore(self)
                if other[0] == 1:
                    return OneOrMore(self)
                else:
                    return self*other[0] + ZeroOrMore(self)
            elif isinstance(other[0],int) and isinstance(other[1],int):
                minElements, optElements = other
                optElements -= minElements
            else:
                raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
        else:
            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))

        if minElements < 0:
            raise ValueError("cannot multiply ParserElement by negative value")
        if optElements < 0:
            raise ValueError("second tuple value must be greater or equal to first tuple value")
        if minElements == optElements == 0:
            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")

        if (optElements):
            def makeOptionalList(n):
                if n>1:
                    return Optional(self + makeOptionalList(n-1))
                else:
                    return Optional(self)
            if minElements:
                if minElements == 1:
                    ret = self + makeOptionalList(optElements)
                else:
                    ret = And([self]*minElements) + makeOptionalList(optElements)
            else:
                ret = makeOptionalList(optElements)
        else:
            if minElements == 1:
                ret = self
            else:
                ret = And([self]*minElements)
        return ret

    def __rmul__(self, other):
        return self.__mul__(other)

    def __or__(self, other ):
        """
        Implementation of | operator - returns C{L{MatchFirst}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return MatchFirst( [ self, other ] )

    def __ror__(self, other ):
        """
        Implementation of | operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other | self

    def __xor__(self, other ):
        """
        Implementation of ^ operator - returns C{L{Or}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return Or( [ self, other ] )

    def __rxor__(self, other ):
        """
        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other ^ self

    def __and__(self, other ):
        """
        Implementation of & operator - returns C{L{Each}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return Each( [ self, other ] )

    def __rand__(self, other ):
        """
        Implementation of & operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other & self

    def __invert__( self ):
        """
        Implementation of ~ operator - returns C{L{NotAny}}
        """
        return NotAny( self )

    def __call__(self, name=None):
        """
        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
        
        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
        passed as C{True}.
           
        If C{name} is omitted, same as calling C{L{copy}}.

        Example::
            # these are equivalent
            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
        """
        if name is not None:
            return self.setResultsName(name)
        else:
            return self.copy()

    def suppress( self ):
        """
        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
        cluttering up returned output.
        """
        return Suppress( self )

    def leaveWhitespace( self ):
        """
        Disables the skipping of whitespace before matching the characters in the
        C{ParserElement}'s defined pattern.  This is normally only used internally by
        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
        """
        self.skipWhitespace = False
        return self

    def setWhitespaceChars( self, chars ):
        """
        Overrides the default whitespace chars
        """
        self.skipWhitespace = True
        self.whiteChars = chars
        self.copyDefaultWhiteChars = False
        return self

    def parseWithTabs( self ):
        """
        Overrides default behavior to expand C{}s to spaces before parsing the input string.
        Must be called before C{parseString} when the input grammar contains elements that
        match C{} characters.
        """
        self.keepTabs = True
        return self

    def ignore( self, other ):
        """
        Define expression to be ignored (e.g., comments) while doing pattern
        matching; may be called repeatedly, to define multiple comment or other
        ignorable patterns.
        
        Example::
            patt = OneOrMore(Word(alphas))
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
            
            patt.ignore(cStyleComment)
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
        """
        if isinstance(other, basestring):
            other = Suppress(other)

        if isinstance( other, Suppress ):
            if other not in self.ignoreExprs:
                self.ignoreExprs.append(other)
        else:
            self.ignoreExprs.append( Suppress( other.copy() ) )
        return self

    def setDebugActions( self, startAction, successAction, exceptionAction ):
        """
        Enable display of debugging messages while doing pattern matching.
        """
        self.debugActions = (startAction or _defaultStartDebugAction,
                             successAction or _defaultSuccessDebugAction,
                             exceptionAction or _defaultExceptionDebugAction)
        self.debug = True
        return self

    def setDebug( self, flag=True ):
        """
        Enable display of debugging messages while doing pattern matching.
        Set C{flag} to True to enable, False to disable.

        Example::
            wd = Word(alphas).setName("alphaword")
            integer = Word(nums).setName("numword")
            term = wd | integer
            
            # turn on debugging for wd
            wd.setDebug()

            OneOrMore(term).parseString("abc 123 xyz 890")
        
        prints::
            Match alphaword at loc 0(1,1)
            Matched alphaword -> ['abc']
            Match alphaword at loc 3(1,4)
            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
            Match alphaword at loc 7(1,8)
            Matched alphaword -> ['xyz']
            Match alphaword at loc 11(1,12)
            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
            Match alphaword at loc 15(1,16)
            Exception raised:Expected alphaword (at char 15), (line:1, col:16)

        The output shown is that produced by the default debug actions - custom debug actions can be
        specified using L{setDebugActions}. Prior to attempting
        to match the C{wd} expression, the debugging message C{"Match  at loc (,)"}
        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
        which makes debugging and exception messages easier to understand - for instance, the default
        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
        """
        if flag:
            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
        else:
            self.debug = False
        return self

    def __str__( self ):
        return self.name

    def __repr__( self ):
        return _ustr(self)

    def streamline( self ):
        self.streamlined = True
        self.strRepr = None
        return self

    def checkRecursion( self, parseElementList ):
        pass

    def validate( self, validateTrace=[] ):
        """
        Check defined expressions for valid structure, check for infinite recursive definitions.
        """
        self.checkRecursion( [] )

    def parseFile( self, file_or_filename, parseAll=False ):
        """
        Execute the parse expression on the given file or filename.
        If a filename is specified (instead of a file object),
        the entire file is opened, read, and closed before parsing.
        """
        try:
            file_contents = file_or_filename.read()
        except AttributeError:
            with open(file_or_filename, "r") as f:
                file_contents = f.read()
        try:
            return self.parseString(file_contents, parseAll)
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def __eq__(self,other):
        if isinstance(other, ParserElement):
            return self is other or vars(self) == vars(other)
        elif isinstance(other, basestring):
            return self.matches(other)
        else:
            return super(ParserElement,self)==other

    def __ne__(self,other):
        return not (self == other)

    def __hash__(self):
        return hash(id(self))

    def __req__(self,other):
        return self == other

    def __rne__(self,other):
        return not (self == other)

    def matches(self, testString, parseAll=True):
        """
        Method for quick testing of a parser against a test string. Good for simple 
        inline microtests of sub expressions while building up larger parser.
           
        Parameters:
         - testString - to test against this expression for a match
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
            
        Example::
            expr = Word(nums)
            assert expr.matches("100")
        """
        try:
            self.parseString(_ustr(testString), parseAll=parseAll)
            return True
        except ParseBaseException:
            return False
                
    def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False):
        """
        Execute the parse expression on a series of test strings, showing each
        test, the parsed results or where the parse failed. Quick and easy way to
        run a parse expression against a list of sample strings.
           
        Parameters:
         - tests - a list of separate test strings, or a multiline string of test strings
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
              string; pass None to disable comment filtering
         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
              if False, only dump nested list
         - printResults - (default=C{True}) prints test output to stdout
         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing

        Returns: a (success, results) tuple, where success indicates that all tests succeeded
        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
        test's output
        
        Example::
            number_expr = pyparsing_common.number.copy()

            result = number_expr.runTests('''
                # unsigned integer
                100
                # negative integer
                -100
                # float with scientific notation
                6.02e23
                # integer with scientific notation
                1e-12
                ''')
            print("Success" if result[0] else "Failed!")

            result = number_expr.runTests('''
                # stray character
                100Z
                # missing leading digit before '.'
                -.100
                # too many '.'
                3.14.159
                ''', failureTests=True)
            print("Success" if result[0] else "Failed!")
        prints::
            # unsigned integer
            100
            [100]

            # negative integer
            -100
            [-100]

            # float with scientific notation
            6.02e23
            [6.02e+23]

            # integer with scientific notation
            1e-12
            [1e-12]

            Success
            
            # stray character
            100Z
               ^
            FAIL: Expected end of text (at char 3), (line:1, col:4)

            # missing leading digit before '.'
            -.100
            ^
            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)

            # too many '.'
            3.14.159
                ^
            FAIL: Expected end of text (at char 4), (line:1, col:5)

            Success

        Each test string must be on a single line. If you want to test a string that spans multiple
        lines, create a test like this::

            expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines")
        
        (Note that this is a raw string literal, you must include the leading 'r'.)
        """
        if isinstance(tests, basestring):
            tests = list(map(str.strip, tests.rstrip().splitlines()))
        if isinstance(comment, basestring):
            comment = Literal(comment)
        allResults = []
        comments = []
        success = True
        for t in tests:
            if comment is not None and comment.matches(t, False) or comments and not t:
                comments.append(t)
                continue
            if not t:
                continue
            out = ['\n'.join(comments), t]
            comments = []
            try:
                t = t.replace(r'\n','\n')
                result = self.parseString(t, parseAll=parseAll)
                out.append(result.dump(full=fullDump))
                success = success and not failureTests
            except ParseBaseException as pe:
                fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
                if '\n' in t:
                    out.append(line(pe.loc, t))
                    out.append(' '*(col(pe.loc,t)-1) + '^' + fatal)
                else:
                    out.append(' '*pe.loc + '^' + fatal)
                out.append("FAIL: " + str(pe))
                success = success and failureTests
                result = pe
            except Exception as exc:
                out.append("FAIL-EXCEPTION: " + str(exc))
                success = success and failureTests
                result = exc

            if printResults:
                if fullDump:
                    out.append('')
                print('\n'.join(out))

            allResults.append((t, result))
        
        return success, allResults

        
class Token(ParserElement):
    """
    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
    """
    def __init__( self ):
        super(Token,self).__init__( savelist=False )


class Empty(Token):
    """
    An empty token, will always match.
    """
    def __init__( self ):
        super(Empty,self).__init__()
        self.name = "Empty"
        self.mayReturnEmpty = True
        self.mayIndexError = False


class NoMatch(Token):
    """
    A token that will never match.
    """
    def __init__( self ):
        super(NoMatch,self).__init__()
        self.name = "NoMatch"
        self.mayReturnEmpty = True
        self.mayIndexError = False
        self.errmsg = "Unmatchable token"

    def parseImpl( self, instring, loc, doActions=True ):
        raise ParseException(instring, loc, self.errmsg, self)


class Literal(Token):
    """
    Token to exactly match a specified string.
    
    Example::
        Literal('blah').parseString('blah')  # -> ['blah']
        Literal('blah').parseString('blahfooblah')  # -> ['blah']
        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
    
    For case-insensitive matching, use L{CaselessLiteral}.
    
    For keyword matching (force word break before and after the matched string),
    use L{Keyword} or L{CaselessKeyword}.
    """
    def __init__( self, matchString ):
        super(Literal,self).__init__()
        self.match = matchString
        self.matchLen = len(matchString)
        try:
            self.firstMatchChar = matchString[0]
        except IndexError:
            warnings.warn("null string passed to Literal; use Empty() instead",
                            SyntaxWarning, stacklevel=2)
            self.__class__ = Empty
        self.name = '"%s"' % _ustr(self.match)
        self.errmsg = "Expected " + self.name
        self.mayReturnEmpty = False
        self.mayIndexError = False

    # Performance tuning: this routine gets called a *lot*
    # if this is a single character match string  and the first character matches,
    # short-circuit as quickly as possible, and avoid calling startswith
    #~ @profile
    def parseImpl( self, instring, loc, doActions=True ):
        if (instring[loc] == self.firstMatchChar and
            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
            return loc+self.matchLen, self.match
        raise ParseException(instring, loc, self.errmsg, self)
_L = Literal
ParserElement._literalStringClass = Literal

class Keyword(Token):
    """
    Token to exactly match a specified string as a keyword, that is, it must be
    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
    Accepts two optional constructor arguments in addition to the keyword string:
     - C{identChars} is a string of characters that would be valid identifier characters,
          defaulting to all alphanumerics + "_" and "$"
     - C{caseless} allows case-insensitive matching, default is C{False}.
       
    Example::
        Keyword("start").parseString("start")  # -> ['start']
        Keyword("start").parseString("starting")  # -> Exception

    For case-insensitive matching, use L{CaselessKeyword}.
    """
    DEFAULT_KEYWORD_CHARS = alphanums+"_$"

    def __init__( self, matchString, identChars=None, caseless=False ):
        super(Keyword,self).__init__()
        if identChars is None:
            identChars = Keyword.DEFAULT_KEYWORD_CHARS
        self.match = matchString
        self.matchLen = len(matchString)
        try:
            self.firstMatchChar = matchString[0]
        except IndexError:
            warnings.warn("null string passed to Keyword; use Empty() instead",
                            SyntaxWarning, stacklevel=2)
        self.name = '"%s"' % self.match
        self.errmsg = "Expected " + self.name
        self.mayReturnEmpty = False
        self.mayIndexError = False
        self.caseless = caseless
        if caseless:
            self.caselessmatch = matchString.upper()
            identChars = identChars.upper()
        self.identChars = set(identChars)

    def parseImpl( self, instring, loc, doActions=True ):
        if self.caseless:
            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
                return loc+self.matchLen, self.match
        else:
            if (instring[loc] == self.firstMatchChar and
                (self.matchLen==1 or instring.startswith(self.match,loc)) and
                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
                (loc == 0 or instring[loc-1] not in self.identChars) ):
                return loc+self.matchLen, self.match
        raise ParseException(instring, loc, self.errmsg, self)

    def copy(self):
        c = super(Keyword,self).copy()
        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
        return c

    @staticmethod
    def setDefaultKeywordChars( chars ):
        """Overrides the default Keyword chars
        """
        Keyword.DEFAULT_KEYWORD_CHARS = chars

class CaselessLiteral(Literal):
    """
    Token to match a specified string, ignoring case of letters.
    Note: the matched results will always be in the case of the given
    match string, NOT the case of the input text.

    Example::
        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
        
    (Contrast with example for L{CaselessKeyword}.)
    """
    def __init__( self, matchString ):
        super(CaselessLiteral,self).__init__( matchString.upper() )
        # Preserve the defining literal.
        self.returnString = matchString
        self.name = "'%s'" % self.returnString
        self.errmsg = "Expected " + self.name

    def parseImpl( self, instring, loc, doActions=True ):
        if instring[ loc:loc+self.matchLen ].upper() == self.match:
            return loc+self.matchLen, self.returnString
        raise ParseException(instring, loc, self.errmsg, self)

class CaselessKeyword(Keyword):
    """
    Caseless version of L{Keyword}.

    Example::
        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
        
    (Contrast with example for L{CaselessLiteral}.)
    """
    def __init__( self, matchString, identChars=None ):
        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )

    def parseImpl( self, instring, loc, doActions=True ):
        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
            return loc+self.matchLen, self.match
        raise ParseException(instring, loc, self.errmsg, self)

class CloseMatch(Token):
    """
    A variation on L{Literal} which matches "close" matches, that is, 
    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
     - C{match_string} - string to be matched
     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
    
    The results from a successful parse will contain the matched text from the input string and the following named results:
     - C{mismatches} - a list of the positions within the match_string where mismatches were found
     - C{original} - the original match_string used to compare against the input string
    
    If C{mismatches} is an empty list, then the match was an exact match.
    
    Example::
        patt = CloseMatch("ATCATCGAATGGA")
        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)

        # exact match
        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})

        # close match allowing up to 2 mismatches
        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
    """
    def __init__(self, match_string, maxMismatches=1):
        super(CloseMatch,self).__init__()
        self.name = match_string
        self.match_string = match_string
        self.maxMismatches = maxMismatches
        self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches)
        self.mayIndexError = False
        self.mayReturnEmpty = False

    def parseImpl( self, instring, loc, doActions=True ):
        start = loc
        instrlen = len(instring)
        maxloc = start + len(self.match_string)

        if maxloc <= instrlen:
            match_string = self.match_string
            match_stringloc = 0
            mismatches = []
            maxMismatches = self.maxMismatches

            for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)):
                src,mat = s_m
                if src != mat:
                    mismatches.append(match_stringloc)
                    if len(mismatches) > maxMismatches:
                        break
            else:
                loc = match_stringloc + 1
                results = ParseResults([instring[start:loc]])
                results['original'] = self.match_string
                results['mismatches'] = mismatches
                return loc, results

        raise ParseException(instring, loc, self.errmsg, self)


class Word(Token):
    """
    Token for matching words composed of allowed character sets.
    Defined with string containing all allowed initial characters,
    an optional string containing allowed body characters (if omitted,
    defaults to the initial character set), and an optional minimum,
    maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction. An optional
    C{excludeChars} parameter can list characters that might be found in 
    the input C{bodyChars} string; useful to define a word of all printables
    except for one or two characters, for instance.
    
    L{srange} is useful for defining custom character set strings for defining 
    C{Word} expressions, using range notation from regular expression character sets.
    
    A common mistake is to use C{Word} to match a specific literal string, as in 
    C{Word("Address")}. Remember that C{Word} uses the string argument to define
    I{sets} of matchable characters. This expression would match "Add", "AAA",
    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
    To match an exact literal string, use L{Literal} or L{Keyword}.

    pyparsing includes helper strings for building Words:
     - L{alphas}
     - L{nums}
     - L{alphanums}
     - L{hexnums}
     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
     - L{printables} (any non-whitespace character)

    Example::
        # a word composed of digits
        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
        
        # a word with a leading capital, and zero or more lowercase
        capital_word = Word(alphas.upper(), alphas.lower())

        # hostnames are alphanumeric, with leading alpha, and '-'
        hostname = Word(alphas, alphanums+'-')
        
        # roman numeral (not a strict parser, accepts invalid mix of characters)
        roman = Word("IVXLCDM")
        
        # any string of non-whitespace characters, except for ','
        csv_value = Word(printables, excludeChars=",")
    """
    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
        super(Word,self).__init__()
        if excludeChars:
            initChars = ''.join(c for c in initChars if c not in excludeChars)
            if bodyChars:
                bodyChars = ''.join(c for c in bodyChars if c not in excludeChars)
        self.initCharsOrig = initChars
        self.initChars = set(initChars)
        if bodyChars :
            self.bodyCharsOrig = bodyChars
            self.bodyChars = set(bodyChars)
        else:
            self.bodyCharsOrig = initChars
            self.bodyChars = set(initChars)

        self.maxSpecified = max > 0

        if min < 1:
            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")

        self.minLen = min

        if max > 0:
            self.maxLen = max
        else:
            self.maxLen = _MAX_INT

        if exact > 0:
            self.maxLen = exact
            self.minLen = exact

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayIndexError = False
        self.asKeyword = asKeyword

        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
            if self.bodyCharsOrig == self.initCharsOrig:
                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
            elif len(self.initCharsOrig) == 1:
                self.reString = "%s[%s]*" % \
                                      (re.escape(self.initCharsOrig),
                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
            else:
                self.reString = "[%s][%s]*" % \
                                      (_escapeRegexRangeChars(self.initCharsOrig),
                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
            if self.asKeyword:
                self.reString = r"\b"+self.reString+r"\b"
            try:
                self.re = re.compile( self.reString )
            except Exception:
                self.re = None

    def parseImpl( self, instring, loc, doActions=True ):
        if self.re:
            result = self.re.match(instring,loc)
            if not result:
                raise ParseException(instring, loc, self.errmsg, self)

            loc = result.end()
            return loc, result.group()

        if not(instring[ loc ] in self.initChars):
            raise ParseException(instring, loc, self.errmsg, self)

        start = loc
        loc += 1
        instrlen = len(instring)
        bodychars = self.bodyChars
        maxloc = start + self.maxLen
        maxloc = min( maxloc, instrlen )
        while loc < maxloc and instring[loc] in bodychars:
            loc += 1

        throwException = False
        if loc - start < self.minLen:
            throwException = True
        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
            throwException = True
        if self.asKeyword:
            if (start>0 and instring[start-1] in bodychars) or (loc4:
                    return s[:4]+"..."
                else:
                    return s

            if ( self.initCharsOrig != self.bodyCharsOrig ):
                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
            else:
                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)

        return self.strRepr


class Regex(Token):
    """
    Token for matching strings that match a given regular expression.
    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
    If the given regex contains named groups (defined using C{(?P...)}), these will be preserved as 
    named parse results.

    Example::
        realnum = Regex(r"[+-]?\d+\.\d*")
        date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)')
        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
    """
    compiledREtype = type(re.compile("[A-Z]"))
    def __init__( self, pattern, flags=0):
        """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags."""
        super(Regex,self).__init__()

        if isinstance(pattern, basestring):
            if not pattern:
                warnings.warn("null string passed to Regex; use Empty() instead",
                        SyntaxWarning, stacklevel=2)

            self.pattern = pattern
            self.flags = flags

            try:
                self.re = re.compile(self.pattern, self.flags)
                self.reString = self.pattern
            except sre_constants.error:
                warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
                    SyntaxWarning, stacklevel=2)
                raise

        elif isinstance(pattern, Regex.compiledREtype):
            self.re = pattern
            self.pattern = \
            self.reString = str(pattern)
            self.flags = flags
            
        else:
            raise ValueError("Regex may only be constructed with a string or a compiled RE object")

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayIndexError = False
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        result = self.re.match(instring,loc)
        if not result:
            raise ParseException(instring, loc, self.errmsg, self)

        loc = result.end()
        d = result.groupdict()
        ret = ParseResults(result.group())
        if d:
            for k in d:
                ret[k] = d[k]
        return loc,ret

    def __str__( self ):
        try:
            return super(Regex,self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            self.strRepr = "Re:(%s)" % repr(self.pattern)

        return self.strRepr


class QuotedString(Token):
    r"""
    Token for matching strings that are delimited by quoting characters.
    
    Defined with the following parameters:
        - quoteChar - string of one or more characters defining the quote delimiting string
        - escChar - character to escape quotes, typically backslash (default=C{None})
        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})

    Example::
        qs = QuotedString('"')
        print(qs.searchString('lsjdf "This is the quote" sldjf'))
        complex_qs = QuotedString('{{', endQuoteChar='}}')
        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
        sql_qs = QuotedString('"', escQuote='""')
        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
    prints::
        [['This is the quote']]
        [['This is the "quote"']]
        [['This is the quote with "embedded" quotes']]
    """
    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True):
        super(QuotedString,self).__init__()

        # remove white space from quote chars - wont work anyway
        quoteChar = quoteChar.strip()
        if not quoteChar:
            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
            raise SyntaxError()

        if endQuoteChar is None:
            endQuoteChar = quoteChar
        else:
            endQuoteChar = endQuoteChar.strip()
            if not endQuoteChar:
                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
                raise SyntaxError()

        self.quoteChar = quoteChar
        self.quoteCharLen = len(quoteChar)
        self.firstQuoteChar = quoteChar[0]
        self.endQuoteChar = endQuoteChar
        self.endQuoteCharLen = len(endQuoteChar)
        self.escChar = escChar
        self.escQuote = escQuote
        self.unquoteResults = unquoteResults
        self.convertWhitespaceEscapes = convertWhitespaceEscapes

        if multiline:
            self.flags = re.MULTILINE | re.DOTALL
            self.pattern = r'%s(?:[^%s%s]' % \
                ( re.escape(self.quoteChar),
                  _escapeRegexRangeChars(self.endQuoteChar[0]),
                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
        else:
            self.flags = 0
            self.pattern = r'%s(?:[^%s\n\r%s]' % \
                ( re.escape(self.quoteChar),
                  _escapeRegexRangeChars(self.endQuoteChar[0]),
                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
        if len(self.endQuoteChar) > 1:
            self.pattern += (
                '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
                                    for i in range(len(self.endQuoteChar)-1,0,-1)) + ')'
                )
        if escQuote:
            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
        if escChar:
            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))

        try:
            self.re = re.compile(self.pattern, self.flags)
            self.reString = self.pattern
        except sre_constants.error:
            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
                SyntaxWarning, stacklevel=2)
            raise

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayIndexError = False
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
        if not result:
            raise ParseException(instring, loc, self.errmsg, self)

        loc = result.end()
        ret = result.group()

        if self.unquoteResults:

            # strip off quotes
            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]

            if isinstance(ret,basestring):
                # replace escaped whitespace
                if '\\' in ret and self.convertWhitespaceEscapes:
                    ws_map = {
                        r'\t' : '\t',
                        r'\n' : '\n',
                        r'\f' : '\f',
                        r'\r' : '\r',
                    }
                    for wslit,wschar in ws_map.items():
                        ret = ret.replace(wslit, wschar)

                # replace escaped characters
                if self.escChar:
                    ret = re.sub(self.escCharReplacePattern,"\g<1>",ret)

                # replace escaped quotes
                if self.escQuote:
                    ret = ret.replace(self.escQuote, self.endQuoteChar)

        return loc, ret

    def __str__( self ):
        try:
            return super(QuotedString,self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)

        return self.strRepr


class CharsNotIn(Token):
    """
    Token for matching words composed of characters I{not} in a given set (will
    include whitespace in matched characters if not listed in the provided exclusion set - see example).
    Defined with string containing all disallowed characters, and an optional
    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction.

    Example::
        # define a comma-separated-value as anything that is not a ','
        csv_value = CharsNotIn(',')
        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
    prints::
        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
    """
    def __init__( self, notChars, min=1, max=0, exact=0 ):
        super(CharsNotIn,self).__init__()
        self.skipWhitespace = False
        self.notChars = notChars

        if min < 1:
            raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted")

        self.minLen = min

        if max > 0:
            self.maxLen = max
        else:
            self.maxLen = _MAX_INT

        if exact > 0:
            self.maxLen = exact
            self.minLen = exact

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayReturnEmpty = ( self.minLen == 0 )
        self.mayIndexError = False

    def parseImpl( self, instring, loc, doActions=True ):
        if instring[loc] in self.notChars:
            raise ParseException(instring, loc, self.errmsg, self)

        start = loc
        loc += 1
        notchars = self.notChars
        maxlen = min( start+self.maxLen, len(instring) )
        while loc < maxlen and \
              (instring[loc] not in notchars):
            loc += 1

        if loc - start < self.minLen:
            raise ParseException(instring, loc, self.errmsg, self)

        return loc, instring[start:loc]

    def __str__( self ):
        try:
            return super(CharsNotIn, self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            if len(self.notChars) > 4:
                self.strRepr = "!W:(%s...)" % self.notChars[:4]
            else:
                self.strRepr = "!W:(%s)" % self.notChars

        return self.strRepr

class White(Token):
    """
    Special matching class for matching whitespace.  Normally, whitespace is ignored
    by pyparsing grammars.  This class is included when some whitespace structures
    are significant.  Define with a string containing the whitespace characters to be
    matched; default is C{" \\t\\r\\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
    as defined for the C{L{Word}} class.
    """
    whiteStrs = {
        " " : "",
        "\t": "",
        "\n": "",
        "\r": "",
        "\f": "",
        }
    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
        super(White,self).__init__()
        self.matchWhite = ws
        self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) )
        #~ self.leaveWhitespace()
        self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite))
        self.mayReturnEmpty = True
        self.errmsg = "Expected " + self.name

        self.minLen = min

        if max > 0:
            self.maxLen = max
        else:
            self.maxLen = _MAX_INT

        if exact > 0:
            self.maxLen = exact
            self.minLen = exact

    def parseImpl( self, instring, loc, doActions=True ):
        if not(instring[ loc ] in self.matchWhite):
            raise ParseException(instring, loc, self.errmsg, self)
        start = loc
        loc += 1
        maxloc = start + self.maxLen
        maxloc = min( maxloc, len(instring) )
        while loc < maxloc and instring[loc] in self.matchWhite:
            loc += 1

        if loc - start < self.minLen:
            raise ParseException(instring, loc, self.errmsg, self)

        return loc, instring[start:loc]


class _PositionToken(Token):
    def __init__( self ):
        super(_PositionToken,self).__init__()
        self.name=self.__class__.__name__
        self.mayReturnEmpty = True
        self.mayIndexError = False

class GoToColumn(_PositionToken):
    """
    Token to advance to a specific column of input text; useful for tabular report scraping.
    """
    def __init__( self, colno ):
        super(GoToColumn,self).__init__()
        self.col = colno

    def preParse( self, instring, loc ):
        if col(loc,instring) != self.col:
            instrlen = len(instring)
            if self.ignoreExprs:
                loc = self._skipIgnorables( instring, loc )
            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
                loc += 1
        return loc

    def parseImpl( self, instring, loc, doActions=True ):
        thiscol = col( loc, instring )
        if thiscol > self.col:
            raise ParseException( instring, loc, "Text not in expected column", self )
        newloc = loc + self.col - thiscol
        ret = instring[ loc: newloc ]
        return newloc, ret


class LineStart(_PositionToken):
    """
    Matches if current position is at the beginning of a line within the parse string
    
    Example::
    
        test = '''\
        AAA this line
        AAA and this line
          AAA but not this one
        B AAA and definitely not this one
        '''

        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
            print(t)
    
    Prints::
        ['AAA', ' this line']
        ['AAA', ' and this line']    

    """
    def __init__( self ):
        super(LineStart,self).__init__()
        self.errmsg = "Expected start of line"

    def parseImpl( self, instring, loc, doActions=True ):
        if col(loc, instring) == 1:
            return loc, []
        raise ParseException(instring, loc, self.errmsg, self)

class LineEnd(_PositionToken):
    """
    Matches if current position is at the end of a line within the parse string
    """
    def __init__( self ):
        super(LineEnd,self).__init__()
        self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") )
        self.errmsg = "Expected end of line"

    def parseImpl( self, instring, loc, doActions=True ):
        if loc len(instring):
            return loc, []
        else:
            raise ParseException(instring, loc, self.errmsg, self)

class WordStart(_PositionToken):
    """
    Matches if the current position is at the beginning of a Word, and
    is not preceded by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
    the string being parsed, or at the beginning of a line.
    """
    def __init__(self, wordChars = printables):
        super(WordStart,self).__init__()
        self.wordChars = set(wordChars)
        self.errmsg = "Not at the start of a word"

    def parseImpl(self, instring, loc, doActions=True ):
        if loc != 0:
            if (instring[loc-1] in self.wordChars or
                instring[loc] not in self.wordChars):
                raise ParseException(instring, loc, self.errmsg, self)
        return loc, []

class WordEnd(_PositionToken):
    """
    Matches if the current position is at the end of a Word, and
    is not followed by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
    the string being parsed, or at the end of a line.
    """
    def __init__(self, wordChars = printables):
        super(WordEnd,self).__init__()
        self.wordChars = set(wordChars)
        self.skipWhitespace = False
        self.errmsg = "Not at the end of a word"

    def parseImpl(self, instring, loc, doActions=True ):
        instrlen = len(instring)
        if instrlen>0 and loc maxExcLoc:
                    maxException = err
                    maxExcLoc = err.loc
            except IndexError:
                if len(instring) > maxExcLoc:
                    maxException = ParseException(instring,len(instring),e.errmsg,self)
                    maxExcLoc = len(instring)
            else:
                # save match among all matches, to retry longest to shortest
                matches.append((loc2, e))

        if matches:
            matches.sort(key=lambda x: -x[0])
            for _,e in matches:
                try:
                    return e._parse( instring, loc, doActions )
                except ParseException as err:
                    err.__traceback__ = None
                    if err.loc > maxExcLoc:
                        maxException = err
                        maxExcLoc = err.loc

        if maxException is not None:
            maxException.msg = self.errmsg
            raise maxException
        else:
            raise ParseException(instring, loc, "no defined alternatives to match", self)


    def __ixor__(self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        return self.append( other ) #Or( [ self, other ] )

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )


class MatchFirst(ParseExpression):
    """
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the first one listed is the one that will match.
    May be constructed using the C{'|'} operator.

    Example::
        # construct MatchFirst using '|' operator
        
        # watch the order of expressions to match
        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]

        # put more selective expression first
        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
    """
    def __init__( self, exprs, savelist = False ):
        super(MatchFirst,self).__init__(exprs, savelist)
        if self.exprs:
            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
        else:
            self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        maxExcLoc = -1
        maxException = None
        for e in self.exprs:
            try:
                ret = e._parse( instring, loc, doActions )
                return ret
            except ParseException as err:
                if err.loc > maxExcLoc:
                    maxException = err
                    maxExcLoc = err.loc
            except IndexError:
                if len(instring) > maxExcLoc:
                    maxException = ParseException(instring,len(instring),e.errmsg,self)
                    maxExcLoc = len(instring)

        # only got here if no expression matched, raise exception for match that made it the furthest
        else:
            if maxException is not None:
                maxException.msg = self.errmsg
                raise maxException
            else:
                raise ParseException(instring, loc, "no defined alternatives to match", self)

    def __ior__(self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        return self.append( other ) #MatchFirst( [ self, other ] )

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )


class Each(ParseExpression):
    """
    Requires all given C{ParseExpression}s to be found, but in any order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'&'} operator.

    Example::
        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
        integer = Word(nums)
        shape_attr = "shape:" + shape_type("shape")
        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
        color_attr = "color:" + color("color")
        size_attr = "size:" + integer("size")

        # use Each (using operator '&') to accept attributes in any order 
        # (shape and posn are required, color and size are optional)
        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)

        shape_spec.runTests('''
            shape: SQUARE color: BLACK posn: 100, 120
            shape: CIRCLE size: 50 color: BLUE posn: 50,80
            color:GREEN size:20 shape:TRIANGLE posn:20,40
            '''
            )
    prints::
        shape: SQUARE color: BLACK posn: 100, 120
        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
        - color: BLACK
        - posn: ['100', ',', '120']
          - x: 100
          - y: 120
        - shape: SQUARE


        shape: CIRCLE size: 50 color: BLUE posn: 50,80
        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
        - color: BLUE
        - posn: ['50', ',', '80']
          - x: 50
          - y: 80
        - shape: CIRCLE
        - size: 50


        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
        - color: GREEN
        - posn: ['20', ',', '40']
          - x: 20
          - y: 40
        - shape: TRIANGLE
        - size: 20
    """
    def __init__( self, exprs, savelist = True ):
        super(Each,self).__init__(exprs, savelist)
        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
        self.skipWhitespace = True
        self.initExprGroups = True

    def parseImpl( self, instring, loc, doActions=True ):
        if self.initExprGroups:
            self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional))
            opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
            opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)]
            self.optionals = opt1 + opt2
            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
            self.required += self.multirequired
            self.initExprGroups = False
        tmpLoc = loc
        tmpReqd = self.required[:]
        tmpOpt  = self.optionals[:]
        matchOrder = []

        keepMatching = True
        while keepMatching:
            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
            failed = []
            for e in tmpExprs:
                try:
                    tmpLoc = e.tryParse( instring, tmpLoc )
                except ParseException:
                    failed.append(e)
                else:
                    matchOrder.append(self.opt1map.get(id(e),e))
                    if e in tmpReqd:
                        tmpReqd.remove(e)
                    elif e in tmpOpt:
                        tmpOpt.remove(e)
            if len(failed) == len(tmpExprs):
                keepMatching = False

        if tmpReqd:
            missing = ", ".join(_ustr(e) for e in tmpReqd)
            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )

        # add any unmatched Optionals, in case they have default values defined
        matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt]

        resultlist = []
        for e in matchOrder:
            loc,results = e._parse(instring,loc,doActions)
            resultlist.append(results)

        finalResults = sum(resultlist, ParseResults([]))
        return loc, finalResults

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )


class ParseElementEnhance(ParserElement):
    """
    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
    """
    def __init__( self, expr, savelist=False ):
        super(ParseElementEnhance,self).__init__(savelist)
        if isinstance( expr, basestring ):
            if issubclass(ParserElement._literalStringClass, Token):
                expr = ParserElement._literalStringClass(expr)
            else:
                expr = ParserElement._literalStringClass(Literal(expr))
        self.expr = expr
        self.strRepr = None
        if expr is not None:
            self.mayIndexError = expr.mayIndexError
            self.mayReturnEmpty = expr.mayReturnEmpty
            self.setWhitespaceChars( expr.whiteChars )
            self.skipWhitespace = expr.skipWhitespace
            self.saveAsList = expr.saveAsList
            self.callPreparse = expr.callPreparse
            self.ignoreExprs.extend(expr.ignoreExprs)

    def parseImpl( self, instring, loc, doActions=True ):
        if self.expr is not None:
            return self.expr._parse( instring, loc, doActions, callPreParse=False )
        else:
            raise ParseException("",loc,self.errmsg,self)

    def leaveWhitespace( self ):
        self.skipWhitespace = False
        self.expr = self.expr.copy()
        if self.expr is not None:
            self.expr.leaveWhitespace()
        return self

    def ignore( self, other ):
        if isinstance( other, Suppress ):
            if other not in self.ignoreExprs:
                super( ParseElementEnhance, self).ignore( other )
                if self.expr is not None:
                    self.expr.ignore( self.ignoreExprs[-1] )
        else:
            super( ParseElementEnhance, self).ignore( other )
            if self.expr is not None:
                self.expr.ignore( self.ignoreExprs[-1] )
        return self

    def streamline( self ):
        super(ParseElementEnhance,self).streamline()
        if self.expr is not None:
            self.expr.streamline()
        return self

    def checkRecursion( self, parseElementList ):
        if self in parseElementList:
            raise RecursiveGrammarException( parseElementList+[self] )
        subRecCheckList = parseElementList[:] + [ self ]
        if self.expr is not None:
            self.expr.checkRecursion( subRecCheckList )

    def validate( self, validateTrace=[] ):
        tmp = validateTrace[:]+[self]
        if self.expr is not None:
            self.expr.validate(tmp)
        self.checkRecursion( [] )

    def __str__( self ):
        try:
            return super(ParseElementEnhance,self).__str__()
        except Exception:
            pass

        if self.strRepr is None and self.expr is not None:
            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
        return self.strRepr


class FollowedBy(ParseElementEnhance):
    """
    Lookahead matching of the given parse expression.  C{FollowedBy}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression matches at the current
    position.  C{FollowedBy} always returns a null token list.

    Example::
        # use FollowedBy to match a label only if it is followed by a ':'
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
    prints::
        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
    """
    def __init__( self, expr ):
        super(FollowedBy,self).__init__(expr)
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        self.expr.tryParse( instring, loc )
        return loc, []


class NotAny(ParseElementEnhance):
    """
    Lookahead to disallow matching with the given parse expression.  C{NotAny}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression does I{not} match at the current
    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
    always returns a null token list.  May be constructed using the '~' operator.

    Example::
        
    """
    def __init__( self, expr ):
        super(NotAny,self).__init__(expr)
        #~ self.leaveWhitespace()
        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
        self.mayReturnEmpty = True
        self.errmsg = "Found unwanted token, "+_ustr(self.expr)

    def parseImpl( self, instring, loc, doActions=True ):
        if self.expr.canParseNext(instring, loc):
            raise ParseException(instring, loc, self.errmsg, self)
        return loc, []

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "~{" + _ustr(self.expr) + "}"

        return self.strRepr

class _MultipleMatch(ParseElementEnhance):
    def __init__( self, expr, stopOn=None):
        super(_MultipleMatch, self).__init__(expr)
        self.saveAsList = True
        ender = stopOn
        if isinstance(ender, basestring):
            ender = ParserElement._literalStringClass(ender)
        self.not_ender = ~ender if ender is not None else None

    def parseImpl( self, instring, loc, doActions=True ):
        self_expr_parse = self.expr._parse
        self_skip_ignorables = self._skipIgnorables
        check_ender = self.not_ender is not None
        if check_ender:
            try_not_ender = self.not_ender.tryParse
        
        # must be at least one (but first see if we are the stopOn sentinel;
        # if so, fail)
        if check_ender:
            try_not_ender(instring, loc)
        loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False )
        try:
            hasIgnoreExprs = (not not self.ignoreExprs)
            while 1:
                if check_ender:
                    try_not_ender(instring, loc)
                if hasIgnoreExprs:
                    preloc = self_skip_ignorables( instring, loc )
                else:
                    preloc = loc
                loc, tmptokens = self_expr_parse( instring, preloc, doActions )
                if tmptokens or tmptokens.haskeys():
                    tokens += tmptokens
        except (ParseException,IndexError):
            pass

        return loc, tokens
        
class OneOrMore(_MultipleMatch):
    """
    Repetition of one or more of the given expression.
    
    Parameters:
     - expr - expression that must match one or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: BLACK"
        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]

        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
        
        # could also be written as
        (attr_expr * (1,)).parseString(text).pprint()
    """

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + _ustr(self.expr) + "}..."

        return self.strRepr

class ZeroOrMore(_MultipleMatch):
    """
    Optional repetition of zero or more of the given expression.
    
    Parameters:
     - expr - expression that must match zero or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example: similar to L{OneOrMore}
    """
    def __init__( self, expr, stopOn=None):
        super(ZeroOrMore,self).__init__(expr, stopOn=stopOn)
        self.mayReturnEmpty = True
        
    def parseImpl( self, instring, loc, doActions=True ):
        try:
            return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
        except (ParseException,IndexError):
            return loc, []

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "[" + _ustr(self.expr) + "]..."

        return self.strRepr

class _NullToken(object):
    def __bool__(self):
        return False
    __nonzero__ = __bool__
    def __str__(self):
        return ""

_optionalNotMatched = _NullToken()
class Optional(ParseElementEnhance):
    """
    Optional matching of the given expression.

    Parameters:
     - expr - expression that must match zero or more times
     - default (optional) - value to be returned if the optional expression is not found.

    Example::
        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
        zip.runTests('''
            # traditional ZIP code
            12345
            
            # ZIP+4 form
            12101-0001
            
            # invalid ZIP
            98765-
            ''')
    prints::
        # traditional ZIP code
        12345
        ['12345']

        # ZIP+4 form
        12101-0001
        ['12101-0001']

        # invalid ZIP
        98765-
             ^
        FAIL: Expected end of text (at char 5), (line:1, col:6)
    """
    def __init__( self, expr, default=_optionalNotMatched ):
        super(Optional,self).__init__( expr, savelist=False )
        self.saveAsList = self.expr.saveAsList
        self.defaultValue = default
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        try:
            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
        except (ParseException,IndexError):
            if self.defaultValue is not _optionalNotMatched:
                if self.expr.resultsName:
                    tokens = ParseResults([ self.defaultValue ])
                    tokens[self.expr.resultsName] = self.defaultValue
                else:
                    tokens = [ self.defaultValue ]
            else:
                tokens = []
        return loc, tokens

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "[" + _ustr(self.expr) + "]"

        return self.strRepr

class SkipTo(ParseElementEnhance):
    """
    Token for skipping over all undefined text until the matched expression is found.

    Parameters:
     - expr - target expression marking the end of the data to be skipped
     - include - (default=C{False}) if True, the target expression is also parsed 
          (the skipped text and target expression are returned as a 2-element list).
     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
          comments) that might contain false matches to the target expression
     - failOn - (default=C{None}) define expressions that are not allowed to be 
          included in the skipped test; if found before the target expression is found, 
          the SkipTo is not a match

    Example::
        report = '''
            Outstanding Issues Report - 1 Jan 2000

               # | Severity | Description                               |  Days Open
            -----+----------+-------------------------------------------+-----------
             101 | Critical | Intermittent system crash                 |          6
              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
              79 | Minor    | System slow when running too many reports |         47
            '''
        integer = Word(nums)
        SEP = Suppress('|')
        # use SkipTo to simply match everything up until the next SEP
        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
        # - parse action will call token.strip() for each matched token, i.e., the description body
        string_data = SkipTo(SEP, ignore=quotedString)
        string_data.setParseAction(tokenMap(str.strip))
        ticket_expr = (integer("issue_num") + SEP 
                      + string_data("sev") + SEP 
                      + string_data("desc") + SEP 
                      + integer("days_open"))
        
        for tkt in ticket_expr.searchString(report):
            print tkt.dump()
    prints::
        ['101', 'Critical', 'Intermittent system crash', '6']
        - days_open: 6
        - desc: Intermittent system crash
        - issue_num: 101
        - sev: Critical
        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
        - days_open: 14
        - desc: Spelling error on Login ('log|n')
        - issue_num: 94
        - sev: Cosmetic
        ['79', 'Minor', 'System slow when running too many reports', '47']
        - days_open: 47
        - desc: System slow when running too many reports
        - issue_num: 79
        - sev: Minor
    """
    def __init__( self, other, include=False, ignore=None, failOn=None ):
        super( SkipTo, self ).__init__( other )
        self.ignoreExpr = ignore
        self.mayReturnEmpty = True
        self.mayIndexError = False
        self.includeMatch = include
        self.asList = False
        if isinstance(failOn, basestring):
            self.failOn = ParserElement._literalStringClass(failOn)
        else:
            self.failOn = failOn
        self.errmsg = "No match found for "+_ustr(self.expr)

    def parseImpl( self, instring, loc, doActions=True ):
        startloc = loc
        instrlen = len(instring)
        expr = self.expr
        expr_parse = self.expr._parse
        self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None
        self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None
        
        tmploc = loc
        while tmploc <= instrlen:
            if self_failOn_canParseNext is not None:
                # break if failOn expression matches
                if self_failOn_canParseNext(instring, tmploc):
                    break
                    
            if self_ignoreExpr_tryParse is not None:
                # advance past ignore expressions
                while 1:
                    try:
                        tmploc = self_ignoreExpr_tryParse(instring, tmploc)
                    except ParseBaseException:
                        break
            
            try:
                expr_parse(instring, tmploc, doActions=False, callPreParse=False)
            except (ParseException, IndexError):
                # no match, advance loc in string
                tmploc += 1
            else:
                # matched skipto expr, done
                break

        else:
            # ran off the end of the input string without matching skipto expr, fail
            raise ParseException(instring, loc, self.errmsg, self)

        # build up return values
        loc = tmploc
        skiptext = instring[startloc:loc]
        skipresult = ParseResults(skiptext)
        
        if self.includeMatch:
            loc, mat = expr_parse(instring,loc,doActions,callPreParse=False)
            skipresult += mat

        return loc, skipresult

class Forward(ParseElementEnhance):
    """
    Forward declaration of an expression to be defined later -
    used for recursive grammars, such as algebraic infix notation.
    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.

    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
    Specifically, '|' has a lower precedence than '<<', so that::
        fwdExpr << a | b | c
    will actually be evaluated as::
        (fwdExpr << a) | b | c
    thereby leaving b and c out as parseable alternatives.  It is recommended that you
    explicitly group the values inserted into the C{Forward}::
        fwdExpr << (a | b | c)
    Converting to use the '<<=' operator instead will avoid this problem.

    See L{ParseResults.pprint} for an example of a recursive parser created using
    C{Forward}.
    """
    def __init__( self, other=None ):
        super(Forward,self).__init__( other, savelist=False )

    def __lshift__( self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass(other)
        self.expr = other
        self.strRepr = None
        self.mayIndexError = self.expr.mayIndexError
        self.mayReturnEmpty = self.expr.mayReturnEmpty
        self.setWhitespaceChars( self.expr.whiteChars )
        self.skipWhitespace = self.expr.skipWhitespace
        self.saveAsList = self.expr.saveAsList
        self.ignoreExprs.extend(self.expr.ignoreExprs)
        return self
        
    def __ilshift__(self, other):
        return self << other
    
    def leaveWhitespace( self ):
        self.skipWhitespace = False
        return self

    def streamline( self ):
        if not self.streamlined:
            self.streamlined = True
            if self.expr is not None:
                self.expr.streamline()
        return self

    def validate( self, validateTrace=[] ):
        if self not in validateTrace:
            tmp = validateTrace[:]+[self]
            if self.expr is not None:
                self.expr.validate(tmp)
        self.checkRecursion([])

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name
        return self.__class__.__name__ + ": ..."

        # stubbed out for now - creates awful memory and perf issues
        self._revertClass = self.__class__
        self.__class__ = _ForwardNoRecurse
        try:
            if self.expr is not None:
                retString = _ustr(self.expr)
            else:
                retString = "None"
        finally:
            self.__class__ = self._revertClass
        return self.__class__.__name__ + ": " + retString

    def copy(self):
        if self.expr is not None:
            return super(Forward,self).copy()
        else:
            ret = Forward()
            ret <<= self
            return ret

class _ForwardNoRecurse(Forward):
    def __str__( self ):
        return "..."

class TokenConverter(ParseElementEnhance):
    """
    Abstract subclass of C{ParseExpression}, for converting parsed results.
    """
    def __init__( self, expr, savelist=False ):
        super(TokenConverter,self).__init__( expr )#, savelist )
        self.saveAsList = False

class Combine(TokenConverter):
    """
    Converter to concatenate all matching tokens to a single string.
    By default, the matching patterns must also be contiguous in the input string;
    this can be disabled by specifying C{'adjacent=False'} in the constructor.

    Example::
        real = Word(nums) + '.' + Word(nums)
        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
        # will also erroneously match the following
        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']

        real = Combine(Word(nums) + '.' + Word(nums))
        print(real.parseString('3.1416')) # -> ['3.1416']
        # no match when there are internal spaces
        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
    """
    def __init__( self, expr, joinString="", adjacent=True ):
        super(Combine,self).__init__( expr )
        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
        if adjacent:
            self.leaveWhitespace()
        self.adjacent = adjacent
        self.skipWhitespace = True
        self.joinString = joinString
        self.callPreparse = True

    def ignore( self, other ):
        if self.adjacent:
            ParserElement.ignore(self, other)
        else:
            super( Combine, self).ignore( other )
        return self

    def postParse( self, instring, loc, tokenlist ):
        retToks = tokenlist.copy()
        del retToks[:]
        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)

        if self.resultsName and retToks.haskeys():
            return [ retToks ]
        else:
            return retToks

class Group(TokenConverter):
    """
    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.

    Example::
        ident = Word(alphas)
        num = Word(nums)
        term = ident | num
        func = ident + Optional(delimitedList(term))
        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']

        func = ident + Group(Optional(delimitedList(term)))
        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
    """
    def __init__( self, expr ):
        super(Group,self).__init__( expr )
        self.saveAsList = True

    def postParse( self, instring, loc, tokenlist ):
        return [ tokenlist ]

class Dict(TokenConverter):
    """
    Converter to return a repetitive expression as a list, but also as a dictionary.
    Each element can also be referenced using the first token in the expression as its key.
    Useful for tabular report scraping when the first column can be used as a item key.

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        # print attributes as plain groups
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
        print(result.dump())
        
        # access named fields as dict entries, or output as dict
        print(result['shape'])        
        print(result.asDict())
    prints::
        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']

        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
    See more examples at L{ParseResults} of accessing fields by results name.
    """
    def __init__( self, expr ):
        super(Dict,self).__init__( expr )
        self.saveAsList = True

    def postParse( self, instring, loc, tokenlist ):
        for i,tok in enumerate(tokenlist):
            if len(tok) == 0:
                continue
            ikey = tok[0]
            if isinstance(ikey,int):
                ikey = _ustr(tok[0]).strip()
            if len(tok)==1:
                tokenlist[ikey] = _ParseResultsWithOffset("",i)
            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
            else:
                dictvalue = tok.copy() #ParseResults(i)
                del dictvalue[0]
                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()):
                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
                else:
                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)

        if self.resultsName:
            return [ tokenlist ]
        else:
            return tokenlist


class Suppress(TokenConverter):
    """
    Converter for ignoring the results of a parsed expression.

    Example::
        source = "a, b, c,d"
        wd = Word(alphas)
        wd_list1 = wd + ZeroOrMore(',' + wd)
        print(wd_list1.parseString(source))

        # often, delimiters that are useful during parsing are just in the
        # way afterward - use Suppress to keep them out of the parsed output
        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
        print(wd_list2.parseString(source))
    prints::
        ['a', ',', 'b', ',', 'c', ',', 'd']
        ['a', 'b', 'c', 'd']
    (See also L{delimitedList}.)
    """
    def postParse( self, instring, loc, tokenlist ):
        return []

    def suppress( self ):
        return self


class OnlyOnce(object):
    """
    Wrapper for parse actions, to ensure they are only called once.
    """
    def __init__(self, methodCall):
        self.callable = _trim_arity(methodCall)
        self.called = False
    def __call__(self,s,l,t):
        if not self.called:
            results = self.callable(s,l,t)
            self.called = True
            return results
        raise ParseException(s,l,"")
    def reset(self):
        self.called = False

def traceParseAction(f):
    """
    Decorator for debugging parse actions. 
    
    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.

    Example::
        wd = Word(alphas)

        @traceParseAction
        def remove_duplicate_chars(tokens):
            return ''.join(sorted(set(''.join(tokens)))

        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
    prints::
        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
        <3:
            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
        sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) )
        try:
            ret = f(*paArgs)
        except Exception as exc:
            sys.stderr.write( "< ['aa', 'bb', 'cc']
        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
    """
    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
    if combine:
        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
    else:
        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)

def countedArray( expr, intExpr=None ):
    """
    Helper to define a counted list of expressions.
    This helper defines a pattern of the form::
        integer expr expr expr...
    where the leading integer tells how many expr expressions follow.
    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
    
    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.

    Example::
        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']

        # in this parser, the leading integer value is given in binary,
        # '10' indicating that 2 values are in the array
        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
    """
    arrayExpr = Forward()
    def countFieldParseAction(s,l,t):
        n = t[0]
        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
        return []
    if intExpr is None:
        intExpr = Word(nums).setParseAction(lambda t:int(t[0]))
    else:
        intExpr = intExpr.copy()
    intExpr.setName("arrayLen")
    intExpr.addParseAction(countFieldParseAction, callDuringTry=True)
    return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...')

def _flatten(L):
    ret = []
    for i in L:
        if isinstance(i,list):
            ret.extend(_flatten(i))
        else:
            ret.append(i)
    return ret

def matchPreviousLiteral(expr):
    """
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousLiteral(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
    If this is not desired, use C{matchPreviousExpr}.
    Do I{not} use with packrat parsing enabled.
    """
    rep = Forward()
    def copyTokenToRepeater(s,l,t):
        if t:
            if len(t) == 1:
                rep << t[0]
            else:
                # flatten t tokens
                tflat = _flatten(t.asList())
                rep << And(Literal(tt) for tt in tflat)
        else:
            rep << Empty()
    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
    rep.setName('(prev) ' + _ustr(expr))
    return rep

def matchPreviousExpr(expr):
    """
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousExpr(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
    the expressions are evaluated first, and then compared, so
    C{"1"} is compared with C{"10"}.
    Do I{not} use with packrat parsing enabled.
    """
    rep = Forward()
    e2 = expr.copy()
    rep <<= e2
    def copyTokenToRepeater(s,l,t):
        matchTokens = _flatten(t.asList())
        def mustMatchTheseTokens(s,l,t):
            theseTokens = _flatten(t.asList())
            if  theseTokens != matchTokens:
                raise ParseException("",0,"")
        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
    rep.setName('(prev) ' + _ustr(expr))
    return rep

def _escapeRegexRangeChars(s):
    #~  escape these chars: ^-]
    for c in r"\^-]":
        s = s.replace(c,_bslash+c)
    s = s.replace("\n",r"\n")
    s = s.replace("\t",r"\t")
    return _ustr(s)

def oneOf( strs, caseless=False, useRegex=True ):
    """
    Helper to quickly define a set of alternative Literals, and makes sure to do
    longest-first testing when there is a conflict, regardless of the input order,
    but returns a C{L{MatchFirst}} for best performance.

    Parameters:
     - strs - a string of space-delimited literals, or a collection of string literals
     - caseless - (default=C{False}) - treat all literals as caseless
     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
          if creating a C{Regex} raises an exception)

    Example::
        comp_oper = oneOf("< = > <= >= !=")
        var = Word(alphas)
        number = Word(nums)
        term = var | number
        comparison_expr = term + comp_oper + term
        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
    prints::
        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
    """
    if caseless:
        isequal = ( lambda a,b: a.upper() == b.upper() )
        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
        parseElementClass = CaselessLiteral
    else:
        isequal = ( lambda a,b: a == b )
        masks = ( lambda a,b: b.startswith(a) )
        parseElementClass = Literal

    symbols = []
    if isinstance(strs,basestring):
        symbols = strs.split()
    elif isinstance(strs, collections.Iterable):
        symbols = list(strs)
    else:
        warnings.warn("Invalid argument to oneOf, expected string or iterable",
                SyntaxWarning, stacklevel=2)
    if not symbols:
        return NoMatch()

    i = 0
    while i < len(symbols)-1:
        cur = symbols[i]
        for j,other in enumerate(symbols[i+1:]):
            if ( isequal(other, cur) ):
                del symbols[i+j+1]
                break
            elif ( masks(cur, other) ):
                del symbols[i+j+1]
                symbols.insert(i,other)
                cur = other
                break
        else:
            i += 1

    if not caseless and useRegex:
        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
        try:
            if len(symbols)==len("".join(symbols)):
                return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols))
            else:
                return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols))
        except Exception:
            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
                    SyntaxWarning, stacklevel=2)


    # last resort, just use MatchFirst
    return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols))

def dictOf( key, value ):
    """
    Helper to easily and clearly define a dictionary by specifying the respective patterns
    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
    in the proper order.  The key pattern can include delimiting markers or punctuation,
    as long as they are suppressed, thereby leaving the significant key text.  The value
    pattern can include named results, so that the C{Dict} results can include named token
    fields.

    Example::
        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        attr_label = label
        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)

        # similar to Dict, but simpler call format
        result = dictOf(attr_label, attr_value).parseString(text)
        print(result.dump())
        print(result['shape'])
        print(result.shape)  # object attribute access works too
        print(result.asDict())
    prints::
        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        SQUARE
        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
    """
    return Dict( ZeroOrMore( Group ( key + value ) ) )

def originalTextFor(expr, asString=True):
    """
    Helper to return the original, untokenized text for a given expression.  Useful to
    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
    revert separate tokens with intervening whitespace back to the original matching
    input text. By default, returns astring containing the original parsed text.  
       
    If the optional C{asString} argument is passed as C{False}, then the return value is a 
    C{L{ParseResults}} containing any results names that were originally matched, and a 
    single token containing the original matched text from the input string.  So if 
    the expression passed to C{L{originalTextFor}} contains expressions with defined
    results names, you must set C{asString} to C{False} if you want to preserve those
    results name values.

    Example::
        src = "this is test  bold text  normal text "
        for tag in ("b","i"):
            opener,closer = makeHTMLTags(tag)
            patt = originalTextFor(opener + SkipTo(closer) + closer)
            print(patt.searchString(src)[0])
    prints::
        [' bold text ']
        ['text']
    """
    locMarker = Empty().setParseAction(lambda s,loc,t: loc)
    endlocMarker = locMarker.copy()
    endlocMarker.callPreparse = False
    matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
    if asString:
        extractText = lambda s,l,t: s[t._original_start:t._original_end]
    else:
        def extractText(s,l,t):
            t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]]
    matchExpr.setParseAction(extractText)
    matchExpr.ignoreExprs = expr.ignoreExprs
    return matchExpr

def ungroup(expr): 
    """
    Helper to undo pyparsing's default grouping of And expressions, even
    if all but one are non-empty.
    """
    return TokenConverter(expr).setParseAction(lambda t:t[0])

def locatedExpr(expr):
    """
    Helper to decorate a returned token with its starting and ending locations in the input string.
    This helper adds the following results names:
     - locn_start = location where matched expression begins
     - locn_end = location where matched expression ends
     - value = the actual parsed results

    Be careful if the input text contains C{} characters, you may want to call
    C{L{ParserElement.parseWithTabs}}

    Example::
        wd = Word(alphas)
        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
            print(match)
    prints::
        [[0, 'ljsdf', 5]]
        [[8, 'lksdjjf', 15]]
        [[18, 'lkkjj', 23]]
    """
    locator = Empty().setParseAction(lambda s,l,t: l)
    return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))


# convenience constants for positional expressions
empty       = Empty().setName("empty")
lineStart   = LineStart().setName("lineStart")
lineEnd     = LineEnd().setName("lineEnd")
stringStart = StringStart().setName("stringStart")
stringEnd   = StringEnd().setName("stringEnd")

_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16)))
_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8)))
_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE)
_charRange = Group(_singleChar + Suppress("-") + _singleChar)
_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"

def srange(s):
    r"""
    Helper to easily define string ranges for use in Word construction.  Borrows
    syntax from regexp '[]' string range definitions::
        srange("[0-9]")   -> "0123456789"
        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
    The input string must be enclosed in []'s, and the returned string is the expanded
    character set joined into a single string.
    The values enclosed in the []'s may be:
     - a single character
     - an escaped character with a leading backslash (such as C{\-} or C{\]})
     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
         (C{\0x##} is also supported for backwards compatibility) 
     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
    """
    _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1))
    try:
        return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body)
    except Exception:
        return ""

def matchOnlyAtCol(n):
    """
    Helper method for defining parse actions that require matching at a specific
    column in the input text.
    """
    def verifyCol(strg,locn,toks):
        if col(locn,strg) != n:
            raise ParseException(strg,locn,"matched token not at column %d" % n)
    return verifyCol

def replaceWith(replStr):
    """
    Helper method for common parse actions that simply return a literal value.  Especially
    useful when used with C{L{transformString}()}.

    Example::
        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
        term = na | num
        
        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
    """
    return lambda s,l,t: [replStr]

def removeQuotes(s,l,t):
    """
    Helper parse action for removing quotation marks from parsed quoted strings.

    Example::
        # by default, quotation marks are included in parsed results
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]

        # use removeQuotes to strip quotation marks from parsed results
        quotedString.setParseAction(removeQuotes)
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
    """
    return t[0][1:-1]

def tokenMap(func, *args):
    """
    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
    args are passed, they are forwarded to the given function as additional arguments after
    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
    parsed data to an integer using base 16.

    Example (compare the last to example in L{ParserElement.transformString}::
        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
        hex_ints.runTests('''
            00 11 22 aa FF 0a 0d 1a
            ''')
        
        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
        OneOrMore(upperword).runTests('''
            my kingdom for a horse
            ''')

        wd = Word(alphas).setParseAction(tokenMap(str.title))
        OneOrMore(wd).setParseAction(' '.join).runTests('''
            now is the winter of our discontent made glorious summer by this sun of york
            ''')
    prints::
        00 11 22 aa FF 0a 0d 1a
        [0, 17, 34, 170, 255, 10, 13, 26]

        my kingdom for a horse
        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']

        now is the winter of our discontent made glorious summer by this sun of york
        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
    """
    def pa(s,l,t):
        return [func(tokn, *args) for tokn in t]

    try:
        func_name = getattr(func, '__name__', 
                            getattr(func, '__class__').__name__)
    except Exception:
        func_name = str(func)
    pa.__name__ = func_name

    return pa

upcaseTokens = tokenMap(lambda t: _ustr(t).upper())
"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}"""

downcaseTokens = tokenMap(lambda t: _ustr(t).lower())
"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}"""
    
def _makeTags(tagStr, xml):
    """Internal helper to construct opening and closing tag expressions, given a tag name"""
    if isinstance(tagStr,basestring):
        resname = tagStr
        tagStr = Keyword(tagStr, caseless=not xml)
    else:
        resname = tagStr.name

    tagAttrName = Word(alphas,alphanums+"_-:")
    if (xml):
        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
        openTag = Suppress("<") + tagStr("tag") + \
                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
    else:
        printablesLessRAbrack = "".join(c for c in printables if c not in ">")
        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
        openTag = Suppress("<") + tagStr("tag") + \
                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
                Optional( Suppress("=") + tagAttrValue ) ))) + \
                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
    closeTag = Combine(_L("")

    openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname)
    closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % resname)
    openTag.tag = resname
    closeTag.tag = resname
    return openTag, closeTag

def makeHTMLTags(tagStr):
    """
    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.

    Example::
        text = 'More info at the pyparsing wiki page'
        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
        a,a_end = makeHTMLTags("A")
        link_expr = a + SkipTo(a_end)("link_text") + a_end
        
        for link in link_expr.searchString(text):
            # attributes in the  tag (like "href" shown here) are also accessible as named results
            print(link.link_text, '->', link.href)
    prints::
        pyparsing -> http://pyparsing.wikispaces.com
    """
    return _makeTags( tagStr, False )

def makeXMLTags(tagStr):
    """
    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
    tags only in the given upper/lower case.

    Example: similar to L{makeHTMLTags}
    """
    return _makeTags( tagStr, True )

def withAttribute(*args,**attrDict):
    """
    Helper to create a validating parse action to be used with start tags created
    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
    with a required attribute value, to avoid false matches on common tags such as
    C{} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. If just testing for C{class} (with or without a namespace), use C{L{withClass}}. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this has no type
''' div,div_end = makeHTMLTags("div") # only match div tag having a type attribute with value "grid" div_grid = div().setParseAction(withAttribute(type="grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) # construct a match with any div tag having a type attribute, regardless of the value div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 """ if args: attrs = args[:] else: attrs = attrDict.items() attrs = [(k,v) for k,v in attrs] def pa(s,l,tokens): for attrName,attrValue in attrs: if attrName not in tokens: raise ParseException(s,l,"no matching attribute " + attrName) if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % (attrName, tokens[attrName], attrValue)) return pa withAttribute.ANY_VALUE = object() def withClass(classname, namespace=''): """ Simplified version of C{L{withAttribute}} when matching on a div class - made difficult because C{class} is a reserved word in Python. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this <div> has no class
''' div,div_end = makeHTMLTags("div") div_grid = div().setParseAction(withClass("grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 """ classattr = "%s:class" % namespace if namespace else "class" return withAttribute(**{classattr : classname}) opAssoc = _Constants() opAssoc.LEFT = object() opAssoc.RIGHT = object() def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): """ Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. The generated parser will also recognize the use of parentheses to override operator precedences (see example below). Note: if you define a deep operator list, you may see performance issues when using infixNotation. See L{ParserElement.enablePackrat} for a mechanism to potentially improve your parser performance. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) Example:: # simple example of four-function arithmetic with ints and variable names integer = pyparsing_common.signed_integer varname = pyparsing_common.identifier arith_expr = infixNotation(integer | varname, [ ('-', 1, opAssoc.RIGHT), (oneOf('* /'), 2, opAssoc.LEFT), (oneOf('+ -'), 2, opAssoc.LEFT), ]) arith_expr.runTests(''' 5+3*6 (5+3)*6 -2--11 ''', fullDump=False) prints:: 5+3*6 [[5, '+', [3, '*', 6]]] (5+3)*6 [[[5, '+', 3], '*', 6]] -2--11 [[['-', 2], '-', ['-', 11]]] """ ret = Forward() lastExpr = baseExpr | ( lpar + ret + rpar ) for i,operDef in enumerate(opList): opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr if arity == 3: if opExpr is None or len(opExpr) != 2: raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") opExpr1, opExpr2 = opExpr thisExpr = Forward().setName(termName) if rightLeftAssoc == opAssoc.LEFT: if arity == 1: matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) else: matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") elif rightLeftAssoc == opAssoc.RIGHT: if arity == 1: # try to avoid LR with this extra test if not isinstance(opExpr, Optional): opExpr = Optional(opExpr) matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) else: matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") else: raise ValueError("operator must indicate right or left associativity") if pa: matchExpr.setParseAction( pa ) thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) lastExpr = thisExpr ret <<= lastExpr return ret operatorPrecedence = infixNotation """(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): """ Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - content - expression for items within the nested lists (default=C{None}) - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. Example:: data_type = oneOf("void int short long char float double") decl_data_type = Combine(data_type + Optional(Word('*'))) ident = Word(alphas+'_', alphanums+'_') number = pyparsing_common.number arg = Group(decl_data_type + ident) LPAR,RPAR = map(Suppress, "()") code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) c_function = (decl_data_type("type") + ident("name") + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + code_body("body")) c_function.ignore(cStyleComment) source_code = ''' int is_odd(int x) { return (x%2); } int dec_to_hex(char hchar) { if (hchar >= '0' && hchar <= '9') { return (ord(hchar)-ord('0')); } else { return (10+ord(hchar)-ord('A')); } } ''' for func in c_function.searchString(source_code): print("%(name)s (%(type)s) args: %(args)s" % func) prints:: is_odd (int) args: [['int', 'x']] dec_to_hex (int) args: [['char', 'hchar']] """ if opener == closer: raise ValueError("opening and closing strings cannot be the same") if content is None: if isinstance(opener,basestring) and isinstance(closer,basestring): if len(opener) == 1 and len(closer)==1: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS ).setParseAction(lambda t:t[0].strip())) else: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + ~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: raise ValueError("opening and closing arguments must be strings if no content expression is given") ret = Forward() if ignoreExpr is not None: ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) else: ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) ret.setName('nested %s%s expression' % (opener,closer)) return ret def indentedBlock(blockStatementExpr, indentStack, indent=True): """ Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=C{True}) A valid block must contain at least one C{blockStatement}. Example:: data = ''' def A(z): A1 B = 100 G = A2 A2 A3 B def BB(a,b,c): BB1 def BBA(): bba1 bba2 bba3 C D def spam(x,y): def eggs(z): pass ''' indentStack = [1] stmt = Forward() identifier = Word(alphas, alphanums) funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") func_body = indentedBlock(stmt, indentStack) funcDef = Group( funcDecl + func_body ) rvalue = Forward() funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") rvalue << (funcCall | identifier | Word(nums)) assignment = Group(identifier + "=" + rvalue) stmt << ( funcDef | assignment | identifier ) module_body = OneOrMore(stmt) parseTree = module_body.parseString(data) parseTree.pprint() prints:: [['def', 'A', ['(', 'z', ')'], ':', [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], 'B', ['def', 'BB', ['(', 'a', 'b', 'c', ')'], ':', [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], 'C', 'D', ['def', 'spam', ['(', 'x', 'y', ')'], ':', [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] """ def checkPeerIndent(s,l,t): if l >= len(s): return curCol = col(l,s) if curCol != indentStack[-1]: if curCol > indentStack[-1]: raise ParseFatalException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): curCol = col(l,s) if curCol > indentStack[-1]: indentStack.append( curCol ) else: raise ParseException(s,l,"not a subentry") def checkUnindent(s,l,t): if l >= len(s): return curCol = col(l,s) if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): raise ParseException(s,l,"not an unindent") indentStack.pop() NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') PEER = Empty().setParseAction(checkPeerIndent).setName('') UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') if indent: smExpr = Group( Optional(NL) + #~ FollowedBy(blockStatementExpr) + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) else: smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) blockStatementExpr.ignore(_bslash + LineEnd()) return smExpr.setName('indented block') alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) _htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) commonHTMLEntity = Regex('&(?P' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") def replaceHTMLEntity(t): """Helper parser action to replace common HTML entities with their special characters""" return _htmlEntityMap.get(t.entity) # it's easy to get these comment structures wrong - they're very common, so may as well make them available cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") "Comment of the form C{/* ... */}" htmlComment = Regex(r"").setName("HTML comment") "Comment of the form C{}" restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") "Comment of the form C{// ... (to end of line)}" cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") "Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" javaStyleComment = cppStyleComment "Same as C{L{cppStyleComment}}" pythonStyleComment = Regex(r"#.*").setName("Python style comment") "Comment of the form C{# ... (to end of line)}" _commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + Optional( Word(" \t") + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") """(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" # some other useful expressions - using lower-case class name since we are really using this as a namespace class pyparsing_common: """ Here are some common low-level expressions that may be useful in jump-starting parser development: - numeric forms (L{integers}, L{reals}, L{scientific notation}) - common L{programming identifiers} - network addresses (L{MAC}, L{IPv4}, L{IPv6}) - ISO8601 L{dates} and L{datetime} - L{UUID} - L{comma-separated list} Parse actions: - C{L{convertToInteger}} - C{L{convertToFloat}} - C{L{convertToDate}} - C{L{convertToDatetime}} - C{L{stripHTMLTags}} - C{L{upcaseTokens}} - C{L{downcaseTokens}} Example:: pyparsing_common.number.runTests(''' # any int or real number, returned as the appropriate type 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.fnumber.runTests(''' # any int or real number, returned as float 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.hex_integer.runTests(''' # hex numbers 100 FF ''') pyparsing_common.fraction.runTests(''' # fractions 1/2 -3/4 ''') pyparsing_common.mixed_integer.runTests(''' # mixed fractions 1 1/2 -3/4 1-3/4 ''') import uuid pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) pyparsing_common.uuid.runTests(''' # uuid 12345678-1234-5678-1234-567812345678 ''') prints:: # any int or real number, returned as the appropriate type 100 [100] -100 [-100] +100 [100] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # any int or real number, returned as float 100 [100.0] -100 [-100.0] +100 [100.0] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # hex numbers 100 [256] FF [255] # fractions 1/2 [0.5] -3/4 [-0.75] # mixed fractions 1 [1] 1/2 [0.5] -3/4 [-0.75] 1-3/4 [1.75] # uuid 12345678-1234-5678-1234-567812345678 [UUID('12345678-1234-5678-1234-567812345678')] """ convertToInteger = tokenMap(int) """ Parse action for converting parsed integers to Python int """ convertToFloat = tokenMap(float) """ Parse action for converting parsed numbers to Python float """ integer = Word(nums).setName("integer").setParseAction(convertToInteger) """expression that parses an unsigned integer, returns an int""" hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) """expression that parses a hexadecimal integer, returns an int""" signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) """expression that parses an integer with optional leading sign, returns an int""" fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") """fractional expression of an integer divided by an integer, returns a float""" fraction.addParseAction(lambda t: t[0]/t[-1]) mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" mixed_integer.addParseAction(sum) real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) """expression that parses a floating point number and returns a float""" sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) """expression that parses a floating point number with optional scientific notation and returns a float""" # streamlining this expression makes the docs nicer-looking number = (sci_real | real | signed_integer).streamline() """any numeric expression, returns the corresponding Python type""" fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) """any int or real number, returned as float""" identifier = Word(alphas+'_', alphanums+'_').setName("identifier") """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") "IPv4 address (C{0.0.0.0 - 255.255.255.255})" _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") "IPv6 address (long, short, or mixed form)" mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" @staticmethod def convertToDate(fmt="%Y-%m-%d"): """ Helper to create a parse action for converting parsed date string to Python datetime.date Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) Example:: date_expr = pyparsing_common.iso8601_date.copy() date_expr.setParseAction(pyparsing_common.convertToDate()) print(date_expr.parseString("1999-12-31")) prints:: [datetime.date(1999, 12, 31)] """ def cvt_fn(s,l,t): try: return datetime.strptime(t[0], fmt).date() except ValueError as ve: raise ParseException(s, l, str(ve)) return cvt_fn @staticmethod def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): """ Helper to create a parse action for converting parsed datetime string to Python datetime.datetime Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) Example:: dt_expr = pyparsing_common.iso8601_datetime.copy() dt_expr.setParseAction(pyparsing_common.convertToDatetime()) print(dt_expr.parseString("1999-12-31T23:59:59.999")) prints:: [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] """ def cvt_fn(s,l,t): try: return datetime.strptime(t[0], fmt) except ValueError as ve: raise ParseException(s, l, str(ve)) return cvt_fn iso8601_date = Regex(r'(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?').setName("ISO8601 date") "ISO8601 date (C{yyyy-mm-dd})" iso8601_datetime = Regex(r'(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() @staticmethod def stripHTMLTags(s, l, tokens): """ Parse action to remove HTML tags from web page HTML source Example:: # strip HTML links from normal text text = 'More info at the
pyparsing wiki page' td,td_end = makeHTMLTags("TD") table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' """ return pyparsing_common._html_stripper.transformString(tokens[0]) _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + Optional( White(" \t") ) ) ).streamline().setName("commaItem") comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) """Parse action to convert tokens to upper case.""" downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) """Parse action to convert tokens to lower case.""" if __name__ == "__main__": selectToken = CaselessLiteral("select") fromToken = CaselessLiteral("from") ident = Word(alphas, alphanums + "_$") columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) columnNameList = Group(delimitedList(columnName)).setName("columns") columnSpec = ('*' | columnNameList) tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) tableNameList = Group(delimitedList(tableName)).setName("tables") simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") # demo runTests method, including embedded comments in test string simpleSQL.runTests(""" # '*' as column list and dotted table name select * from SYS.XYZZY # caseless match on "SELECT", and casts back to "select" SELECT * from XYZZY, ABC # list of column names, and mixed case SELECT keyword Select AA,BB,CC from Sys.dual # multiple tables Select A, B, C from Sys.dual, Table2 # invalid SELECT keyword - should fail Xelect A, B, C from Sys.dual # incomplete command - should fail Select # invalid column name - should fail Select ^^^ frox Sys.dual """) pyparsing_common.number.runTests(""" 100 -100 +100 3.14159 6.02e23 1e-12 """) # any int or real number, returned as float pyparsing_common.fnumber.runTests(""" 100 -100 +100 3.14159 6.02e23 1e-12 """) pyparsing_common.hex_integer.runTests(""" 100 FF """) import uuid pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) pyparsing_common.uuid.runTests(""" 12345678-1234-5678-1234-567812345678 """) PK!XMZuu_vendor/six.pynu["""Utilities for writing code that runs on Python 2 and 3""" # Copyright (c) 2010-2015 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. from __future__ import absolute_import import functools import itertools import operator import sys import types __author__ = "Benjamin Peterson " __version__ = "1.10.0" # Useful for very coarse version differentiation. PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 PY34 = sys.version_info[0:2] >= (3, 4) if PY3: string_types = str, integer_types = int, class_types = type, text_type = str binary_type = bytes MAXSIZE = sys.maxsize else: string_types = basestring, integer_types = (int, long) class_types = (type, types.ClassType) text_type = unicode binary_type = str if sys.platform.startswith("java"): # Jython always uses 32 bits. MAXSIZE = int((1 << 31) - 1) else: # It's possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): def __len__(self): return 1 << 31 try: len(X()) except OverflowError: # 32-bit MAXSIZE = int((1 << 31) - 1) else: # 64-bit MAXSIZE = int((1 << 63) - 1) del X def _add_doc(func, doc): """Add documentation to a function.""" func.__doc__ = doc def _import_module(name): """Import module, returning the module after the last dot.""" __import__(name) return sys.modules[name] class _LazyDescr(object): def __init__(self, name): self.name = name def __get__(self, obj, tp): result = self._resolve() setattr(obj, self.name, result) # Invokes __set__. try: # This is a bit ugly, but it avoids running this again by # removing this descriptor. delattr(obj.__class__, self.name) except AttributeError: pass return result class MovedModule(_LazyDescr): def __init__(self, name, old, new=None): super(MovedModule, self).__init__(name) if PY3: if new is None: new = name self.mod = new else: self.mod = old def _resolve(self): return _import_module(self.mod) def __getattr__(self, attr): _module = self._resolve() value = getattr(_module, attr) setattr(self, attr, value) return value class _LazyModule(types.ModuleType): def __init__(self, name): super(_LazyModule, self).__init__(name) self.__doc__ = self.__class__.__doc__ def __dir__(self): attrs = ["__doc__", "__name__"] attrs += [attr.name for attr in self._moved_attributes] return attrs # Subclasses should override this _moved_attributes = [] class MovedAttribute(_LazyDescr): def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): super(MovedAttribute, self).__init__(name) if PY3: if new_mod is None: new_mod = name self.mod = new_mod if new_attr is None: if old_attr is None: new_attr = name else: new_attr = old_attr self.attr = new_attr else: self.mod = old_mod if old_attr is None: old_attr = name self.attr = old_attr def _resolve(self): module = _import_module(self.mod) return getattr(module, self.attr) class _SixMetaPathImporter(object): """ A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 """ def __init__(self, six_module_name): self.name = six_module_name self.known_modules = {} def _add_module(self, mod, *fullnames): for fullname in fullnames: self.known_modules[self.name + "." + fullname] = mod def _get_module(self, fullname): return self.known_modules[self.name + "." + fullname] def find_module(self, fullname, path=None): if fullname in self.known_modules: return self return None def __get_module(self, fullname): try: return self.known_modules[fullname] except KeyError: raise ImportError("This loader does not know module " + fullname) def load_module(self, fullname): try: # in case of a reload return sys.modules[fullname] except KeyError: pass mod = self.__get_module(fullname) if isinstance(mod, MovedModule): mod = mod._resolve() else: mod.__loader__ = self sys.modules[fullname] = mod return mod def is_package(self, fullname): """ Return true, if the named module is a package. We need this method to get correct spec objects with Python 3.4 (see PEP451) """ return hasattr(self.__get_module(fullname), "__path__") def get_code(self, fullname): """Return None Required, if is_package is implemented""" self.__get_module(fullname) # eventually raises ImportError return None get_source = get_code # same as get_code _importer = _SixMetaPathImporter(__name__) class _MovedItems(_LazyModule): """Lazy loading of moved objects""" __path__ = [] # mark as package _moved_attributes = [ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), MovedAttribute("intern", "__builtin__", "sys"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), MovedAttribute("UserDict", "UserDict", "collections"), MovedAttribute("UserList", "UserList", "collections"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), MovedModule("builtins", "__builtin__"), MovedModule("configparser", "ConfigParser"), MovedModule("copyreg", "copy_reg"), MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), MovedModule("http_cookies", "Cookie", "http.cookies"), MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), MovedModule("cPickle", "cPickle", "pickle"), MovedModule("queue", "Queue"), MovedModule("reprlib", "repr"), MovedModule("socketserver", "SocketServer"), MovedModule("_thread", "thread", "_thread"), MovedModule("tkinter", "Tkinter"), MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), MovedModule("tkinter_tix", "Tix", "tkinter.tix"), MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), MovedModule("tkinter_font", "tkFont", "tkinter.font"), MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), ] # Add windows specific modules. if sys.platform == "win32": _moved_attributes += [ MovedModule("winreg", "_winreg"), ] for attr in _moved_attributes: setattr(_MovedItems, attr.name, attr) if isinstance(attr, MovedModule): _importer._add_module(attr, "moves." + attr.name) del attr _MovedItems._moved_attributes = _moved_attributes moves = _MovedItems(__name__ + ".moves") _importer._add_module(moves, "moves") class Module_six_moves_urllib_parse(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_parse""" _urllib_parse_moved_attributes = [ MovedAttribute("ParseResult", "urlparse", "urllib.parse"), MovedAttribute("SplitResult", "urlparse", "urllib.parse"), MovedAttribute("parse_qs", "urlparse", "urllib.parse"), MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), MovedAttribute("urldefrag", "urlparse", "urllib.parse"), MovedAttribute("urljoin", "urlparse", "urllib.parse"), MovedAttribute("urlparse", "urlparse", "urllib.parse"), MovedAttribute("urlsplit", "urlparse", "urllib.parse"), MovedAttribute("urlunparse", "urlparse", "urllib.parse"), MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), MovedAttribute("quote", "urllib", "urllib.parse"), MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), MovedAttribute("uses_params", "urlparse", "urllib.parse"), MovedAttribute("uses_query", "urlparse", "urllib.parse"), MovedAttribute("uses_relative", "urlparse", "urllib.parse"), ] for attr in _urllib_parse_moved_attributes: setattr(Module_six_moves_urllib_parse, attr.name, attr) del attr Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), "moves.urllib_parse", "moves.urllib.parse") class Module_six_moves_urllib_error(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_error""" _urllib_error_moved_attributes = [ MovedAttribute("URLError", "urllib2", "urllib.error"), MovedAttribute("HTTPError", "urllib2", "urllib.error"), MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), ] for attr in _urllib_error_moved_attributes: setattr(Module_six_moves_urllib_error, attr.name, attr) del attr Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), "moves.urllib_error", "moves.urllib.error") class Module_six_moves_urllib_request(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_request""" _urllib_request_moved_attributes = [ MovedAttribute("urlopen", "urllib2", "urllib.request"), MovedAttribute("install_opener", "urllib2", "urllib.request"), MovedAttribute("build_opener", "urllib2", "urllib.request"), MovedAttribute("pathname2url", "urllib", "urllib.request"), MovedAttribute("url2pathname", "urllib", "urllib.request"), MovedAttribute("getproxies", "urllib", "urllib.request"), MovedAttribute("Request", "urllib2", "urllib.request"), MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), MovedAttribute("BaseHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), MovedAttribute("FileHandler", "urllib2", "urllib.request"), MovedAttribute("FTPHandler", "urllib2", "urllib.request"), MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), MovedAttribute("urlretrieve", "urllib", "urllib.request"), MovedAttribute("urlcleanup", "urllib", "urllib.request"), MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) del attr Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), "moves.urllib_request", "moves.urllib.request") class Module_six_moves_urllib_response(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_response""" _urllib_response_moved_attributes = [ MovedAttribute("addbase", "urllib", "urllib.response"), MovedAttribute("addclosehook", "urllib", "urllib.response"), MovedAttribute("addinfo", "urllib", "urllib.response"), MovedAttribute("addinfourl", "urllib", "urllib.response"), ] for attr in _urllib_response_moved_attributes: setattr(Module_six_moves_urllib_response, attr.name, attr) del attr Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), "moves.urllib_response", "moves.urllib.response") class Module_six_moves_urllib_robotparser(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_robotparser""" _urllib_robotparser_moved_attributes = [ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), ] for attr in _urllib_robotparser_moved_attributes: setattr(Module_six_moves_urllib_robotparser, attr.name, attr) del attr Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), "moves.urllib_robotparser", "moves.urllib.robotparser") class Module_six_moves_urllib(types.ModuleType): """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" __path__ = [] # mark as package parse = _importer._get_module("moves.urllib_parse") error = _importer._get_module("moves.urllib_error") request = _importer._get_module("moves.urllib_request") response = _importer._get_module("moves.urllib_response") robotparser = _importer._get_module("moves.urllib_robotparser") def __dir__(self): return ['parse', 'error', 'request', 'response', 'robotparser'] _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib") def add_move(move): """Add an item to six.moves.""" setattr(_MovedItems, move.name, move) def remove_move(name): """Remove item from six.moves.""" try: delattr(_MovedItems, name) except AttributeError: try: del moves.__dict__[name] except KeyError: raise AttributeError("no such move, %r" % (name,)) if PY3: _meth_func = "__func__" _meth_self = "__self__" _func_closure = "__closure__" _func_code = "__code__" _func_defaults = "__defaults__" _func_globals = "__globals__" else: _meth_func = "im_func" _meth_self = "im_self" _func_closure = "func_closure" _func_code = "func_code" _func_defaults = "func_defaults" _func_globals = "func_globals" try: advance_iterator = next except NameError: def advance_iterator(it): return it.next() next = advance_iterator try: callable = callable except NameError: def callable(obj): return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) if PY3: def get_unbound_function(unbound): return unbound create_bound_method = types.MethodType def create_unbound_method(func, cls): return func Iterator = object else: def get_unbound_function(unbound): return unbound.im_func def create_bound_method(func, obj): return types.MethodType(func, obj, obj.__class__) def create_unbound_method(func, cls): return types.MethodType(func, None, cls) class Iterator(object): def next(self): return type(self).__next__(self) callable = callable _add_doc(get_unbound_function, """Get the function out of a possibly unbound function""") get_method_function = operator.attrgetter(_meth_func) get_method_self = operator.attrgetter(_meth_self) get_function_closure = operator.attrgetter(_func_closure) get_function_code = operator.attrgetter(_func_code) get_function_defaults = operator.attrgetter(_func_defaults) get_function_globals = operator.attrgetter(_func_globals) if PY3: def iterkeys(d, **kw): return iter(d.keys(**kw)) def itervalues(d, **kw): return iter(d.values(**kw)) def iteritems(d, **kw): return iter(d.items(**kw)) def iterlists(d, **kw): return iter(d.lists(**kw)) viewkeys = operator.methodcaller("keys") viewvalues = operator.methodcaller("values") viewitems = operator.methodcaller("items") else: def iterkeys(d, **kw): return d.iterkeys(**kw) def itervalues(d, **kw): return d.itervalues(**kw) def iteritems(d, **kw): return d.iteritems(**kw) def iterlists(d, **kw): return d.iterlists(**kw) viewkeys = operator.methodcaller("viewkeys") viewvalues = operator.methodcaller("viewvalues") viewitems = operator.methodcaller("viewitems") _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") _add_doc(itervalues, "Return an iterator over the values of a dictionary.") _add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.") _add_doc(iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary.") if PY3: def b(s): return s.encode("latin-1") def u(s): return s unichr = chr import struct int2byte = struct.Struct(">B").pack del struct byte2int = operator.itemgetter(0) indexbytes = operator.getitem iterbytes = iter import io StringIO = io.StringIO BytesIO = io.BytesIO _assertCountEqual = "assertCountEqual" if sys.version_info[1] <= 1: _assertRaisesRegex = "assertRaisesRegexp" _assertRegex = "assertRegexpMatches" else: _assertRaisesRegex = "assertRaisesRegex" _assertRegex = "assertRegex" else: def b(s): return s # Workaround for standalone backslash def u(s): return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") unichr = unichr int2byte = chr def byte2int(bs): return ord(bs[0]) def indexbytes(buf, i): return ord(buf[i]) iterbytes = functools.partial(itertools.imap, ord) import StringIO StringIO = BytesIO = StringIO.StringIO _assertCountEqual = "assertItemsEqual" _assertRaisesRegex = "assertRaisesRegexp" _assertRegex = "assertRegexpMatches" _add_doc(b, """Byte literal""") _add_doc(u, """Text literal""") def assertCountEqual(self, *args, **kwargs): return getattr(self, _assertCountEqual)(*args, **kwargs) def assertRaisesRegex(self, *args, **kwargs): return getattr(self, _assertRaisesRegex)(*args, **kwargs) def assertRegex(self, *args, **kwargs): return getattr(self, _assertRegex)(*args, **kwargs) if PY3: exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): if value is None: value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value else: def exec_(_code_, _globs_=None, _locs_=None): """Execute code in a namespace.""" if _globs_ is None: frame = sys._getframe(1) _globs_ = frame.f_globals if _locs_ is None: _locs_ = frame.f_locals del frame elif _locs_ is None: _locs_ = _globs_ exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): raise tp, value, tb """) if sys.version_info[:2] == (3, 2): exec_("""def raise_from(value, from_value): if from_value is None: raise value raise value from from_value """) elif sys.version_info[:2] > (3, 2): exec_("""def raise_from(value, from_value): raise value from from_value """) else: def raise_from(value, from_value): raise value print_ = getattr(moves.builtins, "print", None) if print_ is None: def print_(*args, **kwargs): """The new-style print function for Python 2.4 and 2.5.""" fp = kwargs.pop("file", sys.stdout) if fp is None: return def write(data): if not isinstance(data, basestring): data = str(data) # If the file has an encoding, encode unicode with it. if (isinstance(fp, file) and isinstance(data, unicode) and fp.encoding is not None): errors = getattr(fp, "errors", None) if errors is None: errors = "strict" data = data.encode(fp.encoding, errors) fp.write(data) want_unicode = False sep = kwargs.pop("sep", None) if sep is not None: if isinstance(sep, unicode): want_unicode = True elif not isinstance(sep, str): raise TypeError("sep must be None or a string") end = kwargs.pop("end", None) if end is not None: if isinstance(end, unicode): want_unicode = True elif not isinstance(end, str): raise TypeError("end must be None or a string") if kwargs: raise TypeError("invalid keyword arguments to print()") if not want_unicode: for arg in args: if isinstance(arg, unicode): want_unicode = True break if want_unicode: newline = unicode("\n") space = unicode(" ") else: newline = "\n" space = " " if sep is None: sep = space if end is None: end = newline for i, arg in enumerate(args): if i: write(sep) write(arg) write(end) if sys.version_info[:2] < (3, 3): _print = print_ def print_(*args, **kwargs): fp = kwargs.get("file", sys.stdout) flush = kwargs.pop("flush", False) _print(*args, **kwargs) if flush and fp is not None: fp.flush() _add_doc(reraise, """Reraise an exception.""") if sys.version_info[0:2] < (3, 4): def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES): def wrapper(f): f = functools.wraps(wrapped, assigned, updated)(f) f.__wrapped__ = wrapped return f return wrapper else: wraps = functools.wraps def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. class metaclass(meta): def __new__(cls, name, this_bases, d): return meta(name, bases, d) return type.__new__(metaclass, 'temporary_class', (), {}) def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): slots = [slots] for slots_var in slots: orig_vars.pop(slots_var) orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper def python_2_unicode_compatible(klass): """ A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. """ if PY2: if '__str__' not in klass.__dict__: raise ValueError("@python_2_unicode_compatible cannot be applied " "to %s because it doesn't define __str__()." % klass.__name__) klass.__unicode__ = klass.__str__ klass.__str__ = lambda self: self.__unicode__().encode('utf-8') return klass # Complete the moves implementation. # This code is at the end of this module to speed up module loading. # Turn this module into a package. __path__ = [] # required for PEP 302 and PEP 451 __package__ = __name__ # see PEP 366 @ReservedAssignment if globals().get("__spec__") is not None: __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable # Remove other six meta path importers, since they cause problems. This can # happen if six is removed from sys.modules and then reloaded. (Setuptools does # this for some reason.) if sys.meta_path: for i, importer in enumerate(sys.meta_path): # Here's some real nastiness: Another "instance" of the six module might # be floating around. Therefore, we can't use isinstance() to check for # the six meta path importer, since the other six instance will have # inserted an importer with different class. if (type(importer).__name__ == "_SixMetaPathImporter" and importer.name == __name__): del sys.meta_path[i] break del i, importer # Finally, add the importer to the meta path import hook. sys.meta_path.append(_importer) PK!bD D -command/__pycache__/build_clib.cpython-36.pycnu[3 9f@sFddljjZddlmZddlmZddlm Z GdddejZdS)N)DistutilsSetupError)log)newer_pairwise_groupc@seZdZdZddZdS) build_clibav Override the default build_clib behaviour to do the following: 1. Implement a rudimentary timestamp-based dependency system so 'compile()' doesn't run every time. 2. Add more keys to the 'build_info' dictionary: * obj_deps - specify dependencies for each object compiled. this should be a dictionary mapping a key with the source filename to a list of dependencies. Use an empty string for global dependencies. * cflags - specify a list of additional flags to pass to the compiler. c Cs~xv|D]l\}}|jd}|dks4t|ttf r@td|t|}tjd||jdt}t|tsxtd|g}|jdt}t|ttfstd|xX|D]P}|g} | j||j|t} t| ttfstd|| j| |j | qW|j j ||j d} t || ggfkr^|jd} |jd } |jd }|j j||j | | ||jd }|j j| ||j|jd qWdS) Nsourceszfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenameszbuilding '%s' libraryobj_depsz\in 'libraries' option (library '%s'), 'obj_deps' must be a dictionary of type 'source: list') output_dirmacros include_dirscflags)r r r Zextra_postargsdebug)r r )get isinstancelisttuplerrinfodictextendappendZcompilerZobject_filenamesZ build_temprcompiler Zcreate_static_libr)selfZ librariesZlib_nameZ build_inforrZ dependenciesZ global_depssourceZsrc_depsZ extra_depsZexpected_objectsr r r Zobjectsr /usr/lib/python3.6/build_clib.pybuild_librariess`           zbuild_clib.build_librariesN)__name__ __module__ __qualname____doc__rrrrrrsr) Zdistutils.command.build_clibZcommandrZorigZdistutils.errorsrZ distutilsrZsetuptools.dep_utilrrrrrs    PK!Ʃ&&2command/__pycache__/build_ext.cpython-36.opt-1.pycnu[3 9fu3@sddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZed Wnek reZYnXe d dd l mZd dZdZdZdZej dkrdZn>ej!dkr,yddl"Z"e#e"dZZWnek r*YnXddZ$ddZ%GdddeZes^ej!dkrjd!ddZ&ndZd"ddZ&dd Z'dS)#N) build_ext) copy_file) new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)sixzCython.Compiler.MainLDSHARED) _config_varsc CsZtjdkrNtj}z$dtd<dtd<dtd<t|Wdtjtj|Xnt|dS)Ndarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr z -dynamiclibCCSHAREDz.dylibSO)sysplatform _CONFIG_VARScopyrclearupdate)compilerZtmpr/usr/lib/python3.6/build_ext.py_customize_compiler_for_shlibs  rFZsharedr TntRTLD_NOWcCs tr|SdS)N) have_rtld)srrr>srcCs>x8ddtjDD]"\}}}d|kr*|S|dkr|SqWdS)z;Return the file extension for an abi3-compliant Extension()css |]}|dtjkr|VqdS)N)impZ C_EXTENSION).0rrrr Csz"get_abi3_suffix..z.abi3z.pydN)r!Z get_suffixes)suffix_rrrget_abi3_suffixAs r&c@sveZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdddZdS)rcCs.|jd}|_tj|||_|r*|jdS)z;Build extensions in build directory, then copy if --inplacerN)Zinplace _build_extruncopy_extensions_to_source)selfZ old_inplacerrrr(Ks  z build_ext.runc Cs|jd}x|jD]}|j|j}|j|}|jd}dj|dd}|j|}tj j|tj j |}tj j|j |} t | ||j |jd|jr|j|ptj|dqWdS)Nbuild_py.)verbosedry_runT)get_finalized_command extensionsget_ext_fullnamenameget_ext_filenamesplitjoinZget_package_dirospathbasename build_librr.r/ _needs_stub write_stubcurdir) r*r+extfullnamefilenameZmodpathpackageZ package_dirZ dest_filenameZ src_filenamerrrr)Ss       z#build_ext.copy_extensions_to_sourcecCstj||}||jkr|j|}tjo4t|do4t}|r^td}|dt| }|t}t |t rt j j |\}}|jj|tStr|jrt j j|\}}t j j|d|S|S)NZpy_limited_api EXT_SUFFIXzdl-)r'r5ext_mapr ZPY3getattrr&_get_config_var_837len isinstancer r8r9splitextshlib_compilerlibrary_filenamelibtype use_stubs_links_to_dynamicr6r7)r*r@rAr?Zuse_abi3Zso_extfndrrrr5is"       zbuild_ext.get_ext_filenamecCs tj|d|_g|_i|_dS)N)r'initialize_optionsrJshlibsrD)r*rrrrQ~s zbuild_ext.initialize_optionscCs2tj||jpg|_|j|jdd|jD|_|jrB|jx|jD]}|j|j|_qJWx|jD]}|j}||j |<||j |j dd<|jr|j |pd}|ot ot |t }||_||_|j|}|_tjjtjj|j|}|o||jkr|jj||rht rhtj|jkrh|jjtjqhWdS)NcSsg|]}t|tr|qSr)rHr )r"r?rrr sz.build_ext.finalize_options..r,r-Fr0)r'finalize_optionsr2Zcheck_extensions_listrRsetup_shlib_compilerr3r4 _full_namerDr6links_to_dynamicrMrHr rNr<r5 _file_namer8r9dirnamer7r; library_dirsappendr>runtime_library_dirs)r*r?r@ZltdnsrAZlibdirrrrrTs,       zbuild_ext.finalize_optionscCst|j|j|jd}|_t||jdk r8|j|j|jdk rbx|jD]\}}|j ||qJW|j dk rx|j D]}|j |qtW|j dk r|j |j |jdk r|j|j|jdk r|j|j|jdk r|j|jtj||_dS)N)rr/force)rrr/r^rJrZ include_dirsZset_include_dirsZdefineZ define_macroZundefZundefine_macro librariesZ set_librariesrZZset_library_dirsZrpathZset_runtime_library_dirsZ link_objectsZset_link_objectslink_shared_object__get__)r*rr4valueZmacrorrrrUs(             zbuild_ext.setup_shlib_compilercCst|tr|jStj||S)N)rHr export_symbolsr'get_export_symbols)r*r?rrrrds zbuild_ext.get_export_symbolsc Cs\|j|j}z@t|tr"|j|_tj|||jrL|jdj }|j ||Wd||_XdS)Nr+) Z_convert_pyx_sources_to_langrrHr rJr'build_extensionr<r1r;r=)r*r?Z _compilercmdrrrres   zbuild_ext.build_extensioncsPtjdd|jDdj|jjddd dgtfdd|jDS) z?Return true if 'ext' links to a dynamic lib in the same packagecSsg|] }|jqSr)rV)r"librrrrSsz.build_ext.links_to_dynamic..r,Nr-rc3s|]}|kVqdS)Nr)r"Zlibname)libnamespkgrrr#sz-build_ext.links_to_dynamic..r0)dictfromkeysrRr7rVr6anyr_)r*r?r)rhrirrWs zbuild_ext.links_to_dynamiccCstj||jS)N)r' get_outputs_build_ext__get_stubs_outputs)r*rrrrmszbuild_ext.get_outputscs6fddjD}tj|j}tdd|DS)Nc3s0|](}|jrtjjjf|jjdVqdS)r,N)r<r8r9r7r;rVr6)r"r?)r*rrr#sz0build_ext.__get_stubs_outputs..css|]\}}||VqdS)Nr)r"baseZfnextrrrr#s)r2 itertoolsproduct!_build_ext__get_output_extensionslist)r*Z ns_ext_basesZpairsr)r*rZ__get_stubs_outputss  zbuild_ext.__get_stubs_outputsccs"dVdV|jdjrdVdS)Nz.pyz.pycr+z.pyo)r1optimize)r*rrrZ__get_output_extensionss z!build_ext.__get_output_extensionsFcCs.tjd|j|tjj|f|jjdd}|rJtjj|rJt|d|j st |d}|j djddd t d d tjj |jd d dt ddddt dddt ddddg|j|r*ddlm}||gdd|j d|jdj}|dkr||g|d|j dtjj|r*|j r*tj|dS)Nz writing stub loader for %s to %sr,z.pyz already exists! Please delete.w zdef __bootstrap__():z- global __bootstrap__, __file__, __loader__z% import sys, os, pkg_resources, impz, dlz: __file__ = pkg_resources.resource_filename(__name__,%r)z del __bootstrap__z if '__loader__' in globals():z del __loader__z# old_flags = sys.getdlopenflags()z old_dir = os.getcwd()z try:z( os.chdir(os.path.dirname(__file__))z$ sys.setdlopenflags(dl.RTLD_NOW)z( imp.load_dynamic(__name__,__file__)z finally:z" sys.setdlopenflags(old_flags)z os.chdir(old_dir)z__bootstrap__()rr) byte_compileT)rtr^r/Z install_lib)rinforVr8r9r7r6existsrr/openwriteif_dlr:rXcloseZdistutils.utilrwr1rtunlink)r* output_dirr?compileZ stub_filefrwrtrrrr=sP          zbuild_ext.write_stubN)F)__name__ __module__ __qualname__r(r)r5rQrTrUrdrerWrmrnrrr=rrrrrJs   rc Cs(|j|j||||||||| | | | dS)N)linkZSHARED_LIBRARY) r*objectsoutput_libnamerr_rZr\rcdebug extra_preargsextra_postargs build_temp target_langrrrr`s r`Zstaticc CsRtjj|\}} tjj| \}}|jdjdr<|dd}|j||||| dS)Nxrg)r8r9r6rIrK startswithZcreate_static_lib)r*rrrr_rZr\rcrrrrrrAr:r?rrrr`,s  cCstjdkrd}t|S)z In https://github.com/pypa/setuptools/pull/837, we discovered Python 3.3.0 exposes the extension suffix under the name 'SO'. rr-r)rrr-)r version_infor)r4rrrrFDs rF) NNNNNrNNNN) NNNNNrNNNN)(r8rrpr!Zdistutils.command.build_extrZ _du_build_extZdistutils.file_utilrZdistutils.ccompilerrZdistutils.sysconfigrrZdistutils.errorsrZ distutilsrZsetuptools.extensionr Zsetuptools.externr ZCython.Distutils.build_extr' __import__ ImportErrorr rrrrMrLrr4Zdlhasattrr|r&r`rFrrrrsZ              Q  PK!$&&,command/__pycache__/build_ext.cpython-36.pycnu[3 9fu3@sddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZed Wnek reZYnXe d dd l mZd dZdZdZdZej dkrdZn>ej!dkr,yddl"Z"e#e"dZZWnek r*YnXddZ$ddZ%GdddeZes^ej!dkrjd!ddZ&ndZd"ddZ&dd Z'dS)#N) build_ext) copy_file) new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)sixzCython.Compiler.MainLDSHARED) _config_varsc CsZtjdkrNtj}z$dtd<dtd<dtd<t|Wdtjtj|Xnt|dS)Ndarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr z -dynamiclibCCSHAREDz.dylibSO)sysplatform _CONFIG_VARScopyrclearupdate)compilerZtmpr/usr/lib/python3.6/build_ext.py_customize_compiler_for_shlibs  rFZsharedr TntRTLD_NOWcCs tr|SdS)N) have_rtld)srrr>srcCs>x8ddtjDD]"\}}}d|kr*|S|dkr|SqWdS)z;Return the file extension for an abi3-compliant Extension()css |]}|dtjkr|VqdS)N)impZ C_EXTENSION).0rrrr Csz"get_abi3_suffix..z.abi3z.pydN)r!Z get_suffixes)suffix_rrrget_abi3_suffixAs r&c@sveZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdddZdS)rcCs.|jd}|_tj|||_|r*|jdS)z;Build extensions in build directory, then copy if --inplacerN)Zinplace _build_extruncopy_extensions_to_source)selfZ old_inplacerrrr(Ks  z build_ext.runc Cs|jd}x|jD]}|j|j}|j|}|jd}dj|dd}|j|}tj j|tj j |}tj j|j |} t | ||j |jd|jr|j|ptj|dqWdS)Nbuild_py.)verbosedry_runT)get_finalized_command extensionsget_ext_fullnamenameget_ext_filenamesplitjoinZget_package_dirospathbasename build_librr.r/ _needs_stub write_stubcurdir) r*r+extfullnamefilenameZmodpathpackageZ package_dirZ dest_filenameZ src_filenamerrrr)Ss       z#build_ext.copy_extensions_to_sourcecCstj||}||jkr|j|}tjo4t|do4t}|r^td}|dt| }|t}t |t rt j j |\}}|jj|tStr|jrt j j|\}}t j j|d|S|S)NZpy_limited_api EXT_SUFFIXzdl-)r'r5ext_mapr ZPY3getattrr&_get_config_var_837len isinstancer r8r9splitextshlib_compilerlibrary_filenamelibtype use_stubs_links_to_dynamicr6r7)r*r@rAr?Zuse_abi3Zso_extfndrrrr5is"       zbuild_ext.get_ext_filenamecCs tj|d|_g|_i|_dS)N)r'initialize_optionsrJshlibsrD)r*rrrrQ~s zbuild_ext.initialize_optionscCs2tj||jpg|_|j|jdd|jD|_|jrB|jx|jD]}|j|j|_qJWx|jD]}|j}||j |<||j |j dd<|jr|j |pd}|ot ot |t }||_||_|j|}|_tjjtjj|j|}|o||jkr|jj||rht rhtj|jkrh|jjtjqhWdS)NcSsg|]}t|tr|qSr)rHr )r"r?rrr sz.build_ext.finalize_options..r,r-Fr0)r'finalize_optionsr2Zcheck_extensions_listrRsetup_shlib_compilerr3r4 _full_namerDr6links_to_dynamicrMrHr rNr<r5 _file_namer8r9dirnamer7r; library_dirsappendr>runtime_library_dirs)r*r?r@ZltdnsrAZlibdirrrrrTs,       zbuild_ext.finalize_optionscCst|j|j|jd}|_t||jdk r8|j|j|jdk rbx|jD]\}}|j ||qJW|j dk rx|j D]}|j |qtW|j dk r|j |j |jdk r|j|j|jdk r|j|j|jdk r|j|jtj||_dS)N)rr/force)rrr/r^rJrZ include_dirsZset_include_dirsZdefineZ define_macroZundefZundefine_macro librariesZ set_librariesrZZset_library_dirsZrpathZset_runtime_library_dirsZ link_objectsZset_link_objectslink_shared_object__get__)r*rr4valueZmacrorrrrUs(             zbuild_ext.setup_shlib_compilercCst|tr|jStj||S)N)rHr export_symbolsr'get_export_symbols)r*r?rrrrds zbuild_ext.get_export_symbolsc Cs\|j|j}z@t|tr"|j|_tj|||jrL|jdj }|j ||Wd||_XdS)Nr+) Z_convert_pyx_sources_to_langrrHr rJr'build_extensionr<r1r;r=)r*r?Z _compilercmdrrrres   zbuild_ext.build_extensioncsPtjdd|jDdj|jjddd dgtfdd|jDS) z?Return true if 'ext' links to a dynamic lib in the same packagecSsg|] }|jqSr)rV)r"librrrrSsz.build_ext.links_to_dynamic..r,Nr-rc3s|]}|kVqdS)Nr)r"Zlibname)libnamespkgrrr#sz-build_ext.links_to_dynamic..r0)dictfromkeysrRr7rVr6anyr_)r*r?r)rhrirrWs zbuild_ext.links_to_dynamiccCstj||jS)N)r' get_outputs_build_ext__get_stubs_outputs)r*rrrrmszbuild_ext.get_outputscs6fddjD}tj|j}tdd|DS)Nc3s0|](}|jrtjjjf|jjdVqdS)r,N)r<r8r9r7r;rVr6)r"r?)r*rrr#sz0build_ext.__get_stubs_outputs..css|]\}}||VqdS)Nr)r"baseZfnextrrrr#s)r2 itertoolsproduct!_build_ext__get_output_extensionslist)r*Z ns_ext_basesZpairsr)r*rZ__get_stubs_outputss  zbuild_ext.__get_stubs_outputsccs"dVdV|jdjrdVdS)Nz.pyz.pycr+z.pyo)r1optimize)r*rrrZ__get_output_extensionss z!build_ext.__get_output_extensionsFcCs.tjd|j|tjj|f|jjdd}|rJtjj|rJt|d|j st |d}|j djddd t d d tjj |jd d dt ddddt dddt ddddg|j|r*ddlm}||gdd|j d|jdj}|dkr||g|d|j dtjj|r*|j r*tj|dS)Nz writing stub loader for %s to %sr,z.pyz already exists! Please delete.w zdef __bootstrap__():z- global __bootstrap__, __file__, __loader__z% import sys, os, pkg_resources, impz, dlz: __file__ = pkg_resources.resource_filename(__name__,%r)z del __bootstrap__z if '__loader__' in globals():z del __loader__z# old_flags = sys.getdlopenflags()z old_dir = os.getcwd()z try:z( os.chdir(os.path.dirname(__file__))z$ sys.setdlopenflags(dl.RTLD_NOW)z( imp.load_dynamic(__name__,__file__)z finally:z" sys.setdlopenflags(old_flags)z os.chdir(old_dir)z__bootstrap__()rr) byte_compileT)rtr^r/Z install_lib)rinforVr8r9r7r6existsrr/openwriteif_dlr:rXcloseZdistutils.utilrwr1rtunlink)r* output_dirr?compileZ stub_filefrwrtrrrr=sP          zbuild_ext.write_stubN)F)__name__ __module__ __qualname__r(r)r5rQrTrUrdrerWrmrnrrr=rrrrrJs   rc Cs(|j|j||||||||| | | | dS)N)linkZSHARED_LIBRARY) r*objectsoutput_libnamerr_rZr\rcdebug extra_preargsextra_postargs build_temp target_langrrrr`s r`Zstaticc Cs^|dks ttjj|\}} tjj| \}}|jdjdrH|dd}|j||||| dS)Nxrg)AssertionErrorr8r9r6rIrK startswithZcreate_static_lib)r*rrrr_rZr\rcrrrrrrAr:r?rrrr`,s  cCstjdkrd}t|S)z In https://github.com/pypa/setuptools/pull/837, we discovered Python 3.3.0 exposes the extension suffix under the name 'SO'. rr-r)rrr-)r version_infor)r4rrrrFDs rF) NNNNNrNNNN) NNNNNrNNNN)(r8rrpr!Zdistutils.command.build_extrZ _du_build_extZdistutils.file_utilrZdistutils.ccompilerrZdistutils.sysconfigrrZdistutils.errorsrZ distutilsrZsetuptools.extensionr Zsetuptools.externr ZCython.Distutils.build_extr' __import__ ImportErrorr rrrrMrLrr4Zdlhasattrr|r&r`rFrrrrsZ              Q  PK!ю0!0!+command/__pycache__/build_py.cpython-36.pycnu[3 9f|% @sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZyddlmZWn"ek rGdddZYnXGd d d ejeZdd d Zd dZdS))glob) convert_pathN)six)mapfilter filterfalse) Mixin2to3c@seZdZdddZdS)rTcCsdS)z do nothingN)selffilesZdoctestsr r /usr/lib/python3.6/build_py.pyrun_2to3szMixin2to3.run_2to3N)T)__name__ __module__ __qualname__r r r r r rsrc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZeddZd S)!build_pyaXEnhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. See 'setuptools.dist.Distribution' for more details. Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. cCsFtjj||jj|_|jjp i|_d|jkr6|jd=g|_g|_dS)N data_files) origrfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_files_build_py__doctests_2to3)r r r r r!s   zbuild_py.finalize_optionscCs||j r|j rdS|jr"|j|jr8|j|j|j|jd|j|jd|j|jd|jt j j |dddS)z?Build modules, packages, and copy data files to build directoryNFTr)Zinclude_bytecode) Z py_modulespackagesZ build_modulesZbuild_packagesbuild_package_datar rrZ byte_compilerrZ get_outputs)r r r r run+sz build_py.runcCs&|dkr|j|_|jStjj||S)zlazily compute data filesr)_get_data_filesrrr __getattr__)r attrr r r r?s zbuild_py.__getattr__cCsJtjrt|tjr|jd}tjj||||\}}|rB|jj |||fS)N.) rZPY2 isinstanceZ string_typessplitrr build_modulerappend)r moduleZ module_filepackageZoutfilecopiedr r r r$Fs    zbuild_py.build_modulecCs|jtt|j|jpfS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)analyze_manifestlistr_get_pkg_data_filesr)r r r r rPszbuild_py._get_data_filescsJ|j|tjj|jg|jd}fdd|j|D}|||fS)Nr!csg|]}tjj|qSr )ospathrelpath).0file)src_dirr r ^sz0build_py._get_pkg_data_files..)get_package_dirr,r-joinZ build_libr#find_data_files)r r' build_dir filenamesr )r1r r+Us   zbuild_py._get_pkg_data_filescCsX|j|j||}tt|}tjj|}ttj j |}tj|j j |g|}|j |||S)z6Return filenames for package's data files in 'src_dir')_get_platform_patternsrrr itertoolschain from_iterablerr,r-isfilemanifest_filesgetexclude_data_files)r r'r1patternsZglobs_expandedZ globs_matchesZ glob_filesr r r r r5cs   zbuild_py.find_data_filesc Csx|jD]\}}}}xr|D]j}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r||jj kr|j j |qWqWdS)z$Copy data files into build directoryN) rr,r-r4ZmkpathdirnameZ copy_fileabspathrZconvert_2to3_doctestsrr%) r r'r1r6r7filenametargetZsrcfileZoutfr(r r r rts   zbuild_py.build_package_datac Csi|_}|jjsdSi}x$|jp$fD]}||t|j|<q&W|jd|jd}x|jj D]}t j j t|\}}d}|} x:|r||kr||kr|}t j j |\}} t j j | |}qW||kr^|jdr|| krq^|j||gj|q^WdS)NZegg_infoz.py)r=rZinclude_package_datarassert_relativer3Z run_commandZget_finalized_commandZfilelistr r,r-r#r4endswith setdefaultr%) r ZmfZsrc_dirsr'Zei_cmdr-dfprevZoldfZdfr r r r)s(   zbuild_py.analyze_manifestcCsdS)Nr )r r r r get_data_filesszbuild_py.get_data_filescCsy |j|Stk rYnXtjj|||}||j|<| sJ|jj rN|Sx,|jjD]}||ksr|j|drXPqXW|Stj |d}|j }WdQRXd|krt j j d|f|S)z8Check namespace packages' __init__ for declare_namespacer!rbNsdeclare_namespacezNamespace package problem: %s is a namespace package, but its __init__.py does not call declare_namespace()! Please fix it. (See the setuptools manual under "Namespace Packages" for details.) ")packages_checkedKeyErrorrr check_packagerZnamespace_packages startswithioopenread distutilserrorsZDistutilsError)r r'Z package_dirZinit_pyZpkgrIcontentsr r r rOs&   zbuild_py.check_packagecCsi|_tjj|dS)N)rMrrinitialize_options)r r r r rWszbuild_py.initialize_optionscCs0tjj||}|jjdk r,tjj|jj|S|S)N)rrr3rZsrc_rootr,r-r4)r r'resr r r r3s zbuild_py.get_package_dircs\t|j|j||}fdd|D}tjj|}t|fddD}tt|S)z6Filter filenames for package's data files in 'src_dir'c3s|]}tj|VqdS)N)fnmatchr)r/pattern)r r r sz.build_py.exclude_data_files..c3s|]}|kr|VqdS)Nr )r/fn)badr r r[s)r*r8rr9r:r;set_unique_everseen)r r'r1r r@Z match_groupsZmatchesZkeepersr )r]r r r?s   zbuild_py.exclude_data_filescs.tj|jdg|j|g}fdd|DS)z yield platform-specific path patterns (suitable for glob or fn_match) from a glob-based spec (such as self.package_data or self.exclude_package_data) matching package in src_dir. c3s |]}tjjt|VqdS)N)r,r-r4r)r/rZ)r1r r r[sz2build_py._get_platform_patterns..)r9r:r>)specr'r1Z raw_patternsr )r1r r8s   zbuild_py._get_platform_patternsN)rrr__doc__rrrr$rr+r5rr)rKrOrWr3r? staticmethodr8r r r r rs    rccsjt}|j}|dkr:xPt|j|D]}|||Vq"Wn,x*|D]"}||}||kr@|||Vq@WdS)zHList unique elements, preserving order. Remember all elements ever seen.N)r^addr __contains__)iterablekeyseenZseen_addelementkr r r r_s  r_cCs:tjj|s|Sddlm}tjdj|}||dS)Nr)DistutilsSetupErrorz Error: setup script specifies an absolute path: %s setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. )r,r-isabsdistutils.errorsrktextwrapdedentlstrip)r-rkmsgr r r rEs   rE)N)rZdistutils.utilrZdistutils.command.build_pyZcommandrrr,rYrnrQrmrTr9Zsetuptools.externrZsetuptools.extern.six.movesrrrZsetuptools.lib2to3_exr ImportErrorr_rEr r r r s$    Y PK!1 >n0command/__pycache__/develop.cpython-36.opt-1.pycnu[3 9fn@sddlmZddlmZddlmZmZddlZddlZddl Z ddl m Z ddl m Z mZmZddlmZddlmZddlZGd d d ejeZGd d d eZdS) ) convert_path)log)DistutilsErrorDistutilsOptionErrorN)six) Distribution PathMetadatanormalize_path) easy_install) namespacesc@sveZdZdZdZejddgZejdgZd Zd d Z d d Z ddZ e ddZ ddZddZddZddZdS)developzSet up package for developmentz%install package in 'development mode' uninstalluUninstall this source package egg-path=N-Set the path to be used in the .egg-link fileFcCs2|jrd|_|j|jn|j|jdS)NT)r Z multi_versionuninstall_linkZuninstall_namespacesinstall_for_developmentZwarn_deprecated_options)selfr/usr/lib/python3.6/develop.pyruns  z develop.runcCs&d|_d|_tj|d|_d|_dS)N.)r egg_pathr initialize_options setup_pathZalways_copy_from)rrrrr's  zdevelop.initialize_optionscCs|jd}|jr,d}|j|jf}t|||jg|_tj||j|j |j j t j d|jd}t jj|j||_|j|_|jdkrt jj|j|_t|j}tt jj|j|j}||krtd|t|t|t jj|j|jd|_|j|j|j|j|_dS)Negg_infoz-Please rename %r to %r before using 'develop'z*.eggz .egg-linkzA--egg-path must be a relative path from the install directory to ) project_name)get_finalized_commandZbroken_egg_inforrZegg_nameargsr finalize_optionsZexpand_basedirsZ expand_dirsZ package_indexscanglobospathjoin install_diregg_linkegg_baserabspathr rrrdist_resolve_setup_pathr)rZeitemplaterZ egg_link_fntargetrrrrr .s<           zdevelop.finalize_optionscCsh|jtjdjd}|tjkr0d|jdd}ttjj|||}|ttjkrdt d|ttj|S)z Generate a path from egg_base back to '.' where the setup script resides and ensure that path points to the setup path from $install_dir/$egg_path. /z../zGCan't get a consistent path to setup script from installation directory) replacer#seprstripcurdircountr r$r%r)r(r&rZ path_to_setupZresolvedrrrr+Xs zdevelop._resolve_setup_pathc CsDtjrt|jddr|jddd|jd|jd}t|j}|jd|d|jd|jddd|jd|jd}||_ ||j _ t ||j |j _n"|jd|jdd d|jd|jtjr|jtjdt_|jtjd |j|j|js,t|jd }|j|j d |jWdQRX|jd|j |j dS) NZuse_2to3FZbuild_pyr)Zinplacer)r(Z build_extr/zCreating %s (link to %s)w )rZPY3getattr distributionZreinitialize_commandZ run_commandrr Z build_librr*locationrrZ _providerZinstall_site_py setuptoolsZbootstrap_install_fromr Zinstall_namespacesrinfor'r(dry_runopenwriterZprocess_distributionZno_deps)rZbpy_cmdZ build_pathZei_cmdfrrrrks4          zdevelop.install_for_developmentcCstjj|jrztjd|j|jt|j}dd|D}|j||j g|j |j gfkrhtj d|dS|j sztj |j|j s|j|j|jjrtj ddS)NzRemoving %s (link to %s)cSsg|] }|jqSr)r2).0linerrr sz*develop.uninstall_link..z$Link points to %s: uninstall abortedz5Note: you must uninstall or replace scripts manually!)r#r$existsr'rr;r(r=closerrwarnr<unlinkZ update_pthr*r8scripts)rZ egg_link_filecontentsrrrrs    zdevelop.uninstall_linkc Cs||jk rtj||S|j|x^|jjp,gD]N}tjjt |}tjj |}t j |}|j }WdQRX|j||||q.WdS)N)r*r install_egg_scriptsinstall_wrapper_scriptsr8rGr#r$r)rbasenameior=readZinstall_script)rr*Z script_nameZ script_pathZstrmZ script_textrrrrIs     zdevelop.install_egg_scriptscCst|}tj||S)N)VersionlessRequirementr rJ)rr*rrrrJszdevelop.install_wrapper_scripts)r rr)rNr)__name__ __module__ __qualname____doc__ descriptionr Z user_optionsZboolean_optionsZcommand_consumes_argumentsrrr staticmethodr+rrrIrJrrrrr s  * /r c@s(eZdZdZddZddZddZdS) rNaz Adapt a pkg_resources.Distribution to simply return the project name as the 'requirement' so that scripts will work across multiple versions. >>> dist = Distribution(project_name='foo', version='1.0') >>> str(dist.as_requirement()) 'foo==1.0' >>> adapted_dist = VersionlessRequirement(dist) >>> str(adapted_dist.as_requirement()) 'foo' cCs ||_dS)N)_VersionlessRequirement__dist)rr*rrr__init__szVersionlessRequirement.__init__cCs t|j|S)N)r7rU)rnamerrr __getattr__sz"VersionlessRequirement.__getattr__cCs|jS)N)r)rrrras_requirementsz%VersionlessRequirement.as_requirementN)rOrPrQrRrVrXrYrrrrrNs rN)Zdistutils.utilrZ distutilsrZdistutils.errorsrrr#r"rLZsetuptools.externrZ pkg_resourcesrrr Zsetuptools.command.easy_installr r:r ZDevelopInstallerr objectrNrrrrs     4PK!1 >n*command/__pycache__/develop.cpython-36.pycnu[3 9fn@sddlmZddlmZddlmZmZddlZddlZddl Z ddl m Z ddl m Z mZmZddlmZddlmZddlZGd d d ejeZGd d d eZdS) ) convert_path)log)DistutilsErrorDistutilsOptionErrorN)six) Distribution PathMetadatanormalize_path) easy_install) namespacesc@sveZdZdZdZejddgZejdgZd Zd d Z d d Z ddZ e ddZ ddZddZddZddZdS)developzSet up package for developmentz%install package in 'development mode' uninstalluUninstall this source package egg-path=N-Set the path to be used in the .egg-link fileFcCs2|jrd|_|j|jn|j|jdS)NT)r Z multi_versionuninstall_linkZuninstall_namespacesinstall_for_developmentZwarn_deprecated_options)selfr/usr/lib/python3.6/develop.pyruns  z develop.runcCs&d|_d|_tj|d|_d|_dS)N.)r egg_pathr initialize_options setup_pathZalways_copy_from)rrrrr's  zdevelop.initialize_optionscCs|jd}|jr,d}|j|jf}t|||jg|_tj||j|j |j j t j d|jd}t jj|j||_|j|_|jdkrt jj|j|_t|j}tt jj|j|j}||krtd|t|t|t jj|j|jd|_|j|j|j|j|_dS)Negg_infoz-Please rename %r to %r before using 'develop'z*.eggz .egg-linkzA--egg-path must be a relative path from the install directory to ) project_name)get_finalized_commandZbroken_egg_inforrZegg_nameargsr finalize_optionsZexpand_basedirsZ expand_dirsZ package_indexscanglobospathjoin install_diregg_linkegg_baserabspathr rrrdist_resolve_setup_pathr)rZeitemplaterZ egg_link_fntargetrrrrr .s<           zdevelop.finalize_optionscCsh|jtjdjd}|tjkr0d|jdd}ttjj|||}|ttjkrdt d|ttj|S)z Generate a path from egg_base back to '.' where the setup script resides and ensure that path points to the setup path from $install_dir/$egg_path. /z../zGCan't get a consistent path to setup script from installation directory) replacer#seprstripcurdircountr r$r%r)r(r&rZ path_to_setupZresolvedrrrr+Xs zdevelop._resolve_setup_pathc CsDtjrt|jddr|jddd|jd|jd}t|j}|jd|d|jd|jddd|jd|jd}||_ ||j _ t ||j |j _n"|jd|jdd d|jd|jtjr|jtjdt_|jtjd |j|j|js,t|jd }|j|j d |jWdQRX|jd|j |j dS) NZuse_2to3FZbuild_pyr)Zinplacer)r(Z build_extr/zCreating %s (link to %s)w )rZPY3getattr distributionZreinitialize_commandZ run_commandrr Z build_librr*locationrrZ _providerZinstall_site_py setuptoolsZbootstrap_install_fromr Zinstall_namespacesrinfor'r(dry_runopenwriterZprocess_distributionZno_deps)rZbpy_cmdZ build_pathZei_cmdfrrrrks4          zdevelop.install_for_developmentcCstjj|jrztjd|j|jt|j}dd|D}|j||j g|j |j gfkrhtj d|dS|j sztj |j|j s|j|j|jjrtj ddS)NzRemoving %s (link to %s)cSsg|] }|jqSr)r2).0linerrr sz*develop.uninstall_link..z$Link points to %s: uninstall abortedz5Note: you must uninstall or replace scripts manually!)r#r$existsr'rr;r(r=closerrwarnr<unlinkZ update_pthr*r8scripts)rZ egg_link_filecontentsrrrrs    zdevelop.uninstall_linkc Cs||jk rtj||S|j|x^|jjp,gD]N}tjjt |}tjj |}t j |}|j }WdQRX|j||||q.WdS)N)r*r install_egg_scriptsinstall_wrapper_scriptsr8rGr#r$r)rbasenameior=readZinstall_script)rr*Z script_nameZ script_pathZstrmZ script_textrrrrIs     zdevelop.install_egg_scriptscCst|}tj||S)N)VersionlessRequirementr rJ)rr*rrrrJszdevelop.install_wrapper_scripts)r rr)rNr)__name__ __module__ __qualname____doc__ descriptionr Z user_optionsZboolean_optionsZcommand_consumes_argumentsrrr staticmethodr+rrrIrJrrrrr s  * /r c@s(eZdZdZddZddZddZdS) rNaz Adapt a pkg_resources.Distribution to simply return the project name as the 'requirement' so that scripts will work across multiple versions. >>> dist = Distribution(project_name='foo', version='1.0') >>> str(dist.as_requirement()) 'foo==1.0' >>> adapted_dist = VersionlessRequirement(dist) >>> str(adapted_dist.as_requirement()) 'foo' cCs ||_dS)N)_VersionlessRequirement__dist)rr*rrr__init__szVersionlessRequirement.__init__cCs t|j|S)N)r7rU)rnamerrr __getattr__sz"VersionlessRequirement.__getattr__cCs|jS)N)r)rrrras_requirementsz%VersionlessRequirement.as_requirementN)rOrPrQrRrVrXrYrrrrrNs rN)Zdistutils.utilrZ distutilsrZdistutils.errorsrrr#r"rLZsetuptools.externrZ pkg_resourcesrrr Zsetuptools.command.easy_installr r:r ZDevelopInstallerr objectrNrrrrs     4PK!p%%2command/__pycache__/dist_info.cpython-36.opt-1.pycnu[3 9f@s8dZddlZddlmZddlmZGdddeZdS)zD Create a dist_info directory As defined in the wheel specification N)Command)logc@s.eZdZdZd gZddZddZd d Zd S) dist_infozcreate a .dist-info directory egg-base=eLdirectory containing .egg-info directories (default: top of the source tree)cCs d|_dS)N)egg_base)selfr /usr/lib/python3.6/dist_info.pyinitialize_optionsszdist_info.initialize_optionscCsdS)Nr )r r r r finalize_optionsszdist_info.finalize_optionscCsn|jd}|j|_|j|j|jdtd d}tjdjt j j ||jd}|j |j|dS)Negg_infoz .egg-infoz .dist-infoz creating '{}' bdist_wheel) Zget_finalized_commandrr runrlenrinfoformatospathabspathZegg2dist)r rZ dist_info_dirrr r r rs  z dist_info.runN)rrr)__name__ __module__ __qualname__ descriptionZ user_optionsr r rr r r r r s r)__doc__rZdistutils.corerZ distutilsrrr r r r s  PK!p%%,command/__pycache__/dist_info.cpython-36.pycnu[3 9f@s8dZddlZddlmZddlmZGdddeZdS)zD Create a dist_info directory As defined in the wheel specification N)Command)logc@s.eZdZdZd gZddZddZd d Zd S) dist_infozcreate a .dist-info directory egg-base=eLdirectory containing .egg-info directories (default: top of the source tree)cCs d|_dS)N)egg_base)selfr /usr/lib/python3.6/dist_info.pyinitialize_optionsszdist_info.initialize_optionscCsdS)Nr )r r r r finalize_optionsszdist_info.finalize_optionscCsn|jd}|j|_|j|j|jdtd d}tjdjt j j ||jd}|j |j|dS)Negg_infoz .egg-infoz .dist-infoz creating '{}' bdist_wheel) Zget_finalized_commandrr runrlenrinfoformatospathabspathZegg2dist)r rZ dist_info_dirrr r r rs  z dist_info.runN)rrr)__name__ __module__ __qualname__ descriptionZ user_optionsr r rr r r r r s r)__doc__rZdistutils.corerZ distutilsrrr r r r s  PK!V!`5command/__pycache__/easy_install.cpython-36.opt-1.pycnu[3 9fT @sdZddlmZddlmZddlmZmZddlmZmZm Z m Z ddl m Z m Z ddlmZmZddlmZdd lmZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd l Z dd l!Z!dd l"Z"dd l#Z#dd l$Z$dd l%Z%dd l&m'Z'dd l(m)Z)m*Z*dd l+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl4mm?Z?ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOdd lPZ@ejQde@jRdddddddgZSdd ZTd!dZUe'jVr2d"d#ZWd$d%ZXnd&d#ZWd'd%ZXd(d)ZYGd*dde,ZZd+d,Z[d-d.Z\d/d0Z]d1dZ^d2dZ_Gd3ddeGZ`Gd4d5d5e`Zaejbjcd6d7d8kreaZ`d9d:Zdd;d<Zed=d>Zfd?d@ZgdpdAdBZhdCdDZidEdFZjdGejkkrejZlndHdIZldqdKdLZmdMdNZndOdPZodQdRZpyddSlmqZrWnesk r^dTdUZrYnXdVdWZqGdXdYdYetZueujvZwGdZd[d[euZxGd\d]d]eyZzGd^d_d_ezZ{Gd`dadae{Z|ezj}Z}ezj~Z~dbdcZdddeZdfeefdgdhZdidjZdkdlZdrdmdZe"jdndoZd S)sa% Easy Install ------------ A tool for doing automatic download/extract/build of distutils-based Python packages. For detailed documentation, see the accompanying EasyInstall.txt file, or visit the `EasyInstall home page`__. __ https://setuptools.readthedocs.io/en/latest/easy_install.html )glob) get_platform) convert_path subst_vars)DistutilsArgErrorDistutilsOptionErrorDistutilsErrorDistutilsPlatformError)INSTALL_SCHEMES SCHEME_KEYS)logdir_util) first_line_re)find_executableN)six) configparsermap)Command) run_setup)get_pathget_config_vars) rmtree_safe)setopt)unpack_archive) PackageIndexparse_requirement_arg URL_SCHEME) bdist_eggegg_info)Wheel) yield_linesnormalize_pathresource_stringensure_directoryget_distributionfind_distributions Environment Requirement Distribution PathMetadata EggMetadata WorkingSetDistributionNotFoundVersionConflict DEVELOP_DISTdefault)categorysamefile easy_installPthDistributionsextract_wininst_cfgmainget_exe_prefixescCstjddkS)NP)structcalcsizer;r;"/usr/lib/python3.6/easy_install.pyis_64bitIsr=cCsjtjj|otjj|}ttjdo&|}|r:tjj||Stjjtjj|}tjjtjj|}||kS)z Determine if two paths reference the same file. Augments os.path.samefile to work on Windows and suppresses errors if the path doesn't exist. r1)ospathexistshasattrr1normpathnormcase)Zp1Zp2Z both_existZ use_samefileZnorm_p1Znorm_p2r;r;r<r1MscCs|S)Nr;)sr;r;r< _to_ascii_srEc Cs*ytj|ddStk r$dSXdS)NasciiTF)rZ text_type UnicodeError)rDr;r;r<isasciibs  rHcCs |jdS)NrF)encode)rDr;r;r<rEjsc Cs(y|jddStk r"dSXdS)NrFTF)rIrG)rDr;r;r<rHms  cCstj|jjddS)N z; )textwrapdedentstripreplace)textr;r;r<usrPc@seZdZdZdZdZdddddddddddddddddddddgZdd dd dd0d3d9ddddZ?ejdj Z@ddZAddZBddZCddZDddZEddZFddZGddZHejdj ZIddZJddZKddZLeMeMddddZNeMdddZOddZPdS)r2z'Manage a download/build/install processz Find/get/install Python packagesTprefix=Ninstallation prefixzip-okzinstall package as a zipfile multi-versionm%make apps have to require() a versionupgradeU1force upgrade (searches PyPI for latest versions) install-dir=dinstall package to DIR script-dir=rDinstall scripts to DIRexclude-scriptsxDon't install scripts always-copya'Copy all needed packages to install dir index-url=i base URL of Python Package Index find-links=f(additional URL(s) to search for packagesbuild-directory=b/download/extract/build in DIR; keep the results optimize=Olalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]record=3filename in which to record list of installed files always-unzipZ*don't install as a zipfile, no matter what site-dirs=S)list of directories where .pth files workeditablee+Install specified packages in editable formno-depsNdon't install dependencies allow-hosts=H$pattern(s) that hostnames must matchlocal-snapshots-okl(allow building eggs from local checkoutsversion"print version information and exit no-find-links9Don't load find-links defined in packages being installedz!install in user site-package '%s'usercCs,d|_d|_|_d|_|_|_d|_d|_d|_d|_ d|_ |_ d|_ |_ |_d|_|_|_d|_|_|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tjrtj |_!tj"|_#n d|_!d|_#d|_$d|_%d|_&|_'d|_(i|_)d|_*d|_+|j,j-|_-|j,j.||j,j/ddS)NrFr2)0rzip_oklocal_snapshots_ok install_dir script_direxclude_scripts index_url find_linksbuild_directoryargsoptimizerecordrY always_copy multi_versionr{no_deps allow_hostsrootprefix no_reportrinstall_purelibinstall_platlibinstall_headers install_libinstall_scripts install_data install_baseinstall_platbasesiteENABLE_USER_SITE USER_BASEinstall_userbase USER_SITEinstall_usersite no_find_links package_indexpth_filealways_copy_from site_dirsinstalled_projectssitepy_installedZ_dry_run distributionverboseZ_set_command_optionsget_option_dict)selfr;r;r<initialize_optionssF     zeasy_install.initialize_optionscCs"dd|D}tt|j|dS)Ncss*|]"}tjj|stjj|r|VqdS)N)r>r?r@islink).0filenamer;r;r< sz/easy_install.delete_blockers..)listr _delete_path)rblockersZextant_blockersr;r;r<delete_blockersszeasy_install.delete_blockerscCsJtjd||jrdStjj|o.tjj| }|r8tntj}||dS)Nz Deleting %s) r infodry_runr>r?isdirrrmtreeunlink)rr?Zis_treeZremoverr;r;r<rs  zeasy_install._delete_pathcCs6tjdd}td}d}t|jfttdS)zT Render the Setuptools version and installation details, then exit. N setuptoolsz=setuptools {dist.version} from {dist.location} (Python {ver}))sysrr$printformatlocals SystemExit)Zverdisttmplr;r;r<_render_versions zeasy_install._render_versionc Cst|jo |jtjjd}tdd\}}|jj|jj|jj||dd|d|d||||t tddd |_ t j r|j |j d <|j|j d <|j|j|j|jd d d d|jdkr|j|_|jdkrd|_|jdd!|jdd"|jr|jr|j|_|j|_|jdd#tttj}t|_|jdk rdd|jjdD}xV|D]N}t jj!|s~t"j#d|n,t||krt$|dn|jj%t|q^W|j&s|j'|j(pd|_(|jdd|_)x4|jt|jfD] }||j)kr|j)j*d|qW|j+dk r8dd|j+jdD}ndg}|j,dkr`|j-|j(|j)|d|_,t.|j)tj|_/|j0dk rt1|j0t2j3r|j0j|_0ng|_0|j4r|j,j5|j)tj|js|j,j6|j0|jdd$t1|j7t8s@y2t8|j7|_7d|j7kodknst9Wnt9k r>t$dYnX|j&rZ|j: rZt;d|j<sjt;d g|_=dS)%Nrr exec_prefixrabiflags) Z dist_nameZ dist_versionZ dist_fullname py_versionpy_version_shortpy_version_nodotZ sys_prefixrZsys_exec_prefixrruserbaseZusersiterrrrFrrinstallrcSsg|]}tjj|jqSr;)r>r? expanduserrM)rrDr;r;r< 3sz1easy_install.finalize_options..,z"%s (in --site-dirs) does not existz$ (in --site-dirs) is not on sys.pathzhttps://pypi.org/simple/cSsg|] }|jqSr;)rM)rrDr;r;r<rHs*)Z search_pathhostsrz--optimize must be 0, 1, or 2z9Must specify a build directory (-b) when using --editablez:No urls, filenames, or requirements specified (see --help))rr)rr)rr)rr)>rrrsplitrrZget_nameZ get_versionZ get_fullnamegetattr config_varsrrrr_fix_install_dir_for_user_siteexpand_basedirs expand_dirs_expandrrrZset_undefined_optionsrrrrr!r? get_site_dirs all_site_dirsrr>rr warnrappendr{check_site_dirr shadow_pathinsertrr create_indexr& local_indexr isinstancerZ string_typesrZscan_egg_linksadd_find_linksrint ValueErrorrrroutputs) rrrrrBrr]Z path_itemrr;r;r<finalize_optionss                zeasy_install.finalize_optionscCs`|j stj rdS|j|jdkr2d}t||j|_|_tj j ddd}|j |dS)z; Fix the install_dir if "--user" was used. Nz$User base directory is not specifiedposixZunixZ_user) rrrcreate_home_pathrr rrr>namerN select_scheme)rmsgZ scheme_namer;r;r<rms z+easy_install._fix_install_dir_for_user_sitecCs\xV|D]N}t||}|dk rtjdks0tjdkrrr?rrrsetattr)rattrsattrvalr;r;r< _expand_attrs|s    zeasy_install._expand_attrscCs|jdddgdS)zNCalls `os.path.expanduser` on install_base, install_platbase and root.rrrN)r)rr;r;r<rszeasy_install.expand_basedirscCsddddddg}|j|dS)z+Calls `os.path.expanduser` on install dirs.rrrrrrN)r)rdirsr;r;r<rszeasy_install.expand_dirsc Cs|j|jjkrtj|jzx|jD]}|j||j q$W|jr|j}|j rt |j }x(t t |D]}|||d||<qfWddl m }|j|j|j|fd|j|jWdtj|jjXdS)Nr) file_utilz'writing list of installed files to '%s')rrr set_verbosityrr2rrrrlenrange distutilsrexecuteZ write_filewarn_deprecated_options)rspecrZroot_lenZcounterrr;r;r<runs$       zeasy_install.runc CsDy tj}Wn"tk r.tjdtj}YnXtjj|j d|S)zReturn a pseudo-tempname base in the install directory. This code is intentionally naive; if a malicious party can write to the target directory you're already in deep doodoo. rztest-easy-install-%s) r>getpid ExceptionrandomZrandintrmaxsizer?joinr)rpidr;r;r<pseudo_tempnames  zeasy_install.pseudo_tempnamecCsdS)Nr;)rr;r;r<rsz$easy_install.warn_deprecated_optionscCsdt|j}tjj|d}tjj|sTytj|Wn ttfk rR|j YnX||j k}| rv|j rv|j }nd|j d}tjj|}y*|rtj|t|djtj|Wn ttfk r|j YnX| r|j rt|j|r|jdkrt||j |_nd|_|tttkr6d|_n$|j rZtjj| rZd|_d|_||_dS)z;Verify that self.install_dir is .pth-capable dir, if neededzeasy-install.pthz .write-testwNT)r!rr>r?r r@makedirsOSErrorIOErrorcant_write_to_targetrrcheck_pth_processingrropencloserno_default_version_msgrr3r _pythonpathr)rinstdirrZ is_site_dirZtestfileZ test_existsr;r;r<rs>         zeasy_install.check_site_diraS can't create or remove files in install directory The following error occurred while trying to add or remove files in the installation directory: %s The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: %s z This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option). a Perhaps your account does not have write access to this directory? If the installation directory is a system-owned directory, you may need to sign in as the administrator or "root" account. If you do not have administrative access to this machine, you may wish to choose a different installation directory, preferably one that is listed in your PYTHONPATH environment variable. For information on other options, you may wish to consult the documentation at: https://setuptools.readthedocs.io/en/latest/easy_install.html Please make the appropriate changes for your system and try again. cCsP|jtjd|jf}tjj|js6|d|j7}n|d|j7}t |dS)NrJ) _easy_install__cant_write_msgrexc_inforr>r?r@_easy_install__not_exists_id_easy_install__access_msgr)rrr;r;r<rs z!easy_install.cant_write_to_targetc Cs|j}tjd||jd}|d}tjj|}tdd}y8|rNtj|tjj |}t j j |ddt |d}Wn ttfk r|jYnXz|j|jft|jd }tj}tjd krtjj|\}} tjj|d } | jd kotjj| } | r| }d dlm} | |dddgd tjj|rJtjd|dSWd |r\|jtjj|rttj|tjj|rtj|X|jstjd|dS)z@Empirically verify whether .pth files are supported in inst. dirz Checking .pth file support in %sz.pthz.okzz import os f = open({ok_file!r}, 'w') f.write('OK') f.close() rJT)exist_okrNrz pythonw.exez python.exer)spawnz-Ez-cpassz-TEST PASSED: %s appears to support .pth filesz+TEST FAILED: %s does NOT support .pth filesF)rr rrr>r?r@ _one_linerrdirname pkg_resourcesZ py31compatrrrrrwriterrrr executablerrr lowerdistutils.spawnr rr) rrrZok_fileZ ok_existsrr#rkr&basenameZaltZuse_altr r;r;r<rsV            z!easy_install.check_pth_processingcCs\|j rN|jdrNx:|jdD],}|jd|r2q|j|||jd|qW|j|dS)z=Write all the scripts for `dist`, unless scripts are excludedscriptszscripts/N)rZmetadata_isdirZmetadata_listdirinstall_scriptZ get_metadatainstall_wrapper_scripts)rr script_namer;r;r<install_egg_scriptsSsz easy_install.install_egg_scriptscCs\tjj|rLxJtj|D].\}}}x"|D]}|jjtjj||q(WqWn |jj|dS)N)r>r?rwalkrrr )rr?baserfilesrr;r;r< add_outputas    zeasy_install.add_outputcCs|jrtd|fdS)NzjInvalid argument %r: you can't use filenames or URLs with --editable (except via the --find-links option).)r{r)rrr;r;r< not_editableiszeasy_install.not_editablecCs<|js dStjjtjj|j|jr8td|j|jfdS)Nz2%r already exists in %s; can't do a checkout there)r{r>r?r@r rkeyr)rrr;r;r<check_editableqs zeasy_install.check_editablec cs@tjtjdd}zt|VWdtjj|o8tt |XdS)Nz easy_install-)r) tempfilemkdtemprustrr>r?r@rr)rtmpdirr;r;r<_tmpdir{szeasy_install._tmpdirFcCs|js|j|j}t|tst|rT|j||jj||}|j d|||dSt j j |r||j||j d|||dSt |}|j||jj|||j|j|j |j}|dkrd|}|jr|d7}t|n0|jtkr|j|||d|S|j ||j||SWdQRXdS)NTz+Could not find suitable distribution for %rz2 (--always-copy skips system and development eggs)Using)r{install_site_pyr;rr'rr3rdownload install_itemr>r?r@rr5Zfetch_distributionrYrrrZ precedencer.process_distributionlocation)rrdepsr:dlrrr;r;r<r2s2         zeasy_install.easy_installcCs|p|j}|ptjj||k}|p,|jd }|pT|jdk oTtjjt|t|jk}|r| rx$|j|jD]}|j |krnPqnWd}t j dtjj ||r|j |||}x<|D]}|j|||qWn |j|g}|j||d|d|dk rx|D]}||kr|SqWdS)Nz.eggTz Processing %srr<)rr>r?r#endswithrr!r project_namerAr rr) install_eggsr@egg_distribution)rrr>r:rBZinstall_neededrZdistsr;r;r<r?s.         zeasy_install.install_itemcCs@t|}x2tD]*}d|}t||dkrt||||qWdS)z=Sets the install directories by applying the install schemes.Zinstall_N)r r rr)rrschemer4Zattrnamer;r;r<rs  zeasy_install.select_schemecGs|j||jj|||j|jkr2|jj||jj||j|||j|j<tj |j ||f||j dr|j r|jj |jd| r|j rdS|dk r|j|jkrtjd|dS|dks||kr|j}tt|}tj d|ytgj|g|j|j}Wn^tk rB}ztt|WYdd}~Xn0tk rp}zt|jWYdd}~XnX|js|jrx*|D]"}|j|jkr|j|jqWtj d|dS)Nzdependency_links.txtzSkipping dependencies for %szProcessing dependencies for %sz'Finished processing dependencies for %s) update_pthraddrr4remover.rr rinstallation_report has_metadatarrZget_metadata_linesrras_requirementr'r9r+Zresolver2r,rr-Zreportr)rZ requirementrrBrZdistreqZdistrosr|r;r;r<r@sB            z!easy_install.process_distributioncCs2|jdk r|j S|jdr dS|jds.dSdS)Nz not-zip-safeTzzip-safeF)rrM)rrr;r;r< should_unzips   zeasy_install.should_unzipcCstjj|j|j}tjj|r:d}tj||j|j||Stjj|rL|}nRtjj ||krftj |tj |}t |dkrtjj||d}tjj|r|}t |tj|||S)Nz<%r already exists in %s; build directory %s will not be keptrr)r>r?r rr4r@r rrr#rlistdirrr#shutilmove)rr dist_filename setup_basedstrcontentsr;r;r< maybe_moves"       zeasy_install.maybe_movecCs0|jr dSx tjj|D]}|j|qWdS)N)r ScriptWriterbestget_args write_script)rrrr;r;r<r,sz$easy_install.install_wrapper_scriptscCsNt|j}t||}|r8|j|t}tj||}|j|t|ddS)z/Generate a legacy script wrapper and install itrnN) r9rNis_python_script_load_templaterrX get_headerr[rE)rrr- script_textdev_pathrZ is_scriptZbodyr;r;r<r+"s   zeasy_install.install_scriptcCs(d}|r|jdd}td|}|jdS)z There are a couple of template scripts in the package. This function loads one of them and prepares it for use. z script.tmplz.tmplz (dev).tmplrzutf-8)rNr"decode)r`rZ raw_bytesr;r;r<r],s   zeasy_install._load_templatetc sjfdd|Dtjd|jtjjj|}j|jrLdSt }t |tjj |rptj |t |d|}|j|WdQRXt|d|dS)z1Write an executable file to the scripts directorycsg|]}tjjj|qSr;)r>r?r r)rrb)rr;r<r>sz-easy_install.write_script..zInstalling %s script to %sNri)rr rrr>r?r r2r current_umaskr#r@rrr%chmod)rr-rVmodertargetmaskrkr;)rr<r[;s   zeasy_install.write_scriptcCs`|jjdr|j||gS|jjdr8|j||gS|jjdrT|j||gS|}tjj|r|jd rt|||j ntjj |rtjj |}|j |r|j r|dk r|j|||}tjj|d}tjj|s2ttjj|dd}|stdtjj |t|dkr*td tjj ||d }|jrPtj|j||gS|j||SdS) Nz.eggz.exez.whlz.pyzsetup.pyrz"Couldn't find a setup script in %srzMultiple setup scripts in %sr)r'rD install_egg install_exe install_wheelr>r?isfilerunpack_progressrabspath startswithrrWr r@rrrr{r rreport_editablebuild_and_install)rrrSr:rT setup_scriptZsetupsr;r;r<rFOs<   zeasy_install.install_eggscCs>tjj|r"t|tjj|d}nttj|}tj ||dS)NzEGG-INFO)metadata) r>r?rr)r r* zipimport zipimporterr(Z from_filename)regg_pathrrr;r;r<rG{s    zeasy_install.egg_distributionc Cstjj|jtjj|}tjj|}|js2t||j|}t ||s|tjj |rttjj | rtt j ||jdn"tjj|r|jtj|fd|yd}tjj |r|j|rtjd}}n tjd}}nL|j|r|j||jd}}n*d}|j|rtjd}}n tjd}}|j|||f|dtjj|tjj|ft||d Wn$tk rzt|dd YnX|j||j|S) N)rz Removing FZMovingZCopyingZ ExtractingTz %s to %s)fix_zipimporter_caches)r>r?r rr)rmrr#rGr1rrr remove_treer@rrrnrQrRZcopytreerOZmkpathunpack_and_compileZcopy2r#update_dist_cachesr r2)rrur: destinationrZnew_dist_is_zippedrkrWr;r;r<rhsT               zeasy_install.install_eggc sTt|}|dkrtd|td|jdd|jddtd}tjj||jd}||_ |d}tjj|d}tjj|d }t |t |||_ |j ||tjj|st|d } | jd x<|jdD].\} } | d kr| jd | jddj| fqW| jtjj|d|jfddtj|Dtj|||j|jd|j||S)Nz(%s is not a valid distutils Windows .exerrrr)rErplatformz.eggz.tmpzEGG-INFOzPKG-INFOrzMetadata-Version: 1.0 target_versionz%s: %s _-r*csg|]}tjj|dqS)r)r>r?r )rr)rr;r<rsz,easy_install.install_exe..)rr)r4rr(getrr>r?r egg_namerAr#r)Z _provider exe_to_eggr@rr%itemsrNtitlerrrXrZrZ make_zipfilerrrh) rrSr:cfgrruegg_tmpZ _egg_infoZpkg_infrkkvr;)rr<ris<      " zeasy_install.install_exec s>t|ggifdd}t||g}xtD]l}|jjdr>|jd}|d}tj|dd|d<tjj f|}j ||j |tj ||q>W|j tj tjj dtj|xbdD]Z} t| rtjj d| d } tjj| st| d } | jd j t| d | jqWd S)z;Extract a bdist_wininst to the directories an egg would usecs|j}xԈD]\}}|j|r||t|d}|jd}tjjf|}|j}|jdsl|jdrtj |d |d <dtjj |dd<j |n4|jdr|dkrdtjj |dd<j ||SqW|jdst j d |dS) N/z.pydz.dllrrz.pyzSCRIPTS/z.pthzWARNING: can't process %sr)r'rnrrr>r?r rDr strip_modulesplitextrr r)srcrUrDoldnewpartsrC)r native_libsprefixes to_compile top_levelr;r<processs$      z(easy_install.exe_to_egg..processz.pydrrz.pyzEGG-INFOrrz.txtrrJNrrr)rr)r6rr'rDrrrr>r?r rZ write_stub byte_compileZwrite_safety_flagZ analyze_eggrr@rr%r) rrSrrZstubsresrZresourceZpyfilerZtxtrkr;)rrrrrr<rs6           zeasy_install.exe_to_eggc Cst|}tjj|j|j}tjj|}|js6t|tjj |rbtjj | rbt j ||jdn"tjj |r|jtj|fd|z.|j|j|fdtjj|tjj|fWdt|ddX|j||j|S)N)rz Removing zInstalling %s to %sF)rv)rr>r?r rrrmrr#rrr rwr@rrZinstall_as_eggr)r#ryr2rG)rZ wheel_pathr:Zwheelrzr;r;r<rjs,     zeasy_install.install_wheela( Because this distribution was installed --multi-version, before you can import modules from this package in an application, you will need to 'import pkg_resources' and then use a 'require()' call similar to one of these examples, in order to select the desired version: pkg_resources.require("%(name)s") # latest installed version pkg_resources.require("%(name)s==%(version)s") # this exact version pkg_resources.require("%(name)s>=%(version)s") # this version or higher z Note also that the installation directory must be on sys.path at runtime for this to work. (e.g. by being the application's script directory, by being on PYTHONPATH, or by being added to sys.path by your code.) Installedc Cs`d}|jr@|j r@|d|j7}|jtttjkr@|d|j7}|j }|j }|j }d}|t S)z9Helpful installation message for display to package usersz %(what)s %(eggloc)s%(extras)srJr) rr_easy_install__mv_warningrrr!rr?_easy_install__id_warningrArErr) rZreqrZwhatrZegglocrrZextrasr;r;r<rLIsz easy_install.installation_reportaR Extracted editable version of %(spec)s to %(dirname)s If it uses setuptools in its setup script, you can activate it in "development" mode by going to that directory and running:: %(python)s setup.py develop See the setuptools documentation for the "develop" command for more info. cCs"tjj|}tj}d|jtS)NrJ)r>r?r#rr&_easy_install__editable_msgr)rrrqr#pythonr;r;r<robs zeasy_install.report_editablecCstjjdttjjdtt|}|jdkrNd|jd}|jdd|n|jdkrd|jdd|jrv|jdd t j d |t |ddd j |yt ||Wn6tk r}ztd |jdfWYdd}~XnXdS) Nzdistutils.command.bdist_eggzdistutils.command.egg_inforrrrr~z-qz-nz Running %s %s zSetup script exited with %s)rmodules setdefaultrrrrrrr rrr rrrr)rrqrTrrr;r;r<rgs      zeasy_install.run_setupc Csddg}tjdtjj|d}z|jtjj||j||j|||t|g}g}x2|D]*}x$||D]}|j|j |j |qlWq^W| r|j rt j d||St|t j|jXdS)Nrz --dist-dirz egg-dist-tmp-)rdirz+No eggs found in %s (setup script problem?))r6r7r>r?r#_set_fetcher_optionsrrr&rhrArr rrrr) rrqrTrZdist_dirZall_eggsZeggsr4rr;r;r<rp{s$   zeasy_install.build_and_installc Cst|jjdj}d }i}x2|jD]&\}}||kr4q"|d||jdd <q"Wt|d }tjj|d }t j ||d S)a When easy_install is about to run bdist_egg on a source dist, that source dist might have 'setup_requires' directives, requiring additional fetching. Ensure the fetcher options given to easy_install are available to that command as well. r2rrrrrrr}r~)r2z setup.cfgN)rrrrrr) rrcopyrrNdictr>r?r rZ edit_config) rr0Zei_optsZfetch_directivesZ fetch_optionsr4rZsettingsZ cfg_filenamer;r;r<rs  z!easy_install._set_fetcher_optionscCs0|jdkrdSxX|j|jD]H}|js2|j|jkrtjd||jj||j|jkr|jj|jqW|js|j|jjkrtjd|n2tjd||jj ||j|jkr|jj |j|j s,|jj |jdkr,t jj|jd}t jj|rt j|t|d}|j|jj|jd|jdS)Nz&Removing %s from easy-install.pth filez4%s is already the active version in easy-install.pthz"Adding %s to easy-install.pth filerzsetuptools.pthwtrJ)rr4rrAr rrKrpathsrJrrsaver>r?r rrrrr% make_relativer)rrr]rrkr;r;r<rIs4           zeasy_install.update_pthcCstjd|||S)NzUnpacking %s to %s)r debug)rrrUr;r;r<rlszeasy_install.unpack_progresscshggfdd}t|||jjsdx.D]&}tj|tjdBd@}t||q:WdS)Ncs\|jdr"|jd r"j|n|jds6|jdr@j|j||j rX|pZdS)Nz.pyz EGG-INFO/z.dllz.so)rDrnrrlr)rrU)rto_chmodrr;r<pfs    z+easy_install.unpack_and_compile..pfimi)rrrr>statST_MODErd)rrurzrrkrer;)rrrr<rxs   zeasy_install.unpack_and_compilec Csjtjr dSddlm}z@tj|jd||dd|jd|jrT|||jd|jdWdtj|jXdS)Nr)rr)rforcer) rdont_write_bytecodedistutils.utilrr rrrr)rrrr;r;r<rs zeasy_install.byte_compilea bad install directory or PYTHONPATH You are attempting to install a package to a directory that is not on PYTHONPATH and which Python does not read ".pth" files from. The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: %s and your PYTHONPATH environment variable currently contains: %r Here are some of your options for correcting the problem: * You can choose a different installation directory, i.e., one that is on PYTHONPATH or supports .pth files * You can add the installation directory to the PYTHONPATH environment variable. (It must then also be on PYTHONPATH whenever you run Python and want to use the package(s) you are installing.) * You can set up the installation directory to support ".pth" files by using one of the approaches described here: https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations Please make the appropriate changes for your system and try again.cCs|j}||jtjjddfS)N PYTHONPATHr)_easy_install__no_default_msgrr>environr)rtemplater;r;r<rsz#easy_install.no_default_version_msgcCs|jr dStjj|jd}tdd}|jd}d}tjj|rtj d|jt j |}|j }WdQRX|j dstd |||krtjd ||jst|t j |d dd }|j|WdQRX|j|gd |_dS)z8Make sure there's a site.py in the target dir, if neededNzsite.pyrz site-patch.pyzutf-8rzChecking existing site.py in %sz def __boot():z;%s is not a setuptools-generated site.py; please remove it.z Creating %sr)encodingT)rr>r?r rr"rar@r riorreadrnrrrr#r%r)rZsitepysourceZcurrentZstrmr;r;r<r=s,       zeasy_install.install_site_pycCsj|js dSttjjd}xJtj|jD]:\}}|j|r(tjj | r(|j d|tj |dq(WdS)zCreate directories under ~.N~zos.makedirs('%s', 0o700)i) rrr>r?rrZ iteritemsrrnrZ debug_printr)rhomerr?r;r;r<r>szeasy_install.create_home_pathz/$base/lib/python$py_version_short/site-packagesz $base/bin)rr)rz$base/Lib/site-packagesz $base/ScriptscGs|jdj}|jrh|j}|j|d<|jjtj|j}x0|j D]$\}}t ||ddkr@t |||q@Wddl m }xJ|D]B}t ||}|dk rz|||}tjdkrtjj|}t |||qzWdS)Nrr0r)rr)Zget_finalized_commandrrrr rr>rDEFAULT_SCHEMErrrrrr?r)rrrrHrrrr;r;r<rTs         zeasy_install._expand)rQNrR)rSrTrU)rVrWrX)rYrZr[)r\r]r^)r_rDr`)rarbrc)rdrerf)rgrhri)rjrkrl)rmrnro)rprqrr)rsNrt)rurvrw)rxryrz)r{r|r})r~rr)rrr)rrr)rNr)rNr)F)F)T)N)r)Q__name__ __module__ __qualname____doc__ descriptionZcommand_consumes_argumentsZ user_optionsZboolean_optionsrrrZhelp_msgrZ negative_optrrrrr staticmethodrrrrrrrrrrrKrLlstriprrrrrr.r2r3r5 contextlibcontextmanagerr;r2r?rr@rOrWr,r+r]r[rFrGrhrirrjrrrLrrorrprrIrlrxrrrr=rrr rrr;r;r;r<r2xs    0 z   0    ;  $ $ '  ,6-5   %    cCs tjjddjtj}td|S)Nrr)r>rrrpathsepfilter)rr;r;r<rksrc Csg}|jttjg}tjtjkr0|jtjx|D]}|r6tjdkr`|jtjj |ddn\tj dkr|jtjj |ddtj dd dtjj |dd gn|j|tjj |ddgtjd kr6d |kr6tj j d }|r6tjj |ddtj dd d}|j|q6Wtdtdf}x"|D]}||kr |j|q WtjrR|jtjy|jtjWntk rzYnXttt|}|S)z& Return a list of 'site' dirs os2emxriscosZLibz site-packagesrlibrNrz site-pythondarwinzPython.frameworkHOMELibraryPythonpurelibplatlib)rr)extendrrrrrr{r>r?r seprrrrrrrgetsitepackagesAttributeErrorrrr!)sitedirsrrrZhome_spZ lib_pathsZsite_libr;r;r<rpsV            rccsi}x|D]}t|}||kr q d||<tjj|s6q tj|}||fVx|D]}|jds`qP|dkrjqPttjj||}tt |}|j xP|D]H}|j dst|j }||krd||<tjj|sq|tj|fVqWqPWq WdS)zBYield sys.path directories that might contain "old-style" packagesrz.ptheasy-install.pthsetuptools.pthimportN)rr) r!r>r?rrPrDrr rr rrnrstrip)Zinputsseenr#r1rrklinesliner;r;r< expand_pathss4           rc Cs&t|d}z tj|}|dkr$dS|d|d|d}|dkrHdS|j|dtjd|jd\}}}|dkrzdS|j|d|d d d }tj|}y<|j|} | j d d d} | j t j } |j tj| Wntjk rdSX|jd s|jd rdS|S|jXdS)znExtract configuration data from a bdist_wininst .exe Returns a configparser.RawConfigParser, or None rbN  zegg path translations for a given .exe filePURELIB/rPLATLIB/pywin32_system32PLATLIB/SCRIPTS/EGG-INFO/scripts/DATA/lib/site-packagesrrrzPKG-INFOrz .egg-inforNz EGG-INFO/z.pthz -nspkg.pthPURELIBPLATLIB\rz%s/%s/cSsg|]\}}|j|fqSr;)r')rrbyr;r;r<r$sz$get_exe_prefixes..)rr)rr)rr)rr)rr)rr)rZZipFileZinfolistrrrrDrr upperrrZPY3rar rMrNrnrrsortreverse)Z exe_filenamerrTrrrrVZpthr;r;r<r6s>     & c@sTeZdZdZdZffddZddZddZed d Z d d Z d dZ ddZ dS)r3z)A .pth file with Distribution paths in itFcCsp||_ttt||_ttjj|j|_|j t j |gddx(t |j D]}tt|jt|dqNWdS)NT)rrrr!rr>r?r#basedir_loadr&__init__r rrJr%)rrrr?r;r;r<r/szPthDistributions.__init__cCsg|_d}tj|j}tjj|jrt|jd}x|D]}|j drJd}q6|j }|jj ||j s6|j j drxq6t tjj|j|}|jd<tjj| s||kr|jjd|_q6d||<q6W|j|jr| rd|_x&|jo|jdj r |jjqWdS) NFZrtrT#rrr)rrfromkeysrr>r?rkrrrnrrrMr!r rr@popdirtyr)rZ saw_importrrkrr?r;r;r<r8s2        zPthDistributions._loadc Cs|js dStt|j|j}|rtjd|j|j|}dj |d}t j j |jr`t j |jt|jd}|j|WdQRXn(t j j|jrtjd|jt j |jd|_dS)z$Write changed .pth file back to diskNz Saving %srJrzDeleting empty %sF)rrrrrr rr _wrap_linesr r>r?rrrr%r@)rZ rel_pathsrdatarkr;r;r<rWs   zPthDistributions.savecCs|S)Nr;)rr;r;r<rmszPthDistributions._wrap_linescCsN|j|jko$|j|jkp$|jtjk}|r>|jj|jd|_tj||dS)z"Add `dist` to the distribution mapTN) rArrr>getcwdrrr&rJ)rrnew_pathr;r;r<rJqs  zPthDistributions.addcCs6x$|j|jkr$|jj|jd|_qWtj||dS)z'Remove `dist` from the distribution mapTN)rArrKrr&)rrr;r;r<rKs zPthDistributions.removecCstjjt|\}}t|j}|g}tjdkr2dp6tj}xVt||kr||jkrn|jtj |j |j |Stjj|\}}|j|q:W|SdS)Nr) r>r?rr!rraltseprrcurdirrr )rr?ZnpathZlastZbaselenrrr;r;r<rs    zPthDistributions.make_relativeN) rrrrrrrrrrrJrKrr;r;r;r<r3*s  c@s(eZdZeddZedZedZdS)RewritePthDistributionsccs(|jVx|D] }|VqW|jVdS)N)preludepostlude)clsrrr;r;r<rs  z#RewritePthDistributions._wrap_linesz? import sys sys.__plen = len(sys.path) z import sys new = sys.path[sys.__plen:] del sys.path[sys.__plen:] p = getattr(sys, '__egginsert', 0) sys.path[p:p] = new sys.__egginsert = p + len(new) N)rrr classmethodrr"rrr;r;r;r<rs  rZSETUPTOOLS_SYS_PATH_TECHNIQUErawZrewritecCs ttjtrtStjtjjS)z_ Return a regular expression based on first_line_re suitable for matching strings. )rrpatternr9recompilerar;r;r;r<_first_line_res rcCsd|tjtjgkr.tjdkr.t|tj||Stj\}}}t j ||d|dd||ffdS)Nrrrz %s %s) r>rrKrrdrS_IWRITErrrZreraise)funcargexcZetZevr}r;r;r< auto_chmods  rcCs.t|}t|tj|r"t|nt|dS)aa Fix any globally cached `dist_path` related data `dist_path` should be a path of a newly installed egg distribution (zipped or unzipped). sys.path_importer_cache contains finder objects that have been cached when importing data from the original distribution. Any such finders need to be cleared since the replacement distribution might be packaged differently, e.g. a zipped egg distribution might get replaced with an unzipped egg folder or vice versa. Having the old finders cached may then cause Python to attempt loading modules from the replacement distribution using an incorrect loader. zipimport.zipimporter objects are Python loaders charged with importing data packaged inside zip archives. If stale loaders referencing the original distribution, are left behind, they can fail to load modules from the replacement distribution. E.g. if an old zipimport.zipimporter instance is used to load data from a new zipped egg archive, it may cause the operation to attempt to locate the requested data in the wrong location - one indicated by the original distribution's zip archive directory information. Such an operation may then fail outright, e.g. report having read a 'bad local file header', or even worse, it may fail silently & return invalid data. zipimport._zip_directory_cache contains cached zip archive directory information for all existing zipimport.zipimporter instances and all such instances connected to the same archive share the same cached directory information. If asked, and the underlying Python implementation allows it, we can fix all existing zipimport.zipimporter instances instead of having to track them down and remove them one by one, by updating their shared cached zip archive directory information. This, of course, assumes that the replacement distribution is packaged as a zipped egg. If not asked to fix existing zipimport.zipimporter instances, we still do our best to clear any remaining zipimport.zipimporter related cached data that might somehow later get used when attempting to load data from the new distribution and thus cause such load operations to fail. Note that when tracking down such remaining stale data, we can not catch every conceivable usage from here, and we clear only those that we know of and have found to cause problems if left alive. Any remaining caches should be updated by whomever is in charge of maintaining them, i.e. they should be ready to handle us replacing their zip archives with new distributions at runtime. N)r!_uncacherpath_importer_cache!_replace_zip_directory_cache_data*_remove_and_clear_zip_directory_cache_data)Z dist_pathrvnormalized_pathr;r;r<rys <  rycCsTg}t|}xB|D]:}t|}|j|r|||dtjdfkr|j|qW|S)ap Return zipimporter cache entry keys related to a given normalized path. Alternative path spellings (e.g. those using different character case or those using alternative path separators) related to the same path are included. Any sub-path entries are included as well, i.e. those corresponding to zip archives embedded in other zip archives. rr)rr!rnr>rr)rcacheresultZ prefix_lenpZnpr;r;r<"_collect_zipimporter_cache_entriess   rcCsDx>t||D]0}||}||=|o*|||}|dk r |||<q WdS)a Update zipimporter cache data for a given normalized path. Any sub-path entries are processed as well, i.e. those corresponding to zip archives embedded in other zip archives. Given updater is a callable taking a cache entry key and the original entry (after already removing the entry from the cache), and expected to update the entry and possibly return a new one to be inserted in its place. Returning None indicates that the entry should not be replaced with a new one. If no updater is given, the cache entries are simply removed without any additional processing, the same as if the updater simply returned None. N)r)rrupdaterr old_entryZ new_entryr;r;r<_update_zipimporter_cache*s  r cCst||dS)N)r )rrr;r;r<rJsrcCsdd}t|tj|ddS)NcSs |jdS)N)clear)r?rr;r;r<2clear_and_remove_cached_zip_archive_directory_dataOszf_remove_and_clear_zip_directory_cache_data..clear_and_remove_cached_zip_archive_directory_data)r)r rs_zip_directory_cache)rr"r;r;r<rNsrZ__pypy__cCsdd}t|tj|ddS)NcSs&|jtj||jtj||S)N)r!rsrtupdater#)r?rr;r;r<)replace_cached_zip_archive_directory_dataes zT_replace_zip_directory_cache_data..replace_cached_zip_archive_directory_data)r)r rsr#)rr%r;r;r<rds rc Cs2yt||dWnttfk r(dSXdSdS)z%Is this string a valid Python script?execFTN)r SyntaxError TypeError)rOrr;r;r< is_pythonws r*cCsJy(tj|dd}|jd}WdQRXWnttfk r@|SX|dkS)zCDetermine if the specified executable is a .sh (contains a #! line)zlatin-1)rrNz#!)rrrrr)r&fpmagicr;r;r<is_shs r-cCs tj|gS)z@Quote a command line argument according to Windows parsing rules) subprocess list2cmdline)rr;r;r< nt_quote_argsr0cCsH|jds|jdrdSt||r&dS|jdrDd|jdjkSdS)zMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc. z.pyz.pywTz#!rrF)rDr*rn splitlinesr')r_rr;r;r<r\s  r\)rdcGsdS)Nr;)rr;r;r<_chmodsr2cCsRtjd||yt||Wn0tjk rL}ztjd|WYdd}~XnXdS)Nzchanging mode of %s to %ozchmod failed: %s)r rr2r>error)r?rer|r;r;r<rds rdc@seZdZdZgZeZeddZeddZ eddZ edd Z ed d Z d d Z eddZddZeddZeddZdS) CommandSpeczm A command spec for a #! header, specified as a list of arguments akin to those passed to Popen. cCs|S)zV Choose the best CommandSpec class based on environmental conditions. r;)r r;r;r<rYszCommandSpec.bestcCstjjtj}tjjd|S)N__PYVENV_LAUNCHER__)r>r?rBrr&rr)r Z_defaultr;r;r<_sys_executableszCommandSpec._sys_executablecCs:t||r|St|tr ||S|dkr0|jS|j|S)zg Construct a CommandSpec from a parameter to build_scripts, which may be None. N)rrfrom_environment from_string)r Zparamr;r;r< from_params  zCommandSpec.from_paramcCs||jgS)N)r6)r r;r;r<r7szCommandSpec.from_environmentcCstj|f|j}||S)z} Construct a command spec from a simple string representing a command line parseable by shlex.split. )shlexr split_args)r stringrr;r;r<r8szCommandSpec.from_stringcCs8tj|j||_tj|}t|s4dg|jdd<dS)Nz-xr)r:r_extract_optionsoptionsr.r/rH)rr_cmdliner;r;r<install_optionss zCommandSpec.install_optionscCs:|djd}tj|}|r.|jdp0dnd}|jS)zH Extract any options from the first line of the script. rJrrr)r1rmatchgrouprM)Z orig_scriptfirstrAr>r;r;r<r=s zCommandSpec._extract_optionscCs|j|t|jS)N)_renderrr>)rr;r;r< as_headerszCommandSpec.as_headercCs6d}x,|D]$}|j|r |j|r |ddSq W|S)Nz"'rr)rnrD)itemZ_QUOTESqr;r;r< _strip_quotess  zCommandSpec._strip_quotescCs tjdd|D}d|dS)Ncss|]}tj|jVqdS)N)r4rHrM)rrFr;r;r<rsz&CommandSpec._render..z#!rJ)r.r/)rr?r;r;r<rDszCommandSpec._renderN)rrrrr>rr;r rYr6r9r7r8r@rr=rErHrDr;r;r;r<r4s       r4c@seZdZeddZdS)WindowsCommandSpecF)rN)rrrrr;r;r;r;r<rIsrIc@seZdZdZejdjZeZ e dddZ e dddZ e dd d Z ed d Ze d dZe ddZe ddZe dddZdS)rXz` Encapsulates behavior around writing entry point scripts for console and gui apps. a # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r __requires__ = %(spec)r import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point(%(spec)r, %(group)r, %(name)r)() ) NFcCs6tjdt|rtntj}|jd||}|j||S)Nz Use get_argsr)warningsrDeprecationWarningWindowsScriptWriterrXrYget_script_headerrZ)r rr&wininstwriterheaderr;r;r<get_script_argss zScriptWriter.get_script_argscCs6tjdt|rd}|jjj|}|j||jS)NzUse get_headerz python.exe)rJrrKcommand_spec_classrYr9r@rE)r r_r&rNcmdr;r;r<rM's   zScriptWriter.get_script_headerc cs|dkr|j}t|j}xjdD]b}|d}xT|j|jD]B\}}|j||jt}|j||||} x| D] } | VqrWq>Wq"WdS)z Yield write_script() argument tuples for a distribution's console_scripts and gui_scripts entry points. NconsoleguiZ_scripts)rTrU) r^r9rNZ get_entry_mapr_ensure_safe_namerr_get_script_args) r rrPrtype_rBrZepr_rrr;r;r<rZ1s     zScriptWriter.get_argscCstjd|}|rtddS)z? Prevent paths in *_scripts entry point names. z[\\/]z+Path separators not allowed in script namesN)r searchr)rZ has_path_sepr;r;r<rVCs zScriptWriter._ensure_safe_namecCs tjdt|rtjS|jS)NzUse best)rJrrKrLrY)r Z force_windowsr;r;r< get_writerLs zScriptWriter.get_writercCs.tjdkstjdkr&tjdkr&tjS|SdS)zD Select the best ScriptWriter for this environment. win32javarN)rr{r>r_namerLrY)r r;r;r<rYRszScriptWriter.bestccs|||fVdS)Nr;)r rXrrPr_r;r;r<rW\szScriptWriter._get_script_argsrcCs"|jjj|}|j||jS)z;Create a #! line, getting options (if any) from script_text)rRrYr9r@rE)r r_r&rSr;r;r<r^as zScriptWriter.get_header)NF)NF)N)rN)rrrrrKrLrrr4rRr rQrMrZrrVrZrYrWr^r;r;r;r<rX s       rXc@sLeZdZeZeddZeddZeddZeddZ e d d Z d S) rLcCstjdt|jS)NzUse best)rJrrKrY)r r;r;r<rZls zWindowsScriptWriter.get_writercCs"tt|d}tjjdd}||S)zC Select the best ScriptWriter suitable for Windows )r&ZnaturalZSETUPTOOLS_LAUNCHERr&)rWindowsExecutableLauncherWriterr>rr)r Z writer_lookupZlauncherr;r;r<rYrs zWindowsScriptWriter.bestc #stddd|}|tjdjjdkrBdjft}tj|t dddd d dd g}|j ||j ||}fd d |D}|||d|fVdS)z For Windows, add a .py extensionz.pyaz.pyw)rTrUZPATHEXT;zK{ext} not listed in PATHEXT; scripts will not be recognized as executables.z.pyz -script.pyz.pycz.pyoz.execsg|] }|qSr;r;)rrb)rr;r<rsz8WindowsScriptWriter._get_script_args..rbN) rr>rr'rrrrJr UserWarningrK_adjust_header) r rXrrPr_extrrrr;)rr<rWs   z$WindowsScriptWriter._get_script_argscCsNd}d}|dkr||}}tjtj|tj}|j||d}|j|rJ|S|S)z Make sure 'pythonw' is used for gui and and 'python' is used for console (regardless of what sys.executable is). z pythonw.exez python.exerU)r<repl)r rescape IGNORECASEsub _use_header)r rXZ orig_headerr rcZ pattern_ob new_headerr;r;r<ras z"WindowsScriptWriter._adjust_headercCs$|ddjd}tjdkp"t|S)z Should _adjust_header use the replaced header? On non-windows systems, always use. On Windows systems, only use the replaced header if it resolves to an executable on the system. rr"r[r)rMrr{r)rhZ clean_headerr;r;r<rgs zWindowsScriptWriter._use_headerN) rrrrIrRr rZrYrWrarrgr;r;r;r<rLis    rLc@seZdZeddZdS)r^c #s|dkrd}d}dg}nd}d}dddg}|j||}fd d |D} |||d | fVd t|d fVtsd} | td fVdS)zG For Windows, add a .py extension and an .exe launcher rUz -script.pywz.pywZcliz -script.pyz.pyz.pycz.pyocsg|] }|qSr;r;)rrb)rr;r<rszDWindowsExecutableLauncherWriter._get_script_args..rbz.exernz .exe.manifestN)raget_win_launcherr=load_launcher_manifest) r rXrrPr_Z launcher_typerbrZhdrrZm_namer;)rr<rWs   z0WindowsExecutableLauncherWriter._get_script_argsN)rrrr rWr;r;r;r<r^sr^cCs2d|}tr|jdd}n |jdd}td|S)z Load the Windows launcher (executable) suitable for launching a script. `type` should be either 'cli' or 'gui' Returns the executable as a byte string. z%s.exe.z-64.z-32.r)r=rNr")typeZ launcher_fnr;r;r<rjs  rjcCs0tjtd}tjr|tS|jdtSdS)Nzlauncher manifest.xmlzutf-8)r$r"rrPY2varsra)rZmanifestr;r;r<rks  rkFcCstj|||S)N)rQr)r? ignore_errorsonerrorr;r;r<rsrcCstjd}tj||S)N)r>umask)Ztmpr;r;r<rcs  rccCs:ddl}tjj|jd}|tjd<tjj|tdS)Nr) rr>r?r#__path__rargvrr5)rZargv0r;r;r< bootstraps   rvc sddlm}ddlmGfddd}|dkrBtjdd}t0|fddd g|tjdpfd|d |WdQRXdS) Nr)setup)r(cseZdZdZfddZdS)z-main..DistributionWithoutHelpCommandsrc s(tj|f||WdQRXdS)N) _patch_usage _show_help)rrkw)r(r;r<ry sz8main..DistributionWithoutHelpCommands._show_helpN)rrrZ common_usageryr;)r(r;r<DistributionWithoutHelpCommandssr{rz-qr2z-v)Z script_argsr-Z distclass)rrwZsetuptools.distr(rrurx)rurzrwr{r;)r(r<r5s    c #sLddl}tjdjfdd}|jj}||j_z dVWd||j_XdS)Nrze usage: %(script)s [options] requirement_or_url ... or: %(script)s --help csttjj|dS)N)Zscript)rr>r?r))r-)USAGEr;r< gen_usage sz_patch_usage..gen_usage)Zdistutils.corerKrLrZcorer})rr}Zsavedr;)r|r<rx s   rx)N)r&)N)rrrrrrZdistutils.errorsrrrr Zdistutils.command.installr r rr r Zdistutils.command.build_scriptsrr(rrr>rsrQr6rr rr rKrJrr9rr.r:rZsetuptools.externrZsetuptools.extern.six.movesrrrrZsetuptools.sandboxrZsetuptools.py31compatrrZsetuptools.py27compatrZsetuptools.commandrZsetuptools.archive_utilrZsetuptools.package_indexrrrrrZsetuptools.wheelrr$r r!r"r#r$r%r&r'r(r)r*r+r,r-r.Zpkg_resources.py31compatfilterwarningsZ PEP440Warning__all__r=r1rnrErHr"r2rrrr4r6r3rrrrrryrr rrbuiltin_module_namesrr*r-r0r\rdr2 ImportErrorrr4r6Zsys_executablerIobjectrXrLr^rQrMrjrkrrcrvr5rrxr;r;r;r< s           D |A))'l R    T`A  PK!{AJ/command/__pycache__/easy_install.cpython-36.pycnu[3 9fT @sdZddlmZddlmZddlmZmZddlmZmZm Z m Z ddl m Z m Z ddlmZmZddlmZdd lmZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd l Z dd l!Z!dd l"Z"dd l#Z#dd l$Z$dd l%Z%dd l&m'Z'dd l(m)Z)m*Z*dd l+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl4mm?Z?ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOdd lPZ@ejQde@jRdddddddgZSdd ZTd!dZUe'jVr2d"d#ZWd$d%ZXnd&d#ZWd'd%ZXd(d)ZYGd*dde,ZZd+d,Z[d-d.Z\d/d0Z]d1dZ^d2dZ_Gd3ddeGZ`Gd4d5d5e`Zaejbjcd6d7d8kreaZ`d9d:Zdd;d<Zed=d>Zfd?d@ZgdpdAdBZhdCdDZidEdFZjdGejkkrejZlndHdIZldqdKdLZmdMdNZndOdPZodQdRZpyddSlmqZrWnesk r^dTdUZrYnXdVdWZqGdXdYdYetZueujvZwGdZd[d[euZxGd\d]d]eyZzGd^d_d_ezZ{Gd`dadae{Z|ezj}Z}ezj~Z~dbdcZdddeZdfeefdgdhZdidjZdkdlZdrdmdZe"jdndoZd S)sa% Easy Install ------------ A tool for doing automatic download/extract/build of distutils-based Python packages. For detailed documentation, see the accompanying EasyInstall.txt file, or visit the `EasyInstall home page`__. __ https://setuptools.readthedocs.io/en/latest/easy_install.html )glob) get_platform) convert_path subst_vars)DistutilsArgErrorDistutilsOptionErrorDistutilsErrorDistutilsPlatformError)INSTALL_SCHEMES SCHEME_KEYS)logdir_util) first_line_re)find_executableN)six) configparsermap)Command) run_setup)get_pathget_config_vars) rmtree_safe)setopt)unpack_archive) PackageIndexparse_requirement_arg URL_SCHEME) bdist_eggegg_info)Wheel) yield_linesnormalize_pathresource_stringensure_directoryget_distributionfind_distributions Environment Requirement Distribution PathMetadata EggMetadata WorkingSetDistributionNotFoundVersionConflict DEVELOP_DISTdefault)categorysamefile easy_installPthDistributionsextract_wininst_cfgmainget_exe_prefixescCstjddkS)NP)structcalcsizer;r;"/usr/lib/python3.6/easy_install.pyis_64bitIsr=cCsjtjj|otjj|}ttjdo&|}|r:tjj||Stjjtjj|}tjjtjj|}||kS)z Determine if two paths reference the same file. Augments os.path.samefile to work on Windows and suppresses errors if the path doesn't exist. r1)ospathexistshasattrr1normpathnormcase)Zp1Zp2Z both_existZ use_samefileZnorm_p1Znorm_p2r;r;r<r1MscCs|S)Nr;)sr;r;r< _to_ascii_srEc Cs*ytj|ddStk r$dSXdS)NasciiTF)rZ text_type UnicodeError)rDr;r;r<isasciibs  rHcCs |jdS)NrF)encode)rDr;r;r<rEjsc Cs(y|jddStk r"dSXdS)NrFTF)rIrG)rDr;r;r<rHms  cCstj|jjddS)N z; )textwrapdedentstripreplace)textr;r;r<usrPc@seZdZdZdZdZdddddddddddddddddddddgZdd dd dd0d3d9ddddZ?ejdj Z@ddZAddZBddZCddZDddZEddZFddZGddZHejdj ZIddZJddZKddZLeMeMddddZNeMdddZOddZPdS)r2z'Manage a download/build/install processz Find/get/install Python packagesTprefix=Ninstallation prefixzip-okzinstall package as a zipfile multi-versionm%make apps have to require() a versionupgradeU1force upgrade (searches PyPI for latest versions) install-dir=dinstall package to DIR script-dir=rDinstall scripts to DIRexclude-scriptsxDon't install scripts always-copya'Copy all needed packages to install dir index-url=i base URL of Python Package Index find-links=f(additional URL(s) to search for packagesbuild-directory=b/download/extract/build in DIR; keep the results optimize=Olalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]record=3filename in which to record list of installed files always-unzipZ*don't install as a zipfile, no matter what site-dirs=S)list of directories where .pth files workeditablee+Install specified packages in editable formno-depsNdon't install dependencies allow-hosts=H$pattern(s) that hostnames must matchlocal-snapshots-okl(allow building eggs from local checkoutsversion"print version information and exit no-find-links9Don't load find-links defined in packages being installedz!install in user site-package '%s'usercCs,d|_d|_|_d|_|_|_d|_d|_d|_d|_ d|_ |_ d|_ |_ |_d|_|_|_d|_|_|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tjrtj |_!tj"|_#n d|_!d|_#d|_$d|_%d|_&|_'d|_(i|_)d|_*d|_+|j,j-|_-|j,j.||j,j/ddS)NrFr2)0rzip_oklocal_snapshots_ok install_dir script_direxclude_scripts index_url find_linksbuild_directoryargsoptimizerecordrY always_copy multi_versionr{no_deps allow_hostsrootprefix no_reportrinstall_purelibinstall_platlibinstall_headers install_libinstall_scripts install_data install_baseinstall_platbasesiteENABLE_USER_SITE USER_BASEinstall_userbase USER_SITEinstall_usersite no_find_links package_indexpth_filealways_copy_from site_dirsinstalled_projectssitepy_installedZ_dry_run distributionverboseZ_set_command_optionsget_option_dict)selfr;r;r<initialize_optionssF     zeasy_install.initialize_optionscCs"dd|D}tt|j|dS)Ncss*|]"}tjj|stjj|r|VqdS)N)r>r?r@islink).0filenamer;r;r< sz/easy_install.delete_blockers..)listr _delete_path)rblockersZextant_blockersr;r;r<delete_blockersszeasy_install.delete_blockerscCsJtjd||jrdStjj|o.tjj| }|r8tntj}||dS)Nz Deleting %s) r infodry_runr>r?isdirrrmtreeunlink)rr?Zis_treeZremoverr;r;r<rs  zeasy_install._delete_pathcCs6tjdd}td}d}t|jfttdS)zT Render the Setuptools version and installation details, then exit. N setuptoolsz=setuptools {dist.version} from {dist.location} (Python {ver}))sysrr$printformatlocals SystemExit)Zverdisttmplr;r;r<_render_versions zeasy_install._render_versionc Cst|jo |jtjjd}tdd\}}|jj|jj|jj||dd|d|d||||t tddd |_ t j r|j |j d <|j|j d <|j|j|j|jd d d d|jdkr|j|_|jdkrd|_|jdd!|jdd"|jr|jr|j|_|j|_|jdd#tttj}t|_|jdk rdd|jjdD}xV|D]N}t jj!|s~t"j#d|n,t||krt$|dn|jj%t|q^W|j&s|j'|j(pd|_(|jdd|_)x4|jt|jfD] }||j)kr|j)j*d|qW|j+dk r8dd|j+jdD}ndg}|j,dkr`|j-|j(|j)|d|_,t.|j)tj|_/|j0dk rt1|j0t2j3r|j0j|_0ng|_0|j4r|j,j5|j)tj|js|j,j6|j0|jdd$t1|j7t8s@y2t8|j7|_7d|j7kodknst9Wnt9k r>t$dYnX|j&rZ|j: rZt;d|j<sjt;d g|_=dS)%Nrr exec_prefixrabiflags) Z dist_nameZ dist_versionZ dist_fullname py_versionpy_version_shortpy_version_nodotZ sys_prefixrZsys_exec_prefixrruserbaseZusersiterrrrFrrinstallrcSsg|]}tjj|jqSr;)r>r? expanduserrM)rrDr;r;r< 3sz1easy_install.finalize_options..,z"%s (in --site-dirs) does not existz$ (in --site-dirs) is not on sys.pathzhttps://pypi.org/simple/cSsg|] }|jqSr;)rM)rrDr;r;r<rHs*)Z search_pathhostsrz--optimize must be 0, 1, or 2z9Must specify a build directory (-b) when using --editablez:No urls, filenames, or requirements specified (see --help))rr)rr)rr)rr)>rrrsplitrrZget_nameZ get_versionZ get_fullnamegetattr config_varsrrrr_fix_install_dir_for_user_siteexpand_basedirs expand_dirs_expandrrrZset_undefined_optionsrrrrr!r? get_site_dirs all_site_dirsrr>rr warnrappendr{check_site_dirr shadow_pathinsertrr create_indexr& local_indexr isinstancerZ string_typesrZscan_egg_linksadd_find_linksrint ValueErrorrrroutputs) rrrrrBrr]Z path_itemrr;r;r<finalize_optionss                zeasy_install.finalize_optionscCs`|j stj rdS|j|jdkr2d}t||j|_|_tj j ddd}|j |dS)z; Fix the install_dir if "--user" was used. Nz$User base directory is not specifiedposixZunixZ_user) rrrcreate_home_pathrr rrr>namerN select_scheme)rmsgZ scheme_namer;r;r<rms z+easy_install._fix_install_dir_for_user_sitecCs\xV|D]N}t||}|dk rtjdks0tjdkrrr?rrrsetattr)rattrsattrvalr;r;r< _expand_attrs|s    zeasy_install._expand_attrscCs|jdddgdS)zNCalls `os.path.expanduser` on install_base, install_platbase and root.rrrN)r)rr;r;r<rszeasy_install.expand_basedirscCsddddddg}|j|dS)z+Calls `os.path.expanduser` on install dirs.rrrrrrN)r)rdirsr;r;r<rszeasy_install.expand_dirsc Cs|j|jjkrtj|jzx|jD]}|j||j q$W|jr|j}|j rt |j }x(t t |D]}|||d||<qfWddl m }|j|j|j|fd|j|jWdtj|jjXdS)Nr) file_utilz'writing list of installed files to '%s')rrr set_verbosityrr2rrrrlenrange distutilsrexecuteZ write_filewarn_deprecated_options)rspecrZroot_lenZcounterrr;r;r<runs$       zeasy_install.runc CsDy tj}Wn"tk r.tjdtj}YnXtjj|j d|S)zReturn a pseudo-tempname base in the install directory. This code is intentionally naive; if a malicious party can write to the target directory you're already in deep doodoo. rztest-easy-install-%s) r>getpid ExceptionrandomZrandintrmaxsizer?joinr)rpidr;r;r<pseudo_tempnames  zeasy_install.pseudo_tempnamecCsdS)Nr;)rr;r;r<rsz$easy_install.warn_deprecated_optionscCsdt|j}tjj|d}tjj|sTytj|Wn ttfk rR|j YnX||j k}| rv|j rv|j }nd|j d}tjj|}y*|rtj|t|djtj|Wn ttfk r|j YnX| r|j rt|j|r|jdkrt||j |_nd|_|tttkr6d|_n$|j rZtjj| rZd|_d|_||_dS)z;Verify that self.install_dir is .pth-capable dir, if neededzeasy-install.pthz .write-testwNT)r!rr>r?r r@makedirsOSErrorIOErrorcant_write_to_targetrrcheck_pth_processingrropencloserno_default_version_msgrr3r _pythonpathr)rinstdirrZ is_site_dirZtestfileZ test_existsr;r;r<rs>         zeasy_install.check_site_diraS can't create or remove files in install directory The following error occurred while trying to add or remove files in the installation directory: %s The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: %s z This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option). a Perhaps your account does not have write access to this directory? If the installation directory is a system-owned directory, you may need to sign in as the administrator or "root" account. If you do not have administrative access to this machine, you may wish to choose a different installation directory, preferably one that is listed in your PYTHONPATH environment variable. For information on other options, you may wish to consult the documentation at: https://setuptools.readthedocs.io/en/latest/easy_install.html Please make the appropriate changes for your system and try again. cCsP|jtjd|jf}tjj|js6|d|j7}n|d|j7}t |dS)NrJ) _easy_install__cant_write_msgrexc_inforr>r?r@_easy_install__not_exists_id_easy_install__access_msgr)rrr;r;r<rs z!easy_install.cant_write_to_targetc Cs|j}tjd||jd}|d}tjj|}tdd}y8|rNtj|tjj |}t j j |ddt |d}Wn ttfk r|jYnXz|j|jft|jd }tj}tjd krtjj|\}} tjj|d } | jd kotjj| } | r| }d dlm} | |dddgd tjj|rJtjd|dSWd |r\|jtjj|rttj|tjj|rtj|X|jstjd|dS)z@Empirically verify whether .pth files are supported in inst. dirz Checking .pth file support in %sz.pthz.okzz import os f = open({ok_file!r}, 'w') f.write('OK') f.close() rJT)exist_okrNrz pythonw.exez python.exer)spawnz-Ez-cpassz-TEST PASSED: %s appears to support .pth filesz+TEST FAILED: %s does NOT support .pth filesF)rr rrr>r?r@ _one_linerrdirname pkg_resourcesZ py31compatrrrrrwriterrrr executablerrr lowerdistutils.spawnr rr) rrrZok_fileZ ok_existsrr#rkr&basenameZaltZuse_altr r;r;r<rsV            z!easy_install.check_pth_processingcCs\|j rN|jdrNx:|jdD],}|jd|r2q|j|||jd|qW|j|dS)z=Write all the scripts for `dist`, unless scripts are excludedscriptszscripts/N)rZmetadata_isdirZmetadata_listdirinstall_scriptZ get_metadatainstall_wrapper_scripts)rr script_namer;r;r<install_egg_scriptsSsz easy_install.install_egg_scriptscCs\tjj|rLxJtj|D].\}}}x"|D]}|jjtjj||q(WqWn |jj|dS)N)r>r?rwalkrrr )rr?baserfilesrr;r;r< add_outputas    zeasy_install.add_outputcCs|jrtd|fdS)NzjInvalid argument %r: you can't use filenames or URLs with --editable (except via the --find-links option).)r{r)rrr;r;r< not_editableiszeasy_install.not_editablecCs<|js dStjjtjj|j|jr8td|j|jfdS)Nz2%r already exists in %s; can't do a checkout there)r{r>r?r@r rkeyr)rrr;r;r<check_editableqs zeasy_install.check_editablec cs@tjtjdd}zt|VWdtjj|o8tt |XdS)Nz easy_install-)r) tempfilemkdtemprustrr>r?r@rr)rtmpdirr;r;r<_tmpdir{szeasy_install._tmpdirFcCs|js|j|j}t|tst|rT|j||jj||}|j d|||dSt j j |r||j||j d|||dSt |}|j||jj|||j|j|j |j}|dkrd|}|jr|d7}t|n0|jtkr|j|||d|S|j ||j||SWdQRXdS)NTz+Could not find suitable distribution for %rz2 (--always-copy skips system and development eggs)Using)r{install_site_pyr;rr'rr3rdownload install_itemr>r?r@rr5Zfetch_distributionrYrrrZ precedencer.process_distributionlocation)rrdepsr:dlrrr;r;r<r2s2         zeasy_install.easy_installcCs|p|j}|ptjj||k}|p,|jd }|pT|jdk oTtjjt|t|jk}|r| rx$|j|jD]}|j |krnPqnWd}t j dtjj ||r|j |||}x<|D]}|j|||qWn |j|g}|j||d|d|dk rx|D]}||kr|SqWdS)Nz.eggTz Processing %srr<)rr>r?r#endswithrr!r project_namerAr rr) install_eggsr@egg_distribution)rrr>r:rBZinstall_neededrZdistsr;r;r<r?s.         zeasy_install.install_itemcCs@t|}x2tD]*}d|}t||dkrt||||qWdS)z=Sets the install directories by applying the install schemes.Zinstall_N)r r rr)rrschemer4Zattrnamer;r;r<rs  zeasy_install.select_schemecGs|j||jj|||j|jkr2|jj||jj||j|||j|j<tj |j ||f||j dr|j r|jj |jd| r|j rdS|dk r|j|jkrtjd|dS|dks||kr|j}tt|}tj d|ytgj|g|j|j}Wn^tk rB}ztt|WYdd}~Xn0tk rp}zt|jWYdd}~XnX|js|jrx*|D]"}|j|jkr|j|jqWtj d|dS)Nzdependency_links.txtzSkipping dependencies for %szProcessing dependencies for %sz'Finished processing dependencies for %s) update_pthraddrr4remover.rr rinstallation_report has_metadatarrZget_metadata_linesrras_requirementr'r9r+Zresolver2r,rr-Zreportr)rZ requirementrrBrZdistreqZdistrosr|r;r;r<r@sB            z!easy_install.process_distributioncCs2|jdk r|j S|jdr dS|jds.dSdS)Nz not-zip-safeTzzip-safeF)rrM)rrr;r;r< should_unzips   zeasy_install.should_unzipcCstjj|j|j}tjj|r:d}tj||j|j||Stjj|rL|}nRtjj ||krftj |tj |}t |dkrtjj||d}tjj|r|}t |tj|||S)Nz<%r already exists in %s; build directory %s will not be keptrr)r>r?r rr4r@r rrr#rlistdirrr#shutilmove)rr dist_filename setup_basedstrcontentsr;r;r< maybe_moves"       zeasy_install.maybe_movecCs0|jr dSx tjj|D]}|j|qWdS)N)r ScriptWriterbestget_args write_script)rrrr;r;r<r,sz$easy_install.install_wrapper_scriptscCsNt|j}t||}|r8|j|t}tj||}|j|t|ddS)z/Generate a legacy script wrapper and install itrnN) r9rNis_python_script_load_templaterrX get_headerr[rE)rrr- script_textdev_pathrZ is_scriptZbodyr;r;r<r+"s   zeasy_install.install_scriptcCs(d}|r|jdd}td|}|jdS)z There are a couple of template scripts in the package. This function loads one of them and prepares it for use. z script.tmplz.tmplz (dev).tmplrzutf-8)rNr"decode)r`rZ raw_bytesr;r;r<r],s   zeasy_install._load_templatetc sjfdd|Dtjd|jtjjj|}j|jrLdSt }t |tjj |rptj |t |d|}|j|WdQRXt|d|dS)z1Write an executable file to the scripts directorycsg|]}tjjj|qSr;)r>r?r r)rrb)rr;r<r>sz-easy_install.write_script..zInstalling %s script to %sNri)rr rrr>r?r r2r current_umaskr#r@rrr%chmod)rr-rVmodertargetmaskrkr;)rr<r[;s   zeasy_install.write_scriptcCs`|jjdr|j||gS|jjdr8|j||gS|jjdrT|j||gS|}tjj|r|jd rt|||j ntjj |rtjj |}|j |r|j r|dk r|j|||}tjj|d}tjj|s2ttjj|dd}|stdtjj |t|dkr*td tjj ||d }|jrPtj|j||gS|j||SdS) Nz.eggz.exez.whlz.pyzsetup.pyrz"Couldn't find a setup script in %srzMultiple setup scripts in %sr)r'rD install_egg install_exe install_wheelr>r?isfilerunpack_progressrabspath startswithrrWr r@rrrr{r rreport_editablebuild_and_install)rrrSr:rT setup_scriptZsetupsr;r;r<rFOs<   zeasy_install.install_eggscCs>tjj|r"t|tjj|d}nttj|}tj ||dS)NzEGG-INFO)metadata) r>r?rr)r r* zipimport zipimporterr(Z from_filename)regg_pathrrr;r;r<rG{s    zeasy_install.egg_distributionc Cstjj|jtjj|}tjj|}|js2t||j|}t ||s|tjj |rttjj | rtt j ||jdn"tjj|r|jtj|fd|yd}tjj |r|j|rtjd}}n tjd}}nL|j|r|j||jd}}n*d}|j|rtjd}}n tjd}}|j|||f|dtjj|tjj|ft||d Wn$tk rzt|dd YnX|j||j|S) N)rz Removing FZMovingZCopyingZ ExtractingTz %s to %s)fix_zipimporter_caches)r>r?r rr)rmrr#rGr1rrr remove_treer@rrrnrQrRZcopytreerOZmkpathunpack_and_compileZcopy2r#update_dist_cachesr r2)rrur: destinationrZnew_dist_is_zippedrkrWr;r;r<rhsT               zeasy_install.install_eggc sTt|}|dkrtd|td|jdd|jddtd}tjj||jd}||_ |d}tjj|d}tjj|d }t |t |||_ |j ||tjj|st|d } | jd x<|jdD].\} } | d kr| jd | jddj| fqW| jtjj|d|jfddtj|Dtj|||j|jd|j||S)Nz(%s is not a valid distutils Windows .exerrrr)rErplatformz.eggz.tmpzEGG-INFOzPKG-INFOrzMetadata-Version: 1.0 target_versionz%s: %s _-r*csg|]}tjj|dqS)r)r>r?r )rr)rr;r<rsz,easy_install.install_exe..)rr)r4rr(getrr>r?r egg_namerAr#r)Z _provider exe_to_eggr@rr%itemsrNtitlerrrXrZrZ make_zipfilerrrh) rrSr:cfgrruegg_tmpZ _egg_infoZpkg_infrkkvr;)rr<ris<      " zeasy_install.install_exec s>t|ggifdd}t||g}xtD]l}|jjdr>|jd}|d}tj|dd|d<tjj f|}j ||j |tj ||q>W|j tj tjj dtj|xbdD]Z} t| rtjj d| d } tjj| st| d } | jd j t| d | jqWd S)z;Extract a bdist_wininst to the directories an egg would usecs|j}xԈD]\}}|j|r||t|d}|jd}tjjf|}|j}|jdsl|jdrtj |d |d <dtjj |dd<j |n4|jdr|dkrdtjj |dd<j ||SqW|jdst j d |dS) N/z.pydz.dllrrz.pyzSCRIPTS/z.pthzWARNING: can't process %sr)r'rnrrr>r?r rDr strip_modulesplitextrr r)srcrUrDoldnewpartsrC)r native_libsprefixes to_compile top_levelr;r<processs$      z(easy_install.exe_to_egg..processz.pydrrz.pyzEGG-INFOrrz.txtrrJNrrr)rr)r6rr'rDrrrr>r?r rZ write_stub byte_compileZwrite_safety_flagZ analyze_eggrr@rr%r) rrSrrZstubsresrZresourceZpyfilerZtxtrkr;)rrrrrr<rs6           zeasy_install.exe_to_eggc Cst|}|jsttjj|j|j}tjj|}|j sBt |tjj |rntjj | rnt j||j dn"tjj|r|jtj|fd|z.|j|j|fdtjj|tjj|fWdt|ddX|j||j|S)N)rz Removing zInstalling %s to %sF)rv)rZ is_compatibleAssertionErrorr>r?r rrrmrr#rrr rwr@rrZinstall_as_eggr)r#ryr2rG)rZ wheel_pathr:Zwheelrzr;r;r<rjs.      zeasy_install.install_wheela( Because this distribution was installed --multi-version, before you can import modules from this package in an application, you will need to 'import pkg_resources' and then use a 'require()' call similar to one of these examples, in order to select the desired version: pkg_resources.require("%(name)s") # latest installed version pkg_resources.require("%(name)s==%(version)s") # this exact version pkg_resources.require("%(name)s>=%(version)s") # this version or higher z Note also that the installation directory must be on sys.path at runtime for this to work. (e.g. by being the application's script directory, by being on PYTHONPATH, or by being added to sys.path by your code.) Installedc Cs`d}|jr@|j r@|d|j7}|jtttjkr@|d|j7}|j }|j }|j }d}|t S)z9Helpful installation message for display to package usersz %(what)s %(eggloc)s%(extras)srJr) rr_easy_install__mv_warningrrr!rr?_easy_install__id_warningrArErr) rZreqrZwhatrZegglocrrZextrasr;r;r<rLIsz easy_install.installation_reportaR Extracted editable version of %(spec)s to %(dirname)s If it uses setuptools in its setup script, you can activate it in "development" mode by going to that directory and running:: %(python)s setup.py develop See the setuptools documentation for the "develop" command for more info. cCs"tjj|}tj}d|jtS)NrJ)r>r?r#rr&_easy_install__editable_msgr)rrrqr#pythonr;r;r<robs zeasy_install.report_editablecCstjjdttjjdtt|}|jdkrNd|jd}|jdd|n|jdkrd|jdd|jrv|jdd t j d |t |ddd j |yt ||Wn6tk r}ztd |jdfWYdd}~XnXdS) Nzdistutils.command.bdist_eggzdistutils.command.egg_inforrrrr~z-qz-nz Running %s %s zSetup script exited with %s)rmodules setdefaultrrrrrrr rrr rrrr)rrqrTrrr;r;r<rgs      zeasy_install.run_setupc Csddg}tjdtjj|d}z|jtjj||j||j|||t|g}g}x2|D]*}x$||D]}|j|j |j |qlWq^W| r|j rt j d||St|t j|jXdS)Nrz --dist-dirz egg-dist-tmp-)rdirz+No eggs found in %s (setup script problem?))r6r7r>r?r#_set_fetcher_optionsrrr&rhrArr rrrr) rrqrTrZdist_dirZall_eggsZeggsr4rr;r;r<rp{s$   zeasy_install.build_and_installc Cst|jjdj}d }i}x2|jD]&\}}||kr4q"|d||jdd <q"Wt|d }tjj|d }t j ||d S)a When easy_install is about to run bdist_egg on a source dist, that source dist might have 'setup_requires' directives, requiring additional fetching. Ensure the fetcher options given to easy_install are available to that command as well. r2rrrrrrr}r~)r2z setup.cfgN)rrrrrr) rrcopyrrNdictr>r?r rZ edit_config) rr0Zei_optsZfetch_directivesZ fetch_optionsr4rZsettingsZ cfg_filenamer;r;r<rs  z!easy_install._set_fetcher_optionscCs0|jdkrdSxX|j|jD]H}|js2|j|jkrtjd||jj||j|jkr|jj|jqW|js|j|jjkrtjd|n2tjd||jj ||j|jkr|jj |j|j s,|jj |jdkr,t jj|jd}t jj|rt j|t|d}|j|jj|jd|jdS)Nz&Removing %s from easy-install.pth filez4%s is already the active version in easy-install.pthz"Adding %s to easy-install.pth filerzsetuptools.pthwtrJ)rr4rrAr rrKrpathsrJrrsaver>r?r rrrrr% make_relativer)rrr]rrkr;r;r<rIs4           zeasy_install.update_pthcCstjd|||S)NzUnpacking %s to %s)r debug)rrrUr;r;r<rlszeasy_install.unpack_progresscshggfdd}t|||jjsdx.D]&}tj|tjdBd@}t||q:WdS)Ncs\|jdr"|jd r"j|n|jds6|jdr@j|j||j rX|pZdS)Nz.pyz EGG-INFO/z.dllz.so)rDrnrrlr)rrU)rto_chmodrr;r<pfs    z+easy_install.unpack_and_compile..pfimi)rrrr>statST_MODErd)rrurzrrkrer;)rrrr<rxs   zeasy_install.unpack_and_compilec Csjtjr dSddlm}z@tj|jd||dd|jd|jrT|||jd|jdWdtj|jXdS)Nr)rr)rforcer) rdont_write_bytecodedistutils.utilrr rrrr)rrrr;r;r<rs zeasy_install.byte_compilea bad install directory or PYTHONPATH You are attempting to install a package to a directory that is not on PYTHONPATH and which Python does not read ".pth" files from. The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: %s and your PYTHONPATH environment variable currently contains: %r Here are some of your options for correcting the problem: * You can choose a different installation directory, i.e., one that is on PYTHONPATH or supports .pth files * You can add the installation directory to the PYTHONPATH environment variable. (It must then also be on PYTHONPATH whenever you run Python and want to use the package(s) you are installing.) * You can set up the installation directory to support ".pth" files by using one of the approaches described here: https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations Please make the appropriate changes for your system and try again.cCs|j}||jtjjddfS)N PYTHONPATHr)_easy_install__no_default_msgrr>environr)rtemplater;r;r<rsz#easy_install.no_default_version_msgcCs|jr dStjj|jd}tdd}|jd}d}tjj|rtj d|jt j |}|j }WdQRX|j dstd |||krtjd ||jst|t j |d dd }|j|WdQRX|j|gd |_dS)z8Make sure there's a site.py in the target dir, if neededNzsite.pyrz site-patch.pyzutf-8rzChecking existing site.py in %sz def __boot():z;%s is not a setuptools-generated site.py; please remove it.z Creating %sr)encodingT)rr>r?r rr"rar@r riorreadrnrrrr#r%r)rZsitepysourceZcurrentZstrmr;r;r<r=s,       zeasy_install.install_site_pycCsj|js dSttjjd}xJtj|jD]:\}}|j|r(tjj | r(|j d|tj |dq(WdS)zCreate directories under ~.N~zos.makedirs('%s', 0o700)i) rrr>r?rrZ iteritemsrrnrZ debug_printr)rhomerr?r;r;r<r>szeasy_install.create_home_pathz/$base/lib/python$py_version_short/site-packagesz $base/bin)rr)rz$base/Lib/site-packagesz $base/ScriptscGs|jdj}|jrh|j}|j|d<|jjtj|j}x0|j D]$\}}t ||ddkr@t |||q@Wddl m }xJ|D]B}t ||}|dk rz|||}tjdkrtjj|}t |||qzWdS)Nrr0r)rr)Zget_finalized_commandrrrr rr>rDEFAULT_SCHEMErrrrrr?r)rrrrHrrrr;r;r<rTs         zeasy_install._expand)rQNrR)rSrTrU)rVrWrX)rYrZr[)r\r]r^)r_rDr`)rarbrc)rdrerf)rgrhri)rjrkrl)rmrnro)rprqrr)rsNrt)rurvrw)rxryrz)r{r|r})r~rr)rrr)rrr)rNr)rNr)F)F)T)N)r)Q__name__ __module__ __qualname____doc__ descriptionZcommand_consumes_argumentsZ user_optionsZboolean_optionsrrrZhelp_msgrZ negative_optrrrrr staticmethodrrrrrrrrrrrKrLlstriprrrrrr.r2r3r5 contextlibcontextmanagerr;r2r?rr@rOrWr,r+r]r[rFrGrhrirrjrrrLrrorrprrIrlrxrrrr=rrr rrr;r;r;r<r2xs    0 z   0    ;  $ $ '  ,6-5   %    cCs tjjddjtj}td|S)Nrr)r>rrrpathsepfilter)rr;r;r<rksrc Csg}|jttjg}tjtjkr0|jtjx|D]}|r6tjdkr`|jtjj |ddn\tj dkr|jtjj |ddtj dd dtjj |dd gn|j|tjj |ddgtjd kr6d |kr6tj j d }|r6tjj |ddtj dd d}|j|q6Wtdtdf}x"|D]}||kr |j|q WtjrR|jtjy|jtjWntk rzYnXttt|}|S)z& Return a list of 'site' dirs os2emxriscosZLibz site-packagesrlibrNrz site-pythondarwinzPython.frameworkHOMELibraryPythonpurelibplatlib)rr)extendrrrrrr{r>r?r seprrrrrrrgetsitepackagesAttributeErrorrrr!)sitedirsrrrZhome_spZ lib_pathsZsite_libr;r;r<rpsV            rccsi}x|D]}t|}||kr q d||<tjj|s6q tj|}||fVx|D]}|jds`qP|dkrjqPttjj||}tt |}|j xP|D]H}|j dst|j }||krd||<tjj|sq|tj|fVqWqPWq WdS)zBYield sys.path directories that might contain "old-style" packagesrz.ptheasy-install.pthsetuptools.pthimportN)rr) r!r>r?rrPrDrr rr rrnrstrip)Zinputsseenr#r1rrklinesliner;r;r< expand_pathss4           rc Cs&t|d}z tj|}|dkr$dS|d|d|d}|dkrHdS|j|dtjd|jd\}}}|dkrzdS|j|d|d d d }tj|}y<|j|} | j d d d} | j t j } |j tj| Wntjk rdSX|jd s|jd rdS|S|jXdS)znExtract configuration data from a bdist_wininst .exe Returns a configparser.RawConfigParser, or None rbN  zegg path translations for a given .exe filePURELIB/rPLATLIB/pywin32_system32PLATLIB/SCRIPTS/EGG-INFO/scripts/DATA/lib/site-packagesrrrzPKG-INFOrz .egg-inforNz EGG-INFO/z.pthz -nspkg.pthPURELIBPLATLIB\rz%s/%s/cSsg|]\}}|j|fqSr;)r')rrbyr;r;r<r$sz$get_exe_prefixes..)rr)rr)rr)rr)rr)rr)rZZipFileZinfolistrrrrDrr upperrrZPY3rar rMrNrnrrsortreverse)Z exe_filenamerrTrrrrVZpthr;r;r<r6s>     & c@sTeZdZdZdZffddZddZddZed d Z d d Z d dZ ddZ dS)r3z)A .pth file with Distribution paths in itFcCsp||_ttt||_ttjj|j|_|j t j |gddx(t |j D]}tt|jt|dqNWdS)NT)rrrr!rr>r?r#basedir_loadr&__init__r rrJr%)rrrr?r;r;r<r/szPthDistributions.__init__cCsg|_d}tj|j}tjj|jrt|jd}x|D]}|j drJd}q6|j }|jj ||j s6|j j drxq6t tjj|j|}|jd<tjj| s||kr|jjd|_q6d||<q6W|j|jr| rd|_x&|jo|jdj r |jjqWdS) NFZrtrT#rrr)rrfromkeysrr>r?rkrrrnrrrMr!r rr@popdirtyr)rZ saw_importrrkrr?r;r;r<r8s2        zPthDistributions._loadc Cs|js dStt|j|j}|rtjd|j|j|}dj |d}t j j |jr`t j |jt|jd}|j|WdQRXn(t j j|jrtjd|jt j |jd|_dS)z$Write changed .pth file back to diskNz Saving %srJrzDeleting empty %sF)rrrrrr rr _wrap_linesr r>r?rrrr%r@)rZ rel_pathsrdatarkr;r;r<rWs   zPthDistributions.savecCs|S)Nr;)rr;r;r<rmszPthDistributions._wrap_linescCsN|j|jko$|j|jkp$|jtjk}|r>|jj|jd|_tj||dS)z"Add `dist` to the distribution mapTN) rArrr>getcwdrrr&rJ)rrnew_pathr;r;r<rJqs  zPthDistributions.addcCs6x$|j|jkr$|jj|jd|_qWtj||dS)z'Remove `dist` from the distribution mapTN)rArrKrr&)rrr;r;r<rKs zPthDistributions.removecCstjjt|\}}t|j}|g}tjdkr2dp6tj}xVt||kr||jkrn|jtj |j |j |Stjj|\}}|j|q:W|SdS)Nr) r>r?rr!rraltseprrcurdirrr )rr?ZnpathZlastZbaselenrrr;r;r<rs    zPthDistributions.make_relativeN) rrrrrrrrrrrJrKrr;r;r;r<r3*s  c@s(eZdZeddZedZedZdS)RewritePthDistributionsccs(|jVx|D] }|VqW|jVdS)N)preludepostlude)clsrrr;r;r<rs  z#RewritePthDistributions._wrap_linesz? import sys sys.__plen = len(sys.path) z import sys new = sys.path[sys.__plen:] del sys.path[sys.__plen:] p = getattr(sys, '__egginsert', 0) sys.path[p:p] = new sys.__egginsert = p + len(new) N)rrr classmethodrr"rr r;r;r;r<rs  rZSETUPTOOLS_SYS_PATH_TECHNIQUErawZrewritecCs ttjtrtStjtjjS)z_ Return a regular expression based on first_line_re suitable for matching strings. )rrpatternr9recompilerar;r;r;r<_first_line_res rcCsd|tjtjgkr.tjdkr.t|tj||Stj\}}}t j ||d|dd||ffdS)Nrrrz %s %s) r>rrKrrdrS_IWRITErrrZreraise)funcargexcZetZevr}r;r;r< auto_chmods  rcCs.t|}t|tj|r"t|nt|dS)aa Fix any globally cached `dist_path` related data `dist_path` should be a path of a newly installed egg distribution (zipped or unzipped). sys.path_importer_cache contains finder objects that have been cached when importing data from the original distribution. Any such finders need to be cleared since the replacement distribution might be packaged differently, e.g. a zipped egg distribution might get replaced with an unzipped egg folder or vice versa. Having the old finders cached may then cause Python to attempt loading modules from the replacement distribution using an incorrect loader. zipimport.zipimporter objects are Python loaders charged with importing data packaged inside zip archives. If stale loaders referencing the original distribution, are left behind, they can fail to load modules from the replacement distribution. E.g. if an old zipimport.zipimporter instance is used to load data from a new zipped egg archive, it may cause the operation to attempt to locate the requested data in the wrong location - one indicated by the original distribution's zip archive directory information. Such an operation may then fail outright, e.g. report having read a 'bad local file header', or even worse, it may fail silently & return invalid data. zipimport._zip_directory_cache contains cached zip archive directory information for all existing zipimport.zipimporter instances and all such instances connected to the same archive share the same cached directory information. If asked, and the underlying Python implementation allows it, we can fix all existing zipimport.zipimporter instances instead of having to track them down and remove them one by one, by updating their shared cached zip archive directory information. This, of course, assumes that the replacement distribution is packaged as a zipped egg. If not asked to fix existing zipimport.zipimporter instances, we still do our best to clear any remaining zipimport.zipimporter related cached data that might somehow later get used when attempting to load data from the new distribution and thus cause such load operations to fail. Note that when tracking down such remaining stale data, we can not catch every conceivable usage from here, and we clear only those that we know of and have found to cause problems if left alive. Any remaining caches should be updated by whomever is in charge of maintaining them, i.e. they should be ready to handle us replacing their zip archives with new distributions at runtime. N)r!_uncacherpath_importer_cache!_replace_zip_directory_cache_data*_remove_and_clear_zip_directory_cache_data)Z dist_pathrvnormalized_pathr;r;r<rys <  rycCsTg}t|}xB|D]:}t|}|j|r|||dtjdfkr|j|qW|S)ap Return zipimporter cache entry keys related to a given normalized path. Alternative path spellings (e.g. those using different character case or those using alternative path separators) related to the same path are included. Any sub-path entries are included as well, i.e. those corresponding to zip archives embedded in other zip archives. rr)rr!rnr>rr)rcacheresultZ prefix_lenpZnpr;r;r<"_collect_zipimporter_cache_entriess   rcCsDx>t||D]0}||}||=|o*|||}|dk r |||<q WdS)a Update zipimporter cache data for a given normalized path. Any sub-path entries are processed as well, i.e. those corresponding to zip archives embedded in other zip archives. Given updater is a callable taking a cache entry key and the original entry (after already removing the entry from the cache), and expected to update the entry and possibly return a new one to be inserted in its place. Returning None indicates that the entry should not be replaced with a new one. If no updater is given, the cache entries are simply removed without any additional processing, the same as if the updater simply returned None. N)r)rrupdaterr old_entryZ new_entryr;r;r<_update_zipimporter_cache*s  r!cCst||dS)N)r!)rrr;r;r<rJsrcCsdd}t|tj|ddS)NcSs |jdS)N)clear)r?r r;r;r<2clear_and_remove_cached_zip_archive_directory_dataOszf_remove_and_clear_zip_directory_cache_data..clear_and_remove_cached_zip_archive_directory_data)r)r!rs_zip_directory_cache)rr#r;r;r<rNsrZ__pypy__cCsdd}t|tj|ddS)NcSs&|jtj||jtj||S)N)r"rsrtupdater$)r?r r;r;r<)replace_cached_zip_archive_directory_dataes zT_replace_zip_directory_cache_data..replace_cached_zip_archive_directory_data)r)r!rsr$)rr&r;r;r<rds rc Cs2yt||dWnttfk r(dSXdSdS)z%Is this string a valid Python script?execFTN)r SyntaxError TypeError)rOrr;r;r< is_pythonws r+cCsJy(tj|dd}|jd}WdQRXWnttfk r@|SX|dkS)zCDetermine if the specified executable is a .sh (contains a #! line)zlatin-1)rrNz#!)rrrrr)r&fpmagicr;r;r<is_shs r.cCs tj|gS)z@Quote a command line argument according to Windows parsing rules) subprocess list2cmdline)rr;r;r< nt_quote_argsr1cCsH|jds|jdrdSt||r&dS|jdrDd|jdjkSdS)zMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc. z.pyz.pywTz#!rrF)rDr+rn splitlinesr')r_rr;r;r<r\s  r\)rdcGsdS)Nr;)rr;r;r<_chmodsr3cCsRtjd||yt||Wn0tjk rL}ztjd|WYdd}~XnXdS)Nzchanging mode of %s to %ozchmod failed: %s)r rr3r>error)r?rer|r;r;r<rds rdc@seZdZdZgZeZeddZeddZ eddZ edd Z ed d Z d d Z eddZddZeddZeddZdS) CommandSpeczm A command spec for a #! header, specified as a list of arguments akin to those passed to Popen. cCs|S)zV Choose the best CommandSpec class based on environmental conditions. r;)r r;r;r<rYszCommandSpec.bestcCstjjtj}tjjd|S)N__PYVENV_LAUNCHER__)r>r?rBrr&rr)r Z_defaultr;r;r<_sys_executableszCommandSpec._sys_executablecCs:t||r|St|tr ||S|dkr0|jS|j|S)zg Construct a CommandSpec from a parameter to build_scripts, which may be None. N)rrfrom_environment from_string)r Zparamr;r;r< from_params  zCommandSpec.from_paramcCs||jgS)N)r7)r r;r;r<r8szCommandSpec.from_environmentcCstj|f|j}||S)z} Construct a command spec from a simple string representing a command line parseable by shlex.split. )shlexr split_args)r stringrr;r;r<r9szCommandSpec.from_stringcCs8tj|j||_tj|}t|s4dg|jdd<dS)Nz-xr)r;r_extract_optionsoptionsr/r0rH)rr_cmdliner;r;r<install_optionss zCommandSpec.install_optionscCs:|djd}tj|}|r.|jdp0dnd}|jS)zH Extract any options from the first line of the script. rJrrr)r2rmatchgrouprM)Z orig_scriptfirstrBr?r;r;r<r>s zCommandSpec._extract_optionscCs|j|t|jS)N)_renderrr?)rr;r;r< as_headerszCommandSpec.as_headercCs6d}x,|D]$}|j|r |j|r |ddSq W|S)Nz"'rr)rnrD)itemZ_QUOTESqr;r;r< _strip_quotess  zCommandSpec._strip_quotescCs tjdd|D}d|dS)Ncss|]}tj|jVqdS)N)r5rIrM)rrGr;r;r<rsz&CommandSpec._render..z#!rJ)r/r0)rr@r;r;r<rEszCommandSpec._renderN)rrrrr?rr<r rYr7r:r8r9rArr>rFrIrEr;r;r;r<r5s       r5c@seZdZeddZdS)WindowsCommandSpecF)rN)rrrrr<r;r;r;r<rJsrJc@seZdZdZejdjZeZ e dddZ e dddZ e dd d Z ed d Ze d dZe ddZe ddZe dddZdS)rXz` Encapsulates behavior around writing entry point scripts for console and gui apps. a # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r __requires__ = %(spec)r import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point(%(spec)r, %(group)r, %(name)r)() ) NFcCs6tjdt|rtntj}|jd||}|j||S)Nz Use get_argsr)warningsrDeprecationWarningWindowsScriptWriterrXrYget_script_headerrZ)r rr&wininstwriterheaderr;r;r<get_script_argss zScriptWriter.get_script_argscCs6tjdt|rd}|jjj|}|j||jS)NzUse get_headerz python.exe)rKrrLcommand_spec_classrYr:rArF)r r_r&rOcmdr;r;r<rN's   zScriptWriter.get_script_headerc cs|dkr|j}t|j}xjdD]b}|d}xT|j|jD]B\}}|j||jt}|j||||} x| D] } | VqrWq>Wq"WdS)z Yield write_script() argument tuples for a distribution's console_scripts and gui_scripts entry points. NconsoleguiZ_scripts)rUrV) r^r9rNZ get_entry_mapr_ensure_safe_namerr_get_script_args) r rrQrtype_rCrZepr_rrr;r;r<rZ1s     zScriptWriter.get_argscCstjd|}|rtddS)z? Prevent paths in *_scripts entry point names. z[\\/]z+Path separators not allowed in script namesN)rsearchr)rZ has_path_sepr;r;r<rWCs zScriptWriter._ensure_safe_namecCs tjdt|rtjS|jS)NzUse best)rKrrLrMrY)r Z force_windowsr;r;r< get_writerLs zScriptWriter.get_writercCs.tjdkstjdkr&tjdkr&tjS|SdS)zD Select the best ScriptWriter for this environment. win32javarN)rr{r>r_namerMrY)r r;r;r<rYRszScriptWriter.bestccs|||fVdS)Nr;)r rYrrQr_r;r;r<rX\szScriptWriter._get_script_argsrcCs"|jjj|}|j||jS)z;Create a #! line, getting options (if any) from script_text)rSrYr:rArF)r r_r&rTr;r;r<r^as zScriptWriter.get_header)NF)NF)N)rN)rrrrrKrLrrr5rSr rRrNrZrrWr[rYrXr^r;r;r;r<rX s       rXc@sLeZdZeZeddZeddZeddZeddZ e d d Z d S) rMcCstjdt|jS)NzUse best)rKrrLrY)r r;r;r<r[ls zWindowsScriptWriter.get_writercCs"tt|d}tjjdd}||S)zC Select the best ScriptWriter suitable for Windows )r&ZnaturalZSETUPTOOLS_LAUNCHERr&)rWindowsExecutableLauncherWriterr>rr)r Z writer_lookupZlauncherr;r;r<rYrs zWindowsScriptWriter.bestc #stddd|}|tjdjjdkrBdjft}tj|t dddd d dd g}|j ||j ||}fd d |D}|||d|fVdS)z For Windows, add a .py extensionz.pyaz.pyw)rUrVZPATHEXT;zK{ext} not listed in PATHEXT; scripts will not be recognized as executables.z.pyz -script.pyz.pycz.pyoz.execsg|] }|qSr;r;)rrb)rr;r<rsz8WindowsScriptWriter._get_script_args..rbN) rr>rr'rrrrKr UserWarningrK_adjust_header) r rYrrQr_extrrrr;)rr<rXs   z$WindowsScriptWriter._get_script_argscCsNd}d}|dkr||}}tjtj|tj}|j||d}|j|rJ|S|S)z Make sure 'pythonw' is used for gui and and 'python' is used for console (regardless of what sys.executable is). z pythonw.exez python.exerV)r=repl)rrescape IGNORECASEsub _use_header)r rYZ orig_headerr rdZ pattern_ob new_headerr;r;r<rbs z"WindowsScriptWriter._adjust_headercCs$|ddjd}tjdkp"t|S)z Should _adjust_header use the replaced header? On non-windows systems, always use. On Windows systems, only use the replaced header if it resolves to an executable on the system. rr"r\r)rMrr{r)riZ clean_headerr;r;r<rhs zWindowsScriptWriter._use_headerN) rrrrJrSr r[rYrXrbrrhr;r;r;r<rMis    rMc@seZdZeddZdS)r_c #s|dkrd}d}dg}nd}d}dddg}|j||}fd d |D} |||d | fVd t|d fVtsd} | td fVdS)zG For Windows, add a .py extension and an .exe launcher rVz -script.pywz.pywZcliz -script.pyz.pyz.pycz.pyocsg|] }|qSr;r;)rrb)rr;r<rszDWindowsExecutableLauncherWriter._get_script_args..rbz.exernz .exe.manifestN)rbget_win_launcherr=load_launcher_manifest) r rYrrQr_Z launcher_typercrZhdrrZm_namer;)rr<rXs   z0WindowsExecutableLauncherWriter._get_script_argsN)rrrr rXr;r;r;r<r_sr_cCs2d|}tr|jdd}n |jdd}td|S)z Load the Windows launcher (executable) suitable for launching a script. `type` should be either 'cli' or 'gui' Returns the executable as a byte string. z%s.exe.z-64.z-32.r)r=rNr")typeZ launcher_fnr;r;r<rks  rkcCs0tjtd}tjr|tS|jdtSdS)Nzlauncher manifest.xmlzutf-8)r$r"rrPY2varsra)rZmanifestr;r;r<rls  rlFcCstj|||S)N)rQr)r? ignore_errorsonerrorr;r;r<rsrcCstjd}tj||S)N)r>umask)Ztmpr;r;r<rcs  rccCs:ddl}tjj|jd}|tjd<tjj|tdS)Nr) rr>r?r#__path__rargvrr5)rZargv0r;r;r< bootstraps   rwc sddlm}ddlmGfddd}|dkrBtjdd}t0|fddd g|tjdpfd|d |WdQRXdS) Nr)setup)r(cseZdZdZfddZdS)z-main..DistributionWithoutHelpCommandsrc s(tj|f||WdQRXdS)N) _patch_usage _show_help)rrkw)r(r;r<rz sz8main..DistributionWithoutHelpCommands._show_helpN)rrrZ common_usagerzr;)r(r;r<DistributionWithoutHelpCommandssr|rz-qr2z-v)Z script_argsr-Z distclass)rrxZsetuptools.distr(rrvry)rvr{rxr|r;)r(r<r5s    c #sLddl}tjdjfdd}|jj}||j_z dVWd||j_XdS)Nrze usage: %(script)s [options] requirement_or_url ... or: %(script)s --help csttjj|dS)N)Zscript)rr>r?r))r-)USAGEr;r< gen_usage sz_patch_usage..gen_usage)Zdistutils.corerKrLrZcorer~)rr~Zsavedr;)r}r<ry s   ry)N)r')N)rrrrrrZdistutils.errorsrrrr Zdistutils.command.installr r rr r Zdistutils.command.build_scriptsrr(rrr>rsrQr6rrrr rKrKrr9rr/r;rZsetuptools.externrZsetuptools.extern.six.movesrrrrZsetuptools.sandboxrZsetuptools.py31compatrrZsetuptools.py27compatrZsetuptools.commandrZsetuptools.archive_utilrZsetuptools.package_indexrrrrrZsetuptools.wheelrr$r r!r"r#r$r%r&r'r(r)r*r+r,r-r.Zpkg_resources.py31compatfilterwarningsZ PEP440Warning__all__r=r1rorErHr"r2rrrr4r6r3rrrrrryrr!rrbuiltin_module_namesrr+r.r1r\rdr3 ImportErrorrr5r7Zsys_executablerJobjectrXrMr_rRrNrkrlrrcrwr5rryr;r;r;r< s           D |A))'l R    T`A  PK!(oQQ1command/__pycache__/egg_info.cpython-36.opt-1.pycnu[3 9f`@sdZddlmZddlmZddlmZddlm Z ddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'j(Z(ddl)m*Z*ddlm+Z+ddZ,GdddeZ-GdddeZGdddeZ.ddZ/ddZ0ddZ1dd Z2d!d"Z3d#d$Z4d%d&Z5d'd(Z6d0d*d+Z7d,d-Z8d.d/Z9dS)1zUsetuptools.command.egg_info Create a distribution's .egg-info directory and contents)FileList)DistutilsInternalError) convert_path)logN)six)map)Command)sdist) walk_revctrl) edit_config) bdist_egg)parse_requirements safe_name parse_version safe_version yield_lines EntryPointiter_entry_points to_filename)glob) packagingcCsd}|jtjj}tjtj}d|f}xt|D]\}}|t|dk}|dkrv|rd|d7}q4|d||f7}q4d}t|} x:|| kr||} | dkr||d7}n| d kr||7}n| d kr|d} | | kr|| d kr| d} | | kr|| d kr| d} x&| | kr6|| d kr6| d} qW| | krR|tj| 7}nR||d| } d} | dd krd } | dd} | tj| 7} |d| f7}| }n|tj| 7}|d7}qW|s4||7}q4W|d7}tj|tj tj BdS)z Translate a file path glob like '*.txt' in to a regular expression. This differs from fnmatch.translate which allows wildcards to match directory separators. It also knows about '**/' which matches any number of directories. z[^%s]z**z.*z (?:%s+%s)*r*?[!]^Nz[%s]z\Z)flags) splitospathsepreescape enumeratelencompile MULTILINEDOTALL)rZpatZchunksr#Z valid_charcchunkZ last_chunkiZ chunk_lencharZinner_iinnerZ char_classr0/usr/lib/python3.6/egg_info.pytranslate_pattern$sV         r2c@seZdZdZd)d*d+d,gZdgZd diZddZeddZ e j ddZ ddZ ddZ d-ddZ ddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(S).egg_infoz+create a distribution's .egg-info directory egg-base=eLdirectory containing .egg-info directories (default: top of the source tree)tag-dated0Add date stamp (e.g. 20050528) to version number tag-build=b-Specify explicit tag to add to version numberno-dateD"Don't include date stamp [default]cCs4d|_d|_d|_d|_d|_d|_d|_d|_dS)NrF)egg_name egg_versionegg_baser3 tag_buildtag_datebroken_egg_infovtags)selfr0r0r1initialize_optionsszegg_info.initialize_optionscCsdS)Nr0)rGr0r0r1tag_svn_revisionszegg_info.tag_svn_revisioncCsdS)Nr0)rGvaluer0r0r1rIscCs0tj}|j|d<d|d<t|t|ddS)z Materialize the value of date into the build tag. Install build keys in a deterministic order to avoid arbitrary reordering on subsequent builds. rCrrD)r3N) collections OrderedDicttagsr dict)rGfilenamer3r0r0r1save_version_infos zegg_info.save_version_infoc CsVt|jj|_|j|_|j|_t|j}y6t |t j j }|rFdnd}t t||j|jfWn,tk rtjjd|j|jfYnX|jdkr|jj}|pijdtj|_|jdt|jd|_|jtjkrtjj|j|j|_d|jkr|j|j|jj_ |jj}|dk rR|j |jj!krR|j|_"t|j|_#d|j_dS)Nz%s==%sz%s===%sz2Invalid distribution name or version syntax: %s-%srrBz .egg-info-)$r distributionZget_namer@rMrFtagged_versionrAr isinstancerversionZVersionlistr ValueError distutilserrorsZDistutilsOptionErrorrBZ package_dirgetr!curdirZensure_dirnamerr3r"joincheck_broken_egg_infometadataZ _patched_distkeylowerZ_versionZ_parsed_version)rGZparsed_versionZ is_versionspecdirsZpdr0r0r1finalize_optionss8          zegg_info.finalize_optionsFcCsN|r|j|||n6tjj|rJ|dkr@| r@tjd||dS|j|dS)aWrite `data` to `filename` or delete if empty If `data` is non-empty, this routine is the same as ``write_file()``. If `data` is empty but not ``None``, this is the same as calling ``delete_file(filename)`. If `data` is ``None``, then this is a no-op unless `filename` exists, in which case a warning is issued about the orphaned file (if `force` is false), or deleted (if `force` is true). Nz$%s not set in setup(), but %s exists) write_filer!r"existsrwarn delete_file)rGwhatrOdataforcer0r0r1write_or_delete_files   zegg_info.write_or_delete_filecCsDtjd||tjr|jd}|js@t|d}|j||jdS)zWrite `data` to `filename` (if not a dry run) after announcing it `what` is used in a log message to identify what is being written to the file. zwriting %s to %szutf-8wbN) rinforZPY3encodedry_runopenwriteclose)rGrhrOrifr0r0r1rds   zegg_info.write_filecCs tjd||jstj|dS)z8Delete `filename` (if not a dry run) after announcing itz deleting %sN)rrmror!unlink)rGrOr0r0r1rgs zegg_info.delete_filecCs2|jj}|jr$|j|jr$t|St||jS)N)rRZ get_versionrFendswithr)rGrUr0r0r1rSs zegg_info.tagged_versioncCs|j|j|jj}x@tdD]4}|j|d|j}|||jtj j |j|jqWtj j |jd}tj j |r||j ||j dS)Nzegg_info.writers) installerznative_libs.txt)Zmkpathr3rRZfetch_build_eggrZrequireZresolvenamer!r"r\rerg find_sources)rGrvepwriternlr0r0r1run s     z egg_info.runcCs,d}|jr||j7}|jr(|tjd7}|S)Nrz-%Y%m%d)rCrDtimeZstrftime)rGrUr0r0r1rMs  z egg_info.tagscCs4tjj|jd}t|j}||_|j|j|_dS)z"Generate SOURCES.txt manifest filez SOURCES.txtN) r!r"r\r3manifest_makerrRmanifestr|filelist)rGZmanifest_filenameZmmr0r0r1rx s  zegg_info.find_sourcescCsd|jd}|jtjkr&tjj|j|}tjj|r`tjddddd||j |j |_ ||_ dS)Nz .egg-inforQNz Note: Your current .egg-info directory has a '-' in its name; this will not work correctly with "setup.py develop". Please rename %s to %s to correct this problem. ) r@rBr!r[r"r\rerrfr3rE)rGZbeir0r0r1r](s    zegg_info.check_broken_egg_infoN)r4r5r6)r7r8r9)r:r;r<)r=r>r?)F)__name__ __module__ __qualname__ descriptionZ user_optionsZboolean_optionsZ negative_optrHpropertyrIsetterrPrcrkrdrgrSr|rMrxr]r0r0r0r1r3ws(  / r3c@s|eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZdS)rcCs<|j|\}}}}|dkrV|jddj|x"|D]}|j|s4tjd|q4Wn|dkr|jddj|x"|D]}|j|sxtjd|qxWn|dkr|jd dj|x"|D]}|j|stjd |qWnZ|d kr(|jd dj|x&|D]}|j|stjd |qWn|dkrx|jd|dj|fx|D]"}|j ||sPtjd||qPWn|dkr|jd|dj|fx|D]"}|j ||stjd||qWnp|dkr|jd||j |s8tjd|n>|dkr,|jd||j |s8tjd|n t d|dS)Nincludezinclude  z%warning: no files found matching '%s'excludezexclude z9warning: no previously-included files found matching '%s'zglobal-includezglobal-include z>warning: no files found matching '%s' anywhere in distributionzglobal-excludezglobal-exclude zRwarning: no previously-included files matching '%s' found anywhere in distributionzrecursive-includezrecursive-include %s %sz:warning: no files found matching '%s' under directory '%s'zrecursive-excludezrecursive-exclude %s %szNwarning: no previously-included files matching '%s' found under directory '%s'graftzgraft z+warning: no directories found matching '%s'prunezprune z6no previously-included directories found matching '%s'z'this cannot happen: invalid action '%s')Z_parse_template_line debug_printr\rrrfrglobal_includeglobal_excluderecursive_includerecursive_excluderrr)rGlineactionZpatternsdirZ dir_patternpatternr0r0r1process_template_line;sd                 zFileList.process_template_linecCsVd}xLtt|jdddD]2}||j|r|jd|j||j|=d}qW|S)z Remove all files from the file list that match the predicate. Return True if any matching files were removed Frz removing Tr)ranger'filesr)rGZ predicatefoundr-r0r0r1 _remove_filesszFileList._remove_filescCs$ddt|D}|j|t|S)z#Include files that match 'pattern'.cSsg|]}tjj|s|qSr0)r!r"isdir).0rsr0r0r1 sz$FileList.include..)rextendbool)rGrrr0r0r1rs zFileList.includecCst|}|j|jS)z#Exclude files that match 'pattern'.)r2rmatch)rGrrr0r0r1rszFileList.excludecCs8tjj|d|}ddt|ddD}|j|t|S)zN Include all files anywhere in 'dir/' that match the pattern. z**cSsg|]}tjj|s|qSr0)r!r"r)rrsr0r0r1rsz.FileList.recursive_include..T) recursive)r!r"r\rrr)rGrrZ full_patternrr0r0r1rs zFileList.recursive_includecCs ttjj|d|}|j|jS)zM Exclude any file anywhere in 'dir/' that match the pattern. z**)r2r!r"r\rr)rGrrrr0r0r1rszFileList.recursive_excludecCs$ddt|D}|j|t|S)zInclude all files from 'dir/'.cSs"g|]}tjj|D]}|qqSr0)rXrfindall)rZ match_diritemr0r0r1rsz"FileList.graft..)rrr)rGrrr0r0r1rs  zFileList.graftcCsttjj|d}|j|jS)zFilter out files from 'dir/'.z**)r2r!r"r\rr)rGrrr0r0r1rszFileList.prunecsJ|jdkr|jttjjd|fdd|jD}|j|t|S)z Include all files anywhere in the current directory that match the pattern. This is very inefficient on large file trees. Nz**csg|]}j|r|qSr0)r)rrs)rr0r1rsz+FileList.global_include..)Zallfilesrr2r!r"r\rr)rGrrr0)rr1rs   zFileList.global_includecCsttjjd|}|j|jS)zD Exclude all files anywhere that match the pattern. z**)r2r!r"r\rr)rGrrr0r0r1rszFileList.global_excludecCs8|jdr|dd}t|}|j|r4|jj|dS)N rr)rur _safe_pathrappend)rGrr"r0r0r1rs    zFileList.appendcCs|jjt|j|dS)N)rrfilterr)rGpathsr0r0r1rszFileList.extendcCstt|j|j|_dS)z Replace self.files with only safe paths Because some owners of FileList manipulate the underlying ``files`` attribute directly, this method must be called to repair those paths. N)rVrrr)rGr0r0r1_repairszFileList._repairc Csd}tj|}|dkr(tjd|dStj|d}|dkrNtj||ddSy tjj|shtjj|rldSWn&tk rtj||t j YnXdS)Nz!'%s' not %s encodable -- skippingz''%s' in unexpected encoding -- skippingFzutf-8T) unicode_utilsfilesys_decoderrfZ try_encoder!r"reUnicodeEncodeErrorsysgetfilesystemencoding)rGr"Zenc_warnZu_pathZ utf8_pathr0r0r1rs  zFileList._safe_pathN)rrrrrrrrrrrrrrrrrr0r0r0r1r8sI     rc@s\eZdZdZddZddZddZdd Zd d Zd d Z e ddZ ddZ ddZ dS)r~z MANIFEST.incCsd|_d|_d|_d|_dS)Nr)Z use_defaultsrZ manifest_onlyZforce_manifest)rGr0r0r1rHsz!manifest_maker.initialize_optionscCsdS)Nr0)rGr0r0r1rcszmanifest_maker.finalize_optionscCsdt|_tjj|js|j|jtjj|jr<|j |j |jj |jj |jdS)N) rrr!r"rerwrite_manifest add_defaultstemplateZ read_templateprune_file_listsortZremove_duplicates)rGr0r0r1r|s  zmanifest_maker.runcCstj|}|jtjdS)N/)rrreplacer!r#)rGr"r0r0r1_manifest_normalizes z"manifest_maker._manifest_normalizecsBjjfddjjD}dj}jtj|f|dS)zo Write the file list in 'self.filelist' to the manifest file named by 'self.manifest'. csg|]}j|qSr0)r)rrs)rGr0r1r sz1manifest_maker.write_manifest..zwriting manifest file '%s'N)rrrrZexecuterd)rGrmsgr0)rGr1rs  zmanifest_maker.write_manifestcCs|j|stj||dS)N)_should_suppress_warningr rf)rGrr0r0r1rf$s zmanifest_maker.warncCs tjd|S)z; suppress missing-file warnings from sdist zstandard file .*not found)r$r)rr0r0r1r(sz'manifest_maker._should_suppress_warningcCsttj||jj|j|jj|jtt}|rB|jj|nt j j |jrX|j |j d}|jj|jdS)Nr3)r rrrrrrVr rr!r"reZ read_manifestget_finalized_commandrr3)rGZrcfilesZei_cmdr0r0r1r/s   zmanifest_maker.add_defaultscCsZ|jd}|jj}|jj|j|jj|tjtj }|jj d|d|dddS)Nbuildz(^|z)(RCS|CVS|\.svn)r)Zis_regex) rrRZ get_fullnamerrZ build_baser$r%r!r#Zexclude_pattern)rGrZbase_dirr#r0r0r1r;s    zmanifest_maker.prune_file_listN)rrrrrHrcr|rrrf staticmethodrrrr0r0r0r1r~s    r~c Cs8dj|}|jd}t|d}|j|WdQRXdS)z{Create a file with the specified name and write 'contents' (a sequence of strings without line terminators) to it.  zutf-8rlN)r\rnrprq)rOcontentsrsr0r0r1rdEs   rdc Cs|tjd||jsx|jj}|j|j|_}|j|j|_}z|j |j Wd|||_|_Xt |jdd}t j |j |dS)Nz writing %sZzip_safe)rrmrorRr^rArUr@rwwrite_pkg_infor3getattrr Zwrite_safety_flag)cmdbasenamerOr^ZoldverZoldnameZsafer0r0r1rRs rcCstjj|rtjddS)NzsWARNING: 'depends.txt' is not used by setuptools 0.6! Use the install_requires/extras_require setup() args instead.)r!r"rerrf)rrrOr0r0r1warn_depends_obsoletees rcCs,t|pf}dd}t||}|j|dS)NcSs|dS)Nrr0)rr0r0r1osz%_write_requirements..)rr writelines)streamZreqslinesZ append_crr0r0r1_write_requirementsms  rcCsn|j}tj}t||j|jp"i}x2t|D]&}|jdjft t|||q.W|j d||j dS)Nz [{extra}] Z requirements) rRrStringIOrZinstall_requiresextras_requiresortedrqformatvarsrkgetvalue)rrrOZdistrirZextrar0r0r1write_requirementsts  rcCs,tj}t||jj|jd||jdS)Nzsetup-requirements)iorrrRZsetup_requiresrkr)rrrOrir0r0r1write_setup_requirementssrcCs:tjdd|jjD}|jd|djt|ddS)NcSsg|]}|jdddqS).rr)r )rkr0r0r1rsz(write_toplevel_names..ztop-level namesr)rNfromkeysrRZiter_distribution_namesrdr\r)rrrOZpkgsr0r0r1write_toplevel_namessrcCst|||ddS)NT) write_arg)rrrOr0r0r1 overwrite_argsrFcCsHtjj|d}t|j|d}|dk r4dj|d}|j||||dS)Nrr)r!r"splitextrrRr\rk)rrrOrjZargnamerJr0r0r1rs rcCs|jj}t|tjs|dkr"|}nr|dk rg}xZt|jD]J\}}t|tjsttj||}dj tt t |j }|j d||fqsR           (   SBEI    PK!(oQQ+command/__pycache__/egg_info.cpython-36.pycnu[3 9f`@sdZddlmZddlmZddlmZddlm Z ddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'j(Z(ddl)m*Z*ddlm+Z+ddZ,GdddeZ-GdddeZGdddeZ.ddZ/ddZ0ddZ1dd Z2d!d"Z3d#d$Z4d%d&Z5d'd(Z6d0d*d+Z7d,d-Z8d.d/Z9dS)1zUsetuptools.command.egg_info Create a distribution's .egg-info directory and contents)FileList)DistutilsInternalError) convert_path)logN)six)map)Command)sdist) walk_revctrl) edit_config) bdist_egg)parse_requirements safe_name parse_version safe_version yield_lines EntryPointiter_entry_points to_filename)glob) packagingcCsd}|jtjj}tjtj}d|f}xt|D]\}}|t|dk}|dkrv|rd|d7}q4|d||f7}q4d}t|} x:|| kr||} | dkr||d7}n| d kr||7}n| d kr|d} | | kr|| d kr| d} | | kr|| d kr| d} x&| | kr6|| d kr6| d} qW| | krR|tj| 7}nR||d| } d} | dd krd } | dd} | tj| 7} |d| f7}| }n|tj| 7}|d7}qW|s4||7}q4W|d7}tj|tj tj BdS)z Translate a file path glob like '*.txt' in to a regular expression. This differs from fnmatch.translate which allows wildcards to match directory separators. It also knows about '**/' which matches any number of directories. z[^%s]z**z.*z (?:%s+%s)*r*?[!]^Nz[%s]z\Z)flags) splitospathsepreescape enumeratelencompile MULTILINEDOTALL)rZpatZchunksr#Z valid_charcchunkZ last_chunkiZ chunk_lencharZinner_iinnerZ char_classr0/usr/lib/python3.6/egg_info.pytranslate_pattern$sV         r2c@seZdZdZd)d*d+d,gZdgZd diZddZeddZ e j ddZ ddZ ddZ d-ddZ ddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(S).egg_infoz+create a distribution's .egg-info directory egg-base=eLdirectory containing .egg-info directories (default: top of the source tree)tag-dated0Add date stamp (e.g. 20050528) to version number tag-build=b-Specify explicit tag to add to version numberno-dateD"Don't include date stamp [default]cCs4d|_d|_d|_d|_d|_d|_d|_d|_dS)NrF)egg_name egg_versionegg_baser3 tag_buildtag_datebroken_egg_infovtags)selfr0r0r1initialize_optionsszegg_info.initialize_optionscCsdS)Nr0)rGr0r0r1tag_svn_revisionszegg_info.tag_svn_revisioncCsdS)Nr0)rGvaluer0r0r1rIscCs0tj}|j|d<d|d<t|t|ddS)z Materialize the value of date into the build tag. Install build keys in a deterministic order to avoid arbitrary reordering on subsequent builds. rCrrD)r3N) collections OrderedDicttagsr dict)rGfilenamer3r0r0r1save_version_infos zegg_info.save_version_infoc CsVt|jj|_|j|_|j|_t|j}y6t |t j j }|rFdnd}t t||j|jfWn,tk rtjjd|j|jfYnX|jdkr|jj}|pijdtj|_|jdt|jd|_|jtjkrtjj|j|j|_d|jkr|j|j|jj_ |jj}|dk rR|j |jj!krR|j|_"t|j|_#d|j_dS)Nz%s==%sz%s===%sz2Invalid distribution name or version syntax: %s-%srrBz .egg-info-)$r distributionZget_namer@rMrFtagged_versionrAr isinstancerversionZVersionlistr ValueError distutilserrorsZDistutilsOptionErrorrBZ package_dirgetr!curdirZensure_dirnamerr3r"joincheck_broken_egg_infometadataZ _patched_distkeylowerZ_versionZ_parsed_version)rGZparsed_versionZ is_versionspecdirsZpdr0r0r1finalize_optionss8          zegg_info.finalize_optionsFcCsN|r|j|||n6tjj|rJ|dkr@| r@tjd||dS|j|dS)aWrite `data` to `filename` or delete if empty If `data` is non-empty, this routine is the same as ``write_file()``. If `data` is empty but not ``None``, this is the same as calling ``delete_file(filename)`. If `data` is ``None``, then this is a no-op unless `filename` exists, in which case a warning is issued about the orphaned file (if `force` is false), or deleted (if `force` is true). Nz$%s not set in setup(), but %s exists) write_filer!r"existsrwarn delete_file)rGwhatrOdataforcer0r0r1write_or_delete_files   zegg_info.write_or_delete_filecCsDtjd||tjr|jd}|js@t|d}|j||jdS)zWrite `data` to `filename` (if not a dry run) after announcing it `what` is used in a log message to identify what is being written to the file. zwriting %s to %szutf-8wbN) rinforZPY3encodedry_runopenwriteclose)rGrhrOrifr0r0r1rds   zegg_info.write_filecCs tjd||jstj|dS)z8Delete `filename` (if not a dry run) after announcing itz deleting %sN)rrmror!unlink)rGrOr0r0r1rgs zegg_info.delete_filecCs2|jj}|jr$|j|jr$t|St||jS)N)rRZ get_versionrFendswithr)rGrUr0r0r1rSs zegg_info.tagged_versioncCs|j|j|jj}x@tdD]4}|j|d|j}|||jtj j |j|jqWtj j |jd}tj j |r||j ||j dS)Nzegg_info.writers) installerznative_libs.txt)Zmkpathr3rRZfetch_build_eggrZrequireZresolvenamer!r"r\rerg find_sources)rGrvepwriternlr0r0r1run s     z egg_info.runcCs,d}|jr||j7}|jr(|tjd7}|S)Nrz-%Y%m%d)rCrDtimeZstrftime)rGrUr0r0r1rMs  z egg_info.tagscCs4tjj|jd}t|j}||_|j|j|_dS)z"Generate SOURCES.txt manifest filez SOURCES.txtN) r!r"r\r3manifest_makerrRmanifestr|filelist)rGZmanifest_filenameZmmr0r0r1rx s  zegg_info.find_sourcescCsd|jd}|jtjkr&tjj|j|}tjj|r`tjddddd||j |j |_ ||_ dS)Nz .egg-inforQNz Note: Your current .egg-info directory has a '-' in its name; this will not work correctly with "setup.py develop". Please rename %s to %s to correct this problem. ) r@rBr!r[r"r\rerrfr3rE)rGZbeir0r0r1r](s    zegg_info.check_broken_egg_infoN)r4r5r6)r7r8r9)r:r;r<)r=r>r?)F)__name__ __module__ __qualname__ descriptionZ user_optionsZboolean_optionsZ negative_optrHpropertyrIsetterrPrcrkrdrgrSr|rMrxr]r0r0r0r1r3ws(  / r3c@s|eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZdS)rcCs<|j|\}}}}|dkrV|jddj|x"|D]}|j|s4tjd|q4Wn|dkr|jddj|x"|D]}|j|sxtjd|qxWn|dkr|jd dj|x"|D]}|j|stjd |qWnZ|d kr(|jd dj|x&|D]}|j|stjd |qWn|dkrx|jd|dj|fx|D]"}|j ||sPtjd||qPWn|dkr|jd|dj|fx|D]"}|j ||stjd||qWnp|dkr|jd||j |s8tjd|n>|dkr,|jd||j |s8tjd|n t d|dS)Nincludezinclude  z%warning: no files found matching '%s'excludezexclude z9warning: no previously-included files found matching '%s'zglobal-includezglobal-include z>warning: no files found matching '%s' anywhere in distributionzglobal-excludezglobal-exclude zRwarning: no previously-included files matching '%s' found anywhere in distributionzrecursive-includezrecursive-include %s %sz:warning: no files found matching '%s' under directory '%s'zrecursive-excludezrecursive-exclude %s %szNwarning: no previously-included files matching '%s' found under directory '%s'graftzgraft z+warning: no directories found matching '%s'prunezprune z6no previously-included directories found matching '%s'z'this cannot happen: invalid action '%s')Z_parse_template_line debug_printr\rrrfrglobal_includeglobal_excluderecursive_includerecursive_excluderrr)rGlineactionZpatternsdirZ dir_patternpatternr0r0r1process_template_line;sd                 zFileList.process_template_linecCsVd}xLtt|jdddD]2}||j|r|jd|j||j|=d}qW|S)z Remove all files from the file list that match the predicate. Return True if any matching files were removed Frz removing Tr)ranger'filesr)rGZ predicatefoundr-r0r0r1 _remove_filesszFileList._remove_filescCs$ddt|D}|j|t|S)z#Include files that match 'pattern'.cSsg|]}tjj|s|qSr0)r!r"isdir).0rsr0r0r1 sz$FileList.include..)rextendbool)rGrrr0r0r1rs zFileList.includecCst|}|j|jS)z#Exclude files that match 'pattern'.)r2rmatch)rGrrr0r0r1rszFileList.excludecCs8tjj|d|}ddt|ddD}|j|t|S)zN Include all files anywhere in 'dir/' that match the pattern. z**cSsg|]}tjj|s|qSr0)r!r"r)rrsr0r0r1rsz.FileList.recursive_include..T) recursive)r!r"r\rrr)rGrrZ full_patternrr0r0r1rs zFileList.recursive_includecCs ttjj|d|}|j|jS)zM Exclude any file anywhere in 'dir/' that match the pattern. z**)r2r!r"r\rr)rGrrrr0r0r1rszFileList.recursive_excludecCs$ddt|D}|j|t|S)zInclude all files from 'dir/'.cSs"g|]}tjj|D]}|qqSr0)rXrfindall)rZ match_diritemr0r0r1rsz"FileList.graft..)rrr)rGrrr0r0r1rs  zFileList.graftcCsttjj|d}|j|jS)zFilter out files from 'dir/'.z**)r2r!r"r\rr)rGrrr0r0r1rszFileList.prunecsJ|jdkr|jttjjd|fdd|jD}|j|t|S)z Include all files anywhere in the current directory that match the pattern. This is very inefficient on large file trees. Nz**csg|]}j|r|qSr0)r)rrs)rr0r1rsz+FileList.global_include..)Zallfilesrr2r!r"r\rr)rGrrr0)rr1rs   zFileList.global_includecCsttjjd|}|j|jS)zD Exclude all files anywhere that match the pattern. z**)r2r!r"r\rr)rGrrr0r0r1rszFileList.global_excludecCs8|jdr|dd}t|}|j|r4|jj|dS)N rr)rur _safe_pathrappend)rGrr"r0r0r1rs    zFileList.appendcCs|jjt|j|dS)N)rrfilterr)rGpathsr0r0r1rszFileList.extendcCstt|j|j|_dS)z Replace self.files with only safe paths Because some owners of FileList manipulate the underlying ``files`` attribute directly, this method must be called to repair those paths. N)rVrrr)rGr0r0r1_repairszFileList._repairc Csd}tj|}|dkr(tjd|dStj|d}|dkrNtj||ddSy tjj|shtjj|rldSWn&tk rtj||t j YnXdS)Nz!'%s' not %s encodable -- skippingz''%s' in unexpected encoding -- skippingFzutf-8T) unicode_utilsfilesys_decoderrfZ try_encoder!r"reUnicodeEncodeErrorsysgetfilesystemencoding)rGr"Zenc_warnZu_pathZ utf8_pathr0r0r1rs  zFileList._safe_pathN)rrrrrrrrrrrrrrrrrr0r0r0r1r8sI     rc@s\eZdZdZddZddZddZdd Zd d Zd d Z e ddZ ddZ ddZ dS)r~z MANIFEST.incCsd|_d|_d|_d|_dS)Nr)Z use_defaultsrZ manifest_onlyZforce_manifest)rGr0r0r1rHsz!manifest_maker.initialize_optionscCsdS)Nr0)rGr0r0r1rcszmanifest_maker.finalize_optionscCsdt|_tjj|js|j|jtjj|jr<|j |j |jj |jj |jdS)N) rrr!r"rerwrite_manifest add_defaultstemplateZ read_templateprune_file_listsortZremove_duplicates)rGr0r0r1r|s  zmanifest_maker.runcCstj|}|jtjdS)N/)rrreplacer!r#)rGr"r0r0r1_manifest_normalizes z"manifest_maker._manifest_normalizecsBjjfddjjD}dj}jtj|f|dS)zo Write the file list in 'self.filelist' to the manifest file named by 'self.manifest'. csg|]}j|qSr0)r)rrs)rGr0r1r sz1manifest_maker.write_manifest..zwriting manifest file '%s'N)rrrrZexecuterd)rGrmsgr0)rGr1rs  zmanifest_maker.write_manifestcCs|j|stj||dS)N)_should_suppress_warningr rf)rGrr0r0r1rf$s zmanifest_maker.warncCs tjd|S)z; suppress missing-file warnings from sdist zstandard file .*not found)r$r)rr0r0r1r(sz'manifest_maker._should_suppress_warningcCsttj||jj|j|jj|jtt}|rB|jj|nt j j |jrX|j |j d}|jj|jdS)Nr3)r rrrrrrVr rr!r"reZ read_manifestget_finalized_commandrr3)rGZrcfilesZei_cmdr0r0r1r/s   zmanifest_maker.add_defaultscCsZ|jd}|jj}|jj|j|jj|tjtj }|jj d|d|dddS)Nbuildz(^|z)(RCS|CVS|\.svn)r)Zis_regex) rrRZ get_fullnamerrZ build_baser$r%r!r#Zexclude_pattern)rGrZbase_dirr#r0r0r1r;s    zmanifest_maker.prune_file_listN)rrrrrHrcr|rrrf staticmethodrrrr0r0r0r1r~s    r~c Cs8dj|}|jd}t|d}|j|WdQRXdS)z{Create a file with the specified name and write 'contents' (a sequence of strings without line terminators) to it.  zutf-8rlN)r\rnrprq)rOcontentsrsr0r0r1rdEs   rdc Cs|tjd||jsx|jj}|j|j|_}|j|j|_}z|j |j Wd|||_|_Xt |jdd}t j |j |dS)Nz writing %sZzip_safe)rrmrorRr^rArUr@rwwrite_pkg_infor3getattrr Zwrite_safety_flag)cmdbasenamerOr^ZoldverZoldnameZsafer0r0r1rRs rcCstjj|rtjddS)NzsWARNING: 'depends.txt' is not used by setuptools 0.6! Use the install_requires/extras_require setup() args instead.)r!r"rerrf)rrrOr0r0r1warn_depends_obsoletees rcCs,t|pf}dd}t||}|j|dS)NcSs|dS)Nrr0)rr0r0r1osz%_write_requirements..)rr writelines)streamZreqslinesZ append_crr0r0r1_write_requirementsms  rcCsn|j}tj}t||j|jp"i}x2t|D]&}|jdjft t|||q.W|j d||j dS)Nz [{extra}] Z requirements) rRrStringIOrZinstall_requiresextras_requiresortedrqformatvarsrkgetvalue)rrrOZdistrirZextrar0r0r1write_requirementsts  rcCs,tj}t||jj|jd||jdS)Nzsetup-requirements)iorrrRZsetup_requiresrkr)rrrOrir0r0r1write_setup_requirementssrcCs:tjdd|jjD}|jd|djt|ddS)NcSsg|]}|jdddqS).rr)r )rkr0r0r1rsz(write_toplevel_names..ztop-level namesr)rNfromkeysrRZiter_distribution_namesrdr\r)rrrOZpkgsr0r0r1write_toplevel_namessrcCst|||ddS)NT) write_arg)rrrOr0r0r1 overwrite_argsrFcCsHtjj|d}t|j|d}|dk r4dj|d}|j||||dS)Nrr)r!r"splitextrrRr\rk)rrrOrjZargnamerJr0r0r1rs rcCs|jj}t|tjs|dkr"|}nr|dk rg}xZt|jD]J\}}t|tjsttj||}dj tt t |j }|j d||fqsR           (   SBEI    PK!m#J990command/__pycache__/install.cpython-36.opt-1.pycnu[3 9fK@svddlmZddlZddlZddlZddlZddljjZ ddl Z e jZ Gddde jZdde jj Dej e_ dS))DistutilsArgErrorNc@seZdZdZejjddgZejjddgZddd fd d d fgZe eZ d d Z ddZ ddZ ddZeddZddZdS)installz7Use easy_install to install the package, w/dependenciesold-and-unmanageableNTry not to use this!!single-version-externally-managed5used by system package builders to create 'flat' eggsZinstall_egg_infocCsdS)NT)selfrr/usr/lib/python3.6/install.pyszinstall.Zinstall_scriptscCsdS)NTr)r rrr r scCstjj|d|_d|_dS)N)origrinitialize_optionsold_and_unmanageable!single_version_externally_managed)r rrr r s zinstall.initialize_optionscCs<tjj||jrd|_n|jr8|j r8|j r8tddS)NTzAYou must specify --record or --root when building system packages)r rfinalize_optionsrootrrecordr)r rrr r%s zinstall.finalize_optionscCs(|js |jrtjj|Sd|_d|_dS)N)rrr rhandle_extra_pathZ path_fileZ extra_dirs)r rrr r0s  zinstall.handle_extra_pathcCs@|js |jrtjj|S|jtjs4tjj|n|jdS)N) rrr rrun_called_from_setupinspectZ currentframedo_egg_install)r rrr r:s   z install.runcCsz|dkr4d}tj|tjdkr0d}tj|dStj|d}|dd\}tj|}|jjdd }|d kox|j d kS) a Attempt to detect whether run() was called from setup() or by another command. If called by setup(), the parent caller will be the 'run_command' method in 'distutils.dist', and *its* caller will be the 'run_commands' method. If called any other way, the immediate caller *might* be 'run_command', but it won't have been called by 'run_commands'. Return True in that case or if a call stack is unavailable. Return False otherwise. Nz4Call stack not available. bdist_* commands may fail.Z IronPythonz6For best results, pass -X:Frames to enable call stack.T__name__rzdistutils.distZ run_commands) warningswarnplatformZpython_implementationrZgetouterframesZ getframeinfo f_globalsgetZfunction)Z run_framemsgresZcallerinfoZ caller_modulerrr rEs     zinstall._called_from_setupcCs|jjd}||jd|j|jd}|jd|_|jjtjd|j d|jj dj g}t j rp|jdt j ||_|jdt _ dS)N easy_installx)argsrr.z*.eggZ bdist_eggr)Z distributionZget_command_classrrZensure_finalizedZalways_copy_fromZ package_indexscanglobZ run_commandZget_command_objZ egg_output setuptoolsZbootstrap_install_frominsertr&r)r r$cmdr&rrr r`s  zinstall.do_egg_install)rNr)rNr)r __module__ __qualname____doc__r rZ user_optionsZboolean_options new_commandsdict_ncr rrr staticmethodrrrrrr rs      rcCsg|]}|dtjkr|qS)r)rr2).0r,rrr {sr5)Zdistutils.errorsrrr)rrZdistutils.command.installZcommandrr r*_installZ sub_commandsr0rrrr s  lPK!m#J99*command/__pycache__/install.cpython-36.pycnu[3 9fK@svddlmZddlZddlZddlZddlZddljjZ ddl Z e jZ Gddde jZdde jj Dej e_ dS))DistutilsArgErrorNc@seZdZdZejjddgZejjddgZddd fd d d fgZe eZ d d Z ddZ ddZ ddZeddZddZdS)installz7Use easy_install to install the package, w/dependenciesold-and-unmanageableNTry not to use this!!single-version-externally-managed5used by system package builders to create 'flat' eggsZinstall_egg_infocCsdS)NT)selfrr/usr/lib/python3.6/install.pyszinstall.Zinstall_scriptscCsdS)NTr)r rrr r scCstjj|d|_d|_dS)N)origrinitialize_optionsold_and_unmanageable!single_version_externally_managed)r rrr r s zinstall.initialize_optionscCs<tjj||jrd|_n|jr8|j r8|j r8tddS)NTzAYou must specify --record or --root when building system packages)r rfinalize_optionsrootrrecordr)r rrr r%s zinstall.finalize_optionscCs(|js |jrtjj|Sd|_d|_dS)N)rrr rhandle_extra_pathZ path_fileZ extra_dirs)r rrr r0s  zinstall.handle_extra_pathcCs@|js |jrtjj|S|jtjs4tjj|n|jdS)N) rrr rrun_called_from_setupinspectZ currentframedo_egg_install)r rrr r:s   z install.runcCsz|dkr4d}tj|tjdkr0d}tj|dStj|d}|dd\}tj|}|jjdd }|d kox|j d kS) a Attempt to detect whether run() was called from setup() or by another command. If called by setup(), the parent caller will be the 'run_command' method in 'distutils.dist', and *its* caller will be the 'run_commands' method. If called any other way, the immediate caller *might* be 'run_command', but it won't have been called by 'run_commands'. Return True in that case or if a call stack is unavailable. Return False otherwise. Nz4Call stack not available. bdist_* commands may fail.Z IronPythonz6For best results, pass -X:Frames to enable call stack.T__name__rzdistutils.distZ run_commands) warningswarnplatformZpython_implementationrZgetouterframesZ getframeinfo f_globalsgetZfunction)Z run_framemsgresZcallerinfoZ caller_modulerrr rEs     zinstall._called_from_setupcCs|jjd}||jd|j|jd}|jd|_|jjtjd|j d|jj dj g}t j rp|jdt j ||_|jdt _ dS)N easy_installx)argsrr.z*.eggZ bdist_eggr)Z distributionZget_command_classrrZensure_finalizedZalways_copy_fromZ package_indexscanglobZ run_commandZget_command_objZ egg_output setuptoolsZbootstrap_install_frominsertr&r)r r$cmdr&rrr r`s  zinstall.do_egg_install)rNr)rNr)r __module__ __qualname____doc__r rZ user_optionsZboolean_options new_commandsdict_ncr rrr staticmethodrrrrrr rs      rcCsg|]}|dtjkr|qS)r)rr2).0r,rrr {sr5)Zdistutils.errorsrrr)rrZdistutils.command.installZcommandrr r*_installZ sub_commandsr0rrrr s  lPK!: : : 9command/__pycache__/install_egg_info.cpython-36.opt-1.pycnu[3 9f@s\ddlmZmZddlZddlmZddlmZddlmZddl Z Gdddej eZ dS))logdir_utilN)Command) namespaces)unpack_archivec@sBeZdZdZdZdgZddZddZd d Zd d Z d dZ dS)install_egg_infoz.Install an .egg-info directory for the package install-dir=ddirectory to install tocCs d|_dS)N) install_dir)selfr &/usr/lib/python3.6/install_egg_info.pyinitialize_optionssz#install_egg_info.initialize_optionscCsV|jdd|jd}tjdd|j|jjd}|j|_tj j |j ||_ g|_ dS)NZ install_libr egg_infoz .egg-info)r r )Zset_undefined_optionsZget_finalized_command pkg_resourcesZ DistributionZegg_nameZ egg_versionrsourceospathjoinr targetoutputs)r Zei_cmdbasenamer r rfinalize_optionss z!install_egg_info.finalize_optionscCs|jdtjj|jr.skimmer)rrr)r r+r )r rr1s zinstall_egg_info.copytreeN)rr r ) __name__ __module__ __qualname____doc__ descriptionZ user_optionsrrr r!rr r r rr s  r) Z distutilsrrrZ setuptoolsrrZsetuptools.archive_utilrrZ Installerrr r r rs    PK!: : : 3command/__pycache__/install_egg_info.cpython-36.pycnu[3 9f@s\ddlmZmZddlZddlmZddlmZddlmZddl Z Gdddej eZ dS))logdir_utilN)Command) namespaces)unpack_archivec@sBeZdZdZdZdgZddZddZd d Zd d Z d dZ dS)install_egg_infoz.Install an .egg-info directory for the package install-dir=ddirectory to install tocCs d|_dS)N) install_dir)selfr &/usr/lib/python3.6/install_egg_info.pyinitialize_optionssz#install_egg_info.initialize_optionscCsV|jdd|jd}tjdd|j|jjd}|j|_tj j |j ||_ g|_ dS)NZ install_libr egg_infoz .egg-info)r r )Zset_undefined_optionsZget_finalized_command pkg_resourcesZ DistributionZegg_nameZ egg_versionrsourceospathjoinr targetoutputs)r Zei_cmdbasenamer r rfinalize_optionss z!install_egg_info.finalize_optionscCs|jdtjj|jr.skimmer)rrr)r r+r )r rr1s zinstall_egg_info.copytreeN)rr r ) __name__ __module__ __qualname____doc__ descriptionZ user_optionsrrr r!rr r r rr s  r) Z distutilsrrrZ setuptoolsrrZsetuptools.archive_utilrrZ Installerrr r r rs    PK!Ã4command/__pycache__/install_lib.cpython-36.opt-1.pycnu[3 9f@sBddlZddlZddlmZmZddljjZGdddejZdS)N)productstarmapc@sZeZdZdZddZddZddZedd Zd d Z ed d Z dddZ ddZ dS) install_libz9Don't add compiled flags to filenames of non-Python filescCs&|j|j}|dk r"|j|dS)N)ZbuildinstallZ byte_compile)selfoutfilesr!/usr/lib/python3.6/install_lib.pyrun szinstall_lib.runcs4fddjD}t|j}ttj|S)z Return a collections.Sized collections.Container of paths to be excluded for single_version_externally_managed installations. c3s"|]}j|D] }|VqqdS)N) _all_packages).0Zns_pkgpkg)rrr sz-install_lib.get_exclusions..)_get_SVEM_NSPsr_gen_exclusion_pathssetr_exclude_pkg_path)rZ all_packagesZ excl_specsr)rr get_exclusionss  zinstall_lib.get_exclusionscCs$|jd|g}tjj|jf|S)zw Given a package name and exclusion path within that package, compute the full exclusion path. .)splitospathjoinZ install_dir)rr Zexclusion_pathpartsrrr rszinstall_lib._exclude_pkg_pathccs$x|r|V|jd\}}}qWdS)zn >>> list(install_lib._all_packages('foo.bar.baz')) ['foo.bar.baz', 'foo.bar', 'foo'] rN) rpartition)Zpkg_namesepZchildrrr r 'szinstall_lib._all_packagescCs,|jjs gS|jd}|j}|r(|jjSgS)z Get namespace packages (list) but only for single_version_externally_managed installations and empty otherwise. r)Z distributionZnamespace_packagesZget_finalized_commandZ!single_version_externally_managed)rZ install_cmdZsvemrrr r1s  zinstall_lib._get_SVEM_NSPsccsbdVdVdVttds dStjjddtj}|dV|d V|d V|d VdS) zk Generate file paths to be excluded for namespace packages (bytecode cache files). z __init__.pyz __init__.pycz __init__.pyoget_tagN __pycache__z __init__.z.pycz.pyoz .opt-1.pycz .opt-2.pyc)hasattrimprrrr)baserrr rAs    z install_lib._gen_exclusion_pathsrc sX|jstjj|||Sddlm}ddlmgfdd}||||S)Nr)unpack_directory)logcs<|krjd|dSjd|tjj|j||S)Nz/Skipping installation of %s (namespace package)Fzcopying %s -> %s)warninforrdirnameappend)srcdst)excluder#rrr pfgs z!install_lib.copy_tree..pf)rorigr copy_treeZsetuptools.archive_utilr"Z distutilsr#) rZinfileZoutfileZ preserve_modeZpreserve_timesZpreserve_symlinkslevelr"r+r)r*r#rr r-Vs   zinstall_lib.copy_treecs.tjj|}|jr*fdd|DS|S)Ncsg|]}|kr|qSrr)r f)r*rr xsz+install_lib.get_outputs..)r,r get_outputsr)rZoutputsr)r*r r1ts  zinstall_lib.get_outputsN)r!r!rr!) __name__ __module__ __qualname____doc__r rr staticmethodr rrr-r1rrrr rs   r) rr itertoolsrrZdistutils.command.install_libZcommandrr,rrrr s PK!`.command/__pycache__/install_lib.cpython-36.pycnu[3 9f@sBddlZddlZddlmZmZddljjZGdddejZdS)N)productstarmapc@sZeZdZdZddZddZddZedd Zd d Z ed d Z dddZ ddZ dS) install_libz9Don't add compiled flags to filenames of non-Python filescCs&|j|j}|dk r"|j|dS)N)ZbuildinstallZ byte_compile)selfoutfilesr!/usr/lib/python3.6/install_lib.pyrun szinstall_lib.runcs4fddjD}t|j}ttj|S)z Return a collections.Sized collections.Container of paths to be excluded for single_version_externally_managed installations. c3s"|]}j|D] }|VqqdS)N) _all_packages).0Zns_pkgpkg)rrr sz-install_lib.get_exclusions..)_get_SVEM_NSPsr_gen_exclusion_pathssetr_exclude_pkg_path)rZ all_packagesZ excl_specsr)rr get_exclusionss  zinstall_lib.get_exclusionscCs$|jd|g}tjj|jf|S)zw Given a package name and exclusion path within that package, compute the full exclusion path. .)splitospathjoinZ install_dir)rr Zexclusion_pathpartsrrr rszinstall_lib._exclude_pkg_pathccs$x|r|V|jd\}}}qWdS)zn >>> list(install_lib._all_packages('foo.bar.baz')) ['foo.bar.baz', 'foo.bar', 'foo'] rN) rpartition)Zpkg_namesepZchildrrr r 'szinstall_lib._all_packagescCs,|jjs gS|jd}|j}|r(|jjSgS)z Get namespace packages (list) but only for single_version_externally_managed installations and empty otherwise. r)Z distributionZnamespace_packagesZget_finalized_commandZ!single_version_externally_managed)rZ install_cmdZsvemrrr r1s  zinstall_lib._get_SVEM_NSPsccsbdVdVdVttds dStjjddtj}|dV|d V|d V|d VdS) zk Generate file paths to be excluded for namespace packages (bytecode cache files). z __init__.pyz __init__.pycz __init__.pyoget_tagN __pycache__z __init__.z.pycz.pyoz .opt-1.pycz .opt-2.pyc)hasattrimprrrr)baserrr rAs    z install_lib._gen_exclusion_pathsrc sj|r|r| st|js.tjj|||Sddlm}ddlmgfdd}||||S)Nr)unpack_directory)logcs<|krjd|dSjd|tjj|j||S)Nz/Skipping installation of %s (namespace package)Fzcopying %s -> %s)warninforrdirnameappend)srcdst)excluder#rrr pfgs z!install_lib.copy_tree..pf) AssertionErrorrorigr copy_treeZsetuptools.archive_utilr"Z distutilsr#) rZinfileZoutfileZ preserve_modeZpreserve_timesZpreserve_symlinkslevelr"r+r)r*r#rr r.Vs   zinstall_lib.copy_treecs.tjj|}|jr*fdd|DS|S)Ncsg|]}|kr|qSrr)r f)r*rr xsz+install_lib.get_outputs..)r-r get_outputsr)rZoutputsr)r*r r2ts  zinstall_lib.get_outputsN)r!r!rr!) __name__ __module__ __qualname____doc__r rr staticmethodr rrr.r2rrrr rs   r) rr itertoolsrrZdistutils.command.install_libZcommandrr-rrrr s PK!8command/__pycache__/install_scripts.cpython-36.opt-1.pycnu[3 9f @sRddlmZddljjZddlZddlZddlm Z m Z m Z GdddejZdS))logN) Distribution PathMetadataensure_directoryc@s*eZdZdZddZddZd ddZd S) install_scriptsz;Do normal script install, plus any egg_info wrapper scriptscCstjj|d|_dS)NF)origrinitialize_optionsno_ep)selfr %/usr/lib/python3.6/install_scripts.pyr s z"install_scripts.initialize_optionsc Csddljj}|jd|jjr,tjj|ng|_ |j rs  PK!2command/__pycache__/install_scripts.cpython-36.pycnu[3 9f @sRddlmZddljjZddlZddlZddlm Z m Z m Z GdddejZdS))logN) Distribution PathMetadataensure_directoryc@s*eZdZdZddZddZd ddZd S) install_scriptsz;Do normal script install, plus any egg_info wrapper scriptscCstjj|d|_dS)NF)origrinitialize_optionsno_ep)selfr %/usr/lib/python3.6/install_scripts.pyr s z"install_scripts.initialize_optionsc Csddljj}|jd|jjr,tjj|ng|_ |j rs  PK!:K3command/__pycache__/py36compat.cpython-36.opt-1.pycnu[3 9fz@sdddlZddlmZddlmZddlmZddlmZGdddZe ejdr`Gd ddZdS) N)glob) convert_path)sdist)filterc@s\eZdZdZddZeddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS)sdist_add_defaultsz Mix-in providing forward-compatibility for functionality as found in distutils on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. Instead, override in the subclass. cCs<|j|j|j|j|j|j|jdS)a9Add all the default files to self.filelist: - README or README.txt - setup.py - test/test*.py - all pure Python modules mentioned in setup script - all files pointed by package_data (build_py) - all files defined in data_files. - all files defined as scripts. - all C sources listed as part of extensions or C libraries in the setup script (doesn't catch C headers!) Warns if (README or README.txt) or setup.py are missing; everything else is optional. N)_add_defaults_standards_add_defaults_optional_add_defaults_python_add_defaults_data_files_add_defaults_ext_add_defaults_c_libs_add_defaults_scripts)selfr /usr/lib/python3.6/py36compat.py add_defaultsszsdist_add_defaults.add_defaultscCs:tjj|sdStjj|}tjj|\}}|tj|kS)z Case-sensitive path existence check >>> sdist_add_defaults._cs_path_exists(__file__) True >>> sdist_add_defaults._cs_path_exists(__file__.upper()) False F)ospathexistsabspathsplitlistdir)fspathrZ directoryfilenamerrr_cs_path_exists(s  z"sdist_add_defaults._cs_path_existscCs|j|jjg}x|D]}t|trn|}d}x(|D] }|j|r0d}|jj|Pq0W|s|jddj |q|j|r|jj|q|jd|qWdS)NFTz,standard file not found: should have one of z, zstandard file '%s' not found) ZREADMES distributionZ script_name isinstancetuplerfilelistappendwarnjoin)rZ standardsfnZaltsZgot_itrrrr9s       z*sdist_add_defaults._add_defaults_standardscCs8ddg}x*|D]"}ttjjt|}|jj|qWdS)Nz test/test*.pyz setup.cfg)rrrisfilerrextend)rZoptionalpatternfilesrrrrNs z)sdist_add_defaults._add_defaults_optionalcCsd|jd}|jjr$|jj|jx:|jD]0\}}}}x"|D]}|jjtj j ||q>Wq,WdS)Nbuild_py) get_finalized_commandrZhas_pure_modulesrr$get_source_files data_filesrrrr!)rr'ZpkgZsrc_dirZ build_dir filenamesrrrrr Ts    z'sdist_add_defaults._add_defaults_pythoncCs|jjr~xr|jjD]f}t|trDt|}tjj|rz|j j |q|\}}x,|D]$}t|}tjj|rR|j j |qRWqWdS)N) rZhas_data_filesr*rstrrrrr#rr)ritemdirnamer+frrrr ds     z+sdist_add_defaults._add_defaults_data_filescCs(|jjr$|jd}|jj|jdS)N build_ext)rZhas_ext_modulesr(rr$r))rr0rrrr us  z$sdist_add_defaults._add_defaults_extcCs(|jjr$|jd}|jj|jdS)N build_clib)rZhas_c_librariesr(rr$r))rr1rrrr zs  z'sdist_add_defaults._add_defaults_c_libscCs(|jjr$|jd}|jj|jdS)N build_scripts)rZ has_scriptsr(rr$r))rr2rrrr s  z(sdist_add_defaults._add_defaults_scriptsN)__name__ __module__ __qualname____doc__r staticmethodrrrr r r r r rrrrr s rrc@s eZdZdS)rN)r3r4r5rrrrrs) rrZdistutils.utilrZdistutils.commandrZsetuptools.extern.six.movesrrhasattrrrrrs    | PK!:K-command/__pycache__/py36compat.cpython-36.pycnu[3 9fz@sdddlZddlmZddlmZddlmZddlmZGdddZe ejdr`Gd ddZdS) N)glob) convert_path)sdist)filterc@s\eZdZdZddZeddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS)sdist_add_defaultsz Mix-in providing forward-compatibility for functionality as found in distutils on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. Instead, override in the subclass. cCs<|j|j|j|j|j|j|jdS)a9Add all the default files to self.filelist: - README or README.txt - setup.py - test/test*.py - all pure Python modules mentioned in setup script - all files pointed by package_data (build_py) - all files defined in data_files. - all files defined as scripts. - all C sources listed as part of extensions or C libraries in the setup script (doesn't catch C headers!) Warns if (README or README.txt) or setup.py are missing; everything else is optional. N)_add_defaults_standards_add_defaults_optional_add_defaults_python_add_defaults_data_files_add_defaults_ext_add_defaults_c_libs_add_defaults_scripts)selfr /usr/lib/python3.6/py36compat.py add_defaultsszsdist_add_defaults.add_defaultscCs:tjj|sdStjj|}tjj|\}}|tj|kS)z Case-sensitive path existence check >>> sdist_add_defaults._cs_path_exists(__file__) True >>> sdist_add_defaults._cs_path_exists(__file__.upper()) False F)ospathexistsabspathsplitlistdir)fspathrZ directoryfilenamerrr_cs_path_exists(s  z"sdist_add_defaults._cs_path_existscCs|j|jjg}x|D]}t|trn|}d}x(|D] }|j|r0d}|jj|Pq0W|s|jddj |q|j|r|jj|q|jd|qWdS)NFTz,standard file not found: should have one of z, zstandard file '%s' not found) ZREADMES distributionZ script_name isinstancetuplerfilelistappendwarnjoin)rZ standardsfnZaltsZgot_itrrrr9s       z*sdist_add_defaults._add_defaults_standardscCs8ddg}x*|D]"}ttjjt|}|jj|qWdS)Nz test/test*.pyz setup.cfg)rrrisfilerrextend)rZoptionalpatternfilesrrrrNs z)sdist_add_defaults._add_defaults_optionalcCsd|jd}|jjr$|jj|jx:|jD]0\}}}}x"|D]}|jjtj j ||q>Wq,WdS)Nbuild_py) get_finalized_commandrZhas_pure_modulesrr$get_source_files data_filesrrrr!)rr'ZpkgZsrc_dirZ build_dir filenamesrrrrr Ts    z'sdist_add_defaults._add_defaults_pythoncCs|jjr~xr|jjD]f}t|trDt|}tjj|rz|j j |q|\}}x,|D]$}t|}tjj|rR|j j |qRWqWdS)N) rZhas_data_filesr*rstrrrrr#rr)ritemdirnamer+frrrr ds     z+sdist_add_defaults._add_defaults_data_filescCs(|jjr$|jd}|jj|jdS)N build_ext)rZhas_ext_modulesr(rr$r))rr0rrrr us  z$sdist_add_defaults._add_defaults_extcCs(|jjr$|jd}|jj|jdS)N build_clib)rZhas_c_librariesr(rr$r))rr1rrrr zs  z'sdist_add_defaults._add_defaults_c_libscCs(|jjr$|jd}|jj|jdS)N build_scripts)rZ has_scriptsr(rr$r))rr2rrrr s  z(sdist_add_defaults._add_defaults_scriptsN)__name__ __module__ __qualname____doc__r staticmethodrrrr r r r r rrrrr s rrc@s eZdZdS)rN)r3r4r5rrrrrs) rrZdistutils.utilrZdistutils.commandrZsetuptools.extern.six.movesrrhasattrrrrrs    | PK!@1command/__pycache__/register.cpython-36.opt-1.pycnu[3 9f@s"ddljjZGdddejZdS)Nc@seZdZejjZddZdS)registercCs|jdtjj|dS)NZegg_info)Z run_commandorigrrun)selfr/usr/lib/python3.6/register.pyrs z register.runN)__name__ __module__ __qualname__rr__doc__rrrrrrsr)Zdistutils.command.registerZcommandrrrrrrs PK!@+command/__pycache__/register.cpython-36.pycnu[3 9f@s"ddljjZGdddejZdS)Nc@seZdZejjZddZdS)registercCs|jdtjj|dS)NZegg_info)Z run_commandorigrrun)selfr/usr/lib/python3.6/register.pyrs z register.runN)__name__ __module__ __qualname__rr__doc__rrrrrrsr)Zdistutils.command.registerZcommandrrrrrrs PK!dh+ /command/__pycache__/rotate.cpython-36.opt-1.pycnu[3 9ft@s`ddlmZddlmZddlmZddlZddlZddlm Z ddl m Z Gddde Z dS) ) convert_path)log)DistutilsOptionErrorN)six)Commandc@s:eZdZdZdZdddgZgZd d ZddZddZ dS)rotatezDelete older distributionsz2delete older distributions, keeping N newest filesmatch=mpatterns to match (required) dist-dir=d%directory where the distributions arekeep=k(number of matching distributions to keepcCsd|_d|_d|_dS)N)matchdist_dirkeep)selfr/usr/lib/python3.6/rotate.pyinitialize_optionsszrotate.initialize_optionsc Cs|jdkrtd|jdkr$tdyt|j|_Wntk rPtdYnXt|jtjrxdd|jjdD|_|j dd dS) NzQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')z$Must specify number of files to keepz--keep must be an integercSsg|]}t|jqSr)rstrip).0prrr +sz+rotate.finalize_options..,Zbdistr)rr) rrrint ValueError isinstancerZ string_typessplitZset_undefined_options)rrrrfinalize_optionss  zrotate.finalize_optionscCs|jdddlm}x|jD]}|jjd|}|tjj|j|}dd|D}|j |j t j dt ||||jd}xD|D]<\}}t j d||jstjj|rtj|qtj|qWqWdS) NZegg_infor)glob*cSsg|]}tjj||fqSr)ospathgetmtime)rfrrrr6szrotate.run..z%d file(s) matching %sz Deleting %s)Z run_commandr"rZ distributionZget_namer$r%joinrsortreverserinfolenrZdry_runisdirshutilZrmtreeunlink)rr"patternfilestr'rrrrun/s       z rotate.runN)rr r )r r r )rrr) __name__ __module__ __qualname____doc__ descriptionZ user_optionsZboolean_optionsrr!r3rrrrr sr) Zdistutils.utilrZ distutilsrZdistutils.errorsrr$r.Zsetuptools.externrZ setuptoolsrrrrrrs     PK!dh+ )command/__pycache__/rotate.cpython-36.pycnu[3 9ft@s`ddlmZddlmZddlmZddlZddlZddlm Z ddl m Z Gddde Z dS) ) convert_path)log)DistutilsOptionErrorN)six)Commandc@s:eZdZdZdZdddgZgZd d ZddZddZ dS)rotatezDelete older distributionsz2delete older distributions, keeping N newest filesmatch=mpatterns to match (required) dist-dir=d%directory where the distributions arekeep=k(number of matching distributions to keepcCsd|_d|_d|_dS)N)matchdist_dirkeep)selfr/usr/lib/python3.6/rotate.pyinitialize_optionsszrotate.initialize_optionsc Cs|jdkrtd|jdkr$tdyt|j|_Wntk rPtdYnXt|jtjrxdd|jjdD|_|j dd dS) NzQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')z$Must specify number of files to keepz--keep must be an integercSsg|]}t|jqSr)rstrip).0prrr +sz+rotate.finalize_options..,Zbdistr)rr) rrrint ValueError isinstancerZ string_typessplitZset_undefined_options)rrrrfinalize_optionss  zrotate.finalize_optionscCs|jdddlm}x|jD]}|jjd|}|tjj|j|}dd|D}|j |j t j dt ||||jd}xD|D]<\}}t j d||jstjj|rtj|qtj|qWqWdS) NZegg_infor)glob*cSsg|]}tjj||fqSr)ospathgetmtime)rfrrrr6szrotate.run..z%d file(s) matching %sz Deleting %s)Z run_commandr"rZ distributionZget_namer$r%joinrsortreverserinfolenrZdry_runisdirshutilZrmtreeunlink)rr"patternfilestr'rrrrun/s       z rotate.runN)rr r )r r r )rrr) __name__ __module__ __qualname____doc__ descriptionZ user_optionsZboolean_optionsrr!r3rrrrr sr) Zdistutils.utilrZ distutilsrZdistutils.errorsrr$r.Zsetuptools.externrZ setuptoolsrrrrrrs     PK!)PP1command/__pycache__/saveopts.cpython-36.opt-1.pycnu[3 9f@s$ddlmZmZGdddeZdS)) edit_config option_basec@seZdZdZdZddZdS)saveoptsz#Save command-line options to a filez7save supplied options to setup.cfg or other config filecCsp|j}i}xP|jD]F}|dkr qx6|j|jD]$\}\}}|dkr0||j|i|<q0WqWt|j||jdS)Nrz command line)Z distributionZcommand_optionsZget_option_dictitems setdefaultrfilenameZdry_run)selfZdistZsettingscmdoptsrcvalr /usr/lib/python3.6/saveopts.pyrun s z saveopts.runN)__name__ __module__ __qualname____doc__ descriptionrr r r rrsrN)Zsetuptools.command.setoptrrrr r r rsPK!)PP+command/__pycache__/saveopts.cpython-36.pycnu[3 9f@s$ddlmZmZGdddeZdS)) edit_config option_basec@seZdZdZdZddZdS)saveoptsz#Save command-line options to a filez7save supplied options to setup.cfg or other config filecCsp|j}i}xP|jD]F}|dkr qx6|j|jD]$\}\}}|dkr0||j|i|<q0WqWt|j||jdS)Nrz command line)Z distributionZcommand_optionsZget_option_dictitems setdefaultrfilenameZdry_run)selfZdistZsettingscmdoptsrcvalr /usr/lib/python3.6/saveopts.pyrun s z saveopts.runN)__name__ __module__ __qualname____doc__ descriptionrr r r rrsrN)Zsetuptools.command.setoptrrrr r r rsPK!W.command/__pycache__/sdist.cpython-36.opt-1.pycnu[3 9f7@s~ddlmZddljjZddlZddlZddlZddl Z ddl m Z ddl m Z ddlZeZd ddZGd d d e ejZdS) )logN)six)sdist_add_defaultsccs4x.tjdD] }x|j|D] }|VqWq WdS)z%Find all files under revision controlzsetuptools.file_findersN) pkg_resourcesZiter_entry_pointsload)dirnameZepitemr /usr/lib/python3.6/sdist.py walk_revctrlsr cseZdZdZd0d2d3gZiZd d ddgZeddeDZddZ ddZ ddZ ddZ e ejddZddZejd4kpd5ejkod6knpd7ejkod8knZereZd$d%Zfd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZZS)9sdistz=Smart sdist that finds anything supported by revision controlformats=N6formats for source distribution (comma-separated list) keep-tempkz1keep the distribution tree around after creating zarchive file(s) dist-dir=dFdirectory to put the source distribution archive(s) in [default: dist]rz.rstz.txtz.mdccs|]}dj|VqdS)z README{0}N)format).0Zextr r r )szsdist.cCs|jd|jd}|j|_|jjtjj|jd|jx|j D]}|j|qFW|j t |j dg}x*|j D] }dd|f}||krv|j|qvWdS)Negg_infoz SOURCES.txt dist_filesrr)Z run_commandget_finalized_commandfilelistappendospathjoinr check_readmeZget_sub_commandsmake_distributiongetattr distributionZ archive_files)selfZei_cmdZcmd_namerfiledatar r r run+s    z sdist.runcCstjj||jdS)N)origrinitialize_options_default_to_gztar)r%r r r r*>s zsdist.initialize_optionscCstjdkrdSdg|_dS)NrbetarZgztar)r,r-rr.r)sys version_infoZformats)r%r r r r+Cs zsdist._default_to_gztarc Cs$|jtjj|WdQRXdS)z% Workaround for #516 N)_remove_os_linkr)rr")r%r r r r"Is zsdist.make_distributionccs^Gddd}ttd|}yt`Wntk r6YnXz dVWd||k rXttd|XdS)zG In a context, remove and restore os.link if it exists c@s eZdZdS)z&sdist._remove_os_link..NoValueN)__name__ __module__ __qualname__r r r r NoValueWsr5linkN)r#rr6 Exceptionsetattr)r5Zorig_valr r r r1Ps  zsdist._remove_os_linkc CsLytjj|Wn6tk rFtj\}}}|jjjdj YnXdS)Ntemplate) r)r read_templater7r/exc_infotb_nexttb_framef_localsclose)r%_tbr r r Z__read_template_hackes zsdist.__read_template_hackr,rrcsb|jjr^|jd}|jj|j|jjs^x0|jD]&\}}}|jjfdd|Dq4WdS)zgetting python filesbuild_pycsg|]}tjj|qSr )rrr )rfilename)src_dirr r sz.sdist._add_defaults_python..N)r$Zhas_pure_modulesrrextendZget_source_filesZinclude_package_dataZ data_files)r%rEr@ filenamesr )rGr _add_defaults_python|s  zsdist._add_defaults_pythonc sDy tjrtj|n tjWntk r>tjdYnXdS)Nz&data_files contains unexpected objects)rZPY2r_add_defaults_data_filessuper TypeErrorrwarn)r%) __class__r r rLs  zsdist._add_defaults_data_filescCs:x4|jD]}tjj|rdSqW|jddj|jdS)Nz,standard file not found: should have one of z, )READMESrrexistsrOr )r%fr r r r!s   zsdist.check_readmecCs^tjj|||tjj|d}ttdrJtjj|rJtj||j d||j dj |dS)Nz setup.cfgr6r) r)rmake_release_treerrr hasattrrRunlinkZ copy_filerZsave_version_info)r%Zbase_dirfilesdestr r r rTs   zsdist.make_release_treec Cs@tjj|jsdStj|jd}|j}WdQRX|djkS)NFrbz+# file GENERATED by distutils, do NOT edit )rrisfilemanifestioopenreadlineencode)r%fpZ first_liner r r _manifest_is_not_generateds z sdist._manifest_is_not_generatedc Cstjd|jt|jd}xl|D]d}tjr^y|jd}Wn$tk r\tjd|w YnX|j }|j ds | rxq |j j |q W|j dS)zRead the manifest file (named by 'self.manifest') and use it to fill in 'self.filelist', the list of files to include in the source distribution. zreading manifest file '%s'rYzUTF-8z"%r not UTF-8 decodable -- skipping#N)rinfor[r]rZPY3decodeUnicodeDecodeErrorrOstrip startswithrrr?)r%r[liner r r read_manifests  zsdist.read_manifest)rNr@keep the distribution tree around after creating archive file(s))rrrj)rrr)rBrCrB)r,r)r,rrD)r,rB)r,rBr)r2r3r4__doc__Z user_optionsZ negative_optZREADME_EXTENSIONStuplerQr(r*r+r" staticmethod contextlibcontextmanagerr1Z_sdist__read_template_hackr/r0Zhas_leaky_handler:rKrLr!rTrari __classcell__r r )rPr rs:      r)r)Z distutilsrZdistutils.command.sdistZcommandrr)rr/r\rnZsetuptools.externrZ py36compatrrlistZ_default_revctrlr r r r r s     PK!W(command/__pycache__/sdist.cpython-36.pycnu[3 9f7@s~ddlmZddljjZddlZddlZddlZddl Z ddl m Z ddl m Z ddlZeZd ddZGd d d e ejZdS) )logN)six)sdist_add_defaultsccs4x.tjdD] }x|j|D] }|VqWq WdS)z%Find all files under revision controlzsetuptools.file_findersN) pkg_resourcesZiter_entry_pointsload)dirnameZepitemr /usr/lib/python3.6/sdist.py walk_revctrlsr cseZdZdZd0d2d3gZiZd d ddgZeddeDZddZ ddZ ddZ ddZ e ejddZddZejd4kpd5ejkod6knpd7ejkod8knZereZd$d%Zfd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZZS)9sdistz=Smart sdist that finds anything supported by revision controlformats=N6formats for source distribution (comma-separated list) keep-tempkz1keep the distribution tree around after creating zarchive file(s) dist-dir=dFdirectory to put the source distribution archive(s) in [default: dist]rz.rstz.txtz.mdccs|]}dj|VqdS)z README{0}N)format).0Zextr r r )szsdist.cCs|jd|jd}|j|_|jjtjj|jd|jx|j D]}|j|qFW|j t |j dg}x*|j D] }dd|f}||krv|j|qvWdS)Negg_infoz SOURCES.txt dist_filesrr)Z run_commandget_finalized_commandfilelistappendospathjoinr check_readmeZget_sub_commandsmake_distributiongetattr distributionZ archive_files)selfZei_cmdZcmd_namerfiledatar r r run+s    z sdist.runcCstjj||jdS)N)origrinitialize_options_default_to_gztar)r%r r r r*>s zsdist.initialize_optionscCstjdkrdSdg|_dS)NrbetarZgztar)r,r-rr.r)sys version_infoZformats)r%r r r r+Cs zsdist._default_to_gztarc Cs$|jtjj|WdQRXdS)z% Workaround for #516 N)_remove_os_linkr)rr")r%r r r r"Is zsdist.make_distributionccs^Gddd}ttd|}yt`Wntk r6YnXz dVWd||k rXttd|XdS)zG In a context, remove and restore os.link if it exists c@s eZdZdS)z&sdist._remove_os_link..NoValueN)__name__ __module__ __qualname__r r r r NoValueWsr5linkN)r#rr6 Exceptionsetattr)r5Zorig_valr r r r1Ps  zsdist._remove_os_linkc CsLytjj|Wn6tk rFtj\}}}|jjjdj YnXdS)Ntemplate) r)r read_templater7r/exc_infotb_nexttb_framef_localsclose)r%_tbr r r Z__read_template_hackes zsdist.__read_template_hackr,rrcsb|jjr^|jd}|jj|j|jjs^x0|jD]&\}}}|jjfdd|Dq4WdS)zgetting python filesbuild_pycsg|]}tjj|qSr )rrr )rfilename)src_dirr r sz.sdist._add_defaults_python..N)r$Zhas_pure_modulesrrextendZget_source_filesZinclude_package_dataZ data_files)r%rEr@ filenamesr )rGr _add_defaults_python|s  zsdist._add_defaults_pythonc sDy tjrtj|n tjWntk r>tjdYnXdS)Nz&data_files contains unexpected objects)rZPY2r_add_defaults_data_filessuper TypeErrorrwarn)r%) __class__r r rLs  zsdist._add_defaults_data_filescCs:x4|jD]}tjj|rdSqW|jddj|jdS)Nz,standard file not found: should have one of z, )READMESrrexistsrOr )r%fr r r r!s   zsdist.check_readmecCs^tjj|||tjj|d}ttdrJtjj|rJtj||j d||j dj |dS)Nz setup.cfgr6r) r)rmake_release_treerrr hasattrrRunlinkZ copy_filerZsave_version_info)r%Zbase_dirfilesdestr r r rTs   zsdist.make_release_treec Cs@tjj|jsdStj|jd}|j}WdQRX|djkS)NFrbz+# file GENERATED by distutils, do NOT edit )rrisfilemanifestioopenreadlineencode)r%fpZ first_liner r r _manifest_is_not_generateds z sdist._manifest_is_not_generatedc Cstjd|jt|jd}xl|D]d}tjr^y|jd}Wn$tk r\tjd|w YnX|j }|j ds | rxq |j j |q W|j dS)zRead the manifest file (named by 'self.manifest') and use it to fill in 'self.filelist', the list of files to include in the source distribution. zreading manifest file '%s'rYzUTF-8z"%r not UTF-8 decodable -- skipping#N)rinfor[r]rZPY3decodeUnicodeDecodeErrorrOstrip startswithrrr?)r%r[liner r r read_manifests  zsdist.read_manifest)rNr@keep the distribution tree around after creating archive file(s))rrrj)rrr)rBrCrB)r,r)r,rrD)r,rB)r,rBr)r2r3r4__doc__Z user_optionsZ negative_optZREADME_EXTENSIONStuplerQr(r*r+r" staticmethod contextlibcontextmanagerr1Z_sdist__read_template_hackr/r0Zhas_leaky_handler:rKrLr!rTrari __classcell__r r )rPr rs:      r)r)Z distutilsrZdistutils.command.sdistZcommandrr)rr/r\rnZsetuptools.externrZ py36compatrrlistZ_default_revctrlr r r r r s     PK!ۈi/command/__pycache__/setopt.cpython-36.opt-1.pycnu[3 9f@sddlmZddlmZddlmZddlZddlZddlmZddl m Z ddd d gZ dd dZ dddZ Gdd d e ZGdd d eZdS)) convert_path)log)DistutilsOptionErrorN) configparser)Command config_file edit_config option_basesetoptlocalcCsh|dkr dS|dkr,tjjtjjtjdS|dkrZtjdkrBdpDd}tjjtd |St d |d S) zGet the filename of the distutils, local, global, or per-user config `kind` must be one of "local", "global", or "user" r z setup.cfgglobalz distutils.cfguserposix.z~/%spydistutils.cfgz7config_file() type must be 'local', 'global', or 'user'N) ospathjoindirname distutils__file__name expanduserr ValueError)Zkinddotr/usr/lib/python3.6/setopt.pyrsFc Cs.tjd|tj}|j|gx|jD]\}}|dkrTtjd|||j|q*|j|svtjd|||j |x||jD]p\}}|dkrtjd||||j |||j |stjd|||j|qtjd|||||j |||qWq*Wtjd||s*t |d }|j|WdQRXdS) aYEdit a configuration file to include `settings` `settings` is a dictionary of dictionaries or ``None`` values, keyed by command/section name. A ``None`` value means to delete the entire section, while a dictionary lists settings to be changed or deleted in that section. A setting of ``None`` means to delete that setting. zReading configuration from %sNzDeleting section [%s] from %szAdding new section [%s] to %szDeleting %s.%s from %sz#Deleting empty [%s] section from %szSetting %s.%s to %r in %sz Writing %sw)rdebugrZRawConfigParserreaditemsinfoZremove_sectionZ has_sectionZ add_sectionZ remove_optionoptionssetopenwrite) filenameZsettingsdry_runZoptsZsectionr"optionvaluefrrrr!s8            c@s2eZdZdZdddgZddgZd d Zd dZdS)r zr? descriptionr r@rAr6r;rSrrrrr ss )r )F)Zdistutils.utilrrrZdistutils.errorsrrZsetuptools.extern.six.movesrZ setuptoolsr__all__rrr r rrrrs        +'PK!ۈi)command/__pycache__/setopt.cpython-36.pycnu[3 9f@sddlmZddlmZddlmZddlZddlZddlmZddl m Z ddd d gZ dd dZ dddZ Gdd d e ZGdd d eZdS)) convert_path)log)DistutilsOptionErrorN) configparser)Command config_file edit_config option_basesetoptlocalcCsh|dkr dS|dkr,tjjtjjtjdS|dkrZtjdkrBdpDd}tjjtd |St d |d S) zGet the filename of the distutils, local, global, or per-user config `kind` must be one of "local", "global", or "user" r z setup.cfgglobalz distutils.cfguserposix.z~/%spydistutils.cfgz7config_file() type must be 'local', 'global', or 'user'N) ospathjoindirname distutils__file__name expanduserr ValueError)Zkinddotr/usr/lib/python3.6/setopt.pyrsFc Cs.tjd|tj}|j|gx|jD]\}}|dkrTtjd|||j|q*|j|svtjd|||j |x||jD]p\}}|dkrtjd||||j |||j |stjd|||j|qtjd|||||j |||qWq*Wtjd||s*t |d }|j|WdQRXdS) aYEdit a configuration file to include `settings` `settings` is a dictionary of dictionaries or ``None`` values, keyed by command/section name. A ``None`` value means to delete the entire section, while a dictionary lists settings to be changed or deleted in that section. A setting of ``None`` means to delete that setting. zReading configuration from %sNzDeleting section [%s] from %szAdding new section [%s] to %szDeleting %s.%s from %sz#Deleting empty [%s] section from %szSetting %s.%s to %r in %sz Writing %sw)rdebugrZRawConfigParserreaditemsinfoZremove_sectionZ has_sectionZ add_sectionZ remove_optionoptionssetopenwrite) filenameZsettingsdry_runZoptsZsectionr"optionvaluefrrrr!s8            c@s2eZdZdZdddgZddgZd d Zd dZdS)r zr? descriptionr r@rAr6r;rSrrrrr ss )r )F)Zdistutils.utilrrrZdistutils.errorsrrZsetuptools.extern.six.movesrZ setuptoolsr__all__rrr r rrrrs        +'PK!Ȍ$-command/__pycache__/test.cpython-36.opt-1.pycnu[3 9f#@sddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddlm Z ddl m Z ddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZGd d d e ZGd d d eZGd ddeZ dS)N)DistutilsErrorDistutilsOptionError)log) TestLoader)six)mapfilter) resource_listdirresource_existsnormalize_path working_set_namespace_packagesevaluate_markeradd_activation_listenerrequire EntryPoint)Commandc@seZdZddZdddZdS)ScanningLoadercCstj|t|_dS)N)r__init__set_visited)selfr/usr/lib/python3.6/test.pyrs zScanningLoader.__init__NcCs||jkrdS|jj|g}|jtj||t|drH|j|jt|drxpt|jdD]`}|j dr|dkr|jd|dd }n"t |j|d r`|jd|}nq`|j|j |q`Wt |d kr|j |S|d SdS) aReturn a suite of all tests cases contained in the given module If the module is a package, load tests from all the modules in it. If the module has an ``additional_tests`` function, call it and add the return value to the tests. Nadditional_tests__path__z.pyz __init__.py.z /__init__.pyr)raddappendrloadTestsFromModulehasattrrr __name__endswithr ZloadTestsFromNamelenZ suiteClass)rmodulepatternZtestsfileZ submodulerrrr#s$      z"ScanningLoader.loadTestsFromModule)N)r% __module__ __qualname__rr#rrrrrsrc@seZdZddZdddZdS)NonDataPropertycCs ||_dS)N)fget)rr.rrrr>szNonDataProperty.__init__NcCs|dkr |S|j|S)N)r.)robjZobjtyperrr__get__AszNonDataProperty.__get__)N)r%r+r,rr0rrrrr-=sr-c@seZdZdZdZd%d&d'gZd d ZddZeddZ ddZ ddZ e j gfddZee j ddZeddZddZddZed d!Zed"d#Zd$S)(testz.Command to run unit tests after in-place buildz#run unit tests after in-place build test-module=m$Run 'test_suite' in specified module test-suite=s9Run single test, case or suite (e.g. 'module.test_suite') test-runner=rTest runner to usecCsd|_d|_d|_d|_dS)N) test_suite test_module test_loader test_runner)rrrrinitialize_optionsSsztest.initialize_optionscCs|jr|jrd}t||jdkrD|jdkr8|jj|_n |jd|_|jdkr^t|jdd|_|jdkrnd|_|jdkrt|jdd|_dS)Nz1You may specify a module or a suite, but not bothz .test_suiter=z&setuptools.command.test:ScanningLoaderr>)r;r<r distributionr=getattrr>)rmsgrrrfinalize_optionsYs        ztest.finalize_optionscCs t|jS)N)list _test_args)rrrr test_argslsztest.test_argsccs6|j rtjdkrdV|jr$dV|jr2|jVdS)NZdiscoverz --verbose)rGrH)r;sys version_infoverbose)rrrrrEps ztest._test_argsc Cs|j |WdQRXdS)zI Backward compatibility for project_on_sys_path context. N)project_on_sys_path)rfuncrrrwith_project_on_sys_pathxs ztest.with_project_on_sys_pathc csPtjot|jdd}|rv|jddd|jd|jd}t|j}|jd|d|jd|jddd|jdn"|jd|jdd d|jd|jd}t j dd}t j j }zbt|j }t j jd|tjtd d td |j|jf|j|g dVWdQRXWd|t j dd<t j jt j j|tjXdS) Nuse_2to3FZbuild_pyr)ZinplaceZegg_info)egg_baseZ build_extrcSs|jS)N)Zactivate)distrrrsz*test.project_on_sys_path..z%s==%s)rPY3rAr@Zreinitialize_commandZ run_commandZget_finalized_commandr Z build_librIpathmodulescopyrPinsertr rrrZegg_nameZ egg_versionpaths_on_pythonpathclearupdate) rZ include_distsZ with_2to3Zbpy_cmdZ build_pathZei_cmdZold_pathZ old_modulesZ project_pathrrrrLs8             ztest.project_on_sys_pathc cst}tjjd|}tjjdd}z>tjj|}td||g}tjj|}|rX|tjd<dVWd||krztjjddn |tjd<XdS)z Add the indicated paths to the head of the PYTHONPATH environment variable so that subprocesses will also see the packages at these paths. Do this in a context that restores the value on exit. PYTHONPATHrN)objectosenvirongetpathsepjoinrpop)pathsZnothingZorig_pythonpathZcurrent_pythonpathprefixZto_joinnew_pathrrrrXs     ztest.paths_on_pythonpathcCsD|j|j}|j|jpg}|jdd|jjD}tj|||S)z Install the requirements indicated by self.distribution and return an iterable of the dists that were built. css0|](\}}|jdrt|ddr|VqdS):rN) startswithr).0kvrrr sz%test.install_dists..)Zfetch_build_eggsZinstall_requiresZ tests_requireZextras_requireitems itertoolschain)rQZir_dZtr_dZer_drrr install_distss  ztest.install_distscCs|j|j}dj|j}|jr0|jd|dS|jd|ttjd|}|j |"|j |j WdQRXWdQRXdS)N zskipping "%s" (dry run)z running "%s"location) ror@ra_argvZdry_runannounceroperator attrgetterrXrL run_tests)rZinstalled_distscmdrcrrrruns    ztest.runcCstjrt|jddr|jjdd}|tkrg}|tjkrD|j ||d7}x"tjD]}|j |rT|j |qTWt t tjj |tjdd|j|j|j|j|jdd}|jjsd|j}|j|tjt|dS)NrOFrr)Z testLoaderZ testRunnerexitzTest failed: %s)rrSrAr@r;splitr rIrUr"rgrDr __delitem__unittestmainrr_resolve_as_epr=r>resultZ wasSuccessfulrsrZERRORr)rr(Z del_modulesnamer1rBrrrrvs(        ztest.run_testscCs dg|jS)Nr|)rF)rrrrrrsz test._argvcCs$|dkr dStjd|}|jS)zu Load the indicated attribute value, called, as a as if it were specified as an entry point. Nzx=)rparseZresolve)valZparsedrrrr~sztest._resolve_as_epN)r2r3r4)r5r6r7)r8r9r:)r%r+r,__doc__ descriptionZ user_optionsr?rCr-rFrErN contextlibcontextmanagerrL staticmethodrXrorxrvpropertyrrr~rrrrr1Gs( -  r1)!r]rtrIrrmr|Zdistutils.errorsrrZ distutilsrrZsetuptools.externrZsetuptools.extern.six.movesrrZ pkg_resourcesr r r r r rrrrZ setuptoolsrrr\r-r1rrrrs   , ) PK!Ȍ$'command/__pycache__/test.cpython-36.pycnu[3 9f#@sddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddlm Z ddl m Z ddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZGd d d e ZGd d d eZGd ddeZ dS)N)DistutilsErrorDistutilsOptionError)log) TestLoader)six)mapfilter) resource_listdirresource_existsnormalize_path working_set_namespace_packagesevaluate_markeradd_activation_listenerrequire EntryPoint)Commandc@seZdZddZdddZdS)ScanningLoadercCstj|t|_dS)N)r__init__set_visited)selfr/usr/lib/python3.6/test.pyrs zScanningLoader.__init__NcCs||jkrdS|jj|g}|jtj||t|drH|j|jt|drxpt|jdD]`}|j dr|dkr|jd|dd }n"t |j|d r`|jd|}nq`|j|j |q`Wt |d kr|j |S|d SdS) aReturn a suite of all tests cases contained in the given module If the module is a package, load tests from all the modules in it. If the module has an ``additional_tests`` function, call it and add the return value to the tests. Nadditional_tests__path__z.pyz __init__.py.z /__init__.pyr)raddappendrloadTestsFromModulehasattrrr __name__endswithr ZloadTestsFromNamelenZ suiteClass)rmodulepatternZtestsfileZ submodulerrrr#s$      z"ScanningLoader.loadTestsFromModule)N)r% __module__ __qualname__rr#rrrrrsrc@seZdZddZdddZdS)NonDataPropertycCs ||_dS)N)fget)rr.rrrr>szNonDataProperty.__init__NcCs|dkr |S|j|S)N)r.)robjZobjtyperrr__get__AszNonDataProperty.__get__)N)r%r+r,rr0rrrrr-=sr-c@seZdZdZdZd%d&d'gZd d ZddZeddZ ddZ ddZ e j gfddZee j ddZeddZddZddZed d!Zed"d#Zd$S)(testz.Command to run unit tests after in-place buildz#run unit tests after in-place build test-module=m$Run 'test_suite' in specified module test-suite=s9Run single test, case or suite (e.g. 'module.test_suite') test-runner=rTest runner to usecCsd|_d|_d|_d|_dS)N) test_suite test_module test_loader test_runner)rrrrinitialize_optionsSsztest.initialize_optionscCs|jr|jrd}t||jdkrD|jdkr8|jj|_n |jd|_|jdkr^t|jdd|_|jdkrnd|_|jdkrt|jdd|_dS)Nz1You may specify a module or a suite, but not bothz .test_suiter=z&setuptools.command.test:ScanningLoaderr>)r;r<r distributionr=getattrr>)rmsgrrrfinalize_optionsYs        ztest.finalize_optionscCs t|jS)N)list _test_args)rrrr test_argslsztest.test_argsccs6|j rtjdkrdV|jr$dV|jr2|jVdS)NZdiscoverz --verbose)rGrH)r;sys version_infoverbose)rrrrrEps ztest._test_argsc Cs|j |WdQRXdS)zI Backward compatibility for project_on_sys_path context. N)project_on_sys_path)rfuncrrrwith_project_on_sys_pathxs ztest.with_project_on_sys_pathc csPtjot|jdd}|rv|jddd|jd|jd}t|j}|jd|d|jd|jddd|jdn"|jd|jdd d|jd|jd}t j dd}t j j }zbt|j }t j jd|tjtd d td |j|jf|j|g dVWdQRXWd|t j dd<t j jt j j|tjXdS) Nuse_2to3FZbuild_pyr)ZinplaceZegg_info)egg_baseZ build_extrcSs|jS)N)Zactivate)distrrrsz*test.project_on_sys_path..z%s==%s)rPY3rAr@Zreinitialize_commandZ run_commandZget_finalized_commandr Z build_librIpathmodulescopyrPinsertr rrrZegg_nameZ egg_versionpaths_on_pythonpathclearupdate) rZ include_distsZ with_2to3Zbpy_cmdZ build_pathZei_cmdZold_pathZ old_modulesZ project_pathrrrrLs8             ztest.project_on_sys_pathc cst}tjjd|}tjjdd}z>tjj|}td||g}tjj|}|rX|tjd<dVWd||krztjjddn |tjd<XdS)z Add the indicated paths to the head of the PYTHONPATH environment variable so that subprocesses will also see the packages at these paths. Do this in a context that restores the value on exit. PYTHONPATHrN)objectosenvirongetpathsepjoinrpop)pathsZnothingZorig_pythonpathZcurrent_pythonpathprefixZto_joinnew_pathrrrrXs     ztest.paths_on_pythonpathcCsD|j|j}|j|jpg}|jdd|jjD}tj|||S)z Install the requirements indicated by self.distribution and return an iterable of the dists that were built. css0|](\}}|jdrt|ddr|VqdS):rN) startswithr).0kvrrr sz%test.install_dists..)Zfetch_build_eggsZinstall_requiresZ tests_requireZextras_requireitems itertoolschain)rQZir_dZtr_dZer_drrr install_distss  ztest.install_distscCs|j|j}dj|j}|jr0|jd|dS|jd|ttjd|}|j |"|j |j WdQRXWdQRXdS)N zskipping "%s" (dry run)z running "%s"location) ror@ra_argvZdry_runannounceroperator attrgetterrXrL run_tests)rZinstalled_distscmdrcrrrruns    ztest.runcCstjrt|jddr|jjdd}|tkrg}|tjkrD|j ||d7}x"tjD]}|j |rT|j |qTWt t tjj |tjdd|j|j|j|j|jdd}|jjsd|j}|j|tjt|dS)NrOFrr)Z testLoaderZ testRunnerexitzTest failed: %s)rrSrAr@r;splitr rIrUr"rgrDr __delitem__unittestmainrr_resolve_as_epr=r>resultZ wasSuccessfulrsrZERRORr)rr(Z del_modulesnamer1rBrrrrvs(        ztest.run_testscCs dg|jS)Nr|)rF)rrrrrrsz test._argvcCs$|dkr dStjd|}|jS)zu Load the indicated attribute value, called, as a as if it were specified as an entry point. Nzx=)rparseZresolve)valZparsedrrrr~sztest._resolve_as_epN)r2r3r4)r5r6r7)r8r9r:)r%r+r,__doc__ descriptionZ user_optionsr?rCr-rFrErN contextlibcontextmanagerrL staticmethodrXrorxrvpropertyrrr~rrrrr1Gs( -  r1)!r]rtrIrrmr|Zdistutils.errorsrrZ distutilsrrZsetuptools.externrZsetuptools.extern.six.movesrrZ pkg_resourcesr r r r r rrrrZ setuptoolsrrr\r-r1rrrrs   , ) PK!iu##/command/__pycache__/upload.cpython-36.opt-1.pycnu[3 9f@s*ddlZddlmZGdddejZdS)N)uploadc@s(eZdZdZddZddZddZdS) rza Override default upload behavior to obtain password in a variety of different ways. cCs8tjj||jptj|_|jp0|jp0|j|_dS)N) origrfinalize_optionsusernamegetpassZgetuserZpassword_load_password_from_keyring_prompt_for_password)selfr /usr/lib/python3.6/upload.pyr s   zupload.finalize_optionsc Cs2ytd}|j|j|jStk r,YnXdS)zM Attempt to load password from keyring. Suppress Exceptions. keyringN) __import__Z get_passwordZ repositoryr Exception)r r r r r rs z"upload._load_password_from_keyringc Cs&ytjSttfk r YnXdS)zH Prompt for a password on the tty. Suppress Exceptions. N)rrKeyboardInterrupt)r r r r r#szupload._prompt_for_passwordN)__name__ __module__ __qualname____doc__rrrr r r r rs r)rZdistutils.commandrrr r r r s PK!iu##)command/__pycache__/upload.cpython-36.pycnu[3 9f@s*ddlZddlmZGdddejZdS)N)uploadc@s(eZdZdZddZddZddZdS) rza Override default upload behavior to obtain password in a variety of different ways. cCs8tjj||jptj|_|jp0|jp0|j|_dS)N) origrfinalize_optionsusernamegetpassZgetuserZpassword_load_password_from_keyring_prompt_for_password)selfr /usr/lib/python3.6/upload.pyr s   zupload.finalize_optionsc Cs2ytd}|j|j|jStk r,YnXdS)zM Attempt to load password from keyring. Suppress Exceptions. keyringN) __import__Z get_passwordZ repositoryr Exception)r r r r r rs z"upload._load_password_from_keyringc Cs&ytjSttfk r YnXdS)zH Prompt for a password on the tty. Suppress Exceptions. N)rrKeyboardInterrupt)r r r r r#szupload._prompt_for_passwordN)__name__ __module__ __qualname____doc__rrrr r r r rs r)rZdistutils.commandrrr r r r s PK!Ppp4command/__pycache__/upload_docs.cpython-36.opt-1.pycnu[3 9f@sdZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZddlmZd d lmZd d ZGd ddeZdS)zpupload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). )standard_b64encode)log)DistutilsOptionErrorN)six) http_clienturllib)iter_entry_points)uploadcCstjr dnd}|jd|S)Nsurrogateescapestrictzutf-8)rPY3encode)serrorsr!/usr/lib/python3.6/upload_docs.py_encodesrc@seZdZdZdZdddejfddgZejZd d Zd efgZ ddZ ddZ ddZ ddZ eddZeddZddZdS) upload_docszhttps://pypi.python.org/pypi/zUpload documentation to PyPIz repository=rzurl of repository [default: %s] show-responseN&display full response text from server upload-dir=directory to uploadcCs$|jdkr xtddD]}dSWdS)Nzdistutils.commands build_sphinxT) upload_dirr)selfZeprrr has_sphinx/s zupload_docs.has_sphinxrcCstj|d|_d|_dS)N)r initialize_optionsr target_dir)rrrrr6s zupload_docs.initialize_optionscCstj||jdkrN|jr0|jd}|j|_q`|jd}tjj |j d|_n|j d|j|_d|j krtt jd|jd|jdS)NrbuildZdocsrzpypi.python.orgz3Upload_docs command is deprecated. Use RTD instead.zUsing upload directory %s)r finalize_optionsrrZget_finalized_commandZbuilder_target_dirrospathjoinZ build_baseZensure_dirname repositoryrwarnannounce)rrr rrrr!;s        zupload_docs.finalize_optionsc Cstj|d}z|j|jxtj|jD]~\}}}||jkrT| rTd}t||jxP|D]H}tjj||}|t |jdj tjj } tjj| |} |j || qZWq(WWd|j XdS)Nwz'no files found in upload directory '%s')zipfileZZipFileZmkpathrr"walkrr#r$lenlstripsepwriteclose) rfilenamezip_filerootdirsfilesZtmplnameZfullZrelativedestrrrcreate_zipfileKs   zupload_docs.create_zipfilec Cslx|jD]}|j|q Wtj}|jjj}tjj |d|}z|j ||j |Wdt j |XdS)Nz%s.zip)Zget_sub_commandsZ run_commandtempfileZmkdtemp distributionmetadataget_namer"r#r$r7 upload_fileshutilZrmtree)rZcmd_nameZtmp_dirr5r1rrrrun[s  zupload_docs.runccs|\}}d|}t|ts |g}xn|D]f}t|trN|d|d7}|d}nt|}|Vt|VdV|V|r&|dddkr&dVq&WdS) Nz* Content-Disposition: form-data; name="%s"z; filename="%s"rr s   ) isinstancelisttupler)item sep_boundarykeyvaluestitlevaluerrr _build_partis     zupload_docs._build_partc Csnd}d|}|d}|df}tj|j|d}t||j}tjj|}tj||} d|jd} dj | | fS) z= Build up the MIME payload for the POST data s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s--r@)rFz multipart/form-data; boundary=%sascii) functoolspartialrKmapitems itertoolschain from_iterabledecoder$) clsdataboundaryrFZ end_boundaryZ end_itemsZbuilderZ part_groupspartsZ body_items content_typerrr_build_multipart}s  zupload_docs._build_multipartcCs:t|d}|j}WdQRX|jj}d|jtjj||fd}t|j d|j }t |}t j rn|jd}d|}|j|\}} d|j} |j| tjtjj|j\} } } }}}| dkrtj| }n | d krtj| }n td | d }yZ|j|jd | | }|jd ||jdtt||jd||j |j!|Wn6t"j#k r~}z|jt|tj$dSd}~XnX|j%}|j&dkrd|j&|j'f} |j| tjnb|j&dkr|j(d}|dkrd|j}d|} |j| tjnd|j&|j'f} |j| tj$|j)r6t*dd|jdddS)NrbZ doc_upload)z:actionr5content:rLzBasic zSubmitting documentation to %sZhttpZhttpszunsupported schema ZPOSTz Content-typezContent-lengthZ AuthorizationzServer response (%s): %si-ZLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %s-K)+openreadr9r:r;r"r#basenamerZusernameZpasswordrrr rUr[r%r'rINFOrparseZurlparserZHTTPConnectionZHTTPSConnectionAssertionErrorZconnectZ putrequestZ putheaderstrr+Z endheaderssendsocketerrorZERRORZ getresponseZstatusreasonZ getheaderZ show_responseprint)rr0fr]metarWZ credentialsZauthZbodyZctmsgZschemaZnetlocZurlZparamsZqueryZ fragmentsZconnrZerlocationrrrr<s^              zupload_docs.upload_file)rNr)rNr)__name__ __module__ __qualname__ZDEFAULT_REPOSITORY descriptionr Z user_optionsZboolean_optionsrZ sub_commandsrr!r7r> staticmethodrK classmethodr[r<rrrrrs"    r)__doc__base64rZ distutilsrZdistutils.errorsrr"rkr)r8r=rRrNZsetuptools.externrZsetuptools.extern.six.movesrrZ pkg_resourcesrr rrrrrrs       PK!.command/__pycache__/upload_docs.cpython-36.pycnu[3 9f@sdZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZddlmZd d lmZd d ZGd ddeZdS)zpupload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). )standard_b64encode)log)DistutilsOptionErrorN)six) http_clienturllib)iter_entry_points)uploadcCstjr dnd}|jd|S)Nsurrogateescapestrictzutf-8)rPY3encode)serrorsr!/usr/lib/python3.6/upload_docs.py_encodesrc@seZdZdZdZdddejfddgZejZd d Zd efgZ ddZ ddZ ddZ ddZ eddZeddZddZdS) upload_docszhttps://pypi.python.org/pypi/zUpload documentation to PyPIz repository=rzurl of repository [default: %s] show-responseN&display full response text from server upload-dir=directory to uploadcCs$|jdkr xtddD]}dSWdS)Nzdistutils.commands build_sphinxT) upload_dirr)selfZeprrr has_sphinx/s zupload_docs.has_sphinxrcCstj|d|_d|_dS)N)r initialize_optionsr target_dir)rrrrr6s zupload_docs.initialize_optionscCstj||jdkrN|jr0|jd}|j|_q`|jd}tjj |j d|_n|j d|j|_d|j krtt jd|jd|jdS)NrbuildZdocsrzpypi.python.orgz3Upload_docs command is deprecated. Use RTD instead.zUsing upload directory %s)r finalize_optionsrrZget_finalized_commandZbuilder_target_dirrospathjoinZ build_baseZensure_dirname repositoryrwarnannounce)rrr rrrr!;s        zupload_docs.finalize_optionsc Cstj|d}z|j|jxtj|jD]~\}}}||jkrT| rTd}t||jxP|D]H}tjj||}|t |jdj tjj } tjj| |} |j || qZWq(WWd|j XdS)Nwz'no files found in upload directory '%s')zipfileZZipFileZmkpathrr"walkrr#r$lenlstripsepwriteclose) rfilenamezip_filerootdirsfilesZtmplnameZfullZrelativedestrrrcreate_zipfileKs   zupload_docs.create_zipfilec Cslx|jD]}|j|q Wtj}|jjj}tjj |d|}z|j ||j |Wdt j |XdS)Nz%s.zip)Zget_sub_commandsZ run_commandtempfileZmkdtemp distributionmetadataget_namer"r#r$r7 upload_fileshutilZrmtree)rZcmd_nameZtmp_dirr5r1rrrrun[s  zupload_docs.runccs|\}}d|}t|ts |g}xn|D]f}t|trN|d|d7}|d}nt|}|Vt|VdV|V|r&|dddkr&dVq&WdS) Nz* Content-Disposition: form-data; name="%s"z; filename="%s"rr s   ) isinstancelisttupler)item sep_boundarykeyvaluestitlevaluerrr _build_partis     zupload_docs._build_partc Csnd}d|}|d}|df}tj|j|d}t||j}tjj|}tj||} d|jd} dj | | fS) z= Build up the MIME payload for the POST data s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s--r@)rFz multipart/form-data; boundary=%sascii) functoolspartialrKmapitems itertoolschain from_iterabledecoder$) clsdataboundaryrFZ end_boundaryZ end_itemsZbuilderZ part_groupspartsZ body_items content_typerrr_build_multipart}s  zupload_docs._build_multipartcCsPt|d}|j}WdQRX|jj}d|jtjj||fd}t|j d|j }t |}t j rn|jd}d|}|j|\}} d|j} |j| tjtjj|j\} } } }}}| r| r| st| dkrtj| }n | d krtj| }n td | d }yZ|j|jd | | }|jd ||jdtt||jd||j |j!|Wn6t"j#k r}z|jt|tj$dSd}~XnX|j%}|j&dkrd|j&|j'f} |j| tjnb|j&dkr|j(d}|dkrd|j}d|} |j| tjnd|j&|j'f} |j| tj$|j)rLt*dd|jdddS)NrbZ doc_upload)z:actionr5content:rLzBasic zSubmitting documentation to %sZhttpZhttpszunsupported schema ZPOSTz Content-typezContent-lengthZ AuthorizationzServer response (%s): %si-ZLocationzhttps://pythonhosted.org/%s/zUpload successful. Visit %szUpload failed (%s): %s-K)+openreadr9r:r;r"r#basenamerZusernameZpasswordrrr rUr[r%r'rINFOrparseZurlparseAssertionErrorrZHTTPConnectionZHTTPSConnectionZconnectZ putrequestZ putheaderstrr+Z endheaderssendsocketerrorZERRORZ getresponseZstatusreasonZ getheaderZ show_responseprint)rr0fr]metarWZ credentialsZauthZbodyZctmsgZschemaZnetlocZurlZparamsZqueryZ fragmentsZconnrZerlocationrrrr<s`              zupload_docs.upload_file)rNr)rNr)__name__ __module__ __qualname__ZDEFAULT_REPOSITORY descriptionr Z user_optionsZboolean_optionsrZ sub_commandsrr!r7r> staticmethodrK classmethodr[r<rrrrrs"    r)__doc__base64rZ distutilsrZdistutils.errorsrr"rkr)r8r=rRrNZsetuptools.externrZsetuptools.extern.six.movesrrZ pkg_resourcesrr rrrrrrs       PK!Q1command/__pycache__/__init__.cpython-36.opt-1.pycnu[3 9fR@szdddddddddd d d d d dddddddddgZddlmZddlZddlmZdejkrrdejd<ejjd[[dS)alias bdist_eggZ bdist_rpmZ build_extZbuild_pyZdevelopZ easy_installZegg_infoZinstallZ install_librotateZsaveoptsZsdistZsetoptZtestZinstall_egg_infoinstall_scriptsregisterZ bdist_wininstZ upload_docsZuploadZ build_clibZ dist_info)bdistN)rZeggPython .egg file)rr) __all__Zdistutils.command.bdistrsysZsetuptools.commandrZformat_commandsZformat_commandappendr r /usr/lib/python3.6/__init__.pys         PK!Q+command/__pycache__/__init__.cpython-36.pycnu[3 9fR@szdddddddddd d d d d dddddddddgZddlmZddlZddlmZdejkrrdejd<ejjd[[dS)alias bdist_eggZ bdist_rpmZ build_extZbuild_pyZdevelopZ easy_installZegg_infoZinstallZ install_librotateZsaveoptsZsdistZsetoptZtestZinstall_egg_infoinstall_scriptsregisterZ bdist_wininstZ upload_docsZuploadZ build_clibZ dist_info)bdistN)rZeggPython .egg file)rr) __all__Zdistutils.command.bdistrsysZsetuptools.commandrZformat_commandsZformat_commandappendr r /usr/lib/python3.6/__init__.pys         PK!XJ5 5 .command/__pycache__/alias.cpython-36.opt-1.pycnu[3 9fz @sPddlmZddlmZddlmZmZmZddZGdddeZ dd Z d S) )DistutilsOptionError)map) edit_config option_base config_filecCs8xdD]}||krt|SqW|j|gkr4t|S|S)z4Quote an argument for later parsing by shlex.split()"'\#)rrr r )reprsplit)argcr/usr/lib/python3.6/alias.pyshquotes   rc@sHeZdZdZdZdZdgejZejdgZddZ d d Z d d Z d S)aliasz3Define a shortcut that invokes one or more commandsz0define a shortcut to invoke one or more commandsTremoverremove (unset) the aliascCstj|d|_d|_dS)N)rinitialize_optionsargsr)selfrrrrs zalias.initialize_optionscCs*tj||jr&t|jdkr&tddS)NzFMust specify exactly one argument (the alias name) when using --remove)rfinalize_optionsrlenrr)rrrrr#s zalias.finalize_optionscCs|jjd}|jsDtdtdx|D]}tdt||q(WdSt|jdkr|j\}|jrfd}q||krtdt||dStd|dSn$|jd}djtt |jdd}t |j d||ii|j dS) NaliaseszCommand Aliasesz---------------zsetup.py aliasrz No alias definition found for %rr ) Z distributionZget_option_dictrprint format_aliasrrjoinrrrfilenameZdry_run)rrrcommandrrrrun+s&    z alias.runN)rrr) __name__ __module__ __qualname____doc__ descriptionZcommand_consumes_argumentsrZ user_optionsZboolean_optionsrrr#rrrrrs rcCsZ||\}}|tdkrd}n,|tdkr0d}n|tdkrBd}nd|}||d|S) Nglobalz--global-config userz--user-config Zlocalz --filename=%rr)r)namersourcer"rrrrFs    rN) Zdistutils.errorsrZsetuptools.extern.six.movesrZsetuptools.command.setoptrrrrrrrrrrs   4PK!XJ5 5 (command/__pycache__/alias.cpython-36.pycnu[3 9fz @sPddlmZddlmZddlmZmZmZddZGdddeZ dd Z d S) )DistutilsOptionError)map) edit_config option_base config_filecCs8xdD]}||krt|SqW|j|gkr4t|S|S)z4Quote an argument for later parsing by shlex.split()"'\#)rrr r )reprsplit)argcr/usr/lib/python3.6/alias.pyshquotes   rc@sHeZdZdZdZdZdgejZejdgZddZ d d Z d d Z d S)aliasz3Define a shortcut that invokes one or more commandsz0define a shortcut to invoke one or more commandsTremoverremove (unset) the aliascCstj|d|_d|_dS)N)rinitialize_optionsargsr)selfrrrrs zalias.initialize_optionscCs*tj||jr&t|jdkr&tddS)NzFMust specify exactly one argument (the alias name) when using --remove)rfinalize_optionsrlenrr)rrrrr#s zalias.finalize_optionscCs|jjd}|jsDtdtdx|D]}tdt||q(WdSt|jdkr|j\}|jrfd}q||krtdt||dStd|dSn$|jd}djtt |jdd}t |j d||ii|j dS) NaliaseszCommand Aliasesz---------------zsetup.py aliasrz No alias definition found for %rr ) Z distributionZget_option_dictrprint format_aliasrrjoinrrrfilenameZdry_run)rrrcommandrrrrun+s&    z alias.runN)rrr) __name__ __module__ __qualname____doc__ descriptionZcommand_consumes_argumentsrZ user_optionsZboolean_optionsrrr#rrrrrs rcCsZ||\}}|tdkrd}n,|tdkr0d}n|tdkrBd}nd|}||d|S) Nglobalz--global-config userz--user-config Zlocalz --filename=%rr)r)namersourcer"rrrrFs    rN) Zdistutils.errorsrZsetuptools.extern.six.movesrZsetuptools.command.setoptrrrrrrrrrrs   4PK!~m882command/__pycache__/bdist_egg.cpython-36.opt-1.pycnu[3 9f G @sxdZddlmZddlmZmZddlmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZmZmZdd lmZdd lmZdd lmZydd lmZmZd dZWn,ek rddlm Z mZddZYnXddZ!ddZ"ddZ#GdddeZ$e%j&dj'Z(ddZ)ddZ*ddZ+d d!d"Z,d#d$Z-d%d&Z.d'd(Z/d)d*d+d,gZ0d1d/d0Z1dS)2z6setuptools.command.bdist_egg Build .egg distributions)DistutilsSetupError) remove_treemkpath)log)CodeTypeN)six)get_build_platform Distributionensure_directory) EntryPoint)Library)Command)get_pathget_python_versioncCstdS)Npurelib)rrr/usr/lib/python3.6/bdist_egg.py _get_purelibsr)get_python_librcCstdS)NF)rrrrrrscCs2d|krtjj|d}|jdr.|dd}|S)N.rmodulei)ospathsplitextendswith)filenamerrr strip_module#s   rccs:x4tj|D]&\}}}|j|j|||fVq WdS)zbDo os.walk in a reproducible way, independent of indeterministic filesystem readdir order N)rwalksort)dirbasedirsfilesrrr sorted_walk+sr$c Cs6tjdj}t|d}|j||WdQRXdS)NaR def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__, %r) __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() w)textwrapdedentlstripopenwrite)ZresourcepyfileZ_stub_templatefrrr write_stub5s  r-c@seZdZdZd*dddefd+d-d.d/gZd ddgZddZddZddZ ddZ ddZ ddZ d d!Z d"d#Zd$d%Zd&d'Zd(d)Zd S)0 bdist_eggzcreate an "egg" distribution bdist-dir=b1temporary directory for creating the distributionz plat-name=pz;platform name to embed in generated filenames (default: %s)exclude-source-filesN+remove all .py files from the generated egg keep-tempkz/keep the pseudo-installation tree around after z!creating the distribution archive dist-dir=d-directory to put final built distributions in skip-build2skip rebuilding everything (for testing/debugging)cCs.d|_d|_d|_d|_d|_d|_d|_dS)Nr) bdist_dir plat_name keep_tempdist_dir skip_build egg_outputexclude_source_files)selfrrrinitialize_optionsZszbdist_egg.initialize_optionscCs|jd}|_|j|_|jdkr>|jdj}tjj|d|_|jdkrPt |_|j dd|j dkrt dd|j |jt|jjo|jj }tjj|j|d|_ dS)Negg_infoZbdistZeggr?z.egg)r?r?)get_finalized_commandei_cmdrEr< bdist_baserrjoinr=rZset_undefined_optionsrAr Zegg_nameZ egg_versionr distributionhas_ext_modulesr?)rCrGrHbasenamerrrfinalize_optionscs      zbdist_egg.finalize_optionsc Cs|j|jd_tjjtjjt}|jj g}|j_ x|D]}t |t rt |dkrtjj |drtjj|d}tjj|}||ks|j|tjr|t |dd|df}|jj j|qrgetattrr)rCZinstcmdZold_rootrk all_outputs ext_outputsZ to_compiler2Zext_namerextr+Z archive_rootrEZ script_dirZ native_libsZ libs_filerrrrunsz                    z bdist_egg.runc Cstjdxt|jD]\}}}x|D]}tjj||}|jdrXtjd|tj ||jdr&|}d}t j ||}tjj|tj |j dd} tjd|| fytj| Wntk rYnXtj|| q&WqWdS) Nz+Removing .py files from temporary directoryz.pyz Deleting %s __pycache__z#(?P.+)\.(?P[^.]+)\.pycnamez.pyczRenaming file from [%s] to [%s])rr_walk_eggr<rrrIrdebugrzrematchpardirgroupremoveOSErrorrename) rCr!r"r#rrZpath_oldpatternmZpath_newrrrrs*        zbdist_egg.zap_pyfilescCs2t|jdd}|dk r|Stjdt|j|jS)Nr|z4zip_safe flag not set; analyzing archive contents...)rrJrr~ analyze_eggr<rt)rCsaferrrr| s  zbdist_egg.zip_safec Cstj|jjpd}|jdijd}|dkr0dS|j s>|jrLtd|ftj dd}|j }dj |j}|jd}t j j|j}d t}|jstt j j|j|jd t|jd} | j|| jd S) Nzsetuptools.installationZ eggsecutabler%zGeggsecutable entry point (%r) cannot have 'extras' or refer to a modulerraH#!/bin/sh if [ `basename $0` = "%(basename)s" ] then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@" else echo $0 is not the correct name for this egg file. echo Please rename it back to %(basename)s and try again. exec false fi )rea)r Z parse_maprJZ entry_pointsgetZattrsZextrasrsysversionZ module_namerIrrrLrAlocalsrerrjr)r*rx) rCZepmZepZpyverpkgZfullr!rLheaderr,rrrrs*      zbdist_egg.gen_headercCsltjj|j}tjj|d}xJ|jjjD]<}|j|r(tjj||t |d}t ||j ||q(WdS)z*Copy metadata (egg info) to the target_dirrN) rrnormpathrErIrGZfilelistr#r\rZr Z copy_file)rCZ target_dirZ norm_egg_infoprefixrtargetrrrrw:s zbdist_egg.copy_metadata_toc Csg}g}|jdi}x|t|jD]n\}}}x6|D].}tjj|djtkr.|j|||q.Wx*|D]"}|||d|tjj||<qfWqW|j j r |j d}xd|j D]Z} t | trq|j| j} |j| }tjj|jdstjjtjj|j|r|j|qW||fS)zAGet a list of relative paths to C extensions in the output distrorrPrlZ build_extzdl-)r<r$rrrlowerNATIVE_EXTENSIONSr^rIrJrKrF extensionsrXr Zget_ext_fullnamerZget_ext_filenamerLr\r}) rCrrpathsr!r"r#rZ build_cmdrfullnamerrrrsFs(   &      zbdist_egg.get_ext_outputs)r/r0r1)r3Nr4Pkeep the pseudo-installation tree around after creating the distribution archive)r5r6r)r7r8r9)r:Nr;)__name__ __module__ __qualname__ descriptionrZ user_optionsZboolean_optionsrDrMrcrdr`rrr|rrwrsrrrrr.Cs4   Q' r.z.dll .so .dylib .pydccsLt|}t|\}}}d|kr(|jd|||fVx|D] }|Vq:WdS)z@Walk an unpacked egg's contents, skipping the metadata directoryzEGG-INFON)r$nextr)egg_dirZwalkerr!r"r#Zbdfrrrrfs   rc Csx0tjD]$\}}tjjtjj|d|r |Sq Wts.visit) compression) zipfilerrrrjrr_Z ZIP_DEFLATEDZ ZIP_STOREDZZipFiler$rx) Z zip_filenamerrqrecompressrrrrrrrjr"r#r)rrerrs  r)rrTr%)2__doc__Zdistutils.errorsrZdistutils.dir_utilrrZ distutilsrtypesrrrrr&rZsetuptools.externrZ pkg_resourcesrr r r Zsetuptools.extensionr Z setuptoolsr sysconfigrrr ImportErrorZdistutils.sysconfigrrr$r-r.rrsplitrrrr{rrrrrfrrrrrsL         " $  PK!~m88,command/__pycache__/bdist_egg.cpython-36.pycnu[3 9f G @sxdZddlmZddlmZmZddlmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZmZmZdd lmZdd lmZdd lmZydd lmZmZd dZWn,ek rddlm Z mZddZYnXddZ!ddZ"ddZ#GdddeZ$e%j&dj'Z(ddZ)ddZ*ddZ+d d!d"Z,d#d$Z-d%d&Z.d'd(Z/d)d*d+d,gZ0d1d/d0Z1dS)2z6setuptools.command.bdist_egg Build .egg distributions)DistutilsSetupError) remove_treemkpath)log)CodeTypeN)six)get_build_platform Distributionensure_directory) EntryPoint)Library)Command)get_pathget_python_versioncCstdS)Npurelib)rrr/usr/lib/python3.6/bdist_egg.py _get_purelibsr)get_python_librcCstdS)NF)rrrrrrscCs2d|krtjj|d}|jdr.|dd}|S)N.rmodulei)ospathsplitextendswith)filenamerrr strip_module#s   rccs:x4tj|D]&\}}}|j|j|||fVq WdS)zbDo os.walk in a reproducible way, independent of indeterministic filesystem readdir order N)rwalksort)dirbasedirsfilesrrr sorted_walk+sr$c Cs6tjdj}t|d}|j||WdQRXdS)NaR def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__, %r) __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() w)textwrapdedentlstripopenwrite)ZresourcepyfileZ_stub_templatefrrr write_stub5s  r-c@seZdZdZd*dddefd+d-d.d/gZd ddgZddZddZddZ ddZ ddZ ddZ d d!Z d"d#Zd$d%Zd&d'Zd(d)Zd S)0 bdist_eggzcreate an "egg" distribution bdist-dir=b1temporary directory for creating the distributionz plat-name=pz;platform name to embed in generated filenames (default: %s)exclude-source-filesN+remove all .py files from the generated egg keep-tempkz/keep the pseudo-installation tree around after z!creating the distribution archive dist-dir=d-directory to put final built distributions in skip-build2skip rebuilding everything (for testing/debugging)cCs.d|_d|_d|_d|_d|_d|_d|_dS)Nr) bdist_dir plat_name keep_tempdist_dir skip_build egg_outputexclude_source_files)selfrrrinitialize_optionsZszbdist_egg.initialize_optionscCs|jd}|_|j|_|jdkr>|jdj}tjj|d|_|jdkrPt |_|j dd|j dkrt dd|j |jt|jjo|jj }tjj|j|d|_ dS)Negg_infoZbdistZeggr?z.egg)r?r?)get_finalized_commandei_cmdrEr< bdist_baserrjoinr=rZset_undefined_optionsrAr Zegg_nameZ egg_versionr distributionhas_ext_modulesr?)rCrGrHbasenamerrrfinalize_optionscs      zbdist_egg.finalize_optionsc Cs|j|jd_tjjtjjt}|jj g}|j_ x|D]}t |t rt |dkrtjj |drtjj|d}tjj|}||ks|j|tjr|t |dd|df}|jj j|qrgetattrr)rCZinstcmdZold_rootrk all_outputs ext_outputsZ to_compiler2Zext_namerextr+Z archive_rootrEZ script_dirZ native_libsZ libs_filerrrrunsz                    z bdist_egg.runc Cstjdxt|jD]\}}}x|D]}tjj||}|jdrXtjd|tj ||jdr&|}d}t j ||}tjj|tj |j dd} tjd|| fytj| Wntk rYnXtj|| q&WqWdS) Nz+Removing .py files from temporary directoryz.pyz Deleting %s __pycache__z#(?P.+)\.(?P[^.]+)\.pycnamez.pyczRenaming file from [%s] to [%s])rr_walk_eggr<rrrIrdebugrzrematchpardirgroupremoveOSErrorrename) rCr!r"r#rrZpath_oldpatternmZpath_newrrrrs*        zbdist_egg.zap_pyfilescCs2t|jdd}|dk r|Stjdt|j|jS)Nr|z4zip_safe flag not set; analyzing archive contents...)rrJrr~ analyze_eggr<rt)rCsaferrrr| s  zbdist_egg.zip_safec Cstj|jjpd}|jdijd}|dkr0dS|j s>|jrLtd|ftj dd}|j }dj |j}|jd}t j j|j}d t}|jstt j j|j|jd t|jd} | j|| jd S) Nzsetuptools.installationZ eggsecutabler%zGeggsecutable entry point (%r) cannot have 'extras' or refer to a modulerraH#!/bin/sh if [ `basename $0` = "%(basename)s" ] then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@" else echo $0 is not the correct name for this egg file. echo Please rename it back to %(basename)s and try again. exec false fi )rea)r Z parse_maprJZ entry_pointsgetZattrsZextrasrsysversionZ module_namerIrrrLrAlocalsrerrjr)r*rx) rCZepmZepZpyverpkgZfullr!rLheaderr,rrrrs*      zbdist_egg.gen_headercCsltjj|j}tjj|d}xJ|jjjD]<}|j|r(tjj||t |d}t ||j ||q(WdS)z*Copy metadata (egg info) to the target_dirrN) rrnormpathrErIrGZfilelistr#r\rZr Z copy_file)rCZ target_dirZ norm_egg_infoprefixrtargetrrrrw:s zbdist_egg.copy_metadata_toc Csg}g}|jdi}x|t|jD]n\}}}x6|D].}tjj|djtkr.|j|||q.Wx*|D]"}|||d|tjj||<qfWqW|j j r |j d}xd|j D]Z} t | trq|j| j} |j| }tjj|jdstjjtjj|j|r|j|qW||fS)zAGet a list of relative paths to C extensions in the output distrorrPrlZ build_extzdl-)r<r$rrrlowerNATIVE_EXTENSIONSr^rIrJrKrF extensionsrXr Zget_ext_fullnamerZget_ext_filenamerLr\r}) rCrrpathsr!r"r#rZ build_cmdrfullnamerrrrsFs(   &      zbdist_egg.get_ext_outputs)r/r0r1)r3Nr4Pkeep the pseudo-installation tree around after creating the distribution archive)r5r6r)r7r8r9)r:Nr;)__name__ __module__ __qualname__ descriptionrZ user_optionsZboolean_optionsrDrMrcrdr`rrr|rrwrsrrrrr.Cs4   Q' r.z.dll .so .dylib .pydccsLt|}t|\}}}d|kr(|jd|||fVx|D] }|Vq:WdS)z@Walk an unpacked egg's contents, skipping the metadata directoryzEGG-INFON)r$nextr)egg_dirZwalkerr!r"r#Zbdfrrrrfs   rc Csx0tjD]$\}}tjjtjj|d|r |Sq Wts.visit) compression) zipfilerrrrjrr_Z ZIP_DEFLATEDZ ZIP_STOREDZZipFiler$rx) Z zip_filenamerrqrecompressrrrrrrrjr"r#r)rrerrs  r)rrTr%)2__doc__Zdistutils.errorsrZdistutils.dir_utilrrZ distutilsrtypesrrrrr&rZsetuptools.externrZ pkg_resourcesrr r r Zsetuptools.extensionr Z setuptoolsr sysconfigrrr ImportErrorZdistutils.sysconfigrrr$r-r.rrsplitrrrr{rrrrrfrrrrrsL         " $  PK!"ޜ2command/__pycache__/bdist_rpm.cpython-36.opt-1.pycnu[3 9f@s"ddljjZGdddejZdS)Nc@s eZdZdZddZddZdS) bdist_rpmaf Override the default bdist_rpm behavior to do the following: 1. Run egg_info to ensure the name and version are properly calculated. 2. Always run 'install' using --single-version-externally-managed to disable eggs in RPM distributions. 3. Replace dash with underscore in the version numbers for better RPM compatibility. cCs|jdtjj|dS)NZegg_info)Z run_commandorigrrun)selfr/usr/lib/python3.6/bdist_rpm.pyrs z bdist_rpm.runcsl|jj}|jdd}tjj|}d|d|fdd|D}|jd}d|}|j|||S)N-_z%define version cs0g|](}|jddjddjddjqS)zSource0: %{name}-%{version}.tarz)Source0: %{name}-%{unmangled_version}.tarzsetup.py install z5setup.py install --single-version-externally-managed z%setupz&%setup -n %{name}-%{unmangled_version})replace).0line)line23line24rr s z-bdist_rpm._make_spec_file..z%define unmangled_version )Z distributionZ get_versionr rr_make_spec_fileindexinsert)rversionZ rpmversionspecZ insert_locZunmangled_versionr)r rrrs     zbdist_rpm._make_spec_fileN)__name__ __module__ __qualname____doc__rrrrrrrs r)Zdistutils.command.bdist_rpmZcommandrrrrrrs PK!"ޜ,command/__pycache__/bdist_rpm.cpython-36.pycnu[3 9f@s"ddljjZGdddejZdS)Nc@s eZdZdZddZddZdS) bdist_rpmaf Override the default bdist_rpm behavior to do the following: 1. Run egg_info to ensure the name and version are properly calculated. 2. Always run 'install' using --single-version-externally-managed to disable eggs in RPM distributions. 3. Replace dash with underscore in the version numbers for better RPM compatibility. cCs|jdtjj|dS)NZegg_info)Z run_commandorigrrun)selfr/usr/lib/python3.6/bdist_rpm.pyrs z bdist_rpm.runcsl|jj}|jdd}tjj|}d|d|fdd|D}|jd}d|}|j|||S)N-_z%define version cs0g|](}|jddjddjddjqS)zSource0: %{name}-%{version}.tarz)Source0: %{name}-%{unmangled_version}.tarzsetup.py install z5setup.py install --single-version-externally-managed z%setupz&%setup -n %{name}-%{unmangled_version})replace).0line)line23line24rr s z-bdist_rpm._make_spec_file..z%define unmangled_version )Z distributionZ get_versionr rr_make_spec_fileindexinsert)rversionZ rpmversionspecZ insert_locZunmangled_versionr)r rrrs     zbdist_rpm._make_spec_fileN)__name__ __module__ __qualname____doc__rrrrrrrs r)Zdistutils.command.bdist_rpmZcommandrrrrrrs PK!b6command/__pycache__/bdist_wininst.cpython-36.opt-1.pycnu[3 9f}@s"ddljjZGdddejZdS)Nc@seZdZdddZddZdS) bdist_wininstrcCs |jj||}|dkrd|_|S)zj Supplement reinitialize_command to work around http://bugs.python.org/issue20819 install install_libN)rr)Z distributionreinitialize_commandr)selfcommandZreinit_subcommandscmdr #/usr/lib/python3.6/bdist_wininst.pyrs z"bdist_wininst.reinitialize_commandc Cs$d|_ztjj|Wdd|_XdS)NTF)Z _is_runningorigrrun)rr r r r szbdist_wininst.runN)r)__name__ __module__ __qualname__rr r r r r rs r)Zdistutils.command.bdist_wininstrrr r r r r s PK!b0command/__pycache__/bdist_wininst.cpython-36.pycnu[3 9f}@s"ddljjZGdddejZdS)Nc@seZdZdddZddZdS) bdist_wininstrcCs |jj||}|dkrd|_|S)zj Supplement reinitialize_command to work around http://bugs.python.org/issue20819 install install_libN)rr)Z distributionreinitialize_commandr)selfcommandZreinit_subcommandscmdr #/usr/lib/python3.6/bdist_wininst.pyrs z"bdist_wininst.reinitialize_commandc Cs$d|_ztjj|Wdd|_XdS)NTF)Z _is_runningorigrrun)rr r r r szbdist_wininst.runN)r)__name__ __module__ __qualname__rr r r r r rs r)Zdistutils.command.bdist_wininstrrr r r r r s PK!bD D 3command/__pycache__/build_clib.cpython-36.opt-1.pycnu[3 9f@sFddljjZddlmZddlmZddlm Z GdddejZdS)N)DistutilsSetupError)log)newer_pairwise_groupc@seZdZdZddZdS) build_clibav Override the default build_clib behaviour to do the following: 1. Implement a rudimentary timestamp-based dependency system so 'compile()' doesn't run every time. 2. Add more keys to the 'build_info' dictionary: * obj_deps - specify dependencies for each object compiled. this should be a dictionary mapping a key with the source filename to a list of dependencies. Use an empty string for global dependencies. * cflags - specify a list of additional flags to pass to the compiler. c Cs~xv|D]l\}}|jd}|dks4t|ttf r@td|t|}tjd||jdt}t|tsxtd|g}|jdt}t|ttfstd|xX|D]P}|g} | j||j|t} t| ttfstd|| j| |j | qW|j j ||j d} t || ggfkr^|jd} |jd } |jd }|j j||j | | ||jd }|j j| ||j|jd qWdS) Nsourceszfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenameszbuilding '%s' libraryobj_depsz\in 'libraries' option (library '%s'), 'obj_deps' must be a dictionary of type 'source: list') output_dirmacros include_dirscflags)r r r Zextra_postargsdebug)r r )get isinstancelisttuplerrinfodictextendappendZcompilerZobject_filenamesZ build_temprcompiler Zcreate_static_libr)selfZ librariesZlib_nameZ build_inforrZ dependenciesZ global_depssourceZsrc_depsZ extra_depsZexpected_objectsr r r Zobjectsr /usr/lib/python3.6/build_clib.pybuild_librariess`           zbuild_clib.build_librariesN)__name__ __module__ __qualname____doc__rrrrrrsr) Zdistutils.command.build_clibZcommandrZorigZdistutils.errorsrZ distutilsrZsetuptools.dep_utilrrrrrs    PK!ю0!0!1command/__pycache__/build_py.cpython-36.opt-1.pycnu[3 9f|% @sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZyddlmZWn"ek rGdddZYnXGd d d ejeZdd d Zd dZdS))glob) convert_pathN)six)mapfilter filterfalse) Mixin2to3c@seZdZdddZdS)rTcCsdS)z do nothingN)selffilesZdoctestsr r /usr/lib/python3.6/build_py.pyrun_2to3szMixin2to3.run_2to3N)T)__name__ __module__ __qualname__r r r r r rsrc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZeddZd S)!build_pyaXEnhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. See 'setuptools.dist.Distribution' for more details. Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. cCsFtjj||jj|_|jjp i|_d|jkr6|jd=g|_g|_dS)N data_files) origrfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_files_build_py__doctests_2to3)r r r r r!s   zbuild_py.finalize_optionscCs||j r|j rdS|jr"|j|jr8|j|j|j|jd|j|jd|j|jd|jt j j |dddS)z?Build modules, packages, and copy data files to build directoryNFTr)Zinclude_bytecode) Z py_modulespackagesZ build_modulesZbuild_packagesbuild_package_datar rrZ byte_compilerrZ get_outputs)r r r r run+sz build_py.runcCs&|dkr|j|_|jStjj||S)zlazily compute data filesr)_get_data_filesrrr __getattr__)r attrr r r r?s zbuild_py.__getattr__cCsJtjrt|tjr|jd}tjj||||\}}|rB|jj |||fS)N.) rZPY2 isinstanceZ string_typessplitrr build_modulerappend)r moduleZ module_filepackageZoutfilecopiedr r r r$Fs    zbuild_py.build_modulecCs|jtt|j|jpfS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)analyze_manifestlistr_get_pkg_data_filesr)r r r r rPszbuild_py._get_data_filescsJ|j|tjj|jg|jd}fdd|j|D}|||fS)Nr!csg|]}tjj|qSr )ospathrelpath).0file)src_dirr r ^sz0build_py._get_pkg_data_files..)get_package_dirr,r-joinZ build_libr#find_data_files)r r' build_dir filenamesr )r1r r+Us   zbuild_py._get_pkg_data_filescCsX|j|j||}tt|}tjj|}ttj j |}tj|j j |g|}|j |||S)z6Return filenames for package's data files in 'src_dir')_get_platform_patternsrrr itertoolschain from_iterablerr,r-isfilemanifest_filesgetexclude_data_files)r r'r1patternsZglobs_expandedZ globs_matchesZ glob_filesr r r r r5cs   zbuild_py.find_data_filesc Csx|jD]\}}}}xr|D]j}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r||jj kr|j j |qWqWdS)z$Copy data files into build directoryN) rr,r-r4ZmkpathdirnameZ copy_fileabspathrZconvert_2to3_doctestsrr%) r r'r1r6r7filenametargetZsrcfileZoutfr(r r r rts   zbuild_py.build_package_datac Csi|_}|jjsdSi}x$|jp$fD]}||t|j|<q&W|jd|jd}x|jj D]}t j j t|\}}d}|} x:|r||kr||kr|}t j j |\}} t j j | |}qW||kr^|jdr|| krq^|j||gj|q^WdS)NZegg_infoz.py)r=rZinclude_package_datarassert_relativer3Z run_commandZget_finalized_commandZfilelistr r,r-r#r4endswith setdefaultr%) r ZmfZsrc_dirsr'Zei_cmdr-dfprevZoldfZdfr r r r)s(   zbuild_py.analyze_manifestcCsdS)Nr )r r r r get_data_filesszbuild_py.get_data_filescCsy |j|Stk rYnXtjj|||}||j|<| sJ|jj rN|Sx,|jjD]}||ksr|j|drXPqXW|Stj |d}|j }WdQRXd|krt j j d|f|S)z8Check namespace packages' __init__ for declare_namespacer!rbNsdeclare_namespacezNamespace package problem: %s is a namespace package, but its __init__.py does not call declare_namespace()! Please fix it. (See the setuptools manual under "Namespace Packages" for details.) ")packages_checkedKeyErrorrr check_packagerZnamespace_packages startswithioopenread distutilserrorsZDistutilsError)r r'Z package_dirZinit_pyZpkgrIcontentsr r r rOs&   zbuild_py.check_packagecCsi|_tjj|dS)N)rMrrinitialize_options)r r r r rWszbuild_py.initialize_optionscCs0tjj||}|jjdk r,tjj|jj|S|S)N)rrr3rZsrc_rootr,r-r4)r r'resr r r r3s zbuild_py.get_package_dircs\t|j|j||}fdd|D}tjj|}t|fddD}tt|S)z6Filter filenames for package's data files in 'src_dir'c3s|]}tj|VqdS)N)fnmatchr)r/pattern)r r r sz.build_py.exclude_data_files..c3s|]}|kr|VqdS)Nr )r/fn)badr r r[s)r*r8rr9r:r;set_unique_everseen)r r'r1r r@Z match_groupsZmatchesZkeepersr )r]r r r?s   zbuild_py.exclude_data_filescs.tj|jdg|j|g}fdd|DS)z yield platform-specific path patterns (suitable for glob or fn_match) from a glob-based spec (such as self.package_data or self.exclude_package_data) matching package in src_dir. c3s |]}tjjt|VqdS)N)r,r-r4r)r/rZ)r1r r r[sz2build_py._get_platform_patterns..)r9r:r>)specr'r1Z raw_patternsr )r1r r8s   zbuild_py._get_platform_patternsN)rrr__doc__rrrr$rr+r5rr)rKrOrWr3r? staticmethodr8r r r r rs    rccsjt}|j}|dkr:xPt|j|D]}|||Vq"Wn,x*|D]"}||}||kr@|||Vq@WdS)zHList unique elements, preserving order. Remember all elements ever seen.N)r^addr __contains__)iterablekeyseenZseen_addelementkr r r r_s  r_cCs:tjj|s|Sddlm}tjdj|}||dS)Nr)DistutilsSetupErrorz Error: setup script specifies an absolute path: %s setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. )r,r-isabsdistutils.errorsrktextwrapdedentlstrip)r-rkmsgr r r rEs   rE)N)rZdistutils.utilrZdistutils.command.build_pyZcommandrrr,rYrnrQrmrTr9Zsetuptools.externrZsetuptools.extern.six.movesrrrZsetuptools.lib2to3_exr ImportErrorr_rEr r r r s$    Y PK!ARRRcommand/__init__.pynu[__all__ = [ 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', 'dist_info', ] from distutils.command.bdist import bdist import sys from setuptools.command import install_scripts if 'egg' not in bdist.format_commands: bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") bdist.format_commands.append('egg') del bdist, sys PK!P#z z command/alias.pynu[from distutils.errors import DistutilsOptionError from setuptools.extern.six.moves import map from setuptools.command.setopt import edit_config, option_base, config_file def shquote(arg): """Quote an argument for later parsing by shlex.split()""" for c in '"', "'", "\\", "#": if c in arg: return repr(arg) if arg.split() != [arg]: return repr(arg) return arg class alias(option_base): """Define a shortcut that invokes one or more commands""" description = "define a shortcut to invoke one or more commands" command_consumes_arguments = True user_options = [ ('remove', 'r', 'remove (unset) the alias'), ] + option_base.user_options boolean_options = option_base.boolean_options + ['remove'] def initialize_options(self): option_base.initialize_options(self) self.args = None self.remove = None def finalize_options(self): option_base.finalize_options(self) if self.remove and len(self.args) != 1: raise DistutilsOptionError( "Must specify exactly one argument (the alias name) when " "using --remove" ) def run(self): aliases = self.distribution.get_option_dict('aliases') if not self.args: print("Command Aliases") print("---------------") for alias in aliases: print("setup.py alias", format_alias(alias, aliases)) return elif len(self.args) == 1: alias, = self.args if self.remove: command = None elif alias in aliases: print("setup.py alias", format_alias(alias, aliases)) return else: print("No alias definition found for %r" % alias) return else: alias = self.args[0] command = ' '.join(map(shquote, self.args[1:])) edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) def format_alias(name, aliases): source, command = aliases[name] if source == config_file('global'): source = '--global-config ' elif source == config_file('user'): source = '--user-config ' elif source == config_file('local'): source = '' else: source = '--filename=%r' % source return source + name + ' ' + command PK!1 G Gcommand/bdist_egg.pynu["""setuptools.command.bdist_egg Build .egg distributions""" from distutils.errors import DistutilsSetupError from distutils.dir_util import remove_tree, mkpath from distutils import log from types import CodeType import sys import os import re import textwrap import marshal from setuptools.extern import six from pkg_resources import get_build_platform, Distribution, ensure_directory from pkg_resources import EntryPoint from setuptools.extension import Library from setuptools import Command try: # Python 2.7 or >=3.2 from sysconfig import get_path, get_python_version def _get_purelib(): return get_path("purelib") except ImportError: from distutils.sysconfig import get_python_lib, get_python_version def _get_purelib(): return get_python_lib(False) def strip_module(filename): if '.' in filename: filename = os.path.splitext(filename)[0] if filename.endswith('module'): filename = filename[:-6] return filename def sorted_walk(dir): """Do os.walk in a reproducible way, independent of indeterministic filesystem readdir order """ for base, dirs, files in os.walk(dir): dirs.sort() files.sort() yield base, dirs, files def write_stub(resource, pyfile): _stub_template = textwrap.dedent(""" def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__, %r) __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() """).lstrip() with open(pyfile, 'w') as f: f.write(_stub_template % resource) class bdist_egg(Command): description = "create an \"egg\" distribution" user_options = [ ('bdist-dir=', 'b', "temporary directory for creating the distribution"), ('plat-name=', 'p', "platform name to embed in generated filenames " "(default: %s)" % get_build_platform()), ('exclude-source-files', None, "remove all .py files from the generated egg"), ('keep-temp', 'k', "keep the pseudo-installation tree around after " + "creating the distribution archive"), ('dist-dir=', 'd', "directory to put final built distributions in"), ('skip-build', None, "skip rebuilding everything (for testing/debugging)"), ] boolean_options = [ 'keep-temp', 'skip-build', 'exclude-source-files' ] def initialize_options(self): self.bdist_dir = None self.plat_name = None self.keep_temp = 0 self.dist_dir = None self.skip_build = 0 self.egg_output = None self.exclude_source_files = None def finalize_options(self): ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") self.egg_info = ei_cmd.egg_info if self.bdist_dir is None: bdist_base = self.get_finalized_command('bdist').bdist_base self.bdist_dir = os.path.join(bdist_base, 'egg') if self.plat_name is None: self.plat_name = get_build_platform() self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) if self.egg_output is None: # Compute filename of the output egg basename = Distribution( None, None, ei_cmd.egg_name, ei_cmd.egg_version, get_python_version(), self.distribution.has_ext_modules() and self.plat_name ).egg_name() self.egg_output = os.path.join(self.dist_dir, basename + '.egg') def do_install_data(self): # Hack for packages that install data to install's --install-lib self.get_finalized_command('install').install_lib = self.bdist_dir site_packages = os.path.normcase(os.path.realpath(_get_purelib())) old, self.distribution.data_files = self.distribution.data_files, [] for item in old: if isinstance(item, tuple) and len(item) == 2: if os.path.isabs(item[0]): realpath = os.path.realpath(item[0]) normalized = os.path.normcase(realpath) if normalized == site_packages or normalized.startswith( site_packages + os.sep ): item = realpath[len(site_packages) + 1:], item[1] # XXX else: raise ??? self.distribution.data_files.append(item) try: log.info("installing package data to %s", self.bdist_dir) self.call_command('install_data', force=0, root=None) finally: self.distribution.data_files = old def get_outputs(self): return [self.egg_output] def call_command(self, cmdname, **kw): """Invoke reinitialized command `cmdname` with keyword args""" for dirname in INSTALL_DIRECTORY_ATTRS: kw.setdefault(dirname, self.bdist_dir) kw.setdefault('skip_build', self.skip_build) kw.setdefault('dry_run', self.dry_run) cmd = self.reinitialize_command(cmdname, **kw) self.run_command(cmdname) return cmd def run(self): # Generate metadata first self.run_command("egg_info") # We run install_lib before install_data, because some data hacks # pull their data path from the install_lib command. log.info("installing library code to %s", self.bdist_dir) instcmd = self.get_finalized_command('install') old_root = instcmd.root instcmd.root = None if self.distribution.has_c_libraries() and not self.skip_build: self.run_command('build_clib') cmd = self.call_command('install_lib', warn_dir=0) instcmd.root = old_root all_outputs, ext_outputs = self.get_ext_outputs() self.stubs = [] to_compile = [] for (p, ext_name) in enumerate(ext_outputs): filename, ext = os.path.splitext(ext_name) pyfile = os.path.join(self.bdist_dir, strip_module(filename) + '.py') self.stubs.append(pyfile) log.info("creating stub loader for %s", ext_name) if not self.dry_run: write_stub(os.path.basename(ext_name), pyfile) to_compile.append(pyfile) ext_outputs[p] = ext_name.replace(os.sep, '/') if to_compile: cmd.byte_compile(to_compile) if self.distribution.data_files: self.do_install_data() # Make the EGG-INFO directory archive_root = self.bdist_dir egg_info = os.path.join(archive_root, 'EGG-INFO') self.mkpath(egg_info) if self.distribution.scripts: script_dir = os.path.join(egg_info, 'scripts') log.info("installing scripts to %s", script_dir) self.call_command('install_scripts', install_dir=script_dir, no_ep=1) self.copy_metadata_to(egg_info) native_libs = os.path.join(egg_info, "native_libs.txt") if all_outputs: log.info("writing %s", native_libs) if not self.dry_run: ensure_directory(native_libs) libs_file = open(native_libs, 'wt') libs_file.write('\n'.join(all_outputs)) libs_file.write('\n') libs_file.close() elif os.path.isfile(native_libs): log.info("removing %s", native_libs) if not self.dry_run: os.unlink(native_libs) write_safety_flag( os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() ) if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): log.warn( "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" "Use the install_requires/extras_require setup() args instead." ) if self.exclude_source_files: self.zap_pyfiles() # Make the archive make_zipfile(self.egg_output, archive_root, verbose=self.verbose, dry_run=self.dry_run, mode=self.gen_header()) if not self.keep_temp: remove_tree(self.bdist_dir, dry_run=self.dry_run) # Add to 'Distribution.dist_files' so that the "upload" command works getattr(self.distribution, 'dist_files', []).append( ('bdist_egg', get_python_version(), self.egg_output)) def zap_pyfiles(self): log.info("Removing .py files from temporary directory") for base, dirs, files in walk_egg(self.bdist_dir): for name in files: path = os.path.join(base, name) if name.endswith('.py'): log.debug("Deleting %s", path) os.unlink(path) if base.endswith('__pycache__'): path_old = path pattern = r'(?P.+)\.(?P[^.]+)\.pyc' m = re.match(pattern, name) path_new = os.path.join( base, os.pardir, m.group('name') + '.pyc') log.info( "Renaming file from [%s] to [%s]" % (path_old, path_new)) try: os.remove(path_new) except OSError: pass os.rename(path_old, path_new) def zip_safe(self): safe = getattr(self.distribution, 'zip_safe', None) if safe is not None: return safe log.warn("zip_safe flag not set; analyzing archive contents...") return analyze_egg(self.bdist_dir, self.stubs) def gen_header(self): epm = EntryPoint.parse_map(self.distribution.entry_points or '') ep = epm.get('setuptools.installation', {}).get('eggsecutable') if ep is None: return 'w' # not an eggsecutable, do it the usual way. if not ep.attrs or ep.extras: raise DistutilsSetupError( "eggsecutable entry point (%r) cannot have 'extras' " "or refer to a module" % (ep,) ) pyver = sys.version[:3] pkg = ep.module_name full = '.'.join(ep.attrs) base = ep.attrs[0] basename = os.path.basename(self.egg_output) header = ( "#!/bin/sh\n" 'if [ `basename $0` = "%(basename)s" ]\n' 'then exec python%(pyver)s -c "' "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " "from %(pkg)s import %(base)s; sys.exit(%(full)s())" '" "$@"\n' 'else\n' ' echo $0 is not the correct name for this egg file.\n' ' echo Please rename it back to %(basename)s and try again.\n' ' exec false\n' 'fi\n' ) % locals() if not self.dry_run: mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) f = open(self.egg_output, 'w') f.write(header) f.close() return 'a' def copy_metadata_to(self, target_dir): "Copy metadata (egg info) to the target_dir" # normalize the path (so that a forward-slash in egg_info will # match using startswith below) norm_egg_info = os.path.normpath(self.egg_info) prefix = os.path.join(norm_egg_info, '') for path in self.ei_cmd.filelist.files: if path.startswith(prefix): target = os.path.join(target_dir, path[len(prefix):]) ensure_directory(target) self.copy_file(path, target) def get_ext_outputs(self): """Get a list of relative paths to C extensions in the output distro""" all_outputs = [] ext_outputs = [] paths = {self.bdist_dir: ''} for base, dirs, files in sorted_walk(self.bdist_dir): for filename in files: if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: all_outputs.append(paths[base] + filename) for filename in dirs: paths[os.path.join(base, filename)] = (paths[base] + filename + '/') if self.distribution.has_ext_modules(): build_cmd = self.get_finalized_command('build_ext') for ext in build_cmd.extensions: if isinstance(ext, Library): continue fullname = build_cmd.get_ext_fullname(ext.name) filename = build_cmd.get_ext_filename(fullname) if not os.path.basename(filename).startswith('dl-'): if os.path.exists(os.path.join(self.bdist_dir, filename)): ext_outputs.append(filename) return all_outputs, ext_outputs NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) def walk_egg(egg_dir): """Walk an unpacked egg's contents, skipping the metadata directory""" walker = sorted_walk(egg_dir) base, dirs, files = next(walker) if 'EGG-INFO' in dirs: dirs.remove('EGG-INFO') yield base, dirs, files for bdf in walker: yield bdf def analyze_egg(egg_dir, stubs): # check for existing flag in EGG-INFO for flag, fn in safety_flags.items(): if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): return flag if not can_scan(): return False safe = True for base, dirs, files in walk_egg(egg_dir): for name in files: if name.endswith('.py') or name.endswith('.pyw'): continue elif name.endswith('.pyc') or name.endswith('.pyo'): # always scan, even if we already know we're not safe safe = scan_module(egg_dir, base, name, stubs) and safe return safe def write_safety_flag(egg_dir, safe): # Write or remove zip safety flag file(s) for flag, fn in safety_flags.items(): fn = os.path.join(egg_dir, fn) if os.path.exists(fn): if safe is None or bool(safe) != flag: os.unlink(fn) elif safe is not None and bool(safe) == flag: f = open(fn, 'wt') f.write('\n') f.close() safety_flags = { True: 'zip-safe', False: 'not-zip-safe', } def scan_module(egg_dir, base, name, stubs): """Check whether module possibly uses unsafe-for-zipfile stuff""" filename = os.path.join(base, name) if filename[:-1] in stubs: return True # Extension module pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] if sys.version_info < (3, 3): skip = 8 # skip magic & date elif sys.version_info < (3, 7): skip = 12 # skip magic & date & file size else: skip = 16 # skip magic & reserved? & date & file size f = open(filename, 'rb') f.read(skip) code = marshal.load(f) f.close() safe = True symbols = dict.fromkeys(iter_symbols(code)) for bad in ['__file__', '__path__']: if bad in symbols: log.warn("%s: module references %s", module, bad) safe = False if 'inspect' in symbols: for bad in [ 'getsource', 'getabsfile', 'getsourcefile', 'getfile' 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', 'getinnerframes', 'getouterframes', 'stack', 'trace' ]: if bad in symbols: log.warn("%s: module MAY be using inspect.%s", module, bad) safe = False return safe def iter_symbols(code): """Yield names and strings used by `code` and its nested code objects""" for name in code.co_names: yield name for const in code.co_consts: if isinstance(const, six.string_types): yield const elif isinstance(const, CodeType): for name in iter_symbols(const): yield name def can_scan(): if not sys.platform.startswith('java') and sys.platform != 'cli': # CPython, PyPy, etc. return True log.warn("Unable to analyze compiled code on this platform.") log.warn("Please ask the author to include a 'zip_safe'" " setting (either True or False) in the package's setup.py") # Attribute names of options for commands that might need to be convinced to # install to the egg build directory INSTALL_DIRECTORY_ATTRS = [ 'install_lib', 'install_dir', 'install_data', 'install_base' ] def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, mode='w'): """Create a zip file from all the files under 'base_dir'. The output zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" Python module (if available) or the InfoZIP "zip" utility (if installed and found on the default search path). If neither tool is available, raises DistutilsExecError. Returns the name of the output zip file. """ import zipfile mkpath(os.path.dirname(zip_filename), dry_run=dry_run) log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) def visit(z, dirname, names): for name in names: path = os.path.normpath(os.path.join(dirname, name)) if os.path.isfile(path): p = path[len(base_dir) + 1:] if not dry_run: z.write(path, p) log.debug("adding '%s'", p) compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED if not dry_run: z = zipfile.ZipFile(zip_filename, mode, compression=compression) for dirname, dirs, files in sorted_walk(base_dir): visit(z, dirname, files) z.close() else: for dirname, dirs, files in sorted_walk(base_dir): visit(None, dirname, files) return zip_filename PK!tcommand/bdist_rpm.pynu[import distutils.command.bdist_rpm as orig class bdist_rpm(orig.bdist_rpm): """ Override the default bdist_rpm behavior to do the following: 1. Run egg_info to ensure the name and version are properly calculated. 2. Always run 'install' using --single-version-externally-managed to disable eggs in RPM distributions. 3. Replace dash with underscore in the version numbers for better RPM compatibility. """ def run(self): # ensure distro name is up-to-date self.run_command('egg_info') orig.bdist_rpm.run(self) def _make_spec_file(self): version = self.distribution.get_version() rpmversion = version.replace('-', '_') spec = orig.bdist_rpm._make_spec_file(self) line23 = '%define version ' + version line24 = '%define version ' + rpmversion spec = [ line.replace( "Source0: %{name}-%{version}.tar", "Source0: %{name}-%{unmangled_version}.tar" ).replace( "setup.py install ", "setup.py install --single-version-externally-managed " ).replace( "%setup", "%setup -n %{name}-%{unmangled_version}" ).replace(line23, line24) for line in spec ] insert_loc = spec.index(line24) + 1 unmangled_version = "%define unmangled_version " + version spec.insert(insert_loc, unmangled_version) return spec PK! u}}command/bdist_wininst.pynu[import distutils.command.bdist_wininst as orig class bdist_wininst(orig.bdist_wininst): def reinitialize_command(self, command, reinit_subcommands=0): """ Supplement reinitialize_command to work around http://bugs.python.org/issue20819 """ cmd = self.distribution.reinitialize_command( command, reinit_subcommands) if command in ('install', 'install_lib'): cmd.install_lib = None return cmd def run(self): self._is_running = True try: orig.bdist_wininst.run(self) finally: self._is_running = False PK!'command/build_clib.pynu[import distutils.command.build_clib as orig from distutils.errors import DistutilsSetupError from distutils import log from setuptools.dep_util import newer_pairwise_group class build_clib(orig.build_clib): """ Override the default build_clib behaviour to do the following: 1. Implement a rudimentary timestamp-based dependency system so 'compile()' doesn't run every time. 2. Add more keys to the 'build_info' dictionary: * obj_deps - specify dependencies for each object compiled. this should be a dictionary mapping a key with the source filename to a list of dependencies. Use an empty string for global dependencies. * cflags - specify a list of additional flags to pass to the compiler. """ def build_libraries(self, libraries): for (lib_name, build_info) in libraries: sources = build_info.get('sources') if sources is None or not isinstance(sources, (list, tuple)): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'sources' must be present and must be " "a list of source filenames" % lib_name) sources = list(sources) log.info("building '%s' library", lib_name) # Make sure everything is the correct type. # obj_deps should be a dictionary of keys as sources # and a list/tuple of files that are its dependencies. obj_deps = build_info.get('obj_deps', dict()) if not isinstance(obj_deps, dict): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'obj_deps' must be a dictionary of " "type 'source: list'" % lib_name) dependencies = [] # Get the global dependencies that are specified by the '' key. # These will go into every source's dependency list. global_deps = obj_deps.get('', list()) if not isinstance(global_deps, (list, tuple)): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'obj_deps' must be a dictionary of " "type 'source: list'" % lib_name) # Build the list to be used by newer_pairwise_group # each source will be auto-added to its dependencies. for source in sources: src_deps = [source] src_deps.extend(global_deps) extra_deps = obj_deps.get(source, list()) if not isinstance(extra_deps, (list, tuple)): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'obj_deps' must be a dictionary of " "type 'source: list'" % lib_name) src_deps.extend(extra_deps) dependencies.append(src_deps) expected_objects = self.compiler.object_filenames( sources, output_dir=self.build_temp ) if newer_pairwise_group(dependencies, expected_objects) != ([], []): # First, compile the source code to object files in the library # directory. (This should probably change to putting object # files in a temporary build directory.) macros = build_info.get('macros') include_dirs = build_info.get('include_dirs') cflags = build_info.get('cflags') objects = self.compiler.compile( sources, output_dir=self.build_temp, macros=macros, include_dirs=include_dirs, extra_postargs=cflags, debug=self.debug ) # Now "link" the object files together into a static library. # (On Unix at least, this isn't really linking -- it just # builds an archive. Whatever.) self.compiler.create_static_lib( expected_objects, lib_name, output_dir=self.build_clib, debug=self.debug ) PK!O&!u3u3command/build_ext.pynu[import os import sys import itertools import imp from distutils.command.build_ext import build_ext as _du_build_ext from distutils.file_util import copy_file from distutils.ccompiler import new_compiler from distutils.sysconfig import customize_compiler, get_config_var from distutils.errors import DistutilsError from distutils import log from setuptools.extension import Library from setuptools.extern import six try: # Attempt to use Cython for building extensions, if available from Cython.Distutils.build_ext import build_ext as _build_ext # Additionally, assert that the compiler module will load # also. Ref #1229. __import__('Cython.Compiler.Main') except ImportError: _build_ext = _du_build_ext # make sure _config_vars is initialized get_config_var("LDSHARED") from distutils.sysconfig import _config_vars as _CONFIG_VARS def _customize_compiler_for_shlib(compiler): if sys.platform == "darwin": # building .dylib requires additional compiler flags on OSX; here we # temporarily substitute the pyconfig.h variables so that distutils' # 'customize_compiler' uses them before we build the shared libraries. tmp = _CONFIG_VARS.copy() try: # XXX Help! I don't have any idea whether these are right... _CONFIG_VARS['LDSHARED'] = ( "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") _CONFIG_VARS['CCSHARED'] = " -dynamiclib" _CONFIG_VARS['SO'] = ".dylib" customize_compiler(compiler) finally: _CONFIG_VARS.clear() _CONFIG_VARS.update(tmp) else: customize_compiler(compiler) have_rtld = False use_stubs = False libtype = 'shared' if sys.platform == "darwin": use_stubs = True elif os.name != 'nt': try: import dl use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') except ImportError: pass if_dl = lambda s: s if have_rtld else '' def get_abi3_suffix(): """Return the file extension for an abi3-compliant Extension()""" for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): if '.abi3' in suffix: # Unix return suffix elif suffix == '.pyd': # Windows return suffix class build_ext(_build_ext): def run(self): """Build extensions in build directory, then copy if --inplace""" old_inplace, self.inplace = self.inplace, 0 _build_ext.run(self) self.inplace = old_inplace if old_inplace: self.copy_extensions_to_source() def copy_extensions_to_source(self): build_py = self.get_finalized_command('build_py') for ext in self.extensions: fullname = self.get_ext_fullname(ext.name) filename = self.get_ext_filename(fullname) modpath = fullname.split('.') package = '.'.join(modpath[:-1]) package_dir = build_py.get_package_dir(package) dest_filename = os.path.join(package_dir, os.path.basename(filename)) src_filename = os.path.join(self.build_lib, filename) # Always copy, even if source is older than destination, to ensure # that the right extensions for the current Python/platform are # used. copy_file( src_filename, dest_filename, verbose=self.verbose, dry_run=self.dry_run ) if ext._needs_stub: self.write_stub(package_dir or os.curdir, ext, True) def get_ext_filename(self, fullname): filename = _build_ext.get_ext_filename(self, fullname) if fullname in self.ext_map: ext = self.ext_map[fullname] use_abi3 = ( six.PY3 and getattr(ext, 'py_limited_api') and get_abi3_suffix() ) if use_abi3: so_ext = _get_config_var_837('EXT_SUFFIX') filename = filename[:-len(so_ext)] filename = filename + get_abi3_suffix() if isinstance(ext, Library): fn, ext = os.path.splitext(filename) return self.shlib_compiler.library_filename(fn, libtype) elif use_stubs and ext._links_to_dynamic: d, fn = os.path.split(filename) return os.path.join(d, 'dl-' + fn) return filename def initialize_options(self): _build_ext.initialize_options(self) self.shlib_compiler = None self.shlibs = [] self.ext_map = {} def finalize_options(self): _build_ext.finalize_options(self) self.extensions = self.extensions or [] self.check_extensions_list(self.extensions) self.shlibs = [ext for ext in self.extensions if isinstance(ext, Library)] if self.shlibs: self.setup_shlib_compiler() for ext in self.extensions: ext._full_name = self.get_ext_fullname(ext.name) for ext in self.extensions: fullname = ext._full_name self.ext_map[fullname] = ext # distutils 3.1 will also ask for module names # XXX what to do with conflicts? self.ext_map[fullname.split('.')[-1]] = ext ltd = self.shlibs and self.links_to_dynamic(ext) or False ns = ltd and use_stubs and not isinstance(ext, Library) ext._links_to_dynamic = ltd ext._needs_stub = ns filename = ext._file_name = self.get_ext_filename(fullname) libdir = os.path.dirname(os.path.join(self.build_lib, filename)) if ltd and libdir not in ext.library_dirs: ext.library_dirs.append(libdir) if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: ext.runtime_library_dirs.append(os.curdir) def setup_shlib_compiler(self): compiler = self.shlib_compiler = new_compiler( compiler=self.compiler, dry_run=self.dry_run, force=self.force ) _customize_compiler_for_shlib(compiler) if self.include_dirs is not None: compiler.set_include_dirs(self.include_dirs) if self.define is not None: # 'define' option is a list of (name,value) tuples for (name, value) in self.define: compiler.define_macro(name, value) if self.undef is not None: for macro in self.undef: compiler.undefine_macro(macro) if self.libraries is not None: compiler.set_libraries(self.libraries) if self.library_dirs is not None: compiler.set_library_dirs(self.library_dirs) if self.rpath is not None: compiler.set_runtime_library_dirs(self.rpath) if self.link_objects is not None: compiler.set_link_objects(self.link_objects) # hack so distutils' build_extension() builds a library instead compiler.link_shared_object = link_shared_object.__get__(compiler) def get_export_symbols(self, ext): if isinstance(ext, Library): return ext.export_symbols return _build_ext.get_export_symbols(self, ext) def build_extension(self, ext): ext._convert_pyx_sources_to_lang() _compiler = self.compiler try: if isinstance(ext, Library): self.compiler = self.shlib_compiler _build_ext.build_extension(self, ext) if ext._needs_stub: cmd = self.get_finalized_command('build_py').build_lib self.write_stub(cmd, ext) finally: self.compiler = _compiler def links_to_dynamic(self, ext): """Return true if 'ext' links to a dynamic lib in the same package""" # XXX this should check to ensure the lib is actually being built # XXX as dynamic, and not just using a locally-found version or a # XXX static-compiled version libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) return any(pkg + libname in libnames for libname in ext.libraries) def get_outputs(self): return _build_ext.get_outputs(self) + self.__get_stubs_outputs() def __get_stubs_outputs(self): # assemble the base name for each extension that needs a stub ns_ext_bases = ( os.path.join(self.build_lib, *ext._full_name.split('.')) for ext in self.extensions if ext._needs_stub ) # pair each base with the extension pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) return list(base + fnext for base, fnext in pairs) def __get_output_extensions(self): yield '.py' yield '.pyc' if self.get_finalized_command('build_py').optimize: yield '.pyo' def write_stub(self, output_dir, ext, compile=False): log.info("writing stub loader for %s to %s", ext._full_name, output_dir) stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + '.py') if compile and os.path.exists(stub_file): raise DistutilsError(stub_file + " already exists! Please delete.") if not self.dry_run: f = open(stub_file, 'w') f.write( '\n'.join([ "def __bootstrap__():", " global __bootstrap__, __file__, __loader__", " import sys, os, pkg_resources, imp" + if_dl(", dl"), " __file__ = pkg_resources.resource_filename" "(__name__,%r)" % os.path.basename(ext._file_name), " del __bootstrap__", " if '__loader__' in globals():", " del __loader__", if_dl(" old_flags = sys.getdlopenflags()"), " old_dir = os.getcwd()", " try:", " os.chdir(os.path.dirname(__file__))", if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), " imp.load_dynamic(__name__,__file__)", " finally:", if_dl(" sys.setdlopenflags(old_flags)"), " os.chdir(old_dir)", "__bootstrap__()", "" # terminal \n ]) ) f.close() if compile: from distutils.util import byte_compile byte_compile([stub_file], optimize=0, force=True, dry_run=self.dry_run) optimize = self.get_finalized_command('install_lib').optimize if optimize > 0: byte_compile([stub_file], optimize=optimize, force=True, dry_run=self.dry_run) if os.path.exists(stub_file) and not self.dry_run: os.unlink(stub_file) if use_stubs or os.name == 'nt': # Build shared libraries # def link_shared_object( self, objects, output_libname, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None): self.link( self.SHARED_LIBRARY, objects, output_libname, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang ) else: # Build static libraries everywhere else libtype = 'static' def link_shared_object( self, objects, output_libname, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None): # XXX we need to either disallow these attrs on Library instances, # or warn/abort here if set, or something... # libraries=None, library_dirs=None, runtime_library_dirs=None, # export_symbols=None, extra_preargs=None, extra_postargs=None, # build_temp=None assert output_dir is None # distutils build_ext doesn't pass this output_dir, filename = os.path.split(output_libname) basename, ext = os.path.splitext(filename) if self.library_filename("x").startswith('lib'): # strip 'lib' prefix; this is kludgy if some platform uses # a different prefix basename = basename[3:] self.create_static_lib( objects, basename, output_dir, debug, target_lang ) def _get_config_var_837(name): """ In https://github.com/pypa/setuptools/pull/837, we discovered Python 3.3.0 exposes the extension suffix under the name 'SO'. """ if sys.version_info < (3, 3, 1): name = 'SO' return get_config_var(name) PK!@FB|%|%command/build_py.pynu[from glob import glob from distutils.util import convert_path import distutils.command.build_py as orig import os import fnmatch import textwrap import io import distutils.errors import itertools from setuptools.extern import six from setuptools.extern.six.moves import map, filter, filterfalse try: from setuptools.lib2to3_ex import Mixin2to3 except ImportError: class Mixin2to3: def run_2to3(self, files, doctests=True): "do nothing" class build_py(orig.build_py, Mixin2to3): """Enhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. See 'setuptools.dist.Distribution' for more details. Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. """ def finalize_options(self): orig.build_py.finalize_options(self) self.package_data = self.distribution.package_data self.exclude_package_data = (self.distribution.exclude_package_data or {}) if 'data_files' in self.__dict__: del self.__dict__['data_files'] self.__updated_files = [] self.__doctests_2to3 = [] def run(self): """Build modules, packages, and copy data files to build directory""" if not self.py_modules and not self.packages: return if self.py_modules: self.build_modules() if self.packages: self.build_packages() self.build_package_data() self.run_2to3(self.__updated_files, False) self.run_2to3(self.__updated_files, True) self.run_2to3(self.__doctests_2to3, True) # Only compile actual .py files, using our base class' idea of what our # output files are. self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) def __getattr__(self, attr): "lazily compute data files" if attr == 'data_files': self.data_files = self._get_data_files() return self.data_files return orig.build_py.__getattr__(self, attr) def build_module(self, module, module_file, package): if six.PY2 and isinstance(package, six.string_types): # avoid errors on Python 2 when unicode is passed (#190) package = package.split('.') outfile, copied = orig.build_py.build_module(self, module, module_file, package) if copied: self.__updated_files.append(outfile) return outfile, copied def _get_data_files(self): """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" self.analyze_manifest() return list(map(self._get_pkg_data_files, self.packages or ())) def _get_pkg_data_files(self, package): # Locate package source directory src_dir = self.get_package_dir(package) # Compute package build directory build_dir = os.path.join(*([self.build_lib] + package.split('.'))) # Strip directory from globbed filenames filenames = [ os.path.relpath(file, src_dir) for file in self.find_data_files(package, src_dir) ] return package, src_dir, build_dir, filenames def find_data_files(self, package, src_dir): """Return filenames for package's data files in 'src_dir'""" patterns = self._get_platform_patterns( self.package_data, package, src_dir, ) globs_expanded = map(glob, patterns) # flatten the expanded globs into an iterable of matches globs_matches = itertools.chain.from_iterable(globs_expanded) glob_files = filter(os.path.isfile, globs_matches) files = itertools.chain( self.manifest_files.get(package, []), glob_files, ) return self.exclude_data_files(package, src_dir, files) def build_package_data(self): """Copy data files into build directory""" for package, src_dir, build_dir, filenames in self.data_files: for filename in filenames: target = os.path.join(build_dir, filename) self.mkpath(os.path.dirname(target)) srcfile = os.path.join(src_dir, filename) outf, copied = self.copy_file(srcfile, target) srcfile = os.path.abspath(srcfile) if (copied and srcfile in self.distribution.convert_2to3_doctests): self.__doctests_2to3.append(outf) def analyze_manifest(self): self.manifest_files = mf = {} if not self.distribution.include_package_data: return src_dirs = {} for package in self.packages or (): # Locate package source directory src_dirs[assert_relative(self.get_package_dir(package))] = package self.run_command('egg_info') ei_cmd = self.get_finalized_command('egg_info') for path in ei_cmd.filelist.files: d, f = os.path.split(assert_relative(path)) prev = None oldf = f while d and d != prev and d not in src_dirs: prev = d d, df = os.path.split(d) f = os.path.join(df, f) if d in src_dirs: if path.endswith('.py') and f == oldf: continue # it's a module, not data mf.setdefault(src_dirs[d], []).append(path) def get_data_files(self): pass # Lazily compute data files in _get_data_files() function. def check_package(self, package, package_dir): """Check namespace packages' __init__ for declare_namespace""" try: return self.packages_checked[package] except KeyError: pass init_py = orig.build_py.check_package(self, package, package_dir) self.packages_checked[package] = init_py if not init_py or not self.distribution.namespace_packages: return init_py for pkg in self.distribution.namespace_packages: if pkg == package or pkg.startswith(package + '.'): break else: return init_py with io.open(init_py, 'rb') as f: contents = f.read() if b'declare_namespace' not in contents: raise distutils.errors.DistutilsError( "Namespace package problem: %s is a namespace package, but " "its\n__init__.py does not call declare_namespace()! Please " 'fix it.\n(See the setuptools manual under ' '"Namespace Packages" for details.)\n"' % (package,) ) return init_py def initialize_options(self): self.packages_checked = {} orig.build_py.initialize_options(self) def get_package_dir(self, package): res = orig.build_py.get_package_dir(self, package) if self.distribution.src_root is not None: return os.path.join(self.distribution.src_root, res) return res def exclude_data_files(self, package, src_dir, files): """Filter filenames for package's data files in 'src_dir'""" files = list(files) patterns = self._get_platform_patterns( self.exclude_package_data, package, src_dir, ) match_groups = ( fnmatch.filter(files, pattern) for pattern in patterns ) # flatten the groups of matches into an iterable of matches matches = itertools.chain.from_iterable(match_groups) bad = set(matches) keepers = ( fn for fn in files if fn not in bad ) # ditch dupes return list(_unique_everseen(keepers)) @staticmethod def _get_platform_patterns(spec, package, src_dir): """ yield platform-specific path patterns (suitable for glob or fn_match) from a glob-based spec (such as self.package_data or self.exclude_package_data) matching package in src_dir. """ raw_patterns = itertools.chain( spec.get('', []), spec.get(package, []), ) return ( # Each pattern has to be converted to a platform-specific path os.path.join(src_dir, convert_path(pattern)) for pattern in raw_patterns ) # from Python docs def _unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." # unique_everseen('AAAABBBCCDAABBB') --> A B C D # unique_everseen('ABBCcAD', str.lower) --> A B C D seen = set() seen_add = seen.add if key is None: for element in filterfalse(seen.__contains__, iterable): seen_add(element) yield element else: for element in iterable: k = key(element) if k not in seen: seen_add(k) yield element def assert_relative(path): if not os.path.isabs(path): return path from distutils.errors import DistutilsSetupError msg = textwrap.dedent(""" Error: setup script specifies an absolute path: %s setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. """).lstrip() % path raise DistutilsSetupError(msg) PK!@\;nncommand/develop.pynu[from distutils.util import convert_path from distutils import log from distutils.errors import DistutilsError, DistutilsOptionError import os import glob import io from setuptools.extern import six from pkg_resources import Distribution, PathMetadata, normalize_path from setuptools.command.easy_install import easy_install from setuptools import namespaces import setuptools class develop(namespaces.DevelopInstaller, easy_install): """Set up package for development""" description = "install package in 'development mode'" user_options = easy_install.user_options + [ ("uninstall", "u", "Uninstall this source package"), ("egg-path=", None, "Set the path to be used in the .egg-link file"), ] boolean_options = easy_install.boolean_options + ['uninstall'] command_consumes_arguments = False # override base def run(self): if self.uninstall: self.multi_version = True self.uninstall_link() self.uninstall_namespaces() else: self.install_for_development() self.warn_deprecated_options() def initialize_options(self): self.uninstall = None self.egg_path = None easy_install.initialize_options(self) self.setup_path = None self.always_copy_from = '.' # always copy eggs installed in curdir def finalize_options(self): ei = self.get_finalized_command("egg_info") if ei.broken_egg_info: template = "Please rename %r to %r before using 'develop'" args = ei.egg_info, ei.broken_egg_info raise DistutilsError(template % args) self.args = [ei.egg_name] easy_install.finalize_options(self) self.expand_basedirs() self.expand_dirs() # pick up setup-dir .egg files only: no .egg-info self.package_index.scan(glob.glob('*.egg')) egg_link_fn = ei.egg_name + '.egg-link' self.egg_link = os.path.join(self.install_dir, egg_link_fn) self.egg_base = ei.egg_base if self.egg_path is None: self.egg_path = os.path.abspath(ei.egg_base) target = normalize_path(self.egg_base) egg_path = normalize_path(os.path.join(self.install_dir, self.egg_path)) if egg_path != target: raise DistutilsOptionError( "--egg-path must be a relative path from the install" " directory to " + target ) # Make a distribution for the package's source self.dist = Distribution( target, PathMetadata(target, os.path.abspath(ei.egg_info)), project_name=ei.egg_name ) self.setup_path = self._resolve_setup_path( self.egg_base, self.install_dir, self.egg_path, ) @staticmethod def _resolve_setup_path(egg_base, install_dir, egg_path): """ Generate a path from egg_base back to '.' where the setup script resides and ensure that path points to the setup path from $install_dir/$egg_path. """ path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') if path_to_setup != os.curdir: path_to_setup = '../' * (path_to_setup.count('/') + 1) resolved = normalize_path( os.path.join(install_dir, egg_path, path_to_setup) ) if resolved != normalize_path(os.curdir): raise DistutilsOptionError( "Can't get a consistent path to setup script from" " installation directory", resolved, normalize_path(os.curdir)) return path_to_setup def install_for_development(self): if six.PY3 and getattr(self.distribution, 'use_2to3', False): # If we run 2to3 we can not do this inplace: # Ensure metadata is up-to-date self.reinitialize_command('build_py', inplace=0) self.run_command('build_py') bpy_cmd = self.get_finalized_command("build_py") build_path = normalize_path(bpy_cmd.build_lib) # Build extensions self.reinitialize_command('egg_info', egg_base=build_path) self.run_command('egg_info') self.reinitialize_command('build_ext', inplace=0) self.run_command('build_ext') # Fixup egg-link and easy-install.pth ei_cmd = self.get_finalized_command("egg_info") self.egg_path = build_path self.dist.location = build_path # XXX self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) else: # Without 2to3 inplace works fine: self.run_command('egg_info') # Build extensions in-place self.reinitialize_command('build_ext', inplace=1) self.run_command('build_ext') self.install_site_py() # ensure that target dir is site-safe if setuptools.bootstrap_install_from: self.easy_install(setuptools.bootstrap_install_from) setuptools.bootstrap_install_from = None self.install_namespaces() # create an .egg-link in the installation dir, pointing to our egg log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) if not self.dry_run: with open(self.egg_link, "w") as f: f.write(self.egg_path + "\n" + self.setup_path) # postprocess the installed distro, fixing up .pth, installing scripts, # and handling requirements self.process_distribution(None, self.dist, not self.no_deps) def uninstall_link(self): if os.path.exists(self.egg_link): log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) egg_link_file = open(self.egg_link) contents = [line.rstrip() for line in egg_link_file] egg_link_file.close() if contents not in ([self.egg_path], [self.egg_path, self.setup_path]): log.warn("Link points to %s: uninstall aborted", contents) return if not self.dry_run: os.unlink(self.egg_link) if not self.dry_run: self.update_pth(self.dist) # remove any .pth link to us if self.distribution.scripts: # XXX should also check for entry point scripts! log.warn("Note: you must uninstall or replace scripts manually!") def install_egg_scripts(self, dist): if dist is not self.dist: # Installing a dependency, so fall back to normal behavior return easy_install.install_egg_scripts(self, dist) # create wrapper scripts in the script dir, pointing to dist.scripts # new-style... self.install_wrapper_scripts(dist) # ...and old-style for script_name in self.distribution.scripts or []: script_path = os.path.abspath(convert_path(script_name)) script_name = os.path.basename(script_path) with io.open(script_path) as strm: script_text = strm.read() self.install_script(dist, script_name, script_text, script_path) def install_wrapper_scripts(self, dist): dist = VersionlessRequirement(dist) return easy_install.install_wrapper_scripts(self, dist) class VersionlessRequirement(object): """ Adapt a pkg_resources.Distribution to simply return the project name as the 'requirement' so that scripts will work across multiple versions. >>> dist = Distribution(project_name='foo', version='1.0') >>> str(dist.as_requirement()) 'foo==1.0' >>> adapted_dist = VersionlessRequirement(dist) >>> str(adapted_dist.as_requirement()) 'foo' """ def __init__(self, dist): self.__dist = dist def __getattr__(self, name): return getattr(self.__dist, name) def as_requirement(self): return self.project_name PK!command/dist_info.pynu[""" Create a dist_info directory As defined in the wheel specification """ import os from distutils.core import Command from distutils import log class dist_info(Command): description = 'create a .dist-info directory' user_options = [ ('egg-base=', 'e', "directory containing .egg-info directories" " (default: top of the source tree)"), ] def initialize_options(self): self.egg_base = None def finalize_options(self): pass def run(self): egg_info = self.get_finalized_command('egg_info') egg_info.egg_base = self.egg_base egg_info.finalize_options() egg_info.run() dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) bdist_wheel = self.get_finalized_command('bdist_wheel') bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) PK!rKSScommand/easy_install.pynu[""" Easy Install ------------ A tool for doing automatic download/extract/build of distutils-based Python packages. For detailed documentation, see the accompanying EasyInstall.txt file, or visit the `EasyInstall home page`__. __ https://setuptools.readthedocs.io/en/latest/easy_install.html """ from glob import glob from distutils.util import get_platform from distutils.util import convert_path, subst_vars from distutils.errors import ( DistutilsArgError, DistutilsOptionError, DistutilsError, DistutilsPlatformError, ) from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS from distutils import log, dir_util from distutils.command.build_scripts import first_line_re from distutils.spawn import find_executable import sys import os import zipimport import shutil import tempfile import zipfile import re import stat import random import textwrap import warnings import site import struct import contextlib import subprocess import shlex import io from setuptools.extern import six from setuptools.extern.six.moves import configparser, map from setuptools import Command from setuptools.sandbox import run_setup from setuptools.py31compat import get_path, get_config_vars from setuptools.py27compat import rmtree_safe from setuptools.command import setopt from setuptools.archive_util import unpack_archive from setuptools.package_index import ( PackageIndex, parse_requirement_arg, URL_SCHEME, ) from setuptools.command import bdist_egg, egg_info from setuptools.wheel import Wheel from pkg_resources import ( yield_lines, normalize_path, resource_string, ensure_directory, get_distribution, find_distributions, Environment, Requirement, Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, VersionConflict, DEVELOP_DIST, ) import pkg_resources.py31compat # Turn on PEP440Warnings warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) __all__ = [ 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', 'main', 'get_exe_prefixes', ] def is_64bit(): return struct.calcsize("P") == 8 def samefile(p1, p2): """ Determine if two paths reference the same file. Augments os.path.samefile to work on Windows and suppresses errors if the path doesn't exist. """ both_exist = os.path.exists(p1) and os.path.exists(p2) use_samefile = hasattr(os.path, 'samefile') and both_exist if use_samefile: return os.path.samefile(p1, p2) norm_p1 = os.path.normpath(os.path.normcase(p1)) norm_p2 = os.path.normpath(os.path.normcase(p2)) return norm_p1 == norm_p2 if six.PY2: def _to_ascii(s): return s def isascii(s): try: six.text_type(s, 'ascii') return True except UnicodeError: return False else: def _to_ascii(s): return s.encode('ascii') def isascii(s): try: s.encode('ascii') return True except UnicodeError: return False _one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') class easy_install(Command): """Manage a download/build/install process""" description = "Find/get/install Python packages" command_consumes_arguments = True user_options = [ ('prefix=', None, "installation prefix"), ("zip-ok", "z", "install package as a zipfile"), ("multi-version", "m", "make apps have to require() a version"), ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), ("install-dir=", "d", "install package to DIR"), ("script-dir=", "s", "install scripts to DIR"), ("exclude-scripts", "x", "Don't install scripts"), ("always-copy", "a", "Copy all needed packages to install dir"), ("index-url=", "i", "base URL of Python Package Index"), ("find-links=", "f", "additional URL(s) to search for packages"), ("build-directory=", "b", "download/extract/build in DIR; keep the results"), ('optimize=', 'O', "also compile with optimization: -O1 for \"python -O\", " "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), ('record=', None, "filename in which to record list of installed files"), ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), ('site-dirs=', 'S', "list of directories where .pth files work"), ('editable', 'e', "Install specified packages in editable form"), ('no-deps', 'N', "don't install dependencies"), ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), ('local-snapshots-ok', 'l', "allow building eggs from local checkouts"), ('version', None, "print version information and exit"), ('no-find-links', None, "Don't load find-links defined in packages being installed") ] boolean_options = [ 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', 'editable', 'no-deps', 'local-snapshots-ok', 'version' ] if site.ENABLE_USER_SITE: help_msg = "install in user site-package '%s'" % site.USER_SITE user_options.append(('user', None, help_msg)) boolean_options.append('user') negative_opt = {'always-unzip': 'zip-ok'} create_index = PackageIndex def initialize_options(self): # the --user option seems to be an opt-in one, # so the default should be False. self.user = 0 self.zip_ok = self.local_snapshots_ok = None self.install_dir = self.script_dir = self.exclude_scripts = None self.index_url = None self.find_links = None self.build_directory = None self.args = None self.optimize = self.record = None self.upgrade = self.always_copy = self.multi_version = None self.editable = self.no_deps = self.allow_hosts = None self.root = self.prefix = self.no_report = None self.version = None self.install_purelib = None # for pure module distributions self.install_platlib = None # non-pure (dists w/ extensions) self.install_headers = None # for C/C++ headers self.install_lib = None # set to either purelib or platlib self.install_scripts = None self.install_data = None self.install_base = None self.install_platbase = None if site.ENABLE_USER_SITE: self.install_userbase = site.USER_BASE self.install_usersite = site.USER_SITE else: self.install_userbase = None self.install_usersite = None self.no_find_links = None # Options not specifiable via command line self.package_index = None self.pth_file = self.always_copy_from = None self.site_dirs = None self.installed_projects = {} self.sitepy_installed = False # Always read easy_install options, even if we are subclassed, or have # an independent instance created. This ensures that defaults will # always come from the standard configuration file(s)' "easy_install" # section, even if this is a "develop" or "install" command, or some # other embedding. self._dry_run = None self.verbose = self.distribution.verbose self.distribution._set_command_options( self, self.distribution.get_option_dict('easy_install') ) def delete_blockers(self, blockers): extant_blockers = ( filename for filename in blockers if os.path.exists(filename) or os.path.islink(filename) ) list(map(self._delete_path, extant_blockers)) def _delete_path(self, path): log.info("Deleting %s", path) if self.dry_run: return is_tree = os.path.isdir(path) and not os.path.islink(path) remover = rmtree if is_tree else os.unlink remover(path) @staticmethod def _render_version(): """ Render the Setuptools version and installation details, then exit. """ ver = sys.version[:3] dist = get_distribution('setuptools') tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' print(tmpl.format(**locals())) raise SystemExit() def finalize_options(self): self.version and self._render_version() py_version = sys.version.split()[0] prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') self.config_vars = { 'dist_name': self.distribution.get_name(), 'dist_version': self.distribution.get_version(), 'dist_fullname': self.distribution.get_fullname(), 'py_version': py_version, 'py_version_short': py_version[0:3], 'py_version_nodot': py_version[0] + py_version[2], 'sys_prefix': prefix, 'prefix': prefix, 'sys_exec_prefix': exec_prefix, 'exec_prefix': exec_prefix, # Only python 3.2+ has abiflags 'abiflags': getattr(sys, 'abiflags', ''), } if site.ENABLE_USER_SITE: self.config_vars['userbase'] = self.install_userbase self.config_vars['usersite'] = self.install_usersite self._fix_install_dir_for_user_site() self.expand_basedirs() self.expand_dirs() self._expand( 'install_dir', 'script_dir', 'build_directory', 'site_dirs', ) # If a non-default installation directory was specified, default the # script directory to match it. if self.script_dir is None: self.script_dir = self.install_dir if self.no_find_links is None: self.no_find_links = False # Let install_dir get set by install_lib command, which in turn # gets its info from the install command, and takes into account # --prefix and --home and all that other crud. self.set_undefined_options( 'install_lib', ('install_dir', 'install_dir') ) # Likewise, set default script_dir from 'install_scripts.install_dir' self.set_undefined_options( 'install_scripts', ('install_dir', 'script_dir') ) if self.user and self.install_purelib: self.install_dir = self.install_purelib self.script_dir = self.install_scripts # default --record from the install command self.set_undefined_options('install', ('record', 'record')) # Should this be moved to the if statement below? It's not used # elsewhere normpath = map(normalize_path, sys.path) self.all_site_dirs = get_site_dirs() if self.site_dirs is not None: site_dirs = [ os.path.expanduser(s.strip()) for s in self.site_dirs.split(',') ] for d in site_dirs: if not os.path.isdir(d): log.warn("%s (in --site-dirs) does not exist", d) elif normalize_path(d) not in normpath: raise DistutilsOptionError( d + " (in --site-dirs) is not on sys.path" ) else: self.all_site_dirs.append(normalize_path(d)) if not self.editable: self.check_site_dir() self.index_url = self.index_url or "https://pypi.python.org/simple" self.shadow_path = self.all_site_dirs[:] for path_item in self.install_dir, normalize_path(self.script_dir): if path_item not in self.shadow_path: self.shadow_path.insert(0, path_item) if self.allow_hosts is not None: hosts = [s.strip() for s in self.allow_hosts.split(',')] else: hosts = ['*'] if self.package_index is None: self.package_index = self.create_index( self.index_url, search_path=self.shadow_path, hosts=hosts, ) self.local_index = Environment(self.shadow_path + sys.path) if self.find_links is not None: if isinstance(self.find_links, six.string_types): self.find_links = self.find_links.split() else: self.find_links = [] if self.local_snapshots_ok: self.package_index.scan_egg_links(self.shadow_path + sys.path) if not self.no_find_links: self.package_index.add_find_links(self.find_links) self.set_undefined_options('install_lib', ('optimize', 'optimize')) if not isinstance(self.optimize, int): try: self.optimize = int(self.optimize) if not (0 <= self.optimize <= 2): raise ValueError except ValueError: raise DistutilsOptionError("--optimize must be 0, 1, or 2") if self.editable and not self.build_directory: raise DistutilsArgError( "Must specify a build directory (-b) when using --editable" ) if not self.args: raise DistutilsArgError( "No urls, filenames, or requirements specified (see --help)") self.outputs = [] def _fix_install_dir_for_user_site(self): """ Fix the install_dir if "--user" was used. """ if not self.user or not site.ENABLE_USER_SITE: return self.create_home_path() if self.install_userbase is None: msg = "User base directory is not specified" raise DistutilsPlatformError(msg) self.install_base = self.install_platbase = self.install_userbase scheme_name = os.name.replace('posix', 'unix') + '_user' self.select_scheme(scheme_name) def _expand_attrs(self, attrs): for attr in attrs: val = getattr(self, attr) if val is not None: if os.name == 'posix' or os.name == 'nt': val = os.path.expanduser(val) val = subst_vars(val, self.config_vars) setattr(self, attr, val) def expand_basedirs(self): """Calls `os.path.expanduser` on install_base, install_platbase and root.""" self._expand_attrs(['install_base', 'install_platbase', 'root']) def expand_dirs(self): """Calls `os.path.expanduser` on install dirs.""" dirs = [ 'install_purelib', 'install_platlib', 'install_lib', 'install_headers', 'install_scripts', 'install_data', ] self._expand_attrs(dirs) def run(self): if self.verbose != self.distribution.verbose: log.set_verbosity(self.verbose) try: for spec in self.args: self.easy_install(spec, not self.no_deps) if self.record: outputs = self.outputs if self.root: # strip any package prefix root_len = len(self.root) for counter in range(len(outputs)): outputs[counter] = outputs[counter][root_len:] from distutils import file_util self.execute( file_util.write_file, (self.record, outputs), "writing list of installed files to '%s'" % self.record ) self.warn_deprecated_options() finally: log.set_verbosity(self.distribution.verbose) def pseudo_tempname(self): """Return a pseudo-tempname base in the install directory. This code is intentionally naive; if a malicious party can write to the target directory you're already in deep doodoo. """ try: pid = os.getpid() except Exception: pid = random.randint(0, sys.maxsize) return os.path.join(self.install_dir, "test-easy-install-%s" % pid) def warn_deprecated_options(self): pass def check_site_dir(self): """Verify that self.install_dir is .pth-capable dir, if needed""" instdir = normalize_path(self.install_dir) pth_file = os.path.join(instdir, 'easy-install.pth') # Is it a configured, PYTHONPATH, implicit, or explicit site dir? is_site_dir = instdir in self.all_site_dirs if not is_site_dir and not self.multi_version: # No? Then directly test whether it does .pth file processing is_site_dir = self.check_pth_processing() else: # make sure we can write to target dir testfile = self.pseudo_tempname() + '.write-test' test_exists = os.path.exists(testfile) try: if test_exists: os.unlink(testfile) open(testfile, 'w').close() os.unlink(testfile) except (OSError, IOError): self.cant_write_to_target() if not is_site_dir and not self.multi_version: # Can't install non-multi to non-site dir raise DistutilsError(self.no_default_version_msg()) if is_site_dir: if self.pth_file is None: self.pth_file = PthDistributions(pth_file, self.all_site_dirs) else: self.pth_file = None if instdir not in map(normalize_path, _pythonpath()): # only PYTHONPATH dirs need a site.py, so pretend it's there self.sitepy_installed = True elif self.multi_version and not os.path.exists(pth_file): self.sitepy_installed = True # don't need site.py in this case self.pth_file = None # and don't create a .pth file self.install_dir = instdir __cant_write_msg = textwrap.dedent(""" can't create or remove files in install directory The following error occurred while trying to add or remove files in the installation directory: %s The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: %s """).lstrip() __not_exists_id = textwrap.dedent(""" This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option). """).lstrip() __access_msg = textwrap.dedent(""" Perhaps your account does not have write access to this directory? If the installation directory is a system-owned directory, you may need to sign in as the administrator or "root" account. If you do not have administrative access to this machine, you may wish to choose a different installation directory, preferably one that is listed in your PYTHONPATH environment variable. For information on other options, you may wish to consult the documentation at: https://setuptools.readthedocs.io/en/latest/easy_install.html Please make the appropriate changes for your system and try again. """).lstrip() def cant_write_to_target(self): msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) if not os.path.exists(self.install_dir): msg += '\n' + self.__not_exists_id else: msg += '\n' + self.__access_msg raise DistutilsError(msg) def check_pth_processing(self): """Empirically verify whether .pth files are supported in inst. dir""" instdir = self.install_dir log.info("Checking .pth file support in %s", instdir) pth_file = self.pseudo_tempname() + ".pth" ok_file = pth_file + '.ok' ok_exists = os.path.exists(ok_file) tmpl = _one_liner(""" import os f = open({ok_file!r}, 'w') f.write('OK') f.close() """) + '\n' try: if ok_exists: os.unlink(ok_file) dirname = os.path.dirname(ok_file) pkg_resources.py31compat.makedirs(dirname, exist_ok=True) f = open(pth_file, 'w') except (OSError, IOError): self.cant_write_to_target() else: try: f.write(tmpl.format(**locals())) f.close() f = None executable = sys.executable if os.name == 'nt': dirname, basename = os.path.split(executable) alt = os.path.join(dirname, 'pythonw.exe') use_alt = ( basename.lower() == 'python.exe' and os.path.exists(alt) ) if use_alt: # use pythonw.exe to avoid opening a console window executable = alt from distutils.spawn import spawn spawn([executable, '-E', '-c', 'pass'], 0) if os.path.exists(ok_file): log.info( "TEST PASSED: %s appears to support .pth files", instdir ) return True finally: if f: f.close() if os.path.exists(ok_file): os.unlink(ok_file) if os.path.exists(pth_file): os.unlink(pth_file) if not self.multi_version: log.warn("TEST FAILED: %s does NOT support .pth files", instdir) return False def install_egg_scripts(self, dist): """Write all the scripts for `dist`, unless scripts are excluded""" if not self.exclude_scripts and dist.metadata_isdir('scripts'): for script_name in dist.metadata_listdir('scripts'): if dist.metadata_isdir('scripts/' + script_name): # The "script" is a directory, likely a Python 3 # __pycache__ directory, so skip it. continue self.install_script( dist, script_name, dist.get_metadata('scripts/' + script_name) ) self.install_wrapper_scripts(dist) def add_output(self, path): if os.path.isdir(path): for base, dirs, files in os.walk(path): for filename in files: self.outputs.append(os.path.join(base, filename)) else: self.outputs.append(path) def not_editable(self, spec): if self.editable: raise DistutilsArgError( "Invalid argument %r: you can't use filenames or URLs " "with --editable (except via the --find-links option)." % (spec,) ) def check_editable(self, spec): if not self.editable: return if os.path.exists(os.path.join(self.build_directory, spec.key)): raise DistutilsArgError( "%r already exists in %s; can't do a checkout there" % (spec.key, self.build_directory) ) @contextlib.contextmanager def _tmpdir(self): tmpdir = tempfile.mkdtemp(prefix=six.u("easy_install-")) try: # cast to str as workaround for #709 and #710 and #712 yield str(tmpdir) finally: os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) def easy_install(self, spec, deps=False): if not self.editable: self.install_site_py() with self._tmpdir() as tmpdir: if not isinstance(spec, Requirement): if URL_SCHEME(spec): # It's a url, download it to tmpdir and process self.not_editable(spec) dl = self.package_index.download(spec, tmpdir) return self.install_item(None, dl, tmpdir, deps, True) elif os.path.exists(spec): # Existing file or directory, just process it directly self.not_editable(spec) return self.install_item(None, spec, tmpdir, deps, True) else: spec = parse_requirement_arg(spec) self.check_editable(spec) dist = self.package_index.fetch_distribution( spec, tmpdir, self.upgrade, self.editable, not self.always_copy, self.local_index ) if dist is None: msg = "Could not find suitable distribution for %r" % spec if self.always_copy: msg += " (--always-copy skips system and development eggs)" raise DistutilsError(msg) elif dist.precedence == DEVELOP_DIST: # .egg-info dists don't need installing, just process deps self.process_distribution(spec, dist, deps, "Using") return dist else: return self.install_item(spec, dist.location, tmpdir, deps) def install_item(self, spec, download, tmpdir, deps, install_needed=False): # Installation is also needed if file in tmpdir or is not an egg install_needed = install_needed or self.always_copy install_needed = install_needed or os.path.dirname(download) == tmpdir install_needed = install_needed or not download.endswith('.egg') install_needed = install_needed or ( self.always_copy_from is not None and os.path.dirname(normalize_path(download)) == normalize_path(self.always_copy_from) ) if spec and not install_needed: # at this point, we know it's a local .egg, we just don't know if # it's already installed. for dist in self.local_index[spec.project_name]: if dist.location == download: break else: install_needed = True # it's not in the local index log.info("Processing %s", os.path.basename(download)) if install_needed: dists = self.install_eggs(spec, download, tmpdir) for dist in dists: self.process_distribution(spec, dist, deps) else: dists = [self.egg_distribution(download)] self.process_distribution(spec, dists[0], deps, "Using") if spec is not None: for dist in dists: if dist in spec: return dist def select_scheme(self, name): """Sets the install directories by applying the install schemes.""" # it's the caller's problem if they supply a bad name! scheme = INSTALL_SCHEMES[name] for key in SCHEME_KEYS: attrname = 'install_' + key if getattr(self, attrname) is None: setattr(self, attrname, scheme[key]) def process_distribution(self, requirement, dist, deps=True, *info): self.update_pth(dist) self.package_index.add(dist) if dist in self.local_index[dist.key]: self.local_index.remove(dist) self.local_index.add(dist) self.install_egg_scripts(dist) self.installed_projects[dist.key] = dist log.info(self.installation_report(requirement, dist, *info)) if (dist.has_metadata('dependency_links.txt') and not self.no_find_links): self.package_index.add_find_links( dist.get_metadata_lines('dependency_links.txt') ) if not deps and not self.always_copy: return elif requirement is not None and dist.key != requirement.key: log.warn("Skipping dependencies for %s", dist) return # XXX this is not the distribution we were looking for elif requirement is None or dist not in requirement: # if we wound up with a different version, resolve what we've got distreq = dist.as_requirement() requirement = Requirement(str(distreq)) log.info("Processing dependencies for %s", requirement) try: distros = WorkingSet([]).resolve( [requirement], self.local_index, self.easy_install ) except DistributionNotFound as e: raise DistutilsError(str(e)) except VersionConflict as e: raise DistutilsError(e.report()) if self.always_copy or self.always_copy_from: # Force all the relevant distros to be copied or activated for dist in distros: if dist.key not in self.installed_projects: self.easy_install(dist.as_requirement()) log.info("Finished processing dependencies for %s", requirement) def should_unzip(self, dist): if self.zip_ok is not None: return not self.zip_ok if dist.has_metadata('not-zip-safe'): return True if not dist.has_metadata('zip-safe'): return True return False def maybe_move(self, spec, dist_filename, setup_base): dst = os.path.join(self.build_directory, spec.key) if os.path.exists(dst): msg = ( "%r already exists in %s; build directory %s will not be kept" ) log.warn(msg, spec.key, self.build_directory, setup_base) return setup_base if os.path.isdir(dist_filename): setup_base = dist_filename else: if os.path.dirname(dist_filename) == setup_base: os.unlink(dist_filename) # get it out of the tmp dir contents = os.listdir(setup_base) if len(contents) == 1: dist_filename = os.path.join(setup_base, contents[0]) if os.path.isdir(dist_filename): # if the only thing there is a directory, move it instead setup_base = dist_filename ensure_directory(dst) shutil.move(setup_base, dst) return dst def install_wrapper_scripts(self, dist): if self.exclude_scripts: return for args in ScriptWriter.best().get_args(dist): self.write_script(*args) def install_script(self, dist, script_name, script_text, dev_path=None): """Generate a legacy script wrapper and install it""" spec = str(dist.as_requirement()) is_script = is_python_script(script_text, script_name) if is_script: body = self._load_template(dev_path) % locals() script_text = ScriptWriter.get_header(script_text) + body self.write_script(script_name, _to_ascii(script_text), 'b') @staticmethod def _load_template(dev_path): """ There are a couple of template scripts in the package. This function loads one of them and prepares it for use. """ # See https://github.com/pypa/setuptools/issues/134 for info # on script file naming and downstream issues with SVR4 name = 'script.tmpl' if dev_path: name = name.replace('.tmpl', ' (dev).tmpl') raw_bytes = resource_string('setuptools', name) return raw_bytes.decode('utf-8') def write_script(self, script_name, contents, mode="t", blockers=()): """Write an executable file to the scripts directory""" self.delete_blockers( # clean up old .py/.pyw w/o a script [os.path.join(self.script_dir, x) for x in blockers] ) log.info("Installing %s script to %s", script_name, self.script_dir) target = os.path.join(self.script_dir, script_name) self.add_output(target) if self.dry_run: return mask = current_umask() ensure_directory(target) if os.path.exists(target): os.unlink(target) with open(target, "w" + mode) as f: f.write(contents) chmod(target, 0o777 - mask) def install_eggs(self, spec, dist_filename, tmpdir): # .egg dirs or files are already built, so just return them if dist_filename.lower().endswith('.egg'): return [self.install_egg(dist_filename, tmpdir)] elif dist_filename.lower().endswith('.exe'): return [self.install_exe(dist_filename, tmpdir)] elif dist_filename.lower().endswith('.whl'): return [self.install_wheel(dist_filename, tmpdir)] # Anything else, try to extract and build setup_base = tmpdir if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): unpack_archive(dist_filename, tmpdir, self.unpack_progress) elif os.path.isdir(dist_filename): setup_base = os.path.abspath(dist_filename) if (setup_base.startswith(tmpdir) # something we downloaded and self.build_directory and spec is not None): setup_base = self.maybe_move(spec, dist_filename, setup_base) # Find the setup.py file setup_script = os.path.join(setup_base, 'setup.py') if not os.path.exists(setup_script): setups = glob(os.path.join(setup_base, '*', 'setup.py')) if not setups: raise DistutilsError( "Couldn't find a setup script in %s" % os.path.abspath(dist_filename) ) if len(setups) > 1: raise DistutilsError( "Multiple setup scripts in %s" % os.path.abspath(dist_filename) ) setup_script = setups[0] # Now run it, and return the result if self.editable: log.info(self.report_editable(spec, setup_script)) return [] else: return self.build_and_install(setup_script, setup_base) def egg_distribution(self, egg_path): if os.path.isdir(egg_path): metadata = PathMetadata(egg_path, os.path.join(egg_path, 'EGG-INFO')) else: metadata = EggMetadata(zipimport.zipimporter(egg_path)) return Distribution.from_filename(egg_path, metadata=metadata) def install_egg(self, egg_path, tmpdir): destination = os.path.join( self.install_dir, os.path.basename(egg_path), ) destination = os.path.abspath(destination) if not self.dry_run: ensure_directory(destination) dist = self.egg_distribution(egg_path) if not samefile(egg_path, destination): if os.path.isdir(destination) and not os.path.islink(destination): dir_util.remove_tree(destination, dry_run=self.dry_run) elif os.path.exists(destination): self.execute( os.unlink, (destination,), "Removing " + destination, ) try: new_dist_is_zipped = False if os.path.isdir(egg_path): if egg_path.startswith(tmpdir): f, m = shutil.move, "Moving" else: f, m = shutil.copytree, "Copying" elif self.should_unzip(dist): self.mkpath(destination) f, m = self.unpack_and_compile, "Extracting" else: new_dist_is_zipped = True if egg_path.startswith(tmpdir): f, m = shutil.move, "Moving" else: f, m = shutil.copy2, "Copying" self.execute( f, (egg_path, destination), (m + " %s to %s") % ( os.path.basename(egg_path), os.path.dirname(destination) ), ) update_dist_caches( destination, fix_zipimporter_caches=new_dist_is_zipped, ) except Exception: update_dist_caches(destination, fix_zipimporter_caches=False) raise self.add_output(destination) return self.egg_distribution(destination) def install_exe(self, dist_filename, tmpdir): # See if it's valid, get data cfg = extract_wininst_cfg(dist_filename) if cfg is None: raise DistutilsError( "%s is not a valid distutils Windows .exe" % dist_filename ) # Create a dummy distribution object until we build the real distro dist = Distribution( None, project_name=cfg.get('metadata', 'name'), version=cfg.get('metadata', 'version'), platform=get_platform(), ) # Convert the .exe to an unpacked egg egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') dist.location = egg_path egg_tmp = egg_path + '.tmp' _egg_info = os.path.join(egg_tmp, 'EGG-INFO') pkg_inf = os.path.join(_egg_info, 'PKG-INFO') ensure_directory(pkg_inf) # make sure EGG-INFO dir exists dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX self.exe_to_egg(dist_filename, egg_tmp) # Write EGG-INFO/PKG-INFO if not os.path.exists(pkg_inf): f = open(pkg_inf, 'w') f.write('Metadata-Version: 1.0\n') for k, v in cfg.items('metadata'): if k != 'target_version': f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) f.close() script_dir = os.path.join(_egg_info, 'scripts') # delete entry-point scripts to avoid duping self.delete_blockers([ os.path.join(script_dir, args[0]) for args in ScriptWriter.get_args(dist) ]) # Build .egg file from tmpdir bdist_egg.make_zipfile( egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, ) # install the .egg return self.install_egg(egg_path, tmpdir) def exe_to_egg(self, dist_filename, egg_tmp): """Extract a bdist_wininst to the directories an egg would use""" # Check for .pth file and set up prefix translations prefixes = get_exe_prefixes(dist_filename) to_compile = [] native_libs = [] top_level = {} def process(src, dst): s = src.lower() for old, new in prefixes: if s.startswith(old): src = new + src[len(old):] parts = src.split('/') dst = os.path.join(egg_tmp, *parts) dl = dst.lower() if dl.endswith('.pyd') or dl.endswith('.dll'): parts[-1] = bdist_egg.strip_module(parts[-1]) top_level[os.path.splitext(parts[0])[0]] = 1 native_libs.append(src) elif dl.endswith('.py') and old != 'SCRIPTS/': top_level[os.path.splitext(parts[0])[0]] = 1 to_compile.append(dst) return dst if not src.endswith('.pth'): log.warn("WARNING: can't process %s", src) return None # extract, tracking .pyd/.dll->native_libs and .py -> to_compile unpack_archive(dist_filename, egg_tmp, process) stubs = [] for res in native_libs: if res.lower().endswith('.pyd'): # create stubs for .pyd's parts = res.split('/') resource = parts[-1] parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' pyfile = os.path.join(egg_tmp, *parts) to_compile.append(pyfile) stubs.append(pyfile) bdist_egg.write_stub(resource, pyfile) self.byte_compile(to_compile) # compile .py's bdist_egg.write_safety_flag( os.path.join(egg_tmp, 'EGG-INFO'), bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag for name in 'top_level', 'native_libs': if locals()[name]: txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') if not os.path.exists(txt): f = open(txt, 'w') f.write('\n'.join(locals()[name]) + '\n') f.close() def install_wheel(self, wheel_path, tmpdir): wheel = Wheel(wheel_path) assert wheel.is_compatible() destination = os.path.join(self.install_dir, wheel.egg_name()) destination = os.path.abspath(destination) if not self.dry_run: ensure_directory(destination) if os.path.isdir(destination) and not os.path.islink(destination): dir_util.remove_tree(destination, dry_run=self.dry_run) elif os.path.exists(destination): self.execute( os.unlink, (destination,), "Removing " + destination, ) try: self.execute( wheel.install_as_egg, (destination,), ("Installing %s to %s") % ( os.path.basename(wheel_path), os.path.dirname(destination) ), ) finally: update_dist_caches(destination, fix_zipimporter_caches=False) self.add_output(destination) return self.egg_distribution(destination) __mv_warning = textwrap.dedent(""" Because this distribution was installed --multi-version, before you can import modules from this package in an application, you will need to 'import pkg_resources' and then use a 'require()' call similar to one of these examples, in order to select the desired version: pkg_resources.require("%(name)s") # latest installed version pkg_resources.require("%(name)s==%(version)s") # this exact version pkg_resources.require("%(name)s>=%(version)s") # this version or higher """).lstrip() __id_warning = textwrap.dedent(""" Note also that the installation directory must be on sys.path at runtime for this to work. (e.g. by being the application's script directory, by being on PYTHONPATH, or by being added to sys.path by your code.) """) def installation_report(self, req, dist, what="Installed"): """Helpful installation message for display to package users""" msg = "\n%(what)s %(eggloc)s%(extras)s" if self.multi_version and not self.no_report: msg += '\n' + self.__mv_warning if self.install_dir not in map(normalize_path, sys.path): msg += '\n' + self.__id_warning eggloc = dist.location name = dist.project_name version = dist.version extras = '' # TODO: self.report_extras(req, dist) return msg % locals() __editable_msg = textwrap.dedent(""" Extracted editable version of %(spec)s to %(dirname)s If it uses setuptools in its setup script, you can activate it in "development" mode by going to that directory and running:: %(python)s setup.py develop See the setuptools documentation for the "develop" command for more info. """).lstrip() def report_editable(self, spec, setup_script): dirname = os.path.dirname(setup_script) python = sys.executable return '\n' + self.__editable_msg % locals() def run_setup(self, setup_script, setup_base, args): sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) sys.modules.setdefault('distutils.command.egg_info', egg_info) args = list(args) if self.verbose > 2: v = 'v' * (self.verbose - 1) args.insert(0, '-' + v) elif self.verbose < 2: args.insert(0, '-q') if self.dry_run: args.insert(0, '-n') log.info( "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) ) try: run_setup(setup_script, args) except SystemExit as v: raise DistutilsError("Setup script exited with %s" % (v.args[0],)) def build_and_install(self, setup_script, setup_base): args = ['bdist_egg', '--dist-dir'] dist_dir = tempfile.mkdtemp( prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) ) try: self._set_fetcher_options(os.path.dirname(setup_script)) args.append(dist_dir) self.run_setup(setup_script, setup_base, args) all_eggs = Environment([dist_dir]) eggs = [] for key in all_eggs: for dist in all_eggs[key]: eggs.append(self.install_egg(dist.location, setup_base)) if not eggs and not self.dry_run: log.warn("No eggs found in %s (setup script problem?)", dist_dir) return eggs finally: rmtree(dist_dir) log.set_verbosity(self.verbose) # restore our log verbosity def _set_fetcher_options(self, base): """ When easy_install is about to run bdist_egg on a source dist, that source dist might have 'setup_requires' directives, requiring additional fetching. Ensure the fetcher options given to easy_install are available to that command as well. """ # find the fetch options from easy_install and write them out # to the setup.cfg file. ei_opts = self.distribution.get_option_dict('easy_install').copy() fetch_directives = ( 'find_links', 'site_dirs', 'index_url', 'optimize', 'site_dirs', 'allow_hosts', ) fetch_options = {} for key, val in ei_opts.items(): if key not in fetch_directives: continue fetch_options[key.replace('_', '-')] = val[1] # create a settings dictionary suitable for `edit_config` settings = dict(easy_install=fetch_options) cfg_filename = os.path.join(base, 'setup.cfg') setopt.edit_config(cfg_filename, settings) def update_pth(self, dist): if self.pth_file is None: return for d in self.pth_file[dist.key]: # drop old entries if self.multi_version or d.location != dist.location: log.info("Removing %s from easy-install.pth file", d) self.pth_file.remove(d) if d.location in self.shadow_path: self.shadow_path.remove(d.location) if not self.multi_version: if dist.location in self.pth_file.paths: log.info( "%s is already the active version in easy-install.pth", dist, ) else: log.info("Adding %s to easy-install.pth file", dist) self.pth_file.add(dist) # add new entry if dist.location not in self.shadow_path: self.shadow_path.append(dist.location) if not self.dry_run: self.pth_file.save() if dist.key == 'setuptools': # Ensure that setuptools itself never becomes unavailable! # XXX should this check for latest version? filename = os.path.join(self.install_dir, 'setuptools.pth') if os.path.islink(filename): os.unlink(filename) f = open(filename, 'wt') f.write(self.pth_file.make_relative(dist.location) + '\n') f.close() def unpack_progress(self, src, dst): # Progress filter for unpacking log.debug("Unpacking %s to %s", src, dst) return dst # only unpack-and-compile skips files for dry run def unpack_and_compile(self, egg_path, destination): to_compile = [] to_chmod = [] def pf(src, dst): if dst.endswith('.py') and not src.startswith('EGG-INFO/'): to_compile.append(dst) elif dst.endswith('.dll') or dst.endswith('.so'): to_chmod.append(dst) self.unpack_progress(src, dst) return not self.dry_run and dst or None unpack_archive(egg_path, destination, pf) self.byte_compile(to_compile) if not self.dry_run: for f in to_chmod: mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 chmod(f, mode) def byte_compile(self, to_compile): if sys.dont_write_bytecode: return from distutils.util import byte_compile try: # try to make the byte compile messages quieter log.set_verbosity(self.verbose - 1) byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) if self.optimize: byte_compile( to_compile, optimize=self.optimize, force=1, dry_run=self.dry_run, ) finally: log.set_verbosity(self.verbose) # restore original verbosity __no_default_msg = textwrap.dedent(""" bad install directory or PYTHONPATH You are attempting to install a package to a directory that is not on PYTHONPATH and which Python does not read ".pth" files from. The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: %s and your PYTHONPATH environment variable currently contains: %r Here are some of your options for correcting the problem: * You can choose a different installation directory, i.e., one that is on PYTHONPATH or supports .pth files * You can add the installation directory to the PYTHONPATH environment variable. (It must then also be on PYTHONPATH whenever you run Python and want to use the package(s) you are installing.) * You can set up the installation directory to support ".pth" files by using one of the approaches described here: https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations Please make the appropriate changes for your system and try again.""").lstrip() def no_default_version_msg(self): template = self.__no_default_msg return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) def install_site_py(self): """Make sure there's a site.py in the target dir, if needed""" if self.sitepy_installed: return # already did it, or don't need to sitepy = os.path.join(self.install_dir, "site.py") source = resource_string("setuptools", "site-patch.py") source = source.decode('utf-8') current = "" if os.path.exists(sitepy): log.debug("Checking existing site.py in %s", self.install_dir) with io.open(sitepy) as strm: current = strm.read() if not current.startswith('def __boot():'): raise DistutilsError( "%s is not a setuptools-generated site.py; please" " remove it." % sitepy ) if current != source: log.info("Creating %s", sitepy) if not self.dry_run: ensure_directory(sitepy) with io.open(sitepy, 'w', encoding='utf-8') as strm: strm.write(source) self.byte_compile([sitepy]) self.sitepy_installed = True def create_home_path(self): """Create directories under ~.""" if not self.user: return home = convert_path(os.path.expanduser("~")) for name, path in six.iteritems(self.config_vars): if path.startswith(home) and not os.path.isdir(path): self.debug_print("os.makedirs('%s', 0o700)" % path) os.makedirs(path, 0o700) INSTALL_SCHEMES = dict( posix=dict( install_dir='$base/lib/python$py_version_short/site-packages', script_dir='$base/bin', ), ) DEFAULT_SCHEME = dict( install_dir='$base/Lib/site-packages', script_dir='$base/Scripts', ) def _expand(self, *attrs): config_vars = self.get_finalized_command('install').config_vars if self.prefix: # Set default install_dir/scripts from --prefix config_vars = config_vars.copy() config_vars['base'] = self.prefix scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) for attr, val in scheme.items(): if getattr(self, attr, None) is None: setattr(self, attr, val) from distutils.util import subst_vars for attr in attrs: val = getattr(self, attr) if val is not None: val = subst_vars(val, config_vars) if os.name == 'posix': val = os.path.expanduser(val) setattr(self, attr, val) def _pythonpath(): items = os.environ.get('PYTHONPATH', '').split(os.pathsep) return filter(None, items) def get_site_dirs(): """ Return a list of 'site' dirs """ sitedirs = [] # start with PYTHONPATH sitedirs.extend(_pythonpath()) prefixes = [sys.prefix] if sys.exec_prefix != sys.prefix: prefixes.append(sys.exec_prefix) for prefix in prefixes: if prefix: if sys.platform in ('os2emx', 'riscos'): sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) elif os.sep == '/': sitedirs.extend([ os.path.join( prefix, "lib", "python" + sys.version[:3], "site-packages", ), os.path.join(prefix, "lib", "site-python"), ]) else: sitedirs.extend([ prefix, os.path.join(prefix, "lib", "site-packages"), ]) if sys.platform == 'darwin': # for framework builds *only* we add the standard Apple # locations. Currently only per-user, but /Library and # /Network/Library could be added too if 'Python.framework' in prefix: home = os.environ.get('HOME') if home: home_sp = os.path.join( home, 'Library', 'Python', sys.version[:3], 'site-packages', ) sitedirs.append(home_sp) lib_paths = get_path('purelib'), get_path('platlib') for site_lib in lib_paths: if site_lib not in sitedirs: sitedirs.append(site_lib) if site.ENABLE_USER_SITE: sitedirs.append(site.USER_SITE) try: sitedirs.extend(site.getsitepackages()) except AttributeError: pass sitedirs = list(map(normalize_path, sitedirs)) return sitedirs def expand_paths(inputs): """Yield sys.path directories that might contain "old-style" packages""" seen = {} for dirname in inputs: dirname = normalize_path(dirname) if dirname in seen: continue seen[dirname] = 1 if not os.path.isdir(dirname): continue files = os.listdir(dirname) yield dirname, files for name in files: if not name.endswith('.pth'): # We only care about the .pth files continue if name in ('easy-install.pth', 'setuptools.pth'): # Ignore .pth files that we control continue # Read the .pth file f = open(os.path.join(dirname, name)) lines = list(yield_lines(f)) f.close() # Yield existing non-dupe, non-import directory lines from it for line in lines: if not line.startswith("import"): line = normalize_path(line.rstrip()) if line not in seen: seen[line] = 1 if not os.path.isdir(line): continue yield line, os.listdir(line) def extract_wininst_cfg(dist_filename): """Extract configuration data from a bdist_wininst .exe Returns a configparser.RawConfigParser, or None """ f = open(dist_filename, 'rb') try: endrec = zipfile._EndRecData(f) if endrec is None: return None prepended = (endrec[9] - endrec[5]) - endrec[6] if prepended < 12: # no wininst data here return None f.seek(prepended - 12) tag, cfglen, bmlen = struct.unpack("egg path translations for a given .exe file""" prefixes = [ ('PURELIB/', ''), ('PLATLIB/pywin32_system32', ''), ('PLATLIB/', ''), ('SCRIPTS/', 'EGG-INFO/scripts/'), ('DATA/lib/site-packages', ''), ] z = zipfile.ZipFile(exe_filename) try: for info in z.infolist(): name = info.filename parts = name.split('/') if len(parts) == 3 and parts[2] == 'PKG-INFO': if parts[1].endswith('.egg-info'): prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) break if len(parts) != 2 or not name.endswith('.pth'): continue if name.endswith('-nspkg.pth'): continue if parts[0].upper() in ('PURELIB', 'PLATLIB'): contents = z.read(name) if six.PY3: contents = contents.decode() for pth in yield_lines(contents): pth = pth.strip().replace('\\', '/') if not pth.startswith('import'): prefixes.append((('%s/%s/' % (parts[0], pth)), '')) finally: z.close() prefixes = [(x.lower(), y) for x, y in prefixes] prefixes.sort() prefixes.reverse() return prefixes class PthDistributions(Environment): """A .pth file with Distribution paths in it""" dirty = False def __init__(self, filename, sitedirs=()): self.filename = filename self.sitedirs = list(map(normalize_path, sitedirs)) self.basedir = normalize_path(os.path.dirname(self.filename)) self._load() Environment.__init__(self, [], None, None) for path in yield_lines(self.paths): list(map(self.add, find_distributions(path, True))) def _load(self): self.paths = [] saw_import = False seen = dict.fromkeys(self.sitedirs) if os.path.isfile(self.filename): f = open(self.filename, 'rt') for line in f: if line.startswith('import'): saw_import = True continue path = line.rstrip() self.paths.append(path) if not path.strip() or path.strip().startswith('#'): continue # skip non-existent paths, in case somebody deleted a package # manually, and duplicate paths as well path = self.paths[-1] = normalize_path( os.path.join(self.basedir, path) ) if not os.path.exists(path) or path in seen: self.paths.pop() # skip it self.dirty = True # we cleaned up, so we're dirty now :) continue seen[path] = 1 f.close() if self.paths and not saw_import: self.dirty = True # ensure anything we touch has import wrappers while self.paths and not self.paths[-1].strip(): self.paths.pop() def save(self): """Write changed .pth file back to disk""" if not self.dirty: return rel_paths = list(map(self.make_relative, self.paths)) if rel_paths: log.debug("Saving %s", self.filename) lines = self._wrap_lines(rel_paths) data = '\n'.join(lines) + '\n' if os.path.islink(self.filename): os.unlink(self.filename) with open(self.filename, 'wt') as f: f.write(data) elif os.path.exists(self.filename): log.debug("Deleting empty %s", self.filename) os.unlink(self.filename) self.dirty = False @staticmethod def _wrap_lines(lines): return lines def add(self, dist): """Add `dist` to the distribution map""" new_path = ( dist.location not in self.paths and ( dist.location not in self.sitedirs or # account for '.' being in PYTHONPATH dist.location == os.getcwd() ) ) if new_path: self.paths.append(dist.location) self.dirty = True Environment.add(self, dist) def remove(self, dist): """Remove `dist` from the distribution map""" while dist.location in self.paths: self.paths.remove(dist.location) self.dirty = True Environment.remove(self, dist) def make_relative(self, path): npath, last = os.path.split(normalize_path(path)) baselen = len(self.basedir) parts = [last] sep = os.altsep == '/' and '/' or os.sep while len(npath) >= baselen: if npath == self.basedir: parts.append(os.curdir) parts.reverse() return sep.join(parts) npath, last = os.path.split(npath) parts.append(last) else: return path class RewritePthDistributions(PthDistributions): @classmethod def _wrap_lines(cls, lines): yield cls.prelude for line in lines: yield line yield cls.postlude prelude = _one_liner(""" import sys sys.__plen = len(sys.path) """) postlude = _one_liner(""" import sys new = sys.path[sys.__plen:] del sys.path[sys.__plen:] p = getattr(sys, '__egginsert', 0) sys.path[p:p] = new sys.__egginsert = p + len(new) """) if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': PthDistributions = RewritePthDistributions def _first_line_re(): """ Return a regular expression based on first_line_re suitable for matching strings. """ if isinstance(first_line_re.pattern, str): return first_line_re # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. return re.compile(first_line_re.pattern.decode()) def auto_chmod(func, arg, exc): if func in [os.unlink, os.remove] and os.name == 'nt': chmod(arg, stat.S_IWRITE) return func(arg) et, ev, _ = sys.exc_info() six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) def update_dist_caches(dist_path, fix_zipimporter_caches): """ Fix any globally cached `dist_path` related data `dist_path` should be a path of a newly installed egg distribution (zipped or unzipped). sys.path_importer_cache contains finder objects that have been cached when importing data from the original distribution. Any such finders need to be cleared since the replacement distribution might be packaged differently, e.g. a zipped egg distribution might get replaced with an unzipped egg folder or vice versa. Having the old finders cached may then cause Python to attempt loading modules from the replacement distribution using an incorrect loader. zipimport.zipimporter objects are Python loaders charged with importing data packaged inside zip archives. If stale loaders referencing the original distribution, are left behind, they can fail to load modules from the replacement distribution. E.g. if an old zipimport.zipimporter instance is used to load data from a new zipped egg archive, it may cause the operation to attempt to locate the requested data in the wrong location - one indicated by the original distribution's zip archive directory information. Such an operation may then fail outright, e.g. report having read a 'bad local file header', or even worse, it may fail silently & return invalid data. zipimport._zip_directory_cache contains cached zip archive directory information for all existing zipimport.zipimporter instances and all such instances connected to the same archive share the same cached directory information. If asked, and the underlying Python implementation allows it, we can fix all existing zipimport.zipimporter instances instead of having to track them down and remove them one by one, by updating their shared cached zip archive directory information. This, of course, assumes that the replacement distribution is packaged as a zipped egg. If not asked to fix existing zipimport.zipimporter instances, we still do our best to clear any remaining zipimport.zipimporter related cached data that might somehow later get used when attempting to load data from the new distribution and thus cause such load operations to fail. Note that when tracking down such remaining stale data, we can not catch every conceivable usage from here, and we clear only those that we know of and have found to cause problems if left alive. Any remaining caches should be updated by whomever is in charge of maintaining them, i.e. they should be ready to handle us replacing their zip archives with new distributions at runtime. """ # There are several other known sources of stale zipimport.zipimporter # instances that we do not clear here, but might if ever given a reason to # do so: # * Global setuptools pkg_resources.working_set (a.k.a. 'master working # set') may contain distributions which may in turn contain their # zipimport.zipimporter loaders. # * Several zipimport.zipimporter loaders held by local variables further # up the function call stack when running the setuptools installation. # * Already loaded modules may have their __loader__ attribute set to the # exact loader instance used when importing them. Python 3.4 docs state # that this information is intended mostly for introspection and so is # not expected to cause us problems. normalized_path = normalize_path(dist_path) _uncache(normalized_path, sys.path_importer_cache) if fix_zipimporter_caches: _replace_zip_directory_cache_data(normalized_path) else: # Here, even though we do not want to fix existing and now stale # zipimporter cache information, we still want to remove it. Related to # Python's zip archive directory information cache, we clear each of # its stale entries in two phases: # 1. Clear the entry so attempting to access zip archive information # via any existing stale zipimport.zipimporter instances fails. # 2. Remove the entry from the cache so any newly constructed # zipimport.zipimporter instances do not end up using old stale # zip archive directory information. # This whole stale data removal step does not seem strictly necessary, # but has been left in because it was done before we started replacing # the zip archive directory information cache content if possible, and # there are no relevant unit tests that we can depend on to tell us if # this is really needed. _remove_and_clear_zip_directory_cache_data(normalized_path) def _collect_zipimporter_cache_entries(normalized_path, cache): """ Return zipimporter cache entry keys related to a given normalized path. Alternative path spellings (e.g. those using different character case or those using alternative path separators) related to the same path are included. Any sub-path entries are included as well, i.e. those corresponding to zip archives embedded in other zip archives. """ result = [] prefix_len = len(normalized_path) for p in cache: np = normalize_path(p) if (np.startswith(normalized_path) and np[prefix_len:prefix_len + 1] in (os.sep, '')): result.append(p) return result def _update_zipimporter_cache(normalized_path, cache, updater=None): """ Update zipimporter cache data for a given normalized path. Any sub-path entries are processed as well, i.e. those corresponding to zip archives embedded in other zip archives. Given updater is a callable taking a cache entry key and the original entry (after already removing the entry from the cache), and expected to update the entry and possibly return a new one to be inserted in its place. Returning None indicates that the entry should not be replaced with a new one. If no updater is given, the cache entries are simply removed without any additional processing, the same as if the updater simply returned None. """ for p in _collect_zipimporter_cache_entries(normalized_path, cache): # N.B. pypy's custom zipimport._zip_directory_cache implementation does # not support the complete dict interface: # * Does not support item assignment, thus not allowing this function # to be used only for removing existing cache entries. # * Does not support the dict.pop() method, forcing us to use the # get/del patterns instead. For more detailed information see the # following links: # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 # http://bit.ly/2h9itJX old_entry = cache[p] del cache[p] new_entry = updater and updater(p, old_entry) if new_entry is not None: cache[p] = new_entry def _uncache(normalized_path, cache): _update_zipimporter_cache(normalized_path, cache) def _remove_and_clear_zip_directory_cache_data(normalized_path): def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): old_entry.clear() _update_zipimporter_cache( normalized_path, zipimport._zip_directory_cache, updater=clear_and_remove_cached_zip_archive_directory_data) # PyPy Python implementation does not allow directly writing to the # zipimport._zip_directory_cache and so prevents us from attempting to correct # its content. The best we can do there is clear the problematic cache content # and have PyPy repopulate it as needed. The downside is that if there are any # stale zipimport.zipimporter instances laying around, attempting to use them # will fail due to not having its zip archive directory information available # instead of being automatically corrected to use the new correct zip archive # directory information. if '__pypy__' in sys.builtin_module_names: _replace_zip_directory_cache_data = \ _remove_and_clear_zip_directory_cache_data else: def _replace_zip_directory_cache_data(normalized_path): def replace_cached_zip_archive_directory_data(path, old_entry): # N.B. In theory, we could load the zip directory information just # once for all updated path spellings, and then copy it locally and # update its contained path strings to contain the correct # spelling, but that seems like a way too invasive move (this cache # structure is not officially documented anywhere and could in # theory change with new Python releases) for no significant # benefit. old_entry.clear() zipimport.zipimporter(path) old_entry.update(zipimport._zip_directory_cache[path]) return old_entry _update_zipimporter_cache( normalized_path, zipimport._zip_directory_cache, updater=replace_cached_zip_archive_directory_data) def is_python(text, filename=''): "Is this string a valid Python script?" try: compile(text, filename, 'exec') except (SyntaxError, TypeError): return False else: return True def is_sh(executable): """Determine if the specified executable is a .sh (contains a #! line)""" try: with io.open(executable, encoding='latin-1') as fp: magic = fp.read(2) except (OSError, IOError): return executable return magic == '#!' def nt_quote_arg(arg): """Quote a command line argument according to Windows parsing rules""" return subprocess.list2cmdline([arg]) def is_python_script(script_text, filename): """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. """ if filename.endswith('.py') or filename.endswith('.pyw'): return True # extension says it's Python if is_python(script_text, filename): return True # it's syntactically valid Python if script_text.startswith('#!'): # It begins with a '#!' line, so check if 'python' is in it somewhere return 'python' in script_text.splitlines()[0].lower() return False # Not any Python I can recognize try: from os import chmod as _chmod except ImportError: # Jython compatibility def _chmod(*args): pass def chmod(path, mode): log.debug("changing mode of %s to %o", path, mode) try: _chmod(path, mode) except os.error as e: log.debug("chmod failed: %s", e) class CommandSpec(list): """ A command spec for a #! header, specified as a list of arguments akin to those passed to Popen. """ options = [] split_args = dict() @classmethod def best(cls): """ Choose the best CommandSpec class based on environmental conditions. """ return cls @classmethod def _sys_executable(cls): _default = os.path.normpath(sys.executable) return os.environ.get('__PYVENV_LAUNCHER__', _default) @classmethod def from_param(cls, param): """ Construct a CommandSpec from a parameter to build_scripts, which may be None. """ if isinstance(param, cls): return param if isinstance(param, list): return cls(param) if param is None: return cls.from_environment() # otherwise, assume it's a string. return cls.from_string(param) @classmethod def from_environment(cls): return cls([cls._sys_executable()]) @classmethod def from_string(cls, string): """ Construct a command spec from a simple string representing a command line parseable by shlex.split. """ items = shlex.split(string, **cls.split_args) return cls(items) def install_options(self, script_text): self.options = shlex.split(self._extract_options(script_text)) cmdline = subprocess.list2cmdline(self) if not isascii(cmdline): self.options[:0] = ['-x'] @staticmethod def _extract_options(orig_script): """ Extract any options from the first line of the script. """ first = (orig_script + '\n').splitlines()[0] match = _first_line_re().match(first) options = match.group(1) or '' if match else '' return options.strip() def as_header(self): return self._render(self + list(self.options)) @staticmethod def _strip_quotes(item): _QUOTES = '"\'' for q in _QUOTES: if item.startswith(q) and item.endswith(q): return item[1:-1] return item @staticmethod def _render(items): cmdline = subprocess.list2cmdline( CommandSpec._strip_quotes(item.strip()) for item in items) return '#!' + cmdline + '\n' # For pbr compat; will be removed in a future version. sys_executable = CommandSpec._sys_executable() class WindowsCommandSpec(CommandSpec): split_args = dict(posix=False) class ScriptWriter(object): """ Encapsulates behavior around writing entry point scripts for console and gui apps. """ template = textwrap.dedent(r""" # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r __requires__ = %(spec)r import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point(%(spec)r, %(group)r, %(name)r)() ) """).lstrip() command_spec_class = CommandSpec @classmethod def get_script_args(cls, dist, executable=None, wininst=False): # for backward compatibility warnings.warn("Use get_args", DeprecationWarning) writer = (WindowsScriptWriter if wininst else ScriptWriter).best() header = cls.get_script_header("", executable, wininst) return writer.get_args(dist, header) @classmethod def get_script_header(cls, script_text, executable=None, wininst=False): # for backward compatibility warnings.warn("Use get_header", DeprecationWarning) if wininst: executable = "python.exe" cmd = cls.command_spec_class.best().from_param(executable) cmd.install_options(script_text) return cmd.as_header() @classmethod def get_args(cls, dist, header=None): """ Yield write_script() argument tuples for a distribution's console_scripts and gui_scripts entry points. """ if header is None: header = cls.get_header() spec = str(dist.as_requirement()) for type_ in 'console', 'gui': group = type_ + '_scripts' for name, ep in dist.get_entry_map(group).items(): cls._ensure_safe_name(name) script_text = cls.template % locals() args = cls._get_script_args(type_, name, header, script_text) for res in args: yield res @staticmethod def _ensure_safe_name(name): """ Prevent paths in *_scripts entry point names. """ has_path_sep = re.search(r'[\\/]', name) if has_path_sep: raise ValueError("Path separators not allowed in script names") @classmethod def get_writer(cls, force_windows): # for backward compatibility warnings.warn("Use best", DeprecationWarning) return WindowsScriptWriter.best() if force_windows else cls.best() @classmethod def best(cls): """ Select the best ScriptWriter for this environment. """ if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): return WindowsScriptWriter.best() else: return cls @classmethod def _get_script_args(cls, type_, name, header, script_text): # Simply write the stub with no extension. yield (name, header + script_text) @classmethod def get_header(cls, script_text="", executable=None): """Create a #! line, getting options (if any) from script_text""" cmd = cls.command_spec_class.best().from_param(executable) cmd.install_options(script_text) return cmd.as_header() class WindowsScriptWriter(ScriptWriter): command_spec_class = WindowsCommandSpec @classmethod def get_writer(cls): # for backward compatibility warnings.warn("Use best", DeprecationWarning) return cls.best() @classmethod def best(cls): """ Select the best ScriptWriter suitable for Windows """ writer_lookup = dict( executable=WindowsExecutableLauncherWriter, natural=cls, ) # for compatibility, use the executable launcher by default launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') return writer_lookup[launcher] @classmethod def _get_script_args(cls, type_, name, header, script_text): "For Windows, add a .py extension" ext = dict(console='.pya', gui='.pyw')[type_] if ext not in os.environ['PATHEXT'].lower().split(';'): msg = ( "{ext} not listed in PATHEXT; scripts will not be " "recognized as executables." ).format(**locals()) warnings.warn(msg, UserWarning) old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] old.remove(ext) header = cls._adjust_header(type_, header) blockers = [name + x for x in old] yield name + ext, header + script_text, 't', blockers @classmethod def _adjust_header(cls, type_, orig_header): """ Make sure 'pythonw' is used for gui and and 'python' is used for console (regardless of what sys.executable is). """ pattern = 'pythonw.exe' repl = 'python.exe' if type_ == 'gui': pattern, repl = repl, pattern pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) new_header = pattern_ob.sub(string=orig_header, repl=repl) return new_header if cls._use_header(new_header) else orig_header @staticmethod def _use_header(new_header): """ Should _adjust_header use the replaced header? On non-windows systems, always use. On Windows systems, only use the replaced header if it resolves to an executable on the system. """ clean_header = new_header[2:-1].strip('"') return sys.platform != 'win32' or find_executable(clean_header) class WindowsExecutableLauncherWriter(WindowsScriptWriter): @classmethod def _get_script_args(cls, type_, name, header, script_text): """ For Windows, add a .py extension and an .exe launcher """ if type_ == 'gui': launcher_type = 'gui' ext = '-script.pyw' old = ['.pyw'] else: launcher_type = 'cli' ext = '-script.py' old = ['.py', '.pyc', '.pyo'] hdr = cls._adjust_header(type_, header) blockers = [name + x for x in old] yield (name + ext, hdr + script_text, 't', blockers) yield ( name + '.exe', get_win_launcher(launcher_type), 'b' # write in binary mode ) if not is_64bit(): # install a manifest for the launcher to prevent Windows # from detecting it as an installer (which it will for # launchers like easy_install.exe). Consider only # adding a manifest for launchers detected as installers. # See Distribute #143 for details. m_name = name + '.exe.manifest' yield (m_name, load_launcher_manifest(name), 't') # for backward-compatibility get_script_args = ScriptWriter.get_script_args get_script_header = ScriptWriter.get_script_header def get_win_launcher(type): """ Load the Windows launcher (executable) suitable for launching a script. `type` should be either 'cli' or 'gui' Returns the executable as a byte string. """ launcher_fn = '%s.exe' % type if is_64bit(): launcher_fn = launcher_fn.replace(".", "-64.") else: launcher_fn = launcher_fn.replace(".", "-32.") return resource_string('setuptools', launcher_fn) def load_launcher_manifest(name): manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') if six.PY2: return manifest % vars() else: return manifest.decode('utf-8') % vars() def rmtree(path, ignore_errors=False, onerror=auto_chmod): return shutil.rmtree(path, ignore_errors, onerror) def current_umask(): tmp = os.umask(0o022) os.umask(tmp) return tmp def bootstrap(): # This function is called when setuptools*.egg is run using /bin/sh import setuptools argv0 = os.path.dirname(setuptools.__path__[0]) sys.argv[0] = argv0 sys.argv.append(argv0) main() def main(argv=None, **kw): from setuptools import setup from setuptools.dist import Distribution class DistributionWithoutHelpCommands(Distribution): common_usage = "" def _show_help(self, *args, **kw): with _patch_usage(): Distribution._show_help(self, *args, **kw) if argv is None: argv = sys.argv[1:] with _patch_usage(): setup( script_args=['-q', 'easy_install', '-v'] + argv, script_name=sys.argv[0] or 'easy_install', distclass=DistributionWithoutHelpCommands, **kw ) @contextlib.contextmanager def _patch_usage(): import distutils.core USAGE = textwrap.dedent(""" usage: %(script)s [options] requirement_or_url ... or: %(script)s --help """).lstrip() def gen_usage(script_name): return USAGE % dict( script=os.path.basename(script_name), ) saved = distutils.core.gen_usage distutils.core.gen_usage = gen_usage try: yield finally: distutils.core.gen_usage = saved PK!^]``command/egg_info.pynu["""setuptools.command.egg_info Create a distribution's .egg-info directory and contents""" from distutils.filelist import FileList as _FileList from distutils.errors import DistutilsInternalError from distutils.util import convert_path from distutils import log import distutils.errors import distutils.filelist import os import re import sys import io import warnings import time import collections from setuptools.extern import six from setuptools.extern.six.moves import map from setuptools import Command from setuptools.command.sdist import sdist from setuptools.command.sdist import walk_revctrl from setuptools.command.setopt import edit_config from setuptools.command import bdist_egg from pkg_resources import ( parse_requirements, safe_name, parse_version, safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) import setuptools.unicode_utils as unicode_utils from setuptools.glob import glob from setuptools.extern import packaging def translate_pattern(glob): """ Translate a file path glob like '*.txt' in to a regular expression. This differs from fnmatch.translate which allows wildcards to match directory separators. It also knows about '**/' which matches any number of directories. """ pat = '' # This will split on '/' within [character classes]. This is deliberate. chunks = glob.split(os.path.sep) sep = re.escape(os.sep) valid_char = '[^%s]' % (sep,) for c, chunk in enumerate(chunks): last_chunk = c == len(chunks) - 1 # Chunks that are a literal ** are globstars. They match anything. if chunk == '**': if last_chunk: # Match anything if this is the last component pat += '.*' else: # Match '(name/)*' pat += '(?:%s+%s)*' % (valid_char, sep) continue # Break here as the whole path component has been handled # Find any special characters in the remainder i = 0 chunk_len = len(chunk) while i < chunk_len: char = chunk[i] if char == '*': # Match any number of name characters pat += valid_char + '*' elif char == '?': # Match a name character pat += valid_char elif char == '[': # Character class inner_i = i + 1 # Skip initial !/] chars if inner_i < chunk_len and chunk[inner_i] == '!': inner_i = inner_i + 1 if inner_i < chunk_len and chunk[inner_i] == ']': inner_i = inner_i + 1 # Loop till the closing ] is found while inner_i < chunk_len and chunk[inner_i] != ']': inner_i = inner_i + 1 if inner_i >= chunk_len: # Got to the end of the string without finding a closing ] # Do not treat this as a matching group, but as a literal [ pat += re.escape(char) else: # Grab the insides of the [brackets] inner = chunk[i + 1:inner_i] char_class = '' # Class negation if inner[0] == '!': char_class = '^' inner = inner[1:] char_class += re.escape(inner) pat += '[%s]' % (char_class,) # Skip to the end ] i = inner_i else: pat += re.escape(char) i += 1 # Join each chunk with the dir separator if not last_chunk: pat += sep pat += r'\Z' return re.compile(pat, flags=re.MULTILINE|re.DOTALL) class egg_info(Command): description = "create a distribution's .egg-info directory" user_options = [ ('egg-base=', 'e', "directory containing .egg-info directories" " (default: top of the source tree)"), ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), ('tag-build=', 'b', "Specify explicit tag to add to version number"), ('no-date', 'D', "Don't include date stamp [default]"), ] boolean_options = ['tag-date'] negative_opt = { 'no-date': 'tag-date', } def initialize_options(self): self.egg_name = None self.egg_version = None self.egg_base = None self.egg_info = None self.tag_build = None self.tag_date = 0 self.broken_egg_info = False self.vtags = None #################################### # allow the 'tag_svn_revision' to be detected and # set, supporting sdists built on older Setuptools. @property def tag_svn_revision(self): pass @tag_svn_revision.setter def tag_svn_revision(self, value): pass #################################### def save_version_info(self, filename): """ Materialize the value of date into the build tag. Install build keys in a deterministic order to avoid arbitrary reordering on subsequent builds. """ egg_info = collections.OrderedDict() # follow the order these keys would have been added # when PYTHONHASHSEED=0 egg_info['tag_build'] = self.tags() egg_info['tag_date'] = 0 edit_config(filename, dict(egg_info=egg_info)) def finalize_options(self): self.egg_name = safe_name(self.distribution.get_name()) self.vtags = self.tags() self.egg_version = self.tagged_version() parsed_version = parse_version(self.egg_version) try: is_version = isinstance(parsed_version, packaging.version.Version) spec = ( "%s==%s" if is_version else "%s===%s" ) list( parse_requirements(spec % (self.egg_name, self.egg_version)) ) except ValueError: raise distutils.errors.DistutilsOptionError( "Invalid distribution name or version syntax: %s-%s" % (self.egg_name, self.egg_version) ) if self.egg_base is None: dirs = self.distribution.package_dir self.egg_base = (dirs or {}).get('', os.curdir) self.ensure_dirname('egg_base') self.egg_info = to_filename(self.egg_name) + '.egg-info' if self.egg_base != os.curdir: self.egg_info = os.path.join(self.egg_base, self.egg_info) if '-' in self.egg_name: self.check_broken_egg_info() # Set package version for the benefit of dumber commands # (e.g. sdist, bdist_wininst, etc.) # self.distribution.metadata.version = self.egg_version # If we bootstrapped around the lack of a PKG-INFO, as might be the # case in a fresh checkout, make sure that any special tags get added # to the version info # pd = self.distribution._patched_dist if pd is not None and pd.key == self.egg_name.lower(): pd._version = self.egg_version pd._parsed_version = parse_version(self.egg_version) self.distribution._patched_dist = None def write_or_delete_file(self, what, filename, data, force=False): """Write `data` to `filename` or delete if empty If `data` is non-empty, this routine is the same as ``write_file()``. If `data` is empty but not ``None``, this is the same as calling ``delete_file(filename)`. If `data` is ``None``, then this is a no-op unless `filename` exists, in which case a warning is issued about the orphaned file (if `force` is false), or deleted (if `force` is true). """ if data: self.write_file(what, filename, data) elif os.path.exists(filename): if data is None and not force: log.warn( "%s not set in setup(), but %s exists", what, filename ) return else: self.delete_file(filename) def write_file(self, what, filename, data): """Write `data` to `filename` (if not a dry run) after announcing it `what` is used in a log message to identify what is being written to the file. """ log.info("writing %s to %s", what, filename) if six.PY3: data = data.encode("utf-8") if not self.dry_run: f = open(filename, 'wb') f.write(data) f.close() def delete_file(self, filename): """Delete `filename` (if not a dry run) after announcing it""" log.info("deleting %s", filename) if not self.dry_run: os.unlink(filename) def tagged_version(self): version = self.distribution.get_version() # egg_info may be called more than once for a distribution, # in which case the version string already contains all tags. if self.vtags and version.endswith(self.vtags): return safe_version(version) return safe_version(version + self.vtags) def run(self): self.mkpath(self.egg_info) installer = self.distribution.fetch_build_egg for ep in iter_entry_points('egg_info.writers'): ep.require(installer=installer) writer = ep.resolve() writer(self, ep.name, os.path.join(self.egg_info, ep.name)) # Get rid of native_libs.txt if it was put there by older bdist_egg nl = os.path.join(self.egg_info, "native_libs.txt") if os.path.exists(nl): self.delete_file(nl) self.find_sources() def tags(self): version = '' if self.tag_build: version += self.tag_build if self.tag_date: version += time.strftime("-%Y%m%d") return version def find_sources(self): """Generate SOURCES.txt manifest file""" manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") mm = manifest_maker(self.distribution) mm.manifest = manifest_filename mm.run() self.filelist = mm.filelist def check_broken_egg_info(self): bei = self.egg_name + '.egg-info' if self.egg_base != os.curdir: bei = os.path.join(self.egg_base, bei) if os.path.exists(bei): log.warn( "-" * 78 + '\n' "Note: Your current .egg-info directory has a '-' in its name;" '\nthis will not work correctly with "setup.py develop".\n\n' 'Please rename %s to %s to correct this problem.\n' + '-' * 78, bei, self.egg_info ) self.broken_egg_info = self.egg_info self.egg_info = bei # make it work for now class FileList(_FileList): # Implementations of the various MANIFEST.in commands def process_template_line(self, line): # Parse the line: split it up, make sure the right number of words # is there, and return the relevant words. 'action' is always # defined: it's the first word of the line. Which of the other # three are defined depends on the action; it'll be either # patterns, (dir and patterns), or (dir_pattern). (action, patterns, dir, dir_pattern) = self._parse_template_line(line) # OK, now we know that the action is valid and we have the # right number of words on the line for that action -- so we # can proceed with minimal error-checking. if action == 'include': self.debug_print("include " + ' '.join(patterns)) for pattern in patterns: if not self.include(pattern): log.warn("warning: no files found matching '%s'", pattern) elif action == 'exclude': self.debug_print("exclude " + ' '.join(patterns)) for pattern in patterns: if not self.exclude(pattern): log.warn(("warning: no previously-included files " "found matching '%s'"), pattern) elif action == 'global-include': self.debug_print("global-include " + ' '.join(patterns)) for pattern in patterns: if not self.global_include(pattern): log.warn(("warning: no files found matching '%s' " "anywhere in distribution"), pattern) elif action == 'global-exclude': self.debug_print("global-exclude " + ' '.join(patterns)) for pattern in patterns: if not self.global_exclude(pattern): log.warn(("warning: no previously-included files matching " "'%s' found anywhere in distribution"), pattern) elif action == 'recursive-include': self.debug_print("recursive-include %s %s" % (dir, ' '.join(patterns))) for pattern in patterns: if not self.recursive_include(dir, pattern): log.warn(("warning: no files found matching '%s' " "under directory '%s'"), pattern, dir) elif action == 'recursive-exclude': self.debug_print("recursive-exclude %s %s" % (dir, ' '.join(patterns))) for pattern in patterns: if not self.recursive_exclude(dir, pattern): log.warn(("warning: no previously-included files matching " "'%s' found under directory '%s'"), pattern, dir) elif action == 'graft': self.debug_print("graft " + dir_pattern) if not self.graft(dir_pattern): log.warn("warning: no directories found matching '%s'", dir_pattern) elif action == 'prune': self.debug_print("prune " + dir_pattern) if not self.prune(dir_pattern): log.warn(("no previously-included directories found " "matching '%s'"), dir_pattern) else: raise DistutilsInternalError( "this cannot happen: invalid action '%s'" % action) def _remove_files(self, predicate): """ Remove all files from the file list that match the predicate. Return True if any matching files were removed """ found = False for i in range(len(self.files) - 1, -1, -1): if predicate(self.files[i]): self.debug_print(" removing " + self.files[i]) del self.files[i] found = True return found def include(self, pattern): """Include files that match 'pattern'.""" found = [f for f in glob(pattern) if not os.path.isdir(f)] self.extend(found) return bool(found) def exclude(self, pattern): """Exclude files that match 'pattern'.""" match = translate_pattern(pattern) return self._remove_files(match.match) def recursive_include(self, dir, pattern): """ Include all files anywhere in 'dir/' that match the pattern. """ full_pattern = os.path.join(dir, '**', pattern) found = [f for f in glob(full_pattern, recursive=True) if not os.path.isdir(f)] self.extend(found) return bool(found) def recursive_exclude(self, dir, pattern): """ Exclude any file anywhere in 'dir/' that match the pattern. """ match = translate_pattern(os.path.join(dir, '**', pattern)) return self._remove_files(match.match) def graft(self, dir): """Include all files from 'dir/'.""" found = [ item for match_dir in glob(dir) for item in distutils.filelist.findall(match_dir) ] self.extend(found) return bool(found) def prune(self, dir): """Filter out files from 'dir/'.""" match = translate_pattern(os.path.join(dir, '**')) return self._remove_files(match.match) def global_include(self, pattern): """ Include all files anywhere in the current directory that match the pattern. This is very inefficient on large file trees. """ if self.allfiles is None: self.findall() match = translate_pattern(os.path.join('**', pattern)) found = [f for f in self.allfiles if match.match(f)] self.extend(found) return bool(found) def global_exclude(self, pattern): """ Exclude all files anywhere that match the pattern. """ match = translate_pattern(os.path.join('**', pattern)) return self._remove_files(match.match) def append(self, item): if item.endswith('\r'): # Fix older sdists built on Windows item = item[:-1] path = convert_path(item) if self._safe_path(path): self.files.append(path) def extend(self, paths): self.files.extend(filter(self._safe_path, paths)) def _repair(self): """ Replace self.files with only safe paths Because some owners of FileList manipulate the underlying ``files`` attribute directly, this method must be called to repair those paths. """ self.files = list(filter(self._safe_path, self.files)) def _safe_path(self, path): enc_warn = "'%s' not %s encodable -- skipping" # To avoid accidental trans-codings errors, first to unicode u_path = unicode_utils.filesys_decode(path) if u_path is None: log.warn("'%s' in unexpected encoding -- skipping" % path) return False # Must ensure utf-8 encodability utf8_path = unicode_utils.try_encode(u_path, "utf-8") if utf8_path is None: log.warn(enc_warn, path, 'utf-8') return False try: # accept is either way checks out if os.path.exists(u_path) or os.path.exists(utf8_path): return True # this will catch any encode errors decoding u_path except UnicodeEncodeError: log.warn(enc_warn, path, sys.getfilesystemencoding()) class manifest_maker(sdist): template = "MANIFEST.in" def initialize_options(self): self.use_defaults = 1 self.prune = 1 self.manifest_only = 1 self.force_manifest = 1 def finalize_options(self): pass def run(self): self.filelist = FileList() if not os.path.exists(self.manifest): self.write_manifest() # it must exist so it'll get in the list self.add_defaults() if os.path.exists(self.template): self.read_template() self.prune_file_list() self.filelist.sort() self.filelist.remove_duplicates() self.write_manifest() def _manifest_normalize(self, path): path = unicode_utils.filesys_decode(path) return path.replace(os.sep, '/') def write_manifest(self): """ Write the file list in 'self.filelist' to the manifest file named by 'self.manifest'. """ self.filelist._repair() # Now _repairs should encodability, but not unicode files = [self._manifest_normalize(f) for f in self.filelist.files] msg = "writing manifest file '%s'" % self.manifest self.execute(write_file, (self.manifest, files), msg) def warn(self, msg): if not self._should_suppress_warning(msg): sdist.warn(self, msg) @staticmethod def _should_suppress_warning(msg): """ suppress missing-file warnings from sdist """ return re.match(r"standard file .*not found", msg) def add_defaults(self): sdist.add_defaults(self) self.filelist.append(self.template) self.filelist.append(self.manifest) rcfiles = list(walk_revctrl()) if rcfiles: self.filelist.extend(rcfiles) elif os.path.exists(self.manifest): self.read_manifest() ei_cmd = self.get_finalized_command('egg_info') self.filelist.graft(ei_cmd.egg_info) def prune_file_list(self): build = self.get_finalized_command('build') base_dir = self.distribution.get_fullname() self.filelist.prune(build.build_base) self.filelist.prune(base_dir) sep = re.escape(os.sep) self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, is_regex=1) def write_file(filename, contents): """Create a file with the specified name and write 'contents' (a sequence of strings without line terminators) to it. """ contents = "\n".join(contents) # assuming the contents has been vetted for utf-8 encoding contents = contents.encode("utf-8") with open(filename, "wb") as f: # always write POSIX-style manifest f.write(contents) def write_pkg_info(cmd, basename, filename): log.info("writing %s", filename) if not cmd.dry_run: metadata = cmd.distribution.metadata metadata.version, oldver = cmd.egg_version, metadata.version metadata.name, oldname = cmd.egg_name, metadata.name try: # write unescaped data to PKG-INFO, so older pkg_resources # can still parse it metadata.write_pkg_info(cmd.egg_info) finally: metadata.name, metadata.version = oldname, oldver safe = getattr(cmd.distribution, 'zip_safe', None) bdist_egg.write_safety_flag(cmd.egg_info, safe) def warn_depends_obsolete(cmd, basename, filename): if os.path.exists(filename): log.warn( "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" "Use the install_requires/extras_require setup() args instead." ) def _write_requirements(stream, reqs): lines = yield_lines(reqs or ()) append_cr = lambda line: line + '\n' lines = map(append_cr, lines) stream.writelines(lines) def write_requirements(cmd, basename, filename): dist = cmd.distribution data = six.StringIO() _write_requirements(data, dist.install_requires) extras_require = dist.extras_require or {} for extra in sorted(extras_require): data.write('\n[{extra}]\n'.format(**vars())) _write_requirements(data, extras_require[extra]) cmd.write_or_delete_file("requirements", filename, data.getvalue()) def write_setup_requirements(cmd, basename, filename): data = io.StringIO() _write_requirements(data, cmd.distribution.setup_requires) cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) def write_toplevel_names(cmd, basename, filename): pkgs = dict.fromkeys( [ k.split('.', 1)[0] for k in cmd.distribution.iter_distribution_names() ] ) cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') def overwrite_arg(cmd, basename, filename): write_arg(cmd, basename, filename, True) def write_arg(cmd, basename, filename, force=False): argname = os.path.splitext(basename)[0] value = getattr(cmd.distribution, argname, None) if value is not None: value = '\n'.join(value) + '\n' cmd.write_or_delete_file(argname, filename, value, force) def write_entries(cmd, basename, filename): ep = cmd.distribution.entry_points if isinstance(ep, six.string_types) or ep is None: data = ep elif ep is not None: data = [] for section, contents in sorted(ep.items()): if not isinstance(contents, six.string_types): contents = EntryPoint.parse_group(section, contents) contents = '\n'.join(sorted(map(str, contents.values()))) data.append('[%s]\n%s\n\n' % (section, contents)) data = ''.join(data) cmd.write_or_delete_file('entry points', filename, data, True) def get_pkg_info_revision(): """ Get a -r### off of PKG-INFO Version in case this is an sdist of a subversion revision. """ warnings.warn("get_pkg_info_revision is deprecated.", DeprecationWarning) if os.path.exists('PKG-INFO'): with io.open('PKG-INFO') as f: for line in f: match = re.match(r"Version:.*-r(\d+)\s*$", line) if match: return int(match.group(1)) return 0 PK!۵?KKcommand/install.pynu[from distutils.errors import DistutilsArgError import inspect import glob import warnings import platform import distutils.command.install as orig import setuptools # Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for # now. See https://github.com/pypa/setuptools/issues/199/ _install = orig.install class install(orig.install): """Use easy_install to install the package, w/dependencies""" user_options = orig.install.user_options + [ ('old-and-unmanageable', None, "Try not to use this!"), ('single-version-externally-managed', None, "used by system package builders to create 'flat' eggs"), ] boolean_options = orig.install.boolean_options + [ 'old-and-unmanageable', 'single-version-externally-managed', ] new_commands = [ ('install_egg_info', lambda self: True), ('install_scripts', lambda self: True), ] _nc = dict(new_commands) def initialize_options(self): orig.install.initialize_options(self) self.old_and_unmanageable = None self.single_version_externally_managed = None def finalize_options(self): orig.install.finalize_options(self) if self.root: self.single_version_externally_managed = True elif self.single_version_externally_managed: if not self.root and not self.record: raise DistutilsArgError( "You must specify --record or --root when building system" " packages" ) def handle_extra_path(self): if self.root or self.single_version_externally_managed: # explicit backward-compatibility mode, allow extra_path to work return orig.install.handle_extra_path(self) # Ignore extra_path when installing an egg (or being run by another # command without --root or --single-version-externally-managed self.path_file = None self.extra_dirs = '' def run(self): # Explicit request for old-style install? Just do it if self.old_and_unmanageable or self.single_version_externally_managed: return orig.install.run(self) if not self._called_from_setup(inspect.currentframe()): # Run in backward-compatibility mode to support bdist_* commands. orig.install.run(self) else: self.do_egg_install() @staticmethod def _called_from_setup(run_frame): """ Attempt to detect whether run() was called from setup() or by another command. If called by setup(), the parent caller will be the 'run_command' method in 'distutils.dist', and *its* caller will be the 'run_commands' method. If called any other way, the immediate caller *might* be 'run_command', but it won't have been called by 'run_commands'. Return True in that case or if a call stack is unavailable. Return False otherwise. """ if run_frame is None: msg = "Call stack not available. bdist_* commands may fail." warnings.warn(msg) if platform.python_implementation() == 'IronPython': msg = "For best results, pass -X:Frames to enable call stack." warnings.warn(msg) return True res = inspect.getouterframes(run_frame)[2] caller, = res[:1] info = inspect.getframeinfo(caller) caller_module = caller.f_globals.get('__name__', '') return ( caller_module == 'distutils.dist' and info.function == 'run_commands' ) def do_egg_install(self): easy_install = self.distribution.get_command_class('easy_install') cmd = easy_install( self.distribution, args="x", root=self.root, record=self.record, ) cmd.ensure_finalized() # finalize before bdist_egg munges install cmd cmd.always_copy_from = '.' # make sure local-dir eggs get installed # pick up setup-dir .egg files only: no .egg-info cmd.package_index.scan(glob.glob('*.egg')) self.run_command('bdist_egg') args = [self.distribution.get_command_obj('bdist_egg').egg_output] if setuptools.bootstrap_install_from: # Bootstrap self-installation of setuptools args.insert(0, setuptools.bootstrap_install_from) cmd.args = args cmd.run() setuptools.bootstrap_install_from = None # XXX Python 3.1 doesn't see _nc if this is inside the class install.sub_commands = ( [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + install.new_commands ) PK!\Ҩcommand/install_egg_info.pynu[from distutils import log, dir_util import os from setuptools import Command from setuptools import namespaces from setuptools.archive_util import unpack_archive import pkg_resources class install_egg_info(namespaces.Installer, Command): """Install an .egg-info directory for the package""" description = "Install an .egg-info directory for the package" user_options = [ ('install-dir=', 'd', "directory to install to"), ] def initialize_options(self): self.install_dir = None def finalize_options(self): self.set_undefined_options('install_lib', ('install_dir', 'install_dir')) ei_cmd = self.get_finalized_command("egg_info") basename = pkg_resources.Distribution( None, None, ei_cmd.egg_name, ei_cmd.egg_version ).egg_name() + '.egg-info' self.source = ei_cmd.egg_info self.target = os.path.join(self.install_dir, basename) self.outputs = [] def run(self): self.run_command('egg_info') if os.path.isdir(self.target) and not os.path.islink(self.target): dir_util.remove_tree(self.target, dry_run=self.dry_run) elif os.path.exists(self.target): self.execute(os.unlink, (self.target,), "Removing " + self.target) if not self.dry_run: pkg_resources.ensure_directory(self.target) self.execute( self.copytree, (), "Copying %s to %s" % (self.source, self.target) ) self.install_namespaces() def get_outputs(self): return self.outputs def copytree(self): # Copy the .egg-info tree to site-packages def skimmer(src, dst): # filter out source-control directories; note that 'src' is always # a '/'-separated path, regardless of platform. 'dst' is a # platform-specific path. for skip in '.svn/', 'CVS/': if src.startswith(skip) or '/' + skip in src: return None self.outputs.append(dst) log.debug("Copying %s to %s", src, dst) return dst unpack_archive(self.source, self.target, skimmer) PK!;Scommand/install_lib.pynu[import os import imp from itertools import product, starmap import distutils.command.install_lib as orig class install_lib(orig.install_lib): """Don't add compiled flags to filenames of non-Python files""" def run(self): self.build() outfiles = self.install() if outfiles is not None: # always compile, in case we have any extension stubs to deal with self.byte_compile(outfiles) def get_exclusions(self): """ Return a collections.Sized collections.Container of paths to be excluded for single_version_externally_managed installations. """ all_packages = ( pkg for ns_pkg in self._get_SVEM_NSPs() for pkg in self._all_packages(ns_pkg) ) excl_specs = product(all_packages, self._gen_exclusion_paths()) return set(starmap(self._exclude_pkg_path, excl_specs)) def _exclude_pkg_path(self, pkg, exclusion_path): """ Given a package name and exclusion path within that package, compute the full exclusion path. """ parts = pkg.split('.') + [exclusion_path] return os.path.join(self.install_dir, *parts) @staticmethod def _all_packages(pkg_name): """ >>> list(install_lib._all_packages('foo.bar.baz')) ['foo.bar.baz', 'foo.bar', 'foo'] """ while pkg_name: yield pkg_name pkg_name, sep, child = pkg_name.rpartition('.') def _get_SVEM_NSPs(self): """ Get namespace packages (list) but only for single_version_externally_managed installations and empty otherwise. """ # TODO: is it necessary to short-circuit here? i.e. what's the cost # if get_finalized_command is called even when namespace_packages is # False? if not self.distribution.namespace_packages: return [] install_cmd = self.get_finalized_command('install') svem = install_cmd.single_version_externally_managed return self.distribution.namespace_packages if svem else [] @staticmethod def _gen_exclusion_paths(): """ Generate file paths to be excluded for namespace packages (bytecode cache files). """ # always exclude the package module itself yield '__init__.py' yield '__init__.pyc' yield '__init__.pyo' if not hasattr(imp, 'get_tag'): return base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) yield base + '.pyc' yield base + '.pyo' yield base + '.opt-1.pyc' yield base + '.opt-2.pyc' def copy_tree( self, infile, outfile, preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 ): assert preserve_mode and preserve_times and not preserve_symlinks exclude = self.get_exclusions() if not exclude: return orig.install_lib.copy_tree(self, infile, outfile) # Exclude namespace package __init__.py* files from the output from setuptools.archive_util import unpack_directory from distutils import log outfiles = [] def pf(src, dst): if dst in exclude: log.warn("Skipping installation of %s (namespace package)", dst) return False log.info("copying %s -> %s", src, os.path.dirname(dst)) outfiles.append(dst) return dst unpack_directory(infile, outfile, pf) return outfiles def get_outputs(self): outputs = orig.install_lib.get_outputs(self) exclude = self.get_exclusions() if exclude: return [f for f in outputs if f not in exclude] return outputs PK!F? command/install_scripts.pynu[from distutils import log import distutils.command.install_scripts as orig import os import sys from pkg_resources import Distribution, PathMetadata, ensure_directory class install_scripts(orig.install_scripts): """Do normal script install, plus any egg_info wrapper scripts""" def initialize_options(self): orig.install_scripts.initialize_options(self) self.no_ep = False def run(self): import setuptools.command.easy_install as ei self.run_command("egg_info") if self.distribution.scripts: orig.install_scripts.run(self) # run first to set up self.outfiles else: self.outfiles = [] if self.no_ep: # don't install entry point scripts into .egg file! return ei_cmd = self.get_finalized_command("egg_info") dist = Distribution( ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), ei_cmd.egg_name, ei_cmd.egg_version, ) bs_cmd = self.get_finalized_command('build_scripts') exec_param = getattr(bs_cmd, 'executable', None) bw_cmd = self.get_finalized_command("bdist_wininst") is_wininst = getattr(bw_cmd, '_is_running', False) writer = ei.ScriptWriter if is_wininst: exec_param = "python.exe" writer = ei.WindowsScriptWriter if exec_param == sys.executable: # In case the path to the Python executable contains a space, wrap # it so it's not split up. exec_param = [exec_param] # resolve the writer to the environment writer = writer.best() cmd = writer.command_spec_class.best().from_param(exec_param) for args in writer.get_args(dist, cmd.as_header()): self.write_script(*args) def write_script(self, script_name, contents, mode="t", *ignored): """Write an executable file to the scripts directory""" from setuptools.command.easy_install import chmod, current_umask log.info("Installing %s script to %s", script_name, self.install_dir) target = os.path.join(self.install_dir, script_name) self.outfiles.append(target) mask = current_umask() if not self.dry_run: ensure_directory(target) f = open(target, "w" + mode) f.write(contents) f.close() chmod(target, 0o777 - mask) PK!])Bttcommand/launcher manifest.xmlnu[ PK!}s`zzcommand/py36compat.pynu[import os from glob import glob from distutils.util import convert_path from distutils.command import sdist from setuptools.extern.six.moves import filter class sdist_add_defaults: """ Mix-in providing forward-compatibility for functionality as found in distutils on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. Instead, override in the subclass. """ def add_defaults(self): """Add all the default files to self.filelist: - README or README.txt - setup.py - test/test*.py - all pure Python modules mentioned in setup script - all files pointed by package_data (build_py) - all files defined in data_files. - all files defined as scripts. - all C sources listed as part of extensions or C libraries in the setup script (doesn't catch C headers!) Warns if (README or README.txt) or setup.py are missing; everything else is optional. """ self._add_defaults_standards() self._add_defaults_optional() self._add_defaults_python() self._add_defaults_data_files() self._add_defaults_ext() self._add_defaults_c_libs() self._add_defaults_scripts() @staticmethod def _cs_path_exists(fspath): """ Case-sensitive path existence check >>> sdist_add_defaults._cs_path_exists(__file__) True >>> sdist_add_defaults._cs_path_exists(__file__.upper()) False """ if not os.path.exists(fspath): return False # make absolute so we always have a directory abspath = os.path.abspath(fspath) directory, filename = os.path.split(abspath) return filename in os.listdir(directory) def _add_defaults_standards(self): standards = [self.READMES, self.distribution.script_name] for fn in standards: if isinstance(fn, tuple): alts = fn got_it = False for fn in alts: if self._cs_path_exists(fn): got_it = True self.filelist.append(fn) break if not got_it: self.warn("standard file not found: should have one of " + ', '.join(alts)) else: if self._cs_path_exists(fn): self.filelist.append(fn) else: self.warn("standard file '%s' not found" % fn) def _add_defaults_optional(self): optional = ['test/test*.py', 'setup.cfg'] for pattern in optional: files = filter(os.path.isfile, glob(pattern)) self.filelist.extend(files) def _add_defaults_python(self): # build_py is used to get: # - python modules # - files defined in package_data build_py = self.get_finalized_command('build_py') # getting python files if self.distribution.has_pure_modules(): self.filelist.extend(build_py.get_source_files()) # getting package_data files # (computed in build_py.data_files by build_py.finalize_options) for pkg, src_dir, build_dir, filenames in build_py.data_files: for filename in filenames: self.filelist.append(os.path.join(src_dir, filename)) def _add_defaults_data_files(self): # getting distribution.data_files if self.distribution.has_data_files(): for item in self.distribution.data_files: if isinstance(item, str): # plain file item = convert_path(item) if os.path.isfile(item): self.filelist.append(item) else: # a (dirname, filenames) tuple dirname, filenames = item for f in filenames: f = convert_path(f) if os.path.isfile(f): self.filelist.append(f) def _add_defaults_ext(self): if self.distribution.has_ext_modules(): build_ext = self.get_finalized_command('build_ext') self.filelist.extend(build_ext.get_source_files()) def _add_defaults_c_libs(self): if self.distribution.has_c_libraries(): build_clib = self.get_finalized_command('build_clib') self.filelist.extend(build_clib.get_source_files()) def _add_defaults_scripts(self): if self.distribution.has_scripts(): build_scripts = self.get_finalized_command('build_scripts') self.filelist.extend(build_scripts.get_source_files()) if hasattr(sdist.sdist, '_add_defaults_standards'): # disable the functionality already available upstream class sdist_add_defaults: pass PK!command/register.pynu[import distutils.command.register as orig class register(orig.register): __doc__ = orig.register.__doc__ def run(self): # Make sure that we are using valid current name/version info self.run_command('egg_info') orig.register.run(self) PK!Ԥttcommand/rotate.pynu[from distutils.util import convert_path from distutils import log from distutils.errors import DistutilsOptionError import os import shutil from setuptools.extern import six from setuptools import Command class rotate(Command): """Delete older distributions""" description = "delete older distributions, keeping N newest files" user_options = [ ('match=', 'm', "patterns to match (required)"), ('dist-dir=', 'd', "directory where the distributions are"), ('keep=', 'k', "number of matching distributions to keep"), ] boolean_options = [] def initialize_options(self): self.match = None self.dist_dir = None self.keep = None def finalize_options(self): if self.match is None: raise DistutilsOptionError( "Must specify one or more (comma-separated) match patterns " "(e.g. '.zip' or '.egg')" ) if self.keep is None: raise DistutilsOptionError("Must specify number of files to keep") try: self.keep = int(self.keep) except ValueError: raise DistutilsOptionError("--keep must be an integer") if isinstance(self.match, six.string_types): self.match = [ convert_path(p.strip()) for p in self.match.split(',') ] self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) def run(self): self.run_command("egg_info") from glob import glob for pattern in self.match: pattern = self.distribution.get_name() + '*' + pattern files = glob(os.path.join(self.dist_dir, pattern)) files = [(os.path.getmtime(f), f) for f in files] files.sort() files.reverse() log.info("%d file(s) matching %s", len(files), pattern) files = files[self.keep:] for (t, f) in files: log.info("Deleting %s", f) if not self.dry_run: if os.path.isdir(f): shutil.rmtree(f) else: os.unlink(f) PK!4command/saveopts.pynu[from setuptools.command.setopt import edit_config, option_base class saveopts(option_base): """Save command-line options to a file""" description = "save supplied options to setup.cfg or other config file" def run(self): dist = self.distribution settings = {} for cmd in dist.command_options: if cmd == 'saveopts': continue # don't save our own options! for opt, (src, val) in dist.get_option_dict(cmd).items(): if src == "command line": settings.setdefault(cmd, {})[opt] = val edit_config(self.filename, settings, self.dry_run) PK!n77command/sdist.pynu[from distutils import log import distutils.command.sdist as orig import os import sys import io import contextlib from setuptools.extern import six from .py36compat import sdist_add_defaults import pkg_resources _default_revctrl = list def walk_revctrl(dirname=''): """Find all files under revision control""" for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): for item in ep.load()(dirname): yield item class sdist(sdist_add_defaults, orig.sdist): """Smart sdist that finds anything supported by revision control""" user_options = [ ('formats=', None, "formats for source distribution (comma-separated list)"), ('keep-temp', 'k', "keep the distribution tree around after creating " + "archive file(s)"), ('dist-dir=', 'd', "directory to put the source distribution archive(s) in " "[default: dist]"), ] negative_opt = {} README_EXTENSIONS = ['', '.rst', '.txt', '.md'] READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) def run(self): self.run_command('egg_info') ei_cmd = self.get_finalized_command('egg_info') self.filelist = ei_cmd.filelist self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) self.check_readme() # Run sub commands for cmd_name in self.get_sub_commands(): self.run_command(cmd_name) self.make_distribution() dist_files = getattr(self.distribution, 'dist_files', []) for file in self.archive_files: data = ('sdist', '', file) if data not in dist_files: dist_files.append(data) def initialize_options(self): orig.sdist.initialize_options(self) self._default_to_gztar() def _default_to_gztar(self): # only needed on Python prior to 3.6. if sys.version_info >= (3, 6, 0, 'beta', 1): return self.formats = ['gztar'] def make_distribution(self): """ Workaround for #516 """ with self._remove_os_link(): orig.sdist.make_distribution(self) @staticmethod @contextlib.contextmanager def _remove_os_link(): """ In a context, remove and restore os.link if it exists """ class NoValue: pass orig_val = getattr(os, 'link', NoValue) try: del os.link except Exception: pass try: yield finally: if orig_val is not NoValue: setattr(os, 'link', orig_val) def __read_template_hack(self): # This grody hack closes the template file (MANIFEST.in) if an # exception occurs during read_template. # Doing so prevents an error when easy_install attempts to delete the # file. try: orig.sdist.read_template(self) except Exception: _, _, tb = sys.exc_info() tb.tb_next.tb_frame.f_locals['template'].close() raise # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle # has been fixed, so only override the method if we're using an earlier # Python. has_leaky_handle = ( sys.version_info < (2, 7, 2) or (3, 0) <= sys.version_info < (3, 1, 4) or (3, 2) <= sys.version_info < (3, 2, 1) ) if has_leaky_handle: read_template = __read_template_hack def _add_defaults_python(self): """getting python files""" if self.distribution.has_pure_modules(): build_py = self.get_finalized_command('build_py') self.filelist.extend(build_py.get_source_files()) # This functionality is incompatible with include_package_data, and # will in fact create an infinite recursion if include_package_data # is True. Use of include_package_data will imply that # distutils-style automatic handling of package_data is disabled if not self.distribution.include_package_data: for _, src_dir, _, filenames in build_py.data_files: self.filelist.extend([os.path.join(src_dir, filename) for filename in filenames]) def _add_defaults_data_files(self): try: if six.PY2: sdist_add_defaults._add_defaults_data_files(self) else: super()._add_defaults_data_files() except TypeError: log.warn("data_files contains unexpected objects") def check_readme(self): for f in self.READMES: if os.path.exists(f): return else: self.warn( "standard file not found: should have one of " + ', '.join(self.READMES) ) def make_release_tree(self, base_dir, files): orig.sdist.make_release_tree(self, base_dir, files) # Save any egg_info command line options used to create this sdist dest = os.path.join(base_dir, 'setup.cfg') if hasattr(os, 'link') and os.path.exists(dest): # unlink and re-copy, since it might be hard-linked, and # we don't want to change the source version os.unlink(dest) self.copy_file('setup.cfg', dest) self.get_finalized_command('egg_info').save_version_info(dest) def _manifest_is_not_generated(self): # check for special comment used in 2.7.1 and higher if not os.path.isfile(self.manifest): return False with io.open(self.manifest, 'rb') as fp: first_line = fp.readline() return (first_line != '# file GENERATED by distutils, do NOT edit\n'.encode()) def read_manifest(self): """Read the manifest file (named by 'self.manifest') and use it to fill in 'self.filelist', the list of files to include in the source distribution. """ log.info("reading manifest file '%s'", self.manifest) manifest = open(self.manifest, 'rb') for line in manifest: # The manifest must contain UTF-8. See #303. if six.PY3: try: line = line.decode('UTF-8') except UnicodeDecodeError: log.warn("%r not UTF-8 decodable -- skipping" % line) continue # ignore comments and blank lines line = line.strip() if line.startswith('#') or not line: continue self.filelist.append(line) manifest.close() PK!pcommand/setopt.pynu[from distutils.util import convert_path from distutils import log from distutils.errors import DistutilsOptionError import distutils import os from setuptools.extern.six.moves import configparser from setuptools import Command __all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] def config_file(kind="local"): """Get the filename of the distutils, local, global, or per-user config `kind` must be one of "local", "global", or "user" """ if kind == 'local': return 'setup.cfg' if kind == 'global': return os.path.join( os.path.dirname(distutils.__file__), 'distutils.cfg' ) if kind == 'user': dot = os.name == 'posix' and '.' or '' return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) raise ValueError( "config_file() type must be 'local', 'global', or 'user'", kind ) def edit_config(filename, settings, dry_run=False): """Edit a configuration file to include `settings` `settings` is a dictionary of dictionaries or ``None`` values, keyed by command/section name. A ``None`` value means to delete the entire section, while a dictionary lists settings to be changed or deleted in that section. A setting of ``None`` means to delete that setting. """ log.debug("Reading configuration from %s", filename) opts = configparser.RawConfigParser() opts.read([filename]) for section, options in settings.items(): if options is None: log.info("Deleting section [%s] from %s", section, filename) opts.remove_section(section) else: if not opts.has_section(section): log.debug("Adding new section [%s] to %s", section, filename) opts.add_section(section) for option, value in options.items(): if value is None: log.debug( "Deleting %s.%s from %s", section, option, filename ) opts.remove_option(section, option) if not opts.options(section): log.info("Deleting empty [%s] section from %s", section, filename) opts.remove_section(section) else: log.debug( "Setting %s.%s to %r in %s", section, option, value, filename ) opts.set(section, option, value) log.info("Writing %s", filename) if not dry_run: with open(filename, 'w') as f: opts.write(f) class option_base(Command): """Abstract base class for commands that mess with config files""" user_options = [ ('global-config', 'g', "save options to the site-wide distutils.cfg file"), ('user-config', 'u', "save options to the current user's pydistutils.cfg file"), ('filename=', 'f', "configuration file to use (default=setup.cfg)"), ] boolean_options = [ 'global-config', 'user-config', ] def initialize_options(self): self.global_config = None self.user_config = None self.filename = None def finalize_options(self): filenames = [] if self.global_config: filenames.append(config_file('global')) if self.user_config: filenames.append(config_file('user')) if self.filename is not None: filenames.append(self.filename) if not filenames: filenames.append(config_file('local')) if len(filenames) > 1: raise DistutilsOptionError( "Must specify only one configuration file option", filenames ) self.filename, = filenames class setopt(option_base): """Save command-line options to a file""" description = "set an option in setup.cfg or another config file" user_options = [ ('command=', 'c', 'command to set an option for'), ('option=', 'o', 'option to set'), ('set-value=', 's', 'value of the option'), ('remove', 'r', 'remove (unset) the value'), ] + option_base.user_options boolean_options = option_base.boolean_options + ['remove'] def initialize_options(self): option_base.initialize_options(self) self.command = None self.option = None self.set_value = None self.remove = None def finalize_options(self): option_base.finalize_options(self) if self.command is None or self.option is None: raise DistutilsOptionError("Must specify --command *and* --option") if self.set_value is None and not self.remove: raise DistutilsOptionError("Must specify --set-value or --remove") def run(self): edit_config( self.filename, { self.command: {self.option.replace('-', '_'): self.set_value} }, self.dry_run ) PK!##command/test.pynu[import os import operator import sys import contextlib import itertools import unittest from distutils.errors import DistutilsError, DistutilsOptionError from distutils import log from unittest import TestLoader from setuptools.extern import six from setuptools.extern.six.moves import map, filter from pkg_resources import (resource_listdir, resource_exists, normalize_path, working_set, _namespace_packages, evaluate_marker, add_activation_listener, require, EntryPoint) from setuptools import Command class ScanningLoader(TestLoader): def __init__(self): TestLoader.__init__(self) self._visited = set() def loadTestsFromModule(self, module, pattern=None): """Return a suite of all tests cases contained in the given module If the module is a package, load tests from all the modules in it. If the module has an ``additional_tests`` function, call it and add the return value to the tests. """ if module in self._visited: return None self._visited.add(module) tests = [] tests.append(TestLoader.loadTestsFromModule(self, module)) if hasattr(module, "additional_tests"): tests.append(module.additional_tests()) if hasattr(module, '__path__'): for file in resource_listdir(module.__name__, ''): if file.endswith('.py') and file != '__init__.py': submodule = module.__name__ + '.' + file[:-3] else: if resource_exists(module.__name__, file + '/__init__.py'): submodule = module.__name__ + '.' + file else: continue tests.append(self.loadTestsFromName(submodule)) if len(tests) != 1: return self.suiteClass(tests) else: return tests[0] # don't create a nested suite for only one return # adapted from jaraco.classes.properties:NonDataProperty class NonDataProperty(object): def __init__(self, fget): self.fget = fget def __get__(self, obj, objtype=None): if obj is None: return self return self.fget(obj) class test(Command): """Command to run unit tests after in-place build""" description = "run unit tests after in-place build" user_options = [ ('test-module=', 'm', "Run 'test_suite' in specified module"), ('test-suite=', 's', "Run single test, case or suite (e.g. 'module.test_suite')"), ('test-runner=', 'r', "Test runner to use"), ] def initialize_options(self): self.test_suite = None self.test_module = None self.test_loader = None self.test_runner = None def finalize_options(self): if self.test_suite and self.test_module: msg = "You may specify a module or a suite, but not both" raise DistutilsOptionError(msg) if self.test_suite is None: if self.test_module is None: self.test_suite = self.distribution.test_suite else: self.test_suite = self.test_module + ".test_suite" if self.test_loader is None: self.test_loader = getattr(self.distribution, 'test_loader', None) if self.test_loader is None: self.test_loader = "setuptools.command.test:ScanningLoader" if self.test_runner is None: self.test_runner = getattr(self.distribution, 'test_runner', None) @NonDataProperty def test_args(self): return list(self._test_args()) def _test_args(self): if not self.test_suite and sys.version_info >= (2, 7): yield 'discover' if self.verbose: yield '--verbose' if self.test_suite: yield self.test_suite def with_project_on_sys_path(self, func): """ Backward compatibility for project_on_sys_path context. """ with self.project_on_sys_path(): func() @contextlib.contextmanager def project_on_sys_path(self, include_dists=[]): with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) if with_2to3: # If we run 2to3 we can not do this inplace: # Ensure metadata is up-to-date self.reinitialize_command('build_py', inplace=0) self.run_command('build_py') bpy_cmd = self.get_finalized_command("build_py") build_path = normalize_path(bpy_cmd.build_lib) # Build extensions self.reinitialize_command('egg_info', egg_base=build_path) self.run_command('egg_info') self.reinitialize_command('build_ext', inplace=0) self.run_command('build_ext') else: # Without 2to3 inplace works fine: self.run_command('egg_info') # Build extensions in-place self.reinitialize_command('build_ext', inplace=1) self.run_command('build_ext') ei_cmd = self.get_finalized_command("egg_info") old_path = sys.path[:] old_modules = sys.modules.copy() try: project_path = normalize_path(ei_cmd.egg_base) sys.path.insert(0, project_path) working_set.__init__() add_activation_listener(lambda dist: dist.activate()) require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) with self.paths_on_pythonpath([project_path]): yield finally: sys.path[:] = old_path sys.modules.clear() sys.modules.update(old_modules) working_set.__init__() @staticmethod @contextlib.contextmanager def paths_on_pythonpath(paths): """ Add the indicated paths to the head of the PYTHONPATH environment variable so that subprocesses will also see the packages at these paths. Do this in a context that restores the value on exit. """ nothing = object() orig_pythonpath = os.environ.get('PYTHONPATH', nothing) current_pythonpath = os.environ.get('PYTHONPATH', '') try: prefix = os.pathsep.join(paths) to_join = filter(None, [prefix, current_pythonpath]) new_path = os.pathsep.join(to_join) if new_path: os.environ['PYTHONPATH'] = new_path yield finally: if orig_pythonpath is nothing: os.environ.pop('PYTHONPATH', None) else: os.environ['PYTHONPATH'] = orig_pythonpath @staticmethod def install_dists(dist): """ Install the requirements indicated by self.distribution and return an iterable of the dists that were built. """ ir_d = dist.fetch_build_eggs(dist.install_requires) tr_d = dist.fetch_build_eggs(dist.tests_require or []) er_d = dist.fetch_build_eggs( v for k, v in dist.extras_require.items() if k.startswith(':') and evaluate_marker(k[1:]) ) return itertools.chain(ir_d, tr_d, er_d) def run(self): installed_dists = self.install_dists(self.distribution) cmd = ' '.join(self._argv) if self.dry_run: self.announce('skipping "%s" (dry run)' % cmd) return self.announce('running "%s"' % cmd) paths = map(operator.attrgetter('location'), installed_dists) with self.paths_on_pythonpath(paths): with self.project_on_sys_path(): self.run_tests() def run_tests(self): # Purge modules under test from sys.modules. The test loader will # re-import them from the build location. Required when 2to3 is used # with namespace packages. if six.PY3 and getattr(self.distribution, 'use_2to3', False): module = self.test_suite.split('.')[0] if module in _namespace_packages: del_modules = [] if module in sys.modules: del_modules.append(module) module += '.' for name in sys.modules: if name.startswith(module): del_modules.append(name) list(map(sys.modules.__delitem__, del_modules)) test = unittest.main( None, None, self._argv, testLoader=self._resolve_as_ep(self.test_loader), testRunner=self._resolve_as_ep(self.test_runner), exit=False, ) if not test.result.wasSuccessful(): msg = 'Test failed: %s' % test.result self.announce(msg, log.ERROR) raise DistutilsError(msg) @property def _argv(self): return ['unittest'] + self.test_args @staticmethod def _resolve_as_ep(val): """ Load the indicated attribute value, called, as a as if it were specified as an entry point. """ if val is None: return parsed = EntryPoint.parse("x=" + val) return parsed.resolve()() PK!$gcommand/upload.pynu[import getpass from distutils.command import upload as orig class upload(orig.upload): """ Override default upload behavior to obtain password in a variety of different ways. """ def finalize_options(self): orig.upload.finalize_options(self) self.username = ( self.username or getpass.getuser() ) # Attempt to obtain password. Short circuit evaluation at the first # sign of success. self.password = ( self.password or self._load_password_from_keyring() or self._prompt_for_password() ) def _load_password_from_keyring(self): """ Attempt to load password from keyring. Suppress Exceptions. """ try: keyring = __import__('keyring') return keyring.get_password(self.repository, self.username) except Exception: pass def _prompt_for_password(self): """ Prompt for a password on the tty. Suppress Exceptions. """ try: return getpass.getpass() except (Exception, KeyboardInterrupt): pass PK!Əcommand/upload_docs.pynu[# -*- coding: utf-8 -*- """upload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). """ from base64 import standard_b64encode from distutils import log from distutils.errors import DistutilsOptionError import os import socket import zipfile import tempfile import shutil import itertools import functools from setuptools.extern import six from setuptools.extern.six.moves import http_client, urllib from pkg_resources import iter_entry_points from .upload import upload def _encode(s): errors = 'surrogateescape' if six.PY3 else 'strict' return s.encode('utf-8', errors) class upload_docs(upload): # override the default repository as upload_docs isn't # supported by Warehouse (and won't be). DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' description = 'Upload documentation to PyPI' user_options = [ ('repository=', 'r', "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), ('show-response', None, 'display full response text from server'), ('upload-dir=', None, 'directory to upload'), ] boolean_options = upload.boolean_options def has_sphinx(self): if self.upload_dir is None: for ep in iter_entry_points('distutils.commands', 'build_sphinx'): return True sub_commands = [('build_sphinx', has_sphinx)] def initialize_options(self): upload.initialize_options(self) self.upload_dir = None self.target_dir = None def finalize_options(self): upload.finalize_options(self) if self.upload_dir is None: if self.has_sphinx(): build_sphinx = self.get_finalized_command('build_sphinx') self.target_dir = build_sphinx.builder_target_dir else: build = self.get_finalized_command('build') self.target_dir = os.path.join(build.build_base, 'docs') else: self.ensure_dirname('upload_dir') self.target_dir = self.upload_dir if 'pypi.python.org' in self.repository: log.warn("Upload_docs command is deprecated. Use RTD instead.") self.announce('Using upload directory %s' % self.target_dir) def create_zipfile(self, filename): zip_file = zipfile.ZipFile(filename, "w") try: self.mkpath(self.target_dir) # just in case for root, dirs, files in os.walk(self.target_dir): if root == self.target_dir and not files: tmpl = "no files found in upload directory '%s'" raise DistutilsOptionError(tmpl % self.target_dir) for name in files: full = os.path.join(root, name) relative = root[len(self.target_dir):].lstrip(os.path.sep) dest = os.path.join(relative, name) zip_file.write(full, dest) finally: zip_file.close() def run(self): # Run sub commands for cmd_name in self.get_sub_commands(): self.run_command(cmd_name) tmp_dir = tempfile.mkdtemp() name = self.distribution.metadata.get_name() zip_file = os.path.join(tmp_dir, "%s.zip" % name) try: self.create_zipfile(zip_file) self.upload_file(zip_file) finally: shutil.rmtree(tmp_dir) @staticmethod def _build_part(item, sep_boundary): key, values = item title = '\nContent-Disposition: form-data; name="%s"' % key # handle multiple entries for the same name if not isinstance(values, list): values = [values] for value in values: if isinstance(value, tuple): title += '; filename="%s"' % value[0] value = value[1] else: value = _encode(value) yield sep_boundary yield _encode(title) yield b"\n\n" yield value if value and value[-1:] == b'\r': yield b'\n' # write an extra newline (lurve Macs) @classmethod def _build_multipart(cls, data): """ Build up the MIME payload for the POST data """ boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' sep_boundary = b'\n--' + boundary end_boundary = sep_boundary + b'--' end_items = end_boundary, b"\n", builder = functools.partial( cls._build_part, sep_boundary=sep_boundary, ) part_groups = map(builder, data.items()) parts = itertools.chain.from_iterable(part_groups) body_items = itertools.chain(parts, end_items) content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') return b''.join(body_items), content_type def upload_file(self, filename): with open(filename, 'rb') as f: content = f.read() meta = self.distribution.metadata data = { ':action': 'doc_upload', 'name': meta.get_name(), 'content': (os.path.basename(filename), content), } # set up the authentication credentials = _encode(self.username + ':' + self.password) credentials = standard_b64encode(credentials) if six.PY3: credentials = credentials.decode('ascii') auth = "Basic " + credentials body, ct = self._build_multipart(data) msg = "Submitting documentation to %s" % (self.repository) self.announce(msg, log.INFO) # build the Request # We can't use urllib2 since we need to send the Basic # auth right with the first request schema, netloc, url, params, query, fragments = \ urllib.parse.urlparse(self.repository) assert not params and not query and not fragments if schema == 'http': conn = http_client.HTTPConnection(netloc) elif schema == 'https': conn = http_client.HTTPSConnection(netloc) else: raise AssertionError("unsupported schema " + schema) data = '' try: conn.connect() conn.putrequest("POST", url) content_type = ct conn.putheader('Content-type', content_type) conn.putheader('Content-length', str(len(body))) conn.putheader('Authorization', auth) conn.endheaders() conn.send(body) except socket.error as e: self.announce(str(e), log.ERROR) return r = conn.getresponse() if r.status == 200: msg = 'Server response (%s): %s' % (r.status, r.reason) self.announce(msg, log.INFO) elif r.status == 301: location = r.getheader('Location') if location is None: location = 'https://pythonhosted.org/%s/' % meta.get_name() msg = 'Upload successful. Visit %s' % location self.announce(msg, log.INFO) else: msg = 'Upload failed (%s): %s' % (r.status, r.reason) self.announce(msg, log.ERROR) if self.show_response: print('-' * 75, r.read(), '-' * 75) PK!0)1 1 0extern/__pycache__/__init__.cpython-36.opt-1.pycnu[3 9f @s.ddlZGdddZdZeeedjdS) Nc@sDeZdZdZfdfddZeddZd ddZd d Zd d Z dS)VendorImporterz A PEP 302 meta path importer for finding optionally-vendored or otherwise naturally-installed packages from root_name. NcCs&||_t||_|p|jdd|_dS)NZexternZ_vendor) root_namesetvendored_namesreplace vendor_pkg)selfrrrr /usr/lib/python3.6/__init__.py__init__ s zVendorImporter.__init__ccs|jdVdVdS)zL Search first the vendor package then as a natural package. .N)r)rr r r search_paths zVendorImporter.search_pathcCs8|j|jd\}}}|rdStt|j|js4dS|S)z Return self when fullname starts with root_name and the target module is one vendored through this importer. r N) partitionranymap startswithr)rfullnamepathrootbasetargetr r r find_modules zVendorImporter.find_modulec Cs|j|jd\}}}xp|jD]T}y:||}t|tj|}|tj|<tjdkrZtj|=|Stk rpYqXqWtdjft dS)zK Iterate over the search path to locate and load fullname. r zThe '{target}' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.N)rr) rrr __import__sysmodules version_info ImportErrorformatlocals)rrrrrprefixZextantmodr r r load_module#s     zVendorImporter.load_modulecCs|tjkrtjj|dS)zR Install this importer into sys.meta_path if not already present. N)r meta_pathappend)rr r r install@s zVendorImporter.install)N) __name__ __module__ __qualname____doc__r propertyrrr#r&r r r r rs   rsix packaging pyparsingzsetuptools._vendor)r,r-r.)rrnamesr'r&r r r r sDPK!0)1 1 *extern/__pycache__/__init__.cpython-36.pycnu[3 9f @s.ddlZGdddZdZeeedjdS) Nc@sDeZdZdZfdfddZeddZd ddZd d Zd d Z dS)VendorImporterz A PEP 302 meta path importer for finding optionally-vendored or otherwise naturally-installed packages from root_name. NcCs&||_t||_|p|jdd|_dS)NZexternZ_vendor) root_namesetvendored_namesreplace vendor_pkg)selfrrrr /usr/lib/python3.6/__init__.py__init__ s zVendorImporter.__init__ccs|jdVdVdS)zL Search first the vendor package then as a natural package. .N)r)rr r r search_paths zVendorImporter.search_pathcCs8|j|jd\}}}|rdStt|j|js4dS|S)z Return self when fullname starts with root_name and the target module is one vendored through this importer. r N) partitionranymap startswithr)rfullnamepathrootbasetargetr r r find_modules zVendorImporter.find_modulec Cs|j|jd\}}}xp|jD]T}y:||}t|tj|}|tj|<tjdkrZtj|=|Stk rpYqXqWtdjft dS)zK Iterate over the search path to locate and load fullname. r zThe '{target}' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.N)rr) rrr __import__sysmodules version_info ImportErrorformatlocals)rrrrrprefixZextantmodr r r load_module#s     zVendorImporter.load_modulecCs|tjkrtjj|dS)zR Install this importer into sys.meta_path if not already present. N)r meta_pathappend)rr r r install@s zVendorImporter.install)N) __name__ __module__ __qualname____doc__r propertyrrr#r&r r r r rs   rsix packaging pyparsingzsetuptools._vendor)r,r-r.)rrnamesr'r&r r r r sDPK!-G extern/__init__.pynu[import sys class VendorImporter: """ A PEP 302 meta path importer for finding optionally-vendored or otherwise naturally-installed packages from root_name. """ def __init__(self, root_name, vendored_names=(), vendor_pkg=None): self.root_name = root_name self.vendored_names = set(vendored_names) self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') @property def search_path(self): """ Search first the vendor package then as a natural package. """ yield self.vendor_pkg + '.' yield '' def find_module(self, fullname, path=None): """ Return self when fullname starts with root_name and the target module is one vendored through this importer. """ root, base, target = fullname.partition(self.root_name + '.') if root: return if not any(map(target.startswith, self.vendored_names)): return return self def load_module(self, fullname): """ Iterate over the search path to locate and load fullname. """ root, base, target = fullname.partition(self.root_name + '.') for prefix in self.search_path: try: extant = prefix + target __import__(extant) mod = sys.modules[extant] sys.modules[fullname] = mod # mysterious hack: # Remove the reference to the extant package/module # on later Python versions to cause relative imports # in the vendor package to resolve the same modules # as those going through this importer. if sys.version_info > (3, 3): del sys.modules[extant] return mod except ImportError: pass else: raise ImportError( "The '{target}' package is required; " "normally this is bundled with this package so if you get " "this warning, consult the packager of your " "distribution.".format(**locals()) ) def install(self): """ Install this importer into sys.meta_path if not already present. """ if self not in sys.meta_path: sys.meta_path.append(self) names = 'six', 'packaging', 'pyparsing', VendorImporter(__name__, names, 'setuptools._vendor').install() PK!# JDD __init__.pynu["""Extensions to the 'distutils' for large or complex distributions""" import os import functools import distutils.core import distutils.filelist from distutils.util import convert_path from fnmatch import fnmatchcase from setuptools.extern.six.moves import filter, map import setuptools.version from setuptools.extension import Extension from setuptools.dist import Distribution, Feature from setuptools.depends import Require from . import monkey __all__ = [ 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', 'find_packages', ] __version__ = setuptools.version.__version__ bootstrap_install_from = None # If we run 2to3 on .py files, should we also convert docstrings? # Default: yes; assume that we can detect doctests reliably run_2to3_on_doctests = True # Standard package names for fixer packages lib2to3_fixer_packages = ['lib2to3.fixes'] class PackageFinder(object): """ Generate a list of all Python packages found within a directory """ @classmethod def find(cls, where='.', exclude=(), include=('*',)): """Return a list all Python packages found within directory 'where' 'where' is the root directory which will be searched for packages. It should be supplied as a "cross-platform" (i.e. URL-style) path; it will be converted to the appropriate local path syntax. 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). 'include' is a sequence of package names to include. If it's specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. """ return list(cls._find_packages_iter( convert_path(where), cls._build_filter('ez_setup', '*__pycache__', *exclude), cls._build_filter(*include))) @classmethod def _find_packages_iter(cls, where, exclude, include): """ All the packages found in 'where' that pass the 'include' filter, but not the 'exclude' filter. """ for root, dirs, files in os.walk(where, followlinks=True): # Copy dirs to iterate over it, then empty dirs. all_dirs = dirs[:] dirs[:] = [] for dir in all_dirs: full_path = os.path.join(root, dir) rel_path = os.path.relpath(full_path, where) package = rel_path.replace(os.path.sep, '.') # Skip directory trees that are not valid packages if ('.' in dir or not cls._looks_like_package(full_path)): continue # Should this package be included? if include(package) and not exclude(package): yield package # Keep searching subdirectories, as there may be more packages # down there, even if the parent was excluded. dirs.append(dir) @staticmethod def _looks_like_package(path): """Does a directory look like a package?""" return os.path.isfile(os.path.join(path, '__init__.py')) @staticmethod def _build_filter(*patterns): """ Given a list of patterns, return a callable that will be true only if the input matches at least one of the patterns. """ return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) class PEP420PackageFinder(PackageFinder): @staticmethod def _looks_like_package(path): return True find_packages = PackageFinder.find def _install_setup_requires(attrs): # Note: do not use `setuptools.Distribution` directly, as # our PEP 517 backend patch `distutils.core.Distribution`. dist = distutils.core.Distribution(dict( (k, v) for k, v in attrs.items() if k in ('dependency_links', 'setup_requires') )) # Honor setup.cfg's options. dist.parse_config_files(ignore_option_errors=True) if dist.setup_requires: dist.fetch_build_eggs(dist.setup_requires) def setup(**attrs): # Make sure we have any requirements needed to interpret 'attrs'. _install_setup_requires(attrs) return distutils.core.setup(**attrs) setup.__doc__ = distutils.core.setup.__doc__ _Command = monkey.get_unpatched(distutils.core.Command) class Command(_Command): __doc__ = _Command.__doc__ command_consumes_arguments = False def __init__(self, dist, **kw): """ Construct the command for dist, updating vars(self) with any keyword parameters. """ _Command.__init__(self, dist) vars(self).update(kw) def reinitialize_command(self, command, reinit_subcommands=0, **kw): cmd = _Command.reinitialize_command(self, command, reinit_subcommands) vars(cmd).update(kw) return cmd def _find_all_simple(path): """ Find all files under 'path' """ results = ( os.path.join(base, file) for base, dirs, files in os.walk(path, followlinks=True) for file in files ) return filter(os.path.isfile, results) def findall(dir=os.curdir): """ Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. """ files = _find_all_simple(dir) if dir == os.curdir: make_rel = functools.partial(os.path.relpath, start=dir) files = map(make_rel, files) return list(files) monkey.patch_all() PK!eQarchive_util.pynu["""Utilities for extracting common archive formats""" import zipfile import tarfile import os import shutil import posixpath import contextlib from distutils.errors import DistutilsError from pkg_resources import ensure_directory __all__ = [ "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", "UnrecognizedFormat", "extraction_drivers", "unpack_directory", ] class UnrecognizedFormat(DistutilsError): """Couldn't recognize the archive type""" def default_filter(src, dst): """The default progress/filter callback; returns True for all files""" return dst def unpack_archive(filename, extract_dir, progress_filter=default_filter, drivers=None): """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` `progress_filter` is a function taking two arguments: a source path internal to the archive ('/'-separated), and a filesystem path where it will be extracted. The callback must return the desired extract path (which may be the same as the one passed in), or else ``None`` to skip that file or directory. The callback can thus be used to report on the progress of the extraction, as well as to filter the items extracted or alter their extraction paths. `drivers`, if supplied, must be a non-empty sequence of functions with the same signature as this function (minus the `drivers` argument), that raise ``UnrecognizedFormat`` if they do not support extracting the designated archive type. The `drivers` are tried in sequence until one is found that does not raise an error, or until all are exhausted (in which case ``UnrecognizedFormat`` is raised). If you do not supply a sequence of drivers, the module's ``extraction_drivers`` constant will be used, which means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that order. """ for driver in drivers or extraction_drivers: try: driver(filename, extract_dir, progress_filter) except UnrecognizedFormat: continue else: return else: raise UnrecognizedFormat( "Not a recognized archive type: %s" % filename ) def unpack_directory(filename, extract_dir, progress_filter=default_filter): """"Unpack" a directory, using the same interface as for archives Raises ``UnrecognizedFormat`` if `filename` is not a directory """ if not os.path.isdir(filename): raise UnrecognizedFormat("%s is not a directory" % filename) paths = { filename: ('', extract_dir), } for base, dirs, files in os.walk(filename): src, dst = paths[base] for d in dirs: paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) for f in files: target = os.path.join(dst, f) target = progress_filter(src + f, target) if not target: # skip non-files continue ensure_directory(target) f = os.path.join(base, f) shutil.copyfile(f, target) shutil.copystat(f, target) def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): """Unpack zip `filename` to `extract_dir` Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation of the `progress_filter` argument. """ if not zipfile.is_zipfile(filename): raise UnrecognizedFormat("%s is not a zip file" % (filename,)) with zipfile.ZipFile(filename) as z: for info in z.infolist(): name = info.filename # don't extract absolute paths or ones with .. in them if name.startswith('/') or '..' in name.split('/'): continue target = os.path.join(extract_dir, *name.split('/')) target = progress_filter(name, target) if not target: continue if name.endswith('/'): # directory ensure_directory(target) else: # file ensure_directory(target) data = z.read(info.filename) with open(target, 'wb') as f: f.write(data) unix_attributes = info.external_attr >> 16 if unix_attributes: os.chmod(target, unix_attributes) def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined by ``tarfile.open()``). See ``unpack_archive()`` for an explanation of the `progress_filter` argument. """ try: tarobj = tarfile.open(filename) except tarfile.TarError: raise UnrecognizedFormat( "%s is not a compressed or uncompressed tar file" % (filename,) ) with contextlib.closing(tarobj): # don't do any chowning! tarobj.chown = lambda *args: None for member in tarobj: name = member.name # don't extract absolute paths or ones with .. in them if not name.startswith('/') and '..' not in name.split('/'): prelim_dst = os.path.join(extract_dir, *name.split('/')) # resolve any links and to extract the link targets as normal # files while member is not None and (member.islnk() or member.issym()): linkpath = member.linkname if member.issym(): base = posixpath.dirname(member.name) linkpath = posixpath.join(base, linkpath) linkpath = posixpath.normpath(linkpath) member = tarobj._getmember(linkpath) if member is not None and (member.isfile() or member.isdir()): final_dst = progress_filter(name, prelim_dst) if final_dst: if final_dst.endswith(os.sep): final_dst = final_dst[:-1] try: # XXX Ugh tarobj._extract_member(member, final_dst) except tarfile.ExtractError: # chown/chmod/mkfifo/mknode/makedev failed pass return True extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile PK!='' build_meta.pynu["""A PEP 517 interface to setuptools Previously, when a user or a command line tool (let's call it a "frontend") needed to make a request of setuptools to take a certain action, for example, generating a list of installation requirements, the frontend would would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. PEP 517 defines a different method of interfacing with setuptools. Rather than calling "setup.py" directly, the frontend should: 1. Set the current directory to the directory with a setup.py file 2. Import this module into a safe python interpreter (one in which setuptools can potentially set global variables or crash hard). 3. Call one of the functions defined in PEP 517. What each function does is defined in PEP 517. However, here is a "casual" definition of the functions (this definition should not be relied on for bug reports or API stability): - `build_wheel`: build a wheel in the folder and return the basename - `get_requires_for_build_wheel`: get the `setup_requires` to build - `prepare_metadata_for_build_wheel`: get the `install_requires` - `build_sdist`: build an sdist in the folder and return the basename - `get_requires_for_build_sdist`: get the `setup_requires` to build Again, this is not a formal definition! Just a "taste" of the module. """ import os import sys import tokenize import shutil import contextlib import setuptools import distutils class SetupRequirementsError(BaseException): def __init__(self, specifiers): self.specifiers = specifiers class Distribution(setuptools.dist.Distribution): def fetch_build_eggs(self, specifiers): raise SetupRequirementsError(specifiers) @classmethod @contextlib.contextmanager def patch(cls): """ Replace distutils.dist.Distribution with this class for the duration of this context. """ orig = distutils.core.Distribution distutils.core.Distribution = cls try: yield finally: distutils.core.Distribution = orig def _run_setup(setup_script='setup.py'): # Note that we can reuse our build directory between calls # Correctness comes first, then optimization later __file__ = setup_script __name__ = '__main__' f = getattr(tokenize, 'open', open)(__file__) code = f.read().replace('\\r\\n', '\\n') f.close() exec(compile(code, __file__, 'exec'), locals()) def _fix_config(config_settings): config_settings = config_settings or {} config_settings.setdefault('--global-option', []) return config_settings def _get_build_requires(config_settings): config_settings = _fix_config(config_settings) requirements = ['setuptools', 'wheel'] sys.argv = sys.argv[:1] + ['egg_info'] + \ config_settings["--global-option"] try: with Distribution.patch(): _run_setup() except SetupRequirementsError as e: requirements += e.specifiers return requirements def _get_immediate_subdirectories(a_dir): return [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name))] def get_requires_for_build_wheel(config_settings=None): config_settings = _fix_config(config_settings) return _get_build_requires(config_settings) def get_requires_for_build_sdist(config_settings=None): config_settings = _fix_config(config_settings) return _get_build_requires(config_settings) def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', metadata_directory] _run_setup() dist_info_directory = metadata_directory while True: dist_infos = [f for f in os.listdir(dist_info_directory) if f.endswith('.dist-info')] if len(dist_infos) == 0 and \ len(_get_immediate_subdirectories(dist_info_directory)) == 1: dist_info_directory = os.path.join( dist_info_directory, os.listdir(dist_info_directory)[0]) continue assert len(dist_infos) == 1 break # PEP 517 requires that the .dist-info directory be placed in the # metadata_directory. To comply, we MUST copy the directory to the root if dist_info_directory != metadata_directory: shutil.move( os.path.join(dist_info_directory, dist_infos[0]), metadata_directory) shutil.rmtree(dist_info_directory, ignore_errors=True) return dist_infos[0] def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): config_settings = _fix_config(config_settings) wheel_directory = os.path.abspath(wheel_directory) sys.argv = sys.argv[:1] + ['bdist_wheel'] + \ config_settings["--global-option"] _run_setup() if wheel_directory != 'dist': shutil.rmtree(wheel_directory) shutil.copytree('dist', wheel_directory) wheels = [f for f in os.listdir(wheel_directory) if f.endswith('.whl')] assert len(wheels) == 1 return wheels[0] def build_sdist(sdist_directory, config_settings=None): config_settings = _fix_config(config_settings) sdist_directory = os.path.abspath(sdist_directory) sys.argv = sys.argv[:1] + ['sdist'] + \ config_settings["--global-option"] _run_setup() if sdist_directory != 'dist': shutil.rmtree(sdist_directory) shutil.copytree('dist', sdist_directory) sdists = [f for f in os.listdir(sdist_directory) if f.endswith('.tar.gz')] assert len(sdists) == 1 return sdists[0] PK!;oT?? config.pynu[from __future__ import absolute_import, unicode_literals import io import os import sys from collections import defaultdict from functools import partial from importlib import import_module from distutils.errors import DistutilsOptionError, DistutilsFileError from setuptools.extern.six import string_types def read_configuration( filepath, find_others=False, ignore_option_errors=False): """Read given configuration file and returns options from it as a dict. :param str|unicode filepath: Path to configuration file to get options from. :param bool find_others: Whether to search for other configuration files which could be on in various places. :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: dict """ from setuptools.dist import Distribution, _Distribution filepath = os.path.abspath(filepath) if not os.path.isfile(filepath): raise DistutilsFileError( 'Configuration file %s does not exist.' % filepath) current_directory = os.getcwd() os.chdir(os.path.dirname(filepath)) try: dist = Distribution() filenames = dist.find_config_files() if find_others else [] if filepath not in filenames: filenames.append(filepath) _Distribution.parse_config_files(dist, filenames=filenames) handlers = parse_configuration( dist, dist.command_options, ignore_option_errors=ignore_option_errors) finally: os.chdir(current_directory) return configuration_to_dict(handlers) def configuration_to_dict(handlers): """Returns configuration data gathered by given handlers as a dict. :param list[ConfigHandler] handlers: Handlers list, usually from parse_configuration() :rtype: dict """ config_dict = defaultdict(dict) for handler in handlers: obj_alias = handler.section_prefix target_obj = handler.target_obj for option in handler.set_options: getter = getattr(target_obj, 'get_%s' % option, None) if getter is None: value = getattr(target_obj, option) else: value = getter() config_dict[obj_alias][option] = value return config_dict def parse_configuration( distribution, command_options, ignore_option_errors=False): """Performs additional parsing of configuration options for a distribution. Returns a list of used option handlers. :param Distribution distribution: :param dict command_options: :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: list """ meta = ConfigMetadataHandler( distribution.metadata, command_options, ignore_option_errors) meta.parse() options = ConfigOptionsHandler( distribution, command_options, ignore_option_errors) options.parse() return meta, options class ConfigHandler(object): """Handles metadata supplied in configuration files.""" section_prefix = None """Prefix for config sections handled by this handler. Must be provided by class heirs. """ aliases = {} """Options aliases. For compatibility with various packages. E.g.: d2to1 and pbr. Note: `-` in keys is replaced with `_` by config parser. """ def __init__(self, target_obj, options, ignore_option_errors=False): sections = {} section_prefix = self.section_prefix for section_name, section_options in options.items(): if not section_name.startswith(section_prefix): continue section_name = section_name.replace(section_prefix, '').strip('.') sections[section_name] = section_options self.ignore_option_errors = ignore_option_errors self.target_obj = target_obj self.sections = sections self.set_options = [] @property def parsers(self): """Metadata item name to parser function mapping.""" raise NotImplementedError( '%s must provide .parsers property' % self.__class__.__name__) def __setitem__(self, option_name, value): unknown = tuple() target_obj = self.target_obj # Translate alias into real name. option_name = self.aliases.get(option_name, option_name) current_value = getattr(target_obj, option_name, unknown) if current_value is unknown: raise KeyError(option_name) if current_value: # Already inhabited. Skipping. return skip_option = False parser = self.parsers.get(option_name) if parser: try: value = parser(value) except Exception: skip_option = True if not self.ignore_option_errors: raise if skip_option: return setter = getattr(target_obj, 'set_%s' % option_name, None) if setter is None: setattr(target_obj, option_name, value) else: setter(value) self.set_options.append(option_name) @classmethod def _parse_list(cls, value, separator=','): """Represents value as a list. Value is split either by separator (defaults to comma) or by lines. :param value: :param separator: List items separator character. :rtype: list """ if isinstance(value, list): # _get_parser_compound case return value if '\n' in value: value = value.splitlines() else: value = value.split(separator) return [chunk.strip() for chunk in value if chunk.strip()] @classmethod def _parse_dict(cls, value): """Represents value as a dict. :param value: :rtype: dict """ separator = '=' result = {} for line in cls._parse_list(value): key, sep, val = line.partition(separator) if sep != separator: raise DistutilsOptionError( 'Unable to parse option value to dict: %s' % value) result[key.strip()] = val.strip() return result @classmethod def _parse_bool(cls, value): """Represents value as boolean. :param value: :rtype: bool """ value = value.lower() return value in ('1', 'true', 'yes') @classmethod def _parse_file(cls, value): """Represents value as a string, allowing including text from nearest files using `file:` directive. Directive is sandboxed and won't reach anything outside directory with setup.py. Examples: file: LICENSE file: README.rst, CHANGELOG.md, src/file.txt :param str value: :rtype: str """ include_directive = 'file:' if not isinstance(value, string_types): return value if not value.startswith(include_directive): return value spec = value[len(include_directive):] filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) return '\n'.join( cls._read_file(path) for path in filepaths if (cls._assert_local(path) or True) and os.path.isfile(path) ) @staticmethod def _assert_local(filepath): if not filepath.startswith(os.getcwd()): raise DistutilsOptionError( '`file:` directive can not access %s' % filepath) @staticmethod def _read_file(filepath): with io.open(filepath, encoding='utf-8') as f: return f.read() @classmethod def _parse_attr(cls, value): """Represents value as a module attribute. Examples: attr: package.attr attr: package.module.attr :param str value: :rtype: str """ attr_directive = 'attr:' if not value.startswith(attr_directive): return value attrs_path = value.replace(attr_directive, '').strip().split('.') attr_name = attrs_path.pop() module_name = '.'.join(attrs_path) module_name = module_name or '__init__' sys.path.insert(0, os.getcwd()) try: module = import_module(module_name) value = getattr(module, attr_name) finally: sys.path = sys.path[1:] return value @classmethod def _get_parser_compound(cls, *parse_methods): """Returns parser function to represents value as a list. Parses a value applying given methods one after another. :param parse_methods: :rtype: callable """ def parse(value): parsed = value for method in parse_methods: parsed = method(parsed) return parsed return parse @classmethod def _parse_section_to_dict(cls, section_options, values_parser=None): """Parses section options into a dictionary. Optionally applies a given parser to values. :param dict section_options: :param callable values_parser: :rtype: dict """ value = {} values_parser = values_parser or (lambda val: val) for key, (_, val) in section_options.items(): value[key] = values_parser(val) return value def parse_section(self, section_options): """Parses configuration file section. :param dict section_options: """ for (name, (_, value)) in section_options.items(): try: self[name] = value except KeyError: pass # Keep silent for a new option may appear anytime. def parse(self): """Parses configuration file items from one or more related sections. """ for section_name, section_options in self.sections.items(): method_postfix = '' if section_name: # [section.option] variant method_postfix = '_%s' % section_name section_parser_method = getattr( self, # Dots in section names are tranlsated into dunderscores. ('parse_section%s' % method_postfix).replace('.', '__'), None) if section_parser_method is None: raise DistutilsOptionError( 'Unsupported distribution option section: [%s.%s]' % ( self.section_prefix, section_name)) section_parser_method(section_options) class ConfigMetadataHandler(ConfigHandler): section_prefix = 'metadata' aliases = { 'home_page': 'url', 'summary': 'description', 'classifier': 'classifiers', 'platform': 'platforms', } strict_mode = False """We need to keep it loose, to be partially compatible with `pbr` and `d2to1` packages which also uses `metadata` section. """ @property def parsers(self): """Metadata item name to parser function mapping.""" parse_list = self._parse_list parse_file = self._parse_file parse_dict = self._parse_dict return { 'platforms': parse_list, 'keywords': parse_list, 'provides': parse_list, 'requires': parse_list, 'obsoletes': parse_list, 'classifiers': self._get_parser_compound(parse_file, parse_list), 'license': parse_file, 'description': parse_file, 'long_description': parse_file, 'version': self._parse_version, 'project_urls': parse_dict, } def _parse_version(self, value): """Parses `version` option value. :param value: :rtype: str """ version = self._parse_attr(value) if callable(version): version = version() if not isinstance(version, string_types): if hasattr(version, '__iter__'): version = '.'.join(map(str, version)) else: version = '%s' % version return version class ConfigOptionsHandler(ConfigHandler): section_prefix = 'options' @property def parsers(self): """Metadata item name to parser function mapping.""" parse_list = self._parse_list parse_list_semicolon = partial(self._parse_list, separator=';') parse_bool = self._parse_bool parse_dict = self._parse_dict return { 'zip_safe': parse_bool, 'use_2to3': parse_bool, 'include_package_data': parse_bool, 'package_dir': parse_dict, 'use_2to3_fixers': parse_list, 'use_2to3_exclude_fixers': parse_list, 'convert_2to3_doctests': parse_list, 'scripts': parse_list, 'eager_resources': parse_list, 'dependency_links': parse_list, 'namespace_packages': parse_list, 'install_requires': parse_list_semicolon, 'setup_requires': parse_list_semicolon, 'tests_require': parse_list_semicolon, 'packages': self._parse_packages, 'entry_points': self._parse_file, 'py_modules': parse_list, } def _parse_packages(self, value): """Parses `packages` option value. :param value: :rtype: list """ find_directive = 'find:' if not value.startswith(find_directive): return self._parse_list(value) # Read function arguments from a dedicated section. find_kwargs = self.parse_section_packages__find( self.sections.get('packages.find', {})) from setuptools import find_packages return find_packages(**find_kwargs) def parse_section_packages__find(self, section_options): """Parses `packages.find` configuration file section. To be used in conjunction with _parse_packages(). :param dict section_options: """ section_data = self._parse_section_to_dict( section_options, self._parse_list) valid_keys = ['where', 'include', 'exclude'] find_kwargs = dict( [(k, v) for k, v in section_data.items() if k in valid_keys and v]) where = find_kwargs.get('where') if where is not None: find_kwargs['where'] = where[0] # cast list to single val return find_kwargs def parse_section_entry_points(self, section_options): """Parses `entry_points` configuration file section. :param dict section_options: """ parsed = self._parse_section_to_dict(section_options, self._parse_list) self['entry_points'] = parsed def _parse_package_data(self, section_options): parsed = self._parse_section_to_dict(section_options, self._parse_list) root = parsed.get('*') if root: parsed[''] = root del parsed['*'] return parsed def parse_section_package_data(self, section_options): """Parses `package_data` configuration file section. :param dict section_options: """ self['package_data'] = self._parse_package_data(section_options) def parse_section_exclude_package_data(self, section_options): """Parses `exclude_package_data` configuration file section. :param dict section_options: """ self['exclude_package_data'] = self._parse_package_data( section_options) def parse_section_extras_require(self, section_options): """Parses `extras_require` configuration file section. :param dict section_options: """ parse_list = partial(self._parse_list, separator=';') self['extras_require'] = self._parse_section_to_dict( section_options, parse_list) PK!"2 dep_util.pynu[from distutils.dep_util import newer_group # yes, this is was almost entirely copy-pasted from # 'newer_pairwise()', this is just another convenience # function. def newer_pairwise_group(sources_groups, targets): """Walk both arguments in parallel, testing if each source group is newer than its corresponding target. Returns a pair of lists (sources_groups, targets) where sources is newer than target, according to the semantics of 'newer_group()'. """ if len(sources_groups) != len(targets): raise ValueError("'sources_group' and 'targets' must be the same length") # build a pair of lists (sources_groups, targets) where source is newer n_sources = [] n_targets = [] for i in range(len(sources_groups)): if newer_group(sources_groups[i], targets[i]): n_sources.append(sources_groups[i]) n_targets.append(targets[i]) return n_sources, n_targets PK![)-j depends.pynu[import sys import imp import marshal from distutils.version import StrictVersion from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN from .py33compat import Bytecode __all__ = [ 'Require', 'find_module', 'get_module_constant', 'extract_constant' ] class Require: """A prerequisite to building or installing a distribution""" def __init__(self, name, requested_version, module, homepage='', attribute=None, format=None): if format is None and requested_version is not None: format = StrictVersion if format is not None: requested_version = format(requested_version) if attribute is None: attribute = '__version__' self.__dict__.update(locals()) del self.self def full_name(self): """Return full package/distribution name, w/version""" if self.requested_version is not None: return '%s-%s' % (self.name, self.requested_version) return self.name def version_ok(self, version): """Is 'version' sufficiently up-to-date?""" return self.attribute is None or self.format is None or \ str(version) != "unknown" and version >= self.requested_version def get_version(self, paths=None, default="unknown"): """Get version number of installed module, 'None', or 'default' Search 'paths' for module. If not found, return 'None'. If found, return the extracted version attribute, or 'default' if no version attribute was specified, or the value cannot be determined without importing the module. The version is formatted according to the requirement's version format (if any), unless it is 'None' or the supplied 'default'. """ if self.attribute is None: try: f, p, i = find_module(self.module, paths) if f: f.close() return default except ImportError: return None v = get_module_constant(self.module, self.attribute, default, paths) if v is not None and v is not default and self.format is not None: return self.format(v) return v def is_present(self, paths=None): """Return true if dependency is present on 'paths'""" return self.get_version(paths) is not None def is_current(self, paths=None): """Return true if dependency is present and up-to-date on 'paths'""" version = self.get_version(paths) if version is None: return False return self.version_ok(version) def find_module(module, paths=None): """Just like 'imp.find_module()', but with package support""" parts = module.split('.') while parts: part = parts.pop(0) f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) if kind == PKG_DIRECTORY: parts = parts or ['__init__'] paths = [path] elif parts: raise ImportError("Can't find %r in %s" % (parts, module)) return info def get_module_constant(module, symbol, default=-1, paths=None): """Find 'module' by searching 'paths', and extract 'symbol' Return 'None' if 'module' does not exist on 'paths', or it does not define 'symbol'. If the module defines 'symbol' as a constant, return the constant. Otherwise, return 'default'.""" try: f, path, (suffix, mode, kind) = find_module(module, paths) except ImportError: # Module doesn't exist return None try: if kind == PY_COMPILED: f.read(8) # skip magic & date code = marshal.load(f) elif kind == PY_FROZEN: code = imp.get_frozen_object(module) elif kind == PY_SOURCE: code = compile(f.read(), path, 'exec') else: # Not something we can parse; we'll have to import it. :( if module not in sys.modules: imp.load_module(module, f, path, (suffix, mode, kind)) return getattr(sys.modules[module], symbol, None) finally: if f: f.close() return extract_constant(code, symbol, default) def extract_constant(code, symbol, default=-1): """Extract the constant value of 'symbol' from 'code' If the name 'symbol' is bound to a constant value by the Python code object 'code', return that value. If 'symbol' is bound to an expression, return 'default'. Otherwise, return 'None'. Return value is based on the first assignment to 'symbol'. 'symbol' must be a global, or at least a non-"fast" local in the code block. That is, only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' must be present in 'code.co_names'. """ if symbol not in code.co_names: # name's not there, can't possibly be an assignment return None name_idx = list(code.co_names).index(symbol) STORE_NAME = 90 STORE_GLOBAL = 97 LOAD_CONST = 100 const = default for byte_code in Bytecode(code): op = byte_code.opcode arg = byte_code.arg if op == LOAD_CONST: const = code.co_consts[arg] elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): return const else: const = default def _update_globals(): """ Patch the globals to remove the objects not available on some platforms. XXX it'd be better to test assertions about bytecode instead. """ if not sys.platform.startswith('java') and sys.platform != 'cli': return incompatible = 'extract_constant', 'get_module_constant' for name in incompatible: del globals()[name] __all__.remove(name) _update_globals() PK!'Y^dist.pynu[# -*- coding: utf-8 -*- __all__ = ['Distribution'] import re import os import warnings import numbers import distutils.log import distutils.core import distutils.cmd import distutils.dist import itertools from collections import defaultdict from distutils.errors import ( DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, ) from distutils.util import rfc822_escape from distutils.version import StrictVersion from setuptools.extern import six from setuptools.extern import packaging from setuptools.extern.six.moves import map, filter, filterfalse from setuptools.depends import Require from setuptools import windows_support from setuptools.monkey import get_unpatched from setuptools.config import parse_configuration import pkg_resources from .py36compat import Distribution_parse_config_files __import__('setuptools.extern.packaging.specifiers') __import__('setuptools.extern.packaging.version') def _get_unpatched(cls): warnings.warn("Do not call this function", DeprecationWarning) return get_unpatched(cls) def get_metadata_version(dist_md): if dist_md.long_description_content_type or dist_md.provides_extras: return StrictVersion('2.1') elif (dist_md.maintainer is not None or dist_md.maintainer_email is not None or getattr(dist_md, 'python_requires', None) is not None): return StrictVersion('1.2') elif (dist_md.provides or dist_md.requires or dist_md.obsoletes or dist_md.classifiers or dist_md.download_url): return StrictVersion('1.1') return StrictVersion('1.0') # Based on Python 3.5 version def write_pkg_file(self, file): """Write the PKG-INFO format data to a file object. """ version = get_metadata_version(self) file.write('Metadata-Version: %s\n' % version) file.write('Name: %s\n' % self.get_name()) file.write('Version: %s\n' % self.get_version()) file.write('Summary: %s\n' % self.get_description()) file.write('Home-page: %s\n' % self.get_url()) if version < StrictVersion('1.2'): file.write('Author: %s\n' % self.get_contact()) file.write('Author-email: %s\n' % self.get_contact_email()) else: optional_fields = ( ('Author', 'author'), ('Author-email', 'author_email'), ('Maintainer', 'maintainer'), ('Maintainer-email', 'maintainer_email'), ) for field, attr in optional_fields: attr_val = getattr(self, attr) if six.PY2: attr_val = self._encode_field(attr_val) if attr_val is not None: file.write('%s: %s\n' % (field, attr_val)) file.write('License: %s\n' % self.get_license()) if self.download_url: file.write('Download-URL: %s\n' % self.download_url) for project_url in self.project_urls.items(): file.write('Project-URL: %s, %s\n' % project_url) long_desc = rfc822_escape(self.get_long_description()) file.write('Description: %s\n' % long_desc) keywords = ','.join(self.get_keywords()) if keywords: file.write('Keywords: %s\n' % keywords) if version >= StrictVersion('1.2'): for platform in self.get_platforms(): file.write('Platform: %s\n' % platform) else: self._write_list(file, 'Platform', self.get_platforms()) self._write_list(file, 'Classifier', self.get_classifiers()) # PEP 314 self._write_list(file, 'Requires', self.get_requires()) self._write_list(file, 'Provides', self.get_provides()) self._write_list(file, 'Obsoletes', self.get_obsoletes()) # Setuptools specific for PEP 345 if hasattr(self, 'python_requires'): file.write('Requires-Python: %s\n' % self.python_requires) # PEP 566 if self.long_description_content_type: file.write( 'Description-Content-Type: %s\n' % self.long_description_content_type ) if self.provides_extras: for extra in self.provides_extras: file.write('Provides-Extra: %s\n' % extra) # from Python 3.4 def write_pkg_info(self, base_dir): """Write the PKG-INFO file into the release tree. """ with open(os.path.join(base_dir, 'PKG-INFO'), 'w', encoding='UTF-8') as pkg_info: self.write_pkg_file(pkg_info) sequence = tuple, list def check_importable(dist, attr, value): try: ep = pkg_resources.EntryPoint.parse('x=' + value) assert not ep.extras except (TypeError, ValueError, AttributeError, AssertionError): raise DistutilsSetupError( "%r must be importable 'module:attrs' string (got %r)" % (attr, value) ) def assert_string_list(dist, attr, value): """Verify that value is a string list or None""" try: assert ''.join(value) != value except (TypeError, ValueError, AttributeError, AssertionError): raise DistutilsSetupError( "%r must be a list of strings (got %r)" % (attr, value) ) def check_nsp(dist, attr, value): """Verify that namespace packages are valid""" ns_packages = value assert_string_list(dist, attr, ns_packages) for nsp in ns_packages: if not dist.has_contents_for(nsp): raise DistutilsSetupError( "Distribution contains no modules or packages for " + "namespace package %r" % nsp ) parent, sep, child = nsp.rpartition('.') if parent and parent not in ns_packages: distutils.log.warn( "WARNING: %r is declared as a package namespace, but %r" " is not: please correct this in setup.py", nsp, parent ) def check_extras(dist, attr, value): """Verify that extras_require mapping is valid""" try: list(itertools.starmap(_check_extra, value.items())) except (TypeError, ValueError, AttributeError): raise DistutilsSetupError( "'extras_require' must be a dictionary whose values are " "strings or lists of strings containing valid project/version " "requirement specifiers." ) def _check_extra(extra, reqs): name, sep, marker = extra.partition(':') if marker and pkg_resources.invalid_marker(marker): raise DistutilsSetupError("Invalid environment marker: " + marker) list(pkg_resources.parse_requirements(reqs)) def assert_bool(dist, attr, value): """Verify that value is True, False, 0, or 1""" if bool(value) != value: tmpl = "{attr!r} must be a boolean value (got {value!r})" raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) def check_requirements(dist, attr, value): """Verify that install_requires is a valid requirements list""" try: list(pkg_resources.parse_requirements(value)) if isinstance(value, (dict, set)): raise TypeError("Unordered types are not allowed") except (TypeError, ValueError) as error: tmpl = ( "{attr!r} must be a string or list of strings " "containing valid project/version requirement specifiers; {error}" ) raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) def check_specifier(dist, attr, value): """Verify that value is a valid version specifier""" try: packaging.specifiers.SpecifierSet(value) except packaging.specifiers.InvalidSpecifier as error: tmpl = ( "{attr!r} must be a string " "containing valid version specifiers; {error}" ) raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) def check_entry_points(dist, attr, value): """Verify that entry_points map is parseable""" try: pkg_resources.EntryPoint.parse_map(value) except ValueError as e: raise DistutilsSetupError(e) def check_test_suite(dist, attr, value): if not isinstance(value, six.string_types): raise DistutilsSetupError("test_suite must be a string") def check_package_data(dist, attr, value): """Verify that value is a dictionary of package names to glob lists""" if isinstance(value, dict): for k, v in value.items(): if not isinstance(k, str): break try: iter(v) except TypeError: break else: return raise DistutilsSetupError( attr + " must be a dictionary mapping package names to lists of " "wildcard patterns" ) def check_packages(dist, attr, value): for pkgname in value: if not re.match(r'\w+(\.\w+)*', pkgname): distutils.log.warn( "WARNING: %r not a valid package name; please use only " ".-separated package names in setup.py", pkgname ) _Distribution = get_unpatched(distutils.core.Distribution) class Distribution(Distribution_parse_config_files, _Distribution): """Distribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that effectively adds the following new optional keyword arguments to 'setup()': 'install_requires' -- a string or sequence of strings specifying project versions that the distribution requires when installed, in the format used by 'pkg_resources.require()'. They will be installed automatically when the package is installed. If you wish to use packages that are not available in PyPI, or want to give your users an alternate download location, you can add a 'find_links' option to the '[easy_install]' section of your project's 'setup.cfg' file, and then setuptools will scan the listed web pages for links that satisfy the requirements. 'extras_require' -- a dictionary mapping names of optional "extras" to the additional requirement(s) that using those extras incurs. For example, this:: extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) indicates that the distribution can optionally provide an extra capability called "reST", but it can only be used if docutils and reSTedit are installed. If the user installs your package using EasyInstall and requests one of your extras, the corresponding additional requirements will be installed if needed. 'features' **deprecated** -- a dictionary mapping option names to 'setuptools.Feature' objects. Features are a portion of the distribution that can be included or excluded based on user options, inter-feature dependencies, and availability on the current system. Excluded features are omitted from all setup commands, including source and binary distributions, so you can create multiple distributions from the same source tree. Feature names should be valid Python identifiers, except that they may contain the '-' (minus) sign. Features can be included or excluded via the command line options '--with-X' and '--without-X', where 'X' is the name of the feature. Whether a feature is included by default, and whether you are allowed to control this from the command line, is determined by the Feature object. See the 'Feature' class for more information. 'test_suite' -- the name of a test suite to run for the 'test' command. If the user runs 'python setup.py test', the package will be installed, and the named test suite will be run. The format is the same as would be used on a 'unittest.py' command line. That is, it is the dotted name of an object to import and call to generate a test suite. 'package_data' -- a dictionary mapping package names to lists of filenames or globs to use to find data files contained in the named packages. If the dictionary has filenames or globs listed under '""' (the empty string), those names will be searched for in every package, in addition to any names for the specific package. Data files found using these names/globs will be installed along with the package, in the same location as the package. Note that globs are allowed to reference the contents of non-package subdirectories, as long as you use '/' as a path separator. (Globs are automatically converted to platform-specific paths at runtime.) In addition to these new keywords, this class also has several new methods for manipulating the distribution's contents. For example, the 'include()' and 'exclude()' methods can be thought of as in-place add and subtract commands that add or remove packages, modules, extensions, and so on from the distribution. They are used by the feature subsystem to configure the distribution for the included and excluded features. """ _patched_dist = None def patch_missing_pkg_info(self, attrs): # Fake up a replacement for the data that would normally come from # PKG-INFO, but which might not yet be built if this is a fresh # checkout. # if not attrs or 'name' not in attrs or 'version' not in attrs: return key = pkg_resources.safe_name(str(attrs['name'])).lower() dist = pkg_resources.working_set.by_key.get(key) if dist is not None and not dist.has_metadata('PKG-INFO'): dist._version = pkg_resources.safe_version(str(attrs['version'])) self._patched_dist = dist def __init__(self, attrs=None): have_package_data = hasattr(self, "package_data") if not have_package_data: self.package_data = {} attrs = attrs or {} if 'features' in attrs or 'require_features' in attrs: Feature.warn_deprecated() self.require_features = [] self.features = {} self.dist_files = [] self.src_root = attrs.pop("src_root", None) self.patch_missing_pkg_info(attrs) self.project_urls = attrs.get('project_urls', {}) self.dependency_links = attrs.pop('dependency_links', []) self.setup_requires = attrs.pop('setup_requires', []) for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): vars(self).setdefault(ep.name, None) _Distribution.__init__(self, attrs) # The project_urls attribute may not be supported in distutils, so # prime it here from our value if not automatically set self.metadata.project_urls = getattr( self.metadata, 'project_urls', self.project_urls) self.metadata.long_description_content_type = attrs.get( 'long_description_content_type' ) self.metadata.provides_extras = getattr( self.metadata, 'provides_extras', set() ) if isinstance(self.metadata.version, numbers.Number): # Some people apparently take "version number" too literally :) self.metadata.version = str(self.metadata.version) if self.metadata.version is not None: try: ver = packaging.version.Version(self.metadata.version) normalized_version = str(ver) if self.metadata.version != normalized_version: warnings.warn( "Normalizing '%s' to '%s'" % ( self.metadata.version, normalized_version, ) ) self.metadata.version = normalized_version except (packaging.version.InvalidVersion, TypeError): warnings.warn( "The version specified (%r) is an invalid version, this " "may not work as expected with newer versions of " "setuptools, pip, and PyPI. Please see PEP 440 for more " "details." % self.metadata.version ) self._finalize_requires() def _finalize_requires(self): """ Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. """ if getattr(self, 'python_requires', None): self.metadata.python_requires = self.python_requires if getattr(self, 'extras_require', None): for extra in self.extras_require.keys(): # Since this gets called multiple times at points where the # keys have become 'converted' extras, ensure that we are only # truly adding extras we haven't seen before here. extra = extra.split(':')[0] if extra: self.metadata.provides_extras.add(extra) self._convert_extras_requirements() self._move_install_requirements_markers() def _convert_extras_requirements(self): """ Convert requirements in `extras_require` of the form `"extra": ["barbazquux; {marker}"]` to `"extra:{marker}": ["barbazquux"]`. """ spec_ext_reqs = getattr(self, 'extras_require', None) or {} self._tmp_extras_require = defaultdict(list) for section, v in spec_ext_reqs.items(): # Do not strip empty sections. self._tmp_extras_require[section] for r in pkg_resources.parse_requirements(v): suffix = self._suffix_for(r) self._tmp_extras_require[section + suffix].append(r) @staticmethod def _suffix_for(req): """ For a requirement, return the 'extras_require' suffix for that requirement. """ return ':' + str(req.marker) if req.marker else '' def _move_install_requirements_markers(self): """ Move requirements in `install_requires` that are using environment markers `extras_require`. """ # divide the install_requires into two sets, simple ones still # handled by install_requires and more complex ones handled # by extras_require. def is_simple_req(req): return not req.marker spec_inst_reqs = getattr(self, 'install_requires', None) or () inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) simple_reqs = filter(is_simple_req, inst_reqs) complex_reqs = filterfalse(is_simple_req, inst_reqs) self.install_requires = list(map(str, simple_reqs)) for r in complex_reqs: self._tmp_extras_require[':' + str(r.marker)].append(r) self.extras_require = dict( (k, [str(r) for r in map(self._clean_req, v)]) for k, v in self._tmp_extras_require.items() ) def _clean_req(self, req): """ Given a Requirement, remove environment markers and return it. """ req.marker = None return req def parse_config_files(self, filenames=None, ignore_option_errors=False): """Parses configuration files from various levels and loads configuration. """ _Distribution.parse_config_files(self, filenames=filenames) parse_configuration(self, self.command_options, ignore_option_errors=ignore_option_errors) self._finalize_requires() def parse_command_line(self): """Process features after parsing command line options""" result = _Distribution.parse_command_line(self) if self.features: self._finalize_features() return result def _feature_attrname(self, name): """Convert feature name to corresponding option attribute name""" return 'with_' + name.replace('-', '_') def fetch_build_eggs(self, requires): """Resolve pre-setup requirements""" resolved_dists = pkg_resources.working_set.resolve( pkg_resources.parse_requirements(requires), installer=self.fetch_build_egg, replace_conflicting=True, ) for dist in resolved_dists: pkg_resources.working_set.add(dist, replace=True) return resolved_dists def finalize_options(self): _Distribution.finalize_options(self) if self.features: self._set_global_opts_from_features() for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): value = getattr(self, ep.name, None) if value is not None: ep.require(installer=self.fetch_build_egg) ep.load()(self, ep.name, value) if getattr(self, 'convert_2to3_doctests', None): # XXX may convert to set here when we can rely on set being builtin self.convert_2to3_doctests = [ os.path.abspath(p) for p in self.convert_2to3_doctests ] else: self.convert_2to3_doctests = [] def get_egg_cache_dir(self): egg_cache_dir = os.path.join(os.curdir, '.eggs') if not os.path.exists(egg_cache_dir): os.mkdir(egg_cache_dir) windows_support.hide_file(egg_cache_dir) readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') with open(readme_txt_filename, 'w') as f: f.write('This directory contains eggs that were downloaded ' 'by setuptools to build, test, and run plug-ins.\n\n') f.write('This directory caches those eggs to prevent ' 'repeated downloads.\n\n') f.write('However, it is safe to delete this directory.\n\n') return egg_cache_dir def fetch_build_egg(self, req): """Fetch an egg needed for building""" from setuptools.command.easy_install import easy_install dist = self.__class__({'script_args': ['easy_install']}) opts = dist.get_option_dict('easy_install') opts.clear() opts.update( (k, v) for k, v in self.get_option_dict('easy_install').items() if k in ( # don't use any other settings 'find_links', 'site_dirs', 'index_url', 'optimize', 'site_dirs', 'allow_hosts', )) if self.dependency_links: links = self.dependency_links[:] if 'find_links' in opts: links = opts['find_links'][1] + links opts['find_links'] = ('setup', links) install_dir = self.get_egg_cache_dir() cmd = easy_install( dist, args=["x"], install_dir=install_dir, exclude_scripts=True, always_copy=False, build_directory=None, editable=False, upgrade=False, multi_version=True, no_report=True, user=False ) cmd.ensure_finalized() return cmd.easy_install(req) def _set_global_opts_from_features(self): """Add --with-X/--without-X options based on optional features""" go = [] no = self.negative_opt.copy() for name, feature in self.features.items(): self._set_feature(name, None) feature.validate(self) if feature.optional: descr = feature.description incdef = ' (default)' excdef = '' if not feature.include_by_default(): excdef, incdef = incdef, excdef new = ( ('with-' + name, None, 'include ' + descr + incdef), ('without-' + name, None, 'exclude ' + descr + excdef), ) go.extend(new) no['without-' + name] = 'with-' + name self.global_options = self.feature_options = go + self.global_options self.negative_opt = self.feature_negopt = no def _finalize_features(self): """Add/remove features and resolve dependencies between them""" # First, flag all the enabled items (and thus their dependencies) for name, feature in self.features.items(): enabled = self.feature_is_included(name) if enabled or (enabled is None and feature.include_by_default()): feature.include_in(self) self._set_feature(name, 1) # Then disable the rest, so that off-by-default features don't # get flagged as errors when they're required by an enabled feature for name, feature in self.features.items(): if not self.feature_is_included(name): feature.exclude_from(self) self._set_feature(name, 0) def get_command_class(self, command): """Pluggable version of get_command_class()""" if command in self.cmdclass: return self.cmdclass[command] eps = pkg_resources.iter_entry_points('distutils.commands', command) for ep in eps: ep.require(installer=self.fetch_build_egg) self.cmdclass[command] = cmdclass = ep.load() return cmdclass else: return _Distribution.get_command_class(self, command) def print_commands(self): for ep in pkg_resources.iter_entry_points('distutils.commands'): if ep.name not in self.cmdclass: # don't require extras as the commands won't be invoked cmdclass = ep.resolve() self.cmdclass[ep.name] = cmdclass return _Distribution.print_commands(self) def get_command_list(self): for ep in pkg_resources.iter_entry_points('distutils.commands'): if ep.name not in self.cmdclass: # don't require extras as the commands won't be invoked cmdclass = ep.resolve() self.cmdclass[ep.name] = cmdclass return _Distribution.get_command_list(self) def _set_feature(self, name, status): """Set feature's inclusion status""" setattr(self, self._feature_attrname(name), status) def feature_is_included(self, name): """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" return getattr(self, self._feature_attrname(name)) def include_feature(self, name): """Request inclusion of feature named 'name'""" if self.feature_is_included(name) == 0: descr = self.features[name].description raise DistutilsOptionError( descr + " is required, but was excluded or is not available" ) self.features[name].include_in(self) self._set_feature(name, 1) def include(self, **attrs): """Add items to distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would add 'x' to the distribution's 'py_modules' attribute, if it was not already there. Currently, this method only supports inclusion for attributes that are lists or tuples. If you need to add support for adding to other attributes in this or a subclass, you can add an '_include_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' will try to call 'dist._include_foo({"bar":"baz"})', which can then handle whatever special inclusion logic is needed. """ for k, v in attrs.items(): include = getattr(self, '_include_' + k, None) if include: include(v) else: self._include_misc(k, v) def exclude_package(self, package): """Remove packages, modules, and extensions in named package""" pfx = package + '.' if self.packages: self.packages = [ p for p in self.packages if p != package and not p.startswith(pfx) ] if self.py_modules: self.py_modules = [ p for p in self.py_modules if p != package and not p.startswith(pfx) ] if self.ext_modules: self.ext_modules = [ p for p in self.ext_modules if p.name != package and not p.name.startswith(pfx) ] def has_contents_for(self, package): """Return true if 'exclude_package(package)' would do something""" pfx = package + '.' for p in self.iter_distribution_names(): if p == package or p.startswith(pfx): return True def _exclude_misc(self, name, value): """Handle 'exclude()' for list/tuple attrs without a special handler""" if not isinstance(value, sequence): raise DistutilsSetupError( "%s: setting must be a list or tuple (%r)" % (name, value) ) try: old = getattr(self, name) except AttributeError: raise DistutilsSetupError( "%s: No such distribution setting" % name ) if old is not None and not isinstance(old, sequence): raise DistutilsSetupError( name + ": this setting cannot be changed via include/exclude" ) elif old: setattr(self, name, [item for item in old if item not in value]) def _include_misc(self, name, value): """Handle 'include()' for list/tuple attrs without a special handler""" if not isinstance(value, sequence): raise DistutilsSetupError( "%s: setting must be a list (%r)" % (name, value) ) try: old = getattr(self, name) except AttributeError: raise DistutilsSetupError( "%s: No such distribution setting" % name ) if old is None: setattr(self, name, value) elif not isinstance(old, sequence): raise DistutilsSetupError( name + ": this setting cannot be changed via include/exclude" ) else: new = [item for item in value if item not in old] setattr(self, name, old + new) def exclude(self, **attrs): """Remove items from distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from the distribution's 'py_modules' attribute. Excluding packages uses the 'exclude_package()' method, so all of the package's contained packages, modules, and extensions are also excluded. Currently, this method only supports exclusion from attributes that are lists or tuples. If you need to add support for excluding from other attributes in this or a subclass, you can add an '_exclude_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' will try to call 'dist._exclude_foo({"bar":"baz"})', which can then handle whatever special exclusion logic is needed. """ for k, v in attrs.items(): exclude = getattr(self, '_exclude_' + k, None) if exclude: exclude(v) else: self._exclude_misc(k, v) def _exclude_packages(self, packages): if not isinstance(packages, sequence): raise DistutilsSetupError( "packages: setting must be a list or tuple (%r)" % (packages,) ) list(map(self.exclude_package, packages)) def _parse_command_opts(self, parser, args): # Remove --with-X/--without-X options when processing command args self.global_options = self.__class__.global_options self.negative_opt = self.__class__.negative_opt # First, expand any aliases command = args[0] aliases = self.get_option_dict('aliases') while command in aliases: src, alias = aliases[command] del aliases[command] # ensure each alias can expand only once! import shlex args[:1] = shlex.split(alias, True) command = args[0] nargs = _Distribution._parse_command_opts(self, parser, args) # Handle commands that want to consume all remaining arguments cmd_class = self.get_command_class(command) if getattr(cmd_class, 'command_consumes_arguments', None): self.get_option_dict(command)['args'] = ("command line", nargs) if nargs is not None: return [] return nargs def get_cmdline_options(self): """Return a '{cmd: {opt:val}}' map of all command-line options Option names are all long, but do not include the leading '--', and contain dashes rather than underscores. If the option doesn't take an argument (e.g. '--quiet'), the 'val' is 'None'. Note that options provided by config files are intentionally excluded. """ d = {} for cmd, opts in self.command_options.items(): for opt, (src, val) in opts.items(): if src != "command line": continue opt = opt.replace('_', '-') if val == 0: cmdobj = self.get_command_obj(cmd) neg_opt = self.negative_opt.copy() neg_opt.update(getattr(cmdobj, 'negative_opt', {})) for neg, pos in neg_opt.items(): if pos == opt: opt = neg val = None break else: raise AssertionError("Shouldn't be able to get here") elif val == 1: val = None d.setdefault(cmd, {})[opt] = val return d def iter_distribution_names(self): """Yield all packages, modules, and extension names in distribution""" for pkg in self.packages or (): yield pkg for module in self.py_modules or (): yield module for ext in self.ext_modules or (): if isinstance(ext, tuple): name, buildinfo = ext else: name = ext.name if name.endswith('module'): name = name[:-6] yield name def handle_display_options(self, option_order): """If there were any non-global "display-only" options (--help-commands or the metadata display options) on the command line, display the requested info and return true; else return false. """ import sys if six.PY2 or self.help_commands: return _Distribution.handle_display_options(self, option_order) # Stdout may be StringIO (e.g. in tests) import io if not isinstance(sys.stdout, io.TextIOWrapper): return _Distribution.handle_display_options(self, option_order) # Don't wrap stdout if utf-8 is already the encoding. Provides # workaround for #334. if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): return _Distribution.handle_display_options(self, option_order) # Print metadata in UTF-8 no matter the platform encoding = sys.stdout.encoding errors = sys.stdout.errors newline = sys.platform != 'win32' and '\n' or None line_buffering = sys.stdout.line_buffering sys.stdout = io.TextIOWrapper( sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) try: return _Distribution.handle_display_options(self, option_order) finally: sys.stdout = io.TextIOWrapper( sys.stdout.detach(), encoding, errors, newline, line_buffering) class Feature: """ **deprecated** -- The `Feature` facility was never completely implemented or supported, `has reported issues `_ and will be removed in a future version. A subset of the distribution that can be excluded if unneeded/wanted Features are created using these keyword arguments: 'description' -- a short, human readable description of the feature, to be used in error messages, and option help messages. 'standard' -- if true, the feature is included by default if it is available on the current system. Otherwise, the feature is only included if requested via a command line '--with-X' option, or if another included feature requires it. The default setting is 'False'. 'available' -- if true, the feature is available for installation on the current system. The default setting is 'True'. 'optional' -- if true, the feature's inclusion can be controlled from the command line, using the '--with-X' or '--without-X' options. If false, the feature's inclusion status is determined automatically, based on 'availabile', 'standard', and whether any other feature requires it. The default setting is 'True'. 'require_features' -- a string or sequence of strings naming features that should also be included if this feature is included. Defaults to empty list. May also contain 'Require' objects that should be added/removed from the distribution. 'remove' -- a string or list of strings naming packages to be removed from the distribution if this feature is *not* included. If the feature *is* included, this argument is ignored. This argument exists to support removing features that "crosscut" a distribution, such as defining a 'tests' feature that removes all the 'tests' subpackages provided by other features. The default for this argument is an empty list. (Note: the named package(s) or modules must exist in the base distribution when the 'setup()' function is initially called.) other keywords -- any other keyword arguments are saved, and passed to the distribution's 'include()' and 'exclude()' methods when the feature is included or excluded, respectively. So, for example, you could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be added or removed from the distribution as appropriate. A feature must include at least one 'requires', 'remove', or other keyword argument. Otherwise, it can't affect the distribution in any way. Note also that you can subclass 'Feature' to create your own specialized feature types that modify the distribution in other ways when included or excluded. See the docstrings for the various methods here for more detail. Aside from the methods, the only feature attributes that distributions look at are 'description' and 'optional'. """ @staticmethod def warn_deprecated(): msg = ( "Features are deprecated and will be removed in a future " "version. See https://github.com/pypa/setuptools/issues/65." ) warnings.warn(msg, DeprecationWarning, stacklevel=3) def __init__( self, description, standard=False, available=True, optional=True, require_features=(), remove=(), **extras): self.warn_deprecated() self.description = description self.standard = standard self.available = available self.optional = optional if isinstance(require_features, (str, Require)): require_features = require_features, self.require_features = [ r for r in require_features if isinstance(r, str) ] er = [r for r in require_features if not isinstance(r, str)] if er: extras['require_features'] = er if isinstance(remove, str): remove = remove, self.remove = remove self.extras = extras if not remove and not require_features and not extras: raise DistutilsSetupError( "Feature %s: must define 'require_features', 'remove', or " "at least one of 'packages', 'py_modules', etc." ) def include_by_default(self): """Should this feature be included by default?""" return self.available and self.standard def include_in(self, dist): """Ensure feature and its requirements are included in distribution You may override this in a subclass to perform additional operations on the distribution. Note that this method may be called more than once per feature, and so should be idempotent. """ if not self.available: raise DistutilsPlatformError( self.description + " is required, " "but is not available on this platform" ) dist.include(**self.extras) for f in self.require_features: dist.include_feature(f) def exclude_from(self, dist): """Ensure feature is excluded from distribution You may override this in a subclass to perform additional operations on the distribution. This method will be called at most once per feature, and only after all included features have been asked to include themselves. """ dist.exclude(**self.extras) if self.remove: for item in self.remove: dist.exclude_package(item) def validate(self, dist): """Verify that feature makes sense in context of distribution This method is called by the distribution just before it parses its command line. It checks to ensure that the 'remove' attribute, if any, contains only valid package/module names that are present in the base distribution when 'setup()' is called. You may override it in a subclass to perform any other required validation of the feature against a target distribution. """ for item in self.remove: if not dist.has_contents_for(item): raise DistutilsSetupError( "%s wants to be able to remove %s, but the distribution" " doesn't contain any packages or modules under %s" % (self.description, item, item) ) PK! extension.pynu[import re import functools import distutils.core import distutils.errors import distutils.extension from setuptools.extern.six.moves import map from .monkey import get_unpatched def _have_cython(): """ Return True if Cython can be imported. """ cython_impl = 'Cython.Distutils.build_ext' try: # from (cython_impl) import build_ext __import__(cython_impl, fromlist=['build_ext']).build_ext return True except Exception: pass return False # for compatibility have_pyrex = _have_cython _Extension = get_unpatched(distutils.core.Extension) class Extension(_Extension): """Extension that uses '.c' files in place of '.pyx' files""" def __init__(self, name, sources, *args, **kw): # The *args is needed for compatibility as calls may use positional # arguments. py_limited_api may be set only via keyword. self.py_limited_api = kw.pop("py_limited_api", False) _Extension.__init__(self, name, sources, *args, **kw) def _convert_pyx_sources_to_lang(self): """ Replace sources with .pyx extensions to sources with the target language extension. This mechanism allows language authors to supply pre-converted sources but to prefer the .pyx sources. """ if _have_cython(): # the build has Cython, so allow it to compile the .pyx files return lang = self.language or '' target_ext = '.cpp' if lang.lower() == 'c++' else '.c' sub = functools.partial(re.sub, '.pyx$', target_ext) self.sources = list(map(sub, self.sources)) class Library(Extension): """Just like a regular Extension, but built as a library instead""" PK!J J glibc.pynu[# This file originally from pip: # https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py from __future__ import absolute_import import ctypes import re import warnings def glibc_version_string(): "Returns glibc version string, or None if not using glibc." # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen # manpage says, "If filename is NULL, then the returned handle is for the # main program". This way we can let the linker do the work to figure out # which libc our process is actually using. process_namespace = ctypes.CDLL(None) try: gnu_get_libc_version = process_namespace.gnu_get_libc_version except AttributeError: # Symbol doesn't exist -> therefore, we are not linked to # glibc. return None # Call gnu_get_libc_version, which returns a string like "2.5" gnu_get_libc_version.restype = ctypes.c_char_p version_str = gnu_get_libc_version() # py2 / py3 compatibility: if not isinstance(version_str, str): version_str = version_str.decode("ascii") return version_str # Separated out from have_compatible_glibc for easier unit testing def check_glibc_version(version_str, required_major, minimum_minor): # Parse string and check against requested version. # # We use a regexp instead of str.split because we want to discard any # random junk that might come after the minor version -- this might happen # in patched/forked versions of glibc (e.g. Linaro's version of glibc # uses version strings like "2.20-2014.11"). See gh-3588. m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) if not m: warnings.warn("Expected glibc version with 2 components major.minor," " got: %s" % version_str, RuntimeWarning) return False return (int(m.group("major")) == required_major and int(m.group("minor")) >= minimum_minor) def have_compatible_glibc(required_major, minimum_minor): version_str = glibc_version_string() if version_str is None: return False return check_glibc_version(version_str, required_major, minimum_minor) # platform.libc_ver regularly returns completely nonsensical glibc # versions. E.g. on my computer, platform says: # # ~$ python2.7 -c 'import platform; print(platform.libc_ver())' # ('glibc', '2.7') # ~$ python3.5 -c 'import platform; print(platform.libc_ver())' # ('glibc', '2.9') # # But the truth is: # # ~$ ldd --version # ldd (Debian GLIBC 2.22-11) 2.22 # # This is unfortunate, because it means that the linehaul data on libc # versions that was generated by pip 8.1.2 and earlier is useless and # misleading. Solution: instead of using platform, use our code that actually # works. def libc_ver(): """Try to determine the glibc version Returns a tuple of strings (lib, version) which default to empty strings in case the lookup fails. """ glibc_version = glibc_version_string() if glibc_version is None: return ("", "") else: return ("glibc", glibc_version) PK!]9WWglob.pynu[""" Filename globbing utility. Mostly a copy of `glob` from Python 3.5. Changes include: * `yield from` and PEP3102 `*` removed. * `bytes` changed to `six.binary_type`. * Hidden files are not ignored. """ import os import re import fnmatch from setuptools.extern.six import binary_type __all__ = ["glob", "iglob", "escape"] def glob(pathname, recursive=False): """Return a list of paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. """ return list(iglob(pathname, recursive=recursive)) def iglob(pathname, recursive=False): """Return an iterator which yields the paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. """ it = _iglob(pathname, recursive) if recursive and _isrecursive(pathname): s = next(it) # skip empty string assert not s return it def _iglob(pathname, recursive): dirname, basename = os.path.split(pathname) if not has_magic(pathname): if basename: if os.path.lexists(pathname): yield pathname else: # Patterns ending with a slash should match only directories if os.path.isdir(dirname): yield pathname return if not dirname: if recursive and _isrecursive(basename): for x in glob2(dirname, basename): yield x else: for x in glob1(dirname, basename): yield x return # `os.path.split()` returns the argument itself as a dirname if it is a # drive or UNC path. Prevent an infinite recursion if a drive or UNC path # contains magic characters (i.e. r'\\?\C:'). if dirname != pathname and has_magic(dirname): dirs = _iglob(dirname, recursive) else: dirs = [dirname] if has_magic(basename): if recursive and _isrecursive(basename): glob_in_dir = glob2 else: glob_in_dir = glob1 else: glob_in_dir = glob0 for dirname in dirs: for name in glob_in_dir(dirname, basename): yield os.path.join(dirname, name) # These 2 helper functions non-recursively glob inside a literal directory. # They return a list of basenames. `glob1` accepts a pattern while `glob0` # takes a literal basename (so it only has to check for its existence). def glob1(dirname, pattern): if not dirname: if isinstance(pattern, binary_type): dirname = os.curdir.encode('ASCII') else: dirname = os.curdir try: names = os.listdir(dirname) except OSError: return [] return fnmatch.filter(names, pattern) def glob0(dirname, basename): if not basename: # `os.path.split()` returns an empty basename for paths ending with a # directory separator. 'q*x/' should match only directories. if os.path.isdir(dirname): return [basename] else: if os.path.lexists(os.path.join(dirname, basename)): return [basename] return [] # This helper function recursively yields relative pathnames inside a literal # directory. def glob2(dirname, pattern): assert _isrecursive(pattern) yield pattern[:0] for x in _rlistdir(dirname): yield x # Recursively yields relative pathnames inside a literal directory. def _rlistdir(dirname): if not dirname: if isinstance(dirname, binary_type): dirname = binary_type(os.curdir, 'ASCII') else: dirname = os.curdir try: names = os.listdir(dirname) except os.error: return for x in names: yield x path = os.path.join(dirname, x) if dirname else x for y in _rlistdir(path): yield os.path.join(x, y) magic_check = re.compile('([*?[])') magic_check_bytes = re.compile(b'([*?[])') def has_magic(s): if isinstance(s, binary_type): match = magic_check_bytes.search(s) else: match = magic_check.search(s) return match is not None def _isrecursive(pattern): if isinstance(pattern, binary_type): return pattern == b'**' else: return pattern == '**' def escape(pathname): """Escape all special characters. """ # Escaping is done by wrapping any of "*?[" between square brackets. # Metacharacters do not work in the drive part and shouldn't be escaped. drive, pathname = os.path.splitdrive(pathname) if isinstance(pathname, binary_type): pathname = magic_check_bytes.sub(br'[\1]', pathname) else: pathname = magic_check.sub(r'[\1]', pathname) return drive + pathname PK!d~ launch.pynu[""" Launch the Python script on the command line after setuptools is bootstrapped via import. """ # Note that setuptools gets imported implicitly by the # invocation of this script using python -m setuptools.launch import tokenize import sys def run(): """ Run the script in sys.argv[1] as if it had been invoked naturally. """ __builtins__ script_name = sys.argv[1] namespace = dict( __file__=script_name, __name__='__main__', __doc__=None, ) sys.argv[:] = sys.argv[1:] open_ = getattr(tokenize, 'open', open) script = open_(script_name).read() norm_script = script.replace('\\r\\n', '\\n') code = compile(norm_script, script_name, 'exec') exec(code, namespace) if __name__ == '__main__': run() PK!Q lib2to3_ex.pynu[""" Customized Mixin2to3 support: - adds support for converting doctests This module raises an ImportError on Python 2. """ from distutils.util import Mixin2to3 as _Mixin2to3 from distutils import log from lib2to3.refactor import RefactoringTool, get_fixers_from_package import setuptools class DistutilsRefactoringTool(RefactoringTool): def log_error(self, msg, *args, **kw): log.error(msg, *args) def log_message(self, msg, *args): log.info(msg, *args) def log_debug(self, msg, *args): log.debug(msg, *args) class Mixin2to3(_Mixin2to3): def run_2to3(self, files, doctests=False): # See of the distribution option has been set, otherwise check the # setuptools default. if self.distribution.use_2to3 is not True: return if not files: return log.info("Fixing " + " ".join(files)) self.__build_fixer_names() self.__exclude_fixers() if doctests: if setuptools.run_2to3_on_doctests: r = DistutilsRefactoringTool(self.fixer_names) r.refactor(files, write=True, doctests_only=True) else: _Mixin2to3.run_2to3(self, files) def __build_fixer_names(self): if self.fixer_names: return self.fixer_names = [] for p in setuptools.lib2to3_fixer_packages: self.fixer_names.extend(get_fixers_from_package(p)) if self.distribution.use_2to3_fixers is not None: for p in self.distribution.use_2to3_fixers: self.fixer_names.extend(get_fixers_from_package(p)) def __exclude_fixers(self): excluded_fixers = getattr(self, 'exclude_fixers', []) if self.distribution.use_2to3_exclude_fixers is not None: excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) for fixer_name in excluded_fixers: if fixer_name in self.fixer_names: self.fixer_names.remove(fixer_name) PK!Cr^ monkey.pynu[""" Monkey patching of distutils. """ import sys import distutils.filelist import platform import types import functools from importlib import import_module import inspect from setuptools.extern import six import setuptools __all__ = [] """ Everything is private. Contact the project team if you think you need this functionality. """ def _get_mro(cls): """ Returns the bases classes for cls sorted by the MRO. Works around an issue on Jython where inspect.getmro will not return all base classes if multiple classes share the same name. Instead, this function will return a tuple containing the class itself, and the contents of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. """ if platform.python_implementation() == "Jython": return (cls,) + cls.__bases__ return inspect.getmro(cls) def get_unpatched(item): lookup = ( get_unpatched_class if isinstance(item, six.class_types) else get_unpatched_function if isinstance(item, types.FunctionType) else lambda item: None ) return lookup(item) def get_unpatched_class(cls): """Protect against re-patching the distutils if reloaded Also ensures that no other distutils extension monkeypatched the distutils first. """ external_bases = ( cls for cls in _get_mro(cls) if not cls.__module__.startswith('setuptools') ) base = next(external_bases) if not base.__module__.startswith('distutils'): msg = "distutils has already been patched by %r" % cls raise AssertionError(msg) return base def patch_all(): # we can't patch distutils.cmd, alas distutils.core.Command = setuptools.Command has_issue_12885 = sys.version_info <= (3, 5, 3) if has_issue_12885: # fix findall bug in distutils (http://bugs.python.org/issue12885) distutils.filelist.findall = setuptools.findall needs_warehouse = ( sys.version_info < (2, 7, 13) or (3, 0) < sys.version_info < (3, 3, 7) or (3, 4) < sys.version_info < (3, 4, 6) or (3, 5) < sys.version_info <= (3, 5, 3) ) if needs_warehouse: warehouse = 'https://upload.pypi.org/legacy/' distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse _patch_distribution_metadata_write_pkg_file() _patch_distribution_metadata_write_pkg_info() # Install Distribution throughout the distutils for module in distutils.dist, distutils.core, distutils.cmd: module.Distribution = setuptools.dist.Distribution # Install the patched Extension distutils.core.Extension = setuptools.extension.Extension distutils.extension.Extension = setuptools.extension.Extension if 'distutils.command.build_ext' in sys.modules: sys.modules['distutils.command.build_ext'].Extension = ( setuptools.extension.Extension ) patch_for_msvc_specialized_compiler() def _patch_distribution_metadata_write_pkg_file(): """Patch write_pkg_file to also write Requires-Python/Requires-External""" distutils.dist.DistributionMetadata.write_pkg_file = ( setuptools.dist.write_pkg_file ) def _patch_distribution_metadata_write_pkg_info(): """ Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local encoding to save the pkg_info. Monkey-patch its write_pkg_info method to correct this undesirable behavior. """ environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2) if not environment_local: return distutils.dist.DistributionMetadata.write_pkg_info = ( setuptools.dist.write_pkg_info ) def patch_func(replacement, target_mod, func_name): """ Patch func_name in target_mod with replacement Important - original must be resolved by name to avoid patching an already patched function. """ original = getattr(target_mod, func_name) # set the 'unpatched' attribute on the replacement to # point to the original. vars(replacement).setdefault('unpatched', original) # replace the function in the original module setattr(target_mod, func_name, replacement) def get_unpatched_function(candidate): return getattr(candidate, 'unpatched') def patch_for_msvc_specialized_compiler(): """ Patch functions in distutils to use standalone Microsoft Visual C++ compilers. """ # import late to avoid circular imports on Python < 3.5 msvc = import_module('setuptools.msvc') if platform.system() != 'Windows': # Compilers only availables on Microsoft Windows return def patch_params(mod_name, func_name): """ Prepare the parameters for patch_func to patch indicated function. """ repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' repl_name = repl_prefix + func_name.lstrip('_') repl = getattr(msvc, repl_name) mod = import_module(mod_name) if not hasattr(mod, func_name): raise ImportError(func_name) return repl, mod, func_name # Python 2.7 to 3.4 msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') # Python 3.5+ msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') try: # Patch distutils.msvc9compiler patch_func(*msvc9('find_vcvarsall')) patch_func(*msvc9('query_vcvarsall')) except ImportError: pass try: # Patch distutils._msvccompiler._get_vc_env patch_func(*msvc14('_get_vc_env')) except ImportError: pass try: # Patch distutils._msvccompiler.gen_lib_options for Numpy patch_func(*msvc14('gen_lib_options')) except ImportError: pass PK!$6Mmsvc.pynu[""" Improved support for Microsoft Visual C++ compilers. Known supported compilers: -------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) """ import os import sys import platform import itertools import distutils.errors from setuptools.extern.packaging.version import LegacyVersion from setuptools.extern.six.moves import filterfalse from .monkey import get_unpatched if platform.system() == 'Windows': from setuptools.extern.six.moves import winreg safe_env = os.environ else: """ Mock winreg and environ so the module can be imported on this platform. """ class winreg: HKEY_USERS = None HKEY_CURRENT_USER = None HKEY_LOCAL_MACHINE = None HKEY_CLASSES_ROOT = None safe_env = dict() _msvc9_suppress_errors = ( # msvc9compiler isn't available on some platforms ImportError, # msvc9compiler raises DistutilsPlatformError in some # environments. See #1118. distutils.errors.DistutilsPlatformError, ) try: from distutils.msvc9compiler import Reg except _msvc9_suppress_errors: pass def msvc9_find_vcvarsall(version): """ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone compiler build for Python (VCForPython). Fall back to original behavior when the standalone compiler is not available. Redirect the path of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Parameters ---------- version: float Required Microsoft Visual C++ version. Return ------ vcvarsall.bat path: str """ VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' key = VC_BASE % ('', version) try: # Per-user installs register the compiler path here productdir = Reg.get_value(key, "installdir") except KeyError: try: # All-user installs on a 64-bit system register here key = VC_BASE % ('Wow6432Node\\', version) productdir = Reg.get_value(key, "installdir") except KeyError: productdir = None if productdir: vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") if os.path.isfile(vcvarsall): return vcvarsall return get_unpatched(msvc9_find_vcvarsall)(version) def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): """ Patched "distutils.msvc9compiler.query_vcvarsall" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Parameters ---------- ver: float Required Microsoft Visual C++ version. arch: str Target architecture. Return ------ environment: dict """ # Try to get environement from vcvarsall.bat (Classical way) try: orig = get_unpatched(msvc9_query_vcvarsall) return orig(ver, arch, *args, **kwargs) except distutils.errors.DistutilsPlatformError: # Pass error if Vcvarsall.bat is missing pass except ValueError: # Pass error if environment not set after executing vcvarsall.bat pass # If error, try to set environment directly try: return EnvironmentInfo(arch, ver).return_env() except distutils.errors.DistutilsPlatformError as exc: _augment_exception(exc, ver, arch) raise def msvc14_get_vc_env(plat_spec): """ Patched "distutils._msvccompiler._get_vc_env" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) Parameters ---------- plat_spec: str Target architecture. Return ------ environment: dict """ # Try to get environment from vcvarsall.bat (Classical way) try: return get_unpatched(msvc14_get_vc_env)(plat_spec) except distutils.errors.DistutilsPlatformError: # Pass error Vcvarsall.bat is missing pass # If error, try to set environment directly try: return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() except distutils.errors.DistutilsPlatformError as exc: _augment_exception(exc, 14.0) raise def msvc14_gen_lib_options(*args, **kwargs): """ Patched "distutils._msvccompiler.gen_lib_options" for fix compatibility between "numpy.distutils" and "distutils._msvccompiler" (for Numpy < 1.11.2) """ if "numpy.distutils" in sys.modules: import numpy as np if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) def _augment_exception(exc, version, arch=''): """ Add details to the exception message to help guide the user as to what action will resolve it. """ # Error if MSVC++ directory not found or environment not set message = exc.args[0] if "vcvarsall" in message.lower() or "visual c" in message.lower(): # Special error message if MSVC++ not installed tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' message = tmpl.format(**locals()) msdownload = 'www.microsoft.com/download/details.aspx?id=%d' if version == 9.0: if arch.lower().find('ia64') > -1: # For VC++ 9.0, if IA64 support is needed, redirect user # to Windows SDK 7.0 message += ' Get it with "Microsoft Windows SDK 7.0": ' message += msdownload % 3138 else: # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : # This redirection link is maintained by Microsoft. # Contact vspython@microsoft.com if it needs updating. message += ' Get it from http://aka.ms/vcpython27' elif version == 10.0: # For VC++ 10.0 Redirect user to Windows SDK 7.1 message += ' Get it with "Microsoft Windows SDK 7.1": ' message += msdownload % 8279 elif version >= 14.0: # For VC++ 14.0 Redirect user to Visual C++ Build Tools message += (' Get it with "Microsoft Visual C++ Build Tools": ' r'http://landinghub.visualstudio.com/' 'visual-cpp-build-tools') exc.args = (message, ) class PlatformInfo: """ Current and Target Architectures informations. Parameters ---------- arch: str Target architecture. """ current_cpu = safe_env.get('processor_architecture', '').lower() def __init__(self, arch): self.arch = arch.lower().replace('x64', 'amd64') @property def target_cpu(self): return self.arch[self.arch.find('_') + 1:] def target_is_x86(self): return self.target_cpu == 'x86' def current_is_x86(self): return self.current_cpu == 'x86' def current_dir(self, hidex86=False, x64=False): """ Current platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '\x86' if architecture is x86. x64: bool return '\x64' and not '\amd64' if architecture is amd64. Return ------ subfolder: str '\target', or '' (see hidex86 parameter) """ return ( '' if (self.current_cpu == 'x86' and hidex86) else r'\x64' if (self.current_cpu == 'amd64' and x64) else r'\%s' % self.current_cpu ) def target_dir(self, hidex86=False, x64=False): r""" Target platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '\x86' if architecture is x86. x64: bool return '\x64' and not '\amd64' if architecture is amd64. Return ------ subfolder: str '\current', or '' (see hidex86 parameter) """ return ( '' if (self.target_cpu == 'x86' and hidex86) else r'\x64' if (self.target_cpu == 'amd64' and x64) else r'\%s' % self.target_cpu ) def cross_dir(self, forcex86=False): r""" Cross platform specific subfolder. Parameters ---------- forcex86: bool Use 'x86' as current architecture even if current acritecture is not x86. Return ------ subfolder: str '' if target architecture is current architecture, '\current_target' if not. """ current = 'x86' if forcex86 else self.current_cpu return ( '' if self.target_cpu == current else self.target_dir().replace('\\', '\\%s_' % current) ) class RegistryInfo: """ Microsoft Visual Studio related registry informations. Parameters ---------- platform_info: PlatformInfo "PlatformInfo" instance. """ HKEYS = (winreg.HKEY_USERS, winreg.HKEY_CURRENT_USER, winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CLASSES_ROOT) def __init__(self, platform_info): self.pi = platform_info @property def visualstudio(self): """ Microsoft Visual Studio root registry key. """ return 'VisualStudio' @property def sxs(self): """ Microsoft Visual Studio SxS registry key. """ return os.path.join(self.visualstudio, 'SxS') @property def vc(self): """ Microsoft Visual C++ VC7 registry key. """ return os.path.join(self.sxs, 'VC7') @property def vs(self): """ Microsoft Visual Studio VS7 registry key. """ return os.path.join(self.sxs, 'VS7') @property def vc_for_python(self): """ Microsoft Visual C++ for Python registry key. """ return r'DevDiv\VCForPython' @property def microsoft_sdk(self): """ Microsoft SDK registry key. """ return 'Microsoft SDKs' @property def windows_sdk(self): """ Microsoft Windows/Platform SDK registry key. """ return os.path.join(self.microsoft_sdk, 'Windows') @property def netfx_sdk(self): """ Microsoft .NET Framework SDK registry key. """ return os.path.join(self.microsoft_sdk, 'NETFXSDK') @property def windows_kits_roots(self): """ Microsoft Windows Kits Roots registry key. """ return r'Windows Kits\Installed Roots' def microsoft(self, key, x86=False): """ Return key in Microsoft software registry. Parameters ---------- key: str Registry key path where look. x86: str Force x86 software registry. Return ------ str: value """ node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' return os.path.join('Software', node64, 'Microsoft', key) def lookup(self, key, name): """ Look for values in registry in Microsoft software registry. Parameters ---------- key: str Registry key path where look. name: str Value name to find. Return ------ str: value """ KEY_READ = winreg.KEY_READ openkey = winreg.OpenKey ms = self.microsoft for hkey in self.HKEYS: try: bkey = openkey(hkey, ms(key), 0, KEY_READ) except (OSError, IOError): if not self.pi.current_is_x86(): try: bkey = openkey(hkey, ms(key, True), 0, KEY_READ) except (OSError, IOError): continue else: continue try: return winreg.QueryValueEx(bkey, name)[0] except (OSError, IOError): pass class SystemInfo: """ Microsoft Windows and Visual Studio related system inormations. Parameters ---------- registry_info: RegistryInfo "RegistryInfo" instance. vc_ver: float Required Microsoft Visual C++ version. """ # Variables and properties in this class use originals CamelCase variables # names from Microsoft source files for more easy comparaison. WinDir = safe_env.get('WinDir', '') ProgramFiles = safe_env.get('ProgramFiles', '') ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) def __init__(self, registry_info, vc_ver=None): self.ri = registry_info self.pi = self.ri.pi self.vc_ver = vc_ver or self._find_latest_available_vc_ver() def _find_latest_available_vc_ver(self): try: return self.find_available_vc_vers()[-1] except IndexError: err = 'No Microsoft Visual C++ version found' raise distutils.errors.DistutilsPlatformError(err) def find_available_vc_vers(self): """ Find all available Microsoft Visual C++ versions. """ ms = self.ri.microsoft vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) vc_vers = [] for hkey in self.ri.HKEYS: for key in vckeys: try: bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) except (OSError, IOError): continue subkeys, values, _ = winreg.QueryInfoKey(bkey) for i in range(values): try: ver = float(winreg.EnumValue(bkey, i)[0]) if ver not in vc_vers: vc_vers.append(ver) except ValueError: pass for i in range(subkeys): try: ver = float(winreg.EnumKey(bkey, i)) if ver not in vc_vers: vc_vers.append(ver) except ValueError: pass return sorted(vc_vers) @property def VSInstallDir(self): """ Microsoft Visual Studio directory. """ # Default path name = 'Microsoft Visual Studio %0.1f' % self.vc_ver default = os.path.join(self.ProgramFilesx86, name) # Try to get path from registry, if fail use default path return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default @property def VCInstallDir(self): """ Microsoft Visual C++ directory. """ self.VSInstallDir guess_vc = self._guess_vc() or self._guess_vc_legacy() # Try to get "VC++ for Python" path from registry as default path reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) python_vc = self.ri.lookup(reg_path, 'installdir') default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc # Try to get path from registry, if fail use default path path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc if not os.path.isdir(path): msg = 'Microsoft Visual C++ directory not found' raise distutils.errors.DistutilsPlatformError(msg) return path def _guess_vc(self): """ Locate Visual C for 2017 """ if self.vc_ver <= 14.0: return default = r'VC\Tools\MSVC' guess_vc = os.path.join(self.VSInstallDir, default) # Subdir with VC exact version as name try: vc_exact_ver = os.listdir(guess_vc)[-1] return os.path.join(guess_vc, vc_exact_ver) except (OSError, IOError, IndexError): pass def _guess_vc_legacy(self): """ Locate Visual C for versions prior to 2017 """ default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver return os.path.join(self.ProgramFilesx86, default) @property def WindowsSdkVersion(self): """ Microsoft Windows SDK versions for specified MSVC++ version. """ if self.vc_ver <= 9.0: return ('7.0', '6.1', '6.0a') elif self.vc_ver == 10.0: return ('7.1', '7.0a') elif self.vc_ver == 11.0: return ('8.0', '8.0a') elif self.vc_ver == 12.0: return ('8.1', '8.1a') elif self.vc_ver >= 14.0: return ('10.0', '8.1') @property def WindowsSdkLastVersion(self): """ Microsoft Windows SDK last version """ return self._use_last_dir_name(os.path.join( self.WindowsSdkDir, 'lib')) @property def WindowsSdkDir(self): """ Microsoft Windows SDK directory. """ sdkdir = '' for ver in self.WindowsSdkVersion: # Try to get it from registry loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) sdkdir = self.ri.lookup(loc, 'installationfolder') if sdkdir: break if not sdkdir or not os.path.isdir(sdkdir): # Try to get "VC++ for Python" version from registry path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) install_base = self.ri.lookup(path, 'installdir') if install_base: sdkdir = os.path.join(install_base, 'WinSDK') if not sdkdir or not os.path.isdir(sdkdir): # If fail, use default new path for ver in self.WindowsSdkVersion: intver = ver[:ver.rfind('.')] path = r'Microsoft SDKs\Windows Kits\%s' % (intver) d = os.path.join(self.ProgramFiles, path) if os.path.isdir(d): sdkdir = d if not sdkdir or not os.path.isdir(sdkdir): # If fail, use default old path for ver in self.WindowsSdkVersion: path = r'Microsoft SDKs\Windows\v%s' % ver d = os.path.join(self.ProgramFiles, path) if os.path.isdir(d): sdkdir = d if not sdkdir: # If fail, use Platform SDK sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') return sdkdir @property def WindowsSDKExecutablePath(self): """ Microsoft Windows SDK executable directory. """ # Find WinSDK NetFx Tools registry dir name if self.vc_ver <= 11.0: netfxver = 35 arch = '' else: netfxver = 40 hidex86 = True if self.vc_ver <= 12.0 else False arch = self.pi.current_dir(x64=True, hidex86=hidex86) fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) # liste all possibles registry paths regpaths = [] if self.vc_ver >= 14.0: for ver in self.NetFxSdkVersion: regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] for ver in self.WindowsSdkVersion: regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] # Return installation folder from the more recent path for path in regpaths: execpath = self.ri.lookup(path, 'installationfolder') if execpath: break return execpath @property def FSharpInstallDir(self): """ Microsoft Visual F# directory. """ path = r'%0.1f\Setup\F#' % self.vc_ver path = os.path.join(self.ri.visualstudio, path) return self.ri.lookup(path, 'productdir') or '' @property def UniversalCRTSdkDir(self): """ Microsoft Universal CRT SDK directory. """ # Set Kit Roots versions for specified MSVC++ version if self.vc_ver >= 14.0: vers = ('10', '81') else: vers = () # Find path of the more recent Kit for ver in vers: sdkdir = self.ri.lookup(self.ri.windows_kits_roots, 'kitsroot%s' % ver) if sdkdir: break return sdkdir or '' @property def UniversalCRTSdkLastVersion(self): """ Microsoft Universal C Runtime SDK last version """ return self._use_last_dir_name(os.path.join( self.UniversalCRTSdkDir, 'lib')) @property def NetFxSdkVersion(self): """ Microsoft .NET Framework SDK versions. """ # Set FxSdk versions for specified MSVC++ version if self.vc_ver >= 14.0: return ('4.6.1', '4.6') else: return () @property def NetFxSdkDir(self): """ Microsoft .NET Framework SDK directory. """ for ver in self.NetFxSdkVersion: loc = os.path.join(self.ri.netfx_sdk, ver) sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') if sdkdir: break return sdkdir or '' @property def FrameworkDir32(self): """ Microsoft .NET Framework 32bit directory. """ # Default path guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') # Try to get path from registry, if fail use default path return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw @property def FrameworkDir64(self): """ Microsoft .NET Framework 64bit directory. """ # Default path guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') # Try to get path from registry, if fail use default path return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw @property def FrameworkVersion32(self): """ Microsoft .NET Framework 32bit versions. """ return self._find_dot_net_versions(32) @property def FrameworkVersion64(self): """ Microsoft .NET Framework 64bit versions. """ return self._find_dot_net_versions(64) def _find_dot_net_versions(self, bits): """ Find Microsoft .NET Framework versions. Parameters ---------- bits: int Platform number of bits: 32 or 64. """ # Find actual .NET version in registry reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' # Set .NET versions for specified MSVC++ version if self.vc_ver >= 12.0: frameworkver = (ver, 'v4.0') elif self.vc_ver >= 10.0: frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, 'v3.5') elif self.vc_ver == 9.0: frameworkver = ('v3.5', 'v2.0.50727') if self.vc_ver == 8.0: frameworkver = ('v3.0', 'v2.0.50727') return frameworkver def _use_last_dir_name(self, path, prefix=''): """ Return name of the last dir in path or '' if no dir found. Parameters ---------- path: str Use dirs in this path prefix: str Use only dirs startings by this prefix """ matching_dirs = ( dir_name for dir_name in reversed(os.listdir(path)) if os.path.isdir(os.path.join(path, dir_name)) and dir_name.startswith(prefix) ) return next(matching_dirs, None) or '' class EnvironmentInfo: """ Return environment variables for specified Microsoft Visual C++ version and platform : Lib, Include, Path and libpath. This function is compatible with Microsoft Visual C++ 9.0 to 14.0. Script created by analysing Microsoft environment configuration files like "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... Parameters ---------- arch: str Target architecture. vc_ver: float Required Microsoft Visual C++ version. If not set, autodetect the last version. vc_min_ver: float Minimum Microsoft Visual C++ version. """ # Variables and properties in this class use originals CamelCase variables # names from Microsoft source files for more easy comparaison. def __init__(self, arch, vc_ver=None, vc_min_ver=0): self.pi = PlatformInfo(arch) self.ri = RegistryInfo(self.pi) self.si = SystemInfo(self.ri, vc_ver) if self.vc_ver < vc_min_ver: err = 'No suitable Microsoft Visual C++ version found' raise distutils.errors.DistutilsPlatformError(err) @property def vc_ver(self): """ Microsoft Visual C++ version. """ return self.si.vc_ver @property def VSTools(self): """ Microsoft Visual Studio Tools """ paths = [r'Common7\IDE', r'Common7\Tools'] if self.vc_ver >= 14.0: arch_subdir = self.pi.current_dir(hidex86=True, x64=True) paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] paths += [r'Team Tools\Performance Tools'] paths += [r'Team Tools\Performance Tools%s' % arch_subdir] return [os.path.join(self.si.VSInstallDir, path) for path in paths] @property def VCIncludes(self): """ Microsoft Visual C++ & Microsoft Foundation Class Includes """ return [os.path.join(self.si.VCInstallDir, 'Include'), os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] @property def VCLibraries(self): """ Microsoft Visual C++ & Microsoft Foundation Class Libraries """ if self.vc_ver >= 15.0: arch_subdir = self.pi.target_dir(x64=True) else: arch_subdir = self.pi.target_dir(hidex86=True) paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] if self.vc_ver >= 14.0: paths += [r'Lib\store%s' % arch_subdir] return [os.path.join(self.si.VCInstallDir, path) for path in paths] @property def VCStoreRefs(self): """ Microsoft Visual C++ store references Libraries """ if self.vc_ver < 14.0: return [] return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] @property def VCTools(self): """ Microsoft Visual C++ Tools """ si = self.si tools = [os.path.join(si.VCInstallDir, 'VCPackages')] forcex86 = True if self.vc_ver <= 10.0 else False arch_subdir = self.pi.cross_dir(forcex86) if arch_subdir: tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] if self.vc_ver == 14.0: path = 'Bin%s' % self.pi.current_dir(hidex86=True) tools += [os.path.join(si.VCInstallDir, path)] elif self.vc_ver >= 15.0: host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else r'bin\HostX64%s') tools += [os.path.join( si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] if self.pi.current_cpu != self.pi.target_cpu: tools += [os.path.join( si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] else: tools += [os.path.join(si.VCInstallDir, 'Bin')] return tools @property def OSLibraries(self): """ Microsoft Windows SDK Libraries """ if self.vc_ver <= 10.0: arch_subdir = self.pi.target_dir(hidex86=True, x64=True) return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] else: arch_subdir = self.pi.target_dir(x64=True) lib = os.path.join(self.si.WindowsSdkDir, 'lib') libver = self._sdk_subdir return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] @property def OSIncludes(self): """ Microsoft Windows SDK Include """ include = os.path.join(self.si.WindowsSdkDir, 'include') if self.vc_ver <= 10.0: return [include, os.path.join(include, 'gl')] else: if self.vc_ver >= 14.0: sdkver = self._sdk_subdir else: sdkver = '' return [os.path.join(include, '%sshared' % sdkver), os.path.join(include, '%sum' % sdkver), os.path.join(include, '%swinrt' % sdkver)] @property def OSLibpath(self): """ Microsoft Windows SDK Libraries Paths """ ref = os.path.join(self.si.WindowsSdkDir, 'References') libpath = [] if self.vc_ver <= 9.0: libpath += self.OSLibraries if self.vc_ver >= 11.0: libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] if self.vc_ver >= 14.0: libpath += [ ref, os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), os.path.join( ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0', ), os.path.join( ref, 'Windows.Foundation.FoundationContract', '1.0.0.0', ), os.path.join( ref, 'Windows.Networking.Connectivity.WwanContract', '1.0.0.0', ), os.path.join( self.si.WindowsSdkDir, 'ExtensionSDKs', 'Microsoft.VCLibs', '%0.1f' % self.vc_ver, 'References', 'CommonConfiguration', 'neutral', ), ] return libpath @property def SdkTools(self): """ Microsoft Windows SDK Tools """ return list(self._sdk_tools()) def _sdk_tools(self): """ Microsoft Windows SDK Tools paths generator """ if self.vc_ver < 15.0: bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' yield os.path.join(self.si.WindowsSdkDir, bin_dir) if not self.pi.current_is_x86(): arch_subdir = self.pi.current_dir(x64=True) path = 'Bin%s' % arch_subdir yield os.path.join(self.si.WindowsSdkDir, path) if self.vc_ver == 10.0 or self.vc_ver == 11.0: if self.pi.target_is_x86(): arch_subdir = '' else: arch_subdir = self.pi.current_dir(hidex86=True, x64=True) path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir yield os.path.join(self.si.WindowsSdkDir, path) elif self.vc_ver >= 15.0: path = os.path.join(self.si.WindowsSdkDir, 'Bin') arch_subdir = self.pi.current_dir(x64=True) sdkver = self.si.WindowsSdkLastVersion yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) if self.si.WindowsSDKExecutablePath: yield self.si.WindowsSDKExecutablePath @property def _sdk_subdir(self): """ Microsoft Windows SDK version subdir """ ucrtver = self.si.WindowsSdkLastVersion return ('%s\\' % ucrtver) if ucrtver else '' @property def SdkSetup(self): """ Microsoft Windows SDK Setup """ if self.vc_ver > 9.0: return [] return [os.path.join(self.si.WindowsSdkDir, 'Setup')] @property def FxTools(self): """ Microsoft .NET Framework Tools """ pi = self.pi si = self.si if self.vc_ver <= 10.0: include32 = True include64 = not pi.target_is_x86() and not pi.current_is_x86() else: include32 = pi.target_is_x86() or pi.current_is_x86() include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' tools = [] if include32: tools += [os.path.join(si.FrameworkDir32, ver) for ver in si.FrameworkVersion32] if include64: tools += [os.path.join(si.FrameworkDir64, ver) for ver in si.FrameworkVersion64] return tools @property def NetFxSDKLibraries(self): """ Microsoft .Net Framework SDK Libraries """ if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: return [] arch_subdir = self.pi.target_dir(x64=True) return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] @property def NetFxSDKIncludes(self): """ Microsoft .Net Framework SDK Includes """ if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: return [] return [os.path.join(self.si.NetFxSdkDir, r'include\um')] @property def VsTDb(self): """ Microsoft Visual Studio Team System Database """ return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] @property def MSBuild(self): """ Microsoft Build Engine """ if self.vc_ver < 12.0: return [] elif self.vc_ver < 15.0: base_path = self.si.ProgramFilesx86 arch_subdir = self.pi.current_dir(hidex86=True) else: base_path = self.si.VSInstallDir arch_subdir = '' path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) build = [os.path.join(base_path, path)] if self.vc_ver >= 15.0: # Add Roslyn C# & Visual Basic Compiler build += [os.path.join(base_path, path, 'Roslyn')] return build @property def HTMLHelpWorkshop(self): """ Microsoft HTML Help Workshop """ if self.vc_ver < 11.0: return [] return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] @property def UCRTLibraries(self): """ Microsoft Universal C Runtime SDK Libraries """ if self.vc_ver < 14.0: return [] arch_subdir = self.pi.target_dir(x64=True) lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') ucrtver = self._ucrt_subdir return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] @property def UCRTIncludes(self): """ Microsoft Universal C Runtime SDK Include """ if self.vc_ver < 14.0: return [] include = os.path.join(self.si.UniversalCRTSdkDir, 'include') return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] @property def _ucrt_subdir(self): """ Microsoft Universal C Runtime SDK version subdir """ ucrtver = self.si.UniversalCRTSdkLastVersion return ('%s\\' % ucrtver) if ucrtver else '' @property def FSharp(self): """ Microsoft Visual F# """ if self.vc_ver < 11.0 and self.vc_ver > 12.0: return [] return self.si.FSharpInstallDir @property def VCRuntimeRedist(self): """ Microsoft Visual C++ runtime redistribuable dll """ arch_subdir = self.pi.target_dir(x64=True) if self.vc_ver < 15: redist_path = self.si.VCInstallDir vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' else: redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' # Visual Studio 2017 is still Visual C++ 14.0 dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) return os.path.join(redist_path, vcruntime) def return_env(self, exists=True): """ Return environment dict. Parameters ---------- exists: bool It True, only return existing paths. """ env = dict( include=self._build_paths('include', [self.VCIncludes, self.OSIncludes, self.UCRTIncludes, self.NetFxSDKIncludes], exists), lib=self._build_paths('lib', [self.VCLibraries, self.OSLibraries, self.FxTools, self.UCRTLibraries, self.NetFxSDKLibraries], exists), libpath=self._build_paths('libpath', [self.VCLibraries, self.FxTools, self.VCStoreRefs, self.OSLibpath], exists), path=self._build_paths('path', [self.VCTools, self.VSTools, self.VsTDb, self.SdkTools, self.SdkSetup, self.FxTools, self.MSBuild, self.HTMLHelpWorkshop, self.FSharp], exists), ) if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): env['py_vcruntime_redist'] = self.VCRuntimeRedist return env def _build_paths(self, name, spec_path_lists, exists): """ Given an environment variable name and specified paths, return a pathsep-separated string of paths containing unique, extant, directories from those paths and from the environment variable. Raise an error if no paths are resolved. """ # flatten spec_path_lists spec_paths = itertools.chain.from_iterable(spec_path_lists) env_paths = safe_env.get(name, '').split(os.pathsep) paths = itertools.chain(spec_paths, env_paths) extant_paths = list(filter(os.path.isdir, paths)) if exists else paths if not extant_paths: msg = "%s environment variable is empty" % name.upper() raise distutils.errors.DistutilsPlatformError(msg) unique_paths = self._unique_everseen(extant_paths) return os.pathsep.join(unique_paths) # from Python docs def _unique_everseen(self, iterable, key=None): """ List unique elements, preserving order. Remember all elements ever seen. _unique_everseen('AAAABBBCCDAABBB') --> A B C D _unique_everseen('ABBCcAD', str.lower) --> A B C D """ seen = set() seen_add = seen.add if key is None: for element in filterfalse(seen.__contains__, iterable): seen_add(element) yield element else: for element in iterable: k = key(element) if k not in seen: seen_add(k) yield element PK!c   namespaces.pynu[import os from distutils import log import itertools from setuptools.extern.six.moves import map flatten = itertools.chain.from_iterable class Installer: nspkg_ext = '-nspkg.pth' def install_namespaces(self): nsp = self._get_all_ns_packages() if not nsp: return filename, ext = os.path.splitext(self._get_target()) filename += self.nspkg_ext self.outputs.append(filename) log.info("Installing %s", filename) lines = map(self._gen_nspkg_line, nsp) if self.dry_run: # always generate the lines, even in dry run list(lines) return with open(filename, 'wt') as f: f.writelines(lines) def uninstall_namespaces(self): filename, ext = os.path.splitext(self._get_target()) filename += self.nspkg_ext if not os.path.exists(filename): return log.info("Removing %s", filename) os.remove(filename) def _get_target(self): return self.target _nspkg_tmpl = ( "import sys, types, os", "has_mfs = sys.version_info > (3, 5)", "p = os.path.join(%(root)s, *%(pth)r)", "importlib = has_mfs and __import__('importlib.util')", "has_mfs and __import__('importlib.machinery')", "m = has_mfs and " "sys.modules.setdefault(%(pkg)r, " "importlib.util.module_from_spec(" "importlib.machinery.PathFinder.find_spec(%(pkg)r, " "[os.path.dirname(p)])))", "m = m or " "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", "mp = (m or []) and m.__dict__.setdefault('__path__',[])", "(p not in mp) and mp.append(p)", ) "lines for the namespace installer" _nspkg_tmpl_multi = ( 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', ) "additional line(s) when a parent package is indicated" def _get_root(self): return "sys._getframe(1).f_locals['sitedir']" def _gen_nspkg_line(self, pkg): # ensure pkg is not a unicode string under Python 2.7 pkg = str(pkg) pth = tuple(pkg.split('.')) root = self._get_root() tmpl_lines = self._nspkg_tmpl parent, sep, child = pkg.rpartition('.') if parent: tmpl_lines += self._nspkg_tmpl_multi return ';'.join(tmpl_lines) % locals() + '\n' def _get_all_ns_packages(self): """Return sorted list of all package namespaces""" pkgs = self.distribution.namespace_packages or [] return sorted(flatten(map(self._pkg_names, pkgs))) @staticmethod def _pkg_names(pkg): """ Given a namespace package, yield the components of that package. >>> names = Installer._pkg_names('a.b.c') >>> set(names) == set(['a', 'a.b', 'a.b.c']) True """ parts = pkg.split('.') while parts: yield '.'.join(parts) parts.pop() class DevelopInstaller(Installer): def _get_root(self): return repr(str(self.egg_path)) def _get_target(self): return self.egg_link PK!ٜٜpackage_index.pynu["""PyPI and direct package downloading""" import sys import os import re import shutil import socket import base64 import hashlib import itertools from functools import wraps from setuptools.extern import six from setuptools.extern.six.moves import urllib, http_client, configparser, map import setuptools from pkg_resources import ( CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, Environment, find_distributions, safe_name, safe_version, to_filename, Requirement, DEVELOP_DIST, EGG_DIST, ) from setuptools import ssl_support from distutils import log from distutils.errors import DistutilsError from fnmatch import translate from setuptools.py27compat import get_all_headers from setuptools.py33compat import unescape from setuptools.wheel import Wheel EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I) # this is here to fix emacs' cruddy broken syntax highlighting PYPI_MD5 = re.compile( '([^<]+)\n\\s+\\(md5\\)' ) URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() __all__ = [ 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', 'interpret_distro_name', ] _SOCKET_TIMEOUT = 15 _tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) def parse_requirement_arg(spec): try: return Requirement.parse(spec) except ValueError: raise DistutilsError( "Not a URL, existing file, or requirement spec: %r" % (spec,) ) def parse_bdist_wininst(name): """Return (base,pyversion) or (None,None) for possible .exe name""" lower = name.lower() base, py_ver, plat = None, None, None if lower.endswith('.exe'): if lower.endswith('.win32.exe'): base = name[:-10] plat = 'win32' elif lower.startswith('.win32-py', -16): py_ver = name[-7:-4] base = name[:-16] plat = 'win32' elif lower.endswith('.win-amd64.exe'): base = name[:-14] plat = 'win-amd64' elif lower.startswith('.win-amd64-py', -20): py_ver = name[-7:-4] base = name[:-20] plat = 'win-amd64' return base, py_ver, plat def egg_info_for_url(url): parts = urllib.parse.urlparse(url) scheme, server, path, parameters, query, fragment = parts base = urllib.parse.unquote(path.split('/')[-1]) if server == 'sourceforge.net' and base == 'download': # XXX Yuck base = urllib.parse.unquote(path.split('/')[-2]) if '#' in base: base, fragment = base.split('#', 1) return base, fragment def distros_for_url(url, metadata=None): """Yield egg or source distribution objects that might be found at a URL""" base, fragment = egg_info_for_url(url) for dist in distros_for_location(url, base, metadata): yield dist if fragment: match = EGG_FRAGMENT.match(fragment) if match: for dist in interpret_distro_name( url, match.group(1), metadata, precedence=CHECKOUT_DIST ): yield dist def distros_for_location(location, basename, metadata=None): """Yield egg or source distribution objects based on basename""" if basename.endswith('.egg.zip'): basename = basename[:-4] # strip the .zip if basename.endswith('.egg') and '-' in basename: # only one, unambiguous interpretation return [Distribution.from_location(location, basename, metadata)] if basename.endswith('.whl') and '-' in basename: wheel = Wheel(basename) if not wheel.is_compatible(): return [] return [Distribution( location=location, project_name=wheel.project_name, version=wheel.version, # Increase priority over eggs. precedence=EGG_DIST + 1, )] if basename.endswith('.exe'): win_base, py_ver, platform = parse_bdist_wininst(basename) if win_base is not None: return interpret_distro_name( location, win_base, metadata, py_ver, BINARY_DIST, platform ) # Try source distro extensions (.zip, .tgz, etc.) # for ext in EXTENSIONS: if basename.endswith(ext): basename = basename[:-len(ext)] return interpret_distro_name(location, basename, metadata) return [] # no extension matched def distros_for_filename(filename, metadata=None): """Yield possible egg or source distribution objects based on a filename""" return distros_for_location( normalize_path(filename), os.path.basename(filename), metadata ) def interpret_distro_name( location, basename, metadata, py_version=None, precedence=SOURCE_DIST, platform=None ): """Generate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! """ # Generate alternative interpretations of a source distro name # Because some packages are ambiguous as to name/versions split # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, # the spurious interpretations should be ignored, because in the event # there's also an "adns" package, the spurious "python-1.1.0" version will # compare lower than any numeric version number, and is therefore unlikely # to match a request for it. It's still a potential problem, though, and # in the long run PyPI and the distutils should go for "safe" names and # versions in distribution archive names (sdist and bdist). parts = basename.split('-') if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): # it is a bdist_dumb, not an sdist -- bail out return for p in range(1, len(parts) + 1): yield Distribution( location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), py_version=py_version, precedence=precedence, platform=platform ) # From Python 2.7 docs def unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." # unique_everseen('AAAABBBCCDAABBB') --> A B C D # unique_everseen('ABBCcAD', str.lower) --> A B C D seen = set() seen_add = seen.add if key is None: for element in six.moves.filterfalse(seen.__contains__, iterable): seen_add(element) yield element else: for element in iterable: k = key(element) if k not in seen: seen_add(k) yield element def unique_values(func): """ Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. """ @wraps(func) def wrapper(*args, **kwargs): return unique_everseen(func(*args, **kwargs)) return wrapper REL = re.compile(r"""<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>""", re.I) # this line is here to fix emacs' cruddy broken syntax highlighting @unique_values def find_external_links(url, page): """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" for match in REL.finditer(page): tag, rel = match.groups() rels = set(map(str.strip, rel.lower().split(','))) if 'homepage' in rels or 'download' in rels: for match in HREF.finditer(tag): yield urllib.parse.urljoin(url, htmldecode(match.group(1))) for tag in ("Home Page", "Download URL"): pos = page.find(tag) if pos != -1: match = HREF.search(page, pos) if match: yield urllib.parse.urljoin(url, htmldecode(match.group(1))) class ContentChecker(object): """ A null content checker that defines the interface for checking content """ def feed(self, block): """ Feed a block of data to the hash. """ return def is_valid(self): """ Check the hash. Return False if validation fails. """ return True def report(self, reporter, template): """ Call reporter with information about the checker (hash name) substituted into the template. """ return class HashChecker(ContentChecker): pattern = re.compile( r'(?Psha1|sha224|sha384|sha256|sha512|md5)=' r'(?P[a-f0-9]+)' ) def __init__(self, hash_name, expected): self.hash_name = hash_name self.hash = hashlib.new(hash_name) self.expected = expected @classmethod def from_url(cls, url): "Construct a (possibly null) ContentChecker from a URL" fragment = urllib.parse.urlparse(url)[-1] if not fragment: return ContentChecker() match = cls.pattern.search(fragment) if not match: return ContentChecker() return cls(**match.groupdict()) def feed(self, block): self.hash.update(block) def is_valid(self): return self.hash.hexdigest() == self.expected def report(self, reporter, template): msg = template % self.hash_name return reporter(msg) class PackageIndex(Environment): """A distribution index that scans web pages for download URLs""" def __init__( self, index_url="https://pypi.python.org/simple", hosts=('*',), ca_bundle=None, verify_ssl=True, *args, **kw ): Environment.__init__(self, *args, **kw) self.index_url = index_url + "/" [:not index_url.endswith('/')] self.scanned_urls = {} self.fetched_urls = {} self.package_pages = {} self.allows = re.compile('|'.join(map(translate, hosts))).match self.to_scan = [] use_ssl = ( verify_ssl and ssl_support.is_available and (ca_bundle or ssl_support.find_ca_bundle()) ) if use_ssl: self.opener = ssl_support.opener_for(ca_bundle) else: self.opener = urllib.request.urlopen def process_url(self, url, retrieve=False): """Evaluate a URL as a possible download, and maybe retrieve it""" if url in self.scanned_urls and not retrieve: return self.scanned_urls[url] = True if not URL_SCHEME(url): self.process_filename(url) return else: dists = list(distros_for_url(url)) if dists: if not self.url_ok(url): return self.debug("Found link: %s", url) if dists or not retrieve or url in self.fetched_urls: list(map(self.add, dists)) return # don't need the actual page if not self.url_ok(url): self.fetched_urls[url] = True return self.info("Reading %s", url) self.fetched_urls[url] = True # prevent multiple fetch attempts tmpl = "Download error on %s: %%s -- Some packages may not be found!" f = self.open_url(url, tmpl % url) if f is None: return self.fetched_urls[f.url] = True if 'html' not in f.headers.get('content-type', '').lower(): f.close() # not html, we can't process it return base = f.url # handle redirects page = f.read() if not isinstance(page, str): # In Python 3 and got bytes but want str. if isinstance(f, urllib.error.HTTPError): # Errors have no charset, assume latin1: charset = 'latin-1' else: charset = f.headers.get_param('charset') or 'latin-1' page = page.decode(charset, "ignore") f.close() for match in HREF.finditer(page): link = urllib.parse.urljoin(base, htmldecode(match.group(1))) self.process_url(link) if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: page = self.process_index(url, page) def process_filename(self, fn, nested=False): # process filenames or directories if not os.path.exists(fn): self.warn("Not found: %s", fn) return if os.path.isdir(fn) and not nested: path = os.path.realpath(fn) for item in os.listdir(path): self.process_filename(os.path.join(path, item), True) dists = distros_for_filename(fn) if dists: self.debug("Found: %s", fn) list(map(self.add, dists)) def url_ok(self, url, fatal=False): s = URL_SCHEME(url) is_file = s and s.group(1).lower() == 'file' if is_file or self.allows(urllib.parse.urlparse(url)[1]): return True msg = ( "\nNote: Bypassing %s (disallowed host; see " "http://bit.ly/2hrImnY for details).\n") if fatal: raise DistutilsError(msg % url) else: self.warn(msg, url) def scan_egg_links(self, search_path): dirs = filter(os.path.isdir, search_path) egg_links = ( (path, entry) for path in dirs for entry in os.listdir(path) if entry.endswith('.egg-link') ) list(itertools.starmap(self.scan_egg_link, egg_links)) def scan_egg_link(self, path, entry): with open(os.path.join(path, entry)) as raw_lines: # filter non-empty lines lines = list(filter(None, map(str.strip, raw_lines))) if len(lines) != 2: # format is not recognized; punt return egg_path, setup_path = lines for dist in find_distributions(os.path.join(path, egg_path)): dist.location = os.path.join(path, *lines) dist.precedence = SOURCE_DIST self.add(dist) def process_index(self, url, page): """Process the contents of a PyPI page""" def scan(link): # Process a URL to see if it's for a package page if link.startswith(self.index_url): parts = list(map( urllib.parse.unquote, link[len(self.index_url):].split('/') )) if len(parts) == 2 and '#' not in parts[1]: # it's a package page, sanitize and index it pkg = safe_name(parts[0]) ver = safe_version(parts[1]) self.package_pages.setdefault(pkg.lower(), {})[link] = True return to_filename(pkg), to_filename(ver) return None, None # process an index page into the package-page index for match in HREF.finditer(page): try: scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) except ValueError: pass pkg, ver = scan(url) # ensure this page is in the page index if pkg: # process individual package page for new_url in find_external_links(url, page): # Process the found URL base, frag = egg_info_for_url(new_url) if base.endswith('.py') and not frag: if ver: new_url += '#egg=%s-%s' % (pkg, ver) else: self.need_version_info(url) self.scan_url(new_url) return PYPI_MD5.sub( lambda m: '%s' % m.group(1, 3, 2), page ) else: return "" # no sense double-scanning non-package pages def need_version_info(self, url): self.scan_all( "Page at %s links to .py file(s) without version info; an index " "scan is required.", url ) def scan_all(self, msg=None, *args): if self.index_url not in self.fetched_urls: if msg: self.warn(msg, *args) self.info( "Scanning index of all packages (this may take a while)" ) self.scan_url(self.index_url) def find_packages(self, requirement): self.scan_url(self.index_url + requirement.unsafe_name + '/') if not self.package_pages.get(requirement.key): # Fall back to safe version of the name self.scan_url(self.index_url + requirement.project_name + '/') if not self.package_pages.get(requirement.key): # We couldn't find the target package, so search the index page too self.not_found_in_index(requirement) for url in list(self.package_pages.get(requirement.key, ())): # scan each page that might be related to the desired package self.scan_url(url) def obtain(self, requirement, installer=None): self.prescan() self.find_packages(requirement) for dist in self[requirement.key]: if dist in requirement: return dist self.debug("%s does not match %s", requirement, dist) return super(PackageIndex, self).obtain(requirement, installer) def check_hash(self, checker, filename, tfp): """ checker is a ContentChecker """ checker.report( self.debug, "Validating %%s checksum for %s" % filename) if not checker.is_valid(): tfp.close() os.unlink(filename) raise DistutilsError( "%s validation failed for %s; " "possible download problem?" % (checker.hash.name, os.path.basename(filename)) ) def add_find_links(self, urls): """Add `urls` to the list that will be prescanned for searches""" for url in urls: if ( self.to_scan is None # if we have already "gone online" or not URL_SCHEME(url) # or it's a local file/directory or url.startswith('file:') or list(distros_for_url(url)) # or a direct package link ): # then go ahead and process it now self.scan_url(url) else: # otherwise, defer retrieval till later self.to_scan.append(url) def prescan(self): """Scan urls scheduled for prescanning (e.g. --find-links)""" if self.to_scan: list(map(self.scan_url, self.to_scan)) self.to_scan = None # from now on, go ahead and process immediately def not_found_in_index(self, requirement): if self[requirement.key]: # we've seen at least one distro meth, msg = self.info, "Couldn't retrieve index page for %r" else: # no distros seen for this name, might be misspelled meth, msg = ( self.warn, "Couldn't find index page for %r (maybe misspelled?)") meth(msg, requirement.unsafe_name) self.scan_all() def download(self, spec, tmpdir): """Locate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. """ if not isinstance(spec, Requirement): scheme = URL_SCHEME(spec) if scheme: # It's a url, download it to tmpdir found = self._download_url(scheme.group(1), spec, tmpdir) base, fragment = egg_info_for_url(spec) if base.endswith('.py'): found = self.gen_setup(found, fragment, tmpdir) return found elif os.path.exists(spec): # Existing file or directory, just return it return spec else: spec = parse_requirement_arg(spec) return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) def fetch_distribution( self, requirement, tmpdir, force_scan=False, source=False, develop_ok=False, local_index=None): """Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. """ # process a Requirement self.info("Searching for %s", requirement) skipped = {} dist = None def find(req, env=None): if env is None: env = self # Find a matching distribution; may be called more than once for dist in env[req.key]: if dist.precedence == DEVELOP_DIST and not develop_ok: if dist not in skipped: self.warn( "Skipping development or system egg: %s", dist, ) skipped[dist] = 1 continue test = ( dist in req and (dist.precedence <= SOURCE_DIST or not source) ) if test: loc = self.download(dist.location, tmpdir) dist.download_location = loc if os.path.exists(dist.download_location): return dist if force_scan: self.prescan() self.find_packages(requirement) dist = find(requirement) if not dist and local_index is not None: dist = find(requirement, local_index) if dist is None: if self.to_scan is not None: self.prescan() dist = find(requirement) if dist is None and not force_scan: self.find_packages(requirement) dist = find(requirement) if dist is None: self.warn( "No local packages or working download links found for %s%s", (source and "a source distribution of " or ""), requirement, ) else: self.info("Best match: %s", dist) return dist.clone(location=dist.download_location) def fetch(self, requirement, tmpdir, force_scan=False, source=False): """Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. """ dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) if dist is not None: return dist.location return None def gen_setup(self, filename, fragment, tmpdir): match = EGG_FRAGMENT.match(fragment) dists = match and [ d for d in interpret_distro_name(filename, match.group(1), None) if d.version ] or [] if len(dists) == 1: # unambiguous ``#egg`` fragment basename = os.path.basename(filename) # Make sure the file has been downloaded to the temp dir. if os.path.dirname(filename) != tmpdir: dst = os.path.join(tmpdir, basename) from setuptools.command.easy_install import samefile if not samefile(filename, dst): shutil.copy2(filename, dst) filename = dst with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: file.write( "from setuptools import setup\n" "setup(name=%r, version=%r, py_modules=[%r])\n" % ( dists[0].project_name, dists[0].version, os.path.splitext(basename)[0] ) ) return filename elif match: raise DistutilsError( "Can't unambiguously interpret project/version identifier %r; " "any dashes in the name or version should be escaped using " "underscores. %r" % (fragment, dists) ) else: raise DistutilsError( "Can't process plain .py files without an '#egg=name-version'" " suffix to enable automatic setup script generation." ) dl_blocksize = 8192 def _download_to(self, url, filename): self.info("Downloading %s", url) # Download the file fp = None try: checker = HashChecker.from_url(url) fp = self.open_url(url) if isinstance(fp, urllib.error.HTTPError): raise DistutilsError( "Can't download %s: %s %s" % (url, fp.code, fp.msg) ) headers = fp.info() blocknum = 0 bs = self.dl_blocksize size = -1 if "content-length" in headers: # Some servers return multiple Content-Length headers :( sizes = get_all_headers(headers, 'Content-Length') size = max(map(int, sizes)) self.reporthook(url, filename, blocknum, bs, size) with open(filename, 'wb') as tfp: while True: block = fp.read(bs) if block: checker.feed(block) tfp.write(block) blocknum += 1 self.reporthook(url, filename, blocknum, bs, size) else: break self.check_hash(checker, filename, tfp) return headers finally: if fp: fp.close() def reporthook(self, url, filename, blocknum, blksize, size): pass # no-op def open_url(self, url, warning=None): if url.startswith('file:'): return local_open(url) try: return open_with_auth(url, self.opener) except (ValueError, http_client.InvalidURL) as v: msg = ' '.join([str(arg) for arg in v.args]) if warning: self.warn(warning, msg) else: raise DistutilsError('%s %s' % (url, msg)) except urllib.error.HTTPError as v: return v except urllib.error.URLError as v: if warning: self.warn(warning, v.reason) else: raise DistutilsError("Download error for %s: %s" % (url, v.reason)) except http_client.BadStatusLine as v: if warning: self.warn(warning, v.line) else: raise DistutilsError( '%s returned a bad status line. The server might be ' 'down, %s' % (url, v.line) ) except (http_client.HTTPException, socket.error) as v: if warning: self.warn(warning, v) else: raise DistutilsError("Download error for %s: %s" % (url, v)) def _download_url(self, scheme, url, tmpdir): # Determine download filename # name, fragment = egg_info_for_url(url) if name: while '..' in name: name = name.replace('..', '.').replace('\\', '_') else: name = "__downloaded__" # default if URL has no path contents if name.endswith('.egg.zip'): name = name[:-4] # strip the extra .zip before download filename = os.path.join(tmpdir, name) # Download the file # if scheme == 'svn' or scheme.startswith('svn+'): return self._download_svn(url, filename) elif scheme == 'git' or scheme.startswith('git+'): return self._download_git(url, filename) elif scheme.startswith('hg+'): return self._download_hg(url, filename) elif scheme == 'file': return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) else: self.url_ok(url, True) # raises error if not allowed return self._attempt_download(url, filename) def scan_url(self, url): self.process_url(url, True) def _attempt_download(self, url, filename): headers = self._download_to(url, filename) if 'html' in headers.get('content-type', '').lower(): return self._download_html(url, headers, filename) else: return filename def _download_html(self, url, headers, filename): file = open(filename) for line in file: if line.strip(): # Check for a subversion index page if re.search(r'([^- ]+ - )?Revision \d+:', line): # it's a subversion index page: file.close() os.unlink(filename) return self._download_svn(url, filename) break # not an index page file.close() os.unlink(filename) raise DistutilsError("Unexpected HTML page found at " + url) def _download_svn(self, url, filename): url = url.split('#', 1)[0] # remove any fragment for svn's sake creds = '' if url.lower().startswith('svn:') and '@' in url: scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) if not netloc and path.startswith('//') and '/' in path[2:]: netloc, path = path[2:].split('/', 1) auth, host = urllib.parse.splituser(netloc) if auth: if ':' in auth: user, pw = auth.split(':', 1) creds = " --username=%s --password=%s" % (user, pw) else: creds = " --username=" + auth netloc = host parts = scheme, netloc, url, p, q, f url = urllib.parse.urlunparse(parts) self.info("Doing subversion checkout from %s to %s", url, filename) os.system("svn checkout%s -q %s %s" % (creds, url, filename)) return filename @staticmethod def _vcs_split_rev_from_url(url, pop_prefix=False): scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) scheme = scheme.split('+', 1)[-1] # Some fragment identification fails path = path.split('#', 1)[0] rev = None if '@' in path: path, rev = path.rsplit('@', 1) # Also, discard fragment url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) return url, rev def _download_git(self, url, filename): filename = filename.split('#', 1)[0] url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) self.info("Doing git clone from %s to %s", url, filename) os.system("git clone --quiet %s %s" % (url, filename)) if rev is not None: self.info("Checking out %s", rev) os.system("(cd %s && git checkout --quiet %s)" % ( filename, rev, )) return filename def _download_hg(self, url, filename): filename = filename.split('#', 1)[0] url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) self.info("Doing hg clone from %s to %s", url, filename) os.system("hg clone --quiet %s %s" % (url, filename)) if rev is not None: self.info("Updating to %s", rev) os.system("(cd %s && hg up -C -r %s -q)" % ( filename, rev, )) return filename def debug(self, msg, *args): log.debug(msg, *args) def info(self, msg, *args): log.info(msg, *args) def warn(self, msg, *args): log.warn(msg, *args) # This pattern matches a character entity reference (a decimal numeric # references, a hexadecimal numeric reference, or a named reference). entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub def decode_entity(match): what = match.group(1) return unescape(what) def htmldecode(text): """Decode HTML entities in the given text.""" return entity_sub(decode_entity, text) def socket_timeout(timeout=15): def _socket_timeout(func): def _socket_timeout(*args, **kwargs): old_timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(timeout) try: return func(*args, **kwargs) finally: socket.setdefaulttimeout(old_timeout) return _socket_timeout return _socket_timeout def _encode_auth(auth): """ A function compatible with Python 2.3-3.3 that will encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False """ auth_s = urllib.parse.unquote(auth) # convert to bytes auth_bytes = auth_s.encode() # use the legacy interface for Python 2.3 support encoded_bytes = base64.encodestring(auth_bytes) # convert back to a string encoded = encoded_bytes.decode() # strip the trailing carriage return return encoded.replace('\n', '') class Credential(object): """ A username/password pair. Use like a namedtuple. """ def __init__(self, username, password): self.username = username self.password = password def __iter__(self): yield self.username yield self.password def __str__(self): return '%(username)s:%(password)s' % vars(self) class PyPIConfig(configparser.RawConfigParser): def __init__(self): """ Load from ~/.pypirc """ defaults = dict.fromkeys(['username', 'password', 'repository'], '') configparser.RawConfigParser.__init__(self, defaults) rc = os.path.join(os.path.expanduser('~'), '.pypirc') if os.path.exists(rc): self.read(rc) @property def creds_by_repository(self): sections_with_repositories = [ section for section in self.sections() if self.get(section, 'repository').strip() ] return dict(map(self._get_repo_cred, sections_with_repositories)) def _get_repo_cred(self, section): repo = self.get(section, 'repository').strip() return repo, Credential( self.get(section, 'username').strip(), self.get(section, 'password').strip(), ) def find_credential(self, url): """ If the URL indicated appears to be a repository defined in this config, return the credential for that repository. """ for repository, cred in self.creds_by_repository.items(): if url.startswith(repository): return cred def open_with_auth(url, opener=urllib.request.urlopen): """Open a urllib2 request, handling HTTP authentication""" scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url) # Double scheme does not raise on Mac OS X as revealed by a # failing test. We would expect "nonnumeric port". Refs #20. if netloc.endswith(':'): raise http_client.InvalidURL("nonnumeric port: ''") if scheme in ('http', 'https'): auth, host = urllib.parse.splituser(netloc) else: auth = None if not auth: cred = PyPIConfig().find_credential(url) if cred: auth = str(cred) info = cred.username, url log.info('Authenticating as %s for %s (from .pypirc)', *info) if auth: auth = "Basic " + _encode_auth(auth) parts = scheme, host, path, params, query, frag new_url = urllib.parse.urlunparse(parts) request = urllib.request.Request(new_url) request.add_header("Authorization", auth) else: request = urllib.request.Request(url) request.add_header('User-Agent', user_agent) fp = opener(request) if auth: # Put authentication info back into request URL if same host, # so that links found on the page will work s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) if s2 == scheme and h2 == host: parts = s2, netloc, path2, param2, query2, frag2 fp.url = urllib.parse.urlunparse(parts) return fp # adding a timeout to avoid freezing package_index open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) def fix_sf_url(url): return url # backward compatibility def local_open(url): """Read a local path, with special support for directories""" scheme, server, path, param, query, frag = urllib.parse.urlparse(url) filename = urllib.request.url2pathname(path) if os.path.isfile(filename): return urllib.request.urlopen(url) elif path.endswith('/') and os.path.isdir(filename): files = [] for f in os.listdir(filename): filepath = os.path.join(filename, f) if f == 'index.html': with open(filepath, 'r') as fp: body = fp.read() break elif os.path.isdir(filepath): f += '/' files.append('<a href="{name}">{name}</a>'.format(name=f)) else: tmpl = ( "<html><head><title>{url}" "{files}") body = tmpl.format(url=url, files='\n'.join(files)) status, message = 200, "OK" else: status, message, body = 404, "Path not found", "Not found" headers = {'content-type': 'text/html'} body_stream = six.StringIO(body) return urllib.error.HTTPError(url, status, message, headers, body_stream) PK!辂** pep425tags.pynu[# This file originally from pip: # https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py """Generate and work with PEP 425 Compatibility Tags.""" from __future__ import absolute_import import distutils.util import platform import re import sys import sysconfig import warnings from collections import OrderedDict from . import glibc _osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') def get_config_var(var): try: return sysconfig.get_config_var(var) except IOError as e: # Issue #1074 warnings.warn("{}".format(e), RuntimeWarning) return None def get_abbr_impl(): """Return abbreviated implementation name.""" if hasattr(sys, 'pypy_version_info'): pyimpl = 'pp' elif sys.platform.startswith('java'): pyimpl = 'jy' elif sys.platform == 'cli': pyimpl = 'ip' else: pyimpl = 'cp' return pyimpl def get_impl_ver(): """Return implementation version.""" impl_ver = get_config_var("py_version_nodot") if not impl_ver or get_abbr_impl() == 'pp': impl_ver = ''.join(map(str, get_impl_version_info())) return impl_ver def get_impl_version_info(): """Return sys.version_info-like tuple for use in decrementing the minor version.""" if get_abbr_impl() == 'pp': # as per https://github.com/pypa/pip/issues/2882 return (sys.version_info[0], sys.pypy_version_info.major, sys.pypy_version_info.minor) else: return sys.version_info[0], sys.version_info[1] def get_impl_tag(): """ Returns the Tag for this specific implementation. """ return "{}{}".format(get_abbr_impl(), get_impl_ver()) def get_flag(var, fallback, expected=True, warn=True): """Use a fallback method for determining SOABI flags if the needed config var is unset or unavailable.""" val = get_config_var(var) if val is None: if warn: warnings.warn("Config variable '{0}' is unset, Python ABI tag may " "be incorrect".format(var), RuntimeWarning, 2) return fallback() return val == expected def get_abi_tag(): """Return the ABI tag based on SOABI (if available) or emulate SOABI (CPython 2, PyPy).""" soabi = get_config_var('SOABI') impl = get_abbr_impl() if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): d = '' m = '' u = '' if get_flag('Py_DEBUG', lambda: hasattr(sys, 'gettotalrefcount'), warn=(impl == 'cp')): d = 'd' if get_flag('WITH_PYMALLOC', lambda: impl == 'cp', warn=(impl == 'cp')): m = 'm' if get_flag('Py_UNICODE_SIZE', lambda: sys.maxunicode == 0x10ffff, expected=4, warn=(impl == 'cp' and sys.version_info < (3, 3))) \ and sys.version_info < (3, 3): u = 'u' abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) elif soabi and soabi.startswith('cpython-'): abi = 'cp' + soabi.split('-')[1] elif soabi: abi = soabi.replace('.', '_').replace('-', '_') else: abi = None return abi def _is_running_32bit(): return sys.maxsize == 2147483647 def get_platform(): """Return our platform name 'win32', 'linux_x86_64'""" if sys.platform == 'darwin': # distutils.util.get_platform() returns the release based on the value # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may # be significantly older than the user's current machine. release, _, machine = platform.mac_ver() split_ver = release.split('.') if machine == "x86_64" and _is_running_32bit(): machine = "i386" elif machine == "ppc64" and _is_running_32bit(): machine = "ppc" return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) # XXX remove distutils dependency result = distutils.util.get_platform().replace('.', '_').replace('-', '_') if result == "linux_x86_64" and _is_running_32bit(): # 32 bit Python program (running on a 64 bit Linux): pip should only # install and run 32 bit compiled extensions in that case. result = "linux_i686" return result def is_manylinux1_compatible(): # Only Linux, and only x86-64 / i686 if get_platform() not in {"linux_x86_64", "linux_i686"}: return False # Check for presence of _manylinux module try: import _manylinux return bool(_manylinux.manylinux1_compatible) except (ImportError, AttributeError): # Fall through to heuristic check below pass # Check glibc version. CentOS 5 uses glibc 2.5. return glibc.have_compatible_glibc(2, 5) def get_darwin_arches(major, minor, machine): """Return a list of supported arches (including group arches) for the given major, minor and machine architecture of an macOS machine. """ arches = [] def _supports_arch(major, minor, arch): # Looking at the application support for macOS versions in the chart # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears # our timeline looks roughly like: # # 10.0 - Introduces ppc support. # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 # and x86_64 support is CLI only, and cannot be used for GUI # applications. # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. # 10.6 - Drops support for ppc64 # 10.7 - Drops support for ppc # # Given that we do not know if we're installing a CLI or a GUI # application, we must be conservative and assume it might be a GUI # application and behave as if ppc64 and x86_64 support did not occur # until 10.5. # # Note: The above information is taken from the "Application support" # column in the chart not the "Processor support" since I believe # that we care about what instruction sets an application can use # not which processors the OS supports. if arch == 'ppc': return (major, minor) <= (10, 5) if arch == 'ppc64': return (major, minor) == (10, 5) if arch == 'i386': return (major, minor) >= (10, 4) if arch == 'x86_64': return (major, minor) >= (10, 5) if arch in groups: for garch in groups[arch]: if _supports_arch(major, minor, garch): return True return False groups = OrderedDict([ ("fat", ("i386", "ppc")), ("intel", ("x86_64", "i386")), ("fat64", ("x86_64", "ppc64")), ("fat32", ("x86_64", "i386", "ppc")), ]) if _supports_arch(major, minor, machine): arches.append(machine) for garch in groups: if machine in groups[garch] and _supports_arch(major, minor, garch): arches.append(garch) arches.append('universal') return arches def get_supported(versions=None, noarch=False, platform=None, impl=None, abi=None): """Return a list of supported tags for each version specified in `versions`. :param versions: a list of string versions, of the form ["33", "32"], or None. The first version will be assumed to support our ABI. :param platform: specify the exact platform you want valid tags for, or None. If None, use the local system platform. :param impl: specify the exact implementation you want valid tags for, or None. If None, use the local interpreter impl. :param abi: specify the exact abi you want valid tags for, or None. If None, use the local interpreter abi. """ supported = [] # Versions must be given with respect to the preference if versions is None: versions = [] version_info = get_impl_version_info() major = version_info[:-1] # Support all previous minor Python versions. for minor in range(version_info[-1], -1, -1): versions.append(''.join(map(str, major + (minor,)))) impl = impl or get_abbr_impl() abis = [] abi = abi or get_abi_tag() if abi: abis[0:0] = [abi] abi3s = set() import imp for suffix in imp.get_suffixes(): if suffix[0].startswith('.abi'): abi3s.add(suffix[0].split('.', 2)[1]) abis.extend(sorted(list(abi3s))) abis.append('none') if not noarch: arch = platform or get_platform() if arch.startswith('macosx'): # support macosx-10.6-intel on macosx-10.9-x86_64 match = _osx_arch_pat.match(arch) if match: name, major, minor, actual_arch = match.groups() tpl = '{}_{}_%i_%s'.format(name, major) arches = [] for m in reversed(range(int(minor) + 1)): for a in get_darwin_arches(int(major), m, actual_arch): arches.append(tpl % (m, a)) else: # arch pattern didn't match (?!) arches = [arch] elif platform is None and is_manylinux1_compatible(): arches = [arch.replace('linux', 'manylinux1'), arch] else: arches = [arch] # Current version, current API (built specifically for our Python): for abi in abis: for arch in arches: supported.append(('%s%s' % (impl, versions[0]), abi, arch)) # abi3 modules compatible with older version of Python for version in versions[1:]: # abi3 was introduced in Python 3.2 if version in {'31', '30'}: break for abi in abi3s: # empty set if not Python 3 for arch in arches: supported.append(("%s%s" % (impl, version), abi, arch)) # Has binaries, does not use the Python API: for arch in arches: supported.append(('py%s' % (versions[0][0]), 'none', arch)) # No abi / arch, but requires our implementation: supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) # Tagged specifically as being cross-version compatible # (with just the major version specified) supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) # No abi / arch, generic Python for i, version in enumerate(versions): supported.append(('py%s' % (version,), 'none', 'any')) if i == 0: supported.append(('py%s' % (version[0]), 'none', 'any')) return supported implementation_tag = get_impl_tag() PK!fW py27compat.pynu[""" Compatibility Support for Python 2.7 and earlier """ import platform from setuptools.extern import six def get_all_headers(message, key): """ Given an HTTPMessage, return all headers matching a given key. """ return message.get_all(key) if six.PY2: def get_all_headers(message, key): return message.getheaders(key) linux_py2_ascii = ( platform.system() == 'Linux' and six.PY2 ) rmtree_safe = str if linux_py2_ascii else lambda x: x """Workaround for http://bugs.python.org/issue24672""" PK!йHZ py31compat.pynu[__all__ = ['get_config_vars', 'get_path'] try: # Python 2.7 or >=3.2 from sysconfig import get_config_vars, get_path except ImportError: from distutils.sysconfig import get_config_vars, get_python_lib def get_path(name): if name not in ('platlib', 'purelib'): raise ValueError("Name must be purelib or platlib") return get_python_lib(name == 'platlib') try: # Python >=3.2 from tempfile import TemporaryDirectory except ImportError: import shutil import tempfile class TemporaryDirectory(object): """ Very simple temporary directory context manager. Will try to delete afterward, but will also ignore OS and similar errors on deletion. """ def __init__(self): self.name = None # Handle mkdtemp raising an exception self.name = tempfile.mkdtemp() def __enter__(self): return self.name def __exit__(self, exctype, excvalue, exctrace): try: shutil.rmtree(self.name, True) except OSError: # removal errors are not the only possible pass self.name = None PK!, py33compat.pynu[import dis import array import collections try: import html except ImportError: html = None from setuptools.extern import six from setuptools.extern.six.moves import html_parser OpArg = collections.namedtuple('OpArg', 'opcode arg') class Bytecode_compat(object): def __init__(self, code): self.code = code def __iter__(self): """Yield '(op,arg)' pair for each operation in code object 'code'""" bytes = array.array('b', self.code.co_code) eof = len(self.code.co_code) ptr = 0 extended_arg = 0 while ptr < eof: op = bytes[ptr] if op >= dis.HAVE_ARGUMENT: arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg ptr += 3 if op == dis.EXTENDED_ARG: long_type = six.integer_types[-1] extended_arg = arg * long_type(65536) continue else: arg = None ptr += 1 yield OpArg(op, arg) Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) PK! K K py36compat.pynu[import sys from distutils.errors import DistutilsOptionError from distutils.util import strtobool from distutils.debug import DEBUG class Distribution_parse_config_files: """ Mix-in providing forward-compatibility for functionality to be included by default on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. """ def parse_config_files(self, filenames=None): from configparser import ConfigParser # Ignore install directory options if we have a venv if sys.prefix != sys.base_prefix: ignore_options = [ 'install-base', 'install-platbase', 'install-lib', 'install-platlib', 'install-purelib', 'install-headers', 'install-scripts', 'install-data', 'prefix', 'exec-prefix', 'home', 'user', 'root'] else: ignore_options = [] ignore_options = frozenset(ignore_options) if filenames is None: filenames = self.find_config_files() if DEBUG: self.announce("Distribution.parse_config_files():") parser = ConfigParser(interpolation=None) for filename in filenames: if DEBUG: self.announce(" reading %s" % filename) parser.read(filename) for section in parser.sections(): options = parser.options(section) opt_dict = self.get_option_dict(section) for opt in options: if opt != '__name__' and opt not in ignore_options: val = parser.get(section,opt) opt = opt.replace('-', '_') opt_dict[opt] = (filename, val) # Make the ConfigParser forget everything (so we retain # the original filenames that options come from) parser.__init__() # If there was a "global" section in the config file, use it # to set Distribution options. if 'global' in self.command_options: for (opt, (src, val)) in self.command_options['global'].items(): alias = self.negative_opt.get(opt) try: if alias: setattr(self, alias, not strtobool(val)) elif opt in ('verbose', 'dry_run'): # ugh! setattr(self, opt, strtobool(val)) else: setattr(self, opt, val) except ValueError as msg: raise DistutilsOptionError(msg) if sys.version_info < (3,): # Python 2 behavior is sufficient class Distribution_parse_config_files: pass if False: # When updated behavior is available upstream, # disable override here. class Distribution_parse_config_files: pass PK!Sc77 sandbox.pynu[import os import sys import tempfile import operator import functools import itertools import re import contextlib import pickle import textwrap from setuptools.extern import six from setuptools.extern.six.moves import builtins, map import pkg_resources.py31compat if sys.platform.startswith('java'): import org.python.modules.posix.PosixModule as _os else: _os = sys.modules[os.name] try: _file = file except NameError: _file = None _open = open from distutils.errors import DistutilsError from pkg_resources import working_set __all__ = [ "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", ] def _execfile(filename, globals, locals=None): """ Python 3 implementation of execfile. """ mode = 'rb' with open(filename, mode) as stream: script = stream.read() if locals is None: locals = globals code = compile(script, filename, 'exec') exec(code, globals, locals) @contextlib.contextmanager def save_argv(repl=None): saved = sys.argv[:] if repl is not None: sys.argv[:] = repl try: yield saved finally: sys.argv[:] = saved @contextlib.contextmanager def save_path(): saved = sys.path[:] try: yield saved finally: sys.path[:] = saved @contextlib.contextmanager def override_temp(replacement): """ Monkey-patch tempfile.tempdir with replacement, ensuring it exists """ pkg_resources.py31compat.makedirs(replacement, exist_ok=True) saved = tempfile.tempdir tempfile.tempdir = replacement try: yield finally: tempfile.tempdir = saved @contextlib.contextmanager def pushd(target): saved = os.getcwd() os.chdir(target) try: yield saved finally: os.chdir(saved) class UnpickleableException(Exception): """ An exception representing another Exception that could not be pickled. """ @staticmethod def dump(type, exc): """ Always return a dumped (pickled) type and exc. If exc can't be pickled, wrap it in UnpickleableException first. """ try: return pickle.dumps(type), pickle.dumps(exc) except Exception: # get UnpickleableException inside the sandbox from setuptools.sandbox import UnpickleableException as cls return cls.dump(cls, cls(repr(exc))) class ExceptionSaver: """ A Context Manager that will save an exception, serialized, and restore it later. """ def __enter__(self): return self def __exit__(self, type, exc, tb): if not exc: return # dump the exception self._saved = UnpickleableException.dump(type, exc) self._tb = tb # suppress the exception return True def resume(self): "restore and re-raise any exception" if '_saved' not in vars(self): return type, exc = map(pickle.loads, self._saved) six.reraise(type, exc, self._tb) @contextlib.contextmanager def save_modules(): """ Context in which imported modules are saved. Translates exceptions internal to the context into the equivalent exception outside the context. """ saved = sys.modules.copy() with ExceptionSaver() as saved_exc: yield saved sys.modules.update(saved) # remove any modules imported since del_modules = ( mod_name for mod_name in sys.modules if mod_name not in saved # exclude any encodings modules. See #285 and not mod_name.startswith('encodings.') ) _clear_modules(del_modules) saved_exc.resume() def _clear_modules(module_names): for mod_name in list(module_names): del sys.modules[mod_name] @contextlib.contextmanager def save_pkg_resources_state(): saved = pkg_resources.__getstate__() try: yield saved finally: pkg_resources.__setstate__(saved) @contextlib.contextmanager def setup_context(setup_dir): temp_dir = os.path.join(setup_dir, 'temp') with save_pkg_resources_state(): with save_modules(): hide_setuptools() with save_path(): with save_argv(): with override_temp(temp_dir): with pushd(setup_dir): # ensure setuptools commands are available __import__('setuptools') yield def _needs_hiding(mod_name): """ >>> _needs_hiding('setuptools') True >>> _needs_hiding('pkg_resources') True >>> _needs_hiding('setuptools_plugin') False >>> _needs_hiding('setuptools.__init__') True >>> _needs_hiding('distutils') True >>> _needs_hiding('os') False >>> _needs_hiding('Cython') True """ pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') return bool(pattern.match(mod_name)) def hide_setuptools(): """ Remove references to setuptools' modules from sys.modules to allow the invocation to import the most appropriate setuptools. This technique is necessary to avoid issues such as #315 where setuptools upgrading itself would fail to find a function declared in the metadata. """ modules = filter(_needs_hiding, sys.modules) _clear_modules(modules) def run_setup(setup_script, args): """Run a distutils setup script, sandboxed in its directory""" setup_dir = os.path.abspath(os.path.dirname(setup_script)) with setup_context(setup_dir): try: sys.argv[:] = [setup_script] + list(args) sys.path.insert(0, setup_dir) # reset to include setup dir, w/clean callback list working_set.__init__() working_set.callbacks.append(lambda dist: dist.activate()) # __file__ should be a byte string on Python 2 (#712) dunder_file = ( setup_script if isinstance(setup_script, str) else setup_script.encode(sys.getfilesystemencoding()) ) with DirectorySandbox(setup_dir): ns = dict(__file__=dunder_file, __name__='__main__') _execfile(setup_script, ns) except SystemExit as v: if v.args and v.args[0]: raise # Normal exit, just return class AbstractSandbox: """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" _active = False def __init__(self): self._attrs = [ name for name in dir(_os) if not name.startswith('_') and hasattr(self, name) ] def _copy(self, source): for name in self._attrs: setattr(os, name, getattr(source, name)) def __enter__(self): self._copy(self) if _file: builtins.file = self._file builtins.open = self._open self._active = True def __exit__(self, exc_type, exc_value, traceback): self._active = False if _file: builtins.file = _file builtins.open = _open self._copy(_os) def run(self, func): """Run 'func' under os sandboxing""" with self: return func() def _mk_dual_path_wrapper(name): original = getattr(_os, name) def wrap(self, src, dst, *args, **kw): if self._active: src, dst = self._remap_pair(name, src, dst, *args, **kw) return original(src, dst, *args, **kw) return wrap for name in ["rename", "link", "symlink"]: if hasattr(_os, name): locals()[name] = _mk_dual_path_wrapper(name) def _mk_single_path_wrapper(name, original=None): original = original or getattr(_os, name) def wrap(self, path, *args, **kw): if self._active: path = self._remap_input(name, path, *args, **kw) return original(path, *args, **kw) return wrap if _file: _file = _mk_single_path_wrapper('file', _file) _open = _mk_single_path_wrapper('open', _open) for name in [ "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", "startfile", "mkfifo", "mknod", "pathconf", "access" ]: if hasattr(_os, name): locals()[name] = _mk_single_path_wrapper(name) def _mk_single_with_return(name): original = getattr(_os, name) def wrap(self, path, *args, **kw): if self._active: path = self._remap_input(name, path, *args, **kw) return self._remap_output(name, original(path, *args, **kw)) return original(path, *args, **kw) return wrap for name in ['readlink', 'tempnam']: if hasattr(_os, name): locals()[name] = _mk_single_with_return(name) def _mk_query(name): original = getattr(_os, name) def wrap(self, *args, **kw): retval = original(*args, **kw) if self._active: return self._remap_output(name, retval) return retval return wrap for name in ['getcwd', 'tmpnam']: if hasattr(_os, name): locals()[name] = _mk_query(name) def _validate_path(self, path): """Called to remap or validate any path, whether input or output""" return path def _remap_input(self, operation, path, *args, **kw): """Called for path inputs""" return self._validate_path(path) def _remap_output(self, operation, path): """Called for path outputs""" return self._validate_path(path) def _remap_pair(self, operation, src, dst, *args, **kw): """Called for path pairs like rename, link, and symlink operations""" return ( self._remap_input(operation + '-from', src, *args, **kw), self._remap_input(operation + '-to', dst, *args, **kw) ) if hasattr(os, 'devnull'): _EXCEPTIONS = [os.devnull,] else: _EXCEPTIONS = [] class DirectorySandbox(AbstractSandbox): """Restrict operations to a single subdirectory - pseudo-chroot""" write_ops = dict.fromkeys([ "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", ]) _exception_patterns = [ # Allow lib2to3 to attempt to save a pickled grammar object (#121) r'.*lib2to3.*\.pickle$', ] "exempt writing to paths that match the pattern" def __init__(self, sandbox, exceptions=_EXCEPTIONS): self._sandbox = os.path.normcase(os.path.realpath(sandbox)) self._prefix = os.path.join(self._sandbox, '') self._exceptions = [ os.path.normcase(os.path.realpath(path)) for path in exceptions ] AbstractSandbox.__init__(self) def _violation(self, operation, *args, **kw): from setuptools.sandbox import SandboxViolation raise SandboxViolation(operation, args, kw) if _file: def _file(self, path, mode='r', *args, **kw): if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): self._violation("file", path, mode, *args, **kw) return _file(path, mode, *args, **kw) def _open(self, path, mode='r', *args, **kw): if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): self._violation("open", path, mode, *args, **kw) return _open(path, mode, *args, **kw) def tmpnam(self): self._violation("tmpnam") def _ok(self, path): active = self._active try: self._active = False realpath = os.path.normcase(os.path.realpath(path)) return ( self._exempted(realpath) or realpath == self._sandbox or realpath.startswith(self._prefix) ) finally: self._active = active def _exempted(self, filepath): start_matches = ( filepath.startswith(exception) for exception in self._exceptions ) pattern_matches = ( re.match(pattern, filepath) for pattern in self._exception_patterns ) candidates = itertools.chain(start_matches, pattern_matches) return any(candidates) def _remap_input(self, operation, path, *args, **kw): """Called for path inputs""" if operation in self.write_ops and not self._ok(path): self._violation(operation, os.path.realpath(path), *args, **kw) return path def _remap_pair(self, operation, src, dst, *args, **kw): """Called for path pairs like rename, link, and symlink operations""" if not self._ok(src) or not self._ok(dst): self._violation(operation, src, dst, *args, **kw) return (src, dst) def open(self, file, flags, mode=0o777, *args, **kw): """Called for low-level os.open()""" if flags & WRITE_FLAGS and not self._ok(file): self._violation("os.open", file, flags, mode, *args, **kw) return _os.open(file, flags, mode, *args, **kw) WRITE_FLAGS = functools.reduce( operator.or_, [getattr(_os, a, 0) for a in "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] ) class SandboxViolation(DistutilsError): """A setup script attempted to modify the filesystem outside the sandbox""" tmpl = textwrap.dedent(""" SandboxViolation: {cmd}{args!r} {kwargs} The package setup script has attempted to modify files on your system that are not within the EasyInstall build area, and has been aborted. This package cannot be safely installed by EasyInstall, and may not support alternate installation locations even if you run its setup script by hand. Please inform the package's author and the EasyInstall maintainers to find out if a fix or workaround is available. """).lstrip() def __str__(self): cmd, args, kwargs = self.args return self.tmpl.format(**locals()) PK! script (dev).tmplnu[# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r __requires__ = %(spec)r __import__('pkg_resources').require(%(spec)r) __file__ = %(dev_path)r exec(compile(open(__file__).read(), __file__, 'exec')) PK!3 script.tmplnu[# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r __requires__ = %(spec)r __import__('pkg_resources').run_script(%(spec)r, %(script_name)r) PK!  site-patch.pynu[def __boot(): import sys import os PYTHONPATH = os.environ.get('PYTHONPATH') if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): PYTHONPATH = [] else: PYTHONPATH = PYTHONPATH.split(os.pathsep) pic = getattr(sys, 'path_importer_cache', {}) stdpath = sys.path[len(PYTHONPATH):] mydir = os.path.dirname(__file__) for item in stdpath: if item == mydir or not item: continue # skip if current dir. on Windows, or my own directory importer = pic.get(item) if importer is not None: loader = importer.find_module('site') if loader is not None: # This should actually reload the current module loader.load_module('site') break else: try: import imp # Avoid import loop in Python >= 3.3 stream, path, descr = imp.find_module('site', [item]) except ImportError: continue if stream is None: continue try: # This should actually reload the current module imp.load_module('site', stream, path, descr) finally: stream.close() break else: raise ImportError("Couldn't find the real 'site' module") known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp oldpos = getattr(sys, '__egginsert', 0) # save old insertion position sys.__egginsert = 0 # and reset the current one for item in PYTHONPATH: addsitedir(item) sys.__egginsert += oldpos # restore effective old position d, nd = makepath(stdpath[0]) insert_at = None new_path = [] for item in sys.path: p, np = makepath(item) if np == nd and insert_at is None: # We've hit the first 'system' path entry, so added entries go here insert_at = len(new_path) if np in known_paths or insert_at is None: new_path.append(item) else: # new path after the insert point, back-insert it new_path.insert(insert_at, item) insert_at += 1 sys.path[:] = new_path if __name__ == 'site': __boot() del __boot PK![N,!,!ssl_support.pynu[import os import socket import atexit import re import functools from setuptools.extern.six.moves import urllib, http_client, map, filter from pkg_resources import ResolutionError, ExtractionError try: import ssl except ImportError: ssl = None __all__ = [ 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', 'opener_for' ] cert_paths = """ /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt /usr/share/ssl/certs/ca-bundle.crt /usr/local/share/certs/ca-root.crt /etc/ssl/cert.pem /System/Library/OpenSSL/certs/cert.pem /usr/local/share/certs/ca-root-nss.crt /etc/ssl/ca-bundle.pem """.strip().split() try: HTTPSHandler = urllib.request.HTTPSHandler HTTPSConnection = http_client.HTTPSConnection except AttributeError: HTTPSHandler = HTTPSConnection = object is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) try: from ssl import CertificateError, match_hostname except ImportError: try: from backports.ssl_match_hostname import CertificateError from backports.ssl_match_hostname import match_hostname except ImportError: CertificateError = None match_hostname = None if not CertificateError: class CertificateError(ValueError): pass if not match_hostname: def _dnsname_match(dn, hostname, max_wildcards=1): """Matching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 """ pats = [] if not dn: return False # Ported from python3-syntax: # leftmost, *remainder = dn.split(r'.') parts = dn.split(r'.') leftmost = parts[0] remainder = parts[1:] wildcards = leftmost.count('*') if wildcards > max_wildcards: # Issue #17980: avoid denials of service by refusing more # than one wildcard per fragment. A survey of established # policy among SSL implementations showed it to be a # reasonable choice. raise CertificateError( "too many wildcards in certificate DNS name: " + repr(dn)) # speed up common case w/o wildcards if not wildcards: return dn.lower() == hostname.lower() # RFC 6125, section 6.4.3, subitem 1. # The client SHOULD NOT attempt to match a presented identifier in which # the wildcard character comprises a label other than the left-most label. if leftmost == '*': # When '*' is a fragment by itself, it matches a non-empty dotless # fragment. pats.append('[^.]+') elif leftmost.startswith('xn--') or hostname.startswith('xn--'): # RFC 6125, section 6.4.3, subitem 3. # The client SHOULD NOT attempt to match a presented identifier # where the wildcard character is embedded within an A-label or # U-label of an internationalized domain name. pats.append(re.escape(leftmost)) else: # Otherwise, '*' matches any dotless string, e.g. www* pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) # add the remaining fragments, ignore any wildcards for frag in remainder: pats.append(re.escape(frag)) pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) return pat.match(hostname) def match_hostname(cert, hostname): """Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. """ if not cert: raise ValueError("empty or no certificate") dnsnames = [] san = cert.get('subjectAltName', ()) for key, value in san: if key == 'DNS': if _dnsname_match(value, hostname): return dnsnames.append(value) if not dnsnames: # The subject is only checked when there is no dNSName entry # in subjectAltName for sub in cert.get('subject', ()): for key, value in sub: # XXX according to RFC 2818, the most specific Common Name # must be used. if key == 'commonName': if _dnsname_match(value, hostname): return dnsnames.append(value) if len(dnsnames) > 1: raise CertificateError("hostname %r " "doesn't match either of %s" % (hostname, ', '.join(map(repr, dnsnames)))) elif len(dnsnames) == 1: raise CertificateError("hostname %r " "doesn't match %r" % (hostname, dnsnames[0])) else: raise CertificateError("no appropriate commonName or " "subjectAltName fields were found") class VerifyingHTTPSHandler(HTTPSHandler): """Simple verifying handler: no auth, subclasses, timeouts, etc.""" def __init__(self, ca_bundle): self.ca_bundle = ca_bundle HTTPSHandler.__init__(self) def https_open(self, req): return self.do_open( lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req ) class VerifyingHTTPSConn(HTTPSConnection): """Simple verifying connection: no auth, subclasses, timeouts, etc.""" def __init__(self, host, ca_bundle, **kw): HTTPSConnection.__init__(self, host, **kw) self.ca_bundle = ca_bundle def connect(self): sock = socket.create_connection( (self.host, self.port), getattr(self, 'source_address', None) ) # Handle the socket if a (proxy) tunnel is present if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): self.sock = sock self._tunnel() # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 # change self.host to mean the proxy server host when tunneling is # being used. Adapt, since we are interested in the destination # host for the match_hostname() comparison. actual_host = self._tunnel_host else: actual_host = self.host if hasattr(ssl, 'create_default_context'): ctx = ssl.create_default_context(cafile=self.ca_bundle) self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) else: # This is for python < 2.7.9 and < 3.4? self.sock = ssl.wrap_socket( sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle ) try: match_hostname(self.sock.getpeercert(), actual_host) except CertificateError: self.sock.shutdown(socket.SHUT_RDWR) self.sock.close() raise def opener_for(ca_bundle=None): """Get a urlopen() replacement that uses ca_bundle for verification""" return urllib.request.build_opener( VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) ).open # from jaraco.functools def once(func): @functools.wraps(func) def wrapper(*args, **kwargs): if not hasattr(func, 'always_returns'): func.always_returns = func(*args, **kwargs) return func.always_returns return wrapper @once def get_win_certfile(): try: import wincertstore except ImportError: return None class CertFile(wincertstore.CertFile): def __init__(self): super(CertFile, self).__init__() atexit.register(self.close) def close(self): try: super(CertFile, self).close() except OSError: pass _wincerts = CertFile() _wincerts.addstore('CA') _wincerts.addstore('ROOT') return _wincerts.name def find_ca_bundle(): """Return an existing CA bundle path, or None""" extant_cert_paths = filter(os.path.isfile, cert_paths) return ( get_win_certfile() or next(extant_cert_paths, None) or _certifi_where() ) def _certifi_where(): try: return __import__('certifi').where() except (ImportError, ResolutionError, ExtractionError): pass PK!Bךunicode_utils.pynu[import unicodedata import sys from setuptools.extern import six # HFS Plus uses decomposed UTF-8 def decompose(path): if isinstance(path, six.text_type): return unicodedata.normalize('NFD', path) try: path = path.decode('utf-8') path = unicodedata.normalize('NFD', path) path = path.encode('utf-8') except UnicodeError: pass # Not UTF-8 return path def filesys_decode(path): """ Ensure that the given path is decoded, NONE when no expected encoding works """ if isinstance(path, six.text_type): return path fs_enc = sys.getfilesystemencoding() or 'utf-8' candidates = fs_enc, 'utf-8' for enc in candidates: try: return path.decode(enc) except UnicodeDecodeError: continue def try_encode(string, enc): "turn unicode encoding into a functional routine" try: return string.encode(enc) except UnicodeEncodeError: return None PK!HLb version.pynu[import pkg_resources try: __version__ = pkg_resources.get_distribution('setuptools').version except Exception: __version__ = 'unknown' PK!FI>>wheel.pynu['''Wheels support.''' from distutils.util import get_platform import email import itertools import os import re import zipfile from pkg_resources import Distribution, PathMetadata, parse_version from setuptools.extern.six import PY3 from setuptools import Distribution as SetuptoolsDistribution from setuptools import pep425tags from setuptools.command.egg_info import write_requirements WHEEL_NAME = re.compile( r"""^(?P.+?)-(?P\d.*?) ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) )\.whl$""", re.VERBOSE).match NAMESPACE_PACKAGE_INIT = '''\ try: __import__('pkg_resources').declare_namespace(__name__) except ImportError: __path__ = __import__('pkgutil').extend_path(__path__, __name__) ''' def unpack(src_dir, dst_dir): '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' for dirpath, dirnames, filenames in os.walk(src_dir): subdir = os.path.relpath(dirpath, src_dir) for f in filenames: src = os.path.join(dirpath, f) dst = os.path.join(dst_dir, subdir, f) os.renames(src, dst) for n, d in reversed(list(enumerate(dirnames))): src = os.path.join(dirpath, d) dst = os.path.join(dst_dir, subdir, d) if not os.path.exists(dst): # Directory does not exist in destination, # rename it and prune it from os.walk list. os.renames(src, dst) del dirnames[n] # Cleanup. for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): assert not filenames os.rmdir(dirpath) class Wheel(object): def __init__(self, filename): match = WHEEL_NAME(os.path.basename(filename)) if match is None: raise ValueError('invalid wheel name: %r' % filename) self.filename = filename for k, v in match.groupdict().items(): setattr(self, k, v) def tags(self): '''List tags (py_version, abi, platform) supported by this wheel.''' return itertools.product(self.py_version.split('.'), self.abi.split('.'), self.platform.split('.')) def is_compatible(self): '''Is the wheel is compatible with the current platform?''' supported_tags = pep425tags.get_supported() return next((True for t in self.tags() if t in supported_tags), False) def egg_name(self): return Distribution( project_name=self.project_name, version=self.version, platform=(None if self.platform == 'any' else get_platform()), ).egg_name() + '.egg' def install_as_egg(self, destination_eggdir): '''Install wheel as an egg directory.''' with zipfile.ZipFile(self.filename) as zf: dist_basename = '%s-%s' % (self.project_name, self.version) dist_info = '%s.dist-info' % dist_basename dist_data = '%s.data' % dist_basename def get_metadata(name): with zf.open('%s/%s' % (dist_info, name)) as fp: value = fp.read().decode('utf-8') if PY3 else fp.read() return email.parser.Parser().parsestr(value) wheel_metadata = get_metadata('WHEEL') dist_metadata = get_metadata('METADATA') # Check wheel format version is supported. wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) if not parse_version('1.0') <= wheel_version < parse_version('2.0dev0'): raise ValueError('unsupported wheel format version: %s' % wheel_version) # Extract to target directory. os.mkdir(destination_eggdir) zf.extractall(destination_eggdir) # Convert metadata. dist_info = os.path.join(destination_eggdir, dist_info) dist = Distribution.from_location( destination_eggdir, dist_info, metadata=PathMetadata(destination_eggdir, dist_info) ) # Note: we need to evaluate and strip markers now, # as we can't easily convert back from the syntax: # foobar; "linux" in sys_platform and extra == 'test' def raw_req(req): req.marker = None return str(req) install_requires = list(sorted(map(raw_req, dist.requires()))) extras_require = { extra: list(sorted( req for req in map(raw_req, dist.requires((extra,))) if req not in install_requires )) for extra in dist.extras } egg_info = os.path.join(destination_eggdir, 'EGG-INFO') os.rename(dist_info, egg_info) os.rename(os.path.join(egg_info, 'METADATA'), os.path.join(egg_info, 'PKG-INFO')) setup_dist = SetuptoolsDistribution(attrs=dict( install_requires=install_requires, extras_require=extras_require, )) write_requirements(setup_dist.get_command_obj('egg_info'), None, os.path.join(egg_info, 'requires.txt')) # Move data entries to their correct location. dist_data = os.path.join(destination_eggdir, dist_data) dist_data_scripts = os.path.join(dist_data, 'scripts') if os.path.exists(dist_data_scripts): egg_info_scripts = os.path.join(destination_eggdir, 'EGG-INFO', 'scripts') os.mkdir(egg_info_scripts) for entry in os.listdir(dist_data_scripts): # Remove bytecode, as it's not properly handled # during easy_install scripts install phase. if entry.endswith('.pyc'): os.unlink(os.path.join(dist_data_scripts, entry)) else: os.rename(os.path.join(dist_data_scripts, entry), os.path.join(egg_info_scripts, entry)) os.rmdir(dist_data_scripts) for subdir in filter(os.path.exists, ( os.path.join(dist_data, d) for d in ('data', 'headers', 'purelib', 'platlib') )): unpack(subdir, destination_eggdir) if os.path.exists(dist_data): os.rmdir(dist_data) # Fix namespace packages. namespace_packages = os.path.join(egg_info, 'namespace_packages.txt') if os.path.exists(namespace_packages): with open(namespace_packages) as fp: namespace_packages = fp.read().split() for mod in namespace_packages: mod_dir = os.path.join(destination_eggdir, *mod.split('.')) mod_init = os.path.join(mod_dir, '__init__.py') if os.path.exists(mod_dir) and not os.path.exists(mod_init): with open(mod_init, 'w') as fp: fp.write(NAMESPACE_PACKAGE_INIT) PK! windows_support.pynu[import platform import ctypes def windows_only(func): if platform.system() != 'Windows': return lambda *args, **kwargs: None return func @windows_only def hide_file(path): """ Set the hidden attribute on a file or directory. From http://stackoverflow.com/questions/19622133/ `path` must be text. """ __import__('ctypes.wintypes') SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD SetFileAttributes.restype = ctypes.wintypes.BOOL FILE_ATTRIBUTE_HIDDEN = 0x02 ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) if not ret: raise ctypes.WinError() PK!j! __init__.pycnu[ fc@sdZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z ddl ZddlmZddlmZmZddlmZd d lmZd d d ddddgZejjZdZeZdgZde fdYZ!de!fdYZ"e!j#Z$dZ%dZ&ej'j&je&_ej(ej'j)Z*de*fdYZ)dZ+ej,dZ-ej.dS(s@Extensions to the 'distutils' for large or complex distributionsiN(t convert_path(t fnmatchcase(tfiltertmap(t Extension(t DistributiontFeature(tRequirei(tmonkeytsetupRRtCommandRRt find_packagess lib2to3.fixest PackageFindercBsSeZdZeddddZedZedZedZRS( sI Generate a list of all Python packages found within a directory t.t*cCs7t|jt||jdd||j|S(s Return a list all Python packages found within directory 'where' 'where' is the root directory which will be searched for packages. It should be supplied as a "cross-platform" (i.e. URL-style) path; it will be converted to the appropriate local path syntax. 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). 'include' is a sequence of package names to include. If it's specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. tez_setups *__pycache__(tlistt_find_packages_iterRt _build_filter(tclstwheretexcludetinclude((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfind's  c csxtj|dtD]\}}}|}g|(x|D]}tjj||} tjj| |} | jtjjd} d|ks:|j|  rq:n|| r||  r| Vn|j |q:WqWdS(sy All the packages found in 'where' that pass the 'include' filter, but not the 'exclude' filter. t followlinksR N( tostwalktTruetpathtjointrelpathtreplacetsept_looks_like_packagetappend( RRRRtroottdirstfilestall_dirstdirt full_pathtrel_pathtpackage((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR>s% cCstjjtjj|dS(s%Does a directory look like a package?s __init__.py(RRtisfileR(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!Zscs fdS(s Given a list of patterns, return a callable that will be true only if the input matches at least one of the patterns. cstfdDS(Nc3s!|]}td|VqdS(tpatN(R(t.0R,(tname(s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys es(tany(R.(tpatterns(R.s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytet((R0((R0s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR_s((R( t__name__t __module__t__doc__t classmethodRRt staticmethodR!R(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR "s tPEP420PackageFindercBseZedZRS(cCstS(N(R(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!is(R3R4R7R!(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR8hscCsXtjjtd|jD}|jdt|jrT|j|jndS(Ncss-|]#\}}|dkr||fVqdS(tdependency_linkstsetup_requiresN(R9R:((R-tktv((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys us tignore_option_errors( t distutilstcoreRtdicttitemstparse_config_filesRR:tfetch_build_eggs(tattrstdist((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_install_setup_requiresqs   cKst|tjj|S(N(RFR>R?R (RD((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR ~s cBs,eZejZeZdZddZRS(cKs'tj||t|j|dS(sj Construct the command for dist, updating vars(self) with any keyword parameters. N(t_Commandt__init__tvarstupdate(tselfREtkw((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRHsicKs,tj|||}t|j||S(N(RGtreinitialize_commandRIRJ(RKtcommandtreinit_subcommandsRLtcmd((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRMs(R3R4RGR5tFalsetcommand_consumes_argumentsRHRM(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR s  cCs2dtj|dtD}ttjj|S(s% Find all files under 'path' css:|]0\}}}|D]}tjj||VqqdS(N(RRR(R-tbaseR$R%tfile((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys s R(RRRRRR+(Rtresults((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_find_all_simplescCsRt|}|tjkrHtjtjjd|}t||}nt|S(s Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. tstart( RVRtcurdirt functoolstpartialRRRR(R'R%tmake_rel((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfindalls  (/R5RRYtdistutils.coreR>tdistutils.filelisttdistutils.utilRtfnmatchRtsetuptools.extern.six.movesRRtsetuptools.versiont setuptoolstsetuptools.extensionRtsetuptools.distRRtsetuptools.dependsRR2Rt__all__tversiont __version__tNonetbootstrap_install_fromRtrun_2to3_on_docteststlib2to3_fixer_packagestobjectR R8RR RFR R?t get_unpatchedR RGRVRXR\t patch_all(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyts:        F    PK!90_vendor/packaging/__about__.pycnu[ fc@`srddlmZmZmZdddddddd gZd Zd Zd Zd ZdZ dZ dZ de Z dS(i(tabsolute_importtdivisiontprint_functiont __title__t __summary__t__uri__t __version__t __author__t __email__t __license__t __copyright__t packagings"Core utilities for Python packagess!https://github.com/pypa/packagings16.8s)Donald Stufft and individual contributorssdonald@stufft.ios"BSD or Apache License, Version 2.0sCopyright 2014-2016 %sN( t __future__RRRt__all__RRRRRRR R (((sJ/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pytsPK!90_vendor/packaging/__about__.pyonu[ fc@`srddlmZmZmZdddddddd gZd Zd Zd Zd ZdZ dZ dZ de Z dS(i(tabsolute_importtdivisiontprint_functiont __title__t __summary__t__uri__t __version__t __author__t __email__t __license__t __copyright__t packagings"Core utilities for Python packagess!https://github.com/pypa/packagings16.8s)Donald Stufft and individual contributorssdonald@stufft.ios"BSD or Apache License, Version 2.0sCopyright 2014-2016 %sN( t __future__RRRt__all__RRRRRRR R (((sJ/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pytsPK!kVFcc_vendor/packaging/__init__.pycnu[ fc@`sxddlmZmZmZddlmZmZmZmZm Z m Z m Z m Z dddddd d d gZ d S( i(tabsolute_importtdivisiontprint_functioni(t __author__t __copyright__t __email__t __license__t __summary__t __title__t__uri__t __version__RRR R RRRRN(t __future__RRRt __about__RRRRRRR R t__all__(((sI/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyts:PK!kVFcc_vendor/packaging/__init__.pyonu[ fc@`sxddlmZmZmZddlmZmZmZmZm Z m Z m Z m Z dddddd d d gZ d S( i(tabsolute_importtdivisiontprint_functioni(t __author__t __copyright__t __email__t __license__t __summary__t __title__t__uri__t __version__RRR R RRRRN(t __future__RRRt __about__RRRRRRR R t__all__(((sI/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyts:PK!f_vendor/packaging/_compat.pycnu[ fc@`svddlmZmZmZddlZejddkZejddkZer`efZ n e fZ dZ dS(i(tabsolute_importtdivisiontprint_functionNiic`s5dffdY}tj|ddiS(s/ Create a base class with a metaclass. t metaclassc`seZfdZRS(c`s||S(N((tclstnamet this_basestd(tbasestmeta(sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyt__new__s(t__name__t __module__R ((RR (sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyRsttemporary_class((ttypeR (R RR((RR sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pytwith_metaclasss( t __future__RRRtsyst version_infotPY2tPY3tstrt string_typest basestringR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyts   PK!f_vendor/packaging/_compat.pyonu[ fc@`svddlmZmZmZddlZejddkZejddkZer`efZ n e fZ dZ dS(i(tabsolute_importtdivisiontprint_functionNiic`s5dffdY}tj|ddiS(s/ Create a base class with a metaclass. t metaclassc`seZfdZRS(c`s||S(N((tclstnamet this_basestd(tbasestmeta(sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyt__new__s(t__name__t __module__R ((RR (sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyRsttemporary_class((ttypeR (R RR((RR sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pytwith_metaclasss( t __future__RRRtsyst version_infotPY2tPY3tstrt string_typest basestringR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyts   PK!HJMM!_vendor/packaging/_structures.pycnu[ fc@`s^ddlmZmZmZdefdYZeZdefdYZeZdS(i(tabsolute_importtdivisiontprint_functiontInfinitycB`sYeZdZdZdZdZdZdZdZdZ dZ RS( cC`sdS(NR((tself((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__repr__ scC`stt|S(N(thashtrepr(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__hash__ scC`stS(N(tFalse(Rtother((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__lt__scC`stS(N(R (RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__le__scC`st||jS(N(t isinstancet __class__(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__eq__scC`st||j S(N(R R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ne__scC`stS(N(tTrue(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__gt__scC`stS(N(R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ge__scC`stS(N(tNegativeInfinity(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__neg__!s( t__name__t __module__RRR R RRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRs        RcB`sYeZdZdZdZdZdZdZdZdZ dZ RS( cC`sdS(Ns -Infinity((R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR)scC`stt|S(N(RR(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR,scC`stS(N(R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR /scC`stS(N(R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR 2scC`st||jS(N(R R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR5scC`st||j S(N(R R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR8scC`stS(N(R (RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR;scC`stS(N(R (RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR>scC`stS(N(R(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRAs( RRRRR R RRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR's        N(t __future__RRRtobjectRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyts PK!HJMM!_vendor/packaging/_structures.pyonu[ fc@`s^ddlmZmZmZdefdYZeZdefdYZeZdS(i(tabsolute_importtdivisiontprint_functiontInfinitycB`sYeZdZdZdZdZdZdZdZdZ dZ RS( cC`sdS(NR((tself((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__repr__ scC`stt|S(N(thashtrepr(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__hash__ scC`stS(N(tFalse(Rtother((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__lt__scC`stS(N(R (RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__le__scC`st||jS(N(t isinstancet __class__(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__eq__scC`st||j S(N(R R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ne__scC`stS(N(tTrue(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__gt__scC`stS(N(R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ge__scC`stS(N(tNegativeInfinity(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__neg__!s( t__name__t __module__RRR R RRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRs        RcB`sYeZdZdZdZdZdZdZdZdZ dZ RS( cC`sdS(Ns -Infinity((R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR)scC`stt|S(N(RR(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR,scC`stS(N(R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR /scC`stS(N(R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR 2scC`st||jS(N(R R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR5scC`st||j S(N(R R(RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR8scC`stS(N(R (RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR;scC`stS(N(R (RR ((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR>scC`stS(N(R(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRAs( RRRRR R RRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR's        N(t __future__RRRtobjectRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyts PK!:=.._vendor/packaging/markers.pycnu[ fc@`suddlmZmZmZddlZddlZddlZddlZddlm Z m Z m Z m Z ddlm Z mZmZmZddlmZddlmZddlmZmZd d d d d gZd efdYZd efdYZd efdYZdefdYZdefdYZdefdYZ defdYZ!ededBedBedBedBedBedBed Bed!Bed"Bed#Bed$Bed%Bed&Bed'Bed(Bed)Bed*BZ"id#d$6d"d%6dd&6dd'6dd(6dd)6Z#e"j$d+ed,ed-Bed.Bed/Bed0Bed1Bed2Bed3BZ%e%ed4Bed5BZ&e&j$d6ed7ed8BZ'e'j$d9ed:ed;BZ(e"e'BZ)ee)e&e)Z*e*j$d<ed=j+Z,ed>j+Z-eZ.e*ee,e.e-BZ/e.e/e e(e.>e e.e Z0d?Z1e2d@Z3idAd56dBd46ej4d36ej5d/6ej6d-6ej7d06ej8d.6ej9d26Z:dCZ;eZ<dDZ=dEZ>dFZ?dGZ@d efdHYZAdS(Ii(tabsolute_importtdivisiontprint_functionN(tParseExceptiont ParseResultst stringStartt stringEnd(t ZeroOrMoretGrouptForwardt QuotedString(tLiterali(t string_types(t SpecifiertInvalidSpecifiert InvalidMarkertUndefinedComparisontUndefinedEnvironmentNametMarkertdefault_environmentcB`seZdZRS(sE An invalid marker was found, users should refer to PEP 508. (t__name__t __module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(sP An invalid operation was attempted on a value that doesn't support it. (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(s\ A name was attempted to be used that does not exist inside of the environment. (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR%stNodecB`s,eZdZdZdZdZRS(cC`s ||_dS(N(tvalue(tselfR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__init__.scC`s t|jS(N(tstrR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__str__1scC`sdj|jjt|S(Ns <{0}({1!r})>(tformatt __class__RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__repr__4scC`s tdS(N(tNotImplementedError(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt serialize7s(RRRRRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR,s   tVariablecB`seZdZRS(cC`s t|S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!=s(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR";stValuecB`seZdZRS(cC`s dj|S(Ns"{0}"(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Cs(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR#AstOpcB`seZdZRS(cC`s t|S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Is(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR$Gstimplementation_versiontplatform_python_implementationtimplementation_nametpython_full_versiontplatform_releasetplatform_versiontplatform_machinetplatform_systemtpython_versiont sys_platformtos_namesos.names sys.platformsplatform.versionsplatform.machinesplatform.python_implementationtpython_implementationtextracC`sttj|d|dS(Ni(R"tALIASEStget(tstltt((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytits===s==s>=s<=s!=s~=t>tst RARB( RCtlistR@R tAssertionErrortlenRHtjoinR!(tmarkerRGtinnerRK((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRHs! &cC`s ||kS(N((tlhstrhs((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7R8cC`s ||kS(N((RSRT((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7R8cC`sy%tdj|j|g}Wntk r8nX|j|Stj|j}|dkrtdj |||n|||S(NR8s#Undefined {0!r} on {1!r} and {2!r}.( R RPR!Rtcontainst _operatorsR3tNoneRR(RStopRTtspectoper((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_eval_ops%   cC`s:|j|t}|tkr6tdj|n|S(Ns/{0!r} does not exist in evaluation environment.(R3t _undefinedRR(t environmenttnameR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_get_envs  c C`s,gg}x |D]}t|tttfs4tt|tr`|djt||qt|tr|\}}}t|trt||j }|j }n|j }t||j }|djt |||q|dkst|dkr|jgqqWt d|DS(NiR>R?cs`s|]}t|VqdS(N(tall(RJtitem((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pys s(R>R?( RCRMR@R RNtappendt_evaluate_markersR"R_RR[tany( tmarkersR]tgroupsRQRSRXRTt lhs_valuet rhs_value((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRcs"      cC`sFdj|}|j}|dkrB||dt|j7}n|S(Ns{0.major}.{0.minor}.{0.micro}tfinali(Rt releaselevelRtserial(tinfotversiontkind((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytformat_full_versions   cC`sttdr0ttjj}tjj}n d}d}i |d6|d6tjd6tjd6tj d6tj d 6tjd 6tj d 6tj d 6tj d d6tjd6S(Ntimplementationt0R8R'R%R/R+R)R,R*R(R&iR-R.( thasattrtsysRoRpRmR^tostplatformtmachinetreleasetsystemR-R0(tiverR'((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs"       cB`s/eZdZdZdZddZRS(cC`seyttj||_WnBtk r`}dj|||j|jd!}t|nXdS(Ns+Invalid marker: {0!r}, parse error at {1!r}i(RDtMARKERt parseStringt_markersRRtlocR(RRQteterr_str((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs cC`s t|jS(N(RHR|(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`sdjt|S(Ns(RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`s5t}|dk r%|j|nt|j|S(s$Evaluate a marker. Return the boolean from evaluating the given marker against the environment. environment is an optional argument to override all or part of the determined environment. The environment is determined from the current Python process. N(RRWtupdateRcR|(RR]tcurrent_environment((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytevaluate s  N(RRRRRRWR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs   (Bt __future__RRRtoperatorRtRuRstsetuptools.extern.pyparsingRRRRRRR R R tLt_compatR t specifiersR Rt__all__t ValueErrorRRRtobjectRR"R#R$tVARIABLER2tsetParseActiont VERSION_CMPt MARKER_OPt MARKER_VALUEtBOOLOPt MARKER_VARt MARKER_ITEMtsuppresstLPARENtRPARENt MARKER_EXPRt MARKER_ATOMRzRDtTrueRHtlttleteqtnetgetgtRVR[R\R_RcRoRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyts|    ""     E                  PK!-.-._vendor/packaging/markers.pyonu[ fc@`suddlmZmZmZddlZddlZddlZddlZddlm Z m Z m Z m Z ddlm Z mZmZmZddlmZddlmZddlmZmZd d d d d gZd efdYZd efdYZd efdYZdefdYZdefdYZdefdYZ defdYZ!ededBedBedBedBedBedBed Bed!Bed"Bed#Bed$Bed%Bed&Bed'Bed(Bed)Bed*BZ"id#d$6d"d%6dd&6dd'6dd(6dd)6Z#e"j$d+ed,ed-Bed.Bed/Bed0Bed1Bed2Bed3BZ%e%ed4Bed5BZ&e&j$d6ed7ed8BZ'e'j$d9ed:ed;BZ(e"e'BZ)ee)e&e)Z*e*j$d<ed=j+Z,ed>j+Z-eZ.e*ee,e.e-BZ/e.e/e e(e.>e e.e Z0d?Z1e2d@Z3idAd56dBd46ej4d36ej5d/6ej6d-6ej7d06ej8d.6ej9d26Z:dCZ;eZ<dDZ=dEZ>dFZ?dGZ@d efdHYZAdS(Ii(tabsolute_importtdivisiontprint_functionN(tParseExceptiont ParseResultst stringStartt stringEnd(t ZeroOrMoretGrouptForwardt QuotedString(tLiterali(t string_types(t SpecifiertInvalidSpecifiert InvalidMarkertUndefinedComparisontUndefinedEnvironmentNametMarkertdefault_environmentcB`seZdZRS(sE An invalid marker was found, users should refer to PEP 508. (t__name__t __module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(sP An invalid operation was attempted on a value that doesn't support it. (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(s\ A name was attempted to be used that does not exist inside of the environment. (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR%stNodecB`s,eZdZdZdZdZRS(cC`s ||_dS(N(tvalue(tselfR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__init__.scC`s t|jS(N(tstrR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__str__1scC`sdj|jjt|S(Ns <{0}({1!r})>(tformatt __class__RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__repr__4scC`s tdS(N(tNotImplementedError(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt serialize7s(RRRRRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR,s   tVariablecB`seZdZRS(cC`s t|S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!=s(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR";stValuecB`seZdZRS(cC`s dj|S(Ns"{0}"(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Cs(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR#AstOpcB`seZdZRS(cC`s t|S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Is(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR$Gstimplementation_versiontplatform_python_implementationtimplementation_nametpython_full_versiontplatform_releasetplatform_versiontplatform_machinetplatform_systemtpython_versiont sys_platformtos_namesos.names sys.platformsplatform.versionsplatform.machinesplatform.python_implementationtpython_implementationtextracC`sttj|d|dS(Ni(R"tALIASEStget(tstltt((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytits===s==s>=s<=s!=s~=t>tst RARB(RCtlisttlenR@RHtjoinR!(tmarkerRGtinnerRK((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRHs! &cC`s ||kS(N((tlhstrhs((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7R8cC`s ||kS(N((RRRS((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7R8cC`sy%tdj|j|g}Wntk r8nX|j|Stj|j}|dkrtdj |||n|||S(NR8s#Undefined {0!r} on {1!r} and {2!r}.( R ROR!Rtcontainst _operatorsR3tNoneRR(RRtopRStspectoper((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_eval_ops%   cC`s:|j|t}|tkr6tdj|n|S(Ns/{0!r} does not exist in evaluation environment.(R3t _undefinedRR(t environmenttnameR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_get_envs  c C`sgg}x|D]}t|trB|djt||qt|tr|\}}}t|trt||j}|j}n|j}t||j}|djt|||q|dkr|jgqqWt d|DS(NiR?cs`s|]}t|VqdS(N(tall(RJtitem((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pys s( RCRMtappendt_evaluate_markersR@R"R^RRZtany( tmarkersR\tgroupsRPRRRWRSt lhs_valuet rhs_value((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRbs      cC`sFdj|}|j}|dkrB||dt|j7}n|S(Ns{0.major}.{0.minor}.{0.micro}tfinali(Rt releaselevelRtserial(tinfotversiontkind((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytformat_full_versions   cC`sttdr0ttjj}tjj}n d}d}i |d6|d6tjd6tjd6tj d6tj d 6tjd 6tj d 6tj d 6tj d d6tjd6S(Ntimplementationt0R8R'R%R/R+R)R,R*R(R&iR-R.( thasattrtsysRnRoRlR]tostplatformtmachinetreleasetsystemR-R0(tiverR'((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs"       cB`s/eZdZdZdZddZRS(cC`seyttj||_WnBtk r`}dj|||j|jd!}t|nXdS(Ns+Invalid marker: {0!r}, parse error at {1!r}i(RDtMARKERt parseStringt_markersRRtlocR(RRPteterr_str((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs cC`s t|jS(N(RHR{(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`sdjt|S(Ns(RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`s5t}|dk r%|j|nt|j|S(s$Evaluate a marker. Return the boolean from evaluating the given marker against the environment. environment is an optional argument to override all or part of the determined environment. The environment is determined from the current Python process. N(RRVtupdateRbR{(RR\tcurrent_environment((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytevaluate s  N(RRRRRRVR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs   (Bt __future__RRRtoperatorRsRtRrtsetuptools.extern.pyparsingRRRRRRR R R tLt_compatR t specifiersR Rt__all__t ValueErrorRRRtobjectRR"R#R$tVARIABLER2tsetParseActiont VERSION_CMPt MARKER_OPt MARKER_VALUEtBOOLOPt MARKER_VARt MARKER_ITEMtsuppresstLPARENtRPARENt MARKER_EXPRt MARKER_ATOMRyRDtTrueRHtlttleteqtnetgetgtRURZR[R^RbRnRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyts|    ""     E                  PK!&p,,"_vendor/packaging/requirements.pycnu[ fc@`sYddlmZmZmZddlZddlZddlmZmZm Z m Z ddlm Z m Z m Z mZmZddlmZddlmZddlmZmZdd lmZmZmZd efd YZe ejejZ ed j!Z"ed j!Z#edj!Z$edj!Z%edj!Z&edj!Z'edj!Z(e dZ)e e e)e BZ*ee e e*Z+e+dZ,e+Z-eddZ.e(e.Z/e-e e&e-Z0e"e e0e#dZ1eej2ej3ej4BZ5eej2ej3ej4BZ6e5e6AZ7ee7e e&e7ddde8dZ9e e$e9e%e9BZ:e:j;de e:dZ<e<j;de edZej;de'Z=e=eZ>e<e e>Z?e/e e>Z@e,e e1e@e?BZAeeAeZBd eCfd!YZDdS("i(tabsolute_importtdivisiontprint_functionN(t stringStartt stringEndtoriginalTextFortParseException(t ZeroOrMoretWordtOptionaltRegextCombine(tLiteral(tparsei(t MARKER_EXPRtMarker(tLegacySpecifiert Specifiert SpecifierSettInvalidRequirementcB`seZdZRS(sJ An invalid requirement was found, users should refer to PEP 508. (t__name__t __module__t__doc__(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyRst[t]t(t)t,t;t@s-_.tnames[^ ]+turltextrast joinStringtadjacentt _raw_speccC`s |jp dS(Nt(R#(tstltt((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt6R$t specifiercC`s|dS(Ni((R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(9R$tmarkercC`st||j|j!S(N(Rt_original_startt _original_end(R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(=R$t RequirementcB`s)eZdZdZdZdZRS(sParse a requirement. Parse a given requirement string into its parts, such as name, specifier, URL, and extras. Raises InvalidRequirement on a badly-formed requirement string. cC`sytj|}Wn9tk rN}tdj||j|jd!nX|j|_|jrtj|j}|j o|j s|j r|j rtdn|j|_n d|_t |j r|j jng|_ t|j|_|jr|jnd|_dS(Ns+Invalid requirement, parse error at "{0!r}"isInvalid URL given(t REQUIREMENTt parseStringRRtformattlocRRturlparsetschemetnetloctNonetsetR tasListRR)R*(tselftrequirement_stringtreqtet parsed_url((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__init__Xs"!   'cC`s|jg}|jr@|jdjdjt|jn|jrb|jt|jn|jr|jdj|jn|j r|jdj|j ndj|S(Ns[{0}]Rs@ {0}s; {0}R$( RR tappendR0tjointsortedR)tstrRR*(R8tparts((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__str__ms  +   cC`sdjt|S(Ns(R0RA(R8((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__repr__~s(RRRR=RCRD(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR-Ks  (Et __future__RRRtstringtretsetuptools.extern.pyparsingRRRRRRR R R R tLt"setuptools.extern.six.moves.urllibR R2tmarkersRRt specifiersRRRt ValueErrorRt ascii_letterstdigitstALPHANUMtsuppresstLBRACKETtRBRACKETtLPARENtRPARENtCOMMAt SEMICOLONtATt PUNCTUATIONtIDENTIFIER_ENDt IDENTIFIERtNAMEtEXTRAtURItURLt EXTRAS_LISTtEXTRASt _regex_strtVERBOSEt IGNORECASEtVERSION_PEP440tVERSION_LEGACYt VERSION_ONEtFalset VERSION_MANYt _VERSION_SPECtsetParseActiont VERSION_SPECtMARKER_SEPERATORtMARKERtVERSION_AND_MARKERtURL_AND_MARKERtNAMED_REQUIREMENTR.tobjectR-(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pytsZ  "(      PK!&p,,"_vendor/packaging/requirements.pyonu[ fc@`sYddlmZmZmZddlZddlZddlmZmZm Z m Z ddlm Z m Z m Z mZmZddlmZddlmZddlmZmZdd lmZmZmZd efd YZe ejejZ ed j!Z"ed j!Z#edj!Z$edj!Z%edj!Z&edj!Z'edj!Z(e dZ)e e e)e BZ*ee e e*Z+e+dZ,e+Z-eddZ.e(e.Z/e-e e&e-Z0e"e e0e#dZ1eej2ej3ej4BZ5eej2ej3ej4BZ6e5e6AZ7ee7e e&e7ddde8dZ9e e$e9e%e9BZ:e:j;de e:dZ<e<j;de edZej;de'Z=e=eZ>e<e e>Z?e/e e>Z@e,e e1e@e?BZAeeAeZBd eCfd!YZDdS("i(tabsolute_importtdivisiontprint_functionN(t stringStartt stringEndtoriginalTextFortParseException(t ZeroOrMoretWordtOptionaltRegextCombine(tLiteral(tparsei(t MARKER_EXPRtMarker(tLegacySpecifiert Specifiert SpecifierSettInvalidRequirementcB`seZdZRS(sJ An invalid requirement was found, users should refer to PEP 508. (t__name__t __module__t__doc__(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyRst[t]t(t)t,t;t@s-_.tnames[^ ]+turltextrast joinStringtadjacentt _raw_speccC`s |jp dS(Nt(R#(tstltt((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt6R$t specifiercC`s|dS(Ni((R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(9R$tmarkercC`st||j|j!S(N(Rt_original_startt _original_end(R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(=R$t RequirementcB`s)eZdZdZdZdZRS(sParse a requirement. Parse a given requirement string into its parts, such as name, specifier, URL, and extras. Raises InvalidRequirement on a badly-formed requirement string. cC`sytj|}Wn9tk rN}tdj||j|jd!nX|j|_|jrtj|j}|j o|j s|j r|j rtdn|j|_n d|_t |j r|j jng|_ t|j|_|jr|jnd|_dS(Ns+Invalid requirement, parse error at "{0!r}"isInvalid URL given(t REQUIREMENTt parseStringRRtformattlocRRturlparsetschemetnetloctNonetsetR tasListRR)R*(tselftrequirement_stringtreqtet parsed_url((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__init__Xs"!   'cC`s|jg}|jr@|jdjdjt|jn|jrb|jt|jn|jr|jdj|jn|j r|jdj|j ndj|S(Ns[{0}]Rs@ {0}s; {0}R$( RR tappendR0tjointsortedR)tstrRR*(R8tparts((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__str__ms  +   cC`sdjt|S(Ns(R0RA(R8((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__repr__~s(RRRR=RCRD(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR-Ks  (Et __future__RRRtstringtretsetuptools.extern.pyparsingRRRRRRR R R R tLt"setuptools.extern.six.moves.urllibR R2tmarkersRRt specifiersRRRt ValueErrorRt ascii_letterstdigitstALPHANUMtsuppresstLBRACKETtRBRACKETtLPARENtRPARENtCOMMAt SEMICOLONtATt PUNCTUATIONtIDENTIFIER_ENDt IDENTIFIERtNAMEtEXTRAtURItURLt EXTRAS_LISTtEXTRASt _regex_strtVERBOSEt IGNORECASEtVERSION_PEP440tVERSION_LEGACYt VERSION_ONEtFalset VERSION_MANYt _VERSION_SPECtsetParseActiont VERSION_SPECtMARKER_SEPERATORtMARKERtVERSION_AND_MARKERtURL_AND_MARKERtNAMED_REQUIREMENTR.tobjectR-(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pytsZ  "(      PK!b bb _vendor/packaging/specifiers.pycnu[ fc@`s<ddlmZmZmZddlZddlZddlZddlZddlm Z m Z ddl m Z m Z mZdefdYZde ejefd YZd efd YZd efd YZdZdefdYZejdZdZdZdefdYZdS(i(tabsolute_importtdivisiontprint_functionNi(t string_typestwith_metaclass(tVersiont LegacyVersiontparsetInvalidSpecifiercB`seZdZRS(sH An invalid specifier was found, users should refer to PEP 440. (t__name__t __module__t__doc__(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRst BaseSpecifiercB`seZejdZejdZejdZejdZejdZ e j dZ ejddZ ejddZ RS( cC`sdS(s Returns the str representation of this Specifier like object. This should be representative of the Specifier itself. N((tself((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__str__tcC`sdS(sF Returns a hash value for this Specifier like object. N((R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__hash__RcC`sdS(sq Returns a boolean representing whether or not the two Specifier like objects are equal. N((R tother((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__eq__$RcC`sdS(su Returns a boolean representing whether or not the two Specifier like objects are not equal. N((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__ne__+RcC`sdS(sg Returns whether or not pre-releases as a whole are allowed by this specifier. N((R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt prereleases2RcC`sdS(sd Sets whether or not pre-releases as a whole are allowed by this specifier. N((R tvalue((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR9RcC`sdS(sR Determines if the given item is contained within this specifier. N((R titemR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytcontains@RcC`sdS(s Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. N((R titerableR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytfilterFRN(R R tabctabstractmethodRRRRtabstractpropertyRtsettertNoneRR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR st_IndividualSpecifiercB`seZiZdddZdZdZdZdZdZ dZ dZ e d Z e d Ze d Zejd Zd ZddZddZRS(RcC`sj|jj|}|s0tdj|n|jdj|jdjf|_||_dS(NsInvalid specifier: '{0}'toperatortversion(t_regextsearchRtformattgrouptstript_spect _prereleases(R tspecRtmatch((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__init__Rs cC`sF|jdk r!dj|jnd}dj|jjt||S(Ns, prereleases={0!r}Rs<{0}({1!r}{2})>(R(RR$Rt __class__R tstr(R tpre((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__repr___s !  cC`sdj|jS(Ns{0}{1}(R$R'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRlscC`s t|jS(N(thashR'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRoscC`s`t|tr:y|j|}WqPtk r6tSXnt||jsPtS|j|jkS(N(t isinstanceRR,RtNotImplementedR'(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRrs cC`s`t|tr:y|j|}WqPtk r6tSXnt||jsPtS|j|jkS(N(R1RR,RR2R'(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR}s cC`st|dj|j|S(Ns _compare_{0}(tgetattrR$t _operators(R top((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt _get_operatorscC`s(t|ttfs$t|}n|S(N(R1RRR(R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_coerce_versionscC`s |jdS(Ni(R'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR scC`s |jdS(Ni(R'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR!scC`s|jS(N(R((R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s ||_dS(N(R((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s |j|S(N(R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt __contains__scC`sW|dkr|j}n|j|}|jr;| r;tS|j|j||jS(N(RRR7t is_prereleasetFalseR6R R!(R RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs   cc`st}g}i|dk r!|ntd6}xf|D]^}|j|}|j||r2|jr|pn|j r|j|qt}|Vq2q2W| r|rx|D] }|VqWndS(NR(R:RtTrueR7RR9Rtappend(R RRtyieldedtfound_prereleasestkwR!tparsed_version((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs     N(R R R4RR+R/RRRRR6R7tpropertyR R!RRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRNs       tLegacySpecifiercB`seZdZejdedejejBZidd6dd6dd6d d 6d d 6d d6ZdZ dZ dZ dZ dZ dZdZRS(s (?P(==|!=|<=|>=|<|>)) \s* (?P [^,;\s)]* # Since this is a "legacy" specifier, and the version # string can be just about anything, we match everything # except for whitespace, a semi-colon for marker support, # a closing paren since versions can be enclosed in # them, and a comma since it's a version separator. ) s^\s*s\s*$tequals==t not_equals!=tless_than_equals<=tgreater_than_equals>=t less_thantcC`s(t|ts$tt|}n|S(N(R1RR-(R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR7scC`s||j|kS(N(R7(R t prospectiveR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_not_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_than_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_than_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_thanscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_thans(R R t _regex_strtretcompiletVERBOSEt IGNORECASER"R4R7RLRMRNRORPRQ(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRBs"        c`s"tjfd}|S(Nc`s#t|tstS|||S(N(R1RR:(R RKR)(tfn(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytwrapped s(t functoolstwraps(RWRX((RWsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_require_version_compare st SpecifiercB`seZdZejdedejejBZidd6dd6dd6d d 6d d 6d d6dd6dd6Ze dZ e dZ e dZ e dZ e dZe dZe dZdZedZejdZRS(s (?P(~=|==|!=|<=|>=|<|>|===)) (?P (?: # The identity operators allow for an escape hatch that will # do an exact string match of the version you wish to install. # This will not be parsed by PEP 440 and we cannot determine # any semantic meaning from it. This operator is discouraged # but included entirely as an escape hatch. (?<====) # Only match for the identity operator \s* [^\s]* # We just match everything, except for whitespace # since we are only testing for strict identity. ) | (?: # The (non)equality operators allow for wild card and local # versions to be specified so we have to define these two # operators separately to enable that. (?<===|!=) # Only match for equals and not equals \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)* # release (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? # You cannot use a wild card and a dev or local version # together so group them with a | and make them optional. (?: (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local | \.\* # Wild card syntax of .* )? ) | (?: # The compatible operator requires at least two digits in the # release segment. (?<=~=) # Only match for the compatible operator \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release ) | (?: # All other operators only allow a sub set of what the # (non)equality operators do. Specifically they do not allow # local versions to be specified nor do they allow the prefix # matching wild cards. (?=RGRHRIRJt arbitrarys===cC`sfdjttjdt|d }|d7}|jd||oe|jd||S(Nt.cS`s|jd o|jd S(Ntposttdev(t startswith(tx((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytsis.*s>=s==(tjointlistt itertoolst takewhilet_version_splitR6(R RKR)tprefix((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_compatibles   cC`s|jdrht|j}t|d }tt|}|t| }t||\}}n't|}|jst|j}n||kS(Ns.*i(tendswithRtpublicRiR-tlent _pad_versiontlocal(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRLs  cC`s|j|| S(N(RL(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRMscC`s|t|kS(N(R(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRNscC`s|t|kS(N(R(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyROscC`sXt|}||kstS|j rT|jrTt|jt|jkrTtSntS(N(RR:R9t base_versionR;(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRPs  cC`st|}||kstS|j rT|jrTt|jt|jkrTtSn|jdk rt|jt|jkrtSntS(N(RR:tis_postreleaseRqRpRR;(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRQs  cC`s"t|jt|jkS(N(R-tlower(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_arbitraryscC`ss|jdk r|jS|j\}}|dkro|dkrY|jdrY|d }nt|jrotSntS( Ns==s>=s<=s~=s===s.*i(s==s>=s<=s~=s===(R(RR'RlRR9R;R:(R R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs  cC`s ||_dS(N(R((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs(R R RRRSRTRURVR"R4R[RkRLRMRNRORPRQRtRARR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR\s,^ # s^([0-9]+)((?:a|b|c|rc)[0-9]+)$cC`s\g}xO|jdD]>}tj|}|rG|j|jq|j|qW|S(NR_(tsplitt _prefix_regexR#textendtgroupsR<(R!tresultRR*((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRi'sc C`sgg}}|jttjd||jttjd||j|t|d|j|t|d|jddgtdt|dt|d|jddgtdt|dt|dttj|ttj|fS(NcS`s |jS(N(tisdigit(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd6RcS`s |jS(N(Rz(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd7Riit0(R<RfRgRhRntinserttmaxtchain(tlefttrightt left_splitt right_split((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRo2s ""//t SpecifierSetcB`seZdddZdZdZdZdZdZdZ dZ d Z e d Z e jd Z d Zdd ZddZRS(RcC`sg|jdD]}|jr|j^q}t}xL|D]D}y|jt|WqDtk r|jt|qDXqDWt||_||_ dS(Nt,( RuR&tsettaddR\RRBt frozensett_specsR((R t specifiersRtstparsedt specifier((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR+Os4   cC`s=|jdk r!dj|jnd}djt||S(Ns, prereleases={0!r}Rs(R(RR$RR-(R R.((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR/ds!cC`s djtd|jDS(NRcs`s|]}t|VqdS(N(R-(t.0R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys ns(RetsortedR(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRmscC`s t|jS(N(R0R(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRpscC`st|trt|}nt|ts1tSt}t|j|jB|_|jdkr|jdk r|j|_nZ|jdk r|jdkr|j|_n-|j|jkr|j|_n td|S(NsFCannot combine SpecifierSets with True and False prerelease overrides.( R1RRR2RRR(Rt ValueError(R RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__and__ss  cC`set|trt|}n7t|trBtt|}nt|tsUtS|j|jkS(N(R1RRRR-R2R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`set|trt|}n7t|trBtt|}nt|tsUtS|j|jkS(N(R1RRRR-R2R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s t|jS(N(RnR(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__len__scC`s t|jS(N(titerR(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__iter__scC`s:|jdk r|jS|js#dStd|jDS(Ncs`s|]}|jVqdS(N(R(RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys s(R(RRtany(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs  cC`s ||_dS(N(R((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s |j|S(N(R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR8sc`sptttfs$tndkr<|jn rPjrPtStfd|j DS(Nc3`s$|]}|jdVqdS(RN(R(RR(RR(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys s( R1RRRRRR9R:tallR(R RR((RRsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs  cC`s |dkr|j}n|jrTx,|jD]!}|j|dt|}q+W|Sg}g}x|D]{}t|ttfst|}n|}t|trqgn|j r| r|s|j |qqg|j |qgW| r|r|dkr|S|SdS(NR( RRRRtboolR1RRRR9R<(R RRR)tfilteredR>RR@((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs*    N(R R RR+R/RRRRRRRRARRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRMs       (t __future__RRRRRYRgRSt_compatRRR!RRRRRtABCMetatobjectR RRBR[R\RTRvRiRoR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyts"    "94  PK!b bb _vendor/packaging/specifiers.pyonu[ fc@`s<ddlmZmZmZddlZddlZddlZddlZddlm Z m Z ddl m Z m Z mZdefdYZde ejefd YZd efd YZd efd YZdZdefdYZejdZdZdZdefdYZdS(i(tabsolute_importtdivisiontprint_functionNi(t string_typestwith_metaclass(tVersiont LegacyVersiontparsetInvalidSpecifiercB`seZdZRS(sH An invalid specifier was found, users should refer to PEP 440. (t__name__t __module__t__doc__(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRst BaseSpecifiercB`seZejdZejdZejdZejdZejdZ e j dZ ejddZ ejddZ RS( cC`sdS(s Returns the str representation of this Specifier like object. This should be representative of the Specifier itself. N((tself((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__str__tcC`sdS(sF Returns a hash value for this Specifier like object. N((R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__hash__RcC`sdS(sq Returns a boolean representing whether or not the two Specifier like objects are equal. N((R tother((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__eq__$RcC`sdS(su Returns a boolean representing whether or not the two Specifier like objects are not equal. N((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__ne__+RcC`sdS(sg Returns whether or not pre-releases as a whole are allowed by this specifier. N((R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt prereleases2RcC`sdS(sd Sets whether or not pre-releases as a whole are allowed by this specifier. N((R tvalue((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR9RcC`sdS(sR Determines if the given item is contained within this specifier. N((R titemR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytcontains@RcC`sdS(s Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. N((R titerableR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytfilterFRN(R R tabctabstractmethodRRRRtabstractpropertyRtsettertNoneRR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR st_IndividualSpecifiercB`seZiZdddZdZdZdZdZdZ dZ dZ e d Z e d Ze d Zejd Zd ZddZddZRS(RcC`sj|jj|}|s0tdj|n|jdj|jdjf|_||_dS(NsInvalid specifier: '{0}'toperatortversion(t_regextsearchRtformattgrouptstript_spect _prereleases(R tspecRtmatch((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__init__Rs cC`sF|jdk r!dj|jnd}dj|jjt||S(Ns, prereleases={0!r}Rs<{0}({1!r}{2})>(R(RR$Rt __class__R tstr(R tpre((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__repr___s !  cC`sdj|jS(Ns{0}{1}(R$R'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRlscC`s t|jS(N(thashR'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRoscC`s`t|tr:y|j|}WqPtk r6tSXnt||jsPtS|j|jkS(N(t isinstanceRR,RtNotImplementedR'(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRrs cC`s`t|tr:y|j|}WqPtk r6tSXnt||jsPtS|j|jkS(N(R1RR,RR2R'(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR}s cC`st|dj|j|S(Ns _compare_{0}(tgetattrR$t _operators(R top((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt _get_operatorscC`s(t|ttfs$t|}n|S(N(R1RRR(R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_coerce_versionscC`s |jdS(Ni(R'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR scC`s |jdS(Ni(R'(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR!scC`s|jS(N(R((R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s ||_dS(N(R((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s |j|S(N(R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt __contains__scC`sW|dkr|j}n|j|}|jr;| r;tS|j|j||jS(N(RRR7t is_prereleasetFalseR6R R!(R RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs   cc`st}g}i|dk r!|ntd6}xf|D]^}|j|}|j||r2|jr|pn|j r|j|qt}|Vq2q2W| r|rx|D] }|VqWndS(NR(R:RtTrueR7RR9Rtappend(R RRtyieldedtfound_prereleasestkwR!tparsed_version((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs     N(R R R4RR+R/RRRRR6R7tpropertyR R!RRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRNs       tLegacySpecifiercB`seZdZejdedejejBZidd6dd6dd6d d 6d d 6d d6ZdZ dZ dZ dZ dZ dZdZRS(s (?P(==|!=|<=|>=|<|>)) \s* (?P [^,;\s)]* # Since this is a "legacy" specifier, and the version # string can be just about anything, we match everything # except for whitespace, a semi-colon for marker support, # a closing paren since versions can be enclosed in # them, and a comma since it's a version separator. ) s^\s*s\s*$tequals==t not_equals!=tless_than_equals<=tgreater_than_equals>=t less_thantcC`s(t|ts$tt|}n|S(N(R1RR-(R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR7scC`s||j|kS(N(R7(R t prospectiveR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_not_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_than_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_than_equalscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_thanscC`s||j|kS(N(R7(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_thans(R R t _regex_strtretcompiletVERBOSEt IGNORECASER"R4R7RLRMRNRORPRQ(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRBs"        c`s"tjfd}|S(Nc`s#t|tstS|||S(N(R1RR:(R RKR)(tfn(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytwrapped s(t functoolstwraps(RWRX((RWsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_require_version_compare st SpecifiercB`seZdZejdedejejBZidd6dd6dd6d d 6d d 6d d6dd6dd6Ze dZ e dZ e dZ e dZ e dZe dZe dZdZedZejdZRS(s (?P(~=|==|!=|<=|>=|<|>|===)) (?P (?: # The identity operators allow for an escape hatch that will # do an exact string match of the version you wish to install. # This will not be parsed by PEP 440 and we cannot determine # any semantic meaning from it. This operator is discouraged # but included entirely as an escape hatch. (?<====) # Only match for the identity operator \s* [^\s]* # We just match everything, except for whitespace # since we are only testing for strict identity. ) | (?: # The (non)equality operators allow for wild card and local # versions to be specified so we have to define these two # operators separately to enable that. (?<===|!=) # Only match for equals and not equals \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)* # release (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? # You cannot use a wild card and a dev or local version # together so group them with a | and make them optional. (?: (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local | \.\* # Wild card syntax of .* )? ) | (?: # The compatible operator requires at least two digits in the # release segment. (?<=~=) # Only match for the compatible operator \s* v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) (?: # pre release [-_\.]? (a|b|c|rc|alpha|beta|pre|preview) [-_\.]? [0-9]* )? (?: # post release (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) )? (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release ) | (?: # All other operators only allow a sub set of what the # (non)equality operators do. Specifically they do not allow # local versions to be specified nor do they allow the prefix # matching wild cards. (?=RGRHRIRJt arbitrarys===cC`sfdjttjdt|d }|d7}|jd||oe|jd||S(Nt.cS`s|jd o|jd S(Ntposttdev(t startswith(tx((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytsis.*s>=s==(tjointlistt itertoolst takewhilet_version_splitR6(R RKR)tprefix((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_compatibles   cC`s|jdrht|j}t|d }tt|}|t| }t||\}}n't|}|jst|j}n||kS(Ns.*i(tendswithRtpublicRiR-tlent _pad_versiontlocal(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRLs  cC`s|j|| S(N(RL(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRMscC`s|t|kS(N(R(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRNscC`s|t|kS(N(R(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyROscC`sXt|}||kstS|j rT|jrTt|jt|jkrTtSntS(N(RR:R9t base_versionR;(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRPs  cC`st|}||kstS|j rT|jrTt|jt|jkrTtSn|jdk rt|jt|jkrtSntS(N(RR:tis_postreleaseRqRpRR;(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRQs  cC`s"t|jt|jkS(N(R-tlower(R RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_arbitraryscC`ss|jdk r|jS|j\}}|dkro|dkrY|jdrY|d }nt|jrotSntS( Ns==s>=s<=s~=s===s.*i(s==s>=s<=s~=s===(R(RR'RlRR9R;R:(R R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs  cC`s ||_dS(N(R((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs(R R RRRSRTRURVR"R4R[RkRLRMRNRORPRQRtRARR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR\s,^ # s^([0-9]+)((?:a|b|c|rc)[0-9]+)$cC`s\g}xO|jdD]>}tj|}|rG|j|jq|j|qW|S(NR_(tsplitt _prefix_regexR#textendtgroupsR<(R!tresultRR*((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRi'sc C`sgg}}|jttjd||jttjd||j|t|d|j|t|d|jddgtdt|dt|d|jddgtdt|dt|dttj|ttj|fS(NcS`s |jS(N(tisdigit(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd6RcS`s |jS(N(Rz(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd7Riit0(R<RfRgRhRntinserttmaxtchain(tlefttrightt left_splitt right_split((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRo2s ""//t SpecifierSetcB`seZdddZdZdZdZdZdZdZ dZ d Z e d Z e jd Z d Zdd ZddZRS(RcC`sg|jdD]}|jr|j^q}t}xL|D]D}y|jt|WqDtk r|jt|qDXqDWt||_||_ dS(Nt,( RuR&tsettaddR\RRBt frozensett_specsR((R t specifiersRtstparsedt specifier((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR+Os4   cC`s=|jdk r!dj|jnd}djt||S(Ns, prereleases={0!r}Rs(R(RR$RR-(R R.((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR/ds!cC`s djtd|jDS(NRcs`s|]}t|VqdS(N(R-(t.0R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys ns(RetsortedR(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRmscC`s t|jS(N(R0R(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRpscC`st|trt|}nt|ts1tSt}t|j|jB|_|jdkr|jdk r|j|_nZ|jdk r|jdkr|j|_n-|j|jkr|j|_n td|S(NsFCannot combine SpecifierSets with True and False prerelease overrides.( R1RRR2RRR(Rt ValueError(R RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__and__ss  cC`set|trt|}n7t|trBtt|}nt|tsUtS|j|jkS(N(R1RRRR-R2R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`set|trt|}n7t|trBtt|}nt|tsUtS|j|jkS(N(R1RRRR-R2R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s t|jS(N(RnR(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__len__scC`s t|jS(N(titerR(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__iter__scC`s:|jdk r|jS|js#dStd|jDS(Ncs`s|]}|jVqdS(N(R(RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys s(R(RRtany(R ((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs  cC`s ||_dS(N(R((R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRscC`s |j|S(N(R(R R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR8sc`sptttfs$tndkr<|jn rPjrPtStfd|j DS(Nc3`s$|]}|jdVqdS(RN(R(RR(RR(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys s( R1RRRRRR9R:tallR(R RR((RRsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs  cC`s |dkr|j}n|jrTx,|jD]!}|j|dt|}q+W|Sg}g}x|D]{}t|ttfst|}n|}t|trqgn|j r| r|s|j |qqg|j |qgW| r|r|dkr|S|SdS(NR( RRRRtboolR1RRRR9R<(R RRR)tfilteredR>RR@((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs*    N(R R RR+R/RRRRRRRRARRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRMs       (t __future__RRRRRYRgRSt_compatRRR!RRRRRtABCMetatobjectR RRBR[R\RTRvRiRoR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyts"    "94  PK!5WRR_vendor/packaging/utils.pycnu[ fc@`sDddlmZmZmZddlZejdZdZdS(i(tabsolute_importtdivisiontprint_functionNs[-_.]+cC`stjd|jS(Nt-(t_canonicalize_regextsubtlower(tname((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pytcanonicalize_name s(t __future__RRRtretcompileRR(((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyts PK!5WRR_vendor/packaging/utils.pyonu[ fc@`sDddlmZmZmZddlZejdZdZdS(i(tabsolute_importtdivisiontprint_functionNs[-_.]+cC`stjd|jS(Nt-(t_canonicalize_regextsubtlower(tname((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pytcanonicalize_name s(t __future__RRRtretcompileRR(((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyts PK!>;j8j8_vendor/packaging/version.pycnu[ fc@`snddlmZmZmZddlZddlZddlZddlmZddddd gZ ej d d d d dddgZ dZ de fdYZdefdYZdefdYZejdejZidd6dd6dd6dd6dd 6ZdZdZdZdefd YZd!Zejd"Zd#Zd$ZdS(%i(tabsolute_importtdivisiontprint_functionNi(tInfinitytparsetVersiont LegacyVersiontInvalidVersiontVERSION_PATTERNt_VersiontepochtreleasetdevtpretposttlocalcC`s-yt|SWntk r(t|SXdS(s Parse the given version string and return either a :class:`Version` object or a :class:`LegacyVersion` object depending on if the given version is a valid PEP 440 version or a legacy version. N(RRR(tversion((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRs cB`seZdZRS(sF An invalid version was found, users should refer to PEP 440. (t__name__t __module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR$st _BaseVersioncB`sPeZdZdZdZdZdZdZdZdZ RS(cC`s t|jS(N(thasht_key(tself((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__hash__,scC`s|j|dS(NcS`s ||kS(N((tsto((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt0t(t_compare(Rtother((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__lt__/scC`s|j|dS(NcS`s ||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR3R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__le__2scC`s|j|dS(NcS`s ||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR6R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__eq__5scC`s|j|dS(NcS`s ||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR9R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ge__8scC`s|j|dS(NcS`s ||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR<R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__gt__;scC`s|j|dS(NcS`s ||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR?R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ne__>scC`s&t|tstS||j|jS(N(t isinstanceRtNotImplementedR(RRtmethod((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRAs( RRRRR R!R"R#R$R(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*s       cB`sneZdZdZdZedZedZedZedZ edZ RS(cC`s%t||_t|j|_dS(N(tstrt_versiont_legacy_cmpkeyR(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__init__JscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__str__NscC`sdjtt|S(Ns(tformattreprR((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__repr__QscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytpublicTscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt base_versionXscC`sdS(N(tNone(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\scC`stS(N(tFalse(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt is_prerelease`scC`stS(N(R3(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytis_postreleaseds( RRR+R,R/tpropertyR0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRHs   s(\d+ | [a-z]+ | \.| -)tctpreviewsfinal-t-trct@cc`sxxltj|D][}tj||}| s|dkrAqn|d dkrb|jdVqd|VqWdVdS(Nt.it 0123456789it*s*final(t_legacy_version_component_retsplitt_legacy_version_replacement_maptgettzfill(Rtpart((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt_parse_version_partsrs cC`sd}g}xt|jD]}|jdr|dkrjx'|rf|ddkrf|jqCWnx'|r|ddkr|jqmWn|j|qWt|}||fS(NiR>s*finals*final-t00000000(REtlowert startswithtpoptappendttuple(RR tpartsRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*s  s v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                          # pre-release
            [-_\.]?
            (?P(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
cB`seZejdedejejBZdZdZ	dZ
edZedZ
edZedZed	ZRS(
s^\s*s\s*$cC`s[|jj|}|s0tdj|ntd|jdrZt|jdnddtd|jdjdDdt	|jd|jd	d
t	|jd|jdp|jd
dt	|jd|jddt
|jd|_t|jj
|jj|jj|jj|jj|jj|_dS(NsInvalid version: '{0}'R
iRcs`s|]}t|VqdS(N(tint(t.0ti((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	sR<R
tpre_ltpre_nRtpost_ltpost_n1tpost_n2Rtdev_ltdev_nR(t_regextsearchRR-R	tgroupRMRKR@t_parse_letter_versiont_parse_local_versionR)t_cmpkeyR
RR
RRRR(RRtmatch((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR+s.*(!					cC`sdjtt|S(Ns(R-R.R((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR/scC`sSg}|jjdkr7|jdj|jjn|jdjd|jjD|jjdk	r|jdjd|jjDn|jjdk	r|jdj|jjdn|jj	dk	r|jd	j|jj	dn|jj
dk	rF|jd
jdjd|jj
Dndj|S(Nis{0}!R<cs`s|]}t|VqdS(N(R((RNtx((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	sRcs`s|]}t|VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	ss.post{0}is.dev{0}s+{0}cs`s|]}t|VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	s(R)R
RJR-tjoinRR
R2RRR(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR,s&)##,cC`st|jdddS(Nt+ii(R(R@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR0
scC`sjg}|jjdkr7|jdj|jjn|jdjd|jjDdj|S(Nis{0}!R<cs`s|]}t|VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	sR(R)R
RJR-R_R(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR1s
&cC`s0t|}d|kr,|jdddSdS(NR`i(R(R@(Rtversion_string((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRscC`st|jjp|jjS(N(tboolR)RR
(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR4!scC`st|jjS(N(RbR)R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR5%s(RRtretcompileRtVERBOSEt
IGNORECASERWR+R/R,R6R0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRs	#		
cC`s|r|dkrd}n|j}|dkr<d}n?|dkrQd}n*|d
krfd	}n|dkr{d}n|t|fS|r|rd}|t|fSdS(NitalphatatbetatbR7R
R8R:trevtrR(R7R
R8(RkRl(R2RGRM(tlettertnumber((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRZ*s 					
s[\._-]cC`s-|dk	r)tdtj|DSdS(sR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    cs`s3|])}|js!|jn	t|VqdS(N(tisdigitRGRM(RNRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	RsN(R2RKt_local_version_seperatorsR@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR[LscC`sttttjdt|}|dkr[|dkr[|dk	r[t}n|dkrpt}n|dkrt}n|dkrt}n|dkrt}ntd|D}||||||fS(NcS`s
|dkS(Ni((R^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR`Rcs`s7|]-}t|tr$|dfn
t|fVqdS(RN(R%RMR(RNRO((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	s(RKtreversedtlistt	itertoolst	dropwhileR2R(R
RR
RRR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\Ws&	$
	
	
	
(t
__future__RRRtcollectionsRsRct_structuresRt__all__t
namedtupleR	Rt
ValueErrorRtobjectRRRdReR?RARER*RRRZRpR[R\(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyts0	!&		9k		PK!>;j8j8_vendor/packaging/version.pyonu[
fc@`snddlmZmZmZddlZddlZddlZddlmZddddd	gZ	ej
d
ddd
dddgZdZde
fdYZdefdYZdefdYZejdejZidd6dd6dd6dd6dd
6ZdZdZdZdefd YZd!Zejd"Zd#Zd$ZdS(%i(tabsolute_importtdivisiontprint_functionNi(tInfinitytparsetVersiont
LegacyVersiontInvalidVersiontVERSION_PATTERNt_VersiontepochtreleasetdevtpretposttlocalcC`s-yt|SWntk
r(t|SXdS(s
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    N(RRR(tversion((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRs
cB`seZdZRS(sF
    An invalid version was found, users should refer to PEP 440.
    (t__name__t
__module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR$st_BaseVersioncB`sPeZdZdZdZdZdZdZdZdZ	RS(cC`s
t|jS(N(thasht_key(tself((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__hash__,scC`s|j|dS(NcS`s
||kS(N((tsto((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt0t(t_compare(Rtother((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__lt__/scC`s|j|dS(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR3R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__le__2scC`s|j|dS(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR6R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__eq__5scC`s|j|dS(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR9R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ge__8scC`s|j|dS(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR<R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__gt__;scC`s|j|dS(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR?R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ne__>scC`s&t|tstS||j|jS(N(t
isinstanceRtNotImplementedR(RRtmethod((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRAs(
RRRRR R!R"R#R$R(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*s							cB`sneZdZdZdZedZedZedZedZ	edZ
RS(cC`s%t||_t|j|_dS(N(tstrt_versiont_legacy_cmpkeyR(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__init__JscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__str__NscC`sdjtt|S(Ns(tformattreprR((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__repr__QscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytpublicTscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytbase_versionXscC`sdS(N(tNone(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\scC`stS(N(tFalse(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt
is_prerelease`scC`stS(N(R3(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytis_postreleaseds(RRR+R,R/tpropertyR0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRHs			s(\d+ | [a-z]+ | \.| -)tctpreviewsfinal-t-trct@cc`sxxltj|D][}tj||}|s|dkrAqn|d dkrb|jdVqd|VqWdVdS(Nt.it
0123456789it*s*final(t_legacy_version_component_retsplitt_legacy_version_replacement_maptgettzfill(Rtpart((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt_parse_version_partsrs
cC`sd}g}xt|jD]}|jdr|dkrjx'|rf|ddkrf|jqCWnx'|r|ddkr|jqmWn|j|qWt|}||fS(NiR>s*finals*final-t00000000(REtlowert
startswithtpoptappendttuple(RR
tpartsRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*ss
    v?
    (?:
        (?:(?P[0-9]+)!)?                           # epoch
        (?P[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P
                                          # pre-release
            [-_\.]?
            (?P(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
cB`seZejdedejejBZdZdZ	dZ
edZedZ
edZedZed	ZRS(
s^\s*s\s*$cC`s[|jj|}|s0tdj|ntd|jdrZt|jdnddtd|jdjdDdt	|jd|jd	d
t	|jd|jdp|jd
dt	|jd|jddt
|jd|_t|jj
|jj|jj|jj|jj|jj|_dS(NsInvalid version: '{0}'R
iRcs`s|]}t|VqdS(N(tint(t.0ti((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	sR<R
tpre_ltpre_nRtpost_ltpost_n1tpost_n2Rtdev_ltdev_nR(t_regextsearchRR-R	tgroupRMRKR@t_parse_letter_versiont_parse_local_versionR)t_cmpkeyR
RR
RRRR(RRtmatch((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR+s.*(!					cC`sdjtt|S(Ns(R-R.R((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR/scC`sSg}|jjdkr7|jdj|jjn|jdjd|jjD|jjdk	r|jdjd|jjDn|jjdk	r|jdj|jjdn|jj	dk	r|jd	j|jj	dn|jj
dk	rF|jd
jdjd|jj
Dndj|S(Nis{0}!R<cs`s|]}t|VqdS(N(R((RNtx((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	sRcs`s|]}t|VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	ss.post{0}is.dev{0}s+{0}cs`s|]}t|VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	s(R)R
RJR-tjoinRR
R2RRR(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR,s&)##,cC`st|jdddS(Nt+ii(R(R@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR0
scC`sjg}|jjdkr7|jdj|jjn|jdjd|jjDdj|S(Nis{0}!R<cs`s|]}t|VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	sR(R)R
RJR-R_R(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR1s
&cC`s0t|}d|kr,|jdddSdS(NR`i(R(R@(Rtversion_string((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRscC`st|jjp|jjS(N(tboolR)RR
(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR4!scC`st|jjS(N(RbR)R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR5%s(RRtretcompileRtVERBOSEt
IGNORECASERWR+R/R,R6R0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRs	#		
cC`s|r|dkrd}n|j}|dkr<d}n?|dkrQd}n*|d
krfd	}n|dkr{d}n|t|fS|r|rd}|t|fSdS(NitalphatatbetatbR7R
R8R:trevtrR(R7R
R8(RkRl(R2RGRM(tlettertnumber((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRZ*s 					
s[\._-]cC`s-|dk	r)tdtj|DSdS(sR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    cs`s3|])}|js!|jn	t|VqdS(N(tisdigitRGRM(RNRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	RsN(R2RKt_local_version_seperatorsR@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR[LscC`sttttjdt|}|dkr[|dkr[|dk	r[t}n|dkrpt}n|dkrt}n|dkrt}n|dkrt}ntd|D}||||||fS(NcS`s
|dkS(Ni((R^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR`Rcs`s7|]-}t|tr$|dfn
t|fVqdS(RN(R%RMR(RNRO((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	s(RKtreversedtlistt	itertoolst	dropwhileR2R(R
RR
RRR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\Ws&	$
	
	
	
(t
__future__RRRtcollectionsRsRct_structuresRt__all__t
namedtupleR	Rt
ValueErrorRtobjectRRRdReR?RARER*RRRZRpR[R\(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyts0	!&		9k		PK!nMe_vendor/__init__.pycnu[
fc@sdS(N((((s?/usr/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyttPK!nMe_vendor/__init__.pyonu[
fc@sdS(N((((s?/usr/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyttPK!IE_vendor/pyparsing.pycnu[
fci@sdZdZdZdZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZyddlmZWn!ek
rddlmZnXydd	l
mZWn?ek
r=ydd	lmZWnek
r9eZnXnXd
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgiZee	jds ZedtdskZere	jZ e!Z"e#Z$e!Z%e&e'e(e)e*ee+e,e-e.e/gZ0nre	j1Z e2Z3duZ%gZ0ddl4Z4xEdvj5D]7Z6ye0j7e8e4e6Wne9k
rZq$nXq$We:dwe3dxDZ;dyZ<dze=fd{YZ>ej?ej@ZAd|ZBeBd}ZCeAeBZDe#d~ZEdjFdejGDZHd!eIfdYZJd#eJfdYZKd%eJfdYZLd'eLfdYZMd*eIfdYZNde=fdYZOd&e=fdYZPe
jQjRePdZSdZTdZUdZVdZWdZXdZYddZZd(e=fdYZ[d0e[fdYZ\de\fdYZ]de\fdYZ^de\fdYZ_e_Z`e_e[_ade\fdYZbde_fdYZcdebfdYZddpe\fdYZed3e\fdYZfd+e\fdYZgd)e\fdYZhd
e\fdYZid2e\fdYZjde\fdYZkdekfdYZldekfdYZmdekfdYZnd.ekfdYZod-ekfdYZpd5ekfdYZqd4ekfdYZrd$e[fdYZsd
esfdYZtd esfdYZudesfdYZvdesfdYZwd"e[fdYZxdexfdYZydexfdYZzdexfdYZ{de{fdYZ|d6e{fdYZ}de=fdYZ~e~ZdexfdYZd,exfdYZdexfdYZdefdYZd1exfdYZdefdYZdefdYZdefdYZd/efdYZde=fdYZdZdedZedZdZdZdZdZeedZdZedZdZdZe]jdGZemjdMZenjdLZeojdeZepjddZefeEdddjdZegdjdZegdjdZeeBeBefeHddddxBegdejBZeeedeZe_dedjdee|eeBjddZdZdZdZdZdZedZedZdZdZdZdZe=e_ddZe>Ze=e_e=e_ededdZeZeegddjdZeegddjdZeegddegddBjdZee`dejjdZddeejdZedZedZedZeefeAeDdjd\ZZeedj5dZegddjFejdjdZdZeegddjdZegdjdZegd	jjd
ZegdjdZeegddeBjd
ZeZegdjdZee|efeHddeefde_denjjdZeeejeBddjd>ZdrfdYZedkrecdZecdZefeAeDdZeeddejeZeeejdZdeBZeeddejeZeeejdZededeedZejdejjdejjdejjd ddlZejjeejejjd!ndS("sS
pyparsing module - Classes and methods to define and execute parsing grammars

The pyparsing module is an alternative approach to creating and executing simple grammars,
vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
provides a library of classes that you use to construct the grammar directly in Python.

Here is a program to parse "Hello, World!" (or any greeting of the form 
C{", !"}), built up using L{Word}, L{Literal}, and L{And} elements 
(L{'+'} operator gives L{And} expressions, strings are auto-converted to
L{Literal} expressions)::

    from pyparsing import Word, alphas

    # define grammar of a greeting
    greet = Word(alphas) + "," + Word(alphas) + "!"

    hello = "Hello, World!"
    print (hello, "->", greet.parseString(hello))

The program outputs the following::

    Hello, World! -> ['Hello', ',', 'World', '!']

The Python representation of the grammar is quite readable, owing to the self-explanatory
class names, and the use of '+', '|' and '^' operators.

The L{ParseResults} object returned from L{ParserElement.parseString} can be accessed as a nested list, a dictionary, or an
object with named attributes.

The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
 - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
 - quoted strings
 - embedded comments
s2.1.10s07 Oct 2016 01:31 UTCs*Paul McGuire iN(tref(tdatetime(tRLock(tOrderedDicttAndtCaselessKeywordtCaselessLiteralt
CharsNotIntCombinetDicttEachtEmptyt
FollowedBytForwardt
GoToColumntGrouptKeywordtLineEndt	LineStarttLiteralt
MatchFirsttNoMatchtNotAnyt	OneOrMoretOnlyOncetOptionaltOrtParseBaseExceptiontParseElementEnhancetParseExceptiontParseExpressiontParseFatalExceptiontParseResultstParseSyntaxExceptiont
ParserElementtQuotedStringtRecursiveGrammarExceptiontRegextSkipTot	StringEndtStringStarttSuppresstTokentTokenConvertertWhitetWordtWordEndt	WordStartt
ZeroOrMoret	alphanumstalphast
alphas8bittanyCloseTagt
anyOpenTagt
cStyleCommenttcoltcommaSeparatedListtcommonHTMLEntitytcountedArraytcppStyleCommenttdblQuotedStringtdblSlashCommentt
delimitedListtdictOftdowncaseTokenstemptythexnumsthtmlCommenttjavaStyleCommenttlinetlineEndt	lineStarttlinenotmakeHTMLTagstmakeXMLTagstmatchOnlyAtColtmatchPreviousExprtmatchPreviousLiteralt
nestedExprtnullDebugActiontnumstoneOftopAssoctoperatorPrecedencet
printablestpunc8bittpythonStyleCommenttquotedStringtremoveQuotestreplaceHTMLEntitytreplaceWitht
restOfLinetsglQuotedStringtsranget	stringEndtstringStartttraceParseActiont
unicodeStringtupcaseTokenst
withAttributet
indentedBlocktoriginalTextFortungroupt
infixNotationtlocatedExprt	withClasst
CloseMatchttokenMaptpyparsing_commoniicCs}t|tr|Syt|SWnUtk
rxt|jtjd}td}|jd|j	|SXdS(sDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
           then < returns the unicode object | encodes it with the default encoding | ... >.
        txmlcharrefreplaces&#\d+;cSs#dtt|ddd!dS(Ns\uiii(thextint(tt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyttN(
t
isinstancetunicodetstrtUnicodeEncodeErrortencodetsystgetdefaultencodingR%tsetParseActionttransformString(tobjtrett
xmlcharref((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_ustrs
s6sum len sorted reversed list tuple set any all min maxccs|]}|VqdS(N((t.0ty((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	sicCsRd}ddjD}x/t||D]\}}|j||}q,W|S(s/Escape &, <, >, ", ', etc. in a string of data.s&><"'css|]}d|dVqdS(t&t;N((Rts((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	ssamp gt lt quot apos(tsplittziptreplace(tdatatfrom_symbolst
to_symbolstfrom_tto_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_xml_escapes
t
_ConstantscBseZRS((t__name__t
__module__(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRst
0123456789tABCDEFabcdefi\Rrccs$|]}|tjkr|VqdS(N(tstringt
whitespace(Rtc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	scBs_eZdZdd
d
dZedZdZdZdZ	ddZ
d	ZRS(s7base exception class for all parsing runtime exceptionsicCs[||_|dkr*||_d|_n||_||_||_|||f|_dS(NRr(tloctNonetmsgtpstrt
parserElementtargs(tselfRRRtelem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__init__s					cCs||j|j|j|jS(s
        internal factory method to simplify creating one type of ParseException 
        from another - avoids having __init__ signature conflicts among subclasses
        (RRRR(tclstpe((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_from_exceptionscCsm|dkrt|j|jS|dkr>t|j|jS|dkr]t|j|jSt|dS(ssupported attributes by name are:
            - lineno - returns the line number of the exception text
            - col - returns the column number of the exception text
            - line - returns the line containing the exception text
        RHR7tcolumnREN(R7R(RHRRR7REtAttributeError(Rtaname((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getattr__scCs d|j|j|j|jfS(Ns"%s (at char %d), (line:%d, col:%d)(RRRHR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__str__scCs
t|S(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__repr__ss>!} ('-' operator) indicates that parsing is to stop 
       immediately because an unbacktrackable syntax error has been found(RRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!scBs eZdZdZdZRS(sZexception thrown by L{ParserElement.validate} if the grammar could be improperly recursivecCs
||_dS(N(tparseElementTrace(RtparseElementList((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsd|jS(NsRecursiveGrammarException: %s(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s(RRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR$s	t_ParseResultsWithOffsetcBs,eZdZdZdZdZRS(cCs||f|_dS(N(ttup(Rtp1tp2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR$scCs|j|S(N(R(Rti((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getitem__&scCst|jdS(Ni(treprR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR(scCs|jd|f|_dS(Ni(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	setOffset*s(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR#s			cBseZdZd-d-eedZd-d-eeedZdZedZ	dZ
dZdZdZ
e
Zd	Zd
ZdZdZd
ZereZeZeZn-eZeZeZdZdZdZdZdZd-dZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ddZ(d Z)d!Z*d"Z+d-e,ded#Z-d$Z.d%Z/dd&ed'Z0d(Z1d)Z2d*Z3d+Z4d,Z5RS(.sI
    Structured parse results, to provide multiple means of access to the parsed data:
       - as a list (C{len(results)})
       - by list index (C{results[0], results[1]}, etc.)
       - by attribute (C{results.} - see L{ParserElement.setResultsName})

    Example::
        integer = Word(nums)
        date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))
        # equivalent form:
        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")

        # parseString returns a ParseResults object
        result = date_str.parseString("1999/12/31")

        def test(s, fn=repr):
            print("%s -> %s" % (s, fn(eval(s))))
        test("list(result)")
        test("result[0]")
        test("result['month']")
        test("result.day")
        test("'month' in result")
        test("'minutes' in result")
        test("result.dump()", str)
    prints::
        list(result) -> ['1999', '/', '12', '/', '31']
        result[0] -> '1999'
        result['month'] -> '12'
        result.day -> '31'
        'month' in result -> True
        'minutes' in result -> False
        result.dump() -> ['1999', '/', '12', '/', '31']
        - day: 31
        - month: 12
        - year: 1999
    cCs/t||r|Stj|}t|_|S(N(Rstobjectt__new__tTruet_ParseResults__doinit(RttoklisttnametasListtmodaltretobj((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs
	cCs|jrt|_d|_d|_i|_||_||_|dkrTg}n||trp||_	n-||t
rt||_	n|g|_	t|_n|dk	r|r|sd|j|s(R(R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_itervaluesscsfdjDS(Nc3s|]}||fVqdS(N((RR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s(R(R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
_iteritemsscCst|jS(sVReturns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).(RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytkeysscCst|jS(sXReturns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).(Rt
itervalues(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvaluesscCst|jS(sfReturns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).(Rt	iteritems(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs
t|jS(sSince keys() returns an iterator, this method is helpful in bypassing
           code that looks for the existence of any defined results names.(tboolR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pythaskeysscOs|sdg}nxI|jD];\}}|dkrJ|d|f}qtd|qWt|dtst|dks|d|kr|d}||}||=|S|d}|SdS(s
        Removes and returns item at specified index (default=C{last}).
        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
        argument or an integer argument, it will use C{list} semantics
        and pop tokens from the list of parsed tokens. If passed a 
        non-integer argument (most likely a string), it will use C{dict}
        semantics and pop the corresponding value from any defined 
        results names. A second default return value argument is 
        supported, just as in C{dict.pop()}.

        Example::
            def remove_first(tokens):
                tokens.pop(0)
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']

            label = Word(alphas)
            patt = label("LABEL") + OneOrMore(Word(nums))
            print(patt.parseString("AAB 123 321").dump())

            # Use pop() in a parse action to remove named result (note that corresponding value is not
            # removed from list form of results)
            def remove_LABEL(tokens):
                tokens.pop("LABEL")
                return tokens
            patt.addParseAction(remove_LABEL)
            print(patt.parseString("AAB 123 321").dump())
        prints::
            ['AAB', '123', '321']
            - LABEL: AAB

            ['AAB', '123', '321']
        itdefaultis-pop() got an unexpected keyword argument '%s'iN(RRRsRoR(RRtkwargsRRtindexR}tdefaultvalue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpops"


cCs||kr||S|SdS(si
        Returns named result matching the given key, or if there is no
        such name, then returns the given C{defaultValue} or C{None} if no
        C{defaultValue} is specified.

        Similar to C{dict.get()}.
        
        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            result = date_str.parseString("1999/12/31")
            print(result.get("year")) # -> '1999'
            print(result.get("hour", "not specified")) # -> 'not specified'
            print(result.get("hour")) # -> None
        N((RtkeytdefaultValue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsw|jj||x]|jjD]L\}}x=t|D]/\}\}}t||||k|| ['0', '123', '321']

            # use a parse action to insert the parse location in the front of the parsed results
            def insert_locn(locn, tokens):
                tokens.insert(0, locn)
            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
        N(RtinsertRRRR(RRtinsStrRRRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR2scCs|jj|dS(s
        Add single element to end of ParseResults list of elements.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            
            # use a parse action to compute the sum of the parsed integers, and add it to the end
            def append_sum(tokens):
                tokens.append(sum(map(int, tokens)))
            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
        N(Rtappend(Rtitem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRFscCs0t|tr||7}n|jj|dS(s
        Add sequence of elements to end of ParseResults list of elements.

        Example::
            patt = OneOrMore(Word(alphas))
            
            # use a parse action to append the reverse of the matched strings, to make a palindrome
            def make_palindrome(tokens):
                tokens.extend(reversed([t[::-1] for t in tokens]))
                return ''.join(tokens)
            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
        N(RsR Rtextend(Rtitemseq((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs

cCs|j2|jjdS(s7
        Clear all elements and results names.
        N(RRtclear(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfscCsy||SWntk
r dSX||jkr}||jkrR|j|ddStg|j|D]}|d^qcSndSdS(NRrii(RRRR (RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRms
+cCs|j}||7}|S(N(R(RtotherR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__add__{s
c	s|jrt|jfd}|jj}g|D]<\}}|D])}|t|d||df^qMq=}xJ|D]?\}}|||st](RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsRrcCsog}xb|jD]W}|r2|r2|j|nt|trT||j7}q|jt|qW|S(N(RRRsR t
_asStringListR(RtseptoutR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs5g|jD]'}t|tr+|jn|^q
S(s
        Returns the parse results as a nested list of matching tokens, all converted to strings.

        Example::
            patt = OneOrMore(Word(alphas))
            result = patt.parseString("sldkj lsdkj sldkj")
            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
            print(type(result), result) # ->  ['sldkj', 'lsdkj', 'sldkj']
            
            # Use asList() to create an actual list
            result_list = result.asList()
            print(type(result_list), result_list) # ->  ['sldkj', 'lsdkj', 'sldkj']
        (RRsR R(Rtres((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscsGtr|j}n	|j}fdtfd|DS(s
        Returns the named parse results as a nested dictionary.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(type(result), repr(result)) # ->  (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
            
            result_dict = result.asDict()
            print(type(result_dict), repr(result_dict)) # ->  {'day': '1999', 'year': '12', 'month': '31'}

            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
            import json
            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
        csMt|trE|jr%|jSg|D]}|^q,Sn|SdS(N(RsR RtasDict(R|R(ttoItem(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs

 c3s'|]\}}||fVqdS(N((RRR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s(tPY_3RRR(Rtitem_fn((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
		cCsPt|j}|jj|_|j|_|jj|j|j|_|S(sA
        Returns a new copy of a C{ParseResults} object.
        (R RRRRRR
R(RR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsd}g}td|jjD}|d}|sPd}d}d}nd	}	|d	k	rk|}	n|jr|j}	n|	s|rdSd}	n|||d|	dg7}x	t|jD]\}
}t|trI|
|kr||j	||
|o|d	k||g7}q||j	d	|o6|d	k||g7}qd	}|
|krh||
}n|s|rzqqd}nt
t|}
|||d|d|
d|dg	7}qW|||d|	dg7}dj|S(
s
        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
        s
css2|](\}}|D]}|d|fVqqdS(iN((RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s	s  RrtITEMtsgss
%s%s- %s: s  icss|]}t|tVqdS(N(RsR (Rtvv((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	sss
%s%s[%d]:
%s%s%sRr(
RRRRtsortedRRsR tdumpRtanyRR(RR$tdepthtfullRtNLRRRRR1((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR3Ps, B?cOstj|j||dS(s
        Pretty-printer for parsed results as a list, using the C{pprint} module.
        Accepts additional positional or keyword args as defined for the 
        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})

        Example::
            ident = Word(alphas, alphanums)
            num = Word(nums)
            func = Forward()
            term = ident | num | Group('(' + func + ')')
            func <<= ident + Group(Optional(delimitedList(term)))
            result = func.parseString("fna a,b,(fnb c,d,200),100")
            result.pprint(width=40)
        prints::
            ['fna',
             ['a',
              'b',
              ['(', 'fnb', ['c', 'd', '200'], ')'],
              '100']]
        N(tpprintR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR8}scCsC|j|jj|jdk	r-|jp0d|j|jffS(N(RRRRRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getstate__s
cCsm|d|_|d\|_}}|_i|_|jj||dk	r`t||_n	d|_dS(Nii(RRRRR
RRR(RtstateR/tinAccumNames((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__setstate__s
	cCs|j|j|j|jfS(N(RRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getnewargs__scCs tt|t|jS(N(RRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsN(6RRRRRRRsRRRRRRRt__nonzero__RRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRR!R-R0R3R8R9R<R=R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR -sh&	'		
														4												#	=		%-			
	cCsW|}d|ko#t|knr@||ddkr@dS||jdd|S(sReturns current column within a string, counting newlines as line separators.
   The first column is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}} for more information
   on parsing strings containing C{}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   iis
(Rtrfind(RtstrgR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR7s
cCs|jdd|dS(sReturns current line number within a string, counting newlines as line separators.
   The first line is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}} for more information
   on parsing strings containing C{}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   s
ii(tcount(RR@((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRHs
cCsR|jdd|}|jd|}|dkrB||d|!S||dSdS(sfReturns the line of text containing loc within a string, counting newlines as line separators.
       s
iiN(R?tfind(RR@tlastCRtnextCR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyREs
cCsAdt|dt|dt||t||fGHdS(NsMatch s at loc s(%d,%d)(RRHR7(tinstringRtexpr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultStartDebugActionscCs'dt|dt|jGHdS(NsMatched s -> (RRuR(REtstartloctendlocRFttoks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultSuccessDebugActionscCsdt|GHdS(NsException raised:(R(RERRFtexc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultExceptionDebugActionscGsdS(sG'Do-nothing' debug action, to suppress debugging output during parsing.N((R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyROsicstkrfdSdgtgtd dkrVdd}ddntj}tjd}|d	dd
}|d|d|ffd}d
}y"tdtdj}Wntk
rt	}nX||_|S(Ncs
|S(N((RtlRp(tfunc(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRriiiicSsJtdkrdnd}tjd||d|}|j|jfgS(	Niiiiitlimiti(iii(tsystem_versiont	tracebackt
extract_stacktfilenameRH(RPRt
frame_summary((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRSscSs2tj|d|}|d}|j|jfgS(NRPi(RRt
extract_tbRTRH(ttbRPtframesRU((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRVs
iRPiicsxy&|d}td<|SWqtk
rdrInAz:tjd}|dddd ksnWd~Xdkrdcd7Rt	__class__(ii(
tsingleArgBuiltinsRRQRRRSRVtgetattrRt	ExceptionRu(ROR[RSt	LINE_DIFFt	this_lineR]t	func_name((RVRZRORPR[R\s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_trim_aritys*
					
	cBseZdZdZeZedZedZedZ	dZ
dZedZe
dZd	Zd
ZdZdZd
ZdZe
dZdZe
e
dZdZdZdefdYZedFk	rdefdYZndefdYZiZe Z!ddgZ"e
e
dZ#eZ$edZ%eZ&eddZ'edZ(e)edZ*d Z+e)d!Z,e)ed"Z-d#Z.d$Z/d%Z0d&Z1d'Z2d(Z3d)Z4d*Z5d+Z6d,Z7d-Z8d.Z9d/Z:dFd0Z;d1Z<d2Z=d3Z>d4Z?d5Z@d6ZAe
d7ZBd8ZCd9ZDd:ZEd;ZFgd<ZGed=ZHd>ZId?ZJd@ZKdAZLdBZMe
dCZNe
dDe
e
edEZORS(Gs)Abstract base level parser element class.s 
	
cCs
|t_dS(s
        Overrides the default whitespace chars

        Example::
            # default whitespace chars are space,  and newline
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
            
            # change to just treat newline as significant
            ParserElement.setDefaultWhitespaceChars(" \t")
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
        N(R"tDEFAULT_WHITE_CHARS(tchars((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultWhitespaceChars=s
cCs
|t_dS(s
        Set class to be used for inclusion of string literals into a parser.
        
        Example::
            # default literal class used is Literal
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']


            # change to Suppress
            ParserElement.inlineLiteralsUsing(Suppress)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
        N(R"t_literalStringClass(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytinlineLiteralsUsingLscCst|_d|_d|_d|_||_t|_t	j
|_t|_t
|_t
|_t|_t
|_t
|_t|_d|_t|_d|_d|_t|_t
|_dS(NRr(NNN(RtparseActionRt
failActiontstrReprtresultsNamet
saveAsListRtskipWhitespaceR"Rft
whiteCharstcopyDefaultWhiteCharsRtmayReturnEmptytkeepTabstignoreExprstdebugtstreamlinedt
mayIndexErrorterrmsgtmodalResultstdebugActionstretcallPreparset
callDuringTry(Rtsavelist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRas(																cCsEtj|}|j|_|j|_|jrAtj|_n|S(s$
        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
        for the same parsing pattern, using copies of the original parse element.
        
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
            
            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
        prints::
            [5120, 100, 655360, 268435456]
        Equivalent form of C{expr.copy()} is just C{expr()}::
            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
        (RRkRuRrR"RfRq(Rtcpy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRxs

	cCs>||_d|j|_t|dr:|j|j_n|S(sf
        Define name for this expression, makes debugging and exception messages clearer.
        
        Example::
            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
        s	Expected t	exception(RRyRRR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetNames
	cCsE|j}|jdr.|d }t}n||_||_|S(sP
        Define name for referencing matching tokens as a nested attribute
        of the returned parse results.
        NOTE: this returns a *copy* of the original C{ParserElement} object;
        this is so that the client can define a basic element, such as an
        integer, and reference it in multiple places with different names.

        You can also set results names using the abbreviated syntax,
        C{expr("name")} in place of C{expr.setResultsName("name")} - 
        see L{I{__call__}<__call__>}.

        Example::
            date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))

            # equivalent form:
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
        t*i(RtendswithRRnRz(RRtlistAllMatchestnewself((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetResultsNames
		
csa|r9|jttfd}|_||_n$t|jdr]|jj|_n|S(sMethod to invoke the Python pdb debugger when this element is
           about to be parsed. Set C{breakFlag} to True to enable, False to
           disable.
        cs)ddl}|j||||S(Ni(tpdbt	set_trace(RERt	doActionstcallPreParseR(t_parseMethod(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytbreakers
t_originalParseMethod(t_parseRRR(Rt	breakFlagR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetBreaks		cOs7tttt||_|jdt|_|S(s
        Define action to perform when successfully matching parse element definition.
        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
         - s   = the original string being parsed (see note below)
         - loc = the location of the matching substring
         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
        If the functions in fns modify the tokens, they can return them as the return
        value from fn, and the modified list of tokens will replace the original.
        Otherwise, fn does not need to return any value.

        Optional keyword arguments:
         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing

        Note: the default parsing behavior is to expand tabs in the input string
        before starting the parsing process.  See L{I{parseString}} for more information
        on parsing strings containing C{}s, and suggested methods to maintain a
        consistent view of the parsed string, the parse location, and line and column
        positions within the parsed string.
        
        Example::
            integer = Word(nums)
            date_str = integer + '/' + integer + '/' + integer

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']

            # use parse action to convert to ints at parse time
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            date_str = integer + '/' + integer + '/' + integer

            # note that integer fields are now ints, not strings
            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
        R~(RtmapReRkRRR~(RtfnsR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRzs"cOsF|jtttt|7_|jp<|jdt|_|S(s
        Add parse action to expression's list of parse actions. See L{I{setParseAction}}.
        
        See examples in L{I{copy}}.
        R~(RkRRReR~RR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddParseActions$cs|jdd|jdtr*tntx3|D]+fd}|jj|q7W|jp~|jdt|_|S(sAdd a boolean predicate function to expression's list of parse actions. See 
        L{I{setParseAction}} for function call signatures. Unlike C{setParseAction}, 
        functions passed to C{addCondition} need to return boolean success/fail of the condition.

        Optional keyword arguments:
         - message = define a custom message to be used in the raised exception
         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
         
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            year_int = integer.copy()
            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
            date_str = year_int + '/' + integer + '/' + integer

            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
        tmessagesfailed user-defined conditiontfatalcs7tt|||s3||ndS(N(RRe(RRNRp(texc_typetfnR(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpasR~(RRRRRkRR~(RRRR((RRRs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddConditions
cCs
||_|S(sDefine action to perform if parsing fails at this expression.
           Fail acton fn is a callable function that takes the arguments
           C{fn(s,loc,expr,err)} where:
            - s = string being parsed
            - loc = location where expression match was attempted and failed
            - expr = the parse expression that failed
            - err = the exception thrown
           The function returns no value.  It may throw C{L{ParseFatalException}}
           if it is desired to stop parsing immediately.(Rl(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
setFailActions
	cCsnt}xa|rit}xN|jD]C}y)x"|j||\}}t}q+WWqtk
raqXqWq	W|S(N(RRRuRR(RRERt
exprsFoundtetdummy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_skipIgnorables#s	
cCsp|jr|j||}n|jrl|j}t|}x-||krh|||krh|d7}q?Wn|S(Ni(RuRRpRqR(RRERtwttinstrlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpreParse0s			cCs
|gfS(N((RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	parseImpl<scCs|S(N((RRERt	tokenlist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	postParse?sc	Cs|j}|s|jr,|jdr?|jd|||n|rc|jrc|j||}n|}|}yUy|j|||\}}Wn/tk
rt|t||j	|nXWqt
k
r(}	|jdr|jd||||	n|jr"|j||||	nqXn|rP|jrP|j||}n|}|}|jsw|t|kry|j|||\}}Wqtk
rt|t||j	|qXn|j|||\}}|j|||}t
||jd|jd|j}
|jrf|s7|jrf|ryrxk|jD]`}||||
}|dk	rJt
||jd|jot|t
tfd|j}
qJqJWWqct
k
r}	|jdr|jd||||	nqcXqfxn|jD]`}||||
}|dk	rt
||jd|joMt|t
tfd|j}
qqWn|r|jdr|jd|||||
qn||
fS(NiiRRi(RvRlR{R}RRRRRRyRRxRR RnRoRzRkR~RRsR(RRERRRt	debuggingtprelocttokensStartttokensterrt	retTokensR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
_parseNoCacheCsp	

&
	

%$	

	
#cCsNy|j||dtdSWn)tk
rIt|||j|nXdS(NRi(RRRRRy(RRER((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyttryParses
cCs7y|j||Wnttfk
r.tSXtSdS(N(RRRRR(RRER((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcanParseNexts
t_UnboundedCachecBseZdZRS(csit|_fd}fd}fd}tj|||_tj|||_tj|||_dS(Ncsj|S(N(R(RR(tcachetnot_in_cache(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscs||})
         - define your parse action using the full C{(s,loc,toks)} signature, and
           reference the input string using the parse action's C{s} argument
         - explictly expand the tabs in your input string before calling
           C{parseString}
        
        Example::
            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
        iN(
R"RRwt
streamlineRuRtt
expandtabsRRRR'Rtverbose_stacktrace(RREtparseAllRRRtseRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytparseString#s$
	
		
ccs|js|jnx|jD]}|jq W|jsRt|j}nt|}d}|j}|j}t	j
d}	yx||kra|	|kray.|||}
|||
dt\}}Wntk
r|
d}qX||krT|	d7}	||
|fV|rK|||}
|
|kr>|}qQ|d7}q^|}q|
d}qWWn(t
k
r}t	jrq|nXdS(s
        Scan the input string for expression matches.  Each match will return the
        matching tokens, start location, and end location.  May be called with optional
        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
        C{overlap} is specified, then overlapping matches will be reported.

        Note that the start and end locations are reported relative to the string
        being parsed.  See L{I{parseString}} for more information on parsing
        strings with embedded tabs.

        Example::
            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
            print(source)
            for tokens,start,end in Word(alphas).scanString(source):
                print(' '*start + '^'*(end-start))
                print(' '*start + tokens[0])
        
        prints::
        
            sldjf123lsdjjkf345sldkjf879lkjsfd987
            ^^^^^
            sldjf
                    ^^^^^^^
                    lsdjjkf
                              ^^^^^^
                              sldkjf
                                       ^^^^^^
                                       lkjsfd
        iRiN(RwRRuRtRRRRRR"RRRRR(RREt
maxMatchestoverlapRRRt
preparseFntparseFntmatchesRtnextLocRtnextlocRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
scanStringUsB	
			


	
		c	Cs%g}d}t|_yx|j|D]}\}}}|j|||!|rt|trs||j7}qt|tr||7}q|j|n|}q(W|j||g|D]}|r|^q}djt	t
t|SWn(tk
r }t
jrq!|nXdS(sf
        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
        be returned from a parse action.  To use C{transformString}, define a grammar and
        attach a parse action to it that modifies the returned token list.
        Invoking C{transformString()} on a target string will then scan for matches,
        and replace the matched text patterns according to the logic in the parse
        action.  C{transformString()} returns the resulting transformed string.
        
        Example::
            wd = Word(alphas)
            wd.setParseAction(lambda toks: toks[0].title())
            
            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
        Prints::
            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
        iRrN(RRtRRRsR RRRRRt_flattenRR"R(	RRERtlastERpRRtoRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR{s(	

 	cCsey6tg|j||D]\}}}|^qSWn(tk
r`}tjrWqa|nXdS(s~
        Another extension to C{L{scanString}}, simplifying the access to the tokens found
        to match the given parse expression.  May be called with optional
        C{maxMatches} argument, to clip searching after 'n' matches are found.
        
        Example::
            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
            cap_word = Word(alphas.upper(), alphas.lower())
            
            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
        prints::
            ['More', 'Iron', 'Lead', 'Gold', 'I']
        N(R RRR"R(RRERRpRRRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsearchStrings6	c	csfd}d}xJ|j|d|D]3\}}}|||!V|rO|dVn|}q"W||VdS(s[
        Generator method to split a string using the given expression as a separator.
        May be called with optional C{maxsplit} argument, to limit the number of splits;
        and the optional C{includeSeparators} argument (default=C{False}), if the separating
        matching text should be included in the split results.
        
        Example::        
            punc = oneOf(list(".,;:/-!?"))
            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
        prints::
            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
        iRN(R(	RREtmaxsplittincludeSeparatorstsplitstlastRpRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
%
cCsdt|tr!tj|}nt|tsTtjdt|tdddSt	||gS(s
        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
        converts them to L{Literal}s by default.
        
        Example::
            greet = Word(alphas) + "," + Word(alphas) + "!"
            hello = "Hello, World!"
            print (hello, "->", greet.parseString(hello))
        Prints::
            Hello, World! -> ['Hello', ',', 'World', '!']
        s4Cannot combine element of type %s with ParserElementt
stackleveliN(
RsRR"RitwarningstwarnRt
SyntaxWarningRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s
cCs\t|tr!tj|}nt|tsTtjdt|tdddS||S(s]
        Implementation of + operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementRiN(	RsRR"RiRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
cCsmt|tr!tj|}nt|tsTtjdt|tdddSt	|t	j
|gS(sQ
        Implementation of - operator, returns C{L{And}} with error stop
        s4Cannot combine element of type %s with ParserElementRiN(RsRR"RiRRRRRRt
_ErrorStop(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__sub__s
cCs\t|tr!tj|}nt|tsTtjdt|tdddS||S(s]
        Implementation of - operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementRiN(	RsRR"RiRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rsub__ s
csEt|tr|d}}n-t|tr7|dd }|dd
kr_d|df}nt|dtr|dd
kr|ddkrtS|ddkrtS|dtSqLt|dtrt|dtr|\}}||8}qLtdt|dt|dntdt||dkrgtdn|dkrtdn||kodknrtdn|rfd	|r
|dkr|}qt	g||}qA|}n(|dkr.}nt	g|}|S(s
        Implementation of * operator, allows use of C{expr * 3} in place of
        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
        may also include C{None} as in:
         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
              to C{expr*n + L{ZeroOrMore}(expr)}
              (read as "at least n instances of C{expr}")
         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
              (read as "0 to n instances of C{expr}")
         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}

        Note that C{expr*(None,n)} does not raise an exception if
        more than n exprs exist in the input stream; that is,
        C{expr*(None,n)} does not enforce a maximum number of expr
        occurrences.  If this behavior is desired, then write
        C{expr*(None,n) + ~expr}
        iiis7cannot multiply 'ParserElement' and ('%s','%s') objectss0cannot multiply 'ParserElement' and '%s' objectss/cannot multiply ParserElement by negative values@second tuple value must be greater or equal to first tuple values+cannot multiply ParserElement by 0 or (0,0)cs2|dkr$t|dStSdS(Ni(R(tn(tmakeOptionalListR(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR]sN(NN(
RsRottupleRR0RRRt
ValueErrorR(RR	tminElementstoptElementsR}((RRs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__mul__,sD#

&
) 	cCs
|j|S(N(R(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rmul__pscCsdt|tr!tj|}nt|tsTtjdt|tdddSt	||gS(sI
        Implementation of | operator - returns C{L{MatchFirst}}
        s4Cannot combine element of type %s with ParserElementRiN(
RsRR"RiRRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__or__ss
cCs\t|tr!tj|}nt|tsTtjdt|tdddS||BS(s]
        Implementation of | operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementRiN(	RsRR"RiRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ror__s
cCsdt|tr!tj|}nt|tsTtjdt|tdddSt	||gS(sA
        Implementation of ^ operator - returns C{L{Or}}
        s4Cannot combine element of type %s with ParserElementRiN(
RsRR"RiRRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__xor__s
cCs\t|tr!tj|}nt|tsTtjdt|tdddS||AS(s]
        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementRiN(	RsRR"RiRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rxor__s
cCsdt|tr!tj|}nt|tsTtjdt|tdddSt	||gS(sC
        Implementation of & operator - returns C{L{Each}}
        s4Cannot combine element of type %s with ParserElementRiN(
RsRR"RiRRRRRR
(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__and__s
cCs\t|tr!tj|}nt|tsTtjdt|tdddS||@S(s]
        Implementation of & operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementRiN(	RsRR"RiRRRRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rand__s
cCs
t|S(sE
        Implementation of ~ operator - returns C{L{NotAny}}
        (R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
__invert__scCs'|dk	r|j|S|jSdS(s

        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
        
        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
        passed as C{True}.
           
        If C{name} is omitted, same as calling C{L{copy}}.

        Example::
            # these are equivalent
            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
        N(RRR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__call__s
cCs
t|S(s
        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
        cluttering up returned output.
        (R)(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsuppressscCs
t|_|S(s
        Disables the skipping of whitespace before matching the characters in the
        C{ParserElement}'s defined pattern.  This is normally only used internally by
        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
        (RRp(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytleaveWhitespaces	cCst|_||_t|_|S(s8
        Overrides the default whitespace chars
        (RRpRqRRr(RRg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetWhitespaceCharss			cCs
t|_|S(s
        Overrides default behavior to expand C{}s to spaces before parsing the input string.
        Must be called before C{parseString} when the input grammar contains elements that
        match C{} characters.
        (RRt(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
parseWithTabss	cCsrt|trt|}nt|trR||jkrn|jj|qnn|jjt|j|S(s
        Define expression to be ignored (e.g., comments) while doing pattern
        matching; may be called repeatedly, to define multiple comment or other
        ignorable patterns.
        
        Example::
            patt = OneOrMore(Word(alphas))
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
            
            patt.ignore(cStyleComment)
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
        (RsRR)RuRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytignores
cCs1|p	t|pt|ptf|_t|_|S(sT
        Enable display of debugging messages while doing pattern matching.
        (RGRKRMR{RRv(RtstartActiont
successActiontexceptionAction((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugActions
s
			cCs)|r|jtttn	t|_|S(s
        Enable display of debugging messages while doing pattern matching.
        Set C{flag} to True to enable, False to disable.

        Example::
            wd = Word(alphas).setName("alphaword")
            integer = Word(nums).setName("numword")
            term = wd | integer
            
            # turn on debugging for wd
            wd.setDebug()

            OneOrMore(term).parseString("abc 123 xyz 890")
        
        prints::
            Match alphaword at loc 0(1,1)
            Matched alphaword -> ['abc']
            Match alphaword at loc 3(1,4)
            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
            Match alphaword at loc 7(1,8)
            Matched alphaword -> ['xyz']
            Match alphaword at loc 11(1,12)
            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
            Match alphaword at loc 15(1,16)
            Exception raised:Expected alphaword (at char 15), (line:1, col:16)

        The output shown is that produced by the default debug actions - custom debug actions can be
        specified using L{setDebugActions}. Prior to attempting
        to match the C{wd} expression, the debugging message C{"Match  at loc (,)"}
        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
        which makes debugging and exception messages easier to understand - for instance, the default
        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
        (RRGRKRMRRv(Rtflag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugs#	cCs|jS(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR@scCs
t|S(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRCscCst|_d|_|S(N(RRwRRm(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRFs		cCsdS(N((RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckRecursionKscCs|jgdS(sj
        Check defined expressions for valid structure, check for infinite recursive definitions.
        N(R(Rt
validateTrace((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvalidateNscCsy|j}Wn5tk
rGt|d}|j}WdQXnXy|j||SWn(tk
r}tjr}q|nXdS(s
        Execute the parse expression on the given file or filename.
        If a filename is specified (instead of a file object),
        the entire file is opened, read, and closed before parsing.
        trN(treadRtopenRRR"R(Rtfile_or_filenameRt
file_contentstfRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	parseFileTs
	cCsdt|tr1||kp0t|t|kSt|trM|j|Stt||kSdS(N(RsR"tvarsRRtsuper(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__eq__hs
"
cCs||kS(N((RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ne__pscCstt|S(N(thashtid(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__hash__sscCs
||kS(N((RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__req__vscCs||kS(N((RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rne__yscCs:y!|jt|d|tSWntk
r5tSXdS(s
        Method for quick testing of a parser against a test string. Good for simple 
        inline microtests of sub expressions while building up larger parser.
           
        Parameters:
         - testString - to test against this expression for a match
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
            
        Example::
            expr = Word(nums)
            assert expr.matches("100")
        RN(RRRRR(Rt
testStringR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR|s


t#cCsyt|tr6tttj|jj}nt|trTt|}ng}g}t	}	x|D]}
|dk	r|j|
ts|r|
r|j
|
qmn|
sqmndj||
g}g}yQ|
jdd}
|j|
d|}|j
|jd||	o%|}	Wntk
r}
t|
trPdnd}d|
kr|j
t|
j|
|j
dt|
j|
dd	|n|j
d|
jd	||j
d
t|
|	o|}	|
}n<tk
r*}|j
dt||	o|}	|}nX|rX|rG|j
dndj|GHn|j
|
|fqmW|	|fS(
s3
        Execute the parse expression on a series of test strings, showing each
        test, the parsed results or where the parse failed. Quick and easy way to
        run a parse expression against a list of sample strings.
           
        Parameters:
         - tests - a list of separate test strings, or a multiline string of test strings
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
              string; pass None to disable comment filtering
         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
              if False, only dump nested list
         - printResults - (default=C{True}) prints test output to stdout
         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing

        Returns: a (success, results) tuple, where success indicates that all tests succeeded
        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
        test's output
        
        Example::
            number_expr = pyparsing_common.number.copy()

            result = number_expr.runTests('''
                # unsigned integer
                100
                # negative integer
                -100
                # float with scientific notation
                6.02e23
                # integer with scientific notation
                1e-12
                ''')
            print("Success" if result[0] else "Failed!")

            result = number_expr.runTests('''
                # stray character
                100Z
                # missing leading digit before '.'
                -.100
                # too many '.'
                3.14.159
                ''', failureTests=True)
            print("Success" if result[0] else "Failed!")
        prints::
            # unsigned integer
            100
            [100]

            # negative integer
            -100
            [-100]

            # float with scientific notation
            6.02e23
            [6.02e+23]

            # integer with scientific notation
            1e-12
            [1e-12]

            Success
            
            # stray character
            100Z
               ^
            FAIL: Expected end of text (at char 3), (line:1, col:4)

            # missing leading digit before '.'
            -.100
            ^
            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)

            # too many '.'
            3.14.159
                ^
            FAIL: Expected end of text (at char 4), (line:1, col:5)

            Success

        Each test string must be on a single line. If you want to test a string that spans multiple
        lines, create a test like this::

            expr.runTest(r"this is a test\n of strings that spans \n 3 lines")
        
        (Note that this is a raw string literal, you must include the leading 'r'.)
        s
s\nRR6s(FATAL)Rrt it^sFAIL: sFAIL-EXCEPTION: N(RsRRRRuRtrstript
splitlinesRRRRRRRRRR3RRRERR7Ra(RttestsRtcommenttfullDumptprintResultstfailureTestst
allResultstcommentstsuccessRpRtresultRRRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytrunTestssNW'
+
,	
N(PRRRRfRRtstaticmethodRhRjRRRRRRRzRRRRRRRRRRRRRRRRRRRRRRRRRt_MAX_INTRR{RRR
RRRRRRRRRRRRRRRRRRRRRRRRRR	RR
RRRRR"(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR"8s			&	
		
	
		H			"2G	+					D																	
)									cBseZdZdZRS(sT
    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
    cCstt|jdtdS(NR(RR*RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s(RRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR*	scBseZdZdZRS(s,
    An empty token, will always match.
    cCs2tt|jd|_t|_t|_dS(NR(RRRRRRsRRx(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s		(RRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	scBs#eZdZdZedZRS(s(
    A token that will never match.
    cCs;tt|jd|_t|_t|_d|_dS(NRsUnmatchable token(	RRRRRRsRRxRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR*	s
			cCst|||j|dS(N(RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR1	s(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR&	s	cBs#eZdZdZedZRS(s
    Token to exactly match a specified string.
    
    Example::
        Literal('blah').parseString('blah')  # -> ['blah']
        Literal('blah').parseString('blahfooblah')  # -> ['blah']
        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
    
    For case-insensitive matching, use L{CaselessLiteral}.
    
    For keyword matching (force word break before and after the matched string),
    use L{Keyword} or L{CaselessKeyword}.
    cCstt|j||_t||_y|d|_Wn0tk
rntj	dt
ddt|_nXdt
|j|_d|j|_t|_t|_dS(Nis2null string passed to Literal; use Empty() insteadRis"%s"s	Expected (RRRtmatchRtmatchLentfirstMatchCharRRRRRR^RRRyRRsRx(RtmatchString((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRC	s	
	

	cCsg|||jkrK|jdks7|j|j|rK||j|jfSt|||j|dS(Ni(R'R&t
startswithR%RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRV	s$(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5	s
	cBsKeZdZedZdedZedZ	dZ
edZRS(s\
    Token to exactly match a specified string as a keyword, that is, it must be
    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
    Accepts two optional constructor arguments in addition to the keyword string:
     - C{identChars} is a string of characters that would be valid identifier characters,
          defaulting to all alphanumerics + "_" and "$"
     - C{caseless} allows case-insensitive matching, default is C{False}.
       
    Example::
        Keyword("start").parseString("start")  # -> ['start']
        Keyword("start").parseString("starting")  # -> Exception

    For case-insensitive matching, use L{CaselessKeyword}.
    s_$cCstt|j|dkr+tj}n||_t||_y|d|_Wn't	k
r}t
jdtddnXd|j|_
d|j
|_t|_t|_||_|r|j|_|j}nt||_dS(Nis2null string passed to Keyword; use Empty() insteadRis"%s"s	Expected (RRRRtDEFAULT_KEYWORD_CHARSR%RR&R'RRRRRRyRRsRxtcaselesstuppert
caselessmatchRt
identChars(RR(R.R+((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq	s&	
				cCsb|jr||||j!j|jkrF|t||jkse|||jj|jkrF|dks||dj|jkrF||j|jfSn|||jkrF|jdks|j|j|rF|t||jks|||j|jkrF|dks2||d|jkrF||j|jfSt	|||j
|dS(Nii(R+R&R,R-RR.R%R'R)RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s	#9)$3#cCs%tt|j}tj|_|S(N(RRRR*R.(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	scCs
|t_dS(s,Overrides the default Keyword chars
        N(RR*(Rg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultKeywordChars	sN(
RRRR1R*RRRRRRR#R/(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR^	s
	cBs#eZdZdZedZRS(sl
    Token to match a specified string, ignoring case of letters.
    Note: the matched results will always be in the case of the given
    match string, NOT the case of the input text.

    Example::
        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
        
    (Contrast with example for L{CaselessKeyword}.)
    cCsItt|j|j||_d|j|_d|j|_dS(Ns'%s's	Expected (RRRR,treturnStringRRy(RR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s	cCsS||||j!j|jkr7||j|jfSt|||j|dS(N(R&R,R%R0RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s#(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s
	cBs&eZdZddZedZRS(s
    Caseless version of L{Keyword}.

    Example::
        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
        
    (Contrast with example for L{CaselessLiteral}.)
    cCs#tt|j||dtdS(NR+(RRRR(RR(R.((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	scCs||||j!j|jkrp|t||jks\|||jj|jkrp||j|jfSt|||j|dS(N(R&R,R-RR.R%RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s#9N(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	scBs&eZdZddZedZRS(sx
    A variation on L{Literal} which matches "close" matches, that is, 
    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
     - C{match_string} - string to be matched
     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
    
    The results from a successful parse will contain the matched text from the input string and the following named results:
     - C{mismatches} - a list of the positions within the match_string where mismatches were found
     - C{original} - the original match_string used to compare against the input string
    
    If C{mismatches} is an empty list, then the match was an exact match.
    
    Example::
        patt = CloseMatch("ATCATCGAATGGA")
        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)

        # exact match
        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})

        # close match allowing up to 2 mismatches
        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
    icCs]tt|j||_||_||_d|j|jf|_t|_t|_	dS(Ns&Expected %r (with up to %d mismatches)(
RRjRRtmatch_stringt
maxMismatchesRyRRxRs(RR1R2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s				cCs|}t|}|t|j}||kr|j}d}g}	|j}
xtt|||!|jD]J\}}|\}}
||
kro|	j|t|	|
krPqqoqoW|d}t|||!g}|j|d<|	|d<||fSnt|||j|dS(Niitoriginalt
mismatches(	RR1R2RRRR RRy(RRERRtstartRtmaxlocR1tmatch_stringlocR4R2ts_mtsrctmattresults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	s(		,




(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj	s	cBs>eZdZddddeddZedZdZRS(s	
    Token for matching words composed of allowed character sets.
    Defined with string containing all allowed initial characters,
    an optional string containing allowed body characters (if omitted,
    defaults to the initial character set), and an optional minimum,
    maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction. An optional
    C{excludeChars} parameter can list characters that might be found in 
    the input C{bodyChars} string; useful to define a word of all printables
    except for one or two characters, for instance.
    
    L{srange} is useful for defining custom character set strings for defining 
    C{Word} expressions, using range notation from regular expression character sets.
    
    A common mistake is to use C{Word} to match a specific literal string, as in 
    C{Word("Address")}. Remember that C{Word} uses the string argument to define
    I{sets} of matchable characters. This expression would match "Add", "AAA",
    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
    To match an exact literal string, use L{Literal} or L{Keyword}.

    pyparsing includes helper strings for building Words:
     - L{alphas}
     - L{nums}
     - L{alphanums}
     - L{hexnums}
     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
     - L{printables} (any non-whitespace character)

    Example::
        # a word composed of digits
        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
        
        # a word with a leading capital, and zero or more lowercase
        capital_word = Word(alphas.upper(), alphas.lower())

        # hostnames are alphanumeric, with leading alpha, and '-'
        hostname = Word(alphas, alphanums+'-')
        
        # roman numeral (not a strict parser, accepts invalid mix of characters)
        roman = Word("IVXLCDM")
        
        # any string of non-whitespace characters, except for ','
        csv_value = Word(printables, excludeChars=",")
    iicstt|jrcdjfd|D}|rcdjfd|D}qcn||_t||_|r||_t||_n||_t||_|dk|_	|dkrt
dn||_|dkr||_n	t
|_|dkr)||_||_nt||_d|j|_t|_||_d|j|jkr}|dkr}|dkr}|dkr}|j|jkrd	t|j|_net|jdkrd
tj|jt|jf|_n%dt|jt|jf|_|jrDd|jd|_nytj|j|_Wq}tk
ryd|_q}XndS(
NRrc3s!|]}|kr|VqdS(N((RR(texcludeChars(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	7
sc3s!|]}|kr|VqdS(N((RR(R<(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	9
siisZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitteds	Expected Rs[%s]+s%s[%s]*s	[%s][%s]*s\b(RR-RRt
initCharsOrigRt	initCharst
bodyCharsOrigt	bodyCharstmaxSpecifiedRtminLentmaxLenR$RRRyRRxt	asKeywordt_escapeRegexRangeCharstreStringRR|tescapetcompileRaR(RR>R@tmintmaxtexactRDR<((R<s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR4
sT%								:	
c
Cs|jr[|jj||}|s?t|||j|n|j}||jfS|||jkrt|||j|n|}|d7}t|}|j}||j	}t
||}x*||kr|||kr|d7}qWt}	|||jkrt
}	n|jrG||krG|||krGt
}	n|jr|dkrp||d|ks||kr|||krt
}	qn|	rt|||j|n||||!fS(Nii(R|R%RRytendtgroupR>RR@RCRIRRBRRARD(
RRERRR!R5Rt	bodycharsR6tthrowException((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj
s6	
	
	%		<cCsytt|jSWntk
r*nX|jdkrd}|j|jkr}d||j||jf|_qd||j|_n|jS(NcSs&t|dkr|d dS|SdS(Nis...(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
charsAsStr
ss	W:(%s,%s)sW:(%s)(RR-RRaRmRR=R?(RRP((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s
	(N(	RRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR-
s.6#cBsDeZdZeejdZddZedZ	dZ
RS(s
    Token for matching strings that match a given regular expression.
    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
    If the given regex contains named groups (defined using C{(?P...)}), these will be preserved as 
    named parse results.

    Example::
        realnum = Regex(r"[+-]?\d+\.\d*")
        date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)')
        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
    s[A-Z]icCs3tt|jt|tr|sAtjdtddn||_||_	y+t
j|j|j	|_
|j|_Wqt
jk
rtjd|tddqXnIt|tjr||_
t||_|_||_	ntdt||_d|j|_t|_t|_dS(sThe parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.s0null string passed to Regex; use Empty() insteadRis$invalid pattern (%s) passed to RegexsCRegex may only be constructed with a string or a compiled RE objects	Expected N(RR%RRsRRRRtpatterntflagsR|RHRFt
sre_constantsterrortcompiledREtypeRuRRRRyRRxRRs(RRQRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s.			


		cCs|jj||}|s6t|||j|n|j}|j}t|j}|rx|D]}||||eZdZddeededZedZdZRS(s
    Token for matching strings that are delimited by quoting characters.
    
    Defined with the following parameters:
        - quoteChar - string of one or more characters defining the quote delimiting string
        - escChar - character to escape quotes, typically backslash (default=C{None})
        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})

    Example::
        qs = QuotedString('"')
        print(qs.searchString('lsjdf "This is the quote" sldjf'))
        complex_qs = QuotedString('{{', endQuoteChar='}}')
        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
        sql_qs = QuotedString('"', escQuote='""')
        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
    prints::
        [['This is the quote']]
        [['This is the "quote"']]
        [['This is the quote with "embedded" quotes']]
    c	sttj|j}|sGtjdtddtn|dkr\|}n4|j}|stjdtddtn|_	t
|_|d_|_
t
|_|_|_|_|_|rTtjtjB_dtjj	tj
d|dk	rDt|pGdf_nPd_dtjj	tj
d|dk	rt|pdf_t
j
d	krjd
djfdtt
j
d	dd
Dd7_n|r*jdtj|7_n|rhjdtj|7_tjjd_njdtjj
7_y+tjjj_j_Wn4tj k
rtjdjtddnXt!_"dj"_#t$_%t&_'dS(Ns$quoteChar cannot be the empty stringRis'endQuoteChar cannot be the empty stringis%s(?:[^%s%s]Rrs%s(?:[^%s\n\r%s]is|(?:s)|(?:c3s<|]2}dtjj| tj|fVqdS(s%s[^%s]N(R|RGtendQuoteCharRE(RR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	/sit)s|(?:%s)s|(?:%s.)s(.)s)*%ss$invalid pattern (%s) passed to Regexs	Expected ((RR#RRRRRtSyntaxErrorRt	quoteCharRtquoteCharLentfirstQuoteCharRXtendQuoteCharLentescChartescQuotetunquoteResultstconvertWhitespaceEscapesR|t	MULTILINEtDOTALLRRRGRERQRRtescCharReplacePatternRHRFRSRTRRRyRRxRRs(RR[R_R`t	multilineRaRXRb((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsf		
					(	%E
	c	CsT|||jkr(|jj||p+d}|sOt|||j|n|j}|j}|jrJ||j	|j
!}t|trJd|kr|j
ridd6dd6dd6dd	6}x/|jD]\}}|j||}qWn|jr tj|jd
|}n|jrG|j|j|j}qGqJn||fS(Ns\s	s\ts
s\nss\fs
s\rs\g<1>(R]R|R%RRRyRLRMRaR\R^RsRRbRRR_RReR`RX(	RRERRR!R}tws_maptwslittwschar((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRGs*.	
		!cCs]ytt|jSWntk
r*nX|jdkrVd|j|jf|_n|jS(Ns.quoted string, starting with %s ending with %s(RR#RRaRmRR[RX(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRjs
N(	RRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR#
sA#cBs5eZdZddddZedZdZRS(s
    Token for matching words composed of characters I{not} in a given set (will
    include whitespace in matched characters if not listed in the provided exclusion set - see example).
    Defined with string containing all disallowed characters, and an optional
    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction.

    Example::
        # define a comma-separated-value as anything that is not a ','
        csv_value = CharsNotIn(',')
        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
    prints::
        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
    iicCstt|jt|_||_|dkr@tdn||_|dkra||_n	t	|_|dkr||_||_nt
||_d|j|_|jdk|_
t|_dS(Nisfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedis	Expected (RRRRRptnotCharsRRBRCR$RRRyRsRx(RRjRIRJRK((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs 					cCs|||jkr.t|||j|n|}|d7}|j}t||jt|}x*||kr|||kr|d7}qfW|||jkrt|||j|n||||!fS(Ni(RjRRyRIRCRRB(RRERRR5tnotcharstmaxlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
	cCsytt|jSWntk
r*nX|jdkryt|jdkrfd|jd |_qyd|j|_n|jS(Nis
!W:(%s...)s!W:(%s)(RRRRaRmRRRj(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRvscBsXeZdZidd6dd6dd6dd6d	d
6Zddd
d
dZedZRS(s
    Special matching class for matching whitespace.  Normally, whitespace is ignored
    by pyparsing grammars.  This class is included when some whitespace structures
    are significant.  Define with a string containing the whitespace characters to be
    matched; default is C{" \t\r\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
    as defined for the C{L{Word}} class.
    sRss	ss
ss
sss 	
iicsttj|_jdjfdjDdjdjD_t_	dj_
|_|dkr|_n	t
_|dkr|_|_ndS(NRrc3s$|]}|jkr|VqdS(N(t
matchWhite(RR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	scss|]}tj|VqdS(N(R,t	whiteStrs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	ss	Expected i(RR,RRmRRRqRRRsRyRBRCR$(RtwsRIRJRK((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	)				cCs|||jkr.t|||j|n|}|d7}||j}t|t|}x-||kr|||jkr|d7}qcW|||jkrt|||j|n||||!fS(Ni(RmRRyRCRIRRB(RRERRR5R6((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs

"(RRRRnRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR,s
t_PositionTokencBseZdZRS(cCs8tt|j|jj|_t|_t|_	dS(N(
RRpRR^RRRRsRRx(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	(RRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRpscBs,eZdZdZdZedZRS(sb
    Token to advance to a specific column of input text; useful for tabular report scraping.
    cCs tt|j||_dS(N(RRRR7(Rtcolno((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCst|||jkrt|}|jrB|j||}nxE||kr||jrt|||jkr|d7}qEWn|S(Ni(R7RRuRtisspace(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	7cCs^t||}||jkr6t||d|n||j|}|||!}||fS(NsText not in expected column(R7R(RRERRtthiscoltnewlocR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs			cBs#eZdZdZedZRS(s
    Matches if current position is at the beginning of a line within the parse string
    
    Example::
    
        test = '''        AAA this line
        AAA and this line
          AAA but not this one
        B AAA and definitely not this one
        '''

        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
            print(t)
    
    Prints::
        ['AAA', ' this line']
        ['AAA', ' and this line']    

    cCs tt|jd|_dS(NsExpected start of line(RRRRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR&scCs;t||dkr|gfSt|||j|dS(Ni(R7RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR*s
(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cBs#eZdZdZedZRS(sU
    Matches if current position is at the end of a line within the parse string
    cCs<tt|j|jtjjddd|_dS(Ns
RrsExpected end of line(RRRRR"RfRRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR3scCs|t|krK||dkr0|ddfSt|||j|n8|t|krk|dgfSt|||j|dS(Ns
i(RRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR8s(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/s	cBs#eZdZdZedZRS(sM
    Matches if current position is at the beginning of the parse string
    cCs tt|jd|_dS(NsExpected start of text(RR(RRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRGscCsL|dkrB||j|dkrBt|||j|qBn|gfS(Ni(RRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRKs(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR(Cs	cBs#eZdZdZedZRS(sG
    Matches if current position is at the end of the parse string
    cCs tt|jd|_dS(NsExpected end of text(RR'RRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRVscCs|t|kr-t|||j|nT|t|krM|dgfS|t|kri|gfSt|||j|dS(Ni(RRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZs
(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR'Rs	cBs&eZdZedZedZRS(sp
    Matches if the current position is at the beginning of a Word, and
    is not preceded by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{} behavior of regular expressions,
    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
    the string being parsed, or at the beginning of a line.
    cCs/tt|jt||_d|_dS(NsNot at the start of a word(RR/RRt	wordCharsRy(RRu((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRlscCs^|dkrT||d|jks6|||jkrTt|||j|qTn|gfS(Nii(RuRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqs
(RRRRTRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/dscBs&eZdZedZedZRS(sZ
    Matches if the current position is at the end of a Word, and
    is not followed by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{} behavior of regular expressions,
    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
    the string being parsed, or at the end of a line.
    cCs8tt|jt||_t|_d|_dS(NsNot at the end of a word(RR.RRRuRRpRy(RRu((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cCsvt|}|dkrl||krl|||jksN||d|jkrlt|||j|qln|gfS(Nii(RRuRRy(RRERRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs(RRRRTRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR.xscBsqeZdZedZdZdZdZdZdZ	dZ
edZgd	Zd
Z
RS(s^
    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
    cCstt|j|t|tr4t|}nt|tr[tj|g|_	nt|t
jrt|}td|Drt
tj|}nt||_	n3yt||_	Wntk
r|g|_	nXt|_dS(Ncss|]}t|tVqdS(N(RsR(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s(RRRRsRRRR"RitexprsRtIterabletallRRRR}(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
cCs|j|S(N(Rv(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs|jj|d|_|S(N(RvRRRm(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cCsPt|_g|jD]}|j^q|_x|jD]}|jq8W|S(s~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
           all contained expressions.(RRpRvRR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
	%cCst|trb||jkrtt|j|x(|jD]}|j|jdq>Wqn>tt|j|x%|jD]}|j|jdqW|S(Ni(RsR)RuRRRRv(RR	R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsfytt|jSWntk
r*nX|jdkr_d|jjt|j	f|_n|jS(Ns%s:(%s)(
RRRRaRmRR^RRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
%cCswtt|jx|jD]}|jqWt|jdkr`|jd}t||jr|jr|jdkr|j
r|j|jdg|_d|_|j|jO_|j
|j
O_
n|jd}t||jr`|jr`|jdkr`|j
r`|jd |j|_d|_|j|jO_|j
|j
O_
q`ndt||_|S(Niiiis	Expected (RRRRvRRsR^RkRnRRvRmRsRxRRy(RRR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs0


	


	cCstt|j||}|S(N(RRR(RRRR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs@||g}x|jD]}|j|qW|jgdS(N(RvRR(RRttmpR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs>tt|j}g|jD]}|j^q|_|S(N(RRRRv(RR}R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs%(RRRRRRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs						
	"cBsWeZdZdefdYZedZedZdZdZ	dZ
RS(s

    Requires all given C{ParseExpression}s to be found in the given order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'+'} operator.
    May also be constructed using the C{'-'} operator, which will suppress backtracking.

    Example::
        integer = Word(nums)
        name_expr = OneOrMore(Word(alphas))

        expr = And([integer("id"),name_expr("name"),integer("age")])
        # more easily written as:
        expr = integer("id") + name_expr("name") + integer("age")
    RcBseZdZRS(cOs3ttj|j||d|_|jdS(Nt-(RRRRRR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s	(RRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
scCsltt|j||td|jD|_|j|jdj|jdj|_t	|_
dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	
si(RRRRxRvRsRRqRpRR}(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s
c	Cs?|jdj|||dt\}}t}x|jdD]}t|tjr`t}q<n|ry|j|||\}}Wqtk
rqtk
r}d|_
tj|qtk
rt|t
||j|qXn|j|||\}}|s$|jr<||7}q<q<W||fS(NiRi(RvRRRsRRRR!RRt
__traceback__RRRRyR(	RRERRt
resultlistt	errorStopRt
exprtokensR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s((
	
%cCs.t|tr!tj|}n|j|S(N(RsRR"RiR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5
scCs@||g}x+|jD] }|j||jsPqqWdS(N(RvRRs(RRtsubRecCheckListR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:
s

	cCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRt{Rcss|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	F
st}(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRA
s
*(RRRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs		cBsAeZdZedZedZdZdZdZ	RS(s
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the expression that matches the longest string will be used.
    May be constructed using the C{'^'} operator.

    Example::
        # construct Or using '^' operator
        
        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789"))
    prints::
        [['123'], ['3.1416'], ['789']]
    cCsNtt|j|||jrAtd|jD|_n	t|_dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	\
s(RRRRvR4RsR(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRY
s	cCsd}d}g}x|jD]}y|j||}Wntk
rw}	d|	_|	j|kr|	}|	j}qqtk
rt||krt|t||j|}t|}qqX|j	||fqW|rh|j
ddxn|D]c\}
}y|j|||SWqtk
r`}	d|	_|	j|kra|	}|	j}qaqXqWn|dk	r|j|_|nt||d|dS(NiRcSs	|dS(Ni((tx((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqu
Rrs no defined alternatives to match(
RRvRRR{RRRRyRtsortRR(RRERRt	maxExcLoctmaxExceptionRRtloc2Rt_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR`
s<	
		cCs.t|tr!tj|}n|j|S(N(RsRR"RiR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ixor__
scCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRRs ^ css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	
sR(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s
*cCs3||g}x|jD]}|j|qWdS(N(RvR(RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s(
RRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK
s
&			cBsAeZdZedZedZdZdZdZ	RS(s
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the first one listed is the one that will match.
    May be constructed using the C{'|'} operator.

    Example::
        # construct MatchFirst using '|' operator
        
        # watch the order of expressions to match
        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]

        # put more selective expression first
        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
    cCsNtt|j|||jrAtd|jD|_n	t|_dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	
s(RRRRvR4RsR(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s	c	Csd}d}x|jD]}y|j|||}|SWqtk
ro}|j|kr|}|j}qqtk
rt||krt|t||j|}t|}qqXqW|dk	r|j|_|nt||d|dS(Nis no defined alternatives to match(	RRvRRRRRRyR(	RRERRRRRR}R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s$
	cCs.t|tr!tj|}n|j|S(N(RsRR"RiR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ior__
scCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRRs | css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	
sR(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s
*cCs3||g}x|jD]}|j|qWdS(N(RvR(RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s(
RRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s			cBs8eZdZedZedZdZdZRS(sm
    Requires all given C{ParseExpression}s to be found, but in any order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'&'} operator.

    Example::
        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
        integer = Word(nums)
        shape_attr = "shape:" + shape_type("shape")
        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
        color_attr = "color:" + color("color")
        size_attr = "size:" + integer("size")

        # use Each (using operator '&') to accept attributes in any order 
        # (shape and posn are required, color and size are optional)
        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)

        shape_spec.runTests('''
            shape: SQUARE color: BLACK posn: 100, 120
            shape: CIRCLE size: 50 color: BLUE posn: 50,80
            color:GREEN size:20 shape:TRIANGLE posn:20,40
            '''
            )
    prints::
        shape: SQUARE color: BLACK posn: 100, 120
        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
        - color: BLACK
        - posn: ['100', ',', '120']
          - x: 100
          - y: 120
        - shape: SQUARE


        shape: CIRCLE size: 50 color: BLUE posn: 50,80
        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
        - color: BLUE
        - posn: ['50', ',', '80']
          - x: 50
          - y: 80
        - shape: CIRCLE
        - size: 50


        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
        - color: GREEN
        - posn: ['20', ',', '40']
          - x: 20
          - y: 40
        - shape: TRIANGLE
        - size: 20
    cCsKtt|j||td|jD|_t|_t|_dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s(	RR
RRxRvRsRRptinitExprGroups(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cCs4|jrLtd|jD|_g|jD]}t|tr/|j^q/}g|jD]%}|jr]t|tr]|^q]}|||_g|jD]}t|t	r|j^q|_
g|jD]}t|tr|j^q|_g|jD]$}t|tt	tfs|^q|_
|j
|j7_
t|_n|}|j
}|j}	g}
t}x|r_||	|j
|j}g}
x|D]}y|j||}Wntk
r|
j|qX|
j|jjt||||kr|j|q||	kr|	j|qqWt|
t|krut}ququW|rdjd|D}t||d|n|
g|jD]*}t|tr|j|	kr|^q7}
g}x6|
D].}|j|||\}}|j|qWt|tg}||fS(Ncss3|])}t|trt|j|fVqdS(N(RsRRRF(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	ss, css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	=ss*Missing one or more required elements (%s)(RRRvtopt1mapRsRRFRst	optionalsR0tmultioptionalsRt
multirequiredtrequiredRRRRRRRtremoveRRRtsumR (RRERRRtopt1topt2ttmpLocttmpReqdttmpOptt
matchOrdertkeepMatchingttmpExprstfailedtmissingR|R;tfinalResults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsP	.5
117

	

"
>
cCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRRs & css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	PsR(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRKs
*cCs3||g}x|jD]}|j|qWdS(N(RvR(RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs(RRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR

s
51		cBs_eZdZedZedZdZdZdZ	dZ
gdZdZRS(	sa
    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
    cCstt|j|t|trattjtrItj|}qatjt	|}n||_
d|_|dk	r|j
|_
|j|_|j|j|j|_|j|_|j|_|jj|jndS(N(RRRRsRt
issubclassR"RiR*RRFRRmRxRsRRqRpRoR}RuR(RRFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR^s		cCsG|jdk	r+|jj|||dtStd||j|dS(NRRr(RFRRRRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRpscCs>t|_|jj|_|jdk	r:|jjn|S(N(RRpRFRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRvs
	cCst|trc||jkrtt|j||jdk	r`|jj|jdq`qn?tt|j||jdk	r|jj|jdn|S(Ni(RsR)RuRRRRFR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR}s cCs6tt|j|jdk	r2|jjn|S(N(RRRRFR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsV||kr"t||gn||g}|jdk	rR|jj|ndS(N(R$RFRR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
cCsA||g}|jdk	r0|jj|n|jgdS(N(RFRRR(RRRy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsuytt|jSWntk
r*nX|jdkrn|jdk	rnd|jjt	|jf|_n|jS(Ns%s:(%s)(
RRRRaRmRRFR^RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
%(
RRRRRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZs				cBs#eZdZdZedZRS(s
    Lookahead matching of the given parse expression.  C{FollowedBy}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression matches at the current
    position.  C{FollowedBy} always returns a null token list.

    Example::
        # use FollowedBy to match a label only if it is followed by a ':'
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
    prints::
        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
    cCs#tt|j|t|_dS(N(RRRRRs(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs|jj|||gfS(N(RFR(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cBs,eZdZdZedZdZRS(s
    Lookahead to disallow matching with the given parse expression.  C{NotAny}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression does I{not} match at the current
    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
    always returns a null token list.  May be constructed using the '~' operator.

    Example::
        
    cCsBtt|j|t|_t|_dt|j|_	dS(NsFound unwanted token, (
RRRRRpRRsRRFRy(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs		cCs:|jj||r0t|||j|n|gfS(N(RFRRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRs~{R(RRRmRRRF(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
	t_MultipleMatchcBs eZddZedZRS(cCsftt|j|t|_|}t|trFtj|}n|dk	rY|nd|_
dS(N(RRRRRoRsRR"RiRt	not_ender(RRFtstopOntender((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cCs|jj}|j}|jdk	}|r9|jj}n|rO|||n||||dt\}}y|j}	xo|r|||n|	r|||}
n|}
|||
|\}}|s|jr~||7}q~q~WWnt	t
fk
rnX||fS(NR(RFRRRRRRRuRRR(RRERRtself_expr_parsetself_skip_ignorablestcheck_endert
try_not_enderRthasIgnoreExprsRt	tmptokens((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs,	N(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBseZdZdZRS(s
    Repetition of one or more of the given expression.
    
    Parameters:
     - expr - expression that must match one or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: BLACK"
        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]

        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
        
        # could also be written as
        (attr_expr * (1,)).parseString(text).pprint()
    cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRRs}...(RRRmRRRF(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!s
(RRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBs/eZdZddZedZdZRS(sw
    Optional repetition of zero or more of the given expression.
    
    Parameters:
     - expr - expression that must match zero or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example: similar to L{OneOrMore}
    cCs)tt|j|d|t|_dS(NR(RR0RRRs(RRFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR6scCsEy tt|j|||SWnttfk
r@|gfSXdS(N(RR0RRR(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:s cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRRs]...(RRRmRRRF(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR@s
N(RRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR0*st
_NullTokencBs eZdZeZdZRS(cCstS(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRJscCsdS(NRr((R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRMs(RRRR>R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRIs	cBs/eZdZedZedZdZRS(sa
    Optional matching of the given expression.

    Parameters:
     - expr - expression that must match zero or more times
     - default (optional) - value to be returned if the optional expression is not found.

    Example::
        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
        zip.runTests('''
            # traditional ZIP code
            12345
            
            # ZIP+4 form
            12101-0001
            
            # invalid ZIP
            98765-
            ''')
    prints::
        # traditional ZIP code
        12345
        ['12345']

        # ZIP+4 form
        12101-0001
        ['12101-0001']

        # invalid ZIP
        98765-
             ^
        FAIL: Expected end of text (at char 5), (line:1, col:6)
    cCsAtt|j|dt|jj|_||_t|_dS(NR(	RRRRRFRoRRRs(RRFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRts	cCsy(|jj|||dt\}}Wnottfk
r|jtk	r|jjrt|jg}|j||jj ['3', '.', '1416']
        # will also erroneously match the following
        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']

        real = Combine(Word(nums) + '.' + Word(nums))
        print(real.parseString('3.1416')) # -> ['3.1416']
        # no match when there are internal spaces
        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
    RrcCsQtt|j||r)|jn||_t|_||_t|_dS(N(	RRRRtadjacentRRpt
joinStringR}(RRFRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRrs
			cCs6|jrtj||ntt|j||S(N(RR"RRR(RR	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR|s	cCse|j}|2|tdj|j|jgd|j7}|jr]|jr]|gS|SdS(NRrR(RR RRRRzRnR(RRERRtretToks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs1(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRas
	cBs eZdZdZdZRS(s
    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.

    Example::
        ident = Word(alphas)
        num = Word(nums)
        term = ident | num
        func = ident + Optional(delimitedList(term))
        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']

        func = ident + Group(Optional(delimitedList(term)))
        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
    cCs#tt|j|t|_dS(N(RRRRRo(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs|gS(N((RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs(RRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
	cBs eZdZdZdZRS(sW
    Converter to return a repetitive expression as a list, but also as a dictionary.
    Each element can also be referenced using the first token in the expression as its key.
    Useful for tabular report scraping when the first column can be used as a item key.

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        # print attributes as plain groups
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
        print(result.dump())
        
        # access named fields as dict entries, or output as dict
        print(result['shape'])        
        print(result.asDict())
    prints::
        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']

        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
    See more examples at L{ParseResults} of accessing fields by results name.
    cCs#tt|j|t|_dS(N(RR	RRRo(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsTx9t|D]+\}}t|dkr1q
n|d}t|trct|dj}nt|dkrtd|||nX|S(ss
    Decorator for debugging parse actions. 
    
    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.

    Example::
        wd = Word(alphas)

        @traceParseAction
        def remove_duplicate_chars(tokens):
            return ''.join(sorted(set(''.join(tokens)))

        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
    prints::
        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
        <>entering %s(line: '%s', %d, %r)
s< ['aa', 'bb', 'cc']
        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
    s [Rs]...N(RRR0RR)(RFtdelimtcombinetdlName((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR>9s
,!cstfd}|dkrBttjd}n|j}|jd|j|dt|jdt	dS(s:
    Helper to define a counted list of expressions.
    This helper defines a pattern of the form::
        integer expr expr expr...
    where the leading integer tells how many expr expressions follow.
    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
    
    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.

    Example::
        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']

        # in this parser, the leading integer value is given in binary,
        # '10' indicating that 2 values are in the array
        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
    cs;|d}|r,ttg|p5tt>gS(Ni(RRRA(RRNRpR(t	arrayExprRF(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcountFieldParseAction_s
-cSst|dS(Ni(Ro(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqdRrtarrayLenR~s(len) s...N(
R
RR-RPRzRRRRR(RFtintExprR((RRFs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:Ls	
cCsMg}x@|D]8}t|tr8|jt|q
|j|q
W|S(N(RsRRRR(tLR}R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRks
csFtfd}|j|dtjdt|S(s*
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousLiteral(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
    If this is not desired, use C{matchPreviousExpr}.
    Do I{not} use with packrat parsing enabled.
    csc|rTt|dkr'|d>q_t|j}td|D>nt>dS(Niicss|]}t|VqdS(N(R(Rttt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s(RRRRR(RRNRpttflat(trep(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcopyTokenToRepeatersR~s(prev) (R
RRRR(RFR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRMts

	
cs\t|j}|Kfd}|j|dtjdt|S(sS
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousExpr(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
    the expressions are evaluated first, and then compared, so
    C{"1"} is compared with C{"10"}.
    Do I{not} use with packrat parsing enabled.
    cs8t|jfd}j|dtdS(Ncs7t|j}|kr3tdddndS(NRri(RRR(RRNRpttheseTokens(tmatchTokens(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytmustMatchTheseTokenssR~(RRRzR(RRNRpR(R(Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsR~s(prev) (R
RRRRR(RFte2R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRLs	
cCsUx$dD]}|j|t|}qW|jdd}|jdd}t|S(Ns\^-]s
s\ns	s\t(Rt_bslashR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyREs

c
sD|r!d}d}tnd}d}tg}t|tr]|j}n7t|tjr~t|}ntj	dt
dd|stSd}x|t|d	krV||}xt
||d	D]f\}}	||	|r
|||d	=Pq|||	r|||d	=|j||	|	}PqqW|d	7}qW|r|ryt|td
j|krtdd
jd|Djd
j|Stdjd|Djd
j|SWqtk
rtj	dt
ddqXntfd|Djd
j|S(s
    Helper to quickly define a set of alternative Literals, and makes sure to do
    longest-first testing when there is a conflict, regardless of the input order,
    but returns a C{L{MatchFirst}} for best performance.

    Parameters:
     - strs - a string of space-delimited literals, or a collection of string literals
     - caseless - (default=C{False}) - treat all literals as caseless
     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
          if creating a C{Regex} raises an exception)

    Example::
        comp_oper = oneOf("< = > <= >= !=")
        var = Word(alphas)
        number = Word(nums)
        term = var | number
        comparison_expr = term + comp_oper + term
        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
    prints::
        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
    cSs|j|jkS(N(R,(Rtb((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcSs|jj|jS(N(R,R)(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcSs
||kS(N((RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcSs
|j|S(N(R)(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrs6Invalid argument to oneOf, expected string or iterableRiiiRrs[%s]css|]}t|VqdS(N(RE(Rtsym((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	ss | t|css|]}tj|VqdS(N(R|RG(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	ss7Exception creating Regex for oneOf, building MatchFirstc3s|]}|VqdS(N((RR(tparseElementClass(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	s(RRRsRRRRwRRRRRRRRRR%RRaR(
tstrsR+tuseRegextisequaltmaskstsymbolsRtcurRR	((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRQsL						

!
!33
	cCsttt||S(s
    Helper to easily and clearly define a dictionary by specifying the respective patterns
    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
    in the proper order.  The key pattern can include delimiting markers or punctuation,
    as long as they are suppressed, thereby leaving the significant key text.  The value
    pattern can include named results, so that the C{Dict} results can include named token
    fields.

    Example::
        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        attr_label = label
        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)

        # similar to Dict, but simpler call format
        result = dictOf(attr_label, attr_value).parseString(text)
        print(result.dump())
        print(result['shape'])
        print(result.shape)  # object attribute access works too
        print(result.asDict())
    prints::
        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        SQUARE
        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
    (R	R0R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR?s!cCs|tjd}|j}t|_|d||d}|rVd}n	d}|j||j|_|S(s
    Helper to return the original, untokenized text for a given expression.  Useful to
    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
    revert separate tokens with intervening whitespace back to the original matching
    input text. By default, returns astring containing the original parsed text.  
       
    If the optional C{asString} argument is passed as C{False}, then the return value is a 
    C{L{ParseResults}} containing any results names that were originally matched, and a 
    single token containing the original matched text from the input string.  So if 
    the expression passed to C{L{originalTextFor}} contains expressions with defined
    results names, you must set C{asString} to C{False} if you want to preserve those
    results name values.

    Example::
        src = "this is test  bold text  normal text "
        for tag in ("b","i"):
            opener,closer = makeHTMLTags(tag)
            patt = originalTextFor(opener + SkipTo(closer) + closer)
            print(patt.searchString(src)[0])
    prints::
        [' bold text ']
        ['text']
    cSs|S(N((RRRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq8Rrt_original_startt
_original_endcSs||j|j!S(N(RR(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq=RrcSs'||jd|jd!g|(dS(NRR(R(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytextractText?s(RRzRRR}Ru(RFtasStringt	locMarkertendlocMarkert	matchExprR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRe s		
cCst|jdS(sp
    Helper to undo pyparsing's default grouping of And expressions, even
    if all but one are non-empty.
    cSs|dS(Ni((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqJRr(R+Rz(RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfEscCsEtjd}t|d|d|jjdS(s
    Helper to decorate a returned token with its starting and ending locations in the input string.
    This helper adds the following results names:
     - locn_start = location where matched expression begins
     - locn_end = location where matched expression ends
     - value = the actual parsed results

    Be careful if the input text contains C{} characters, you may want to call
    C{L{ParserElement.parseWithTabs}}

    Example::
        wd = Word(alphas)
        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
            print(match)
    prints::
        [[0, 'ljsdf', 5]]
        [[8, 'lksdjjf', 15]]
        [[18, 'lkkjj', 23]]
    cSs|S(N((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq`Rrt
locn_startRtlocn_end(RRzRRR(RFtlocator((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRhLss\[]-*.$+^?()~ RKcCs|ddS(Nii((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqkRrs\\0?[xX][0-9a-fA-F]+cCs tt|djddS(Nis\0xi(tunichrRotlstrip(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqlRrs	\\0[0-7]+cCstt|dddS(Niii(RRo(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqmRrR<s\]s\wRzRRtnegatetbodyRcsOdy-djfdtj|jDSWntk
rJdSXdS(s
    Helper to easily define string ranges for use in Word construction.  Borrows
    syntax from regexp '[]' string range definitions::
        srange("[0-9]")   -> "0123456789"
        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
    The input string must be enclosed in []'s, and the returned string is the expanded
    character set joined into a single string.
    The values enclosed in the []'s may be:
     - a single character
     - an escaped character with a leading backslash (such as C{\-} or C{\]})
     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
         (C{\0x##} is also supported for backwards compatibility) 
     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
    cSsKt|ts|Sdjdtt|dt|ddDS(NRrcss|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	sii(RsR RRtord(tp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrRrc3s|]}|VqdS(N((Rtpart(t	_expanded(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	sN(Rt_reBracketExprRRRa(R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR]rs
	-
csfd}|S(st
    Helper method for defining parse actions that require matching at a specific
    column in the input text.
    cs2t||kr.t||dndS(Nsmatched token not at column %d(R7R(R@tlocnRJ(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	verifyCols((RR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRKscs
fdS(s
    Helper method for common parse actions that simply return a literal value.  Especially
    useful when used with C{L{transformString}()}.

    Example::
        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
        term = na | num
        
        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
    csgS(N((RRNRp(treplStr(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRr((R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZscCs|ddd!S(s
    Helper parse action for removing quotation marks from parsed quoted strings.

    Example::
        # by default, quotation marks are included in parsed results
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]

        # use removeQuotes to strip quotation marks from parsed results
        quotedString.setParseAction(removeQuotes)
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
    iii((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRXscsafd}y"tdtdj}Wntk
rSt}nX||_|S(sG
    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
    args are passed, they are forwarded to the given function as additional arguments after
    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
    parsed data to an integer using base 16.

    Example (compare the last to example in L{ParserElement.transformString}::
        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
        hex_ints.runTests('''
            00 11 22 aa FF 0a 0d 1a
            ''')
        
        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
        OneOrMore(upperword).runTests('''
            my kingdom for a horse
            ''')

        wd = Word(alphas).setParseAction(tokenMap(str.title))
        OneOrMore(wd).setParseAction(' '.join).runTests('''
            now is the winter of our discontent made glorious summer by this sun of york
            ''')
    prints::
        00 11 22 aa FF 0a 0d 1a
        [0, 17, 34, 170, 255, 10, 13, 26]

        my kingdom for a horse
        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']

        now is the winter of our discontent made glorious summer by this sun of york
        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
    cs g|D]}|^qS(N((RRNRpttokn(RRO(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsRR^(R`RRaRu(RORRRd((RROs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRks 	
	cCst|jS(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcCst|jS(N(Rtlower(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcCs<t|tr+|}t|d|}n	|j}tttd}|rtjj	t
}td|dtt
t|td|tddtgjdj	d	td
}ndjdtD}tjj	t
t|B}td|dtt
t|j	tttd|tddtgjdj	d
td
}ttd|d
}|jddj|jddjjjd|}|jddj|jddjjjd|}||_||_||fS(sRInternal helper to construct opening and closing tag expressions, given a tag nameR+s_-:Rttagt=t/RRAcSs|ddkS(NiR((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrR Rrcss!|]}|dkr|VqdS(R N((RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	scSs|ddkS(NiR((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrsRLs(RsRRRR-R2R1R<RRzRXR)R	R0RRRRRRTRWR@Rt_LRttitleRRR(ttagStrtxmltresnamettagAttrNamettagAttrValuetopenTagtprintablesLessRAbracktcloseTag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	_makeTagss"	o{AA		cCs
t|tS(s 
    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.

    Example::
        text = 'More info at the pyparsing wiki page'
        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
        a,a_end = makeHTMLTags("A")
        link_expr = a + SkipTo(a_end)("link_text") + a_end
        
        for link in link_expr.searchString(text):
            # attributes in the  tag (like "href" shown here) are also accessible as named results
            print(link.link_text, '->', link.href)
    prints::
        pyparsing -> http://pyparsing.wikispaces.com
    (RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRIscCs
t|tS(s
    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
    tags only in the given upper/lower case.

    Example: similar to L{makeHTMLTags}
    (RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRJscsT|r|n|jgD]\}}||f^q#fd}|S(s<
    Helper to create a validating parse action to be used with start tags created
    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
    with a required attribute value, to avoid false matches on common tags such as
    C{} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. If just testing for C{class} (with or without a namespace), use C{L{withClass}}. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this has no type
''' div,div_end = makeHTMLTags("div") # only match div tag having a type attribute with value "grid" div_grid = div().setParseAction(withAttribute(type="grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) # construct a match with any div tag having a type attribute, regardless of the value div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 csx~D]v\}}||kr8t||d|n|tjkr|||krt||d||||fqqWdS(Nsno matching attribute s+attribute '%s' has value '%s', must be '%s'(RRct ANY_VALUE(RRNRtattrNamet attrValue(tattrs(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRRs   (R(RtattrDictRRR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRcs 2  %cCs'|rd|nd}ti||6S(s Simplified version of C{L{withAttribute}} when matching on a div class - made difficult because C{class} is a reserved word in Python. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this <div> has no class
''' div,div_end = makeHTMLTags("div") div_grid = div().setParseAction(withClass("grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 s%s:classtclass(Rc(t classnamet namespacet classattr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRi\s t(RYcCs<t}||||B}xt|D]\}}|d d \}} } } | dkrdd|nd|} | dkr|d kst|dkrtdn|\} }ntj| }| tjkr| dkr t||t |t |}q| dkrx|d k rQt|||t |t ||}qt||t |t |}q| dkrt|| |||t || |||}qtdn+| tj kr| dkr)t |t st |}nt|j|t ||}q| dkr|d k rpt|||t |t ||}qt||t |t |}q| dkrt|| |||t || |||}qtdn td | r |j| n||j| |BK}|}q(W||K}|S( s Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. The generated parser will also recognize the use of parentheses to override operator precedences (see example below). Note: if you define a deep operator list, you may see performance issues when using infixNotation. See L{ParserElement.enablePackrat} for a mechanism to potentially improve your parser performance. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) Example:: # simple example of four-function arithmetic with ints and variable names integer = pyparsing_common.signed_integer varname = pyparsing_common.identifier arith_expr = infixNotation(integer | varname, [ ('-', 1, opAssoc.RIGHT), (oneOf('* /'), 2, opAssoc.LEFT), (oneOf('+ -'), 2, opAssoc.LEFT), ]) arith_expr.runTests(''' 5+3*6 (5+3)*6 -2--11 ''', fullDump=False) prints:: 5+3*6 [[5, '+', [3, '*', 6]]] (5+3)*6 [[[5, '+', 3], '*', 6]] -2--11 [[['-', 2], '-', ['-', 11]]] iis%s terms %s%s termis@if numterms=3, opExpr must be a tuple or list of two expressionsis6operator must be unary (1), binary (2), or ternary (3)s2operator must indicate right or left associativityN(N(R RRRRRRRtLEFTR RRtRIGHTRsRRFRz(tbaseExprtopListtlpartrparR}tlastExprRtoperDeftopExprtaritytrightLeftAssocRttermNametopExpr1topExpr2tthisExprR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRgsR;    '  /'   $  /'     s4"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t"s string enclosed in double quotess4'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t's string enclosed in single quotess*quotedString using single or double quotestusunicode string literalcCs!||krtdn|d krt|trt|trt|dkrt|dkr|d k rtt|t||tj ddj d}q|t j t||tj j d}q|d k r9tt|t |t |ttj ddj d}qttt |t |ttj ddj d}qtdnt}|d k r|tt|t||B|Bt|K}n.|tt|t||Bt|K}|jd ||f|S( s~ Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - content - expression for items within the nested lists (default=C{None}) - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. Example:: data_type = oneOf("void int short long char float double") decl_data_type = Combine(data_type + Optional(Word('*'))) ident = Word(alphas+'_', alphanums+'_') number = pyparsing_common.number arg = Group(decl_data_type + ident) LPAR,RPAR = map(Suppress, "()") code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) c_function = (decl_data_type("type") + ident("name") + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + code_body("body")) c_function.ignore(cStyleComment) source_code = ''' int is_odd(int x) { return (x%2); } int dec_to_hex(char hchar) { if (hchar >= '0' && hchar <= '9') { return (ord(hchar)-ord('0')); } else { return (10+ord(hchar)-ord('A')); } } ''' for func in c_function.searchString(source_code): print("%(name)s (%(type)s) args: %(args)s" % func) prints:: is_odd (int) args: [['int', 'x']] dec_to_hex (int) args: [['char', 'hchar']] s.opening and closing strings cannot be the sameiRKcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq9RrcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq<RrcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqBRrcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqFRrsOopening and closing arguments must be strings if no content expression is givensnested %s%s expressionN(RRRsRRRRRR"RfRzRARRR RR)R0R(topenertclosertcontentRR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRNs4:  $  $    5.c s5fd}fd}fd}ttjdj}ttj|jd}tj|jd}tj|jd} |rtt||t|t|t|| } n0tt|t|t|t|} |j t t| jdS( s Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=C{True}) A valid block must contain at least one C{blockStatement}. Example:: data = ''' def A(z): A1 B = 100 G = A2 A2 A3 B def BB(a,b,c): BB1 def BBA(): bba1 bba2 bba3 C D def spam(x,y): def eggs(z): pass ''' indentStack = [1] stmt = Forward() identifier = Word(alphas, alphanums) funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") func_body = indentedBlock(stmt, indentStack) funcDef = Group( funcDecl + func_body ) rvalue = Forward() funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") rvalue << (funcCall | identifier | Word(nums)) assignment = Group(identifier + "=" + rvalue) stmt << ( funcDef | assignment | identifier ) module_body = OneOrMore(stmt) parseTree = module_body.parseString(data) parseTree.pprint() prints:: [['def', 'A', ['(', 'z', ')'], ':', [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], 'B', ['def', 'BB', ['(', 'a', 'b', 'c', ')'], ':', [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], 'C', 'D', ['def', 'spam', ['(', 'x', 'y', ')'], ':', [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] css|t|krdSt||}|dkro|dkrZt||dnt||dndS(Nisillegal nestingsnot a peer entry(RR7RR(RRNRptcurCol(t indentStack(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckPeerIndentscsEt||}|dkr/j|nt||ddS(Nisnot a subentry(R7RR(RRNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckSubIndentscsn|t|krdSt||}oH|dkoH|dks`t||dnjdS(Niisnot an unindent(RR7RR(RRNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt checkUnindents &s tINDENTRrtUNINDENTsindented block( RRRRR RzRRRRR( tblockStatementExprR,R$R-R.R/R7R0tPEERtUNDENTtsmExpr((R,s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRdQsN"8 $s#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]s[\0xa1-\0xbf\0xd7\0xf7]s_:sany tagsgt lt amp nbsp quot aposs><& "'s &(?PRs);scommon HTML entitycCstj|jS(sRHelper parser action to replace common HTML entities with their special characters(t_htmlEntityMapRtentity(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRYss/\*(?:[^*]|\*(?!/))*s*/sC style commentss HTML comments.*s rest of lines//(?:\\\n|[^\n])*s // commentsC++ style comments#.*sPython style comments t commaItemRcBseZdZeeZeeZee j dj eZ ee j dj eedZedj dj eZej edej ej dZejdeeeed jeBj d Zejeed j d j eZed j dj eZeeBeBjZedj dj eZeededj dZedj dZedj dZ e de dj dZ!ee de d8dee de d9j dZ"e"j#ddej d Z$e%e!e$Be"Bj d!j d!Z&ed"j d#Z'e(d$d%Z)e(d&d'Z*ed(j d)Z+ed*j d+Z,ed,j d-Z-e.je/jBZ0e(d.Z1e%e2e3d/e4ee5d0d/ee6d1jj d2Z7e8ee9j:e7Bd3d4j d5Z;e(ed6Z<e(ed7Z=RS(:s Here are some common low-level expressions that may be useful in jump-starting parser development: - numeric forms (L{integers}, L{reals}, L{scientific notation}) - common L{programming identifiers} - network addresses (L{MAC}, L{IPv4}, L{IPv6}) - ISO8601 L{dates} and L{datetime} - L{UUID} - L{comma-separated list} Parse actions: - C{L{convertToInteger}} - C{L{convertToFloat}} - C{L{convertToDate}} - C{L{convertToDatetime}} - C{L{stripHTMLTags}} - C{L{upcaseTokens}} - C{L{downcaseTokens}} Example:: pyparsing_common.number.runTests(''' # any int or real number, returned as the appropriate type 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.fnumber.runTests(''' # any int or real number, returned as float 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.hex_integer.runTests(''' # hex numbers 100 FF ''') pyparsing_common.fraction.runTests(''' # fractions 1/2 -3/4 ''') pyparsing_common.mixed_integer.runTests(''' # mixed fractions 1 1/2 -3/4 1-3/4 ''') import uuid pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) pyparsing_common.uuid.runTests(''' # uuid 12345678-1234-5678-1234-567812345678 ''') prints:: # any int or real number, returned as the appropriate type 100 [100] -100 [-100] +100 [100] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # any int or real number, returned as float 100 [100.0] -100 [-100.0] +100 [100.0] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # hex numbers 100 [256] FF [255] # fractions 1/2 [0.5] -3/4 [-0.75] # mixed fractions 1 [1] 1/2 [0.5] -3/4 [-0.75] 1-3/4 [1.75] # uuid 12345678-1234-5678-1234-567812345678 [UUID('12345678-1234-5678-1234-567812345678')] tintegers hex integeris[+-]?\d+ssigned integerRtfractioncCs|d|dS(Nii((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrRzs"fraction or mixed integer-fractions [+-]?\d+\.\d*s real numbers+[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)s$real number with scientific notations[+-]?\d+\.?\d*([eE][+-]?\d+)?tfnumberRt identifiersK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}s IPv4 addresss[0-9a-fA-F]{1,4}t hex_integerRisfull IPv6 addressiis::sshort IPv6 addresscCstd|DdkS(Ncss'|]}tjj|rdVqdS(iN(Rlt _ipv6_partR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys si(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrs::ffff:smixed IPv6 addresss IPv6 addresss:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}s MAC addresss%Y-%m-%dcsfd}|S(s Helper to create a parse action for converting parsed date string to Python datetime.date Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) Example:: date_expr = pyparsing_common.iso8601_date.copy() date_expr.setParseAction(pyparsing_common.convertToDate()) print(date_expr.parseString("1999-12-31")) prints:: [datetime.date(1999, 12, 31)] csPytj|djSWn+tk rK}t||t|nXdS(Ni(RtstrptimetdateRRRu(RRNRptve(tfmt(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcvt_fns((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt convertToDatess%Y-%m-%dT%H:%M:%S.%fcsfd}|S(s Helper to create a parse action for converting parsed datetime string to Python datetime.datetime Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) Example:: dt_expr = pyparsing_common.iso8601_datetime.copy() dt_expr.setParseAction(pyparsing_common.convertToDatetime()) print(dt_expr.parseString("1999-12-31T23:59:59.999")) prints:: [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] csJytj|dSWn+tk rE}t||t|nXdS(Ni(RR?RRRu(RRNRpRA(RB(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRCs((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytconvertToDatetimess7(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?s ISO8601 dates(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?sISO8601 datetimes2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}tUUIDcCstjj|dS(s Parse action to remove HTML tags from web page HTML source Example:: # strip HTML links from normal text text = 'More info at the
pyparsing wiki page' td,td_end = makeHTMLTags("TD") table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' i(Rlt_html_stripperR{(RRNR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt stripHTMLTagss RR<s R8RRrscomma separated listcCst|jS(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcCst|jS(N(RR(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRr(ii(ii(>RRRRkRotconvertToIntegertfloattconvertToFloatR-RPRRzR9RBR=R%tsigned_integerR:RRRt mixed_integerRtrealtsci_realRtnumberR;R2R1R<t ipv4_addressR>t_full_ipv6_addresst_short_ipv6_addressRt_mixed_ipv6_addressRt ipv6_addresst mac_addressR#RDREt iso8601_datetiso8601_datetimetuuidR5R4RGRHRRRRTR,t _commasepitemR>RWRtcomma_separated_listRbR@(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRlsL  '/-  ;&J+t__main__tselecttfroms_$RRtcolumnsRttablestcommandsK # '*' as column list and dotted table name select * from SYS.XYZZY # caseless match on "SELECT", and casts back to "select" SELECT * from XYZZY, ABC # list of column names, and mixed case SELECT keyword Select AA,BB,CC from Sys.dual # multiple tables Select A, B, C from Sys.dual, Table2 # invalid SELECT keyword - should fail Xelect A, B, C from Sys.dual # incomplete command - should fail Select # invalid column name - should fail Select ^^^ frox Sys.dual s] 100 -100 +100 3.14159 6.02e23 1e-12 s 100 FF s6 12345678-1234-5678-1234-567812345678 (Rt __version__t__versionTime__t __author__RtweakrefRRRRxRR|RSRR8RRRRt_threadRt ImportErrort threadingRRt ordereddictRt__all__Rt version_infoRQRtmaxsizeR$RuRtchrRRRRR2treversedRRR4RxRIRJR_tmaxinttxrangeRt __builtin__RtfnameRR`RRRRRRtascii_uppercasetascii_lowercaseR2RPRBR1RRt printableRTRaRRRR!R$RR tMutableMappingtregisterR7RHRERGRKRMROReR"R*R RRRRiRRRRjR-R%R#RR,RpRRRR(R'R/R.RRRRR RR RRRR0RRRR&R RR+RRR R)RR`RR>R:RRMRLRERRQR?ReRfRhRRARGRFR_R^Rzt _escapedPunct_escapedHexChart_escapedOctChartUNICODEt _singleChart _charRangeRRR]RKRZRXRkRbR@R RIRJRcR RiRRRRRgRSR<R\RWRaRNRdR3RUR5R4RRR6RR9RYR6RCRR[R=R;RDRVRRZR8RlRt selectTokent fromTokentidentt columnNametcolumnNameListt columnSpect tableNamet tableNameListt simpleSQLR"RPR;R=RYRF(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt=s              *         8      @ & A=IG3pLOD|M &# @sQ,A ,    I # %  !4@    ,   ?  #   k%Z r  (, #8+    $     PK!IE_vendor/pyparsing.pyonu[ fci@sdZdZdZdZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZyddlmZWn!ek rddlmZnXydd l mZWn?ek r=ydd lmZWnek r9eZnXnXd d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgiZee jds ZedtdskZere jZ e!Z"e#Z$e!Z%e&e'e(e)e*ee+e,e-e.e/g Z0nre j1Z e2Z3duZ%gZ0ddl4Z4xEdvj5D]7Z6ye0j7e8e4e6Wne9k rZq$nXq$We:dwe3dxDZ;dyZ<dze=fd{YZ>ej?ej@ZAd|ZBeBd}ZCeAeBZDe#d~ZEdjFdejGDZHd!eIfdYZJd#eJfdYZKd%eJfdYZLd'eLfdYZMd*eIfdYZNde=fdYZOd&e=fdYZPe jQjRePdZSdZTdZUdZVdZWdZXdZYddZZd(e=fdYZ[d0e[fdYZ\de\fdYZ]de\fdYZ^de\fdYZ_e_Z`e_e[_ade\fdYZbd e_fdYZcd ebfdYZddpe\fdYZed3e\fdYZfd+e\fdYZgd)e\fdYZhd e\fdYZid2e\fdYZjde\fdYZkdekfdYZldekfdYZmdekfdYZnd.ekfdYZod-ekfdYZpd5ekfdYZqd4ekfdYZrd$e[fdYZsd esfdYZtd esfdYZudesfdYZvdesfdYZwd"e[fdYZxdexfdYZydexfdYZzdexfdYZ{de{fdYZ|d6e{fdYZ}de=fdYZ~e~ZdexfdYZd,exfdYZdexfdYZdefdYZd1exfdYZdefdYZdefdYZdefdYZd/efdYZde=fdYZdZdedZedZdZdZdZdZeedZdZedZdZdZe]jdGZemjdMZenjdLZeojdeZepjddZefeEdddjdZegdjdZegdjdZeeBeBefeHddddxBegde jBZeeedeZe_dedjdee|eeBjddZdZdZdZdZdZedZedZdZdZdZdZe=e_ddZe>Ze=e_e=e_ededdZeZeegddjdZeegddjdZeegddegddBjdZee`dejjdZddeejdZedZedZedZeefeAeDdjd\ZZeedj5dZegddjFejdjdZdZeegddjdZegdjdZegd jjd Zegd jd ZeegddeBjd ZeZegdjdZee|efeHddeefde_denjjdZeeejeBddjd>ZdrfdYZedkrecdZecdZefeAeDdZeeddejeZeeejdZdeBZeeddejeZeeejdZededeedZejdejjdejjdejjd ddlZejjeejejjd!ndS("sS pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}), built up using L{Word}, L{Literal}, and L{And} elements (L{'+'} operator gives L{And} expressions, strings are auto-converted to L{Literal} expressions):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The L{ParseResults} object returned from L{ParserElement.parseString} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments s2.1.10s07 Oct 2016 01:31 UTCs*Paul McGuire iN(tref(tdatetime(tRLock(t OrderedDicttAndtCaselessKeywordtCaselessLiteralt CharsNotIntCombinetDicttEachtEmptyt FollowedBytForwardt GoToColumntGrouptKeywordtLineEndt LineStarttLiteralt MatchFirsttNoMatchtNotAnyt OneOrMoretOnlyOncetOptionaltOrtParseBaseExceptiontParseElementEnhancetParseExceptiontParseExpressiontParseFatalExceptiont ParseResultstParseSyntaxExceptiont ParserElementt QuotedStringtRecursiveGrammarExceptiontRegextSkipTot StringEndt StringStarttSuppresstTokentTokenConvertertWhitetWordtWordEndt WordStartt ZeroOrMoret alphanumstalphast alphas8bitt anyCloseTagt anyOpenTagt cStyleCommenttcoltcommaSeparatedListtcommonHTMLEntityt countedArraytcppStyleCommenttdblQuotedStringtdblSlashCommentt delimitedListtdictOftdowncaseTokenstemptythexnumst htmlCommenttjavaStyleCommenttlinetlineEndt lineStarttlinenot makeHTMLTagst makeXMLTagstmatchOnlyAtColtmatchPreviousExprtmatchPreviousLiteralt nestedExprtnullDebugActiontnumstoneOftopAssoctoperatorPrecedencet printablestpunc8bittpythonStyleCommentt quotedStringt removeQuotestreplaceHTMLEntityt replaceWitht restOfLinetsglQuotedStringtsranget stringEndt stringStartttraceParseActiont unicodeStringt upcaseTokenst withAttributet indentedBlocktoriginalTextFortungroupt infixNotationt locatedExprt withClasst CloseMatchttokenMaptpyparsing_commoniicCs}t|tr|Syt|SWnUtk rxt|jtjd}td}|jd|j |SXdS(sDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. txmlcharrefreplaces&#\d+;cSs#dtt|ddd!dS(Ns\uiii(thextint(tt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyttN( t isinstancetunicodetstrtUnicodeEncodeErrortencodetsystgetdefaultencodingR%tsetParseActionttransformString(tobjtrett xmlcharref((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_ustrs  s6sum len sorted reversed list tuple set any all min maxccs|] }|VqdS(N((t.0ty((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys sicCsRd}ddjD}x/t||D]\}}|j||}q,W|S(s/Escape &, <, >, ", ', etc. in a string of data.s&><"'css|]}d|dVqdS(t&t;N((Rts((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys ssamp gt lt quot apos(tsplittziptreplace(tdatat from_symbolst to_symbolstfrom_tto_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt _xml_escapes t _ConstantscBseZRS((t__name__t __module__(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRst 0123456789t ABCDEFabcdefi\Rrccs$|]}|tjkr|VqdS(N(tstringt whitespace(Rtc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys scBs_eZdZdd d dZedZdZdZdZ ddZ d Z RS( s7base exception class for all parsing runtime exceptionsicCs[||_|dkr*||_d|_n||_||_||_|||f|_dS(NRr(tloctNonetmsgtpstrt parserElementtargs(tselfRRRtelem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__init__s       cCs||j|j|j|jS(s internal factory method to simplify creating one type of ParseException from another - avoids having __init__ signature conflicts among subclasses (RRRR(tclstpe((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_from_exceptionscCsm|dkrt|j|jS|dkr>t|j|jS|dkr]t|j|jSt|dS(ssupported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text RHR7tcolumnREN(R7R(RHRRR7REtAttributeError(Rtaname((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt __getattr__s   cCs d|j|j|j|jfS(Ns"%s (at char %d), (line:%d, col:%d)(RRRHR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__str__scCs t|S(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__repr__ss>!} ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found(RRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!scBs eZdZdZdZRS(sZexception thrown by L{ParserElement.validate} if the grammar could be improperly recursivecCs ||_dS(N(tparseElementTrace(RtparseElementList((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs d|jS(NsRecursiveGrammarException: %s(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s(RRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR$s t_ParseResultsWithOffsetcBs,eZdZdZdZdZRS(cCs||f|_dS(N(ttup(Rtp1tp2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR$scCs |j|S(N(R(Rti((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt __getitem__&scCst|jdS(Ni(treprR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR(scCs|jd|f|_dS(Ni(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt setOffset*s(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR#s   cBseZdZd-d-eedZd-d-eeedZdZedZ dZ dZ dZ dZ e Zd Zd Zd Zd Zd ZereZeZeZn-eZeZeZdZdZdZdZdZd-dZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ddZ(d Z)d!Z*d"Z+d-e,ded#Z-d$Z.d%Z/dd&ed'Z0d(Z1d)Z2d*Z3d+Z4d,Z5RS(.sI Structured parse results, to provide multiple means of access to the parsed data: - as a list (C{len(results)}) - by list index (C{results[0], results[1]}, etc.) - by attribute (C{results.} - see L{ParserElement.setResultsName}) Example:: integer = Word(nums) date_str = (integer.setResultsName("year") + '/' + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") # parseString returns a ParseResults object result = date_str.parseString("1999/12/31") def test(s, fn=repr): print("%s -> %s" % (s, fn(eval(s)))) test("list(result)") test("result[0]") test("result['month']") test("result.day") test("'month' in result") test("'minutes' in result") test("result.dump()", str) prints:: list(result) -> ['1999', '/', '12', '/', '31'] result[0] -> '1999' result['month'] -> '12' result.day -> '31' 'month' in result -> True 'minutes' in result -> False result.dump() -> ['1999', '/', '12', '/', '31'] - day: 31 - month: 12 - year: 1999 cCs/t||r|Stj|}t|_|S(N(Rstobjectt__new__tTruet_ParseResults__doinit(RttoklisttnametasListtmodaltretobj((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs  cCs|jrt|_d|_d|_i|_||_||_|dkrTg}n||trp||_ n-||t rt||_ n |g|_ t |_ n|dk r|r|sd|j|s(R(R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt _itervaluesscsfdjDS(Nc3s|]}||fVqdS(N((RR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s(R(R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt _iteritemsscCst|jS(sVReturns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).(RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytkeysscCst|jS(sXReturns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).(Rt itervalues(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvaluesscCst|jS(sfReturns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).(Rt iteritems(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs t|jS(sSince keys() returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.(tboolR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pythaskeysscOs|sdg}nxI|jD];\}}|dkrJ|d|f}qtd|qWt|dtst|dks|d|kr|d}||}||=|S|d}|SdS(s Removes and returns item at specified index (default=C{last}). Supports both C{list} and C{dict} semantics for C{pop()}. If passed no argument or an integer argument, it will use C{list} semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use C{dict} semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in C{dict.pop()}. Example:: def remove_first(tokens): tokens.pop(0) print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] label = Word(alphas) patt = label("LABEL") + OneOrMore(Word(nums)) print(patt.parseString("AAB 123 321").dump()) # Use pop() in a parse action to remove named result (note that corresponding value is not # removed from list form of results) def remove_LABEL(tokens): tokens.pop("LABEL") return tokens patt.addParseAction(remove_LABEL) print(patt.parseString("AAB 123 321").dump()) prints:: ['AAB', '123', '321'] - LABEL: AAB ['AAB', '123', '321'] itdefaultis-pop() got an unexpected keyword argument '%s'iN(RRRsRoR(RRtkwargsRRtindexR}t defaultvalue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpops"     cCs||kr||S|SdS(si Returns named result matching the given key, or if there is no such name, then returns the given C{defaultValue} or C{None} if no C{defaultValue} is specified. Similar to C{dict.get()}. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString("1999/12/31") print(result.get("year")) # -> '1999' print(result.get("hour", "not specified")) # -> 'not specified' print(result.get("hour")) # -> None N((Rtkeyt defaultValue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs cCsw|jj||x]|jjD]L\}}x=t|D]/\}\}}t||||k|| ['0', '123', '321'] # use a parse action to insert the parse location in the front of the parsed results def insert_locn(locn, tokens): tokens.insert(0, locn) print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] N(RtinsertRRRR(RRtinsStrRRRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR2scCs|jj|dS(s Add single element to end of ParseResults list of elements. Example:: print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] # use a parse action to compute the sum of the parsed integers, and add it to the end def append_sum(tokens): tokens.append(sum(map(int, tokens))) print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] N(Rtappend(Rtitem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRFs cCs0t|tr||7}n|jj|dS(s Add sequence of elements to end of ParseResults list of elements. Example:: patt = OneOrMore(Word(alphas)) # use a parse action to append the reverse of the matched strings, to make a palindrome def make_palindrome(tokens): tokens.extend(reversed([t[::-1] for t in tokens])) return ''.join(tokens) print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' N(RsR Rtextend(Rtitemseq((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs  cCs|j2|jjdS(s7 Clear all elements and results names. N(RRtclear(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfscCsy ||SWntk r dSX||jkr}||jkrR|j|ddStg|j|D]}|d^qcSndSdS(NRrii(RRRR (RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRms  +cCs|j}||7}|S(N(R(RtotherR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__add__{s  c s|jrt|jfd}|jj}g|D]<\}}|D])}|t|d||df^qMq=}xJ|D]?\}}|||st](RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsRrcCsog}xb|jD]W}|r2|r2|j|nt|trT||j7}q|jt|qW|S(N(RRRsR t _asStringListR(RtseptoutR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs cCs5g|jD]'}t|tr+|jn|^q S(s Returns the parse results as a nested list of matching tokens, all converted to strings. Example:: patt = OneOrMore(Word(alphas)) result = patt.parseString("sldkj lsdkj sldkj") # even though the result prints in string-like form, it is actually a pyparsing ParseResults print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] # Use asList() to create an actual list result_list = result.asList() print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] (RRsR R(Rtres((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscsGtr|j}n |j}fdtfd|DS(s Returns the named parse results as a nested dictionary. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString('12/31/1999') print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) result_dict = result.asDict() print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} # even though a ParseResults supports dict-like access, sometime you just need to have a dict import json print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} csMt|trE|jr%|jSg|D]}|^q,Sn|SdS(N(RsR RtasDict(R|R(ttoItem(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs    c3s'|]\}}||fVqdS(N((RRR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s(tPY_3RRR(Rtitem_fn((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs    cCsPt|j}|jj|_|j|_|jj|j|j|_|S(sA Returns a new copy of a C{ParseResults} object. (R RRRRRR R(RR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs   c Csd}g}td|jjD}|d}|sPd}d}d}nd } |d k rk|} n|jr|j} n| s|rdSd} n|||d| dg7}x t|jD]\} } t| trI| |kr|| j || |o|d k||g7}q|| j d |o6|d k||g7}qd } | |krh|| } n| s|rzqqd} nt t | } |||d| d| d| dg 7}qW|||d| dg7}dj |S( s (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. s css2|](\}}|D]}|d|fVqqdS(iN((RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s s RrtITEMtsgss %s%s- %s: s icss|]}t|tVqdS(N(RsR (Rtvv((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys sss %s%s[%d]: %s%s%sRr( RRRRtsortedRRsR tdumpRtanyRR( RR$tdepthtfullRtNLRRRRR1((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR3Ps,  B?cOstj|j||dS(s Pretty-printer for parsed results as a list, using the C{pprint} module. Accepts additional positional or keyword args as defined for the C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) Example:: ident = Word(alphas, alphanums) num = Word(nums) func = Forward() term = ident | num | Group('(' + func + ')') func <<= ident + Group(Optional(delimitedList(term))) result = func.parseString("fna a,b,(fnb c,d,200),100") result.pprint(width=40) prints:: ['fna', ['a', 'b', ['(', 'fnb', ['c', 'd', '200'], ')'], '100']] N(tpprintR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR8}scCsC|j|jj|jdk r-|jp0d|j|jffS(N(RRRRRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt __getstate__s  cCsm|d|_|d\|_}}|_i|_|jj||dk r`t||_n d|_dS(Nii(RRRRR RRR(RtstateR/t inAccumNames((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt __setstate__s   cCs|j|j|j|jfS(N(RRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getnewargs__scCs tt|t|jS(N(RRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsN(6RRRRRRRsRRRRRRRt __nonzero__RRRRRRRRRRRRRRRRRRRRR RRRRRRRRRR!R-R0R3R8R9R<R=R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR -sh& '              4             # =  %-   cCsW|}d|ko#t|knr@||ddkr@dS||jdd|S(sReturns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. iis (Rtrfind(RtstrgR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR7s cCs|jdd|dS(sReturns current line number within a string, counting newlines as line separators. The first line is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. s ii(tcount(RR@((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRHs cCsR|jdd|}|jd|}|dkrB||d|!S||dSdS(sfReturns the line of text containing loc within a string, counting newlines as line separators. s iiN(R?tfind(RR@tlastCRtnextCR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyREs  cCsAdt|dt|dt||t||fGHdS(NsMatch s at loc s(%d,%d)(RRHR7(tinstringRtexpr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultStartDebugActionscCs'dt|dt|jGHdS(NsMatched s -> (RRuR(REtstartloctendlocRFttoks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultSuccessDebugActionscCsdt|GHdS(NsException raised:(R(RERRFtexc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultExceptionDebugActionscGsdS(sG'Do-nothing' debug action, to suppress debugging output during parsing.N((R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyROsics tkrfdSdgtgtd dkrVdd}ddntj}tjd}|d dd }|d|d |ffd }d }y"tdtdj}Wntk rt }nX||_|S(Ncs |S(N((RtlRp(tfunc(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRriiiicSsJtdkrdnd}tjd| |d|}|j|jfgS( Niiiiitlimiti(iii(tsystem_versiont tracebackt extract_stacktfilenameRH(RPR t frame_summary((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRSscSs2tj|d|}|d}|j|jfgS(NRPi(RRt extract_tbRTRH(ttbRPtframesRU((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRVs iRPiicsxy&|d}td<|SWqtk rdrInAz:tjd}|dddd ksnWd~Xdkrdcd7Rt __class__(ii( tsingleArgBuiltinsRRQRRRSRVtgetattrRt ExceptionRu(ROR[RSt LINE_DIFFt this_lineR]t func_name((RVRZRORPR[R\s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt _trim_aritys*          cBseZdZdZeZedZedZedZ dZ dZ edZ e dZd Zd Zd Zd Zd ZdZe dZdZe e dZdZdZdefdYZedFk rdefdYZndefdYZiZe Z!ddgZ"e e dZ#eZ$edZ%eZ&eddZ'edZ(e)edZ*d Z+e)d!Z,e)ed"Z-d#Z.d$Z/d%Z0d&Z1d'Z2d(Z3d)Z4d*Z5d+Z6d,Z7d-Z8d.Z9d/Z:dFd0Z;d1Z<d2Z=d3Z>d4Z?d5Z@d6ZAe d7ZBd8ZCd9ZDd:ZEd;ZFgd<ZGed=ZHd>ZId?ZJd@ZKdAZLdBZMe dCZNe dDe e edEZORS(Gs)Abstract base level parser element class.s cCs |t_dS(s Overrides the default whitespace chars Example:: # default whitespace chars are space, and newline OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] # change to just treat newline as significant ParserElement.setDefaultWhitespaceChars(" \t") OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] N(R"tDEFAULT_WHITE_CHARS(tchars((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultWhitespaceChars=s cCs |t_dS(s Set class to be used for inclusion of string literals into a parser. Example:: # default literal class used is Literal integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] # change to Suppress ParserElement.inlineLiteralsUsing(Suppress) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] N(R"t_literalStringClass(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytinlineLiteralsUsingLscCst|_d|_d|_d|_||_t|_t j |_ t|_ t |_t |_t|_t |_t |_t|_d|_t|_d|_d|_t|_t |_dS(NRr(NNN(Rt parseActionRt failActiontstrReprt resultsNamet saveAsListRtskipWhitespaceR"Rft whiteCharstcopyDefaultWhiteCharsRtmayReturnEmptytkeepTabst ignoreExprstdebugt streamlinedt mayIndexErrorterrmsgt modalResultst debugActionstret callPreparset callDuringTry(Rtsavelist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRas(                   cCsEtj|}|j|_|j|_|jrAtj|_n|S(s$ Make a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element. Example:: integer = Word(nums).setParseAction(lambda toks: int(toks[0])) integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) prints:: [5120, 100, 655360, 268435456] Equivalent form of C{expr.copy()} is just C{expr()}:: integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") (RRkRuRrR"RfRq(Rtcpy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRxs    cCs>||_d|j|_t|dr:|j|j_n|S(sf Define name for this expression, makes debugging and exception messages clearer. Example:: Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) s Expected t exception(RRyRRR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetNames  cCsE|j}|jdr.|d }t}n||_| |_|S(sP Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. You can also set results names using the abbreviated syntax, C{expr("name")} in place of C{expr.setResultsName("name")} - see L{I{__call__}<__call__>}. Example:: date_str = (integer.setResultsName("year") + '/' + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: date_str = integer("year") + '/' + integer("month") + '/' + integer("day") t*i(RtendswithRRnRz(RRtlistAllMatchestnewself((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetResultsNames     csa|r9|jttfd}|_||_n$t|jdr]|jj|_n|S(sMethod to invoke the Python pdb debugger when this element is about to be parsed. Set C{breakFlag} to True to enable, False to disable. cs)ddl}|j||||S(Ni(tpdbt set_trace(RERt doActionst callPreParseR(t _parseMethod(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytbreakers  t_originalParseMethod(t_parseRRR(Rt breakFlagR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetBreaks   cOs7tttt||_|jdt|_|S(s  Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Optional keyword arguments: - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing C{}s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. Example:: integer = Word(nums) date_str = integer + '/' + integer + '/' + integer date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] # use parse action to convert to ints at parse time integer = Word(nums).setParseAction(lambda toks: int(toks[0])) date_str = integer + '/' + integer + '/' + integer # note that integer fields are now ints, not strings date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] R~(RtmapReRkRRR~(RtfnsR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRzs"cOsF|jtttt|7_|jp<|jdt|_|S(s Add parse action to expression's list of parse actions. See L{I{setParseAction}}. See examples in L{I{copy}}. R~(RkRRReR~RR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddParseActions$cs|jdd|jdtr*tntx3|D]+fd}|jj|q7W|jp~|jdt|_|S(sAdd a boolean predicate function to expression's list of parse actions. See L{I{setParseAction}} for function call signatures. Unlike C{setParseAction}, functions passed to C{addCondition} need to return boolean success/fail of the condition. Optional keyword arguments: - message = define a custom message to be used in the raised exception - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException Example:: integer = Word(nums).setParseAction(lambda toks: int(toks[0])) year_int = integer.copy() year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") date_str = year_int + '/' + integer + '/' + integer result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) tmessagesfailed user-defined conditiontfatalcs7tt|||s3||ndS(N(RRe(RRNRp(texc_typetfnR(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpasR~(RRRRRkRR~(RRRR((RRRs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt addConditions cCs ||_|S(s Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw C{L{ParseFatalException}} if it is desired to stop parsing immediately.(Rl(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt setFailActions cCsnt}xa|rit}xN|jD]C}y)x"|j||\}}t}q+WWqtk raqXqWq W|S(N(RRRuRR(RRERt exprsFoundtetdummy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_skipIgnorables#s   cCsp|jr|j||}n|jrl|j}t|}x-||krh|||krh|d7}q?Wn|S(Ni(RuRRpRqR(RRERtwttinstrlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpreParse0s    cCs |gfS(N((RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt parseImpl<scCs|S(N((RRERt tokenlist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt postParse?sc Cs|j}|s|jr,|jdr?|jd|||n|rc|jrc|j||}n|}|}yUy|j|||\}}Wn/tk rt|t||j |nXWqt k r(} |jdr|jd|||| n|jr"|j|||| nqXn|rP|jrP|j||}n|}|}|j sw|t|kry|j|||\}}Wqtk rt|t||j |qXn|j|||\}}|j |||}t ||jd|jd|j} |jrf|s7|jrf|ryrxk|jD]`} | ||| }|dk rJt ||jd|jot|t tfd|j} qJqJWWqct k r} |jdr|jd|||| nqcXqfxn|jD]`} | ||| }|dk rt ||jd|joMt|t tfd|j} qqWn|r|jdr|jd||||| qn|| fS(NiiRRi(RvRlR{R}RRRRRRyRRxRR RnRoRzRkR~RRsR( RRERRRt debuggingtpreloct tokensStartttokensterrt retTokensR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt _parseNoCacheCsp   &    %$       #cCsNy|j||dtdSWn)tk rIt|||j|nXdS(NRi(RRRRRy(RRER((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyttryParses cCs7y|j||Wnttfk r.tSXtSdS(N(RRRRR(RRER((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt canParseNexts t_UnboundedCachecBseZdZRS(csit|_fd}fd}fd}tj|||_tj|||_tj|||_dS(Ncsj|S(N(R(RR(tcachet not_in_cache(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscs||}) - define your parse action using the full C{(s,loc,toks)} signature, and reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling C{parseString} Example:: Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text iN( R"RRwt streamlineRuRtt expandtabsRRR R'Rtverbose_stacktrace(RREtparseAllRRRtseRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt parseString#s$      ccs|js|jnx|jD]}|jq W|jsRt|j}nt|}d}|j}|j}t j d} yx||kra| |kray.|||} ||| dt \} } Wnt k r| d}qX| |krT| d7} | | | fV|rK|||} | |kr>| }qQ|d7}q^| }q| d}qWWn(t k r}t jrq|nXdS(s Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional C{maxMatches} argument, to clip scanning after 'n' matches are found. If C{overlap} is specified, then overlapping matches will be reported. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs. Example:: source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" print(source) for tokens,start,end in Word(alphas).scanString(source): print(' '*start + '^'*(end-start)) print(' '*start + tokens[0]) prints:: sldjf123lsdjjkf345sldkjf879lkjsfd987 ^^^^^ sldjf ^^^^^^^ lsdjjkf ^^^^^^ sldkjf ^^^^^^ lkjsfd iRiN(RwRRuRtRRRRRR"RRRRR(RREt maxMatchestoverlapRRRt preparseFntparseFntmatchesRtnextLocRtnextlocRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt scanStringUsB               c Cs%g}d}t|_yx|j|D]}\}}}|j|||!|rt|trs||j7}qt|tr||7}q|j|n|}q(W|j||g|D]}|r|^q}djt t t |SWn(t k r }t jrq!|nXdS(sf Extension to C{L{scanString}}, to modify matching text with modified tokens that may be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. C{transformString()} returns the resulting transformed string. Example:: wd = Word(alphas) wd.setParseAction(lambda toks: toks[0].title()) print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) Prints:: Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. iRrN(RRtRRRsR RRRRRt_flattenRR"R( RRERtlastERpRRtoRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR{s(     cCsey6tg|j||D]\}}}|^qSWn(tk r`}tjrWqa|nXdS(s~ Another extension to C{L{scanString}}, simplifying the access to the tokens found to match the given parse expression. May be called with optional C{maxMatches} argument, to clip searching after 'n' matches are found. Example:: # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters cap_word = Word(alphas.upper(), alphas.lower()) print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) prints:: ['More', 'Iron', 'Lead', 'Gold', 'I'] N(R RRR"R(RRERRpRRRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt searchStrings 6 c csfd}d}xJ|j|d|D]3\}}}|||!V|rO|dVn|}q"W||VdS(s[ Generator method to split a string using the given expression as a separator. May be called with optional C{maxsplit} argument, to limit the number of splits; and the optional C{includeSeparators} argument (default=C{False}), if the separating matching text should be included in the split results. Example:: punc = oneOf(list(".,;:/-!?")) print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) prints:: ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] iRN(R( RREtmaxsplittincludeSeparatorstsplitstlastRpRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs %   cCsdt|tr!tj|}nt|tsTtjdt|tdddSt ||gS(s Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement converts them to L{Literal}s by default. Example:: greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) Prints:: Hello, World! -> ['Hello', ',', 'World', '!'] s4Cannot combine element of type %s with ParserElementt stackleveliN( RsRR"RitwarningstwarnRt SyntaxWarningRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  cCs\t|tr!tj|}nt|tsTtjdt|tdddS||S(s] Implementation of + operator when left operand is not a C{L{ParserElement}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs cCsmt|tr!tj|}nt|tsTtjdt|tdddSt |t j |gS(sQ Implementation of - operator, returns C{L{And}} with error stop s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRRRt _ErrorStop(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__sub__s cCs\t|tr!tj|}nt|tsTtjdt|tdddS||S(s] Implementation of - operator when left operand is not a C{L{ParserElement}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rsub__ s csEt|tr|d}}n-t|tr7|d d }|dd kr_d|df}nt|dtr|dd kr|ddkrtS|ddkrtS|dtSqLt|dtrt|dtr|\}}||8}qLtdt|dt|dntdt||dkrgtdn|dkrtdn||kodknrtdn|rfd |r |dkr|}qt g||}qA|}n(|dkr.}nt g|}|S( s Implementation of * operator, allows use of C{expr * 3} in place of C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples may also include C{None} as in: - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + L{ZeroOrMore}(expr)} (read as "at least n instances of C{expr}") - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} Note that C{expr*(None,n)} does not raise an exception if more than n exprs exist in the input stream; that is, C{expr*(None,n)} does not enforce a maximum number of expr occurrences. If this behavior is desired, then write C{expr*(None,n) + ~expr} iiis7cannot multiply 'ParserElement' and ('%s','%s') objectss0cannot multiply 'ParserElement' and '%s' objectss/cannot multiply ParserElement by negative values@second tuple value must be greater or equal to first tuple values+cannot multiply ParserElement by 0 or (0,0)cs2|dkr$t|dStSdS(Ni(R(tn(tmakeOptionalListR(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR]s N(NN( RsRottupleRR0RRRt ValueErrorR(RR t minElementst optElementsR}((RRs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__mul__,sD#  &  )      cCs |j|S(N(R(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rmul__pscCsdt|tr!tj|}nt|tsTtjdt|tdddSt ||gS(sI Implementation of | operator - returns C{L{MatchFirst}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__or__ss cCs\t|tr!tj|}nt|tsTtjdt|tdddS||BS(s] Implementation of | operator when left operand is not a C{L{ParserElement}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ror__s cCsdt|tr!tj|}nt|tsTtjdt|tdddSt ||gS(sA Implementation of ^ operator - returns C{L{Or}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__xor__s cCs\t|tr!tj|}nt|tsTtjdt|tdddS||AS(s] Implementation of ^ operator when left operand is not a C{L{ParserElement}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rxor__s cCsdt|tr!tj|}nt|tsTtjdt|tdddSt ||gS(sC Implementation of & operator - returns C{L{Each}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRRR (RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__and__s cCs\t|tr!tj|}nt|tsTtjdt|tdddS||@S(s] Implementation of & operator when left operand is not a C{L{ParserElement}} s4Cannot combine element of type %s with ParserElementRiN( RsRR"RiRRRRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rand__s cCs t|S(sE Implementation of ~ operator - returns C{L{NotAny}} (R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt __invert__scCs'|dk r|j|S|jSdS(s  Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be passed as C{True}. If C{name} is omitted, same as calling C{L{copy}}. Example:: # these are equivalent userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") N(RRR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__call__s  cCs t|S(s Suppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. (R)(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsuppressscCs t|_|S(s Disables the skipping of whitespace before matching the characters in the C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. (RRp(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytleaveWhitespaces cCst|_||_t|_|S(s8 Overrides the default whitespace chars (RRpRqRRr(RRg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetWhitespaceCharss   cCs t|_|S(s Overrides default behavior to expand C{}s to spaces before parsing the input string. Must be called before C{parseString} when the input grammar contains elements that match C{} characters. (RRt(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt parseWithTabss cCsrt|trt|}nt|trR||jkrn|jj|qnn|jjt|j|S(s Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. Example:: patt = OneOrMore(Word(alphas)) patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] patt.ignore(cStyleComment) patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] (RsRR)RuRR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytignores cCs1|p t|pt|ptf|_t|_|S(sT Enable display of debugging messages while doing pattern matching. (RGRKRMR{RRv(Rt startActiont successActiontexceptionAction((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugActions s    cCs)|r|jtttn t|_|S(s Enable display of debugging messages while doing pattern matching. Set C{flag} to True to enable, False to disable. Example:: wd = Word(alphas).setName("alphaword") integer = Word(nums).setName("numword") term = wd | integer # turn on debugging for wd wd.setDebug() OneOrMore(term).parseString("abc 123 xyz 890") prints:: Match alphaword at loc 0(1,1) Matched alphaword -> ['abc'] Match alphaword at loc 3(1,4) Exception raised:Expected alphaword (at char 4), (line:1, col:5) Match alphaword at loc 7(1,8) Matched alphaword -> ['xyz'] Match alphaword at loc 11(1,12) Exception raised:Expected alphaword (at char 12), (line:1, col:13) Match alphaword at loc 15(1,16) Exception raised:Expected alphaword (at char 15), (line:1, col:16) The output shown is that produced by the default debug actions - custom debug actions can be specified using L{setDebugActions}. Prior to attempting to match the C{wd} expression, the debugging message C{"Match at loc (,)"} is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, which makes debugging and exception messages easier to understand - for instance, the default name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. (RRGRKRMRRv(Rtflag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugs# cCs|jS(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR@scCs t|S(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRCscCst|_d|_|S(N(RRwRRm(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRFs  cCsdS(N((RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckRecursionKscCs|jgdS(sj Check defined expressions for valid structure, check for infinite recursive definitions. N(R(Rt validateTrace((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvalidateNscCsy|j}Wn5tk rGt|d}|j}WdQXnXy|j||SWn(tk r}tjr}q|nXdS(s Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. trN(treadRtopenRRR"R(Rtfile_or_filenameRt file_contentstfRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt parseFileTs  cCsdt|tr1||kp0t|t|kSt|trM|j|Stt||kSdS(N(RsR"tvarsRRtsuper(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__eq__hs " cCs ||k S(N((RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ne__pscCstt|S(N(thashtid(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__hash__sscCs ||kS(N((RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__req__vscCs ||k S(N((RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rne__yscCs:y!|jt|d|tSWntk r5tSXdS(s Method for quick testing of a parser against a test string. Good for simple inline microtests of sub expressions while building up larger parser. Parameters: - testString - to test against this expression for a match - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests Example:: expr = Word(nums) assert expr.matches("100") RN(RRRRR(Rt testStringR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR|s  t#cCsyt|tr6tttj|jj}nt|trTt|}ng}g}t } x|D]} |d k r|j | t s|r| r|j | qmn| sqmndj|| g} g}yQ| jdd} |j| d|} | j | jd|| o%| } Wntk r} t| trPdnd}d| kr| j t| j| | j dt| j| dd |n| j d| jd || j d t| | o|} | } n<tk r*}| j d t|| o|} |} nX|rX|rG| j dndj| GHn|j | | fqmW| |fS( s3 Execute the parse expression on a series of test strings, showing each test, the parsed results or where the parse failed. Quick and easy way to run a parse expression against a list of sample strings. Parameters: - tests - a list of separate test strings, or a multiline string of test strings - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - comment - (default=C{'#'}) - expression for indicating embedded comments in the test string; pass None to disable comment filtering - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; if False, only dump nested list - printResults - (default=C{True}) prints test output to stdout - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing Returns: a (success, results) tuple, where success indicates that all tests succeeded (or failed if C{failureTests} is True), and the results contain a list of lines of each test's output Example:: number_expr = pyparsing_common.number.copy() result = number_expr.runTests(''' # unsigned integer 100 # negative integer -100 # float with scientific notation 6.02e23 # integer with scientific notation 1e-12 ''') print("Success" if result[0] else "Failed!") result = number_expr.runTests(''' # stray character 100Z # missing leading digit before '.' -.100 # too many '.' 3.14.159 ''', failureTests=True) print("Success" if result[0] else "Failed!") prints:: # unsigned integer 100 [100] # negative integer -100 [-100] # float with scientific notation 6.02e23 [6.02e+23] # integer with scientific notation 1e-12 [1e-12] Success # stray character 100Z ^ FAIL: Expected end of text (at char 3), (line:1, col:4) # missing leading digit before '.' -.100 ^ FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) # too many '.' 3.14.159 ^ FAIL: Expected end of text (at char 4), (line:1, col:5) Success Each test string must be on a single line. If you want to test a string that spans multiple lines, create a test like this:: expr.runTest(r"this is a test\n of strings that spans \n 3 lines") (Note that this is a raw string literal, you must include the leading 'r'.) s s\nRR6s(FATAL)Rrt it^sFAIL: sFAIL-EXCEPTION: N(RsRRRRuRtrstript splitlinesRRRRRRRRRR3RRRERR7Ra(RttestsRtcommenttfullDumpt printResultst failureTestst allResultstcommentstsuccessRpRtresultRRRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytrunTestssNW' +  ,    N(PRRRRfRRt staticmethodRhRjRRRRRRRzRRRRRRRRRRRRRRRRRRRRRRRRRt_MAX_INTRR{RRR RRRRRRRRRRRRRRRRRRRRRRRRRR R R RRRRR"(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR"8s      &   H     " 2G +   D      )            cBseZdZdZRS(sT Abstract C{ParserElement} subclass, for defining atomic matching patterns. cCstt|jdtdS(NR(R R*RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s(RRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR* scBseZdZdZRS(s, An empty token, will always match. cCs2tt|jd|_t|_t|_dS(NR (R R RRRRsRRx(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  (RRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR  scBs#eZdZdZedZRS(s( A token that will never match. cCs;tt|jd|_t|_t|_d|_dS(NRsUnmatchable token( R RRRRRsRRxRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR* s    cCst|||j|dS(N(RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR1 s(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR& s cBs#eZdZdZedZRS(s Token to exactly match a specified string. Example:: Literal('blah').parseString('blah') # -> ['blah'] Literal('blah').parseString('blahfooblah') # -> ['blah'] Literal('blah').parseString('bla') # -> Exception: Expected "blah" For case-insensitive matching, use L{CaselessLiteral}. For keyword matching (force word break before and after the matched string), use L{Keyword} or L{CaselessKeyword}. cCstt|j||_t||_y|d|_Wn0tk rntj dt ddt |_ nXdt |j|_d|j|_t|_t|_dS(Nis2null string passed to Literal; use Empty() insteadRis"%s"s Expected (R RRtmatchRtmatchLentfirstMatchCharRRRRR R^RRRyRRsRx(Rt matchString((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRC s      cCsg|||jkrK|jdks7|j|j|rK||j|jfSt|||j|dS(Ni(R'R&t startswithR%RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRV s$(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5 s  cBsKeZdZedZdedZedZ dZ e dZ RS(s\ Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with C{L{Literal}}: - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} Accepts two optional constructor arguments in addition to the keyword string: - C{identChars} is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$" - C{caseless} allows case-insensitive matching, default is C{False}. Example:: Keyword("start").parseString("start") # -> ['start'] Keyword("start").parseString("starting") # -> Exception For case-insensitive matching, use L{CaselessKeyword}. s_$cCstt|j|dkr+tj}n||_t||_y|d|_Wn't k r}t j dt ddnXd|j|_ d|j |_t|_t|_||_|r|j|_|j}nt||_dS(Nis2null string passed to Keyword; use Empty() insteadRis"%s"s Expected (R RRRtDEFAULT_KEYWORD_CHARSR%RR&R'RRRRRRyRRsRxtcaselesstuppert caselessmatchRt identChars(RR(R.R+((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq s&        cCsb|jr||||j!j|jkrF|t||jkse|||jj|jkrF|dks||dj|jkrF||j|jfSn|||jkrF|jdks|j|j|rF|t||jks|||j|jkrF|dks2||d|jkrF||j|jfSt |||j |dS(Nii( R+R&R,R-RR.R%R'R)RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s #9)$3#cCs%tt|j}tj|_|S(N(R RRR*R.(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cCs |t_dS(s,Overrides the default Keyword chars N(RR*(Rg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultKeywordChars sN( RRRR1R*RRRRRRR#R/(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR^ s    cBs#eZdZdZedZRS(sl Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. Example:: OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] (Contrast with example for L{CaselessKeyword}.) cCsItt|j|j||_d|j|_d|j|_dS(Ns'%s's Expected (R RRR,t returnStringRRy(RR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cCsS||||j!j|jkr7||j|jfSt|||j|dS(N(R&R,R%R0RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s#(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  cBs&eZdZddZedZRS(s Caseless version of L{Keyword}. Example:: OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] (Contrast with example for L{CaselessLiteral}.) cCs#tt|j||dtdS(NR+(R RRR(RR(R.((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCs||||j!j|jkrp|t||jks\|||jj|jkrp||j|jfSt|||j|dS(N(R&R,R-RR.R%RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s#9N(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cBs&eZdZddZedZRS(sx A variation on L{Literal} which matches "close" matches, that is, strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - C{match_string} - string to be matched - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match The results from a successful parse will contain the matched text from the input string and the following named results: - C{mismatches} - a list of the positions within the match_string where mismatches were found - C{original} - the original match_string used to compare against the input string If C{mismatches} is an empty list, then the match was an exact match. Example:: patt = CloseMatch("ATCATCGAATGGA") patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) # exact match patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) # close match allowing up to 2 mismatches patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) icCs]tt|j||_||_||_d|j|jf|_t|_t|_ dS(Ns&Expected %r (with up to %d mismatches)( R RjRRt match_stringt maxMismatchesRyRRxRs(RR1R2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s    cCs|}t|}|t|j}||kr|j}d}g} |j} xtt|||!|jD]J\}} | \} } | | kro| j|t| | krPqqoqoW|d}t|||!g}|j|d<| |d<||fSnt|||j|dS(Niitoriginalt mismatches( RR1R2RRRR RRy(RRERRtstartRtmaxlocR1tmatch_stringlocR4R2ts_mtsrctmattresults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s(    ,        (RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj s cBs>eZdZddddeddZedZdZRS(s Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. An optional C{excludeChars} parameter can list characters that might be found in the input C{bodyChars} string; useful to define a word of all printables except for one or two characters, for instance. L{srange} is useful for defining custom character set strings for defining C{Word} expressions, using range notation from regular expression character sets. A common mistake is to use C{Word} to match a specific literal string, as in C{Word("Address")}. Remember that C{Word} uses the string argument to define I{sets} of matchable characters. This expression would match "Add", "AAA", "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an exact literal string, use L{Literal} or L{Keyword}. pyparsing includes helper strings for building Words: - L{alphas} - L{nums} - L{alphanums} - L{hexnums} - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - L{printables} (any non-whitespace character) Example:: # a word composed of digits integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) # a word with a leading capital, and zero or more lowercase capital_word = Word(alphas.upper(), alphas.lower()) # hostnames are alphanumeric, with leading alpha, and '-' hostname = Word(alphas, alphanums+'-') # roman numeral (not a strict parser, accepts invalid mix of characters) roman = Word("IVXLCDM") # any string of non-whitespace characters, except for ',' csv_value = Word(printables, excludeChars=",") iicstt|jrcdjfd|D}|rcdjfd|D}qcn||_t||_|r||_t||_n||_t||_|dk|_ |dkrt dn||_ |dkr||_ n t |_ |dkr)||_ ||_ nt||_d|j|_t|_||_d|j|jkr}|dkr}|dkr}|dkr}|j|jkrd t|j|_net|jdkrd tj|jt|jf|_n%d t|jt|jf|_|jrDd |jd |_nytj|j|_Wq}tk ryd|_q}XndS( NRrc3s!|]}|kr|VqdS(N((RR(t excludeChars(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys 7 sc3s!|]}|kr|VqdS(N((RR(R<(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys 9 siisZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitteds Expected Rs[%s]+s%s[%s]*s [%s][%s]*s\b(R R-RRt initCharsOrigRt initCharst bodyCharsOrigt bodyCharst maxSpecifiedRtminLentmaxLenR$RRRyRRxt asKeywordt_escapeRegexRangeCharstreStringRR|tescapetcompileRaR(RR>R@tmintmaxtexactRDR<((R<s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR4 sT%             :   c Cs|jr[|jj||}|s?t|||j|n|j}||jfS|||jkrt|||j|n|}|d7}t|}|j}||j }t ||}x*||kr|||kr|d7}qWt } |||j krt } n|jrG||krG|||krGt } n|jr|dkrp||d|ks||kr|||krt } qn| rt|||j|n||||!fS(Nii(R|R%RRytendtgroupR>RR@RCRIRRBRRARD( RRERRR!R5Rt bodycharsR6tthrowException((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj s6       %  < cCsytt|jSWntk r*nX|jdkrd}|j|jkr}d||j||jf|_qd||j|_n|jS(NcSs&t|dkr|d dS|SdS(Nis...(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt charsAsStr s s W:(%s,%s)sW:(%s)(R R-RRaRmRR=R?(RRP((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  (N( RRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR- s.6 #cBsDeZdZeejdZddZedZ dZ RS(s Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. If the given regex contains named groups (defined using C{(?P...)}), these will be preserved as named parse results. Example:: realnum = Regex(r"[+-]?\d+\.\d*") date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)') # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") s[A-Z]icCs3tt|jt|tr|sAtjdtddn||_||_ y+t j |j|j |_ |j|_ Wqt jk rtjd|tddqXnIt|tjr||_ t||_|_ ||_ n tdt||_d|j|_t|_t|_dS(sThe parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.s0null string passed to Regex; use Empty() insteadRis$invalid pattern (%s) passed to RegexsCRegex may only be constructed with a string or a compiled RE objects Expected N(R R%RRsRRRRtpatterntflagsR|RHRFt sre_constantsterrortcompiledREtypeRuRRRRyRRxRRs(RRQRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s.          cCs|jj||}|s6t|||j|n|j}|j}t|j}|rx|D]}||||eZdZddeededZedZdZRS(s Token for matching strings that are delimited by quoting characters. Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=C{None}) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) Example:: qs = QuotedString('"') print(qs.searchString('lsjdf "This is the quote" sldjf')) complex_qs = QuotedString('{{', endQuoteChar='}}') print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) sql_qs = QuotedString('"', escQuote='""') print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) prints:: [['This is the quote']] [['This is the "quote"']] [['This is the quote with "embedded" quotes']] c sttj|j}|sGtjdtddtn|dkr\|}n4|j}|stjdtddtn|_ t |_ |d_ |_ t |_|_|_|_|_|rTtjtjB_dtjj tj d|dk rDt|pGdf_nPd_dtjj tj d|dk rt|pdf_t j d krjd d jfd tt j d dd Dd7_n|r*jdtj|7_n|rhjdtj|7_tjjd_njdtjj 7_y+tjjj_j_Wn4tj k rtjdjtddnXt!_"dj"_#t$_%t&_'dS(Ns$quoteChar cannot be the empty stringRis'endQuoteChar cannot be the empty stringis %s(?:[^%s%s]Rrs%s(?:[^%s\n\r%s]is|(?:s)|(?:c3s<|]2}dtjj| tj|fVqdS(s%s[^%s]N(R|RGt endQuoteCharRE(RR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys / sit)s|(?:%s)s|(?:%s.)s(.)s)*%ss$invalid pattern (%s) passed to Regexs Expected ((R R#RRRRRt SyntaxErrorRt quoteCharRt quoteCharLentfirstQuoteCharRXtendQuoteCharLentescChartescQuotetunquoteResultstconvertWhitespaceEscapesR|t MULTILINEtDOTALLRRRGRERQRRtescCharReplacePatternRHRFRSRTRRRyRRxRRs(RR[R_R`t multilineRaRXRb((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR sf             ( %E  c CsT|||jkr(|jj||p+d}|sOt|||j|n|j}|j}|jrJ||j |j !}t |t rJd|kr|j ridd6dd6dd6dd 6}x/|jD]\}}|j||}qWn|jr tj|jd |}n|jrG|j|j|j}qGqJn||fS( Ns\s s\ts s\ns s\fs s\rs\g<1>(R]R|R%RRRyRLRMRaR\R^RsRRbRRR_RReR`RX( RRERRR!R}tws_maptwslittwschar((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRG s*.      !cCs]ytt|jSWntk r*nX|jdkrVd|j|jf|_n|jS(Ns.quoted string, starting with %s ending with %s(R R#RRaRmRR[RX(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj s N( RRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR# sA #cBs5eZdZddddZedZdZRS(s Token for matching words composed of characters I{not} in a given set (will include whitespace in matched characters if not listed in the provided exclusion set - see example). Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. Example:: # define a comma-separated-value as anything that is not a ',' csv_value = CharsNotIn(',') print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) prints:: ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] iicCstt|jt|_||_|dkr@tdn||_|dkra||_n t |_|dkr||_||_nt ||_ d|j |_ |jdk|_ t|_dS(Nisfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedis Expected (R RRRRptnotCharsRRBRCR$RRRyRsRx(RRjRIRJRK((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s           cCs|||jkr.t|||j|n|}|d7}|j}t||jt|}x*||kr|||kr|d7}qfW|||jkrt|||j|n||||!fS(Ni(RjRRyRIRCRRB(RRERRR5tnotcharstmaxlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  cCsytt|jSWntk r*nX|jdkryt|jdkrfd|jd |_qyd|j|_n|jS(Nis !W:(%s...)s!W:(%s)(R RRRaRmRRRj(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s (RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRv s cBsXeZdZidd6dd6dd6dd6d d 6Zd d d d dZedZRS(s Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is C{" \t\r\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, as defined for the C{L{Word}} class. sRss ss ss ss s iicsttj|_jdjfdjDdjdjD_t_ dj_ |_ |dkr|_ n t _ |dkr|_ |_ ndS(NRrc3s$|]}|jkr|VqdS(N(t matchWhite(RR(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys scss|]}tj|VqdS(N(R,t whiteStrs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys ss Expected i(R R,RRmRRRqRRRsRyRBRCR$(RtwsRIRJRK((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s )       cCs|||jkr.t|||j|n|}|d7}||j}t|t|}x-||kr|||jkr|d7}qcW|||jkrt|||j|n||||!fS(Ni(RmRRyRCRIRRB(RRERRR5R6((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  "(RRRRnRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR, s t_PositionTokencBseZdZRS(cCs8tt|j|jj|_t|_t|_ dS(N( R RpRR^RRRRsRRx(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s (RRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRp scBs,eZdZdZdZedZRS(sb Token to advance to a specific column of input text; useful for tabular report scraping. cCs tt|j||_dS(N(R RRR7(Rtcolno((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCst|||jkrt|}|jrB|j||}nxE||kr||jrt|||jkr|d7}qEWn|S(Ni(R7RRuRtisspace(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  7cCs^t||}||jkr6t||d|n||j|}|||!}||fS(NsText not in expected column(R7R(RRERRtthiscoltnewlocR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  (RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  cBs#eZdZdZedZRS(s Matches if current position is at the beginning of a line within the parse string Example:: test = ''' AAA this line AAA and this line AAA but not this one B AAA and definitely not this one ''' for t in (LineStart() + 'AAA' + restOfLine).searchString(test): print(t) Prints:: ['AAA', ' this line'] ['AAA', ' and this line'] cCs tt|jd|_dS(NsExpected start of line(R RRRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR& scCs;t||dkr|gfSt|||j|dS(Ni(R7RRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR* s (RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cBs#eZdZdZedZRS(sU Matches if current position is at the end of a line within the parse string cCs<tt|j|jtjjddd|_dS(Ns RrsExpected end of line(R RRRR"RfRRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR3 scCs|t|krK||dkr0|ddfSt|||j|n8|t|krk|dgfSt|||j|dS(Ns i(RRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR8 s(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/ s cBs#eZdZdZedZRS(sM Matches if current position is at the beginning of the parse string cCs tt|jd|_dS(NsExpected start of text(R R(RRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRG scCsL|dkrB||j|dkrBt|||j|qBn|gfS(Ni(RRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK s (RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR(C s cBs#eZdZdZedZRS(sG Matches if current position is at the end of the parse string cCs tt|jd|_dS(NsExpected end of text(R R'RRy(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRV scCs|t|kr-t|||j|nT|t|krM|dgfS|t|kri|gfSt|||j|dS(Ni(RRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZ s (RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR'R s cBs&eZdZedZedZRS(sp Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. cCs/tt|jt||_d|_dS(NsNot at the start of a word(R R/RRt wordCharsRy(RRu((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRl scCs^|dkrT||d|jks6|||jkrTt|||j|qTn|gfS(Nii(RuRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq s  (RRRRTRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/d s cBs&eZdZedZedZRS(sZ Matches if the current position is at the end of a Word, and is not followed by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. cCs8tt|jt||_t|_d|_dS(NsNot at the end of a word(R R.RRRuRRpRy(RRu((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cCsvt|}|dkrl||krl|||jksN||d|jkrlt|||j|qln|gfS(Nii(RRuRRy(RRERRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  (RRRRTRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR.x s cBsqeZdZedZdZdZdZdZdZ dZ edZ gd Z d Z RS( s^ Abstract subclass of ParserElement, for combining and post-processing parsed tokens. cCstt|j|t|tr4t|}nt|tr[tj|g|_ nt|t j rt|}t d|Drt tj|}nt||_ n3yt||_ Wntk r|g|_ nXt|_dS(Ncss|]}t|tVqdS(N(RsR(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s(R RRRsRRRR"RitexprsRtIterabletallRRRR}(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  cCs |j|S(N(Rv(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCs|jj|d|_|S(N(RvRRRm(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cCsPt|_g|jD]}|j^q|_x|jD]}|jq8W|S(s~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on all contained expressions.(RRpRvRR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s  %cCst|trb||jkrtt|j|x(|jD]}|j|jdq>Wqn>tt|j|x%|jD]}|j|jdqW|S(Ni(RsR)RuR RRRv(RR R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCsfytt|jSWntk r*nX|jdkr_d|jjt|j f|_n|jS(Ns%s:(%s)( R RRRaRmRR^RRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s %cCswtt|jx|jD]}|jqWt|jdkr`|jd}t||jr|j r|jdkr|j r|j|jdg|_d|_ |j |j O_ |j |j O_ n|jd}t||jr`|j r`|jdkr`|j r`|jd |j|_d|_ |j |j O_ |j |j O_ q`ndt||_|S(Niiiis Expected (R RRRvRRsR^RkRnRRvRmRsRxRRy(RRR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s0        cCstt|j||}|S(N(R RR(RRRR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCs@||g}x|jD]}|j|qW|jgdS(N(RvRR(RRttmpR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCs>tt|j}g|jD]}|j^q|_|S(N(R RRRv(RR}R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s%(RRRRRRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s    "  cBsWeZdZdefdYZedZedZdZdZ dZ RS(s  Requires all given C{ParseExpression}s to be found in the given order. Expressions may be separated by whitespace. May be constructed using the C{'+'} operator. May also be constructed using the C{'-'} operator, which will suppress backtracking. Example:: integer = Word(nums) name_expr = OneOrMore(Word(alphas)) expr = And([integer("id"),name_expr("name"),integer("age")]) # more easily written as: expr = integer("id") + name_expr("name") + integer("age") RcBseZdZRS(cOs3ttj|j||d|_|jdS(Nt-(R RRRRR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s (RRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR scCsltt|j||td|jD|_|j|jdj|jdj|_t |_ dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys  si( R RRRxRvRsRRqRpRR}(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s c Cs?|jdj|||dt\}}t}x|jdD]}t|tjr`t}q<n|ry|j|||\}}Wqtk rqtk r}d|_ tj |qt k rt|t ||j|qXn|j|||\}}|s$|jr<||7}q<q<W||fS(NiRi(RvRRRsRRRR!RRt __traceback__RRRRyR( RRERRt resultlistt errorStopRt exprtokensR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s((   %cCs.t|tr!tj|}n|j|S(N(RsRR"RiR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5 scCs@||g}x+|jD] }|j||jsPqqWdS(N(RvRRs(RRtsubRecCheckListR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR: s   cCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRt{Rcss|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys F st}(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRA s *( RRRR RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s    cBsAeZdZedZedZdZdZdZ RS(s Requires that at least one C{ParseExpression} is found. If two expressions match, the expression that matches the longest string will be used. May be constructed using the C{'^'} operator. Example:: # construct Or using '^' operator number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) print(number.searchString("123 3.1416 789")) prints:: [['123'], ['3.1416'], ['789']] cCsNtt|j|||jrAtd|jD|_n t|_dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys \ s(R RRRvR4RsR(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRY s c Csd}d}g}x|jD]}y|j||}Wntk rw} d| _| j|kr| }| j}qqtk rt||krt|t||j|}t|}qqX|j ||fqW|rh|j ddxn|D]c\} }y|j |||SWqtk r`} d| _| j|kra| }| j}qaqXqWn|dk r|j|_ |nt||d|dS(NiRcSs |d S(Ni((tx((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqu Rrs no defined alternatives to match( RRvRRR{RRRRyRtsortRR( RRERRt maxExcLoct maxExceptionRRtloc2Rt_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR` s<      cCs.t|tr!tj|}n|j|S(N(RsRR"RiR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ixor__ scCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRRs ^ css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys sR(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s *cCs3||g}x|jD]}|j|qWdS(N(RvR(RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s( RRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK s    &  cBsAeZdZedZedZdZdZdZ RS(s Requires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the C{'|'} operator. Example:: # construct MatchFirst using '|' operator # watch the order of expressions to match number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] # put more selective expression first number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] cCsNtt|j|||jrAtd|jD|_n t|_dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s(R RRRvR4RsR(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s c Csd}d}x|jD]}y|j|||}|SWqtk ro}|j|kr|}|j}qqtk rt||krt|t||j|}t|}qqXqW|dk r|j|_|nt||d|dS(Nis no defined alternatives to match( RRvRRRRRRyR( RRERRRRRR}R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s$    cCs.t|tr!tj|}n|j|S(N(RsRR"RiR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ior__ scCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRRs | css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys sR(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s *cCs3||g}x|jD]}|j|qWdS(N(RvR(RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s( RRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s     cBs8eZdZedZedZdZdZRS(sm Requires all given C{ParseExpression}s to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the C{'&'} operator. Example:: color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") integer = Word(nums) shape_attr = "shape:" + shape_type("shape") posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") color_attr = "color:" + color("color") size_attr = "size:" + integer("size") # use Each (using operator '&') to accept attributes in any order # (shape and posn are required, color and size are optional) shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) shape_spec.runTests(''' shape: SQUARE color: BLACK posn: 100, 120 shape: CIRCLE size: 50 color: BLUE posn: 50,80 color:GREEN size:20 shape:TRIANGLE posn:20,40 ''' ) prints:: shape: SQUARE color: BLACK posn: 100, 120 ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - color: BLACK - posn: ['100', ',', '120'] - x: 100 - y: 120 - shape: SQUARE shape: CIRCLE size: 50 color: BLUE posn: 50,80 ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - color: BLUE - posn: ['50', ',', '80'] - x: 50 - y: 80 - shape: CIRCLE - size: 50 color: GREEN size: 20 shape: TRIANGLE posn: 20,40 ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - color: GREEN - posn: ['20', ',', '40'] - x: 20 - y: 40 - shape: TRIANGLE - size: 20 cCsKtt|j||td|jD|_t|_t|_dS(Ncss|]}|jVqdS(N(Rs(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s( R R RRxRvRsRRptinitExprGroups(RRvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs cCs4|jrLtd|jD|_g|jD]}t|tr/|j^q/}g|jD]%}|jr]t|t r]|^q]}|||_g|jD]}t|t r|j^q|_ g|jD]}t|t r|j^q|_ g|jD]$}t|tt t fs|^q|_ |j |j 7_ t|_n|}|j }|j} g} t} x| r_|| |j |j } g} x| D]}y|j||}Wntk r| j|qX| j|jjt||||kr|j|q|| kr| j|qqWt| t| krut} ququW|rdjd|D}t||d|n| g|jD]*}t|tr|j| kr|^q7} g}x6| D].}|j|||\}}|j|qWt|tg}||fS(Ncss3|])}t|trt|j|fVqdS(N(RsRRRF(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys ss, css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys =ss*Missing one or more required elements (%s)(RRRvtopt1mapRsRRFRst optionalsR0tmultioptionalsRt multirequiredtrequiredRRRRRRRtremoveRRRtsumR (RRERRRtopt1topt2ttmpLocttmpReqdttmpOptt matchOrdert keepMatchingttmpExprstfailedtmissingR|R;t finalResults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsP .5 117      "   > cCsVt|dr|jS|jdkrOddjd|jDd|_n|jS(NRRs & css|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys PsR(RRRmRRRv(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRKs *cCs3||g}x|jD]}|j|qWdS(N(RvR(RRRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs(RRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s 5  1 cBs_eZdZedZedZdZdZdZ dZ gdZ dZ RS( sa Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. cCstt|j|t|trattjtrItj|}qatjt |}n||_ d|_ |dk r|j |_ |j|_|j|j|j|_|j|_|j|_|jj|jndS(N(R RRRsRt issubclassR"RiR*RRFRRmRxRsRRqRpRoR}RuR(RRFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR^s        cCsG|jdk r+|jj|||dtStd||j|dS(NRRr(RFRRRRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRpscCs>t|_|jj|_|jdk r:|jjn|S(N(RRpRFRRR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRvs  cCst|trc||jkrtt|j||jdk r`|jj|jdq`qn?tt|j||jdk r|jj|jdn|S(Ni(RsR)RuR RRRFR(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR}s cCs6tt|j|jdk r2|jjn|S(N(R RRRFR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsV||kr"t||gn||g}|jdk rR|jj|ndS(N(R$RFRR(RRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs  cCsA||g}|jdk r0|jj|n|jgdS(N(RFRRR(RRRy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsuytt|jSWntk r*nX|jdkrn|jdk rnd|jjt |jf|_n|jS(Ns%s:(%s)( R RRRaRmRRFR^RR(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs %( RRRRRRRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZs      cBs#eZdZdZedZRS(s Lookahead matching of the given parse expression. C{FollowedBy} does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. C{FollowedBy} always returns a null token list. Example:: # use FollowedBy to match a label only if it is followed by a ':' data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() prints:: [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] cCs#tt|j|t|_dS(N(R R RRRs(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs|jj|||gfS(N(RFR(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR s cBs,eZdZdZedZdZRS(s Lookahead to disallow matching with the given parse expression. C{NotAny} does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression does I{not} match at the current position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator. Example:: cCsBtt|j|t|_t|_dt|j|_ dS(NsFound unwanted token, ( R RRRRpRRsRRFRy(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs  cCs:|jj||r0t|||j|n|gfS(N(RFRRRy(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRs~{R(RRRmRRRF(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs (RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs   t_MultipleMatchcBs eZddZedZRS(cCsftt|j|t|_|}t|trFtj|}n|dk rY|nd|_ dS(N( R RRRRoRsRR"RiRt not_ender(RRFtstopOntender((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs  c Cs|jj}|j}|jdk }|r9|jj}n|rO|||n||||dt\}}y|j } xo|r|||n| r|||} n|} ||| |\}} | s| jr~|| 7}q~q~WWnt t fk rnX||fS(NR( RFRRRRRRRuRRR( RRERRtself_expr_parsetself_skip_ignorablest check_endert try_not_enderRthasIgnoreExprsRt tmptokens((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs,   N(RRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs cBseZdZdZRS(s Repetition of one or more of the given expression. Parameters: - expr - expression that must match one or more times - stopOn - (default=C{None}) - expression for a terminating sentinel (only required if the sentinel would ordinarily match the repetition expression) Example:: data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) text = "shape: SQUARE posn: upper left color: BLACK" OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] # use stopOn attribute for OneOrMore to avoid reading label string as part of the data attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] # could also be written as (attr_expr * (1,)).parseString(text).pprint() cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRRs}...(RRRmRRRF(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!s (RRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBs/eZdZddZedZdZRS(sw Optional repetition of zero or more of the given expression. Parameters: - expr - expression that must match zero or more times - stopOn - (default=C{None}) - expression for a terminating sentinel (only required if the sentinel would ordinarily match the repetition expression) Example: similar to L{OneOrMore} cCs)tt|j|d|t|_dS(NR(R R0RRRs(RRFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR6scCsEy tt|j|||SWnttfk r@|gfSXdS(N(R R0RRR(RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:s cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRRs]...(RRRmRRRF(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR@s N(RRRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR0*s   t _NullTokencBs eZdZeZdZRS(cCstS(N(R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRJscCsdS(NRr((R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRMs(RRRR>R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRIs cBs/eZdZedZedZdZRS(sa Optional matching of the given expression. Parameters: - expr - expression that must match zero or more times - default (optional) - value to be returned if the optional expression is not found. Example:: # US postal code can be a 5-digit zip, plus optional 4-digit qualifier zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) zip.runTests(''' # traditional ZIP code 12345 # ZIP+4 form 12101-0001 # invalid ZIP 98765- ''') prints:: # traditional ZIP code 12345 ['12345'] # ZIP+4 form 12101-0001 ['12101-0001'] # invalid ZIP 98765- ^ FAIL: Expected end of text (at char 5), (line:1, col:6) cCsAtt|j|dt|jj|_||_t|_dS(NR( R RRRRFRoRRRs(RRFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRts cCsy(|jj|||dt\}}Wnottfk r|jtk r|jjrt|jg}|j||jj ['3', '.', '1416'] # will also erroneously match the following print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] real = Combine(Word(nums) + '.' + Word(nums)) print(real.parseString('3.1416')) # -> ['3.1416'] # no match when there are internal spaces print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) RrcCsQtt|j||r)|jn||_t|_||_t|_dS(N( R RRRtadjacentRRpt joinStringR}(RRFRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRrs    cCs6|jrtj||ntt|j||S(N(RR"RR R(RR ((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR|s cCse|j}|2|tdj|j|jgd|j7}|jr]|jr]|gS|SdS(NRrR(RR RRRRzRnR(RRERRtretToks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs  1(RRRRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRas cBs eZdZdZdZRS(s Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. Example:: ident = Word(alphas) num = Word(nums) term = ident | num func = ident + Optional(delimitedList(term)) print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] func = ident + Group(Optional(delimitedList(term))) print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] cCs#tt|j|t|_dS(N(R RRRRo(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCs|gS(N((RRERR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs(RRRRR(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs  cBs eZdZdZdZRS(sW Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. Example:: data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) text = "shape: SQUARE posn: upper left color: light blue texture: burlap" attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) # print attributes as plain groups print(OneOrMore(attr_expr).parseString(text).dump()) # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names result = Dict(OneOrMore(Group(attr_expr))).parseString(text) print(result.dump()) # access named fields as dict entries, or output as dict print(result['shape']) print(result.asDict()) prints:: ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - color: light blue - posn: upper left - shape: SQUARE - texture: burlap SQUARE {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} See more examples at L{ParseResults} of accessing fields by results name. cCs#tt|j|t|_dS(N(R R RRRo(RRF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscCsTx9t|D]+\}}t|dkr1q n|d}t|trct|dj}nt|dkrtd|||nX|S(ss Decorator for debugging parse actions. When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. Example:: wd = Word(alphas) @traceParseAction def remove_duplicate_chars(tokens): return ''.join(sorted(set(''.join(tokens))) wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) print(wds.parseString("slkdjs sld sldd sdlf sdljf")) prints:: >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) <>entering %s(line: '%s', %d, %r) s< ['aa', 'bb', 'cc'] delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] s [Rs]...N(RRR0RR)(RFtdelimtcombinetdlName((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR>9s ,!cstfd}|dkrBttjd}n |j}|jd|j|dt|jdt dS(s: Helper to define a counted list of expressions. This helper defines a pattern of the form:: integer expr expr expr... where the leading integer tells how many expr expressions follow. The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. Example:: countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] # in this parser, the leading integer value is given in binary, # '10' indicating that 2 values are in the array binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] cs;|d}|r,ttg|p5tt>gS(Ni(RRRA(RRNRpR(t arrayExprRF(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcountFieldParseAction_s -cSst|dS(Ni(Ro(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqdRrtarrayLenR~s(len) s...N( R RR-RPRzRRRRR(RFtintExprR((RRFs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:Ls    cCsMg}x@|D]8}t|tr8|jt|q |j|q W|S(N(RsRRRR(tLR}R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRks  csFtfd}|j|dtjdt|S(s* Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousLiteral(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches a previous literal, will also match the leading C{"1:1"} in C{"1:10"}. If this is not desired, use C{matchPreviousExpr}. Do I{not} use with packrat parsing enabled. csc|rTt|dkr'|d>q_t|j}td|D>n t>dS(Niicss|]}t|VqdS(N(R(Rttt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s(RRRRR (RRNRpttflat(trep(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcopyTokenToRepeaters R~s(prev) (R RRRR(RFR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRMts  cs\t|j}|Kfd}|j|dtjdt|S(sS Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousExpr(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches by expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; the expressions are evaluated first, and then compared, so C{"1"} is compared with C{"10"}. Do I{not} use with packrat parsing enabled. cs8t|jfd}j|dtdS(Ncs7t|j}|kr3tdddndS(NRri(RRR(RRNRpt theseTokens(t matchTokens(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytmustMatchTheseTokenss R~(RRRzR(RRNRpR(R(Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsR~s(prev) (R RRRRR(RFte2R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRLs   cCsUx$dD]}|j|t|}qW|jdd}|jdd}t|S(Ns\^-]s s\ns s\t(Rt_bslashR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyREs  c sD|r!d}d}tnd}d}tg}t|tr]|j}n7t|tjr~t|}ntj dt dd|st Sd}x|t |d krV||}xt ||d D]f\}} || |r |||d =Pq||| r|||d =|j|| | }PqqW|d 7}qW| r|ryt |t d j|krtd d jd |Djd j|Stdjd|Djd j|SWqtk rtj dt ddqXntfd|Djd j|S(s Helper to quickly define a set of alternative Literals, and makes sure to do longest-first testing when there is a conflict, regardless of the input order, but returns a C{L{MatchFirst}} for best performance. Parameters: - strs - a string of space-delimited literals, or a collection of string literals - caseless - (default=C{False}) - treat all literals as caseless - useRegex - (default=C{True}) - as an optimization, will generate a Regex object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or if creating a C{Regex} raises an exception) Example:: comp_oper = oneOf("< = > <= >= !=") var = Word(alphas) number = Word(nums) term = var | number comparison_expr = term + comp_oper + term print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) prints:: [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] cSs|j|jkS(N(R,(R tb((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcSs|jj|jS(N(R,R)(R R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcSs ||kS(N((R R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcSs |j|S(N(R)(R R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrs6Invalid argument to oneOf, expected string or iterableRiiiRrs[%s]css|]}t|VqdS(N(RE(Rtsym((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys ss | t|css|]}tj|VqdS(N(R|RG(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys ss7Exception creating Regex for oneOf, building MatchFirstc3s|]}|VqdS(N((RR(tparseElementClass(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys s(RRRsRRRRwRRRRRRRRRR%RRaR( tstrsR+tuseRegextisequaltmaskstsymbolsRtcurRR ((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRQsL        ! !33  cCsttt||S(s Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the C{Dict} results can include named token fields. Example:: text = "shape: SQUARE posn: upper left color: light blue texture: burlap" attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) print(OneOrMore(attr_expr).parseString(text).dump()) attr_label = label attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) # similar to Dict, but simpler call format result = dictOf(attr_label, attr_value).parseString(text) print(result.dump()) print(result['shape']) print(result.shape) # object attribute access works too print(result.asDict()) prints:: [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - color: light blue - posn: upper left - shape: SQUARE - texture: burlap SQUARE SQUARE {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} (R R0R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR?s!cCs|tjd}|j}t|_|d||d}|rVd}n d}|j||j|_|S(s Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. By default, returns astring containing the original parsed text. If the optional C{asString} argument is passed as C{False}, then the return value is a C{L{ParseResults}} containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to C{L{originalTextFor}} contains expressions with defined results names, you must set C{asString} to C{False} if you want to preserve those results name values. Example:: src = "this is test bold text normal text " for tag in ("b","i"): opener,closer = makeHTMLTags(tag) patt = originalTextFor(opener + SkipTo(closer) + closer) print(patt.searchString(src)[0]) prints:: [' bold text '] ['text'] cSs|S(N((RRRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq8Rrt_original_startt _original_endcSs||j|j!S(N(RR(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq=RrcSs'||jd|jd!g|(dS(NRR(R(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt extractText?s(R RzRRR}Ru(RFtasStringt locMarkert endlocMarkert matchExprR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRe s      cCst|jdS(sp Helper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty. cSs|dS(Ni((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqJRr(R+Rz(RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfEscCsEtjd}t|d|d|jjdS(s Helper to decorate a returned token with its starting and ending locations in the input string. This helper adds the following results names: - locn_start = location where matched expression begins - locn_end = location where matched expression ends - value = the actual parsed results Be careful if the input text contains C{} characters, you may want to call C{L{ParserElement.parseWithTabs}} Example:: wd = Word(alphas) for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): print(match) prints:: [[0, 'ljsdf', 5]] [[8, 'lksdjjf', 15]] [[18, 'lkkjj', 23]] cSs|S(N((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq`Rrt locn_startRtlocn_end(R RzRRR(RFtlocator((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRhLss\[]-*.$+^?()~ RKcCs |ddS(Nii((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqkRrs\\0?[xX][0-9a-fA-F]+cCs tt|djddS(Nis\0xi(tunichrRotlstrip(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqlRrs \\0[0-7]+cCstt|dddS(Niii(RRo(RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqmRrR<s\]s\wRzRRtnegatetbodyRcsOdy-djfdtj|jDSWntk rJdSXdS(s Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be: - a single character - an escaped character with a leading backslash (such as C{\-} or C{\]}) - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) (C{\0x##} is also supported for backwards compatibility) - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) cSsKt|ts|Sdjdtt|dt|ddDS(NRrcss|]}t|VqdS(N(R(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys sii(RsR RRtord(tp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrRrc3s|]}|VqdS(N((Rtpart(t _expanded(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys sN(Rt_reBracketExprRRRa(R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR]rs  - csfd}|S(st Helper method for defining parse actions that require matching at a specific column in the input text. cs2t||kr.t||dndS(Nsmatched token not at column %d(R7R(R@tlocnRJ(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt verifyCols((RR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRKscs fdS(s Helper method for common parse actions that simply return a literal value. Especially useful when used with C{L{transformString}()}. Example:: num = Word(nums).setParseAction(lambda toks: int(toks[0])) na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) term = na | num OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] csgS(N((RRNRp(treplStr(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRr((R((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZs cCs|ddd!S(s Helper parse action for removing quotation marks from parsed quoted strings. Example:: # by default, quotation marks are included in parsed results quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] # use removeQuotes to strip quotation marks from parsed results quotedString.setParseAction(removeQuotes) quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] iii((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRXs csafd}y"tdtdj}Wntk rSt}nX||_|S(sG Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional args are passed, they are forwarded to the given function as additional arguments after the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the parsed data to an integer using base 16. Example (compare the last to example in L{ParserElement.transformString}:: hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) hex_ints.runTests(''' 00 11 22 aa FF 0a 0d 1a ''') upperword = Word(alphas).setParseAction(tokenMap(str.upper)) OneOrMore(upperword).runTests(''' my kingdom for a horse ''') wd = Word(alphas).setParseAction(tokenMap(str.title)) OneOrMore(wd).setParseAction(' '.join).runTests(''' now is the winter of our discontent made glorious summer by this sun of york ''') prints:: 00 11 22 aa FF 0a 0d 1a [0, 17, 34, 170, 255, 10, 13, 26] my kingdom for a horse ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] now is the winter of our discontent made glorious summer by this sun of york ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] cs g|D]}|^qS(N((RRNRpttokn(RRO(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRsRR^(R`RRaRu(RORRRd((RROs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRks    cCst|jS(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcCst|jS(N(Rtlower(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcCs<t|tr+|}t|d| }n |j}tttd}|rtjj t }t d|dt t t|t d|tddtgjdj d t d }nd jd tD}tjj t t|B}t d|dt t t|j ttt d|tddtgjdj d t d }ttd|d }|jdd j|jddjjjd|}|jdd j|jddjjjd|}||_||_||fS(sRInternal helper to construct opening and closing tag expressions, given a tag nameR+s_-:Rttagt=t/RRAcSs|ddkS(NiR((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrR Rrcss!|]}|dkr|VqdS(R N((RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys scSs|ddkS(NiR((RRNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrsRLs(RsRRRR-R2R1R<RRzRXR)R R0RRRRRRTRWR@Rt_LRttitleRRR(ttagStrtxmltresnamet tagAttrNamet tagAttrValuetopenTagtprintablesLessRAbracktcloseTag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt _makeTagss" o{AA  cCs t|tS(s  Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. Example:: text = 'More info at the pyparsing wiki page' # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple a,a_end = makeHTMLTags("A") link_expr = a + SkipTo(a_end)("link_text") + a_end for link in link_expr.searchString(text): # attributes in the tag (like "href" shown here) are also accessible as named results print(link.link_text, '->', link.href) prints:: pyparsing -> http://pyparsing.wikispaces.com (R R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRIscCs t|tS(s Helper to construct opening and closing tag expressions for XML, given a tag name. Matches tags only in the given upper/lower case. Example: similar to L{makeHTMLTags} (R R(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRJscsT|r|n |jgD]\}}||f^q#fd}|S(s< Helper to create a validating parse action to be used with start tags created with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as C{} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. If just testing for C{class} (with or without a namespace), use C{L{withClass}}. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this has no type
''' div,div_end = makeHTMLTags("div") # only match div tag having a type attribute with value "grid" div_grid = div().setParseAction(withAttribute(type="grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) # construct a match with any div tag having a type attribute, regardless of the value div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 csx~D]v\}}||kr8t||d|n|tjkr|||krt||d||||fqqWdS(Nsno matching attribute s+attribute '%s' has value '%s', must be '%s'(RRct ANY_VALUE(RRNRtattrNamet attrValue(tattrs(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRRs   (R(RtattrDictRRR((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRcs 2  %cCs'|rd|nd}ti||6S(s Simplified version of C{L{withAttribute}} when matching on a div class - made difficult because C{class} is a reserved word in Python. Example:: html = '''
Some text
1 4 0 1 0
1,3 2,3 1,1
this <div> has no class
''' div,div_end = makeHTMLTags("div") div_grid = div().setParseAction(withClass("grid")) grid_expr = div_grid + SkipTo(div | div_end)("body") for grid_header in grid_expr.searchString(html): print(grid_header.body) div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) div_expr = div_any_type + SkipTo(div | div_end)("body") for div_header in div_expr.searchString(html): print(div_header.body) prints:: 1 4 0 1 0 1 4 0 1 0 1,3 2,3 1,1 s%s:classtclass(Rc(t classnamet namespacet classattr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRi\s t(RYcCs<t}||||B}xt|D]\}}|d d \}} } } | dkrdd|nd|} | dkr|d kst|dkrtdn|\} }ntj| }| tjkr| dkr t||t |t |}q| dkrx|d k rQt|||t |t ||}qt||t |t |}q| dkrt|| |||t || |||}qtdn+| tj kr| dkr)t |t st |}nt|j|t ||}q| dkr|d k rpt|||t |t ||}qt||t |t |}q| dkrt|| |||t || |||}qtdn td | r |j| n||j| |BK}|}q(W||K}|S( s Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. The generated parser will also recognize the use of parentheses to override operator precedences (see example below). Note: if you define a deep operator list, you may see performance issues when using infixNotation. See L{ParserElement.enablePackrat} for a mechanism to potentially improve your parser performance. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) Example:: # simple example of four-function arithmetic with ints and variable names integer = pyparsing_common.signed_integer varname = pyparsing_common.identifier arith_expr = infixNotation(integer | varname, [ ('-', 1, opAssoc.RIGHT), (oneOf('* /'), 2, opAssoc.LEFT), (oneOf('+ -'), 2, opAssoc.LEFT), ]) arith_expr.runTests(''' 5+3*6 (5+3)*6 -2--11 ''', fullDump=False) prints:: 5+3*6 [[5, '+', [3, '*', 6]]] (5+3)*6 [[[5, '+', 3], '*', 6]] -2--11 [[['-', 2], '-', ['-', 11]]] iis%s terms %s%s termis@if numterms=3, opExpr must be a tuple or list of two expressionsis6operator must be unary (1), binary (2), or ternary (3)s2operator must indicate right or left associativityN(N(R RRRRRRRtLEFTR RRtRIGHTRsRRFRz(tbaseExprtopListtlpartrparR}tlastExprRtoperDeftopExprtaritytrightLeftAssocRttermNametopExpr1topExpr2tthisExprR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRgsR;    '  /'   $  /'     s4"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t"s string enclosed in double quotess4'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t's string enclosed in single quotess*quotedString using single or double quotestusunicode string literalcCs!||krtdn|d krt|trt|trt|dkrt|dkr|d k rtt|t||tj ddj d}q|t j t||tj j d}q|d k r9tt|t |t |ttj ddj d}qttt |t |ttj ddj d}qtdnt}|d k r|tt|t||B|Bt|K}n.|tt|t||Bt|K}|jd ||f|S( s~ Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - content - expression for items within the nested lists (default=C{None}) - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. Example:: data_type = oneOf("void int short long char float double") decl_data_type = Combine(data_type + Optional(Word('*'))) ident = Word(alphas+'_', alphanums+'_') number = pyparsing_common.number arg = Group(decl_data_type + ident) LPAR,RPAR = map(Suppress, "()") code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) c_function = (decl_data_type("type") + ident("name") + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + code_body("body")) c_function.ignore(cStyleComment) source_code = ''' int is_odd(int x) { return (x%2); } int dec_to_hex(char hchar) { if (hchar >= '0' && hchar <= '9') { return (ord(hchar)-ord('0')); } else { return (10+ord(hchar)-ord('A')); } } ''' for func in c_function.searchString(source_code): print("%(name)s (%(type)s) args: %(args)s" % func) prints:: is_odd (int) args: [['int', 'x']] dec_to_hex (int) args: [['char', 'hchar']] s.opening and closing strings cannot be the sameiRKcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq9RrcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq<RrcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqBRrcSs|djS(Ni(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqFRrsOopening and closing arguments must be strings if no content expression is givensnested %s%s expressionN(RRRsRRRRRR"RfRzRARRR RR)R0R(topenertclosertcontentRR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRNs4:  $  $    5.c s5fd}fd}fd}ttjdj}ttj|jd}tj|jd}tj|jd} |rtt||t|t|t|| } n0tt|t|t|t|} |j t t| jdS( s Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=C{True}) A valid block must contain at least one C{blockStatement}. Example:: data = ''' def A(z): A1 B = 100 G = A2 A2 A3 B def BB(a,b,c): BB1 def BBA(): bba1 bba2 bba3 C D def spam(x,y): def eggs(z): pass ''' indentStack = [1] stmt = Forward() identifier = Word(alphas, alphanums) funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") func_body = indentedBlock(stmt, indentStack) funcDef = Group( funcDecl + func_body ) rvalue = Forward() funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") rvalue << (funcCall | identifier | Word(nums)) assignment = Group(identifier + "=" + rvalue) stmt << ( funcDef | assignment | identifier ) module_body = OneOrMore(stmt) parseTree = module_body.parseString(data) parseTree.pprint() prints:: [['def', 'A', ['(', 'z', ')'], ':', [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], 'B', ['def', 'BB', ['(', 'a', 'b', 'c', ')'], ':', [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], 'C', 'D', ['def', 'spam', ['(', 'x', 'y', ')'], ':', [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] css|t|krdSt||}|dkro|dkrZt||dnt||dndS(Nisillegal nestingsnot a peer entry(RR7RR(RRNRptcurCol(t indentStack(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckPeerIndentscsEt||}|dkr/j|nt||ddS(Nisnot a subentry(R7RR(RRNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckSubIndentscsn|t|krdSt||}oH|dkoH|dks`t||dnjdS(Niisnot an unindent(RR7RR(RRNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt checkUnindents &s tINDENTRrtUNINDENTsindented block( RRRRR RzRRRRR( tblockStatementExprR,R$R-R.R/R7R0tPEERtUNDENTtsmExpr((R,s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRdQsN"8 $s#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]s[\0xa1-\0xbf\0xd7\0xf7]s_:sany tagsgt lt amp nbsp quot aposs><& "'s &(?PRs);scommon HTML entitycCstj|jS(sRHelper parser action to replace common HTML entities with their special characters(t_htmlEntityMapRtentity(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRYss/\*(?:[^*]|\*(?!/))*s*/sC style commentss HTML comments.*s rest of lines//(?:\\\n|[^\n])*s // commentsC++ style comments#.*sPython style comments t commaItemRcBseZdZeeZeeZee j dj eZ ee j dj eedZedj dj eZej edej ej dZejdeeeed jeBj d Zejeed j d j eZed j dj eZeeBeBjZedj dj eZeededj dZedj dZedj dZ e de dj dZ!ee de d8dee de d9j dZ"e"j#ddej d Z$e%e!e$Be"Bj d!j d!Z&ed"j d#Z'e(d$d%Z)e(d&d'Z*ed(j d)Z+ed*j d+Z,ed,j d-Z-e.je/jBZ0e(d.Z1e%e2e3d/e4ee5d0d/ee6d1jj d2Z7e8ee9j:e7Bd3d4j d5Z;e(ed6Z<e(ed7Z=RS(:s Here are some common low-level expressions that may be useful in jump-starting parser development: - numeric forms (L{integers}, L{reals}, L{scientific notation}) - common L{programming identifiers} - network addresses (L{MAC}, L{IPv4}, L{IPv6}) - ISO8601 L{dates} and L{datetime} - L{UUID} - L{comma-separated list} Parse actions: - C{L{convertToInteger}} - C{L{convertToFloat}} - C{L{convertToDate}} - C{L{convertToDatetime}} - C{L{stripHTMLTags}} - C{L{upcaseTokens}} - C{L{downcaseTokens}} Example:: pyparsing_common.number.runTests(''' # any int or real number, returned as the appropriate type 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.fnumber.runTests(''' # any int or real number, returned as float 100 -100 +100 3.14159 6.02e23 1e-12 ''') pyparsing_common.hex_integer.runTests(''' # hex numbers 100 FF ''') pyparsing_common.fraction.runTests(''' # fractions 1/2 -3/4 ''') pyparsing_common.mixed_integer.runTests(''' # mixed fractions 1 1/2 -3/4 1-3/4 ''') import uuid pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) pyparsing_common.uuid.runTests(''' # uuid 12345678-1234-5678-1234-567812345678 ''') prints:: # any int or real number, returned as the appropriate type 100 [100] -100 [-100] +100 [100] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # any int or real number, returned as float 100 [100.0] -100 [-100.0] +100 [100.0] 3.14159 [3.14159] 6.02e23 [6.02e+23] 1e-12 [1e-12] # hex numbers 100 [256] FF [255] # fractions 1/2 [0.5] -3/4 [-0.75] # mixed fractions 1 [1] 1/2 [0.5] -3/4 [-0.75] 1-3/4 [1.75] # uuid 12345678-1234-5678-1234-567812345678 [UUID('12345678-1234-5678-1234-567812345678')] tintegers hex integeris[+-]?\d+ssigned integerRtfractioncCs|d|dS(Nii((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrRzs"fraction or mixed integer-fractions [+-]?\d+\.\d*s real numbers+[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)s$real number with scientific notations[+-]?\d+\.?\d*([eE][+-]?\d+)?tfnumberRt identifiersK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}s IPv4 addresss[0-9a-fA-F]{1,4}t hex_integerRisfull IPv6 addressiis::sshort IPv6 addresscCstd|DdkS(Ncss'|]}tjj|rdVqdS(iN(Rlt _ipv6_partR(RR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys si(R(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrs::ffff:smixed IPv6 addresss IPv6 addresss:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}s MAC addresss%Y-%m-%dcsfd}|S(s Helper to create a parse action for converting parsed date string to Python datetime.date Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) Example:: date_expr = pyparsing_common.iso8601_date.copy() date_expr.setParseAction(pyparsing_common.convertToDate()) print(date_expr.parseString("1999-12-31")) prints:: [datetime.date(1999, 12, 31)] csPytj|djSWn+tk rK}t||t|nXdS(Ni(RtstrptimetdateRRRu(RRNRptve(tfmt(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcvt_fns((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt convertToDatess%Y-%m-%dT%H:%M:%S.%fcsfd}|S(s Helper to create a parse action for converting parsed datetime string to Python datetime.datetime Params - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) Example:: dt_expr = pyparsing_common.iso8601_datetime.copy() dt_expr.setParseAction(pyparsing_common.convertToDatetime()) print(dt_expr.parseString("1999-12-31T23:59:59.999")) prints:: [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] csJytj|dSWn+tk rE}t||t|nXdS(Ni(RR?RRRu(RRNRpRA(RB(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRCs((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytconvertToDatetimess7(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?s ISO8601 dates(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?sISO8601 datetimes2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}tUUIDcCstjj|dS(s Parse action to remove HTML tags from web page HTML source Example:: # strip HTML links from normal text text = 'More info at the
pyparsing wiki page' td,td_end = makeHTMLTags("TD") table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' i(Rlt_html_stripperR{(RRNR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt stripHTMLTagss RR<s R8RRrscomma separated listcCst|jS(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRrcCst|jS(N(RR(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqRr(ii(ii(>RRRRkRotconvertToIntegertfloattconvertToFloatR-RPRRzR9RBR=R%tsigned_integerR:RRRt mixed_integerRtrealtsci_realRtnumberR;R2R1R<t ipv4_addressR>t_full_ipv6_addresst_short_ipv6_addressRt_mixed_ipv6_addressRt ipv6_addresst mac_addressR#RDREt iso8601_datetiso8601_datetimetuuidR5R4RGRHRRRRTR,t _commasepitemR>RWRtcomma_separated_listRbR@(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRlsL  '/-  ;&J+t__main__tselecttfroms_$RRtcolumnsRttablestcommandsK # '*' as column list and dotted table name select * from SYS.XYZZY # caseless match on "SELECT", and casts back to "select" SELECT * from XYZZY, ABC # list of column names, and mixed case SELECT keyword Select AA,BB,CC from Sys.dual # multiple tables Select A, B, C from Sys.dual, Table2 # invalid SELECT keyword - should fail Xelect A, B, C from Sys.dual # incomplete command - should fail Select # invalid column name - should fail Select ^^^ frox Sys.dual s] 100 -100 +100 3.14159 6.02e23 1e-12 s 100 FF s6 12345678-1234-5678-1234-567812345678 (Rt __version__t__versionTime__t __author__RtweakrefRRRRxRR|RSRR8RRRRt_threadRt ImportErrort threadingRRt ordereddictRt__all__Rt version_infoRQRtmaxsizeR$RuRtchrRRRRR2treversedRRR4RxRIRJR_tmaxinttxrangeRt __builtin__RtfnameRR`RRRRRRtascii_uppercasetascii_lowercaseR2RPRBR1RRt printableRTRaRRRR!R$RR tMutableMappingtregisterR7RHRERGRKRMROReR"R*R RRRRiRRRRjR-R%R#RR,RpRRRR(R'R/R.RRRRR RR RRRR0RRRR&R RR+RRR R)RR`RR>R:RRMRLRERRQR?ReRfRhRRARGRFR_R^Rzt _escapedPunct_escapedHexChart_escapedOctChartUNICODEt _singleChart _charRangeRRR]RKRZRXRkRbR@R RIRJRcR RiRRRRRgRSR<R\RWRaRNRdR3RUR5R4RRR6RR9RYR6RCRR[R=R;RDRVRRZR8RlRt selectTokent fromTokentidentt columnNametcolumnNameListt columnSpect tableNamet tableNameListt simpleSQLR"RPR;R=RYRF(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt=s              *         8      @ & A=IG3pLOD|M &# @sQ,A ,    I # %  !4@    ,   ?  #   k%Z r  (, #8+    $     PK!V!o{o{_vendor/six.pycnu[ fcA@@sKdZddlmZddlZddlZddlZddlZddlZdZdZ ej ddkZ ej ddkZ ej dd!dakZ e refZefZefZeZeZejZnefZeefZeejfZeZeZejjd r$edcZnVd efd YZ ye!e Wne"k rjedeZn XedgZ[ dZ#dZ$defdYZ%de%fdYZ&dej'fdYZ(de%fdYZ)defdYZ*e*e+Z,de(fdYZ-e)dddde)d d!d"d#d e)d$d!d!d%d$e)d&d'd"d(d&e)d)d'd*e)d+d!d"d,d+e)d-d.d.d/d-e)d0d.d.d-d0e)d1d'd"d2d1e)d3d'e rd4nd5d6e)d7d'd8e)d9d:d;d<e)ddde)d=d=d>e)d?d?d>e)d@d@d>e)d2d'd"d2d1e)dAd!d"dBdAe)dCd!d!dDdCe&d"d'e&dEdFe&dGdHe&dIdJdKe&dLdMdLe&dNdOdPe&dQdRdSe&dTdUdVe&dWdXdYe&dZd[d\e&d]d^d_e&d`dadbe&dcdddee&dfdgdhe&dididje&dkdkdje&dldldje&dmdmdne&dodpe&dqdre&dsdte&dudvdue&dwdxe&dydzd{e&d|d}d~e&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddd~e&ddde&ddde&ddde&de+dde&de+dde&de+de+de&ddde&ddde&dddg>Z.ejdkr;e.e&ddg7Z.nxJe.D]BZ/e0e-e/j1e/e2e/e&rBe,j3e/de/j1qBqBW[/e.e-_.e-e+dZ4e,j3e4dde(fdYZ5e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)d<dde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddgZ6x!e6D]Z/e0e5e/j1e/q0W[/e6e5_.e,j3e5e+dddde(fdYZ7e)ddde)ddde)dddgZ8x!e8D]Z/e0e7e/j1e/qW[/e8e7_.e,j3e7e+dddde(fdYZ9e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddg!Z:x!e:D]Z/e0e9e/j1e/q W[/e:e9_.e,j3e9e+dddde(fdYZ;e)ddde)ddde)ddde)dddgZ<x!e<D]Z/e0e;e/j1e/q W[/e<e;_.e,j3e;e+d d d d e(fd YZ=e)dddgZ>x!e>D]Z/e0e=e/j1e/q; W[/e>e=_.e,j3e=e+ddddej'fdYZ?e,j3e?e+dddZ@dZAe r dZBdZCdZDdZEdZFdZGn$dZBdZCdZDd ZEd!ZFd"ZGy eHZIWneJk r= d#ZInXeIZHy eKZKWneJk rj d$ZKnXe r d%ZLejMZNd&ZOeZPn7d'ZLd(ZNd)ZOd*efd+YZPeKZKe#eLd,ejQeBZRejQeCZSejQeDZTejQeEZUejQeFZVejQeGZWe rd-ZXd.ZYd/ZZd0Z[ej\d1Z]ej\d2Z^ej\d3Z_nQd4ZXd5ZYd6ZZd7Z[ej\d8Z]ej\d9Z^ej\d:Z_e#eXd;e#eYd<e#eZd=e#e[d>e rd?Z`d@ZaebZcddldZdedjedAjfZg[dejhdZiejjZkelZmddlnZnenjoZoenjpZpdBZqej d d krdCZrdDZsq4dEZrdFZsnpdGZ`dHZaecZcebZgdIZidJZkejtejuevZmddloZoeojoZoZpdKZqdCZrdDZse#e`dLe#eadMdNZwdOZxdPZye reze4j{dQZ|ddRZ~ndddSZ|e|dTej d dhkre|dUn)ej d dikre|dVn dWZeze4j{dXdZedkrdYZnej d djkrDeZdZZne#e~d[ej dd!dkkrejejd\Zn ejZd]Zd^Zd_ZgZe+Zejd`dk rge_nejr7xOeejD]>\ZZeej+dkrej1e+kreje=PqqW[[nejje,dS(ls6Utilities for writing code that runs on Python 2 and 3i(tabsolute_importNs'Benjamin Peterson s1.10.0iiitjavaiitXcB@seZdZRS(cC@sdS(NiiI((tself((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__len__>s(t__name__t __module__R(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<si?cC@s ||_dS(s Add documentation to a function.N(t__doc__(tfunctdoc((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_add_docKscC@st|tj|S(s7Import module, returning the module after the last dot.(t __import__tsystmodules(tname((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_import_modulePs t _LazyDescrcB@seZdZdZRS(cC@s ||_dS(N(R(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__init__XscC@sN|j}t||j|yt|j|jWntk rInX|S(N(t_resolvetsetattrRtdelattrt __class__tAttributeError(Rtobjttptresult((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__get__[s  (RRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRVs t MovedModulecB@s&eZddZdZdZRS(cC@sJtt|j|tr=|dkr1|}n||_n ||_dS(N(tsuperRRtPY3tNonetmod(RRtoldtnew((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRis    cC@s t|jS(N(RR(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRrscC@s/|j}t||}t||||S(N(RtgetattrR(Rtattrt_moduletvalue((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt __getattr__us N(RRRRRR&(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRgs t _LazyModulecB@s eZdZdZgZRS(cC@s)tt|j||jj|_dS(N(RR'RRR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR~scC@s3ddg}|g|jD]}|j^q7}|S(NRR(t_moved_attributesR(RtattrsR#((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__dir__s #(RRRR*R((((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR'|s  tMovedAttributecB@s eZdddZdZRS(cC@stt|j|trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr|}n||_dS(N(RR+RRRRR#(RRtold_modtnew_modtold_attrtnew_attr((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRs           cC@st|j}t||jS(N(RRR"R#(Rtmodule((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRsN(RRRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR+st_SixMetaPathImportercB@s_eZdZdZdZdZd dZdZdZ dZ dZ e Z RS( s A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 cC@s||_i|_dS(N(Rt known_modules(Rtsix_module_name((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRs cG@s-x&|D]}||j|jd|(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt is_packagescC@s|j|dS(s;Return None Required, if is_package is implementedN(R>R(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_codes N( RRRRR7R8RR:R>RARDREt get_source(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1s       t _MovedItemscB@seZdZgZRS(sLazy loading of moved objects(RRRRB(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRGst cStringIOtiotStringIOtfiltert itertoolstbuiltinstifiltert filterfalset ifilterfalsetinputt __builtin__t raw_inputtinternR tmaptimaptgetcwdtostgetcwdutgetcwdbtrangetxranget reload_modulet importlibtimptreloadtreducet functoolst shlex_quotetpipestshlextquotetUserDictt collectionstUserListt UserStringtziptizipt zip_longestt izip_longestt configparsert ConfigParsertcopyregtcopy_regtdbm_gnutgdbmsdbm.gnut _dummy_threadt dummy_threadthttp_cookiejart cookielibshttp.cookiejart http_cookiestCookies http.cookiest html_entitiesthtmlentitydefss html.entitiest html_parsert HTMLParsers html.parsert http_clientthttplibs http.clienttemail_mime_multipartsemail.MIMEMultipartsemail.mime.multiparttemail_mime_nonmultipartsemail.MIMENonMultipartsemail.mime.nonmultiparttemail_mime_textsemail.MIMETextsemail.mime.texttemail_mime_basesemail.MIMEBasesemail.mime.basetBaseHTTPServers http.servert CGIHTTPServertSimpleHTTPServertcPickletpickletqueuetQueuetreprlibtreprt socketservert SocketServert_threadtthreadttkintertTkinterttkinter_dialogtDialogstkinter.dialogttkinter_filedialogt FileDialogstkinter.filedialogttkinter_scrolledtextt ScrolledTextstkinter.scrolledtextttkinter_simpledialogt SimpleDialogstkinter.simpledialogt tkinter_tixtTixs tkinter.tixt tkinter_ttktttks tkinter.ttkttkinter_constantst Tkconstantsstkinter.constantst tkinter_dndtTkdnds tkinter.dndttkinter_colorchooserttkColorChooserstkinter.colorchooserttkinter_commondialogttkCommonDialogstkinter.commondialogttkinter_tkfiledialogt tkFileDialogt tkinter_fontttkFonts tkinter.fontttkinter_messageboxt tkMessageBoxstkinter.messageboxttkinter_tksimpledialogttkSimpleDialogt urllib_parses.moves.urllib_parses urllib.parset urllib_errors.moves.urllib_errors urllib.errorturllibs .moves.urllibturllib_robotparsert robotparsersurllib.robotparsert xmlrpc_clientt xmlrpclibs xmlrpc.clientt xmlrpc_servertSimpleXMLRPCServers xmlrpc.servertwin32twinregt_winregsmoves.s.movestmovestModule_six_moves_urllib_parsecB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_parse(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR@st ParseResultturlparset SplitResulttparse_qst parse_qslt urldefragturljointurlsplitt urlunparset urlunsplitt quote_plustunquotet unquote_plust urlencodet splitquerytsplittagt splitusert uses_fragmentt uses_netloct uses_paramst uses_queryt uses_relativesmoves.urllib_parsesmoves.urllib.parsetModule_six_moves_urllib_errorcB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_error(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRhstURLErrorturllib2t HTTPErrortContentTooShortErrors.moves.urllib.errorsmoves.urllib_errorsmoves.urllib.errortModule_six_moves_urllib_requestcB@seZdZRS(s9Lazy loading of moved objects in six.moves.urllib_request(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR|sturlopensurllib.requesttinstall_openert build_openert pathname2urlt url2pathnamet getproxiestRequesttOpenerDirectortHTTPDefaultErrorHandlertHTTPRedirectHandlertHTTPCookieProcessort ProxyHandlert BaseHandlertHTTPPasswordMgrtHTTPPasswordMgrWithDefaultRealmtAbstractBasicAuthHandlertHTTPBasicAuthHandlertProxyBasicAuthHandlertAbstractDigestAuthHandlertHTTPDigestAuthHandlertProxyDigestAuthHandlert HTTPHandlert HTTPSHandlert FileHandlert FTPHandlertCacheFTPHandlertUnknownHandlertHTTPErrorProcessort urlretrievet urlcleanupt URLopenertFancyURLopenert proxy_bypasss.moves.urllib.requestsmoves.urllib_requestsmoves.urllib.requestt Module_six_moves_urllib_responsecB@seZdZRS(s:Lazy loading of moved objects in six.moves.urllib_response(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRstaddbasesurllib.responset addclosehooktaddinfot addinfourls.moves.urllib.responsesmoves.urllib_responsesmoves.urllib.responset#Module_six_moves_urllib_robotparsercB@seZdZRS(s=Lazy loading of moved objects in six.moves.urllib_robotparser(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRstRobotFileParsers.moves.urllib.robotparsersmoves.urllib_robotparsersmoves.urllib.robotparsertModule_six_moves_urllibcB@sheZdZgZejdZejdZejdZejdZ ejdZ dZ RS(sICreate a six.moves.urllib namespace that resembles the Python 3 namespacesmoves.urllib_parsesmoves.urllib_errorsmoves.urllib_requestsmoves.urllib_responsesmoves.urllib_robotparsercC@sdddddgS(NtparseterrortrequesttresponseR((R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR*s( RRRRBt _importerR8RRRRRR*(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRss moves.urllibcC@stt|j|dS(sAdd an item to six.moves.N(RRGR(tmove((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadd_movescC@s^ytt|WnFtk rYytj|=WqZtk rUtd|fqZXnXdS(sRemove item from six.moves.sno such move, %rN(RRGRRt__dict__R;(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt remove_moves  t__func__t__self__t __closure__t__code__t __defaults__t __globals__tim_functim_selft func_closuret func_codet func_defaultst func_globalscC@s |jS(N(tnext(tit((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadvance_iterator scC@stdt|jDS(Ncs@s|]}d|jkVqdS(t__call__N(R (t.0tklass((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pys s(tanyttypet__mro__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcallablescC@s|S(N((tunbound((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_unbound_functionscC@s|S(N((Rtcls((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_unbound_methodscC@s|jS(N(R(R"((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR#"scC@stj|||jS(N(ttypest MethodTypeR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_bound_method%scC@stj|d|S(N(R&R'R(RR$((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR%(stIteratorcB@seZdZRS(cC@st|j|S(N(Rt__next__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR-s(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR)+ss3Get the function out of a possibly unbound functioncK@st|j|S(N(titertkeys(tdtkw((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytiterkeys>scK@st|j|S(N(R+tvalues(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt itervaluesAscK@st|j|S(N(R+titems(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt iteritemsDscK@st|j|S(N(R+tlists(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt iterlistsGsR,R0R2cK@s |j|S(N(R/(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR/PscK@s |j|S(N(R1(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1SscK@s |j|S(N(R3(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR3VscK@s |j|S(N(R5(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR5Ystviewkeyst viewvaluest viewitemss1Return an iterator over the keys of a dictionary.s3Return an iterator over the values of a dictionary.s?Return an iterator over the (key, value) pairs of a dictionary.sBReturn an iterator over the (key, [values]) pairs of a dictionary.cC@s |jdS(Nslatin-1(tencode(ts((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbkscC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytunss>BtassertCountEqualtassertRaisesRegexptassertRegexpMatchestassertRaisesRegext assertRegexcC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR;scC@st|jdddS(Ns\\s\\\\tunicode_escape(tunicodetreplace(R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<scC@st|dS(Ni(tord(tbs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbyte2intscC@st||S(N(RE(tbufti((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt indexbytesstassertItemsEquals Byte literals Text literalcO@st|t||S(N(R"t_assertCountEqual(Rtargstkwargs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR=scO@st|t||S(N(R"t_assertRaisesRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR@scO@st|t||S(N(R"t _assertRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRAstexeccC@sC|dkr|}n|j|k r9|j|n|dS(N(Rt __traceback__twith_traceback(RR%ttb((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytreraises   cB@sc|dkrBejd}|j}|dkr<|j}n~n|dkrW|}nddUdS(sExecute code in a namespace.isexec _code_ in _globs_, _locs_N(RR t _getframet f_globalstf_locals(t_code_t_globs_t_locs_tframe((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytexec_s      s9def reraise(tp, value, tb=None): raise tp, value, tb srdef raise_from(value, from_value): if from_value is None: raise value raise value from from_value sCdef raise_from(value, from_value): raise value from from_value cC@s |dS(N((R%t from_value((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt raise_fromstprintc @s|jdtjdkr%dSfd}t}|jdd}|dk rt|trpt}qt|tst dqn|jdd}|dk rt|trt}qt|tst dqn|rt dn|s0x*|D]}t|tr t}Pq q Wn|rQtd }td }n d }d }|dkrr|}n|dkr|}nx7t |D])\} }| r||n||qW||dS( s4The new-style print function for Python 2.4 and 2.5.tfileNc@st|tst|}nttrt|trjdk rtdd}|dkrrd}n|jj|}nj |dS(Nterrorststrict( R?t basestringtstrRaRCtencodingRR"R9twrite(tdataRb(tfp(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRgs  tsepssep must be None or a stringtendsend must be None or a strings$invalid keyword arguments to print()s t ( tpopR tstdoutRtFalseR?RCtTrueRet TypeErrort enumerate( RMRNRgt want_unicodeRjRktargtnewlinetspaceRI((Ris:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytprint_sL              cO@sW|jdtj}|jdt}t|||rS|dk rS|jndS(NRatflush(tgetR RnRmRot_printRRx(RMRNRiRx((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRw s  sReraise an exception.c@sfd}|S(Nc@s(tj|}|_|S(N(Rbtwrapst __wrapped__(tf(tassignedtupdatedtwrapped(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwrappers ((RR~RR((R~RRs:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR{sc@s5dffdY}tj|ddiS(s%Create a base class with a metaclass.t metaclassc@seZfdZRS(c@s||S(N((R$Rt this_basesR-(tbasestmeta(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__new__'s(RRR((RR(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR%sttemporary_class((RR(RRR((RRs:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwith_metaclass sc@sfd}|S(s6Class decorator for creating a class with a metaclass.c@s|jj}|jd}|dk rft|trE|g}nx|D]}|j|qLWn|jdd|jdd|j|j|S(Nt __slots__R t __weakref__( R tcopyRyRR?ReRmRt __bases__(R$t orig_varstslotst slots_var(R(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR.s   ((RR((Rs:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt add_metaclass,s cC@sJtrFd|jkr+td|jn|j|_d|_n|S(s A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. t__str__sY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cS@s|jjdS(Nsutf-8(t __unicode__R9(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytJt(tPY2R t ValueErrorRRR(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytpython_2_unicode_compatible<s t__spec__(iiIiIill(ii(ii(ii(ii(Rt __future__RRbRLtoperatorR R&t __author__t __version__t version_infoRRtPY34Ret string_typestintt integer_typesRt class_typest text_typetbytest binary_typetmaxsizetMAXSIZERdtlongt ClassTypeRCtplatformt startswithtobjectRtlent OverflowErrorR RRRt ModuleTypeR'R+R1RRRGR(R#RRR?R7RRt_urllib_parse_moved_attributesRt_urllib_error_moved_attributesRt _urllib_request_moved_attributesRt!_urllib_response_moved_attributesRt$_urllib_robotparser_moved_attributesRR R t _meth_funct _meth_selft _func_closuret _func_codet_func_defaultst _func_globalsRRt NameErrorR!R#R'R(R%R)t attrgettertget_method_functiontget_method_selftget_function_closuretget_function_codetget_function_defaultstget_function_globalsR/R1R3R5t methodcallerR6R7R8R;R<tchrtunichrtstructtStructtpacktint2bytet itemgetterRGtgetitemRJR+t iterbytesRIRJtBytesIORLRORPtpartialRVRER=R@RAR"RMR]RRUR_RwRztWRAPPER_ASSIGNMENTStWRAPPER_UPDATESR{RRRRBt __package__tglobalsRyRtsubmodule_search_locationst meta_pathRrRItimportertappend(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyts               >                                                                                 5         PK!V!o{o{_vendor/six.pyonu[ fcA@@sKdZddlmZddlZddlZddlZddlZddlZdZdZ ej ddkZ ej ddkZ ej dd!dakZ e refZefZefZeZeZejZnefZeefZeejfZeZeZejjd r$edcZnVd efd YZ ye!e Wne"k rjedeZn XedgZ[ dZ#dZ$defdYZ%de%fdYZ&dej'fdYZ(de%fdYZ)defdYZ*e*e+Z,de(fdYZ-e)dddde)d d!d"d#d e)d$d!d!d%d$e)d&d'd"d(d&e)d)d'd*e)d+d!d"d,d+e)d-d.d.d/d-e)d0d.d.d-d0e)d1d'd"d2d1e)d3d'e rd4nd5d6e)d7d'd8e)d9d:d;d<e)ddde)d=d=d>e)d?d?d>e)d@d@d>e)d2d'd"d2d1e)dAd!d"dBdAe)dCd!d!dDdCe&d"d'e&dEdFe&dGdHe&dIdJdKe&dLdMdLe&dNdOdPe&dQdRdSe&dTdUdVe&dWdXdYe&dZd[d\e&d]d^d_e&d`dadbe&dcdddee&dfdgdhe&dididje&dkdkdje&dldldje&dmdmdne&dodpe&dqdre&dsdte&dudvdue&dwdxe&dydzd{e&d|d}d~e&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddde&ddd~e&ddde&ddde&ddde&de+dde&de+dde&de+de+de&ddde&ddde&dddg>Z.ejdkr;e.e&ddg7Z.nxJe.D]BZ/e0e-e/j1e/e2e/e&rBe,j3e/de/j1qBqBW[/e.e-_.e-e+dZ4e,j3e4dde(fdYZ5e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)d<dde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddgZ6x!e6D]Z/e0e5e/j1e/q0W[/e6e5_.e,j3e5e+dddde(fdYZ7e)ddde)ddde)dddgZ8x!e8D]Z/e0e7e/j1e/qW[/e8e7_.e,j3e7e+dddde(fdYZ9e)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)ddde)dddg!Z:x!e:D]Z/e0e9e/j1e/q W[/e:e9_.e,j3e9e+dddde(fdYZ;e)ddde)ddde)ddde)dddgZ<x!e<D]Z/e0e;e/j1e/q W[/e<e;_.e,j3e;e+d d d d e(fd YZ=e)dddgZ>x!e>D]Z/e0e=e/j1e/q; W[/e>e=_.e,j3e=e+ddddej'fdYZ?e,j3e?e+dddZ@dZAe r dZBdZCdZDdZEdZFdZGn$dZBdZCdZDd ZEd!ZFd"ZGy eHZIWneJk r= d#ZInXeIZHy eKZKWneJk rj d$ZKnXe r d%ZLejMZNd&ZOeZPn7d'ZLd(ZNd)ZOd*efd+YZPeKZKe#eLd,ejQeBZRejQeCZSejQeDZTejQeEZUejQeFZVejQeGZWe rd-ZXd.ZYd/ZZd0Z[ej\d1Z]ej\d2Z^ej\d3Z_nQd4ZXd5ZYd6ZZd7Z[ej\d8Z]ej\d9Z^ej\d:Z_e#eXd;e#eYd<e#eZd=e#e[d>e rd?Z`d@ZaebZcddldZdedjedAjfZg[dejhdZiejjZkelZmddlnZnenjoZoenjpZpdBZqej d d krdCZrdDZsq4dEZrdFZsnpdGZ`dHZaecZcebZgdIZidJZkejtejuevZmddloZoeojoZoZpdKZqdCZrdDZse#e`dLe#eadMdNZwdOZxdPZye reze4j{dQZ|ddRZ~ndddSZ|e|dTej d dhkre|dUn)ej d dikre|dVn dWZeze4j{dXdZedkrdYZnej d djkrDeZdZZne#e~d[ej dd!dkkrejejd\Zn ejZd]Zd^Zd_ZgZe+Zejd`dk rge_nejr7xOeejD]>\ZZeej+dkrej1e+kreje=PqqW[[nejje,dS(ls6Utilities for writing code that runs on Python 2 and 3i(tabsolute_importNs'Benjamin Peterson s1.10.0iiitjavaiitXcB@seZdZRS(cC@sdS(NiiI((tself((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__len__>s(t__name__t __module__R(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<si?cC@s ||_dS(s Add documentation to a function.N(t__doc__(tfunctdoc((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_add_docKscC@st|tj|S(s7Import module, returning the module after the last dot.(t __import__tsystmodules(tname((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_import_modulePs t _LazyDescrcB@seZdZdZRS(cC@s ||_dS(N(R(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__init__XscC@sN|j}t||j|yt|j|jWntk rInX|S(N(t_resolvetsetattrRtdelattrt __class__tAttributeError(Rtobjttptresult((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__get__[s  (RRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRVs t MovedModulecB@s&eZddZdZdZRS(cC@sJtt|j|tr=|dkr1|}n||_n ||_dS(N(tsuperRRtPY3tNonetmod(RRtoldtnew((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRis    cC@s t|jS(N(RR(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRrscC@s/|j}t||}t||||S(N(RtgetattrR(Rtattrt_moduletvalue((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt __getattr__us N(RRRRRR&(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRgs t _LazyModulecB@s eZdZdZgZRS(cC@s)tt|j||jj|_dS(N(RR'RRR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR~scC@s3ddg}|g|jD]}|j^q7}|S(NRR(t_moved_attributesR(RtattrsR#((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__dir__s #(RRRR*R((((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR'|s  tMovedAttributecB@s eZdddZdZRS(cC@stt|j|trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr|}n||_dS(N(RR+RRRRR#(RRtold_modtnew_modtold_attrtnew_attr((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRs           cC@st|j}t||jS(N(RRR"R#(Rtmodule((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRsN(RRRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR+st_SixMetaPathImportercB@s_eZdZdZdZdZd dZdZdZ dZ dZ e Z RS( s A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 cC@s||_i|_dS(N(Rt known_modules(Rtsix_module_name((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRs cG@s-x&|D]}||j|jd|(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt is_packagescC@s|j|dS(s;Return None Required, if is_package is implementedN(R>R(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_codes N( RRRRR7R8RR:R>RARDREt get_source(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1s       t _MovedItemscB@seZdZgZRS(sLazy loading of moved objects(RRRRB(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRGst cStringIOtiotStringIOtfiltert itertoolstbuiltinstifiltert filterfalset ifilterfalsetinputt __builtin__t raw_inputtinternR tmaptimaptgetcwdtostgetcwdutgetcwdbtrangetxranget reload_modulet importlibtimptreloadtreducet functoolst shlex_quotetpipestshlextquotetUserDictt collectionstUserListt UserStringtziptizipt zip_longestt izip_longestt configparsert ConfigParsertcopyregtcopy_regtdbm_gnutgdbmsdbm.gnut _dummy_threadt dummy_threadthttp_cookiejart cookielibshttp.cookiejart http_cookiestCookies http.cookiest html_entitiesthtmlentitydefss html.entitiest html_parsert HTMLParsers html.parsert http_clientthttplibs http.clienttemail_mime_multipartsemail.MIMEMultipartsemail.mime.multiparttemail_mime_nonmultipartsemail.MIMENonMultipartsemail.mime.nonmultiparttemail_mime_textsemail.MIMETextsemail.mime.texttemail_mime_basesemail.MIMEBasesemail.mime.basetBaseHTTPServers http.servert CGIHTTPServertSimpleHTTPServertcPickletpickletqueuetQueuetreprlibtreprt socketservert SocketServert_threadtthreadttkintertTkinterttkinter_dialogtDialogstkinter.dialogttkinter_filedialogt FileDialogstkinter.filedialogttkinter_scrolledtextt ScrolledTextstkinter.scrolledtextttkinter_simpledialogt SimpleDialogstkinter.simpledialogt tkinter_tixtTixs tkinter.tixt tkinter_ttktttks tkinter.ttkttkinter_constantst Tkconstantsstkinter.constantst tkinter_dndtTkdnds tkinter.dndttkinter_colorchooserttkColorChooserstkinter.colorchooserttkinter_commondialogttkCommonDialogstkinter.commondialogttkinter_tkfiledialogt tkFileDialogt tkinter_fontttkFonts tkinter.fontttkinter_messageboxt tkMessageBoxstkinter.messageboxttkinter_tksimpledialogttkSimpleDialogt urllib_parses.moves.urllib_parses urllib.parset urllib_errors.moves.urllib_errors urllib.errorturllibs .moves.urllibturllib_robotparsert robotparsersurllib.robotparsert xmlrpc_clientt xmlrpclibs xmlrpc.clientt xmlrpc_servertSimpleXMLRPCServers xmlrpc.servertwin32twinregt_winregsmoves.s.movestmovestModule_six_moves_urllib_parsecB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_parse(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR@st ParseResultturlparset SplitResulttparse_qst parse_qslt urldefragturljointurlsplitt urlunparset urlunsplitt quote_plustunquotet unquote_plust urlencodet splitquerytsplittagt splitusert uses_fragmentt uses_netloct uses_paramst uses_queryt uses_relativesmoves.urllib_parsesmoves.urllib.parsetModule_six_moves_urllib_errorcB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_error(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRhstURLErrorturllib2t HTTPErrortContentTooShortErrors.moves.urllib.errorsmoves.urllib_errorsmoves.urllib.errortModule_six_moves_urllib_requestcB@seZdZRS(s9Lazy loading of moved objects in six.moves.urllib_request(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR|sturlopensurllib.requesttinstall_openert build_openert pathname2urlt url2pathnamet getproxiestRequesttOpenerDirectortHTTPDefaultErrorHandlertHTTPRedirectHandlertHTTPCookieProcessort ProxyHandlert BaseHandlertHTTPPasswordMgrtHTTPPasswordMgrWithDefaultRealmtAbstractBasicAuthHandlertHTTPBasicAuthHandlertProxyBasicAuthHandlertAbstractDigestAuthHandlertHTTPDigestAuthHandlertProxyDigestAuthHandlert HTTPHandlert HTTPSHandlert FileHandlert FTPHandlertCacheFTPHandlertUnknownHandlertHTTPErrorProcessort urlretrievet urlcleanupt URLopenertFancyURLopenert proxy_bypasss.moves.urllib.requestsmoves.urllib_requestsmoves.urllib.requestt Module_six_moves_urllib_responsecB@seZdZRS(s:Lazy loading of moved objects in six.moves.urllib_response(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRstaddbasesurllib.responset addclosehooktaddinfot addinfourls.moves.urllib.responsesmoves.urllib_responsesmoves.urllib.responset#Module_six_moves_urllib_robotparsercB@seZdZRS(s=Lazy loading of moved objects in six.moves.urllib_robotparser(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRstRobotFileParsers.moves.urllib.robotparsersmoves.urllib_robotparsersmoves.urllib.robotparsertModule_six_moves_urllibcB@sheZdZgZejdZejdZejdZejdZ ejdZ dZ RS(sICreate a six.moves.urllib namespace that resembles the Python 3 namespacesmoves.urllib_parsesmoves.urllib_errorsmoves.urllib_requestsmoves.urllib_responsesmoves.urllib_robotparsercC@sdddddgS(NtparseterrortrequesttresponseR((R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR*s( RRRRBt _importerR8RRRRRR*(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRss moves.urllibcC@stt|j|dS(sAdd an item to six.moves.N(RRGR(tmove((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadd_movescC@s^ytt|WnFtk rYytj|=WqZtk rUtd|fqZXnXdS(sRemove item from six.moves.sno such move, %rN(RRGRRt__dict__R;(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt remove_moves  t__func__t__self__t __closure__t__code__t __defaults__t __globals__tim_functim_selft func_closuret func_codet func_defaultst func_globalscC@s |jS(N(tnext(tit((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadvance_iterator scC@stdt|jDS(Ncs@s|]}d|jkVqdS(t__call__N(R (t.0tklass((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pys s(tanyttypet__mro__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcallablescC@s|S(N((tunbound((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_unbound_functionscC@s|S(N((Rtcls((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_unbound_methodscC@s|jS(N(R(R"((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR#"scC@stj|||jS(N(ttypest MethodTypeR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_bound_method%scC@stj|d|S(N(R&R'R(RR$((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR%(stIteratorcB@seZdZRS(cC@st|j|S(N(Rt__next__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR-s(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR)+ss3Get the function out of a possibly unbound functioncK@st|j|S(N(titertkeys(tdtkw((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytiterkeys>scK@st|j|S(N(R+tvalues(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt itervaluesAscK@st|j|S(N(R+titems(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt iteritemsDscK@st|j|S(N(R+tlists(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt iterlistsGsR,R0R2cK@s |j|S(N(R/(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR/PscK@s |j|S(N(R1(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1SscK@s |j|S(N(R3(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR3VscK@s |j|S(N(R5(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR5Ystviewkeyst viewvaluest viewitemss1Return an iterator over the keys of a dictionary.s3Return an iterator over the values of a dictionary.s?Return an iterator over the (key, value) pairs of a dictionary.sBReturn an iterator over the (key, [values]) pairs of a dictionary.cC@s |jdS(Nslatin-1(tencode(ts((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbkscC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytunss>BtassertCountEqualtassertRaisesRegexptassertRegexpMatchestassertRaisesRegext assertRegexcC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR;scC@st|jdddS(Ns\\s\\\\tunicode_escape(tunicodetreplace(R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<scC@st|dS(Ni(tord(tbs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbyte2intscC@st||S(N(RE(tbufti((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt indexbytesstassertItemsEquals Byte literals Text literalcO@st|t||S(N(R"t_assertCountEqual(Rtargstkwargs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR=scO@st|t||S(N(R"t_assertRaisesRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR@scO@st|t||S(N(R"t _assertRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRAstexeccC@sC|dkr|}n|j|k r9|j|n|dS(N(Rt __traceback__twith_traceback(RR%ttb((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytreraises   cB@sc|dkrBejd}|j}|dkr<|j}n~n|dkrW|}nddUdS(sExecute code in a namespace.isexec _code_ in _globs_, _locs_N(RR t _getframet f_globalstf_locals(t_code_t_globs_t_locs_tframe((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytexec_s      s9def reraise(tp, value, tb=None): raise tp, value, tb srdef raise_from(value, from_value): if from_value is None: raise value raise value from from_value sCdef raise_from(value, from_value): raise value from from_value cC@s |dS(N((R%t from_value((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt raise_fromstprintc @s|jdtjdkr%dSfd}t}|jdd}|dk rt|trpt}qt|tst dqn|jdd}|dk rt|trt}qt|tst dqn|rt dn|s0x*|D]}t|tr t}Pq q Wn|rQtd }td }n d }d }|dkrr|}n|dkr|}nx7t |D])\} }| r||n||qW||dS( s4The new-style print function for Python 2.4 and 2.5.tfileNc@st|tst|}nttrt|trjdk rtdd}|dkrrd}n|jj|}nj |dS(Nterrorststrict( R?t basestringtstrRaRCtencodingRR"R9twrite(tdataRb(tfp(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRgs  tsepssep must be None or a stringtendsend must be None or a strings$invalid keyword arguments to print()s t ( tpopR tstdoutRtFalseR?RCtTrueRet TypeErrort enumerate( RMRNRgt want_unicodeRjRktargtnewlinetspaceRI((Ris:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytprint_sL              cO@sW|jdtj}|jdt}t|||rS|dk rS|jndS(NRatflush(tgetR RnRmRot_printRRx(RMRNRiRx((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRw s  sReraise an exception.c@sfd}|S(Nc@s(tj|}|_|S(N(Rbtwrapst __wrapped__(tf(tassignedtupdatedtwrapped(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwrappers ((RR~RR((R~RRs:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR{sc@s5dffdY}tj|ddiS(s%Create a base class with a metaclass.t metaclassc@seZfdZRS(c@s||S(N((R$Rt this_basesR-(tbasestmeta(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__new__'s(RRR((RR(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR%sttemporary_class((RR(RRR((RRs:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwith_metaclass sc@sfd}|S(s6Class decorator for creating a class with a metaclass.c@s|jj}|jd}|dk rft|trE|g}nx|D]}|j|qLWn|jdd|jdd|j|j|S(Nt __slots__R t __weakref__( R tcopyRyRR?ReRmRt __bases__(R$t orig_varstslotst slots_var(R(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR.s   ((RR((Rs:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt add_metaclass,s cC@sJtrFd|jkr+td|jn|j|_d|_n|S(s A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. t__str__sY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cS@s|jjdS(Nsutf-8(t __unicode__R9(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytJt(tPY2R t ValueErrorRRR(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytpython_2_unicode_compatible<s t__spec__(iiIiIill(ii(ii(ii(ii(Rt __future__RRbRLtoperatorR R&t __author__t __version__t version_infoRRtPY34Ret string_typestintt integer_typesRt class_typest text_typetbytest binary_typetmaxsizetMAXSIZERdtlongt ClassTypeRCtplatformt startswithtobjectRtlent OverflowErrorR RRRt ModuleTypeR'R+R1RRRGR(R#RRR?R7RRt_urllib_parse_moved_attributesRt_urllib_error_moved_attributesRt _urllib_request_moved_attributesRt!_urllib_response_moved_attributesRt$_urllib_robotparser_moved_attributesRR R t _meth_funct _meth_selft _func_closuret _func_codet_func_defaultst _func_globalsRRt NameErrorR!R#R'R(R%R)t attrgettertget_method_functiontget_method_selftget_function_closuretget_function_codetget_function_defaultstget_function_globalsR/R1R3R5t methodcallerR6R7R8R;R<tchrtunichrtstructtStructtpacktint2bytet itemgetterRGtgetitemRJR+t iterbytesRIRJtBytesIORLRORPtpartialRVRER=R@RAR"RMR]RRUR_RwRztWRAPPER_ASSIGNMENTStWRAPPER_UPDATESR{RRRRBt __package__tglobalsRyRtsubmodule_search_locationst meta_pathRrRItimportertappend(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyts               >                                                                                 5         PK!Oxarchive_util.pycnu[ fc@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddddd d d gZ d efd YZ d Z e ddZe dZe dZe dZeeefZdS(s/Utilities for extracting common archive formatsiN(tDistutilsError(tensure_directorytunpack_archivetunpack_zipfiletunpack_tarfiletdefault_filtertUnrecognizedFormattextraction_driverstunpack_directorycBseZdZRS(s#Couldn't recognize the archive type(t__name__t __module__t__doc__(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCs|S(s@The default progress/filter callback; returns True for all files((tsrctdst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCsZxS|p tD]5}y||||Wntk r=q q XdSq Wtd|dS(sUnpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` `progress_filter` is a function taking two arguments: a source path internal to the archive ('/'-separated), and a filesystem path where it will be extracted. The callback must return the desired extract path (which may be the same as the one passed in), or else ``None`` to skip that file or directory. The callback can thus be used to report on the progress of the extraction, as well as to filter the items extracted or alter their extraction paths. `drivers`, if supplied, must be a non-empty sequence of functions with the same signature as this function (minus the `drivers` argument), that raise ``UnrecognizedFormat`` if they do not support extracting the designated archive type. The `drivers` are tried in sequence until one is found that does not raise an error, or until all are exhausted (in which case ``UnrecognizedFormat`` is raised). If you do not supply a sequence of drivers, the module's ``extraction_drivers`` constant will be used, which means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that order. Ns!Not a recognized archive type: %s(RR(tfilenamet extract_dirtprogress_filtertdriverstdriver((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs c Cs:tjj|s%td|nid|f|6}xtj|D]\}}}||\}}xD|D]<} || dtjj|| f|tjj|| RRs..iN(ttarfileR-tTarErrorRt contextlibtclosingtchownR3R)R*RRRR6tislnktissymtlinknamet posixpathtdirnametnormpatht _getmembertisfileRR+tsept_extract_membert ExtractErrortTrue( RRRttarobjtmemberR3t prelim_dsttlinkpathRt final_dst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs8   %'  $ (R R%R9RRRAR;tdistutils.errorsRt pkg_resourcesRt__all__RRR6RRRRR(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyts$         "  % .PK!gLsbuild_meta.pycnu[ fc@sdZddlZddlZddlZddlZddlZddlZddlZdefdYZ dej j fdYZ ddZ d Z d Zd Zdd Zdd ZddZdddZddZdS(s-A PEP 517 interface to setuptools Previously, when a user or a command line tool (let's call it a "frontend") needed to make a request of setuptools to take a certain action, for example, generating a list of installation requirements, the frontend would would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. PEP 517 defines a different method of interfacing with setuptools. Rather than calling "setup.py" directly, the frontend should: 1. Set the current directory to the directory with a setup.py file 2. Import this module into a safe python interpreter (one in which setuptools can potentially set global variables or crash hard). 3. Call one of the functions defined in PEP 517. What each function does is defined in PEP 517. However, here is a "casual" definition of the functions (this definition should not be relied on for bug reports or API stability): - `build_wheel`: build a wheel in the folder and return the basename - `get_requires_for_build_wheel`: get the `setup_requires` to build - `prepare_metadata_for_build_wheel`: get the `install_requires` - `build_sdist`: build an sdist in the folder and return the basename - `get_requires_for_build_sdist`: get the `setup_requires` to build Again, this is not a formal definition! Just a "taste" of the module. iNtSetupRequirementsErrorcBseZdZRS(cCs ||_dS(N(t specifiers(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt__init__(s(t__name__t __module__R(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR'st DistributioncBs)eZdZeejdZRS(cCst|dS(N(R(RR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytfetch_build_eggs-sccs5tjj}|tj_z dVWd|tj_XdS(sw Replace distutils.dist.Distribution with this class for the duration of this context. N(t distutilstcoreR(tclstorig((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytpatch0s    (RRRt classmethodt contextlibtcontextmanagerR (((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR,s ssetup.pycBsa|}d}eede|}|jjdd}|je||deUdS(Nt__main__topens\r\ns\ntexec(tgetattrttokenizeRtreadtreplacetclosetcompiletlocals(t setup_scriptt__file__Rtftcode((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt _run_setup@s  cCs |p i}|jdg|S(Ns--global-option(t setdefault(tconfig_settings((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt _fix_configKs cCs|t|}ddg}tjd dg|dt_ytj tWdQXWn tk rw}||j7}nX|S(Nt setuptoolstwheelitegg_infos--global-option(R!tsystargvRR RRR(R t requirementste((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_build_requiresQs   cCsAgtj|D]-}tjjtjj||r|^qS(N(tostlistdirtpathtisdirtjoin(ta_dirtname((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_immediate_subdirectories`scCst|}t|S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_wheeles cCst|}t|S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_sdistjs cCs tjd dd|gt_t|}xtrgtj|D]}|jdrC|^qC}t|dkrtt|dkrtj j |tj|d}q-nt|dkst Pq-W||krt j tj j ||d|t j|dtn|dS(Nit dist_infos --egg-bases .dist-infoit ignore_errors(R%R&RtTrueR*R+tendswithtlenR1R,R.tAssertionErrortshutiltmovetrmtree(tmetadata_directoryR tdist_info_directoryRt dist_infos((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt prepare_metadata_for_build_wheelos&   cCst|}tjj|}tjd dg|dt_t|dkrptj|tj d|ngtj |D]}|j dr|^q}t |dkst |dS(Nit bdist_wheels--global-optiontdists.whli(R!R*R,tabspathR%R&RR:R<tcopytreeR+R7R8R9(twheel_directoryR R=Rtwheels((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt build_wheels   cCst|}tjj|}tjd dg|dt_t|dkrptj|tj d|ngtj |D]}|j dr|^q}t |dkst |dS(Nitsdists--global-optionRBs.tar.gzi(R!R*R,RCR%R&RR:R<RDR+R7R8R9(tsdist_directoryR Rtsdists((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt build_sdists   (t__doc__R*R%RR:RR"Rt BaseExceptionRRBRRR!R)R1tNoneR2R3R@RGRK(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyts&              PK!zzbuild_meta.pyonu[ fc@sdZddlZddlZddlZddlZddlZddlZddlZdefdYZ dej j fdYZ ddZ d Z d Zd Zdd Zdd ZddZdddZddZdS(s-A PEP 517 interface to setuptools Previously, when a user or a command line tool (let's call it a "frontend") needed to make a request of setuptools to take a certain action, for example, generating a list of installation requirements, the frontend would would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. PEP 517 defines a different method of interfacing with setuptools. Rather than calling "setup.py" directly, the frontend should: 1. Set the current directory to the directory with a setup.py file 2. Import this module into a safe python interpreter (one in which setuptools can potentially set global variables or crash hard). 3. Call one of the functions defined in PEP 517. What each function does is defined in PEP 517. However, here is a "casual" definition of the functions (this definition should not be relied on for bug reports or API stability): - `build_wheel`: build a wheel in the folder and return the basename - `get_requires_for_build_wheel`: get the `setup_requires` to build - `prepare_metadata_for_build_wheel`: get the `install_requires` - `build_sdist`: build an sdist in the folder and return the basename - `get_requires_for_build_sdist`: get the `setup_requires` to build Again, this is not a formal definition! Just a "taste" of the module. iNtSetupRequirementsErrorcBseZdZRS(cCs ||_dS(N(t specifiers(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt__init__(s(t__name__t __module__R(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR'st DistributioncBs)eZdZeejdZRS(cCst|dS(N(R(RR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytfetch_build_eggs-sccs5tjj}|tj_z dVWd|tj_XdS(sw Replace distutils.dist.Distribution with this class for the duration of this context. N(t distutilstcoreR(tclstorig((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytpatch0s    (RRRt classmethodt contextlibtcontextmanagerR (((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR,s ssetup.pycBsa|}d}eede|}|jjdd}|je||deUdS(Nt__main__topens\r\ns\ntexec(tgetattrttokenizeRtreadtreplacetclosetcompiletlocals(t setup_scriptt__file__Rtftcode((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt _run_setup@s  cCs |p i}|jdg|S(Ns--global-option(t setdefault(tconfig_settings((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt _fix_configKs cCs|t|}ddg}tjd dg|dt_ytj tWdQXWn tk rw}||j7}nX|S(Nt setuptoolstwheelitegg_infos--global-option(R!tsystargvRR RRR(R t requirementste((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_build_requiresQs   cCsAgtj|D]-}tjjtjj||r|^qS(N(tostlistdirtpathtisdirtjoin(ta_dirtname((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_immediate_subdirectories`scCst|}t|S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_wheeles cCst|}t|S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_sdistjs cCstjd dd|gt_t|}xtrgtj|D]}|jdrC|^qC}t|dkrtt|dkrtj j |tj|d}q-nPq-W||krt j tj j ||d|t j |dtn|dS(Nit dist_infos --egg-bases .dist-infoit ignore_errors(R%R&RtTrueR*R+tendswithtlenR1R,R.tshutiltmovetrmtree(tmetadata_directoryR tdist_info_directoryRt dist_infos((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt prepare_metadata_for_build_wheelos$   cCst|}tjj|}tjd dg|dt_t|dkrptj|tj d|ngtj |D]}|j dr|^q}|dS(Nit bdist_wheels--global-optiontdists.whli( R!R*R,tabspathR%R&RR9R;tcopytreeR+R7(twheel_directoryR R<Rtwheels((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt build_wheels   cCst|}tjj|}tjd dg|dt_t|dkrptj|tj d|ngtj |D]}|j dr|^q}|dS(Nitsdists--global-optionRAs.tar.gzi( R!R*R,RBR%R&RR9R;RCR+R7(tsdist_directoryR Rtsdists((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt build_sdists   (t__doc__R*R%RR9RR"Rt BaseExceptionRRARRR!R)R1tNoneR2R3R?RFRJ(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyts&              PK!Zٻ311command/build_ext.pycnu[ fc @s%ddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZed Wnek reZnXe d dd l mZd ZeZeZdZ ej!dkr;e"ZnIej#dkry#ddl$Z$e%e$dZZWqek rqXndZ&dZ'defdYZesej#dkrddddddddddd Z)n-dZ ddddddddddd Z)dZ*dS(iN(t build_ext(t copy_file(t new_compiler(tcustomize_compilertget_config_var(tDistutilsError(tlog(tLibrary(tsixsCython.Compiler.MaintLDSHARED(t _config_varscCsstjdkretj}z,dtd>RcCsNxGdtjDD]/\}}}d|kr6|S|dkr|SqWdS(s;Return the file extension for an abi3-compliant Extension()css(|]}|dtjkr|VqdS(iN(timpt C_EXTENSION(t.0R((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys Css.abi3s.pydN(Rt get_suffixes(tsuffixt_((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pytget_abi3_suffixAs &  RcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z ed ZRS( cCs@|jd}|_tj|||_|r<|jndS(s;Build extensions in build directory, then copy if --inplaceiN(tinplacet _build_exttruntcopy_extensions_to_source(tselft old_inplace((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR'Ks   c Cs|jd}x|jD]}|j|j}|j|}|jd}dj|d }|j|}tj j|tj j |}tj j|j |} t | |d|j d|j|jr|j|ptj|tqqWdS(Ntbuild_pyt.itverbosetdry_run(tget_finalized_commandt extensionstget_ext_fullnametnametget_ext_filenametsplittjointget_package_dirtostpathtbasenamet build_libRR-R.t _needs_stubt write_stubtcurdirtTrue( R)R+texttfullnametfilenametmodpathtpackaget package_dirt dest_filenamet src_filename((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR(Ss   cCstj||}||jkr|j|}tjoLt|doLt}|rtd}|t| }|t}nt |t rt j j |\}}|jj|tStr|jrt j j|\}}t j j|d|Sn|S(Ntpy_limited_apit EXT_SUFFIXsdl-(R&R3text_mapRtPY3tgetattrR$t_get_config_var_837tlent isinstanceRR7R8tsplitexttshlib_compilertlibrary_filenametlibtypet use_stubst_links_to_dynamicR4R5(R)R@RAR?tuse_abi3tso_exttfntd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR3is"    cCs,tj|d|_g|_i|_dS(N(R&tinitialize_optionstNoneRPtshlibsRI(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRY~s   cCstj||jpg|_|j|jg|jD]}t|tr9|^q9|_|jrs|jnx&|jD]}|j|j |_ q}Wx#|jD]}|j }||j |<||j |j dd<|jr|j |pt}|otot|t }||_||_|j|}|_tjjtjj|j|}|r||jkr|jj|n|rtrtj|jkr|jjtjqqWdS(NR,i(R&tfinalize_optionsR0tcheck_extensions_listRNRR[tsetup_shlib_compilerR1R2t _full_nameRIR4tlinks_to_dynamictFalseRSRTR;R3t _file_nameR7R8tdirnameR5R:t library_dirstappendR=truntime_library_dirs(R)R?R@tltdtnsRAtlibdir((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR\s.       $cCsdtd|jd|jd|j}|_t||jdk rW|j|jn|j dk rx*|j D]\}}|j ||qpWn|j dk rx!|j D]}|j |qWn|j dk r|j|j n|jdk r |j|jn|jdk r,|j|jn|jdk rN|j|jntj||_dS(NRR.tforce(RRR.RjRPRt include_dirsRZtset_include_dirstdefinet define_macrotundeftundefine_macrot librariest set_librariesRdtset_library_dirstrpathtset_runtime_library_dirst link_objectstset_link_objectstlink_shared_objectt__get__(R)RR2tvaluetmacro((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR^s(% cCs&t|tr|jStj||S(N(RNRtexport_symbolsR&tget_export_symbols(R)R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR}scCs|j|j}z`t|tr4|j|_ntj|||jrr|jdj }|j ||nWd||_XdS(NR+( t_convert_pyx_sources_to_langRRNRRPR&tbuild_extensionR;R/R:R<(R)R?t _compilertcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRs   csntjg|jD]}|j^qdj|jjdd dgtfd|jDS(s?Return true if 'ext' links to a dynamic lib in the same packageR,iRc3s|]}|kVqdS(N((R tlibname(tlibnamestpkg(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys s(tdicttfromkeysR[R_R5R4tanyRq(R)R?tlib((RRs@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR`s(&cCstj||jS(N(R&t get_outputst_build_ext__get_stubs_outputs(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRscsEfdjD}tj|j}td|DS(Nc3s<|]2}|jrtjjj|jjdVqdS(R,N(R;R7R8R5R:R_R4(R R?(R)(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys scss|]\}}||VqdS(N((R tbasetfnext((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys s(R0t itertoolstproductt!_build_ext__get_output_extensionstlist(R)t ns_ext_basestpairs((R)s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_stubs_outputss  ccs(dVdV|jdjr$dVndS(Ns.pys.pycR+s.pyo(R/toptimize(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_output_extensionsscCstjd|j|tjj||jjdd}|rftjj|rft|dn|j st |d}|j djddd t d d tjj |jd d dt ddddt dddt ddddg|jn|rddlm}||gdddtd|j |jd j}|dkr||gd|dtd|j ntjj|r|j rtj|qndS(!Ns writing stub loader for %s to %sR,s.pys already exists! Please delete.tws sdef __bootstrap__():s- global __bootstrap__, __file__, __loader__s% import sys, os, pkg_resources, imps, dls: __file__ = pkg_resources.resource_filename(__name__,%r)s del __bootstrap__s if '__loader__' in globals():s del __loader__s# old_flags = sys.getdlopenflags()s old_dir = os.getcwd()s try:s( os.chdir(os.path.dirname(__file__))s$ sys.setdlopenflags(dl.RTLD_NOW)s( imp.load_dynamic(__name__,__file__)s finally:s" sys.setdlopenflags(old_flags)s os.chdir(old_dir)s__bootstrap__()Ri(t byte_compileRiRjR.t install_lib(RtinfoR_R7R8R5R4texistsRR.topentwritetif_dlR9Rbtclosetdistutils.utilRR>R/Rtunlink(R)t output_dirR?tcompilet stub_filetfRR((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR<sP        (t__name__t __module__R'R(R3RYR\R^R}RR`RRRRaR<(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRJs         ic Cs8|j|j||||||||| | | | dS(N(tlinktSHARED_LIBRARY( R)tobjectstoutput_libnameRRqRdRfR|tdebugt extra_preargstextra_postargst build_tempt target_lang((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRxs    tstaticc Cs|dksttjj|\}} tjj| \}}|jdjdrg|d}n|j||||| dS(NtxRi( RZtAssertionErrorR7R8R4RORQt startswithtcreate_static_lib(R)RRRRqRdRfR|RRRRRRAR9R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRx,s  cCs"tjdkrd}nt|S(s In https://github.com/pypa/setuptools/pull/837, we discovered Python 3.3.0 exposes the extension suffix under the name 'SO'. iiR (iii(Rt version_infoR(R2((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRLDs (+R7RRRtdistutils.command.build_extRt _du_build_exttdistutils.file_utilRtdistutils.ccompilerRtdistutils.sysconfigRRtdistutils.errorsRt distutilsRtsetuptools.extensionRtsetuptools.externRtCython.Distutils.build_extR&t __import__t ImportErrorR RRRaRRSRRRR>R2tdlthasattrRR$RZRxRL(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pytsX                   PK!500command/build_ext.pyonu[ fc @s%ddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZed Wnek reZnXe d dd l mZd ZeZeZdZ ej!dkr;e"ZnIej#dkry#ddl$Z$e%e$dZZWqek rqXndZ&dZ'defdYZesej#dkrddddddddddd Z)n-dZ ddddddddddd Z)dZ*dS(iN(t build_ext(t copy_file(t new_compiler(tcustomize_compilertget_config_var(tDistutilsError(tlog(tLibrary(tsixsCython.Compiler.MaintLDSHARED(t _config_varscCsstjdkretj}z,dtd>RcCsNxGdtjDD]/\}}}d|kr6|S|dkr|SqWdS(s;Return the file extension for an abi3-compliant Extension()css(|]}|dtjkr|VqdS(iN(timpt C_EXTENSION(t.0R((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys Css.abi3s.pydN(Rt get_suffixes(tsuffixt_((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pytget_abi3_suffixAs &  RcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z ed ZRS( cCs@|jd}|_tj|||_|r<|jndS(s;Build extensions in build directory, then copy if --inplaceiN(tinplacet _build_exttruntcopy_extensions_to_source(tselft old_inplace((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR'Ks   c Cs|jd}x|jD]}|j|j}|j|}|jd}dj|d }|j|}tj j|tj j |}tj j|j |} t | |d|j d|j|jr|j|ptj|tqqWdS(Ntbuild_pyt.itverbosetdry_run(tget_finalized_commandt extensionstget_ext_fullnametnametget_ext_filenametsplittjointget_package_dirtostpathtbasenamet build_libRR-R.t _needs_stubt write_stubtcurdirtTrue( R)R+texttfullnametfilenametmodpathtpackaget package_dirt dest_filenamet src_filename((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR(Ss   cCstj||}||jkr|j|}tjoLt|doLt}|rtd}|t| }|t}nt |t rt j j |\}}|jj|tStr|jrt j j|\}}t j j|d|Sn|S(Ntpy_limited_apit EXT_SUFFIXsdl-(R&R3text_mapRtPY3tgetattrR$t_get_config_var_837tlent isinstanceRR7R8tsplitexttshlib_compilertlibrary_filenametlibtypet use_stubst_links_to_dynamicR4R5(R)R@RAR?tuse_abi3tso_exttfntd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR3is"    cCs,tj|d|_g|_i|_dS(N(R&tinitialize_optionstNoneRPtshlibsRI(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRY~s   cCstj||jpg|_|j|jg|jD]}t|tr9|^q9|_|jrs|jnx&|jD]}|j|j |_ q}Wx#|jD]}|j }||j |<||j |j dd<|jr|j |pt}|otot|t }||_||_|j|}|_tjjtjj|j|}|r||jkr|jj|n|rtrtj|jkr|jjtjqqWdS(NR,i(R&tfinalize_optionsR0tcheck_extensions_listRNRR[tsetup_shlib_compilerR1R2t _full_nameRIR4tlinks_to_dynamictFalseRSRTR;R3t _file_nameR7R8tdirnameR5R:t library_dirstappendR=truntime_library_dirs(R)R?R@tltdtnsRAtlibdir((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR\s.       $cCsdtd|jd|jd|j}|_t||jdk rW|j|jn|j dk rx*|j D]\}}|j ||qpWn|j dk rx!|j D]}|j |qWn|j dk r|j|j n|jdk r |j|jn|jdk r,|j|jn|jdk rN|j|jntj||_dS(NRR.tforce(RRR.RjRPRt include_dirsRZtset_include_dirstdefinet define_macrotundeftundefine_macrot librariest set_librariesRdtset_library_dirstrpathtset_runtime_library_dirst link_objectstset_link_objectstlink_shared_objectt__get__(R)RR2tvaluetmacro((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR^s(% cCs&t|tr|jStj||S(N(RNRtexport_symbolsR&tget_export_symbols(R)R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR}scCs|j|j}z`t|tr4|j|_ntj|||jrr|jdj }|j ||nWd||_XdS(NR+( t_convert_pyx_sources_to_langRRNRRPR&tbuild_extensionR;R/R:R<(R)R?t _compilertcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRs   csntjg|jD]}|j^qdj|jjdd dgtfd|jDS(s?Return true if 'ext' links to a dynamic lib in the same packageR,iRc3s|]}|kVqdS(N((R tlibname(tlibnamestpkg(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys s(tdicttfromkeysR[R_R5R4tanyRq(R)R?tlib((RRs@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR`s(&cCstj||jS(N(R&t get_outputst_build_ext__get_stubs_outputs(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRscsEfdjD}tj|j}td|DS(Nc3s<|]2}|jrtjjj|jjdVqdS(R,N(R;R7R8R5R:R_R4(R R?(R)(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys scss|]\}}||VqdS(N((R tbasetfnext((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys s(R0t itertoolstproductt!_build_ext__get_output_extensionstlist(R)t ns_ext_basestpairs((R)s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_stubs_outputss  ccs(dVdV|jdjr$dVndS(Ns.pys.pycR+s.pyo(R/toptimize(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_output_extensionsscCstjd|j|tjj||jjdd}|rftjj|rft|dn|j st |d}|j djddd t d d tjj |jd d dt ddddt dddt ddddg|jn|rddlm}||gdddtd|j |jd j}|dkr||gd|dtd|j ntjj|r|j rtj|qndS(!Ns writing stub loader for %s to %sR,s.pys already exists! Please delete.tws sdef __bootstrap__():s- global __bootstrap__, __file__, __loader__s% import sys, os, pkg_resources, imps, dls: __file__ = pkg_resources.resource_filename(__name__,%r)s del __bootstrap__s if '__loader__' in globals():s del __loader__s# old_flags = sys.getdlopenflags()s old_dir = os.getcwd()s try:s( os.chdir(os.path.dirname(__file__))s$ sys.setdlopenflags(dl.RTLD_NOW)s( imp.load_dynamic(__name__,__file__)s finally:s" sys.setdlopenflags(old_flags)s os.chdir(old_dir)s__bootstrap__()Ri(t byte_compileRiRjR.t install_lib(RtinfoR_R7R8R5R4texistsRR.topentwritetif_dlR9Rbtclosetdistutils.utilRR>R/Rtunlink(R)t output_dirR?tcompilet stub_filetfRR((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR<sP        (t__name__t __module__R'R(R3RYR\R^R}RR`RRRRaR<(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRJs         ic Cs8|j|j||||||||| | | | dS(N(tlinktSHARED_LIBRARY( R)tobjectstoutput_libnameRRqRdRfR|tdebugt extra_preargstextra_postargst build_tempt target_lang((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRxs    tstaticc Csrtjj|\}} tjj| \}}|jdjdrU|d}n|j||||| dS(NtxRi(R7R8R4RORQt startswithtcreate_static_lib(R)RRRRqRdRfR|RRRRRRAR9R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRx,s  cCs"tjdkrd}nt|S(s In https://github.com/pypa/setuptools/pull/837, we discovered Python 3.3.0 exposes the extension suffix under the name 'SO'. iiR (iii(Rt version_infoR(R2((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRLDs (+R7RRRtdistutils.command.build_extRt _du_build_exttdistutils.file_utilRtdistutils.ccompilerRtdistutils.sysconfigRRtdistutils.errorsRt distutilsRtsetuptools.extensionRtsetuptools.externRtCython.Distutils.build_extR&t __import__t ImportErrorR RRRaRRSRRRR>R2tdlthasattrRR$RZRxRL(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pytsX                   PK!8 ))command/build_py.pycnu[ fc@sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZyddlmZWn$ek rdd dYZnXd ejefd YZdd Zd ZdS(i(tglob(t convert_pathN(tsix(tmaptfiltert filterfalse(t Mixin2to3RcBseZedZRS(cCsdS(s do nothingN((tselftfilestdoctests((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun_2to3t(t__name__t __module__tTrueR (((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRstbuild_pycBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZedZRS(sXEnhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. See 'setuptools.dist.Distribution' for more details. Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. cCsftjj||jj|_|jjp.i|_d|jkrP|jd=ng|_g|_dS(Nt data_files( torigRtfinalize_optionst distributiont package_datatexclude_package_datat__dict__t_build_py__updated_filest_build_py__doctests_2to3(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR!s    cCs|j r|j rdS|jr.|jn|jrN|j|jn|j|jt|j|jt|j|j t|j t j j |dddS(s?Build modules, packages, and copy data files to build directoryNtinclude_bytecodei(t py_modulestpackagest build_modulestbuild_packagestbuild_package_dataR RtFalseRRt byte_compileRRt get_outputs(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun+s     cCs5|dkr"|j|_|jStjj||S(slazily compute data filesR(t_get_data_filesRRRt __getattr__(Rtattr((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR$?s cCsqtjr-t|tjr-|jd}ntjj||||\}}|rg|jj |n||fS(Nt.( RtPY2t isinstancet string_typestsplitRRt build_moduleRtappend(Rtmodulet module_filetpackagetoutfiletcopied((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR+FscCs)|jtt|j|jp"dS(s?Generate list of '(package,src_dir,build_dir,filenames)' tuples((tanalyze_manifesttlistRt_get_pkg_data_filesR(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR#Ps cCsx|j|}tjj|jg|jd}g|j||D]}tjj||^qG}||||fS(NR&(tget_package_dirtostpathtjoint build_libR*tfind_data_filestrelpath(RR/tsrc_dirt build_dirtfilet filenames((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR4Us %1cCs|j|j||}tt|}tjj|}ttj j |}tj|j j |g|}|j |||S(s6Return filenames for package's data files in 'src_dir'(t_get_platform_patternsRRRt itertoolstchaint from_iterableRR6R7tisfiletmanifest_filestgettexclude_data_files(RR/R<tpatternstglobs_expandedt globs_matchest glob_filesR((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR:cs  c Csx|jD]\}}}}x|D]}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r#||jj kr#|j j |q#q#Wq WdS(s$Copy data files into build directoryN( RR6R7R8tmkpathtdirnamet copy_filetabspathRtconvert_2to3_doctestsRR,( RR/R<R=R?tfilenamettargettsrcfiletoutfR1((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRts c Cs\i|_}|jjsdSi}x0|jp2dD]}||t|j|sc3s!|]}|kr|VqdS(N((R|tfn(tbad(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys s(R3R@RRARBRCtsett_unique_everseen(RR/R<RRHt match_groupstmatchestkeepers((RRs?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRGs       cs>tj|jdg|j|g}fd|DS(s yield platform-specific path patterns (suitable for glob or fn_match) from a glob-based spec (such as self.package_data or self.exclude_package_data) matching package in src_dir. R c3s*|] }tjjt|VqdS(N(R6R7R8R(R|R}(R<(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys s(RARBRF(tspecR/R<t raw_patterns((R<s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR@s  (R R t__doc__RR"R$R+R#R4R:RR2RfRkRxR5RGt staticmethodR@(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRs            ccst}|j}|dkrMxgt|j|D]}|||Vq1Wn;x8|D]0}||}||krT|||VqTqTWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(RtaddR[Rt __contains__(titerabletkeytseentseen_addtelementtk((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRs         cCsOtjj|s|Sddlm}tjdj|}||dS(Ni(tDistutilsSetupErrors Error: setup script specifies an absolute path: %s setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. (R6R7tisabstdistutils.errorsRttextwraptdedenttlstrip(R7Rtmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRWs ((Rtdistutils.utilRtdistutils.command.build_pytcommandRRR6R{RRnRRqRAtsetuptools.externRtsetuptools.extern.six.movesRRRtsetuptools.lib2to3_exRt ImportErrorR[RRW(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyts"        PK!command/develop.pycnu[ fc@sddlmZddlmZddlmZmZddlZddlZddl Z ddl m Z ddl m Z mZmZddlmZddlmZddlZd ejefd YZd efd YZdS( i(t convert_path(tlog(tDistutilsErrortDistutilsOptionErrorN(tsix(t Distributiont PathMetadatatnormalize_path(t easy_install(t namespacestdevelopcBseZdZdZejddgZejdgZeZ dZ dZ d Z e d Zd Zd Zd ZdZRS(sSet up package for developments%install package in 'development mode't uninstalltusUninstall this source packages egg-path=s-Set the path to be used in the .egg-link filecCsA|jr)t|_|j|jn |j|jdS(N(R tTruet multi_versiontuninstall_linktuninstall_namespacestinstall_for_developmenttwarn_deprecated_options(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytruns      cCs5d|_d|_tj|d|_d|_dS(Nt.(tNoneR tegg_pathRtinitialize_optionst setup_pathtalways_copy_from(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR's     cCs|jd}|jrCd}|j|jf}t||n|jg|_tj||j|j |j j t j d|jd}t jj|j||_|j|_|jdkrt jj|j|_nt|j}tt jj|j|j}||kr9td|nt|t|t jj|jd|j|_|j|j|j|j|_dS(Ntegg_infos-Please rename %r to %r before using 'develop's*.eggs .egg-linksA--egg-path must be a relative path from the install directory to t project_name(tget_finalized_commandtbroken_egg_infoRRtegg_nametargsRtfinalize_optionstexpand_basedirst expand_dirst package_indextscantglobtostpathtjoint install_dirtegg_linktegg_baseRRtabspathRRRRtdistt_resolve_setup_pathR(RteittemplateR t egg_link_fnttargetR((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR!.s<        cCs|jtjdjd}|tjkrGd|jdd}nttjj|||}|ttjkrt d|ttjn|S(s Generate a path from egg_base back to '.' where the setup script resides and ensure that path points to the setup path from $install_dir/$egg_path. t/s../isGCan't get a consistent path to setup script from installation directory( treplaceR'tseptrstriptcurdirtcountRR(R)R(R,R*Rt path_to_setuptresolved((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR/XscCstjrt|jdtr|jddd|jd|jd}t|j }|jdd||jd|jddd|jd|jd}||_ ||j _ t ||j|j _n-|jd|jddd|jd|jtjr7|jtjdt_n|jtjd |j|j|jst|jd "}|j|j d |jWdQXn|jd|j |j dS( Ntuse_2to3tbuild_pytinplaceiRR,t build_extisCreating %s (link to %s)tws ( RtPY3tgetattrt distributiontFalsetreinitialize_commandt run_commandRRt build_libRR.tlocationRRt _providertinstall_site_pyt setuptoolstbootstrap_install_fromRRtinstall_namespacesRtinfoR+R,tdry_runtopentwriteRtprocess_distributiontno_deps(Rtbpy_cmdt build_pathtei_cmdtf((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRks4            $cCstjj|jrtjd|j|jt|j}g|D]}|j^qD}|j ||j g|j |j gfkrtj d|dS|j stj|jqn|j s|j|jn|jjrtj dndS(NsRemoving %s (link to %s)s$Link points to %s: uninstall aborteds5Note: you must uninstall or replace scripts manually!(R'R(texistsR+RRNR,RPR7tcloseRRtwarnROtunlinkt update_pthR.RCtscripts(Rt egg_link_filetlinetcontents((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRs     cCs||jk rtj||S|j|x~|jjp>gD]j}tjjt |}tjj |}t j |}|j }WdQX|j||||q?WdS(N(R.Rtinstall_egg_scriptstinstall_wrapper_scriptsRCR]R'R(R-RtbasenametioRPtreadtinstall_script(RR.t script_namet script_pathtstrmt script_text((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRas cCst|}tj||S(N(tVersionlessRequirementRRb(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRbs (R R sUninstall this source packageN(s egg-path=Ns-Set the path to be used in the .egg-link file(t__name__t __module__t__doc__t descriptionRt user_optionsRtboolean_optionsRDtcommand_consumes_argumentsRRR!t staticmethodR/RRRaRb(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR s   * /  RkcBs)eZdZdZdZdZRS(sz Adapt a pkg_resources.Distribution to simply return the project name as the 'requirement' so that scripts will work across multiple versions. >>> dist = Distribution(project_name='foo', version='1.0') >>> str(dist.as_requirement()) 'foo==1.0' >>> adapted_dist = VersionlessRequirement(dist) >>> str(adapted_dist.as_requirement()) 'foo' cCs ||_dS(N(t_VersionlessRequirement__dist(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt__init__scCst|j|S(N(RBRt(Rtname((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt __getattr__scCs|jS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytas_requirements(RlRmRnRuRwRx(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRks   (tdistutils.utilRt distutilsRtdistutils.errorsRRR'R&Rdtsetuptools.externRt pkg_resourcesRRRtsetuptools.command.easy_installRRKR tDevelopInstallerR tobjectRk(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyts    PK!хcommand/dist_info.pycnu[ fc@sLdZddlZddlmZddlmZdefdYZdS(sD Create a dist_info directory As defined in the wheel specification iN(tCommand(tlogt dist_infocBs2eZdZdgZdZdZdZRS(screate a .dist-info directorys egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)cCs d|_dS(N(tNonetegg_base(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytinitialize_optionsscCsdS(N((R((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytfinalize_optionsscCs|jd}|j|_|j|j|jtd d}tjdjt j j ||jd}|j |j|dS(Ntegg_infos .egg-infos .dist-infos creating '{}'t bdist_wheel( tget_finalized_commandRRtrunR tlenRtinfotformattostpathtabspathtegg2dist(RR t dist_info_dirR ((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyR s   "(s egg-base=RsLdirectory containing .egg-info directories (default: top of the source tree)(t__name__t __module__t descriptiont user_optionsRRR (((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyR s    (t__doc__Rtdistutils.coreRt distutilsRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyts PK!&99command/easy_install.pycnu[ fc@sedZddlmZddlmZddlmZmZddlmZmZm Z m Z ddl m Z m Z ddlmZmZddlmZdd lmZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd l Z dd l!Z!dd l"Z"dd l#Z#dd l$Z$dd l%Z%dd l&m'Z'dd l(m)Z)m*Z*dd l+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl4m<Z<m=Z=ddl>m?Z?ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOdd lPZ@ejQdde@jRddddddgZSdZTd ZUe'jVrd!ZWd"ZXnd#ZWd$ZXd%ZYde,fd&YZZd'Z[d(Z\d)Z]d*Z^d+Z_deGfd,YZ`d-e`fd.YZaejbjcd/d0d1kreaZ`nd2Zdd3Zed4Zfd5Zgehd6Zid7Zjd8Zkd9ejlkrekZmn d:Zmd;d<Znd=Zod>Zpd?Zqydd@lmrZsWnetk rzdAZsnXdBZrdCeufdDYZvevjwZxdEevfdFYZydGezfdHYZ{dIe{fdJYZ|dKe|fdLYZ}e{j~Z~e{jZdMZdNZeeedOZdPZdQZehdRZe"jdSZd S(Ts% Easy Install ------------ A tool for doing automatic download/extract/build of distutils-based Python packages. For detailed documentation, see the accompanying EasyInstall.txt file, or visit the `EasyInstall home page`__. __ https://setuptools.readthedocs.io/en/latest/easy_install.html i(tglob(t get_platform(t convert_patht subst_vars(tDistutilsArgErrortDistutilsOptionErrortDistutilsErrortDistutilsPlatformError(tINSTALL_SCHEMESt SCHEME_KEYS(tlogtdir_util(t first_line_re(tfind_executableN(tsix(t configparsertmap(tCommand(t run_setup(tget_pathtget_config_vars(t rmtree_safe(tsetopt(tunpack_archive(t PackageIndextparse_requirement_argt URL_SCHEME(t bdist_eggtegg_info(tWheel(t yield_linestnormalize_pathtresource_stringtensure_directorytget_distributiontfind_distributionst Environmentt Requirementt Distributiont PathMetadatat EggMetadatat WorkingSettDistributionNotFoundtVersionConflictt DEVELOP_DISTtdefaulttcategorytsamefilet easy_installtPthDistributionstextract_wininst_cfgtmaintget_exe_prefixescCstjddkS(NtPi(tstructtcalcsize(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_64bitIscCstjj|o!tjj|}ttjdo9|}|rUtjj||Stjjtjj|}tjjtjj|}||kS(s Determine if two paths reference the same file. Augments os.path.samefile to work on Windows and suppresses errors if the path doesn't exist. R/(tostpathtexiststhasattrR/tnormpathtnormcase(tp1tp2t both_existt use_samefiletnorm_p1tnorm_p2((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR/Ms$cCs|S(N((ts((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt _to_ascii_scCs1ytj|dtSWntk r,tSXdS(Ntascii(Rt text_typetTruet UnicodeErrortFalse(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytisasciibs  cCs |jdS(NRG(tencode(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFjscCs.y|jdtSWntk r)tSXdS(NRG(RMRIRJRK(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRLms   cCstj|jjddS(Ns s; (ttextwraptdedenttstriptreplace(ttext((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytutcBsreZdZdZeZdddddddddddddddddddddgZdddd dd-d0d6d9g Ze j rd=e j Z ej d>de fej d>nidd'6ZeZd?Zd@ZdAZedBZdCZdDZdEZdFZdGZdHZdIZdJZdKZej dLj!Z"ej dMj!Z#ej dNj!Z$dOZ%dPZ&dQZ'dRZ(dSZ)dTZ*e+j,dUZ-e.dVZ/e.dWZ0dXZ1edYZ2dZZ3d[Z4d\Z5dd]Z6ed^Z7d_dd`Z8daZ9dbZ:dcZ;ddZ<deZ=dfZ>ej dgj!Z?ej dhZ@didjZAej dkj!ZBdlZCdmZDdnZEdoZFdpZGdqZHdrZIdsZJej dtj!ZKduZLdvZMdwZNeOdxeOdydzd{d|ZPeOdyd}d{d~ZQdZRRS(s'Manage a download/build/install processs Find/get/install Python packagessprefix=sinstallation prefixszip-oktzsinstall package as a zipfiles multi-versiontms%make apps have to require() a versiontupgradetUs1force upgrade (searches PyPI for latest versions)s install-dir=tdsinstall package to DIRs script-dir=REsinstall scripts to DIRsexclude-scriptstxsDon't install scriptss always-copytas'Copy all needed packages to install dirs index-url=tis base URL of Python Package Indexs find-links=tfs(additional URL(s) to search for packagessbuild-directory=tbs/download/extract/build in DIR; keep the resultss optimize=tOslalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]srecord=s3filename in which to record list of installed filess always-unziptZs*don't install as a zipfile, no matter whats site-dirs=tSs)list of directories where .pth files workteditabletes+Install specified packages in editable formsno-depstNsdon't install dependenciess allow-hosts=tHs$pattern(s) that hostnames must matchslocal-snapshots-oktls(allow building eggs from local checkoutstversions"print version information and exits no-find-linkss9Don't load find-links defined in packages being installeds!install in user site-package '%s'tusercCsd|_d|_|_d|_|_|_d|_d|_d|_ d|_ d|_ |_ d|_ |_|_d|_|_|_d|_|_|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tj rtj!|_"tj#|_$nd|_"d|_$d|_%d|_&d|_'|_(d|_)i|_*t+|_,d|_-|j.j/|_/|j.j0||j.j1ddS(NiR0(2RhtNonetzip_oktlocal_snapshots_okt install_dirt script_dirtexclude_scriptst index_urlt find_linkstbuild_directorytargstoptimizetrecordRWt always_copyt multi_versionRbtno_depst allow_hoststroottprefixt no_reportRgtinstall_purelibtinstall_platlibtinstall_headerst install_libtinstall_scriptst install_datat install_basetinstall_platbasetsitetENABLE_USER_SITEt USER_BASEtinstall_userbaset USER_SITEtinstall_usersitet no_find_linkst package_indextpth_filetalways_copy_fromt site_dirstinstalled_projectsRKtsitepy_installedt_dry_runt distributiontverboset_set_command_optionstget_option_dict(tself((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinitialize_optionssF                         cCs*d|D}tt|j|dS(Ncss9|]/}tjj|s-tjj|r|VqdS(N(R9R:R;tislink(t.0tfilename((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys s(tlistRt _delete_path(Rtblockerstextant_blockers((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytdelete_blockersscCsetjd||jrdStjj|o?tjj| }|rNtntj}||dS(Ns Deleting %s( R tinfotdry_runR9R:tisdirRtrmtreetunlink(RR:tis_treetremover((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs  %cCs=tjd }td}d}|jtGHtdS(sT Render the Setuptools version and installation details, then exit. it setuptoolss=setuptools {dist.version} from {dist.location} (Python {ver})N(tsysRgR"tformattlocalst SystemExit(tvertdistttmpl((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_render_versions   c Cs|jo|jtjjd}tdd\}}i |jjd6|jjd6|jjd6|d6|dd!d 6|d|d d 6|d 6|d6|d 6|d6t tddd6|_ t j r|j |j d<|j|j dt<|j;|_;d|j;kod knst=nWqt=k rt(d"qXn|j*r|j> rt?d#n|j@st?d$ng|_AdS()NiRzt exec_prefixt dist_namet dist_versiont dist_fullnamet py_versionitpy_version_shortitpy_version_nodott sys_prefixtsys_exec_prefixtabiflagsRTtuserbasetusersiteRlRmRqRRRtinstallRtt,s"%s (in --site-dirs) does not exists$ (in --site-dirs) is not on sys.pathshttps://pypi.python.org/simplet*t search_paththostsRss--optimize must be 0, 1, or 2s9Must specify a build directory (-b) when using --editables:No urls, filenames, or requirements specified (see --help)(RlRl(RlRm(RtRt(RsRs(BRgRRtsplitRRtget_namet get_versiont get_fullnametgetattrt config_varsRRRRt_fix_install_dir_for_user_sitetexpand_basedirst expand_dirst_expandRmRiRlRRKtset_undefined_optionsRhR|RRRR:t get_site_dirst all_site_dirsRR9t expanduserRPRR twarnRtappendRbtcheck_site_dirRot shadow_pathtinsertRxRt create_indexR$t local_indexRpt isinstanceRt string_typesRktscan_egg_linkstadd_find_linksRstintt ValueErrorRqRRrtoutputs( RRRzRR=RERRYt path_itemR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytfinalize_optionss          4    . !        cCs|j stj rdS|j|jdkrFd}t|n|j|_|_t j j ddd}|j |dS(s; Fix the install_dir if "--user" was used. Ns$User base directory is not specifiedtposixtunixt_user( RhRRtcreate_home_pathRRiRRRR9tnameRQt select_scheme(Rtmsgt scheme_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRms cCsx|D]y}t||}|dk rtjdksFtjdkr[tjj|}nt||j}t|||qqWdS(NRtnt( RRiR9RR:RRRtsetattr(Rtattrstattrtval((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt _expand_attrs|s  cCs|jdddgdS(sNCalls `os.path.expanduser` on install_base, install_platbase and root.RRRyN(R(R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCs)ddddddg}|j|dS(s+Calls `os.path.expanduser` on install dirs.R|R}RR~RRN(R(Rtdirs((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs cCs|j|jjkr(tj|jnzx%|jD]}|j||j q5W|jr|j}|j rt |j }x/t t |D]}||||||jr dSx*tjj|D]}|j|q#WdS(N(Rnt ScriptWritertbesttget_argst write_script(RRRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR)s cCspt|j}t||}|rS|j|t}tj||}n|j|t|ddS(s/Generate a legacy script wrapper and install itR^N( R6RRtis_python_scriptt_load_templateRRat get_headerRdRF(RRR*t script_texttdev_pathRt is_scripttbody((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR's cCs=d}|r!|jdd}ntd|}|jdS(s There are a couple of template scripts in the package. This function loads one of them and prepares it for use. s script.tmpls.tmpls (dev).tmplRsutf-8(RQR tdecode(RiRt raw_bytes((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRf&s ttc Cs|jg|D]}tjj|j|^q tjd||jtjj|j|}|j||jrzdSt }t |tjj |rtj |nt |d|}|j|WdQXt|d|dS(s1Write an executable file to the scripts directorysInstalling %s script to %sNRi(RR9R:RRmR RR/Rt current_umaskR!R;RRRtchmod( RR*R_tmodeRRZttargettmaskR]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRd5s,    cCs|jjdr(|j||gS|jjdrP|j||gS|jjdrx|j||gS|}tjj|r|jd rt|||j n'tjj |rtjj |}n|j |r|j r|dk r|j|||}ntjj|d}tjj|sttjj|dd}|stdtjj |nt|dkrtd tjj |n|d }n|jrtj|j||gS|j||SdS( Ns.eggs.exes.whls.pyssetup.pyRs"Couldn't find a setup script in %sisMultiple setup scripts in %si(RRCt install_eggt install_exet install_wheelR9R:tisfileRtunpack_progressRtabspatht startswithRqRiR`RR;RRRRbR Rtreport_editabletbuild_and_install(RRR\R7R]t setup_scripttsetups((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyREIs<"  cCs[tjj|r3t|tjj|d}nttj|}tj |d|S(NsEGG-INFOtmetadata( R9R:RR'RR(t zipimportt zipimporterR&t from_filename(Rtegg_pathR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFus cCs%tjj|jtjj|}tjj|}|jsLt|n|j|}t ||s tjj |rtjj | rt j |d|jn2tjj|r|jtj|fd|nyt}tjj |r*|j|rtjd}}qtjd}}ng|j|rY|j||jd}}n8t}|j|rtjd}}ntjd}}|j|||f|dtjj|tjj|ft|d|Wq tk rt|dtq Xn|j||j|S(NRs Removing tMovingtCopyingt Extractings %s to %stfix_zipimporter_caches(R9R:RRlR!RyRR!RFR/RRR t remove_treeR;RRRKRzRZR[tcopytreeRXtmkpathtunpack_and_compileRItcopy2Rtupdate_dist_cachesRR/(RRR7t destinationRtnew_dist_is_zippedR]RV((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRt}sT   %      cCst|}|dkr+td|ntdd|jddd|jdddt}tjj||j d}||_ |d}tjj|d }tjj|d }t |t |||_ |j||tjj|st|d } | jd xU|jdD]D\} } | d kr*| jd| jddj| fq*q*W| jntjj|d} |jgtj|D]} tjj| | d^qtj||d|jd|j|j||S(Ns(%s is not a valid distutils Windows .exeRDRRRgtplatforms.eggs.tmpsEGG-INFOsPKG-INFORsMetadata-Version: 1.0 ttarget_versions%s: %s t_t-R$iRR(R2RiRR&tgetRR9R:Rtegg_nameR@R!R't _providert exe_to_eggR;RRtitemsRQttitleRRRaRcRt make_zipfileRRRt(RR\R7tcfgRRtegg_tmpt _egg_infotpkg_infR]tktvRmRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRus<       0 3c st|ggifd}t||g}xD]}|jjdrV|jd}|d}tj|dd|d=%(version)s") # this version or higher s Note also that the installation directory must be on sys.path at runtime for this to work. (e.g. by being the application's script directory, by being on PYTHONPATH, or by being added to sys.path by your code.) t Installedc Csd}|jr\|j r\|d|j7}|jtttjkr\|d|j7}q\n|j }|j }|j }d}|t S(s9Helpful installation message for display to package userss %(what)s %(eggloc)s%(extras)ss RT( RvR{t_easy_install__mv_warningRlRRRR:t_easy_install__id_warningR@RDRgR( RtreqRtwhatRtegglocRRgtextras((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyROCs   sR Extracted editable version of %(spec)s to %(dirname)s If it uses setuptools in its setup script, you can activate it in "development" mode by going to that directory and running:: %(python)s setup.py develop See the setuptools documentation for the "develop" command for more info. cCs-tjj|}tj}d|jtS(Ns (R9R:RRRt_easy_install__editable_msgR(RRR}Rtpython((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR{\s cCstjjdttjjdtt|}|jdkrid|jd}|jdd|n"|jdkr|jddn|jr|jdd nt j d |t |dd j |yt ||Wn-tk r}td |jdfnXdS( Nsdistutils.command.bdist_eggsdistutils.command.egg_infoiRiiRs-qs-ns Running %s %st sSetup script exited with %s(Rtmodulest setdefaultRRRRRRR RRRRRRRr(RR}R]RrR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas   $c Csddg}tjdddtjj|}z|jtjj||j||j|||t|g}g}x?|D]7}x.||D]"}|j|j |j |qWqW| r|j rt j d|n|SWdt|t j|jXdS(NRs --dist-dirRzs egg-dist-tmp-tdirs+No eggs found in %s (setup script problem?)(R3R4R9R:Rt_set_fetcher_optionsRRR$RtR@RR RRRR( RR}R]Rrtdist_dirtall_eggsteggsR1R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR|us$    $   c Cs|jjdj}d }i}xF|jD]8\}}||krOq1n|d||jdd egg path translations for a given .exe filesPURELIB/RTsPLATLIB/pywin32_system32sPLATLIB/sSCRIPTS/sEGG-INFO/scripts/sDATA/lib/site-packagesRiisPKG-INFOis .egg-infois EGG-INFO/s.pths -nspkg.pthtPURELIBtPLATLIBs\Rs%s/%s/N(sPURELIB/RT(sPLATLIB/pywin32_system32RT(sPLATLIB/RT(sSCRIPTS/sEGG-INFO/scripts/(sDATA/lib/site-packagesRT(R-R.(RtZipFiletinfolistRRRRCRRtupperRRtPY3RlRRPRQRzRRRtsorttreverse( t exe_filenameRRURRRR_tpthRZty((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR4s>  "#" 3 +  cBs\eZdZeZddZdZdZedZ dZ dZ dZ RS( s)A .pth file with Distribution paths in itcCs||_ttt||_ttjj|j|_|j t j |gddx6t |jD]%}tt|jt|tqoWdS(N(RRRRRR9R:Rtbasedirt_loadR$t__init__RiRRRMR#RI(RRRR:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR:)s  cCsg|_t}tj|j}tjj|jr3t |jd}x|D]}|j drpt }qOn|j }|jj ||j sO|jj drqOnttjj|j|}|jdcCs7yt||dWnttfk r.tSXtSdS(s%Is this string a valid Python script?texecN(RUt SyntaxErrort TypeErrorRKRI(RRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt is_pythonqs cCsVy1tj|dd}|jd}WdQXWnttfk rK|SX|dkS(sCDetermine if the specified executable is a .sh (contains a #! line)Rslatin-1iNs#!(RRRRR(Rtfptmagic((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_sh{s cCstj|gS(s@Quote a command line argument according to Windows parsing rules(t subprocesst list2cmdline(RZ((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt nt_quote_argscCsb|jds|jdr"tSt||r5tS|jdr^d|jdjkStS(sMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc. s.pys.pyws#!Ri(RCRIRxRzt splitlinesRRK(RhR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRes(RpcGsdS(N((Rr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_chmodscCsQtjd||yt||Wn&tjk rL}tjd|nXdS(Nschanging mode of %s to %oschmod failed: %s(R RRR9terror(R:RqRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRps t CommandSpeccBseZdZgZeZedZedZedZ edZ edZ dZ e dZdZe d Ze d ZRS( sm A command spec for a #! header, specified as a list of arguments akin to those passed to Popen. cCs|S(sV Choose the best CommandSpec class based on environmental conditions. ((RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbscCs(tjjtj}tjjd|S(Nt__PYVENV_LAUNCHER__(R9R:R=RRRR(RNt_default((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_sys_executablescCsOt||r|St|tr,||S|dkrB|jS|j|S(sg Construct a CommandSpec from a parameter to build_scripts, which may be None. N(RRRitfrom_environmentt from_string(RNtparam((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt from_params   cCs||jgS(N(R(RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCstj||j}||S(s} Construct a command spec from a simple string representing a command line parseable by shlex.split. (tshlexRt split_args(RNtstringR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCsMtj|j||_tj|}t|sIdg|jd*ndS(Ns-xi(RRt_extract_optionstoptionsR|R}RL(RRhtcmdline((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinstall_optionss cCsQ|djd}tj|}|rA|jdpDdnd}|jS(sH Extract any options from the first line of the script. s iiRT(RRVtmatchtgroupRP(t orig_scripttfirstRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs!cCs|j|t|jS(N(t_renderRR(R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt as_headerscCsDd}x7|D]/}|j|r |j|r |dd!Sq W|S(Ns"'ii(RzRC(titemt_QUOTEStq((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt _strip_quotess  cCs%tjd|D}d|dS(Ncss$|]}tj|jVqdS(N(RRRP(RR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys ss#!s (R|R}(RR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs(RRRRRRRORbRRRRRRRRRR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs   tWindowsCommandSpeccBseZedeZRS(R(RRRRKR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRsRacBseZdZejdjZeZe d e dZ e d e dZ e d dZedZe dZe dZe dZe d d d ZRS( s` Encapsulates behavior around writing entry point scripts for console and gui apps. s # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r __requires__ = %(spec)r import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point(%(spec)r, %(group)r, %(name)r)() ) cCsMtjdt|rtntj}|jd||}|j||S(Ns Use get_argsRT(twarningsRtDeprecationWarningtWindowsScriptWriterRaRbtget_script_headerRc(RNRRtwininsttwritertheader((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytget_script_argsscCsNtjdt|rd}n|jjj|}|j||jS(NsUse get_headers python.exe(RRRtcommand_spec_classRbRRR(RNRhRRtcmd((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR!s   c cs|dkr|j}nt|j}xdD]}|d}xn|j|jD]W\}}|j||jt}|j ||||} x| D] } | VqWqZWq4WdS(s Yield write_script() argument tuples for a distribution's console_scripts and gui_scripts entry points. tconsoletguit_scriptsN(RR( RiRgR6RRt get_entry_mapRt_ensure_safe_nameRRt_get_script_args( RNRRRttype_RRtepRhRrR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRc+s   "  cCs+tjd|}|r'tdndS(s? Prevent paths in *_scripts entry point names. s[\\/]s+Path separators not allowed in script namesN(RTtsearchR(Rt has_path_sep((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR=scCs*tjdt|r tjS|jS(NsUse best(RRRRRb(RNt force_windows((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt get_writerFscCs?tjdks-tjdkr7tjdkr7tjS|SdS(sD Select the best ScriptWriter for this environment. twin32tjavaRN(RRR9Rt_nameRRb(RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbLs- ccs|||fVdS(N((RNRRRRh((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRVsRTcCs/|jjj|}|j||jS(s;Create a #! line, getting options (if any) from script_text(RRbRRR(RNRhRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRg[s N(RRRRNRORRRRRORiRKRRRcRRRRbRRg(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas     RcBsYeZeZedZedZedZedZe dZ RS(cCstjdt|jS(NsUse best(RRRRb(RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRfscCs2tdtd|}tjjdd}||S(sC Select the best ScriptWriter suitable for Windows RtnaturaltSETUPTOOLS_LAUNCHER(RtWindowsExecutableLauncherWriterR9RR(RNt writer_lookuptlauncher((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbls  c cstdddd|}|tjdjjdkr`djt}tj|t nddd d d dd g}|j ||j ||}g|D]}||^q} ||||d | fVdS(s For Windows, add a .py extensionRs.pyaRs.pywtPATHEXTt;sK{ext} not listed in PATHEXT; scripts will not be recognized as executables.s.pys -script.pys.pycs.pyos.exeRnN( RR9RRRRRRRt UserWarningRNt_adjust_header( RNRRRRhtextRRRZR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRys"  cCsud}d}|dkr(||}}ntjtj|tj}|jd|d|}|j|rq|S|S(s Make sure 'pythonw' is used for gui and and 'python' is used for console (regardless of what sys.executable is). s pythonw.exes python.exeRRtrepl(RTRUtescapet IGNORECASEtsubt _use_header(RNRt orig_headerRSRt pattern_obt new_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs cCs/|dd!jd}tjdkp.t|S(s Should _adjust_header use the replaced header? On non-windows systems, always use. On Windows systems, only use the replaced header if it resolves to an executable on the system. iit"R(RPRRR (Rt clean_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs ( RRRRRORRbRRRR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRcs  RcBseZedZRS(c cs|dkr$d}d}dg}nd}d}dddg}|j||}g|D]} || ^qX} ||||d | fV|d t|d fVts|d } | t|d fVnd S(sG For Windows, add a .py extension and an .exe launcher Rs -script.pyws.pywtclis -script.pys.pys.pycs.pyoRns.exeR^s .exe.manifestN(Rtget_win_launcherR8tload_launcher_manifest( RNRRRRht launcher_typeRRthdrRZRtm_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs    (RRROR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCsGd|}tr(|jdd}n|jdd}td|S(s Load the Windows launcher (executable) suitable for launching a script. `type` should be either 'cli' or 'gui' Returns the executable as a byte string. s%s.exet.s-64.s-32.R(R8RQR (ttypet launcher_fn((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs   cCs>tjtd}tjr&|tS|jdtSdS(Nslauncher manifest.xmlsutf-8(RR RRtPY2tvarsRl(Rtmanifest((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs  cCstj|||S(N(RZR(R:t ignore_errorstonerror((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCs tjd}tj||S(Ni(R9tumask(ttmp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRos cCsMddl}tjj|jd}|tjd s"                 d             A ) ) 'l   R          T `A      PK! 99command/easy_install.pyonu[ fc@sedZddlmZddlmZddlmZmZddlmZmZm Z m Z ddl m Z m Z ddlmZmZddlmZdd lmZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd lZdd l Z dd l!Z!dd l"Z"dd l#Z#dd l$Z$dd l%Z%dd l&m'Z'dd l(m)Z)m*Z*dd l+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl4m<Z<m=Z=ddl>m?Z?ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOdd lPZ@ejQdde@jRddddddgZSdZTd ZUe'jVrd!ZWd"ZXnd#ZWd$ZXd%ZYde,fd&YZZd'Z[d(Z\d)Z]d*Z^d+Z_deGfd,YZ`d-e`fd.YZaejbjcd/d0d1kreaZ`nd2Zdd3Zed4Zfd5Zgehd6Zid7Zjd8Zkd9ejlkrekZmn d:Zmd;d<Znd=Zod>Zpd?Zqydd@lmrZsWnetk rzdAZsnXdBZrdCeufdDYZvevjwZxdEevfdFYZydGezfdHYZ{dIe{fdJYZ|dKe|fdLYZ}e{j~Z~e{jZdMZdNZeeedOZdPZdQZehdRZe"jdSZd S(Ts% Easy Install ------------ A tool for doing automatic download/extract/build of distutils-based Python packages. For detailed documentation, see the accompanying EasyInstall.txt file, or visit the `EasyInstall home page`__. __ https://setuptools.readthedocs.io/en/latest/easy_install.html i(tglob(t get_platform(t convert_patht subst_vars(tDistutilsArgErrortDistutilsOptionErrortDistutilsErrortDistutilsPlatformError(tINSTALL_SCHEMESt SCHEME_KEYS(tlogtdir_util(t first_line_re(tfind_executableN(tsix(t configparsertmap(tCommand(t run_setup(tget_pathtget_config_vars(t rmtree_safe(tsetopt(tunpack_archive(t PackageIndextparse_requirement_argt URL_SCHEME(t bdist_eggtegg_info(tWheel(t yield_linestnormalize_pathtresource_stringtensure_directorytget_distributiontfind_distributionst Environmentt Requirementt Distributiont PathMetadatat EggMetadatat WorkingSettDistributionNotFoundtVersionConflictt DEVELOP_DISTtdefaulttcategorytsamefilet easy_installtPthDistributionstextract_wininst_cfgtmaintget_exe_prefixescCstjddkS(NtPi(tstructtcalcsize(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_64bitIscCstjj|o!tjj|}ttjdo9|}|rUtjj||Stjjtjj|}tjjtjj|}||kS(s Determine if two paths reference the same file. Augments os.path.samefile to work on Windows and suppresses errors if the path doesn't exist. R/(tostpathtexiststhasattrR/tnormpathtnormcase(tp1tp2t both_existt use_samefiletnorm_p1tnorm_p2((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR/Ms$cCs|S(N((ts((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt _to_ascii_scCs1ytj|dtSWntk r,tSXdS(Ntascii(Rt text_typetTruet UnicodeErrortFalse(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytisasciibs  cCs |jdS(NRG(tencode(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFjscCs.y|jdtSWntk r)tSXdS(NRG(RMRIRJRK(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRLms   cCstj|jjddS(Ns s; (ttextwraptdedenttstriptreplace(ttext((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytutcBsreZdZdZeZdddddddddddddddddddddgZdddd dd-d0d6d9g Ze j rd=e j Z ej d>de fej d>nidd'6ZeZd?Zd@ZdAZedBZdCZdDZdEZdFZdGZdHZdIZdJZdKZej dLj!Z"ej dMj!Z#ej dNj!Z$dOZ%dPZ&dQZ'dRZ(dSZ)dTZ*e+j,dUZ-e.dVZ/e.dWZ0dXZ1edYZ2dZZ3d[Z4d\Z5dd]Z6ed^Z7d_dd`Z8daZ9dbZ:dcZ;ddZ<deZ=dfZ>ej dgj!Z?ej dhZ@didjZAej dkj!ZBdlZCdmZDdnZEdoZFdpZGdqZHdrZIdsZJej dtj!ZKduZLdvZMdwZNeOdxeOdydzd{d|ZPeOdyd}d{d~ZQdZRRS(s'Manage a download/build/install processs Find/get/install Python packagessprefix=sinstallation prefixszip-oktzsinstall package as a zipfiles multi-versiontms%make apps have to require() a versiontupgradetUs1force upgrade (searches PyPI for latest versions)s install-dir=tdsinstall package to DIRs script-dir=REsinstall scripts to DIRsexclude-scriptstxsDon't install scriptss always-copytas'Copy all needed packages to install dirs index-url=tis base URL of Python Package Indexs find-links=tfs(additional URL(s) to search for packagessbuild-directory=tbs/download/extract/build in DIR; keep the resultss optimize=tOslalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]srecord=s3filename in which to record list of installed filess always-unziptZs*don't install as a zipfile, no matter whats site-dirs=tSs)list of directories where .pth files workteditabletes+Install specified packages in editable formsno-depstNsdon't install dependenciess allow-hosts=tHs$pattern(s) that hostnames must matchslocal-snapshots-oktls(allow building eggs from local checkoutstversions"print version information and exits no-find-linkss9Don't load find-links defined in packages being installeds!install in user site-package '%s'tusercCsd|_d|_|_d|_|_|_d|_d|_d|_ d|_ d|_ |_ d|_ |_|_d|_|_|_d|_|_|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tj rtj!|_"tj#|_$nd|_"d|_$d|_%d|_&d|_'|_(d|_)i|_*t+|_,d|_-|j.j/|_/|j.j0||j.j1ddS(NiR0(2RhtNonetzip_oktlocal_snapshots_okt install_dirt script_dirtexclude_scriptst index_urlt find_linkstbuild_directorytargstoptimizetrecordRWt always_copyt multi_versionRbtno_depst allow_hoststroottprefixt no_reportRgtinstall_purelibtinstall_platlibtinstall_headerst install_libtinstall_scriptst install_datat install_basetinstall_platbasetsitetENABLE_USER_SITEt USER_BASEtinstall_userbaset USER_SITEtinstall_usersitet no_find_linkst package_indextpth_filetalways_copy_fromt site_dirstinstalled_projectsRKtsitepy_installedt_dry_runt distributiontverboset_set_command_optionstget_option_dict(tself((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinitialize_optionssF                         cCs*d|D}tt|j|dS(Ncss9|]/}tjj|s-tjj|r|VqdS(N(R9R:R;tislink(t.0tfilename((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys s(tlistRt _delete_path(Rtblockerstextant_blockers((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytdelete_blockersscCsetjd||jrdStjj|o?tjj| }|rNtntj}||dS(Ns Deleting %s( R tinfotdry_runR9R:tisdirRtrmtreetunlink(RR:tis_treetremover((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs  %cCs=tjd }td}d}|jtGHtdS(sT Render the Setuptools version and installation details, then exit. it setuptoolss=setuptools {dist.version} from {dist.location} (Python {ver})N(tsysRgR"tformattlocalst SystemExit(tvertdistttmpl((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_render_versions   c Cs|jo|jtjjd}tdd\}}i |jjd6|jjd6|jjd6|d6|dd!d 6|d|d d 6|d 6|d6|d 6|d6t tddd6|_ t j r|j |j d<|j|j dt<|j;|_;d|j;kod knst=nWqt=k rt(d"qXn|j*r|j> rt?d#n|j@st?d$ng|_AdS()NiRzt exec_prefixt dist_namet dist_versiont dist_fullnamet py_versionitpy_version_shortitpy_version_nodott sys_prefixtsys_exec_prefixtabiflagsRTtuserbasetusersiteRlRmRqRRRtinstallRtt,s"%s (in --site-dirs) does not exists$ (in --site-dirs) is not on sys.pathshttps://pypi.python.org/simplet*t search_paththostsRss--optimize must be 0, 1, or 2s9Must specify a build directory (-b) when using --editables:No urls, filenames, or requirements specified (see --help)(RlRl(RlRm(RtRt(RsRs(BRgRRtsplitRRtget_namet get_versiont get_fullnametgetattrt config_varsRRRRt_fix_install_dir_for_user_sitetexpand_basedirst expand_dirst_expandRmRiRlRRKtset_undefined_optionsRhR|RRRR:t get_site_dirst all_site_dirsRR9t expanduserRPRR twarnRtappendRbtcheck_site_dirRot shadow_pathtinsertRxRt create_indexR$t local_indexRpt isinstanceRt string_typesRktscan_egg_linkstadd_find_linksRstintt ValueErrorRqRRrtoutputs( RRRzRR=RERRYt path_itemR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytfinalize_optionss          4    . !        cCs|j stj rdS|j|jdkrFd}t|n|j|_|_t j j ddd}|j |dS(s; Fix the install_dir if "--user" was used. Ns$User base directory is not specifiedtposixtunixt_user( RhRRtcreate_home_pathRRiRRRR9tnameRQt select_scheme(Rtmsgt scheme_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRms cCsx|D]y}t||}|dk rtjdksFtjdkr[tjj|}nt||j}t|||qqWdS(NRtnt( RRiR9RR:RRRtsetattr(Rtattrstattrtval((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt _expand_attrs|s  cCs|jdddgdS(sNCalls `os.path.expanduser` on install_base, install_platbase and root.RRRyN(R(R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCs)ddddddg}|j|dS(s+Calls `os.path.expanduser` on install dirs.R|R}RR~RRN(R(Rtdirs((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs cCs|j|jjkr(tj|jnzx%|jD]}|j||j q5W|jr|j}|j rt |j }x/t t |D]}||||||jr dSx*tjj|D]}|j|q#WdS(N(Rnt ScriptWritertbesttget_argst write_script(RRRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR)s cCspt|j}t||}|rS|j|t}tj||}n|j|t|ddS(s/Generate a legacy script wrapper and install itR^N( R6RRtis_python_scriptt_load_templateRRat get_headerRdRF(RRR*t script_texttdev_pathRt is_scripttbody((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR's cCs=d}|r!|jdd}ntd|}|jdS(s There are a couple of template scripts in the package. This function loads one of them and prepares it for use. s script.tmpls.tmpls (dev).tmplRsutf-8(RQR tdecode(RiRt raw_bytes((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRf&s ttc Cs|jg|D]}tjj|j|^q tjd||jtjj|j|}|j||jrzdSt }t |tjj |rtj |nt |d|}|j|WdQXt|d|dS(s1Write an executable file to the scripts directorysInstalling %s script to %sNRi(RR9R:RRmR RR/Rt current_umaskR!R;RRRtchmod( RR*R_tmodeRRZttargettmaskR]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRd5s,    cCs|jjdr(|j||gS|jjdrP|j||gS|jjdrx|j||gS|}tjj|r|jd rt|||j n'tjj |rtjj |}n|j |r|j r|dk r|j|||}ntjj|d}tjj|sttjj|dd}|stdtjj |nt|dkrtd tjj |n|d }n|jrtj|j||gS|j||SdS( Ns.eggs.exes.whls.pyssetup.pyRs"Couldn't find a setup script in %sisMultiple setup scripts in %si(RRCt install_eggt install_exet install_wheelR9R:tisfileRtunpack_progressRtabspatht startswithRqRiR`RR;RRRRbR Rtreport_editabletbuild_and_install(RRR\R7R]t setup_scripttsetups((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyREIs<"  cCs[tjj|r3t|tjj|d}nttj|}tj |d|S(NsEGG-INFOtmetadata( R9R:RR'RR(t zipimportt zipimporterR&t from_filename(Rtegg_pathR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFus cCs%tjj|jtjj|}tjj|}|jsLt|n|j|}t ||s tjj |rtjj | rt j |d|jn2tjj|r|jtj|fd|nyt}tjj |r*|j|rtjd}}qtjd}}ng|j|rY|j||jd}}n8t}|j|rtjd}}ntjd}}|j|||f|dtjj|tjj|ft|d|Wq tk rt|dtq Xn|j||j|S(NRs Removing tMovingtCopyingt Extractings %s to %stfix_zipimporter_caches(R9R:RRlR!RyRR!RFR/RRR t remove_treeR;RRRKRzRZR[tcopytreeRXtmkpathtunpack_and_compileRItcopy2Rtupdate_dist_cachesRR/(RRR7t destinationRtnew_dist_is_zippedR]RV((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRt}sT   %      cCst|}|dkr+td|ntdd|jddd|jdddt}tjj||j d}||_ |d}tjj|d }tjj|d }t |t |||_ |j||tjj|st|d } | jd xU|jdD]D\} } | d kr*| jd| jddj| fq*q*W| jntjj|d} |jgtj|D]} tjj| | d^qtj||d|jd|j|j||S(Ns(%s is not a valid distutils Windows .exeRDRRRgtplatforms.eggs.tmpsEGG-INFOsPKG-INFORsMetadata-Version: 1.0 ttarget_versions%s: %s t_t-R$iRR(R2RiRR&tgetRR9R:Rtegg_nameR@R!R't _providert exe_to_eggR;RRtitemsRQttitleRRRaRcRt make_zipfileRRRt(RR\R7tcfgRRtegg_tmpt _egg_infotpkg_infR]tktvRmRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRus<       0 3c st|ggifd}t||g}xD]}|jjdrV|jd}|d}tj|dd|d=%(version)s") # this version or higher s Note also that the installation directory must be on sys.path at runtime for this to work. (e.g. by being the application's script directory, by being on PYTHONPATH, or by being added to sys.path by your code.) t Installedc Csd}|jr\|j r\|d|j7}|jtttjkr\|d|j7}q\n|j }|j }|j }d}|t S(s9Helpful installation message for display to package userss %(what)s %(eggloc)s%(extras)ss RT( RvR{t_easy_install__mv_warningRlRRRR:t_easy_install__id_warningR@RDRgR( RtreqRtwhatRtegglocRRgtextras((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyROCs   sR Extracted editable version of %(spec)s to %(dirname)s If it uses setuptools in its setup script, you can activate it in "development" mode by going to that directory and running:: %(python)s setup.py develop See the setuptools documentation for the "develop" command for more info. cCs-tjj|}tj}d|jtS(Ns (R9R:RRRt_easy_install__editable_msgR(RRR}Rtpython((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR{\s cCstjjdttjjdtt|}|jdkrid|jd}|jdd|n"|jdkr|jddn|jr|jdd nt j d |t |dd j |yt ||Wn-tk r}td |jdfnXdS( Nsdistutils.command.bdist_eggsdistutils.command.egg_infoiRiiRs-qs-ns Running %s %st sSetup script exited with %s(Rtmodulest setdefaultRRRRRRR RRRRRRRr(RR}R]RrR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas   $c Csddg}tjdddtjj|}z|jtjj||j||j|||t|g}g}x?|D]7}x.||D]"}|j|j |j |qWqW| r|j rt j d|n|SWdt|t j|jXdS(NRs --dist-dirRzs egg-dist-tmp-tdirs+No eggs found in %s (setup script problem?)(R3R4R9R:Rt_set_fetcher_optionsRRR$RtR@RR RRRR( RR}R]Rrtdist_dirtall_eggsteggsR1R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR|us$    $   c Cs|jjdj}d }i}xF|jD]8\}}||krOq1n|d||jdd egg path translations for a given .exe filesPURELIB/RTsPLATLIB/pywin32_system32sPLATLIB/sSCRIPTS/sEGG-INFO/scripts/sDATA/lib/site-packagesRiisPKG-INFOis .egg-infois EGG-INFO/s.pths -nspkg.pthtPURELIBtPLATLIBs\Rs%s/%s/N(sPURELIB/RT(sPLATLIB/pywin32_system32RT(sPLATLIB/RT(sSCRIPTS/sEGG-INFO/scripts/(sDATA/lib/site-packagesRT(R+R,(RtZipFiletinfolistRRRRCRRtupperRRtPY3RlRRPRQRzRRRtsorttreverse( t exe_filenameRRURRRR_tpthRZty((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR4s>  "#" 3 +  cBs\eZdZeZddZdZdZedZ dZ dZ dZ RS( s)A .pth file with Distribution paths in itcCs||_ttt||_ttjj|j|_|j t j |gddx6t |jD]%}tt|jt|tqoWdS(N(RRRRR R9R:Rtbasedirt_loadR$t__init__RiRRRMR#RI(RRR R:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR8)s  cCsg|_t}tj|j}tjj|jr3t |jd}x|D]}|j drpt }qOn|j }|jj ||j sO|jj drqOnttjj|j|}|jdcCs7yt||dWnttfk r.tSXtSdS(s%Is this string a valid Python script?texecN(RSt SyntaxErrort TypeErrorRKRI(RRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt is_pythonqs cCsVy1tj|dd}|jd}WdQXWnttfk rK|SX|dkS(sCDetermine if the specified executable is a .sh (contains a #! line)Rslatin-1iNs#!(RRRRR(Rtfptmagic((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_sh{s cCstj|gS(s@Quote a command line argument according to Windows parsing rules(t subprocesst list2cmdline(RX((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt nt_quote_argscCsb|jds|jdr"tSt||r5tS|jdr^d|jdjkStS(sMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc. s.pys.pyws#!Ri(RCRIRvRzt splitlinesRRK(RhR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRes(RpcGsdS(N((Rr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_chmodscCsQtjd||yt||Wn&tjk rL}tjd|nXdS(Nschanging mode of %s to %oschmod failed: %s(R RR~R9terror(R:RqRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRps t CommandSpeccBseZdZgZeZedZedZedZ edZ edZ dZ e dZdZe d Ze d ZRS( sm A command spec for a #! header, specified as a list of arguments akin to those passed to Popen. cCs|S(sV Choose the best CommandSpec class based on environmental conditions. ((RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbscCs(tjjtj}tjjd|S(Nt__PYVENV_LAUNCHER__(R9R:R=RRRR(RLt_default((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_sys_executablescCsOt||r|St|tr,||S|dkrB|jS|j|S(sg Construct a CommandSpec from a parameter to build_scripts, which may be None. N(RRRitfrom_environmentt from_string(RLtparam((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt from_params   cCs||jgS(N(R(RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCstj||j}||S(s} Construct a command spec from a simple string representing a command line parseable by shlex.split. (tshlexRt split_args(RLtstringR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCsMtj|j||_tj|}t|sIdg|jd*ndS(Ns-xi(RRt_extract_optionstoptionsRzR{RL(RRhtcmdline((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinstall_optionss cCsQ|djd}tj|}|rA|jdpDdnd}|jS(sH Extract any options from the first line of the script. s iiRT(R}RTtmatchtgroupRP(t orig_scripttfirstRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs!cCs|j|t|jS(N(t_renderRR(R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt as_headerscCsDd}x7|D]/}|j|r |j|r |dd!Sq W|S(Ns"'ii(RzRC(titemt_QUOTEStq((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt _strip_quotess  cCs%tjd|D}d|dS(Ncss$|]}tj|jVqdS(N(RRRP(RR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys ss#!s (RzR{(RR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs(RRRRRRRMRbRRRRRRRRRR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs   tWindowsCommandSpeccBseZedeZRS(R(RRRRKR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRsRacBseZdZejdjZeZe d e dZ e d e dZ e d dZedZe dZe dZe dZe d d d ZRS( s` Encapsulates behavior around writing entry point scripts for console and gui apps. s # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r __requires__ = %(spec)r import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point(%(spec)r, %(group)r, %(name)r)() ) cCsMtjdt|rtntj}|jd||}|j||S(Ns Use get_argsRT(twarningsRtDeprecationWarningtWindowsScriptWriterRaRbtget_script_headerRc(RLRRtwininsttwritertheader((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytget_script_argsscCsNtjdt|rd}n|jjj|}|j||jS(NsUse get_headers python.exe(RRRtcommand_spec_classRbRRR(RLRhRRtcmd((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR!s   c cs|dkr|j}nt|j}xdD]}|d}xn|j|jD]W\}}|j||jt}|j ||||} x| D] } | VqWqZWq4WdS(s Yield write_script() argument tuples for a distribution's console_scripts and gui_scripts entry points. tconsoletguit_scriptsN(RR( RiRgR6RRt get_entry_mapRt_ensure_safe_nameRRt_get_script_args( RLRRRttype_RRtepRhRrR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRc+s   "  cCs+tjd|}|r'tdndS(s? Prevent paths in *_scripts entry point names. s[\\/]s+Path separators not allowed in script namesN(RRtsearchR(Rt has_path_sep((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR=scCs*tjdt|r tjS|jS(NsUse best(RRRRRb(RLt force_windows((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt get_writerFscCs?tjdks-tjdkr7tjdkr7tjS|SdS(sD Select the best ScriptWriter for this environment. twin32tjavaRN(RRR9Rt_nameRRb(RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbLs- ccs|||fVdS(N((RLRRRRh((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRVsRTcCs/|jjj|}|j||jS(s;Create a #! line, getting options (if any) from script_text(RRbRRR(RLRhRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRg[s N(RRRRNRORRRRRMRiRKRRRcRRRRbRRg(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas     RcBsYeZeZedZedZedZedZe dZ RS(cCstjdt|jS(NsUse best(RRRRb(RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRfscCs2tdtd|}tjjdd}||S(sC Select the best ScriptWriter suitable for Windows RtnaturaltSETUPTOOLS_LAUNCHER(RtWindowsExecutableLauncherWriterR9RR(RLt writer_lookuptlauncher((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbls  c cstdddd|}|tjdjjdkr`djt}tj|t nddd d d dd g}|j ||j ||}g|D]}||^q} ||||d | fVdS(s For Windows, add a .py extensionRs.pyaRs.pywtPATHEXTt;sK{ext} not listed in PATHEXT; scripts will not be recognized as executables.s.pys -script.pys.pycs.pyos.exeRnN( RR9RRRRRRRt UserWarningRNt_adjust_header( RLRRRRhtextRRRZR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRys"  cCsud}d}|dkr(||}}ntjtj|tj}|jd|d|}|j|rq|S|S(s Make sure 'pythonw' is used for gui and and 'python' is used for console (regardless of what sys.executable is). s pythonw.exes python.exeRRtrepl(RRRStescapet IGNORECASEtsubt _use_header(RLRt orig_headerRQRt pattern_obt new_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs cCs/|dd!jd}tjdkp.t|S(s Should _adjust_header use the replaced header? On non-windows systems, always use. On Windows systems, only use the replaced header if it resolves to an executable on the system. iit"R(RPRRR (Rt clean_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs ( RRRRRMRRbRRRR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRcs  RcBseZedZRS(c cs|dkr$d}d}dg}nd}d}dddg}|j||}g|D]} || ^qX} ||||d | fV|d t|d fVts|d } | t|d fVnd S(sG For Windows, add a .py extension and an .exe launcher Rs -script.pyws.pywtclis -script.pys.pys.pycs.pyoRns.exeR^s .exe.manifestN(Rtget_win_launcherR8tload_launcher_manifest( RLRRRRht launcher_typeRRthdrRZRtm_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs    (RRRMR(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCsGd|}tr(|jdd}n|jdd}td|S(s Load the Windows launcher (executable) suitable for launching a script. `type` should be either 'cli' or 'gui' Returns the executable as a byte string. s%s.exet.s-64.s-32.R(R8RQR (ttypet launcher_fn((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs   cCs>tjtd}tjr&|tS|jdtSdS(Nslauncher manifest.xmlsutf-8(RR RRtPY2tvarsRl(Rtmanifest((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRs  cCstj|||S(N(RZR(R:t ignore_errorstonerror((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRscCs tjd}tj||S(Ni(R9tumask(ttmp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRos cCsMddl}tjj|jd}|tjd s"                 d             A ) ) 'l   R          T `A      PK!U(e(ecommand/egg_info.pycnu[ fc@s@dZddlmZddlmZddlmZddlm Z ddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'j(Z(ddl)m*Z*ddlm+Z+dZ,defdYZ-defdYZdefdYZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6e7d Z8d!Z9d"Z:dS(#sUsetuptools.command.egg_info Create a distribution's .egg-info directory and contentsi(tFileList(tDistutilsInternalError(t convert_path(tlogN(tsix(tmap(tCommand(tsdist(t walk_revctrl(t edit_config(t bdist_egg(tparse_requirementst safe_namet parse_versiont safe_versiont yield_linest EntryPointtiter_entry_pointst to_filename(tglob(t packagingcCsd}|jtjj}tjtj}d|f}xt|D]\}}|t|dk}|dkr|r|d7}qG|d||f7}qGnd}t|} x|| krA||} | dkr||d7}nJ| d kr||7}n1| d kr!|d} | | krB|| d krB| d} n| | krk|| d krk| d} nx*| | kr|| d kr| d} qnW| | kr|tj| 7}q4||d| !} d} | dd krd } | d} n| tj| 7} |d| f7}| }n|tj| 7}|d7}qW|sG||7}qGqGW|d7}tj|dtj tj BS(s Translate a file path glob like '*.txt' in to a regular expression. This differs from fnmatch.translate which allows wildcards to match directory separators. It also knows about '**/' which matches any number of directories. ts[^%s]is**s.*s (?:%s+%s)*it*t?t[t!t]t^s[%s]s\Ztflags( tsplittostpathtseptretescapet enumeratetlentcompilet MULTILINEtDOTALL(RtpattchunksR t valid_chartctchunkt last_chunktit chunk_lentchartinner_itinnert char_class((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttranslate_pattern$sV                tegg_infocBseZdZddddgZdgZidd 6Zd ZedZej dZdZ dZ e dZ dZdZdZdZdZdZdZRS(s+create a distribution's .egg-info directorys egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)stag-datetds0Add date stamp (e.g. 20050528) to version numbers tag-build=tbs-Specify explicit tag to add to version numbersno-datetDs"Don't include date stamp [default]cCsLd|_d|_d|_d|_d|_d|_t|_d|_ dS(Ni( tNonetegg_namet egg_versiontegg_baseR5t tag_buildttag_datetFalsetbroken_egg_infotvtags(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytinitialize_optionss       cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttag_svn_revisionscCsdS(N((RCtvalue((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyREscCs@tj}|j|diR?R5N(t collectionst OrderedDictttagsR tdict(RCtfilenameR5((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytsave_version_infos  cCst|jj|_|j|_|j|_t|j}yKt |t j j }|ridnd}t t||j|jfWn3tk rtjjd|j|jfnX|jdkr|jj}|pijdtj|_n|jdt|jd|_|jtjkrXtjj|j|j|_nd|jkrt|jn|j|jj_ |jj }|dk r|j!|jj"kr|j|_#t|j|_$d|j_ ndS(Ns%s==%ss%s===%ss2Invalid distribution name or version syntax: %s-%sRR=s .egg-infot-(%R t distributiontget_nameR;RIRBttagged_versionR<R t isinstanceRtversiontVersiontlistR t ValueErrort distutilsterrorstDistutilsOptionErrorR=R:t package_dirtgetRtcurdirtensure_dirnameRR5Rtjointcheck_broken_egg_infotmetadatat _patched_disttkeytlowert_versiont_parsed_version(RCtparsed_versiont is_versiontspectdirstpd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytfinalize_optionss8!   ! !  $ cCsl|r|j|||nLtjj|rh|dkrX| rXtjd||dS|j|ndS(sWrite `data` to `filename` or delete if empty If `data` is non-empty, this routine is the same as ``write_file()``. If `data` is empty but not ``None``, this is the same as calling ``delete_file(filename)`. If `data` is ``None``, then this is a no-op unless `filename` exists, in which case a warning is issued about the orphaned file (if `force` is false), or deleted (if `force` is true). s$%s not set in setup(), but %s existsN(t write_fileRRtexistsR:Rtwarnt delete_file(RCtwhatRKtdatatforce((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_or_delete_files  cCsdtjd||tjr.|jd}n|js`t|d}|j||jndS(sWrite `data` to `filename` (if not a dry run) after announcing it `what` is used in a log message to identify what is being written to the file. swriting %s to %ssutf-8twbN( RtinfoRtPY3tencodetdry_runtopentwritetclose(RCRoRKRptf((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRks   cCs-tjd||js)tj|ndS(s8Delete `filename` (if not a dry run) after announcing its deleting %sN(RRtRwRtunlink(RCRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRns cCsE|jj}|jr4|j|jr4t|St||jS(N(RNt get_versionRBtendswithR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRPs cCs|j|j|jj}xXtdD]J}|jd||j}|||jtj j |j|jq)Wtj j |jd}tj j |r|j |n|j dS(Nsegg_info.writerst installersnative_libs.txt(tmkpathR5RNtfetch_build_eggRtrequiretresolvetnameRRR]RlRnt find_sources(RCRteptwritertnl((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytrun s  ,cCsBd}|jr||j7}n|jr>|tjd7}n|S(NRs-%Y%m%d(R>R?ttimetstrftime(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRIs   cCsJtjj|jd}t|j}||_|j|j|_dS(s"Generate SOURCES.txt manifest files SOURCES.txtN( RRR]R5tmanifest_makerRNtmanifestRtfilelist(RCtmanifest_filenametmm((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR s   cCs|jd}|jtjkr:tjj|j|}ntjj|rtjddddd||j |j |_ ||_ ndS(Ns .egg-infoRMiNs Note: Your current .egg-info directory has a '-' in its name; this will not work correctly with "setup.py develop". Please rename %s to %s to correct this problem. ( R;R=RR[RR]RlRRmR5RA(RCtbei((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR^(s   (s egg-base=R6sLdirectory containing .egg-info directories (default: top of the source tree)(stag-dateR7s0Add date stamp (e.g. 20050528) to version number(s tag-build=R8s-Specify explicit tag to add to version number(sno-dateR9s"Don't include date stamp [default](t__name__t __module__t descriptiont user_optionstboolean_optionst negative_optRDtpropertyREtsetterRLRjR@RrRkRnRPRRIRR^(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR5ws*     /       RcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZRS(cCs|j|\}}}}|dkrw|jddj|x|D](}|j|sHtjd|qHqHWnx|dkr|jddj|xO|D](}|j|stjd|qqWn|dkr/|jd dj|x|D](}|j|stjd |qqWn|d kr|jd dj|x|D](}|j|s\tjd |q\q\Wnd|dkr|jd|dj|fx5|D].}|j ||stjd||qqWn|dkr[|jd|dj|fx|D].}|j ||s&tjd||q&q&Wn|dkr|jd||j |stjd|qnR|dkr|jd||j |stjd|qnt d|dS(Ntincludesinclude t s%warning: no files found matching '%s'texcludesexclude s9warning: no previously-included files found matching '%s'sglobal-includesglobal-include s>warning: no files found matching '%s' anywhere in distributionsglobal-excludesglobal-exclude sRwarning: no previously-included files matching '%s' found anywhere in distributionsrecursive-includesrecursive-include %s %ss:warning: no files found matching '%s' under directory '%s'srecursive-excludesrecursive-exclude %s %ssNwarning: no previously-included files matching '%s' found under directory '%s'tgraftsgraft s+warning: no directories found matching '%s'tprunesprune s6no previously-included directories found matching '%s's'this cannot happen: invalid action '%s'(t_parse_template_linet debug_printR]RRRmRtglobal_includetglobal_excludetrecursive_includetrecursive_excludeRRR(RCtlinetactiontpatternstdirt dir_patterntpattern((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytprocess_template_line;sd                         cCsrt}xett|jdddD]D}||j|r&|jd|j||j|=t}q&q&W|S(s Remove all files from the file list that match the predicate. Return True if any matching files were removed iis removing (R@trangeR$tfilesRtTrue(RCt predicatetfoundR.((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt _remove_filess&  cCsHgt|D]}tjj|s |^q }|j|t|S(s#Include files that match 'pattern'.(RRRtisdirtextendtbool(RCRR{R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs1 cCst|}|j|jS(s#Exclude files that match 'pattern'.(R4Rtmatch(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs cCsftjj|d|}gt|dtD]}tjj|s+|^q+}|j|t|S(sN Include all files anywhere in 'dir/' that match the pattern. s**t recursive(RRR]RRRRR(RCRRt full_patternR{R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs  cCs.ttjj|d|}|j|jS(sM Exclude any file anywhere in 'dir/' that match the pattern. s**(R4RRR]RR(RCRRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCsOgt|D]%}tjj|D] }|^q#q }|j|t|S(sInclude all files from 'dir/'.(RRVRtfindallRR(RCRt match_dirtitemR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs % cCs+ttjj|d}|j|jS(sFilter out files from 'dir/'.s**(R4RRR]RR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCsy|jdkr|jnttjjd|}g|jD]}|j|rA|^qA}|j|t |S(s Include all files anywhere in the current directory that match the pattern. This is very inefficient on large file trees. s**N( tallfilesR:RR4RRR]RRR(RCRRR{R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs  + cCs+ttjjd|}|j|jS(sD Exclude all files anywhere that match the pattern. s**(R4RRR]RR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCsN|jdr|d }nt|}|j|rJ|jj|ndS(Ns i(R~Rt _safe_pathRtappend(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs   cCs |jjt|j|dS(N(RRtfilterR(RCtpaths((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCs"tt|j|j|_dS(s Replace self.files with only safe paths Because some owners of FileList manipulate the underlying ``files`` attribute directly, this method must be called to repair those paths. N(RTRRR(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_repairscCsd}tj|}|dkr6tjd|tStj|d}|dkrktj||dtSy,tjj |stjj |rt SWn*t k rtj||t j nXdS(Ns!'%s' not %s encodable -- skippings''%s' in unexpected encoding -- skippingsutf-8(t unicode_utilstfilesys_decodeR:RRmR@t try_encodeRRRlRtUnicodeEncodeErrortsystgetfilesystemencoding(RCRtenc_warntu_patht utf8_path((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs  $ (RRRRRRRRRRRRRRRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR8s I        RcBseeZdZdZdZdZdZdZdZe dZ dZ d Z RS( s MANIFEST.incCs(d|_d|_d|_d|_dS(Ni(t use_defaultsRt manifest_onlytforce_manifest(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRDs   cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRjscCst|_tjj|js.|jn|jtjj|jrZ|j n|j |jj |jj |jdS(N( RRRRRlRtwrite_manifestt add_defaultsttemplatet read_templatetprune_file_listtsorttremove_duplicates(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs       cCs"tj|}|jtjdS(Nt/(RRtreplaceRR (RCR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_manifest_normalizescCsb|jjg|jjD]}|j|^q}d|j}|jt|j|f|dS(so Write the file list in 'self.filelist' to the manifest file named by 'self.manifest'. swriting manifest file '%s'N(RRRRRtexecuteRk(RCR{Rtmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs ( cCs&|j|s"tj||ndS(N(t_should_suppress_warningRRm(RCR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRm$scCstjd|S(s; suppress missing-file warnings from sdist sstandard file .*not found(R!R(R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR(scCstj||jj|j|jj|jtt}|r[|jj|n"t j j |jr}|j n|j d}|jj|jdS(NR5(RRRRRRRTRRRRRlt read_manifesttget_finalized_commandRR5(RCtrcfilestei_cmd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR/s  cCsy|jd}|jj}|jj|j|jj|tjtj }|jj d|d|dddS(Ntbuilds(^|s)(RCS|CVS|\.svn)tis_regexi( RRNt get_fullnameRRt build_baseR!R"RR texclude_pattern(RCRtbase_dirR ((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR;s( RRRRDRjRRRRmt staticmethodRRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs     cCsGdj|}|jd}t|d}|j|WdQXdS(s{Create a file with the specified name and write 'contents' (a sequence of strings without line terminators) to it. s sutf-8RsN(R]RvRxRy(RKtcontentsR{((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRkEscCstjd||js|jj}|j|j|_}|j|j|_}z|j |j Wd|||_|_Xt |jdd}t j|j |ndS(Ns writing %stzip_safe(RRtRwRNR_R<RRR;Rtwrite_pkg_infoR5tgetattrR:R twrite_safety_flag(tcmdtbasenameRKR_toldvertoldnametsafe((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRRs  cCs&tjj|r"tjdndS(NssWARNING: 'depends.txt' is not used by setuptools 0.6! Use the install_requires/extras_require setup() args instead.(RRRlRRm(RRRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwarn_depends_obsoleteescCs;t|p d}d}t||}|j|dS(NcSs|dS(Ns ((R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytoR((RRt writelines(tstreamtreqstlinest append_cr((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_write_requirementsms cCs|j}tj}t||j|jp1i}x>t|D]0}|jdjt t|||qAW|j d||j dS(Ns [{extra}] t requirements( RNRtStringIORtinstall_requirestextras_requiretsortedRytformattvarsRrtgetvalue(RRRKtdistRpRtextra((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_requirementsts  cCs<tj}t||jj|jd||jdS(Nssetup-requirements(tioRRRNtsetup_requiresRrR(RRRKRp((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_setup_requirementss cCsetjg|jjD]}|jddd^q}|jd|djt|ddS(Nt.iistop-level namess (RJtfromkeysRNtiter_distribution_namesRRkR]R(RRRKtktpkgs((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_toplevel_namess2cCst|||tdS(N(t write_argR(RRRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt overwrite_argscCsgtjj|d}t|j|d}|dk rMdj|d}n|j||||dS(Nis (RRtsplitextRRNR:R]Rr(RRRKRqtargnameRF((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR s  cCs|jj}t|tjs*|dkr3|}n|dk rg}xt|jD]n\}}t|tjstj ||}dj tt t |j }n|jd||fqXWdj |}n|jd||tdS(Ns s [%s] %s Rs entry points(RNt entry_pointsRQRt string_typesR:RtitemsRt parse_groupR]RtstrtvaluesRRrR(RRRKRRptsectionR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt write_entriess   'cCs}tjdttjjdrytjdC}x9|D]1}tj d|}|r;t |j dSq;WWdQXndS(sd Get a -r### off of PKG-INFO Version in case this is an sdist of a subversion revision. s$get_pkg_info_revision is deprecated.sPKG-INFOsVersion:.*-r(\d+)\s*$iNi( twarningsRmtDeprecationWarningRRRlRRxR!Rtinttgroup(R{RR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytget_pkg_info_revisions  (;t__doc__tdistutils.filelistRt _FileListtdistutils.errorsRtdistutils.utilRRVRRR!RRRRRGtsetuptools.externRtsetuptools.extern.six.movesRt setuptoolsRtsetuptools.command.sdistRRtsetuptools.command.setoptR tsetuptools.commandR t pkg_resourcesR R R RRRRRtsetuptools.unicode_utilsRtsetuptools.globRRR4R5RRkRRRRRR R R@R RR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytsN         : SI       PK!ѽUrYYcommand/install.pycnu[ fc@sddlmZddlZddlZddlZddlZddljjZ ddl Z e jZ de jfdYZge jj D]Z e dejkre ^qeje_ dS(i(tDistutilsArgErrorNtinstallcBseZdZejjddgZejjddgZddfddfgZe eZ d Z d Z d Z d Zed ZdZRS(s7Use easy_install to install the package, w/dependenciessold-and-unmanageablesTry not to use this!s!single-version-externally-manageds5used by system package builders to create 'flat' eggstinstall_egg_infocCstS(N(tTrue(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pytttinstall_scriptscCstS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRRcCs&tjj|d|_d|_dS(N(torigRtinitialize_optionstNonetold_and_unmanageablet!single_version_externally_managed(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR s cCsXtjj||jr%t|_n/|jrT|j rT|j rTtdqTndS(NsAYou must specify --record or --root when building system packages(RRtfinalize_optionstrootRR trecordR(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR %s   cCs8|js|jr"tjj|Sd|_d|_dS(NR(RR RRthandle_extra_pathR t path_filet extra_dirs(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR0s cCsX|js|jr"tjj|S|jtjsJtjj|n |jdS(N( R R RRtrunt_called_from_setuptinspectt currentframetdo_egg_install(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR:s cCs|d krKd}tj|tjdkrGd}tj|ntStj|d}|d \}tj|}|j j dd}|dko|j d kS( s Attempt to detect whether run() was called from setup() or by another command. If called by setup(), the parent caller will be the 'run_command' method in 'distutils.dist', and *its* caller will be the 'run_commands' method. If called any other way, the immediate caller *might* be 'run_command', but it won't have been called by 'run_commands'. Return True in that case or if a call stack is unavailable. Return False otherwise. s4Call stack not available. bdist_* commands may fail.t IronPythons6For best results, pass -X:Frames to enable call stack.iit__name__Rsdistutils.distt run_commandsN( R twarningstwarntplatformtpython_implementationRRtgetouterframest getframeinfot f_globalstgettfunction(t run_frametmsgtrestcallertinfot caller_module((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyREs    cCs|jjd}||jddd|jd|j}|jd|_|jjtjd|j d|jj dj g}t j r|jd t j n||_|jdt _ dS( Nt easy_installtargstxRRt.s*.eggt bdist_eggi(t distributiontget_command_classRRtensure_finalizedtalways_copy_fromt package_indextscantglobt run_commandtget_command_objt egg_outputt setuptoolstbootstrap_install_fromtinsertR+RR (RR*tcmdR+((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR`s$      N(sold-and-unmanageableNsTry not to use this!(s!single-version-externally-managedNs5used by system package builders to create 'flat' eggs(Rt __module__t__doc__RRt user_optionsR tboolean_optionst new_commandstdictt_ncR R RRt staticmethodRR(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRs         i(tdistutils.errorsRRR5RRtdistutils.command.installtcommandRRR9t_installt sub_commandsR<RCRA(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyts      l/PK!(q q command/install_egg_info.pycnu[ fc@s~ddlmZmZddlZddlmZddlmZddlmZddl Z dej efdYZ dS(i(tlogtdir_utilN(tCommand(t namespaces(tunpack_archivetinstall_egg_infocBsJeZdZdZd gZdZdZdZdZdZ RS( s.Install an .egg-info directory for the packages install-dir=tdsdirectory to install tocCs d|_dS(N(tNonet install_dir(tself((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytinitialize_optionsscCs{|jdd|jd}tjdd|j|jjd}|j|_t j j |j ||_ g|_dS(Nt install_libRtegg_infos .egg-info(RR(tset_undefined_optionstget_finalized_commandt pkg_resourcest DistributionRtegg_namet egg_versionR tsourcetostpathtjoinRttargettoutputs(R tei_cmdtbasename((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytfinalize_optionss  cCs|jdtjj|jrTtjj|j rTtj|jd|jn;tjj |jr|j tj |jfd|jn|jst j |jn|j |jdd|j|jf|jdS(NR tdry_runs Removing sCopying %s to %s((t run_commandRRtisdirRtislinkRt remove_treeRtexiststexecutetunlinkRtensure_directorytcopytreeRtinstall_namespaces(R ((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytrun!s +&  cCs|jS(N(R(R ((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyt get_outputs.scs)fd}tjj|dS(Ncs[x1dD])}|j|s,d||krdSqWjj|tjd|||S(Ns.svn/sCVS/t/sCopying %s to %s(s.svn/sCVS/(t startswithRRtappendRtdebug(tsrctdsttskip(R (sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytskimmer3s  (RRR(R R0((R sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR%1s (s install-dir=Rsdirectory to install to( t__name__t __module__t__doc__t descriptiont user_optionsR RR'R(R%(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR s   ( t distutilsRRRt setuptoolsRRtsetuptools.archive_utilRRt InstallerR(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyts   PK!command/install_lib.pyonu[ fc@s]ddlZddlZddlmZmZddljjZdejfdYZdS(iN(tproducttstarmapt install_libcBsneZdZdZdZdZedZdZedZ ddddd Z d Z RS( s9Don't add compiled flags to filenames of non-Python filescCs6|j|j}|dk r2|j|ndS(N(tbuildtinstalltNonet byte_compile(tselftoutfiles((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytrun s   csGfdjD}t|j}ttj|S(s Return a collections.Sized collections.Container of paths to be excluded for single_version_externally_managed installations. c3s+|]!}j|D] }|VqqdS(N(t _all_packages(t.0tns_pkgtpkg(R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pys s(t_get_SVEM_NSPsRt_gen_exclusion_pathstsetRt_exclude_pkg_path(Rt all_packagest excl_specs((RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytget_exclusionss cCs,|jd|g}tjj|j|S(sw Given a package name and exclusion path within that package, compute the full exclusion path. t.(tsplittostpathtjoint install_dir(RR texclusion_pathtparts((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRsccs.x'|r)|V|jd\}}}qWdS(sn >>> list(install_lib._all_packages('foo.bar.baz')) ['foo.bar.baz', 'foo.bar', 'foo'] RN(t rpartition(tpkg_nametseptchild((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR 's cCs<|jjsgS|jd}|j}|r8|jjSgS(s Get namespace packages (list) but only for single_version_externally_managed installations and empty otherwise. R(t distributiontnamespace_packagestget_finalized_commandt!single_version_externally_managed(Rt install_cmdtsvem((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR1s   ccsidVdVdVttds"dStjjddtj}|dV|d V|d V|d VdS( sk Generate file paths to be excluded for namespace packages (bytecode cache files). s __init__.pys __init__.pycs __init__.pyotget_tagNt __pycache__s __init__.s.pycs.pyos .opt-1.pycs .opt-2.pyc(thasattrtimpRRRR'(tbase((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRAs   iic sw|js(tjj|||Sddlm}ddlmgfd}||||S(Ni(tunpack_directory(tlogcsP|kr jd|tSjd|tjj|j||S(Ns/Skipping installation of %s (namespace package)scopying %s -> %s(twarntFalsetinfoRRtdirnametappend(tsrctdst(texcludeR-R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytpfgs   (RtorigRt copy_treetsetuptools.archive_utilR,t distutilsR-( Rtinfiletoutfilet preserve_modetpreserve_timestpreserve_symlinkstlevelR,R6((R5R-RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR8Vs  cCsKtjj|}|j}|rGg|D]}||kr+|^q+S|S(N(R7Rt get_outputsR(RtoutputsR5tf((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRAts  #( t__name__t __module__t__doc__R RRt staticmethodR RRR8RA(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRs    ( RR*t itertoolsRRtdistutils.command.install_libtcommandRR7(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyts  PK! +K K command/install_scripts.pycnu[ fc@ssddlmZddljjZddlZddlZddlm Z m Z m Z dejfdYZdS(i(tlogN(t Distributiont PathMetadatatensure_directorytinstall_scriptscBs,eZdZdZdZddZRS(s;Do normal script install, plus any egg_info wrapper scriptscCstjj|t|_dS(N(torigRtinitialize_optionstFalsetno_ep(tself((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR sc Csfddljj}|jd|jjr>tjj|n g|_ |j rTdS|j d}t |j t|j |j|j|j}|j d}t|dd}|j d}t|dt}|j}|rd}|j}n|tjkr|g}n|j}|jjj|} x-|j|| jD]} |j| qKWdS(Nitegg_infot build_scriptst executablet bdist_wininstt _is_runnings python.exe(tsetuptools.command.easy_installtcommandt easy_installt run_commandt distributiontscriptsRRtruntoutfilesRtget_finalized_commandRtegg_baseRR tegg_namet egg_versiontgetattrtNoneRt ScriptWritertWindowsScriptWritertsysR tbesttcommand_spec_classt from_paramtget_argst as_headert write_script( R teitei_cmdtdisttbs_cmdt exec_paramtbw_cmdt is_wininsttwritertcmdtargs((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyRs2        ttc Gsddlm}m}tjd||jtjj|j|}|j j ||}|j st |t |d|} | j|| j||d|ndS(s1Write an executable file to the scripts directoryi(tchmodt current_umasksInstalling %s script to %stwiN(RR1R2Rtinfot install_dirtostpathtjoinRtappendtdry_runRtopentwritetclose( R t script_nametcontentstmodetignoredR1R2ttargettmasktf((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR%3s     (t__name__t __module__t__doc__RRR%(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR s  #( t distutilsRt!distutils.command.install_scriptsRRRR6Rt pkg_resourcesRRR(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyts   PK! +K K command/install_scripts.pyonu[ fc@ssddlmZddljjZddlZddlZddlm Z m Z m Z dejfdYZdS(i(tlogN(t Distributiont PathMetadatatensure_directorytinstall_scriptscBs,eZdZdZdZddZRS(s;Do normal script install, plus any egg_info wrapper scriptscCstjj|t|_dS(N(torigRtinitialize_optionstFalsetno_ep(tself((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR sc Csfddljj}|jd|jjr>tjj|n g|_ |j rTdS|j d}t |j t|j |j|j|j}|j d}t|dd}|j d}t|dt}|j}|rd}|j}n|tjkr|g}n|j}|jjj|} x-|j|| jD]} |j| qKWdS(Nitegg_infot build_scriptst executablet bdist_wininstt _is_runnings python.exe(tsetuptools.command.easy_installtcommandt easy_installt run_commandt distributiontscriptsRRtruntoutfilesRtget_finalized_commandRtegg_baseRR tegg_namet egg_versiontgetattrtNoneRt ScriptWritertWindowsScriptWritertsysR tbesttcommand_spec_classt from_paramtget_argst as_headert write_script( R teitei_cmdtdisttbs_cmdt exec_paramtbw_cmdt is_wininsttwritertcmdtargs((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyRs2        ttc Gsddlm}m}tjd||jtjj|j|}|j j ||}|j st |t |d|} | j|| j||d|ndS(s1Write an executable file to the scripts directoryi(tchmodt current_umasksInstalling %s script to %stwiN(RR1R2Rtinfot install_dirtostpathtjoinRtappendtdry_runRtopentwritetclose( R t script_nametcontentstmodetignoredR1R2ttargettmasktf((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR%3s     (t__name__t __module__t__doc__RRR%(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR s  #( t distutilsRt!distutils.command.install_scriptsRRRR6Rt pkg_resourcesRRR(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyts   PK! command/py36compat.pycnu[ fc@sddlZddlmZddlmZddlmZddlmZdd dYZe ejdrdd d YZndS( iN(tglob(t convert_path(tsdist(tfiltertsdist_add_defaultscBseeZdZdZedZdZdZdZdZ dZ dZ d Z RS( s Mix-in providing forward-compatibility for functionality as found in distutils on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. Instead, override in the subclass. cCsJ|j|j|j|j|j|j|jdS(s9Add all the default files to self.filelist: - README or README.txt - setup.py - test/test*.py - all pure Python modules mentioned in setup script - all files pointed by package_data (build_py) - all files defined in data_files. - all files defined as scripts. - all C sources listed as part of extensions or C libraries in the setup script (doesn't catch C headers!) Warns if (README or README.txt) or setup.py are missing; everything else is optional. N(t_add_defaults_standardst_add_defaults_optionalt_add_defaults_pythont_add_defaults_data_filest_add_defaults_extt_add_defaults_c_libst_add_defaults_scripts(tself((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt add_defaultss      cCsStjj|stStjj|}tjj|\}}|tj|kS(s Case-sensitive path existence check >>> sdist_add_defaults._cs_path_exists(__file__) True >>> sdist_add_defaults._cs_path_exists(__file__.upper()) False (tostpathtexiststFalsetabspathtsplittlistdir(tfspathRt directorytfilename((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt_cs_path_exists(s cCs|j|jjg}x|D]}t|tr|}t}x7|D]/}|j|rDt}|jj |PqDqDW|s|j ddj |qq|j|r|jj |q|j d|qWdS(Ns,standard file not found: should have one of s, sstandard file '%s' not found( tREADMESt distributiont script_namet isinstancettupleRRtTruetfilelisttappendtwarntjoin(R t standardstfntaltstgot_it((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR9s    cCsLddg}x9|D]1}ttjjt|}|jj|qWdS(Ns test/test*.pys setup.cfg(RRRtisfileRRtextend(R toptionaltpatterntfiles((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRNs  cCs|jd}|jjr7|jj|jnxM|jD]B\}}}}x-|D]%}|jjtj j ||qZWqAWdS(Ntbuild_py( tget_finalized_commandRthas_pure_modulesRR(tget_source_filest data_filesR RRR"(R R,tpkgtsrc_dirt build_dirt filenamesR((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRTs  cCs|jjrx|jjD]}t|tret|}tjj|r|j j |qq|\}}x?|D]7}t|}tjj|rx|j j |qxqxWqWndS(N( Rthas_data_filesR0RtstrRRRR'RR (R titemtdirnameR4tf((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRds    cCs;|jjr7|jd}|jj|jndS(Nt build_ext(Rthas_ext_modulesR-RR(R/(R R:((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR uscCs;|jjr7|jd}|jj|jndS(Nt build_clib(Rthas_c_librariesR-RR(R/(R R<((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR zscCs;|jjr7|jd}|jj|jndS(Nt build_scripts(Rt has_scriptsR-RR(R/(R R>((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR s( t__name__t __module__t__doc__R t staticmethodRRRRRR R R (((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR s       RcBseZRS((R@RA(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRs((( RRtdistutils.utilRtdistutils.commandRtsetuptools.extern.six.movesRRthasattr(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyts |PK!~command/register.pycnu[ fc@s/ddljjZdejfdYZdS(iNtregistercBseZejjZdZRS(cCs!|jdtjj|dS(Ntegg_info(t run_commandtorigRtrun(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs (t__name__t __module__RRt__doc__R(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs (tdistutils.command.registertcommandRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pytsPK!ACiicommand/saveopts.pycnu[ fc@s0ddlmZmZdefdYZdS(i(t edit_configt option_basetsaveoptscBseZdZdZdZRS(s#Save command-line options to a files7save supplied options to setup.cfg or other config filecCs|j}i}xt|jD]i}|dkr1qnxN|j|jD]7\}\}}|dkrG||j|i|sPK!Gi2command/setopt.pycnu[ fc@sddlmZddlmZddlmZddlZddlZddlmZddl m Z ddd d gZ d d Z e d Zd e fdYZd efdYZdS(i(t convert_path(tlog(tDistutilsOptionErrorN(t configparser(tCommandt config_filet edit_configt option_basetsetopttlocalcCs|dkrdS|dkr>tjjtjjtjdS|dkrtjdkr_dpbd}tjjtd |St d |d S( sGet the filename of the distutils, local, global, or per-user config `kind` must be one of "local", "global", or "user" R s setup.cfgtglobals distutils.cfgtusertposixt.ts~/%spydistutils.cfgs7config_file() type must be 'local', 'global', or 'user'N( tostpathtjointdirnamet distutilst__file__tnamet expanduserRt ValueError(tkindtdot((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRs    c Cstjd|tj}|j|gx+|jD]\}}|d krttjd|||j|q9|j |stjd|||j |nx|jD]\}}|d kr&tjd||||j |||j |sRtjd|||j|qRqtjd|||||j |||qWq9Wtjd||st|d}|j|Wd QXnd S( sYEdit a configuration file to include `settings` `settings` is a dictionary of dictionaries or ``None`` values, keyed by command/section name. A ``None`` value means to delete the entire section, while a dictionary lists settings to be changed or deleted in that section. A setting of ``None`` means to delete that setting. sReading configuration from %ssDeleting section [%s] from %ssAdding new section [%s] to %ssDeleting %s.%s from %ss#Deleting empty [%s] section from %ssSetting %s.%s to %r in %ss Writing %stwN(RtdebugRtRawConfigParsertreadtitemstNonetinfotremove_sectiont has_sectiont add_sectiont remove_optiontoptionstsettopentwrite( tfilenametsettingstdry_runtoptstsectionR%toptiontvaluetf((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR!s8      cBs;eZdZd d dgZddgZd Zd ZRS(s<Abstract base class for commands that mess with config filess global-configtgs0save options to the site-wide distutils.cfg files user-configtus7save options to the current user's pydistutils.cfg files filename=R0s-configuration file to use (default=setup.cfg)cCsd|_d|_d|_dS(N(Rt global_configt user_configR)(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytinitialize_options\s  cCsg}|jr%|jtdn|jrD|jtdn|jdk rf|j|jn|s|jtdnt|dkrtd|n|\|_dS(NR R R is/Must specify only one configuration file option(R3tappendRR4R)RtlenR(R5t filenames((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytfinalize_optionsas   (s global-configR1s0save options to the site-wide distutils.cfg file(s user-configR2s7save options to the current user's pydistutils.cfg file(s filename=R0s-configuration file to use (default=setup.cfg)(t__name__t __module__t__doc__t user_optionstboolean_optionsR6R:(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRLs   cBsXeZdZdZddddgejZejd gZdZdZdZ RS(s#Save command-line options to a files1set an option in setup.cfg or another config filescommand=tcscommand to set an option forsoption=tos option to sets set-value=tssvalue of the optiontremovetrsremove (unset) the valuecCs5tj|d|_d|_d|_d|_dS(N(RR6RtcommandR.t set_valueRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR6s     cCsftj||jdks+|jdkr:tdn|jdkrb|j rbtdndS(Ns%Must specify --command *and* --options$Must specify --set-value or --remove(RR:RERR.RRFRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR:s  cCs=t|jii|j|jjdd6|j6|jdS(Nt-t_(RR)RFR.treplaceRER+(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytruns #(scommand=R@scommand to set an option for(soption=RAs option to set(s set-value=RBsvalue of the option(RCRDsremove (unset) the value( R;R<R=t descriptionRR>R?R6R:RJ(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRss   (tdistutils.utilRRRtdistutils.errorsRRtsetuptools.extern.six.movesRt setuptoolsRt__all__RtFalseRRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyts    +'PK!Gl((command/test.pycnu[ fc@s:ddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddlm Z ddl m Z ddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZd e fd YZd efd YZd efdYZ dS(iN(tDistutilsErrortDistutilsOptionError(tlog(t TestLoader(tsix(tmaptfilter( tresource_listdirtresource_existstnormalize_patht working_sett_namespace_packagestevaluate_markertadd_activation_listenertrequiret EntryPoint(tCommandtScanningLoadercBseZdZddZRS(cCstj|t|_dS(N(Rt__init__tsett_visited(tself((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs cCs7||jkrd S|jj|g}|jtj||t|drg|j|jnt|dr xt|j dD]|}|j dr|dkr|j d|d }n-t |j |dr|j d|}nq|j|j |qWnt |d kr+|j|S|d Sd S( sReturn a suite of all tests cases contained in the given module If the module is a package, load tests from all the modules in it. If the module has an ``additional_tests`` function, call it and add the return value to the tests. tadditional_testst__path__ts.pys __init__.pyt.is /__init__.pyiiN(RtNonetaddtappendRtloadTestsFromModulethasattrRRt__name__tendswithRtloadTestsFromNametlent suiteClass(Rtmoduletpatterntteststfilet submodule((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs$ N(Rt __module__RRR(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs tNonDataPropertycBseZdZddZRS(cCs ||_dS(N(tfget(RR+((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR>scCs|dkr|S|j|S(N(RR+(Rtobjtobjtype((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt__get__As N(RR)RRR.(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR*=s ttestcBseZdZdZdddgZd Zd Zed ZdZ dZ e j gdZ ee j dZedZdZdZedZedZRS(s.Command to run unit tests after in-place builds#run unit tests after in-place builds test-module=tms$Run 'test_suite' in specified modules test-suite=tss9Run single test, case or suite (e.g. 'module.test_suite')s test-runner=trsTest runner to usecCs(d|_d|_d|_d|_dS(N(Rt test_suitet test_modulet test_loadert test_runner(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytinitialize_optionsSs   cCs|jr'|jr'd}t|n|jdkrj|jdkrW|jj|_qj|jd|_n|jdkrt|jdd|_n|jdkrd|_n|jdkrt|jdd|_ndS(Ns1You may specify a module or a suite, but not boths .test_suiteR5s&setuptools.command.test:ScanningLoaderR6(R3R4RRt distributionR5tgetattrR6(Rtmsg((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytfinalize_optionsYs cCst|jS(N(tlistt _test_args(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt test_argslsccsJ|j r!tjdkr!dVn|jr2dVn|jrF|jVndS(Niitdiscovers --verbose(ii(R3tsyst version_infotverbose(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR=ps   cCs|j |WdQXdS(sI Backward compatibility for project_on_sys_path context. N(tproject_on_sys_path(Rtfunc((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytwith_project_on_sys_pathxs c cstjot|jdt}|r|jddd|jd|jd}t|j }|jdd||jd|jddd|jdn-|jd|jddd|jd|jd}t j }t j j }zut|j}t j jd|tjtd td |j|jf|j|g dVWdQXWd|t j (t j jt j j|tjXdS( Ntuse_2to3tbuild_pytinplaceitegg_infotegg_baset build_exticSs |jS(N(tactivate(tdist((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytRs%s==%s(RtPY3R9R8tFalsetreinitialize_commandt run_commandtget_finalized_commandR t build_libR@tpathtmodulestcopyRJtinsertR RR Rtegg_namet egg_versiontpaths_on_pythonpathtcleartupdate( Rt include_distst with_2to3tbpy_cmdt build_pathtei_cmdtold_patht old_modulest project_path((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRCs8         ccst}tjjd|}tjjdd}zXtjj|}td||g}tjj|}|r|tjds (tfetch_build_eggstinstall_requirest tests_requiretextras_requiretitemst itertoolstchain(RMtir_dttr_dter_d((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt install_distss c Cs|j|j}dj|j}|jrB|jd|dS|jd|ttjd|}|j |"|j |j WdQXWdQXdS(Nt sskipping "%s" (dry run)s running "%s"tlocation( RR8Rlt_argvtdry_runtannounceRtoperatort attrgetterR[RCt run_tests(Rtinstalled_diststcmdRn((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytruns  c CsEtjrt|jdtr|jjdd}|tkrg}|tj kre|j |n|d7}x0tj D]%}|j |ry|j |qyqyWt t tj j|qntjdd|jd|j|jd|j|jdt}|jjsAd|j}|j|tjt|ndS(NRFRit testLoadert testRunnertexitsTest failed: %s(RROR9R8RPR3tsplitR R@RVRRvR<Rt __delitem__tunittesttmainRRt_resolve_as_epR5R6tresultt wasSuccessfulRRtERRORR(RR$t del_modulestnameR/R:((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs(    cCsdg|jS(NR(R>(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRscCs0|dkrdStjd|}|jS(su Load the indicated attribute value, called, as a as if it were specified as an entry point. Nsx=(RRtparsetresolve(tvaltparsed((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs (s test-module=R0s$Run 'test_suite' in specified module(s test-suite=R1s9Run single test, case or suite (e.g. 'module.test_suite')(s test-runner=R2sTest runner to use(RR)t__doc__t descriptiont user_optionsR7R;R*R>R=REt contextlibtcontextmanagerRCt staticmethodR[RRRtpropertyRR(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR/Gs(     -  (!RhRR@RRRtdistutils.errorsRRt distutilsRRtsetuptools.externRtsetuptools.extern.six.movesRRt pkg_resourcesRRR R R R R RRt setuptoolsRRRgR*R/(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyts      @) PK!tddcommand/upload.pycnu[ fc@s9ddlZddlmZdejfdYZdS(iN(tuploadRcBs)eZdZdZdZdZRS(sa Override default upload behavior to obtain password in a variety of different ways. cCsPtjj||jp"tj|_|jpF|jpF|j|_dS(N( torigRtfinalize_optionstusernametgetpasstgetusertpasswordt_load_password_from_keyringt_prompt_for_password(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyR s    cCs>y&td}|j|j|jSWntk r9nXdS(sM Attempt to load password from keyring. Suppress Exceptions. tkeyringN(t __import__t get_passwordt repositoryRt Exception(R R ((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs   cCs,ytjSWnttfk r'nXdS(sH Prompt for a password on the tty. Suppress Exceptions. N(RRtKeyboardInterrupt(R ((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyR#s(t__name__t __module__t__doc__RRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs  (Rtdistutils.commandRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyts PK!gcommand/upload_docs.pycnu[ fc@sdZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZddlmZd d lmZd Zd efd YZdS(spupload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). i(tstandard_b64encode(tlog(tDistutilsOptionErrorN(tsix(t http_clientturllib(titer_entry_pointsi(tuploadcCs%tjrdnd}|jd|S(Ntsurrogateescapetstrictsutf-8(RtPY3tencode(tsterrors((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_encodest upload_docscBseZdZdZdddejfddgZejZd Zd efgZ d Z d Z d Z dZ edZedZdZRS(shttps://pypi.python.org/pypi/sUpload documentation to PyPIs repository=trsurl of repository [default: %s]s show-responses&display full response text from servers upload-dir=sdirectory to uploadcCs1|jdkr-xtddD]}tSWndS(Nsdistutils.commandst build_sphinx(t upload_dirtNoneRtTrue(tselftep((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt has_sphinx/sRcCs#tj|d|_d|_dS(N(Rtinitialize_optionsRRt target_dir(R((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR6s  cCstj||jdkrs|jrF|jd}|j|_q|jd}tj j |j d|_n|j d|j|_d|j krtjdn|jd|jdS(NRtbuildtdocsRspypi.python.orgs3Upload_docs command is deprecated. Use RTD instead.sUsing upload directory %s(Rtfinalize_optionsRRRtget_finalized_commandtbuilder_target_dirRtostpathtjoint build_basetensure_dirnamet repositoryRtwarntannounce(RRR((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR;s    c Cstj|d}z|j|jxtj|jD]\}}}||jkry| ryd}t||jnxj|D]b}tjj||}|t |jj tjj } tjj| |} |j || qWq8WWd|j XdS(Ntws'no files found in upload directory '%s'(tzipfiletZipFiletmkpathRRtwalkRR R!tlentlstriptseptwritetclose( Rtfilenametzip_filetroottdirstfilesttmpltnametfulltrelativetdest((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytcreate_zipfileKs" "cCsx!|jD]}|j|q Wtj}|jjj}tjj |d|}z|j ||j |Wdt j |XdS(Ns%s.zip(tget_sub_commandst run_commandttempfiletmkdtempt distributiontmetadatatget_nameRR R!R;t upload_filetshutiltrmtree(Rtcmd_namettmp_dirR7R2((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytrun[s  ccs|\}}d|}t|ts1|g}nx|D]x}t|trl|d|d7}|d}n t|}|Vt|VdV|V|r8|ddkr8dVq8q8WdS( Ns* Content-Disposition: form-data; name="%s"s; filename="%s"iis is s (t isinstancetlistttupleR(titemt sep_boundarytkeytvaluesttitletvalue((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt _build_partis       c Csd}d|}|d}|df}tj|jd|}t||j}tjj|}tj||} d|jd} dj | | fS( s= Build up the MIME payload for the POST data s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s--s RMs multipart/form-data; boundary=%stasciit( t functoolstpartialRRtmaptitemst itertoolstchaint from_iterabletdecodeR!( tclstdatatboundaryRMt end_boundaryt end_itemstbuildert part_groupstpartst body_itemst content_type((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_build_multipart}s     cCst|d}|j}WdQX|jj}idd6|jd6tjj||fd6}t|j d|j }t |}t j r|jd}nd|}|j|\}} d |j} |j| tjtjj|j\} } } }}}| r| r| s%t| d krCtj| }n.| d kratj| }ntd | d }yw|j|jd| | }|jd||jdtt||jd||j |j!|Wn0t"j#k r }|jt|tj$dSX|j%}|j&dkrhd|j&|j'f} |j| tjn|j&dkr|j(d}|dkrd|j}nd|} |j| tjn)d|j&|j'f} |j| tj$|j*rdd|jddfGHndS(Ntrbt doc_uploads:actionR7tcontentt:RSsBasic sSubmitting documentation to %sthttpthttpssunsupported schema RTtPOSTs Content-typesContent-lengtht AuthorizationisServer response (%s): %si-tLocationshttps://pythonhosted.org/%s/sUpload successful. Visit %ssUpload failed (%s): %st-iK(+topentreadR@RARBRR tbasenameRtusernametpasswordRRR R\RgR$R&RtINFORtparseturlparsetAssertionErrorRtHTTPConnectiontHTTPSConnectiontconnectt putrequestt putheadertstrR,t endheaderstsendtsocketterrortERRORt getresponsetstatustreasont getheaderRt show_response(RR1tfRjtmetaR^t credentialstauthtbodytcttmsgtschematnetlocturltparamstqueryt fragmentstconnRfteRtlocation((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRCsb      '        N(s show-responseNs&display full response text from server(s upload-dir=Nsdirectory to upload(t__name__t __module__tDEFAULT_REPOSITORYt descriptionRRt user_optionstboolean_optionsRt sub_commandsRRR;RHt staticmethodRRt classmethodRgRC(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRs"        (t__doc__tbase64Rt distutilsRtdistutils.errorsRRRR(R>RDRYRUtsetuptools.externRtsetuptools.extern.six.movesRRt pkg_resourcesRRRR(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyts         PK!-υcommand/upload_docs.pyonu[ fc@sdZddlmZddlmZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZddlmZd d lmZd Zd efd YZdS(spupload_docs Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). i(tstandard_b64encode(tlog(tDistutilsOptionErrorN(tsix(t http_clientturllib(titer_entry_pointsi(tuploadcCs%tjrdnd}|jd|S(Ntsurrogateescapetstrictsutf-8(RtPY3tencode(tsterrors((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_encodest upload_docscBseZdZdZdddejfddgZejZd Zd efgZ d Z d Z d Z dZ edZedZdZRS(shttps://pypi.python.org/pypi/sUpload documentation to PyPIs repository=trsurl of repository [default: %s]s show-responses&display full response text from servers upload-dir=sdirectory to uploadcCs1|jdkr-xtddD]}tSWndS(Nsdistutils.commandst build_sphinx(t upload_dirtNoneRtTrue(tselftep((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt has_sphinx/sRcCs#tj|d|_d|_dS(N(Rtinitialize_optionsRRt target_dir(R((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR6s  cCstj||jdkrs|jrF|jd}|j|_q|jd}tj j |j d|_n|j d|j|_d|j krtjdn|jd|jdS(NRtbuildtdocsRspypi.python.orgs3Upload_docs command is deprecated. Use RTD instead.sUsing upload directory %s(Rtfinalize_optionsRRRtget_finalized_commandtbuilder_target_dirRtostpathtjoint build_basetensure_dirnamet repositoryRtwarntannounce(RRR((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR;s    c Cstj|d}z|j|jxtj|jD]\}}}||jkry| ryd}t||jnxj|D]b}tjj||}|t |jj tjj } tjj| |} |j || qWq8WWd|j XdS(Ntws'no files found in upload directory '%s'(tzipfiletZipFiletmkpathRRtwalkRR R!tlentlstriptseptwritetclose( Rtfilenametzip_filetroottdirstfilesttmpltnametfulltrelativetdest((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytcreate_zipfileKs" "cCsx!|jD]}|j|q Wtj}|jjj}tjj |d|}z|j ||j |Wdt j |XdS(Ns%s.zip(tget_sub_commandst run_commandttempfiletmkdtempt distributiontmetadatatget_nameRR R!R;t upload_filetshutiltrmtree(Rtcmd_namettmp_dirR7R2((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytrun[s  ccs|\}}d|}t|ts1|g}nx|D]x}t|trl|d|d7}|d}n t|}|Vt|VdV|V|r8|ddkr8dVq8q8WdS( Ns* Content-Disposition: form-data; name="%s"s; filename="%s"iis is s (t isinstancetlistttupleR(titemt sep_boundarytkeytvaluesttitletvalue((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt _build_partis       c Csd}d|}|d}|df}tj|jd|}t||j}tjj|}tj||} d|jd} dj | | fS( s= Build up the MIME payload for the POST data s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s--s RMs multipart/form-data; boundary=%stasciit( t functoolstpartialRRtmaptitemst itertoolstchaint from_iterabletdecodeR!( tclstdatatboundaryRMt end_boundaryt end_itemstbuildert part_groupstpartst body_itemst content_type((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_build_multipart}s     cCst|d}|j}WdQX|jj}idd6|jd6tjj||fd6}t|j d|j }t |}t j r|jd}nd|}|j|\}} d |j} |j| tjtjj|j\} } } }}}| d kr(tj| }n.| d krFtj| }ntd | d }yw|j|jd| | }|jd||jdtt||jd||j |j!|Wn0t"j#k r}|jt|tj$dSX|j%}|j&dkrMd|j&|j'f} |j| tjn|j&dkr|j(d}|dkrd|j}nd|} |j| tjn)d|j&|j'f} |j| tj$|j*rdd|jddfGHndS(Ntrbt doc_uploads:actionR7tcontentt:RSsBasic sSubmitting documentation to %sthttpthttpssunsupported schema RTtPOSTs Content-typesContent-lengtht AuthorizationisServer response (%s): %si-tLocationshttps://pythonhosted.org/%s/sUpload successful. Visit %ssUpload failed (%s): %st-iK(+topentreadR@RARBRR tbasenameRtusernametpasswordRRR R\RgR$R&RtINFORtparseturlparseRtHTTPConnectiontHTTPSConnectiontAssertionErrortconnectt putrequestt putheadertstrR,t endheaderstsendtsocketterrortERRORt getresponsetstatustreasont getheaderRt show_response(RR1tfRjtmetaR^t credentialstauthtbodytcttmsgtschematnetlocturltparamstqueryt fragmentstconnRfteRtlocation((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRCs`      '        N(s show-responseNs&display full response text from server(s upload-dir=Nsdirectory to upload(t__name__t __module__tDEFAULT_REPOSITORYt descriptionRRt user_optionstboolean_optionsRt sub_commandsRRR;RHt staticmethodRRt classmethodRgRC(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRs"        (t__doc__tbase64Rt distutilsRtdistutils.errorsRRRR(R>RDRYRUtsetuptools.externRtsetuptools.extern.six.movesRRt pkg_resourcesRRRR(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyts         PK!'zzcommand/bdist_rpm.pyonu[ fc@s/ddljjZdejfdYZdS(iNt bdist_rpmcBs eZdZdZdZRS(sf Override the default bdist_rpm behavior to do the following: 1. Run egg_info to ensure the name and version are properly calculated. 2. Always run 'install' using --single-version-externally-managed to disable eggs in RPM distributions. 3. Replace dash with underscore in the version numbers for better RPM compatibility. cCs!|jdtjj|dS(Ntegg_info(t run_commandtorigRtrun(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs c Cs|jj}|jdd}tjj|}d|}d|}g|D]<}|jddjddjdd j||^qN}|j|d }d |}|j|||S( Nt-t_s%define version sSource0: %{name}-%{version}.tars)Source0: %{name}-%{unmangled_version}.tarssetup.py install s5setup.py install --single-version-externally-managed s%setups&%setup -n %{name}-%{unmangled_version}is%define unmangled_version (t distributiont get_versiontreplaceRRt_make_spec_filetindextinsert( Rtversiont rpmversiontspectline23tline24tlinet insert_loctunmangled_version((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyR s   F (t__name__t __module__t__doc__RR (((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs  (tdistutils.command.bdist_rpmtcommandRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pytsPK!command/bdist_wininst.pyonu[ fc@s/ddljjZdejfdYZdS(iNt bdist_wininstcBseZddZdZRS(icCs1|jj||}|dkr-d|_n|S(sj Supplement reinitialize_command to work around http://bugs.python.org/issue20819 tinstallt install_lib(RRN(t distributiontreinitialize_commandtNoneR(tselftcommandtreinit_subcommandstcmd((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs     cCs.t|_ztjj|Wdt|_XdS(N(tTruet _is_runningtorigRtruntFalse(R((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyR s (t__name__t __module__RR (((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs (tdistutils.command.bdist_wininstRRR (((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pytsPK!]  command/build_clib.pycnu[ fc@s_ddljjZddlmZddlmZddlm Z dejfdYZdS(iN(tDistutilsSetupError(tlog(tnewer_pairwise_groupt build_clibcBseZdZdZRS(sv Override the default build_clib behaviour to do the following: 1. Implement a rudimentary timestamp-based dependency system so 'compile()' doesn't run every time. 2. Add more keys to the 'build_info' dictionary: * obj_deps - specify dependencies for each object compiled. this should be a dictionary mapping a key with the source filename to a list of dependencies. Use an empty string for global dependencies. * cflags - specify a list of additional flags to pass to the compiler. c Cs4x-|D]%\}}|jd}|dksDt|ttf rWtd|nt|}tjd||jdt}t|tstd|ng}|jdt}t|ttfstd|nx{|D]s}|g} | j ||j|t} t| ttfsMtd|n| j | |j | qW|j j |d|j } t|| ggfkr|jd} |jd } |jd }|j j|d|j d| d | d |d |j}n|j j| |d|jd |jqWdS( Ntsourcessfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenamessbuilding '%s' librarytobj_depss\in 'libraries' option (library '%s'), 'obj_deps' must be a dictionary of type 'source: list'tt output_dirtmacrost include_dirstcflagstextra_postargstdebug(tgettNonet isinstancetlistttupleRRtinfotdicttextendtappendtcompilertobject_filenamest build_tempRtcompileR tcreate_static_libR(tselft librariestlib_namet build_infoRRt dependenciest global_depstsourcetsrc_depst extra_depstexpected_objectsRR R tobjects((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pytbuild_librariess`"               (t__name__t __module__t__doc__R&(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pyRs( tdistutils.command.build_clibtcommandRtorigtdistutils.errorsRt distutilsRtsetuptools.dep_utilR(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pytsPK!]  command/build_clib.pyonu[ fc@s_ddljjZddlmZddlmZddlm Z dejfdYZdS(iN(tDistutilsSetupError(tlog(tnewer_pairwise_groupt build_clibcBseZdZdZRS(sv Override the default build_clib behaviour to do the following: 1. Implement a rudimentary timestamp-based dependency system so 'compile()' doesn't run every time. 2. Add more keys to the 'build_info' dictionary: * obj_deps - specify dependencies for each object compiled. this should be a dictionary mapping a key with the source filename to a list of dependencies. Use an empty string for global dependencies. * cflags - specify a list of additional flags to pass to the compiler. c Cs4x-|D]%\}}|jd}|dksDt|ttf rWtd|nt|}tjd||jdt}t|tstd|ng}|jdt}t|ttfstd|nx{|D]s}|g} | j ||j|t} t| ttfsMtd|n| j | |j | qW|j j |d|j } t|| ggfkr|jd} |jd } |jd }|j j|d|j d| d | d |d |j}n|j j| |d|jd |jqWdS( Ntsourcessfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenamessbuilding '%s' librarytobj_depss\in 'libraries' option (library '%s'), 'obj_deps' must be a dictionary of type 'source: list'tt output_dirtmacrost include_dirstcflagstextra_postargstdebug(tgettNonet isinstancetlistttupleRRtinfotdicttextendtappendtcompilertobject_filenamest build_tempRtcompileR tcreate_static_libR(tselft librariestlib_namet build_infoRRt dependenciest global_depstsourcetsrc_depst extra_depstexpected_objectsRR R tobjects((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pytbuild_librariess`"               (t__name__t __module__t__doc__R&(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pyRs( tdistutils.command.build_clibtcommandRtorigtdistutils.errorsRt distutilsRtsetuptools.dep_utilR(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pytsPK!8 ))command/build_py.pyonu[ fc@sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZyddlmZWn$ek rdd dYZnXd ejefd YZdd Zd ZdS(i(tglob(t convert_pathN(tsix(tmaptfiltert filterfalse(t Mixin2to3RcBseZedZRS(cCsdS(s do nothingN((tselftfilestdoctests((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun_2to3t(t__name__t __module__tTrueR (((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRstbuild_pycBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZedZRS(sXEnhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. See 'setuptools.dist.Distribution' for more details. Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. cCsftjj||jj|_|jjp.i|_d|jkrP|jd=ng|_g|_dS(Nt data_files( torigRtfinalize_optionst distributiont package_datatexclude_package_datat__dict__t_build_py__updated_filest_build_py__doctests_2to3(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR!s    cCs|j r|j rdS|jr.|jn|jrN|j|jn|j|jt|j|jt|j|j t|j t j j |dddS(s?Build modules, packages, and copy data files to build directoryNtinclude_bytecodei(t py_modulestpackagest build_modulestbuild_packagestbuild_package_dataR RtFalseRRt byte_compileRRt get_outputs(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun+s     cCs5|dkr"|j|_|jStjj||S(slazily compute data filesR(t_get_data_filesRRRt __getattr__(Rtattr((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR$?s cCsqtjr-t|tjr-|jd}ntjj||||\}}|rg|jj |n||fS(Nt.( RtPY2t isinstancet string_typestsplitRRt build_moduleRtappend(Rtmodulet module_filetpackagetoutfiletcopied((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR+FscCs)|jtt|j|jp"dS(s?Generate list of '(package,src_dir,build_dir,filenames)' tuples((tanalyze_manifesttlistRt_get_pkg_data_filesR(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR#Ps cCsx|j|}tjj|jg|jd}g|j||D]}tjj||^qG}||||fS(NR&(tget_package_dirtostpathtjoint build_libR*tfind_data_filestrelpath(RR/tsrc_dirt build_dirtfilet filenames((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR4Us %1cCs|j|j||}tt|}tjj|}ttj j |}tj|j j |g|}|j |||S(s6Return filenames for package's data files in 'src_dir'(t_get_platform_patternsRRRt itertoolstchaint from_iterableRR6R7tisfiletmanifest_filestgettexclude_data_files(RR/R<tpatternstglobs_expandedt globs_matchest glob_filesR((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR:cs  c Csx|jD]\}}}}x|D]}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r#||jj kr#|j j |q#q#Wq WdS(s$Copy data files into build directoryN( RR6R7R8tmkpathtdirnamet copy_filetabspathRtconvert_2to3_doctestsRR,( RR/R<R=R?tfilenamettargettsrcfiletoutfR1((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRts c Cs\i|_}|jjsdSi}x0|jp2dD]}||t|j|sc3s!|]}|kr|VqdS(N((R|tfn(tbad(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys s(R3R@RRARBRCtsett_unique_everseen(RR/R<RRHt match_groupstmatchestkeepers((RRs?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRGs       cs>tj|jdg|j|g}fd|DS(s yield platform-specific path patterns (suitable for glob or fn_match) from a glob-based spec (such as self.package_data or self.exclude_package_data) matching package in src_dir. R c3s*|] }tjjt|VqdS(N(R6R7R8R(R|R}(R<(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys s(RARBRF(tspecR/R<t raw_patterns((R<s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR@s  (R R t__doc__RR"R$R+R#R4R:RR2RfRkRxR5RGt staticmethodR@(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRs            ccst}|j}|dkrMxgt|j|D]}|||Vq1Wn;x8|D]0}||}||krT|||VqTqTWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(RtaddR[Rt __contains__(titerabletkeytseentseen_addtelementtk((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRs         cCsOtjj|s|Sddlm}tjdj|}||dS(Ni(tDistutilsSetupErrors Error: setup script specifies an absolute path: %s setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. (R6R7tisabstdistutils.errorsRttextwraptdedenttlstrip(R7Rtmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRWs ((Rtdistutils.utilRtdistutils.command.build_pytcommandRRR6R{RRnRRqRAtsetuptools.externRtsetuptools.extern.six.movesRRRtsetuptools.lib2to3_exRt ImportErrorR[RRW(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyts"        PK!command/develop.pyonu[ fc@sddlmZddlmZddlmZmZddlZddlZddl Z ddl m Z ddl m Z mZmZddlmZddlmZddlZd ejefd YZd efd YZdS( i(t convert_path(tlog(tDistutilsErrortDistutilsOptionErrorN(tsix(t Distributiont PathMetadatatnormalize_path(t easy_install(t namespacestdevelopcBseZdZdZejddgZejdgZeZ dZ dZ d Z e d Zd Zd Zd ZdZRS(sSet up package for developments%install package in 'development mode't uninstalltusUninstall this source packages egg-path=s-Set the path to be used in the .egg-link filecCsA|jr)t|_|j|jn |j|jdS(N(R tTruet multi_versiontuninstall_linktuninstall_namespacestinstall_for_developmenttwarn_deprecated_options(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytruns      cCs5d|_d|_tj|d|_d|_dS(Nt.(tNoneR tegg_pathRtinitialize_optionst setup_pathtalways_copy_from(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR's     cCs|jd}|jrCd}|j|jf}t||n|jg|_tj||j|j |j j t j d|jd}t jj|j||_|j|_|jdkrt jj|j|_nt|j}tt jj|j|j}||kr9td|nt|t|t jj|jd|j|_|j|j|j|j|_dS(Ntegg_infos-Please rename %r to %r before using 'develop's*.eggs .egg-linksA--egg-path must be a relative path from the install directory to t project_name(tget_finalized_commandtbroken_egg_infoRRtegg_nametargsRtfinalize_optionstexpand_basedirst expand_dirst package_indextscantglobtostpathtjoint install_dirtegg_linktegg_baseRRtabspathRRRRtdistt_resolve_setup_pathR(RteittemplateR t egg_link_fnttargetR((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR!.s<        cCs|jtjdjd}|tjkrGd|jdd}nttjj|||}|ttjkrt d|ttjn|S(s Generate a path from egg_base back to '.' where the setup script resides and ensure that path points to the setup path from $install_dir/$egg_path. t/s../isGCan't get a consistent path to setup script from installation directory( treplaceR'tseptrstriptcurdirtcountRR(R)R(R,R*Rt path_to_setuptresolved((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR/XscCstjrt|jdtr|jddd|jd|jd}t|j }|jdd||jd|jddd|jd|jd}||_ ||j _ t ||j|j _n-|jd|jddd|jd|jtjr7|jtjdt_n|jtjd |j|j|jst|jd "}|j|j d |jWdQXn|jd|j |j dS( Ntuse_2to3tbuild_pytinplaceiRR,t build_extisCreating %s (link to %s)tws ( RtPY3tgetattrt distributiontFalsetreinitialize_commandt run_commandRRt build_libRR.tlocationRRt _providertinstall_site_pyt setuptoolstbootstrap_install_fromRRtinstall_namespacesRtinfoR+R,tdry_runtopentwriteRtprocess_distributiontno_deps(Rtbpy_cmdt build_pathtei_cmdtf((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRks4            $cCstjj|jrtjd|j|jt|j}g|D]}|j^qD}|j ||j g|j |j gfkrtj d|dS|j stj|jqn|j s|j|jn|jjrtj dndS(NsRemoving %s (link to %s)s$Link points to %s: uninstall aborteds5Note: you must uninstall or replace scripts manually!(R'R(texistsR+RRNR,RPR7tcloseRRtwarnROtunlinkt update_pthR.RCtscripts(Rt egg_link_filetlinetcontents((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRs     cCs||jk rtj||S|j|x~|jjp>gD]j}tjjt |}tjj |}t j |}|j }WdQX|j||||q?WdS(N(R.Rtinstall_egg_scriptstinstall_wrapper_scriptsRCR]R'R(R-RtbasenametioRPtreadtinstall_script(RR.t script_namet script_pathtstrmt script_text((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRas cCst|}tj||S(N(tVersionlessRequirementRRb(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRbs (R R sUninstall this source packageN(s egg-path=Ns-Set the path to be used in the .egg-link file(t__name__t __module__t__doc__t descriptionRt user_optionsRtboolean_optionsRDtcommand_consumes_argumentsRRR!t staticmethodR/RRRaRb(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR s   * /  RkcBs)eZdZdZdZdZRS(sz Adapt a pkg_resources.Distribution to simply return the project name as the 'requirement' so that scripts will work across multiple versions. >>> dist = Distribution(project_name='foo', version='1.0') >>> str(dist.as_requirement()) 'foo==1.0' >>> adapted_dist = VersionlessRequirement(dist) >>> str(adapted_dist.as_requirement()) 'foo' cCs ||_dS(N(t_VersionlessRequirement__dist(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt__init__scCst|j|S(N(RBRt(Rtname((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt __getattr__scCs|jS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytas_requirements(RlRmRnRuRwRx(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRks   (tdistutils.utilRt distutilsRtdistutils.errorsRRR'R&Rdtsetuptools.externRt pkg_resourcesRRRtsetuptools.command.easy_installRRKR tDevelopInstallerR tobjectRk(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyts    PK!хcommand/dist_info.pyonu[ fc@sLdZddlZddlmZddlmZdefdYZdS(sD Create a dist_info directory As defined in the wheel specification iN(tCommand(tlogt dist_infocBs2eZdZdgZdZdZdZRS(screate a .dist-info directorys egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)cCs d|_dS(N(tNonetegg_base(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytinitialize_optionsscCsdS(N((R((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytfinalize_optionsscCs|jd}|j|_|j|j|jtd d}tjdjt j j ||jd}|j |j|dS(Ntegg_infos .egg-infos .dist-infos creating '{}'t bdist_wheel( tget_finalized_commandRRtrunR tlenRtinfotformattostpathtabspathtegg2dist(RR t dist_info_dirR ((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyR s   "(s egg-base=RsLdirectory containing .egg-info directories (default: top of the source tree)(t__name__t __module__t descriptiont user_optionsRRR (((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyR s    (t__doc__Rtdistutils.coreRt distutilsRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyts PK!U(e(ecommand/egg_info.pyonu[ fc@s@dZddlmZddlmZddlmZddlm Z ddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'j(Z(ddl)m*Z*ddlm+Z+dZ,defdYZ-defdYZdefdYZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6e7d Z8d!Z9d"Z:dS(#sUsetuptools.command.egg_info Create a distribution's .egg-info directory and contentsi(tFileList(tDistutilsInternalError(t convert_path(tlogN(tsix(tmap(tCommand(tsdist(t walk_revctrl(t edit_config(t bdist_egg(tparse_requirementst safe_namet parse_versiont safe_versiont yield_linest EntryPointtiter_entry_pointst to_filename(tglob(t packagingcCsd}|jtjj}tjtj}d|f}xt|D]\}}|t|dk}|dkr|r|d7}qG|d||f7}qGnd}t|} x|| krA||} | dkr||d7}nJ| d kr||7}n1| d kr!|d} | | krB|| d krB| d} n| | krk|| d krk| d} nx*| | kr|| d kr| d} qnW| | kr|tj| 7}q4||d| !} d} | dd krd } | d} n| tj| 7} |d| f7}| }n|tj| 7}|d7}qW|sG||7}qGqGW|d7}tj|dtj tj BS(s Translate a file path glob like '*.txt' in to a regular expression. This differs from fnmatch.translate which allows wildcards to match directory separators. It also knows about '**/' which matches any number of directories. ts[^%s]is**s.*s (?:%s+%s)*it*t?t[t!t]t^s[%s]s\Ztflags( tsplittostpathtseptretescapet enumeratetlentcompilet MULTILINEtDOTALL(RtpattchunksR t valid_chartctchunkt last_chunktit chunk_lentchartinner_itinnert char_class((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttranslate_pattern$sV                tegg_infocBseZdZddddgZdgZidd 6Zd ZedZej dZdZ dZ e dZ dZdZdZdZdZdZdZRS(s+create a distribution's .egg-info directorys egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)stag-datetds0Add date stamp (e.g. 20050528) to version numbers tag-build=tbs-Specify explicit tag to add to version numbersno-datetDs"Don't include date stamp [default]cCsLd|_d|_d|_d|_d|_d|_t|_d|_ dS(Ni( tNonetegg_namet egg_versiontegg_baseR5t tag_buildttag_datetFalsetbroken_egg_infotvtags(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytinitialize_optionss       cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttag_svn_revisionscCsdS(N((RCtvalue((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyREscCs@tj}|j|diR?R5N(t collectionst OrderedDictttagsR tdict(RCtfilenameR5((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytsave_version_infos  cCst|jj|_|j|_|j|_t|j}yKt |t j j }|ridnd}t t||j|jfWn3tk rtjjd|j|jfnX|jdkr|jj}|pijdtj|_n|jdt|jd|_|jtjkrXtjj|j|j|_nd|jkrt|jn|j|jj_ |jj }|dk r|j!|jj"kr|j|_#t|j|_$d|j_ ndS(Ns%s==%ss%s===%ss2Invalid distribution name or version syntax: %s-%sRR=s .egg-infot-(%R t distributiontget_nameR;RIRBttagged_versionR<R t isinstanceRtversiontVersiontlistR t ValueErrort distutilsterrorstDistutilsOptionErrorR=R:t package_dirtgetRtcurdirtensure_dirnameRR5Rtjointcheck_broken_egg_infotmetadatat _patched_disttkeytlowert_versiont_parsed_version(RCtparsed_versiont is_versiontspectdirstpd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytfinalize_optionss8!   ! !  $ cCsl|r|j|||nLtjj|rh|dkrX| rXtjd||dS|j|ndS(sWrite `data` to `filename` or delete if empty If `data` is non-empty, this routine is the same as ``write_file()``. If `data` is empty but not ``None``, this is the same as calling ``delete_file(filename)`. If `data` is ``None``, then this is a no-op unless `filename` exists, in which case a warning is issued about the orphaned file (if `force` is false), or deleted (if `force` is true). s$%s not set in setup(), but %s existsN(t write_fileRRtexistsR:Rtwarnt delete_file(RCtwhatRKtdatatforce((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_or_delete_files  cCsdtjd||tjr.|jd}n|js`t|d}|j||jndS(sWrite `data` to `filename` (if not a dry run) after announcing it `what` is used in a log message to identify what is being written to the file. swriting %s to %ssutf-8twbN( RtinfoRtPY3tencodetdry_runtopentwritetclose(RCRoRKRptf((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRks   cCs-tjd||js)tj|ndS(s8Delete `filename` (if not a dry run) after announcing its deleting %sN(RRtRwRtunlink(RCRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRns cCsE|jj}|jr4|j|jr4t|St||jS(N(RNt get_versionRBtendswithR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRPs cCs|j|j|jj}xXtdD]J}|jd||j}|||jtj j |j|jq)Wtj j |jd}tj j |r|j |n|j dS(Nsegg_info.writerst installersnative_libs.txt(tmkpathR5RNtfetch_build_eggRtrequiretresolvetnameRRR]RlRnt find_sources(RCRteptwritertnl((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytrun s  ,cCsBd}|jr||j7}n|jr>|tjd7}n|S(NRs-%Y%m%d(R>R?ttimetstrftime(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRIs   cCsJtjj|jd}t|j}||_|j|j|_dS(s"Generate SOURCES.txt manifest files SOURCES.txtN( RRR]R5tmanifest_makerRNtmanifestRtfilelist(RCtmanifest_filenametmm((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR s   cCs|jd}|jtjkr:tjj|j|}ntjj|rtjddddd||j |j |_ ||_ ndS(Ns .egg-infoRMiNs Note: Your current .egg-info directory has a '-' in its name; this will not work correctly with "setup.py develop". Please rename %s to %s to correct this problem. ( R;R=RR[RR]RlRRmR5RA(RCtbei((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR^(s   (s egg-base=R6sLdirectory containing .egg-info directories (default: top of the source tree)(stag-dateR7s0Add date stamp (e.g. 20050528) to version number(s tag-build=R8s-Specify explicit tag to add to version number(sno-dateR9s"Don't include date stamp [default](t__name__t __module__t descriptiont user_optionstboolean_optionst negative_optRDtpropertyREtsetterRLRjR@RrRkRnRPRRIRR^(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR5ws*     /       RcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZRS(cCs|j|\}}}}|dkrw|jddj|x|D](}|j|sHtjd|qHqHWnx|dkr|jddj|xO|D](}|j|stjd|qqWn|dkr/|jd dj|x|D](}|j|stjd |qqWn|d kr|jd dj|x|D](}|j|s\tjd |q\q\Wnd|dkr|jd|dj|fx5|D].}|j ||stjd||qqWn|dkr[|jd|dj|fx|D].}|j ||s&tjd||q&q&Wn|dkr|jd||j |stjd|qnR|dkr|jd||j |stjd|qnt d|dS(Ntincludesinclude t s%warning: no files found matching '%s'texcludesexclude s9warning: no previously-included files found matching '%s'sglobal-includesglobal-include s>warning: no files found matching '%s' anywhere in distributionsglobal-excludesglobal-exclude sRwarning: no previously-included files matching '%s' found anywhere in distributionsrecursive-includesrecursive-include %s %ss:warning: no files found matching '%s' under directory '%s'srecursive-excludesrecursive-exclude %s %ssNwarning: no previously-included files matching '%s' found under directory '%s'tgraftsgraft s+warning: no directories found matching '%s'tprunesprune s6no previously-included directories found matching '%s's'this cannot happen: invalid action '%s'(t_parse_template_linet debug_printR]RRRmRtglobal_includetglobal_excludetrecursive_includetrecursive_excludeRRR(RCtlinetactiontpatternstdirt dir_patterntpattern((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytprocess_template_line;sd                         cCsrt}xett|jdddD]D}||j|r&|jd|j||j|=t}q&q&W|S(s Remove all files from the file list that match the predicate. Return True if any matching files were removed iis removing (R@trangeR$tfilesRtTrue(RCt predicatetfoundR.((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt _remove_filess&  cCsHgt|D]}tjj|s |^q }|j|t|S(s#Include files that match 'pattern'.(RRRtisdirtextendtbool(RCRR{R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs1 cCst|}|j|jS(s#Exclude files that match 'pattern'.(R4Rtmatch(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs cCsftjj|d|}gt|dtD]}tjj|s+|^q+}|j|t|S(sN Include all files anywhere in 'dir/' that match the pattern. s**t recursive(RRR]RRRRR(RCRRt full_patternR{R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs  cCs.ttjj|d|}|j|jS(sM Exclude any file anywhere in 'dir/' that match the pattern. s**(R4RRR]RR(RCRRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCsOgt|D]%}tjj|D] }|^q#q }|j|t|S(sInclude all files from 'dir/'.(RRVRtfindallRR(RCRt match_dirtitemR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs % cCs+ttjj|d}|j|jS(sFilter out files from 'dir/'.s**(R4RRR]RR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCsy|jdkr|jnttjjd|}g|jD]}|j|rA|^qA}|j|t |S(s Include all files anywhere in the current directory that match the pattern. This is very inefficient on large file trees. s**N( tallfilesR:RR4RRR]RRR(RCRRR{R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs  + cCs+ttjjd|}|j|jS(sD Exclude all files anywhere that match the pattern. s**(R4RRR]RR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCsN|jdr|d }nt|}|j|rJ|jj|ndS(Ns i(R~Rt _safe_pathRtappend(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs   cCs |jjt|j|dS(N(RRtfilterR(RCtpaths((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRscCs"tt|j|j|_dS(s Replace self.files with only safe paths Because some owners of FileList manipulate the underlying ``files`` attribute directly, this method must be called to repair those paths. N(RTRRR(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_repairscCsd}tj|}|dkr6tjd|tStj|d}|dkrktj||dtSy,tjj |stjj |rt SWn*t k rtj||t j nXdS(Ns!'%s' not %s encodable -- skippings''%s' in unexpected encoding -- skippingsutf-8(t unicode_utilstfilesys_decodeR:RRmR@t try_encodeRRRlRtUnicodeEncodeErrortsystgetfilesystemencoding(RCRtenc_warntu_patht utf8_path((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs  $ (RRRRRRRRRRRRRRRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR8s I        RcBseeZdZdZdZdZdZdZdZe dZ dZ d Z RS( s MANIFEST.incCs(d|_d|_d|_d|_dS(Ni(t use_defaultsRt manifest_onlytforce_manifest(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRDs   cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRjscCst|_tjj|js.|jn|jtjj|jrZ|j n|j |jj |jj |jdS(N( RRRRRlRtwrite_manifestt add_defaultsttemplatet read_templatetprune_file_listtsorttremove_duplicates(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs       cCs"tj|}|jtjdS(Nt/(RRtreplaceRR (RCR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_manifest_normalizescCsb|jjg|jjD]}|j|^q}d|j}|jt|j|f|dS(so Write the file list in 'self.filelist' to the manifest file named by 'self.manifest'. swriting manifest file '%s'N(RRRRRtexecuteRk(RCR{Rtmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs ( cCs&|j|s"tj||ndS(N(t_should_suppress_warningRRm(RCR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRm$scCstjd|S(s; suppress missing-file warnings from sdist sstandard file .*not found(R!R(R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR(scCstj||jj|j|jj|jtt}|r[|jj|n"t j j |jr}|j n|j d}|jj|jdS(NR5(RRRRRRRTRRRRRlt read_manifesttget_finalized_commandRR5(RCtrcfilestei_cmd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR/s  cCsy|jd}|jj}|jj|j|jj|tjtj }|jj d|d|dddS(Ntbuilds(^|s)(RCS|CVS|\.svn)tis_regexi( RRNt get_fullnameRRt build_baseR!R"RR texclude_pattern(RCRtbase_dirR ((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR;s( RRRRDRjRRRRmt staticmethodRRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRs     cCsGdj|}|jd}t|d}|j|WdQXdS(s{Create a file with the specified name and write 'contents' (a sequence of strings without line terminators) to it. s sutf-8RsN(R]RvRxRy(RKtcontentsR{((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRkEscCstjd||js|jj}|j|j|_}|j|j|_}z|j |j Wd|||_|_Xt |jdd}t j|j |ndS(Ns writing %stzip_safe(RRtRwRNR_R<RRR;Rtwrite_pkg_infoR5tgetattrR:R twrite_safety_flag(tcmdtbasenameRKR_toldvertoldnametsafe((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRRs  cCs&tjj|r"tjdndS(NssWARNING: 'depends.txt' is not used by setuptools 0.6! Use the install_requires/extras_require setup() args instead.(RRRlRRm(RRRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwarn_depends_obsoleteescCs;t|p d}d}t||}|j|dS(NcSs|dS(Ns ((R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytoR((RRt writelines(tstreamtreqstlinest append_cr((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_write_requirementsms cCs|j}tj}t||j|jp1i}x>t|D]0}|jdjt t|||qAW|j d||j dS(Ns [{extra}] t requirements( RNRtStringIORtinstall_requirestextras_requiretsortedRytformattvarsRrtgetvalue(RRRKtdistRpRtextra((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_requirementsts  cCs<tj}t||jj|jd||jdS(Nssetup-requirements(tioRRRNtsetup_requiresRrR(RRRKRp((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_setup_requirementss cCsetjg|jjD]}|jddd^q}|jd|djt|ddS(Nt.iistop-level namess (RJtfromkeysRNtiter_distribution_namesRRkR]R(RRRKtktpkgs((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_toplevel_namess2cCst|||tdS(N(t write_argR(RRRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt overwrite_argscCsgtjj|d}t|j|d}|dk rMdj|d}n|j||||dS(Nis (RRtsplitextRRNR:R]Rr(RRRKRqtargnameRF((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR s  cCs|jj}t|tjs*|dkr3|}n|dk rg}xt|jD]n\}}t|tjstj ||}dj tt t |j }n|jd||fqXWdj |}n|jd||tdS(Ns s [%s] %s Rs entry points(RNt entry_pointsRQRt string_typesR:RtitemsRt parse_groupR]RtstrtvaluesRRrR(RRRKRRptsectionR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt write_entriess   'cCs}tjdttjjdrytjdC}x9|D]1}tj d|}|r;t |j dSq;WWdQXndS(sd Get a -r### off of PKG-INFO Version in case this is an sdist of a subversion revision. s$get_pkg_info_revision is deprecated.sPKG-INFOsVersion:.*-r(\d+)\s*$iNi( twarningsRmtDeprecationWarningRRRlRRxR!Rtinttgroup(R{RR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytget_pkg_info_revisions  (;t__doc__tdistutils.filelistRt _FileListtdistutils.errorsRtdistutils.utilRRVRRR!RRRRRGtsetuptools.externRtsetuptools.extern.six.movesRt setuptoolsRtsetuptools.command.sdistRRtsetuptools.command.setoptR tsetuptools.commandR t pkg_resourcesR R R RRRRRtsetuptools.unicode_utilsRtsetuptools.globRRR4R5RRkRRRRRR R R@R RR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytsN         : SI       PK!ѽUrYYcommand/install.pyonu[ fc@sddlmZddlZddlZddlZddlZddljjZ ddl Z e jZ de jfdYZge jj D]Z e dejkre ^qeje_ dS(i(tDistutilsArgErrorNtinstallcBseZdZejjddgZejjddgZddfddfgZe eZ d Z d Z d Z d Zed ZdZRS(s7Use easy_install to install the package, w/dependenciessold-and-unmanageablesTry not to use this!s!single-version-externally-manageds5used by system package builders to create 'flat' eggstinstall_egg_infocCstS(N(tTrue(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pytttinstall_scriptscCstS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRRcCs&tjj|d|_d|_dS(N(torigRtinitialize_optionstNonetold_and_unmanageablet!single_version_externally_managed(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR s cCsXtjj||jr%t|_n/|jrT|j rT|j rTtdqTndS(NsAYou must specify --record or --root when building system packages(RRtfinalize_optionstrootRR trecordR(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR %s   cCs8|js|jr"tjj|Sd|_d|_dS(NR(RR RRthandle_extra_pathR t path_filet extra_dirs(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR0s cCsX|js|jr"tjj|S|jtjsJtjj|n |jdS(N( R R RRtrunt_called_from_setuptinspectt currentframetdo_egg_install(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR:s cCs|d krKd}tj|tjdkrGd}tj|ntStj|d}|d \}tj|}|j j dd}|dko|j d kS( s Attempt to detect whether run() was called from setup() or by another command. If called by setup(), the parent caller will be the 'run_command' method in 'distutils.dist', and *its* caller will be the 'run_commands' method. If called any other way, the immediate caller *might* be 'run_command', but it won't have been called by 'run_commands'. Return True in that case or if a call stack is unavailable. Return False otherwise. s4Call stack not available. bdist_* commands may fail.t IronPythons6For best results, pass -X:Frames to enable call stack.iit__name__Rsdistutils.distt run_commandsN( R twarningstwarntplatformtpython_implementationRRtgetouterframest getframeinfot f_globalstgettfunction(t run_frametmsgtrestcallertinfot caller_module((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyREs    cCs|jjd}||jddd|jd|j}|jd|_|jjtjd|j d|jj dj g}t j r|jd t j n||_|jdt _ dS( Nt easy_installtargstxRRt.s*.eggt bdist_eggi(t distributiontget_command_classRRtensure_finalizedtalways_copy_fromt package_indextscantglobt run_commandtget_command_objt egg_outputt setuptoolstbootstrap_install_fromtinsertR+RR (RR*tcmdR+((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR`s$      N(sold-and-unmanageableNsTry not to use this!(s!single-version-externally-managedNs5used by system package builders to create 'flat' eggs(Rt __module__t__doc__RRt user_optionsR tboolean_optionst new_commandstdictt_ncR R RRt staticmethodRR(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRs         i(tdistutils.errorsRRR5RRtdistutils.command.installtcommandRRR9t_installt sub_commandsR<RCRA(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyts      l/PK!(q q command/install_egg_info.pyonu[ fc@s~ddlmZmZddlZddlmZddlmZddlmZddl Z dej efdYZ dS(i(tlogtdir_utilN(tCommand(t namespaces(tunpack_archivetinstall_egg_infocBsJeZdZdZd gZdZdZdZdZdZ RS( s.Install an .egg-info directory for the packages install-dir=tdsdirectory to install tocCs d|_dS(N(tNonet install_dir(tself((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytinitialize_optionsscCs{|jdd|jd}tjdd|j|jjd}|j|_t j j |j ||_ g|_dS(Nt install_libRtegg_infos .egg-info(RR(tset_undefined_optionstget_finalized_commandt pkg_resourcest DistributionRtegg_namet egg_versionR tsourcetostpathtjoinRttargettoutputs(R tei_cmdtbasename((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytfinalize_optionss  cCs|jdtjj|jrTtjj|j rTtj|jd|jn;tjj |jr|j tj |jfd|jn|jst j |jn|j |jdd|j|jf|jdS(NR tdry_runs Removing sCopying %s to %s((t run_commandRRtisdirRtislinkRt remove_treeRtexiststexecutetunlinkRtensure_directorytcopytreeRtinstall_namespaces(R ((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytrun!s +&  cCs|jS(N(R(R ((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyt get_outputs.scs)fd}tjj|dS(Ncs[x1dD])}|j|s,d||krdSqWjj|tjd|||S(Ns.svn/sCVS/t/sCopying %s to %s(s.svn/sCVS/(t startswithRRtappendRtdebug(tsrctdsttskip(R (sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytskimmer3s  (RRR(R R0((R sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR%1s (s install-dir=Rsdirectory to install to( t__name__t __module__t__doc__t descriptiont user_optionsR RR'R(R%(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR s   ( t distutilsRRRt setuptoolsRRtsetuptools.archive_utilRRt InstallerR(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyts   PK!%command/install_lib.pycnu[ fc@s]ddlZddlZddlmZmZddljjZdejfdYZdS(iN(tproducttstarmapt install_libcBsneZdZdZdZdZedZdZedZ ddddd Z d Z RS( s9Don't add compiled flags to filenames of non-Python filescCs6|j|j}|dk r2|j|ndS(N(tbuildtinstalltNonet byte_compile(tselftoutfiles((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytrun s   csGfdjD}t|j}ttj|S(s Return a collections.Sized collections.Container of paths to be excluded for single_version_externally_managed installations. c3s+|]!}j|D] }|VqqdS(N(t _all_packages(t.0tns_pkgtpkg(R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pys s(t_get_SVEM_NSPsRt_gen_exclusion_pathstsetRt_exclude_pkg_path(Rt all_packagest excl_specs((RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytget_exclusionss cCs,|jd|g}tjj|j|S(sw Given a package name and exclusion path within that package, compute the full exclusion path. t.(tsplittostpathtjoint install_dir(RR texclusion_pathtparts((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRsccs.x'|r)|V|jd\}}}qWdS(sn >>> list(install_lib._all_packages('foo.bar.baz')) ['foo.bar.baz', 'foo.bar', 'foo'] RN(t rpartition(tpkg_nametseptchild((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR 's cCs<|jjsgS|jd}|j}|r8|jjSgS(s Get namespace packages (list) but only for single_version_externally_managed installations and empty otherwise. R(t distributiontnamespace_packagestget_finalized_commandt!single_version_externally_managed(Rt install_cmdtsvem((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR1s   ccsidVdVdVttds"dStjjddtj}|dV|d V|d V|d VdS( sk Generate file paths to be excluded for namespace packages (bytecode cache files). s __init__.pys __init__.pycs __init__.pyotget_tagNt __pycache__s __init__.s.pycs.pyos .opt-1.pycs .opt-2.pyc(thasattrtimpRRRR'(tbase((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRAs   iic s|r|r| st|jsAtjj|||Sddlm}ddlmgfd}||||S(Ni(tunpack_directory(tlogcsP|kr jd|tSjd|tjj|j||S(Ns/Skipping installation of %s (namespace package)scopying %s -> %s(twarntFalsetinfoRRtdirnametappend(tsrctdst(texcludeR-R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytpfgs   ( tAssertionErrorRtorigRt copy_treetsetuptools.archive_utilR,t distutilsR-( Rtinfiletoutfilet preserve_modetpreserve_timestpreserve_symlinkstlevelR,R6((R5R-RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR9Vs  cCsKtjj|}|j}|rGg|D]}||kr+|^q+S|S(N(R8Rt get_outputsR(RtoutputsR5tf((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRBts  #( t__name__t __module__t__doc__R RRt staticmethodR RRR9RB(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRs    ( RR*t itertoolsRRtdistutils.command.install_libtcommandRR8(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyts  PK! command/py36compat.pyonu[ fc@sddlZddlmZddlmZddlmZddlmZdd dYZe ejdrdd d YZndS( iN(tglob(t convert_path(tsdist(tfiltertsdist_add_defaultscBseeZdZdZedZdZdZdZdZ dZ dZ d Z RS( s Mix-in providing forward-compatibility for functionality as found in distutils on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. Instead, override in the subclass. cCsJ|j|j|j|j|j|j|jdS(s9Add all the default files to self.filelist: - README or README.txt - setup.py - test/test*.py - all pure Python modules mentioned in setup script - all files pointed by package_data (build_py) - all files defined in data_files. - all files defined as scripts. - all C sources listed as part of extensions or C libraries in the setup script (doesn't catch C headers!) Warns if (README or README.txt) or setup.py are missing; everything else is optional. N(t_add_defaults_standardst_add_defaults_optionalt_add_defaults_pythont_add_defaults_data_filest_add_defaults_extt_add_defaults_c_libst_add_defaults_scripts(tself((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt add_defaultss      cCsStjj|stStjj|}tjj|\}}|tj|kS(s Case-sensitive path existence check >>> sdist_add_defaults._cs_path_exists(__file__) True >>> sdist_add_defaults._cs_path_exists(__file__.upper()) False (tostpathtexiststFalsetabspathtsplittlistdir(tfspathRt directorytfilename((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt_cs_path_exists(s cCs|j|jjg}x|D]}t|tr|}t}x7|D]/}|j|rDt}|jj |PqDqDW|s|j ddj |qq|j|r|jj |q|j d|qWdS(Ns,standard file not found: should have one of s, sstandard file '%s' not found( tREADMESt distributiont script_namet isinstancettupleRRtTruetfilelisttappendtwarntjoin(R t standardstfntaltstgot_it((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR9s    cCsLddg}x9|D]1}ttjjt|}|jj|qWdS(Ns test/test*.pys setup.cfg(RRRtisfileRRtextend(R toptionaltpatterntfiles((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRNs  cCs|jd}|jjr7|jj|jnxM|jD]B\}}}}x-|D]%}|jjtj j ||qZWqAWdS(Ntbuild_py( tget_finalized_commandRthas_pure_modulesRR(tget_source_filest data_filesR RRR"(R R,tpkgtsrc_dirt build_dirt filenamesR((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRTs  cCs|jjrx|jjD]}t|tret|}tjj|r|j j |qq|\}}x?|D]7}t|}tjj|rx|j j |qxqxWqWndS(N( Rthas_data_filesR0RtstrRRRR'RR (R titemtdirnameR4tf((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRds    cCs;|jjr7|jd}|jj|jndS(Nt build_ext(Rthas_ext_modulesR-RR(R/(R R:((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR uscCs;|jjr7|jd}|jj|jndS(Nt build_clib(Rthas_c_librariesR-RR(R/(R R<((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR zscCs;|jjr7|jd}|jj|jndS(Nt build_scripts(Rt has_scriptsR-RR(R/(R R>((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR s( t__name__t __module__t__doc__R t staticmethodRRRRRR R R (((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR s       RcBseZRS((R@RA(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRs((( RRtdistutils.utilRtdistutils.commandRtsetuptools.extern.six.movesRRthasattr(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyts |PK!~command/register.pyonu[ fc@s/ddljjZdejfdYZdS(iNtregistercBseZejjZdZRS(cCs!|jdtjj|dS(Ntegg_info(t run_commandtorigRtrun(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs (t__name__t __module__RRt__doc__R(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs (tdistutils.command.registertcommandRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pytsPK!PJ command/rotate.pycnu[ fc@sddlmZddlmZddlmZddlZddlZddlm Z ddl m Z de fdYZ dS( i(t convert_path(tlog(tDistutilsOptionErrorN(tsix(tCommandtrotatecBsDeZdZdZdddgZgZd Zd Zd ZRS(sDelete older distributionss2delete older distributions, keeping N newest filessmatch=tmspatterns to match (required)s dist-dir=tds%directory where the distributions areskeep=tks(number of matching distributions to keepcCsd|_d|_d|_dS(N(tNonetmatchtdist_dirtkeep(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytinitialize_optionss  cCs|jdkrtdn|jdkr<tdnyt|j|_Wntk rqtdnXt|jtjrg|jj dD]}t |j ^q|_n|j dddS(NsQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')s$Must specify number of files to keeps--keep must be an integert,tbdistR (R R ( R R RR tintt ValueErrort isinstanceRt string_typestsplitRtstriptset_undefined_options(R tp((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytfinalize_optionss  7cCs1|jdddlm}x |jD]}|jjd|}|tjj|j|}g|D]}tjj ||f^qi}|j |j t j dt||||j}x_|D]W\}}t j d||jstjj|rtj|q%tj|qqWq'WdS(Ntegg_infoi(tglobt*s%d file(s) matching %ss Deleting %s(t run_commandRR t distributiontget_nametostpathtjoinR tgetmtimetsorttreverseRtinfotlenR tdry_runtisdirtshutiltrmtreetunlink(R Rtpatterntfilestftt((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytrun/s  +    (smatch=Rspatterns to match (required)(s dist-dir=Rs%directory where the distributions are(skeep=Rs(number of matching distributions to keep( t__name__t __module__t__doc__t descriptiont user_optionstboolean_optionsRRR1(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyR s   ( tdistutils.utilRt distutilsRtdistutils.errorsRR R*tsetuptools.externRt setuptoolsRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyts  PK!PJ command/rotate.pyonu[ fc@sddlmZddlmZddlmZddlZddlZddlm Z ddl m Z de fdYZ dS( i(t convert_path(tlog(tDistutilsOptionErrorN(tsix(tCommandtrotatecBsDeZdZdZdddgZgZd Zd Zd ZRS(sDelete older distributionss2delete older distributions, keeping N newest filessmatch=tmspatterns to match (required)s dist-dir=tds%directory where the distributions areskeep=tks(number of matching distributions to keepcCsd|_d|_d|_dS(N(tNonetmatchtdist_dirtkeep(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytinitialize_optionss  cCs|jdkrtdn|jdkr<tdnyt|j|_Wntk rqtdnXt|jtjrg|jj dD]}t |j ^q|_n|j dddS(NsQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')s$Must specify number of files to keeps--keep must be an integert,tbdistR (R R ( R R RR tintt ValueErrort isinstanceRt string_typestsplitRtstriptset_undefined_options(R tp((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytfinalize_optionss  7cCs1|jdddlm}x |jD]}|jjd|}|tjj|j|}g|D]}tjj ||f^qi}|j |j t j dt||||j}x_|D]W\}}t j d||jstjj|rtj|q%tj|qqWq'WdS(Ntegg_infoi(tglobt*s%d file(s) matching %ss Deleting %s(t run_commandRR t distributiontget_nametostpathtjoinR tgetmtimetsorttreverseRtinfotlenR tdry_runtisdirtshutiltrmtreetunlink(R Rtpatterntfilestftt((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytrun/s  +    (smatch=Rspatterns to match (required)(s dist-dir=Rs%directory where the distributions are(skeep=Rs(number of matching distributions to keep( t__name__t __module__t__doc__t descriptiont user_optionstboolean_optionsRRR1(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyR s   ( tdistutils.utilRt distutilsRtdistutils.errorsRR R*tsetuptools.externRt setuptoolsRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyts  PK!ACiicommand/saveopts.pyonu[ fc@s0ddlmZmZdefdYZdS(i(t edit_configt option_basetsaveoptscBseZdZdZdZRS(s#Save command-line options to a files7save supplied options to setup.cfg or other config filecCs|j}i}xt|jD]i}|dkr1qnxN|j|jD]7\}\}}|dkrG||j|i|sPK!x(Lcommand/sdist.pycnu[ fc@sddlmZddljjZddlZddlZddlZddl Z ddl m Z ddl m Z ddlZeZddZde ejfd YZdS( i(tlogN(tsixi(tsdist_add_defaultstccs@x9tjdD](}x|j|D] }|Vq)WqWdS(s%Find all files under revision controlssetuptools.file_findersN(t pkg_resourcestiter_entry_pointstload(tdirnameteptitem((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt walk_revctrlstsdistcBs/eZdZd"ddddfd#gZiZd d d d gZedeDZdZ dZ dZ dZ e ejdZdZejd$kpd%ejkod&knpd'ejkod(knZereZndZdZdZdZdZd ZRS()s=Smart sdist that finds anything supported by revision controlsformats=s6formats for source distribution (comma-separated list)s keep-temptks1keep the distribution tree around after creating sarchive file(s)s dist-dir=tdsFdirectory to put the source distribution archive(s) in [default: dist]Rs.rsts.txts.mdccs|]}dj|VqdS(s README{0}N(tformat(t.0text((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pys )scCs|jd|jd}|j|_|jjtjj|jd|jx!|j D]}|j|qaW|j t |j dg}x<|j D]1}dd|f}||kr|j|qqWdS(Ntegg_infos SOURCES.txtt dist_filesR R(t run_commandtget_finalized_commandtfilelisttappendtostpathtjoinRt check_readmetget_sub_commandstmake_distributiontgetattrt distributiont archive_files(tselftei_cmdtcmd_nameRtfiletdata((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pytrun+s  "   cCstjj||jdS(N(torigR tinitialize_optionst_default_to_gztar(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR'>scCs#tjdkrdSdg|_dS(Niiitbetaitgztar(iiiR)i(tsyst version_infotformats(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR(CscCs'|jtjj|WdQXdS(s% Workaround for #516 N(t_remove_os_linkR&R R(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRIs ccssdddY}ttd|}y t`Wntk rBnXz dVWd||k rnttd|nXdS(sG In a context, remove and restore os.link if it exists tNoValuecBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR/WstlinkN((RRR2t Exceptiontsetattr(R/torig_val((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR.Ps    cCs[ytjj|Wn@tk rVtj\}}}|jjjdj nXdS(Nttemplate( R&R t read_templateR3R+texc_infottb_nextttb_frametf_localstclose(R t_ttb((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt__read_template_hackes  iiiiiicCs|jjr|jd}|jj|j|jjsxR|jD]D\}}}}|jjg|D]}tj j ||^qlqJWqndS(sgetting python filestbuild_pyN( Rthas_pure_modulesRRtextendtget_source_filestinclude_package_datat data_filesRRR(R R@R=tsrc_dirt filenamestfilename((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_add_defaults_python|s  cCsOy*tjrtj|n tjWntk rJtjdnXdS(Ns&data_files contains unexpected objects(RtPY2Rt_add_defaults_data_filestsupert TypeErrorRtwarn(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRKs   cCsKxD|jD]}tjj|r dSq W|jddj|jdS(Ns,standard file not found: should have one of s, (tREADMESRRtexistsRNR(R tf((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRs cCstjj|||tjj|d}ttdrltjj|rltj||j d|n|j dj |dS(Ns setup.cfgR2R( R&R tmake_release_treeRRRthasattrRPtunlinkt copy_fileRtsave_version_info(R tbase_dirtfilestdest((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRRs ! cCsStjj|jstStj|jd}|j}WdQX|djkS(Ntrbs+# file GENERATED by distutils, do NOT edit ( RRtisfiletmanifesttFalsetiotopentreadlinetencode(R tfpt first_line((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_manifest_is_not_generateds cCstjd|jt|jd}x|D]}tjryy|jd}Wqytk rutjd|q,qyXn|j }|j ds,| rq,n|j j |q,W|j dS(sRead the manifest file (named by 'self.manifest') and use it to fill in 'self.filelist', the list of files to include in the source distribution. sreading manifest file '%s'RZsUTF-8s"%r not UTF-8 decodable -- skippingt#N(RtinfoR\R_RtPY3tdecodetUnicodeDecodeErrorRNtstript startswithRRR<(R R\tline((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt read_manifests     N(sformats=Ns6formats for source distribution (comma-separated list)(s dist-dir=R sFdirectory to put the source distribution archive(s) in [default: dist](iii(ii(iii(ii(iii(R0R1t__doc__tNonet user_optionst negative_opttREADME_EXTENSIONSttupleROR%R'R(Rt staticmethodt contextlibtcontextmanagerR.t_sdist__read_template_hackR+R,thas_leaky_handleR7RIRKRRRRdRm(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR s:         (t distutilsRtdistutils.command.sdisttcommandR R&RR+R^Rutsetuptools.externRt py36compatRRtlistt_default_revctrlR (((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyts      PK!x(Lcommand/sdist.pyonu[ fc@sddlmZddljjZddlZddlZddlZddl Z ddl m Z ddl m Z ddlZeZddZde ejfd YZdS( i(tlogN(tsixi(tsdist_add_defaultstccs@x9tjdD](}x|j|D] }|Vq)WqWdS(s%Find all files under revision controlssetuptools.file_findersN(t pkg_resourcestiter_entry_pointstload(tdirnameteptitem((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt walk_revctrlstsdistcBs/eZdZd"ddddfd#gZiZd d d d gZedeDZdZ dZ dZ dZ e ejdZdZejd$kpd%ejkod&knpd'ejkod(knZereZndZdZdZdZdZd ZRS()s=Smart sdist that finds anything supported by revision controlsformats=s6formats for source distribution (comma-separated list)s keep-temptks1keep the distribution tree around after creating sarchive file(s)s dist-dir=tdsFdirectory to put the source distribution archive(s) in [default: dist]Rs.rsts.txts.mdccs|]}dj|VqdS(s README{0}N(tformat(t.0text((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pys )scCs|jd|jd}|j|_|jjtjj|jd|jx!|j D]}|j|qaW|j t |j dg}x<|j D]1}dd|f}||kr|j|qqWdS(Ntegg_infos SOURCES.txtt dist_filesR R(t run_commandtget_finalized_commandtfilelisttappendtostpathtjoinRt check_readmetget_sub_commandstmake_distributiontgetattrt distributiont archive_files(tselftei_cmdtcmd_nameRtfiletdata((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pytrun+s  "   cCstjj||jdS(N(torigR tinitialize_optionst_default_to_gztar(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR'>scCs#tjdkrdSdg|_dS(Niiitbetaitgztar(iiiR)i(tsyst version_infotformats(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR(CscCs'|jtjj|WdQXdS(s% Workaround for #516 N(t_remove_os_linkR&R R(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRIs ccssdddY}ttd|}y t`Wntk rBnXz dVWd||k rnttd|nXdS(sG In a context, remove and restore os.link if it exists tNoValuecBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR/WstlinkN((RRR2t Exceptiontsetattr(R/torig_val((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR.Ps    cCs[ytjj|Wn@tk rVtj\}}}|jjjdj nXdS(Nttemplate( R&R t read_templateR3R+texc_infottb_nextttb_frametf_localstclose(R t_ttb((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt__read_template_hackes  iiiiiicCs|jjr|jd}|jj|j|jjsxR|jD]D\}}}}|jjg|D]}tj j ||^qlqJWqndS(sgetting python filestbuild_pyN( Rthas_pure_modulesRRtextendtget_source_filestinclude_package_datat data_filesRRR(R R@R=tsrc_dirt filenamestfilename((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_add_defaults_python|s  cCsOy*tjrtj|n tjWntk rJtjdnXdS(Ns&data_files contains unexpected objects(RtPY2Rt_add_defaults_data_filestsupert TypeErrorRtwarn(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRKs   cCsKxD|jD]}tjj|r dSq W|jddj|jdS(Ns,standard file not found: should have one of s, (tREADMESRRtexistsRNR(R tf((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRs cCstjj|||tjj|d}ttdrltjj|rltj||j d|n|j dj |dS(Ns setup.cfgR2R( R&R tmake_release_treeRRRthasattrRPtunlinkt copy_fileRtsave_version_info(R tbase_dirtfilestdest((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRRs ! cCsStjj|jstStj|jd}|j}WdQX|djkS(Ntrbs+# file GENERATED by distutils, do NOT edit ( RRtisfiletmanifesttFalsetiotopentreadlinetencode(R tfpt first_line((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_manifest_is_not_generateds cCstjd|jt|jd}x|D]}tjryy|jd}Wqytk rutjd|q,qyXn|j }|j ds,| rq,n|j j |q,W|j dS(sRead the manifest file (named by 'self.manifest') and use it to fill in 'self.filelist', the list of files to include in the source distribution. sreading manifest file '%s'RZsUTF-8s"%r not UTF-8 decodable -- skippingt#N(RtinfoR\R_RtPY3tdecodetUnicodeDecodeErrorRNtstript startswithRRR<(R R\tline((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt read_manifests     N(sformats=Ns6formats for source distribution (comma-separated list)(s dist-dir=R sFdirectory to put the source distribution archive(s) in [default: dist](iii(ii(iii(ii(iii(R0R1t__doc__tNonet user_optionst negative_opttREADME_EXTENSIONSttupleROR%R'R(Rt staticmethodt contextlibtcontextmanagerR.t_sdist__read_template_hackR+R,thas_leaky_handleR7RIRKRRRRdRm(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR s:         (t distutilsRtdistutils.command.sdisttcommandR R&RR+R^Rutsetuptools.externRt py36compatRRtlistt_default_revctrlR (((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyts      PK!Gi2command/setopt.pyonu[ fc@sddlmZddlmZddlmZddlZddlZddlmZddl m Z ddd d gZ d d Z e d Zd e fdYZd efdYZdS(i(t convert_path(tlog(tDistutilsOptionErrorN(t configparser(tCommandt config_filet edit_configt option_basetsetopttlocalcCs|dkrdS|dkr>tjjtjjtjdS|dkrtjdkr_dpbd}tjjtd |St d |d S( sGet the filename of the distutils, local, global, or per-user config `kind` must be one of "local", "global", or "user" R s setup.cfgtglobals distutils.cfgtusertposixt.ts~/%spydistutils.cfgs7config_file() type must be 'local', 'global', or 'user'N( tostpathtjointdirnamet distutilst__file__tnamet expanduserRt ValueError(tkindtdot((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRs    c Cstjd|tj}|j|gx+|jD]\}}|d krttjd|||j|q9|j |stjd|||j |nx|jD]\}}|d kr&tjd||||j |||j |sRtjd|||j|qRqtjd|||||j |||qWq9Wtjd||st|d}|j|Wd QXnd S( sYEdit a configuration file to include `settings` `settings` is a dictionary of dictionaries or ``None`` values, keyed by command/section name. A ``None`` value means to delete the entire section, while a dictionary lists settings to be changed or deleted in that section. A setting of ``None`` means to delete that setting. sReading configuration from %ssDeleting section [%s] from %ssAdding new section [%s] to %ssDeleting %s.%s from %ss#Deleting empty [%s] section from %ssSetting %s.%s to %r in %ss Writing %stwN(RtdebugRtRawConfigParsertreadtitemstNonetinfotremove_sectiont has_sectiont add_sectiont remove_optiontoptionstsettopentwrite( tfilenametsettingstdry_runtoptstsectionR%toptiontvaluetf((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR!s8      cBs;eZdZd d dgZddgZd Zd ZRS(s<Abstract base class for commands that mess with config filess global-configtgs0save options to the site-wide distutils.cfg files user-configtus7save options to the current user's pydistutils.cfg files filename=R0s-configuration file to use (default=setup.cfg)cCsd|_d|_d|_dS(N(Rt global_configt user_configR)(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytinitialize_options\s  cCsg}|jr%|jtdn|jrD|jtdn|jdk rf|j|jn|s|jtdnt|dkrtd|n|\|_dS(NR R R is/Must specify only one configuration file option(R3tappendRR4R)RtlenR(R5t filenames((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytfinalize_optionsas   (s global-configR1s0save options to the site-wide distutils.cfg file(s user-configR2s7save options to the current user's pydistutils.cfg file(s filename=R0s-configuration file to use (default=setup.cfg)(t__name__t __module__t__doc__t user_optionstboolean_optionsR6R:(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRLs   cBsXeZdZdZddddgejZejd gZdZdZdZ RS(s#Save command-line options to a files1set an option in setup.cfg or another config filescommand=tcscommand to set an option forsoption=tos option to sets set-value=tssvalue of the optiontremovetrsremove (unset) the valuecCs5tj|d|_d|_d|_d|_dS(N(RR6RtcommandR.t set_valueRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR6s     cCsftj||jdks+|jdkr:tdn|jdkrb|j rbtdndS(Ns%Must specify --command *and* --options$Must specify --set-value or --remove(RR:RERR.RRFRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR:s  cCs=t|jii|j|jjdd6|j6|jdS(Nt-t_(RR)RFR.treplaceRER+(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytruns #(scommand=R@scommand to set an option for(soption=RAs option to set(s set-value=RBsvalue of the option(RCRDsremove (unset) the value( R;R<R=t descriptionRR>R?R6R:RJ(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRss   (tdistutils.utilRRRtdistutils.errorsRRtsetuptools.extern.six.movesRt setuptoolsRt__all__RtFalseRRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyts    +'PK!Gl((command/test.pyonu[ fc@s:ddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddlm Z ddl m Z ddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZd e fd YZd efd YZd efdYZ dS(iN(tDistutilsErrortDistutilsOptionError(tlog(t TestLoader(tsix(tmaptfilter( tresource_listdirtresource_existstnormalize_patht working_sett_namespace_packagestevaluate_markertadd_activation_listenertrequiret EntryPoint(tCommandtScanningLoadercBseZdZddZRS(cCstj|t|_dS(N(Rt__init__tsett_visited(tself((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs cCs7||jkrd S|jj|g}|jtj||t|drg|j|jnt|dr xt|j dD]|}|j dr|dkr|j d|d }n-t |j |dr|j d|}nq|j|j |qWnt |d kr+|j|S|d Sd S( sReturn a suite of all tests cases contained in the given module If the module is a package, load tests from all the modules in it. If the module has an ``additional_tests`` function, call it and add the return value to the tests. tadditional_testst__path__ts.pys __init__.pyt.is /__init__.pyiiN(RtNonetaddtappendRtloadTestsFromModulethasattrRRt__name__tendswithRtloadTestsFromNametlent suiteClass(Rtmoduletpatterntteststfilet submodule((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs$ N(Rt __module__RRR(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs tNonDataPropertycBseZdZddZRS(cCs ||_dS(N(tfget(RR+((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR>scCs|dkr|S|j|S(N(RR+(Rtobjtobjtype((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt__get__As N(RR)RRR.(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR*=s ttestcBseZdZdZdddgZd Zd Zed ZdZ dZ e j gdZ ee j dZedZdZdZedZedZRS(s.Command to run unit tests after in-place builds#run unit tests after in-place builds test-module=tms$Run 'test_suite' in specified modules test-suite=tss9Run single test, case or suite (e.g. 'module.test_suite')s test-runner=trsTest runner to usecCs(d|_d|_d|_d|_dS(N(Rt test_suitet test_modulet test_loadert test_runner(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytinitialize_optionsSs   cCs|jr'|jr'd}t|n|jdkrj|jdkrW|jj|_qj|jd|_n|jdkrt|jdd|_n|jdkrd|_n|jdkrt|jdd|_ndS(Ns1You may specify a module or a suite, but not boths .test_suiteR5s&setuptools.command.test:ScanningLoaderR6(R3R4RRt distributionR5tgetattrR6(Rtmsg((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytfinalize_optionsYs cCst|jS(N(tlistt _test_args(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt test_argslsccsJ|j r!tjdkr!dVn|jr2dVn|jrF|jVndS(Niitdiscovers --verbose(ii(R3tsyst version_infotverbose(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR=ps   cCs|j |WdQXdS(sI Backward compatibility for project_on_sys_path context. N(tproject_on_sys_path(Rtfunc((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytwith_project_on_sys_pathxs c cstjot|jdt}|r|jddd|jd|jd}t|j }|jdd||jd|jddd|jdn-|jd|jddd|jd|jd}t j }t j j }zut|j}t j jd|tjtd td |j|jf|j|g dVWdQXWd|t j (t j jt j j|tjXdS( Ntuse_2to3tbuild_pytinplaceitegg_infotegg_baset build_exticSs |jS(N(tactivate(tdist((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytRs%s==%s(RtPY3R9R8tFalsetreinitialize_commandt run_commandtget_finalized_commandR t build_libR@tpathtmodulestcopyRJtinsertR RR Rtegg_namet egg_versiontpaths_on_pythonpathtcleartupdate( Rt include_distst with_2to3tbpy_cmdt build_pathtei_cmdtold_patht old_modulest project_path((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRCs8         ccst}tjjd|}tjjdd}zXtjj|}td||g}tjj|}|r|tjds (tfetch_build_eggstinstall_requirest tests_requiretextras_requiretitemst itertoolstchain(RMtir_dttr_dter_d((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt install_distss c Cs|j|j}dj|j}|jrB|jd|dS|jd|ttjd|}|j |"|j |j WdQXWdQXdS(Nt sskipping "%s" (dry run)s running "%s"tlocation( RR8Rlt_argvtdry_runtannounceRtoperatort attrgetterR[RCt run_tests(Rtinstalled_diststcmdRn((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytruns  c CsEtjrt|jdtr|jjdd}|tkrg}|tj kre|j |n|d7}x0tj D]%}|j |ry|j |qyqyWt t tj j|qntjdd|jd|j|jd|j|jdt}|jjsAd|j}|j|tjt|ndS(NRFRit testLoadert testRunnertexitsTest failed: %s(RROR9R8RPR3tsplitR R@RVRRvR<Rt __delitem__tunittesttmainRRt_resolve_as_epR5R6tresultt wasSuccessfulRRtERRORR(RR$t del_modulestnameR/R:((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs(    cCsdg|jS(NR(R>(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRscCs0|dkrdStjd|}|jS(su Load the indicated attribute value, called, as a as if it were specified as an entry point. Nsx=(RRtparsetresolve(tvaltparsed((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs (s test-module=R0s$Run 'test_suite' in specified module(s test-suite=R1s9Run single test, case or suite (e.g. 'module.test_suite')(s test-runner=R2sTest runner to use(RR)t__doc__t descriptiont user_optionsR7R;R*R>R=REt contextlibtcontextmanagerRCt staticmethodR[RRRtpropertyRR(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR/Gs(     -  (!RhRR@RRRtdistutils.errorsRRt distutilsRRtsetuptools.externRtsetuptools.extern.six.movesRRt pkg_resourcesRRR R R R R RRt setuptoolsRRRgR*R/(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyts      @) PK!tddcommand/upload.pyonu[ fc@s9ddlZddlmZdejfdYZdS(iN(tuploadRcBs)eZdZdZdZdZRS(sa Override default upload behavior to obtain password in a variety of different ways. cCsPtjj||jp"tj|_|jpF|jpF|j|_dS(N( torigRtfinalize_optionstusernametgetpasstgetusertpasswordt_load_password_from_keyringt_prompt_for_password(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyR s    cCs>y&td}|j|j|jSWntk r9nXdS(sM Attempt to load password from keyring. Suppress Exceptions. tkeyringN(t __import__t get_passwordt repositoryRt Exception(R R ((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs   cCs,ytjSWnttfk r'nXdS(sH Prompt for a password on the tty. Suppress Exceptions. N(RRtKeyboardInterrupt(R ((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyR#s(t__name__t __module__t__doc__RRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs  (Rtdistutils.commandRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyts PK!n[rrcommand/__init__.pycnu[ fc@sdddddddddd d d d d dddddddddgZddlmZddlZddlmZdejkrdejds   PK!n[rrcommand/__init__.pyonu[ fc@sdddddddddd d d d d dddddddddgZddlmZddlZddlmZdejkrdejds   PK!Pz{U  command/alias.pycnu[ fc@shddlmZddlmZddlmZmZmZdZdefdYZ dZ dS( i(tDistutilsOptionError(tmap(t edit_configt option_baset config_filecCsJx$dD]}||krt|SqW|j|gkrFt|S|S(s4Quote an argument for later parsing by shlex.split()t"t's\t#(RRs\R(treprtsplit(targtc((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytshquotes    taliascBsUeZdZdZeZdgejZejdgZdZ dZ dZ RS( s3Define a shortcut that invokes one or more commandss0define a shortcut to invoke one or more commandstremovetrsremove (unset) the aliascCs#tj|d|_d|_dS(N(Rtinitialize_optionstNonetargsR(tself((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRs  cCs>tj||jr:t|jdkr:tdndS(NisFMust specify exactly one argument (the alias name) when using --remove(Rtfinalize_optionsRtlenRR(R((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR#s cCs |jjd}|jsNdGHdGHx"|D]}dt||fGHq,WdSt|jdkr|j\}|jrd}q||krdt||fGHdSd|GHdSn,|jd}djtt |jd}t |j ii||6d6|j dS( NtaliasessCommand Aliasess---------------ssetup.py aliasis No alias definition found for %rit ( t distributiontget_option_dictRt format_aliasRRRtjoinRR Rtfilenametdry_run(RRR tcommand((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytrun+s&        (RRsremove (unset) the alias( t__name__t __module__t__doc__t descriptiontTruetcommand_consumes_argumentsRt user_optionstboolean_optionsRRR(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR s   cCs{||\}}|tdkr+d}n@|tdkrFd}n%|tdkrad}n d|}||d|S( Ntglobals--global-config tusers--user-config tlocalts --filename=%rR(R(tnameRtsourceR((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRFs    N( tdistutils.errorsRtsetuptools.extern.six.movesRtsetuptools.command.setoptRRRR R R(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyts  4PK!Pz{U  command/alias.pyonu[ fc@shddlmZddlmZddlmZmZmZdZdefdYZ dZ dS( i(tDistutilsOptionError(tmap(t edit_configt option_baset config_filecCsJx$dD]}||krt|SqW|j|gkrFt|S|S(s4Quote an argument for later parsing by shlex.split()t"t's\t#(RRs\R(treprtsplit(targtc((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytshquotes    taliascBsUeZdZdZeZdgejZejdgZdZ dZ dZ RS( s3Define a shortcut that invokes one or more commandss0define a shortcut to invoke one or more commandstremovetrsremove (unset) the aliascCs#tj|d|_d|_dS(N(Rtinitialize_optionstNonetargsR(tself((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRs  cCs>tj||jr:t|jdkr:tdndS(NisFMust specify exactly one argument (the alias name) when using --remove(Rtfinalize_optionsRtlenRR(R((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR#s cCs |jjd}|jsNdGHdGHx"|D]}dt||fGHq,WdSt|jdkr|j\}|jrd}q||krdt||fGHdSd|GHdSn,|jd}djtt |jd}t |j ii||6d6|j dS( NtaliasessCommand Aliasess---------------ssetup.py aliasis No alias definition found for %rit ( t distributiontget_option_dictRt format_aliasRRRtjoinRR Rtfilenametdry_run(RRR tcommand((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytrun+s&        (RRsremove (unset) the alias( t__name__t __module__t__doc__t descriptiontTruetcommand_consumes_argumentsRt user_optionstboolean_optionsRRR(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR s   cCs{||\}}|tdkr+d}n@|tdkrFd}n%|tdkrad}n d|}||d|S( Ntglobals--global-config tusers--user-config tlocalts --filename=%rR(R(tnameRtsourceR((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRFs    N( tdistutils.errorsRtsetuptools.extern.six.movesRtsetuptools.command.setoptRRRR R R(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyts  4PK!iGGcommand/bdist_egg.pycnu[ fc@sdZddlmZddlmZmZddlmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZmZmZdd lmZdd lmZdd lmZy#dd lmZmZd ZWn0ek r9ddlm Z mZdZnXdZ!dZ"dZ#defdYZ$e%j&dj'Z(dZ)dZ*dZ+ide,6de-6Z.dZ/dZ0dZ1ddd d!gZ2d"d"e,d#d$Z3dS(%s6setuptools.command.bdist_egg Build .egg distributionsi(tDistutilsSetupError(t remove_treetmkpath(tlog(tCodeTypeN(tsix(tget_build_platformt Distributiontensure_directory(t EntryPoint(tLibrary(tCommand(tget_pathtget_python_versioncCs tdS(Ntpurelib(R (((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt _get_purelibs(tget_python_libR cCs ttS(N(RtFalse(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRscCsEd|kr%tjj|d}n|jdrA|d }n|S(Nt.itmodulei(tostpathtsplitexttendswith(tfilename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt strip_module#s   ccsIxBtj|D]1\}}}|j|j|||fVqWdS(sbDo os.walk in a reproducible way, independent of indeterministic filesystem readdir order N(Rtwalktsort(tdirtbasetdirstfiles((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt sorted_walk+s  cCsBtjdj}t|d}|j||WdQXdS(NsR def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__, %r) __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() tw(ttextwraptdedenttlstriptopentwrite(tresourcetpyfilet_stub_templatetf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt write_stub5st bdist_eggcBseZdZddddefdd d d d fd d!gZd ddgZdZdZdZ dZ dZ dZ dZ dZdZdZdZRS("screate an "egg" distributions bdist-dir=tbs1temporary directory for creating the distributions plat-name=tps;platform name to embed in generated filenames (default: %s)sexclude-source-filess+remove all .py files from the generated eggs keep-temptks/keep the pseudo-installation tree around after s!creating the distribution archives dist-dir=tds-directory to put final built distributions ins skip-builds2skip rebuilding everything (for testing/debugging)cCsCd|_d|_d|_d|_d|_d|_d|_dS(Ni(tNonet bdist_dirt plat_namet keep_temptdist_dirt skip_buildt egg_outputtexclude_source_files(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytinitialize_optionsZs      cCs|jd}|_|j|_|jdkr^|jdj}tjj|d|_n|j dkr|t |_ n|j dd|j dkrt dd|j|jt|jjo|j j}tjj|j|d|_ ndS(Ntegg_infotbdistteggR5s.egg(R5R5(tget_finalized_commandtei_cmdR;R2R1t bdist_baseRRtjoinR3Rtset_undefined_optionsR7Rtegg_namet egg_versionR t distributionthas_ext_modulesR5(R9R?R@tbasename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytfinalize_optionscs !cCs_|j|jd_tjjtjjt}|jj g}|j_ x|D]}t |t rt |dkrtjj |drtjj|d}tjj|}||ks|j|tjr|t |d|df}qqn|jj j|qVWz0tjd|j|jdddddWd||j_ XdS( Ntinstalliiisinstalling package data to %st install_datatforcetroot(R2R>t install_libRRtnormcasetrealpathRREt data_filest isinstancettupletlentisabst startswithtseptappendRtinfot call_commandR1(R9t site_packagestoldtitemROt normalized((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytdo_install_data{s ! !'cCs |jgS(N(R7(R9((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt get_outputsscKsmx!tD]}|j||jqW|jd|j|jd|j|j||}|j||S(s8Invoke reinitialized command `cmdname` with keyword argsR6tdry_run(tINSTALL_DIRECTORY_ATTRSt setdefaultR2R6R`treinitialize_commandt run_command(R9tcmdnametkwtdirnametcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRYs  c Cs|jdtjd|j|jd}|j}d|_|jjrj|j rj|jdn|j ddd}||_|j \}}g|_ g}xt |D]\}}tjj|\} } tjj|jt| d} |j j| tjd ||jsAttjj|| n|j| |jtjd ||tjj#|rtjd||jstj$|qnt%tjj| d |j&tjj'tjj|j(dr3tj)dn|j*rI|j+nt,|j-| d|j.d|jd|j/|j0st1|jd|jnt2|jdgjdt3|j-fdS(NR;sinstalling library code to %sRIt build_clibRMtwarn_diris.pyscreating stub loader for %st/sEGG-INFOtscriptssinstalling scripts to %stinstall_scriptst install_dirtno_episnative_libs.txts writing %stwts s removing %ss depends.txtsxWARNING: 'depends.txt' will not be used by setuptools 0.6! Use the install_requires/extras_require setup() args instead.tverboseR`tmodet dist_filesR,(4RdRRXR2R>RLR1REthas_c_librariesR6RYtget_ext_outputststubst enumerateRRRRARRWR`R+RGtreplaceRVt byte_compileRPR^RRltcopy_metadata_toRR%R&tclosetisfiletunlinktwrite_safety_flagtzip_safetexistsR;twarnR8t zap_pyfilest make_zipfileR7Rqt gen_headerR4RtgetattrR (R9tinstcmdtold_rootRht all_outputst ext_outputst to_compileR.text_nameRtextR(t archive_rootR;t script_dirt native_libst libs_file((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytrunsz                   $    c Cs-tjdxt|jD]\}}}x|D]}tjj||}|jdr}tjd|tj |n|jdr3|}d}t j ||}tjj|tj |j dd} tjd|| fytj| Wntk r nXtj|| q3q3WqWdS( Ns+Removing .py files from temporary directorys.pys Deleting %st __pycache__s#(?P.+)\.(?P[^.]+)\.pyctnames.pycsRenaming file from [%s] to [%s](RRXtwalk_eggR2RRRARtdebugR}tretmatchtpardirtgrouptremovetOSErrortrename( R9RRRRRtpath_oldtpatterntmtpath_new((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs*    cCsEt|jdd}|dk r%|Stjdt|j|jS(NRs4zip_safe flag not set; analyzing archive contents...(RRER1RRt analyze_eggR2Rv(R9tsafe((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR s   c Cs!tj|jjpd}|jdijd}|dkrFdS|j sY|jrotd|fnt j d }|j }dj |j}|jd}t jj|j}d t}|jstt jj|jd |jt|jd} | j|| jnd S( Ntssetuptools.installationt eggsecutableR!sGeggsecutable entry point (%r) cannot have 'extras' or refer to a moduleiRisH#!/bin/sh if [ `basename $0` = "%(basename)s" ] then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@" else echo $0 is not the correct name for this egg file. echo Please rename it back to %(basename)s and try again. exec false fi R`ta(R t parse_mapREt entry_pointstgetR1tattrstextrasRtsystversiont module_nameRARRRGR7tlocalsR`RRgR%R&R{( R9tepmteptpyvertpkgtfullRRGtheaderR*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs*      "  cCstjj|j}tjj|d}xb|jjjD]Q}|j|r:tjj||t |}t ||j ||q:q:WdS(s*Copy metadata (egg info) to the target_dirRN( RRtnormpathR;RAR?tfilelistRRURSRt copy_file(R9t target_dirt norm_egg_infotprefixRttarget((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRz:s c Csg}g}id|j6}xt|jD]\}}}xH|D]@}tjj|djtkrB|j|||qBqBWx3|D]+}|||d|tjj||t extensionsRQR tget_ext_fullnameRtget_ext_filenameRGRUR( R9RRtpathsRRRRt build_cmdRtfullname((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRuFs( " -$(s bdist-dir=R-s1temporary directory for creating the distributionN(sexclude-source-filesNs+remove all .py files from the generated egg(s dist-dir=R0s-directory to put final built distributions in(s skip-buildNs2skip rebuilding everything (for testing/debugging)(t__name__t __module__t descriptionRR1t user_optionstboolean_optionsR:RHR^R_RYRRRRRzRu(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR,Cs4       Q   ' s.dll .so .dylib .pydccset|}t|\}}}d|kr=|jdn|||fVx|D] }|VqRWdS(s@Walk an unpacked egg's contents, skipping the metadata directorysEGG-INFON(R tnextR(tegg_dirtwalkerRRRtbdf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRfs   c CsxBtjD]4\}}tjjtjj|d|r |Sq WtsRtSt}xt |D]\}}}xn|D]f}|j ds{|j drq{q{|j ds|j dr{t ||||o|}q{q{WqeW|S(NsEGG-INFOs.pys.pyws.pycs.pyo( t safety_flagstitemsRRRRAtcan_scanRtTrueRRt scan_module( RRvtflagtfnRRRRR((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRqs$  &cCsxtjD]\}}tjj||}tjj|rq|dks^t||krtj|qq |dk r t||kr t |d}|j d|j q q WdS(NRps ( RRRRRARR1tboolR}R%R&R{(RRRRR*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR~s szip-safes not-zip-safec Cstjj||}|d |kr)tS|t|djtjd}||r[dp^dtjj|d}tj dkrd}ntj dkrd }nd }t |d }|j |t j |} |jt} tjt| } x<d d gD].} | | kr tjd|| t} q q Wd| krxZdddddddddddg D].} | | krotjd|| t} qoqoWn| S(s;Check whether module possibly uses unsafe-for-zipfile stuffiiRRiiiii itrbt__file__t__path__s%s: module references %stinspectt getsourcet getabsfilet getsourcefiletgetfilegetsourcelinest findsourcet getcommentst getframeinfotgetinnerframestgetouterframeststackttraces"%s: module MAY be using inspect.%s(ii(ii(RRRARRSRxRVRRt version_infoR%treadtmarshaltloadR{tdicttfromkeyst iter_symbolsRRR( RRRRvRRRtskipR*tcodeRtsymbolstbad((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs:#*          ccsyx|jD] }|Vq WxY|jD]N}t|tjrC|Vq#t|tr#xt|D] }|Vq_Wq#q#WdS(sBYield names and strings used by `code` and its nested code objectsN(tco_namest co_constsRQRt string_typesRR(RRtconst((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs cCsDtjjd r&tjdkr&tStjdtjddS(Ntjavatclis1Unable to analyze compiled code on this platform.sfPlease ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.py(RtplatformRURRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs" RMRnRJt install_baseiR!c sddl}ttjj|dtjd|fd}|r\|jn|j}s|j ||d|} x-t D]\} } } || | | qW| j n0x-t D]\} } } |d| | qW|S(sqCreate a zip file from all the files under 'base_dir'. The output zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" Python module (if available) or the InfoZIP "zip" utility (if installed and found on the default search path). If neither tool is available, raises DistutilsExecError. Returns the name of the output zip file. iNR`s#creating '%s' and adding '%s' to itcsx|D]y}tjjtjj||}tjj|r|td}sm|j||ntjd|qqWdS(Nis adding '%s'( RRRRAR|RSR&RR(tzRgtnamesRRR.(tbase_dirR`(s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytvisits !t compression( tzipfileRRRRgRRXt ZIP_DEFLATEDt ZIP_STOREDtZipFileR R{R1( t zip_filenameRRqR`tcompressRrRRRRRgRR((RR`s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs   (4t__doc__tdistutils.errorsRtdistutils.dir_utilRRt distutilsRttypesRRRRR"Rtsetuptools.externRt pkg_resourcesRRRR tsetuptools.extensionR t setuptoolsR t sysconfigR R Rt ImportErrortdistutils.sysconfigRRR R+R,RRtsplitRRRR~RRRRRRRaR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytsL          !    $  PK!iGGcommand/bdist_egg.pyonu[ fc@sdZddlmZddlmZmZddlmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZmZmZdd lmZdd lmZdd lmZy#dd lmZmZd ZWn0ek r9ddlm Z mZdZnXdZ!dZ"dZ#defdYZ$e%j&dj'Z(dZ)dZ*dZ+ide,6de-6Z.dZ/dZ0dZ1ddd d!gZ2d"d"e,d#d$Z3dS(%s6setuptools.command.bdist_egg Build .egg distributionsi(tDistutilsSetupError(t remove_treetmkpath(tlog(tCodeTypeN(tsix(tget_build_platformt Distributiontensure_directory(t EntryPoint(tLibrary(tCommand(tget_pathtget_python_versioncCs tdS(Ntpurelib(R (((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt _get_purelibs(tget_python_libR cCs ttS(N(RtFalse(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRscCsEd|kr%tjj|d}n|jdrA|d }n|S(Nt.itmodulei(tostpathtsplitexttendswith(tfilename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt strip_module#s   ccsIxBtj|D]1\}}}|j|j|||fVqWdS(sbDo os.walk in a reproducible way, independent of indeterministic filesystem readdir order N(Rtwalktsort(tdirtbasetdirstfiles((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt sorted_walk+s  cCsBtjdj}t|d}|j||WdQXdS(NsR def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__, %r) __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() tw(ttextwraptdedenttlstriptopentwrite(tresourcetpyfilet_stub_templatetf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt write_stub5st bdist_eggcBseZdZddddefdd d d d fd d!gZd ddgZdZdZdZ dZ dZ dZ dZ dZdZdZdZRS("screate an "egg" distributions bdist-dir=tbs1temporary directory for creating the distributions plat-name=tps;platform name to embed in generated filenames (default: %s)sexclude-source-filess+remove all .py files from the generated eggs keep-temptks/keep the pseudo-installation tree around after s!creating the distribution archives dist-dir=tds-directory to put final built distributions ins skip-builds2skip rebuilding everything (for testing/debugging)cCsCd|_d|_d|_d|_d|_d|_d|_dS(Ni(tNonet bdist_dirt plat_namet keep_temptdist_dirt skip_buildt egg_outputtexclude_source_files(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytinitialize_optionsZs      cCs|jd}|_|j|_|jdkr^|jdj}tjj|d|_n|j dkr|t |_ n|j dd|j dkrt dd|j|jt|jjo|j j}tjj|j|d|_ ndS(Ntegg_infotbdistteggR5s.egg(R5R5(tget_finalized_commandtei_cmdR;R2R1t bdist_baseRRtjoinR3Rtset_undefined_optionsR7Rtegg_namet egg_versionR t distributionthas_ext_modulesR5(R9R?R@tbasename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytfinalize_optionscs !cCs_|j|jd_tjjtjjt}|jj g}|j_ x|D]}t |t rt |dkrtjj |drtjj|d}tjj|}||ks|j|tjr|t |d|df}qqn|jj j|qVWz0tjd|j|jdddddWd||j_ XdS( Ntinstalliiisinstalling package data to %st install_datatforcetroot(R2R>t install_libRRtnormcasetrealpathRREt data_filest isinstancettupletlentisabst startswithtseptappendRtinfot call_commandR1(R9t site_packagestoldtitemROt normalized((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytdo_install_data{s ! !'cCs |jgS(N(R7(R9((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt get_outputsscKsmx!tD]}|j||jqW|jd|j|jd|j|j||}|j||S(s8Invoke reinitialized command `cmdname` with keyword argsR6tdry_run(tINSTALL_DIRECTORY_ATTRSt setdefaultR2R6R`treinitialize_commandt run_command(R9tcmdnametkwtdirnametcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRYs  c Cs|jdtjd|j|jd}|j}d|_|jjrj|j rj|jdn|j ddd}||_|j \}}g|_ g}xt |D]\}}tjj|\} } tjj|jt| d} |j j| tjd ||jsAttjj|| n|j| |jtjd ||tjj#|rtjd||jstj$|qnt%tjj| d |j&tjj'tjj|j(dr3tj)dn|j*rI|j+nt,|j-| d|j.d|jd|j/|j0st1|jd|jnt2|jdgjdt3|j-fdS(NR;sinstalling library code to %sRIt build_clibRMtwarn_diris.pyscreating stub loader for %st/sEGG-INFOtscriptssinstalling scripts to %stinstall_scriptst install_dirtno_episnative_libs.txts writing %stwts s removing %ss depends.txtsxWARNING: 'depends.txt' will not be used by setuptools 0.6! Use the install_requires/extras_require setup() args instead.tverboseR`tmodet dist_filesR,(4RdRRXR2R>RLR1REthas_c_librariesR6RYtget_ext_outputststubst enumerateRRRRARRWR`R+RGtreplaceRVt byte_compileRPR^RRltcopy_metadata_toRR%R&tclosetisfiletunlinktwrite_safety_flagtzip_safetexistsR;twarnR8t zap_pyfilest make_zipfileR7Rqt gen_headerR4RtgetattrR (R9tinstcmdtold_rootRht all_outputst ext_outputst to_compileR.text_nameRtextR(t archive_rootR;t script_dirt native_libst libs_file((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytrunsz                   $    c Cs-tjdxt|jD]\}}}x|D]}tjj||}|jdr}tjd|tj |n|jdr3|}d}t j ||}tjj|tj |j dd} tjd|| fytj| Wntk r nXtj|| q3q3WqWdS( Ns+Removing .py files from temporary directorys.pys Deleting %st __pycache__s#(?P.+)\.(?P[^.]+)\.pyctnames.pycsRenaming file from [%s] to [%s](RRXtwalk_eggR2RRRARtdebugR}tretmatchtpardirtgrouptremovetOSErrortrename( R9RRRRRtpath_oldtpatterntmtpath_new((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs*    cCsEt|jdd}|dk r%|Stjdt|j|jS(NRs4zip_safe flag not set; analyzing archive contents...(RRER1RRt analyze_eggR2Rv(R9tsafe((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR s   c Cs!tj|jjpd}|jdijd}|dkrFdS|j sY|jrotd|fnt j d }|j }dj |j}|jd}t jj|j}d t}|jstt jj|jd |jt|jd} | j|| jnd S( Ntssetuptools.installationt eggsecutableR!sGeggsecutable entry point (%r) cannot have 'extras' or refer to a moduleiRisH#!/bin/sh if [ `basename $0` = "%(basename)s" ] then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@" else echo $0 is not the correct name for this egg file. echo Please rename it back to %(basename)s and try again. exec false fi R`ta(R t parse_mapREt entry_pointstgetR1tattrstextrasRtsystversiont module_nameRARRRGR7tlocalsR`RRgR%R&R{( R9tepmteptpyvertpkgtfullRRGtheaderR*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs*      "  cCstjj|j}tjj|d}xb|jjjD]Q}|j|r:tjj||t |}t ||j ||q:q:WdS(s*Copy metadata (egg info) to the target_dirRN( RRtnormpathR;RAR?tfilelistRRURSRt copy_file(R9t target_dirt norm_egg_infotprefixRttarget((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRz:s c Csg}g}id|j6}xt|jD]\}}}xH|D]@}tjj|djtkrB|j|||qBqBWx3|D]+}|||d|tjj||t extensionsRQR tget_ext_fullnameRtget_ext_filenameRGRUR( R9RRtpathsRRRRt build_cmdRtfullname((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRuFs( " -$(s bdist-dir=R-s1temporary directory for creating the distributionN(sexclude-source-filesNs+remove all .py files from the generated egg(s dist-dir=R0s-directory to put final built distributions in(s skip-buildNs2skip rebuilding everything (for testing/debugging)(t__name__t __module__t descriptionRR1t user_optionstboolean_optionsR:RHR^R_RYRRRRRzRu(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR,Cs4       Q   ' s.dll .so .dylib .pydccset|}t|\}}}d|kr=|jdn|||fVx|D] }|VqRWdS(s@Walk an unpacked egg's contents, skipping the metadata directorysEGG-INFON(R tnextR(tegg_dirtwalkerRRRtbdf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRfs   c CsxBtjD]4\}}tjjtjj|d|r |Sq WtsRtSt}xt |D]\}}}xn|D]f}|j ds{|j drq{q{|j ds|j dr{t ||||o|}q{q{WqeW|S(NsEGG-INFOs.pys.pyws.pycs.pyo( t safety_flagstitemsRRRRAtcan_scanRtTrueRRt scan_module( RRvtflagtfnRRRRR((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRqs$  &cCsxtjD]\}}tjj||}tjj|rq|dks^t||krtj|qq |dk r t||kr t |d}|j d|j q q WdS(NRps ( RRRRRARR1tboolR}R%R&R{(RRRRR*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR~s szip-safes not-zip-safec Cstjj||}|d |kr)tS|t|djtjd}||r[dp^dtjj|d}tj dkrd}ntj dkrd }nd }t |d }|j |t j |} |jt} tjt| } x<d d gD].} | | kr tjd|| t} q q Wd| krxZdddddddddddg D].} | | krotjd|| t} qoqoWn| S(s;Check whether module possibly uses unsafe-for-zipfile stuffiiRRiiiii itrbt__file__t__path__s%s: module references %stinspectt getsourcet getabsfilet getsourcefiletgetfilegetsourcelinest findsourcet getcommentst getframeinfotgetinnerframestgetouterframeststackttraces"%s: module MAY be using inspect.%s(ii(ii(RRRARRSRxRVRRt version_infoR%treadtmarshaltloadR{tdicttfromkeyst iter_symbolsRRR( RRRRvRRRtskipR*tcodeRtsymbolstbad((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs:#*          ccsyx|jD] }|Vq WxY|jD]N}t|tjrC|Vq#t|tr#xt|D] }|Vq_Wq#q#WdS(sBYield names and strings used by `code` and its nested code objectsN(tco_namest co_constsRQRt string_typesRR(RRtconst((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs cCsDtjjd r&tjdkr&tStjdtjddS(Ntjavatclis1Unable to analyze compiled code on this platform.sfPlease ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.py(RtplatformRURRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs" RMRnRJt install_baseiR!c sddl}ttjj|dtjd|fd}|r\|jn|j}s|j ||d|} x-t D]\} } } || | | qW| j n0x-t D]\} } } |d| | qW|S(sqCreate a zip file from all the files under 'base_dir'. The output zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" Python module (if available) or the InfoZIP "zip" utility (if installed and found on the default search path). If neither tool is available, raises DistutilsExecError. Returns the name of the output zip file. iNR`s#creating '%s' and adding '%s' to itcsx|D]y}tjjtjj||}tjj|r|td}sm|j||ntjd|qqWdS(Nis adding '%s'( RRRRAR|RSR&RR(tzRgtnamesRRR.(tbase_dirR`(s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytvisits !t compression( tzipfileRRRRgRRXt ZIP_DEFLATEDt ZIP_STOREDtZipFileR R{R1( t zip_filenameRRqR`tcompressRrRRRRRgRR((RR`s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs   (4t__doc__tdistutils.errorsRtdistutils.dir_utilRRt distutilsRttypesRRRRR"Rtsetuptools.externRt pkg_resourcesRRRR tsetuptools.extensionR t setuptoolsR t sysconfigR R Rt ImportErrortdistutils.sysconfigRRR R+R,RRtsplitRRRR~RRRRRRRaR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytsL          !    $  PK!'zzcommand/bdist_rpm.pycnu[ fc@s/ddljjZdejfdYZdS(iNt bdist_rpmcBs eZdZdZdZRS(sf Override the default bdist_rpm behavior to do the following: 1. Run egg_info to ensure the name and version are properly calculated. 2. Always run 'install' using --single-version-externally-managed to disable eggs in RPM distributions. 3. Replace dash with underscore in the version numbers for better RPM compatibility. cCs!|jdtjj|dS(Ntegg_info(t run_commandtorigRtrun(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs c Cs|jj}|jdd}tjj|}d|}d|}g|D]<}|jddjddjdd j||^qN}|j|d }d |}|j|||S( Nt-t_s%define version sSource0: %{name}-%{version}.tars)Source0: %{name}-%{unmangled_version}.tarssetup.py install s5setup.py install --single-version-externally-managed s%setups&%setup -n %{name}-%{unmangled_version}is%define unmangled_version (t distributiont get_versiontreplaceRRt_make_spec_filetindextinsert( Rtversiont rpmversiontspectline23tline24tlinet insert_loctunmangled_version((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyR s   F (t__name__t __module__t__doc__RR (((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs  (tdistutils.command.bdist_rpmtcommandRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pytsPK!command/bdist_wininst.pycnu[ fc@s/ddljjZdejfdYZdS(iNt bdist_wininstcBseZddZdZRS(icCs1|jj||}|dkr-d|_n|S(sj Supplement reinitialize_command to work around http://bugs.python.org/issue20819 tinstallt install_lib(RRN(t distributiontreinitialize_commandtNoneR(tselftcommandtreinit_subcommandstcmd((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs     cCs.t|_ztjj|Wdt|_XdS(N(tTruet _is_runningtorigRtruntFalse(R((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyR s (t__name__t __module__RR (((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs (tdistutils.command.bdist_wininstRRR (((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pytsPK!c.g dep_util.pycnu[ fc@sddlmZdZdS(i(t newer_groupcCst|t|kr'tdng}g}xVtt|D]B}t||||rF|j|||j||qFqFW||fS(sWalk both arguments in parallel, testing if each source group is newer than its corresponding target. Returns a pair of lists (sources_groups, targets) where sources is newer than target, according to the semantics of 'newer_group()'. s5'sources_group' and 'targets' must be the same length(tlent ValueErrortrangeRtappend(tsources_groupsttargetst n_sourcest n_targetsti((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pytnewer_pairwise_groupsN(tdistutils.dep_utilRR (((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pytsPK!KcSS depends.pycnu[ fc@sddlZddlZddlZddlmZddlmZmZmZmZddl m Z dddd gZ ddd YZ dd Zddd Zdd ZdZedS(iN(t StrictVersion(t PKG_DIRECTORYt PY_COMPILEDt PY_SOURCEt PY_FROZENi(tBytecodetRequiret find_moduletget_module_constanttextract_constantcBsYeZdZdd d dZdZdZd ddZd dZd dZ RS( s7A prerequisite to building or installing a distributiontcCsn|dkr!|dk r!t}n|dk rQ||}|dkrQd}qQn|jjt|`dS(Nt __version__(tNoneRt__dict__tupdatetlocalstself(Rtnametrequested_versiontmodulethomepaget attributetformat((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt__init__s     cCs*|jdk r#d|j|jfS|jS(s0Return full package/distribution name, w/versions%s-%sN(RR R(R((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt full_name scCs=|jdkp<|jdkp<t|dko<||jkS(s%Is 'version' sufficiently up-to-date?tunknownN(RR RtstrR(Rtversion((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt version_ok&sRcCs|jdkr]y6t|j|\}}}|r@|jn|SWq]tk rYdSXnt|j|j||}|dk r||k r|jdk r|j|S|S(sGet version number of installed module, 'None', or 'default' Search 'paths' for module. If not found, return 'None'. If found, return the extracted version attribute, or 'default' if no version attribute was specified, or the value cannot be determined without importing the module. The version is formatted according to the requirement's version format (if any), unless it is 'None' or the supplied 'default'. N(RR RRtcloset ImportErrorRR(Rtpathstdefaulttftptitv((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt get_version+s   ' cCs|j|dk S(s/Return true if dependency is present on 'paths'N(R%R (RR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt is_presentFscCs,|j|}|dkrtS|j|S(s>Return true if dependency is present and up-to-date on 'paths'N(R%R tFalseR(RRR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt is_currentJs N( t__name__t __module__t__doc__R RRRR%R&R((((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRs   c Cs|jd}x|r|jd}tj||\}}\}}}} |tkrv|pgdg}|g}q|rtd||fqqW| S(s7Just like 'imp.find_module()', but with package supportt.iRsCan't find %r in %s(tsplittpoptimpRRR( RRtpartstpartR!tpathtsuffixtmodetkindtinfo((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRRs (  c Csy%t||\}}\}}}Wntk r9dSXz|tkrh|jdtj|} n|tkrtj |} no|t krt |j|d} nH|t j krtj||||||fntt j ||dSWd|r |jnXt| ||S(sFind 'module' by searching 'paths', and extract 'symbol' Return 'None' if 'module' does not exist on 'paths', or it does not define 'symbol'. If the module defines 'symbol' as a constant, return the constant. Otherwise, return 'default'.itexecN(RRR RtreadtmarshaltloadRR/tget_frozen_objectRtcompiletsystmodulest load_moduletgetattrRR ( RtsymbolR RR!R2R3R4R5tcode((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRes$%     "c Cs||jkrdSt|jj|}d}d}d}|}xpt|D]b}|j} |j} | |kr|j| }qP| |kr| |ks| |kr|S|}qPWdS(sExtract the constant value of 'symbol' from 'code' If the name 'symbol' is bound to a constant value by the Python code object 'code', return that value. If 'symbol' is bound to an expression, return 'default'. Otherwise, return 'None'. Return value is based on the first assignment to 'symbol'. 'symbol' must be a global, or at least a non-"fast" local in the code block. That is, only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' must be present in 'code.co_names'. iZiaidN(tco_namesR tlisttindexRtopcodetargt co_consts( RBRAR tname_idxt STORE_NAMEt STORE_GLOBALt LOAD_CONSTtconstt byte_codetopRG((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyR s    $cCsXtjjd r&tjdkr&dSd}x%|D]}t|=tj|q3WdS(s Patch the globals to remove the objects not available on some platforms. XXX it'd be better to test assertions about bytecode instead. tjavatcliNR R(R R(R=tplatformt startswithtglobalst__all__tremove(t incompatibleR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt_update_globalss "  ((R=R/R9tdistutils.versionRRRRRt py33compatRRURR RRR RX(((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyts   "C " $ PK!qzdist.pyonu[ fc@sKdgZddlZddlZddlZddlZddlZddlZddlZddl Zddl Z ddl m Z ddl mZmZmZddlmZddlmZddlmZddlmZdd lmZmZmZdd lmZdd lmZdd l m!Z!dd l"m#Z#ddl$Z$ddl%m&Z&e'de'ddZ(dZ)dZ*dZ+e,e-fZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8d Z9d!Z:e!ej;j<Z=de&e=fd"YZ<d#fd$YZ>dS(%t DistributioniN(t defaultdict(tDistutilsOptionErrortDistutilsPlatformErrortDistutilsSetupError(t rfc822_escape(t StrictVersion(tsix(t packaging(tmaptfiltert filterfalse(tRequire(twindows_support(t get_unpatched(tparse_configurationi(tDistribution_parse_config_filess&setuptools.extern.packaging.specifierss#setuptools.extern.packaging.versioncCstjdtt|S(NsDo not call this function(twarningstwarntDeprecationWarningR(tcls((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_get_unpatched#scCs|js|jrtdS|jdk sR|jdk sRt|dddk r\tdS|js|js|j s|j s|j rtdStdS(Ns2.1tpython_requiress1.2s1.1s1.0( tlong_description_content_typetprovides_extrasRt maintainertNonetmaintainer_emailtgetattrtprovidestrequirest obsoletest classifierst download_url(tdist_md((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_metadata_version(s   c Cst|}|jd||jd|j|jd|j|jd|j|jd|j|tdkr|jd|j|jd|jnyd#d$d%d&f}xd|D]\\}}t ||}t j r |j |}n|d"k r|jd||fqqW|jd|j|jrl|jd|jnx(|jjD]}|jd|q|Wt|j}|jd|dj|j} | r|jd| n|tdkr&xA|jD]} |jd| qWn|j|d|j|j|d|j|j|d|j|j|d|j|j|d|jt|dr|jd|jn|jr|jd |jn|jrx%|jD]} |jd!| qWnd"S('s5Write the PKG-INFO format data to a file object. sMetadata-Version: %s s Name: %s s Version: %s s Summary: %s sHome-page: %s s1.2s Author: %s sAuthor-email: %s tAuthortauthors Author-emailt author_emailt MaintainerRsMaintainer-emailRs%s: %s s License: %s sDownload-URL: %s sProject-URL: %s, %s sDescription: %s t,s Keywords: %s s Platform: %s tPlatformt ClassifiertRequirestProvidest ObsoletesRsRequires-Python: %s sDescription-Content-Type: %s sProvides-Extra: %s N(R$R%(s Author-emailR&(R'R(sMaintainer-emailR( R#twritetget_namet get_versiontget_descriptiontget_urlRt get_contacttget_contact_emailRRtPY2t _encode_fieldRt get_licenseR!t project_urlstitemsRtget_long_descriptiontjoint get_keywordst get_platformst _write_listtget_classifierst get_requirest get_providest get_obsoletesthasattrRRR( tselftfiletversiontoptional_fieldstfieldtattrtattr_valt project_urlt long_desctkeywordstplatformtextra((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_file7s\       cCs>ttjj|dddd}|j|WdQXdS(s3Write the PKG-INFO file into the release tree. sPKG-INFOtwtencodingsUTF-8N(topentostpathR;RP(RDtbase_dirtpkg_info((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_infos cCsTytjjd|}Wn3ttttfk rOtd||fnXdS(Nsx=s4%r must be importable 'module:attrs' string (got %r)(t pkg_resourcest EntryPointtparset TypeErrort ValueErrortAttributeErrortAssertionErrorR(tdistRItvaluetep((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_importablescCs>yWn3ttttfk r9td||fnXdS(s*Verify that value is a string list or Nones%%r must be a list of strings (got %r)N(R\R]R^R_R(R`RIRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytassert_string_lists cCs|}t|||xw|D]o}|j|sItdd|n|jd\}}}|r||krtjjd||qqWdS(s(Verify that namespace packages are valids1Distribution contains no modules or packages for snamespace package %rt.s^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyN(Rdthas_contents_forRt rpartitiont distutilstlogR(R`RIRat ns_packagestnsptparenttseptchild((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt check_nsps  cCsMy ttjt|jWn&tttfk rHtdnXdS(s+Verify that extras_require mapping is valids'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.N( tlistt itertoolststarmapt _check_extraR9R\R]R^R(R`RIRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt check_extrass  cCsW|jd\}}}|r@tj|r@td|nttj|dS(Nt:sInvalid environment marker: (t partitionRYtinvalid_markerRRptparse_requirements(ROtreqstnameRmtmarker((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRsscCs=t||kr9d}t|jd|d|ndS(s)Verify that value is True, False, 0, or 1s0{attr!r} must be a boolean value (got {value!r})RIRaN(tboolRtformat(R`RIRattmpl((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt assert_boolscCsy;ttj|t|ttfr:tdnWn=ttfk rz}d}t|j d|d|nXdS(s9Verify that install_requires is a valid requirements listsUnordered types are not allowedsm{attr!r} must be a string or list of strings containing valid project/version requirement specifiers; {error}RIterrorN( RpRYRxt isinstancetdicttsetR\R]RR}(R`RIRaRR~((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_requirementsscCsXytjj|Wn=tjjk rS}d}t|jd|d|nXdS(s.Verify that value is a valid version specifiersF{attr!r} must be a string containing valid version specifiers; {error}RIRN(Rt specifierst SpecifierSettInvalidSpecifierRR}(R`RIRaRR~((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_specifiers cCs:ytjj|Wntk r5}t|nXdS(s)Verify that entry_points map is parseableN(RYRZt parse_mapR]R(R`RIRate((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_entry_pointsscCs%t|tjs!tdndS(Nstest_suite must be a string(RRt string_typesR(R`RIRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_test_suitescCs}t|trixW|jD]B\}}t|ts;Pnyt|Wqtk r]PqXqWdSnt|ddS(s@Verify that value is a dictionary of package names to glob listsNsI must be a dictionary mapping package names to lists of wildcard patterns(RRR9tstrtiterR\R(R`RIRatktv((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_package_datas  cCs=x6|D].}tjd|stjjd|qqWdS(Ns \w+(\.\w+)*s[WARNING: %r not a valid package name; please use only .-separated package names in setup.py(tretmatchRhRiR(R`RIRatpkgname((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_packagess   cBsLeZdZd"ZdZd"dZdZdZe dZ dZ dZ d"e dZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&d!Z'RS(#sDistribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that effectively adds the following new optional keyword arguments to 'setup()': 'install_requires' -- a string or sequence of strings specifying project versions that the distribution requires when installed, in the format used by 'pkg_resources.require()'. They will be installed automatically when the package is installed. If you wish to use packages that are not available in PyPI, or want to give your users an alternate download location, you can add a 'find_links' option to the '[easy_install]' section of your project's 'setup.cfg' file, and then setuptools will scan the listed web pages for links that satisfy the requirements. 'extras_require' -- a dictionary mapping names of optional "extras" to the additional requirement(s) that using those extras incurs. For example, this:: extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) indicates that the distribution can optionally provide an extra capability called "reST", but it can only be used if docutils and reSTedit are installed. If the user installs your package using EasyInstall and requests one of your extras, the corresponding additional requirements will be installed if needed. 'features' **deprecated** -- a dictionary mapping option names to 'setuptools.Feature' objects. Features are a portion of the distribution that can be included or excluded based on user options, inter-feature dependencies, and availability on the current system. Excluded features are omitted from all setup commands, including source and binary distributions, so you can create multiple distributions from the same source tree. Feature names should be valid Python identifiers, except that they may contain the '-' (minus) sign. Features can be included or excluded via the command line options '--with-X' and '--without-X', where 'X' is the name of the feature. Whether a feature is included by default, and whether you are allowed to control this from the command line, is determined by the Feature object. See the 'Feature' class for more information. 'test_suite' -- the name of a test suite to run for the 'test' command. If the user runs 'python setup.py test', the package will be installed, and the named test suite will be run. The format is the same as would be used on a 'unittest.py' command line. That is, it is the dotted name of an object to import and call to generate a test suite. 'package_data' -- a dictionary mapping package names to lists of filenames or globs to use to find data files contained in the named packages. If the dictionary has filenames or globs listed under '""' (the empty string), those names will be searched for in every package, in addition to any names for the specific package. Data files found using these names/globs will be installed along with the package, in the same location as the package. Note that globs are allowed to reference the contents of non-package subdirectories, as long as you use '/' as a path separator. (Globs are automatically converted to platform-specific paths at runtime.) In addition to these new keywords, this class also has several new methods for manipulating the distribution's contents. For example, the 'include()' and 'exclude()' methods can be thought of as in-place add and subtract commands that add or remove packages, modules, extensions, and so on from the distribution. They are used by the feature subsystem to configure the distribution for the included and excluded features. cCs| sd|ksd|kr#dStjt|dj}tjjj|}|dk r|jd rtj t|d|_ ||_ ndS(NRzRFsPKG-INFO( RYt safe_nameRtlowert working_settby_keytgetRt has_metadatat safe_versiont_versiont _patched_dist(RDtattrstkeyR`((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytpatch_missing_pkg_infoVscCsUt|d}|s!i|_n|p*i}d|ksEd|krRtjng|_i|_g|_|jdd|_ |j ||j di|_ |jdg|_ |jdg|_x0tjdD]}t|j|jdqWtj||t|jd|j |j_ |j d |j_t|jd t|j_t|jjtjrt|jj|j_n|jjdk rGyft jj!|jj}t|}|jj|kr t"j#d |jj|f||j_nWqGt jj$t%fk rCt"j#d |jjqGXn|j&dS( Nt package_datatfeaturestrequire_featurestsrc_rootR8tdependency_linkstsetup_requiressdistutils.setup_keywordsRRsNormalizing '%s' to '%s'sThe version specified (%r) is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.('RCRtFeaturetwarn_deprecatedRRt dist_filestpopRRRRR8RRRYtiter_entry_pointstvarst setdefaultRzt _Distributiont__init__RtmetadataRRRRRFtnumberstNumberRRtVersionRRtInvalidVersionR\t_finalize_requires(RDRthave_package_dataRbtvertnormalized_version((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRcsP          cCst|ddr$|j|j_nt|ddrxI|jjD]5}|jdd}|rF|jjj|qFqFWn|j |j dS(s Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. Rtextras_requireRuiN( RRRRRtkeystsplitRtaddt_convert_extras_requirementst"_move_install_requirements_markers(RDRO((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs cCst|ddpi}tt|_xf|jD]X\}}|j|x>tj|D]-}|j|}|j||j |q[Wq4WdS(s Convert requirements in `extras_require` of the form `"extra": ["barbazquux; {marker}"]` to `"extra:{marker}": ["barbazquux"]`. RN( RRRRpt_tmp_extras_requireR9RYRxt _suffix_fortappend(RDt spec_ext_reqstsectionRtrtsuffix((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs cCs|jrdt|jSdS(se For a requirement, return the 'extras_require' suffix for that requirement. Rut(R{R(treq((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRscsd}tddpd}ttj|}t||}t||}ttt|_ x/|D]'}j dt|j j |qsWt fdj jD_dS(sv Move requirements in `install_requires` that are using environment markers `extras_require`. cSs|j S(N(R{(R((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt is_simple_reqstinstall_requiresRuc3sF|]<\}}|gtj|D]}t|^q%fVqdS(N(R t _clean_reqR(t.0RRR(RD(s3/usr/lib/python2.7/site-packages/setuptools/dist.pys sN((RRRpRYRxR R R RRRR{RRR9R(RDRtspec_inst_reqst inst_reqst simple_reqst complex_reqsR((RDs3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs  % cCs d|_|S(sP Given a Requirement, remove environment markers and return it. N(RR{(RDR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs cCs7tj|d|t||jd||jdS(sYParses configuration files from various levels and loads configuration. t filenamestignore_option_errorsN(Rtparse_config_filesRtcommand_optionsR(RDRR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRscCs)tj|}|jr%|jn|S(s3Process features after parsing command line options(Rtparse_command_lineRt_finalize_features(RDtresult((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs  cCsd|jddS(s;Convert feature name to corresponding option attribute nametwith_t-t_(treplace(RDRz((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_feature_attrnamescCsUtjjtj|d|jdt}x$|D]}tjj|dtq1W|S(sResolve pre-setup requirementst installertreplace_conflictingR(RYRtresolveRxtfetch_build_eggtTrueR(RDRtresolved_distsR`((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytfetch_build_eggss    cCstj||jr#|jnxgtjdD]V}t||jd}|dk r3|j d|j |j ||j|q3q3Wt|ddrg|j D]}t jj|^q|_ n g|_ dS(Nsdistutils.setup_keywordsRtconvert_2to3_doctests(Rtfinalize_optionsRt_set_global_opts_from_featuresRYRRRzRtrequireRtloadRRTRUtabspath(RDRbRatp((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs     +cCstjjtjd}tjj|stj|tj|tjj|d}t|d.}|j d|j d|j dWdQXn|S(Ns.eggss README.txtRQscThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins. sAThis directory caches those eggs to prevent repeated downloads. s/However, it is safe to delete this directory. ( RTRUR;tcurdirtexiststmkdirR t hide_fileRSR.(RDt egg_cache_dirtreadme_txt_filenametf((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_egg_cache_dirs    cCsddlm}|jidgd6}|jd}|j|jd|jdjD|jr|j}d|kr|dd|}nd|f|d0s Ritsetuptargstxt install_dirtexclude_scriptst always_copytbuild_directoryteditabletupgradet multi_versiont no_reporttuserN( tsetuptools.command.easy_installRt __class__tget_option_dicttcleartupdateR9RRRtFalseRtensure_finalized(RDRRR`toptstlinksRtcmd((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR)s(      c Csg}|jj}x|jjD]\}}|j|d|j||jr%|j}d}d}|j s||}}nd|dd||fd|dd||ff}|j |d||d|(RDRRRtexclude((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR@s  cCs?t|ts%td|fntt|j|dS(Ns.packages: setting must be a list or tuple (%r)(RR;RRpR R9(RDR3((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_exclude_packagessc Cs|jj|_|jj|_|d}|jd}xS||kr||\}}||=ddl}|j|t|d*|d}q:Wtj|||}|j |} t | ddrd|f|j|d<|dk rgSn|S(Nitaliasesiitcommand_consumes_argumentss command lineR( RRRR tshlexRRRt_parse_command_optsR(RR( RDtparserRR)RBtsrctaliasRDtnargst cmd_class((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyREs"   c Cs'i}x|jjD] \}}x|jD]\}\}}|dkrSq/n|jdd}|dkr|j|}|jj}|jt|dixZ|jD](\} } | |kr| }d}PqqWt dn|dkrd}n||j |i|R1R@RARERSR:R^(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRsFB 7                       ( RcBsYeZdZedZeeedddZdZdZ dZ dZ RS( s **deprecated** -- The `Feature` facility was never completely implemented or supported, `has reported issues `_ and will be removed in a future version. A subset of the distribution that can be excluded if unneeded/wanted Features are created using these keyword arguments: 'description' -- a short, human readable description of the feature, to be used in error messages, and option help messages. 'standard' -- if true, the feature is included by default if it is available on the current system. Otherwise, the feature is only included if requested via a command line '--with-X' option, or if another included feature requires it. The default setting is 'False'. 'available' -- if true, the feature is available for installation on the current system. The default setting is 'True'. 'optional' -- if true, the feature's inclusion can be controlled from the command line, using the '--with-X' or '--without-X' options. If false, the feature's inclusion status is determined automatically, based on 'availabile', 'standard', and whether any other feature requires it. The default setting is 'True'. 'require_features' -- a string or sequence of strings naming features that should also be included if this feature is included. Defaults to empty list. May also contain 'Require' objects that should be added/removed from the distribution. 'remove' -- a string or list of strings naming packages to be removed from the distribution if this feature is *not* included. If the feature *is* included, this argument is ignored. This argument exists to support removing features that "crosscut" a distribution, such as defining a 'tests' feature that removes all the 'tests' subpackages provided by other features. The default for this argument is an empty list. (Note: the named package(s) or modules must exist in the base distribution when the 'setup()' function is initially called.) other keywords -- any other keyword arguments are saved, and passed to the distribution's 'include()' and 'exclude()' methods when the feature is included or excluded, respectively. So, for example, you could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be added or removed from the distribution as appropriate. A feature must include at least one 'requires', 'remove', or other keyword argument. Otherwise, it can't affect the distribution in any way. Note also that you can subclass 'Feature' to create your own specialized feature types that modify the distribution in other ways when included or excluded. See the docstrings for the various methods here for more detail. Aside from the methods, the only feature attributes that distributions look at are 'description' and 'optional'. cCs d}tj|tdddS(NsrFeatures are deprecated and will be removed in a future version. See https://github.com/pypa/setuptools/issues/65.t stackleveli(RRR(tmsg((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRsc Ks |j||_||_||_||_t|ttfrO|f}ng|D]}t|trV|^qV|_g|D]}t|ts|^q} | r| |ds\                H          PK!%Yr r extension.pycnu[ fc@sddlZddlZddlZddlZddlZddlmZddlm Z dZ e Z e ej j ZdefdYZ de fd YZdS( iN(tmapi(t get_unpatchedcCs<d}yt|ddgjtSWntk r7nXtS(s0 Return True if Cython can be imported. sCython.Distutils.build_exttfromlistt build_ext(t __import__RtTruet ExceptiontFalse(t cython_impl((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt _have_cython s t ExtensioncBs eZdZdZdZRS(s7Extension that uses '.c' files in place of '.pyx' filescOs2|jdt|_tj|||||dS(Ntpy_limited_api(tpopRR t _Extensiont__init__(tselftnametsourcestargstkw((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR#scCsqtr dS|jpd}|jdkr4dnd}tjtjd|}tt||j |_ dS(s Replace sources with .pyx extensions to sources with the target language extension. This mechanism allows language authors to supply pre-converted sources but to prefer the .pyx sources. Ntsc++s.cpps.cs.pyx$( R tlanguagetlowert functoolstpartialtretsubtlistRR(Rtlangt target_extR((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt_convert_pyx_sources_to_lang)s  (t__name__t __module__t__doc__RR(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR s tLibrarycBseZdZRS(s=Just like a regular Extension, but built as a library instead(RR R!(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR"8s(RRtdistutils.coret distutilstdistutils.errorstdistutils.extensiontsetuptools.extern.six.movesRtmonkeyRR t have_pyrextcoreR R R"(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyts      PK!%Yr r extension.pyonu[ fc@sddlZddlZddlZddlZddlZddlmZddlm Z dZ e Z e ej j ZdefdYZ de fd YZdS( iN(tmapi(t get_unpatchedcCs<d}yt|ddgjtSWntk r7nXtS(s0 Return True if Cython can be imported. sCython.Distutils.build_exttfromlistt build_ext(t __import__RtTruet ExceptiontFalse(t cython_impl((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt _have_cython s t ExtensioncBs eZdZdZdZRS(s7Extension that uses '.c' files in place of '.pyx' filescOs2|jdt|_tj|||||dS(Ntpy_limited_api(tpopRR t _Extensiont__init__(tselftnametsourcestargstkw((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR#scCsqtr dS|jpd}|jdkr4dnd}tjtjd|}tt||j |_ dS(s Replace sources with .pyx extensions to sources with the target language extension. This mechanism allows language authors to supply pre-converted sources but to prefer the .pyx sources. Ntsc++s.cpps.cs.pyx$( R tlanguagetlowert functoolstpartialtretsubtlistRR(Rtlangt target_extR((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt_convert_pyx_sources_to_lang)s  (t__name__t __module__t__doc__RR(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR s tLibrarycBseZdZRS(s=Just like a regular Extension, but built as a library instead(RR R!(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR"8s(RRtdistutils.coret distutilstdistutils.errorstdistutils.extensiontsetuptools.extern.six.movesRtmonkeyRR t have_pyrextcoreR R R"(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyts      PK!q q extern/__init__.pycnu[ fc@s?ddlZdddYZd ZeeedjdS( iNtVendorImportercBsJeZdZdddZedZddZdZdZ RS(s A PEP 302 meta path importer for finding optionally-vendored or otherwise naturally-installed packages from root_name. cCs7||_t||_|p-|jdd|_dS(Ntexternt_vendor(t root_nametsettvendored_namestreplacet vendor_pkg(tselfRRR((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt__init__ s ccs|jdVdVdS(sL Search first the vendor package then as a natural package. t.tN(R(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt search_paths cCsL|j|jd\}}}|r)dStt|j|jsHdS|S(s Return self when fullname starts with root_name and the target module is one vendored through this importer. R N(t partitionRtanytmapt startswithR(Rtfullnametpathtroottbasettarget((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt find_modules cCs|j|jd\}}}x|jD]l}yR||}t|tj|}|tj|/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt load_module#s      cCs&|tjkr"tjj|ndS(sR Install this importer into sys.meta_path if not already present. N(Rt meta_pathtappend(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytinstall@s(N( t__name__t __module__t__doc__tNoneR tpropertyR RR!R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyRs  tsixt packagingt pyparsingssetuptools._vendor((R*R+R,(RRtnamesR%R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyts DPK!q q extern/__init__.pyonu[ fc@s?ddlZdddYZd ZeeedjdS( iNtVendorImportercBsJeZdZdddZedZddZdZdZ RS(s A PEP 302 meta path importer for finding optionally-vendored or otherwise naturally-installed packages from root_name. cCs7||_t||_|p-|jdd|_dS(Ntexternt_vendor(t root_nametsettvendored_namestreplacet vendor_pkg(tselfRRR((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt__init__ s ccs|jdVdVdS(sL Search first the vendor package then as a natural package. t.tN(R(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt search_paths cCsL|j|jd\}}}|r)dStt|j|jsHdS|S(s Return self when fullname starts with root_name and the target module is one vendored through this importer. R N(t partitionRtanytmapt startswithR(Rtfullnametpathtroottbasettarget((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt find_modules cCs|j|jd\}}}x|jD]l}yR||}t|tj|}|tj|/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt load_module#s      cCs&|tjkr"tjj|ndS(sR Install this importer into sys.meta_path if not already present. N(Rt meta_pathtappend(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytinstall@s(N( t__name__t __module__t__doc__tNoneR tpropertyR RR!R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyRs  tsixt packagingt pyparsingssetuptools._vendor((R*R+R,(RRtnamesR%R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyts DPK!Hglob.pyonu[ fc@sdZddlZddlZddlZddlmZdddgZedZedZ d Z d Z d Z d Z d ZejdZejdZdZdZdZdS(s Filename globbing utility. Mostly a copy of `glob` from Python 3.5. Changes include: * `yield from` and PEP3102 `*` removed. * `bytes` changed to `six.binary_type`. * Hidden files are not ignored. iN(t binary_typetglobtiglobtescapecCstt|d|S(syReturn a list of paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. t recursive(tlistR(tpathnameR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRs cCs4t||}|r0t|r0t|}n|S(sReturn an iterator which yields the paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. (t_iglobt _isrecursivetnext(RRtitts((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR s  ccsntjj|\}}t|se|rGtjj|ra|Vqantjj|ra|VndS|s|rt|rx>t||D] }|VqWnxt||D] }|VqWdS||krt|rt ||}n |g}t|r%|rt|rt}q+t}nt }x<|D]4}x+|||D]}tjj ||VqHWq2WdS(N( tostpathtsplitt has_magictlexiststisdirRtglob2tglob1Rtglob0tjoin(RRtdirnametbasenametxtdirst glob_in_dirtname((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR2s4         cCsn|s6t|tr*tjjd}q6tj}nytj|}Wntk r]gSXtj||S(NtASCII( t isinstanceRR tcurdirtencodetlistdirtOSErrortfnmatchtfilter(Rtpatterntnames((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR]s  cCsN|s"tjj|rJ|gSn(tjjtjj||rJ|gSgS(N(R R RRR(RR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRjs  !ccs)|d Vxt|D] }|VqWdS(Ni(t _rlistdir(RR$R((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRzs ccs|s6t|tr*ttjd}q6tj}nytj|}Wntjk r`dSXx_|D]W}|V|rtjj||n|}x(t|D]}tjj||VqWqhWdS(NR( RRR RR terrorR RR&(RR%RR ty((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR&s  !s([*?[])cCs:t|tr!tj|}ntj|}|dk S(N(RRtmagic_check_bytestsearcht magic_checktNone(R tmatch((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRscCs't|tr|dkS|dkSdS(Ns**(RR(R$((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRs cCsVtjj|\}}t|tr<tjd|}ntjd|}||S(s#Escape all special characters. s[\1](R R t splitdriveRRR)tsubR+(Rtdrive((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRs (t__doc__R treR"tsetuptools.extern.sixRt__all__tFalseRRRRRRR&tcompileR+R)RRR(((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyts"      +     PK!I launch.pycnu[ fc@sAdZddlZddlZdZedkr=endS(s[ Launch the Python script on the command line after setuptools is bootstrapped via import. iNcBseejd}ed|dddd }ejdej(eede}||j}|j dd}e ||d }||Ud S( sP Run the script in sys.argv[1] as if it had been invoked naturally. it__file__t__name__t__main__t__doc__topens\r\ns\ntexecN( t __builtins__tsystargvtdicttNonetgetattrttokenizeRtreadtreplacetcompile(t script_namet namespacetopen_tscriptt norm_scripttcode((s5/usr/lib/python2.7/site-packages/setuptools/launch.pytrun s  R(RR RRR(((s5/usr/lib/python2.7/site-packages/setuptools/launch.pyts     PK!x- lib2to3_ex.pycnu[ fc@sxdZddlmZddlmZddlmZmZddl Z defdYZ defd YZdS( sy Customized Mixin2to3 support: - adds support for converting doctests This module raises an ImportError on Python 2. i(t Mixin2to3(tlog(tRefactoringTooltget_fixers_from_packageNtDistutilsRefactoringToolcBs#eZdZdZdZRS(cOstj||dS(N(Rterror(tselftmsgtargstkw((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt log_errorscGstj||dS(N(Rtinfo(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt log_messagescGstj||dS(N(Rtdebug(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt log_debugs(t__name__t __module__R R R(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs  RcBs&eZedZdZdZRS(cCs|jjtk rdS|s dStjddj||j|j|rtj rt |j }|j |dtdtqnt j||dS(NsFixing t twritet doctests_only(t distributiontuse_2to3tTrueRR tjoint_Mixin2to3__build_fixer_namest_Mixin2to3__exclude_fixerst setuptoolstrun_2to3_on_doctestsRt fixer_namestrefactort _Mixin2to3trun_2to3(Rtfilestdocteststr((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs   cCs|jr dSg|_x'tjD]}|jjt|q W|jjdk rx-|jjD]}|jjt|q_WndS(N(RRtlib2to3_fixer_packagestextendRRtuse_2to3_fixerstNone(Rtp((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__build_fixer_names.s  cCsqt|dg}|jjdk r:|j|jjnx0|D](}||jkrA|jj|qAqAWdS(Ntexclude_fixers(tgetattrRtuse_2to3_exclude_fixersR&R$Rtremove(Rtexcluded_fixerst fixer_name((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__exclude_fixers8s  (RRtFalseRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs  ( t__doc__tdistutils.utilRRt distutilsRtlib2to3.refactorRRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyts   PK!K  monkey.pycnu[ fc@sdZddlZddlZddlZddlZddlZddlmZddl Z ddl m Z ddl Z gZ dZdZdZdZd Zd Zd Zd Zd ZdS(s Monkey patching of distutils. iN(t import_module(tsixcCs-tjdkr |f|jStj|S(sm Returns the bases classes for cls sorted by the MRO. Works around an issue on Jython where inspect.getmro will not return all base classes if multiple classes share the same name. Instead, this function will return a tuple containing the class itself, and the contents of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. tJython(tplatformtpython_implementationt __bases__tinspecttgetmro(tcls((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt_get_mros cCsCt|tjrtnt|tjr0tnd}||S(NcSsdS(N(tNone(titem((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt*t(t isinstanceRt class_typestget_unpatched_classttypest FunctionTypetget_unpatched_function(R tlookup((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt get_unpatched&s cCsQdt|D}t|}|jjdsMd|}t|n|S(sProtect against re-patching the distutils if reloaded Also ensures that no other distutils extension monkeypatched the distutils first. css'|]}|jjds|VqdS(t setuptoolsN(t __module__t startswith(t.0R((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pys 6st distutilss(distutils has already been patched by %r(R tnextRRtAssertionError(Rtexternal_basestbasetmsg((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR/s  cCsWtjtj_tjd k}|r6tjtj_ntjd kpd tjko_dknpdtjko~dknpdtjkodkn}|rd }|tjj _ nt t x/tj tjtjfD]}tj j|_qWtjjtj_tjjtj_d tjkrLtjjtjd _ntdS(Niiiii iiishttps://upload.pypi.org/legacy/sdistutils.command.build_ext(iii(iii (ii(iii(ii(iii(ii(iii(RtCommandRtcoretsyst version_infotfindalltfilelisttconfigt PyPIRCCommandtDEFAULT_REPOSITORYt+_patch_distribution_metadata_write_pkg_filet+_patch_distribution_metadata_write_pkg_infotdisttcmdt Distributiont extensiont Extensiontmodulest#patch_for_msvc_specialized_compiler(thas_issue_12885tneeds_warehouset warehousetmodule((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt patch_allAs(cCstjjtjj_dS(sDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN(RR+twrite_pkg_fileRtDistributionMetadata(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR)kscCsFdtjd kodkn}|s-dStjjtjj_dS(s Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local encoding to save the pkg_info. Monkey-patch its write_pkg_info method to correct this undesirable behavior. iiN(i(iii(R"R#RR+twrite_pkg_infoRR8(tenvironment_local((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR*rs#cCs9t||}t|jd|t|||dS(s Patch func_name in target_mod with replacement Important - original must be resolved by name to avoid patching an already patched function. t unpatchedN(tgetattrtvarst setdefaulttsetattr(t replacementt target_modt func_nametoriginal((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt patch_funcscCs t|dS(NR;(R<(t candidate((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyRscstdtjdkr"dSfd}tj|d}tj|d}y$t|dt|dWntk rnXyt|d Wntk rnXyt|d Wntk rnXdS( s\ Patch functions in distutils to use standalone Microsoft Visual C++ compilers. ssetuptools.msvctWindowsNcsqd|krdnd}||jd}t|}t|}t||sdt|n|||fS(sT Prepare the parameters for patch_func to patch indicated function. tmsvc9tmsvc9_tmsvc14_t_(tlstripR<Rthasattrt ImportError(tmod_nameRBt repl_prefixt repl_nametrepltmod(tmsvc(s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt patch_paramss sdistutils.msvc9compilersdistutils._msvccompilertfind_vcvarsalltquery_vcvarsallt _get_vc_envtgen_lib_options(RRtsystemt functoolstpartialRDRM(RTRGtmsvc14((RSs5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR1s&     (t__doc__R"tdistutils.filelistRRRRZt importlibRRtsetuptools.externRRt__all__R RRR6R)R*RDRR1(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyts&          *    PK!g[⣠msvc.pycnu[ fc@sydZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ej dkrddl mZejZnd fd YZeZeejjfZydd lmZWnek rnXd Zd dZdZdZddZdfdYZdfdYZdfdYZdfdYZ dS(s@ Improved support for Microsoft Visual C++ compilers. Known supported compilers: -------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) iN(t LegacyVersion(t filterfalsei(t get_unpatchedtWindows(twinregRcBs eZdZdZdZdZRS(N(t__name__t __module__tNonet HKEY_USERStHKEY_CURRENT_USERtHKEY_LOCAL_MACHINEtHKEY_CLASSES_ROOT(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR(s(tRegcCsd}|d|f}ytj|d}WnQtk ry&|d|f}tj|d}Wqtk r{d}qXnX|rtjjjj|d}tjj|r|Sntt |S(s+ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone compiler build for Python (VCForPython). Fall back to original behavior when the standalone compiler is not available. Redirect the path of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Parameters ---------- version: float Required Microsoft Visual C++ version. Return ------ vcvarsall.bat path: str s-Software\%sMicrosoft\DevDiv\VCForPython\%0.1ftt installdirs Wow6432Node\s vcvarsall.batN( R t get_valuetKeyErrorRtostpathtjointisfileRtmsvc9_find_vcvarsall(tversiontVC_BASEtkeyt productdirt vcvarsall((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR?s  tx86cOsy#tt}|||||SWn'tjjk r<ntk rLnXyt||jSWn,tjjk r}t|||nXdS(s Patched "distutils.msvc9compiler.query_vcvarsall" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Parameters ---------- ver: float Required Microsoft Visual C++ version. arch: str Target architecture. Return ------ environment: dict N( Rtmsvc9_query_vcvarsallt distutilsterrorstDistutilsPlatformErrort ValueErrortEnvironmentInfot return_envt_augment_exception(tvertarchtargstkwargstorigtexc((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRjs  cCsxytt|SWntjjk r-nXyt|ddjSWn)tjjk rs}t|dnXdS(s' Patched "distutils._msvccompiler._get_vc_env" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) Parameters ---------- plat_spec: str Target architecture. Return ------ environment: dict t vc_min_verg,@N(Rtmsvc14_get_vc_envRRRR!R"R#(t plat_specR)((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR+s cOsbdtjkrOddl}t|jtdkrO|jjj||Sntt ||S(s Patched "distutils._msvccompiler.gen_lib_options" for fix compatibility between "numpy.distutils" and "distutils._msvccompiler" (for Numpy < 1.11.2) snumpy.distutilsiNs1.11.2( tsystmodulestnumpyRt __version__Rt ccompilertgen_lib_optionsRtmsvc14_gen_lib_options(R&R'tnp((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR3s  R cCs|jd}d|jks1d|jkrd}|jt}d}|dkr|jjddkr|d 7}||d 7}q|d 7}q|d kr|d 7}||d7}q|dkr|d7}qn|f|_dS(sl Add details to the exception message to help guide the user as to what action will resolve it. iRsvisual cs0Microsoft Visual C++ {version:0.1f} is required.s-www.microsoft.com/download/details.aspx?id=%dg"@tia64is* Get it with "Microsoft Windows SDK 7.0": iB s% Get it from http://aka.ms/vcpython27g$@s* Get it with "Microsoft Windows SDK 7.1": iW g,@sj Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-toolsN(R&tlowertformattlocalstfind(R)RR%tmessagettmplt msdownload((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR#s  $      t PlatformInfocBszeZdZejddjZdZedZ dZ dZ e e dZ e e dZe d ZRS( s Current and Target Architectures informations. Parameters ---------- arch: str Target architecture. tprocessor_architectureR cCs|jjdd|_dS(Ntx64tamd64(R6treplaceR%(tselfR%((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt__init__scCs|j|jjddS(Nt_i(R%R9(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt target_cpuscCs |jdkS(NR(RE(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt target_is_x86scCs |jdkS(NR(t current_cpu(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytcurrent_is_x86scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sj Current platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '' if architecture is x86. x64: bool return 'd' and not 'md64' if architecture is amd64. Return ------ subfolder: str ' arget', or '' (see hidex86 parameter) RR R@s\x64s\%s(RG(RBthidex86R?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt current_dir scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sr Target platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '\x86' if architecture is x86. x64: bool return '\x64' and not '\amd64' if architecture is amd64. Return ------ subfolder: str '\current', or '' (see hidex86 parameter) RR R@s\x64s\%s(RE(RBRIR?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt target_dirscCsB|r dn|j}|j|kr(dS|jjdd|S(so Cross platform specific subfolder. Parameters ---------- forcex86: bool Use 'x86' as current architecture even if current acritecture is not x86. Return ------ subfolder: str '' if target architecture is current architecture, '\current_target' if not. RR s\s\%s_(RGRERKRA(RBtforcex86tcurrent((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt cross_dir5s(RRt__doc__tsafe_envtgetR6RGRCtpropertyRERFRHtFalseRJRKRN(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR=s   t RegistryInfocBseZdZejejejejfZdZ e dZ e dZ e dZ e dZe dZe dZe dZe d Ze d Zed Zd ZRS( s Microsoft Visual Studio related registry informations. Parameters ---------- platform_info: PlatformInfo "PlatformInfo" instance. cCs ||_dS(N(tpi(RBt platform_info((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCZscCsdS(s< Microsoft Visual Studio root registry key. t VisualStudio((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt visualstudio]scCstjj|jdS(s; Microsoft Visual Studio SxS registry key. tSxS(RRRRX(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytsxsdscCstjj|jdS(s8 Microsoft Visual C++ VC7 registry key. tVC7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvckscCstjj|jdS(s; Microsoft Visual Studio VS7 registry key. tVS7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvsrscCsdS(s? Microsoft Visual C++ for Python registry key. sDevDiv\VCForPython((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt vc_for_pythonyscCsdS(s- Microsoft SDK registry key. sMicrosoft SDKs((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt microsoft_sdkscCstjj|jdS(s> Microsoft Windows/Platform SDK registry key. R(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt windows_sdkscCstjj|jdS(s< Microsoft .NET Framework SDK registry key. tNETFXSDK(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt netfx_sdkscCsdS(s< Microsoft Windows Kits Roots registry key. sWindows Kits\Installed Roots((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytwindows_kits_rootsscCs:|jjs|rdnd}tjjd|d|S(s  Return key in Microsoft software registry. Parameters ---------- key: str Registry key path where look. x86: str Force x86 software registry. Return ------ str: value R t Wow6432NodetSoftwaret Microsoft(RURHRRR(RBRRtnode64((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt microsofts!cCstj}tj}|j}x|jD]}y||||d|}Wnkttfk r|jjs%y"||||t d|}Wqttfk rq%qXqq%nXytj ||dSWq%ttfk rq%Xq%WdS(s Look for values in registry in Microsoft software registry. Parameters ---------- key: str Registry key path where look. name: str Value name to find. Return ------ str: value iN( RtKEY_READtOpenKeyRitHKEYStOSErrortIOErrorRURHtTruet QueryValueEx(RBRtnameRjtopenkeytmsthkeytbkey((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytlookups"   " (RRRORRR R R RlRCRRRXRZR\R^R_R`RaRcRdRSRiRv(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRTLs"   t SystemInfocBsjeZdZejddZejddZejdeZddZ dZ dZ e dZ e d Zd Zd Ze d Ze d Ze dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZdZddZRS(s Microsoft Windows and Visual Studio related system inormations. Parameters ---------- registry_info: RegistryInfo "RegistryInfo" instance. vc_ver: float Required Microsoft Visual C++ version. tWinDirR t ProgramFilessProgramFiles(x86)cCs1||_|jj|_|p'|j|_dS(N(triRUt_find_latest_available_vc_vertvc_ver(RBt registry_infoR|((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCs cCsBy|jdSWn)tk r=d}tjj|nXdS(Nis%No Microsoft Visual C++ version found(tfind_available_vc_verst IndexErrorRRR(RBterr((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR{s  c Cs|jj}|jj|jj|jjf}g}xI|jjD];}x2|D]*}y%tj|||dtj}Wnt t fk rqMnXtj |\}}} xdt |D]V} y<t tj|| d} | |kr|j| nWqtk rqXqWx`t |D]R} y8t tj|| } | |kr^|j| nWq!tk rrq!Xq!WqMWq@Wt|S(sC Find all available Microsoft Visual C++ versions. i(RzRiR\R_R^RlRRkRjRmRnt QueryInfoKeytrangetfloatt EnumValuetappendR tEnumKeytsorted( RBRstvckeystvc_versRtRRutsubkeystvaluesRDtiR$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR~s2 ! %    cCsKd|j}tjj|j|}|jj|jjd|jpJ|S(s4 Microsoft Visual Studio directory. sMicrosoft Visual Studio %0.1fs%0.1f(R|RRRtProgramFilesx86RzRvR^(RBRqtdefault((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VSInstallDir s cCs|j|jp|j}tjj|jjd|j}|jj |d}|rqtjj|dn|}|jj |jj d|jp|}tjj |sd}t j j|n|S(s1 Microsoft Visual C++ directory. s%0.1fRtVCs(Microsoft Visual C++ directory not found(Rt _guess_vct_guess_vc_legacyRRRRzR_R|RvR\tisdirRRR(RBtguess_vctreg_patht python_vct default_vcRtmsg((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCInstallDirs"!(cCs||jdkrdSd}tjj|j|}y*tj|d}tjj||SWntttfk rwnXdS(s* Locate Visual C for 2017 g,@Ns VC\Tools\MSVCi( R|RRRRtlistdirRmRnR(RBRRt vc_exact_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR0scCs#d|j}tjj|j|S(s< Locate Visual C for versions prior to 2017 s Microsoft Visual Studio %0.1f\VC(R|RRRR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR@s cCsc|jdkrdS|jdkr&dS|jdkr9dS|jd krLdS|jdkr_dSdS(sN Microsoft Windows SDK versions for specified MSVC++ version. g"@s7.0s6.1s6.0ag$@s7.1s7.0ag&@s8.0s8.0ag(@s8.1s8.1ag,@s10.0N(s7.0s6.1s6.0a(s7.1s7.0a(s8.0s8.0a(s8.1s8.1a(s10.0s8.1(R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkVersionGscCs|jtjj|jdS(s4 Microsoft Windows SDK last version tlib(t_use_last_dir_nameRRRt WindowsSdkDir(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkLastVersionWscCsd}xO|jD]D}tjj|jjd|}|jj|d}|rPqqW| srtjj| rtjj|jjd|j }|jj|d}|rtjj|d}qn| stjj| rKxd|jD]V}||j d }d|}tjj|j |}tjj|r|}qqWn| setjj| rxQ|jD]C}d |}tjj|j |}tjj|ro|}qoqoWn|stjj|j d }n|S( s2 Microsoft Windows SDK directory. R sv%stinstallationfolders%0.1fRtWinSDKt.sMicrosoft SDKs\Windows Kits\%ssMicrosoft SDKs\Windows\v%st PlatformSDK( RRRRRzRaRvRR_R|trfindRyR(RBtsdkdirR$tlocRt install_basetintvertd((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR_s6"  c Cs8|jdkrd}d}n<d}|jdkr9tnt}|jjdtd|}d||jd d f}g}|jd krx9|jD]+}|tjj |j j ||g7}qWnx:|j D]/}|tjj |j j d ||g7}qWx-|D]%}|j j|d }|r Pq q W|S(s= Microsoft Windows SDK executable directory. g&@i#R i(g(@R?RIsWinSDK-NetFx%dTools%ss\t-g,@sv%sAR(R|RoRSRURJRAtNetFxSdkVersionRRRRzRcRRaRv( RBtnetfxverR%RItfxtregpathsR$Rtexecpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSDKExecutablePaths$ ,- cCsAd|j}tjj|jj|}|jj|dp@dS(s0 Microsoft Visual F# directory. s%0.1f\Setup\F#RR (R|RRRRzRXRv(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharpInstallDirs cCsb|jdkrd}nd}x7|D]/}|jj|jjd|}|r%Pq%q%W|padS(s8 Microsoft Universal CRT SDK directory. g,@t10t81s kitsroot%sR (RR((R|RzRvRd(RBtversR$R((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkDirs   cCs|jtjj|jdS(s@ Microsoft Universal C Runtime SDK last version R(RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkLastVersionscCs|jdkrdSdSdS(s8 Microsoft .NET Framework SDK versions. g,@s4.6.1s4.6N(s4.6.1s4.6((R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRscCsXxK|jD]@}tjj|jj|}|jj|d}|r Pq q W|pWdS(s9 Microsoft .NET Framework SDK directory. tkitsinstallationfolderR (RRRRRzRcRv(RBR$RR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt NetFxSdkDirs cCs7tjj|jd}|jj|jjdp6|S(s; Microsoft .NET Framework 32bit directory. sMicrosoft.NET\Frameworktframeworkdir32(RRRRxRzRvR\(RBtguess_fw((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir32scCs7tjj|jd}|jj|jjdp6|S(s; Microsoft .NET Framework 64bit directory. sMicrosoft.NET\Framework64tframeworkdir64(RRRRxRzRvR\(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir64scCs |jdS(s: Microsoft .NET Framework 32bit versions. i (t_find_dot_net_versions(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion32scCs |jdS(s: Microsoft .NET Framework 64bit versions. i@(R(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion64scCs|jj|jjd|}t|d|}|pM|j|dpMd}|jdkrn|df}nR|jdkr|jd d krd n|d f}n|jd krd}n|jdkrd}n|S(s Find Microsoft .NET Framework versions. Parameters ---------- bits: int Platform number of bits: 32 or 64. sframeworkver%dsFrameworkDir%dtvR g(@sv4.0g$@itv4s v4.0.30319sv3.5g"@s v2.0.50727g @sv3.0(sv3.5s v2.0.50727(sv3.0s v2.0.50727(RzRvR\tgetattrRR|R6(RBtbitstreg_vert dot_net_dirR$t frameworkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs    cs;fdttjD}t|dp:dS(s Return name of the last dir in path or '' if no dir found. Parameters ---------- path: str Use dirs in this path prefix: str Use only dirs startings by this prefix c3sE|];}tjjtjj|r|jr|VqdS(N(RRRRt startswith(t.0tdir_name(Rtprefix(s3/usr/lib/python2.7/site-packages/setuptools/msvc.pys )s!R N(treversedRRtnextR(RBRRt matching_dirs((RRs3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs N( RRRORPRQRxRyRRRCR{R~RRRRRRRRRRRRRRRRRRRRR(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRws4       &      R!cBseZdZdddZedZedZedZedZ edZ edZ ed Z ed Z ed Zed Zd ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZdZ ddZ!RS(sY Return environment variables for specified Microsoft Visual C++ version and platform : Lib, Include, Path and libpath. This function is compatible with Microsoft Visual C++ 9.0 to 14.0. Script created by analysing Microsoft environment configuration files like "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... Parameters ---------- arch: str Target architecture. vc_ver: float Required Microsoft Visual C++ version. If not set, autodetect the last version. vc_min_ver: float Minimum Microsoft Visual C++ version. icCsdt||_t|j|_t|j||_|j|kr`d}tjj |ndS(Ns.No suitable Microsoft Visual C++ version found( R=RURTRzRwtsiR|RRR(RBR%R|R*R((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCIs cCs |jjS(s/ Microsoft Visual C++ version. (RR|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR|RscCsddg}|jdkrd|jjdtdt}|dg7}|dg7}|d|g7}ng|D]!}tjj|jj|^qkS( s/ Microsoft Visual Studio Tools s Common7\IDEs Common7\Toolsg,@RIR?s1Common7\IDE\CommonExtensions\Microsoft\TestWindowsTeam Tools\Performance ToolssTeam Tools\Performance Tools%s( R|RURJRoRRRRR(RBtpathst arch_subdirR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVSToolsYs   cCs4tjj|jjdtjj|jjdgS(sL Microsoft Visual C++ & Microsoft Foundation Class Includes tIncludesATLMFC\Include(RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCIncludeshscCs|jdkr'|jjdt}n|jjdt}d|d|g}|jdkrs|d|g7}ng|D]!}tjj|jj|^qzS(sM Microsoft Visual C++ & Microsoft Foundation Class Libraries g.@R?RIsLib%ss ATLMFC\Lib%sg,@s Lib\store%s( R|RURKRoRRRRR(RBRRR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCLibrariespscCs/|jdkrgStjj|jjdgS(sA Microsoft Visual C++ store references Libraries g,@sLib\store\references(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCStoreRefsscCs|j}tjj|jdg}|jdkr9tnt}|jj |}|r}|tjj|jd|g7}n|jdkrd|jj dt}|tjj|j|g7}n|jdkrs|jj rdnd}|tjj|j||jj d tg7}|jj |jjkr|tjj|j||jj d tg7}qn|tjj|jd g7}|S( s, Microsoft Visual C++ Tools t VCPackagesg$@sBin%sg,@RIg.@s bin\HostX86%ss bin\HostX64%sR?tBin(RRRRRR|RoRSRURNRJRHRKRGRE(RBRttoolsRLRRthost_dir((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCToolss& &" & ,cCs|jdkrJ|jjdtdt}tjj|jjd|gS|jjdt}tjj|jjd}|j }tjj|d||fgSdS(s1 Microsoft Windows SDK Libraries g$@RIR?sLib%sRs%sum%sN( R|RURKRoRRRRRt _sdk_subdir(RBRRtlibver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt OSLibrariess  cCstjj|jjd}|jdkrC|tjj|dgS|jdkr^|j}nd}tjj|d|tjj|d|tjj|d|gSd S( s/ Microsoft Windows SDK Include tincludeg$@tglg,@R s%sshareds%sums%swinrtN(RRRRRR|R(RBRtsdkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt OSIncludess cCstjj|jjd}g}|jdkr@||j7}n|jdkrn|tjj|dg7}n|jdkr||tjj|jjdtjj|ddtjj|d dtjj|d dtjj|jjd d d |jdddg7}n|S(s7 Microsoft Windows SDK Libraries Paths t Referencesg"@g&@sCommonConfiguration\Neutralg,@t UnionMetadatas'Windows.Foundation.UniversalApiContracts1.0.0.0s%Windows.Foundation.FoundationContracts,Windows.Networking.Connectivity.WwanContractt ExtensionSDKssMicrosoft.VCLibss%0.1ftCommonConfigurationtneutral(RRRRRR|R(RBtreftlibpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt OSLibpaths>      cCst|jS(s- Microsoft Windows SDK Tools (tlistt _sdk_tools(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkToolssccs|jdkrG|jdkr$dnd}tjj|jj|Vn|jjs|jjdt }d|}tjj|jj|Vn|jdks|jdkr |jj rd}n|jjd t dt }d |}tjj|jj|Vnl|jdkrvtjj|jjd}|jjdt }|jj }tjj|d ||fVn|jj r|jj Vnd S( s= Microsoft Windows SDK Tools paths generator g.@g&@RsBin\x86R?sBin%sg$@R RIsBin\NETFX 4.0 Tools%ss%s%sN( R|RRRRRRURHRJRoRFRR(RBtbin_dirRRR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs(    ! cCs|jj}|rd|SdS(s6 Microsoft Windows SDK version subdir s%s\R (RR(RBtucrtver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs cCs/|jdkrgStjj|jjdgS(s- Microsoft Windows SDK Setup g"@tSetup(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkSetup%scCs|j}|j}|jdkrDt}|j o>|j }n6|jpY|j}|jdkpw|jdk}g}|r|g|jD]}t j j |j |^q7}n|r|g|j D]}t j j |j|^q7}n|S(s0 Microsoft .NET Framework Tools g$@R@(RURR|RoRFRHRGRERRRRRRR(RBRURt include32t include64RR$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFxTools/s  //cCsU|jdks|jj r gS|jjdt}tjj|jjd|gS(s8 Microsoft .Net Framework SDK Libraries g,@R?slib\um%s( R|RRRURKRoRRR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKLibrariesGscCs<|jdks|jj r gStjj|jjdgS(s7 Microsoft .Net Framework SDK Includes g,@s include\um(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKIncludesRscCstjj|jjdgS(s> Microsoft Visual Studio Team System Database s VSTSDB\Deploy(RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVsTDb\scCs|jdkrgS|jdkrF|jj}|jjdt}n|jj}d}d|j|f}tjj ||g}|jdkr|tjj ||dg7}n|S(s( Microsoft Build Engine g(@g.@RIR sMSBuild\%0.1f\bin%stRoslyn( R|RRRURJRoRRRR(RBt base_pathRRtbuild((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytMSBuildcs  "cCs/|jdkrgStjj|jjdgS(s. Microsoft HTML Help Workshop g&@sHTML Help Workshop(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytHTMLHelpWorkshopzscCsl|jdkrgS|jjdt}tjj|jjd}|j }tjj|d||fgS(s= Microsoft Universal C Runtime SDK Libraries g,@R?Rs%sucrt%s( R|RURKRoRRRRRt _ucrt_subdir(RBRRR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt UCRTLibrariess  cCsK|jdkrgStjj|jjd}tjj|d|jgS(s; Microsoft Universal C Runtime SDK Include g,@Rs%sucrt(R|RRRRRR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt UCRTIncludesscCs|jj}|rd|SdS(sB Microsoft Universal C Runtime SDK version subdir s%s\R (RR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs cCs,|jdkr"|jdkr"gS|jjS(s% Microsoft Visual F# g&@g(@(R|RR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharpscCs|jjdt}|jdkr9|jj}d}n|jjjdd}d}|jdkrldn|j}|||j|f}tjj ||S(sA Microsoft Visual C++ runtime redistribuable dll R?is-redist%s\Microsoft.VC%d0.CRT\vcruntime%d0.dlls\Toolss\Redists.onecore%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllg,@( RURKRoR|RRRARRR(RBRt redist_patht vcruntimetdll_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCRuntimeRedists  cCstd|jd|j|j|j|jg|d|jd|j|j|j|j |j g|d|jd|j|j|j |j g|d|jd|j |j|j|j|j|j|j|j|jg |}|jdkrtjj|jr|j|d A B C D _unique_everseen('ABBCcAD', str.lower) --> A B C D N(tsettaddRRt __contains__(RBtiterableRtseentseen_addtelementtk((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs         N("RRRORRCRRR|RRRRRRRRRRRRRRRRRRRRRRRRoR"RR(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR!1s:   -         - (!RORR-tplatformR tdistutils.errorsRt#setuptools.extern.packaging.versionRtsetuptools.extern.six.movesRtmonkeyRtsystemRtenvironRPRt ImportErrorRRt_msvc9_suppress_errorstdistutils.msvc9compilerR RRR+R3R#R=RTRwR!(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyts:         + / & %[aPK!namespaces.pycnu[ fc@sqddlZddlmZddlZddlmZejjZdddYZ de fdYZ dS( iN(tlog(tmapt Installerc Bs_eZdZdZdZdZdZdZdZdZ dZ e dZ RS(s -nspkg.pthcCs|j}|sdStjj|j\}}||j7}|jj|tj d|t |j |}|j rt |dSt|d}|j|WdQXdS(Ns Installing %stwt(t_get_all_ns_packagestostpathtsplitextt _get_targett nspkg_exttoutputstappendRtinfoRt_gen_nspkg_linetdry_runtlisttopent writelines(tselftnsptfilenametexttlinestf((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytinstall_namespacess    cCsbtjj|j\}}||j7}tjj|sAdStjd|tj|dS(Ns Removing %s( RRRRR texistsRR tremove(RRR((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytuninstall_namespaces!s  cCs|jS(N(ttarget(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR)ssimport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')sm = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)s4m and setattr(sys.modules[%(parent)r], %(child)r, m)cCsdS(Ns$sys._getframe(1).f_locals['sitedir']((R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyt _get_rootCscCs|t|}t|jd}|j}|j}|jd\}}}|rd||j7}ndj|tdS(Nt.t;s ( tstrttupletsplitRt _nspkg_tmplt rpartitiont_nspkg_tmpl_multitjointlocals(Rtpkgtpthtroott tmpl_linestparenttseptchild((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR Fs   cCs.|jjpg}ttt|j|S(s,Return sorted list of all package namespaces(t distributiontnamespace_packagestsortedtflattenRt _pkg_names(Rtpkgs((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRQsccs8|jd}x"|r3dj|V|jqWdS(s Given a namespace package, yield the components of that package. >>> names = Installer._pkg_names('a.b.c') >>> set(names) == set(['a', 'a.b', 'a.b.c']) True RN(R"R&tpop(R(tparts((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR3Vs  ( simport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')sm = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)(s4m and setattr(sys.modules[%(parent)r], %(child)r, m)( t__name__t __module__R RRRR#R%RR Rt staticmethodR3(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR s$     tDevelopInstallercBseZdZdZRS(cCstt|jS(N(treprR tegg_path(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRgscCs|jS(N(tegg_link(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRjs(R7R8RR(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR:fs (( Rt distutilsRt itertoolstsetuptools.extern.six.movesRtchaint from_iterableR2RR:(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyts   [PK!I ??package_index.pycnu[ fc@s~dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZm Z ddlm!Z!ddl"m#Z#dd l$m%Z%dd l&m'Z'dd l(m)Z)dd l*m+Z+dd l,m-Z-ej.dZ/ej.dej0Z1ej.dZ2ej.dej0j3Z4dj5Z6ddddgZ7dZ8dZ9e9j:dej;d deZ<dZ=dZ>dZ?e@dZAe@d ZBe@d!ZCe@ee@d"ZDe@d#ZEd$ZFej.d%ej0ZGeFd&ZHd'eIfd(YZJd)eJfd*YZKdefd+YZLej.d,jMZNd-ZOd.ZPdd/ZQd0ZRd1eIfd2YZSd3ejTfd4YZUejVjWd5ZXeQe8eXZXd6ZYd7ZZdS(8s#PyPI and direct package downloadingiN(twraps(tsix(turllibt http_clientt configparsertmap( t CHECKOUT_DISTt Distributiont BINARY_DISTtnormalize_patht SOURCE_DISTt Environmenttfind_distributionst safe_namet safe_versiont to_filenamet Requirementt DEVELOP_DISTtEGG_DIST(t ssl_support(tlog(tDistutilsError(t translate(tget_all_headers(tunescape(tWheels^egg=([-A-Za-z0-9_.+!]+)$shref\s*=\s*['"]?([^'"> ]+)s([^<]+) \s+\(md5\)s([-+.a-z0-9]{2,}):s.tar.gz .tar.bz2 .tar .zip .tgzt PackageIndextdistros_for_urltparse_bdist_wininsttinterpret_distro_nameis<setuptools/{setuptools.__version__} Python-urllib/{py_major}tpy_majorit setuptoolscCs<ytj|SWn$tk r7td|fnXdS(Ns1Not a URL, existing file, or requirement spec: %r(Rtparset ValueErrorR(tspec((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytparse_requirement_arg2s  cCs|j}d\}}}|jdr|jdrL|d }d}q|jddr~|dd!}|d }d}q|jd r|d }d }q|jd d r|dd!}|d }d }qn|||fS(s=Return (base,pyversion) or (None,None) for possible .exe names.exes .win32.exeitwin32s .win32-pyiiis.win-amd64.exeis win-amd64s .win-amd64-pyiN(NNN(tlowertNonetendswitht startswith(tnameR%tbasetpy_vertplat((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR;s$           c Cstjj|}|\}}}}}}tjj|jdd}|dkr|dkrtjj|jdd}nd|kr|jdd\}}n||fS(Nt/issourceforge.nettdownloadit#i(RR turlparsetunquotetsplit( turltpartstschemetservertpatht parameterstquerytfragmentR*((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytegg_info_for_urlSs" ccst|\}}xt|||D] }|Vq%W|rtj|}|rx1t||jd|dtD] }|VqqWqndS(sEYield egg or source distribution objects that might be found at a URLit precedenceN(R;tdistros_for_locationt EGG_FRAGMENTtmatchRtgroupR(R3tmetadataR*R:tdistR?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR^s "c CsA|jdr|d }n|jdrMd|krMtj|||gS|jdrd|krt|}|jsgStd|d|jd|jd td gS|jd rt|\}}}|d k rt ||||t |Snx>t D]6}|j|r|t | }t |||SqWgS( s:Yield egg or source distribution objects based on basenames.egg.zipis.eggt-s.whltlocationt project_nametversionR<is.exeN(R'Rt from_locationRt is_compatibleRERFRRR&RRt EXTENSIONStlen(RDtbasenameRAtwheeltwin_baseR+tplatformtext((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR=ls.       cCs"tt|tjj||S(sEYield possible egg or source distribution objects based on a filename(R=R tosR7RK(tfilenameRA((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytdistros_for_filenamesc cs|jd}| r4td|dDr4dSxatdt|dD]F}t||dj|| dj||d|d|d|VqNWdS( sGenerate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! RCcss!|]}tjd|VqdS(s py\d\.\d$N(treR?(t.0tp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pys siNit py_versionR<RN(R2tanytrangeRJRtjoin(RDRKRARVR<RNR4RU((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs! ) ccst}|j}|dkrSxmtjj|j|D]}|||Vq7Wn;x8|D]0}||}||krZ|||VqZqZWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(tsettaddR&Rtmovest filterfalset __contains__(titerabletkeytseentseen_addtelementtk((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytunique_everseens         cstfd}|S(ss Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cst||S(N(Re(targstkwargs(tfunc(s</usr/lib/python2.7/site-packages/setuptools/package_index.pytwrappers(R(RhRi((Rhs</usr/lib/python2.7/site-packages/setuptools/package_index.pyt unique_valuesss3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>ccsxtj|D]}|j\}}tttj|jjd}d|ksgd|krx=t j|D])}t j j |t |jdVqwWqqWxjd D]b}|j|}|dkrt j||}|rt j j |t |jdVqqqWdS( sEFind rel="homepage" and rel="download" links in `page`, yielding URLst,thomepageR.is Home PagesDownload URLiN(s Home PagesDownload URL(tRELtfinditertgroupsRZRtstrtstripR%R2tHREFRR turljoint htmldecodeR@tfindtsearch(R3tpageR?ttagtreltrelstpos((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfind_external_linkss'.  tContentCheckercBs)eZdZdZdZdZRS(sP A null content checker that defines the interface for checking content cCsdS(s3 Feed a block of data to the hash. N((tselftblock((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfeedscCstS(sC Check the hash. Return False if validation fails. (tTrue(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytis_validscCsdS(su Call reporter with information about the checker (hash name) substituted into the template. N((R~treporterttemplate((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytreports(t__name__t __module__t__doc__RRR(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR}s  t HashCheckercBsJeZejdZdZedZdZdZ dZ RS(sK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs(||_tj||_||_dS(N(t hash_namethashlibtnewthashtexpected(R~RR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__init__ s cCsRtjj|d}|s#tS|jj|}|sBtS||jS(s5Construct a (possibly null) ContentChecker from a URLi(RR R0R}tpatternRvt groupdict(tclsR3R:R?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfrom_urlscCs|jj|dS(N(Rtupdate(R~R((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRscCs|jj|jkS(N(Rt hexdigestR(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR scCs||j}||S(N(R(R~RRtmsg((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR#s ( RRRStcompileRRt classmethodRRRR(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs    cBsveZdZdd%d&edZedZedZedZ dZ dZ d Z d Z d&d Zd Zd&d ZdZdZdZdZdZeeed&dZeedZdZdZdZdZd&dZdZdZdZdZ dZ!e"edZ#d Z$d!Z%d"Z&d#Z'd$Z(RS('s;A distribution index that scans web pages for download URLsshttps://pypi.python.org/simplet*cOstj||||d|jd |_i|_i|_i|_tjdj t t |j |_ g|_|otjo|ptj}|rtj||_ntjj|_dS(NR-t|(R RR't index_urlt scanned_urlst fetched_urlst package_pagesRSRRYRRR?tallowstto_scanRt is_availabletfind_ca_bundlet opener_fortopenerRtrequestturlopen(R~Rthostst ca_bundlet verify_sslRftkwtuse_ssl((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR+s   '  c Csg||jkr| rdSt|j|s(tfilterRPR7RRt itertoolststarmapt scan_egg_link(R~t search_pathtdirst egg_links((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytscan_egg_linkss c Csttjj||(}ttdttj |}WdQXt |dkr[dS|\}}xQt tjj||D]4}tjj|||_ t |_|j|qWdS(Ni(topenRPR7RYRRR&RRpRqRJR RDR R<R[(R~R7Rt raw_linestlinestegg_patht setup_pathRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs' " c sfd}xWtj|D]F}y,|tjj|t|jdWqtk rdqXqW||\}}|rxyt||D]h}t |\}} |j dr| r|r|d||f7}qj |nj |qWt jd|SdSdS(s#Process the contents of a PyPI pagecs|jjrtttjj|tjjd}t|dkrd|dkrt |d}t |d}t j j |ji|%siii(R@(tm((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytRRN(RrRnRR RsRtR@R!R|R;R'tneed_version_infotscan_urltPYPI_MD5tsub( R~R3RwRR?RRtnew_urlR*tfrag((R~s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs$,  cCs|jd|dS(NsPPage at %s links to .py file(s) without version info; an index scan is required.(tscan_all(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRscGsO|j|jkr;|r+|j||n|jdn|j|jdS(Ns6Scanning index of all packages (this may take a while)(RRRRR(R~RRf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs  cCs|j|j|jd|jj|jsN|j|j|jdn|jj|jss|j|nx3t|jj|jdD]}|j|qWdS(NR-(( RRt unsafe_nameRRR`REtnot_found_in_indexR(R~t requirementR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt find_packagess%cCsk|j|j|x8||jD])}||kr;|S|jd||q%Wtt|j||S(Ns%s does not match %s(tprescanRR`RtsuperRtobtain(R~Rt installerRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs   cCsi|j|jd||jse|jtj|td|jjtj j |fndS(s- checker is a ContentChecker sValidating %%s checksum for %ss7%s validation failed for %s; possible download problem?N( RRRRRPtunlinkRRR)R7RK(R~tcheckerRQttfp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt check_hashs    cCsrxk|D]c}|jdksJt| sJ|jdsJtt|rZ|j|q|jj|qWdS(s;Add `urls` to the list that will be prescanned for searchessfile:N(RR&RR(RRRtappend(R~turlsR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytadd_find_links s  cCs2|jr%tt|j|jnd|_dS(s7Scan urls scheduled for prescanning (e.g. --find-links)N(RRRRR&(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs cCsN||jr |jd}}n|jd}}|||j|jdS(Ns#Couldn't retrieve index page for %rs3Couldn't find index page for %r (maybe misspelled?)(R`RRRR(R~RtmethR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR!s   cCst|tst|}|r||j|jd||}t|\}}|jdrx|j|||}n|Stj j |r|St |}nt |j ||ddS(sLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. is.pyRDN(RRRt _download_urlR@R;R't gen_setupRPR7RR#Rtfetch_distributionR&(R~R"ttmpdirR5tfoundR*R:((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR.+s c sFjd|id}dfd}|rfjj|||}n| r|dk r|||}n|dkrjdk rjn||}n|dkr| rj|||}n|dkrjdrdpd|n#jd||jd|jSdS( s|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. sSearching for %scs|dkr}nx||jD]}|jtkrn rn|kr#jd|d|R?RR@R&RFRJRPR7RKtdirnameRYtsetuptools.command.easy_installRtshutiltcopy2RtwriteREtsplitextR( R~RQR:RR?tdRRKtdstRR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs24 !!i c Cs|jd|d}zXtj|}|j|}t|tjjrnt d||j |j fn|j}d}|j }d}d|krt |d} ttt| }|j|||||nt|d}} x`trO|j|} | rK|j| | j| |d7}|j|||||qPqW|j||| WdQX|SWd|r|jnXdS( NsDownloading %ssCan't download %s: %s %siiscontent-lengthsContent-Lengthtwbi(RR&RRRRRRRRRRt dl_blocksizeRtmaxRtintt reporthookRRRRRRR( R~R3RQtfpRRtblocknumtbstsizetsizesRR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt _download_tos:       cCsdS(N((R~R3RQR!tblksizeR#((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRscCs|jdrt|Syt||jSWnsttjfk r}djg|jD]}t |^qX}|r|j ||qt d||fnt j jk r}|St j jk r }|r|j ||jqt d||jfntjk rU}|r9|j ||jqt d||jfnNtjtj fk r}|r|j ||qt d||fnXdS(Nsfile:t s%s %ssDownload error for %s: %ss;%s returned a bad status line. The server might be down, %s(R(t local_opentopen_with_authRR!Rt InvalidURLRYRfRpRRRRRtURLErrortreasont BadStatusLinetlinet HTTPExceptiontsocket(R~R3twarningtvtargR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs6 +cCsHt|\}}|rLx7d|krH|jddjdd}qWnd}|jdrn|d }ntjj||}|dks|jd r|j||S|d ks|jd r|j||S|jd r|j ||S|d kr$t j j t j j|dS|j|t|j||SdS(Ns..t.s\t_t__downloaded__s.egg.zipitsvnssvn+tgitsgit+shg+Ri(R;treplaceR'RPR7RYR(t _download_svnt _download_gitt _download_hgRRt url2pathnameR R0RRt_attempt_download(R~R5R3RR)R:RQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs$%   cCs|j|tdS(N(RR(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR8scCsK|j||}d|jddjkrC|j|||S|SdS(NRs content-typeR(R%RR%t_download_html(R~R3RQR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR>;scCst|}xW|D]O}|jrtjd|r^|jtj||j||SPqqW|jtj|td|dS(Ns ([^- ]+ - )?Revision \d+:s���Unexpected HTML page found at ( ���R���Rq���RS���Rv���R���RP���R���R:��R���(���R~���R3���R���RQ���R���R.��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR?��B��s����       c���������C���sl��|�j��d�d��d�}�d�}�|�j���j�d��r;d�|�k�r;t�j�j�|��\�}�}�}�}�}�} �|� r;|�j�d��r;d�|�d �k�r;|�d �j��d�d��\�}�}�t�j�j�|��\�} �} �| �r8d �| �k�r�| �j��d �d��\�} �} �d �| �| �f�}�n �d �| �}�| �}�|�|�|�|�|�| �f�}�t�j�j�|��}�q8q;n��|��j�d �|�|��t �j �d�|�|�|�f��|�S(���NR/���i���i����R���s���svn:t���@s���//R-���i���t���:s��� --username=%s --password=%ss ��� --username=s'���Doing subversion checkout from %s to %ss���svn checkout%s -q %s %s( ���R2���R%���R(���R���R ���R0���t ���splitusert ���urlunparseR���RP���t���system(���R~���R3���RQ���t���credsR5���t���netlocR7���RU���t���qR���t���autht���hostt���usert���pwR4���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR:��Q��s$����!$&  c���������C���s���t��j�j�|���\�}�}�}�}�}�|�j�d�d��d�}�|�j�d�d��d�}�d��}�d�|�k�rz�|�j�d�d��\�}�}�n��t��j�j�|�|�|�|�d�f��}��|��|�f�S(���Nt���+i���iR/���i����R@��R���(���R���R ���t���urlsplitR2���R&���t���rsplitt ���urlunsplit(���R3���t ���pop_prefixR5���RF��R7���R9���R���t���rev(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���_vcs_split_rev_from_urlf��s����! !c���������C���s���|�j��d�d��d�}�|��j�|�d�t�\�}�}�|��j�d�|�|��t�j�d�|�|�f��|�d��k �r�|��j�d�|��t�j�d�|�|�f��n��|�S( ���NR/���i���i����RP��s���Doing git clone from %s to %ss���git clone --quiet %s %ss���Checking out %ss"���(cd %s && git checkout --quiet %s)(���R2���RR��R���R���RP���RD��R&���(���R~���R3���RQ���RQ��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR;��x��s����  c���������C���s���|�j��d�d��d�}�|��j�|�d�t�\�}�}�|��j�d�|�|��t�j�d�|�|�f��|�d��k �r�|��j�d�|��t�j�d�|�|�f��n��|�S( ���NR/���i���i����RP��s���Doing hg clone from %s to %ss���hg clone --quiet %s %ss���Updating to %ss���(cd %s && hg up -C -r %s -q)(���R2���RR��R���R���RP���RD��R&���(���R~���R3���RQ���RQ��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR<����s����  c���������G���s���t��j�|�|��d��S(���N(���R���R���(���R~���R���Rf���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s����c���������G���s���t��j�|�|��d��S(���N(���R���R���(���R~���R���Rf���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s����c���������G���s���t��j�|�|��d��S(���N(���R���R���(���R~���R���Rf���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s����(���R���N()���R���R���R���R&���R���R���t���FalseR���R���R���R���R���R���R���R���R���R���R���R���R���R���R.���R��R��R��R��R%��R��R���R���R���R>��R?��R:��t ���staticmethodRR��R;��R<��R���R���R���(����(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR���(��sL��� 3   +      #J ) $  #         s!���&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c���������C���s���|��j��d��}�t�|��S(���Ni���(���R@���R���(���R?���t���what(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt ���decode_entity��s����c���������C���s ���t��t�|���S(���s'���Decode HTML entities in the given text.(���t ���entity_subRV��(���t���text(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRt�����s����c������������s�����f�d���}�|�S(���Nc������������s������f�d���}�|�S(���Nc�������������s?���t��j���}�t��j���z���|��|���SWd��t��j�|��Xd��S(���N(���R0��t���getdefaulttimeoutt���setdefaulttimeout(���Rf���Rg���t ���old_timeout(���Rh���t���timeout(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���_socket_timeout��s ����  (����(���Rh���R]��(���R\��(���Rh���s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR]����s����(����(���R\��R]��(����(���R\��s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���socket_timeout��s���� c���������C���sI���t��j�j�|���}�|�j���}�t�j�|��}�|�j���}�|�j�d�d��S(���sq�� A function compatible with Python 2.3-3.3 that will encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False s��� R���(���R���R ���R1���t���encodet���base64t ���encodestringR���R9��(���RH��t���auth_st ���auth_bytest ���encoded_bytest���encoded(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt ���_encode_auth��s ����   t ���Credentialc�����������B���s)���e��Z�d��Z�d���Z�d���Z�d���Z�RS(���s:��� A username/password pair. Use like a namedtuple. c���������C���s���|�|��_��|�|��_�d��S(���N(���t���usernamet���password(���R~���Rh��Ri��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s���� c���������c���s���|��j��V|��j�Vd��S(���N(���Rh��Ri��(���R~���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���__iter__��s����c���������C���s���d�t��|���S(���Ns���%(username)s:%(password)s(���t���vars(���R~���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���__str__��s����(���R���R���R���R���Rj��Rl��(����(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRg����s���  t ���PyPIConfigc�����������B���s2���e��Z�d����Z�e�d����Z�d���Z�d���Z�RS(���c���������C���su���t��j�d�d�d�g�d��}�t�j�j�|��|��t�j�j�t�j�j�d��d��}�t�j�j �|��rq�|��j �|��n��d�S(���s%��� Load from ~/.pypirc Rh��Ri��t ���repositoryR���t���~s���.pypircN( ���t���dictt���fromkeysR���t���RawConfigParserR���RP���R7���RY���t ���expanduserR���R���(���R~���t���defaultst���rc(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s ����!c���������C���sM���g��|��j����D]$�}�|��j�|�d��j���r �|�^�q �}�t�t�|��j�|���S(���NRn��(���t���sectionsR���Rq���Rp��R���t���_get_repo_cred(���R~���t���sectiont���sections_with_repositories(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���creds_by_repository��s����$c���������C���sO���|��j��|�d��j���}�|�t�|��j��|�d��j���|��j��|�d��j����f�S(���NRn��Rh��Ri��(���R���Rq���Rg��(���R~���Rx��t���repo(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRw����s����c���������C���s7���x0�|��j��j���D]�\�}�}�|�j�|��r�|�Sq�Wd�S(���s��� If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N(���Rz��t���itemsR(���(���R~���R3���Rn��t���cred(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���find_credential��s����(���R���R���R���t���propertyRz��Rw��R~��(����(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRm����s���  c���������C���s��t��j�j�|���\�}�}�}�}�}�}�|�j�d��rE�t�j�d���n��|�d �k�rl�t��j�j�|��\�}�} �n�d �}�|�s�t���j �|���} �| �r�t �| ��}�| �j �|��f�} �t �j �d�| ��q�n��|�r&d�t�|��}�|�| �|�|�|�|�f�} �t��j�j�| ��} �t��j�j�| ��}�|�j�d�|��n�t��j�j�|���}�|�j�d�t��|�|��}�|�rt��j�j�|�j��\�}�}�}�}�}�}�|�|�k�r|�| �k�r|�|�|�|�|�|�f�} �t��j�j�| ��|�_�qn��|�S( ���s4���Open a urllib2 request, handling HTTP authenticationRA��s���nonnumeric port: ''t���httpt���httpss*���Authenticating as %s for %s (from .pypirc)s���Basic t ���Authorizations ���User-Agent(���R��R��N(���R���R ���R0���R'���R���R*��RB��R&���Rm��R~��Rp���Rh��R���R���Rf��RC��R���t���Requestt ���add_headert ���user_agentR3���(���R3���R���R5���RF��R7���t���paramsR9���R���RH��RI��R}��R���R4���R���R���R ��t���s2t���h2t���path2t���param2t���query2t���frag2(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR)����s6����$   'c���������C���s���|��S(���N(����(���R3���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt ���fix_sf_url?��s����c���������C���s��t��j�j�|���\�}�}�}�}�}�}�t��j�j�|��}�t�j�j�|��rX�t��j�j�|���S|�j �d��rPt�j�j �|��rPg��}�x�t�j �|��D]�} �t�j�j �|�| ��} �| �d�k�r�t �| �d���} �| �j���} �Wd�QXPn�t�j�j �| ��r�| �d�7} �n��|�j�d�j�d�| ���q�Wd�} �| �j�d�|��d �d �j �|���} �d�\�}�}�n�d�\�}�}�} �i�d�d�6}�t�j�| ��}�t��j�j�|��|�|�|�|��S(���s7���Read a local path, with special support for directoriesR-���s ���index.htmlt���rNs���<a href="{name}">{name}</a>R)���sB���<html><head><title>{url}{files}R3tfiless itOKisPath not founds Not founds text/htmls content-type(iR(isPath not founds Not found(RR R0RR=RPR7tisfileRR'RRRYRRRtformatRtStringIORR(R3R5R6R7tparamR9RRQRRtfilepathR tbodyRtstatustmessageRt body_stream((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR(Cs,$!  ! ([RtsysRPRSRR0R`RRt functoolsRtsetuptools.externRtsetuptools.extern.six.movesRRRRRt pkg_resourcesRRRR R R R R RRRRRRt distutilsRtdistutils.errorsRtfnmatchRtsetuptools.py27compatRtsetuptools.py33compatRtsetuptools.wheelRRR>tIRrRR?RR2RIt__all__t_SOCKET_TIMEOUTt_tmplRRFRR#RR;R&RR=RRRReRjRmR|tobjectR}RRRRWRVRtR^RfRgRrRmRRR)RR((((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytsv        " X       !  "  !~    &. PK!Mc[py27compat.pycnu[ fc@stdZddlZddlmZdZejr@dZnejdkoXejZergendZ dS(s2 Compatibility Support for Python 2.7 and earlier iN(tsixcCs |j|S(sH Given an HTTPMessage, return all headers matching a given key. (tget_all(tmessagetkey((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pytget_all_headers scCs |j|S(N(t getheaders(RR((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyRstLinuxcCs|S(N((tx((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pytt( t__doc__tplatformtsetuptools.externRRtPY2tsystemtlinux_py2_asciitstrt rmtree_safe(((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyts     PK!<k$jjpy31compat.pycnu[ fc@sddgZyddlmZmZWn0ek rXddlmZmZdZnXyddlmZWn?ek rddl Z ddlZde fd YZnXdS( tget_config_varstget_pathi(RR(Rtget_python_libcCs+|dkrtdnt|dkS(NtplatlibtpurelibsName must be purelib or platlib(RR(t ValueErrorR(tname((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyR s (tTemporaryDirectoryNRcBs)eZdZdZdZdZRS(s Very simple temporary directory context manager. Will try to delete afterward, but will also ignore OS and similar errors on deletion. cCsd|_tj|_dS(N(tNoneRttempfiletmkdtemp(tself((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__init__s cCs|jS(N(R(R ((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt __enter__!scCs8ytj|jtWntk r*nXd|_dS(N(tshutiltrmtreeRtTruetOSErrorR(R texctypetexcvaluetexctrace((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__exit__$s  (t__name__t __module__t__doc__R R R(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyRs  ( t__all__t sysconfigRRt ImportErrortdistutils.sysconfigRR RRtobject(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyts      PK!\'py33compat.pycnu[ fc@sddlZddlZddlZyddlZWnek rMdZnXddlmZddlm Z ej ddZ de fdYZ eede Zeed e jjZdS( iN(tsix(t html_parsertOpArgs opcode argtBytecode_compatcBseZdZdZRS(cCs ||_dS(N(tcode(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__init__sccstjd|jj}t|jj}d}d}x||kr||}|tjkr||d||dd|}|d7}|tjkrtjd}||d}q9qnd }|d7}t ||Vq9Wd S( s>Yield '(op,arg)' pair for each operation in code object 'code'tbiiiiiiiN( tarrayRtco_codetlentdist HAVE_ARGUMENTt EXTENDED_ARGRt integer_typestNoneR(Rtbytesteoftptrt extended_argtoptargt long_type((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__iter__s  "    (t__name__t __module__RR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyRs tBytecodetunescape(R Rt collectionsthtmlt ImportErrorRtsetuptools.externRtsetuptools.extern.six.movesRt namedtupleRtobjectRtgetattrRt HTMLParserR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyts     "PK!Dm. . py36compat.pycnu[ fc@sddlZddlmZddlmZddlmZdd dYZejd krtdd dYZne rdd d YZndS(iN(tDistutilsOptionError(t strtobool(tDEBUGtDistribution_parse_config_filescBseZdZddZRS(s Mix-in providing forward-compatibility for functionality to be included by default on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. c CsHddlm}tjtjkrRddddddd d d d d ddg }ng}t|}|dkr|j}ntr|j dn|dd}x|D]}tr|j d|n|j |x|j D]}|j |}|j |}x]|D]U} | dkr| |kr|j|| } | jdd} || f|| s APK! II sandbox.pycnu[ fc@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZddlZejjdrddljjjjZnejejZy eZWnek r dZnXeZddl m!Z!ddlm"Z"ddd d gZ#dd Z$ej%dd Z&ej%d Z'ej%dZ(ej%dZ)de*fdYZ+dd!dYZ,ej%dZ-dZ.ej%dZ/ej%dZ0dZ1dZ2dZ3dd"dYZ4e5edrNej6gZ7ngZ7de4fdYZ8ej9ej:gdj;D]Z<e=ee<d^qZ>d e!fd YZ?dS(#iN(tsix(tbuiltinstmaptjava(tDistutilsError(t working_settAbstractSandboxtDirectorySandboxtSandboxViolationt run_setupcBs_d}e||}|j}WdQX|dkr?|}ne||d}|||UdS(s. Python 3 implementation of execfile. trbNtexec(topentreadtNonetcompile(tfilenametglobalstlocalstmodetstreamtscripttcode((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt _execfile#s  ccs>tj}|dk r#|tj(nz |VWd|tj(XdS(N(tsystargvR(trepltsaved((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt save_argv0s     ccs%tj}z |VWd|tj(XdS(N(Rtpath(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt save_path;s  ccsBtjj|dttj}|t_z dVWd|t_XdS(sL Monkey-patch tempfile.tempdir with replacement, ensuring it exists texist_okN(t pkg_resourcest py31compattmakedirstTruettempfilettempdir(t replacementR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt override_tempDs    ccs7tj}tj|z |VWdtj|XdS(N(tostgetcwdtchdir(ttargetR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytpushdUs    tUnpickleableExceptioncBseZdZedZRS(sP An exception representing another Exception that could not be pickled. cCsay tj|tj|fSWn:tk r\ddlm}|j||t|SXdS(s Always return a dumped (pickled) type and exc. If exc can't be pickled, wrap it in UnpickleableException first. i(R-N(tpickletdumpst Exceptiontsetuptools.sandboxR-tdumptrepr(ttypetexctcls((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR2ds   (t__name__t __module__t__doc__t staticmethodR2(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR-_stExceptionSavercBs)eZdZdZdZdZRS(s^ A Context Manager that will save an exception, serialized, and restore it later. cCs|S(N((tself((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt __enter__xscCs,|s dStj|||_||_tS(N(R-R2t_savedt_tbR#(R<R4R5ttb((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__exit__{s  cCsKdt|krdSttj|j\}}tj|||jdS(s"restore and re-raise any exceptionR>N(tvarsRR.tloadsR>RtreraiseR?(R<R4R5((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytresumes(R7R8R9R=RARE(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR;rs  c#sgtjjt }VWdQXtjjfdtjD}t||jdS(s Context in which imported modules are saved. Translates exceptions internal to the context into the equivalent exception outside the context. Nc3s1|]'}|kr|jd r|VqdS(s encodings.N(t startswith(t.0tmod_name(R(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys s (RtmodulestcopyR;tupdatet_clear_modulesRE(t saved_exct del_modules((Rs6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt save_moduless   cCs%xt|D]}tj|=q WdS(N(tlistRRI(t module_namesRH((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRLsccs*tj}z |VWdtj|XdS(N(R t __getstate__t __setstate__(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytsave_pkg_resources_states  ccstjj|d}tqtattJt:t|'t |t ddVWdQXWdQXWdQXWdQXWdQXWdQXdS(Nttempt setuptools( R(RtjoinRTROthide_setuptoolsRRR'R,t __import__(t setup_dirttemp_dir((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt setup_contexts       cCs"tjd}t|j|S(sH >>> _needs_hiding('setuptools') True >>> _needs_hiding('pkg_resources') True >>> _needs_hiding('setuptools_plugin') False >>> _needs_hiding('setuptools.__init__') True >>> _needs_hiding('distutils') True >>> _needs_hiding('os') False >>> _needs_hiding('Cython') True s1(setuptools|pkg_resources|distutils|Cython)(\.|$)(treRtbooltmatch(RHtpattern((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt _needs_hidingscCs tttj}t|dS(s% Remove references to setuptools' modules from sys.modules to allow the invocation to import the most appropriate setuptools. This technique is necessary to avoid issues such as #315 where setuptools upgrading itself would fail to find a function declared in the metadata. N(tfilterRaRRIRL(RI((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRXsc Cstjjtjj|}t|y|gt|tj(tjjd|t j t j j dt |tr|n|jtj}t|'td|dd}t||WdQXWn/tk r}|jr|jdrqnXWdQXdS(s8Run a distutils setup script, sandboxed in its directoryicSs |jS(N(tactivate(tdist((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyttt__file__R7t__main__N(R(RtabspathtdirnameR\RPRRtinsertRt__init__t callbackstappendt isinstancetstrtencodetgetfilesystemencodingRtdictRt SystemExittargs(t setup_scriptRuRZt dunder_filetnstv((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR s   cBseZdZeZdZdZdZdZdZ dZ x<ddd gD]+Z e e e rXe e ee sc3s!|]}tj|VqdS(N(R]R_(RGR`(R(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys s(Rt_exception_patternst itertoolstchaintany(R<Rt start_matchestpattern_matchest candidates((Rs6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs     cOsH||jkrD|j| rD|j|tjj|||n|S(sCalled for path inputs(t write_opsRRR(RR(R<RRRuR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs%cOsF|j| s |j| r<|j|||||n||fS(s?Called for path pairs like rename, link, and symlink operations(RR(R<RRRRuR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs icOsR|t@r9|j| r9|jd|||||ntj|||||S(sCalled for low-level os.open()sos.open(t WRITE_FLAGSRRR|R (R<RtflagsRRuR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR s(R7R8R9RstfromkeysRRt _EXCEPTIONSRlRRRRRRRRR (((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR~s       s4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYicBs,eZdZejdjZdZRS(sEA setup script attempted to modify the filesystem outside the sandboxs SandboxViolation: {cmd}{args!r} {kwargs} The package setup script has attempted to modify files on your system that are not within the EasyInstall build area, and has been aborted. This package cannot be safely installed by EasyInstall, and may not support alternate installation locations even if you run its setup script by hand. Please inform the package's author and the EasyInstall maintainers to find out if a fix or workaround is available. cCs%|j\}}}|jjtS(N(RuttmpltformatR(R<tcmdRutkwargs((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__str__s(R7R8R9ttextwraptdedenttlstripRR(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs (((@R(RR$toperatort functoolsRR]t contextlibR.Rtsetuptools.externRtsetuptools.extern.six.movesRRtpkg_resources.py31compatR tplatformRFt$org.python.modules.posix.PosixModuletpythonRItposixt PosixModuleR|RRRt NameErrorRR Rtdistutils.errorsRRt__all__RtcontextmanagerRRR'R,R0R-R;RORLRTR\RaRXR RR}RRRtreducetor_tsplittaRRR(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyts^                      wV +PK!0msite-patch.pycnu[ fc@s&dZedkr"e[ndS(cCsddl}ddl}|jjd}|dksL|jdkrU| rUg}n|j|j}t|di}|j t |}|j j t }x|D]}||ks| rqn|j|}|dk r|j d}|dk r|jdPqqy.ddl} | j d|g\} } } Wntk rRqnX| dkreqnz| jd| | | Wd| jXPqWtdtg|j D]}t|ddf^q} t|dd }d |_x|D]}t|qW|j|7_t|d \}}d}g}x|j D]}t|\}}||kr|dkrt |}n|| ks|dkr|j|qA|j|||d7}qAW||j (dS( Nit PYTHONPATHtwin32tpath_importer_cachetsites$Couldn't find the real 'site' moduleit __egginserti(tsystostenvirontgettNonetplatformtsplittpathseptgetattrtpathtlentdirnamet__file__t find_modulet load_moduletimpt ImportErrortclosetdicttmakepathRt addsitedirtappendtinsert(RRRtpictstdpathtmydirtitemtimportertloaderRtstreamRtdescrt known_pathstoldpostdtndt insert_attnew_pathtptnp((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyt__boots`  "      "    2  RN(R,t__name__(((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyts G PK!A|<D!D!ssl_support.pycnu[ fc@s/ddlZddlZddlZddlZddlZddlmZmZmZm Z ddl m Z m Z yddl Z Wnek rdZ nXdddddgZd jjZyejjZejZWnek reZZnXe dk oeeefkZydd l mZmZWnUek ry$dd lmZdd lmZWqek rdZdZqXnXesd efdYZnesddZdZndefdYZdefdYZ ddZ!dZ"e"dZ#dZ$dZ%dS(iN(turllibt http_clienttmaptfilter(tResolutionErrortExtractionErrortVerifyingHTTPSHandlertfind_ca_bundlet is_availablet cert_pathst opener_fors /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt /usr/share/ssl/certs/ca-bundle.crt /usr/local/share/certs/ca-root.crt /etc/ssl/cert.pem /System/Library/OpenSSL/certs/cert.pem /usr/local/share/certs/ca-root-nss.crt /etc/ssl/ca-bundle.pem (tCertificateErrortmatch_hostname(R (R R cBseZRS((t__name__t __module__(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR 5sic CsRg}|stS|jd}|d}|d}|jd}||krgtdt|n|s|j|jkS|dkr|jdnY|jds|jdr|jtj |n"|jtj |j dd x$|D]}|jtj |qWtj d d j |d tj } | j|S( spMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 t.iit*s,too many wildcards in certificate DNS name: s[^.]+sxn--s\*s[^.]*s\As\.s\Z(tFalsetsplittcountR treprtlowertappendt startswithtretescapetreplacetcompiletjoint IGNORECASEtmatch( tdnthostnamet max_wildcardstpatstpartstleftmostt remaindert wildcardstfragtpat((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt_dnsname_match;s*    " &cCs[|stdng}|jdd }xC|D];\}}|dkr4t||r_dS|j|q4q4W|sxc|jddD]L}xC|D];\}}|dkrt||rdS|j|qqWqWnt|dkrtd|d jtt|fn;t|dkrKtd ||d fn td dS(s=Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. sempty or no certificatetsubjectAltNametDNSNtsubjectt commonNameis&hostname %r doesn't match either of %ss, shostname %r doesn't match %ris=no appropriate commonName or subjectAltName fields were found((( t ValueErrortgetR)RtlenR RRR(tcertR tdnsnamestsantkeytvaluetsub((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR os.  %cBs eZdZdZdZRS(s=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|dS(N(t ca_bundlet HTTPSHandlert__init__(tselfR7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9s csjfd|S(Ncst|j|S(N(tVerifyingHTTPSConnR7(thosttkw(R:(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytt(tdo_open(R:treq((R:s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt https_opens(R Rt__doc__R9RB(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRs R;cBs eZdZdZdZRS(s@Simple verifying connection: no auth, subclasses, timeouts, etc.cKs tj|||||_dS(N(tHTTPSConnectionR9R7(R:R<R7R=((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9scCs+tj|j|jft|dd}t|drjt|ddrj||_|j|j }n |j}tt drt j d|j }|j |d||_n$t j |dt jd|j |_yt|jj|Wn4tk r&|jjtj|jjnXdS( Ntsource_addresst_tunnelt _tunnel_hosttcreate_default_contexttcafiletserver_hostnamet cert_reqstca_certs(tsockettcreate_connectionR<tporttgetattrtNonethasattrtsockRFRGtsslRHR7t wrap_sockett CERT_REQUIREDR t getpeercertR tshutdownt SHUT_RDWRtclose(R:RSt actual_hosttctx((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytconnects$$!      (R RRCR9R](((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR;s cCs"tjjt|ptjS(s@Get a urlopen() replacement that uses ca_bundle for verification(Rtrequestt build_openerRRtopen(R7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR s cs"tjfd}|S(Ncs+tds$||_njS(Ntalways_returns(RRRa(targstkwargs(tfunc(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytwrappers(t functoolstwraps(RdRe((Rds:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytoncescsnyddl}Wntk r$dSXd|jffdY}|jd|jd|jS(NitCertFilecs&eZfdZfdZRS(cs't|jtj|jdS(N(tsuperR9tatexittregisterRZ(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9scs/yt|jWntk r*nXdS(N(RjRZtOSError(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRZs (R RR9RZ((Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRistCAtROOT(t wincertstoret ImportErrorRQRitaddstoretname(Rpt _wincerts((Ris:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytget_win_certfiles    cCs4ttjjt}tp3t|dp3tS(s*Return an existing CA bundle path, or NoneN( RtostpathtisfileR RutnextRQt_certifi_where(textant_cert_paths((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRs cCs5ytdjSWntttfk r0nXdS(Ntcertifi(t __import__twhereRqRR(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRzs(&RvRMRkRRftsetuptools.extern.six.movesRRRRt pkg_resourcesRRRTRqRQt__all__tstripRR R^R8RDtAttributeErrortobjectRR R tbackports.ssl_match_hostnameR.R)RR;R RhRuRRz(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytsP     "          4 ) (   PK!"unicode_utils.pycnu[ fc@sGddlZddlZddlmZdZdZdZdS(iN(tsixcCsnt|tjr"tjd|Sy4|jd}tjd|}|jd}Wntk rinX|S(NtNFDsutf-8(t isinstanceRt text_typet unicodedatat normalizetdecodetencodet UnicodeError(tpath((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt decomposes cCsqt|tjr|Stjp%d}|df}x6|D].}y|j|SWq;tk rhq;q;Xq;WdS(sY Ensure that the given path is decoded, NONE when no expected encoding works sutf-8N(RRRtsystgetfilesystemencodingRtUnicodeDecodeError(R tfs_enct candidatestenc((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pytfilesys_decodes   cCs*y|j|SWntk r%dSXdS(s/turn unicode encoding into a functional routineN(RtUnicodeEncodeErrortNone(tstringR((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt try_encode's (RR tsetuptools.externRR RR(((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyts   PK!Ʌu wheel.pycnu[ fc@sdZddlmZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlm ZddlmZddlmZejd ejjZd Zd Zd efd YZdS(sWheels support.i(t get_platformN(t Distributiont PathMetadatat parse_version(tPY3(R(t pep425tags(twrite_requirementss^(?P.+?)-(?P\d.*?) ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) )\.whl$stry: __import__('pkg_resources').declare_namespace(__name__) except ImportError: __path__ = __import__('pkgutil').extend_path(__path__, __name__) c CsOxtj|D]\}}}tjj||}xK|D]C}tjj||}tjj|||}tj||q;Wxttt|D]e\} } tjj|| }tjj||| }tjj |stj|||| =qqWqWx@tj|dt D])\}}}| s:t tj |qWdS(sDMove everything under `src_dir` to `dst_dir`, and delete the former.ttopdownN( tostwalktpathtrelpathtjointrenamestreversedtlistt enumeratetexiststTruetAssertionErrortrmdir( tsrc_dirtdst_dirtdirpathtdirnamest filenamestsubdirtftsrctdsttntd((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytunpacks %% tWheelcBs5eZdZdZdZdZdZRS(cCswttjj|}|dkr7td|n||_x0|jjD]\}}t |||qSWdS(Nsinvalid wheel name: %r( t WHEEL_NAMERR tbasenametNonet ValueErrortfilenamet groupdicttitemstsetattr(tselfR&tmatchtktv((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt__init__7s   cCs7tj|jjd|jjd|jjdS(s>List tags (py_version, abi, platform) supported by this wheel.t.(t itertoolstproductt py_versiontsplittabitplatform(R*((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyttags?scs/tjtfd|jDtS(s5Is the wheel is compatible with the current platform?c3s!|]}|krtVqdS(N(R(t.0tt(tsupported_tags(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys Hs(Rt get_supportedtnextR6tFalse(R*((R9s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt is_compatibleEs cCsAtd|jd|jd|jdkr-dntjdS(Nt project_nametversionR5tanys.egg(RR>R?R5R$Rtegg_name(R*((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyRAJs$c stj|jd|j|jf}d|d|fd}|d}|d}t|jd}td|kotd knstd |ntj |j |tj j |t j|d t|d tttjfd jD}tj j |d}tj|tjtj j |dtj j |dtdtdd|} t| jddtj j |dtj j |tj j d} tj j| rtj j |dd} tj | xstj| D]b} | jdrtjtj j | | q\tjtj j | | tj j | | q\Wtj| nx:t tj jfdd!DD]} t!| |qWtj jr1tjntj j |d}tj j|rt"|}|j#j$}WdQXx|D]}tj j ||j$d}tj j |d}tj j|rtj j| rt"|d }|j%t&WdQXqqWnWdQXdS("s"Install wheel as an egg directory.s%s-%ss %s.dist-infos%s.datacscjd|fD}tr7|jjdn |j}tjjj|SWdQXdS(Ns%s/%ssutf-8(topenRtreadtdecodetemailtparsertParsertparsestr(tnametfptvalue(t dist_infotzf(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt get_metadataVs'tWHEELtMETADATAs Wheel-Versions1.0s2.0dev0s$unsupported wheel format version: %stmetadatacSsd|_t|S(N(R$tmarkertstr(treq((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytraw_reqls c sJi|]@}ttfdtj|fD|qS(c3s!|]}|kr|VqdS(N((R7RT(tinstall_requires(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys rs(Rtsortedtmaptrequires(R7textra(tdistRVRU(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys qs sEGG-INFOsPKG-INFOtattrsRVtextras_requiretegg_infos requires.txttscriptss.pycc3s$|]}tjj|VqdS(N(RR R (R7R(t dist_data(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys stdatatheaderstpurelibtplatlibsnamespace_packages.txtNR/s __init__.pytw(RaRbRcRd('tzipfiletZipFileR&R>R?RtgetR%Rtmkdirt extractallR R Rt from_locationRRRWRXRYtextrastrenametSetuptoolsDistributiontdictRtget_command_objR$RtlistdirtendswithtunlinkRtfilterR RBRCR3twritetNAMESPACE_PACKAGE_INIT(R*tdestination_eggdirt dist_basenameRNtwheel_metadatat dist_metadatat wheel_versionR]R^t setup_disttdist_data_scriptstegg_info_scriptstentryRtnamespace_packagesRJtmodtmod_dirtmod_init((R[R`RLRVRURMs4/usr/lib/python2.7/site-packages/setuptools/wheel.pytinstall_as_eggPsr    (    !        %(t__name__t __module__R.R6R=RAR(((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyR!5s     (t__doc__tdistutils.utilRRER0RtreRft pkg_resourcesRRRtsetuptools.extern.sixRt setuptoolsRnRtsetuptools.command.egg_infoRtcompiletVERBOSER+R"RvR tobjectR!(((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyts"      PK! h3G wheel.pyonu[ fc@sdZddlmZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlm ZddlmZddlmZejd ejjZd Zd Zd efd YZdS(sWheels support.i(t get_platformN(t Distributiont PathMetadatat parse_version(tPY3(R(t pep425tags(twrite_requirementss^(?P.+?)-(?P\d.*?) ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) )\.whl$stry: __import__('pkg_resources').declare_namespace(__name__) except ImportError: __path__ = __import__('pkgutil').extend_path(__path__, __name__) c CsBxtj|D]\}}}tjj||}xK|D]C}tjj||}tjj|||}tj||q;Wxttt|D]e\} } tjj|| }tjj||| }tjj |stj|||| =qqWqWx3tj|dt D]\}}}tj |qWdS(sDMove everything under `src_dir` to `dst_dir`, and delete the former.ttopdownN( tostwalktpathtrelpathtjointrenamestreversedtlistt enumeratetexiststTruetrmdir( tsrc_dirtdst_dirtdirpathtdirnamest filenamestsubdirtftsrctdsttntd((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytunpacks %%tWheelcBs5eZdZdZdZdZdZRS(cCswttjj|}|dkr7td|n||_x0|jjD]\}}t |||qSWdS(Nsinvalid wheel name: %r( t WHEEL_NAMERR tbasenametNonet ValueErrortfilenamet groupdicttitemstsetattr(tselfR%tmatchtktv((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt__init__7s   cCs7tj|jjd|jjd|jjdS(s>List tags (py_version, abi, platform) supported by this wheel.t.(t itertoolstproductt py_versiontsplittabitplatform(R)((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyttags?scs/tjtfd|jDtS(s5Is the wheel is compatible with the current platform?c3s!|]}|krtVqdS(N(R(t.0tt(tsupported_tags(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys Hs(Rt get_supportedtnextR5tFalse(R)((R8s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt is_compatibleEs cCsAtd|jd|jd|jdkr-dntjdS(Nt project_nametversionR4tanys.egg(RR=R>R4R#Rtegg_name(R)((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyR@Js$c stj|jd|j|jf}d|d|fd}|d}|d}t|jd}td|kotd knstd |ntj |j |tj j |t j|d t|d tttjfd jD}tj j |d}tj|tjtj j |dtj j |dtdtdd|} t| jddtj j |dtj j |tj j d} tj j| rtj j |dd} tj | xstj| D]b} | jdrtjtj j | | q\tjtj j | | tj j | | q\Wtj| nx:t tj jfdd!DD]} t!| |qWtj jr1tjntj j |d}tj j|rt"|}|j#j$}WdQXx|D]}tj j ||j$d}tj j |d}tj j|rtj j| rt"|d }|j%t&WdQXqqWnWdQXdS("s"Install wheel as an egg directory.s%s-%ss %s.dist-infos%s.datacscjd|fD}tr7|jjdn |j}tjjj|SWdQXdS(Ns%s/%ssutf-8(topenRtreadtdecodetemailtparsertParsertparsestr(tnametfptvalue(t dist_infotzf(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt get_metadataVs'tWHEELtMETADATAs Wheel-Versions1.0s2.0dev0s$unsupported wheel format version: %stmetadatacSsd|_t|S(N(R#tmarkertstr(treq((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytraw_reqls c sJi|]@}ttfdtj|fD|qS(c3s!|]}|kr|VqdS(N((R6RS(tinstall_requires(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys rs(Rtsortedtmaptrequires(R6textra(tdistRURT(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys qs sEGG-INFOsPKG-INFOtattrsRUtextras_requiretegg_infos requires.txttscriptss.pycc3s$|]}tjj|VqdS(N(RR R (R6R(t dist_data(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys stdatatheaderstpurelibtplatlibsnamespace_packages.txtNR.s __init__.pytw(R`RaRbRc('tzipfiletZipFileR%R=R>RtgetR$Rtmkdirt extractallR R Rt from_locationRRRVRWRXtextrastrenametSetuptoolsDistributiontdictRtget_command_objR#RtlistdirtendswithtunlinkRtfilterRRARBR2twritetNAMESPACE_PACKAGE_INIT(R)tdestination_eggdirt dist_basenameRMtwheel_metadatat dist_metadatat wheel_versionR\R]t setup_disttdist_data_scriptstegg_info_scriptstentryRtnamespace_packagesRItmodtmod_dirtmod_init((RZR_RKRURTRLs4/usr/lib/python2.7/site-packages/setuptools/wheel.pytinstall_as_eggPsr    (    !        %(t__name__t __module__R-R5R<R@R(((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyR 5s     (t__doc__tdistutils.utilRRDR/RtreRet pkg_resourcesRRRtsetuptools.extern.sixRt setuptoolsRmRtsetuptools.command.egg_infoRtcompiletVERBOSER*R!RuRtobjectR (((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyts"      PK!Xwindows_support.pycnu[ fc@s4ddlZddlZdZedZdS(iNcCstjdkrdS|S(NtWindowsc_sdS(N(tNone(targstkwargs((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pytt(tplatformtsystem(tfunc((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt windows_onlyscCsqtdtjjj}tjjtjjf|_tjj |_ d}|||}|smtj ndS(s Set the hidden attribute on a file or directory. From http://stackoverflow.com/questions/19622133/ `path` must be text. sctypes.wintypesiN( t __import__tctypestwindlltkernel32tSetFileAttributesWtwintypestLPWSTRtDWORDtargtypestBOOLtrestypetWinError(tpathtSetFileAttributestFILE_ATTRIBUTE_HIDDENtret((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt hide_file s (RR R R(((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyts   PK!j! __init__.pyonu[ fc@sdZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z ddl ZddlmZddlmZmZddlmZd d lmZd d d ddddgZejjZdZeZdgZde fdYZ!de!fdYZ"e!j#Z$dZ%dZ&ej'j&je&_ej(ej'j)Z*de*fdYZ)dZ+ej,dZ-ej.dS(s@Extensions to the 'distutils' for large or complex distributionsiN(t convert_path(t fnmatchcase(tfiltertmap(t Extension(t DistributiontFeature(tRequirei(tmonkeytsetupRRtCommandRRt find_packagess lib2to3.fixest PackageFindercBsSeZdZeddddZedZedZedZRS( sI Generate a list of all Python packages found within a directory t.t*cCs7t|jt||jdd||j|S(s Return a list all Python packages found within directory 'where' 'where' is the root directory which will be searched for packages. It should be supplied as a "cross-platform" (i.e. URL-style) path; it will be converted to the appropriate local path syntax. 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). 'include' is a sequence of package names to include. If it's specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. tez_setups *__pycache__(tlistt_find_packages_iterRt _build_filter(tclstwheretexcludetinclude((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfind's  c csxtj|dtD]\}}}|}g|(x|D]}tjj||} tjj| |} | jtjjd} d|ks:|j|  rq:n|| r||  r| Vn|j |q:WqWdS(sy All the packages found in 'where' that pass the 'include' filter, but not the 'exclude' filter. t followlinksR N( tostwalktTruetpathtjointrelpathtreplacetsept_looks_like_packagetappend( RRRRtroottdirstfilestall_dirstdirt full_pathtrel_pathtpackage((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR>s% cCstjjtjj|dS(s%Does a directory look like a package?s __init__.py(RRtisfileR(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!Zscs fdS(s Given a list of patterns, return a callable that will be true only if the input matches at least one of the patterns. cstfdDS(Nc3s!|]}td|VqdS(tpatN(R(t.0R,(tname(s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys es(tany(R.(tpatterns(R.s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytet((R0((R0s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR_s((R( t__name__t __module__t__doc__t classmethodRRt staticmethodR!R(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR "s tPEP420PackageFindercBseZedZRS(cCstS(N(R(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!is(R3R4R7R!(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR8hscCsXtjjtd|jD}|jdt|jrT|j|jndS(Ncss-|]#\}}|dkr||fVqdS(tdependency_linkstsetup_requiresN(R9R:((R-tktv((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys us tignore_option_errors( t distutilstcoreRtdicttitemstparse_config_filesRR:tfetch_build_eggs(tattrstdist((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_install_setup_requiresqs   cKst|tjj|S(N(RFR>R?R (RD((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR ~s cBs,eZejZeZdZddZRS(cKs'tj||t|j|dS(sj Construct the command for dist, updating vars(self) with any keyword parameters. N(t_Commandt__init__tvarstupdate(tselfREtkw((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRHsicKs,tj|||}t|j||S(N(RGtreinitialize_commandRIRJ(RKtcommandtreinit_subcommandsRLtcmd((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRMs(R3R4RGR5tFalsetcommand_consumes_argumentsRHRM(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR s  cCs2dtj|dtD}ttjj|S(s% Find all files under 'path' css:|]0\}}}|D]}tjj||VqqdS(N(RRR(R-tbaseR$R%tfile((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys s R(RRRRRR+(Rtresults((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_find_all_simplescCsRt|}|tjkrHtjtjjd|}t||}nt|S(s Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. tstart( RVRtcurdirt functoolstpartialRRRR(R'R%tmake_rel((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfindalls  (/R5RRYtdistutils.coreR>tdistutils.filelisttdistutils.utilRtfnmatchRtsetuptools.extern.six.movesRRtsetuptools.versiont setuptoolstsetuptools.extensionRtsetuptools.distRRtsetuptools.dependsRR2Rt__all__tversiont __version__tNonetbootstrap_install_fromRtrun_2to3_on_docteststlib2to3_fixer_packagestobjectR R8RR RFR R?t get_unpatchedR RGRVRXR\t patch_all(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyts:        F    PK!Oxarchive_util.pyonu[ fc@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddddd d d gZ d efd YZ d Z e ddZe dZe dZe dZeeefZdS(s/Utilities for extracting common archive formatsiN(tDistutilsError(tensure_directorytunpack_archivetunpack_zipfiletunpack_tarfiletdefault_filtertUnrecognizedFormattextraction_driverstunpack_directorycBseZdZRS(s#Couldn't recognize the archive type(t__name__t __module__t__doc__(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCs|S(s@The default progress/filter callback; returns True for all files((tsrctdst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCsZxS|p tD]5}y||||Wntk r=q q XdSq Wtd|dS(sUnpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` `progress_filter` is a function taking two arguments: a source path internal to the archive ('/'-separated), and a filesystem path where it will be extracted. The callback must return the desired extract path (which may be the same as the one passed in), or else ``None`` to skip that file or directory. The callback can thus be used to report on the progress of the extraction, as well as to filter the items extracted or alter their extraction paths. `drivers`, if supplied, must be a non-empty sequence of functions with the same signature as this function (minus the `drivers` argument), that raise ``UnrecognizedFormat`` if they do not support extracting the designated archive type. The `drivers` are tried in sequence until one is found that does not raise an error, or until all are exhausted (in which case ``UnrecognizedFormat`` is raised). If you do not supply a sequence of drivers, the module's ``extraction_drivers`` constant will be used, which means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that order. Ns!Not a recognized archive type: %s(RR(tfilenamet extract_dirtprogress_filtertdriverstdriver((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs c Cs:tjj|s%td|nid|f|6}xtj|D]\}}}||\}}xD|D]<} || dtjj|| f|tjj|| RRs..iN(ttarfileR-tTarErrorRt contextlibtclosingtchownR3R)R*RRRR6tislnktissymtlinknamet posixpathtdirnametnormpatht _getmembertisfileRR+tsept_extract_membert ExtractErrortTrue( RRRttarobjtmemberR3t prelim_dsttlinkpathRt final_dst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs8   %'  $ (R R%R9RRRAR;tdistutils.errorsRt pkg_resourcesRt__all__RRR6RRRRR(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyts$         "  % .PK! {AA config.pycnu[ fc@@sddlmZmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZddlmZeedZd Zed Zd efd YZd efdYZdefdYZdS(i(tabsolute_importtunicode_literalsN(t defaultdict(tpartial(t import_module(tDistutilsOptionErrortDistutilsFileError(t string_typesc C@sddlm}m}tjj|}tjj|sMtd|ntj}tj tjj |zl|}|r|j ng}||kr|j |n|j |d|t||jd|}Wdtj |Xt|S(u,Read given configuration file and returns options from it as a dict. :param str|unicode filepath: Path to configuration file to get options from. :param bool find_others: Whether to search for other configuration files which could be on in various places. :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: dict i(t Distributiont _Distributionu%Configuration file %s does not exist.t filenamestignore_option_errorsN(tsetuptools.distRR tostpathtabspathtisfileRtgetcwdtchdirtdirnametfind_config_filestappendtparse_config_filestparse_configurationtcommand_optionstconfiguration_to_dict( tfilepatht find_othersR RR tcurrent_directorytdistR thandlers((s5/usr/lib/python2.7/site-packages/setuptools/config.pytread_configuration s$     cC@stt}x|D]w}|j}|j}x\|jD]Q}t|d|d}|dkrot||}n |}||||su,u c3@sE|];}j|strtjj|rj|VqdS(N(t _assert_localRGR RRt _read_file(RaR(RT(s5/usr/lib/python2.7/site-packages/setuptools/config.pys s(RPRR5tlenRStjoin(RTR+tinclude_directivetspect filepaths((RTs5/usr/lib/python2.7/site-packages/setuptools/config.pyt _parse_files cC@s,|jtjs(td|ndS(Nu#`file:` directive can not access %s(R5R RR(R((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRbscC@s,tj|dd}|jSWdQXdS(Ntencodinguutf-8(tiotopentread(Rtf((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRcscC@sd}|j|s|S|j|djjd}|j}dj|}|p^d}tjjdt j zt |}t ||}Wdtjdt_X|S(uRepresents value as a module attribute. Examples: attr: package.attr attr: package.module.attr :param str value: :rtype: str uattr:uu.u__init__iNi( R5R6R7RStpopRetsysRtinsertR RRR$(RTR+tattr_directivet attrs_patht attr_namet module_nametmodule((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt _parse_attrs !   c@sfd}|S(uReturns parser function to represents value as a list. Parses a value applying given methods one after another. :param parse_methods: :rtype: callable c@s'|}xD]}||}q W|S(N((R+tparsedtmethod(t parse_methods(s5/usr/lib/python2.7/site-packages/setuptools/config.pyR.Bs ((RTRzR.((Rzs5/usr/lib/python2.7/site-packages/setuptools/config.pyt_get_parser_compound9s cC@sLi}|pd}x0|jD]"\}\}}||||Wt(R4(RTR;t values_parserR+R[t_R]((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_section_to_dictLs cC@sIxB|jD]4\}\}}y|||||d<|d=n|S(Nu*u(RRWRC(R9R;Rxtroot((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_package_data s   cC@s|j||ds   .  ;PK! {AA config.pyonu[ fc@@sddlmZmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZddlmZeedZd Zed Zd efd YZd efdYZdefdYZdS(i(tabsolute_importtunicode_literalsN(t defaultdict(tpartial(t import_module(tDistutilsOptionErrortDistutilsFileError(t string_typesc C@sddlm}m}tjj|}tjj|sMtd|ntj}tj tjj |zl|}|r|j ng}||kr|j |n|j |d|t||jd|}Wdtj |Xt|S(u,Read given configuration file and returns options from it as a dict. :param str|unicode filepath: Path to configuration file to get options from. :param bool find_others: Whether to search for other configuration files which could be on in various places. :param bool ignore_option_errors: Whether to silently ignore options, values of which could not be resolved (e.g. due to exceptions in directives such as file:, attr:, etc.). If False exceptions are propagated as expected. :rtype: dict i(t Distributiont _Distributionu%Configuration file %s does not exist.t filenamestignore_option_errorsN(tsetuptools.distRR tostpathtabspathtisfileRtgetcwdtchdirtdirnametfind_config_filestappendtparse_config_filestparse_configurationtcommand_optionstconfiguration_to_dict( tfilepatht find_othersR RR tcurrent_directorytdistR thandlers((s5/usr/lib/python2.7/site-packages/setuptools/config.pytread_configuration s$     cC@stt}x|D]w}|j}|j}x\|jD]Q}t|d|d}|dkrot||}n |}||||su,u c3@sE|];}j|strtjj|rj|VqdS(N(t _assert_localRGR RRt _read_file(RaR(RT(s5/usr/lib/python2.7/site-packages/setuptools/config.pys s(RPRR5tlenRStjoin(RTR+tinclude_directivetspect filepaths((RTs5/usr/lib/python2.7/site-packages/setuptools/config.pyt _parse_files cC@s,|jtjs(td|ndS(Nu#`file:` directive can not access %s(R5R RR(R((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRbscC@s,tj|dd}|jSWdQXdS(Ntencodinguutf-8(tiotopentread(Rtf((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRcscC@sd}|j|s|S|j|djjd}|j}dj|}|p^d}tjjdt j zt |}t ||}Wdtjdt_X|S(uRepresents value as a module attribute. Examples: attr: package.attr attr: package.module.attr :param str value: :rtype: str uattr:uu.u__init__iNi( R5R6R7RStpopRetsysRtinsertR RRR$(RTR+tattr_directivet attrs_patht attr_namet module_nametmodule((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt _parse_attrs !   c@sfd}|S(uReturns parser function to represents value as a list. Parses a value applying given methods one after another. :param parse_methods: :rtype: callable c@s'|}xD]}||}q W|S(N((R+tparsedtmethod(t parse_methods(s5/usr/lib/python2.7/site-packages/setuptools/config.pyR.Bs ((RTRzR.((Rzs5/usr/lib/python2.7/site-packages/setuptools/config.pyt_get_parser_compound9s cC@sLi}|pd}x0|jD]"\}\}}||||Wt(R4(RTR;t values_parserR+R[t_R]((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_section_to_dictLs cC@sIxB|jD]4\}\}}y|||||d<|d=n|S(Nu*u(RRWRC(R9R;Rxtroot((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_package_data s   cC@s|j||ds   .  ;PK!c.g dep_util.pyonu[ fc@sddlmZdZdS(i(t newer_groupcCst|t|kr'tdng}g}xVtt|D]B}t||||rF|j|||j||qFqFW||fS(sWalk both arguments in parallel, testing if each source group is newer than its corresponding target. Returns a pair of lists (sources_groups, targets) where sources is newer than target, according to the semantics of 'newer_group()'. s5'sources_group' and 'targets' must be the same length(tlent ValueErrortrangeRtappend(tsources_groupsttargetst n_sourcest n_targetsti((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pytnewer_pairwise_groupsN(tdistutils.dep_utilRR (((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pytsPK!KcSS depends.pyonu[ fc@sddlZddlZddlZddlmZddlmZmZmZmZddl m Z dddd gZ ddd YZ dd Zddd Zdd ZdZedS(iN(t StrictVersion(t PKG_DIRECTORYt PY_COMPILEDt PY_SOURCEt PY_FROZENi(tBytecodetRequiret find_moduletget_module_constanttextract_constantcBsYeZdZdd d dZdZdZd ddZd dZd dZ RS( s7A prerequisite to building or installing a distributiontcCsn|dkr!|dk r!t}n|dk rQ||}|dkrQd}qQn|jjt|`dS(Nt __version__(tNoneRt__dict__tupdatetlocalstself(Rtnametrequested_versiontmodulethomepaget attributetformat((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt__init__s     cCs*|jdk r#d|j|jfS|jS(s0Return full package/distribution name, w/versions%s-%sN(RR R(R((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt full_name scCs=|jdkp<|jdkp<t|dko<||jkS(s%Is 'version' sufficiently up-to-date?tunknownN(RR RtstrR(Rtversion((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt version_ok&sRcCs|jdkr]y6t|j|\}}}|r@|jn|SWq]tk rYdSXnt|j|j||}|dk r||k r|jdk r|j|S|S(sGet version number of installed module, 'None', or 'default' Search 'paths' for module. If not found, return 'None'. If found, return the extracted version attribute, or 'default' if no version attribute was specified, or the value cannot be determined without importing the module. The version is formatted according to the requirement's version format (if any), unless it is 'None' or the supplied 'default'. N(RR RRtcloset ImportErrorRR(Rtpathstdefaulttftptitv((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt get_version+s   ' cCs|j|dk S(s/Return true if dependency is present on 'paths'N(R%R (RR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt is_presentFscCs,|j|}|dkrtS|j|S(s>Return true if dependency is present and up-to-date on 'paths'N(R%R tFalseR(RRR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt is_currentJs N( t__name__t __module__t__doc__R RRRR%R&R((((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRs   c Cs|jd}x|r|jd}tj||\}}\}}}} |tkrv|pgdg}|g}q|rtd||fqqW| S(s7Just like 'imp.find_module()', but with package supportt.iRsCan't find %r in %s(tsplittpoptimpRRR( RRtpartstpartR!tpathtsuffixtmodetkindtinfo((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRRs (  c Csy%t||\}}\}}}Wntk r9dSXz|tkrh|jdtj|} n|tkrtj |} no|t krt |j|d} nH|t j krtj||||||fntt j ||dSWd|r |jnXt| ||S(sFind 'module' by searching 'paths', and extract 'symbol' Return 'None' if 'module' does not exist on 'paths', or it does not define 'symbol'. If the module defines 'symbol' as a constant, return the constant. Otherwise, return 'default'.itexecN(RRR RtreadtmarshaltloadRR/tget_frozen_objectRtcompiletsystmodulest load_moduletgetattrRR ( RtsymbolR RR!R2R3R4R5tcode((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRes$%     "c Cs||jkrdSt|jj|}d}d}d}|}xpt|D]b}|j} |j} | |kr|j| }qP| |kr| |ks| |kr|S|}qPWdS(sExtract the constant value of 'symbol' from 'code' If the name 'symbol' is bound to a constant value by the Python code object 'code', return that value. If 'symbol' is bound to an expression, return 'default'. Otherwise, return 'None'. Return value is based on the first assignment to 'symbol'. 'symbol' must be a global, or at least a non-"fast" local in the code block. That is, only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' must be present in 'code.co_names'. iZiaidN(tco_namesR tlisttindexRtopcodetargt co_consts( RBRAR tname_idxt STORE_NAMEt STORE_GLOBALt LOAD_CONSTtconstt byte_codetopRG((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyR s    $cCsXtjjd r&tjdkr&dSd}x%|D]}t|=tj|q3WdS(s Patch the globals to remove the objects not available on some platforms. XXX it'd be better to test assertions about bytecode instead. tjavatcliNR R(R R(R=tplatformt startswithtglobalst__all__tremove(t incompatibleR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt_update_globalss "  ((R=R/R9tdistutils.versionRRRRRt py33compatRRURR RRR RX(((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyts   "C " $ PK!o9ydist.pycnu[ fc@sKdgZddlZddlZddlZddlZddlZddlZddlZddl Zddl Z ddl m Z ddl mZmZmZddlmZddlmZddlmZddlmZdd lmZmZmZdd lmZdd lmZdd l m!Z!dd l"m#Z#ddl$Z$ddl%m&Z&e'de'ddZ(dZ)dZ*dZ+e,e-fZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8d Z9d!Z:e!ej;j<Z=de&e=fd"YZ<d#fd$YZ>dS(%t DistributioniN(t defaultdict(tDistutilsOptionErrortDistutilsPlatformErrortDistutilsSetupError(t rfc822_escape(t StrictVersion(tsix(t packaging(tmaptfiltert filterfalse(tRequire(twindows_support(t get_unpatched(tparse_configurationi(tDistribution_parse_config_filess&setuptools.extern.packaging.specifierss#setuptools.extern.packaging.versioncCstjdtt|S(NsDo not call this function(twarningstwarntDeprecationWarningR(tcls((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_get_unpatched#scCs|js|jrtdS|jdk sR|jdk sRt|dddk r\tdS|js|js|j s|j s|j rtdStdS(Ns2.1tpython_requiress1.2s1.1s1.0( tlong_description_content_typetprovides_extrasRt maintainertNonetmaintainer_emailtgetattrtprovidestrequirest obsoletest classifierst download_url(tdist_md((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_metadata_version(s   c Cst|}|jd||jd|j|jd|j|jd|j|jd|j|tdkr|jd|j|jd|jnyd#d$d%d&f}xd|D]\\}}t ||}t j r |j |}n|d"k r|jd||fqqW|jd|j|jrl|jd|jnx(|jjD]}|jd|q|Wt|j}|jd|dj|j} | r|jd| n|tdkr&xA|jD]} |jd| qWn|j|d|j|j|d|j|j|d|j|j|d|j|j|d|jt|dr|jd|jn|jr|jd |jn|jrx%|jD]} |jd!| qWnd"S('s5Write the PKG-INFO format data to a file object. sMetadata-Version: %s s Name: %s s Version: %s s Summary: %s sHome-page: %s s1.2s Author: %s sAuthor-email: %s tAuthortauthors Author-emailt author_emailt MaintainerRsMaintainer-emailRs%s: %s s License: %s sDownload-URL: %s sProject-URL: %s, %s sDescription: %s t,s Keywords: %s s Platform: %s tPlatformt ClassifiertRequirestProvidest ObsoletesRsRequires-Python: %s sDescription-Content-Type: %s sProvides-Extra: %s N(R$R%(s Author-emailR&(R'R(sMaintainer-emailR( R#twritetget_namet get_versiontget_descriptiontget_urlRt get_contacttget_contact_emailRRtPY2t _encode_fieldRt get_licenseR!t project_urlstitemsRtget_long_descriptiontjoint get_keywordst get_platformst _write_listtget_classifierst get_requirest get_providest get_obsoletesthasattrRRR( tselftfiletversiontoptional_fieldstfieldtattrtattr_valt project_urlt long_desctkeywordstplatformtextra((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_file7s\       cCs>ttjj|dddd}|j|WdQXdS(s3Write the PKG-INFO file into the release tree. sPKG-INFOtwtencodingsUTF-8N(topentostpathR;RP(RDtbase_dirtpkg_info((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_infos cCsdy*tjjd|}|j s)tWn3ttttfk r_td||fnXdS(Nsx=s4%r must be importable 'module:attrs' string (got %r)( t pkg_resourcest EntryPointtparsetextrastAssertionErrort TypeErrort ValueErrortAttributeErrorR(tdistRItvaluetep((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_importablescCsYydj||kstWn3ttttfk rTtd||fnXdS(s*Verify that value is a string list or Nonets%%r must be a list of strings (got %r)N(R;R]R^R_R`R(RaRIRb((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytassert_string_lists cCs|}t|||xw|D]o}|j|sItdd|n|jd\}}}|r||krtjjd||qqWdS(s(Verify that namespace packages are valids1Distribution contains no modules or packages for snamespace package %rt.s^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyN(Rfthas_contents_forRt rpartitiont distutilstlogR(RaRIRbt ns_packagestnsptparenttseptchild((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt check_nsps  cCsMy ttjt|jWn&tttfk rHtdnXdS(s+Verify that extras_require mapping is valids'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.N( tlistt itertoolststarmapt _check_extraR9R^R_R`R(RaRIRb((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt check_extrass  cCsW|jd\}}}|r@tj|r@td|nttj|dS(Nt:sInvalid environment marker: (t partitionRYtinvalid_markerRRrtparse_requirements(ROtreqstnameRotmarker((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRuscCs=t||kr9d}t|jd|d|ndS(s)Verify that value is True, False, 0, or 1s0{attr!r} must be a boolean value (got {value!r})RIRbN(tboolRtformat(RaRIRbttmpl((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt assert_boolscCsy;ttj|t|ttfr:tdnWn=ttfk rz}d}t|j d|d|nXdS(s9Verify that install_requires is a valid requirements listsUnordered types are not allowedsm{attr!r} must be a string or list of strings containing valid project/version requirement specifiers; {error}RIterrorN( RrRYRzt isinstancetdicttsetR^R_RR(RaRIRbRR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_requirementsscCsXytjj|Wn=tjjk rS}d}t|jd|d|nXdS(s.Verify that value is a valid version specifiersF{attr!r} must be a string containing valid version specifiers; {error}RIRN(Rt specifierst SpecifierSettInvalidSpecifierRR(RaRIRbRR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_specifiers cCs:ytjj|Wntk r5}t|nXdS(s)Verify that entry_points map is parseableN(RYRZt parse_mapR_R(RaRIRbte((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_entry_pointsscCs%t|tjs!tdndS(Nstest_suite must be a string(RRt string_typesR(RaRIRb((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_test_suitescCs}t|trixW|jD]B\}}t|ts;Pnyt|Wqtk r]PqXqWdSnt|ddS(s@Verify that value is a dictionary of package names to glob listsNsI must be a dictionary mapping package names to lists of wildcard patterns(RRR9tstrtiterR^R(RaRIRbtktv((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_package_datas  cCs=x6|D].}tjd|stjjd|qqWdS(Ns \w+(\.\w+)*s[WARNING: %r not a valid package name; please use only .-separated package names in setup.py(tretmatchRjRkR(RaRIRbtpkgname((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_packagess   cBsLeZdZd"ZdZd"dZdZdZe dZ dZ dZ d"e dZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&d!Z'RS(#sDistribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that effectively adds the following new optional keyword arguments to 'setup()': 'install_requires' -- a string or sequence of strings specifying project versions that the distribution requires when installed, in the format used by 'pkg_resources.require()'. They will be installed automatically when the package is installed. If you wish to use packages that are not available in PyPI, or want to give your users an alternate download location, you can add a 'find_links' option to the '[easy_install]' section of your project's 'setup.cfg' file, and then setuptools will scan the listed web pages for links that satisfy the requirements. 'extras_require' -- a dictionary mapping names of optional "extras" to the additional requirement(s) that using those extras incurs. For example, this:: extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) indicates that the distribution can optionally provide an extra capability called "reST", but it can only be used if docutils and reSTedit are installed. If the user installs your package using EasyInstall and requests one of your extras, the corresponding additional requirements will be installed if needed. 'features' **deprecated** -- a dictionary mapping option names to 'setuptools.Feature' objects. Features are a portion of the distribution that can be included or excluded based on user options, inter-feature dependencies, and availability on the current system. Excluded features are omitted from all setup commands, including source and binary distributions, so you can create multiple distributions from the same source tree. Feature names should be valid Python identifiers, except that they may contain the '-' (minus) sign. Features can be included or excluded via the command line options '--with-X' and '--without-X', where 'X' is the name of the feature. Whether a feature is included by default, and whether you are allowed to control this from the command line, is determined by the Feature object. See the 'Feature' class for more information. 'test_suite' -- the name of a test suite to run for the 'test' command. If the user runs 'python setup.py test', the package will be installed, and the named test suite will be run. The format is the same as would be used on a 'unittest.py' command line. That is, it is the dotted name of an object to import and call to generate a test suite. 'package_data' -- a dictionary mapping package names to lists of filenames or globs to use to find data files contained in the named packages. If the dictionary has filenames or globs listed under '""' (the empty string), those names will be searched for in every package, in addition to any names for the specific package. Data files found using these names/globs will be installed along with the package, in the same location as the package. Note that globs are allowed to reference the contents of non-package subdirectories, as long as you use '/' as a path separator. (Globs are automatically converted to platform-specific paths at runtime.) In addition to these new keywords, this class also has several new methods for manipulating the distribution's contents. For example, the 'include()' and 'exclude()' methods can be thought of as in-place add and subtract commands that add or remove packages, modules, extensions, and so on from the distribution. They are used by the feature subsystem to configure the distribution for the included and excluded features. cCs| sd|ksd|kr#dStjt|dj}tjjj|}|dk r|jd rtj t|d|_ ||_ ndS(NR|RFsPKG-INFO( RYt safe_nameRtlowert working_settby_keytgetRt has_metadatat safe_versiont_versiont _patched_dist(RDtattrstkeyRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytpatch_missing_pkg_infoVscCsUt|d}|s!i|_n|p*i}d|ksEd|krRtjng|_i|_g|_|jdd|_ |j ||j di|_ |jdg|_ |jdg|_x0tjdD]}t|j|jdqWtj||t|jd|j |j_ |j d |j_t|jd t|j_t|jjtjrt|jj|j_n|jjdk rGyft jj!|jj}t|}|jj|kr t"j#d |jj|f||j_nWqGt jj$t%fk rCt"j#d |jjqGXn|j&dS( Nt package_datatfeaturestrequire_featurestsrc_rootR8tdependency_linkstsetup_requiressdistutils.setup_keywordsRRsNormalizing '%s' to '%s'sThe version specified (%r) is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.('RCRtFeaturetwarn_deprecatedRRt dist_filestpopRRRRR8RRRYtiter_entry_pointstvarst setdefaultR|t _Distributiont__init__RtmetadataRRRRRFtnumberstNumberRRtVersionRRtInvalidVersionR^t_finalize_requires(RDRthave_package_dataRctvertnormalized_version((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRcsP          cCst|ddr$|j|j_nt|ddrxI|jjD]5}|jdd}|rF|jjj|qFqFWn|j |j dS(s Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. Rtextras_requireRwiN( RRRRRtkeystsplitRtaddt_convert_extras_requirementst"_move_install_requirements_markers(RDRO((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs cCst|ddpi}tt|_xf|jD]X\}}|j|x>tj|D]-}|j|}|j||j |q[Wq4WdS(s Convert requirements in `extras_require` of the form `"extra": ["barbazquux; {marker}"]` to `"extra:{marker}": ["barbazquux"]`. RN( RRRRrt_tmp_extras_requireR9RYRzt _suffix_fortappend(RDt spec_ext_reqstsectionRtrtsuffix((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs cCs|jrdt|jSdS(se For a requirement, return the 'extras_require' suffix for that requirement. RwRe(R}R(treq((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRscsd}tddpd}ttj|}t||}t||}ttt|_ x/|D]'}j dt|j j |qsWt fdj jD_dS(sv Move requirements in `install_requires` that are using environment markers `extras_require`. cSs|j S(N(R}(R((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt is_simple_reqstinstall_requiresRwc3sF|]<\}}|gtj|D]}t|^q%fVqdS(N(R t _clean_reqR(t.0RRR(RD(s3/usr/lib/python2.7/site-packages/setuptools/dist.pys sN((RRRrRYRzR R R RRRR}RRR9R(RDRtspec_inst_reqst inst_reqst simple_reqst complex_reqsR((RDs3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs  % cCs d|_|S(sP Given a Requirement, remove environment markers and return it. N(RR}(RDR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs cCs7tj|d|t||jd||jdS(sYParses configuration files from various levels and loads configuration. t filenamestignore_option_errorsN(Rtparse_config_filesRtcommand_optionsR(RDRR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRscCs)tj|}|jr%|jn|S(s3Process features after parsing command line options(Rtparse_command_lineRt_finalize_features(RDtresult((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs  cCsd|jddS(s;Convert feature name to corresponding option attribute nametwith_t-t_(treplace(RDR|((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_feature_attrnamescCsUtjjtj|d|jdt}x$|D]}tjj|dtq1W|S(sResolve pre-setup requirementst installertreplace_conflictingR(RYRtresolveRztfetch_build_eggtTrueR(RDRtresolved_distsRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytfetch_build_eggss    cCstj||jr#|jnxgtjdD]V}t||jd}|dk r3|j d|j |j ||j|q3q3Wt|ddrg|j D]}t jj|^q|_ n g|_ dS(Nsdistutils.setup_keywordsRtconvert_2to3_doctests(Rtfinalize_optionsRt_set_global_opts_from_featuresRYRRR|RtrequireRtloadRRTRUtabspath(RDRcRbtp((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs     +cCstjjtjd}tjj|stj|tj|tjj|d}t|d.}|j d|j d|j dWdQXn|S(Ns.eggss README.txtRQscThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins. sAThis directory caches those eggs to prevent repeated downloads. s/However, it is safe to delete this directory. ( RTRUR;tcurdirtexiststmkdirR t hide_fileRSR.(RDt egg_cache_dirtreadme_txt_filenametf((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_egg_cache_dirs    cCsddlm}|jidgd6}|jd}|j|jd|jdjD|jr|j}d|kr|dd|}nd|f|d0s Ritsetuptargstxt install_dirtexclude_scriptst always_copytbuild_directoryteditabletupgradet multi_versiont no_reporttuserN( tsetuptools.command.easy_installRt __class__tget_option_dicttcleartupdateR9RRRtFalseRtensure_finalized(RDRRRatoptstlinksRtcmd((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR)s(      c Csg}|jj}x|jjD]\}}|j|d|j||jr%|j}d}d}|j s||}}nd|dd||fd|dd||ff}|j |d||d|R#((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR2s  %cKsZxS|jD]E\}}t|d|d}|rB||q |j||q WdS(sRemove items from distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from the distribution's 'py_modules' attribute. Excluding packages uses the 'exclude_package()' method, so all of the package's contained packages, modules, and extensions are also excluded. Currently, this method only supports exclusion from attributes that are lists or tuples. If you need to add support for excluding from other attributes in this or a subclass, you can add an '_exclude_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' will try to call 'dist._exclude_foo({"bar":"baz"})', which can then handle whatever special exclusion logic is needed. t _exclude_N(R9RRR?(RDRRRtexclude((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRAs  cCs?t|ts%td|fntt|j|dS(Ns.packages: setting must be a list or tuple (%r)(RR<RRrR R:(RDR4((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_exclude_packagessc Cs|jj|_|jj|_|d}|jd}xS||kr||\}}||=ddl}|j|t|d*|d}q:Wtj|||}|j |} t | ddrd|f|j|d<|dk rgSn|S(Nitaliasesiitcommand_consumes_argumentss command lineR( R RRR tshlexRRRt_parse_command_optsR)RR( RDtparserRR*RCtsrctaliasREtnargst cmd_class((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRFs"   c Cs'i}x|jjD] \}}x|jD]\}\}}|dkrSq/n|jdd}|dkr|j|}|jj}|jt|dixZ|jD](\} } | |kr| }d}PqqWt dn|dkrd}n||j |i|`_ and will be removed in a future version. A subset of the distribution that can be excluded if unneeded/wanted Features are created using these keyword arguments: 'description' -- a short, human readable description of the feature, to be used in error messages, and option help messages. 'standard' -- if true, the feature is included by default if it is available on the current system. Otherwise, the feature is only included if requested via a command line '--with-X' option, or if another included feature requires it. The default setting is 'False'. 'available' -- if true, the feature is available for installation on the current system. The default setting is 'True'. 'optional' -- if true, the feature's inclusion can be controlled from the command line, using the '--with-X' or '--without-X' options. If false, the feature's inclusion status is determined automatically, based on 'availabile', 'standard', and whether any other feature requires it. The default setting is 'True'. 'require_features' -- a string or sequence of strings naming features that should also be included if this feature is included. Defaults to empty list. May also contain 'Require' objects that should be added/removed from the distribution. 'remove' -- a string or list of strings naming packages to be removed from the distribution if this feature is *not* included. If the feature *is* included, this argument is ignored. This argument exists to support removing features that "crosscut" a distribution, such as defining a 'tests' feature that removes all the 'tests' subpackages provided by other features. The default for this argument is an empty list. (Note: the named package(s) or modules must exist in the base distribution when the 'setup()' function is initially called.) other keywords -- any other keyword arguments are saved, and passed to the distribution's 'include()' and 'exclude()' methods when the feature is included or excluded, respectively. So, for example, you could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be added or removed from the distribution as appropriate. A feature must include at least one 'requires', 'remove', or other keyword argument. Otherwise, it can't affect the distribution in any way. Note also that you can subclass 'Feature' to create your own specialized feature types that modify the distribution in other ways when included or excluded. See the docstrings for the various methods here for more detail. Aside from the methods, the only feature attributes that distributions look at are 'description' and 'optional'. cCs d}tj|tdddS(NsrFeatures are deprecated and will be removed in a future version. See https://github.com/pypa/setuptools/issues/65.t stackleveli(RRR(tmsg((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRsc Ks |j||_||_||_||_t|ttfrO|f}ng|D]}t|trV|^qV|_g|D]}t|ts|^q} | r| |d((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR&s  cCsFx?|jD]4}|j|s td|j||fq q WdS(sVerify that feature makes sense in context of distribution This method is called by the distribution just before it parses its command line. It checks to ensure that the 'remove' attribute, if any, contains only valid package/module names that are present in the base distribution when 'setup()' is called. You may override it in a subclass to perform any other required validation of the feature against a target distribution. sg%s wants to be able to remove %s, but the distribution doesn't contain any packages or modules under %sN(RpRhRR(RDRaR>((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs ((( RhRiRjRkRR RRRR%R&R(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs7    (?t__all__RRTRRt distutils.logRjtdistutils.coret distutils.cmdtdistutils.distRst collectionsRtdistutils.errorsRRRtdistutils.utilRtdistutils.versionRtsetuptools.externRRtsetuptools.extern.six.movesR R R tsetuptools.dependsR t setuptoolsR tsetuptools.monkeyRtsetuptools.configRRYt py36compatRt __import__RR#RPRXRVRrR<RdRfRqRvRuRRRRRRRtcoreRRR(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyts\                H          PK!ʏ glibc.pycnu[ fc@@s\ddlmZddlZddlZddlZdZdZdZdZdS(i(tabsolute_importNcC@sktjd}y |j}Wntk r0dSXtj|_|}t|tsg|j d}n|S(s9Returns glibc version string, or None if not using glibc.tasciiN( tctypestCDLLtNonetgnu_get_libc_versiontAttributeErrortc_char_ptrestypet isinstancetstrtdecode(tprocess_namespaceRt version_str((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytglibc_version_string s    cC@sdtjd|}|s0tjd|ttSt|jd|koct|jd|kS(Ns$(?P[0-9]+)\.(?P[0-9]+)s=Expected glibc version with 2 components major.minor, got: %stmajortminor(tretmatchtwarningstwarntRuntimeWarningtFalsetinttgroup(R trequired_majort minimum_minortm((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytcheck_glibc_version$s  cC@s)t}|dkrtSt|||S(N(RRRR(RRR ((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pythave_compatible_glibc4s  cC@s't}|dkrdSd|fSdS(sTry to determine the glibc version Returns a tuple of strings (lib, version) which default to empty strings in case the lookup fails. ttglibcN(RR(RR(t glibc_version((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytlibc_verLs  ( t __future__RRRRRRRR!(((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pyts      PK!ʏ glibc.pyonu[ fc@@s\ddlmZddlZddlZddlZdZdZdZdZdS(i(tabsolute_importNcC@sktjd}y |j}Wntk r0dSXtj|_|}t|tsg|j d}n|S(s9Returns glibc version string, or None if not using glibc.tasciiN( tctypestCDLLtNonetgnu_get_libc_versiontAttributeErrortc_char_ptrestypet isinstancetstrtdecode(tprocess_namespaceRt version_str((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytglibc_version_string s    cC@sdtjd|}|s0tjd|ttSt|jd|koct|jd|kS(Ns$(?P[0-9]+)\.(?P[0-9]+)s=Expected glibc version with 2 components major.minor, got: %stmajortminor(tretmatchtwarningstwarntRuntimeWarningtFalsetinttgroup(R trequired_majort minimum_minortm((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytcheck_glibc_version$s  cC@s)t}|dkrtSt|||S(N(RRRR(RRR ((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pythave_compatible_glibc4s  cC@s't}|dkrdSd|fSdS(sTry to determine the glibc version Returns a tuple of strings (lib, version) which default to empty strings in case the lookup fails. ttglibcN(RR(RR(t glibc_version((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytlibc_verLs  ( t __future__RRRRRRRR!(((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pyts      PK!jKglob.pycnu[ fc@sdZddlZddlZddlZddlmZdddgZedZedZ d Z d Z d Z d Z d ZejdZejdZdZdZdZdS(s Filename globbing utility. Mostly a copy of `glob` from Python 3.5. Changes include: * `yield from` and PEP3102 `*` removed. * `bytes` changed to `six.binary_type`. * Hidden files are not ignored. iN(t binary_typetglobtiglobtescapecCstt|d|S(syReturn a list of paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. t recursive(tlistR(tpathnameR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRs cCsAt||}|r=t|r=t|}| s=tn|S(sReturn an iterator which yields the paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. (t_iglobt _isrecursivetnexttAssertionError(RRtitts((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR s  ccsntjj|\}}t|se|rGtjj|ra|Vqantjj|ra|VndS|s|rt|rx>t||D] }|VqWnxt||D] }|VqWdS||krt|rt ||}n |g}t|r%|rt|rt}q+t}nt }x<|D]4}x+|||D]}tjj ||VqHWq2WdS(N( tostpathtsplitt has_magictlexiststisdirRtglob2tglob1Rtglob0tjoin(RRtdirnametbasenametxtdirst glob_in_dirtname((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR2s4         cCsn|s6t|tr*tjjd}q6tj}nytj|}Wntk r]gSXtj||S(NtASCII( t isinstanceRR tcurdirtencodetlistdirtOSErrortfnmatchtfilter(Rtpatterntnames((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR]s  cCsN|s"tjj|rJ|gSn(tjjtjj||rJ|gSgS(N(R RRRR(RR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRjs  !ccs;t|st|d Vxt|D] }|Vq(WdS(Ni(RR t _rlistdir(RR%R((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRzs ccs|s6t|tr*ttjd}q6tj}nytj|}Wntjk r`dSXx_|D]W}|V|rtjj||n|}x(t|D]}tjj||VqWqhWdS(NR( RRR RR!terrorRRR'(RR&RRty((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR's  !s([*?[])cCs:t|tr!tj|}ntj|}|dk S(N(RRtmagic_check_bytestsearcht magic_checktNone(R tmatch((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRscCs't|tr|dkS|dkSdS(Ns**(RR(R%((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRs cCsVtjj|\}}t|tr<tjd|}ntjd|}||S(s#Escape all special characters. s[\1](R Rt splitdriveRRR*tsubR,(Rtdrive((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRs (t__doc__R treR#tsetuptools.extern.sixRt__all__tFalseRRRRRRR'tcompileR,R*RRR(((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyts"      +     PK!I launch.pyonu[ fc@sAdZddlZddlZdZedkr=endS(s[ Launch the Python script on the command line after setuptools is bootstrapped via import. iNcBseejd}ed|dddd }ejdej(eede}||j}|j dd}e ||d }||Ud S( sP Run the script in sys.argv[1] as if it had been invoked naturally. it__file__t__name__t__main__t__doc__topens\r\ns\ntexecN( t __builtins__tsystargvtdicttNonetgetattrttokenizeRtreadtreplacetcompile(t script_namet namespacetopen_tscriptt norm_scripttcode((s5/usr/lib/python2.7/site-packages/setuptools/launch.pytrun s  R(RR RRR(((s5/usr/lib/python2.7/site-packages/setuptools/launch.pyts     PK!x- lib2to3_ex.pyonu[ fc@sxdZddlmZddlmZddlmZmZddl Z defdYZ defd YZdS( sy Customized Mixin2to3 support: - adds support for converting doctests This module raises an ImportError on Python 2. i(t Mixin2to3(tlog(tRefactoringTooltget_fixers_from_packageNtDistutilsRefactoringToolcBs#eZdZdZdZRS(cOstj||dS(N(Rterror(tselftmsgtargstkw((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt log_errorscGstj||dS(N(Rtinfo(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt log_messagescGstj||dS(N(Rtdebug(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt log_debugs(t__name__t __module__R R R(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs  RcBs&eZedZdZdZRS(cCs|jjtk rdS|s dStjddj||j|j|rtj rt |j }|j |dtdtqnt j||dS(NsFixing t twritet doctests_only(t distributiontuse_2to3tTrueRR tjoint_Mixin2to3__build_fixer_namest_Mixin2to3__exclude_fixerst setuptoolstrun_2to3_on_doctestsRt fixer_namestrefactort _Mixin2to3trun_2to3(Rtfilestdocteststr((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs   cCs|jr dSg|_x'tjD]}|jjt|q W|jjdk rx-|jjD]}|jjt|q_WndS(N(RRtlib2to3_fixer_packagestextendRRtuse_2to3_fixerstNone(Rtp((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__build_fixer_names.s  cCsqt|dg}|jjdk r:|j|jjnx0|D](}||jkrA|jj|qAqAWdS(Ntexclude_fixers(tgetattrRtuse_2to3_exclude_fixersR&R$Rtremove(Rtexcluded_fixerst fixer_name((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__exclude_fixers8s  (RRtFalseRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs  ( t__doc__tdistutils.utilRRt distutilsRtlib2to3.refactorRRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyts   PK!K  monkey.pyonu[ fc@sdZddlZddlZddlZddlZddlZddlmZddl Z ddl m Z ddl Z gZ dZdZdZdZd Zd Zd Zd Zd ZdS(s Monkey patching of distutils. iN(t import_module(tsixcCs-tjdkr |f|jStj|S(sm Returns the bases classes for cls sorted by the MRO. Works around an issue on Jython where inspect.getmro will not return all base classes if multiple classes share the same name. Instead, this function will return a tuple containing the class itself, and the contents of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. tJython(tplatformtpython_implementationt __bases__tinspecttgetmro(tcls((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt_get_mros cCsCt|tjrtnt|tjr0tnd}||S(NcSsdS(N(tNone(titem((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt*t(t isinstanceRt class_typestget_unpatched_classttypest FunctionTypetget_unpatched_function(R tlookup((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt get_unpatched&s cCsQdt|D}t|}|jjdsMd|}t|n|S(sProtect against re-patching the distutils if reloaded Also ensures that no other distutils extension monkeypatched the distutils first. css'|]}|jjds|VqdS(t setuptoolsN(t __module__t startswith(t.0R((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pys 6st distutilss(distutils has already been patched by %r(R tnextRRtAssertionError(Rtexternal_basestbasetmsg((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR/s  cCsWtjtj_tjd k}|r6tjtj_ntjd kpd tjko_dknpdtjko~dknpdtjkodkn}|rd }|tjj _ nt t x/tj tjtjfD]}tj j|_qWtjjtj_tjjtj_d tjkrLtjjtjd _ntdS(Niiiii iiishttps://upload.pypi.org/legacy/sdistutils.command.build_ext(iii(iii (ii(iii(ii(iii(ii(iii(RtCommandRtcoretsyst version_infotfindalltfilelisttconfigt PyPIRCCommandtDEFAULT_REPOSITORYt+_patch_distribution_metadata_write_pkg_filet+_patch_distribution_metadata_write_pkg_infotdisttcmdt Distributiont extensiont Extensiontmodulest#patch_for_msvc_specialized_compiler(thas_issue_12885tneeds_warehouset warehousetmodule((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt patch_allAs(cCstjjtjj_dS(sDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN(RR+twrite_pkg_fileRtDistributionMetadata(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR)kscCsFdtjd kodkn}|s-dStjjtjj_dS(s Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local encoding to save the pkg_info. Monkey-patch its write_pkg_info method to correct this undesirable behavior. iiN(i(iii(R"R#RR+twrite_pkg_infoRR8(tenvironment_local((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR*rs#cCs9t||}t|jd|t|||dS(s Patch func_name in target_mod with replacement Important - original must be resolved by name to avoid patching an already patched function. t unpatchedN(tgetattrtvarst setdefaulttsetattr(t replacementt target_modt func_nametoriginal((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt patch_funcscCs t|dS(NR;(R<(t candidate((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyRscstdtjdkr"dSfd}tj|d}tj|d}y$t|dt|dWntk rnXyt|d Wntk rnXyt|d Wntk rnXdS( s\ Patch functions in distutils to use standalone Microsoft Visual C++ compilers. ssetuptools.msvctWindowsNcsqd|krdnd}||jd}t|}t|}t||sdt|n|||fS(sT Prepare the parameters for patch_func to patch indicated function. tmsvc9tmsvc9_tmsvc14_t_(tlstripR<Rthasattrt ImportError(tmod_nameRBt repl_prefixt repl_nametrepltmod(tmsvc(s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt patch_paramss sdistutils.msvc9compilersdistutils._msvccompilertfind_vcvarsalltquery_vcvarsallt _get_vc_envtgen_lib_options(RRtsystemt functoolstpartialRDRM(RTRGtmsvc14((RSs5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR1s&     (t__doc__R"tdistutils.filelistRRRRZt importlibRRtsetuptools.externRRt__all__R RRR6R)R*RDRR1(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyts&          *    PK!g[⣠msvc.pyonu[ fc@sydZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ej dkrddl mZejZnd fd YZeZeejjfZydd lmZWnek rnXd Zd dZdZdZddZdfdYZdfdYZdfdYZdfdYZ dS(s@ Improved support for Microsoft Visual C++ compilers. Known supported compilers: -------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) iN(t LegacyVersion(t filterfalsei(t get_unpatchedtWindows(twinregRcBs eZdZdZdZdZRS(N(t__name__t __module__tNonet HKEY_USERStHKEY_CURRENT_USERtHKEY_LOCAL_MACHINEtHKEY_CLASSES_ROOT(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR(s(tRegcCsd}|d|f}ytj|d}WnQtk ry&|d|f}tj|d}Wqtk r{d}qXnX|rtjjjj|d}tjj|r|Sntt |S(s+ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone compiler build for Python (VCForPython). Fall back to original behavior when the standalone compiler is not available. Redirect the path of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Parameters ---------- version: float Required Microsoft Visual C++ version. Return ------ vcvarsall.bat path: str s-Software\%sMicrosoft\DevDiv\VCForPython\%0.1ftt installdirs Wow6432Node\s vcvarsall.batN( R t get_valuetKeyErrorRtostpathtjointisfileRtmsvc9_find_vcvarsall(tversiontVC_BASEtkeyt productdirt vcvarsall((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR?s  tx86cOsy#tt}|||||SWn'tjjk r<ntk rLnXyt||jSWn,tjjk r}t|||nXdS(s Patched "distutils.msvc9compiler.query_vcvarsall" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 9.0: Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) Microsoft Windows SDK 6.1 (x86, x64, ia64) Microsoft Windows SDK 7.0 (x86, x64, ia64) Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) Parameters ---------- ver: float Required Microsoft Visual C++ version. arch: str Target architecture. Return ------ environment: dict N( Rtmsvc9_query_vcvarsallt distutilsterrorstDistutilsPlatformErrort ValueErrortEnvironmentInfot return_envt_augment_exception(tvertarchtargstkwargstorigtexc((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRjs  cCsxytt|SWntjjk r-nXyt|ddjSWn)tjjk rs}t|dnXdS(s' Patched "distutils._msvccompiler._get_vc_env" for support extra compilers. Set environment without use of "vcvarsall.bat". Known supported compilers ------------------------- Microsoft Visual C++ 14.0: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) Parameters ---------- plat_spec: str Target architecture. Return ------ environment: dict t vc_min_verg,@N(Rtmsvc14_get_vc_envRRRR!R"R#(t plat_specR)((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR+s cOsbdtjkrOddl}t|jtdkrO|jjj||Sntt ||S(s Patched "distutils._msvccompiler.gen_lib_options" for fix compatibility between "numpy.distutils" and "distutils._msvccompiler" (for Numpy < 1.11.2) snumpy.distutilsiNs1.11.2( tsystmodulestnumpyRt __version__Rt ccompilertgen_lib_optionsRtmsvc14_gen_lib_options(R&R'tnp((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR3s  R cCs|jd}d|jks1d|jkrd}|jt}d}|dkr|jjddkr|d 7}||d 7}q|d 7}q|d kr|d 7}||d7}q|dkr|d7}qn|f|_dS(sl Add details to the exception message to help guide the user as to what action will resolve it. iRsvisual cs0Microsoft Visual C++ {version:0.1f} is required.s-www.microsoft.com/download/details.aspx?id=%dg"@tia64is* Get it with "Microsoft Windows SDK 7.0": iB s% Get it from http://aka.ms/vcpython27g$@s* Get it with "Microsoft Windows SDK 7.1": iW g,@sj Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-toolsN(R&tlowertformattlocalstfind(R)RR%tmessagettmplt msdownload((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR#s  $      t PlatformInfocBszeZdZejddjZdZedZ dZ dZ e e dZ e e dZe d ZRS( s Current and Target Architectures informations. Parameters ---------- arch: str Target architecture. tprocessor_architectureR cCs|jjdd|_dS(Ntx64tamd64(R6treplaceR%(tselfR%((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt__init__scCs|j|jjddS(Nt_i(R%R9(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt target_cpuscCs |jdkS(NR(RE(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt target_is_x86scCs |jdkS(NR(t current_cpu(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytcurrent_is_x86scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sj Current platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '' if architecture is x86. x64: bool return 'd' and not 'md64' if architecture is amd64. Return ------ subfolder: str ' arget', or '' (see hidex86 parameter) RR R@s\x64s\%s(RG(RBthidex86R?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt current_dir scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sr Target platform specific subfolder. Parameters ---------- hidex86: bool return '' and not '\x86' if architecture is x86. x64: bool return '\x64' and not '\amd64' if architecture is amd64. Return ------ subfolder: str '\current', or '' (see hidex86 parameter) RR R@s\x64s\%s(RE(RBRIR?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt target_dirscCsB|r dn|j}|j|kr(dS|jjdd|S(so Cross platform specific subfolder. Parameters ---------- forcex86: bool Use 'x86' as current architecture even if current acritecture is not x86. Return ------ subfolder: str '' if target architecture is current architecture, '\current_target' if not. RR s\s\%s_(RGRERKRA(RBtforcex86tcurrent((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt cross_dir5s(RRt__doc__tsafe_envtgetR6RGRCtpropertyRERFRHtFalseRJRKRN(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR=s   t RegistryInfocBseZdZejejejejfZdZ e dZ e dZ e dZ e dZe dZe dZe dZe d Ze d Zed Zd ZRS( s Microsoft Visual Studio related registry informations. Parameters ---------- platform_info: PlatformInfo "PlatformInfo" instance. cCs ||_dS(N(tpi(RBt platform_info((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCZscCsdS(s< Microsoft Visual Studio root registry key. t VisualStudio((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt visualstudio]scCstjj|jdS(s; Microsoft Visual Studio SxS registry key. tSxS(RRRRX(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytsxsdscCstjj|jdS(s8 Microsoft Visual C++ VC7 registry key. tVC7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvckscCstjj|jdS(s; Microsoft Visual Studio VS7 registry key. tVS7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvsrscCsdS(s? Microsoft Visual C++ for Python registry key. sDevDiv\VCForPython((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt vc_for_pythonyscCsdS(s- Microsoft SDK registry key. sMicrosoft SDKs((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt microsoft_sdkscCstjj|jdS(s> Microsoft Windows/Platform SDK registry key. R(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt windows_sdkscCstjj|jdS(s< Microsoft .NET Framework SDK registry key. tNETFXSDK(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt netfx_sdkscCsdS(s< Microsoft Windows Kits Roots registry key. sWindows Kits\Installed Roots((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytwindows_kits_rootsscCs:|jjs|rdnd}tjjd|d|S(s  Return key in Microsoft software registry. Parameters ---------- key: str Registry key path where look. x86: str Force x86 software registry. Return ------ str: value R t Wow6432NodetSoftwaret Microsoft(RURHRRR(RBRRtnode64((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt microsofts!cCstj}tj}|j}x|jD]}y||||d|}Wnkttfk r|jjs%y"||||t d|}Wqttfk rq%qXqq%nXytj ||dSWq%ttfk rq%Xq%WdS(s Look for values in registry in Microsoft software registry. Parameters ---------- key: str Registry key path where look. name: str Value name to find. Return ------ str: value iN( RtKEY_READtOpenKeyRitHKEYStOSErrortIOErrorRURHtTruet QueryValueEx(RBRtnameRjtopenkeytmsthkeytbkey((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytlookups"   " (RRRORRR R R RlRCRRRXRZR\R^R_R`RaRcRdRSRiRv(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRTLs"   t SystemInfocBsjeZdZejddZejddZejdeZddZ dZ dZ e dZ e d Zd Zd Ze d Ze d Ze dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZdZddZRS(s Microsoft Windows and Visual Studio related system inormations. Parameters ---------- registry_info: RegistryInfo "RegistryInfo" instance. vc_ver: float Required Microsoft Visual C++ version. tWinDirR t ProgramFilessProgramFiles(x86)cCs1||_|jj|_|p'|j|_dS(N(triRUt_find_latest_available_vc_vertvc_ver(RBt registry_infoR|((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCs cCsBy|jdSWn)tk r=d}tjj|nXdS(Nis%No Microsoft Visual C++ version found(tfind_available_vc_verst IndexErrorRRR(RBterr((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR{s  c Cs|jj}|jj|jj|jjf}g}xI|jjD];}x2|D]*}y%tj|||dtj}Wnt t fk rqMnXtj |\}}} xdt |D]V} y<t tj|| d} | |kr|j| nWqtk rqXqWx`t |D]R} y8t tj|| } | |kr^|j| nWq!tk rrq!Xq!WqMWq@Wt|S(sC Find all available Microsoft Visual C++ versions. i(RzRiR\R_R^RlRRkRjRmRnt QueryInfoKeytrangetfloatt EnumValuetappendR tEnumKeytsorted( RBRstvckeystvc_versRtRRutsubkeystvaluesRDtiR$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR~s2 ! %    cCsKd|j}tjj|j|}|jj|jjd|jpJ|S(s4 Microsoft Visual Studio directory. sMicrosoft Visual Studio %0.1fs%0.1f(R|RRRtProgramFilesx86RzRvR^(RBRqtdefault((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VSInstallDir s cCs|j|jp|j}tjj|jjd|j}|jj |d}|rqtjj|dn|}|jj |jj d|jp|}tjj |sd}t j j|n|S(s1 Microsoft Visual C++ directory. s%0.1fRtVCs(Microsoft Visual C++ directory not found(Rt _guess_vct_guess_vc_legacyRRRRzR_R|RvR\tisdirRRR(RBtguess_vctreg_patht python_vct default_vcRtmsg((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCInstallDirs"!(cCs||jdkrdSd}tjj|j|}y*tj|d}tjj||SWntttfk rwnXdS(s* Locate Visual C for 2017 g,@Ns VC\Tools\MSVCi( R|RRRRtlistdirRmRnR(RBRRt vc_exact_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR0scCs#d|j}tjj|j|S(s< Locate Visual C for versions prior to 2017 s Microsoft Visual Studio %0.1f\VC(R|RRRR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR@s cCsc|jdkrdS|jdkr&dS|jdkr9dS|jd krLdS|jdkr_dSdS(sN Microsoft Windows SDK versions for specified MSVC++ version. g"@s7.0s6.1s6.0ag$@s7.1s7.0ag&@s8.0s8.0ag(@s8.1s8.1ag,@s10.0N(s7.0s6.1s6.0a(s7.1s7.0a(s8.0s8.0a(s8.1s8.1a(s10.0s8.1(R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkVersionGscCs|jtjj|jdS(s4 Microsoft Windows SDK last version tlib(t_use_last_dir_nameRRRt WindowsSdkDir(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkLastVersionWscCsd}xO|jD]D}tjj|jjd|}|jj|d}|rPqqW| srtjj| rtjj|jjd|j }|jj|d}|rtjj|d}qn| stjj| rKxd|jD]V}||j d }d|}tjj|j |}tjj|r|}qqWn| setjj| rxQ|jD]C}d |}tjj|j |}tjj|ro|}qoqoWn|stjj|j d }n|S( s2 Microsoft Windows SDK directory. R sv%stinstallationfolders%0.1fRtWinSDKt.sMicrosoft SDKs\Windows Kits\%ssMicrosoft SDKs\Windows\v%st PlatformSDK( RRRRRzRaRvRR_R|trfindRyR(RBtsdkdirR$tlocRt install_basetintvertd((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR_s6"  c Cs8|jdkrd}d}n<d}|jdkr9tnt}|jjdtd|}d||jd d f}g}|jd krx9|jD]+}|tjj |j j ||g7}qWnx:|j D]/}|tjj |j j d ||g7}qWx-|D]%}|j j|d }|r Pq q W|S(s= Microsoft Windows SDK executable directory. g&@i#R i(g(@R?RIsWinSDK-NetFx%dTools%ss\t-g,@sv%sAR(R|RoRSRURJRAtNetFxSdkVersionRRRRzRcRRaRv( RBtnetfxverR%RItfxtregpathsR$Rtexecpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSDKExecutablePaths$ ,- cCsAd|j}tjj|jj|}|jj|dp@dS(s0 Microsoft Visual F# directory. s%0.1f\Setup\F#RR (R|RRRRzRXRv(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharpInstallDirs cCsb|jdkrd}nd}x7|D]/}|jj|jjd|}|r%Pq%q%W|padS(s8 Microsoft Universal CRT SDK directory. g,@t10t81s kitsroot%sR (RR((R|RzRvRd(RBtversR$R((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkDirs   cCs|jtjj|jdS(s@ Microsoft Universal C Runtime SDK last version R(RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkLastVersionscCs|jdkrdSdSdS(s8 Microsoft .NET Framework SDK versions. g,@s4.6.1s4.6N(s4.6.1s4.6((R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRscCsXxK|jD]@}tjj|jj|}|jj|d}|r Pq q W|pWdS(s9 Microsoft .NET Framework SDK directory. tkitsinstallationfolderR (RRRRRzRcRv(RBR$RR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt NetFxSdkDirs cCs7tjj|jd}|jj|jjdp6|S(s; Microsoft .NET Framework 32bit directory. sMicrosoft.NET\Frameworktframeworkdir32(RRRRxRzRvR\(RBtguess_fw((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir32scCs7tjj|jd}|jj|jjdp6|S(s; Microsoft .NET Framework 64bit directory. sMicrosoft.NET\Framework64tframeworkdir64(RRRRxRzRvR\(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir64scCs |jdS(s: Microsoft .NET Framework 32bit versions. i (t_find_dot_net_versions(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion32scCs |jdS(s: Microsoft .NET Framework 64bit versions. i@(R(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion64scCs|jj|jjd|}t|d|}|pM|j|dpMd}|jdkrn|df}nR|jdkr|jd d krd n|d f}n|jd krd}n|jdkrd}n|S(s Find Microsoft .NET Framework versions. Parameters ---------- bits: int Platform number of bits: 32 or 64. sframeworkver%dsFrameworkDir%dtvR g(@sv4.0g$@itv4s v4.0.30319sv3.5g"@s v2.0.50727g @sv3.0(sv3.5s v2.0.50727(sv3.0s v2.0.50727(RzRvR\tgetattrRR|R6(RBtbitstreg_vert dot_net_dirR$t frameworkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs    cs;fdttjD}t|dp:dS(s Return name of the last dir in path or '' if no dir found. Parameters ---------- path: str Use dirs in this path prefix: str Use only dirs startings by this prefix c3sE|];}tjjtjj|r|jr|VqdS(N(RRRRt startswith(t.0tdir_name(Rtprefix(s3/usr/lib/python2.7/site-packages/setuptools/msvc.pys )s!R N(treversedRRtnextR(RBRRt matching_dirs((RRs3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs N( RRRORPRQRxRyRRRCR{R~RRRRRRRRRRRRRRRRRRRRR(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRws4       &      R!cBseZdZdddZedZedZedZedZ edZ edZ ed Z ed Z ed Zed Zd ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZdZ ddZ!RS(sY Return environment variables for specified Microsoft Visual C++ version and platform : Lib, Include, Path and libpath. This function is compatible with Microsoft Visual C++ 9.0 to 14.0. Script created by analysing Microsoft environment configuration files like "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... Parameters ---------- arch: str Target architecture. vc_ver: float Required Microsoft Visual C++ version. If not set, autodetect the last version. vc_min_ver: float Minimum Microsoft Visual C++ version. icCsdt||_t|j|_t|j||_|j|kr`d}tjj |ndS(Ns.No suitable Microsoft Visual C++ version found( R=RURTRzRwtsiR|RRR(RBR%R|R*R((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCIs cCs |jjS(s/ Microsoft Visual C++ version. (RR|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR|RscCsddg}|jdkrd|jjdtdt}|dg7}|dg7}|d|g7}ng|D]!}tjj|jj|^qkS( s/ Microsoft Visual Studio Tools s Common7\IDEs Common7\Toolsg,@RIR?s1Common7\IDE\CommonExtensions\Microsoft\TestWindowsTeam Tools\Performance ToolssTeam Tools\Performance Tools%s( R|RURJRoRRRRR(RBtpathst arch_subdirR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVSToolsYs   cCs4tjj|jjdtjj|jjdgS(sL Microsoft Visual C++ & Microsoft Foundation Class Includes tIncludesATLMFC\Include(RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCIncludeshscCs|jdkr'|jjdt}n|jjdt}d|d|g}|jdkrs|d|g7}ng|D]!}tjj|jj|^qzS(sM Microsoft Visual C++ & Microsoft Foundation Class Libraries g.@R?RIsLib%ss ATLMFC\Lib%sg,@s Lib\store%s( R|RURKRoRRRRR(RBRRR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCLibrariespscCs/|jdkrgStjj|jjdgS(sA Microsoft Visual C++ store references Libraries g,@sLib\store\references(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt VCStoreRefsscCs|j}tjj|jdg}|jdkr9tnt}|jj |}|r}|tjj|jd|g7}n|jdkrd|jj dt}|tjj|j|g7}n|jdkrs|jj rdnd}|tjj|j||jj d tg7}|jj |jjkr|tjj|j||jj d tg7}qn|tjj|jd g7}|S( s, Microsoft Visual C++ Tools t VCPackagesg$@sBin%sg,@RIg.@s bin\HostX86%ss bin\HostX64%sR?tBin(RRRRRR|RoRSRURNRJRHRKRGRE(RBRttoolsRLRRthost_dir((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCToolss& &" & ,cCs|jdkrJ|jjdtdt}tjj|jjd|gS|jjdt}tjj|jjd}|j }tjj|d||fgSdS(s1 Microsoft Windows SDK Libraries g$@RIR?sLib%sRs%sum%sN( R|RURKRoRRRRRt _sdk_subdir(RBRRtlibver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt OSLibrariess  cCstjj|jjd}|jdkrC|tjj|dgS|jdkr^|j}nd}tjj|d|tjj|d|tjj|d|gSd S( s/ Microsoft Windows SDK Include tincludeg$@tglg,@R s%sshareds%sums%swinrtN(RRRRRR|R(RBRtsdkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt OSIncludess cCstjj|jjd}g}|jdkr@||j7}n|jdkrn|tjj|dg7}n|jdkr||tjj|jjdtjj|ddtjj|d dtjj|d dtjj|jjd d d |jdddg7}n|S(s7 Microsoft Windows SDK Libraries Paths t Referencesg"@g&@sCommonConfiguration\Neutralg,@t UnionMetadatas'Windows.Foundation.UniversalApiContracts1.0.0.0s%Windows.Foundation.FoundationContracts,Windows.Networking.Connectivity.WwanContractt ExtensionSDKssMicrosoft.VCLibss%0.1ftCommonConfigurationtneutral(RRRRRR|R(RBtreftlibpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt OSLibpaths>      cCst|jS(s- Microsoft Windows SDK Tools (tlistt _sdk_tools(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkToolssccs|jdkrG|jdkr$dnd}tjj|jj|Vn|jjs|jjdt }d|}tjj|jj|Vn|jdks|jdkr |jj rd}n|jjd t dt }d |}tjj|jj|Vnl|jdkrvtjj|jjd}|jjdt }|jj }tjj|d ||fVn|jj r|jj Vnd S( s= Microsoft Windows SDK Tools paths generator g.@g&@RsBin\x86R?sBin%sg$@R RIsBin\NETFX 4.0 Tools%ss%s%sN( R|RRRRRRURHRJRoRFRR(RBtbin_dirRRR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs(    ! cCs|jj}|rd|SdS(s6 Microsoft Windows SDK version subdir s%s\R (RR(RBtucrtver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs cCs/|jdkrgStjj|jjdgS(s- Microsoft Windows SDK Setup g"@tSetup(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkSetup%scCs|j}|j}|jdkrDt}|j o>|j }n6|jpY|j}|jdkpw|jdk}g}|r|g|jD]}t j j |j |^q7}n|r|g|j D]}t j j |j|^q7}n|S(s0 Microsoft .NET Framework Tools g$@R@(RURR|RoRFRHRGRERRRRRRR(RBRURt include32t include64RR$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFxTools/s  //cCsU|jdks|jj r gS|jjdt}tjj|jjd|gS(s8 Microsoft .Net Framework SDK Libraries g,@R?slib\um%s( R|RRRURKRoRRR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKLibrariesGscCs<|jdks|jj r gStjj|jjdgS(s7 Microsoft .Net Framework SDK Includes g,@s include\um(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKIncludesRscCstjj|jjdgS(s> Microsoft Visual Studio Team System Database s VSTSDB\Deploy(RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVsTDb\scCs|jdkrgS|jdkrF|jj}|jjdt}n|jj}d}d|j|f}tjj ||g}|jdkr|tjj ||dg7}n|S(s( Microsoft Build Engine g(@g.@RIR sMSBuild\%0.1f\bin%stRoslyn( R|RRRURJRoRRRR(RBt base_pathRRtbuild((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytMSBuildcs  "cCs/|jdkrgStjj|jjdgS(s. Microsoft HTML Help Workshop g&@sHTML Help Workshop(R|RRRRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytHTMLHelpWorkshopzscCsl|jdkrgS|jjdt}tjj|jjd}|j }tjj|d||fgS(s= Microsoft Universal C Runtime SDK Libraries g,@R?Rs%sucrt%s( R|RURKRoRRRRRt _ucrt_subdir(RBRRR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt UCRTLibrariess  cCsK|jdkrgStjj|jjd}tjj|d|jgS(s; Microsoft Universal C Runtime SDK Include g,@Rs%sucrt(R|RRRRRR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt UCRTIncludesscCs|jj}|rd|SdS(sB Microsoft Universal C Runtime SDK version subdir s%s\R (RR(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs cCs,|jdkr"|jdkr"gS|jjS(s% Microsoft Visual F# g&@g(@(R|RR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharpscCs|jjdt}|jdkr9|jj}d}n|jjjdd}d}|jdkrldn|j}|||j|f}tjj ||S(sA Microsoft Visual C++ runtime redistribuable dll R?is-redist%s\Microsoft.VC%d0.CRT\vcruntime%d0.dlls\Toolss\Redists.onecore%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllg,@( RURKRoR|RRRARRR(RBRt redist_patht vcruntimetdll_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCRuntimeRedists  cCstd|jd|j|j|j|jg|d|jd|j|j|j|j |j g|d|jd|j|j|j |j g|d|jd|j |j|j|j|j|j|j|j|jg |}|jdkrtjj|jr|j|d A B C D _unique_everseen('ABBCcAD', str.lower) --> A B C D N(tsettaddRRt __contains__(RBtiterableRtseentseen_addtelementtk((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs         N("RRRORRCRRR|RRRRRRRRRRRRRRRRRRRRRRRRoR"RR(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR!1s:   -         - (!RORR-tplatformR tdistutils.errorsRt#setuptools.extern.packaging.versionRtsetuptools.extern.six.movesRtmonkeyRtsystemRtenvironRPRt ImportErrorRRt_msvc9_suppress_errorstdistutils.msvc9compilerR RRR+R3R#R=RTRwR!(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyts:         + / & %[aPK!namespaces.pyonu[ fc@sqddlZddlmZddlZddlmZejjZdddYZ de fdYZ dS( iN(tlog(tmapt Installerc Bs_eZdZdZdZdZdZdZdZdZ dZ e dZ RS(s -nspkg.pthcCs|j}|sdStjj|j\}}||j7}|jj|tj d|t |j |}|j rt |dSt|d}|j|WdQXdS(Ns Installing %stwt(t_get_all_ns_packagestostpathtsplitextt _get_targett nspkg_exttoutputstappendRtinfoRt_gen_nspkg_linetdry_runtlisttopent writelines(tselftnsptfilenametexttlinestf((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytinstall_namespacess    cCsbtjj|j\}}||j7}tjj|sAdStjd|tj|dS(Ns Removing %s( RRRRR texistsRR tremove(RRR((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytuninstall_namespaces!s  cCs|jS(N(ttarget(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR)ssimport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')sm = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)s4m and setattr(sys.modules[%(parent)r], %(child)r, m)cCsdS(Ns$sys._getframe(1).f_locals['sitedir']((R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyt _get_rootCscCs|t|}t|jd}|j}|j}|jd\}}}|rd||j7}ndj|tdS(Nt.t;s ( tstrttupletsplitRt _nspkg_tmplt rpartitiont_nspkg_tmpl_multitjointlocals(Rtpkgtpthtroott tmpl_linestparenttseptchild((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR Fs   cCs.|jjpg}ttt|j|S(s,Return sorted list of all package namespaces(t distributiontnamespace_packagestsortedtflattenRt _pkg_names(Rtpkgs((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRQsccs8|jd}x"|r3dj|V|jqWdS(s Given a namespace package, yield the components of that package. >>> names = Installer._pkg_names('a.b.c') >>> set(names) == set(['a', 'a.b', 'a.b.c']) True RN(R"R&tpop(R(tparts((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR3Vs  ( simport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')sm = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)(s4m and setattr(sys.modules[%(parent)r], %(child)r, m)( t__name__t __module__R RRRR#R%RR Rt staticmethodR3(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR s$     tDevelopInstallercBseZdZdZRS(cCstt|jS(N(treprR tegg_path(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRgscCs|jS(N(tegg_link(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRjs(R7R8RR(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR:fs (( Rt distutilsRt itertoolstsetuptools.extern.six.movesRtchaint from_iterableR2RR:(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyts   [PK!I ??package_index.pyonu[ fc@s~dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZm Z ddlm!Z!ddl"m#Z#dd l$m%Z%dd l&m'Z'dd l(m)Z)dd l*m+Z+dd l,m-Z-ej.dZ/ej.dej0Z1ej.dZ2ej.dej0j3Z4dj5Z6ddddgZ7dZ8dZ9e9j:dej;d deZ<dZ=dZ>dZ?e@dZAe@d ZBe@d!ZCe@ee@d"ZDe@d#ZEd$ZFej.d%ej0ZGeFd&ZHd'eIfd(YZJd)eJfd*YZKdefd+YZLej.d,jMZNd-ZOd.ZPdd/ZQd0ZRd1eIfd2YZSd3ejTfd4YZUejVjWd5ZXeQe8eXZXd6ZYd7ZZdS(8s#PyPI and direct package downloadingiN(twraps(tsix(turllibt http_clientt configparsertmap( t CHECKOUT_DISTt Distributiont BINARY_DISTtnormalize_patht SOURCE_DISTt Environmenttfind_distributionst safe_namet safe_versiont to_filenamet Requirementt DEVELOP_DISTtEGG_DIST(t ssl_support(tlog(tDistutilsError(t translate(tget_all_headers(tunescape(tWheels^egg=([-A-Za-z0-9_.+!]+)$shref\s*=\s*['"]?([^'"> ]+)s([^<]+) \s+\(md5\)s([-+.a-z0-9]{2,}):s.tar.gz .tar.bz2 .tar .zip .tgzt PackageIndextdistros_for_urltparse_bdist_wininsttinterpret_distro_nameis<setuptools/{setuptools.__version__} Python-urllib/{py_major}tpy_majorit setuptoolscCs<ytj|SWn$tk r7td|fnXdS(Ns1Not a URL, existing file, or requirement spec: %r(Rtparset ValueErrorR(tspec((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytparse_requirement_arg2s  cCs|j}d\}}}|jdr|jdrL|d }d}q|jddr~|dd!}|d }d}q|jd r|d }d }q|jd d r|dd!}|d }d }qn|||fS(s=Return (base,pyversion) or (None,None) for possible .exe names.exes .win32.exeitwin32s .win32-pyiiis.win-amd64.exeis win-amd64s .win-amd64-pyiN(NNN(tlowertNonetendswitht startswith(tnameR%tbasetpy_vertplat((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR;s$           c Cstjj|}|\}}}}}}tjj|jdd}|dkr|dkrtjj|jdd}nd|kr|jdd\}}n||fS(Nt/issourceforge.nettdownloadit#i(RR turlparsetunquotetsplit( turltpartstschemetservertpatht parameterstquerytfragmentR*((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytegg_info_for_urlSs" ccst|\}}xt|||D] }|Vq%W|rtj|}|rx1t||jd|dtD] }|VqqWqndS(sEYield egg or source distribution objects that might be found at a URLit precedenceN(R;tdistros_for_locationt EGG_FRAGMENTtmatchRtgroupR(R3tmetadataR*R:tdistR?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR^s "c CsA|jdr|d }n|jdrMd|krMtj|||gS|jdrd|krt|}|jsgStd|d|jd|jd td gS|jd rt|\}}}|d k rt ||||t |Snx>t D]6}|j|r|t | }t |||SqWgS( s:Yield egg or source distribution objects based on basenames.egg.zipis.eggt-s.whltlocationt project_nametversionR<is.exeN(R'Rt from_locationRt is_compatibleRERFRRR&RRt EXTENSIONStlen(RDtbasenameRAtwheeltwin_baseR+tplatformtext((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR=ls.       cCs"tt|tjj||S(sEYield possible egg or source distribution objects based on a filename(R=R tosR7RK(tfilenameRA((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytdistros_for_filenamesc cs|jd}| r4td|dDr4dSxatdt|dD]F}t||dj|| dj||d|d|d|VqNWdS( sGenerate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! RCcss!|]}tjd|VqdS(s py\d\.\d$N(treR?(t.0tp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pys siNit py_versionR<RN(R2tanytrangeRJRtjoin(RDRKRARVR<RNR4RU((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs! ) ccst}|j}|dkrSxmtjj|j|D]}|||Vq7Wn;x8|D]0}||}||krZ|||VqZqZWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(tsettaddR&Rtmovest filterfalset __contains__(titerabletkeytseentseen_addtelementtk((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytunique_everseens         cstfd}|S(ss Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cst||S(N(Re(targstkwargs(tfunc(s</usr/lib/python2.7/site-packages/setuptools/package_index.pytwrappers(R(RhRi((Rhs</usr/lib/python2.7/site-packages/setuptools/package_index.pyt unique_valuesss3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>ccsxtj|D]}|j\}}tttj|jjd}d|ksgd|krx=t j|D])}t j j |t |jdVqwWqqWxjd D]b}|j|}|dkrt j||}|rt j j |t |jdVqqqWdS( sEFind rel="homepage" and rel="download" links in `page`, yielding URLst,thomepageR.is Home PagesDownload URLiN(s Home PagesDownload URL(tRELtfinditertgroupsRZRtstrtstripR%R2tHREFRR turljoint htmldecodeR@tfindtsearch(R3tpageR?ttagtreltrelstpos((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfind_external_linkss'.  tContentCheckercBs)eZdZdZdZdZRS(sP A null content checker that defines the interface for checking content cCsdS(s3 Feed a block of data to the hash. N((tselftblock((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfeedscCstS(sC Check the hash. Return False if validation fails. (tTrue(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytis_validscCsdS(su Call reporter with information about the checker (hash name) substituted into the template. N((R~treporterttemplate((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytreports(t__name__t __module__t__doc__RRR(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR}s  t HashCheckercBsJeZejdZdZedZdZdZ dZ RS(sK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs(||_tj||_||_dS(N(t hash_namethashlibtnewthashtexpected(R~RR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__init__ s cCsRtjj|d}|s#tS|jj|}|sBtS||jS(s5Construct a (possibly null) ContentChecker from a URLi(RR R0R}tpatternRvt groupdict(tclsR3R:R?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfrom_urlscCs|jj|dS(N(Rtupdate(R~R((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRscCs|jj|jkS(N(Rt hexdigestR(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR scCs||j}||S(N(R(R~RRtmsg((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR#s ( RRRStcompileRRt classmethodRRRR(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs    cBsveZdZdd%d&edZedZedZedZ dZ dZ d Z d Z d&d Zd Zd&d ZdZdZdZdZdZeeed&dZeedZdZdZdZdZd&dZdZdZdZdZ dZ!e"edZ#d Z$d!Z%d"Z&d#Z'd$Z(RS('s;A distribution index that scans web pages for download URLsshttps://pypi.python.org/simplet*cOstj||||d|jd |_i|_i|_i|_tjdj t t |j |_ g|_|otjo|ptj}|rtj||_ntjj|_dS(NR-t|(R RR't index_urlt scanned_urlst fetched_urlst package_pagesRSRRYRRR?tallowstto_scanRt is_availabletfind_ca_bundlet opener_fortopenerRtrequestturlopen(R~Rthostst ca_bundlet verify_sslRftkwtuse_ssl((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR+s   '  c Csg||jkr| rdSt|j|s(tfilterRPR7RRt itertoolststarmapt scan_egg_link(R~t search_pathtdirst egg_links((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytscan_egg_linkss c Csttjj||(}ttdttj |}WdQXt |dkr[dS|\}}xQt tjj||D]4}tjj|||_ t |_|j|qWdS(Ni(topenRPR7RYRRR&RRpRqRJR RDR R<R[(R~R7Rt raw_linestlinestegg_patht setup_pathRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs' " c sfd}xWtj|D]F}y,|tjj|t|jdWqtk rdqXqW||\}}|rxyt||D]h}t |\}} |j dr| r|r|d||f7}qj |nj |qWt jd|SdSdS(s#Process the contents of a PyPI pagecs|jjrtttjj|tjjd}t|dkrd|dkrt |d}t |d}t j j |ji|%siii(R@(tm((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytRRN(RrRnRR RsRtR@R!R|R;R'tneed_version_infotscan_urltPYPI_MD5tsub( R~R3RwRR?RRtnew_urlR*tfrag((R~s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs$,  cCs|jd|dS(NsPPage at %s links to .py file(s) without version info; an index scan is required.(tscan_all(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRscGsO|j|jkr;|r+|j||n|jdn|j|jdS(Ns6Scanning index of all packages (this may take a while)(RRRRR(R~RRf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs  cCs|j|j|jd|jj|jsN|j|j|jdn|jj|jss|j|nx3t|jj|jdD]}|j|qWdS(NR-(( RRt unsafe_nameRRR`REtnot_found_in_indexR(R~t requirementR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt find_packagess%cCsk|j|j|x8||jD])}||kr;|S|jd||q%Wtt|j||S(Ns%s does not match %s(tprescanRR`RtsuperRtobtain(R~Rt installerRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs   cCsi|j|jd||jse|jtj|td|jjtj j |fndS(s- checker is a ContentChecker sValidating %%s checksum for %ss7%s validation failed for %s; possible download problem?N( RRRRRPtunlinkRRR)R7RK(R~tcheckerRQttfp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt check_hashs    cCsrxk|D]c}|jdksJt| sJ|jdsJtt|rZ|j|q|jj|qWdS(s;Add `urls` to the list that will be prescanned for searchessfile:N(RR&RR(RRRtappend(R~turlsR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytadd_find_links s  cCs2|jr%tt|j|jnd|_dS(s7Scan urls scheduled for prescanning (e.g. --find-links)N(RRRRR&(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs cCsN||jr |jd}}n|jd}}|||j|jdS(Ns#Couldn't retrieve index page for %rs3Couldn't find index page for %r (maybe misspelled?)(R`RRRR(R~RtmethR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR!s   cCst|tst|}|r||j|jd||}t|\}}|jdrx|j|||}n|Stj j |r|St |}nt |j ||ddS(sLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. is.pyRDN(RRRt _download_urlR@R;R't gen_setupRPR7RR#Rtfetch_distributionR&(R~R"ttmpdirR5tfoundR*R:((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR.+s c sFjd|id}dfd}|rfjj|||}n| r|dk r|||}n|dkrjdk rjn||}n|dkr| rj|||}n|dkrjdrdpd|n#jd||jd|jSdS( s|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. sSearching for %scs|dkr}nx||jD]}|jtkrn rn|kr#jd|d|R?RR@R&RFRJRPR7RKtdirnameRYtsetuptools.command.easy_installRtshutiltcopy2RtwriteREtsplitextR( R~RQR:RR?tdRRKtdstRR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs24 !!i c Cs|jd|d}zXtj|}|j|}t|tjjrnt d||j |j fn|j}d}|j }d}d|krt |d} ttt| }|j|||||nt|d}} x`trO|j|} | rK|j| | j| |d7}|j|||||qPqW|j||| WdQX|SWd|r|jnXdS( NsDownloading %ssCan't download %s: %s %siiscontent-lengthsContent-Lengthtwbi(RR&RRRRRRRRRRt dl_blocksizeRtmaxRtintt reporthookRRRRRRR( R~R3RQtfpRRtblocknumtbstsizetsizesRR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt _download_tos:       cCsdS(N((R~R3RQR!tblksizeR#((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRscCs|jdrt|Syt||jSWnsttjfk r}djg|jD]}t |^qX}|r|j ||qt d||fnt j jk r}|St j jk r }|r|j ||jqt d||jfntjk rU}|r9|j ||jqt d||jfnNtjtj fk r}|r|j ||qt d||fnXdS(Nsfile:t s%s %ssDownload error for %s: %ss;%s returned a bad status line. The server might be down, %s(R(t local_opentopen_with_authRR!Rt InvalidURLRYRfRpRRRRRtURLErrortreasont BadStatusLinetlinet HTTPExceptiontsocket(R~R3twarningtvtargR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs6 +cCsHt|\}}|rLx7d|krH|jddjdd}qWnd}|jdrn|d }ntjj||}|dks|jd r|j||S|d ks|jd r|j||S|jd r|j ||S|d kr$t j j t j j|dS|j|t|j||SdS(Ns..t.s\t_t__downloaded__s.egg.zipitsvnssvn+tgitsgit+shg+Ri(R;treplaceR'RPR7RYR(t _download_svnt _download_gitt _download_hgRRt url2pathnameR R0RRt_attempt_download(R~R5R3RR)R:RQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs$%   cCs|j|tdS(N(RR(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR8scCsK|j||}d|jddjkrC|j|||S|SdS(NRs content-typeR(R%RR%t_download_html(R~R3RQR((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR>;scCst|}xW|D]O}|jrtjd|r^|jtj||j||SPqqW|jtj|td|dS(Ns ([^- ]+ - )?Revision \d+:s���Unexpected HTML page found at ( ���R���Rq���RS���Rv���R���RP���R���R:��R���(���R~���R3���R���RQ���R���R.��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR?��B��s����       c���������C���sl��|�j��d�d��d�}�d�}�|�j���j�d��r;d�|�k�r;t�j�j�|��\�}�}�}�}�}�} �|� r;|�j�d��r;d�|�d �k�r;|�d �j��d�d��\�}�}�t�j�j�|��\�} �} �| �r8d �| �k�r�| �j��d �d��\�} �} �d �| �| �f�}�n �d �| �}�| �}�|�|�|�|�|�| �f�}�t�j�j�|��}�q8q;n��|��j�d �|�|��t �j �d�|�|�|�f��|�S(���NR/���i���i����R���s���svn:t���@s���//R-���i���t���:s��� --username=%s --password=%ss ��� --username=s'���Doing subversion checkout from %s to %ss���svn checkout%s -q %s %s( ���R2���R%���R(���R���R ���R0���t ���splitusert ���urlunparseR���RP���t���system(���R~���R3���RQ���t���credsR5���t���netlocR7���RU���t���qR���t���autht���hostt���usert���pwR4���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR:��Q��s$����!$&  c���������C���s���t��j�j�|���\�}�}�}�}�}�|�j�d�d��d�}�|�j�d�d��d�}�d��}�d�|�k�rz�|�j�d�d��\�}�}�n��t��j�j�|�|�|�|�d�f��}��|��|�f�S(���Nt���+i���iR/���i����R@��R���(���R���R ���t���urlsplitR2���R&���t���rsplitt ���urlunsplit(���R3���t ���pop_prefixR5���RF��R7���R9���R���t���rev(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���_vcs_split_rev_from_urlf��s����! !c���������C���s���|�j��d�d��d�}�|��j�|�d�t�\�}�}�|��j�d�|�|��t�j�d�|�|�f��|�d��k �r�|��j�d�|��t�j�d�|�|�f��n��|�S( ���NR/���i���i����RP��s���Doing git clone from %s to %ss���git clone --quiet %s %ss���Checking out %ss"���(cd %s && git checkout --quiet %s)(���R2���RR��R���R���RP���RD��R&���(���R~���R3���RQ���RQ��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR;��x��s����  c���������C���s���|�j��d�d��d�}�|��j�|�d�t�\�}�}�|��j�d�|�|��t�j�d�|�|�f��|�d��k �r�|��j�d�|��t�j�d�|�|�f��n��|�S( ���NR/���i���i����RP��s���Doing hg clone from %s to %ss���hg clone --quiet %s %ss���Updating to %ss���(cd %s && hg up -C -r %s -q)(���R2���RR��R���R���RP���RD��R&���(���R~���R3���RQ���RQ��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR<����s����  c���������G���s���t��j�|�|��d��S(���N(���R���R���(���R~���R���Rf���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s����c���������G���s���t��j�|�|��d��S(���N(���R���R���(���R~���R���Rf���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s����c���������G���s���t��j�|�|��d��S(���N(���R���R���(���R~���R���Rf���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s����(���R���N()���R���R���R���R&���R���R���t���FalseR���R���R���R���R���R���R���R���R���R���R���R���R���R���R.���R��R��R��R��R%��R��R���R���R���R>��R?��R:��t ���staticmethodRR��R;��R<��R���R���R���(����(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR���(��sL��� 3   +      #J ) $  #         s!���&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c���������C���s���|��j��d��}�t�|��S(���Ni���(���R@���R���(���R?���t���what(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt ���decode_entity��s����c���������C���s ���t��t�|���S(���s'���Decode HTML entities in the given text.(���t ���entity_subRV��(���t���text(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRt�����s����c������������s�����f�d���}�|�S(���Nc������������s������f�d���}�|�S(���Nc�������������s?���t��j���}�t��j���z���|��|���SWd��t��j�|��Xd��S(���N(���R0��t���getdefaulttimeoutt���setdefaulttimeout(���Rf���Rg���t ���old_timeout(���Rh���t���timeout(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���_socket_timeout��s ����  (����(���Rh���R]��(���R\��(���Rh���s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR]����s����(����(���R\��R]��(����(���R\��s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���socket_timeout��s���� c���������C���sI���t��j�j�|���}�|�j���}�t�j�|��}�|�j���}�|�j�d�d��S(���sq�� A function compatible with Python 2.3-3.3 that will encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False s��� R���(���R���R ���R1���t���encodet���base64t ���encodestringR���R9��(���RH��t���auth_st ���auth_bytest ���encoded_bytest���encoded(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt ���_encode_auth��s ����   t ���Credentialc�����������B���s)���e��Z�d��Z�d���Z�d���Z�d���Z�RS(���s:��� A username/password pair. Use like a namedtuple. c���������C���s���|�|��_��|�|��_�d��S(���N(���t���usernamet���password(���R~���Rh��Ri��(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s���� c���������c���s���|��j��V|��j�Vd��S(���N(���Rh��Ri��(���R~���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���__iter__��s����c���������C���s���d�t��|���S(���Ns���%(username)s:%(password)s(���t���vars(���R~���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���__str__��s����(���R���R���R���R���Rj��Rl��(����(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRg����s���  t ���PyPIConfigc�����������B���s2���e��Z�d����Z�e�d����Z�d���Z�d���Z�RS(���c���������C���su���t��j�d�d�d�g�d��}�t�j�j�|��|��t�j�j�t�j�j�d��d��}�t�j�j �|��rq�|��j �|��n��d�S(���s%��� Load from ~/.pypirc Rh��Ri��t ���repositoryR���t���~s���.pypircN( ���t���dictt���fromkeysR���t���RawConfigParserR���RP���R7���RY���t ���expanduserR���R���(���R~���t���defaultst���rc(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR�����s ����!c���������C���sM���g��|��j����D]$�}�|��j�|�d��j���r �|�^�q �}�t�t�|��j�|���S(���NRn��(���t���sectionsR���Rq���Rp��R���t���_get_repo_cred(���R~���t���sectiont���sections_with_repositories(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���creds_by_repository��s����$c���������C���sO���|��j��|�d��j���}�|�t�|��j��|�d��j���|��j��|�d��j����f�S(���NRn��Rh��Ri��(���R���Rq���Rg��(���R~���Rx��t���repo(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRw����s����c���������C���s7���x0�|��j��j���D]�\�}�}�|�j�|��r�|�Sq�Wd�S(���s��� If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N(���Rz��t���itemsR(���(���R~���R3���Rn��t���cred(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt���find_credential��s����(���R���R���R���t���propertyRz��Rw��R~��(����(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyRm����s���  c���������C���s��t��j�j�|���\�}�}�}�}�}�}�|�j�d��rE�t�j�d���n��|�d �k�rl�t��j�j�|��\�}�} �n�d �}�|�s�t���j �|���} �| �r�t �| ��}�| �j �|��f�} �t �j �d�| ��q�n��|�r&d�t�|��}�|�| �|�|�|�|�f�} �t��j�j�| ��} �t��j�j�| ��}�|�j�d�|��n�t��j�j�|���}�|�j�d�t��|�|��}�|�rt��j�j�|�j��\�}�}�}�}�}�}�|�|�k�r|�| �k�r|�|�|�|�|�|�f�} �t��j�j�| ��|�_�qn��|�S( ���s4���Open a urllib2 request, handling HTTP authenticationRA��s���nonnumeric port: ''t���httpt���httpss*���Authenticating as %s for %s (from .pypirc)s���Basic t ���Authorizations ���User-Agent(���R��R��N(���R���R ���R0���R'���R���R*��RB��R&���Rm��R~��Rp���Rh��R���R���Rf��RC��R���t���Requestt ���add_headert ���user_agentR3���(���R3���R���R5���RF��R7���t���paramsR9���R���RH��RI��R}��R���R4���R���R���R ��t���s2t���h2t���path2t���param2t���query2t���frag2(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyR)����s6����$   'c���������C���s���|��S(���N(����(���R3���(����(����s<���/usr/lib/python2.7/site-packages/setuptools/package_index.pyt ���fix_sf_url?��s����c���������C���s��t��j�j�|���\�}�}�}�}�}�}�t��j�j�|��}�t�j�j�|��rX�t��j�j�|���S|�j �d��rPt�j�j �|��rPg��}�x�t�j �|��D]�} �t�j�j �|�| ��} �| �d�k�r�t �| �d���} �| �j���} �Wd�QXPn�t�j�j �| ��r�| �d�7} �n��|�j�d�j�d�| ���q�Wd�} �| �j�d�|��d �d �j �|���} �d�\�}�}�n�d�\�}�}�} �i�d�d�6}�t�j�| ��}�t��j�j�|��|�|�|�|��S(���s7���Read a local path, with special support for directoriesR-���s ���index.htmlt���rNs���<a href="{name}">{name}</a>R)���sB���<html><head><title>{url}{files}R3tfiless itOKisPath not founds Not founds text/htmls content-type(iR(isPath not founds Not found(RR R0RR=RPR7tisfileRR'RRRYRRRtformatRtStringIORR(R3R5R6R7tparamR9RRQRRtfilepathR tbodyRtstatustmessageRt body_stream((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR(Cs,$!  ! ([RtsysRPRSRR0R`RRt functoolsRtsetuptools.externRtsetuptools.extern.six.movesRRRRRt pkg_resourcesRRRR R R R R RRRRRRt distutilsRtdistutils.errorsRtfnmatchRtsetuptools.py27compatRtsetuptools.py33compatRtsetuptools.wheelRRR>tIRrRR?RR2RIt__all__t_SOCKET_TIMEOUTt_tmplRRFRR#RR;R&RR=RRRReRjRmR|tobjectR}RRRRWRVRtR^RfRgRrRmRRR)RR((((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytsv        " X       !  "  !~    &. PK!Üv$v$pep425tags.pycnu[ fc@@sdZddlmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ejdZdZd Zd Zd Zd Zeed ZdZdZdZdZdZdeddddZeZdS(s2Generate and work with PEP 425 Compatibility Tags.i(tabsolute_importN(t OrderedDicti(tglibcs(.+)_(\d+)_(\d+)_(.+)cC@sEytj|SWn-tk r@}tjdj|tdSXdS(Ns{}(t sysconfigtget_config_vartIOErrortwarningstwarntformattRuntimeWarningtNone(tvarte((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRs cC@sUttdrd}n9tjjdr3d}ntjdkrKd}nd}|S(s'Return abbreviated implementation name.tpypy_version_infotpptjavatjytclitiptcp(thasattrtsystplatformt startswith(tpyimpl((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_abbr_impls   cC@sDtd}| s"tdkr@djttt}n|S(sReturn implementation version.tpy_version_nodotRt(RRtjointmaptstrtget_impl_version_info(timpl_ver((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_impl_ver(s cC@sKtdkr/tjdtjjtjjfStjdtjdfSdS(sQReturn sys.version_info-like tuple for use in decrementing the minor version.RiiN(RRt version_infoR tmajortminor(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR0s cC@sdjttS(s; Returns the Tag for this specific implementation. s{}{}(RRR!(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_impl_tag;scC@sNt|}|dkrD|r=tjdj|tdn|S||kS(sgUse a fallback method for determining SOABI flags if the needed config var is unset or unavailable.s?Config variable '{0}' is unset, Python ABI tag may be incorrectiN(RR RRRR (R tfallbacktexpectedRtval((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_flagBs   c @smtd}t| r ddhkr ttdr d}d}d}tddddkrvd }ntd fd ddkrd }ntd dddddkotjdkrtjdkrd}ndt|||f}n\|r<|jdr<d|jdd}n-|rc|j ddj dd}nd}|S(sXReturn the ABI tag based on SOABI (if available) or emulate SOABI (CPython 2, PyPy).tSOABIRRt maxunicodeRtPy_DEBUGcS@s ttdS(Ntgettotalrefcount(RR(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytXRRtdt WITH_PYMALLOCc@s dkS(NR(((timpl(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.\RtmtPy_UNICODE_SIZEcS@s tjdkS(Ni(RR+(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.`RR'iitus %s%s%s%s%sscpython-t-it.t_(ii(iiN( RRRRR)R"R!RtsplittreplaceR (tsoabiR/R2R4tabi((R1s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_abi_tagNs8  (      !cC@s tjdkS(Ni(Rtmaxsize(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt_is_running_32bitpscC@stjdkrtj\}}}|jd}|dkrQtrQd}n|dkrotrod}ndj|d|d |Stjjj dd j d d }|d krtrd }n|S(s0Return our platform name 'win32', 'linux_x86_64'tdarwinR6tx86_64ti386tppc64tppcsmacosx_{}_{}_{}iiR7R5t linux_x86_64t linux_i686( RRtmac_verR8R>Rt distutilstutilt get_platformR9(treleaseR7tmachinet split_vertresult((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRIts  ' cC@s`tddhkrtSyddl}t|jSWnttfk rOnXtjddS(NRDREiii( RItFalset _manylinuxtbooltmanylinux1_compatiblet ImportErrortAttributeErrorRthave_compatible_glibc(RO((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytis_manylinux1_compatibles c@sg}fdtdd fdd fdd fd dfg|||rj|j|nx@D]8}||krq|||rq|j|qqqqW|jd |S(sReturn a list of supported arches (including group arches) for the given major, minor and machine architecture of an macOS machine. c@s|dkr||fdkS|dkr8||fd kS|dkrT||fd kS|dkrp||fd kS|krx+|D]}|||rtSqWntS( NRCi iRBRAiR@(i i(i i(i i(i i(tTrueRN(R#R$tarchtgarch(t_supports_archtgroups(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRYs      tfatRARCtintelR@tfat64RBtfat32t universal(RARC(R@RA(R@RB(R@RARC(Rtappend(R#R$RKtarchesRX((RYRZs9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_darwin_archess$    " cC@sg}|dkrug}t}|d }xGt|dddD],}|jdjtt||fqBWn|pt}g} |pt}|r|g| dd+nt } ddl } xK| j D]=} | dj dr| j | djdddqqW| jtt| | jd |s6|pMt} | j d rtj| }|r|j\}}}}d j||}g}xjttt|dD]@}x7tt|||D]}|j|||fqWqWqM| g}n9|dkrDtrD| jd d | g}n | g}xC| D];}x2|D]*} |jd||df|| fqaWqTWxj|dD]^}|ddhkrPnx?| D]7}x.|D]&} |jd||f|| fqWqWqWx3|D](} |jd|ddd | fqWn|jd||dfd df|jd||ddfd dfxdt|D]V\}}|jd|fd df|dkr|jd|dd dfqqW|S(scReturn a list of supported tags for each version specified in `versions`. :param versions: a list of string versions, of the form ["33", "32"], or None. The first version will be assumed to support our ABI. :param platform: specify the exact platform you want valid tags for, or None. If None, use the local system platform. :param impl: specify the exact implementation you want valid tags for, or None. If None, use the local interpreter impl. :param abi: specify the exact abi you want valid tags for, or None. If None, use the local interpreter abi. iRiNs.abiR6iitnonetmacosxs {}_{}_%i_%stlinuxt manylinux1s%s%st31t30spy%stany(R RtrangeR`RRRRR<tsettimpt get_suffixesRtaddR8textendtsortedtlistRIt _osx_arch_pattmatchRZRtreversedtintRbRUR9t enumerate(tversionstnoarchRR1R;t supportedR"R#R$tabistabi3sRltsuffixRWRstnamet actual_archttplRaR2tatversionti((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_supportedsh   -  ( #"    ,  , )$( %( t__doc__t __future__Rtdistutils.utilRGRtreRRRt collectionsRRRtcompileRrRRR!RR%RVR)R<R>RIRURbR RNRtimplementation_tag(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyts0          "    = _PK!Üv$v$pep425tags.pyonu[ fc@@sdZddlmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ejdZdZd Zd Zd Zd Zeed ZdZdZdZdZdZdeddddZeZdS(s2Generate and work with PEP 425 Compatibility Tags.i(tabsolute_importN(t OrderedDicti(tglibcs(.+)_(\d+)_(\d+)_(.+)cC@sEytj|SWn-tk r@}tjdj|tdSXdS(Ns{}(t sysconfigtget_config_vartIOErrortwarningstwarntformattRuntimeWarningtNone(tvarte((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRs cC@sUttdrd}n9tjjdr3d}ntjdkrKd}nd}|S(s'Return abbreviated implementation name.tpypy_version_infotpptjavatjytclitiptcp(thasattrtsystplatformt startswith(tpyimpl((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_abbr_impls   cC@sDtd}| s"tdkr@djttt}n|S(sReturn implementation version.tpy_version_nodotRt(RRtjointmaptstrtget_impl_version_info(timpl_ver((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_impl_ver(s cC@sKtdkr/tjdtjjtjjfStjdtjdfSdS(sQReturn sys.version_info-like tuple for use in decrementing the minor version.RiiN(RRt version_infoR tmajortminor(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR0s cC@sdjttS(s; Returns the Tag for this specific implementation. s{}{}(RRR!(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_impl_tag;scC@sNt|}|dkrD|r=tjdj|tdn|S||kS(sgUse a fallback method for determining SOABI flags if the needed config var is unset or unavailable.s?Config variable '{0}' is unset, Python ABI tag may be incorrectiN(RR RRRR (R tfallbacktexpectedRtval((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_flagBs   c @smtd}t| r ddhkr ttdr d}d}d}tddddkrvd }ntd fd ddkrd }ntd dddddkotjdkrtjdkrd}ndt|||f}n\|r<|jdr<d|jdd}n-|rc|j ddj dd}nd}|S(sXReturn the ABI tag based on SOABI (if available) or emulate SOABI (CPython 2, PyPy).tSOABIRRt maxunicodeRtPy_DEBUGcS@s ttdS(Ntgettotalrefcount(RR(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytXRRtdt WITH_PYMALLOCc@s dkS(NR(((timpl(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.\RtmtPy_UNICODE_SIZEcS@s tjdkS(Ni(RR+(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.`RR'iitus %s%s%s%s%sscpython-t-it.t_(ii(iiN( RRRRR)R"R!RtsplittreplaceR (tsoabiR/R2R4tabi((R1s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_abi_tagNs8  (      !cC@s tjdkS(Ni(Rtmaxsize(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt_is_running_32bitpscC@stjdkrtj\}}}|jd}|dkrQtrQd}n|dkrotrod}ndj|d|d |Stjjj dd j d d }|d krtrd }n|S(s0Return our platform name 'win32', 'linux_x86_64'tdarwinR6tx86_64ti386tppc64tppcsmacosx_{}_{}_{}iiR7R5t linux_x86_64t linux_i686( RRtmac_verR8R>Rt distutilstutilt get_platformR9(treleaseR7tmachinet split_vertresult((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRIts  ' cC@s`tddhkrtSyddl}t|jSWnttfk rOnXtjddS(NRDREiii( RItFalset _manylinuxtbooltmanylinux1_compatiblet ImportErrortAttributeErrorRthave_compatible_glibc(RO((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytis_manylinux1_compatibles c@sg}fdtdd fdd fdd fd dfg|||rj|j|nx@D]8}||krq|||rq|j|qqqqW|jd |S(sReturn a list of supported arches (including group arches) for the given major, minor and machine architecture of an macOS machine. c@s|dkr||fdkS|dkr8||fd kS|dkrT||fd kS|dkrp||fd kS|krx+|D]}|||rtSqWntS( NRCi iRBRAiR@(i i(i i(i i(i i(tTrueRN(R#R$tarchtgarch(t_supports_archtgroups(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRYs      tfatRARCtintelR@tfat64RBtfat32t universal(RARC(R@RA(R@RB(R@RARC(Rtappend(R#R$RKtarchesRX((RYRZs9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_darwin_archess$    " cC@sg}|dkrug}t}|d }xGt|dddD],}|jdjtt||fqBWn|pt}g} |pt}|r|g| dd+nt } ddl } xK| j D]=} | dj dr| j | djdddqqW| jtt| | jd |s6|pMt} | j d rtj| }|r|j\}}}}d j||}g}xjttt|dD]@}x7tt|||D]}|j|||fqWqWqM| g}n9|dkrDtrD| jd d | g}n | g}xC| D];}x2|D]*} |jd||df|| fqaWqTWxj|dD]^}|ddhkrPnx?| D]7}x.|D]&} |jd||f|| fqWqWqWx3|D](} |jd|ddd | fqWn|jd||dfd df|jd||ddfd dfxdt|D]V\}}|jd|fd df|dkr|jd|dd dfqqW|S(scReturn a list of supported tags for each version specified in `versions`. :param versions: a list of string versions, of the form ["33", "32"], or None. The first version will be assumed to support our ABI. :param platform: specify the exact platform you want valid tags for, or None. If None, use the local system platform. :param impl: specify the exact implementation you want valid tags for, or None. If None, use the local interpreter impl. :param abi: specify the exact abi you want valid tags for, or None. If None, use the local interpreter abi. iRiNs.abiR6iitnonetmacosxs {}_{}_%i_%stlinuxt manylinux1s%s%st31t30spy%stany(R RtrangeR`RRRRR<tsettimpt get_suffixesRtaddR8textendtsortedtlistRIt _osx_arch_pattmatchRZRtreversedtintRbRUR9t enumerate(tversionstnoarchRR1R;t supportedR"R#R$tabistabi3sRltsuffixRWRstnamet actual_archttplRaR2tatversionti((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt get_supportedsh   -  ( #"    ,  , )$( %( t__doc__t __future__Rtdistutils.utilRGRtreRRRt collectionsRRRtcompileRrRRR!RR%RVR)R<R>RIRURbR RNRtimplementation_tag(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyts0          "    = _PK!Mc[py27compat.pyonu[ fc@stdZddlZddlmZdZejr@dZnejdkoXejZergendZ dS(s2 Compatibility Support for Python 2.7 and earlier iN(tsixcCs |j|S(sH Given an HTTPMessage, return all headers matching a given key. (tget_all(tmessagetkey((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pytget_all_headers scCs |j|S(N(t getheaders(RR((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyRstLinuxcCs|S(N((tx((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pytt( t__doc__tplatformtsetuptools.externRRtPY2tsystemtlinux_py2_asciitstrt rmtree_safe(((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyts     PK!<k$jjpy31compat.pyonu[ fc@sddgZyddlmZmZWn0ek rXddlmZmZdZnXyddlmZWn?ek rddl Z ddlZde fd YZnXdS( tget_config_varstget_pathi(RR(Rtget_python_libcCs+|dkrtdnt|dkS(NtplatlibtpurelibsName must be purelib or platlib(RR(t ValueErrorR(tname((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyR s (tTemporaryDirectoryNRcBs)eZdZdZdZdZRS(s Very simple temporary directory context manager. Will try to delete afterward, but will also ignore OS and similar errors on deletion. cCsd|_tj|_dS(N(tNoneRttempfiletmkdtemp(tself((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__init__s cCs|jS(N(R(R ((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt __enter__!scCs8ytj|jtWntk r*nXd|_dS(N(tshutiltrmtreeRtTruetOSErrorR(R texctypetexcvaluetexctrace((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__exit__$s  (t__name__t __module__t__doc__R R R(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyRs  ( t__all__t sysconfigRRt ImportErrortdistutils.sysconfigRR RRtobject(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyts      PK!\'py33compat.pyonu[ fc@sddlZddlZddlZyddlZWnek rMdZnXddlmZddlm Z ej ddZ de fdYZ eede Zeed e jjZdS( iN(tsix(t html_parsertOpArgs opcode argtBytecode_compatcBseZdZdZRS(cCs ||_dS(N(tcode(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__init__sccstjd|jj}t|jj}d}d}x||kr||}|tjkr||d||dd|}|d7}|tjkrtjd}||d}q9qnd }|d7}t ||Vq9Wd S( s>Yield '(op,arg)' pair for each operation in code object 'code'tbiiiiiiiN( tarrayRtco_codetlentdist HAVE_ARGUMENTt EXTENDED_ARGRt integer_typestNoneR(Rtbytesteoftptrt extended_argtoptargt long_type((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__iter__s  "    (t__name__t __module__RR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyRs tBytecodetunescape(R Rt collectionsthtmlt ImportErrorRtsetuptools.externRtsetuptools.extern.six.movesRt namedtupleRtobjectRtgetattrRt HTMLParserR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyts     "PK!Dm. . py36compat.pyonu[ fc@sddlZddlmZddlmZddlmZdd dYZejd krtdd dYZne rdd d YZndS(iN(tDistutilsOptionError(t strtobool(tDEBUGtDistribution_parse_config_filescBseZdZddZRS(s Mix-in providing forward-compatibility for functionality to be included by default on Python 3.7. Do not edit the code in this class except to update functionality as implemented in distutils. c CsHddlm}tjtjkrRddddddd d d d d ddg }ng}t|}|dkr|j}ntr|j dn|dd}x|D]}tr|j d|n|j |x|j D]}|j |}|j |}x]|D]U} | dkr| |kr|j|| } | jdd} || f|| s APK! II sandbox.pyonu[ fc@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZddlZejjdrddljjjjZnejejZy eZWnek r dZnXeZddl m!Z!ddlm"Z"ddd d gZ#dd Z$ej%dd Z&ej%d Z'ej%dZ(ej%dZ)de*fdYZ+dd!dYZ,ej%dZ-dZ.ej%dZ/ej%dZ0dZ1dZ2dZ3dd"dYZ4e5edrNej6gZ7ngZ7de4fdYZ8ej9ej:gdj;D]Z<e=ee<d^qZ>d e!fd YZ?dS(#iN(tsix(tbuiltinstmaptjava(tDistutilsError(t working_settAbstractSandboxtDirectorySandboxtSandboxViolationt run_setupcBs_d}e||}|j}WdQX|dkr?|}ne||d}|||UdS(s. Python 3 implementation of execfile. trbNtexec(topentreadtNonetcompile(tfilenametglobalstlocalstmodetstreamtscripttcode((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt _execfile#s  ccs>tj}|dk r#|tj(nz |VWd|tj(XdS(N(tsystargvR(trepltsaved((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt save_argv0s     ccs%tj}z |VWd|tj(XdS(N(Rtpath(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt save_path;s  ccsBtjj|dttj}|t_z dVWd|t_XdS(sL Monkey-patch tempfile.tempdir with replacement, ensuring it exists texist_okN(t pkg_resourcest py31compattmakedirstTruettempfilettempdir(t replacementR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt override_tempDs    ccs7tj}tj|z |VWdtj|XdS(N(tostgetcwdtchdir(ttargetR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytpushdUs    tUnpickleableExceptioncBseZdZedZRS(sP An exception representing another Exception that could not be pickled. cCsay tj|tj|fSWn:tk r\ddlm}|j||t|SXdS(s Always return a dumped (pickled) type and exc. If exc can't be pickled, wrap it in UnpickleableException first. i(R-N(tpickletdumpst Exceptiontsetuptools.sandboxR-tdumptrepr(ttypetexctcls((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR2ds   (t__name__t __module__t__doc__t staticmethodR2(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR-_stExceptionSavercBs)eZdZdZdZdZRS(s^ A Context Manager that will save an exception, serialized, and restore it later. cCs|S(N((tself((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt __enter__xscCs,|s dStj|||_||_tS(N(R-R2t_savedt_tbR#(R<R4R5ttb((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__exit__{s  cCsKdt|krdSttj|j\}}tj|||jdS(s"restore and re-raise any exceptionR>N(tvarsRR.tloadsR>RtreraiseR?(R<R4R5((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytresumes(R7R8R9R=RARE(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR;rs  c#sgtjjt }VWdQXtjjfdtjD}t||jdS(s Context in which imported modules are saved. Translates exceptions internal to the context into the equivalent exception outside the context. Nc3s1|]'}|kr|jd r|VqdS(s encodings.N(t startswith(t.0tmod_name(R(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys s (RtmodulestcopyR;tupdatet_clear_modulesRE(t saved_exct del_modules((Rs6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt save_moduless   cCs%xt|D]}tj|=q WdS(N(tlistRRI(t module_namesRH((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRLsccs*tj}z |VWdtj|XdS(N(R t __getstate__t __setstate__(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytsave_pkg_resources_states  ccstjj|d}tqtattJt:t|'t |t ddVWdQXWdQXWdQXWdQXWdQXWdQXdS(Nttempt setuptools( R(RtjoinRTROthide_setuptoolsRRR'R,t __import__(t setup_dirttemp_dir((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt setup_contexts       cCs"tjd}t|j|S(sH >>> _needs_hiding('setuptools') True >>> _needs_hiding('pkg_resources') True >>> _needs_hiding('setuptools_plugin') False >>> _needs_hiding('setuptools.__init__') True >>> _needs_hiding('distutils') True >>> _needs_hiding('os') False >>> _needs_hiding('Cython') True s1(setuptools|pkg_resources|distutils|Cython)(\.|$)(treRtbooltmatch(RHtpattern((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt _needs_hidingscCs tttj}t|dS(s% Remove references to setuptools' modules from sys.modules to allow the invocation to import the most appropriate setuptools. This technique is necessary to avoid issues such as #315 where setuptools upgrading itself would fail to find a function declared in the metadata. N(tfilterRaRRIRL(RI((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRXsc Cstjjtjj|}t|y|gt|tj(tjjd|t j t j j dt |tr|n|jtj}t|'td|dd}t||WdQXWn/tk r}|jr|jdrqnXWdQXdS(s8Run a distutils setup script, sandboxed in its directoryicSs |jS(N(tactivate(tdist((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyttt__file__R7t__main__N(R(RtabspathtdirnameR\RPRRtinsertRt__init__t callbackstappendt isinstancetstrtencodetgetfilesystemencodingRtdictRt SystemExittargs(t setup_scriptRuRZt dunder_filetnstv((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR s   cBseZdZeZdZdZdZdZdZ dZ x<ddd gD]+Z e e e rXe e ee sc3s!|]}tj|VqdS(N(R]R_(RGR`(R(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys s(Rt_exception_patternst itertoolstchaintany(R<Rt start_matchestpattern_matchest candidates((Rs6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs     cOsH||jkrD|j| rD|j|tjj|||n|S(sCalled for path inputs(t write_opsRRR(RR(R<RRRuR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs%cOsF|j| s |j| r<|j|||||n||fS(s?Called for path pairs like rename, link, and symlink operations(RR(R<RRRRuR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs icOsR|t@r9|j| r9|jd|||||ntj|||||S(sCalled for low-level os.open()sos.open(t WRITE_FLAGSRRR|R (R<RtflagsRRuR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR s(R7R8R9RstfromkeysRRt _EXCEPTIONSRlRRRRRRRRR (((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR~s       s4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYicBs,eZdZejdjZdZRS(sEA setup script attempted to modify the filesystem outside the sandboxs SandboxViolation: {cmd}{args!r} {kwargs} The package setup script has attempted to modify files on your system that are not within the EasyInstall build area, and has been aborted. This package cannot be safely installed by EasyInstall, and may not support alternate installation locations even if you run its setup script by hand. Please inform the package's author and the EasyInstall maintainers to find out if a fix or workaround is available. cCs%|j\}}}|jjtS(N(RuttmpltformatR(R<tcmdRutkwargs((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__str__s(R7R8R9ttextwraptdedenttlstripRR(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRs (((@R(RR$toperatort functoolsRR]t contextlibR.Rtsetuptools.externRtsetuptools.extern.six.movesRRtpkg_resources.py31compatR tplatformRFt$org.python.modules.posix.PosixModuletpythonRItposixt PosixModuleR|RRRt NameErrorRR Rtdistutils.errorsRRt__all__RtcontextmanagerRRR'R,R0R-R;RORLRTR\RaRXR RR}RRRtreducetor_tsplittaRRR(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyts^                      wV +PK!0msite-patch.pyonu[ fc@s&dZedkr"e[ndS(cCsddl}ddl}|jjd}|dksL|jdkrU| rUg}n|j|j}t|di}|j t |}|j j t }x|D]}||ks| rqn|j|}|dk r|j d}|dk r|jdPqqy.ddl} | j d|g\} } } Wntk rRqnX| dkreqnz| jd| | | Wd| jXPqWtdtg|j D]}t|ddf^q} t|dd }d |_x|D]}t|qW|j|7_t|d \}}d}g}x|j D]}t|\}}||kr|dkrt |}n|| ks|dkr|j|qA|j|||d7}qAW||j (dS( Nit PYTHONPATHtwin32tpath_importer_cachetsites$Couldn't find the real 'site' moduleit __egginserti(tsystostenvirontgettNonetplatformtsplittpathseptgetattrtpathtlentdirnamet__file__t find_modulet load_moduletimpt ImportErrortclosetdicttmakepathRt addsitedirtappendtinsert(RRRtpictstdpathtmydirtitemtimportertloaderRtstreamRtdescrt known_pathstoldpostdtndt insert_attnew_pathtptnp((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyt__boots`  "      "    2  RN(R,t__name__(((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyts G PK!A|<D!D!ssl_support.pyonu[ fc@s/ddlZddlZddlZddlZddlZddlmZmZmZm Z ddl m Z m Z yddl Z Wnek rdZ nXdddddgZd jjZyejjZejZWnek reZZnXe dk oeeefkZydd l mZmZWnUek ry$dd lmZdd lmZWqek rdZdZqXnXesd efdYZnesddZdZndefdYZdefdYZ ddZ!dZ"e"dZ#dZ$dZ%dS(iN(turllibt http_clienttmaptfilter(tResolutionErrortExtractionErrortVerifyingHTTPSHandlertfind_ca_bundlet is_availablet cert_pathst opener_fors /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt /usr/share/ssl/certs/ca-bundle.crt /usr/local/share/certs/ca-root.crt /etc/ssl/cert.pem /System/Library/OpenSSL/certs/cert.pem /usr/local/share/certs/ca-root-nss.crt /etc/ssl/ca-bundle.pem (tCertificateErrortmatch_hostname(R (R R cBseZRS((t__name__t __module__(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR 5sic CsRg}|stS|jd}|d}|d}|jd}||krgtdt|n|s|j|jkS|dkr|jdnY|jds|jdr|jtj |n"|jtj |j dd x$|D]}|jtj |qWtj d d j |d tj } | j|S( spMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 t.iit*s,too many wildcards in certificate DNS name: s[^.]+sxn--s\*s[^.]*s\As\.s\Z(tFalsetsplittcountR treprtlowertappendt startswithtretescapetreplacetcompiletjoint IGNORECASEtmatch( tdnthostnamet max_wildcardstpatstpartstleftmostt remaindert wildcardstfragtpat((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt_dnsname_match;s*    " &cCs[|stdng}|jdd }xC|D];\}}|dkr4t||r_dS|j|q4q4W|sxc|jddD]L}xC|D];\}}|dkrt||rdS|j|qqWqWnt|dkrtd|d jtt|fn;t|dkrKtd ||d fn td dS(s=Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. sempty or no certificatetsubjectAltNametDNSNtsubjectt commonNameis&hostname %r doesn't match either of %ss, shostname %r doesn't match %ris=no appropriate commonName or subjectAltName fields were found((( t ValueErrortgetR)RtlenR RRR(tcertR tdnsnamestsantkeytvaluetsub((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR os.  %cBs eZdZdZdZRS(s=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|dS(N(t ca_bundlet HTTPSHandlert__init__(tselfR7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9s csjfd|S(Ncst|j|S(N(tVerifyingHTTPSConnR7(thosttkw(R:(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytt(tdo_open(R:treq((R:s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt https_opens(R Rt__doc__R9RB(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRs R;cBs eZdZdZdZRS(s@Simple verifying connection: no auth, subclasses, timeouts, etc.cKs tj|||||_dS(N(tHTTPSConnectionR9R7(R:R<R7R=((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9scCs+tj|j|jft|dd}t|drjt|ddrj||_|j|j }n |j}tt drt j d|j }|j |d||_n$t j |dt jd|j |_yt|jj|Wn4tk r&|jjtj|jjnXdS( Ntsource_addresst_tunnelt _tunnel_hosttcreate_default_contexttcafiletserver_hostnamet cert_reqstca_certs(tsockettcreate_connectionR<tporttgetattrtNonethasattrtsockRFRGtsslRHR7t wrap_sockett CERT_REQUIREDR t getpeercertR tshutdownt SHUT_RDWRtclose(R:RSt actual_hosttctx((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytconnects$$!      (R RRCR9R](((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR;s cCs"tjjt|ptjS(s@Get a urlopen() replacement that uses ca_bundle for verification(Rtrequestt build_openerRRtopen(R7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR s cs"tjfd}|S(Ncs+tds$||_njS(Ntalways_returns(RRRa(targstkwargs(tfunc(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytwrappers(t functoolstwraps(RdRe((Rds:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytoncescsnyddl}Wntk r$dSXd|jffdY}|jd|jd|jS(NitCertFilecs&eZfdZfdZRS(cs't|jtj|jdS(N(tsuperR9tatexittregisterRZ(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9scs/yt|jWntk r*nXdS(N(RjRZtOSError(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRZs (R RR9RZ((Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRistCAtROOT(t wincertstoret ImportErrorRQRitaddstoretname(Rpt _wincerts((Ris:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytget_win_certfiles    cCs4ttjjt}tp3t|dp3tS(s*Return an existing CA bundle path, or NoneN( RtostpathtisfileR RutnextRQt_certifi_where(textant_cert_paths((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRs cCs5ytdjSWntttfk r0nXdS(Ntcertifi(t __import__twhereRqRR(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRzs(&RvRMRkRRftsetuptools.extern.six.movesRRRRt pkg_resourcesRRRTRqRQt__all__tstripRR R^R8RDtAttributeErrortobjectRR R tbackports.ssl_match_hostnameR.R)RR;R RhRuRRz(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytsP     "          4 ) (   PK!"unicode_utils.pyonu[ fc@sGddlZddlZddlmZdZdZdZdS(iN(tsixcCsnt|tjr"tjd|Sy4|jd}tjd|}|jd}Wntk rinX|S(NtNFDsutf-8(t isinstanceRt text_typet unicodedatat normalizetdecodetencodet UnicodeError(tpath((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt decomposes cCsqt|tjr|Stjp%d}|df}x6|D].}y|j|SWq;tk rhq;q;Xq;WdS(sY Ensure that the given path is decoded, NONE when no expected encoding works sutf-8N(RRRtsystgetfilesystemencodingRtUnicodeDecodeError(R tfs_enct candidatestenc((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pytfilesys_decodes   cCs*y|j|SWntk r%dSXdS(s/turn unicode encoding into a functional routineN(RtUnicodeEncodeErrortNone(tstringR((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt try_encode's (RR tsetuptools.externRR RR(((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyts   PK!kBB version.pycnu[ fc@s@ddlZyejdjZWnek r;dZnXdS(iNt setuptoolstunknown(t pkg_resourcestget_distributiontversiont __version__t Exception(((s6/usr/lib/python2.7/site-packages/setuptools/version.pyts  PK!kBB version.pyonu[ fc@s@ddlZyejdjZWnek r;dZnXdS(iNt setuptoolstunknown(t pkg_resourcestget_distributiontversiont __version__t Exception(((s6/usr/lib/python2.7/site-packages/setuptools/version.pyts  PK!Xwindows_support.pyonu[ fc@s4ddlZddlZdZedZdS(iNcCstjdkrdS|S(NtWindowsc_sdS(N(tNone(targstkwargs((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pytt(tplatformtsystem(tfunc((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt windows_onlyscCsqtdtjjj}tjjtjjf|_tjj |_ d}|||}|smtj ndS(s Set the hidden attribute on a file or directory. From http://stackoverflow.com/questions/19622133/ `path` must be text. sctypes.wintypesiN( t __import__tctypestwindlltkernel32tSetFileAttributesWtwintypestLPWSTRtDWORDtargtypestBOOLtrestypetWinError(tpathtSetFileAttributestFILE_ATTRIBUTE_HIDDENtret((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt hide_file s (RR R R(((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyts   PK!+__pycache__/py27compat.cpython-36.opt-1.pycnu[PK!t&(#A__pycache__/dep_util.cpython-36.pycnu[PK!sJ)\\(__pycache__/depends.cpython-36.opt-1.pycnu[PK!sJ)\\"Z__pycache__/depends.cpython-36.pycnu[PK!9%0__pycache__/dist.cpython-36.opt-1.pycnu[PK!ƏƏ__pycache__/dist.cpython-36.pycnu[PK!trr* P__pycache__/extension.cpython-36.opt-1.pycnu[PK!trr$W__pycache__/extension.cpython-36.pycnu[PK!{&___pycache__/glibc.cpython-36.opt-1.pycnu[PK!{ e__pycache__/glibc.cpython-36.pycnu[PK!w݊%k__pycache__/glob.cpython-36.opt-1.pycnu[PK!tF"z__pycache__/glob.cpython-36.pycnu[PK!l'__pycache__/launch.cpython-36.opt-1.pycnu[PK!l!__pycache__/launch.cpython-36.pycnu[PK!z< < +__pycache__/lib2to3_ex.cpython-36.opt-1.pycnu[PK!z< < %__pycache__/lib2to3_ex.cpython-36.pycnu[PK! Y-'__pycache__/monkey.cpython-36.opt-1.pycnu[PK! Y-!__pycache__/monkey.cpython-36.pycnu[PK!9%G__pycache__/msvc.cpython-36.opt-1.pycnu[PK!9CO__pycache__/msvc.cpython-36.pycnu[PK!++9__pycache__/namespaces.cpython-36.opt-1.pycnu[PK!+%__pycache__/namespaces.cpython-36.pycnu[PK!ҲVP}}.__pycache__/package_index.cpython-36.opt-1.pycnu[PK!ҲVP}}( q__pycache__/package_index.cpython-36.pycnu[PK!Jרii+__pycache__/pep425tags.cpython-36.opt-1.pycnu[PK!16ii% __pycache__/pep425tags.cpython-36.pycnu[PK!%(__pycache__/py27compat.cpython-36.pycnu[PK!je++__pycache__/py31compat.cpython-36.opt-1.pycnu[PK!je%2__pycache__/py31compat.cpython-36.pycnu[PK!sJ66+8__pycache__/py33compat.cpython-36.opt-1.pycnu[PK!sJ66%=__pycache__/py33compat.cpython-36.pycnu[PK!;3^ZZ+:C__pycache__/py36compat.cpython-36.opt-1.pycnu[PK!;3^ZZ%K__pycache__/py36compat.cpython-36.pycnu[PK!q}-4&=&=(T__pycache__/sandbox.cpython-36.opt-1.pycnu[PK!q}-4&=&="__pycache__/sandbox.cpython-36.pycnu[PK!1=ǝ+__pycache__/site-patch.cpython-36.opt-1.pycnu[PK!1=ǝ%__pycache__/site-patch.cpython-36.pycnu[PK!w==,~__pycache__/ssl_support.cpython-36.opt-1.pycnu[PK!w==&__pycache__/ssl_support.cpython-36.pycnu[PK!RzTLL.__pycache__/unicode_utils.cpython-36.opt-1.pycnu[PK!RzTLL(T__pycache__/unicode_utils.cpython-36.pycnu[PK!;X(__pycache__/version.cpython-36.opt-1.pycnu[PK!;X"S__pycache__/version.cpython-36.pycnu[PK!}  &__pycache__/wheel.cpython-36.opt-1.pycnu[PK!s|$%% 5__pycache__/wheel.cpython-36.pycnu[PK!u 0|M__pycache__/windows_support.cpython-36.opt-1.pycnu[PK!u *Q__pycache__/windows_support.cpython-36.pycnu[PK!h[KK)U__pycache__/__init__.cpython-36.opt-1.pycnu[PK!h[KK#6n__pycache__/__init__.cpython-36.pycnu[PK!]-Ԇ__pycache__/archive_util.cpython-36.opt-1.pycnu[PK!]'__pycache__/archive_util.cpython-36.pycnu[PK!лvv+__pycache__/build_meta.cpython-36.opt-1.pycnu[PK!`|%__pycache__/build_meta.cpython-36.pycnu[PK!Wmď::'__pycache__/config.cpython-36.opt-1.pycnu[PK!Wmď::!__pycache__/config.cpython-36.pycnu[PK!t&()R__pycache__/dep_util.cpython-36.opt-1.pycnu[PK!bnqq1EV_vendor/__pycache__/__init__.cpython-36.opt-1.pycnu[PK!bnqq+W_vendor/__pycache__/__init__.cpython-36.pycnu[PK!AKK2W_vendor/__pycache__/pyparsing.cpython-36.opt-1.pycnu[PK!AKK,i _vendor/__pycache__/pyparsing.cpython-36.pycnu[PK!Z_Z_,7{ _vendor/__pycache__/six.cpython-36.opt-1.pycnu[PK!Z_Z_& _vendor/__pycache__/six.cpython-36.pycnu[PK!YH<: _vendor/packaging/__pycache__/__about__.cpython-36.opt-1.pycnu[PK!YH6= _vendor/packaging/__pycache__/__about__.cpython-36.pycnu[PK!%;m@ _vendor/packaging/__pycache__/__init__.cpython-36.opt-1.pycnu[PK!%5B _vendor/packaging/__pycache__/__init__.cpython-36.pycnu[PK!:D _vendor/packaging/__pycache__/_compat.cpython-36.opt-1.pycnu[PK!4H _vendor/packaging/__pycache__/_compat.cpython-36.pycnu[PK!v >L _vendor/packaging/__pycache__/_structures.cpython-36.opt-1.pycnu[PK!v 8HX _vendor/packaging/__pycache__/_structures.cpython-36.pycnu[PK!g!!:c _vendor/packaging/__pycache__/markers.cpython-36.opt-1.pycnu[PK!]?a"a"4 _vendor/packaging/__pycache__/markers.cpython-36.pycnu[PK! ? _vendor/packaging/__pycache__/requirements.cpython-36.opt-1.pycnu[PK! 9 _vendor/packaging/__pycache__/requirements.cpython-36.pycnu[PK!S MM=/ _vendor/packaging/__pycache__/specifiers.cpython-36.opt-1.pycnu[PK!S MM7_vendor/packaging/__pycache__/specifiers.cpython-36.pycnu[PK!dV8Ab_vendor/packaging/__pycache__/utils.cpython-36.opt-1.pycnu[PK!dV2Ad_vendor/packaging/__pycache__/utils.cpython-36.pycnu[PK! )):;f_vendor/packaging/__pycache__/version.cpython-36.opt-1.pycnu[PK! ))4_vendor/packaging/__pycache__/version.cpython-36.pycnu[PK!<)X5_vendor/packaging/__about__.pynu[PK!vS_vendor/packaging/__init__.pynu[PK!iJ\\_vendor/packaging/_compat.pynu[PK! I_vendor/packaging/_structures.pynu[PK! H/ / !_vendor/packaging/markers.pynu[PK!vЁ!_vendor/packaging/requirements.pynu[PK!|Eymym_vendor/packaging/specifiers.pynu[PK!'g_vendor/packaging/utils.pynu[PK!ơ$-$-i_vendor/packaging/version.pynu[PK! _vendor/__init__.pynu[PK!x(N_vendor/pyparsing.pynu[PK!XMZuu}_vendor/six.pynu[PK!bD D -Mcommand/__pycache__/build_clib.cpython-36.pycnu[PK!Ʃ&&2command/__pycache__/build_ext.cpython-36.opt-1.pycnu[PK!$&&,%command/__pycache__/build_ext.cpython-36.pycnu[PK!ю0!0!+tcommand/__pycache__/build_py.cpython-36.pycnu[PK!1 >n0command/__pycache__/develop.cpython-36.opt-1.pycnu[PK!1 >n*-"command/__pycache__/develop.cpython-36.pycnu[PK!p%%2U;command/__pycache__/dist_info.cpython-36.opt-1.pycnu[PK!p%%,@command/__pycache__/dist_info.cpython-36.pycnu[PK!V!`5]Fcommand/__pycache__/easy_install.cpython-36.opt-1.pycnu[PK!{AJ/HDcommand/__pycache__/easy_install.cpython-36.pycnu[PK!(oQQ1ZBcommand/__pycache__/egg_info.cpython-36.opt-1.pycnu[PK!(oQQ+Vcommand/__pycache__/egg_info.cpython-36.pycnu[PK!m#J990Lcommand/__pycache__/install.cpython-36.opt-1.pycnu[PK!m#J99*command/__pycache__/install.cpython-36.pycnu[PK!: : : 9xcommand/__pycache__/install_egg_info.cpython-36.opt-1.pycnu[PK!: : : 3command/__pycache__/install_egg_info.cpython-36.pycnu[PK!Ã4command/__pycache__/install_lib.cpython-36.opt-1.pycnu[PK!`.(command/__pycache__/install_lib.cpython-36.pycnu[PK!88command/__pycache__/install_scripts.cpython-36.opt-1.pycnu[PK!2Acommand/__pycache__/install_scripts.cpython-36.pycnu[PK!:K3Jcommand/__pycache__/py36compat.cpython-36.opt-1.pycnu[PK!:K-\command/__pycache__/py36compat.cpython-36.pycnu[PK!@1ncommand/__pycache__/register.cpython-36.opt-1.pycnu[PK!@+Nqcommand/__pycache__/register.cpython-36.pycnu[PK!dh+ /scommand/__pycache__/rotate.cpython-36.opt-1.pycnu[PK!dh+ )}command/__pycache__/rotate.cpython-36.pycnu[PK!)PP1command/__pycache__/saveopts.cpython-36.opt-1.pycnu[PK!)PP+command/__pycache__/saveopts.cpython-36.pycnu[PK!W.Pcommand/__pycache__/sdist.cpython-36.opt-1.pycnu[PK!W(Vcommand/__pycache__/sdist.cpython-36.pycnu[PK!ۈi/Vcommand/__pycache__/setopt.cpython-36.opt-1.pycnu[PK!ۈi)ccommand/__pycache__/setopt.cpython-36.pycnu[PK!Ȍ$-jcommand/__pycache__/test.cpython-36.opt-1.pycnu[PK!Ȍ$'\command/__pycache__/test.cpython-36.pycnu[PK!iu##/H%command/__pycache__/upload.cpython-36.opt-1.pycnu[PK!iu##)*command/__pycache__/upload.cpython-36.pycnu[PK!Ppp4F0command/__pycache__/upload_docs.cpython-36.opt-1.pycnu[PK!.Hcommand/__pycache__/upload_docs.cpython-36.pycnu[PK!Q1`command/__pycache__/__init__.cpython-36.opt-1.pycnu[PK!Q+bcommand/__pycache__/__init__.cpython-36.pycnu[PK!XJ5 5 .ecommand/__pycache__/alias.cpython-36.opt-1.pycnu[PK!XJ5 5 (ocommand/__pycache__/alias.cpython-36.pycnu[PK!~m882 ycommand/__pycache__/bdist_egg.cpython-36.opt-1.pycnu[PK!~m88,pcommand/__pycache__/bdist_egg.cpython-36.pycnu[PK!"ޜ2command/__pycache__/bdist_rpm.cpython-36.opt-1.pycnu[PK!"ޜ,command/__pycache__/bdist_rpm.cpython-36.pycnu[PK!b6command/__pycache__/bdist_wininst.cpython-36.opt-1.pycnu[PK!b0command/__pycache__/bdist_wininst.cpython-36.pycnu[PK!bD D 3command/__pycache__/build_clib.cpython-36.opt-1.pycnu[PK!ю0!0!1K command/__pycache__/build_py.cpython-36.opt-1.pycnu[PK!ARRR*command/__init__.pynu[PK!P#z z q-command/alias.pynu[PK!1 G G+7command/bdist_egg.pynu[PK!tx~command/bdist_rpm.pynu[PK! u}}command/bdist_wininst.pynu[PK!'ecommand/build_clib.pynu[PK!O&!u3u3.command/build_ext.pynu[PK!@FB|%|%command/build_py.pynu[PK!@\;nncommand/develop.pynu[PK!Vcommand/dist_info.pynu[PK!rKSSZcommand/easy_install.pynu[PK!^]``jcommand/egg_info.pynu[PK!۵?KKcommand/install.pynu[PK!\ҨIcommand/install_egg_info.pynu[PK!;S/command/install_lib.pynu[PK!F? ucommand/install_scripts.pynu[PK!])BttFcommand/launcher manifest.xmlnu[PK!}s`zzcommand/py36compat.pynu[PK!command/register.pynu[PK!Ԥttcommand/rotate.pynu[PK!4 command/saveopts.pynu[PK!n77#command/sdist.pynu[PK!p>command/setopt.pynu[PK!##6Rcommand/test.pynu[PK!$gsvcommand/upload.pynu[PK!ƏH{command/upload_docs.pynu[PK!0)1 1 0extern/__pycache__/__init__.cpython-36.opt-1.pycnu[PK!0)1 1 *extern/__pycache__/__init__.cpython-36.pycnu[PK!-G 9extern/__init__.pynu[PK!# JDD >__init__.pynu[PK!eQarchive_util.pynu[PK!='' build_meta.pynu[PK!;oT??  config.pynu[PK!"2 V<dep_util.pynu[PK![)-j 8@depends.pynu[PK!'Y^?Wdist.pynu[PK! extension.pynu[PK!J J glibc.pynu[PK!]9WWglob.pynu[PK!d~ %launch.pynu[PK!Q (lib2to3_ex.pynu[PK!Cr^ 0monkey.pynu[PK!$6MGmsvc.pynu[PK!c   namespaces.pynu[PK!ٜٜqpackage_index.pynu[PK!辂** pep425tags.pynu[PK!fW Ipy27compat.pynu[PK!йHZ py31compat.pynu[PK!, py33compat.pynu[PK! K K ^py36compat.pynu[PK!Sc77 sandbox.pynu[PK!  script (dev).tmplnu[PK!3  script.tmplnu[PK!   site-patch.pynu[PK![N,!,! ssl_support.pynu[PK!Bך]8 unicode_utils.pynu[PK!HLb < version.pynu[PK!FI>>K= wheel.pynu[PK! Y windows_support.pynu[PK!j! \ __init__.pycnu[PK!90z _vendor/packaging/__about__.pycnu[PK!906~ _vendor/packaging/__about__.pyonu[PK!kVFcc _vendor/packaging/__init__.pycnu[PK!kVFccK _vendor/packaging/__init__.pyonu[PK!f _vendor/packaging/_compat.pycnu[PK!f% _vendor/packaging/_compat.pyonu[PK!HJMM!N _vendor/packaging/_structures.pycnu[PK!HJMM! _vendor/packaging/_structures.pyonu[PK!:=.. _vendor/packaging/markers.pycnu[PK!-.-. _vendor/packaging/markers.pyonu[PK!&p,,"!_vendor/packaging/requirements.pycnu[PK!&p,,"$!_vendor/packaging/requirements.pyonu[PK!b bb 9!_vendor/packaging/specifiers.pycnu[PK!b bb C!_vendor/packaging/specifiers.pyonu[PK!5WRR!_vendor/packaging/utils.pycnu[PK!5WRR"_vendor/packaging/utils.pyonu[PK!>;j8j8"_vendor/packaging/version.pycnu[PK!>;j8j8s="_vendor/packaging/version.pyonu[PK!nMe*v"_vendor/__init__.pycnu[PK!nMew"_vendor/__init__.pyonu[PK!IEw"_vendor/pyparsing.pycnu[PK!IE&_vendor/pyparsing.pyonu[PK!V!o{o{ԕ)_vendor/six.pycnu[PK!V!o{o{*_vendor/six.pyonu[PK!Ox0*archive_util.pycnu[PK!gLsn*build_meta.pycnu[PK!zz*build_meta.pyonu[PK!Zٻ311S*command/build_ext.pycnu[PK!500 +command/build_ext.pyonu[PK!8 ));+command/build_py.pycnu[PK!e+command/develop.pycnu[PK!х+command/dist_info.pycnu[PK!&99A+command/easy_install.pycnu[PK! 99,command/easy_install.pyonu[PK!U(e(e.command/egg_info.pycnu[PK!ѽUrYYf.command/install.pycnu[PK!(q q y.command/install_egg_info.pycnu[PK!Y.command/install_lib.pyonu[PK! +K K x.command/install_scripts.pycnu[PK! +K K .command/install_scripts.pyonu[PK! .command/py36compat.pycnu[PK!~.command/register.pycnu[PK!ACii.command/saveopts.pycnu[PK!Gi2O.command/setopt.pycnu[PK!Gl((3.command/test.pycnu[PK!tddW/command/upload.pycnu[PK!g/command/upload_docs.pycnu[PK!-υ4/command/upload_docs.pyonu[PK!'zzS/command/bdist_rpm.pyonu[PK!q[/command/bdist_wininst.pyonu[PK!]  a`/command/build_clib.pycnu[PK!]  k/command/build_clib.pyonu[PK!8 ))%w/command/build_py.pyonu[PK!/command/develop.pyonu[PK!х3/command/dist_info.pyonu[PK!U(e(e/command/egg_info.pyonu[PK!ѽUrYY,0command/install.pyonu[PK!(q q @0command/install_egg_info.pyonu[PK!%DM0command/install_lib.pycnu[PK! `0command/py36compat.pyonu[PK!~v0command/register.pyonu[PK!PJ y0command/rotate.pycnu[PK!PJ 0command/rotate.pyonu[PK!ACiiˑ0command/saveopts.pyonu[PK!x(Lx0command/sdist.pycnu[PK!x(LH0command/sdist.pyonu[PK!Gi20command/setopt.pyonu[PK!Gl((0command/test.pyonu[PK!tdd 1command/upload.pyonu[PK!n[rr1command/__init__.pycnu[PK!n[rr|1command/__init__.pyonu[PK!Pz{U  2#1command/alias.pycnu[PK!Pz{U  /1command/alias.pyonu[PK!iGG;1command/bdist_egg.pycnu[PK!iGG1command/bdist_egg.pyonu[PK!'zz1command/bdist_rpm.pycnu[PK!1command/bdist_wininst.pycnu[PK!c.g 1dep_util.pycnu[PK!KcSS 1depends.pycnu[PK!qzX1dist.pyonu[PK!%Yr r t2extension.pycnu[PK!%Yr r #2extension.pyonu[PK!q q ҫ2extern/__init__.pycnu[PK!q q 2extern/__init__.pyonu[PK!H:2glob.pyonu[PK!I 2launch.pycnu[PK!x- (2lib2to3_ex.pycnu[PK!K  "2monkey.pycnu[PK!g[⣠#2msvc.pycnu[PK!3namespaces.pycnu[PK!I ??3package_index.pycnu[PK!Mc[bL4py27compat.pycnu[PK!<k$jjP4py31compat.pycnu[PK!\']X4py33compat.pycnu[PK!Dm. . S_4py36compat.pycnu[PK! II j4sandbox.pycnu[PK!0mδ4site-patch.pycnu[PK!A|<D!D!׻4ssl_support.pycnu[PK!"Z4unicode_utils.pycnu[PK!Ʌu [4wheel.pycnu[PK! h3G C5wheel.pyonu[PK!X 5windows_support.pycnu[PK!j! F"5__init__.pyonu[PK!OxK@5archive_util.pyonu[PK! {AA X5config.pycnu[PK! {AA 5config.pyonu[PK!c.g 5dep_util.pyonu[PK!KcSS 5depends.pyonu[PK!o9y|5dist.pycnu[PK!ʏ Ҝ6glibc.pycnu[PK!ʏ 6glibc.pyonu[PK!jK6glob.pycnu[PK!I 6launch.pyonu[PK!x- 6lib2to3_ex.pyonu[PK!K  6monkey.pyonu[PK!g[⣠6msvc.pyonu[PK!7namespaces.pyonu[PK!I ??z7package_index.pyonu[PK!Üv$v$58pep425tags.pycnu[PK!Üv$v$Z8pep425tags.pyonu[PK!Mc[b8py27compat.pyonu[PK!<k$jj8py31compat.pyonu[PK!\']8py33compat.pyonu[PK!Dm. . S8py36compat.pyonu[PK! II 8sandbox.pyonu[PK!0m8site-patch.pyonu[PK!A|<D!D!8ssl_support.pyonu[PK!"Z9unicode_utils.pyonu[PK!kBB [9version.pycnu[PK!kBB 9version.pyonu[PK!XU9windows_support.pyonu[PKMMxx9