U âQab|%ã@sØddlmZddlmZddlmmZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZzddlmZWn"ek r¬Gdd„dƒZYnXGd d „d ejeƒZdd d „Zd d„ZdS)é)Úglob)Ú convert_pathN)Úsix)ÚmapÚfilterÚ filterfalse)Ú Mixin2to3c@seZdZddd„ZdS)rTcCsdS)z do nothingN©)ÚselfÚfilesZdoctestsr r ú?/usr/lib/python3.8/site-packages/setuptools/command/build_py.pyÚrun_2to3szMixin2to3.run_2to3N)T)Ú__name__Ú __module__Ú __qualname__r r r r r rsrc@sŒeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zedd„ƒZd 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. cCsFtj |¡|jj|_|jjp i|_d|jkr6|jd=g|_g|_dS)NÚ data_files) ÚorigrÚfinalize_optionsÚ distributionÚ package_dataÚexclude_package_dataÚ__dict__Ú_build_py__updated_filesÚ_build_py__doctests_2to3©r r r r r!s  ÿ zbuild_py.finalize_optionscCsx|js|jsdS|jr| ¡|jr4| ¡| ¡| |jd¡| |jd¡| |jd¡| t j j |dd�¡dS)z?Build modules, packages, and copy data files to build directoryNFTr)Zinclude_bytecode) Z py_modulesÚpackagesZ build_modulesZbuild_packagesÚbuild_package_datar rrZ byte_compilerrZ get_outputsrr r r Úrun+s z build_py.runcCs&|dkr| ¡|_|jStj ||¡S)zlazily compute data filesr)Ú_get_data_filesrrrÚ __getattr__)r Úattrr r r r ?s zbuild_py.__getattr__cCsJtjrt|tjƒr| d¡}tj ||||¡\}}|rB|j  |¡||fS)NÚ.) rZPY2Ú isinstanceZ string_typesÚsplitrrÚ build_modulerÚappend)r ÚmoduleZ module_fileÚpackageZoutfileÚcopiedr r r r%Fs  ÿ zbuild_py.build_modulecCs| ¡tt|j|jpdƒƒS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesr )Úanalyze_manifestÚlistrÚ_get_pkg_data_filesrrr r r rPszbuild_py._get_data_filescsJ| |¡‰tjj|jg| d¡Ž}‡fdd„| |ˆ¡Dƒ}|ˆ||fS)Nr"csg|]}tj |ˆ¡‘qSr )ÚosÚpathÚrelpath)Ú.0Úfile©Úsrc_dirr r Ú ]sÿz0build_py._get_pkg_data_files..)Úget_package_dirr-r.ÚjoinZ build_libr$Úfind_data_files)r r(Ú build_dirÚ filenamesr r2r r,Us    þzbuild_py._get_pkg_data_filescCsX| |j||¡}tt|ƒ}tj |¡}ttj j |ƒ}t |j   |g¡|¡}|  |||¡S)z6Return filenames for package's data files in 'src_dir')Ú_get_platform_patternsrrrÚ itertoolsÚchainÚ from_iterablerr-r.ÚisfileÚmanifest_filesÚgetÚexclude_data_files)r r(r3ÚpatternsZglobs_expandedZ globs_matchesZ glob_filesr r r r r7csý   þzbuild_py.find_data_filesc Csˆ|jD]|\}}}}|D]j}tj ||¡}| tj |¡¡tj ||¡}| ||¡\}} tj |¡}| r||jj kr|j   |¡qqdS)z$Copy data files into build directoryN) rr-r.r6ZmkpathÚdirnameZ copy_fileÚabspathrZconvert_2to3_doctestsrr&) r r(r3r8r9ÚfilenameÚtargetZsrcfileZoutfr)r r r rts  ÿzbuild_py.build_package_datac Csèi|_}|jjsdSi}|jp"dD]}||t| |¡ƒ<q$| d¡| d¡}|jj D]Š}t j   t|ƒ¡\}}d}|} |r°||kr°||kr°|}t j   |¡\}} t j   | |¡}qx||krX| d¡rÌ|| krÌqX| ||g¡ |¡qXdS)Nr Zegg_infoz.py)r?rZinclude_package_datarÚassert_relativer5Z run_commandZget_finalized_commandZfilelistr r-r.r$r6ÚendswithÚ setdefaultr&) r ZmfZsrc_dirsr(Zei_cmdr.ÚdÚfÚprevZoldfZdfr r r r*�s(    zbuild_py.analyze_manifestcCsdS©Nr rr r r Úget_data_files™szbuild_py.get_data_filesc Cs¶z |j|WStk r YnXtj |||¡}||j|<|rH|jjsL|S|jjD]}||ksn| |d¡rTqxqT|St  |d¡�}|  ¡}W5QRXd|kr²t j   d|f¡‚|S)z8Check namespace packages' __init__ for declare_namespacer"Úrbsdeclare_namespacezÁNamespace 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_checkedÚKeyErrorrrÚ check_packagerZnamespace_packagesÚ startswithÚioÚopenÚreadÚ distutilsÚerrorsZDistutilsError)r r(Z package_dirZinit_pyZpkgrKÚcontentsr r r rRœs*    ýÿzbuild_py.check_packagecCsi|_tj |¡dSrM)rPrrÚinitialize_optionsrr r r rZºszbuild_py.initialize_optionscCs0tj ||¡}|jjdk r,tj |jj|¡S|SrM)rrr5rZsrc_rootr-r.r6)r r(Úresr r r r5¾s zbuild_py.get_package_dircs\tˆƒ‰| |j||¡}‡fdd„|Dƒ}tj |¡}t|ƒ‰‡fdd„ˆDƒ}tt|ƒƒS)z6Filter filenames for package's data files in 'src_dir'c3s|]}t ˆ|¡VqdSrM)Úfnmatchr©r0Úpattern)r r r Ú Ìsÿz.build_py.exclude_data_files..c3s|]}|ˆkr|VqdSrMr )r0Úfn)Úbadr r r_Ósþ)r+r:rr;r<r=ÚsetÚ_unique_everseen)r r(r3r rBZ match_groupsZmatchesZkeepersr )rar r rAÄsý þ  þzbuild_py.exclude_data_filescs.t | dg¡| |g¡¡}‡fdd„|DƒS)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 |]}tj ˆt|ƒ¡VqdSrM)r-r.r6rr]r2r r r_çsÿz2build_py._get_platform_patterns..)r;r<r@)Úspecr(r3Z raw_patternsr r2r r:Ûs  þ ýzbuild_py._get_platform_patternsN)rrrÚ__doc__rrr r%rr,r7rr*rNrRrZr5rAÚ staticmethodr:r r r r rs"    rccsbtƒ}|j}|dkr6t|j|ƒD]}||ƒ|Vq n(|D]"}||ƒ}||kr:||ƒ|Vq:dS)zHList unique elements, preserving order. Remember all elements ever seen.N)rbÚaddrÚ __contains__)ÚiterableÚkeyÚseenZseen_addZelementÚkr r r rcïs rccCs:tj |¡s|Sddlm}t d¡ ¡|}||ƒ‚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.ÚisabsÚdistutils.errorsrnÚtextwrapÚdedentÚlstrip)r.rnÚmsgr r r rGs   ùrG)N)rZdistutils.utilrZdistutils.command.build_pyZcommandrrr-r\rqrTrprWr;Zsetuptools.externrZsetuptools.extern.six.movesrrrZsetuptools.lib2to3_exrÚ ImportErrorrcrGr r r r Ús$   Y