U
    jPŒ^µ  ã                   @   s  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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Zd dlmZ d dlZd dlmZ d dlmZ d dlm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#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*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*d+„ Z0dS ),é    N)Úmatchers)Ú	wheelfile)Úgit)Ú	packaging)Úbasez..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 )ÚTestRepozä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 ©N)Úsuperr   Ú__init__Ú_basedir)ÚselfZbasedir©Ú	__class__© ú:/usr/lib/python3/dist-packages/pbr/tests/test_packaging.pyr
   L   s    zTestRepo.__init__c                    sB   t t| ƒ ¡  t dddg| j¡ t ¡  t dddg| j¡ d S )Nr   ZinitÚ.Úadd)r	   r   ÚsetUpr   Ú_run_cmdr   Z_config_git©r   r   r   r   r   P   s    zTestRepo.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Úwtr   r   Úcommitú-m)ÚlenÚosÚlistdirr   ÚopenÚcloser   r   )r   Úmessage_contentÚfilesÚpathr   r   r   r   V   s
    zTestRepo.commitc                 C   s   t  ddddg| j¡ d S )Nr   Úresetz--hardzHEAD^©r   r   r   r   r   r   r   Úuncommit]   s    zTestRepo.uncommitc                 C   s   t  dddd|g| j¡ d S )Nr   Útagz-smztest tagr#   ©r   Úversionr   r   r   r%   `   s     ÿzTestRepo.tag)r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r$   r%   Ú__classcell__r   r   r   r   r   D   s   
r   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚGPGKeyFixturezxCreates a GPG key for testing.

    It's recommended that this be used in concert with a unique home
    directory.
    c              	      s*  t t| ƒ ¡  |  t ¡ ¡}t d¡}t 	ddg|j
¡}|d  d¡D ]>}| |¡}|rFt| d¡ƒt| d¡ƒt| d¡ƒf} q’qF|d kr’d	}tj
 |j
d
¡}t|dƒ2}|d dkrÐ|d dkrÐ| d¡ | d¡ W 5 Q R X |d dkröd}n|d dkr
d}nd}t 	ddd||g|j
¡ d S )Nz#^gpg\s.*\s([\d+])\.([\d+])\.([\d+])Zgpgz	--versionr   Ú
é   é   é   )r   r   r   z
key-configr   zO
                %no-protection
                %transient-key
                a  
            %no-ask-passphrase
            Key-Type: RSA
            Name-Real: Example Key
            Name-Comment: N/A
            Name-Email: example@example.com
            Expire-Date: 2d
            Preferences: (setpref)
            %commit
            z--quick-randomz--debug-quick-randomÚ z	--gen-keyz--batch)r	   r-   r   Ú
useFixtureÚfixturesÚTempDirÚreÚcompiler   r   r!   ÚsplitÚmatchÚintÚgroupr   Újoinr   Úwrite)r   ÚtempdirZgnupg_version_reZgnupg_versionÚlineZconfig_fileÚfZgnupg_randomr   r   r   r   l   s8    

þ
þzGPGKeyFixture.setUp)r(   r)   r*   r+   r   r,   r   r   r   r   r-   e   s   r-   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   sF   || _ |dkr dt }dd|g}|| _|dkr<dddg| _n|| _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   zfile://%s#egg=pbrZpipÚwheelNr   Úinstall)Ú_reasonÚPBR_ROOTÚmodulesÚpip_cmd)r   ÚreasonrF   rG   Úpbrr   r   r   r
   ¤   s    

zVenv.__init__c                 C   s¨   |   t ¡ ¡j}tj|dd tj |dd¡}|g| j dg }| j	rxt
| j	ƒdkrx| | j	¡ |   t d| j |¡¡ |  t| d¡ |  t| d¡ || _|| _||fS )	NT)ÚclearÚbinÚpythonz-Ur   zmkvenv-r!   )r3   r4   r5   r!   Ú
virtualenvZcreate_environmentr   r<   rG   rF   r   Úextendr   ZCapturedSubprocessrD   Ú
addCleanupÚdelattrrL   )r   r!   rL   Zcommandr   r   r   Ú_setUp¸   s     ÿzVenv._setUp)r   N)r(   r)   r*   r+   r
   rQ   r   r   r   r   rA      s   
rA   c                   @   sJ   e Zd ZdZe e d¡¡e e d¡¡dœZdd„ Z	dd„ Z
d	d
„ ZdS )ÚCreatePackageszÆ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,
            )
        z=            [metadata]
            name = {pkg_name}
        ©úsetup.pyú	setup.cfgc                 C   s
   || _ dS )aX  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   rV   r   r   r   r
   Þ   s    zCreatePackages.__init__c              	   C   sl   t j t j ||¡¡}t j |¡}t j |¡sH| |¡rDt  |¡ nt‚t	|dƒ}| 
