U Qab|%@sddlmZddlmZddlmmZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZzddlmZWn"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.8/site-packages/setuptools/command/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. cCsFtj||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_2to3r r r r r!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_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|tjr|d}tj||||\}}|rB|j |||fS)N.) rZPY2 isinstanceZ string_typessplitrr build_modulerappend)r moduleZ module_filepackageZoutfilecopiedr r r r%Fs   zbuild_py.build_modulecCs|tt|j|jpdS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesr )analyze_manifestlistr_get_pkg_data_filesrrr r r rPszbuild_py._get_data_filescsJ||tjj|jg|d}fdd||D}|||fS)Nr"csg|]}tj|qSr )ospathrelpath).0filesrc_dirr r ]sz0build_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 itertoolschain from_iterablerr-r.isfilemanifest_filesgetexclude_data_files)r r(r3patternsZglobs_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.r6ZmkpathdirnameZ copy_fileabspathrZconvert_2to3_doctestsrr&) r r(r3r8r9filenametargetZsrcfileZoutfr)r r r rts  zbuild_py.build_package_datac Csi|_}|jjsdSi}|jp"dD]}||t||<q$|d|d}|jj D]}t j t|\}}d}|} |r||kr||kr|}t j |\}} t j | |}qx||krX|dr|| krqX|||g|qXdS)Nr Zegg_infoz.py)r?rZinclude_package_datarassert_relativer5Z run_commandZget_finalized_commandZfilelistr r-r.r$r6endswith setdefaultr&) r ZmfZsrc_dirsr(Zei_cmdr.dfprevZoldfZdfr r r r*s(    zbuild_py.analyze_manifestcCsdSNr rr r r get_data_filesszbuild_py.get_data_filesc Csz |j|WStk r YnXtj|||}||j|<|rH|jjsL|S|jjD]}||ksn||drTqxqT|St |d}| }W5QRXd|krt j d|f|S)z8Check namespace packages' __init__ for declare_namespacer"rbsdeclare_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_pyZpkgrKcontentsr r r rRs*    zbuild_py.check_packagecCsi|_tj|dSrM)rPrrinitialize_optionsrr r r rZszbuild_py.initialize_optionscCs0tj||}|jjdk r,tj|jj|S|SrM)rrr5rZsrc_rootr-r.r6)r r(resr r r r5s 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|VqdSrM)fnmatchrr0pattern)r r r sz.build_py.exclude_data_files..c3s|]}|kr|VqdSrMr )r0fn)badr r r_s)r+r:rr;r<r=set_unique_everseen)r r(r3r rBZ match_groupsZmatchesZkeepersr )rar r rAs   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|VqdSrM)r-r.r6rr]r2r r r_sz2build_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)rbaddr __contains__)iterablekeyseenZseen_addZelementkr r r rcs rccCs: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. )r-r.isabsdistutils.errorsrntextwrapdedentlstrip)r.rnmsgr 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