YS% @sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlmZmZmZyddlmZWn%ek rGdddZYnXGdd d ejeZdd d Zd d ZdS))glob) convert_pathN)mapfilter filterfalse) Mixin2to3c@seZdZdddZdS)rTcCsdS)z do nothingN)selffilesZdoctestsrrA/tmp/pip-build-3puug3g5/setuptools/setuptools/command/build_py.pyrun_2to3szMixin2to3.run_2to3N)__name__ __module__ __qualname__r rrrr rs rc@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. cCsctjj||jj|_|jjp.i|_d|jkrM|jd=g|_g|_dS)N data_files) origrfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_files_build_py__doctests_2to3)r rrr r!s    zbuild_py.finalize_optionscCs|j r|j rdS|jr+|j|jrH|j|j|j|jd|j|jd|j|jd|jt j j |dddS)z?Build modules, packages, and copy data files to build directoryNFTZinclude_bytecoder) py_modulespackagesZ build_modulesZbuild_packagesbuild_package_datar rr byte_compilerr get_outputs)r rrr run+s     z build_py.runcCs5|dkr"|j|_|jStjj||S)zlazily compute data filesr)_get_data_filesrrr __getattr__)r attrrrr r!?s zbuild_py.__getattr__cCsktjr*t|tjr*|jd}tjj||||\}}|ra|jj |||fS)N.) sixPY2 isinstance string_typessplitrr build_modulerappend)r moduleZ module_filepackageoutfilecopiedrrr r)Fszbuild_py.build_modulecCs)|jtt|j|jp"fS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)analyze_manifestlistr_get_pkg_data_filesr)r rrr r Ps zbuild_py._get_data_filescsi|j|tjj|jg|jd}fdd|j|D}|||fS)Nr#cs%g|]}tjj|qSr)ospathrelpath).0file)src_dirrr ^s z0build_py._get_pkg_data_files..)get_package_dirr2r3join build_libr(find_data_files)r r, build_dir filenamesr)r7r r1Us %zbuild_py._get_pkg_data_filescCs|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 itertoolschain from_iterablerr2r3isfilemanifest_filesgetexclude_data_files)r r,r7patternsZglobs_expandedZ globs_matchesZ glob_filesr rrr r<cs  zbuild_py.find_data_filesc Csx|jD]\}}}}x|D]}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r#||jj kr#|j j |q#Wq WdS)z$Copy data files into build directoryN) rr2r3r:mkpathdirname copy_fileabspathrZconvert_2to3_doctestsrr*) r r,r7r=r>filenametargetsrcfileoutfr.rrr rts zbuild_py.build_package_datac CsVi|_}|jjsdSi}x0|jp2fD]}||t|j|sz.build_py.exclude_data_files..c3s!|]}|kr|VqdS)Nr)r5fn)badrr rns)r0r?rr@rArBset_unique_everseen)r r,r7r rGZ match_groupsmatchesZkeepersr)rpr r rFs     zbuild_py.exclude_data_filescsAtj|jdg|j|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*|] }tjjt|VqdS)N)r2r3r:r)r5rm)r7rr rnsz2build_py._get_platform_patterns..)r@rArE)specr,r7Z raw_patternsr)r7r r?s zbuild_py._get_platform_patternsN)r rr__doc__rrr!r)r r1r<rr/r[r_rjr9rF staticmethodr?rrrr rs            rccst}|j}|dkrMxdt|j|D]}|||Vq1Wn8x5|D]-}||}||krT|||VqTWdS)zHList unique elements, preserving order. Remember all elements ever seen.N)rqaddr __contains__)iterablekeyseenZseen_addelementkrrr rrs         rrcCsOtjj|s|Sddlm}tjdj|}||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. )r2r3isabsdistutils.errorsrtextwrapdedentlstrip)r3rmsgrrr rQs rQ)rdistutils.utilrZdistutils.command.build_pycommandrrr2rlrrarrdr@r$Z six.movesrrrZsetuptools.lib2to3_exr ImportErrorrrrQrrrr s"