o
    ¯N i%.  ã                   @   sÞ   d dl 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mZ d dl	Z	d dl
mZ ej ej eddd¡¡ZG dd„ dejƒZG dd	„ d	ejƒZG d
d„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdS )é    )Úabsolute_importN)Úcontent)Úutilz..c                       s(   e Zd ZdZdd„ Z‡ fdd„Z‡  ZS )ÚChdirzaDive into given directory and return back on cleanup.

    :ivar path: The target directory.
    c                 C   s
   || _ d S ©N)Úpath)Úselfr   © r	   úF/home/ubuntu/.local/lib/python3.10/site-packages/pbr/tests/fixtures.pyÚ__init__?   s   
zChdir.__init__c                    s0   t t| ƒ ¡  |  tjt ¡ ¡ t | j¡ d S r   )Úsuperr   ÚsetUpÚ
addCleanupÚosÚchdirÚgetcwdr   ©r   ©Ú	__class__r	   r
   r   B   s   zChdir.setUp©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__r	   r	   r   r
   r   9   s    r   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚCapturedSubprocessaf  Run a process and capture its output.

    :attr stdout: The output (a string). Only set if the process fails.
    :attr stderr: The standard error (a string). Only set if the process fails.
    :attr returncode: The return code of the process.

    Note that stdout and stderr are decoded from the bytestrings subprocess
    returns using error=replace
    c                    sH   t t| ƒ ¡  || _|| _|| _tj| jd< tj| jd< tj| jd< dS )zÞCreate a CapturedSubprocess.

        :param label: A label for the subprocess in the test log. E.g. 'foo'.
        :param *args: The *args to pass to Popen.
        :param **kwargs: The **kwargs to pass to Popen.
        ÚstderrÚstdinÚstdoutN)r   r   r   ÚlabelÚargsÚkwargsÚ
subprocessÚPIPE)r   r   r    r!   r   r	   r
   r   S   s   zCapturedSubprocess.__init__c                    sî   t t| ƒ ¡  tj ¡ }d|d< || jd< tj| j	i | j¤Ž}| 