|¡ W 5 Q R X d S )Nr   )r   r!   Úabspathr<   ÚdirnameÚexistsÚ
startswithÚmakedirsÚ
ValueErrorr   r=   )r   Z	directoryÚ	file_nameÚcontentsr!   Zpath_dirr@   r   r   r   Ú
_writeFileè   s    
zCreatePackages._writeFilec                 C   sÜ   |   t ¡ ¡j}i }| jD ]¨}tj ||¡}|||< t |¡ dD ]D}|| j| krf| j|  |¡}n| j	| j
|d}|  |||¡ qB| j| D ]}|  ||| j| | ¡ q’|   t|ƒ¡ ¡  q|  t| d¡ || _|S )NrS   )Úpkg_nameÚpackage_dirs)r3   r4   r5   r!   rV   r   r<   ÚmkdirÚpopÚdefaultsÚformatr_   r   r   rO   rP   ra   )r   Ztmpdirra   r`   Zpkg_pathZcfr^   r   r   r   rQ   ó   s"    

zCreatePackages._setUpN)r(   r)   r*   r+   ÚtextwrapÚdedentÚsixÚurd   r
   r_   rQ   r   r   r   r   rR   È   s   ÷
rR   c                       sp   e Zd ZdeddfdeddfgZ‡ fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )Ú TestPackagingInGitRepoWithCommitÚpreversionedT©rk   ÚpostversionedFc                    s.   t t| ƒ ¡  |  t| jƒ¡| _| j ¡  d S r   )r	   rj   r   r3   r   Úpackage_dirÚrepor   r   r   r   r   r     s    z&TestPackagingInGitRepoWithCommit.setUpc              	   C   sH   | j ddd ttj | jd¡dƒ}| ¡ }W 5 Q R X |  |d¡ d S )NÚsdistF©Ú
allow_failÚAUTHORSÚrr2   ©Ú	run_setupr   r   r!   r<   rn   ÚreadZassertNotEqual©r   r@   Zbodyr   r   r   Útest_authors  s    z-TestPackagingInGitRepoWithCommit.test_authorsc              	   C   sH   | j ddd ttj | jd¡dƒ}| ¡ }W 5 Q R X |  |d¡ d S )Nrp   Frq   Ú	ChangeLogrt   r2   ru   rx   r   r   r   Útest_changelog  s    z/TestPackagingInGitRepoWithCommit.test_changelogc              	   C   sV   | j jdd | jddd ttj | jd¡dƒ}| ¡ }W 5 Q R X |  	d|¡ d S )	NzAllow *.openstack.org to work©r   rp   Frq   rz   rt   z\*©
ro   r   rv   r   r   r!   r<   rn   rw   ÚassertInrx   r   r   r   Útest_changelog_handles_astrisk#  s
    z?TestPackagingInGitRepoWithCommit.test_changelog_handles_astriskc              	   C   sn   | j jdd | jddd ttj | jd¡dƒ}| ¡ }W 5 Q R X |  	d|¡ |  	d	|¡ |  	d
|¡ d S )NzSee os_ for to_do about qemu_.r|   rp   Frq   rz   rt   zos\_zto\_dozqemu\_r}   rx   r   r   r   Ú+test_changelog_handles_dead_links_in_commit*  s    zLTestPackagingInGitRepoWithCommit.test_changelog_handles_dead_links_in_commitc              	   C   sV   | j jdd | jddd ttj | jd¡dƒ}| ¡ }W 5 Q R X |  	d|¡ d S )	NzAllow `openstack.org` to `workr|   rp   Frq   rz   rt   z\`r}   rx   r   r   r   Ú test_changelog_handles_backticks3  s
    zATestPackagingInGitRepoWithCommit.test_changelog_handles_backticksc              	   C   sf   | j ddd ttj | jd¡dƒ}| ¡ }W 5 Q R X |  |t 	t 
d¡¡¡ |  |t 
d¡¡ d S )Nrp   Frq   z$pbr_testpackage.egg-info/SOURCES.txtrt   zpbr_testpackage/extra.pyzpbr_testpackage/__init__.py)rv   r   r   r!   r<   rn   rw   Ú
assertThatr   ÚNotÚContainsrx   r   r   r   Útest_manifest_exclude_honoured:  s    þþ ÿz?TestPackagingInGitRepoWithCommit.test_manifest_exclude_honouredc                 C   s4   | j dd| jd dd\}}}|  |t d¡¡ d S ©NrC   ú--rootÚ	installedFrq   zGenerating ChangeLog©rv   Útemp_dirÚ
expectThatr   r„   ©r   ÚstdoutÚ_r   r   r   Útest_install_writes_changelogD  s      þz>TestPackagingInGitRepoWithCommit.test_install_writes_changelog)r(   r)   r*   ÚdictÚ	scenariosr   ry   r{   r   r€   r   r…   r   r,   r   r   r   r   rj   	  s   þ	
rj   c                   @   s   e Zd Zdd„ ZdS )ÚTestExtrafileInstallationc                 C   sF   | j dd| jd dd\}}}|  |t d¡¡ |  |t d¡¡ d S )NrC   r‡   rˆ   Frq   zcopying data_files/a.txtzcopying data_files/b.txtr‰   rŒ   r   r   r   Útest_install_globL  s      þ ÿ ÿz+TestExtrafileInstallation.test_install_globN)r(   r)   r*   r“   r   r   r   r   r’   K  s   r’   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú#TestPackagingInGitRepoWithoutCommitc                    s0   t t| ƒ ¡  |  t| jƒ¡ | jddd d S )Nrp   Frq   )r	   r”   r   r3   r   rn   rv   r   r   r   r   r   X  s    z)TestPackagingInGitRepoWithoutCommit.setUpc              	   C   s:   t tj | jd¡dƒ}| ¡ }W 5 Q R X |  d|¡ d S )Nrs   rt   r.   ©r   r   r!   r<   rn   rw   ÚassertEqualrx   r   r   r   ry   ]  s    z0TestPackagingInGitRepoWithoutCommit.test_authorsc              	   C   s:   t tj | jd¡dƒ}| ¡ }W 5 Q R X |  d|¡ d S )Nrz   rt   zCHANGES
=======

r•   rx   r   r   r   r{   c  s    z2TestPackagingInGitRepoWithoutCommit.test_changelog)r(   r)   r*   r   ry   r{   r,   r   r   r   r   r”   V  s   r”   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTestPackagingWheelsc                    s–   t t| ƒ ¡  |  t| jƒ¡ | jddd tj 	| jd¡}t 
|¡d }tj 	||¡}t |¡}|j d¡}tj 	||¡| _| | j¡ | ¡  d S )NÚbdist_wheelFrq   Zdistr   Znamever)r	   r—   r   r3   r   rn   rv   r   r!   r<   r   r   Z	WheelFileZparsed_filenamer;   Úextracted_wheel_dirZ
extractallr   )r   Zdist_dirZrelative_wheel_filenameZabsolute_wheel_filenameZ
wheel_fileZ
wheel_namer   r   r   r   l  s     ÿ
zTestPackagingWheels.setUpc                 C   s`   t j | jd¡}|  t j |¡¡ t  |¡}|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S )Nz pbr_testpackage-0.0.data/scriptsZpbr_test_wsgiZpbr_test_wsgi_with_classZpbr_test_cmdZpbr_test_cmd_with_class)	r   r!   r<   r™   Ú
assertTruerY   r   r~   ZassertNotIn)r   Zscripts_dirZscriptsr   r   r   Ú$test_data_directory_has_wsgi_scripts~  s     ÿ
z8TestPackagingWheels.test_data_directory_has_wsgi_scriptsc                 C   s^   t j | jd¡}d}tƒ }|r(d |¡}t j ||¡}|  t j |¡¡ |  t j |¡¡ d S )NÚpbr_testpackagez
testext.soztestext.{0}.so)r   r!   r<   r™   Ú	get_soabire   rš   rY   )r   Zbuilt_package_dirZstatic_object_filenameÚsoabiZstatic_object_pathr   r   r   Útest_generates_c_extensionsŠ  s     ÿ
 ÿz/TestPackagingWheels.test_generates_c_extensions)r(   r)   r*   r   r›   rŸ   r,   r   r   r   r   r—   j  s   r—   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestPackagingHelpersc                 C   s@   d}t jdddd}d}d}t ||||¡}d}|  ||¡ d S )	NÚconsole_scriptsútest-epúpbr.packaging)ZLocalInstallScripts©ÚnameÚmodule_nameZattrsú#!/usr/bin/env fake-header
