K i4XlddlZddlZddlmZddlmZddlmZddlZ ddl Z ddl m Z ddl Z ddlmZddlmZmZddlmZdd lmZd d lmZd d lmZmZmZd d lmZddlZ GddZ!GddZ"GddZ#GddZ$GddZ%GddZ&dZ'dZ(dZ)dZ*dZ+dZ,d Z-d!Z.y)"N) ConfigParser)product)cast)Path)sdist)find_package_pathfind_parent_package) Distribution)PackageDiscoveryError)quiet)get_sdist_membersget_wheel_membersrun)DALSceZdZdZdZy)TestFindParentPackagec|dz jdd|dz j|dz jgd}t|ddi|d k(sJy) Nzsrc/namespace/pkg/nestedTexist_okparentsz$src/namespace/pkg/nested/__init__.pyzsrc/namespace/pkg/__init__.py) namespace namespace.pkgznamespace.pkg.nestedsrcrmkdirtouchr )selftmp_pathpackagess l/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/setuptools/tests/test_config_discovery.pytest_single_packagez)TestFindParentPackage.test_single_packages_ . .55tT5R : :AAC 3 3::<I"8b%[(CVVVcgd}|D]2}|d|z jdd|d|dz j4t|ddi|Jy)N)pkgpkg1pkg2src/Trz /__init__.pyrrr)rr multiplenames r"test_multiple_toplevelz,TestFindParentPackage.test_multiple_toplevel!sk+ ;D $tf % , ,dD , I $tfL1 1 8 8 : ;#8b%[(CKKKr$N)__name__ __module__ __qualname__r#r,r$r"rrsWLr$rc eZdZdZddidgddddiiddgid dgidd d giiiiid Zd dgddgddgdgdgdZdZejjdejdZ ejjdejdZ e de de de ddZejjdegd dd gejd!Zejjd"d#gdhfd$gdd%hfd&gdd'hfd(ghd)fd*gdd+hfd,gdhfd-gdhfgd.Zejjd/d0gd1ggd2Zd3Zd4Zd5Zy6)7 TestDiscoverPackagesAndPyModuleszMake sure discovered values for ``packages`` and ``py_modules`` work similarly to explicit configuration for the simple scenarios. rrr&) package_dirr!r3libr! py_modulesnszns.pkg) z explicit-srcz variation-libz explicit-flatzexplicit-single_modulezexplicit-namespacez automatic-srczautomatic-flatzautomatic-single_modulezautomatic-namespacesrc/pkg/__init__.pyzsrc/pkg/main.pyzlib/pkg/__init__.pyzlib/pkg/main.pyzpkg/__init__.pyz pkg/main.pypkg.pyzns/pkg/__init__.py)rr4flat single_modulercp|jd\}}}|j|}|j|}||fS)N-) partitionFILESOPTIONS)r circumstance_layoutfilesoptionss r" _get_infoz*TestDiscoverPackagesAndPyModules._get_infoFs>#--c2 1f 6",,|,g~r$r@c, |j|\}}t|||t||\}}|jjDcgc]"}|j t jd$}}|D] t fd|DrJycc}w)N/c3@K|]}|jywN)endswith).0ffiles r" zGTestDiscoverPackagesAndPyModules.test_sdist_filelist..Us:Aqzz$':s) rE_populate_project_dir_run_sdist_programaticallyfilelistrCreplaceossepany) rr r@rCrDrAcmdrLmanifestrMs @r"test_sdist_filelistz4TestDiscoverPackagesAndPyModules.test_sdist_filelistLs 5whw7+Hg>347LL4F4FGqAIIbffc*GG ;D::: :: ;Hs 'Bch|j|\}}t||||dz j|dz j|dz j|dz j|dz j|dz j|dz j|dz jt |t t |jd }td td j||t|k\sJtt |jd }td td j||Dchc]$}|jddjdd&}}||k\sJ|D]} d|vsJd|vrJycc}w)Nbuildz build/libzbuild/bdist.linux-x86_64z build/bdist.linux-x86_64/file.pyzbuild/lib/__init__.pyzbuild/lib/file.pydistz dist/file.py dist/*.tar.gz~~~~~ sdist_members ~~~~~ dist/*.whl~~~~~ wheel_members ~~~~~r)rlib/) rErOrr _run_buildrnextglobprintjoinsetrrR) rr r@rCrD sdist_files wheel_filesrL orig_filesrMs r" test_projectz-TestDiscoverPackagesAndPyModules.test_projectWs 5whw7 G ""$ K &&( . .557 6 6==? + +224 ' '..0 F !!# N "))+8'X]]?-K(LM  )* dii $%c%j((('X]]<-H(IJ  )* dii $%INOAaii+33FB?O Oj(((  'D%' ''& && ' Ps))F/z [metadata] name = myproj version = 0.0.0 [options] {param} = z __import__('setuptools').setup( name="myproj", version="0.0.0", {param}=[] ) z [build-system] requires = [] build-backend = 'setuptools.build_meta' [project] name = "myproj" version = "0.0.0" [tool.setuptools] {param} = [] zv [build-system] requires = [] build-backend = 'setuptools.build_meta' ) setup.cfgsetup.pypyproject.tomltemplate-pyproject.toml) config_fileparamr@)rlrmrnc|j|gdz}t||i|dk(r|jdd}n'|jd}|dz j |d|}|j|j |}||z j |dt |i} t| |gk(sJd d d |} t| | Jy) N)zmod.pyzother.pyr7rnrAr<routf-8encoding)rqr!r5)r5r!)r>rOrRPURPOSEFULLY_EMPY write_textformat _get_distgetattr) rr rprqr@rCtemplate_param pyprojectconfigr[others r"test_purposefully_emptyz8TestDiscoverPackagesAndPyModules.test_purposefully_emptys <(+XXhr2 * *"]]34N../HII ( ( 4 4Y 4 Q"N'' 4;;.;Q K ++FW+E2&tU#r))))|DUKtU#+++r$) extra_filespkgszvenv/bin/simulate_venvzpkg-stubs/__init__.pyiz pkg-stubszother-stubs/__init__.pyiz other-stubsz namespace-stubs/pkg/__init__.pyi>namespace-stubs.pkgr&namespace-stubsz&namespace-stubs/pkg-stubs/__init__.pyirz_hidden/file.pyznews/finalize.pyc|jd|z}t||it|i}t|j|k(sJy)Nr9)r>rOryrgr!)rr rrrCr[s r"!test_flat_layout_with_extra_fileszBTestDiscoverPackagesAndPyModules.test_flat_layout_with_extra_filessF* 6"[0hr22&4==!T)))r$rzother/__init__.pyzother/finalize.pyc|jd|z}t||itjtd5t |idddy#1swYyxYw)Nr9multiple (packages|modules)matchr>rOpytestraisesr ry)rr rrCs r"+test_flat_layout_with_dangerous_extra_fileszLTestDiscoverPackagesAndPyModules.test_flat_layout_with_dangerous_extra_filessR 6"[0hr2 ]]08U V $ h # $ $ $s AAc|jddgz}t||it|i}t|jdhk(sJy)Nr:zinvalid-module-name.pyr&)r>rOryrgr5)rr rCr[s r"#test_flat_layout_with_single_modulezDTestDiscoverPackagesAndPyModules.test_flat_layout_with_single_modulesJ ?+/G.HHhr22&4??#w...r$c|jddgz}t||itjtd5t |idddy#1swYyxYw)Nr:zvalid_module_name.pyrrr)rr rCs r"&test_flat_layout_with_multiple_moduleszGTestDiscoverPackagesAndPyModules.test_flat_layout_with_multiple_modulessT ?+/E.FFhr2 ]]08U V $ h # $ $ $s AAcpddlm}d}|dz jt|d|dz j t j jj|5|jdd d d tt|jd }d|vsJy #1swY3xYw) zRegression for issue 3692r) build_metaz%[project] name = "test" version = "1"rnrsrtzfoo.py.Nz*.whl) setuptoolsrrwrrjaracopathDirectoryStackcontext build_wheelrrcrd)rr rr|ris r"%test_py_modules_when_wheel_dir_is_cwdzFTestDiscoverPackagesAndPyModules.test_py_modules_when_wheel_dir_is_cwds)= $ $00i70S H ##% [[ ' ' ) 1 1( ; (  " "3 ' ((X]]7-C(DE ;&&&  ( (s (B,,B5N)r-r.r/__doc__r?r>rErmark parametrizekeysrXrkrrvrrrrrrrr0r$r"r2r2+sM *,U %I B; %ug.#/%"9)D(+;<#%! G&'89%'89"M2"*+  E  [[^W\\^<;=; [[^W\\^<'='B        $( $ E)V [[0 7  & JJL ,,, [[& '% 1& '%)= >( )E=+A B44A ::)*   5' * !E7 + (*)(*  [[ ! ! $$ / $ 'r$r2ceZdZdZdgdgddgddgdgd gd Zej jd ejd Z d Z y) TestNoConfigz0.0.0z src/pkg1.pyzsrc/pkg2/__init__.pyzsrc/pkg3/__init__.pyzsrc/pkg3-stubs/__init__.pyzpkg4/__init__.pyzpkg4-stubs/__init__.pyzsrc/ns/nested/pkg1/__init__.pyzns/nested/pkg2/__init__.py)r'r(pkg3pkg4zns.nested.pkg1zns.nested.pkg2exampleczt||j|it|i}|j|k(sJyrI)rOEXAMPLESryget_name)rr rr[s r"test_discover_namezTestNoConfig.test_discover_names7h g(>C2&}}')))r$cdg}t||it|d|d|jdz }|jsJy)Nzsrc/ns/nested/pkg/__init__.py--sdistzdist/ns_nested_pkg-z.tar.gz)rOrbDEFAULT_VERSIONis_file)rr rC dist_files r"test_build_with_discovered_namez,TestNoConfig.test_build_with_discovered_namesM01hr28Y'!4T5I5I4J'RR   """r$N) r-r.r/rrrrrrrrr0r$r"rrsiO'(')EF#%=>;<78 H [[Y 8*9* #r$rcleZdZejj ddifddddidfgdZdZy ) TestWithAttrDirective)folderoptsrr4zfind:where)r! packages.findc*|ddg}t||||dz jd}|dddiidd|zi}tjj || t |i}|j dk(sJ|jd k(sJ|jsJtd|j|}tjj|sJ|t|jvsJt|d |d z } | jsJy) Nz/pkg/__init__.pyrlrsrtr& __init__.py version = 42z'[metadata] version = attr: pkg.version prefix42rzdist/pkg-42.tar.gz)rO read_textrrrZryr get_versionr3rrSexistsrpartsrbr) rr rrrCr} overwriter[ package_pathrs r"test_setupcfg_metadataz,TestWithAttrDirective.test_setupcfg_metadatas'8+,k:ht4[(33W3E U]N;< DvM   )H52&}}%'''!T)))(0@0@(K ww~~l+++l+1133338Y'33   """r$ct|dgidddiidd}tjj||t |i}|j dk(sJ|j d d ik(sJy) Nr7r&rrzh[project] name = 'pkg' dynamic = ['version'] [tool.setuptools.dynamic] version = {attr = 'pkg.version'} rrnrrrr)rOrrrZryrr3)rr rr[s r"test_pyproject_metadataz-TestWithAttrDirective.test_pyproject_metadata<sh)>(?DM>:;P   )H52&!T)))B;...r$N)r-r.r/rrrrrr0r$r"rrsI [[ BK GU;KL M ##./r$rceZdZdZdZdZy)TestWithCExtensionchgd}t||id}|dz jt|dy)N) zbenchmarks/file.pyz docs/Makefilezdocs/requirements.txtzdocs/source/conf.pyz proj/header.hz proj/file.pyz py/proj.cppz py/other.cppz py/file.pyz py/py.typedzpy/tests/test_proj.pyz README.rsta^ from setuptools import Extension, setup ext_modules = [ Extension( "proj", ["py/proj.cpp", "py/other.cpp"], include_dirs=["."], language="c++", ), ] setup(ext_modules=ext_modules) rmrsrtrOrwr)rr rC setup_scripts r" _simulate_package_with_extensionz3TestWithCExtension._simulate_package_with_extensionNs=   hr2   J **4 +=*Pr$c|j|d}|dz jt|dd}|dz jt|dt|i}|j dk(sJ|j dk(sJ|j J|jJt|jd k(sJ|jd jdk(sJy ) zEnsure that auto-discovery is not triggered when the project is based on C-extensions only, for backward compatibility. zr [build-system] requires = [] build-backend = 'setuptools.build_meta' rnrsrtzQ [metadata] name = proj version = 42 rlprojrNr r) rrwrryrrr5r!len ext_modulesr+)rr r|setupcfgr[s r"*test_skip_discovery_with_setupcfg_metadataz=TestWithCExtension.test_skip_discovery_with_setupcfg_metadataos --h7 $ $00i70S  K ++DNW+M2&}}&(((!T)))&&&}}$$$4##$)))"''6111r$c|j|d}|dz jt|dtjt d5t |idddy#1swYyxYw)aWhen opting-in to pyproject.toml metadata, auto-discovery will be active if the package lists C-extensions, but does not configure py-modules or packages. This way we ensure users with complex package layouts that would lead to the discovery of multiple top-level modules/packages see errors and are forced to explicitly set ``packages`` or ``py-modules``. zT [project] name = 'proj' version = '42' rnrsrtrrN)rrwrrrr ry)rr r|s r"0test_dont_skip_discovery_with_pyproject_metadatazCTestWithCExtension.test_dont_skip_discovery_with_pyproject_metadatasg --h7 $ $00i70S ]]08U V $ h # $ $ $s  A$$A-N)r-r.r/rrrr0r$r"rrMsQB28$r$rc eZdZdZdZdZdZejjddde eifdde eifd de eifd de eifd de ee d zifd de ee d zifgd Z y )TestWithPackageDatac||d|d|dg}t||id}|dz jt|dy)Nz/proj/__init__.py/proj/file1.txt/proj/nested/file2.txtz/ global-include *.py *.txt z MANIFEST.inrsrtr)rr src_rootrCrWs r"!_simulate_package_with_data_filesz5TestWithPackageData._simulate_package_with_data_filess\j) *j (j. /  hr2  M !--d8nw-Or$zd [metadata] name = proj version = 42 [options] include_package_data = True z8 [project] name = "proj" version = "42" z: [tool.setuptools] package-dir = {"" = "src"} )rrCrrlrnrz packages = find: package_dir = =src [options.packages.find] where = src zv [tool.setuptools] package-dir = {"" = "src"} c6tjj|t||j ||t jj |djt jdt jj |djt jdh}t|tt|jd}tdtdj|||k\sJtt|jd}td tdj||Dchc]$}|jd d jd d &}}||k\sJy cc}w)zq Make sure auto-discovery does not affect package include_package_data. See issue #3196. rrrGrr\r]r^r_r`r)rraN)rrrZstrrrSnormpathrRrTrbrrcrdrerfr) rr rrCexpectedrhrirLrjs r"test_include_package_dataz-TestWithPackageData.test_include_package_datasJT  %H 6 ..xB GG  z9 : B B2663 O GG  z)?@ A I I"&&RU V  8'X]]?-K(LM  )* dii $%h&&&'X]]<-H(IJ  )* dii $%IQRAaii+33FB?R Rj(((Ss#)FN) r-r.r/rEXAMPLE_SETUPCFGEXAMPLE_PYPROJECTPYPROJECT_PACKAGE_DIRrrrrrr0r$r"rrs P   [[ ;%5 67 8 #T*;%<= > [$'7"89 : %t,='>? @&6!7  "  "$d+<&=' +! $J)K$J)r$rcgd}t||iti}t|_|j |j J|j Jy)N)zdir1/__init__.pyzdir2/__init__.pyzfile.py)rOr object configuration set_defaultsr5r!)r rCr[s r"(test_compatible_with_numpy_configurationrsW E (E2.  DD ?? "" " ==  r$ctjjdditi}dg|_|j |j |jdk(sJy)Nr8rz--namer&)rrrZr script_argsrparse_command_liner) tmpdir_cwdr[s r"$test_name_discovery_doesnt_break_clirsX KKxn%  D zD ==?e ## #r$crdddiitdd}tjj|t ij j fd}|jj d|jjdk(sJtjdhk(sJy ) a According to #3545 it seems that ``name`` discovery is running, even when the project already explicitly sets it. This seems to be related to parsing of dynamic versions (via ``attr`` directive), which requires the auto-discovery of ``package_dir``. r&rz__version__ = 42 z [project] name = "myproj" # purposefully different from package name dynamic = ["version"] [tool.setuptools.dynamic] version = {"attr" = "pkg.__version__"} rc>jdk(sJy)Nmyproj)r)r[orig_analyse_namesr"spy_analyse_namezJtest_preserve_explicit_name_with_dynamic_version..spy_analyse_name/s }}(***r$ analyse_namerN) rrrrZr rrsetattrparse_config_filesrrgr!)r monkeypatchrCrr[rs @@r"0test_preserve_explicit_name_with_dynamic_versionrs M#78   E KKe  D))66+ ))>;KL     %% % t}} % (( (r$cdddd}tjj|t|fd|D}|D]/}|jj dd|j 1y) Nz$import setuptools setuptools.setup()z# Example PackagezCopyright (c) 2018)rmz README.mdLICENSErc3(K|] }|z  ywrIr0)rKrLroots r"rNz(_populate_project_dir..Fs %!TAX %sTr)rrrZ_write_setupcfgparentrr)rrCrDbasicpathsrs` r"rOrO;sq <(' E  KKeD)D'" %u %E 46 r$c|s tdyt}|jd|jD]\}}|dk(r,|jd||d|j |7t |t rdj||d|<_t |tr2djd|jD}d|z|d|<t||d|<t|dz d d 5}|j|dddtd t|dz jd y#1swY3xYw) Nz~~~~~ **NO** setup.cfg ~~~~~rDrzoptions.z, r^c32K|]\}}d|d|yw) z = Nr0)rKkvs r"rNz"_write_setupcfg..Ys !KTQBqcQC.!Ksrlwrsrtz~~~~~ setup.cfg ~~~~~) rer add_sectionitemsupdate isinstancelistrfdictropenwriter)rrDrkeyvalue str_valuerLs r"rrLs=  ,-~H #mmo 2 U / !  8C5!1 2 xu% & - -e 4 t $'+yy'7HY  $ t $ !KU[[]!KKI'+i'7HY  $'*5zHY  $ 2 d[ # 8Aq !" 4+  ( (' ( :;s ?EE cbtjdddg|t|}t|ddiS)Nz-mrZz--no-isolationDISTUTILS_DEBUGr)env)sys executablerr)rflagsrVs r"rbrbcs6 >>4*: NU NCI NC s*B/ 00r$c djtjj|}|dz }|j rEt |5t ttjjdid}dddn t|}|_ d|_ t |5|jddd|j|S#1swYMxYw#1swY'xYw)NrGrminit) stop_after)rfrSrsplitrrrr distutilscore run_setupr script_namerr) dist_pathattrsrscriptr[s r"ryryhs 88BGGMM), -D  #F }} )_ ((RF(KD   E"DM!D i" !"  K  ""s1C-C$C!$C-cXt||}t|}|j|jjs|jj sJt 5t|5|jdddddd||fS#1swYxYw#1swY||fSxYwrI) ryrensure_finalized distributionr!r5r rr)rrr[rVs r"rPrP~s Y &D +C    $ $(8(8(C(CC C $y/   9 9s$ B,B=BB BB))/rSr configparserr itertoolsrtypingr jaraco.pathrrrrrsetuptools.command.sdistrsetuptools.discoveryrr setuptools.distr setuptools.errorsr contextsr integration.helpersrrrtextwraprdistutils.corerrr2rrrrrrrrOrrbryrPr0r$r"r/s % *G(3JJLL&T'T'n##6-/-/`O$O$d^)^)B !$!)H"<.1 , r$