o Cf@sdgZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Zddl Zddl mZddlmZddlmZddlmZddlZddlZddlmZmZmZddlmZdd lmZdd lm Z m!Z!dd l m"Z"dd l#m$Z$dd l#m%Z%ddl&m'Z'ddl(m)Z)ddl*Z*ddl+Z*ddl*m,Z,ddl-m.Z.ddl/m0Z0ddl1Z1ddl2m3Z3erddl4m5Z5e6de6dddZ7ddZ8de9de9fddZ:d d!d"e9dee9fd#d$Z;d d!d"e9dee9fd%d&Zd+d,Z?d-d.Z@d/d0ZAeBeCfZDd1d2ZEd3d4ZFd5d6ZGd7d8ZHd9d:ZId;d<ZJd=d>ZKd?d@ZLdAdBZMdCdDZNdEdFZOdGdHZPdIdJZQe.ejRjSZTGdKddeTZSGdLdMdMe)ZUdS)N DistributionN) strtobool)DEBUGtranslate_longopt)iglob)ListOptional TYPE_CHECKING) defaultdict)message_from_file)DistutilsOptionErrorDistutilsSetupError) rfc822_escape) packaging) ordered_set)unique_everseen)SetuptoolsDeprecationWarning)windows_support) get_unpatched)parse_configurationversion)Messagez&setuptools.extern.packaging.specifiersz#setuptools.extern.packaging.versioncCstdtt|S)NzDo not call this function)warningswarnDistDeprecationWarningr)clsr1/usr/lib/python3/dist-packages/setuptools/dist.py_get_unpatched2s r!cCs(t|dd}|durtd}||_|S)Nmetadata_version2.1)getattrrVersionr")selfmvrrr get_metadata_version7s  r(contentreturnc CsJ|}t|dkr|dSd|dtd|ddfS)zFReverse RFC-822 escaping by removing leading whitespaces from content.rr N) splitlineslenlstripjointextwrapdedent)r)linesrrr rfc822_unescape?s  *r3msgrfieldcCs||}|dkr dS|S)zRead Message header field.UNKNOWNNrr4r5valuerrr _read_field_from_msgGsr9cCst||}|dur |St|S)z4Read Message header field and apply rfc822_unescape.N)r9r3r7rrr _read_field_unescaped_from_msgOs r:cCs||d}|gkr dS|S)z9Read Message header field and return all results as list.N)get_all)r4r5valuesrrr _read_list_from_msgWs r=cCs|}|dkr dS|S)Nr6) get_payloadstrip)r4r8rrr _read_payload_from_msg_s r@cCsZt|}t|d|_t|d|_t|d|_t|d|_t|d|_d|_t|d|_ d|_ t|d|_ t |d |_ d |vrGt|d |_nd|_t |d |_|jdurb|jtd krbt||_t|d|_d |vrut|d d|_t|d|_t|d|_|jtdkrt|d|_t|d|_t|d|_n d|_d|_d|_t|d|_dS)z-Reads the metadata values from a file object.zmetadata-versionnamersummaryauthorNz author-emailz home-pagelicensez download-url descriptionr#keywords,platform classifierz1.1requiresprovides obsoletesz license-file)r rr%r"r9rArErC maintainer author_emailmaintainer_emailurlr:rD download_urllong_descriptionr@splitrFr= platforms classifiersrJrKrL license_files)r&filer4rrr read_pkg_filefs>               rXcCs(d|vrtd|dd}|S)zF Quick and dirty validation for Summary pypa/setuptools#1390. r+z1newlines not allowed and will break in the futurer)rrr?rS)valrrr single_lines rZc s|}fdd}|dt||d||d||dt||d|d}|D]\}}t||d }|d urF|||q3t| }|d ||j r[|d |j |j D] } |d d | q`d |} | rx|d| |D]} |d| q||d||d||d||d|t|dr|d|j|jr|d|j|jrt|jD]} |d| q|d|jpgd|d S)z0Write the PKG-INFO format data to a file object.csd||fdS)Nz%s: %s )write)keyr8rWrr write_fieldsz#write_pkg_file..write_fieldzMetadata-VersionNamer%Summaryz Home-page))AuthorrC)z Author-emailrN) MaintainerrM)zMaintainer-emailrONLicensez Download-URLz Project-URLz%s, %srGKeywordsPlatform ClassifierRequiresProvides Obsoletespython_requireszRequires-PythonzDescription-Content-TypezProvides-Extraz License-Filez %s )r(strget_name get_versionrZget_descriptionget_urlr$r get_licenserQ project_urlsitemsr/ get_keywords get_platforms _write_listget_classifiers get_requires get_provides get_obsoleteshasattrrjlong_description_content_typeprovides_extrassortedrVr[get_long_description) r&rWrr^optional_fieldsr5attrattr_valrD project_urlrFrHextrarr]r write_pkg_filesJ              rc CsTztjd|}|jrJWdSttttfy)}z td||f|d}~ww)Nzx=z4%r must be importable 'module:attrs' string (got %r)) pkg_resources EntryPointparseextras TypeError ValueErrorAttributeErrorAssertionErrorr)distrr8eperrr check_importables rc Cs^zt|ttfs Jd||ksJWdSttttfy.}z td||f|d}~ww)z"Verify that value is a string listz%%r must be a list of strings (got %r)N) isinstancelisttupler/rrrrrrrr8rrrr assert_string_lists rcCsd|}t||||D]%}||stdd||d\}}}|r/||vr/tjd||q dS)z(Verify that namespace packages are validz1Distribution contains no modules or packages for znamespace package %r.z^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyN)rhas_contents_forr rpartition distutilslogr)rrr8 ns_packagesnspparentsepchildrrr check_nsps$   rc CsDz ttt|WdStttfy!}ztd|d}~ww)z+Verify that extras_require mapping is validz'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.N) r itertoolsstarmap _check_extrarrrrrrrrrr check_extrassrcCs<|d\}}}|rt|rtd|tt|dS)N:zInvalid environment marker: ) partitionrinvalid_markerrrparse_requirements)rreqsrArmarkerrrr rs rcCs&t||krd}t|j||ddS)z)Verify that value is True, False, 0, or 1z0{attr!r} must be a boolean value (got {value!r}))rr8N)boolrformat)rrr8tmplrrr assert_bool#s rcCs(|s t|dtdSt|d)Nz is ignored.z is invalid.)rrrrrrr8rrr invalid_unless_false*src Cs`ztt|t|ttfrtdWdSttfy/}z d}t|j ||d|d}~ww)z9Verify that install_requires is a valid requirements listzUnordered types are not allowedzm{attr!r} must be a string or list of strings containing valid project/version requirement specifiers; {error}rerrorN) rrrrdictsetrrrrrrr8rrrrr check_requirements1src CsLz tj|WdStjjtfy%}z d}t|j||d|d}~ww)z.Verify that value is a valid version specifierzF{attr!r} must be a string containing valid version specifiers; {error}rN)r specifiers SpecifierSetInvalidSpecifierrrrrrrr check_specifier?src Cs6z tj|WdSty}zt||d}~ww)z)Verify that entry_points map is parseableN)rr parse_maprrrrrr check_entry_pointsJs  rcCst|ts tddS)Nztest_suite must be a string)rrkrrrrr check_test_suiteRs rcCsZt|ts td||D]\}}t|ts!td||t|d||qdS)z@Verify that value is a dictionary of package names to glob listszT{!r} must be a dictionary mapping package names to lists of string wildcard patternsz,keys of {!r} dict must be strings (got {!r})zvalues of {!r} dictN)rrrrrrrkr)rrr8kvrrr check_package_dataWs   rcCs(|D]}td|stjd|qdS)Nz \w+(\.\w+)*z[WARNING: %r not a valid package name; please use only .-separated package names in setup.py)rematchrrr)rrr8pkgnamerrr check_packagesfs rc@s~eZdZdZddeejdddddZdZdd Z dUd d Z d d Z e ddZ e ddZddZddZe ddZddZddZddZe ddZdUd d!Zd"d#Zd$d%Zd&d'ZdUd(d)ZdVd+d,Zd-d.Zd/d0Ze d1d2Zd3d4Zd5d6Z d7d8Z!d9d:Z"d;d<Z#d=d>Z$d?d@Z%dAdBZ&dCdDZ'dEdFZ(dGdHZ)dIdJZ*dKdLZ+dMdNZ,dOdPZ-dQdRZ.dSdTZ/dS)WraG Distribution with support for 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. '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. cCdSNrrrrr zDistribution.cCrrrrrrr rrcCrrrrrrr rr)r{rqr| license_filerVNcCst|r d|vs d|vr dStt|d}tjj|}|dur6|ds8tt|d|_ ||_ dSdSdS)NrArzPKG-INFO) r safe_namerklower working_setby_keyget has_metadata safe_version_version _patched_dist)r&attrsr\rrrr patch_missing_pkg_infos z#Distribution.patch_missing_pkg_infocstd}|s i_|p i}g_|dd_||dg_|dg_t dD] }t  |j dq0t fdd|D|jjj_dS)N package_datasrc_rootdependency_linkssetup_requiresdistutils.setup_keywordscs i|] \}}|jvr||qSr)_DISTUTILS_UNSUPPORTED_METADATA.0rrr&rr s  z)Distribution.__init__..)rzr dist_filespoprrrrriter_entry_pointsvars setdefaultrA _Distribution__init__rr_set_metadata_defaults_normalize_version_validate_versionmetadatar_finalize_requires)r&rhave_package_datarrrr rs,      zDistribution.__init__cCs4|jD]\}}t|j||||qdS)z Fill-in missing metadata fields not supported by distutils. Some fields may have been set by other tools (e.g. pbr). Those fields (vars(self.metadata)) take precedence to supplied attrs. N)rrrrrrr)r&roptiondefaultrrr rsz#Distribution._set_metadata_defaultscCsTt|tjs |dur |Sttj|}||kr(d}t|j dit |S|S)Nz)Normalizing '{version}' to '{normalized}'r) r setuptoolssicrkrrr%rrrlocals)r normalizedrrrr rszDistribution._normalize_versionc Csft|tjr t|}|dur1z tj|W|Stjjtfy0t d|t |YSw|S)NzThe 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.) rnumbersNumberrkrrr%InvalidVersionrrrrrrrrr rs  zDistribution._validate_versioncCsft|ddr |j|j_t|ddr)|jD]}|dd}|r(|jj|q|| dS)z Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. rjNextras_requirerr) r$rjrrkeysrSr|add_convert_extras_requirements"_move_install_requirements_markers)r&rrrr rs    zDistribution._finalize_requirescCsht|ddpi}tt|_|D] \}}|j|t|D]}||}|j|||qqdS)z Convert requirements in `extras_require` of the form `"extra": ["barbazquux; {marker}"]` to `"extra:{marker}": ["barbazquux"]`. rN) r$r r_tmp_extras_requirerrrr _suffix_forappend)r& spec_ext_reqssectionrrsuffixrrr rs   z)Distribution._convert_extras_requirementscCs|jr dt|jSdS)ze For a requirement, return the 'extras_require' suffix for that requirement. rr)rrkreqrrr r'szDistribution._suffix_forcsdd}tddp d}tt|}t||}t||}ttt|_ |D]}j dt|j  |q(t fddj D_dS) zv Move requirements in `install_requires` that are using environment markers `extras_require`. cSs|j Srrrrrr is_simple_req9szFDistribution._move_install_requirements_markers..is_simple_reqinstall_requiresNrrc3s.|]\}}|ddtj|DfVqdS)cSg|]}t|qSr)rk)rrrrr EzMDistribution._move_install_requirements_markers...N)map _clean_reqrrrr Ds  zBDistribution._move_install_requirements_markers..)r$rrrfilterr filterfalser rkrrrrrrrr)r&rspec_inst_reqs inst_reqs simple_reqs complex_reqsrrrr r/s    z/Distribution._move_install_requirements_markerscCs d|_|S)zP Given a Requirement, remove environment markers and return it. Nr)r&rrrr r IszDistribution._clean_reqcCs`|jj}|r|ng}|jj}|r||vr|||dur#|dur#d}tt|||j_dS)z>> list(Distribution._expand_patterns(['LICENSE'])) ['LICENSE'] >>> list(Distribution._expand_patterns(['setup.cfg', 'LIC*'])) ['setup.cfg', 'LICENSE'] css<|]}tt|D]}|ds tj|r |Vq qdS)~N)r}rendswithospathisfile)rpatternrrrr r ks   z0Distribution._expand_patterns..r)rrrr rcszDistribution._expand_patternsc Csddlm}tjtjkrgngd}t|}|dur|}tr%|d|}t |_ |D]g}t j |dd}trE|dj d it||Wdn1sTwY|D]2}||}||} |D]#} | d ksu| |vrvqk||| } || |} || |} || f| | <qkq]|q-d |jvrdS|jd D]7\} \} } |j| } | rt|  } n| d vrt| } z t|| p| | Wqty}zt||d}~wwdS) z Adapted from distutils.dist.Distribution.parse_config_files, this method provides the same functionality in subtly-improved ways. r) ConfigParser) z install-basezinstall-platbasez install-libzinstall-platlibzinstall-purelibzinstall-headerszinstall-scriptsz install-dataprefixz exec-prefixhomeuserrootNz"Distribution.parse_config_files():utf-8)encodingz reading {filename}__name__global)verbosedry_runr) configparserrsysr base_prefix frozensetfind_config_filesrannouncerk optionxformioopenrr read_filesectionsoptionsget_option_dictrwarn_dash_deprecationmake_option_lowercasercommand_optionsrr negative_optrsetattrrr )r& filenamesrignore_optionsparserfilenamereaderrr2opt_dictoptrYsrcaliasrrrr _parse_config_filesssZ              z Distribution._parse_config_filescCsd|dvr|S|dd}tjj|}|ds#|dkr#||vr#|Sd|vr0td||f|S)N)zoptions.extras_requirezoptions.data_files-_r2rzrUsage of dash-separated '%s' will not be supported in future versions. Please use the underscore name '%s' instead)replacercommand__all___setuptools_commands startswithrr)r&r?runderscore_optcommandsrrr r4s  z"Distribution.warn_dash_deprecationcCs4z td}t|dWStjygYSw)Nrdistutils.commands)rget_distributionr get_entry_mapDistributionNotFound)r&rrrr rHs  z!Distribution._setuptools_commandscCs4|dks|r |S|}td|||f|S)NrzlUsage of uppercase key '%s' in '%s' will be deprecated in future versions. Please use lowercase '%s' instead)islowerrrr)r&r?r lowercase_optrrr r5sz"Distribution.make_option_lowercasec CsH|}|dur ||}tr|d||D]\}\}}tr,|d|||fz dd|jD}Wn tyAg}Ynwz|j}Wn tyRi}Ynwz=t|t } ||vrk| rkt |||t | n$||vrz| rzt ||t |nt ||rt |||n t d|||fWqty} zt | | d} ~ wwdS)a Set the options for 'command_obj' from 'option_dict'. Basically this means copying elements of a dictionary ('option_dict') to attributes of an instance ('command'). 'command_obj' must be a Command instance. If 'option_dict' is not supplied, uses the standard option dictionary for this command (from 'self.command_options'). (Adopted from distutils.dist.Distribution._set_command_options) Nz# setting options for '%s' command:z %s = %s (from %s)cSrrr)rorrr rr z5Distribution._set_command_options..z1error in %s: command '%s' has no such option '%s')get_command_namer3rr,rrboolean_optionsrr7rrkr8rrzr r) r& command_obj option_dict command_namersourcer8 bool_optsneg_opt is_stringrrrr _set_command_optionssJ          z!Distribution._set_command_optionsFcCs0|j|dt||j|d||dS)zYParses configuration files from various levels and loads configuration. )r9)ignore_option_errorsN)rBrr6rr)r&r9r]rrr parse_config_filess  zDistribution.parse_config_filescCs8tjjt||jdd}|D] }tjj|ddq|S)zResolve pre-setup requirementsT) installerreplace_conflicting)rE)rrresolverfetch_build_eggr)r&rJresolved_distsrrrr fetch_build_eggs*szDistribution.fetch_build_eggscCsPd}dd}t|}t|j|}tdd|}t||dD]}||qdS)z Allow plugins to apply arbitrary operations to the distribution. Each hook may optionally define a 'order' to influence the order of execution. Smaller numbers go first and the default is 0. z(setuptools.finalize_distribution_optionscSs t|ddS)Norderr)r$)hookrrr by_order>s z/Distribution.finalize_options..by_ordercSs|Sr)load)rrrr rCsz/Distribution.finalize_options..)r\N)rrrr_removedr r})r&grouprgdefinedfilteredloadedrrrr finalize_options5s  zDistribution.finalize_optionscCsdh}|j|vS)z When removing an entry point, if metadata is loaded from an older version of Setuptools, that removed entry point will attempt to be loaded and will fail. See #2765 for more details. 2to3_doctests)rA)rremovedrrr riGs  zDistribution._removedcCsJtdD]}t||jd}|dur"|j|jd|||j|qdS)Nrr_)rrr$rArequirerbrh)r&rr8rrr _finalize_setup_keywordsUsz%Distribution._finalize_setup_keywordscCstjtjd}tj|sDt|t|tj|d}t|d}| d| d| dWd|S1s?wY|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. ) rrr/curdirexistsmkdirr hide_filer/r[)r& egg_cache_dirreadme_txt_filenamefrrr get_egg_cache_dir\s"        zDistribution.get_egg_cache_dircCsddlm}|||S)z Fetch an egg needed for buildingr)rb)setuptools.installerrb)r&rrbrrr rbos  zDistribution.fetch_build_eggcCs\||jvr |j|Std|}|D]}|j|jd||j|<}|St||S)z(Pluggable version of get_command_class()rLrq)cmdclassrrrrrbrhrget_command_class)r&rFepsrr~rrr rus    zDistribution.get_command_classcC:tdD]}|j|jvr|}||j|j<qt|SNrL)rrrAr~rarprint_commandsr&rr~rrr r    zDistribution.print_commandscCrr)rrrAr~rarget_command_listrrrr rrzDistribution.get_command_listcK@|D]\}}t|d|d}|r||q|||qdS)aAdd items to distribution that are named in keyword arguments For example, 'dist.include(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. _include_N)rrr$ _include_misc)r&rrrincluderrr rs  zDistribution.includecsjd|jrfdd|jD|_|jr"fdd|jD|_|jr3fdd|jD|_dSdS)z9Remove packages, modules, and extensions in named packagerc"g|] }|kr|s|qSrrIrppackagepfxrr rz0Distribution.exclude_package..crrrrrrr rrcs&g|]}|jkr|js|qSr)rArIrrrr rs N)packages py_modules ext_modules)r&rrrr exclude_packages    zDistribution.exclude_packagecCs2|d}|D]}||ks||rdSqdS)z.rsequencerr$rr8)r&rAr8oldrrrr _exclude_miscs"  zDistribution._exclude_miscc st|ts td||fzt||Wnty'}ztd||d}~wwdur4t|||dStts?t|dfdd|D}t|||dS)zAHandle 'include()' for list/tuple attrs without a special handlerz%s: setting must be a list (%r)rNrcrrrrrrr rrz.Distribution._include_misc..r)r&rAr8rnewrrr rs  zDistribution._include_misccKr)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. _exclude_N)rrr$r)r&rrrexcluderrr rs  zDistribution.excludecCs,t|ts td|ftt|j|dS)Nz.packages: setting must be a list or tuple (%r))rrrrr r)r&rrrr _exclude_packagess zDistribution._exclude_packagesc Cs|jj|_|jj|_|d}|d}||vr6||\}}||=ddl}||d|dd<|d}||vst|||}||} t | ddrWd|f||d<|durWgS|S)NraliasesTrcommand_consumes_arguments command lineargs) __class__global_optionsr7r3shlexrSr_parse_command_optsrr$) r&r;rrFrr@rArnargs cmd_classrrr rs$      z Distribution._parse_command_optsc Csi}|jD]W\}}|D]N\}\}}|dkrq|dd}|dkrO||}|j}|t|di|D]\} } | |krI| }d}nq;tdn|dkrUd}|| |i|<qq|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. rrDrCrr7NzShouldn't be able to get herer) r6rrrEget_command_objr7copyupdater$rr) r&dcmdoptsr?r@rYcmdobjrZnegposrrr get_cmdline_options#s.    z Distribution.get_cmdline_optionsccsx|jpdD]}|Vq|jpdD]}|Vq|jpdD]}t|tr(|\}}n|j}|dr6|dd}|VqdS)z@Yield all packages, modules, and extension names in distributionrmoduleNi)rrrrrrAr)r&pkgrextrA buildinforrr rKs    z$Distribution.iter_distribution_namesc Csddl}|jr t||St|jtjst||S|jj dvr(t||S|jj}|jj }|j dkr7dp8d}|jj }t|j d||||_zt||Wt|j |||||_St|j |||||_w)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. rN)r!utf8win32r+r!)r( help_commandsrhandle_display_optionsrstdoutr. TextIOWrapperr"rerrorsrHline_bufferingdetach)r& option_orderr(r"rnewlinerrrr r]s*     z#Distribution.handle_display_optionsr)NF)0r# __module__ __qualname____doc__rr OrderedSetrrrrr staticmethodrrrrrrr rrrBr4rHr5r\r^rdrnrirsr|rbrrrrrrrrrrrrrrrrrr rssh4      O .      ( c@seZdZdZdS)rzrClass for warning about deprecations in dist in setuptools. Not ignored by default, unlike DeprecationWarning.N)r#rrrrrrr rsr)VrGr.r(rrrr distutils.logrdistutils.core distutils.cmddistutils.distdistutils.commanddistutils.utilrdistutils.debugrdistutils.fancy_getoptrglobrrr0typingrr r collectionsr emailr distutils.errorsr rrsetuptools.externrr setuptools.extern.more_itertoolsrrrrsetuptools.commandrsetuptools.monkeyrsetuptools.configrrsetuptools.extern.packagingr email.messager __import__r!r(rkr3r9r:r=r@rXrZrrrrrrrrrrrrrrrrrcorerrrrrrr s                0 >