ú=%(group)s %(module_name)s %(import_target)s %(invoke_target)sz`#!/usr/bin/env fake-header
console_scripts pbr.packaging LocalInstallScripts LocalInstallScripts)Úpkg_resourcesÚ
EntryPointr   Úgenerate_scriptr–   )r   r;   Úentry_pointÚheaderÚtemplateZgenerated_scriptZexpected_scriptr   r   r   Útest_generate_scriptš  s"    ý   ÿÿz)TestPackagingHelpers.test_generate_scriptc                 C   sZ   d}t jddd}d}d}|  ttj||||¡ t jdddd}|  ttj||||¡ d S )	Nr¡   r¢   r£   )r¥   r¦   r§   r¨   )Zattr1Zattr2Zattr3r¤   )r©   rª   ÚassertRaisesr\   r   r«   )r   r;   r¬   r­   r®   r   r   r   Ú+test_generate_script_validates_expectations­  s8    þ    þý    þz@TestPackagingHelpers.test_generate_script_validates_expectationsN)r(   r)   r*   r¯   r±   r   r   r   r   r    ˜  s   r    c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestPackagingInPlainDirectoryc                    s   t t| ƒ ¡  d S r   )r	   r²   r   r   r   r   r   r   Ä  s    z#TestPackagingInPlainDirectory.setUpc                 C   s4   | j ddd tj | jd¡}|  tj |¡¡ d S )Nrp   Frq   rs   ©rv   r   r!   r<   rn   ZassertFalserY   ©r   Úfilenamer   r   r   ry   Ç  s    z*TestPackagingInPlainDirectory.test_authorsc                 C   s4   | j ddd tj | jd¡}|  tj |¡¡ d S )Nrp   Frq   rz   r³   r´   r   r   r   r{   Í  s    z,TestPackagingInPlainDirectory.test_changelogc                 C   s:   | j dd| jd dd\}}}|  |t t d¡¡¡ d S r†   )rv   rŠ   r‹   r   rƒ   r„   rŒ   r   r   r   Útest_install_no_ChangeLogÓ  s      þ ÿz7TestPackagingInPlainDirectory.test_install_no_ChangeLog)r(   r)   r*   r   ry   r{   r¶   r,   r   r   r   r   r²   Â  s   r²   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestPresenceOfGitc              	   C   s4   t j td¡}d|_|  dt ¡ ¡ W 5 Q R X d S )NÚ_run_shell_commandzgit version 1.8.4.1T)ÚmockÚpatchÚobjectr   Zreturn_valuer–   Ú_git_is_installed©r   Z_commandr   r   r   ÚtestGitIsInstalledÝ  s    ÿz$TestPresenceOfGit.testGitIsInstalledc              	   C   s4   t j td¡}t|_|  dt ¡ ¡ W 5 Q R X d S )Nr¸   F)r¹   rº   r»   r   ÚOSErrorÚside_effectr–   r¼   r½   r   r   r   ÚtestGitIsNotInstalledã  s    ÿz'TestPresenceOfGit.testGitIsNotInstalledN)r(   r)   r*   r¾   rÁ   r   r   r   r   r·   Û  s   r·   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚParseRequirementsTestc                 C   s   t  g ¡}|  g |¡ d S r   )r   Úparse_requirementsr–   )r   Zactualr   r   r   Útest_empty_requirementsì  s    
z-ParseRequirementsTest.test_empty_requirementsc              	   C   sn   t  ¡ }tj |d¡}t|dƒ}| d¡ W 5 Q R X tj 	t
d|f¡ t
 ¡ }W 5 Q R X |  dg|¡ dS )z/Ensure default files used if no files provided.úrequirements.txtÚwrI   ZREQUIREMENTS_FILESN)ÚtempfileÚmkdtempr   r!   r<   r   r=   r¹   rº   r»   r   rÃ   r–   ©r   r>   Úrequirementsr@   Úresultr   r   r   Útest_default_requirementsð  s    
ÿz/ParseRequirementsTest.test_default_requirementsc              	   C   s\   t jddd\}}t|dƒ}| d¡ W 5 Q R X |  t d|¡¡ |  ddgt 	¡ ¡ d	S )
z6Ensure environment variable used if no files provided.Ú	openstackú.setup©ÚprefixÚsuffixrÆ   úfoo
barÚPBR_REQUIREMENTS_FILESÚfooÚbarN©
rÇ   Úmkstempr   r=   r3   r4   ZEnvironmentVariabler–   r   rÃ   ©r   rŽ   Útmp_fileÚfhr   r   r   Útest_override_with_envþ  s    
ÿ
ÿz,ParseRequirementsTest.test_override_with_envc              	   C   s`   t jddd\}}t|dƒ}| d¡ W 5 Q R X |  t dd| ¡¡ |  dd	gt 	¡ ¡ d S )
NrÍ   rÎ   rÏ   rÆ   rÒ   rÓ   zno-such-file,rÔ   rÕ   rÖ   rØ   r   r   r   Ú%test_override_with_env_multiple_files  s    ÿÿ
ÿz;ParseRequirementsTest.test_override_with_env_multiple_filesc              	   C   s|   t  ¡ }tj |d¡}t|dƒ8}| d¡ | d¡ | d¡ | d¡ | d¡ W 5 Q R X t |g¡}|  	dg|¡ d S )	NrÅ   rÆ   z-i https://myindex.local
z$  --index-url https://myindex.local
z) --extra-index-url https://myindex.local
z#--find-links https://myindex.local
zarequirement>=1.0
zarequirement>=1.0©
rÇ   rÈ   r   r!   r<   r   r=   r   rÃ   r–   rÉ   r   r   r   Útest_index_present  s    



