a ˆåÏh%ã@sÆddlmZddlmZddlmmZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZzddlmZWn ey’Gdd„dƒZYn0dd„ZGd d „d ejeƒZdd d „Zd d„ZdS)é)Úglob)Ú convert_pathN)Ú Mixin2to3c@seZdZddd„ZdS)rTcCsdS)z do nothingN©)ÚselfÚfilesZdoctestsrrú?/usr/lib/python3.9/site-packages/setuptools/command/build_py.pyÚrun_2to3szMixin2to3.run_2to3N)T)Ú__name__Ú __module__Ú __qualname__r rrrrrsrcCst |t |¡jtjB¡dS©N)ÚosÚchmodÚstatÚst_modeÚS_IWRITE)ÚtargetrrrÚ make_writablesrc@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|jvr6|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©rrrrr#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_outputsrrrrÚrun-s z build_py.runcCs&|dkr| ¡|_|jStj ||¡S)zlazily compute data filesr)Ú_get_data_filesrrrÚ __getattr__)rÚattrrrrr$As zbuild_py.__getattr__cCs.tj ||||¡\}}|r&|j |¡||fSr )rrÚ build_modulerÚappend)rÚmoduleZ module_fileÚpackageZoutfileÚcopiedrrrr&Hs  ÿ zbuild_py.build_modulecCs| ¡tt|j|jpdƒƒS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesr)Úanalyze_manifestÚlistÚmapÚ_get_pkg_data_filesr rrrrr#Oszbuild_py._get_data_filescsJ| |¡‰tjj|jg| d¡Ž}‡fdd„| |ˆ¡Dƒ}|ˆ||fS)NÚ.csg|]}tj |ˆ¡‘qSr)rÚpathÚrelpath)Ú.0Úfile©Úsrc_dirrrÚ \sÿz0build_py._get_pkg_data_files..)Úget_package_dirrr0ÚjoinZ build_libÚsplitÚfind_data_files)rr)Ú build_dirÚ filenamesrr4rr.Ts    þ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_patternsrr-rÚ itertoolsÚchainÚ from_iterableÚfilterrr0ÚisfileÚmanifest_filesÚgetÚexclude_data_files)rr)r5ÚpatternsZglobs_expandedZ globs_matchesZ glob_filesrrrrr:bsý   þzbuild_py.find_data_filesc Cs�|jD]„\}}}}|D]r}tj ||¡}| tj |¡¡tj ||¡}| ||¡\}} t|ƒtj |¡}| r||j j vr|j   |¡qqdS)z$Copy data files into build directoryN) rrr0r8ZmkpathÚdirnameZ copy_filerÚabspathrZconvert_2to3_doctestsrr') rr)r5r;r<ÚfilenamerZsrcfileZoutfr*rrrr!ss  ÿzbuild_py.build_package_datac Csèi|_}|jjsdSi}|jp"dD]}||t| |¡ƒ<q$| d¡| d¡}|jj D]Š}t j   t|ƒ¡\}}d}|} |r°||kr°||vr°|}t j   |¡\}} t j   | |¡}qx||vrX| d¡rÌ|| krÌqX| ||g¡ |¡qXdS)NrZegg_infoz.py)rCrZinclude_package_datar Úassert_relativer7Z run_commandZget_finalized_commandZfilelistrrr0r9r8ÚendswithÚ setdefaultr') rZmfZsrc_dirsr)Zei_cmdr0ÚdÚfÚprevZoldfZdfrrrr+�s(    zbuild_py.analyze_manifestcCsdSr rrrrrÚget_data_files™szbuild_py.get_data_filescCsÈz |j|WStyYn0tj |||¡}||j|<|rF|jjsJ|S|jjD]}||ksl| |d¡rRqvqR|St  |d¡�}|  ¡}Wdƒn1s 0Yd|vrÄt j   d|f¡‚|S)z8Check namespace packages' __init__ for declare_namespacer/ÚrbNsdeclare_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)rr)Z package_dirZinit_pyÚpkgrNÚcontentsrrrrTœs*     &ýÿzbuild_py.check_packagecCsi|_tj |¡dSr )rRrrÚinitialize_optionsrrrrr]ºszbuild_py.initialize_optionscCs0tj ||¡}|jjdur,tj |jj|¡S|Sr )rrr7rZsrc_rootrr0r8)rr)Úresrrrr7¾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 ˆ|¡VqdSr )ÚfnmatchrA©r2Úpattern)rrrÚ Ìsÿz.build_py.exclude_data_files..c3s|]}|ˆvr|VqdSr r)r2Úfn)ÚbadrrrbÓsþ)r,r=rr>r?r@ÚsetÚ_unique_everseen)rr)r5rrFZ match_groupsÚmatchesZkeepersr)rdrrrEÄ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|ƒ¡VqdSr )rr0r8rr`r4rrrbçsÿz2build_py._get_platform_patterns..)r>r?rD)Úspecr)r5Z raw_patternsrr4rr=Ûs  þ ýzbuild_py._get_platform_patternsN)r r r Ú__doc__rr"r$r&r#r.r:r!r+rPrTr]r7rEÚ staticmethodr=rrrrrs"  rccsdtƒ}|j}|dur8t |j|¡D]}||ƒ|Vq"n(|D]"}||ƒ}||vr<||ƒ|VqÚ filterfalseÚ __contains__)ÚiterableÚkeyÚseenZseen_addÚelementÚkrrrrfïs rfcCs: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. )rr0ÚisabsÚdistutils.errorsrtÚtextwrapÚdedentÚlstrip)r0rtÚmsgrrrrJs   ùrJ)N)rZdistutils.utilrZdistutils.command.build_pyZcommandrrrr_rwrVrvrYr>rZsetuptools.lib2to3_exrÚ ExceptionrrfrJrrrrÚs$   W