
    7fP;                        d dl mZ d dlmZ d dlmZ d dlmZ d dlmc m	Z
 d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZmZ d dlmZ d	d
lmZ dZd Z G d de
j	                  Z	d Z G d d          ZdS )    )annotations)partial)glob)convert_pathN)Path)IterableIterator)unique_everseen   )SetuptoolsDeprecationWarning)z*.pyizpy.typedc                x    t          j        | t          j        |           j        t          j        z             d S N)oschmodstatst_modeS_IWRITE)targets    Y/home/feoh/.local/pipx/shared/lib/python3.11/site-packages/setuptools/command/build_py.pymake_writabler      s,    HVRWV__,t}<=====    c                       e Zd ZU dZdZded<   dZded<   d Z	 	 	 	 d* fd	Zd Z	d Z
d Zd Zd Zd Zd Zd+d, fdZd-dZd.dZd.dZd Zd Zd/d"Zd# Zd$ Zd% Zd& Zd' Zed0d)            Z xZS )1build_pyaX  Enhanced '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.
    Fbooleditable_modeNz
str | Noneexisting_egg_info_dirc                    t           j                            |            | j        j        | _        | j        j        pi | _        d| j        v r| j        d= g | _        d S )N
data_files)origr   finalize_optionsdistributionpackage_dataexclude_package_data__dict___build_py__updated_filesselfs    r   r    zbuild_py.finalize_options(   s^    &&t,,, -:$($5$J$Pb!4=((l+!r   T   c                   |r\t          t          |                                                    }t          t          |                                                    }t                                          ||||||          S r   )strr   resolvesuper	copy_file)r'   infileoutfilepreserve_modepreserve_timeslinklevel	__class__s          r   r-   zbuild_py.copy_file0   st      	3f--//00F$w--//1122Gww  G]ND%
 
 	
r   c                0   | j         s| j        r| j        rdS | j         r|                                  | j        r(|                                  |                                  |                     t          j        	                    | d                     dS )z?Build modules, packages, and copy data files to build directoryNF)include_bytecode)

py_modulespackagesr   build_modulesbuild_packagesbuild_package_databyte_compiler   r   get_outputsr&   s    r   runzbuild_py.runA   s     	4= 	T5G 	F? 	!   = 	&!!!##%%% 	$-33D53QQRRRRRr   c                    |dk    r |                                  | _        | j        S t          j                            | |          S )zlazily compute data filesr   )_get_data_filesr   r   r   __getattr__)r'   attrs     r   rA   zbuild_py.__getattr__Q   s@    <"2244DO?"}((t444r   c                    t           j                            | |||          \  }}|r| j                            |           ||fS r   )r   r   build_moduler%   append)r'   modulemodule_filepackager/   copieds         r   rD   zbuild_py.build_moduleX   sK    -44T6;PWXX 	1 ''000r   c                |    |                                   t          t          | j        | j        pd                    S )z?Generate list of '(package,src_dir,build_dir,filenames)' tuples )analyze_manifestlistmap_get_pkg_data_filesr8   r&   s    r   r@   zbuild_py._get_data_files^   s6    C0$-2E2FFGGGr   c                    | j                             di            t          t          | j        | j        pd                    S )z
        Generate list of ``(package,src_dir,build_dir,filenames)`` tuples,
        but without triggering any attempt to analyze or build the manifest.
        manifest_filesrK   )r$   
setdefaultrM   rN   rO   r8   r&   s    r   get_data_files_without_manifestz(build_py.get_data_files_without_manifestc   s?     	  !12666C0$-2E2FFGGGr   c                    |                      |          t          j        j        | j        g|                    d          z    }fd|                     |          D             }|||fS )N.c                P    g | ]"}t           j                            |          #S rK   )r   pathrelpath).0filesrc_dirs     r   
<listcomp>z0build_py._get_pkg_data_files.<locals>.<listcomp>u   s9     
 
 
 GOOD'**
 
 
r   )get_package_dirr   rW   join	build_libsplitfind_data_files)r'   rH   	build_dir	filenamesr[   s       @r   rO   zbuild_py._get_pkg_data_filesm   s    &&w// GLDN#3gmmC6H6H#HJ	
 
 
 
