a [dg%@sddlmZddlmZddlmmZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZzddlmZWn eyGdddZYn0ddZGd d d ejeZdd d Zd dZdS))glob) convert_pathN) Mixin2to3c@seZdZdddZdS)rTcCsdS)z do nothingN)selffilesZdoctestsrrE/usr/local/lib/python3.9/site-packages/setuptools/command/build_py.pyrun_2to3szMixin2to3.run_2to3N)T)__name__ __module__ __qualname__r rrrrrsrcCst|t|jtjBdSN)oschmodstatst_modeS_IWRITE)targetrrr make_writablesrc@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. cCsFtj||jj|_|jjp i|_d|jvr6|jd=g|_g|_dS)N data_files) origrfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_files_build_py__doctests_2to3rrrrr#s   zbuild_py.finalize_optionscCsx|js|jsdS|jr||jr4||||jd||jd||jd|t 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_outputsrrrrrun-s z build_py.runcCs&|dkr||_|jStj||S)zlazily compute data filesr)_get_data_filesrrr __getattr__)rattrrrrr$As zbuild_py.__getattr__cCs.tj||||\}}|r&|j|||fSr )rr build_modulerappend)rmoduleZ module_filepackageZoutfilecopiedrrrr&Hs   zbuild_py.build_modulecCs|tt|j|jpdS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesr)analyze_manifestlistmap_get_pkg_data_filesr rrrrr#Oszbuild_py._get_data_filescsJ||tjj|jg|d}fdd||D}|||fS)N.csg|]}tj|qSr)rpathrelpath).0filesrc_dirrr \sz0build_py._get_pkg_data_files..)get_package_dirrr0joinZ build_libsplitfind_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 itertoolschain from_iterablefilterrr0isfilemanifest_filesgetexclude_data_files)rr)r5patternsZglobs_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) rrr0r8ZmkpathdirnameZ copy_filerabspathrZconvert_2to3_doctestsrr') rr)r5r;r<filenamerZsrcfileZoutfr*rrrr!ss  zbuild_py.build_package_datac Csi|_}|jjsdSi}|jp"dD]}||t||<q$|d|d}|jj D]}t j t|\}}d}|} |r||kr||vr|}t j |\}} t j | |}qx||vrX|dr|| krqX|||g|qXdS)NrZegg_infoz.py)rCrZinclude_package_datar assert_relativer7Z run_commandZget_finalized_commandZfilelistrrr0r9r8endswith setdefaultr') rZmfZsrc_dirsr)Zei_cmdr0dfprevZoldfdfrrrr+s(    zbuild_py.analyze_manifestcCsdSr rrrrrget_data_filesszbuild_py.get_data_filescCsz |j|WStyYn0tj|||}||j|<|rF|jjsJ|S|jjD]}||ksl||drRqvqR|St |d}| }Wdn1s0Yd|vrt 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)rr)Z package_dirZinit_pyZpkgrNcontentsrrrrUs*     &zbuild_py.check_packagecCsi|_tj|dSr )rSrrinitialize_optionsrrrrr]szbuild_py.initialize_optionscCs0tj||}|jjdur,tj|jj|S|Sr )rrr7rZsrc_rootrr0r8)rr)resrrrr7s zbuild_py.get_package_dircs\t||j||}fdd|D}tj|}t|fddD}tt|S)z6Filter filenames for package's data files in 'src_dir'c3s|]}t|VqdSr )fnmatchrAr2pattern)rrr sz.build_py.exclude_data_files..c3s|]}|vr|VqdSr r)r2fn)badrrrbs)r,r=rr>r?r@set_unique_everseen)rr)r5rrFZ match_groupsmatchesZkeepersr)rdrrrEs   zbuild_py.exclude_data_filescs.t|dg||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 |]}tjt|VqdSr )rr0r8rr`r4rrrbsz2build_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+rQrUr]r7rE staticmethodr=rrrrrs"  rccsdt}|j}|dur8t|j|D]}|||Vq"n(|D]"}||}||vr<|||Vq filterfalse __contains__)iterablekeyseenZseen_addelementkrrrrfs rfcCs:tj|s|Sddlm}td|}||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. )rr0isabsdistutils.errorsrttextwrapdedentlstrip)r0rtmsgrrrrJs   rJ)N)rZdistutils.utilrZdistutils.command.build_pyZcommandrrrr_rwrWrvrZr>rZsetuptools.lib2to3_exr ExceptionrrfrJrrrrs$   W