¡ \}}| dd¡| _| dd¡| _|  | jd t | j¡¡ |  | jd t | j¡¡ |j| _|jr`td| j	| j|jf ƒ‚|  t| d	¡ |  t| d
¡ |  t| d¡ d S )NÚignoreÚPYTHONWARNINGSÚenvzutf-8Úreplacez-stdoutz-stderrz0Failed process args=%r, kwargs=%r, returncode=%sÚoutÚerrÚ
returncode)r   r   r   r   ÚenvironÚcopyr!   r"   ÚPopenr    ÚcommunicateÚdecoder(   r)   Ú	addDetailr   r   Útext_contentr*   ÚAssertionErrorr   Údelattr)r   r&   Úprocr(   r)   r   r	   r
   r   b   s(   

ÿÿzCapturedSubprocess.setUpr   r	   r	   r   r
   r   H   s    
r   c                       sF   e Zd ZdZ‡ fdd„Z‡ fdd„Zddd„Zd	d
„ Zdd„ Z‡  Z	S )ÚGitRepozäA git repo for testing with.

    Use of TempHomeDir with this fixture is strongly recommended as due to the
    lack of config --local in older gits, it will write to the users global
    configuration without TempHomeDir.
    c                    s   t t| ƒ ¡  || _d S r   )r   r5   r   Ú_basedir)r   Úbasedirr   r	   r
   r      s   
zGitRepo.__init__c                    s>   t t| ƒ ¡  t g d¢| j¡ t ¡  t g d¢| j¡ d S )N)ÚgitÚinitÚ.)r8   Úaddr:   )r   r5   r   r   Úrun_cmdr6   Ú
config_gitr   r   r	   r
   r   …   s   zGitRepo.setUpútest commitc                 C   sZ   t t | j¡ƒ}| jd|  }t|dƒ ¡  t dd|g| j¡ t ddd|g| j¡ d S )Nz/%dÚwtr8   r;   Úcommitú-m)Úlenr   Úlistdirr6   ÚopenÚcloser   r<   )r   Úmessage_contentÚfilesr   r	   r	   r
   r@   ‹   s
   zGitRepo.commitc                 C   s   t  g d¢| j¡ d S )N)r8   Úresetz--hardzHEAD^©r   r<   r6   r   r	   r	   r
   Úuncommit’   s   zGitRepo.uncommitc                 C   s   t  dddd|g| j¡ d S )Nr8   Útagz-smztest tagrI   )r   Úversionr	   r	   r
   rK   •   s   zGitRepo.tag)r>   )
r   r   r   r   r   r   r@   rJ   rK   r   r	   r	   r   r
   r5   y   s    
r5   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚGPGKeyzxCreates a GPG key for testing.

    It's recommended that this be used in concert with a unique home
    directory.
    c           
         sj  t t| ƒ ¡  |  t dt d¡¡¡ |  t ¡ ¡}t	 
d¡}t ddg|j¡}|d  d¡D ]}| |¡}|rNt| d¡ƒt| d	¡ƒt| d
¡ƒf} nq/|d u rUd}tj |jd¡}t|dƒ}|d d	krt|d dkrt| d¡ | d¡ W d   ƒ n1 sƒw   Y  |d dkr‘d}n|d d	kršd}nd}t ddd||g|j¡\}}}	|	dks³J dƒ‚d S )NÚ	GNUPGHOMEÚHOMEz#^gpg\s.*\s([\d+])\.([\d+])\.([\d+])Úgpgz	--versionr   Ú
é   é   é   )r   r   r   z
key-configr?   zO
                %no-protection
                %transient-key
                zã
            %no-ask-passphrase
            Key-Type: RSA
            Name-Real: Example Key
            Name-Comment: N/A
            Name-Email: example@example.com
            Expire-Date: 2d
            %commit
            z--quick-randomz--debug-quick-randomÚ z	--gen-keyz--batchzgpg key generation failed!)r   rM   r   Ú
useFixtureÚfixturesÚEnvironmentVariabler   ÚgetenvÚTempDirÚreÚcompiler   r<   r   ÚsplitÚmatchÚintÚgroupÚjoinrD   Úwrite)
r   ÚtempdirÚgnupg_version_reÚgnupg_versionÚlineÚconfig_fileÚfÚgnupg_randomÚ_Úretcoder   r	   r
   r       sL   ÿ

ýúÿÿø
þzGPGKey.setUp)r   r   r   r   r   r   r	   r	   r   r
   rM   ™   s    rM   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	ÚVenvzªCreate a virtual environment for testing with.

    :attr path: The path to the environment root.
    :attr python: The path to the python binary in the environment.
    r	   Nc                 C   sB   || _ |dkrddddtg}|| _|du rg d¢| _dS || _dS )až  Create a Venv fixture.

        :param reason: A human readable string to bake into the venv
            file path to aid diagnostics in the case of failures.
        :param modules: A list of modules to install, defaults to latest
            pip, wheel, and the working copy of PBR.
        :attr pip_cmd: A list to override the default pip_cmd passed to
            python for installing base packages.
        r	   ÚpipÚwheelÚbuildÚ
setuptoolsN)rA   rm   z-vÚinstall)Ú_reasonÚPBR_ROOTÚmodulesÚpip_cmd)r   Úreasonrt   ru   r	   r	   r
   r   ä   s   

zVenv.__init__c                 C   s¤   |   t ¡ ¡j}t |g¡ tj |dd¡}|g| j dg }| j	r:t
| j	ƒdkr:| | j	¡ |   td| j |ƒ¡ |  t| d¡ |  t| d¡ || _|| _||fS )NÚbinÚpythonz-Ur   zmkvenv-r   )rV   rW   rZ   r   Ú
virtualenvÚcli_runr   ra   ru   rt   rB   Úextendr   rr   r   r3   rx   )r   r   rx   Úcommandr	   r	   r
   Ú_setUp÷   s   ÿzVenv._setUp)r	   N)r   r   r   r   r   r}   r	   r	   r	   r
   rl   Ý   s    
rl   c                   @   s>   e Zd ZdZe d¡e d¡dœZdd„ Zdd„ Zd	d
„ Z	dS )ÚPackagesz¾Creates packages from dict with defaults

    :param package_dirs: A dict of package name to directory strings
    {'pkg_a': '/tmp/path/to/tmp/pkg_a', 'pkg_b': '/tmp/path/to/tmp/pkg_b'}
    zº            #!/usr/bin/env python
            import setuptools
            setuptools.setup(
                setup_requires=['pbr'],
                pbr=True,
            )
            zA            [metadata]
            name = {pkg_name}
            ©zsetup.pyz	setup.cfgc                 C   s
   || _ dS )a\  Creates packages from dict with defaults

        :param packages: a dict where the keys are the package name and a
            value that is a second dict that may be empty, containing keys of
            filenames and a string value of the contents. ::

                {'package-a': {'requirements.txt': 'string', 'setup.cfg': 'string'}
        N)Úpackages)r   r€   r	   r	   r
   r   #  s   
	zPackages.__init__c                 C   s‚   t j t j ||¡¡}t j |¡}t j |¡s$| |¡r"t  |¡ nt‚t	|dƒ}| 
|¡ W d   ƒ d S 1 s:w   Y  d S )Nr?   )r   r   Úabspathra   ÚdirnameÚexistsÚ
startswithÚmakedirsÚ
ValueErrorrD   rb   )r   Ú	directoryÚ	file_nameÚcontentsr   Úpath_dirrh   r	   r	   r
   Ú
_writeFile.  s   
"ÿzPackages._writeFilec                 C   sÜ   |   t ¡ ¡j}i }| jD ]T}tj ||¡}|||< t |¡ dD ]"}|| j| v r3| j|  |¡}n	| j	| j
|d}|  |||¡ q!| j| D ]}|  ||| j| | ¡ qI|   t|ƒ¡ ¡  q|  t| d¡ || _|S )Nr   )Úpkg_nameÚpackage_dirs)rV   rW   rZ   r   r€   r   ra   ÚmkdirÚpopÚdefaultsÚformatr‹   r5   r@   r   r3   r   )r   Útmpdirr   rŒ   Úpkg_pathÚcfr‰   r	   r	   r
   r}   9  s"   

zPackages._setUpN)
r   r   r   r   ÚtextwrapÚdedentr   r   r‹   r}   r	   r	   r	   r
   r~   	  s    ÿ
ÿõr~   )Ú
__future__r   r   r[   r"   r•   rW   Ú	testtoolsr   ry   Ú	pbr.testsr   r   r   ra   Ú__file__rs   ÚFixturer   r   r5   rM   rl   r~   r	   r	   r	   r
   Ú<module>   s    (1 D,