z(ParseRequirementsTest.test_index_presentc              	   C   s†   t  ¡ }tj |d¡}tj |d¡}t|dƒ}| d| ¡ W 5 Q R X t|dƒ}| d¡ W 5 Q R X t |g¡}|  	dg|¡ d S )NrÅ   z
nested.txtrÆ   z-r rI   rÝ   )r   r>   rÊ   Únestedr@   rË   r   r   r   Útest_nested_requirements  s    z.ParseRequirementsTest.test_nested_requirementsN)	r(   r)   r*   rÄ   rÌ   rÛ   rÜ   rÞ   rà   r   r   r   r   rÂ   ê  s   

rÂ   c                   @   sà   e Zd ZdddgdœfdddgdœfgZdd	difd
d	difgZddddgdœfddddgdœfddg dœfgZee dddifdddifdddifgee¡ Zee ddddœfgdddifdddifgee¡ Zdd „ Zd!S )"ÚParseRequirementsTestScenariosznon-versionedFrÕ   )Ú	versionedÚexpectedrâ   Tz
bar>=1.2.3znon-subdirectoryÚhas_subdirectoryzhas-subdirectoryZnormalrÒ   rÔ   )Úurlrã   Znormal_with_commentsz-# this is a comment
foo
# and another one
barZremoves_index_linesz	-f foobarZssh_egg_urlrå   z!git+ssh://foo.com/zipball#egg=barZgit_https_egg_urlz#git+https://foo.com/zipball#egg=barZhttp_egg_urlzhttps://foo.com/zipball#egg=barZgit_egg_urlúgit://foo.com/zipball#egg=bar)rå   r¥   znon-editableÚeditablec              	   C   s”   t  ¡ }| j}t| dƒr&| jr&d| }t| dƒr>| jr>d| }t| dƒrV| jrVd| }t|jdƒ}| 	|¡ W 5 Q R X |  
| jt |jg¡¡ d S )Nrç   z-e %srâ   z%s-1.2.3rä   z%s&subdirectory=bazrÆ   )rÇ   ZNamedTemporaryFilerå   Úhasattrrç   râ   rä   r   r¥   r=   r–   rã   r   rÃ   )r   rÙ   Z
req_stringrÚ   r   r   r   Útest_parse_requirementsN  s    ÿz6ParseRequirementsTestScenarios.test_parse_requirementsN)	r(   r)   r*   Zversioned_scenariosZsubdirectory_scenariosr‘   ÚtestscenariosZmultiply_scenariosré   r   r   r   r   rá   *  sB   þ

þþû


ý üÿÿ