,,Wg>>
 
 
	 I55r   c                   |                      | j        ||t                    }t          t	          t
          d          |          }t          j                            |          }t          t          j        j        |          }t          j        | j                            |g           |          }|                     |||          S )z6Return filenames for package's data files in 'src_dir')extra_patternsT)	recursive)_get_platform_patternsr"   _IMPLICIT_DATA_FILESrN   r   r   	itertoolschainfrom_iterablefilterr   rW   isfilerQ   getexclude_data_files)r'   rH   r[   patternsglobs_expandedglobs_matches
glob_filesfiless           r   ra   zbuild_py.find_data_files{   s    ../	 / 
 
 WTT:::HEE!55nEEBGNM::
##GR00
 
 &&w???r   return	list[str]c                    | j         r3t          |                                                                           S t	                                          |          S )1See :class:`setuptools.commands.build.SubCommand`)r   rM   get_output_mappingkeysr,   r=   )r'   r6   r4   s     r   r=   zbuild_py.get_outputs   sM     	://116688999ww""#3444r   dict[str, str]c                    t          j        |                                 |                                           }t	          t          |d                     S )rx   c                    | d         S )Nr   rK   )xs    r   <lambda>z-build_py.get_output_mapping.<locals>.<lambda>   s
    !A$ r   )key)ri   rj    _get_package_data_output_mapping_get_module_mappingdictsorted)r'   mappings     r   ry   zbuild_py.get_output_mapping   sP    /1133$$&&
 
 F7777888r   Iterator[tuple[str, str]]c              #     K   |                                  D ]=\  }}}|                    d          }|                     | j        ||          }||fV  >dS )z5Iterate over all modules producing (dest, src) pairs.rU   N)find_all_modulesr`   get_module_outfiler_   )r'   rH   rF   rG   filenames        r   r   zbuild_py._get_module_mapping   sp      ,0,A,A,C,C 	* 	*(GV[mmC((G..t~wOOH[)))))	* 	*r   c              #     K   | j         D ]R\  }}}}|D ]H}t          j                            ||          }t          j                            ||          }||fV  ISdS )z6Iterate over package data producing (dest, src) pairs.N)r   r   rW   r^   )r'   rH   r[   rb   rc   r   r   srcfiles           r   r   z)build_py._get_package_data_output_mapping   s|      6:o 	( 	(2GWi% ( (i::',,w99w'''''(	( 	(r   c                    |                                  D ]_\  }}|                     t          j                            |                     |                     ||          \  }}t          |           `dS )z$Copy data files into build directoryN)r   mkpathr   rW   dirnamer-   r   )r'   r   r   _outf_copieds        r   r;   zbuild_py.build_package_data   ss    #DDFF 	" 	"OFGKK//000!^^GV<<NE7&!!!!	" 	"r   c                z   i x| _         }| j        j        sd S i }| j        pdD ]'}||t	          |                     |                    <   (t          | dd           rgt          | j        d          	                                r@| j        }t          |d          }|
                    d                                          }n=|                     d           |                     d          }|j        }|j        j        }t#                      }|                     ||          D ]}	t&          j                            t	          |	                    \  }
}d }|}|
rZ|
|k    rT|
|vrP|
}t&          j                            |
          \  }
}t&          j                            ||          }|
r
|
|k    r|
|vP|
|v r||k    r|                    |          rn3|                    ||
         |          }|r|                    |           |                    ||
         g                               |	           d S )NrK   r   zSOURCES.txtzutf-8)encodingegg_info)rQ   r!   include_package_datar8   assert_relativer]   getattrr   r   exists	read_text
