3 ]|% @sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZmZyddlmZWn"ek rGdddZYnXGd d d ejeZdd d Zd dZdS))glob) convert_pathN)six)mapfilter filterfalse) Mixin2to3c@seZdZdddZdS)rTcCsdS)z do nothingN)selffilesZdoctestsr r A/tmp/pip-build-8jg9gmni/setuptools/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. cCsFtjj||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_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 |dddS)z?Build modules, packages, and copy data files to build directoryNFTr)Zinclude_bytecode) py_modulespackagesZ build_modulesZbuild_packagesbuild_package_datar rr byte_compilerr 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|tjr|jd}tjj||||\}}|rB|jj |||fS)N.) rPY2 isinstance string_typessplitrr build_modulerappend)r moduleZ module_filepackageoutfilecopiedr r r r)Fs    zbuild_py.build_modulecCs|jtt|j|jpfS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)analyze_manifestlistr_get_pkg_data_filesr)r r r r r!Pszbuild_py._get_data_filescsJ|j|tjj|jg|jd}fdd|j|D}|||fS)Nr$csg|]}tjj|qSr )ospathrelpath).0file)src_dirr r ^sz0build_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_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 itertoolschain from_iterablerr2r3isfilemanifest_filesgetexclude_data_files)r r,r7patternsZglobs_expandedZ globs_matchesZ glob_filesr r r r r<cs   zbuild_py.find_data_filesc Csx|jD]\}}}}xr|D]j}tjj||}|jtjj|tjj||}|j||\}} tjj|}| r||jj kr|j j |qWqWdS)z$Copy data files into build directoryN) rr2r3r:mkpathdirname copy_fileabspathrZconvert_2to3_doctestsrr*) r r,r7r=r>filenametargetsrcfileoutfr.r r r rts   zbuild_py.build_package_datac Csi|_}|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 | |}qW||kr^|jdr|| krq^|j||gj|q^WdS)Negg_infoz.py)rDrZinclude_package_datarassert_relativer9 run_commandget_finalized_commandfilelistr r2r3r(r:endswith setdefaultr*) r ZmfZsrc_dirsr,Zei_cmdr3dfprevZoldfZdfr r r r/s(   zbuild_py.analyze_manifestcCsdS)Nr )r r r r get_data_filesszbuild_py.get_data_filescCsy |j|Stk rYnXtjj|||}||j|<| sJ|jj rN|Sx,|jjD]}||ksr|j|drXPqXW|Stj |d}|j }WdQRXd|krt j 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 distutilserrorsDistutilsError)r r, package_dirZinit_pypkgrXcontentsr r r r^s&   zbuild_py.check_packagecCsi|_tjj|dS)N)r\rrinitialize_options)r r r r riszbuild_py.initialize_optionscCs0tjj||}|jjdk r,tjj|jj|S|S)N)rrr9rZsrc_rootr2r3r:)r r,resr r r r9s zbuild_py.get_package_dircs\t|j|j||}fdd|D}tjj|}t|fddD}tt|S)z6Filter filenames for package's data files in 'src_dir'c3s|]}tj|VqdS)N)fnmatchr)r5pattern)r r r sz.build_py.exclude_data_files..c3s|]}|kr|VqdS)Nr )r5fn)badr r rms)r0r?rr@rArBset_unique_everseen)r r,r7r rGZ match_groupsmatchesZkeepersr )ror r rFs   zbuild_py.exclude_data_filescs.tj|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)r5rl)r7r r rmsz2build_py._get_platform_patterns..)r@rArE)specr,r7Z raw_patternsr )r7r r?s   zbuild_py._get_platform_patternsN)rrr__doc__rr r"r)r!r1r<rr/rZr^rir9rF staticmethodr?r 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)rpaddr __contains__)iterablekeyseenZseen_addelementkr r r rqs  rqcCs:tjj|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.errorsr~textwrapdedentlstrip)r3r~msgr r r rQs   rQ)N)rdistutils.utilrZdistutils.command.build_pycommandrrr2rkrr`rrcr@Zsetuptools.externrZsetuptools.extern.six.movesrrrZsetuptools.lib2to3_exr ImportErrorrqrQr r r r s$    Y