þ ø
rá   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚParseDependencyLinksTestc                    s&   t t| ƒ ¡  tjddd\}| _d S )NrÍ   rÎ   rÏ   )r	   rë   r   rÇ   r×   rÙ   )r   rŽ   r   r   r   r   _  s    ÿzParseDependencyLinksTest.setUpc              	   C   s>   t | jdƒ}| d¡ W 5 Q R X |  dgt | jg¡¡ d S )NrÆ   zhttp://test.com
zhttp://test.com©r   rÙ   r=   r–   r   Úparse_dependency_links©r   rÚ   r   r   r   Útest_parse_dependency_normald  s    þz5ParseDependencyLinksTest.test_parse_dependency_normalc              	   C   s>   t | jdƒ}| d¡ W 5 Q R X |  dgt | jg¡¡ d S )NrÆ   z -e git://foo.com/zipball#egg=barræ   rì   rî   r   r   r   Ú&test_parse_dependency_with_git_egg_urlk  s    þz?ParseDependencyLinksTest.test_parse_dependency_with_git_egg_url)r(   r)   r*   r   rï   rð   r,   r   r   r   r   rë   ]  s   rë   c                       sä   e Zd ZdeddfdeddfgZ‡ fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Z‡ fd0d1„Z‡  ZS )2ÚTestVersionsrk   Trl   rm   Fc                    sB   t t| ƒ ¡  |  t| jƒ¡| _|  tƒ ¡ |  t 	| j¡¡ d S r   )
r	   rñ   r   r3   r   rn   ro   r-   r   ZDiveDirr   r   r   r   r   z  s    zTestVersions.setUpc              
   C   sp   t  ¡ }t  d|¡< t  d¡&}tj d¡ddig|_t d¡}W 5 Q R X W 5 Q R X |  	|j
¡ |  |¡ d S )Nzpbr.packaging.openzemail.message_from_fileZTestÚNamerœ   )r¹   Z	mock_openrº   ÚemailÚerrorsZMessageErrorrÀ   r   Z_get_version_from_pkg_metadatarš   ZcalledZassertIsNone)r   Zmocked_openZmessage_from_filer'   r   r   r   Ú%test_email_parsing_errors_are_handled€  s    
þÿz2TestVersions.test_email_parsing_errors_are_handledc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nú1.2.3úSem-Ver: api-breakú
2.0.0.dev1©ro   r   r%   r   Ú_get_version_from_gitr‚   r   Ú
StartsWithr&   r   r   r   Útest_capitalized_headers  s
    
z%TestVersions.test_capitalized_headersc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nrö   zSem-ver: api-breakrø   rù   r&   r   r   r   Ú test_capitalized_headers_partial”  s
    
z-TestVersions.test_capitalized_headers_partialc                 C   s0   | j  ¡  | j  d¡ t d¡}|  d|¡ d S )Nrö   ©ro   r   r%   r   rú   r–   r&   r   r   r   Ú#test_tagged_version_has_tag_version›  s    

z0TestVersions.test_tagged_version_has_tag_versionc                 C   s.   | j  ¡  | j  d¡ t ¡ }|  d|¡ d S )Nú	1.2.3-rc2z
1.2.3.0rc2rþ   r&   r   r   r   Ú4test_tagged_version_with_semver_compliant_prerelease¡  s    
zATestVersions.test_tagged_version_with_semver_compliant_prereleasec                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nz1.4r÷   rø   rù   r&   r   r   r   Ú&test_non_canonical_tagged_version_bump§  s
    
z3TestVersions.test_non_canonical_tagged_version_bumpc                 C   s>   | j  ¡  | j  d¡ | j  ¡  t ¡ }|  |t d¡¡ d S )Nrö   ú
1.2.4.dev1rù   r&   r   r   r   Ú1test_untagged_version_has_dev_version_postversion®  s
    

z>TestVersions.test_untagged_version_has_dev_version_postversionc                 C   s>   | j  ¡  | j  d¡ | j  ¡  t ¡ }|  |t d¡¡ d S )Nú	1.2.3.0a1ú1.2.3.0a2.dev1rù   r&   r   r   r   Ú9test_untagged_pre_release_has_pre_dev_version_postversionµ  s
    

zFTestVersions.test_untagged_pre_release_has_pre_dev_version_postversionc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nrö   úsem-ver: deprecationz
1.3.0.dev1rù   r&   r   r   r   Ú test_untagged_version_minor_bump¼  s
    
z-TestVersions.test_untagged_version_minor_bumpc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nrö   úsem-ver: api-breakrø   rù   r&   r   r   r   Ú test_untagged_version_major_bumpÃ  s
    
z-TestVersions.test_untagged_version_major_bumpc                 C   s@   | j  ¡  | j  d¡ | j  ¡  t d¡}|  |t d¡¡ d S )Nrö   ú1.2.5ú
1.2.5.dev1rù   r&   r   r   r   Ú0test_untagged_version_has_dev_version_preversionÊ  s
    


z=TestVersions.test_untagged_version_has_dev_version_preversionc                 C   s@   | j  ¡  | j  d¡ | j  ¡  t d¡}|  |t d¡¡ d S )Nr  r  r  rù   r&   r   r   r   Ú:test_untagged_version_after_pre_has_dev_version_preversionÑ  s
    


zGTestVersions.test_untagged_version_after_pre_has_dev_version_preversionc                 C   s@   | j  ¡  | j  d¡ | j  ¡  t d¡}|  |t d¡¡ d S )Nr  rö   r  rù   r&   r   r   r   Ú9test_untagged_version_after_rc_has_dev_version_preversionØ  s
    


