N3{Y @sddlZddlZddlZddlZddlmZddlmZddl m Z yddl m Z Wn%e k rGdddZ YnXGdd d ee Zd d Z dS) N)build_py) convert_path)glob) Mixin2to3c@seZdZdddZdS)rTcCsdS)z do nothingN)selffilesZdoctestsrr6/tmp/pip-r2rszybt-build/setuptools/command/build_py.pyrun_2to3 szMixin2to3.run_2to3N)__name__ __module__ __qualname__r rrrr r s rc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ e jdkrdddZnddZddZddZddZd S)!raXEnhanced '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. cCsctj||jj|_|jjp+i|_d|jkrM|jd=ng|_g|_dS)N data_files) _build_pyfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_files_build_py__doctests_2to3)rrrr rs   zbuild_py.finalize_optionscCs|j r|j rdS|jr.|jn|jrN|j|jn|j|jd|j|jd|j|jd|jt j |dddS)z?Build modules, packages, and copy data files to build directoryNFTinclude_bytecoder) py_modulespackagesZ build_modulesZbuild_packagesbuild_package_datar rr byte_compiler get_outputs)rrrr run!s     z build_py.runcCs3|dkr#|j|_}|Stj||S)Nr)_get_data_filesrr __getattr__)rattrrrrr r5s zbuild_py.__getattr__cCsAtj||||\}}|r7|jj|n||fS)N)r build_modulerappend)rmoduleZ module_filepackageoutfilecopiedrrr r!;szbuild_py.build_modulecs|jg}x|jpfD]}|j|}tjj|jg|jd}t|dfdd|j ||D}|j ||||fq W|S)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples.cs g|]}|dqS)Nr).0file)plenrr Qs z,build_py._get_data_files..) analyze_manifestrget_package_dirospathjoin build_libsplitlenfind_data_filesr")rdatar$src_dir build_dir filenamesr)r+r rAs %%zbuild_py._get_data_filescCs|jjdg|jj|g}|jj|gdd}x6|D].}|jttjj|t|qNW|j |||S)z6Return filenames for package's data files in 'src_dir'N) rgetmanifest_filesextendrr/r0r1rexclude_data_files)rr$r7globsrpatternrrr r5Vs  ,zbuild_py.find_data_filesc Csx|jD]\}}}}x|D]}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r#||jj kr#|j j |q#q#Wq WdS)z$Copy data files into build directoryN) rr/r0r1mkpathdirname copy_fileabspathrZconvert_2to3_doctestsrr") rr$r7r8r9filenametargetsrcfileoutfr&rrr r`s zbuild_py.build_package_datac Cs\i|_}|jjsdSi}x0|jp2fD]}||t|j|g|]4\}}}}|D]}tjj||qqSr)r/r0r1)r)r$r7r8r9rErrr r,s z(build_py.get_outputs..)rrr)rrrrr rs zbuild_py.get_outputsc Csy|j|SWntk r#YnXtj|||}||j|<| sZ|jj r^|Sx;|jjD])}||ks|j|drkPqkqkW|St|d}dj|j krddl m }|j d|n|j |S)z8Check namespace packages' __init__ for declare_namespacer'ZrbUdeclare_namespacer)logzWARNING: %s is a namespace package, but its __init__.py does not declare_namespace(); setuptools 0.7 will REQUIRE this! (See the setuptools manual under "Namespace Packages" for details.) )packages_checkedKeyErrorr check_packagerZnamespace_packages startswithopenencoderead distutilsrUwarnclose)rr$ package_dirZinit_pypkgrQrUrrr rXs(    zbuild_py.check_packagecCsi|_tj|dS)N)rVrinitialize_options)rrrr rbs zbuild_py.initialize_optionscCsAtj||}|jjdk r=tjj|jj|S|S)N)rr.rZsrc_rootr/r0r1)rr$resrrr r.szbuild_py.get_package_dircs|jjdg|jj|g}gx<|D]4}jtj|tjj|t|q5Wt j ifdd|DS)z6Filter filenames for package's data files in 'src_dir'r:cs@g|]6}|kr|krj|dr|qS)r()rO)r)rQ)badseenrr r,s z/build_py.exclude_data_files..) rr;r=fnmatchfilterr/r0r1rdictfromkeys)rr$r7rr?r@r)rdrer r>s &zbuild_py.exclude_data_filesN)r r r __doc__rrrr!rr5rr-rSsysversionrrXrbr.r>rrrr rs           rcCsOtjj|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. )r/r0isabsdistutils.errorsrmtextwrapdedentlstrip)r0rmmsgrrr rJs rJ)r/rkrfrpZdistutils.command.build_pyrrdistutils.utilrrZsetuptools.lib2to3_exr ImportErrorrJrrrr s