splitlinesrun_commandget_finalized_commandr   filelistrt   _IncludePackageDataAbuse_filter_build_filesr   rW   r`   r^   	is_moduleimportable_subpackagewarnrR   rE   )r'   mfsrc_dirsrH   egg_info_dirmanifestrt   ei_cmdcheckrW   dfprevoldfdf
importables                   r   rL   zbuild_py.analyze_manifest   s_   #%%b 5 	F}* 	O 	OGGNH_T%9%9'%B%BCCDD D1488	*T/??FFHH	*  5LL-88H&&&88CCEEEEZ(((//
;;F!?LO)E(**,,ULAA 	< 	<D7==!6!677DAqDD (T		ax&7&7a((2GLLQ''  (T		ax&7&7 H}}99q)) ! ! "'!<!<Xa[!!L!LJ! /

:...hqk2..55d;;;!	< 	<r   rt   Iterable[str]r   r*   Iterator[str]c              #  <  K   |                      d          }|| j        |j        |j        f}d |D             }|D ]_}t          j                            |          t          j                            |          rt          fd|D                       r|V  `dS )a}  
        ``build_meta`` may try to create egg_info outside of the project directory,
        and this can be problematic for certain plugins (reported in issue #3500).

        Extensions might also include between their sources files created on the
        ``build_lib`` and ``build_temp`` directories.

        This function should filter this case of invalid files out.
        buildc                P    g | ]#}|t           j                            |          $S rK   )r   rW   normpath)rY   ps     r   r\   z0build_py._filter_build_files.<locals>.<listcomp>   s-    BBBQBRW%%a((BBBr   c              3      K   | ]}|vV  	d S r   rK   )rY   r   	norm_paths     r   	<genexpr>z/build_py._filter_build_files.<locals>.<genexpr>   s(      -T-TQay.@-T-T-T-T-T-Tr   N)	r   r_   