zFTestVersions.test_untagged_version_after_rc_has_dev_version_preversionc                 C   s8   | j  ¡  | j  d¡ | j  ¡  t ¡ }|  d|¡ d S )Nr   z1.2.3.0rc3.dev1rþ   r&   r   r   r   Ú;test_untagged_version_after_semver_compliant_prerelease_tagß  s
    

zHTestVersions.test_untagged_version_after_semver_compliant_prerelease_tagc                 C   sL   | j  ¡  | j  d¡ | j  ¡  |  ttjd¡}|  |jd t	 
d¡¡ d S )Nrö   r   úgit history©ro   r   r%   r°   r\   r   rú   r‚   Úargsr   rû   ©r   Úerrr   r   r   Útest_preversion_too_low_simpleæ  s    

  ÿz+TestVersions.test_preversion_too_low_simplec                 C   sN   | j  ¡  | j  d¡ | j  d¡ |  ttjd¡}|  |jd t	 
d¡¡ d S )Nrö   úsem-ver: featurez1.2.4r   r  r  r  r   r   r   Ú&test_preversion_too_low_semver_headersò  s    
  ÿz3TestVersions.test_preversion_too_low_semver_headersc                    s:   ‡fdd„‰ ‡ ‡fdd„}|dƒ ˆj  d¡ |dƒ d S )Nc                    s   ˆ j jd }t || ¡S )Nz/.git)ro   r   r   Z_get_increment_kwargs)r%   Zgit_dirr   r   r   Ú
get_kwargs  s    z=TestVersions.test_get_kwargs_corner_cases.<locals>.get_kwargsc                    sÜ   ˆj  ¡  ˆ tƒ ˆ | ƒ¡ ˆj  d¡ ˆ tƒ ˆ | ƒ¡ ˆj  d¡ ˆ tddˆ | ƒ¡ ˆj  ¡  ˆj  d¡ ˆ tddˆ | ƒ¡ ˆj  ¡  ˆj  d¡ ˆ tddˆ | ƒ¡ ˆj  d¡ ˆ tdddˆ | ƒ¡ d S )	Nzsem-ver: bugfixr  T)Úminorr  r
  )Úmajor)r  r  )ro   r   r–   r   r$   )r%   ©r  r   r   r   Ú_check_combinations  s    


zFTestVersions.test_get_kwargs_corner_cases.<locals>._check_combinationsr2   rö   )ro   r%   )r   r  r   r  r   Útest_get_kwargs_corner_casesþ  s
    z)TestVersions.test_get_kwargs_corner_casesc                 C   s†  | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ | j  ¡  t ¡ }|  |t d¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d	¡ t ¡ }|  |t d
¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ d S )NÚ1Zbadverz
1.0.1.dev1z
1.0.1.dev2z1.2Zbadver2z
1.2.1.dev1rö   Zbadver3r  z	1.2.4.0a1Zbadver4z1.2.4.0a2.dev1Ú2znon-release-tag/2014.12.16-1z
2.0.1.dev1rù   r&   r   r   r   Útest_invalid_tag_ignored  sB    










z%TestVersions.test_invalid_tag_ignoredc                 C   s.   | j  ¡  | j  d¡ t ¡ }|  d|¡ d S )Nz	1.3.0.0a1rþ   r&   r   r   r   Útest_valid_tag_honouredC  s    
z$TestVersions.test_valid_tag_honouredc                 C   s:   | j  ¡  | j  d¡ dtjd< t d¡}|  d|¡ d S )Nrö   r   ÚSKIP_WRITE_GIT_CHANGELOG)ro   r   r%   r   Úenvironr   rú   r–   r&   r   r   r   Útest_skip_write_git_changelogL  s
    


z*TestVersions.test_skip_write_git_changelogc                    s    t t| ƒ ¡  tj dd ¡ d S )Nr$  )r	   rñ   ÚtearDownr   r%  rc   r   r   r   r   r'  T  s    zTestVersions.tearDown)r(   r)   r*   r   r‘   r   rõ   rü   rý   rÿ   r  r  r  r  r	  r  r  r  r  r  r  r  r  r"  r#  r&  r'  r,   r   r   r   r   rñ   s  s2   þ+	rñ   c                   @   s   e Zd Zdd„ ZdS )ÚTestRequirementParsingc              	   C   sú   dt  d¡t  d¡dœi}|  t|ƒ¡j}|d }ddgdgdd	gd
gddgdœ}|  tdƒ¡}|j}| j|dd|d tj	 
|d¡}tj	 
|d¡}t|dƒ}	tt |	¡ƒ}
W 5 Q R X | ¡ D ]4\}}dd„ |D ƒ}dd„ |
| D ƒ}|  ||¡ qÀd S )NZtest_reqparseaD                          bar
                        quux<1.0; python_version=='2.6'
                        requests-aws>=0.1.4    # BSD License (3 clause)
                        Routes>=1.12.3,!=2.0,!=2.1;python_version=='2.7'
                        requests-kerberos>=0.6;python_version=='2.7' # MIT
                    aP                          [metadata]
                        name = test_reqparse

                        [extras]
                        test =
                            foo
                            baz>3.2 :python_version=='2.7' # MIT
                            bar>3.3 :python_version=='2.7' # MIT # Apache
                    )rÅ   rU   rÕ   zrequests-aws>=0.1.4zquux<1.0zRoutes!=2.0,!=2.1,>=1.12.3zrequests-kerberos>=0.6rÔ   zbaz>3.2zbar>3.3)Nz:(python_version=='2.6')z:(python_version=='2.7')Útestztest:(python_version=='2.7')ZreqParse)rT   r˜   F)rr   Úcwdztest_reqparse.egg-infozrequires.txtZrtc                 S   s   g | ]}t j |¡‘qS r   ©r©   ZRequirementÚparse©Ú.0Úsr   r   r   Ú
