3 Ävh|%ã @sÒddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZyddlmZWn"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.6/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. cCsFtjj|ƒ|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_optionscCs||j r|j rdS|jr"|jƒ|jr8|jƒ|jƒ|j|jdƒ|j|jdƒ|j|jdƒ|jt 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_outputs)r r r r Úrun+sz build_py.runcCs&|dkr|jƒ|_|jStjj||ƒS)zlazily compute data filesr)Ú_get_data_filesrrrÚ __getattr__)r Úattrr r r r?s zbuild_py.__getattr__cCsJtjrt|tjƒr|jdƒ}tjj||||ƒ\}}|rB|jj |ƒ||fS)NÚ.) rZPY2Ú isinstanceZ string_typesÚsplitrrÚ build_modulerÚappend)r ÚmoduleZ module_fileÚpackageZoutfileÚcopiedr r r r$Fs    zbuild_py.build_modulecCs|jƒtt|j|jpfƒƒS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)Úanalyze_manifestÚlistrÚ_get_pkg_data_filesr)r r r r rPszbuild_py._get_data_filescsJ|j|ƒ‰tjj|jg|jdƒŽ}‡fdd„|j|ˆƒDƒ}|ˆ||fS)Nr!csg|]}tjj|ˆƒ‘qSr )ÚosÚpathÚrelpath)Ú.0Úfile)Úsrc_dirr r ú ^sz0build_py._get_pkg_data_files..)Úget_package_dirr,r-ÚjoinZ build_libr#Úfind_data_files)r r'Ú build_dirÚ filenamesr )r1r r+Us   zbuild_py._get_pkg_data_filescCsX|j|j||ƒ}tt|ƒ}tjj|ƒ}ttj j |ƒ}tj|j j |gƒ|ƒ}|j |||ƒ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'r1ÚpatternsZglobs_expandedZ globs_matchesZ glob_filesr r r r r5cs   zbuild_py.find_data_filesc Cs�xŠ|jD]€\}}}}xr|D]j}tjj||ƒ}|jtjj|ƒƒtjj||ƒ}|j||ƒ\}} tjj|ƒ}| r||jj kr|j j |ƒqWqWdS)z$Copy data files into build directoryN) rr,r-r4ZmkpathÚdirnameZ copy_fileÚabspathrZconvert_2to3_doctestsrr%) r r'r1r6r7ÚfilenameÚtargetZsrcfileZoutfr(r r r rts   zbuild_py.build_package_datac Csôi|_}|jjsdSi}x$|jp$fD]}||t|j|ƒƒ<q&W|jdƒ|jdƒ}xš|jj D]Ž}t j j t|ƒƒ\}}d}|} x:|r¸||kr¸||kr¸|}t j j |ƒ\}} t j j | |ƒ}q€W||kr^|jdƒrÖ|| krÖq^|j||gƒj|ƒq^WdS)NZegg_infoz.py)r=rZinclude_package_datarÚassert_relativer3Z run_commandZget_finalized_commandZfilelistr r,r-r#r4ÚendswithÚ setdefaultr%) r ZmfZsrc_dirsr'Zei_cmdr-ÚdÚfÚprevZoldfZdfr r r r)�s(   zbuild_py.analyze_manifestcCsdS)Nr )r r r r Úget_data_files™szbuild_py.get_data_filescCsºy |j|Stk rYnXtjj|||ƒ}||j|<| sJ|jj rN|Sx,|jjD]}||ksr|j|dƒrXPqXW|Stj |dƒ�}|j ƒ}WdQRXd|kr¶t j 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)r r'Z package_dirZinit_pyZpkgrIÚcontentsr r r rOœs&   zbuild_py.check_packagecCsi|_tjj|ƒdS)N)rMrrÚinitialize_options)r r r r rWºszbuild_py.initialize_optionscCs0tjj||ƒ}|jjdk r,tjj|jj|ƒS|S)N)rrr3rZsrc_rootr,r-r4)r r'Úresr r r r3¾s zbuild_py.get_package_dircs\tˆƒ‰|j|j||ƒ}‡fdd„|Dƒ}tjj|ƒ}t|ƒ‰‡fdd„ˆDƒ}tt|ƒƒS)z6Filter filenames for package's data files in 'src_dir'c3s|]}tjˆ|ƒVqdS)N)Úfnmatchr)r/Úpattern)r r r ú Ísz.build_py.exclude_data_files..c3s|]}|ˆkr|VqdS)Nr )r/Úfn)Úbadr r r[Ôs)r*r8rr9r:r;ÚsetÚ_unique_everseen)r r'r1r r@Z match_groupsZmatchesZkeepersr )r]r r r?Äs   zbuild_py.exclude_data_filescs.tj|jdgƒ|j|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 |]}tjjˆt|ƒƒVqdS)N)r,r-r4r)r/rZ)r1r r r[ész2build_py._get_platform_patterns..)r9r:r>)Úspecr'r1Z raw_patternsr )r1r r8Ûs   zbuild_py._get_platform_patternsN)rrrÚ__doc__rrrr$rr+r5rr)rKrOrWr3r?Ú staticmethodr8r r r r rs    rccsjtƒ}|j}|dkr:xPt|j|ƒD]}||ƒ|Vq"Wn,x*|D]"}||ƒ}||kr@||ƒ|Vq@WdS)zHList unique elements, preserving order. Remember all elements ever seen.N)r^ÚaddrÚ __contains__)ÚiterableÚkeyÚseenZseen_addÚelementÚkr r r r_ïs  r_cCs:tjj|ƒs|Sddlm}tjdƒjƒ|}||ƒ‚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.errorsrkÚtextwrapÚdedentÚlstrip)r-rkÚmsgr r r rEs   rE)N)rZdistutils.utilrZdistutils.command.build_pyZcommandrrr,rYrnrQrmrTr9Zsetuptools.externrZsetuptools.extern.six.movesrrrZsetuptools.lib2to3_exrÚ ImportErrorr_rEr r r r Ús$    Y