build_temp
build_baser   rW   r   isabsall)r'   rt   r   r   
build_dirs	norm_dirsrZ   r   s          @r   r   zbuild_py._filter_build_files   s       **7330@%BRS
BB*BBB	 	 	D((..I7==&& #-T-T-T-T)-T-T-T*T*T 


	 	r   c                    d S r   rK   r&   s    r   get_data_fileszbuild_py.get_data_files   s    r   c                   	 | j         |         S # t          $ r Y nw xY wt          j                            | ||          }|| j         |<   |r| j        j        s|S | j        j        D ]"}||k    s|                    |dz             r n#|S t          |d          5 }|	                                }ddd           n# 1 swxY w Y   d|vr#t          j                            d|d          |S )z8Check namespace packages' __init__ for declare_namespacerU   rbNs   declare_namespacezNamespace package problem: z 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KeyErrorr   r   check_packager!   namespace_packages
startswithopenread	distutilserrorsDistutilsError)r'   rH   package_dirinit_pypkgr   contentss          r   r   zbuild_py.check_package   si   	(11 	 	 	D	 ---dG[II)0g& 	d/B 	N$7 	 	Cg~~#!>!>~  N'4   	 AvvxxH	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 x//"111 <C77E   s    
B<<C C c                n    i | _         t          j                            |            d| _        d | _        d S )NF)r   r   r   initialize_optionsr   r   r&   s    r   r   zbuild_py.initialize_options  s6     "((..."%)"""r   c                    t           j                            | |          }| j        j        *t
          j                            | j        j        |          S |S r   )r   r   r]   r!   src_rootr   rW   r^   )r'   rH   ress      r   r]   zbuild_py.get_package_dir  sF    m++D'::%17<< 1 :C@@@
r   c                (   t                    |                     | j        ||          }fd|D             }t          j                            |          }t          |          fdD             }t          t          |                    S )z6Filter filenames for package's data files in 'src_dir'c              3  B   K   | ]}t          j        |          V  d S r   )fnmatchrl   )rY   patternrt   s     r   r   z.build_py.exclude_data_files.<locals>.<genexpr>"  s/      OO7ug66OOOOOOr   c              3  $   K   | ]
}|v|V  d S r   rK   )rY   fnbads     r   r   z.build_py.exclude_data_files.<locals>.<genexpr>&  s'      77"3277r   )rM   rg   r#   ri   rj   rk   setr
   )	r'   rH   r[   rt   rp   match_groupsmatcheskeepersr   s	      `    @r   ro   zbuild_py.exclude_data_files  s    U..%
 

 POOOhOOO///=='ll7777777OG,,---r   rK   c                    t          j        ||                     dg           |                     |g                     }fd|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.
         c              3  r   K   | ]1}t           j                            t          |                    V  2d S r   )r   rW   r^   r   )rY   r   r[   s     r   r   z2build_py._get_platform_patterns.<locals>.<genexpr>7  sQ       
 
  GLL,w"7"788
 
 
 
 
 
r   )ri   rj   rn   )specrH   r[   re   raw_patternss     `  r   rg   zbuild_py._get_platform_patterns*  sh     !HHRHHWb!!
 


 
 
 
 (
 
 
 	
r   )TTNr(   )T)ru   rv   )ru   r{   )ru   r   )rt   r   r   r*   ru   r   )rK   )__name__
__module____qualname____doc__r   __annotations__r   r    r-   r>   rA   rD   r@   rS   rO   ra   r=   ry   r   r   r;   rL   r   r   r   r   r]   ro   staticmethodrg   __classcell__)r4   s   @r   r   r      s           M(,,,,," " " 
 
 
 
 
 
"S S S 5 5 5  H H H
H H H6 6 6@ @ @$5 5 5 5 5 5 59 9 9 9* * * *( ( ( (" " "'< '< '<R   &    <* * *  . . .  
 
 
 \
 
 
 
 
r   r   c                    t           j                            |           s| S ddlm} t          j        d                                          | z  } ||          )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   rW   r   distutils.errorsr   textwrapdedentlstrip)rW   r   msgs      r   r   r   >  sp    7== 444444 			
 		
 &((

	  
c
"
""r   c                  F    e Zd ZdZ G d de          Zd Zd Zd Zd Z	dS )	r   z>Inform users that package or module is included as 'data file'c                      e Zd ZdZdZdS )!_IncludePackageDataAbuse._WarningzU
        Package {importable!r} is absent from the `packages` configuration.
        a|  
        ############################
        # Package would be ignored #
        ############################
        Python recognizes {importable!r} as an importable package[^1],
        but it is absent from setuptools' `packages` configuration.

        This leads to an ambiguous overall configuration. If you want to distribute this
        package, please make sure that {importable!r} is explicitly added
        to the `packages` configuration field.

        Alternatively, you can also rely on setuptools' discovery methods
        (for example by using `find_namespace_packages(...)`/`find_namespace:`
        instead of `find_packages(...)`/`find:`).

        You can read more about "package discovery" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html

        If you don't want {importable!r} to be distributed and are
        already explicitly excluding {importable!r} via
        `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`,
        you can try to use `exclude_package_data`, or `include-package-data=False` in
        combination with a more fine grained `package-data` configuration.

        You can read more about "package data files" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/datafiles.html


        [^1]: For Python, any directory (with suitable naming) can be imported,
              even if it does not contain any `.py` files.
              On the other hand, currently there is no concept of package data
              directory, all directories are treated like packages.
        N)r   r   r   _SUMMARY_DETAILSrK   r   r   _Warningr   V  s        "r   r   c                ,    t                      | _        d S r   )r   _already_warnedr&   s    r   __init__z!_IncludePackageDataAbuse.__init__  s    "uur   c                    |                     d          o)|d t          d                                                    S )Nz.py)endswithlenisidentifier)r'   rZ   s     r   r   z"_IncludePackageDataAbuse.is_module  s6    }}U##J]E

{](;(H(H(J(JJr   c                    t          |          j        }t          t          j        t
          j        |j                            }|rd                    |g|          S d S )NrU   )	r   parentrM   ri   	takewhiler*   r   partsr^   )r'   r  rZ   r   r  s        r   r   z._IncludePackageDataAbuse.importable_subpackage  sV    4jjY()939EEFF 	.88V,e,---tr   c                    || j         vr7| j                            |           | j                             |           d S d S )N)r   )r   r   emitadd)r'   r   s     r   r   z_IncludePackageDataAbuse.warn  sN    T111M*555 $$Z00000 21r   N)
r   r   r   r   r   r   r   r   r   r   rK   r   r   r   r   S  s        HH' ' ' ' '/ ' ' 'V% % %K K K  1 1 1 1 1r   r   )
__future__r   	functoolsr   r   distutils.utilr   distutils.command.build_pycommandr   r   r   r   r   r   r   ri   r   pathlibr   typingr   r	   more_itertoolsr
   warningsr   rh   r   r   r   rK   r   r   <module>r     s   " " " " " "             ' ' ' ' ' ' ) ) ) ) ) ) ) ) ) 				                  % % % % % % % % * * * * * * 3 3 3 3 3 3 - > > >`
 `
 `
 `
 `
t} `
 `
 `
F	# # #*>1 >1 >1 >1 >1 >1 >1 >1 >1 >1r   