<listcomp>  s   ÿzCTestRequirementParsing.test_requirement_parsing.<locals>.<listcomp>c                 S   s   g | ]}t j |¡‘qS r   r+  r-  r   r   r   r0  ”  s   ÿ)rf   rg   r3   rR   ra   rA   rL   r   r   r!   r<   r   r   r©   Zsplit_sectionsÚitemsr–   )r   ZpkgsZpkg_dirsZpkg_dirZexpected_requirementsÚvenvZ
bin_pythonZegg_infoZrequires_txtZrequiresZgenerated_requirementsZsectionrã   Z
exp_parsedZ
gen_parsedr   r   r   Útest_requirement_parsing[  sF    øþÿú ÿÿþþz/TestRequirementParsing.test_requirement_parsingN)r(   r)   r*   r3  r   r   r   r   r(  Y  s   r(  c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestRepositoryURLDependenciesc                    sv   t t| ƒ ¡  tj t ¡ d¡| _t	| jdƒ>}| 
d dddddd	d
dddddddddddddg¡¡ W 5 Q R X d S )NrÅ   rÆ   r.   zH-e git+git://git.pro-ject.org/oslo.messaging#egg=oslo.messaging-1.0.0-rczE-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborizezJ-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize-betazK-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-betazQ-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-4.0.1z^-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha.beta.1z‚-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz`-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-2.0.0-rc.1+build.123z+-e git+git://git.project.org/Proj#egg=Proj1ú0git+https://git.project.org/Proj#egg=Proj2-0.0.1z+-e git+ssh://git.project.org/Proj#egg=Proj3ú2svn+svn://svn.project.org/svn/Proj#egg=Proj4-0.0.2z;-e svn+http://svn.project.org/svn/Proj/trunk@2019#egg=Proj5ú9hg+http://hg.project.org/Proj@da39a3ee5e6b#egg=Proj-0.0.3z.-e hg+http://hg.project.org/Proj@2019#egg=Projú1hg+http://hg.project.org/Proj@v1.0#egg=Proj-0.0.4z9-e hg+http://hg.project.org/Proj@special_feature#egg=Projú'git://foo.com/zipball#egg=foo-bar-1.2.4ú
pypi-proj1ú
pypi-proj2)r	   r4  r   r   r!   r<   rÇ   rÈ   rÊ   r   r=   )r   r@   r   r   r   r     s6    ÿ íz#TestRepositoryURLDependencies.setUpc              /   C   sö   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d,d.g/}d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[dZd\g/}t |ƒD ]$\}}|  || t d]tj|¡¡ qÌd S )^Núdjango-thumborizeúdjango-thumborize-betaúdjango-thumborize2-betaúdjango-thumborize2-beta>=4.0.1ú+django-thumborize2-beta>=1.0.0-alpha.beta.1zFdjango-thumborize2-beta>=1.0.0-alpha-a.b-c-long+build.1-aef.1-its-okayú-django-thumborize2-beta>=2.0.0-rc.1+build.123zdjango-thumborize-beta>=0.0.4zdjango-thumborize-beta>=1.2.3z django-thumborize-beta>=10.20.30z-django-thumborize-beta>=1.1.2-prerelease+metaz"django-thumborize-beta>=1.1.2+metaz(django-thumborize-beta>=1.1.2+meta-validz#django-thumborize-beta>=1.0.0-alphaz"django-thumborize-beta>=1.0.0-betaz(django-thumborize-beta>=1.0.0-alpha.betaz*django-thumborize-beta>=1.0.0-alpha.beta.1z%django-thumborize-beta>=1.0.0-alpha.1z*django-thumborize-beta>=1.0.0-alpha0.validz*django-thumborize-beta>=1.0.0-alpha.0validzNdjango-thumborize-beta>=1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz*django-thumborize-beta>=1.0.0-rc.1+build.1z,django-thumborize-beta>=2.0.0-rc.1+build.123z"django-thumborize-beta>=1.2.3-betaz+django-thumborize-beta>=10.2.3-DEV-SNAPSHOTz*django-thumborize-beta>=1.2.3-SNAPSHOT-123zdjango-thumborize-beta>=1.0.0zdjango-thumborize-beta>=2.0.0zdjango-thumborize-beta>=1.1.7z(django-thumborize-beta>=2.0.0+build.1848z(django-thumborize-beta>=2.0.1-alpha.1227z(django-thumborize-beta>=1.0.0-alpha+betaz<django-thumborize-beta>=1.2.3----RC-SNAPSHOT.12.9.1--.12+788z5django-thumborize-beta>=1.2.3----R-S.12.9.1--.12+metaz8django-thumborize-beta>=1.2.3----RC-SNAPSHOT.12.9.1--.12z:django-thumborize-beta>=1.0.0+0.build.1-rc.10000aaa-kk-0.1zGdjango-thumborize-beta>=999999999999999999.99999999999999.9999999999999ÚProj1úProj2>=0.0.1ÚProj3úProj4>=0.0.2ÚProj5úProj>=0.0.3ÚProjúProj>=0.0.4úfoo-bar>=1.2.4zegg=django-thumborizezegg=django-thumborize-betazegg=django-thumborize2-betaz!egg=django-thumborize2-beta-4.0.1z.egg=django-thumborize2-beta-1.0.0-alpha.beta.1zIegg=django-thumborize2-beta-1.0.0-alpha-a.b-c-long+build.1-aef.1-its-okayz0egg=django-thumborize2-beta-2.0.0-rc.1+build.123z egg=django-thumborize-beta-0.0.4z egg=django-thumborize-beta-1.2.3z#egg=django-thumborize-beta-10.20.30z0egg=django-thumborize-beta-1.1.2-prerelease+metaz%egg=django-thumborize-beta-1.1.2+metaz+egg=django-thumborize-beta-1.1.2+meta-validz&egg=django-thumborize-beta-1.0.0-alphaz%egg=django-thumborize-beta-1.0.0-betaz+egg=django-thumborize-beta-1.0.0-alpha.betaz-egg=django-thumborize-beta-1.0.0-alpha.beta.1z(egg=django-thumborize-beta-1.0.0-alpha.1z-egg=django-thumborize-beta-1.0.0-alpha0.validz-egg=django-thumborize-beta-1.0.0-alpha.0validzQegg=django-thumborize-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz-egg=django-thumborize-beta-1.0.0-rc.1+build.1z/egg=django-thumborize-beta-2.0.0-rc.1+build.123z%egg=django-thumborize-beta-1.2.3-betaz.egg=django-thumborize-beta-10.2.3-DEV-SNAPSHOTz-egg=django-thumborize-beta-1.2.3-SNAPSHOT-123z egg=django-thumborize-beta-1.0.0z egg=django-thumborize-beta-2.0.0z egg=django-thumborize-beta-1.1.7z+egg=django-thumborize-beta-2.0.0+build.1848z+egg=django-thumborize-beta-2.0.1-alpha.1227z+egg=django-thumborize-beta-1.0.0-alpha+betaz?egg=django-thumborize-beta-1.2.3----RC-SNAPSHOT.12.9.1--.12+788z8egg=django-thumborize-beta-1.2.3----R-S.12.9.1--.12+metaz;egg=django-thumborize-beta-1.2.3----RC-SNAPSHOT.12.9.1--.12z=egg=django-thumborize-beta-1.0.0+0.build.1-rc.10000aaa-kk-0.1zJegg=django-thumborize-beta-999999999999999999.99999999999999.9999999999999z	egg=Proj1zegg=Proj2-0.0.1z	egg=Proj3zegg=Proj4-0.0.2z	egg=Proj5zegg=Proj-0.0.3zegg=Projzegg=Proj-0.0.4zegg=foo-bar-1.2.4zegg=([^&]+).*$)Ú	enumerater–   r6   Úsubr   Zegg_fragment)r   rã   ZtestsÚindexr)  r   r   r   Útest_egg_fragment·  sÎ    Ñ2Ñ1
þÿz/TestRepositoryURLDependencies.test_egg_fragmentc                 C   sF   t  | jg¡}|  ddddddddd	d
ddddddddddg|¡ d S )Nzoslo.messaging>=1.0.0-rcr<  r=  r>  r?  r@  zOdjango-thumborize2-beta>=1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayrA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  r:  r;  )r   rÃ   rÊ   r–   ©r   rË   r   r   r   Ú test_parse_repo_url_requirements   s0           ôôz>TestRepositoryURLDependencies.test_parse_repo_url_requirementsc                 C   sB   t  | jg¡}|  ddddddddd	d
ddddddddg|¡ d S )NzEgit+git://git.pro-ject.org/oslo.messaging#egg=oslo.messaging-1.0.0-rczBgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborizezGgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize-betazHgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-betazNgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-4.0.1z[git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha.beta.1zgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz]git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-2.0.0-rc.1+build.123z(git+git://git.project.org/Proj#egg=Proj1r5  z(git+ssh://git.project.org/Proj#egg=Proj3r6  z8svn+http://svn.project.org/svn/Proj/trunk@2019#egg=Proj5r7  z+hg+http://hg.project.org/Proj@2019#egg=Projr8  z6hg+http://hg.project.org/Proj@special_feature#egg=Projr9  )r   rí   rÊ   r–   rO  r   r   r   Ú$test_parse_repo_url_dependency_links0  s.    îízBTestRepositoryURLDependencies.test_parse_repo_url_dependency_links)r(   r)   r*   r   rN  rP  rQ  r,   r   r   r   r   r4  ›  s   ir4  c                  C   s¤   d } zt  d¡} t  d¡}W n tk
r0   Y nX | rR|rRdt  ¡ krRd| |f } | d kr dt  ¡ kr t ¡ D ]0\}}}| d¡rn| d¡rn| d¡d }  q qn| S )	NZSOABIZ	MULTIARCHZpypyz%s-%sz.pypyz.sor   r/   )	Ú	sysconfigZget_config_varÚIOErrorZget_scheme_namesÚimpZget_suffixesrZ   Úendswithr8   )rž   ZarchrÑ   rŽ   r   r   r   r   H  s    
r   )1ró   Zemail.errorsrT  r   r6   rR  rÇ   rf   r4   r¹   r©   rh   rê   Z	testtoolsr   rM   rB   r   rI   r   r   Z	pbr.testsr   r!   rW   r<   Ú__file__rE   ZFixturer   r-   rA   rR   ZBaseTestCaserj   r’   r”   r—   ZTestCaser    r²   r·   rÂ   rá   rë   rñ   r(  r4  r   r   r   r   r   Ú<module>)   sP   !8+AB.*@3 gB .